unit uAlbaranesClienteController; interface uses SysUtils, Classes, uDADataTable, uEditorDBItem, uControllerBase, uIDataModuleAlbaranesCliente, uClientesController, uDetallesAlbaranClienteController, uBizAlbaranesCliente, uBizDireccionesContacto; type IAlbaranesClienteController = interface(IControllerBase) ['{E83F4950-400E-446B-8EB0-1609FF8FEA77}'] function GetClienteController: IClientesController; procedure SetClienteController(const Value: IClientesController); property ClienteController: IClientesController read GetClienteController write SetClienteController; function GetDetallesController: IDetallesAlbaranClienteController; procedure SetDetallesController(const Value: IDetallesAlbaranClienteController); property DetallesController: IDetallesAlbaranClienteController read GetDetallesController write SetDetallesController; function Buscar(const ID: Integer): IBizAlbaranCliente; function BuscarTodos: IBizAlbaranCliente; function BuscarAlbaranesNormales: IBizAlbaranCliente; function BuscarAlbaranesDevolucion: IBizAlbaranCliente; function BuscarPendientes : IBizAlbaranCliente; function BuscarSinFacturar : IBizAlbaranCliente; procedure Ver(AAlbaran : IBizAlbaranCliente); procedure VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente); procedure VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente); procedure VerDireccionEntrega(AAlbaran : IBizAlbaranCliente); function Nuevo : IBizAlbaranCliente; function Anadir(AAlbaran : IBizAlbaranCliente): Boolean; overload; function AnadirAlbaranDev(AAlbaran : IBizAlbaranCliente) : Boolean; function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false): Boolean; overload; function Guardar(AAlbaran : IBizAlbaranCliente): Boolean; procedure DescartarCambios(AAlbaran : IBizAlbaranCliente); function Existe(const ID: Integer) : Boolean; function Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; function ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente) : IBizAlbaranCliente; function ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente; procedure Preview(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); procedure Print(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); procedure EtiquetasPreview(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); procedure EtiquetasPrint(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); procedure RecalcularImportes(AAlbaran: IBizAlbaranCliente); function EsModificable(AAlbaran: IBizAlbaranCliente): Boolean; function EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean; procedure CopiarDireccionEnvio (const ADireccionEnvio: IBizDireccionesContacto; AAlbaran: IBizAlbaranCliente); procedure QuitarDireccionEnvio(AAlbaran: IBizAlbaranCliente); procedure RecuperarCliente(AAlbaran: IBizAlbaranCliente); function CambiarSituacion(AAlbaran : IBizAlbaranCliente; ANuevaSituacion: String; AFechaEnvio : TDateTime = 0; AFechaRecibido : TDateTime = 0; DoPost: Boolean = True) : Boolean; function DarListaAnosAlbaranes: TStringList; procedure FiltrarAno(AAlbaran: IBizAlbaranCliente; ADynWhereDataTable: WideString; const Ano: String); end; TAlbaranesClienteController = class(TControllerBase, IAlbaranesClienteController) protected FDataModule : IDataModuleAlbaranesCliente; FClienteController : IClientesController; FDetallesController : IDetallesAlbaranClienteController; function GetClienteController: IClientesController; procedure SetClienteController(const Value: IClientesController); function GetDetallesController: IDetallesAlbaranClienteController; procedure SetDetallesController(const Value: IDetallesAlbaranClienteController); //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de //este controller procedure AsignarDataModule; virtual; procedure RecuperarObjetos(AAlbaran: IBizAlbaranCliente); virtual; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override; function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean; procedure FiltrarEmpresa(AAlbaran: IBizAlbaranCliente); function _Vacio : IBizAlbaranCliente; function ValidarAlbaran(AAlbaran: IBizAlbaranCliente): Boolean; function ValidarSituacion(ASituacion: String; AFechaAlbaran : TDateTime; var AFechaEnvio : TDateTime; var AFechaRecibido : TDateTime) : Boolean; public property ClienteController: IClientesController read GetClienteController write SetClienteController; property DetallesController: IDetallesAlbaranClienteController read GetDetallesController write SetDetallesController; constructor Create; override; destructor Destroy; override; function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false): Boolean; overload; function Guardar(AAlbaran : IBizAlbaranCliente): Boolean; procedure DescartarCambios(AAlbaran : IBizAlbaranCliente); virtual; function Existe(const ID: Integer) : Boolean; virtual; function Anadir(AAlbaran : IBizAlbaranCliente): Boolean; overload; function AnadirAlbaranDev(AAlbaran : IBizAlbaranCliente) : Boolean; function Buscar(const ID: Integer): IBizAlbaranCliente; function BuscarTodos: IBizAlbaranCliente; function BuscarAlbaranesNormales: IBizAlbaranCliente; function BuscarAlbaranesDevolucion: IBizAlbaranCliente; function BuscarPendientes : IBizAlbaranCliente; function BuscarSinFacturar : IBizAlbaranCliente; function Nuevo : IBizAlbaranCliente; procedure Ver(AAlbaran : IBizAlbaranCliente); procedure VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente); procedure VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente); procedure VerDireccionEntrega(AAlbaran : IBizAlbaranCliente); function Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; procedure CopiarDireccionEnvio (const ADireccionEnvio: IBizDireccionesContacto; AAlbaran: IBizAlbaranCliente); procedure QuitarDireccionEnvio(AAlbaran: IBizAlbaranCliente); function ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente) : IBizAlbaranCliente; function ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente; procedure RecuperarCliente(AAlbaran : IBizAlbaranCliente); procedure RecalcularImportes(AAlbaran: IBizAlbaranCliente); function EsModificable(AAlbaran: IBizAlbaranCliente): Boolean; function EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean; function CambiarSituacion(AAlbaran : IBizAlbaranCliente; ANuevaSituacion: String; AFechaEnvio : TDateTime = 0; AFechaRecibido : TDateTime = 0; DoPost: Boolean = True) : Boolean; procedure EnviarAlbaranPorEMail(AAlbaran : IBizAlbaranCliente); procedure Preview(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); procedure Print(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); procedure EtiquetasPreview(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); procedure EtiquetasPrint(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); function DarListaAnosAlbaranes: TStringList; procedure FiltrarAno(AAlbaran: IBizAlbaranCliente; ADynWhereDataTable: WideString; const Ano: String); end; implementation {$INCLUDE ..\..\FactuGES.inc} uses uROTypes, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils, uIEditorAlbaranesCliente, uIEditorAlbaranesDevCliente, uIEditorAlbaranDevCliente, uDataModuleAlbaranesCliente, Variants, uBizDetallesAlbaranCliente, uSistemaFunc, uBizContactos, uDataTableUtils, uDataModuleUsuarios, uFactuGES_App, schAlbaranesClienteClient_Intf, uDAInterfaces, uDateUtils, uIEditorAlbaranCliente, uIEditorElegirAlbaranesCliente, uIEditorDireccionEntregaAlbaranCliente, schContactosClient_Intf, uAlbaranesClienteReportController, uControllerDetallesBase, uEMailUtils, uDialogElegirEMail, // Pedidos no estará en TECSITEL // uPedidosClienteController, uBizPedidosCliente, uBizDetallesPedidoCliente, schPedidosClienteClient_Intf, uDialogUtils, Windows, Forms, Dialogs, uGUIBase, uIntegerListUtils; { TAlbaranesClienteController } function TAlbaranesClienteController.Anadir(AAlbaran: IBizAlbaranCliente): Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (Anadir)'); if not AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; AAlbaran.Insert; Result := True; end; function TAlbaranesClienteController.AnadirAlbaranDev(AAlbaran: IBizAlbaranCliente): Boolean; begin Anadir(AAlbaran); AAlbaran.TIPO := CTE_TIPO_ALBARAN_DEV; end; procedure TAlbaranesClienteController.AsignarDataModule; begin FDataModule := TDataModuleAlbaranesCliente.Create(Nil); end; function TAlbaranesClienteController.Buscar(const ID: Integer): IBizAlbaranCliente; begin Result := FDataModule.GetItem(ID); FiltrarEmpresa(Result); end; function TAlbaranesClienteController.BuscarAlbaranesDevolucion: IBizAlbaranCliente; var Condicion: TDAWhereExpression; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.DynamicWhere do begin // (IMPORTE_TOTAL < 0) Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteIMPORTE_TOTAL), NewConstant(0, datCurrency), dboLess); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.BuscarAlbaranesNormales: IBizAlbaranCliente; var Condicion: TDAWhereExpression; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.DynamicWhere do begin // (IMPORTE_TOTAL >= 0) Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteIMPORTE_TOTAL), NewConstant(0, datCurrency), dboGreaterOrEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.BuscarTodos: IBizAlbaranCliente; begin Result := FDataModule.GetItems; FiltrarEmpresa(Result); end; function TAlbaranesClienteController.BuscarPendientes: IBizAlbaranCliente; var Condicion: TDAWhereExpression; begin ShowHourglassCursor; try Result := BuscarAlbaranesNormales; with Result.DataTable.DynamicWhere do begin // (SITUACION = SERVIDO) Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteSITUACION), NewConstant(SITUACION_ALBARAN_SERVIDO, datString), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.BuscarSinFacturar: IBizAlbaranCliente; var Condicion: TDAWhereExpression; begin ShowHourglassCursor; try Result := BuscarAlbaranesNormales; with Result.DataTable.DynamicWhere do begin // (ID_FACTURA = NULL) Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteID_FACTURA), NewNull(), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.CambiarSituacion( AAlbaran: IBizAlbaranCliente; ANuevaSituacion: String; AFechaEnvio, AFechaRecibido: TDateTime; DoPost: Boolean): Boolean; begin Result := False; if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (CambiarSituacion)'); if not AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; // Validar la situación del albarán if ValidarSituacion(ANuevaSituacion, AAlbaran.FECHA_ALBARAN, AFechaEnvio, AFechaRecibido) then begin ShowHourglassCursor; AAlbaran.DataTable.DisableControls; try AAlbaran.Edit; AAlbaran.SITUACION := ANuevaSituacion; AAlbaran.FECHA_ENVIO := AFechaEnvio; AAlbaran.FECHA_RECEPCION := AFechaRecibido; AAlbaran.Post; if DoPost then Guardar(AAlbaran); Result := True; finally AAlbaran.DataTable.EnableControls; HideHourglassCursor; end; end; end; procedure TAlbaranesClienteController.CopiarDireccionEnvio( const ADireccionEnvio: IBizDireccionesContacto; AAlbaran: IBizAlbaranCliente); var bEnEdicion : Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albaran no asignado (CopiarDireccionEnvio)'); if not Assigned(ADireccionEnvio) then raise Exception.Create ('No se ha indicado la dirección (CopiarDireccionEnvio)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; if ADireccionEnvio.DataTable.Active then ADireccionEnvio.DataTable.Active := True; bEnEdicion := (AAlbaran.DataTable.State in dsEditModes); if not bEnEdicion then AAlbaran.Edit; ShowHourglassCursor; AAlbaran.Edit; try AAlbaran.CALLE := ADireccionEnvio.CALLE; AAlbaran.POBLACION := ADireccionEnvio.POBLACION; AAlbaran.CODIGO_POSTAL := ADireccionEnvio.CODIGO_POSTAL; AAlbaran.PROVINCIA := ADireccionEnvio.PROVINCIA; AAlbaran.TELEFONO := ADireccionEnvio.TELEFONO; AAlbaran.PERSONA_CONTACTO := ADireccionEnvio.PERSONA_CONTACTO; if not bEnEdicion then AAlbaran.Post; finally HideHourglassCursor; end; end; constructor TAlbaranesClienteController.Create; begin inherited; AsignarDataModule; FClienteController := TClientesController.Create; FDetallesController := TDetallesAlbaranClienteController.Create; FDetallesController.addObservador(Self); end; function TAlbaranesClienteController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean; begin Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf); end; function TAlbaranesClienteController.DarListaAnosAlbaranes: TStringList; begin Result := FDataModule.GetAnosItems; end; procedure TAlbaranesClienteController.DescartarCambios(AAlbaran: IBizAlbaranCliente); begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado'); ShowHourglassCursor; try if (AAlbaran.State in dsEditModes) then AAlbaran.Cancel; AAlbaran.DataTable.CancelUpdates; finally HideHourglassCursor; end; end; destructor TAlbaranesClienteController.Destroy; begin FDataModule := Nil; FClienteController := Nil; FDetallesController := Nil; inherited; end; function TAlbaranesClienteController.Duplicar(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; begin Result := Self._Vacio; ShowHourglassCursor; try DuplicarRegistros(AAlbaran.DataTable, Result.DataTable, mdrActual); DuplicarRegistros(AAlbaran.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos); // Hay que dejar algunos campos como si fuera un presupuesto nuevo Result.Edit; with Result do begin ID_EMPRESA := AppFactuGES.EmpresaActiva.ID; ID_TIENDA := AppFactuGES.TiendaActiva.ID; USUARIO := AppFactuGES.UsuarioActivo.UserName; FECHA_ALBARAN := DateOf(Now); INCIDENCIAS_ACTIVAS := 0; SITUACION := SITUACION_ALBARAN_PENDIENTE; // INCIDENCIAS := Nil; REFERENCIA := ''; FECHA_PREVISTA_ENVIO := 0; FECHA_ENVIO := 0; FECHA_RECEPCION := 0; ID_FACTURA := 0; ID_PEDIDO := 0; end; Result.Post; finally HideHourglassCursor; end; end; function TAlbaranesClienteController.ValidarAlbaran( AAlbaran: IBizAlbaranCliente): Boolean; begin Result := False; if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado'); if (AAlbaran.DataTable.State in dsEditModes) then AAlbaran.DataTable.Post; //Tambien hacemos post de sus tablas hija if (AAlbaran.Detalles.DataTable.State in dsEditModes) then AAlbaran.Detalles.DataTable.Post; if (AAlbaran.ID_Cliente < 0) or (AAlbaran.ID_Cliente = 0) then // Si hay altas automáticas no hay objeto Cliente pero sí hay ID_CLIENTE { (not Assigned(AAlbaran.Cliente)) or (AAlbaran.Cliente.IsEmpty) then} raise Exception.Create('Debe indicar el cliente de este albarán'); if (EsFechaVacia(AAlbaran.FECHA_ALBARAN)) then raise Exception.Create('Debe indicar la fecha de este albarán'); if (AAlbaran.Detalles.DataTable.RecordCount = 0) then raise Exception.Create('El albarán debe tener en su contenido al menos un concepto'); //En caso de ser un Albarán no podra tener un importe total negativo if (AAlbaran.TIPO = CTE_TIPO_ALBARAN) then if (AAlbaran.IMPORTE_TOTAL < 0) then raise Exception.Create('Un albarán no puede tener un importe total negativo'); {$IFDEF ALMACEN} //En caso de ser una orden de devolución no podra tener un importe total positivo if (AAlbaran.TIPO = CTE_TIPO_ALBARAN_DEV) then begin if (AAlbaran.IMPORTE_TOTAL >= 0) then raise Exception.Create('Una orden de devolución no puede tener un importe total positivo'); //Una orden de devolución debe tener relleno el almacén de entrada de material if (AAlbaran.ID_ALMACEN < 0) or (AAlbaran.ID_ALMACEN = 0) then raise Exception.Create('Debe indicar el almacén de entrada de esta orden de devolución'); //Ponemos la fecha del albaran de devolución como fecha de envio para que se contabilice según dicha fecha AAlbaran.Edit; AAlbaran.FECHA_ENVIO := AAlbaran.FECHA_ALBARAN; AAlbaran.Post; end; {$ENDIF} //Validamos las fechas del albarán // if not (EsFechaVacia(AAlbaran.FECHA_ENVIO)) then // if AAlbaran.FECHA_ENVIO < AAlbaran.FECHA_PREVISTA_ENVIO then // raise Exception.Create('La fecha de envio debe ser posterior a la fecha prevista de envio'); if not (EsFechaVacia(AAlbaran.FECHA_RECEPCION)) then if AAlbaran.FECHA_RECEPCION < AAlbaran.FECHA_ENVIO then raise Exception.Create('La fecha de recepcion debe ser posterior a la fecha de envio'); { Asegurarse de valores en campos "automáticos" tanto en MODIFICACIÓN como en INSERCIÓN. } AAlbaran.Edit; try AAlbaran.USUARIO := AppFactuGES.UsuarioActivo.UserName; // Lo quitamos temporalmente si no hay mas fallos de cambio de cliente se quita en todos los sitios // if Assigned(AAlbaran.Cliente) // and (AAlbaran.ID_CLIENTE <> AAlbaran.Cliente.ID) then // AAlbaran.ID_CLIENTE := AAlbaran.Cliente.ID; Result := True; finally AAlbaran.Post; end; end; function TAlbaranesClienteController.ValidarSituacion(ASituacion: String; AFechaAlbaran: TDateTime; var AFechaEnvio, AFechaRecibido: TDateTime): Boolean; begin Result := False; if ASituacion = SITUACION_ALBARAN_PENDIENTE then begin AFechaEnvio := 0; AFechaRecibido := 0 end else begin if (ASituacion = SITUACION_ALBARAN_ENVIADO) then begin AFechaRecibido := 0; if (EsFechaVacia(AFechaEnvio)) then raise Exception.Create('Hay que indicar la fecha de envío del albarán') end; if (ASituacion = SITUACION_ALBARAN_SERVIDO) then begin if (EsFechaVacia(AFechaEnvio)) then raise Exception.Create('Hay que indicar la fecha de envío del albarán'); if (EsFechaVacia(AFechaRecibido)) then raise Exception.Create('Hay que indicar la fecha de recepción del albarán'); if (AFechaRecibido < AFechaEnvio) then raise Exception.Create('La fecha de recepción y firma del albarán por parte ' + 'del cliente no puede ser anterior a la fecha de envio del material del albarán'); end; end; Result := True; end; procedure TAlbaranesClienteController.Ver(AAlbaran: IBizAlbaranCliente); var AEditor : IEditorAlbaranCliente; begin AEditor := NIL; RecuperarObjetos(AAlbaran); if (AAlbaran.TIPO = CTE_TIPO_ALBARAN) then CreateEditor('EditorAlbaranCliente', IEditorAlbaranCliente, AEditor) else CreateEditor('EditorAlbaranDevCliente', IEditorAlbaranDevCliente, AEditor); if Assigned(AEditor) then try AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE AEditor.Albaran := AAlbaran; //MODO CONSULTAR if not EsModificable(AAlbaran) then begin SetDataTableReadOnly(AAlbaran.DataTable, True); AEditor.ReadOnly := True; end; AEditor.ShowModal; //MODO CONSULTAR (Se deja la tabla como estaba) if AEditor.ReadOnly then SetDataTableReadOnly(AAlbaran.DataTable, False); finally AEditor.Release; AEditor := NIL; end; end; procedure TAlbaranesClienteController.VerDireccionEntrega( AAlbaran: IBizAlbaranCliente); var AEditor : IEditorDireccionEntregaAlbaranCliente; begin AEditor := NIL; //RecuperarObjetos(AAlbaran); <- No descomentar. No hace falta CreateEditor('EditorDireccionEntregaAlbaranCliente', IEditorDireccionEntregaAlbaranCliente, AEditor); if Assigned(AEditor) then try AEditor.Albaran := AAlbaran; AEditor.ShowModal; finally AEditor.Release; AEditor := NIL; end; end; procedure TAlbaranesClienteController.VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente); var AEditor : IEditorAlbaranesCliente; begin AEditor := NIL; CreateEditor('EditorAlbaranesCliente', IEditorAlbaranesCliente, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Albaranes := AAlbarans; MultiSelect := True; ShowEmbedded; end; end; procedure TAlbaranesClienteController.VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente); var AEditor : IEditorAlbaranesDevCliente; begin AEditor := NIL; CreateEditor('EditorAlbaranesDevCliente', IEditorAlbaranesDevCliente, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Albaranes := AAlbarans; MultiSelect := True; ShowEmbedded; end; end; function TAlbaranesClienteController._Vacio: IBizAlbaranCliente; begin Result := Buscar(ID_NULO); end; function TAlbaranesClienteController.Eliminar(const ID: Integer): Boolean; var AAlbaran : IBizAlbaranCliente; begin AAlbaran := Buscar(ID); if not Assigned(AAlbaran) then raise Exception.Create(Format('No se ha encontrado el albarán con ID = %d', [ID])); Result := Eliminar(AAlbaran); AAlbaran := NIL; end; function TAlbaranesClienteController.ElegirAlbaranes(AAlbaran: IBizAlbaranCliente; AMensaje: String; AMultiSelect: Boolean): IBizAlbaranCliente; var AEditor : IEditorElegirAlbaranesCliente; begin Result := NIL; CreateEditor('EditorElegirAlbaranesCliente', IEditorElegirAlbaranesCliente, AEditor); if Assigned(AEditor) then try AEditor.Controller := Self; AEditor.Albaranes := AAlbaran; AEditor.MultiSelect := AMultiSelect; AEditor.Mensaje := AMensaje; if IsPositiveResult(AEditor.ShowModal) then Result := AEditor.AlbaranesClienteSeleccionados; finally AEditor.Release; AEditor := NIL; end; end; function TAlbaranesClienteController.Eliminar(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false): Boolean; //En el caso de eliminar almenos un elemento del conjunto se devuelve true var bEliminado: Boolean; begin bEliminado := False; if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignada'); ShowHourglassCursor; try if (AAlbaran.State in dsEditModes) then AAlbaran.Cancel; //Siempre eliminaremos el seleccionado if EsEliminable(AAlbaran) then begin AAlbaran.Delete; bEliminado := True; end; //En el caso de querer eliminar todos los items del objeto AAlbaran if AllItems then begin with AAlbaran.DataTable do begin First; while not EOF do begin if EsEliminable(AAlbaran) then begin AAlbaran.Delete; bEliminado := True end else Next; end; end; end; if bEliminado then begin AAlbaran.DataTable.ApplyUpdates; Result := True; end else Result := False; finally HideHourglassCursor; end; end; procedure TAlbaranesClienteController.EnviarAlbaranPorEMail( AAlbaran: IBizAlbaranCliente); var AReportController : IAlbaranesClienteReportController; AFicheroTMP : TFileName; AEMail : String; AListaEmail : TStringList; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (EnviarAlbaranPorEMail)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; AFicheroTMP := DarFicheroPDFTemporal(EscapeIllegalChars(AAlbaran.REFERENCIA)); AListaEmail := TStringList.Create; try RecuperarCliente(AAlbaran); AAlbaran.Cliente.DataTable.Active := True; if not AAlbaran.Cliente.EMAIL_1IsNull then AListaEmail.Add(AAlbaran.Cliente.EMAIL_1); if not AAlbaran.Cliente.EMAIL_2IsNull then AListaEmail.Add(AAlbaran.Cliente.EMAIL_2); if not ElegirEMail(AListaEmail, AEMail) then Exit; finally FreeANDNIL(AListaEmail); end; ShowHourglassCursor; AReportController := TAlbaranesClienteReportController.Create; try AReportController.ExportToPDF(AAlbaran.ID, AFicheroTMP); SendMailMAPI('Albarán ' + AAlbaran.REFERENCIA, '', AFicheroTMP, '', '', AAlbaran.Cliente.NOMBRE, AEMail); finally SysUtils.DeleteFile(AFicheroTMP); AReportController := NIL; HideHourglassCursor; end; end; function TAlbaranesClienteController.EsEliminable(AAlbaran: IBizAlbaranCliente): Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado: EsModificable'); Result := EsModificable(AAlbaran); if AAlbaran.TIPO = CTE_TIPO_ALBARAN then Result := Result and (AAlbaran.SITUACION = SITUACION_ALBARAN_PENDIENTE); end; function TAlbaranesClienteController.EsModificable(AAlbaran: IBizAlbaranCliente): Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado: EsModificable'); Result := not (AAlbaran.ID_FACTURA > 0); end; procedure TAlbaranesClienteController.EtiquetasPreview(AAlbaran: IBizAlbaranCliente; Const withRefCliente: Boolean); var AReportController : IAlbaranesClienteReportController; begin AReportController := TAlbaranesClienteReportController.Create; try AReportController.EtiquetasPreview(AAlbaran.ID, withRefCliente); finally AReportController := NIL; end; end; procedure TAlbaranesClienteController.EtiquetasPrint(AAlbaran: IBizAlbaranCliente; Const withRefCliente: Boolean); var AReportController : IAlbaranesClienteReportController; begin AReportController := TAlbaranesClienteReportController.Create; try AReportController.EtiquetasPrint(AAlbaran.ID, withRefCliente); finally AReportController := NIL; end; end; procedure TAlbaranesClienteController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); var AAlbaran : IBizAlbaranCliente; ADetalles : IBizDetallesAlbaranCliente; begin inherited; if Supports(ADataTable, IBizDetallesAlbaranCliente, ADetalles) and Supports(ADetalles.DataTable.MasterSource.DataTable, IBizAlbaranCliente, AAlbaran) then begin RecalcularImportes(AAlbaran); end; end; procedure TAlbaranesClienteController.RecuperarObjetos(AAlbaran: IBizAlbaranCliente); begin RecuperarCliente(AAlbaran); end; procedure TAlbaranesClienteController.RecuperarCliente( AAlbaran: IBizAlbaranCliente); begin AAlbaran._Cliente := (FClienteController.Buscar(AAlbaran.ID_Cliente) as IBizCliente); end; function TAlbaranesClienteController.Existe(const ID: Integer): Boolean; var AAlbaran : IBizAlbaranCliente; begin try AAlbaran := Buscar(ID); Result := Assigned(AAlbaran) and (AAlbaran.ID = ID); finally AAlbaran := NIL; end; end; function TAlbaranesClienteController.ExtraerSeleccionados(AAlbaran: IBizAlbaranCliente): IBizAlbaranCliente; var ASeleccionados : IBizAlbaranCliente; begin ASeleccionados := (Self.Buscar(ID_NULO) as IBizAlbaranCliente); CopyDataTableDA5(AAlbaran.DataTable, ASeleccionados.DataTable, True); Result := ASeleccionados; end; procedure TAlbaranesClienteController.FiltrarAno(AAlbaran: IBizAlbaranCliente; ADynWhereDataTable: WideString; const Ano: String); var Condicion: TDAWhereExpression; FechaIni: String; FechaFin: String; begin AAlbaran.DataTable.DynamicWhere.Clear; AAlbaran.DataTable.DynamicWhere.Xml := ADynWhereDataTable; if (Ano <> 'Todos') then begin // Filtrar las facturas actuales por empresa FechaIni := '01/01/' + Ano; FechaFin := '31/12/' + Ano; with AAlbaran.DataTable.DynamicWhere do begin // (FECHA_INICIO between FECHA_FIN) Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteFECHA_ALBARAN), NewConstant(FechaIni, datString), dboGreaterOrEqual); Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_AlbaranesClienteFECHA_ALBARAN), NewConstant(FechaFin, datString), dboLessOrEqual), Condicion, dboAnd); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Condicion, Expression, dboAnd); end; end; end; procedure TAlbaranesClienteController.FiltrarEmpresa(AAlbaran: IBizAlbaranCliente); var Condicion: TDAWhereExpression; begin if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := False; // Filtrar los presupuestos actuales por empresa with AAlbaran.DataTable.DynamicWhere do begin // (ID_EMPRESA >= ID) Condicion := NewBinaryExpression(NewField('', fld_AlbaranesClienteID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := False; end; procedure TAlbaranesClienteController.SetClienteController(const Value: IClientesController); begin FClienteController := Value; end; procedure TAlbaranesClienteController.SetDetallesController(const Value: IDetallesAlbaranClienteController); begin FDetallesController := Value; end; function TAlbaranesClienteController.Guardar(AAlbaran: IBizAlbaranCliente): Boolean; var IDNuevo: Integer; begin Result := False; if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignada'); if not Assigned(FDetallesController) then raise Exception.Create ('Controller detalles no asignado'); if ValidarAlbaran(AAlbaran) then begin ShowHourglassCursor; // Asegurarnos de que todos los importes están bien. RecalcularImportes(AAlbaran); try AAlbaran.DataTable.ApplyUpdates; Result := True; finally HideHourglassCursor; end; end; end; function TAlbaranesClienteController.Nuevo: IBizAlbaranCliente; var AAlbaran : IBizAlbaranCliente; begin AAlbaran := FDataModule.NewItem; FiltrarEmpresa(AAlbaran); AAlbaran.DataTable.Active := True; AAlbaran.Insert; Result := AAlbaran; end; procedure TAlbaranesClienteController.QuitarDireccionEnvio( AAlbaran: IBizAlbaranCliente); var bEnEdicion : Boolean; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (QuitarDireccionEnvio)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; bEnEdicion := (AAlbaran.DataTable.State in dsEditModes); if not bEnEdicion then AAlbaran.Edit; ShowHourglassCursor; AAlbaran.Edit; try AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteCALLE).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePOBLACION).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteCODIGO_POSTAL).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePROVINCIA).Clear; AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteTELEFONO).Clear; // AAlbaran.DataTable.FieldByName(fld_AlbaranesClientePERSONA_CONTACTO).Clear; if not bEnEdicion then AAlbaran.Post; finally HideHourglassCursor; end; end; procedure TAlbaranesClienteController.Preview(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); var AReportController : IAlbaranesClienteReportController; ID_Albaranes: TIntegerList; begin AReportController := TAlbaranesClienteReportController.Create; ID_Albaranes := TIntegerList.Create; try //Si deseamos previsualizar todos los items del objeto albaran if AllItems then begin with AAlbaran.DataTable do begin First; while not EOF do begin ID_Albaranes.Add(AAlbaran.ID); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Albaranes.Add(AAlbaran.ID); AReportController.Preview(ID_Albaranes, VerLogotipo, VerImprimirPrecios, VerImprimirTotales); finally AReportController := NIL; FreeANDNIL(ID_Albaranes); end; end; procedure TAlbaranesClienteController.Print(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); var AReportController : IAlbaranesClienteReportController; ID_Albaranes: TIntegerList; begin AReportController := TAlbaranesClienteReportController.Create; ID_Albaranes := TIntegerList.Create; try //Si deseamos previsualizar todos los items del objeto albaran if AllItems then begin with AAlbaran.DataTable do begin First; while not EOF do begin ID_Albaranes.Add(AAlbaran.ID); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Albaranes.Add(AAlbaran.ID); AReportController.Print(ID_Albaranes, VerLogotipo, VerImprimirPrecios, VerImprimirTotales); finally AReportController := NIL; FreeANDNIL(ID_Albaranes); end; end; procedure TAlbaranesClienteController.RecalcularImportes(AAlbaran: IBizAlbaranCliente); var bEnEdicion : Boolean; ADetallePosAct : Integer; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (RecalcularImportes)'); if AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; { Hay que guardar la posición en la que estamos en los detalles por que la asignación de valores a los campos IMPORTE_NETO e IMPORTE_PORTE (ver más adelante) colocan el puntero en la tabla detalle al principio. No he encontrado la razón por la que mueve el puntero. } ADetallePosAct := AAlbaran.Detalles.POSICION; bEnEdicion := (AAlbaran.DataTable.State in dsEditModes); if not bEnEdicion then AAlbaran.Edit; ShowHourglassCursor; AAlbaran.Edit; try AAlbaran.IMPORTE_NETO := FDetallesController.DarTotalImporteTotal(AAlbaran.Detalles); AAlbaran.IMPORTE_PORTE := FDetallesController.DarTotalPorteTotal(AAlbaran.Detalles); if not bEnEdicion then AAlbaran.Post; finally HideHourglassCursor; // Restaurar la posición que teníamos en los detalles. FDetallesController.LocalizarPosicion(AAlbaran.Detalles, ADetallePosAct); end; end; function TAlbaranesClienteController.GetClienteController: IClientesController; begin Result := FClienteController; end; function TAlbaranesClienteController.GetDetallesController: IDetallesAlbaranClienteController; begin Result := FDetallesController; end; end.