unit uReferenciasController;

interface


uses
  Classes, SysUtils, uDADataTable, uControllerBase,
  uIDataModuleReferencias, uBizReferencias;

type
  IReferenciasController = interface(IControllerBase)
  ['{832E33B0-3228-4519-A740-F551DF3004DD}']
    function BuscarTodos: IBizReferencia;
    procedure VerTodos(AReferencias: IBizReferencia);
    function Guardar(AReferencia : IBizReferencia): Boolean;
    procedure DescartarCambios(AReferencia : IBizReferencia);
  end;

  TReferenciasController = class(TControllerBase, IReferenciasController)
  protected
    FDataModule : IDataModuleReferencias;
//    procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
    function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;

    function ValidarReferencia(AReferencia: IBizReferencia): Boolean;
    procedure AsignarDataModule;
    procedure FiltrarEmpresa(AReferencias: IBizReferencia);
  public
    constructor Create; override;
    destructor Destroy; override;

    function Guardar(AReferencia : IBizReferencia): Boolean; virtual;
    procedure DescartarCambios(AReferencia : IBizReferencia); virtual;
    function BuscarTodos: IBizReferencia;
    procedure VerTodos(AReferencias: IBizReferencia);
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils, schReferenciasClient_Intf,
  uIEditorReferencias, uDataModuleReferencias, uFactuGES_App,
  uDAInterfaces, uDataTableUtils, uDialogUtils,
  uDateUtils, uROTypes, DateUtils, Controls, Windows;

{ TReferenciasController }

procedure TReferenciasController.AsignarDataModule;
begin
  FDataModule := TDataModuleReferencias.Create(Nil);
end;

function TReferenciasController.BuscarTodos: IBizReferencia;
begin
  Result := FDataModule.GetItems;
  FiltrarEmpresa(Result);
end;

procedure TReferenciasController.FiltrarEmpresa(AReferencias: IBizReferencia);
var
  Condicion: TDAWhereExpression;
begin
  if AReferencias.DataTable.Active then
    AReferencias.DataTable.Active := False;

  // Filtrar las facturas actuales por empresa
  with AReferencias.DataTable.DynamicWhere do
  begin
    // (ID_EMPRESA >= ID)
    Condicion := NewBinaryExpression(NewField('', fld_ReferenciasID_EMPRESA),
      NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual);

    if IsEmpty then
       Expression := Condicion
    else
       Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
  end;
end;

constructor TReferenciasController.Create;
begin
  inherited;
  AsignarDataModule;
end;

function TReferenciasController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean;
begin
  Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf);
end;

procedure TReferenciasController.DescartarCambios(AReferencia: IBizReferencia);
begin
  if not Assigned(AReferencia) then
    raise Exception.Create ('Forma de pago no asignada');

  ShowHourglassCursor;
  try
    if (AReferencia.State in dsEditModes) then
      AReferencia.Cancel;

    AReferencia.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

destructor TReferenciasController.Destroy;
begin
  FDataModule := NIL;
  inherited;
end;

function TReferenciasController.ValidarReferencia(AReferencia: IBizReferencia): Boolean;
begin
  Result := False;

  if not Assigned(AReferencia) then
    raise Exception.Create ('Referencia no asignada');

  if (AReferencia.DataTable.State in dsEditModes) then
    AReferencia.DataTable.Post;

//  if Length(AReferencia.VALOR) = 0 then
//    raise Exception.Create('Debe indicar un código para esta referencia.');

  Result := True;
end;

procedure TReferenciasController.VerTodos(AReferencias: IBizReferencia);
var
  AEditor : IEditorReferencias;
begin
  CreateEditor('EditorReferencias', IEditorReferencias, AEditor);
  if Assigned(AEditor) then
      try
        AEditor.Referencias := AReferencias;
        AEditor.ShowModal;
      finally
        AEditor.Release;
        AEditor := NIL;
      end;
end;
{
procedure TReferenciasController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
begin
  inherited;
//
end;
}

function TReferenciasController.Guardar(AReferencia: IBizReferencia): Boolean;
var
  NuevoID : Integer;
begin
  Result := False;

  if ValidarReferencia(AReferencia) then
  begin
    ShowHourglassCursor;
    try
      AReferencia.DataTable.ApplyUpdates;
      Result := True;
    finally
      HideHourglassCursor;
    end;
  end;
end;

end.
