Tecsitel_FactuGES2/Source/Modulos/Contactos/Controller/uContactosController.pas

285 lines
8.3 KiB
ObjectPascal
Raw Blame History

unit uContactosController;
interface
uses
Windows, Forms, Classes, Controls, Contnrs, SysUtils, uDADataTable,
uBizContactos, uBizContactosDatosBancarios, uIDataModuleContactos;
type
IContactosController = interface
['{43F9A4ED-6563-4F95-9A56-330CF9C66731}']
function Buscar(const ID: Integer): IBizContacto;
function BuscarTodos: IBizContacto;
procedure Ver(AContacto : IBizContacto);
procedure VerTodos(AContactos: IBizContacto);
function Nuevo : IBizContacto;
procedure Anadir(AContacto : IBizContacto);
procedure Eliminar(const ID : Integer); overload;
function Eliminar(AContacto : IBizContacto): Boolean; overload;
function Guardar(AContacto : IBizContacto): Boolean;
procedure DescartarCambios(AContacto : IBizContacto);
function Existe(const ID: Integer) : Boolean;
function Duplicar(AContacto : IBizContacto) : IBizContacto;
function Localizar(AContactos: IBizContacto; const ID : Integer): Boolean;
function ElegirContacto(AContactos : IBizContacto;
AMensaje: String; AMultiSelect: Boolean): IBizContacto;
function ExtraerSeleccionados(AContactos: IBizContacto) : IBizContacto;
end;
TContactosController = class(TInterfacedObject, IContactosController)
protected
FDataModule : IDataModuleContactos;
procedure FiltrarEmpresa(AContacto : IBizContacto); virtual;
function _Vacio : IBizContacto; virtual;
function ValidarContacto(AContacto : IBizContacto): Boolean; virtual;
public
constructor Create; virtual;
destructor Destroy; override;
procedure Eliminar(const ID : Integer); overload; virtual;
function Eliminar(AContacto : IBizContacto): Boolean; overload; virtual;
function Guardar(AContacto : IBizContacto): Boolean;
procedure DescartarCambios(AContacto : IBizContacto); virtual;
function Existe(const ID: Integer) : Boolean; virtual;
procedure Anadir(AContacto : IBizContacto); virtual;
function Duplicar(AContacto: IBizContacto): IBizContacto; virtual;
function ExtraerSeleccionados(AContactos: IBizContacto) : IBizContacto; virtual;
function Localizar(AContactos: IBizContacto; const ID : Integer): Boolean;
// Se implementa en los controladores hijos
function Buscar(const ID: Integer): IBizContacto; virtual; abstract;
function BuscarTodos: IBizContacto; virtual; abstract;
function Nuevo : IBizContacto; virtual; abstract;
procedure Ver(AContacto : IBizContacto); virtual; abstract;
procedure VerTodos(AContactos: IBizContacto); virtual; abstract;
function ElegirContacto(AContactos : IBizContacto;
AMensaje: String; AMultiSelect: Boolean): IBizContacto; virtual; abstract;
end;
implementation
uses
Dialogs, uEditorRegistryUtils, cxControls, DB, uDAInterfaces, uDataTableUtils,
schContactosClient_Intf, uFactuGES_App;
{ TContactosController }
procedure TContactosController.Anadir(AContacto: IBizContacto);
begin
AContacto.Insert;
end;
function TContactosController.Duplicar(AContacto: IBizContacto): IBizContacto;
begin
Result := Self._Vacio;
ShowHourglassCursor;
try
DuplicarRegistros(AContacto.DataTable, Result.DataTable, mdrActual);
DuplicarRegistros(AContacto.DatosBancarios.DataTable, Result.DatosBancarios.DataTable, mdrTodos);
if Assigned(AContacto.Direcciones) then
DuplicarRegistros(AContacto.Direcciones.DataTable, Result.Direcciones.DataTable, mdrTodos);
// Hay que dejar algunos campos como si fuera un contacto nuevo
Result.Edit;
with Result do
begin
// OJO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!111
//ID_EMPRESA := dmUsuarios.IDEmpresaActual;
//USUARIO := dmUsuarios.LoginInfo.Usuario;
end;
Result.Post;
finally
HideHourglassCursor;
end;
end;
constructor TContactosController.Create;
begin
FDataModule := NIL;
end;
procedure TContactosController.DescartarCambios(AContacto: IBizContacto);
begin
if not Assigned(AContacto) then
raise Exception.Create ('Contacto no asignado');
ShowHourglassCursor;
try
if (AContacto.State in dsEditModes) then
AContacto.Cancel;
AContacto.DataTable.CancelUpdates;
finally
HideHourglassCursor;
end;
end;
destructor TContactosController.Destroy;
begin
FDataModule := NIL;
inherited;
end;
function TContactosController.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 contacto porque tiene documentos dados de alta (como presupuestos, albaranes, facturas, etc)', 'Atenci<63>n', MB_ICONWARNING or MB_OK);
end;
end;
end;
procedure TContactosController.Eliminar(const ID: Integer);
var
AContacto : IBizContacto;
begin
AContacto := Buscar(ID);
if not Assigned(AContacto) then
raise Exception.Create(Format('No se ha encontrado el contacto con ID = %d', [ID]));
Eliminar(AContacto);
AContacto := NIL;
end;
function TContactosController.Existe(const ID: Integer): Boolean;
var
AContacto : IBizContacto;
begin
try
AContacto := Buscar(ID);
Result := Assigned(AContacto) and (AContacto.ID = ID);
finally
AContacto := NIL;
end;
end;
function TContactosController.ExtraerSeleccionados(
AContactos: IBizContacto): IBizContacto;
var
ASeleccionados : IBizContacto;
begin
ASeleccionados := Self.Buscar(ID_NULO);
CopyDataTable2(AContactos.DataTable, ASeleccionados.DataTable, True);
Result := ASeleccionados;
end;
function TContactosController.Guardar(AContacto: IBizContacto): Boolean;
var
dtDetails : TList;
i : integer;
begin
Result := False;
if ValidarContacto(AContacto) then
begin
ShowHourglassCursor;
if AContacto.EsNuevo then
begin
AContacto.Edit;
AContacto.ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
AContacto.Post;
end;
dtDetails := AContacto.DataTable.GetDetailDataTables;
for i := 0 to dtDetails.Count - 1 do
begin
if (TDADataTable(dtDetails.Items[i])).State in dsEditModes then
(TDADataTable(dtDetails.Items[i])).Post;
end;
try
AContacto.DataTable.ApplyUpdates;
Result := True;
finally
HideHourglassCursor;
end;
end;
end;
function TContactosController.Localizar(AContactos: IBizContacto;
const ID: Integer): Boolean;
begin
Result := True;
ShowHourglassCursor;
try
with AContactos.DataTable do
begin
DisableControls;
First;
if not Locate(fld_ContactosID, ID, []) then
Result := False;
EnableControls;
end;
finally
HideHourglassCursor;
end;
end;
function TContactosController.ValidarContacto(AContacto: IBizContacto): Boolean;
begin
Result := False;
if not Assigned(AContacto) then
raise Exception.Create ('Contacto no asignado');
if (AContacto.DataTable.State in dsEditModes) then
AContacto.DataTable.Post;
if Length(AContacto.NOMBRE) = 0 then
raise Exception.Create('Debe indicar al menos el nombre de este contacto.');
// Asegurarse de valores en campos "autom<6F>ticos"
// OJOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
{AContacto.Edit;
AContacto.USUARIO := dmUsuarios.LoginInfo.Usuario;
AContacto.Post;}
Result := True;
end;
function TContactosController._Vacio: IBizContacto;
begin
Result := Buscar(ID_NULO);
end;
procedure TContactosController.FiltrarEmpresa(AContacto: IBizContacto);
begin
if AContacto.DataTable.Active then
AContacto.DataTable.Active := False;
// Filtrar los contactos actuales por empresa
with AContacto.DataTable.DynamicWhere do
begin
// (ID = :ID)
// OJOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
{ Expression := NewBinaryExpression(NewField('', fld_ContactosID_EMPRESA),
NewConstant(dmUsuarios.IDEmpresaActual, datInteger), dboEqual);}
end;
end;
end.