unit uEjerciciosController; interface uses Classes, SysUtils, uDADataTable, uControllerBase, uBizEjercicios, uIDataModuleEjercicios; type IEjerciciosController = interface(IControllerBase) ['{94E5F2B6-64C8-4331-B9CB-3ED730478529}'] function BuscarTodos: IBizEjercicio; function Buscar(ID: Integer): IBizEjercicio; function BuscarActivo(IDEmpresa: Integer): IBizEjercicio; procedure VerTodos(AEjercicios: IBizEjercicio); procedure Ver(AEjercicio: IBizEjercicio); procedure Anadir(AEjercicio : IBizEjercicio); function Eliminar(AEjercicio : IBizEjercicio): Boolean; function Guardar(AEjercicio : IBizEjercicio): Boolean; function GenerarPCG(IdEjercicioCopia, IdEjercicio: Integer): Boolean; procedure DescartarCambios(AEjercicio : IBizEjercicio); function Localizar(AEjercicios: IBizEjercicio; ADescripcion:String): Boolean; function DarListaEjercicios: TStringList; end; TEjerciciosController = class(TControllerBase, IEjerciciosController) private procedure FiltrarEmpresa(AEjercicio: IBizEjercicio); protected FDataModule : IDataModuleEjercicios; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override; function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean; function ValidarEjercicio(AEjercicio: IBizEjercicio): Boolean; procedure AsignarDataModule; public constructor Create; override; destructor Destroy; override; function Eliminar(AEjercicio : IBizEjercicio): Boolean; function Guardar(AEjercicio : IBizEjercicio): Boolean; virtual; procedure DescartarCambios(AEjercicio : IBizEjercicio); virtual; procedure Anadir(AEjercicio : IBizEjercicio); function BuscarTodos: IBizEjercicio; function Buscar(ID: Integer): IBizEjercicio; function BuscarActivo(IDEmpresa: Integer): IBizEjercicio; procedure VerTodos(AEjercicios: IBizEjercicio); procedure Ver(AEjercicio: IBizEjercicio); function GenerarPCG(IdEjercicioCopia, IdEjercicio: Integer): Boolean; function Localizar(AEjercicios: IBizEjercicio; ADescripcion:String): Boolean; function DarListaEjercicios: TStringList; end; implementation uses cxControls, DB, uEditorRegistryUtils, schEjerciciosClient_Intf, uIEditorEjercicios, uIEditorEjercicio, uDataModuleEjercicios, uDAInterfaces, uDataTableUtils, uDialogUtils, uFactuGES_App, uDateUtils, uROTypes, DateUtils, Controls, Windows, Dialogs; { TEjerciciosController } procedure TEjerciciosController.Anadir(AEjercicio: IBizEjercicio); {var FechaInicio: TDate; FechaFin: TDate;} begin AEjercicio.Insert; //Asignar fecha de inicio y fin siguientes ShowHourglassCursor; try // FDataModule.DarAnoSiguiente(FechaInicio, FechaFin); // AEjercicio.FECHA_INICIO := finally HideHourglassCursor; end; end; procedure TEjerciciosController.AsignarDataModule; begin FDataModule := TDataModuleEjercicios.Create(Nil); end; function TEjerciciosController.Buscar(ID: Integer): IBizEjercicio; var Condicion: TDAWhereExpression; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.DynamicWhere do begin // (ID = :ID) Condicion := NewBinaryExpression(NewField('', fld_EjerciciosID), NewConstant(ID, datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; finally HideHourglassCursor; end; end; function TEjerciciosController.BuscarActivo(IDEmpresa: Integer): IBizEjercicio; var Condicion: TDAWhereExpression; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.DynamicWhere do begin // (ACTIVO = 1) Condicion := NewBinaryExpression(NewField('', fld_EjerciciosACTIVO), NewConstant(1, datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; finally HideHourglassCursor; end; end; function TEjerciciosController.BuscarTodos: IBizEjercicio; begin Result := FDataModule.GetItems; FiltrarEmpresa(Result); end; constructor TEjerciciosController.Create; begin inherited; AsignarDataModule; end; function TEjerciciosController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean; begin Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf); end; function TEjerciciosController.DarListaEjercicios: TStringList; var AEjercicios: IBizEjercicio; begin AEjercicios := BuscarTodos; AEjercicios.DataTable.Active := True; Result := TStringList.Create; try with Result do begin AEjercicios.DataTable.First; while not AEjercicios.DataTable.EOF do begin Add(AEjercicios.NOMBRE); AEjercicios.DataTable.Next; end; end; finally AEjercicios := NIL; end; end; procedure TEjerciciosController.DescartarCambios(AEjercicio: IBizEjercicio); begin if not Assigned(AEjercicio) then raise Exception.Create ('Ejercicio no asignado'); ShowHourglassCursor; try if (AEjercicio.State in dsEditModes) then AEjercicio.Cancel; AEjercicio.DataTable.CancelUpdates; finally HideHourglassCursor; end; end; destructor TEjerciciosController.Destroy; begin FDataModule:= NIL; inherited; end; function TEjerciciosController.ValidarEjercicio(AEjercicio: IBizEjercicio): Boolean; begin Result := False; if not Assigned(AEjercicio) then raise Exception.Create ('Ejercicio no asignado'); if (AEjercicio.DataTable.State in dsEditModes) then AEjercicio.DataTable.Post; if (AEjercicio.DataTable.RecordCount = 1) and (AEjercicio.ACTIVO = 0) then raise Exception.Create('Debe existir un ejercicio activo.'); if Length(AEjercicio.NOMBRE) = 0 then raise Exception.Create('Debe indicar un nombre para este ejercicio.'); Result := True; end; procedure TEjerciciosController.Ver(AEjercicio: IBizEjercicio); var AEditor : IEditorEjercicio; begin AEditor := NIL; CreateEditor('EditorEjercicio', IEditorEjercicio, AEditor); if Assigned(AEditor) then with (AEditor as IEditorEjercicio) do begin try Controller := Self; //OJO ORDEN MUY IMPORTANTE Ejercicio := AEjercicio; ShowModal; finally Release; AEditor := NIL end; end; end; procedure TEjerciciosController.VerTodos(AEjercicios: IBizEjercicio); var AEditor : IEditorEjercicios; begin AEditor := NIL; CreateEditor('EditorEjercicios', IEditorEjercicios, AEditor); if Assigned(AEditor) then with AEditor do begin Controller := Self; //OJO ORDEN MUY IMPORTANTE Ejercicios := AEjercicios; ShowEmbedded; end; end; function TEjerciciosController.Eliminar(AEjercicio: IBizEjercicio): Boolean; begin if not Assigned(AEjercicio) then raise Exception.Create ('Ejercicio no asignado'); ShowHourglassCursor; try if (AEjercicio.State in dsEditModes) then AEjercicio.Cancel; //ATENCIÓN!! Debe haber claves foraneas en las tablas de CONT_EPIGRAFES, CONT_CUENTAS, CONT_SUBCUENTAS //con el fin de que al borrar un ejercicio se borren todos sus datos correspondientes AEjercicio.Delete; AEjercicio.DataTable.ApplyUpdates; AEjercicio.DataTable.Refresh; //Debemos refrescar en este caso para que se vea el nuevo ejercicio activo en el cliente, como no serán muchos ejercicios nos da igual HideHourglassCursor; Result := True; finally HideHourglassCursor; end; end; procedure TEjerciciosController.FiltrarEmpresa(AEjercicio: IBizEjercicio); var Condicion: TDAWhereExpression; begin if AEjercicio.DataTable.Active then AEjercicio.DataTable.Active := False; // Filtrar las facturas actuales por empresa with AEjercicio.DataTable.DynamicWhere do begin // (ID_EMPRESA >= ID) Condicion := NewBinaryExpression(NewField('', fld_EjerciciosID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; procedure TEjerciciosController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); begin inherited; // end; function TEjerciciosController.GenerarPCG(IdEjercicioCopia, IdEjercicio: Integer): Boolean; begin ShowHourglassCursor; try Result := FDataModule.GenerarPGC(IdEjercicioCopia, IdEjercicio); finally HideHourglassCursor; end; end; function TEjerciciosController.Guardar(AEjercicio: IBizEjercicio): Boolean; begin Result := False; if ValidarEjercicio(AEjercicio) then begin ShowHourglassCursor; try AEjercicio.DataTable.ApplyUpdates; AppFactuGES.CambiarEjercicio(AppFactuGES.EmpresaActiva.ID); Result := True; finally HideHourglassCursor; end; end; end; function TEjerciciosController.Localizar(AEjercicios: IBizEjercicio; ADescripcion: String): Boolean; begin Result := True; ShowHourglassCursor; try with AEjercicios.DataTable do begin DisableControls; First; if not Locate(fld_EjerciciosNOMBRE, ADescripcion, []) then Result := False; EnableControls; end; finally HideHourglassCursor; end; end; end.