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(ADirecciones: IBizDireccionesContacto; 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); end; TClientesController = class(TContactosController, IClientesController) protected FDireccionesController : IDireccionesContactoController; function ValidarContacto(AContacto: IBizContacto): Boolean; override; 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; 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(ADirecciones: IBizDireccionesContacto; 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); end; implementation uses Forms, Classes, Windows, SysUtils, Controls, cxControls, uDialogUtils, uDataModuleClientes, uEditorRegistryUtils, uDataTableUtils, uDADataTable, DB, schContactosClient_Intf, uEtiquetasContactosReportController, uIEditorElegirClientes, uIEditorElegirDireccionEntrega, uEditorGridBase, Dialogs; { TClientesController } function TClientesController.Buscar(const ID: Integer): IBizContacto; begin Result := (FDataModule as IDataModuleClientes).GetItem(ID); FiltrarEmpresa(Result); end; function TClientesController.BuscarTodos: IBizContacto; begin Result := (FDataModule as IDataModuleClientes).GetItems; FiltrarEmpresa(Result); end; function TClientesController.BuscarTodosTiendaWeb: IBizCliente; begin Result := (FDataModule as IDataModuleClientes).GetItemsTiendaWeb; FiltrarEmpresa(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); try with AEditor do begin Contactos := AContactos; Controller := Self; MultiSelect := AMultiSelect; Mensaje := AMensaje; if IsPositiveResult(ShowModal) then Result := ContactosSeleccionados; Release; end; finally AEditor := NIL; end; end; function TClientesController.ElegirDireccionEntrega(ADirecciones: IBizDireccionesContacto; AMensaje: String): IBizDireccionesContacto; var AEditor : IEditorElegirDireccionEntrega; begin Result := NIL; CreateEditor('EditorElegirDireccionEntrega', IEditorElegirDireccionEntrega, AEditor); try with AEditor do begin Direccion := ADirecciones; Mensaje := AMensaje; if IsPositiveResult(ShowModal) then Result := DireccionSeleccionada; Release; end; finally AEditor := NIL; 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 Result := 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; function TClientesController.Nuevo: IBizContacto; var AContacto : IBizCliente; begin AContacto := (FDataModule as IDataModuleClientes).NewItem; FiltrarEmpresa(AContacto); AContacto.DataTable.Active := True; AContacto.Insert; Result := AContacto; end; procedure TClientesController.Preview(ACliente: IBizCliente; AllItems: Boolean); var AReportController : IEtiquetasContactosReportController; ListaID: TStringList; begin AReportController := TEtiquetasContactosReportController.Create; try ListaID := TStringList.Create; //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(IntToStr(ACliente.ID)); Next; end; end; end //Solo previsualizamos el item seleccionado else ListaID.Add(IntToStr(ACliente.ID)); AReportController.Preview(ListaID.CommaText); finally AReportController := NIL; ListaID.Free; end; end; procedure TClientesController.Print(ACliente: IBizCliente; AllItems: Boolean); var AReportController : IEtiquetasContactosReportController; ListaID: TStringList; begin AReportController := TEtiquetasContactosReportController.Create; try ListaID := TStringList.Create; //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(IntToStr(ACliente.ID)); Next; end; end; end //Solo previsualizamos el item seleccionado else ListaID.Add(IntToStr(ACliente.ID)); AReportController.Print(ListaID.CommaText); finally AReportController := NIL; ListaID.Free; end; end; function TClientesController.TieneDatosBancarios( ACliente: IBizCliente): Boolean; begin Result := False; 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 (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ón de e-mail en el campo ''Correo de trabajo''' + #10#13 + #10#13 + 'Por favor, indique una direcció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ón de e-mail en el campo ''Correo de trabajo''' + #10#13 + #10#13 + 'Por favor, indique una dirección o desactive el acceso a la tienda.'); end; end; if Result and (AContacto.Direcciones.RecordCount = 0) then if (ShowConfirmMessage('El cliente no tiene direcciones asociadas', AContacto.NOMBRE + ' no tiene ninguna dirección de envío dada de alta, ' + #10#13 + '¿Desea utilizar el domicilio fiscal para dar de alta una direcció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; AItem : IBizCliente; begin AEditor := NIL; ShowHourglassCursor; try AItem := (FDataModule as IDataModuleClientes).GetItem(AContacto.ID); AItem.DataTable.Active := True; CreateEditor('EditorCliente', IEditorCliente, AEditor); with AEditor do begin Contacto := AItem; Controller := Self; end; finally HideHourglassCursor; end; if Assigned(AEditor) then try AEditor.Show; //AEditor.Release; finally AEditor := NIL; end; end; procedure TClientesController.VerTodos(AContactos: IBizContacto); var AEditor : IEditorClientes; begin CreateEditor('EditorClientes', IEditorClientes, AEditor); with AEditor do begin Contactos := AContactos; Controller := Self; MultiSelect := True; ShowEmbedded; end; end; end.