unit uReferenciasController;

interface


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

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

  TReferenciasController = class(TObservador, 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 AsignarID(AReferencia: IBizReferencia; const IDNuevo: Integer);

  public
    constructor Create;
    destructor Destroy; override;

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

implementation

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

{ TReferenciasController }

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

procedure TReferenciasController.AsignarID(AReferencia: IBizReferencia;
  const IDNuevo: Integer);
begin
//
end;

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

constructor TReferenciasController.Create;
begin
  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
  AEditor := NIL;
  ShowHourglassCursor;
  try
    CreateEditor('EditorReferencias', IEditorReferencias, AEditor);
    with AEditor do
      Referencias := AReferencias;
  finally
    HideHourglassCursor;
  end;

  if Assigned(AEditor) then
    try
      AEditor.ShowModal;
      AEditor.Release;
    finally
      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
//      if AReferencia.EsNuevo then
//        NuevoID := FDataModule.GetNextID(AReferencia.DataTable.LogicalName)
//      else
//        NuevoID := AReferencia.ID;

//      AsignarID(AReferencia, NuevoID);
      AReferencia.DataTable.ApplyUpdates;

      Result := True;
    finally
      HideHourglassCursor;
    end;
  end;
end;
{
function TReferenciasController.Localizar(AReferencias: IBizReferencia; ADescripcion: String): Boolean;
begin
  Result := True;
  ShowHourglassCursor;
  try
    with AReferencias.DataTable do
    begin
      DisableControls;
      First;
      if not Locate(fld_ReferenciasDESCRIPCION, ADescripcion, []) then
         Result := False;
      EnableControls;
    end;
  finally
    HideHourglassCursor;
  end;
end;
}
end.
