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

315 lines
9.2 KiB
ObjectPascal
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit uContactosController;
interface
uses
Windows, Forms, Classes, Controls, Contnrs, SysUtils, uDADataTable,
uBizContactos, uBizContactosDatosBancarios, uIDataModuleContactos,
uControllerBase;
type
IContactosController = interface(IControllerBase)
['{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;
function DarListaPersonalConMovil(const IDContacto : Integer): TStringList;
end;
TContactosController = class(TControllerBase, IContactosController)
protected
FDataModule : IDataModuleContactos;
procedure FiltrarEmpresa(AContacto : IBizContacto); virtual;
function _Vacio : IBizContacto; virtual;
function ValidarContacto(AContacto : IBizContacto): Boolean; virtual;
public
constructor Create; override;
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;
function DarListaPersonalConMovil(const IDContacto : Integer): TStringList;
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
ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
USUARIO := AppFactuGES.UsuarioActivo.UserName;
REFERENCIA := '';
end;
Result.Post;
finally
HideHourglassCursor;
end;
end;
constructor TContactosController.Create;
begin
FDataModule := NIL;
end;
function TContactosController.DarListaPersonalConMovil(const IDContacto : Integer): TStringList;
var
AContacto: IBizContacto;
AStr : String;
begin
AContacto := IBizContacto(Buscar(IDContacto));
AContacto.DataTable.Active := True;
Result := TStringList.Create;
try
with Result do
begin
AContacto.Personal.DataTable.First;
while not AContacto.Personal.DataTable.EOF do
begin
AStr := AContacto.Personal.NOMBRE;
if not AContacto.Personal.MOVILIsNull then
AStr := AStr + '. Tlf: ' + AContacto.Personal.MOVIL;
Add(AStr);
AContacto.Personal.DataTable.Next;
end;
end;
finally
AContacto := NIL;
end;
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);
CopyDataTableDA5(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
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"
AContacto.Edit;
AContacto.USUARIO := AppFactuGES.UsuarioActivo.UserName;
AContacto.Post;
Result := True;
end;
function TContactosController._Vacio: IBizContacto;
begin
Result := Buscar(ID_NULO);
end;
procedure TContactosController.FiltrarEmpresa(AContacto: IBizContacto);
var
Condicion: TDAWhereExpression;
begin
if AContacto.DataTable.Active then
AContacto.DataTable.Active := False;
// Filtrar los presupuestos actuales por empresa
with AContacto.DataTable.DynamicWhere do
begin
// (ID_EMPRESA >= ID)
Condicion := NewBinaryExpression(NewField('', fld_ContactosID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual);
if IsEmpty then
Expression := Condicion
else
Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
end;
end;
end.