AbetoDesign_FactuGES2/Source/Modulos/Contactos/Controller/uClientesController.pas
2022-07-07 17:14:25 +00:00

501 lines
14 KiB
ObjectPascal
Raw Blame History

unit uClientesController;
interface
uses
uCustomEditor,
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 Preview(ACliente : IBizCliente; AllItems: Boolean = false);
procedure Print(ACliente : IBizCliente; AllItems: Boolean = false);
procedure SetTieneSubcuenta(ACliente: IBizCliente; AValue: Boolean);
procedure SetIgnorarContabilidad(ACliente: IBizCliente; AValue: Boolean);
function darClienteGraden(const ID: Integer): IBizContacto;
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 Preview(ACliente : IBizCliente; AllItems: Boolean = false);
procedure Print(ACliente : IBizCliente; AllItems: Boolean = false);
procedure SetTieneSubcuenta(ACliente: IBizCliente; AValue: Boolean);
procedure SetIgnorarContabilidad(ACliente: IBizCliente; AValue: Boolean);
function darClienteGraden(const ID: Integer): IBizContacto;
end;
implementation
{$INCLUDE ..\..\..\FactuGES.inc}
uses
Forms, Classes, Windows, SysUtils, Controls, cxControls, uDialogUtils, uDataModuleClientes, uEditorRegistryUtils,
uDataTableUtils, uDADataTable, DB, schContactosClient_Intf, uEtiquetasContactosReportController,
uIEditorElegirClientes, uEditorGridBase, uDAInterfaces, uFactuGES_App, uIEditorElegirDireccionEntrega,
Dialogs, uIntegerListUtils;
{ TClientesController }
function TClientesController.Buscar(const ID: Integer): IBizContacto;
begin
Result := (FDataModule as IDataModuleClientes).GetItem(ID);
FiltrarEmpresa(Result);
{$IFDEF CONTABILIDAD}
FiltrarEjercicio(Result);
{$ENDIF}
end;
function TClientesController.BuscarTodos: IBizContacto;
begin
Result := (FDataModule as IDataModuleClientes).GetItems;
FiltrarEmpresa(Result);
{$IFDEF CONTABILIDAD}
FiltrarEjercicio(Result);
{$ENDIF}
end;
function TClientesController.BuscarTodosTiendaWeb: IBizCliente;
begin
Result := (FDataModule as IDataModuleClientes).GetItemsTiendaWeb;
FiltrarEmpresa(Result);
{$IFDEF CONTABILIDAD}
FiltrarEjercicio(Result);
{$ENDIF}
end;
constructor TClientesController.Create;
begin
inherited;
FDataModule := TDataModuleClientes.Create(Nil);
FDireccionesController := TDireccionesContactoController.Create;
end;
function TClientesController.darClienteGraden(const ID: Integer): IBizContacto;
begin
Result := (FDataModule as IDataModuleClientes).GetItem(ID);
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;
HideHourglassCursor;
except
on E: Exception do
begin
ACliente.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;
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);
{$IFDEF CONTABILIDAD}
FiltrarEjercicio(Result);
{$ENDIF}
AContacto.DataTable.Active := True;
AContacto.Insert;
Result := AContacto;
end;
procedure TClientesController.Preview(ACliente: IBizCliente; AllItems: Boolean);
var
AReportController : IEtiquetasContactosReportController;
ListaID: TIntegerList;
begin
AReportController := TEtiquetasContactosReportController.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.Preview(ListaID);
finally
AReportController := NIL;
FreeANDNIL(ListaID);
end;
end;
procedure TClientesController.Print(ACliente: IBizCliente; AllItems: Boolean);
var
AReportController : IEtiquetasContactosReportController;
ListaID: TIntegerList;
begin
AReportController := TEtiquetasContactosReportController.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.Print(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.