unit uEmpresasController;

interface


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

type
  IEmpresasController = interface
    ['{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);
    procedure Eliminar(const ID : Integer); overload;
    procedure Eliminar(AEmpresa : IBizEmpresa); overload;
    procedure Guardar(AEmpresa : IBizEmpresa);
    procedure DescartarCambios(AEmpresa : IBizEmpresa);
    function Existe(const ID: Integer) : Boolean;
    function ToStringList(AEmpresa : IBizEmpresa) : TStringList;
  end;

  TEmpresasController = class(TInterfacedObject, IEmpresasController)
  protected
    FDataModule : IDataModuleEmpresas;
    procedure AsignarID(AEmpresa: IBizEmpresa;
      ADataModule : IDataModuleEmpresas); virtual;
  public
    constructor Create; virtual;
    destructor Destroy; override;

    procedure Eliminar(const ID : Integer); overload; virtual;
    procedure Eliminar(AEmpresa : IBizEmpresa); overload; virtual;
    procedure Guardar(AEmpresa : IBizEmpresa); virtual;
    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;
  end;

implementation

uses
  uEditorRegistryUtils, cxControls, DB,
  uDataModuleEmpresas, uIEditorEmpresa;

{ TEmpresasController }

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

procedure TEmpresasController.AsignarID(AEmpresa: IBizEmpresa;
  ADataModule : IDataModuleEmpresas);
var
  NuevoIDCabecera : Integer;
begin
  if not Assigned(AEmpresa) then
    raise Exception.Create ('Empresa no asignada');

  { ””” OJO !!!
    Primero cambiamos el ID de las tablas detalles
    porque si cambiamos antes el ID de la cabecera
    deja de funcionar la relacion M/D y no
    encontrarķamos las filas detalle.

      -->  MASTER.ID = DETAIL.ID_Empresa <--
  }

  NuevoIDCabecera := ADataModule.GetNextID(AEmpresa.DataTable.LogicalName);

  AEmpresa.Edit;
  AEmpresa.ID := NuevoIDCabecera;
  AEmpresa.Post;
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
  FDataModule := TDataModuleEmpresas.Create(Nil);
end;

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

  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;

procedure TEmpresasController.Eliminar(AEmpresa: IBizEmpresa);
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;
  finally
    HideHourglassCursor;
  end;
end;

procedure TEmpresasController.Eliminar(const ID: Integer);
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]));

  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;

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

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

    if (AEmpresa.EsNuevo) then
      AsignarID(AEmpresa, (FDataModule as IDataModuleEmpresas));

    AEmpresa.DataTable.ApplyUpdates;
  finally
    HideHourglassCursor;
  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;

procedure TEmpresasController.Ver(AEmpresa: IBizEmpresa);
var
  AEditor : IEditorEmpresa;
begin
  CreateEditor('EditorEmpresa', IEditorEmpresa, AEditor);
  with AEditor do
  begin
    Empresa := AEmpresa;
    Controller := Self;
    ShowModal;
  end;
end;

procedure TEmpresasController.VerTodos(AEmpresas: IBizEmpresa);
{var
  AEditor : IEditorClientes;}
begin
{  CreateEditor('EditorEmpresas', IEditorClientes, AEditor);
  with AEditor do
  begin
    Contactos := AContactos;
    Controller := Self;
    ShowEmbedded;
  end;}
end;

end.
