2019-11-18 10:36:42 +00:00
unit uClientesController;
interface
uses
2020-03-03 18:07:32 +00:00
uCustomEditor, Classes,
2019-11-18 10:36:42 +00:00
uContactosController, uBizContactos, uBizDireccionesContacto,
uIEditorClientes, uIEditorCliente, uIDataModuleContactos, uIDataModuleClientes,
uDireccionesContactoController;
type
IClientesController = interface( IContactosController)
[ '{AAC3C51A-37F7-4961-B39F-FBC6B6A2B0F1}' ]
function BuscarTodosTiendaWeb: IBizCliente;
function TieneDatosBancarios( ACliente: IBizCliente) : Boolean ;
function ElegirDireccionEntrega( ACliente: IBizCliente; AMensaje: String ) : IBizDireccionesContacto;
function EsEliminable( ACliente: IBizContacto) : Boolean ;
function Eliminar( ACliente: IBizContacto; AllItems: Boolean = false ) : Boolean ; overload ;
procedure PreviewInformeEtiquetas( ACliente : IBizCliente; AllItems: Boolean = false ) ;
procedure PrintInformeEtiquetas( ACliente : IBizCliente; AllItems: Boolean = false ) ;
procedure PreviewInformeListaDatosContacto( ACliente : IBizCliente; AllItems: Boolean = false ) ;
procedure PrintInformeListaDatosContacto( ACliente : IBizCliente; AllItems: Boolean = false ) ;
procedure SetTieneSubcuenta( ACliente: IBizCliente; AValue: Boolean ) ;
procedure SetIgnorarContabilidad( ACliente: IBizCliente; AValue: Boolean ) ;
2020-03-03 18:07:32 +00:00
function AsignarLOPD( AClientes: IBizCliente) : TStringList;
2019-11-18 10:36:42 +00:00
end ;
TClientesController = class( TContactosController, IClientesController)
protected
FDireccionesController : IDireccionesContactoController;
function ValidarContacto( AContacto: IBizContacto) : Boolean ; override ;
procedure FiltrarEjercicio( AContacto : IBizContacto) ; virtual ;
public
constructor Create; override ;
destructor Destroy; override ;
function Duplicar( AContacto: IBizContacto) : IBizContacto; override ;
function Buscar( const ID: Integer ) : IBizContacto; override ;
function BuscarTodos: IBizContacto; override ;
function BuscarTodosTiendaWeb: IBizCliente;
function Nuevo : IBizContacto; override ;
function Guardar( AContacto : IBizContacto) : Boolean ; override ;
procedure Ver( AContacto : IBizContacto) ; override ;
procedure VerTodos( AContactos: IBizContacto) ; override ;
function ElegirContacto( AContactos : IBizContacto;
AMensaje: String ; AMultiSelect: Boolean ) : IBizContacto; override ;
function TieneDatosBancarios( ACliente: IBizCliente) : Boolean ;
function ElegirDireccionEntrega( ACliente: IBizCliente; AMensaje: String ) : IBizDireccionesContacto;
function EsEliminable( ACliente: IBizContacto) : Boolean ;
function Eliminar( ACliente: IBizContacto; AllItems: Boolean = false ) : Boolean ; overload ;
procedure PreviewInformeEtiquetas( ACliente : IBizCliente; AllItems: Boolean = false ) ;
procedure PrintInformeEtiquetas( ACliente : IBizCliente; AllItems: Boolean = false ) ;
procedure PreviewInformeListaDatosContacto( ACliente : IBizCliente; AllItems: Boolean = false ) ;
procedure PrintInformeListaDatosContacto( ACliente : IBizCliente; AllItems: Boolean = false ) ;
procedure SetTieneSubcuenta( ACliente: IBizCliente; AValue: Boolean ) ;
procedure SetIgnorarContabilidad( ACliente: IBizCliente; AValue: Boolean ) ;
2020-03-03 18:07:32 +00:00
function AsignarLOPD( AClientes: IBizCliente) : TStringList;
2019-11-18 10:36:42 +00:00
end ;
implementation
uses
2020-03-03 18:07:32 +00:00
Forms, Windows, SysUtils, Controls, cxControls, uDialogUtils, uDataModuleClientes, uEditorRegistryUtils,
2019-11-18 10:36:42 +00:00
uDataTableUtils, uDADataTable, DB, schContactosClient_Intf, uListadosContactosReportController,
uIEditorElegirClientes, uEditorGridBase, uDAInterfaces, uFactuGES_App, uIEditorElegirDireccionEntrega,
Dialogs, uIntegerListUtils;
{ TClientesController }
2020-03-03 18:07:32 +00:00
function TClientesController. AsignarLOPD( AClientes: IBizCliente) : TStringList;
//Devolver<65> la lista de clientes que no han podido ser cambiados a LOPD firmada
begin
Result : = TStringList. Create;
if Assigned( AClientes) then
begin
with AClientes. DataTable do
begin
First;
while not EOF do
begin
if ( AClientes. LOPD < > 1 ) then
begin
Edit;
AClientes. LOPD : = 1 ;
Post;
end ;
Next;
end ;
ApplyUpdates;
end ;
end ;
end ;
2019-11-18 10:36:42 +00:00
function TClientesController. Buscar( const ID: Integer ) : IBizContacto;
begin
Result : = ( FDataModule as IDataModuleClientes) . GetItem( ID) ;
FiltrarEmpresa( Result ) ;
FiltrarEjercicio( Result ) ;
end ;
function TClientesController. BuscarTodos: IBizContacto;
begin
Result : = ( FDataModule as IDataModuleClientes) . GetItems;
FiltrarEmpresa( Result ) ;
FiltrarEjercicio( Result ) ;
end ;
function TClientesController. BuscarTodosTiendaWeb: IBizCliente;
begin
Result : = ( FDataModule as IDataModuleClientes) . GetItemsTiendaWeb;
FiltrarEmpresa( Result ) ;
FiltrarEjercicio( Result ) ;
end ;
constructor TClientesController. Create;
begin
inherited ;
FDataModule : = TDataModuleClientes. Create( Nil ) ;
FDireccionesController : = TDireccionesContactoController. Create;
end ;
destructor TClientesController. Destroy;
begin
FDireccionesController : = NIL ;
inherited ;
end ;
function TClientesController. Duplicar( AContacto: IBizContacto) : IBizContacto;
begin
Result : = inherited Duplicar( AContacto) ;
if Assigned( ( Result as IBizCliente) . Descuentos) then
DuplicarRegistros( ( AContacto as IBizCliente) . Descuentos. DataTable, ( Result as IBizCliente) . Descuentos. DataTable, mdrTodos) ;
end ;
function TClientesController. ElegirContacto( AContactos : IBizContacto;
AMensaje: String ; AMultiSelect: Boolean ) : IBizContacto;
var
AEditor : IEditorElegirClientes;
begin
Result : = NIL ;
CreateEditor( 'EditorElegirClientes' , IEditorElegirClientes, AEditor) ;
if Assigned( AEditor) then
try
AEditor. Contactos : = AContactos;
AEditor. Controller : = Self;
AEditor. MultiSelect : = AMultiSelect;
AEditor. Mensaje : = AMensaje;
if IsPositiveResult( AEditor. ShowModal) then
Result : = AEditor. ContactosSeleccionados;
finally
AEditor. Release;
AEditor : = NIL ;
end ;
end ;
function TClientesController. ElegirDireccionEntrega( ACliente: IBizCliente;
AMensaje: String ) : IBizDireccionesContacto;
var
AEditor : IEditorElegirDireccionEntrega;
begin
Result : = NIL ;
CreateEditor( 'EditorElegirDireccionEntrega' , IEditorElegirDireccionEntrega, AEditor) ;
if Assigned( AEditor) then
begin
try
AEditor. Contacto : = ACliente;
AEditor. Mensaje : = AMensaje;
if IsPositiveResult( AEditor. ShowModal) then
Result : = AEditor. DireccionSeleccionada;
finally
AEditor. Release;
AEditor : = NIL ;
Application. ProcessMessages;
end ;
end ;
end ;
function TClientesController. Eliminar( ACliente: IBizContacto; AllItems: Boolean ) : Boolean ;
//En el caso de eliminar almenos un elemento del conjunto se devuelve true
var
bEliminado: Boolean ;
begin
bEliminado : = False ;
if not Assigned( ACliente) then
raise Exception. Create ( 'Contacto no asignado' ) ;
ShowHourglassCursor;
try
if not ACliente. DataTable. Active then
ACliente. DataTable. Active : = True ;
if ( ACliente. State in dsEditModes) then
ACliente. Cancel;
//Siempre eliminaremos el seleccionado
if EsEliminable( ACliente) then
begin
ACliente. Delete;
bEliminado : = True ;
end ;
//En el caso de querer eliminar todos los items del objeto ACliente
if AllItems then
begin
with ACliente. DataTable do
begin
First;
while not EOF do
begin
if EsEliminable( ACliente) then
begin
ACliente. Delete;
bEliminado : = True
end
else Next;
end ;
end ;
end ;
if bEliminado then
begin
ACliente. DataTable. ApplyUpdates;
Result : = True ;
end
else
Result : = False ;
finally
HideHourglassCursor;
end ;
end ;
function TClientesController. EsEliminable( ACliente: IBizContacto) : Boolean ;
begin
if not Assigned( ACliente) then
raise Exception. Create ( 'Contacto no asignado: EsEliminable' ) ;
Result : = True ;
end ;
procedure TClientesController. FiltrarEjercicio( AContacto: IBizContacto) ;
var
Condicion: TDAWhereExpression;
begin
if Assigned( AContacto)
and Assigned( ( AContacto as IBizCliente) . SubCuentas) then
begin
if ( AContacto as IBizCliente) . SubCuentas. DataTable. Active then
( AContacto as IBizCliente) . SubCuentas. DataTable. Active : = False ;
// Filtrar los presupuestos actuales por empresa
with ( AContacto as IBizCliente) . SubCuentas. DataTable. DynamicWhere do
begin
// (ID_EMPRESA >= ID)
Condicion : = NewBinaryExpression( NewField( '' , fld_SubCuentasContactoID_EJERCICIO) , NewConstant( AppFactuGES. EjercicioActivo. ID, datInteger) , dboEqual) ;
if IsEmpty then
Expression : = Condicion
else
Expression : = NewBinaryExpression( Expression, Condicion, dboAnd) ;
end ;
end ;
end ;
function TClientesController. Guardar( AContacto: IBizContacto) : Boolean ;
begin
Result : = inherited Guardar( AContacto) ;
( AContacto as IBizCliente) . SubCuentas. DataTable. Refresh;
end ;
function TClientesController. Nuevo: IBizContacto;
var
AContacto : IBizCliente;
begin
AContacto : = ( FDataModule as IDataModuleClientes) . NewItem;
FiltrarEmpresa( AContacto) ;
FiltrarEjercicio( Result ) ;
AContacto. DataTable. Active : = True ;
AContacto. Insert;
Result : = AContacto;
end ;
procedure TClientesController. PreviewInformeEtiquetas( ACliente: IBizCliente; AllItems: Boolean ) ;
var
AReportController : IListadosContactosReportController;
ListaID: TIntegerList;
begin
AReportController : = TListadosContactosReportController. Create;
ListaID : = TIntegerList. Create;
try
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with ACliente. DataTable do
begin
First;
while not EOF do
begin
ListaID. Add( ACliente. ID) ;
Next;
end ;
end ;
end
//Solo previsualizamos el item seleccionado
else
ListaID. Add( ACliente. ID) ;
AReportController. PreviewInformeEtiquetas( ListaID) ;
finally
AReportController : = NIL ;
FreeANDNIL( ListaID) ;
end ;
end ;
procedure TClientesController. PreviewInformeListaDatosContacto(
ACliente: IBizCliente; AllItems: Boolean ) ;
var
AReportController : IListadosContactosReportController;
ListaID: TIntegerList;
begin
AReportController : = TListadosContactosReportController. Create;
ListaID : = TIntegerList. Create;
try
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with ACliente. DataTable do
begin
First;
while not EOF do
begin
ListaID. Add( ACliente. ID) ;
Next;
end ;
end ;
end
//Solo previsualizamos el item seleccionado
else
ListaID. Add( ACliente. ID) ;
AReportController. PreviewInformeListaDatosContacto( ListaID) ;
finally
AReportController : = NIL ;
FreeANDNIL( ListaID) ;
end ;
end ;
procedure TClientesController. PrintInformeEtiquetas( ACliente: IBizCliente; AllItems: Boolean ) ;
var
AReportController : IListadosContactosReportController;
ListaID: TIntegerList;
begin
AReportController : = TListadosContactosReportController. Create;
ListaID : = TIntegerList. Create;
try
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with ACliente. DataTable do
begin
First;
while not EOF do
begin
ListaID. Add( ACliente. ID) ;
Next;
end ;
end ;
end
//Solo previsualizamos el item seleccionado
else
ListaID. Add( ACliente. ID) ;
AReportController. PrintInformeEtiquetas( ListaID) ;
finally
AReportController : = NIL ;
FreeANDNil( ListaID) ;
end ;
end ;
procedure TClientesController. PrintInformeListaDatosContacto(
ACliente: IBizCliente; AllItems: Boolean ) ;
var
AReportController : IListadosContactosReportController;
ListaID: TIntegerList;
begin
AReportController : = TListadosContactosReportController. Create;
ListaID : = TIntegerList. Create;
try
//Si deseamos previsualizar todos los items del objeto albaran
if AllItems then
begin
with ACliente. DataTable do
begin
First;
while not EOF do
begin
ListaID. Add( ACliente. ID) ;
Next;
end ;
end ;
end
//Solo previsualizamos el item seleccionado
else
ListaID. Add( ACliente. ID) ;
AReportController. PrintInformeListaDatosContacto( ListaID) ;
finally
AReportController : = NIL ;
FreeANDNil( ListaID) ;
end ;
end ;
procedure TClientesController. SetIgnorarContabilidad( ACliente: IBizCliente; AValue: Boolean ) ;
var
AEdit: Boolean ;
begin
with ACliente. DataTable do
begin
AEdit : = Editing;
if not AEdit then
Edit;
if AValue then
ACliente. IGNORAR_CONTABILIDAD : = 1
else
ACliente. IGNORAR_CONTABILIDAD : = 0 ;
Post;
if AEdit then
Edit;
end ;
end ;
procedure TClientesController. SetTieneSubcuenta( ACliente: IBizCliente; AValue: Boolean ) ;
var
AEdit: Boolean ;
begin
with ACliente. DataTable do
begin
AEdit : = Editing;
if not AEdit then
Edit;
if AValue then
ACliente. TIENE_SUBCUENTA : = 1
else
ACliente. TIENE_SUBCUENTA : = 0 ;
Post;
if AEdit then
Edit;
end ;
end ;
function TClientesController. TieneDatosBancarios( ACliente: IBizCliente) : Boolean ;
begin
if not Assigned( ACliente) then
raise Exception. Create ( 'Cliente no asignado (TieneDatosBancarios)' ) ;
if ACliente. DataTable. Active then
ACliente. DataTable. Active : = True ;
with ACliente. DatosBancarios do
begin
Result : = ( DataTable. RecordCount > 0 ) and
(
( Length( ENTIDAD) > 0 ) and
( Length( SUCURSAL) > 0 ) and
( Length( DC) > 0 ) and
( Length( CUENTA) > 0 )
) ;
end ;
end ;
function TClientesController. ValidarContacto( AContacto: IBizContacto) : Boolean ;
begin
Result : = inherited ValidarContacto( AContacto) ;
if Result then
begin
with ( AContacto as IBizCliente) do
begin
if ( SubCuentas. DataTable. State in dsEditModes) then
SubCuentas. DataTable. Post;
if ( BLOQUEADO = 0 ) then
begin
Edit;
MOTIVO_BLOQUEO : = '' ;
Post;
end ;
if ( TIENDA_WEB = 1 ) and ( Length( EMAIL_1) = 0 ) then
begin
{ ShowWarningMessage( 'Acceso a la tienda web' ,
'Para que el cliente pueda tener acceso a la tienda web es necesario indicar una direcci<63> n de e-mail en el campo ' 'Correo de trabajo' '' +
#10 #13 + #10 #13 +
'Por favor, indique una direcci<63> n o desactive el acceso a la tienda.' ) ;
Result : = False ; }
raise Exception. Create( 'Para que el cliente pueda tener acceso a la tienda web es necesario indicar una direcci<63> n de e-mail en el campo ' 'Correo de trabajo' '' +
#10 #13 + #10 #13 +
'Por favor, indique una direcci<63> n o desactive el acceso a la tienda.' ) ;
end ;
end ;
{
// Por ahora no existe el concepto de direcciones de entrega asi que esto est<73> desactivado
if Result and ( AContacto. Direcciones. RecordCount = 0 ) then
if ( ShowConfirmMessage( 'El cliente no tiene direcciones asociadas' ,
AContacto. NOMBRE + ' no tiene ninguna direcci<63> n de env<6E> o dada de alta, ' + #10 #13 +
'<27> Desea utilizar el domicilio fiscal para dar de alta una direcci<63> n de entrega?' ) = IDYES) then
begin
FDireccionesController. CopiarDireccionFiscal( AContacto, AContacto. Direcciones) ;
FDireccionesController. Ver( AContacto. Direcciones) ;
end ; }
end ;
end ;
procedure TClientesController. Ver( AContacto: IBizContacto) ;
var
AEditor : IEditorCliente;
begin
AEditor : = NIL ;
CreateEditor( 'EditorCliente' , IEditorCliente, AEditor) ;
if Assigned( AEditor) then
try
AEditor. Contacto : = AContacto;
AEditor. Controller : = Self;
AEditor. ShowModal;
finally
AEditor. Release;
AEditor : = NIL ;
end ;
end ;
procedure TClientesController. VerTodos( AContactos: IBizContacto) ;
var
AEditor : IEditorClientes;
begin
AEditor : = NIL ;
CreateEditor( 'EditorClientes' , IEditorClientes, AEditor) ;
if Assigned( AEditor) then
with AEditor do
begin
Contactos : = AContactos;
Controller : = Self;
MultiSelect : = True ;
ShowEmbedded;
end ;
end ;
end .