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
    try
      AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
      AEditor.Ejercicio := AEjercicio;
      AEditor.ShowModal;
    finally
      AEditor.Release;
      AEditor := NIL
    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.
