unit uContratosClienteController; interface uses Classes, uROTypes, SysUtils, uDADataTable, uEditorDBItem, uControllerBase, uIDataModuleContratosCliente, uClientesController, uDetallesContratoClienteController, uGestorDocumentosController, uBizContratosCliente, uBizDireccionesContacto, uBizDetallesContratoCliente, uIntegerListUtils, uBizPresupuestosCliente; type TEnumTiposContrato = (teVacio, teCocina, teArmario, teBano, teElectrodomestico, teVarios); IContratosClienteController = interface(IControllerBase) ['{D6544299-A233-4FF0-BDA4-328DA06DCFD8}'] function GetClienteController: IClientesController; procedure SetClienteController(const Value: IClientesController); property ClienteController: IClientesController read GetClienteController write SetClienteController; function GetDetallesController: IDetallesContratoClienteController; procedure SetDetallesController(const Value: IDetallesContratoClienteController); property DetallesController: IDetallesContratoClienteController read GetDetallesController write SetDetallesController; //GESTION_DOCUMENTOS function GetGestorDocumentosController: IGestorDocumentosController; procedure SetGestorDocumentosController(const Value: IGestorDocumentosController); property GestorDocumentosController: IGestorDocumentosController read GetGestorDocumentosController write SetGestorDocumentosController; procedure RecuperarCliente(AContrato : IBizContratoCliente); procedure ActualizarFormaDePago(AContrato : IBizContratoCliente; ID_FORMA_PAGO: Integer); function Buscar(const ID: Integer): IBizContratoCliente; overload; function Buscar(const ListaID: TIntegerList): IBizContratoCliente; overload; function BuscarTodos: IBizContratoCliente; overload; function BuscarTodos(const ID_Cliente: Integer): IBizContratoCliente; overload; procedure Ver(AContrato : IBizContratoCliente); procedure VerTodos(AContratos: IBizContratoCliente; const AVerModal : Boolean = False; const AWindowCaption: String = ''; const AHeaderText: String = ''); function Nuevo (WithInsert: Boolean = True): IBizContratoCliente; function Anadir(AContrato : IBizContratoCliente; const ATipo: TEnumTiposContrato = teVarios) : Boolean; overload; function Anadir(AContratos : IBizContratoCliente; AListaPresupuestos : IBizPresupuestoCliente): Boolean; overload; function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AContrato : IBizContratoCliente; AllItems: Boolean = false): Boolean; overload; function Guardar(AContrato : IBizContratoCliente): Boolean; procedure DescartarCambios(AContrato : IBizContratoCliente); function Existe(const ID: Integer) : Boolean; function Duplicar(AContrato: IBizContratoCliente): IBizContratoCliente; function Localizar(AContratos: IBizContratoCliente; const ID : Integer): Boolean; function ExtraerSeleccionados(AContrato: IBizContratoCliente) : IBizContratoCliente; function ElegirContratos(AContrato: IBizContratoCliente; AMensaje: String; AMultiSelect: Boolean): IBizContratoCliente; procedure RecalcularImportes(AContrato : IBizContratoCliente); function EsModificable(AContrato : IBizContratoCliente): Boolean; function EsEliminable(AContrato : IBizContratoCliente): Boolean; procedure Preview(AContrato : IBizContratoCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); procedure Print(AContrato : IBizContratoCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); procedure EnviarContratoPorEMail(AContrato : IBizContratoCliente); function CambiarSituacion(AContrato : IBizContratoCliente; Situacion: String; FechaDecision: TDateTime; AllItems: Boolean = false): Boolean; function DarListaAnosContratos: TStringList; procedure FiltrarAno(AContrato: IBizContratoCliente; ADynWhereDataTable: WideString; const Ano: String); procedure VerListadoBeneficios; procedure VerDireccionEntrega(AContrato : IBizContratoCliente); end; TContratosClienteController = class(TControllerBase, IContratosClienteController) protected FDataModule : IDataModuleContratosCliente; FClienteController : IClientesController; FDetallesController : IDetallesContratoClienteController; FGestorDocumentosController : IGestorDocumentosController; function GetClienteController: IClientesController; procedure SetClienteController(const Value: IClientesController); function GetDetallesController: IDetallesContratoClienteController; procedure SetDetallesController(const Value: IDetallesContratoClienteController); //GESTION_DOCUMENTOS function GetGestorDocumentosController: IGestorDocumentosController; procedure SetGestorDocumentosController(const Value: IGestorDocumentosController); //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de //este controller procedure AsignarDataModule; virtual; procedure RecuperarObjetos(AContrato: IBizContratoCliente); virtual; procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override; function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean; procedure FiltrarEmpresa(AContrato: IBizContratoCliente); function _Vacio : IBizContratoCliente; function ValidarContrato(AContrato: IBizContratoCliente): Boolean; procedure RellenarValoresDefecto(AContrato: IBizContratoCliente; ATipo: TEnumTiposContrato); public property ClienteController: IClientesController read GetClienteController write SetClienteController; property DetallesController: IDetallesContratoClienteController read GetDetallesController write SetDetallesController; property GestorDocumentosController: IGestorDocumentosController read GetGestorDocumentosController write SetGestorDocumentosController; constructor Create; override; destructor Destroy; override; function Localizar(AContratos: IBizContratoCliente; const ID : Integer): Boolean; procedure RecuperarCliente(AContrato : IBizContratoCliente); procedure ActualizarFormaDePago(AContrato : IBizContratoCliente; ID_FORMA_PAGO: Integer); function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AContrato : IBizContratoCliente; AllItems: Boolean = false): Boolean; overload; function Guardar(AContrato : IBizContratoCliente): Boolean; procedure DescartarCambios(AContrato : IBizContratoCliente); virtual; function Existe(const ID: Integer) : Boolean; virtual; function Anadir(AContrato : IBizContratoCliente; const ATipo: TEnumTiposContrato = teVarios) : Boolean; overload; function Anadir(AContratos : IBizContratoCliente; AListaPresupuestos : IBizPresupuestoCliente): Boolean; overload; function Buscar(const ListaID: TIntegerList): IBizContratoCliente; overload; function Buscar(const ID: Integer): IBizContratoCliente; overload; function BuscarTodos: IBizContratoCliente; overload; function BuscarTodos(const ID_Cliente: Integer): IBizContratoCliente; overload; function Nuevo (WithInsert: Boolean = True): IBizContratoCliente; procedure Ver(AContrato : IBizContratoCliente); procedure VerTodos(AContratos: IBizContratoCliente; const AVerModal : Boolean = False; const AWindowCaption: String = ''; const AHeaderText: String = ''); function Duplicar(AContrato: IBizContratoCliente): IBizContratoCliente; function ExtraerSeleccionados(AContrato: IBizContratoCliente) : IBizContratoCliente; function ElegirContratos(AContrato: IBizContratoCliente; AMensaje: String; AMultiSelect: Boolean): IBizContratoCliente; procedure RecalcularImportes(AContrato : IBizContratoCliente); function EsModificable(AContrato : IBizContratoCliente): Boolean; function EsEliminable(AContrato : IBizContratoCliente): Boolean; procedure Preview(AContrato : IBizContratoCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); procedure Print(AContrato : IBizContratoCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); procedure EnviarContratoPorEMail(AContrato : IBizContratoCliente); function CambiarSituacion(AContrato : IBizContratoCliente; Situacion: String; FechaDecision: TDateTime; AllItems: Boolean = false): Boolean; function DarListaAnosContratos: TStringList; procedure FiltrarAno(AContrato: IBizContratoCliente; ADynWhereDataTable: WideString; const Ano: String); procedure VerListadoBeneficios; procedure VerDireccionEntrega(AContrato : IBizContratoCliente); end; implementation uses Forms, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils, uIEditorContratosCliente, uDataModuleContratosCliente, Variants, uBizContactos, uDataTableUtils, uDataModuleUsuarios, uFactuGES_App, schContratosClienteClient_Intf, uDAInterfaces, uDateUtils, uIEditorContratoCliente, uIEditorElegirContratosCliente, uIEditorDireccionEntregaContratoCliente, schContactosClient_Intf, uContratosClienteReportController, uFormasPagoController, uBizFormasPago, uTiposIVAController, uBizTiposIVA, uSistemaFunc, uEMailUtils, uDialogElegirEMail, Dialogs, uStringsUtils, uIEditorContratosClienteBeneficios, uPresupuestosClienteController, uConfiguracionController, uBizDetallesPresupuestoCliente, schPresupuestosClienteClient_Intf, uControllerDetallesBase; { TContratosClienteController } procedure CopiarArticulosPresupuesto(AOrigen: IBizDetallesPresupuestoCliente; ADestino: IBizDetallesContratoCliente); var i : integer; ADetallesController : IDetallesContratoClienteController; begin if not Assigned(AOrigen) then raise Exception.Create ('Origen no asignado (CopiarArticulosAlbaran)'); if not Assigned(ADestino) then raise Exception.Create ('Destino no asignado (CopiarArticulosAlbaran)'); if not AOrigen.DataTable.Active then AOrigen.DataTable.Active := True; if not ADestino.DataTable.Active then ADestino.DataTable.Active := True; ADetallesController := TDetallesContratoClienteController.Create; try //OJO IMPORTANTE //Siempre que vayamos a trabajar con los detalles debemos hacer un beginupdate de los mismos y un endupdate para //obligarle siempre a recalcular los detalles una sola vez ADetallesController.BeginUpdate(ADestino); AOrigen.DataTable.First; for i := 0 to AOrigen.DataTable.RecordCount - 1 do begin ADetallesController.Add(ADestino, AOrigen.TIPO_DETALLE); ADestino.Edit; ADestino.ID_ARTICULO := AOrigen.ID_ARTICULO; ADestino.TIPO_ARTICULO := AOrigen.TIPO_ARTICULO; ADestino.PROPIEDAD := AOrigen.PROPIEDAD; ADestino.CONCEPTO := AOrigen.CONCEPTO; ADestino.CANTIDAD := AOrigen.CANTIDAD; ADestino.IMPORTE_UNIDAD := AOrigen.IMPORTE_UNIDAD; ADestino.IMPORTE_TOTAL := AOrigen.IMPORTE_TOTAL; ADestino.DESCUENTO := AOrigen.DESCUENTO; ADestino.IMPORTE_PORTE := AOrigen.IMPORTE_PORTE; ADestino.VISIBLE := AOrigen.VISIBLE; ADestino.VALORADO := AOrigen.VALORADO; ADestino.Post; AOrigen.Next; end; finally ADetallesController.EndUpdate(ADestino); ADestino.DataTable.Last; ADetallesController := NIL; end; end; procedure TContratosClienteController.ActualizarFormaDePago( AContrato: IBizContratoCliente; ID_FORMA_PAGO: Integer); var AFormasPago : IBizFormaPago; AFormasPagoController : IFormasPagoController; ATiposIVA : IBizTipoIVA; ATiposIVAController : ITiposIVAController; bEnEdicion : Boolean; begin AFormasPagoController := TFormasPagoController.Create; AFormasPago := AFormasPagoController.Buscar(ID_FORMA_PAGO); AFormasPago.Open; //Se cambia tambien el tipo de IVA por el de la ficha a peticion de Angelica ATiposIVAController := TTiposIVAController.Create; ATiposIVA := ATiposIVAController.Buscar(AContrato.Cliente.ID_TIPO_IVA); ATiposIVA.Open; bEnEdicion := (AContrato.DataTable.State in dsEditModes); if not bEnEdicion then AContrato.Edit; AContrato.ID_FORMA_PAGO := AFormasPago.ID; AContrato.DataTable.FieldByName(fld_ContratosClienteFORMA_PAGO).AsString := AFormasPago.DESCRIPCION; AContrato.ID_TIPO_IVA := ATiposIva.ID; if not bEnEdicion then AContrato.Post; AFormasPago := NIL; AFormasPagoController := NIL; ATiposIVA := NIL; ATiposIVAController := NIL; end; function TContratosClienteController.Anadir(AContrato : IBizContratoCliente; const ATipo: TEnumTiposContrato = teVarios) : Boolean; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (Anadir)'); AContrato.Insert; if not (ATipo = teVacio) then RellenarValoresDefecto(AContrato, ATipo); Result := True; end; { procedure TContratosClienteController.SincronizarDocumentos(const ID: Integer; FListaDocumentos: TStringList; Directorio: String); var ListaDocumentosServidor: TStringList; ANombreFichero: String; AFichero: Binary; i, j: Integer; begin //Eliminamos todos los documentos del servidor que ya no existan en el cliente. ListaDocumentosServidor := DarListaDocumentos(ID); for i:= 0 to ListaDocumentosServidor.Count - 1 do if not FListaDocumentos.Find(ListaDocumentosServidor.Strings[i], j) then if not FDataModule.EliminarFichero(ID, ListaDocumentosServidor.Strings[i]) then showmessage('Error al borrar fichero' + ListaDocumentosServidor.Strings[i]); //Subimos todos los ficheros que halla al servidor (de momento no se miran fechas) for i := 0 to FListaDocumentos.Count - 1 do begin ANombreFichero := Directorio + FListaDocumentos.Strings[i]; if FileExists(ANombreFichero) then begin AFichero := Binary.Create; AFichero.LoadFromFile(ANombreFichero); SubirFichero(ID, ExtractFileName(ANombreFichero), AFichero); end; end; end; } function TContratosClienteController.Anadir(AContratos: IBizContratoCliente; AListaPresupuestos: IBizPresupuestoCliente): Boolean; var AContratoActual : IBizContratoCliente; APresupuestosController : IPresupuestosClienteController; ACadena: String; I, x: Integer; bEnEdicion : Boolean; begin Result := False; // ATENCIÓN!!! AContratos tiene que estar vacio para no pisar contratos // ya generados. if not Assigned(AContratos) then raise Exception.Create ('Contrato no asignado (Anadir)'); if not Assigned(AListaPresupuestos) then raise Exception.Create ('Presupeustos no asignados (Anadir)'); if not AContratos.DataTable.Active then AContratos.DataTable.Active := True; if not AListaPresupuestos.DataTable.Active then AListaPresupuestos.DataTable.Active := True; ShowHourglassCursor; Application.ProcessMessages; APresupuestosController := TPresupuestosClienteController.Create; try // Ordenar por fecha de presupuesto AListaPresupuestos.DataTable.Sort([fld_PresupuestosClienteFECHA_DECISION], [uDADataTable.sdAscending]); AListaPresupuestos.First; for I := 0 to AListaPresupuestos.DataTable.RecordCount - 1 do begin AListaPresupuestos._Cliente := NIL; AContratoActual := NIL; // Busco si hay algun contrato ya hecho de ese Cliente AContratos.DataTable.First; if AContratos.DataTable.Locate(fld_PresupuestosClienteID_CLIENTE, AListaPresupuestos.ID_Cliente, []) then begin AContratoActual := AContratos; RecuperarCliente(AContratoActual); AContratoActual.Cliente.DataTable.Active := True; end else begin // No hay contrato de ese cliente. Creo uno nuevo Anadir(AContratos, teVacio); APresupuestosController.RecuperarCliente(AListaPresupuestos); AListaPresupuestos.Cliente.DataTable.Active := True; AContratos.Cliente := AListaPresupuestos.Cliente; //Establecemos la forma de pago establecido en la ficha del cliente if AContratos.Cliente.ID_FORMA_PAGO > 0 then begin bEnEdicion := (AContratos.DataTable.State in dsEditModes); if not bEnEdicion then AContratos.Edit; AContratos.ID_FORMA_PAGO := AContratos.Cliente.ID_FORMA_PAGO; // if AFacturas.Cliente.ID_TIPO_IVA > 0 then // AFacturas.ID_TIPO_IVA := AFacturas.Cliente.ID_TIPO_IVA; AContratos.Post; if bEnEdicion then AContratos.Edit; end; //En este caso no queremos el descuento general del cliente asociado a su ficha, ya que partimos del valor que tengan los presupuestos bEnEdicion := (AContratos.DataTable.State in dsEditModes); if not bEnEdicion then AContratos.Edit; AContratos.DESCUENTOIsNull := True; AContratos.Post; if bEnEdicion then AContratos.Edit; AContratoActual := AContratos; end; // Ya tengo el contrato. Le añado los conceptos del presupuesto AContratoActual.Detalles.DataTable.Sort([fld_PresupuestosCliente_DetallesPOSICION], [uDADataTable.sdAscending]); AContratoActual.Detalles.DataTable.Last; //Es de tipo TITULO para que salga en el informe ya que se agrupa por capitulos Self.DetallesController.Add(AContratoActual.Detalles, TIPO_DETALLE_TITULO); with AContratoActual.Detalles do begin ACadena := ''; ACadena := 'Presupuesto ' + AListaPresupuestos.REFERENCIA + ' con fecha ' + DateToStr(AListaPresupuestos.FECHA_PRESUPUESTO) +' aceptado el ' + DateToStr(AListaPresupuestos.FECHA_DECISION); ACadena := ACadena + #13 + ' referencia: ' + AListaPresupuestos.REFERENCIA_CLIENTE; Edit; CONCEPTO := ACadena; Post; end; // Añado el contenido del presupuesto CopiarArticulosPresupuesto(AListaPresupuestos.Detalles, AContratoActual.Detalles); //MUCHO CUIDADO NOS TENEMOS QUE ASEGURAR DE AÑADIR AL FINAL DEL TODO, podría calcular mal los descuentos de capitulo del presupuesto si los hubiera AContratoActual.Detalles.DataTable.Sort([fld_PresupuestosCliente_DetallesPOSICION], [uDADataTable.sdAscending]); AContratoActual.Detalles.DataTable.Last; //Sacamos el descuento total del presupuesto en el caso de tener if (AListaPresupuestos.IMPORTE_DESCUENTO > 0) then begin Self.DetallesController.Add(AContratoActual.Detalles, TIPO_DETALLE_TITULO); with AContratoActual.Detalles do begin ACadena := ''; ACadena := 'Descuento presupuesto ' + AListaPresupuestos.REFERENCIA + ' con fecha ' + DateToStr(AListaPresupuestos.FECHA_PRESUPUESTO); Edit; CONCEPTO := ACadena; Post; end; Self.DetallesController.Add(AContratoActual.Detalles, TIPO_DETALLE_CONCEPTO); with AContratoActual.Detalles do begin Edit; CONCEPTO := 'Descuento del presupuesto ' + AListaPresupuestos.REFERENCIA + ' - ' + AListaPresupuestos.DataTable.FieldByName(fld_PresupuestosClienteDESCUENTO).AsString + '%'; CANTIDAD := -1; IMPORTE_UNIDAD := AListaPresupuestos.IMPORTE_DESCUENTO; Post; end; Self.DetallesController.Add(AContratoActual.Detalles, TIPO_DETALLE_SUBTOTAL); with AContratoActual.Detalles do begin ACadena := ''; ACadena := 'Total Descuento presupuesto ' + AListaPresupuestos.REFERENCIA + ' con fecha ' + DateToStr(AListaPresupuestos.FECHA_PRESUPUESTO); Edit; CONCEPTO := ACadena; Post; end; end; // Añado el resumen { Self.DetallesController.Add(AContratoActual.Detalles, TIPO_DETALLE_SUBTOTAL); with AContratoActual.Detalles do begin Edit; CONCEPTO := 'Total del presupuesto ' + AListapresupuestos.REFERENCIA; Post; end; } // Añado una línea en blanco Self.DetallesController.Add(AContratoActual.Detalles, TIPO_DETALLE_CONCEPTO); with AContratoActual.Detalles do begin Edit; CONCEPTO := ''; Post; end; // Guardo el conrato que acabo de generar o editar AContratoActual.CalcularImporteTotal; Self.Guardar(AContratoActual); // Asocio el contrato con el presupuesto AListaPresupuestos.Edit; AListaPresupuestos.ID_CONTRATO := AContratoActual.ID; AListaPresupuestos.Post; APresupuestosController.Guardar(AListaPresupuestos); AListaPresupuestos.Next; end; Result := True; finally APresupuestosController := NIL; HideHourglassCursor end; end; procedure TContratosClienteController.AsignarDataModule; begin FDataModule := TDataModuleContratosCliente.Create(Nil); end; function TContratosClienteController.Buscar(const ID: Integer): IBizContratoCliente; begin Result := FDataModule.GetItem(ID); FiltrarEmpresa(Result); end; function TContratosClienteController.BuscarTodos: IBizContratoCliente; begin Result := FDataModule.GetItems; FiltrarEmpresa(Result); end; function TContratosClienteController.Buscar( const ListaID: TIntegerList): IBizContratoCliente; begin Result := FDataModule.GetItems(ListaID); FiltrarEmpresa(Result); end; function TContratosClienteController.BuscarTodos( const ID_Cliente: Integer): IBizContratoCliente; var Condicion: TDAWhereExpression; begin ShowHourglassCursor; try Result := BuscarTodos; with Result.DataTable.DynamicWhere do begin // ID_CLIENTE Condicion := NewBinaryExpression(NewField('', fld_ContratosClienteID_CLIENTE), NewConstant(ID_Cliente, datInteger), dboEqual); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; finally HideHourglassCursor; end; end; function TContratosClienteController.CambiarSituacion(AContrato: IBizContratoCliente; Situacion: String; FechaDecision: TDateTime; AllItems: Boolean): Boolean; // En el caso de cambiar almenos un elemento del conjunto se devuelve true begin if not Assigned(AContrato) then raise Exception.Create ('AContrato no asignado'); ShowHourglassCursor; try if not AContrato.DataTable.Active then AContrato.DataTable.Active := True; if (AContrato.State in dsEditModes) then AContrato.Cancel; //Siempre cambiaremos de situacion el seleccionado if AContrato.SITUACION <> Situacion then begin AContrato.DataTable.Edit; AContrato.SITUACION := Situacion; AContrato.DataTable.Post; end; //En el caso de querer eliminar todos los items del objeto AContrato if AllItems then begin with AContrato.DataTable do begin First; while not EOF do begin if AContrato.SITUACION <> Situacion then begin AContrato.DataTable.Edit; AContrato.SITUACION := Situacion; AContrato.DataTable.Post; end; Next; end; end; end; AContrato.DataTable.ApplyUpdates; Result := True; finally HideHourglassCursor; end; end; constructor TContratosClienteController.Create; begin inherited; AsignarDataModule; FClienteController := TClientesController.Create; FDetallesController := TDetallesContratoClienteController.Create; //GESTION_DOCUMENTOS FGestorDocumentosController := TGestorDocumentosController.Create; FDetallesController.addObservador(Self); end; function TContratosClienteController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean; begin Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf); end; { function TContratosClienteController.DarListaDocumentos(const ID: Integer): TStringList; begin Result := FDataModule.DarListaDocumentos(ID); end; function TContratosClienteController.DescargarFichero(const ID: Integer; const NombreFichero: String; const DestinoFichero: String): Boolean; begin Result := FDataModule.DescargarFichero(ID, NombreFichero, DestinoFichero); end; } function TContratosClienteController.DarListaAnosContratos: TStringList; begin Result := FDataModule.GetAnosItems; end; procedure TContratosClienteController.DescartarCambios(AContrato: IBizContratoCliente); begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignada'); ShowHourglassCursor; try if (AContrato.State in dsEditModes) then AContrato.Cancel; AContrato.DataTable.CancelUpdates; finally HideHourglassCursor; end; end; destructor TContratosClienteController.Destroy; begin FDataModule := Nil; FClienteController := Nil; FDetallesController := Nil; //GESTION_DOCUMENTOS FGestorDocumentosController := Nil; inherited; end; function TContratosClienteController.Duplicar( AContrato: IBizContratoCliente): IBizContratoCliente; begin Result := Self._Vacio; ShowHourglassCursor; try DuplicarRegistros(AContrato.DataTable, Result.DataTable, mdrActual); DuplicarRegistros(AContrato.Detalles.DataTable, Result.Detalles.DataTable, mdrTodos); // Hay que dejar algunos campos como si fuera un contrato nuevo Result.Edit; with Result do begin ID_EMPRESA := AppFactuGES.EmpresaActiva.ID; ID_TIENDA := AppFactuGES.TiendaActiva.ID; USUARIO := AppFactuGES.UsuarioActivo.UserName; FECHA_CONTRATO := DateOf(Now); INCIDENCIAS_ACTIVAS := 0; INCIDENCIASIsNull := True; // ID_FACTURAIsNull := True; REFERENCIA := ''; SITUACION := SITUACION_CONTRATO_PENDIENTE; // PRECIO_PUNTO := AppFactuGES.EmpresaActiva.PRECIO_PUNTO; end; Result.Post; finally HideHourglassCursor; end; end; function TContratosClienteController.ValidarContrato( AContrato: IBizContratoCliente): Boolean; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado'); if (AContrato.DataTable.State in dsEditModes) then AContrato.DataTable.Post; //Tambien hacemos post de sus tablas hija if (AContrato.Detalles.DataTable.State in dsEditModes) then AContrato.Detalles.DataTable.Post; // Abrir el cliente para la validación if Assigned(AContrato.Cliente) then AContrato.Cliente.DataTable.Active := True; if (AContrato.ID_Cliente <= 0) then // Si hay altas automáticas no hay objeto Cliente pero sí hay ID_CLIENTE { (not Assigned(AContrato.Cliente)) or (AContrato.Cliente.IsEmpty) then} raise Exception.Create('Debe indicar el cliente de este contrato'); if (EsFechaVacia(AContrato.FECHA_CONTRATO)) then raise Exception.Create('Debe indicar la fecha de este contrato'); if (AContrato.Detalles.DataTable.RecordCount = 0) then raise Exception.Create('El contrato debe tener en su contenido al menos un concepto'); FDetallesController.ValidarDetalles(AContrato.Detalles); { Asegurarse de valores en campos "automáticos" tanto en MODIFICACIÓN como en INSERCIÓN. } AContrato.Edit; try AContrato.USUARIO := AppFactuGES.UsuarioActivo.UserName; if Assigned(AContrato.Cliente) and (AContrato.ID_CLIENTE <> AContrato.Cliente.ID) then AContrato.ID_CLIENTE := AContrato.Cliente.ID; Result := True; finally AContrato.Post; end; end; procedure TContratosClienteController.Ver(AContrato: IBizContratoCliente); var AEditor : IEditorContratoCliente; begin AEditor := NIL; RecuperarObjetos(AContrato); CreateEditor('EditorContratoCliente', IEditorContratoCliente, AEditor); if Assigned(AEditor) then try AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE AEditor.Contrato := AContrato; //MODO CONSULTAR if not EsModificable(AContrato) then begin SetDataTableReadOnly(AContrato.DataTable, True); AEditor.ReadOnly := True; end; AEditor.ShowModal; //MODO CONSULTAR (Se deja la tabla como estaba) if AEditor.ReadOnly then SetDataTableReadOnly(AContrato.DataTable, False); finally AEditor.Release; AEditor := NIL; end; end; procedure TContratosClienteController.VerDireccionEntrega(AContrato: IBizContratoCliente); var AEditor : IEditorDireccionEntregaContratoCliente; begin AEditor := NIL; //RecuperarObjetos(AContrato); <- No descomentar. No hace falta CreateEditor('EditorDireccionEntregaContratoCliente', IEditorDireccionEntregaContratoCliente, AEditor); if Assigned(AEditor) then try AEditor.Contrato := AContrato; AEditor.ShowModal; finally AEditor.Release; AEditor := NIL; end; end; procedure TContratosClienteController.VerListadoBeneficios; var AContratosClienteBeneficios: IBizContratosClienteBeneficios; AEditor : IEditorContratosClienteBeneficios; begin AEditor := NIL; AContratosClienteBeneficios := FDataModule.GetContratosClienteBeneficios; CreateEditor('EditorContratosClienteBeneficios', IEditorContratosClienteBeneficios, AEditor); if Assigned(AEditor) then try // AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE AEditor.Contratos := AContratosClienteBeneficios; AEditor.ShowModal; finally AEditor.Release; AEditor := NIL; end; end; procedure TContratosClienteController.VerTodos(AContratos: IBizContratoCliente; const AVerModal : Boolean = False; const AWindowCaption: String = ''; const AHeaderText: String = ''); var AEditor : IEditorContratosCliente; begin AEditor := NIL; CreateEditor('EditorContratosCliente', IEditorContratosCliente, AEditor); if Assigned(AEditor) then try // if not EsCadenaVacia(AWindowCaption) then // AEditor.WindowCaption := AWindowCaption; // if not EsCadenaVacia(AHeaderText) then // AEditor.HeaderText := AHeaderText; AEditor.Controller := Self; //OJO ORDEN MUY IMPORTANTE AEditor.Contratos := AContratos; AEditor.MultiSelect := True; if AVerModal then AEditor.ShowModal else AEditor.ShowEmbedded; finally if AVerModal then AEditor.Release; AEditor := NIL; end; end; function TContratosClienteController._Vacio: IBizContratoCliente; begin Result := Buscar(ID_NULO); end; function TContratosClienteController.Eliminar(const ID: Integer): Boolean; var AContrato : IBizContratoCliente; begin AContrato := Buscar(ID); if not Assigned(AContrato) then raise Exception.Create(Format('No se ha encontrado el contrato con ID = %d', [ID])); Result := Eliminar(AContrato); AContrato := NIL; end; function TContratosClienteController.ElegirContratos(AContrato: IBizContratoCliente; AMensaje: String; AMultiSelect: Boolean): IBizContratoCliente; var AEditor : IEditorElegirContratosCliente; begin Result := NIL; CreateEditor('EditorElegirContratosCliente', IEditorElegirContratosCliente, AEditor); if Assigned(AEditor) then try AEditor.Controller := Self; AEditor.Contratos := AContrato; AEditor.MultiSelect := AMultiSelect; AEditor.Mensaje := AMensaje; if IsPositiveResult(AEditor.ShowModal) then Result := AEditor.ContratosClienteSeleccionados; finally AEditor.Release; AEditor := NIL; end; end; function TContratosClienteController.Eliminar(AContrato: IBizContratoCliente; AllItems: Boolean = false): Boolean; //En el caso de eliminar almenos un elemento del conjunto se devuelve true var bEliminado: Boolean; begin bEliminado := False; if not Assigned(AContrato) then raise Exception.Create ('AContrato no asignado'); ShowHourglassCursor; try if not AContrato.DataTable.Active then AContrato.DataTable.Active := True; if (AContrato.State in dsEditModes) then AContrato.Cancel; //Siempre eliminaremos el seleccionado if EsEliminable(AContrato) then begin //GESTION_DOCUMENTOS FGestorDocumentosController.EliminarDirectorio(AContrato.ID); AContrato.Delete; bEliminado := True; end; //En el caso de querer eliminar todos los items del objeto AContrato if AllItems then begin with AContrato.DataTable do begin First; while not EOF do begin if EsEliminable(AContrato) then begin //GESTION_DOCUMENTOS FGestorDocumentosController.EliminarDirectorio(AContrato.ID); AContrato.Delete; bEliminado := True end else Next; end; end; end; if bEliminado then begin AContrato.DataTable.ApplyUpdates; Result := True; end else Result := False; finally HideHourglassCursor; end; end; procedure TContratosClienteController.EnviarContratoPorEMail( AContrato: IBizContratoCliente); var AReportController : IContratosClienteReportController; AFicheroTMP : TFileName; AEMail : String; AListaEmail : TStringList; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (EnviarContratoPorEMail)'); if AContrato.DataTable.Active then AContrato.DataTable.Active := True; AFicheroTMP := DarFicheroPDFTemporal(EscapeIllegalChars(AContrato.REFERENCIA)); AListaEmail := TStringList.Create; try RecuperarCliente(AContrato); AContrato.Cliente.DataTable.Active := True; if not AContrato.Cliente.EMAIL_1IsNull then AListaEmail.Add(AContrato.Cliente.EMAIL_1); if not AContrato.Cliente.EMAIL_2IsNull then AListaEmail.Add(AContrato.Cliente.EMAIL_2); if not ElegirEMail(AListaEmail, AEMail) then Exit; finally FreeANDNIL(AListaEmail); end; ShowHourglassCursor; AReportController := TContratosClienteReportController.Create; try AReportController.ExportToPDF(AContrato.ID, AFicheroTMP); SendMailMAPI('Contrato ' + AContrato.REFERENCIA, '', AFicheroTMP, '', '', AContrato.Cliente.NOMBRE, AEMail); finally DeleteFile(AFicheroTMP); AReportController := NIL; HideHourglassCursor; end; end; function TContratosClienteController.EsEliminable(AContrato: IBizContratoCliente): Boolean; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado: EsEliminable'); Result := True; end; function TContratosClienteController.EsModificable(AContrato: IBizContratoCliente): Boolean; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (EsModificable)'); Result := True; end; procedure TContratosClienteController.RecalcularImportes( AContrato: IBizContratoCliente); var bEnEdicion : Boolean; ADetallePosAct : Integer; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (RecalcularImportes)'); if AContrato.DataTable.Active then AContrato.DataTable.Active := True; { Hay que guardar la posición en la que estamos en los detalles por que la asignación de valores a los campos IMPORTE_NETO e IMPORTE_PORTE (ver más adelante) colocan el puntero en la tabla detalle al principio. No he encontrado la razón por la que mueve el puntero. } ADetallePosAct := AContrato.Detalles.POSICION; bEnEdicion := (AContrato.DataTable.State in dsEditModes); if not bEnEdicion then AContrato.Edit; ShowHourglassCursor; try AContrato.IMPORTE_NETO := FDetallesController.DarTotalImporteTotal(AContrato.Detalles); AContrato.IMPORTE_PORTE := FDetallesController.DarTotalPorteTotal(AContrato.Detalles); if not bEnEdicion then AContrato.Post; finally HideHourglassCursor; // Restaurar la posición que teníamos en los detalles. FDetallesController.LocalizarPosicion(AContrato.Detalles, ADetallePosAct); end; end; procedure TContratosClienteController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); var AContrato : IBizContratoCliente; ADetalles : IBizDetallesContratoCliente; begin inherited; if Supports(ADataTable, IBizDetallesContratoCliente, ADetalles) and Supports(ADetalles.DataTable.MasterSource.DataTable, IBizContratoCliente, AContrato) then begin RecalcularImportes(AContrato); end; end; procedure TContratosClienteController.RecuperarObjetos(AContrato: IBizContratoCliente); begin RecuperarCliente(AContrato); end; procedure TContratosClienteController.RellenarValoresDefecto(AContrato: IBizContratoCliente; ATipo: TEnumTiposContrato); var AFormasPago : IBizFormaPago; AFormasPagoController : IFormasPagoController; begin AFormasPagoController := TFormasPagoController.Create; case ATipo of teCocina: begin AContrato.TIPO_CONTRATO := CTE_COCINA; AContrato.ID_FORMA_PAGO := StrToInt(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_FORMA_PAGO_COCINA, AppFactuGES.EmpresaActiva.ID)); AFormasPago := AFormasPagoController.Buscar(AContrato.ID_FORMA_PAGO); AFormasPago.Open; AContrato.FORMA_PAGO.Add(AFormasPago.DESCRIPCION); AContrato.PLAZO_ENTREGA.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_PLAZOS_ENTREGA_COCINA, AppFactuGES.EmpresaActiva.ID)); AContrato.OBSERVACIONES.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_OBSERVACIONES_COCINA, AppFactuGES.EmpresaActiva.ID)); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_C, 'MUEBLES DE COCINA ', True, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'ENCIMERA ', True, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'ELECTRODOMÉSTICOS ', True, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'COMPLEMENTOS ', True, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'IMPORTES ', True, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'AUMENTO POR ', False, AContrato.Detalles); end; teArmario: begin AContrato.TIPO_CONTRATO := CTE_ARMARIO; AContrato.ID_FORMA_PAGO := StrToInt(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_FORMA_PAGO_ARMARIO, AppFactuGES.EmpresaActiva.ID)); AFormasPago := AFormasPagoController.Buscar(AContrato.ID_FORMA_PAGO); AFormasPago.Open; AContrato.FORMA_PAGO.Add(AFormasPago.DESCRIPCION); AContrato.PLAZO_ENTREGA.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_PLAZOS_ENTREGA_ARMARIO, AppFactuGES.EmpresaActiva.ID)); AContrato.OBSERVACIONES.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_OBSERVACIONES_ARMARIO, AppFactuGES.EmpresaActiva.ID)); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_AF, 'FRENTE DE ARMARIO Nº ', True, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_AI, 'INTERIOR DE ARMARIO Nº ', True, AContrato.Detalles); end; teBano: begin AContrato.TIPO_CONTRATO := CTE_BANO; AContrato.ID_FORMA_PAGO := StrToInt(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_FORMA_PAGO_BANO, AppFactuGES.EmpresaActiva.ID)); AFormasPago := AFormasPagoController.Buscar(AContrato.ID_FORMA_PAGO); AFormasPago.Open; AContrato.FORMA_PAGO.Add(AFormasPago.DESCRIPCION); AContrato.PLAZO_ENTREGA.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_PLAZOS_ENTREGA_BANO, AppFactuGES.EmpresaActiva.ID)); AContrato.OBSERVACIONES.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_OBSERVACIONES_BANO, AppFactuGES.EmpresaActiva.ID)); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_B, 'MUEBLE DE BAÑO Nº ', False, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'IMPORTES ', True, AContrato.Detalles); end; teElectrodomestico: begin AContrato.TIPO_CONTRATO := CTE_ELECTRODOMESTICO; AContrato.ID_FORMA_PAGO := StrToInt(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_FORMA_PAGO_ELECTRODOMESTICO, AppFactuGES.EmpresaActiva.ID)); AFormasPago := AFormasPagoController.Buscar(AContrato.ID_FORMA_PAGO); AFormasPago.Open; AContrato.FORMA_PAGO.Add(AFormasPago.DESCRIPCION); AContrato.PLAZO_ENTREGA.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_PLAZOS_ENTREGA_ELECTRODOMESTICO, AppFactuGES.EmpresaActiva.ID)); AContrato.OBSERVACIONES.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_OBSERVACIONES_ELECTRODOMESTICO, AppFactuGES.EmpresaActiva.ID)); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_E, 'ELECTRODOMÉSTICOS ', False, AContrato.Detalles); end; teVarios: begin AContrato.TIPO_CONTRATO := CTE_VARIOS; AContrato.ID_FORMA_PAGO := StrToInt(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_FORMA_PAGO_VARIOS, AppFactuGES.EmpresaActiva.ID)); AFormasPago := AFormasPagoController.Buscar(AContrato.ID_FORMA_PAGO); AFormasPago.Open; AContrato.FORMA_PAGO.Add(AFormasPago.DESCRIPCION); AContrato.PLAZO_ENTREGA.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_PLAZOS_ENTREGA_VARIOS, AppFactuGES.EmpresaActiva.ID)); AContrato.OBSERVACIONES.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_OBSERVACIONES_VARIOS, AppFactuGES.EmpresaActiva.ID)); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'VARIOS ', True, AContrato.Detalles); end; end; AFormasPago:= Nil; AFormasPagoController := Nil; end; procedure TContratosClienteController.RecuperarCliente(AContrato: IBizContratoCliente); begin AContrato._Cliente := (FClienteController.Buscar(AContrato.ID_Cliente) as IBizCliente); end; function TContratosClienteController.Existe(const ID: Integer): Boolean; var AContrato : IBizContratoCliente; begin try AContrato := Buscar(ID); Result := Assigned(AContrato) and (AContrato.ID = ID); finally AContrato := NIL; end; end; function TContratosClienteController.ExtraerSeleccionados(AContrato: IBizContratoCliente): IBizContratoCliente; var ASeleccionados : IBizContratoCliente; begin ASeleccionados := (Self.Buscar(ID_NULO) as IBizContratoCliente); CopyDataTableDA5(AContrato.DataTable, ASeleccionados.DataTable, True); Result := ASeleccionados; end; procedure TContratosClienteController.FiltrarAno(AContrato: IBizContratoCliente; ADynWhereDataTable: WideString;const Ano: String); var Condicion: TDAWhereExpression; FechaIni: String; FechaFin: String; begin AContrato.DataTable.DynamicWhere.Clear; AContrato.DataTable.DynamicWhere.Xml := ADynWhereDataTable; if (Ano <> 'Todos') then begin // Filtrar las facturas actuales por empresa FechaIni := '01/01/' + Ano; FechaFin := '31/12/' + Ano; with AContrato.DataTable.DynamicWhere do begin // (FECHA_INICIO between FECHA_FIN) Condicion := NewBinaryExpression(NewField('', fld_ContratosClienteFECHA_CONTRATO), NewConstant(FechaIni, datString), dboGreaterOrEqual); Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_ContratosClienteFECHA_CONTRATO), NewConstant(FechaFin, datString), dboLessOrEqual), Condicion, dboAnd); if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Condicion, Expression, dboAnd); end; end; end; procedure TContratosClienteController.FiltrarEmpresa(AContrato: IBizContratoCliente); var i: Integer; Condicion, Condicion2: TDAWhereExpression; begin if AContrato.DataTable.Active then AContrato.DataTable.Active := False; // Filtrar los presupuestos actuales por empresa with AContrato.DataTable.DynamicWhere do begin // (ID_EMPRESA >= ID) Condicion := NewBinaryExpression(NewField('', fld_ContratosClienteID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.ID, datInteger), dboEqual); for i:= 0 to AppFactuGES.EmpresaActiva.EmpresasContratosComunes.Count - 1 do begin // (ID_EMPRESA >= ID) Condicion2 := NewBinaryExpression(NewField('', fld_ContratosClienteID_EMPRESA), NewConstant(AppFactuGES.EmpresaActiva.EmpresasContratosComunes.Strings[i], datString), dboEqual); Condicion := NewBinaryExpression(Condicion, Condicion2, dboOR); end; if IsEmpty then Expression := Condicion else Expression := NewBinaryExpression(Expression, Condicion, dboAnd); end; end; procedure TContratosClienteController.SetClienteController(const Value: IClientesController); begin FClienteController := Value; end; procedure TContratosClienteController.SetDetallesController(const Value: IDetallesContratoClienteController); begin FDetallesController := Value; end; procedure TContratosClienteController.SetGestorDocumentosController( const Value: IGestorDocumentosController); begin FGestorDocumentosController := Value; end; { function TContratosClienteController.SubirFichero(const ID: Integer; const NombreFichero: String; const Fichero: Binary): Boolean; begin Result := FDataModule.SubirFichero(ID, NombreFichero, Fichero); end; } function TContratosClienteController.Guardar(AContrato: IBizContratoCliente): Boolean; begin Result := False; if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignada'); if not Assigned(FDetallesController) then raise Exception.Create ('Controller detalles no asignado'); if ValidarContrato(AContrato) then begin ShowHourglassCursor; // Asegurarnos de que todos los importes están bien. RecalcularImportes(AContrato); try AContrato.DataTable.ApplyUpdates; Result := True; finally HideHourglassCursor; end; end; end; function TContratosClienteController.Localizar(AContratos: IBizContratoCliente; const ID: Integer): Boolean; begin Result := True; ShowHourglassCursor; try with AContratos.DataTable do begin DisableControls; First; if not Locate(fld_ContratosClienteID, ID, []) then Result := False; EnableControls; end; finally HideHourglassCursor; end; end; function TContratosClienteController.Nuevo(WithInsert: Boolean): IBizContratoCliente; var AContrato : IBizContratoCliente; begin AContrato := FDataModule.NewItem; FiltrarEmpresa(AContrato); AContrato.DataTable.Active := True; if WithInsert then AContrato.Insert; Result := AContrato; end; procedure TContratosClienteController.Preview(AContrato: IBizContratoCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); var AReportController : IContratosClienteReportController; ID_Contratos: TIntegerList; begin AReportController := TContratosClienteReportController.Create; try ID_Contratos := TIntegerList.Create; //Si deseamos previsualizar todos los items del objeto contrato if AllItems then begin with AContrato.DataTable do begin First; while not EOF do begin ID_Contratos.Add(AContrato.ID); Next; end; end; end //Solo previsualizamos el item seleccionado else ID_Contratos.Add(AContrato.ID); AReportController.Preview(ID_Contratos, VerLogotipo, VerImprimirPrecios, VerImprimirTotales); finally AReportController := NIL; FreeAndNil(ID_Contratos); end; end; procedure TContratosClienteController.Print(AContrato: IBizContratoCliente; AllItems: Boolean = false; VerLogotipo: Boolean = true; const VerImprimirPrecios: Boolean = False; const VerImprimirTotales: Boolean = False; const VerImprimirRefProveedor: Boolean = False; const VerImprimirObservaciones: Boolean = False; const VerImprimirIncidencias: Boolean = False); var AReportController : IContratosClienteReportController; ID_Contratos: TIntegerList; begin AReportController := TContratosClienteReportController.Create; ID_Contratos := TIntegerList.Create; try //Si deseamos imprimimos todos los items del objeto contrato if AllItems then begin with AContrato.DataTable do begin First; while not EOF do begin ID_Contratos.Add(AContrato.ID); Next; end; end; end //Solo imprimimos el item seleccionado else ID_Contratos.Add(AContrato.ID); AReportController.Print(ID_Contratos, VerLogotipo, VerImprimirPrecios, VerImprimirTotales); finally AReportController := NIL; FreeANDNIL(ID_Contratos); end; end; function TContratosClienteController.GetClienteController: IClientesController; begin Result := FClienteController; end; function TContratosClienteController.GetDetallesController: IDetallesContratoClienteController; begin Result := FDetallesController; end; function TContratosClienteController.GetGestorDocumentosController: IGestorDocumentosController; begin Result := FGestorDocumentosController; end; end.