unit uProcedenciasClienteController;

interface


uses
  Classes, SysUtils, uDADataTable, uEditorDBItem,
  uIDataModuleClientes, uBizProcedenciasCliente, uControllerBase;

type
  IProcedenciasClienteController = interface(IControllerBase)
  ['{C2D71CED-DCD6-47F1-8BCA-1027DA4A6385}']
    function BuscarTodos: IBizProcedenciaCliente;
    procedure VerTodos(AProcedenciasCliente: IBizProcedenciaCliente);
    procedure Anadir(AProcedenciaCliente : IBizProcedenciaCliente);
    function Eliminar(AProcedenciaCliente : IBizProcedenciaCliente): Boolean; 
    function Guardar(AProcedenciaCliente : IBizProcedenciaCliente): Boolean;
    procedure DescartarCambios(AProcedenciaCliente : IBizProcedenciaCliente);
    function Localizar(AProcedenciasCliente: IBizProcedenciaCliente; ADescripcion:String): Boolean;
    function DarListaProcedenciasCliente: TStringList;
  end;

  TProcedenciasClienteController = class(TControllerBase, IProcedenciasClienteController)
  protected
    FDataModule : IDataModuleClientes;
    procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
    function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
    function ValidarProcedenciaCliente(AProcedenciaCliente: IBizProcedenciaCliente): Boolean;
    procedure AsignarDataModule; virtual;
  public
    constructor Create; override;
    destructor Destroy; override;

    function Eliminar(AProcedenciaCliente : IBizProcedenciaCliente): Boolean;
    function Guardar(AProcedenciaCliente : IBizProcedenciaCliente): Boolean;
    procedure DescartarCambios(AProcedenciaCliente : IBizProcedenciaCliente); virtual;
    procedure Anadir(AProcedenciaCliente : IBizProcedenciaCliente);
    function BuscarTodos: IBizProcedenciaCliente;
    procedure VerTodos(AProcedenciasCliente: IBizProcedenciaCliente);
    function Localizar(AProcedenciasCliente: IBizProcedenciaCliente; ADescripcion:String): Boolean;
    function DarListaProcedenciasCliente: TStringList;
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils,
  uIEditorProcedenciasCliente, uDataModuleClientes,
  uDAInterfaces, uDataTableUtils, 
  uDateUtils, uROTypes, DateUtils, Controls, Windows, schContactosClient_Intf;

{ TProcedenciasClienteController }

procedure TProcedenciasClienteController.Anadir(AProcedenciaCliente: IBizProcedenciaCliente);
begin
  AProcedenciaCliente.Insert;
end;

procedure TProcedenciasClienteController.AsignarDataModule;
begin
  FDataModule := TDataModuleClientes.Create(Nil);
end;

function TProcedenciasClienteController.BuscarTodos: IBizProcedenciaCliente;
begin
  Result := FDataModule.GetProcedenciasCliente;
end;

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

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

function TProcedenciasClienteController.DarListaProcedenciasCliente: TStringList;
var
  AProcedenciasCliente: IBizProcedenciaCliente;
begin
  AProcedenciasCliente := BuscarTodos;
  AProcedenciasCliente.DataTable.Active := True;
  Result := TStringList.Create;
  try
    with Result do
    begin
      AProcedenciasCliente.DataTable.First;
      while not AProcedenciasCliente.DataTable.EOF do
      begin
        Add(AProcedenciasCliente.DESCRIPCION);
        AProcedenciasCliente.DataTable.Next;
      end;
    end;
  finally
    AProcedenciasCliente := NIL;
  end;
end;

procedure TProcedenciasClienteController.DescartarCambios(AProcedenciaCliente: IBizProcedenciaCliente);
begin
  if not Assigned(AProcedenciaCliente) then
    raise Exception.Create ('ProcedenciaCliente no asignado');

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

    AProcedenciaCliente.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

destructor TProcedenciasClienteController.Destroy;
begin
  FDataModule := Nil;
  inherited;
end;

function TProcedenciasClienteController.ValidarProcedenciaCliente(AProcedenciaCliente: IBizProcedenciaCliente): Boolean;
begin
  Result := False;
  
  if not Assigned(AProcedenciaCliente) then
    raise Exception.Create ('ProcedenciaCliente no asignada');

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

  if Length(AProcedenciaCliente.DESCRIPCION) = 0 then
    raise Exception.Create('Debe indicar al menos la descripción de esta procedencia.');

  Result := True;
end;

procedure TProcedenciasClienteController.VerTodos(AProcedenciasCliente: IBizProcedenciaCliente);
var
  AEditor : IEditorProcedenciasCliente;
begin
  AEditor := NIL;

  CreateEditor('EditorProcedenciasCliente', IEditorProcedenciasCliente, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
      AEditor.ProcedenciasCliente := AProcedenciasCliente;
      AEditor.ShowModal;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

function TProcedenciasClienteController.Eliminar(AProcedenciaCliente: IBizProcedenciaCliente): Boolean;
begin
  if not Assigned(AProcedenciaCliente) then
    raise Exception.Create ('ProcedenciaCliente no asignada');

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

    AProcedenciaCliente.Delete;
    AProcedenciaCliente.DataTable.ApplyUpdates;
    HideHourglassCursor;
    Result := True;
  finally
    HideHourglassCursor;
  end;
end;

procedure TProcedenciasClienteController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
begin
  inherited;
//
end;

function TProcedenciasClienteController.Guardar(AProcedenciaCliente: IBizProcedenciaCliente): Boolean;
begin
  Result := False;

  if ValidarProcedenciaCliente(AProcedenciaCliente) then
  begin
    ShowHourglassCursor;
    try
      if (AProcedenciaCliente.DataTable.State in dsEditModes) then
          AProcedenciaCliente.DataTable.Post;

      AProcedenciaCliente.DataTable.ApplyUpdates;

      Result := True;
    finally
      HideHourglassCursor;
    end;
  end;
end;

function TProcedenciasClienteController.Localizar(AProcedenciasCliente: IBizProcedenciaCliente; ADescripcion: String): Boolean;
begin
  Result := True;
  ShowHourglassCursor;
  try
    with AProcedenciasCliente.DataTable do
    begin
      DisableControls;
      First;
      if not Locate(fld_ProcedenciasClienteDESCRIPCION, ADescripcion, []) then
         Result := False;
      EnableControls;   
    end;
  finally
    HideHourglassCursor;
  end;
end;

end.
