unit uPerfilesUsuarioController;

interface


uses
  Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem,
  uIDataModuleUsuarios, uBizUsuarios;

type
  IPerfilesUsuarioController = interface(IControllerBase)
  ['{3D60BC4E-B244-4C08-9A1A-00A7C3B74558}']
    function BuscarTodos: IBizPerfilUsuario;
    procedure VerTodos;
    procedure Ver(const AIDPerfil : Integer);
    procedure Anadir(APerfilUsuario : IBizPerfilUsuario);
    function Eliminar(APerfilUsuario : IBizPerfilUsuario): Boolean; overload;
    function Eliminar(const AIDPerfil : Integer): Boolean; overload;
    function Guardar(APerfilUsuario : IBizPerfilUsuario): Boolean;
    procedure DescartarCambios(APerfilUsuario : IBizPerfilUsuario);
    function Localizar(APerfilesUsuario: IBizPerfilUsuario; ADescripcion:String): Boolean;
    function DarListaPerfilesUsuario: TStringList;
  end;

  TPerfilesUsuarioController = class(TControllerBase, IPerfilesUsuarioController)
  protected
    FDataModule : IDataModuleUsuarios;

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

    //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de
    //este controller
    procedure AsignarDataModule; virtual;
    procedure ValidarObjetos; virtual;

  public
    constructor Create; override;
    destructor Destroy; override;

    function Eliminar(APerfilUsuario : IBizPerfilUsuario): Boolean; overload;
    function Eliminar(const AIDPerfil : Integer): Boolean; overload;
    function Guardar(APerfilUsuario : IBizPerfilUsuario): Boolean;
    procedure DescartarCambios(APerfilUsuario : IBizPerfilUsuario); virtual;
    procedure Anadir(APerfilUsuario : IBizPerfilUsuario);
    function BuscarTodos: IBizPerfilUsuario;
    procedure VerTodos;
    procedure Ver(const AIDPerfil : Integer);    
    function Localizar(APerfilesUsuario: IBizPerfilUsuario; ADescripcion:String): Boolean;
    function DarListaPerfilesUsuario: TStringList;
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils, 
  uDAInterfaces, uDataTableUtils,
  uDateUtils, uROTypes, DateUtils, Controls, Windows, schUsuariosClient_Intf,
  uDataModuleUsuarios, uIEditorPerfilesUsuario, uIEditorPerfilUsuario;

{ TPerfilesUsuarioController }

procedure TPerfilesUsuarioController.Anadir(APerfilUsuario: IBizPerfilUsuario);
begin
  APerfilUsuario.Insert;
end;

procedure TPerfilesUsuarioController.AsignarDataModule;
begin
  FDataModule := TDataModuleUsuarios.Create(Nil);
end;

function TPerfilesUsuarioController.BuscarTodos: IBizPerfilUsuario;
begin
  Result := FDataModule.GetPerfiles;
end;

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

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

function TPerfilesUsuarioController.DarListaPerfilesUsuario: TStringList;
var
  APerfilesUsuario: IBizPerfilUsuario;
begin
  APerfilesUsuario := BuscarTodos;
  APerfilesUsuario.DataTable.Active := True;
  Result := TStringList.Create;
  try
    with Result do
    begin
      APerfilesUsuario.DataTable.First;
      while not APerfilesUsuario.DataTable.EOF do
      begin
        Add(APerfilesUsuario.USERNAME);
        APerfilesUsuario.DataTable.Next;
      end;
    end;
  finally
    APerfilesUsuario := NIL;
  end;
end;

procedure TPerfilesUsuarioController.DescartarCambios(APerfilUsuario: IBizPerfilUsuario);
begin
  if not Assigned(APerfilUsuario) then
    raise Exception.Create ('Perfil no asignado');

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

    APerfilUsuario.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

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

function TPerfilesUsuarioController.Eliminar(const AIDPerfil: Integer): Boolean;
begin

end;

procedure TPerfilesUsuarioController.ValidarObjetos;
var
  AEditor : IEditorPerfilesUsuario;
  APerfilesUsuario: IBizPerfilUsuario;
begin
  APerfilesUsuario := FDataModule.GetPerfiles;
  if Assigned(APerfilesUsuario) then
  begin
    try
      APerfilesUsuario.Active := True;
      CreateEditor('EditorPerfilesUsuario', IEditorPerfilesUsuario, AEditor);
      if Assigned(AEditor) then
      begin
         try
          AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
          AEditor.PerfilesUsuario := APerfilesUsuario;
          AEditor.ShowModal;
         finally
          AEditor.Release;
          AEditor := NIL;
         end;
      end;
    finally
      APerfilesUsuario := NIL;
    end;
  end;
end;

procedure TPerfilesUsuarioController.Ver(const AIDPerfil: Integer);
var
  AEditor : IEditorPerfilUsuario;
  FPerfil : IBizPerfilUsuario;
begin
  FPerfil := FDataModule.GetPerfil(AIDPerfil);
  if Assigned(FPerfil) then
  begin
    try
      FPerfil.Active := True;
      CreateEditor('EditorPerfilUsuario', IEditorPerfilUsuario, AEditor);
      if Assigned(AEditor) then
        try
          AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
          AEditor.PerfilUsuario := FPerfil;
          AEditor.ShowModal;
        finally
          AEditor.Release;
          AEditor := NIL;
        end;
    finally
      FPerfil := NIL;
    end;
  end;
end;

procedure TPerfilesUsuarioController.VerTodos;
var
  AEditor : IEditorPerfilesUsuario;
  APerfilesUsuario: IBizPerfilUsuario;
begin
  APerfilesUsuario := FDataModule.GetPerfiles;
  if Assigned(APerfilesUsuario) then
  begin
    try
      APerfilesUsuario.Active := True;
      CreateEditor('EditorPerfilesUsuario', IEditorPerfilesUsuario, AEditor);
      if Assigned(AEditor) then
        try
          AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
          AEditor.PerfilesUsuario := APerfilesUsuario;
          AEditor.ShowModal;
        finally
          AEditor.Release;
          AEditor := NIL;
        end;
         end;
    finally
      APerfilesUsuario := NIL;
    end;
  end;
end;

function TPerfilesUsuarioController.Eliminar(APerfilUsuario: IBizPerfilUsuario): Boolean;
begin
  Result := False;

  if not Assigned(APerfilUsuario) then
    raise Exception.Create ('Perfil no asignado');

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

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

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

function TPerfilesUsuarioController.Guardar(APerfilUsuario: IBizPerfilUsuario): Boolean;
begin
  Result := False;

  if not Assigned(APerfilUsuario) then
    raise Exception.Create ('Perfil no asignado');

  ValidarObjetos;

  ShowHourglassCursor;
  try
    if (APerfilUsuario.DataTable.State in dsEditModes) then
        APerfilUsuario.DataTable.Post;

    APerfilUsuario.DataTable.ApplyUpdates;

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

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

end.
