unit uGruposEmpleadoController;

interface


uses
  Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem,
  uIDataModuleEmpleados, uBizGruposEmpleado;

type
  IGruposEmpleadoController = interface(IControllerBase)
    ['{6820BA19-5E5E-459F-9001-FB4A712ACC4C}']
    function BuscarTodos: IBizGrupoEmpleado;
    procedure VerTodos(AGruposEmpleado: IBizGrupoEmpleado);
    procedure Anadir(AGrupoEmpleado : IBizGrupoEmpleado);
    function Eliminar(AGrupoEmpleado : IBizGrupoEmpleado): Boolean; 
    function Guardar(AGrupoEmpleado : IBizGrupoEmpleado): Boolean;
    procedure DescartarCambios(AGrupoEmpleado : IBizGrupoEmpleado);
    function Localizar(AGruposEmpleado: IBizGrupoEmpleado; ADescripcion:String): Boolean;
    function DarListaGruposEmpleado: TStringList;
  end;

  TGruposEmpleadoController = class(TControllerBase, IGruposEmpleadoController)
  protected
    FDataModule : IDataModuleEmpleados;
    procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
    function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
    function ValidarGrupoEmpleado(AGrupoEmpleado: IBizGrupoEmpleado): Boolean;
    procedure AsignarDataModule; virtual;
  public
    constructor Create; override;
    destructor Destroy; override;

    function Eliminar(AGrupoEmpleado : IBizGrupoEmpleado): Boolean;
    function Guardar(AGrupoEmpleado : IBizGrupoEmpleado): Boolean; 
    procedure DescartarCambios(AGrupoEmpleado : IBizGrupoEmpleado); virtual;
    procedure Anadir(AGrupoEmpleado : IBizGrupoEmpleado);
    function BuscarTodos: IBizGrupoEmpleado;
    procedure VerTodos(AGruposEmpleado: IBizGrupoEmpleado);
    function Localizar(AGruposEmpleado: IBizGrupoEmpleado; ADescripcion:String): Boolean;
    function DarListaGruposEmpleado: TStringList;
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils,
  uIEditorGruposEmpleado, uDataModuleEmpleados,
  uDAInterfaces, uDataTableUtils, 
  uDateUtils, uROTypes, DateUtils, Controls, Windows, schContactosClient_Intf;

{ TGruposEmpleadoController }

procedure TGruposEmpleadoController.Anadir(AGrupoEmpleado: IBizGrupoEmpleado);
begin
  AGrupoEmpleado.Insert;
end;

procedure TGruposEmpleadoController.AsignarDataModule;
begin
  FDataModule := TDataModuleEmpleados.Create(Nil);
end;

function TGruposEmpleadoController.BuscarTodos: IBizGrupoEmpleado;
begin
  Result := FDataModule.GetGruposEmpleado;
end;

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

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

function TGruposEmpleadoController.DarListaGruposEmpleado: TStringList;
var
  AGruposEmpleado: IBizGrupoEmpleado;
begin
  AGruposEmpleado := BuscarTodos;
  AGruposEmpleado.DataTable.Active := True;
  Result := TStringList.Create;
  try
    with Result do
    begin
      AGruposEmpleado.DataTable.First;
      while not AGruposEmpleado.DataTable.EOF do
      begin
        Add(AGruposEmpleado.DESCRIPCION);
        AGruposEmpleado.DataTable.Next;
      end;
    end;
  finally
    AGruposEmpleado := NIL;
  end;
end;

procedure TGruposEmpleadoController.DescartarCambios(AGrupoEmpleado: IBizGrupoEmpleado);
begin
  if not Assigned(AGrupoEmpleado) then
    raise Exception.Create ('GrupoEmpleado no asignado');

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

    AGrupoEmpleado.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

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

function TGruposEmpleadoController.ValidarGrupoEmpleado(AGrupoEmpleado: IBizGrupoEmpleado): Boolean;
begin
  if not Assigned(AGrupoEmpleado) then
    raise Exception.Create ('GrupoEmpleado no asignada');

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

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

  Result := True;
end;

procedure TGruposEmpleadoController.VerTodos(AGruposEmpleado: IBizGrupoEmpleado);
var
  AEditor : IEditorGruposEmpleado;
begin
  AEditor := NIL;

  CreateEditor('EditorGruposEmpleado', IEditorGruposEmpleado, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
      AEditor.GruposEmpleado := AGruposEmpleado;
      AEditor.ShowModal;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

function TGruposEmpleadoController.Eliminar(AGrupoEmpleado: IBizGrupoEmpleado): Boolean;
begin
  if not Assigned(AGrupoEmpleado) then
    raise Exception.Create ('GrupoEmpleado no asignada');

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

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

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

function TGruposEmpleadoController.Guardar(AGrupoEmpleado: IBizGrupoEmpleado): Boolean;
begin
  Result := False;

  if ValidarGrupoEmpleado(AGrupoEmpleado) then
  begin
    ShowHourglassCursor;
    try
      if (AGrupoEmpleado.DataTable.State in dsEditModes) then
          AGrupoEmpleado.DataTable.Post;

      AGrupoEmpleado.DataTable.ApplyUpdates;

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

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

end.
