unit uTiposVentaController;

interface


uses
  Classes, SysUtils, uDADataTable, uControllerBase,
  uIDataModuleTiposVenta, uBizTiposVenta;

type
  ITiposVentaController = interface(IControllerBase)
  ['{A5616174-3C9C-4EF3-8437-2C64E20137EB}']
    function BuscarTodos: IBizTipoVenta;
    procedure VerTodos(ATiposVenta: IBizTipoVenta);
    function Guardar(AReferencia : IBizTipoVenta): Boolean;
    procedure DescartarCambios(AReferencia : IBizTipoVenta);
    function DarListaTiposVenta: TStringList;
  end;

  TTiposVentaController = class(TControllerBase, ITiposVentaController)
  protected
    FDataModule : IDataModuleTiposVenta;

//    procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
    function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;

    function ValidarReferencia(AReferencia: IBizTipoVenta): Boolean;
    procedure AsignarDataModule;

  public
    constructor Create; override;
    destructor Destroy; override;

    function Guardar(AReferencia : IBizTipoVenta): Boolean; virtual;
    procedure DescartarCambios(AReferencia : IBizTipoVenta); virtual;
    function BuscarTodos: IBizTipoVenta;
    procedure VerTodos(ATiposVenta: IBizTipoVenta);
    function DarListaTiposVenta: TStringList;
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils, schTiposVentaClient_Intf,
  uIEditorTiposVenta, uDataModuleTiposVenta,
  uDAInterfaces, uDataTableUtils, uDialogUtils,
  uDateUtils, uROTypes, DateUtils, Controls, Windows;

{ TTiposVentaController }

procedure TTiposVentaController.AsignarDataModule;
begin
  FDataModule := TDataModuleTiposVenta.Create(Nil);
end;

function TTiposVentaController.BuscarTodos: IBizTipoVenta;
begin
  Result := FDataModule.GetItems;
end;

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

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

function TTiposVentaController.DarListaTiposVenta: TStringList;
var
  ATiposVenta: IBizTipoVenta;
  i : integer;
begin
  ATiposVenta := BuscarTodos;
  ATiposVenta.DataTable.Active := True;

  Result := TStringList.Create;
  try
    with Result do
    begin
      Add(Format('%s=%d', [CTE_GENERAL, CTE_ID_GENERAL]));

      ATiposVenta.DataTable.First;
      while not ATiposVenta.DataTable.EOF do
      begin
        Add(Format('%s=%d', [ATiposVenta.DESCRIPCION, ATiposVenta.ID]));
        ATiposVenta.DataTable.Next;
      end;
    end;
  finally
    ATiposVenta := NIL;
  end;
end;

procedure TTiposVentaController.DescartarCambios(AReferencia: IBizTipoVenta);
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 TTiposVentaController.Destroy;
begin
  FDataModule := NIL;
  inherited;
end;

function TTiposVentaController.ValidarReferencia(AReferencia: IBizTipoVenta): 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 TTiposVentaController.VerTodos(ATiposVenta: IBizTipoVenta);
var
  AEditor : IEditorTiposVenta;
begin
  AEditor := NIL;

  CreateEditor('EditorTiposVenta', IEditorTiposVenta, AEditor);
  if Assigned(AEditor) then
    try
       AEditor.TiposVenta := ATiposVenta;
       AEditor.ShowModal;
    finally
       AEditor.Release;
       AEditor := NIL;
    end;
end;
{
procedure TTiposVentaController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
begin
  inherited;
//
end;
}

function TTiposVentaController.Guardar(AReferencia: IBizTipoVenta): 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.
