unit uAgentesController;

interface

uses
  uCustomEditor,
  uContactosController, uBizContactos,
  uIEditorAgentes, uIEditorAgente, uIDataModuleContactos, uIDataModuleAgentes;

type
  IAgentesController = interface(IContactosController)
    ['{23016B7A-1FDA-4092-ACE5-D27D3A50F236}']
  end;

  TAgentesController = class(TContactosController, IAgentesController)
  protected
    procedure AsignarID(AContacto: IBizContacto; const IDNuevo: Integer); override;

  public
    constructor Create; override;

    function Duplicar(AContacto: IBizContacto): IBizContacto; override;

    function Buscar(const ID: Integer): IBizContacto; override;
    function BuscarTodos: IBizContacto; override;
    function Nuevo : IBizContacto; override;
    procedure Ver(AContacto : IBizContacto); override;
    procedure VerTodos(AContactos: IBizContacto); override;
    function Eliminar(AContacto: IBizContacto): Boolean; override;
  end;

implementation

uses
  Windows, SysUtils, cxControls, Dialogs, uDataModuleAgentes, uEditorRegistryUtils,
  uDataTableUtils, uDADataTable, DB, schContactosClient_Intf;

{ TAgentesController }

procedure TAgentesController.AsignarID(AContacto: IBizContacto;
  const IDNuevo: Integer);
begin
  if not Assigned(AContacto) then
    raise Exception.Create ('Contacto no asignado');

  { Los datos de comisiones hay que comprobarlos siempre
    tanto en inserción como en modificación. }
  with (AContacto as IBizAgente) do
    if Assigned(Comisiones) then
      AsignarIDDetalles(AContacto, IDNuevo, Comisiones.DataTable);

  inherited;
end;

function TAgentesController.Buscar(const ID: Integer): IBizContacto;
begin
  Result := (FDataModule as IDataModuleAgentes).GetItem(ID);
  FiltrarEmpresa(Result);
end;

function TAgentesController.BuscarTodos: IBizContacto;
begin
  Result := (FDataModule as IDataModuleAgentes).GetItems;
  FiltrarEmpresa(Result);
end;

constructor TAgentesController.Create;
begin
  inherited;
  FDataModule := TDataModuleAgentes.Create(Nil);
end;

function TAgentesController.Duplicar(AContacto: IBizContacto): IBizContacto;
begin
  Result := inherited Duplicar(AContacto);

  if Assigned((Result as IBizAgente).Comisiones) then
     DuplicarRegistros((AContacto as IBizAgente).Comisiones.DataTable, (Result as IBizAgente).Comisiones.DataTable, mdrTodos);
end;

function TAgentesController.Eliminar(AContacto: IBizContacto): Boolean;
begin
  Result := False;

  if not Assigned(AContacto) then
    raise Exception.Create ('Contacto no asignado');

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

    AContacto.Delete;
    AContacto.DataTable.ApplyUpdates;
    HideHourglassCursor;
    Result := True;
  except
    on E: Exception do
    begin
      AContacto.DataTable.CancelUpdates;
      HideHourglassCursor;
      if (Pos('FOREIGN KEY', E.Message) > 0) then
         MessageBox(0, 'No se puede borrar este agente porque tiene documentos dados de alta (como liquidaciones de comisiones, asignado a un cliente, etc)', 'Atención', MB_ICONWARNING or MB_OK);
    end;
  end;
end;

function TAgentesController.Nuevo: IBizContacto;
var
  AContacto : IBizAgente;
begin
  AContacto := (FDataModule as IDataModuleAgentes).NewItem;
  FiltrarEmpresa(AContacto);  
  AContacto.DataTable.Active := True;
  AContacto.Insert;
  Result := AContacto;
end;

procedure TAgentesController.Ver(AContacto: IBizContacto);
var
  AEditor : IEditorAgente;
begin
  AEditor := NIL;	
  ShowHourglassCursor;
  try
	CreateEditor('EditorAgente', IEditorAgente, AEditor);
	with AEditor do
	begin
		Contacto := AContacto;
		Controller := Self;
	end;
  finally
    HideHourglassCursor;
  end;

  if Assigned(AEditor) then
    try
      AEditor.ShowModal;
      AEditor.Release;
    finally
      AEditor := NIL;
    end;
end;

procedure TAgentesController.VerTodos(AContactos: IBizContacto);
var
  AEditor : IEditorAgentes;
begin
  CreateEditor('EditorAgentes', IEditorAgentes, AEditor);
  with AEditor do
  begin
    Contactos := AContactos;
    Controller := Self;
    ShowEmbedded;
  end;
end;

end.
