2007-11-28 17:40:31 +00:00
unit uContactosController;
interface
uses
Windows, Forms, Classes, Controls, Contnrs, SysUtils, uDADataTable,
2008-04-08 19:12:47 +00:00
uBizContactos, uBizContactosDatosBancarios, uIDataModuleContactos,
2008-07-14 14:35:47 +00:00
uBizDireccionesContacto, uDireccionesContactoController,
uControllerBase;
2007-11-28 17:40:31 +00:00
type
2008-07-14 14:35:47 +00:00
IContactosController = interface( IControllerBase)
2007-11-28 17:40:31 +00:00
[ '{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;
2008-07-28 11:58:45 +00:00
// procedure SetID_Tienda (AContacto: IBizContacto; const ID_Tienda: Integer);
2008-04-08 19:12:47 +00:00
function ElegirDireccion( AContacto: IBizContacto; AMensaje: String ) : IBizDireccionesContacto;
2007-11-28 17:40:31 +00:00
end ;
2008-07-14 14:35:47 +00:00
TContactosController = class( TControllerBase, IContactosController)
2007-11-28 17:40:31 +00:00
protected
FDataModule : IDataModuleContactos;
procedure FiltrarEmpresa( AContacto : IBizContacto) ; virtual ;
function _Vacio : IBizContacto; virtual ;
function ValidarContacto( AContacto : IBizContacto) : Boolean ; virtual ;
public
2008-11-11 12:25:58 +00:00
constructor Create; override ;
2007-11-28 17:40:31 +00:00
destructor Destroy; override ;
procedure Eliminar( const ID : Integer ) ; overload ; virtual ;
function Eliminar( AContacto : IBizContacto) : Boolean ; overload ; virtual ;
2008-02-28 19:56:56 +00:00
function Guardar( AContacto : IBizContacto) : Boolean ; virtual ;
2007-11-28 17:40:31 +00:00
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 ;
2008-07-28 11:58:45 +00:00
// procedure SetID_Tienda (AContacto: IBizContacto; const ID_Tienda: Integer);
2008-04-08 19:12:47 +00:00
function ElegirDireccion( AContacto: IBizContacto; AMensaje: String ) : IBizDireccionesContacto;
2007-11-28 17:40:31 +00:00
end ;
implementation
uses
Dialogs, uEditorRegistryUtils, cxControls, DB, uDAInterfaces, uDataTableUtils,
2008-04-08 19:12:47 +00:00
schContactosClient_Intf, uFactuGES_App, Variants, JSDialogs, JSDialog;
2007-11-28 17:40:31 +00:00
{ 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;
2007-12-27 10:34:42 +00:00
REFERENCIA : = '' ;
2007-11-28 17:40:31 +00:00
end ;
Result . Post;
finally
HideHourglassCursor;
end ;
end ;
constructor TContactosController. Create;
begin
2008-11-11 12:25:58 +00:00
inherited ;
2007-11-28 17:40:31 +00:00
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 ;
2008-04-08 19:12:47 +00:00
function TContactosController. ElegirDireccion( AContacto: IBizContacto; AMensaje: String ) : IBizDireccionesContacto;
var
JsDialog: TJSDialog;
begin
Result : = NIL ;
JsDialog : = TJSDialog. Create( nil ) ;
try
JsDialog. Content. Add( AMensaje) ;
JsDialog. Instruction. Text : = 'Elija una direci' #243 'n...' ;
JsDialog. DialogOptions : = [ doCommandLinks, doModal] ;
JsDialog. ButtonBar. Buttons : = [ cbOk] ;
JsDialog. Width : = 6 0 0 ;
//A<> adimos la direccion principal del contacto
with JsDialog. CustomButtons. Add do
begin
Caption : = AContacto. NOMBRE + ' ' + AContacto. NIF_CIF;
Info. Add( AContacto. CALLE) ;
Info. Add( AContacto. CODIGO_POSTAL + ' ' + AContacto. POBLACION + ' ' + AContacto. PROVINCIA) ;
Value : = - 1 ;
Default : = True ;
end ;
//A<> adimos el resto de direcciones
AContacto. Direcciones. Datatable. First;
while not AContacto. Direcciones. Datatable. eof do
begin
with JsDialog. CustomButtons. Add do
begin
Caption : = AContacto. Direcciones. NOMBRE + ' ' + AContacto. Direcciones. NIF_CIF;
Info. Add( AContacto. Direcciones. CALLE) ;
Info. Add( AContacto. Direcciones. CODIGO_POSTAL + ' ' + AContacto. Direcciones. POBLACION + ' ' + AContacto. Direcciones. PROVINCIA) ;
Value : = AContacto. Direcciones. ID;
end ;
AContacto. Direcciones. DataTable. Next;
end ;
AContacto. Direcciones. DataTable. First;
if JsDialog. Execute < > IDCANCEL then
if JsDialog. CustomButtonResult > 0 then
if AContacto. Direcciones. DataTable. Locate( fld_DireccionesContactoID, JsDialog. CustomButtonResult, [ ] ) then
Result : = AContacto. Direcciones;
finally
2008-07-10 16:03:19 +00:00
FreeAndNIL( JsDialog) ;
2008-04-08 19:12:47 +00:00
end ;
end ;
2007-11-28 17:40:31 +00:00
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) ;
2008-08-05 15:05:15 +00:00
CopyDataTableDA5( AContactos. DataTable, ASeleccionados. DataTable, True ) ;
2007-11-28 17:40:31 +00:00
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 ;
2008-07-28 11:58:45 +00:00
{ procedure TContactosController. SetID_Tienda( AContacto: IBizContacto; const ID_Tienda: Integer ) ;
2008-01-10 17:55:57 +00:00
var
EnEdicion: Boolean ;
begin
if Assigned( AContacto) then
begin
EnEdicion : = AContacto. DataTable. Editing;
if not AContacto. DataTable. Editing then
AContacto. DataTable. Edit;
if ID_Tienda < 0 then
AContacto. DataTable. FieldByName( fld_ContactosID_TIENDA) . AsVariant : = Null
else
AContacto. ID_TIENDA : = ID_Tienda;
AContacto. DataTable. Post;
if EnEdicion then
AContacto. DataTable. Edit;
end ;
2008-07-28 11:58:45 +00:00
end ; }
2008-01-10 17:55:57 +00:00
2007-11-28 17:40:31 +00:00
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 .