unit uCuentasEspecialesController;

interface


uses
  Classes, SysUtils, uDADataTable, uControllerBase,
  uBizCuentasEspeciales, uIDataModuleContabilidad;
type
  ICuentasEspecialesController = interface(IControllerBase)
  ['{94E5F2B6-64C8-4331-B9CB-3ED730478529}']
    function BuscarTodos: IBizCuentaEspecial;
    function Buscar(ID: Integer): IBizCuentaEspecial;
    procedure VerTodos(ACuentasEspeciales: IBizCuentaEspecial);
    procedure Ver(ACuentaEspecial: IBizCuentaEspecial);
    procedure Anadir(ACuentaEspecial : IBizCuentaEspecial);
    function Eliminar(ACuentaEspecial : IBizCuentaEspecial): Boolean; 
    function Guardar(ACuentaEspecial : IBizCuentaEspecial): Boolean;
    procedure DescartarCambios(ACuentaEspecial : IBizCuentaEspecial);
    function Localizar(ACuentasEspeciales: IBizCuentaEspecial; ADescripcion:String): Boolean;
    function DarListaCuentasEspeciales: TStringList;

    function ExtraerSeleccionados(ACuentasEspeciales: IBizCuentaEspecial) : IBizCuentaEspecial;
    function ElegirCuentaEspecial(ACuentasEspeciales : IBizCuentaEspecial; AMensaje: String; AMultiSelect: Boolean): IBizCuentaEspecial;
  end;

  TCuentasEspecialesController = class(TControllerBase, ICuentasEspecialesController)
  protected
    FDataModule : IDataModuleContabilidad;

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

    function ValidarCuentaEspecial(ACuentaEspecial: IBizCuentaEspecial): Boolean;
    procedure AsignarDataModule;

  public
    constructor Create; override;
    destructor Destroy; override;

    function Eliminar(ACuentaEspecial : IBizCuentaEspecial): Boolean;
    function Guardar(ACuentaEspecial : IBizCuentaEspecial): Boolean; virtual;
    procedure DescartarCambios(ACuentaEspecial : IBizCuentaEspecial); virtual;
    procedure Anadir(ACuentaEspecial : IBizCuentaEspecial);
    function BuscarTodos: IBizCuentaEspecial;
    function Buscar(ID: Integer): IBizCuentaEspecial;
    procedure VerTodos(ACuentasEspeciales: IBizCuentaEspecial);
    procedure Ver(ACuentaEspecial: IBizCuentaEspecial);
    function Localizar(ACuentasEspeciales: IBizCuentaEspecial; ADescripcion:String): Boolean;
    function DarListaCuentasEspeciales: TStringList;

    function ExtraerSeleccionados(ACuentasEspeciales: IBizCuentaEspecial) : IBizCuentaEspecial;
    function ElegirCuentaEspecial(ACuentasEspeciales : IBizCuentaEspecial; AMensaje: String; AMultiSelect: Boolean): IBizCuentaEspecial;
  end;

implementation

uses
  cxControls, DB, uEditorRegistryUtils, schContabilidadClient_Intf,
  uIEditorCuentasEspeciales, uIEditorCuentaEspecial, uIEditorElegirCuentasEspeciales,
  uDataModuleContabilidad,
  uDAInterfaces, uDataTableUtils, uDialogUtils,
  uDateUtils, uROTypes, DateUtils, Controls, Windows;

{ TCuentasEspecialesController }

procedure TCuentasEspecialesController.Anadir(ACuentaEspecial: IBizCuentaEspecial);
begin
  ACuentaEspecial.Insert;
end;

procedure TCuentasEspecialesController.AsignarDataModule;
begin
  FDataModule := TDataModuleContabilidad.Create(Nil);
end;

function TCuentasEspecialesController.Buscar(ID: Integer): IBizCuentaEspecial;
var
  Condicion: TDAWhereExpression;
begin
  ShowHourglassCursor;
  try
    Result := BuscarTodos;

    with Result.DataTable.DynamicWhere do
    begin
      // (ID = :ID)
      Condicion := NewBinaryExpression(NewField('', fld_CuentasEspecialesID), NewConstant(ID, datInteger), dboEqual);

      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;

  finally
    HideHourglassCursor;
  end;
end;

function TCuentasEspecialesController.BuscarTodos: IBizCuentaEspecial;
begin
  Result := FDataModule.GetCuentaEspecialItems;
end;

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

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

function TCuentasEspecialesController.DarListaCuentasEspeciales: TStringList;
var
  ACuentasEspeciales: IBizCuentaEspecial;
begin
  ACuentasEspeciales := BuscarTodos;
  ACuentasEspeciales.DataTable.Active := True;
  Result := TStringList.Create;
  try
    with Result do
    begin
      ACuentasEspeciales.DataTable.First;
      while not ACuentasEspeciales.DataTable.EOF do
      begin
        Add(ACuentasEspeciales.DESCRIPCION);
        ACuentasEspeciales.DataTable.Next;
      end;
    end;
  finally
    ACuentasEspeciales := NIL;
  end;
end;

procedure TCuentasEspecialesController.DescartarCambios(ACuentaEspecial: IBizCuentaEspecial);
begin
  if not Assigned(ACuentaEspecial) then
    raise Exception.Create ('CuentaEspecial no asignado');

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

    ACuentaEspecial.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

destructor TCuentasEspecialesController.Destroy;
begin
  FDataModule:= NIL;
  inherited;
end;

function TCuentasEspecialesController.ValidarCuentaEspecial(ACuentaEspecial: IBizCuentaEspecial): Boolean;
begin
  Result := False;
  if not Assigned(ACuentaEspecial) then
    raise Exception.Create ('CuentaEspecial no asignado');

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

  if Length(ACuentaEspecial.DESCRIPCION) = 0 then
    raise Exception.Create('Debe indicar un nombre para este CuentaEspecial.');

  Result := True;
end;

procedure TCuentasEspecialesController.Ver(ACuentaEspecial: IBizCuentaEspecial);
var
  AEditor : IEditorCuentaEspecial;
begin
  AEditor := NIL;

  CreateEditor('EditorCuentaEspecial', IEditorCuentaEspecial, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.CuentaEspecial := ACuentaEspecial;
      AEditor.ShowModal;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

procedure TCuentasEspecialesController.VerTodos(ACuentasEspeciales: IBizCuentaEspecial);
var
  AEditor : IEditorCuentasEspeciales;
begin
  AEditor := NIL;

  CreateEditor('EditorCuentasEspeciales', IEditorCuentasEspeciales, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE
      AEditor.CuentasEspeciales := ACuentasEspeciales;
      AEditor.ShowModal;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

function TCuentasEspecialesController.ElegirCuentaEspecial(ACuentasEspeciales: IBizCuentaEspecial; AMensaje: String;
  AMultiSelect: Boolean): IBizCuentaEspecial;
var
  AEditor : IEditorElegirCuentasEspeciales;
begin
  Result := NIL;

  CreateEditor('EditorElegirCuentasEspeciales', IEditorElegirCuentasEspeciales, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.CuentasEspeciales := ACuentasEspeciales;
      AEditor.Controller := Self;
      AEditor.Mensaje := AMensaje;
      if IsPositiveResult(AEditor.ShowModal) then
        Result := AEditor.CuentasEspecialesSeleccionados;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

function TCuentasEspecialesController.Eliminar(ACuentaEspecial: IBizCuentaEspecial): Boolean;
begin
  if not Assigned(ACuentaEspecial) then
    raise Exception.Create ('CuentaEspecial no asignado');

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

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

function TCuentasEspecialesController.ExtraerSeleccionados(ACuentasEspeciales: IBizCuentaEspecial): IBizCuentaEspecial;
var
  ASeleccionados : IBizCuentaEspecial;
begin
  ASeleccionados := Self.Buscar(ID_NULO);
  CopyDataTableDA5(ACuentasEspeciales.DataTable, ASeleccionados.DataTable, True);
  Result := ASeleccionados;
end;

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

function TCuentasEspecialesController.Guardar(ACuentaEspecial: IBizCuentaEspecial): Boolean;
begin
  Result := False;

  if ValidarCuentaEspecial(ACuentaEspecial) then
  begin
    ShowHourglassCursor;
    try
      ACuentaEspecial.DataTable.ApplyUpdates;
      Result := True;
    finally
      HideHourglassCursor;
    end;
  end;
end;

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

end.
