unit uAlbaranesClienteController; interface uses SysUtils, uDADataTable, uEditorDBItem, uControllerBase, uIDataModuleAlbaranesCliente, uClientesController, uDetallesAlbaranClienteController, uBizAlbaranesCliente, uBizDireccionesContacto; type IAlbaranesClienteController = interface(IObservador) ['{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); procedure Print(AAlbaran : IBizAlbaranCliente; AllItems: 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; end; TAlbaranesClienteController = class(TObservador, 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 Preview(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false); procedure Print(AAlbaran : IBizAlbaranCliente; AllItems: Boolean = false); procedure EtiquetasPreview(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); procedure EtiquetasPrint(AAlbaran : IBizAlbaranCliente; Const withRefCliente: Boolean); end; implementation uses uROTypes, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils, uIEditorAlbaranesCliente, uIEditorAlbaranesDevCliente, uIEditorAlbaranDevCliente, uDataModuleAlbaranesCliente, Variants, uBizDetallesAlbaranCliente, uBizContactos, uDataTableUtils, uDataModuleUsuarios, Classes, uFactuGES_App, schAlbaranesClienteClient_Intf, uDAInterfaces, uDateUtils, uIEditorAlbaranCliente, uIEditorElegirAlbaranesCliente, uIEditorDireccionEntregaAlbaranCliente, schContactosClient_Intf, uAlbaranesClienteReportController, uControllerDetallesBase, // Pedidos no estará en TECSITEL // uPedidosClienteController, uBizPedidosCliente, uBizDetallesPedidoCliente, schPedidosClienteClient_Intf, uDialogUtils, Windows, Forms, Dialogs, uGUIBase; { 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 Result := 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; 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; USUARIO := AppFactuGES.UsuarioActivo.UserName; FECHA_ALBARAN := DateOf(Now); INCIDENCIAS_ACTIVAS := 0; // 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 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'); //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; //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 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 : IEditorDBItem; begin AEditor := NIL; ShowHourglassCursor; try RecuperarObjetos(AAlbaran); if (AAlbaran.TIPO = CTE_TIPO_ALBARAN) then CreateEditor('EditorAlbaranCliente', IEditorAlbaranCliente, AEditor) else CreateEditor('EditorAlbaranDevCliente', IEditorAlbaranDevCliente, AEditor); if Assigned(AEditor) then with (AEditor as IEditorAlbaranCliente) do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Albaran := AAlbaran; //MODO CONSULTAR if not EsModificable(AAlbaran) then begin SetDataTableReadOnly(AAlbaran.DataTable, True); ReadOnly := True; end; ShowModal; //MODO CONSULTAR (Se deja la tabla como estaba) if ReadOnly then SetDataTableReadOnly(AAlbaran.DataTable, False); AEditor.Release; end; finally AEditor := NIL; HideHourglassCursor; end; end; procedure TAlbaranesClienteController.VerDireccionEntrega( AAlbaran: IBizAlbaranCliente); var AEditor : IEditorDireccionEntregaAlbaranCliente; begin AEditor := NIL; ShowHourglassCursor; try //RecuperarObjetos(AAlbaran); <- No descomentar. No hace falta CreateEditor('EditorDireccionEntregaAlbaranCliente', IEditorDireccionEntregaAlbaranCliente, AEditor); if Assigned(AEditor) then with (AEditor as IEditorDireccionEntregaAlbaranCliente) do begin Albaran := AAlbaran; ShowModal; Release; end; finally AEditor := NIL; HideHourglassCursor; end; end; procedure TAlbaranesClienteController.VerTodosAlbaranes(AAlbarans: IBizAlbaranCliente); var AEditor : IEditorAlbaranesCliente; begin AEditor := NIL; ShowHourglassCursor; try CreateEditor('EditorAlbaranesCliente', IEditorAlbaranesCliente, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Albaranes := AAlbarans; MultiSelect := True; ShowEmbedded; end; finally AEditor := NIL; HideHourglassCursor; end; end; procedure TAlbaranesClienteController.VerTodosAlbaranesDev(AAlbarans: IBizAlbaranCliente); var AEditor : IEditorAlbaranesDevCliente; begin AEditor := NIL; ShowHourglassCursor; try CreateEditor('EditorAlbaranesDevCliente', IEditorAlbaranesDevCliente, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Albaranes := AAlbarans; MultiSelect := True; ShowEmbedded; end; finally AEditor := NIL; HideHourglassCursor; 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; ShowHourglassCursor; try CreateEditor('EditorElegirAlbaranesCliente', IEditorElegirAlbaranesCliente, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; Albaranes := AAlbaran; MultiSelect := AMultiSelect; Mensaje := AMensaje; if IsPositiveResult(ShowModal) then Result := AlbaranesClienteSeleccionados; Release; end; finally AEditor := NIL; HideHourglassCursor; 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; 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.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; 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); var AReportController : IAlbaranesClienteReportController; ID_Albaranes: TStringList; begin AReportController := TAlbaranesClienteReportController.Create; ID_Albaranes := TStringList.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(IntToStr(AAlbaran.ID)); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Albaranes.Add(IntToStr(AAlbaran.ID)); AReportController.Preview(ID_Albaranes.CommaText); finally AReportController := NIL; ID_Albaranes.Free; end; end; procedure TAlbaranesClienteController.Print(AAlbaran: IBizAlbaranCliente; AllItems: Boolean = false); var AReportController : IAlbaranesClienteReportController; ID_Albaranes: TStringList; begin AReportController := TAlbaranesClienteReportController.Create; ID_Albaranes := TStringList.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(IntToStr(AAlbaran.ID)); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Albaranes.Add(IntToStr(AAlbaran.ID)); AReportController.Print(ID_Albaranes.CommaText); finally AReportController := NIL; ID_Albaranes.Free; 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; 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.