unit uGruposClienteController;

interface


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

type
  IGruposClienteController = interface(IControllerBase)
  ['{32D31B02-76A6-4C9B-85D4-3C632969AC79}']
    function BuscarTodos: IBizGrupoCliente;
    procedure VerTodos(AGruposCliente: IBizGrupoCliente);
    procedure Anadir(AGrupoCliente : IBizGrupoCliente);
    function Eliminar(AGrupoCliente : IBizGrupoCliente): Boolean; 
    function Guardar(AGrupoCliente : IBizGrupoCliente): Boolean;
    procedure DescartarCambios(AGrupoCliente : IBizGrupoCliente);
    function Localizar(AGruposCliente: IBizGrupoCliente; ADescripcion:String): Boolean;
    function DarListaGruposCliente: TStringList;
  end;

  TGruposClienteController = class(TControllerBase, IGruposClienteController)
  protected
    FDataModule : IDataModuleClientes;
    procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
    function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
    function ValidarGrupoCliente(AGrupoCliente: IBizGrupoCliente): Boolean;
    procedure AsignarDataModule; virtual;
  public
    constructor Create; override;
    destructor Destroy; override;

    function Eliminar(AGrupoCliente : IBizGrupoCliente): Boolean;
    function Guardar(AGrupoCliente : IBizGrupoCliente): Boolean; 
    procedure DescartarCambios(AGrupoCliente : IBizGrupoCliente); virtual;
    procedure Anadir(AGrupoCliente : IBizGrupoCliente);
    function BuscarTodos: IBizGrupoCliente;
    procedure VerTodos(AGruposCliente: IBizGrupoCliente);
    function Localizar(AGruposCliente: IBizGrupoCliente; ADescripcion:String): Boolean;
    function DarListaGruposCliente: TStringList;
  end;

implementation

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

{ TGruposClienteController }

procedure TGruposClienteController.Anadir(AGrupoCliente: IBizGrupoCliente);
begin
  AGrupoCliente.Insert;
end;

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

function TGruposClienteController.BuscarTodos: IBizGrupoCliente;
begin
  Result := FDataModule.GetGruposCliente;
end;

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

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

function TGruposClienteController.DarListaGruposCliente: TStringList;
var
  AGruposCliente: IBizGrupoCliente;
begin
  AGruposCliente := BuscarTodos;
  AGruposCliente.DataTable.Active := True;
  Result := TStringList.Create;
  try
    with Result do
    begin
      AGruposCliente.DataTable.First;
      while not AGruposCliente.DataTable.EOF do
      begin
        Add(AGruposCliente.DESCRIPCION);
        AGruposCliente.DataTable.Next;
      end;
    end;
  finally
    AGruposCliente := NIL;
  end;
end;

procedure TGruposClienteController.DescartarCambios(AGrupoCliente: IBizGrupoCliente);
begin
  if not Assigned(AGrupoCliente) then
    raise Exception.Create ('GrupoCliente no asignado');

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

    AGrupoCliente.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

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

function TGruposClienteController.ValidarGrupoCliente(AGrupoCliente: IBizGrupoCliente): Boolean;
begin
  if not Assigned(AGrupoCliente) then
    raise Exception.Create ('GrupoCliente no asignada');

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

  if Length(AGrupoCliente.DESCRIPCION) = 0 then
    raise Exception.Create('Debe indicar al menos la descripción de este grupo.');

  Result := True;
end;

procedure TGruposClienteController.VerTodos(AGruposCliente: IBizGrupoCliente);
var
  AEditor : IEditorGruposCliente;
begin
  AEditor := NIL;

  CreateEditor('EditorGruposCliente', IEditorGruposCliente, AEditor);
  if Assigned(AEditor) then
      try
         AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
         AEditor.GruposCliente := AGruposCliente;
         AEditor.ShowModal;
      finally
         AEditor.Release;
         AEditor := NIL;
      end;
end;

function TGruposClienteController.Eliminar(AGrupoCliente: IBizGrupoCliente): Boolean;
begin
  if not Assigned(AGrupoCliente) then
    raise Exception.Create ('GrupoCliente no asignada');

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

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

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

function TGruposClienteController.Guardar(AGrupoCliente: IBizGrupoCliente): Boolean;
begin
  Result := False;

  if ValidarGrupoCliente(AGrupoCliente) then
  begin
    ShowHourglassCursor;
    try
      if (AGrupoCliente.DataTable.State in dsEditModes) then
          AGrupoCliente.DataTable.Post;

      AGrupoCliente.DataTable.ApplyUpdates;

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

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

end.
