unit uEmpresasController;

interface


uses
  Windows, Forms, Classes, Controls, Contnrs, SysUtils,
  uBizEmpresas, uIDataModuleEmpresas, uDADataTable, uControllerBase;

type
  IEmpresasController = interface(IControllerBase)
    ['{2F0AB21C-4F19-446E-87C4-B9C1038850FC}']
    function Buscar(const ID: Integer): IBizEmpresa;
    function BuscarTodos: IBizEmpresa;
    procedure Ver(AEmpresa : IBizEmpresa);
    procedure VerTodos(AEmpresas: IBizEmpresa);
    function Nuevo : IBizEmpresa;
    procedure Anadir(AEmpresa : IBizEmpresa);
    function Eliminar(const ID : Integer): Boolean; overload;
    function Eliminar(AEmpresa : IBizEmpresa): Boolean; overload;
    function Guardar(AEmpresa : IBizEmpresa): Boolean;
    procedure DescartarCambios(AEmpresa : IBizEmpresa);
    function Existe(const ID: Integer) : Boolean;
    function ToStringList(AEmpresa : IBizEmpresa) : TStringList;
    function DarListaCuentasBancarias(AEmpresa : IBizEmpresa): TStringList;
    function DarListaCuentasBancariasIBAN(AEmpresa : IBizEmpresa): TStringList;
  end;

  TEmpresasController = class(TControllerBase, IEmpresasController)
  protected
    FDataModule : IDataModuleEmpresas;
    function ValidarEmpresa(AEmpresa : IBizEmpresa): Boolean; virtual;
  public
    constructor Create; override;
    destructor Destroy; override;

    function Eliminar(const ID : Integer): Boolean; overload;
    function Eliminar(AEmpresa : IBizEmpresa): Boolean; overload;
    function Guardar(AEmpresa : IBizEmpresa): Boolean;
    procedure DescartarCambios(AEmpresa : IBizEmpresa); virtual;
    function Existe(const ID: Integer) : Boolean; virtual;
    procedure Anadir(AEmpresa : IBizEmpresa); virtual;

    function Buscar(const ID: Integer): IBizEmpresa; virtual;
    function BuscarTodos: IBizEmpresa; virtual;
    function Nuevo : IBizEmpresa; virtual;
    procedure Ver(AEmpresa : IBizEmpresa); virtual;
    procedure VerTodos(AEmpresas: IBizEmpresa); virtual;
    function ToStringList(AEmpresa : IBizEmpresa) : TStringList; virtual;
    function DarListaCuentasBancarias(AEmpresa : IBizEmpresa): TStringList;
    function DarListaCuentasBancariasIBAN(AEmpresa : IBizEmpresa): TStringList;
  end;

implementation

uses
  uEditorRegistryUtils, cxControls, DB, uFactuGES_App, uStringsUtils,
  uDataModuleEmpresas, uIEditorEmpresa, uBizEmpresasDatosBancarios;

{ TEmpresasController }

procedure TEmpresasController.Anadir(AEmpresa: IBizEmpresa);
begin
  AEmpresa.Insert;
end;

function TEmpresasController.Buscar(const ID: Integer): IBizEmpresa;
begin
  Result := FDataModule.GetItem(ID)
end;

function TEmpresasController.BuscarTodos: IBizEmpresa;
begin
  Result := FDataModule.GetItems;
end;

constructor TEmpresasController.Create;
begin
  inherited;
  FDataModule := TDataModuleEmpresas.Create(Nil);
end;

function TEmpresasController.DarListaCuentasBancarias(
  AEmpresa: IBizEmpresa): TStringList;
var
  ADatosBancarios: IBizEmpresasDatosBancarios;
  Aux : String;
begin
  if not Assigned(AEmpresa) then
    raise Exception.Create ('Empresa no asignada (DarListaCuentasBancarias)');

  ADatosBancarios := AEmpresa.DatosBancarios;
  ADatosBancarios.DataTable.Active := True;

  Result := TStringList.Create;
  ShowHourglassCursor;
  try
    with Result do
    begin
      ADatosBancarios.DataTable.First;
      while not ADatosBancarios.DataTable.EOF do
      begin
        Aux := Format('Nº de cuenta: %s %s %s %s  - %s', [ADatosBancarios.ENTIDAD,
          ADatosBancarios.SUCURSAL, ADatosBancarios.DC, ADatosBancarios.CUENTA, ADatosBancarios.NOMBRE]);
        Add(Format('%s=%d', [Aux, ADatosBancarios.ID]));
        ADatosBancarios.DataTable.Next;
      end;
    end;
  finally
    ADatosBancarios := NIL;
    HideHourglassCursor;
  end;
end;

function TEmpresasController.DarListaCuentasBancariasIBAN(AEmpresa: IBizEmpresa): TStringList;
var
  ADatosBancarios: IBizEmpresasDatosBancarios;
  Aux : String;
begin
  if not Assigned(AEmpresa) then
    raise Exception.Create ('Empresa no asignada (DarListaCuentasBancariasIBAN)');

  ADatosBancarios := AEmpresa.DatosBancarios;
  ADatosBancarios.DataTable.Active := True;

  Result := TStringList.Create;
  ShowHourglassCursor;
  try
    with Result do
    begin
      ADatosBancarios.DataTable.First;
      while not ADatosBancarios.DataTable.EOF do
      begin
        if not EsCadenaVacia(ADatosBancarios.IBAN) then
        begin
          Aux := Format('IBAN: %s - SWIFT: %s  - %s', [ADatosBancarios.IBAN, ADatosBancarios.SWIFT, ADatosBancarios.NOMBRE]);
          Add(Format('%s=%d', [Aux, ADatosBancarios.ID]));
        end;
        ADatosBancarios.DataTable.Next;
      end;
    end;
  finally
    ADatosBancarios := NIL;
    HideHourglassCursor;
  end;
end;

procedure TEmpresasController.DescartarCambios(AEmpresa: IBizEmpresa);
begin
  if not Assigned(AEmpresa) then
    raise Exception.Create ('Empresa no asignada (DescartarCambios)');

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

    AEmpresa.DataTable.CancelUpdates;
  finally
    HideHourglassCursor;
  end;
end;

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

function TEmpresasController.Eliminar(AEmpresa: IBizEmpresa): Boolean;
begin
  if not Assigned(AEmpresa) then
    raise Exception.Create ('Empresa no asignada');

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

    AEmpresa.Delete;
    AEmpresa.DataTable.ApplyUpdates;

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

function TEmpresasController.Eliminar(const ID: Integer): Boolean;
var
  AEmpresa : IBizEmpresa;
begin
  AEmpresa := Buscar(ID);

  if not Assigned(AEmpresa) then
    raise Exception.Create(Format('No se ha encontrado la empresa con ID = %d', [ID]));

  Result := Eliminar(AEmpresa);
  AEmpresa := NIL;
end;

function TEmpresasController.Existe(const ID: Integer): Boolean;
var
  AEmpresa : IBizEmpresa;
begin
  try
    AEmpresa := Buscar(ID);
    Result := Assigned(AEmpresa) and (AEmpresa.ID = ID);
  finally
    AEmpresa := NIL;
  end;
end;

function TEmpresasController.Guardar(AEmpresa: IBizEmpresa): Boolean;
begin
  Result := False;

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

function TEmpresasController.Nuevo: IBizEmpresa;
begin
  Result := FDataModule.NewItem;
end;

function TEmpresasController.ToStringList(AEmpresa: IBizEmpresa): TStringList;
begin
  Result := TStringList.Create;
  with Result do
  begin
    AEmpresa.DataTable.Active := True;
    AEmpresa.First;
    while not AEmpresa.EOF do
    begin
      Add(AEmpresa.NOMBRE);
      AEmpresa.Next;
    end;
  end;
end;

function TEmpresasController.ValidarEmpresa(AEmpresa: IBizEmpresa): Boolean;
begin
  if not Assigned(AEmpresa) then
    raise Exception.Create ('Empresa no asignada');

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

  if Length(AEmpresa.NOMBRE) = 0 then
    raise Exception.Create('Debe indicar al menos el nombre de la empresa.');

  // Asegurarse de valores en campos "automáticos"
  AEmpresa.Edit;
  AEmpresa.USUARIO := AppFactuGES.UsuarioActivo.UserName;
  AEmpresa.Post;
  
  Result := True;
end;

procedure TEmpresasController.Ver(AEmpresa: IBizEmpresa);
var
  AEditor : IEditorEmpresa;
begin
  AEditor := NIL;
	CreateEditor('EditorEmpresa', IEditorEmpresa, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Empresa := AEmpresa;
      AEditor.Controller := Self;
      AEditor.ShowModal;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

procedure TEmpresasController.VerTodos(AEmpresas: IBizEmpresa);
{var
  AEditor : IEditorEmpresas;}
begin
{
  AEditor := NIL;
  CreateEditor('EditorEmpresas', IEditorClientes, AEditor);
  if Assigned(AEditor) then
     try
      AEditor.Contactos := AContactos;
      AEditor.Controller := Self;
      AEditor.ShowModal;
     finally
      AEditor.Release;
      AEditor := NIL;
     end;
}
end;

end.
