unit uContratosClienteController; interface uses Classes, uROTypes, SysUtils, uDADataTable, uEditorDBItem, uControllerBase, uIDataModuleContratosCliente, uClientesController, uDetallesContratoClienteController, uGestorDocumentosController, uBizContratosCliente, uBizDireccionesContacto, uBizDetallesContratoCliente, uIntegerListUtils, uBizPresupuestosCliente, uBizContactos; 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); procedure ActualizarDescuentos(AContrato : IBizContratoCliente); procedure ActualizarPrecioPunto(AContrato : IBizContratoCliente); procedure ActualizarDescuentoCapitulo(AContrato : IBizContratoCliente); 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 CambiarComercial(AContrato : IBizContratoCliente; AComercial: IBizComercial): Boolean; function CambiarInstalador(AContrato : IBizContratoCliente; AIntalador: IBizInstalador): Boolean; procedure EtiquetasPreview(AContrato : IBizContratoCliente; Const AAgencia: String; const AReferencia: String; const ANumEtiquetas: Integer; const AEtiquetaIni: Integer); procedure EtiquetasPrint(AContrato : IBizContratoCliente; Const AAgencia: String; const AReferencia: String; const ANumEtiquetas: Integer; const AEtiquetaIni: Integer); function DarListaAnosContratos: TStringList; procedure FiltrarAno(AContrato: IBizContratoCliente; ADynWhereDataTable: WideString; const Ano: String); procedure VerListadoBeneficios; procedure VerDireccionEntrega(AContrato : IBizContratoCliente); function MandarFabrica(AContrato: IBizContratoCliente; AClonarContrato: Boolean = true): Boolean; function AceptarContrato(AContrato: IBizContratoCliente): Boolean; function AnadirIncidenciaContrato(AIdContrato: Integer): Boolean; 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); procedure ActualizarDescuentos(AContrato : IBizContratoCliente); procedure ActualizarPrecioPunto(AContrato : IBizContratoCliente); procedure ActualizarDescuentoCapitulo(AContrato : IBizContratoCliente); 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 CambiarComercial(AContrato : IBizContratoCliente; AComercial: IBizComercial): Boolean; function CambiarInstalador(AContrato : IBizContratoCliente; AInstalador: IBizInstalador): Boolean; procedure EtiquetasPreview(AContrato : IBizContratoCliente; Const AAgencia: String; const AReferencia: String; const ANumEtiquetas: Integer; const AEtiquetaIni: Integer); procedure EtiquetasPrint(AContrato : IBizContratoCliente; Const AAgencia: String; const AReferencia: String; const ANumEtiquetas: Integer; const AEtiquetaIni: Integer); function DarListaAnosContratos: TStringList; procedure FiltrarAno(AContrato: IBizContratoCliente; ADynWhereDataTable: WideString; const Ano: String); procedure VerListadoBeneficios; procedure VerDireccionEntrega(AContrato : IBizContratoCliente); function MandarFabrica(AContrato: IBizContratoCliente; AClonarContrato: Boolean = true): Boolean; function AceptarContrato(AContrato: IBizContratoCliente): Boolean; function AnadirIncidenciaContrato(AIdContrato: Integer): Boolean; end; implementation uses Forms, Controls, cxControls, DB, uEditorRegistryUtils, uEditorPreview, DateUtils, uIEditorContratosCliente, uDataModuleContratosCliente, Variants, 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, uTypesConstConfiguration, 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; // Se copia como variant para que no convierta a double y meta ceros. ADestino.DataTable.FieldByName(fld_PresupuestosCliente_DetallesCANTIDAD).AsFloat := AOrigen.DataTable.FieldByName(fld_PresupuestosCliente_DetallesCANTIDAD).AsFloat; // ADestino.CANTIDAD := AOrigen.CANTIDAD; ADestino.DataTable.FieldByName(fld_PresupuestosCliente_DetallesIMPORTE_UNIDAD).AsVariant := AOrigen.DataTable.FieldByName(fld_PresupuestosCliente_DetallesIMPORTE_UNIDAD).AsVariant; // ADestino.IMPORTE_UNIDAD := AOrigen.IMPORTE_UNIDAD; ADestino.DataTable.FieldByName(fld_PresupuestosCliente_DetallesIMPORTE_TOTAL).AsVariant := AOrigen.DataTable.FieldByName(fld_PresupuestosCliente_DetallesIMPORTE_TOTAL).AsVariant; // ADestino.IMPORTE_TOTAL := AOrigen.IMPORTE_TOTAL; ADestino.DataTable.FieldByName(fld_PresupuestosCliente_DetallesINCREMENTO).AsVariant := AOrigen.DataTable.FieldByName(fld_PresupuestosCliente_DetallesINCREMENTO).AsVariant; // ADestino.INCREMENTO := AOrigen.INCREMENTO; ADestino.DataTable.FieldByName(fld_PresupuestosCliente_DetallesDECREMENTO).AsVariant := AOrigen.DataTable.FieldByName(fld_PresupuestosCliente_DetallesDECREMENTO).AsVariant; // ADestino.DECREMENTO := AOrigen.DECREMENTO; ADestino.DataTable.FieldByName(fld_PresupuestosCliente_DetallesDESCUENTO).AsVariant := AOrigen.DataTable.FieldByName(fld_PresupuestosCliente_DetallesDESCUENTO).AsVariant; // ADestino.DESCUENTO := AOrigen.DESCUENTO; ADestino.DataTable.FieldByName(fld_PresupuestosCliente_DetallesIMPORTE_PORTE).AsVariant := AOrigen.DataTable.FieldByName(fld_PresupuestosCliente_DetallesIMPORTE_PORTE).AsVariant; // 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; function TContratosClienteController.AceptarContrato(AContrato: IBizContratoCliente): Boolean; begin Result := 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 cambiaremos de situacion el seleccionado if AContrato.ENVIADA_REVISADA <> CONST_CONTRATO_ACEPTADO_UECKO then begin AContrato.DataTable.Edit; AContrato.ENVIADA_REVISADA := CONST_CONTRATO_ACEPTADO_UECKO; AContrato.DataTable.Post; end; AContrato.DataTable.ApplyUpdates; Result := True; finally HideHourglassCursor; end; end; procedure TContratosClienteController.ActualizarDescuentoCapitulo(AContrato: IBizContratoCliente); var bEnEdicion : Boolean; ADescuentoCapituloNuevoContrato: Currency; begin /////////////////// /// Actualiza el descuento capitulo del cotrato que tenga asignado el cliente del mismo /////////////////// ADescuentoCapituloNuevoContrato := AppFactuGES.EmpresaActiva.DESCUENTO_CAPITULO; if (not AContrato.Cliente.DataTable.FieldByName('DESCUENTO_CAPITULO').IsNull) then ADescuentoCapituloNuevoContrato := AContrato.Cliente.DESCUENTO_CAPITULO; bEnEdicion := (AContrato.DataTable.State in dsEditModes); if not bEnEdicion then AContrato.Edit; AContrato.DESCUENTO_CAPITULO := ADescuentoCapituloNuevoContrato; DetallesController.RecalcularDescuentoCapituloDetalles(AContrato.DESCUENTO_CAPITULO, AContrato.Detalles); if not bEnEdicion then AContrato.Post; end; procedure TContratosClienteController.ActualizarDescuentos(AContrato: IBizContratoCliente); var bEnEdicion : Boolean; begin /////////////////////////////////////// //Función que asigna el descuento general y el descuento comercial por linea del cliente de presupuesto /////////////////////////////////////// bEnEdicion := (AContrato.DataTable.State in dsEditModes); if not bEnEdicion then AContrato.Edit; AContrato.DESCUENTO := AContrato.Cliente.DESCUENTO; AContrato.DESCUENTO_CAPITULO := AContrato.Cliente.DESCUENTO_CAPITULO; FDetallesController.ActualizarDetalles(AContrato.Detalles, AContrato.Cliente); // FDetallesController.ActualizarDescuentoCapitulos(AContrato.Detalles, AContrato.DESCUENTO_CAPITULO); if not bEnEdicion then AContrato.Post; 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; procedure TContratosClienteController.ActualizarPrecioPunto(AContrato: IBizContratoCliente); var bEnEdicion : Boolean; APrecioPuntoNuevoContrato: Currency; begin /////////////////// /// Actualiza el precio punto del contrato con el que tenga asignado el cliente del mismo /////////////////// APrecioPuntoNuevoContrato := AppFactuGES.EmpresaActiva.PRECIO_PUNTO; if (not AContrato.Cliente.DataTable.FieldByName('PRECIO_PUNTO').IsNull) then APrecioPuntoNuevoContrato := AContrato.Cliente.PRECIO_PUNTO; bEnEdicion := (AContrato.DataTable.State in dsEditModes); if not bEnEdicion then AContrato.Edit; ///////////////////7 /// El contrato no tiene precio punto en el documento porque se genera a partir de varios presupuestos y pueden tener precio punto diferente /// SE cambia a peticion, estableciendo siempre el recalculo en base al precio punto de la ficha del cliente AContrato.PRECIO_PUNTO := APrecioPuntoNuevoContrato; DetallesController.RecalcularPrecioPuntoDetalles(APrecioPuntoNuevoContrato, AContrato.Detalles); if not bEnEdicion then AContrato.Post; 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; // Se desactiva las notas y observaciones por tipo de docmento (cocina, armarios, varios ...) pasa a ser Presupuestos, Contratos ... // 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, idioma, pais y comercial 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; //En el caso de ser 1 contrato a partir de 1 presupuesto copiamos las referencias de cliente y la tienda del presupuesto origen así como su comercial asignado, pais, idioma if (AListaPresupuestos.DataTable.RecordCount = 1) then begin if not bEnEdicion then AContratos.Edit; AContratos.REFERENCIA_CLIENTE := AListaPresupuestos.REFERENCIA_CLIENTE; AContratos.ID_TIENDA := AListaPresupuestos.ID_TIENDA; AContratos.IDIOMA_ISO := AListaPresupuestos.IDIOMA_ISO; AContratos.PAIS := AListaPresupuestos.PAIS; AContratos.ID_AGENTE := AListaPresupuestos.ID_AGENTE; AContratos.NOMBRE_AGENTE := AListaPresupuestos.NOMBRE_AGENTE; AContratos.DELEGACION := AListaPresupuestos.DELEGACION; AContratos.Post; if bEnEdicion then AContratos.Edit; end; 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 + ' - ' + DateToStr(AListaPresupuestos.FECHA_PRESUPUESTO); ACadena := ACadena + #13 + ' Ref. ' + 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 // Antes recalculo los detalles con el precio punto adquirido de la ficha del cliente Self.DetallesController.RecalcularPrecioPuntoDetalles(AContratoActual.PRECIO_PUNTO, AContratoActual.Detalles); 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; function TContratosClienteController.AnadirIncidenciaContrato( AIdContrato: Integer): Boolean; begin Result := FDataModule.AnadirIncidenciaContrato(AIdContrato); 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.CambiarComercial(AContrato: IBizContratoCliente; AComercial: IBizComercial): Boolean; var bEnEdicion : Boolean; begin if not Assigned(AContrato) then raise Exception.Create ('AContrato no asignado'); ShowHourglassCursor; try bEnEdicion := (AContrato.DataTable.State in dsEditModes); if not bEnEdicion then AContrato.Edit; AContrato.DataTable.Edit; AContrato.ID_AGENTE := AComercial.ID; AContrato.NOMBRE_AGENTE := AComercial.NOMBRE; AContrato.DELEGACION := AComercial.DELEGACION; if not bEnEdicion then AContrato.Post; finally HideHourglassCursor; end; end; function TContratosClienteController.CambiarInstalador(AContrato: IBizContratoCliente; AInstalador: IBizInstalador): Boolean; var bEnEdicion : Boolean; begin if not Assigned(AContrato) then raise Exception.Create ('AContrato no asignado'); ShowHourglassCursor; try bEnEdicion := (AContrato.DataTable.State in dsEditModes); if not bEnEdicion then AContrato.Edit; AContrato.DataTable.Edit; AContrato.ID_INSTALADOR := AInstalador.ID; AContrato.NOMBRE_INSTALADOR := AInstalador.NOMBRE; if not bEnEdicion then AContrato.Post; 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 var APresupuestosController : IPresupuestosClienteController; begin if not Assigned(AContrato) then raise Exception.Create ('AContrato no asignado'); ShowHourglassCursor; try APresupuestosController := TPresupuestosClienteController.Create; 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; if (AContrato.SITUACION = SITUACION_CONTRATO_CANCELADO) then begin //El presupuesto asociado si lo tiene también se podrá en estado anulado APresupuestosController.AnularPresupuestosDelContrato(AContrato.ID, FechaDecision); //Se añade incidencia al contrato de graden para que sepan que se ha cancelado en fábrica if (not AContrato.ID_CONTRATO_ASOCIADOIsNull) then Self.AnadirIncidenciaContrato(AContrato.ID_CONTRATO_ASOCIADO); end; end; //En el caso de querer cambiar 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; //El presupuesto asociado si lo tiene también se podrá en estado anulado APresupuestosController.AnularPresupuestosDelContrato(AContrato.ID, FechaDecision); //Se añade incidencia al contrato de graden para que sepan que se ha cancelado en fábrica if not AContrato.ID_CONTRATO_ASOCIADOIsNull then Self.AnadirIncidenciaContrato(AContrato.ID_CONTRATO_ASOCIADO); end; Next; end; end; end; AContrato.DataTable.ApplyUpdates; Result := True; finally APresupuestosController := NIL; 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 as IBizContratoCliente) 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; ENVIADA_REVISADA := 0; ID_CONTRATO_ASOCIADOIsNull := True; // ID_FACTURAIsNull := True; REFERENCIA := ''; SITUACION := SITUACION_CONTRATO_PENDIENTE; //EL PRECIO PUNTO SIEMPRE SERA ESTABLECIDO POR LA FICHA DEL CLIENTE // PRECIO_PUNTO := AppFactuGES.EmpresaActiva.PRECIO_PUNTO; AsignarVendedor; // ID_TIENDA := AppFactuGES.TiendaActiva.ID; // TIENDA := AppFactuGES.TiendaActiva.NOMBRE; ID_INSTALADORIsNull := True; NOMBRE_INSTALADORIsNull := True; 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 := (AContrato.SITUACION = SITUACION_CONTRATO_PENDIENTE) AND (AContrato.ENVIADA_REVISADA = CONST_CONTRATO_DEFAULT); end; function TContratosClienteController.EsModificable(AContrato: IBizContratoCliente): Boolean; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (EsModificable)'); Result := (AContrato.SITUACION = SITUACION_CONTRATO_PENDIENTE) AND (AContrato.ENVIADA_REVISADA <> CONST_CONTRATO_ENVIADO_UECKO); end; procedure TContratosClienteController.EtiquetasPreview(AContrato: IBizContratoCliente; const AAgencia, AReferencia: String; const ANumEtiquetas, AEtiquetaIni: Integer); var AReportController : IContratosClienteReportController; begin AReportController := TContratosClienteReportController.Create; try AReportController.EtiquetasPreview(AContrato.ID, AAgencia, AReferencia, ANumEtiquetas, AEtiquetaIni); finally AReportController := NIL; end; end; procedure TContratosClienteController.EtiquetasPrint(AContrato: IBizContratoCliente; const AAgencia, AReferencia: String; const ANumEtiquetas, AEtiquetaIni: Integer); var AReportController : IContratosClienteReportController; begin AReportController := TContratosClienteReportController.Create; try AReportController.EtiquetasPrint(AContrato.ID, AAgencia, AReferencia, ANumEtiquetas, AEtiquetaIni); finally AReportController := NIL; end; 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); if (AContrato.ENVIADA_REVISADA = 10) then MandarFabrica(AContrato, False); 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 contratos 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; var ABookmark : TBookmark; 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'); //ESTO DA UN PETE DE COJONES NO GUARDA CABECERA //Preparamos todo para recuparar la posición de los detalles para despues de guardar no vaya al principio de los detalles // AContrato.DataTable.DisableControls; // AContrato.DataTable.DisableEventHandlers; // ABookmark := AContrato.Detalles.DataTable.GetBookMark; if ValidarContrato(AContrato) then begin ShowHourglassCursor; // Asegurarnos de que todos los importes están bien. RecalcularImportes(AContrato); try AContrato.DataTable.ApplyUpdates; Result := True; finally //Preparamos todo para recuparar la posición de los detalles para despues de guardar no vaya al principio de los detalles // AContrato.DataTable.EnableEventHandlers; // AContrato.DataTable.EnableControls; // AContrato.Detalles.DataTable.GotoBookmark(ABookmark); // AContrato.Detalles.DataTable.FreeBookmark(ABookmark); 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.MandarFabrica(AContrato: IBizContratoCliente; AClonarContrato: Boolean = true): Boolean; var AContratoFabrica : IBizContratoCliente; begin Result := false; ShowHourglassCursor; try //En el caso de contrato de presupuestador WEB no clonamos modificamos el contrato pasado if AClonarContrato then AContratoFabrica := Duplicar(AContrato) else AContratoFabrica := AContrato; // Hay que dejar algunos campos como si fuera un contrato nuevo AContratoFabrica.Edit; with AContratoFabrica do begin ID_EMPRESA := CTE_EMPRESA_FABRICA; ID_TIENDA := CTE_EMPRESA_FABRICA; USUARIO := AppFactuGES.UsuarioActivo.UserName; //En el caso de contrato de presupuestador WEB no se toca la fecha recibida if AClonarContrato then begin FECHA_CONTRATO := DateOf(Now); REFERENCIA_CLIENTE := AContrato.REFERENCIA + ' - ' + AContrato.NOMBRE_CLIENTE; end; INCIDENCIAS_ACTIVAS := 0; INCIDENCIASIsNull := True; SITUACION := SITUACION_CONTRATO_PENDIENTE; //En el caso de contrato de presupuestador WEB se cambia constante if AClonarContrato then ENVIADA_REVISADA := CONST_CONTRATO_RECIBIDO_UECKO else ENVIADA_REVISADA := CONST_CONTRATO_RECIBIDO_UECKO_DESDE_WEB; //En el caso de contrato de presupuestador WEB se cambia constante if AClonarContrato then begin //ASIGNACION DE CLIENTE PARA ABETO if (AContrato.ID_EMPRESA = CTE_EMPRESA_GUNNI) then AContratoFabrica._Cliente := (FClienteController.darClienteGraden(CTE_CLIENTE_GUNNI_PARA_FABRICA) as IBizCliente) else AContratoFabrica._Cliente := (FClienteController.darClienteGraden(CTE_CLIENTE_GRADEN_PARA_FABRICA) as IBizCliente); end else AContratoFabrica._Cliente := (FClienteController.darClienteGraden(AContratoFabrica.ID_CLIENTE) as IBizCliente); AContratoFabrica.Cliente.DataTable.Active := True; NOMBRE := AContratoFabrica.Cliente.NOMBRE; NIF_CIF := AContratoFabrica.Cliente.NIF_CIF; CALLE := AContratoFabrica.Cliente.CALLE; CODIGO_POSTAL := AContratoFabrica.Cliente.CODIGO_POSTAL; PROVINCIA := AContratoFabrica.Cliente.PROVINCIA; POBLACION := AContratoFabrica.Cliente.POBLACION; TELEFONO := AContratoFabrica.Cliente.TELEFONO_1; MOVIL := AContratoFabrica.Cliente.MOVIL_1; //LA DIRECCIÖN DE ENVIO SE MANTIENE LA COPIADA DEL CLIENTE FINAL AContratoFabrica.ID_FORMA_PAGO := AContratoFabrica.Cliente.ID_FORMA_PAGO; AContratoFabrica.ID_TIPO_IVA := AContratoFabrica.Cliente.ID_TIPO_IVA; AContratoFabrica.IDIOMA_ISO := AContratoFabrica.Cliente.IDIOMA_ISO; AContratoFabrica.IDIOMA := AContratoFabrica.Cliente.IDIOMA; AContratoFabrica.PRECIO_PUNTO := AContratoFabrica.Cliente.PRECIO_PUNTO; AContratoFabrica.DESCUENTO_CAPITULO := AContratoFabrica.Cliente.DESCUENTO_CAPITULO; DetallesController.PrecioPunto := AContratoFabrica.Cliente.PRECIO_PUNTO; DetallesController.ActualizarDetalles(AContratoFabrica.Detalles, AContratoFabrica.Cliente); end; AContratoFabrica.Post; //En el caso de contrato de presupuestador WEB no se modifica el contratoorigen if AClonarContrato then begin if Guardar(AContratoFabrica) then begin AContrato.Edit; AContrato.ID_CONTRATO_ASOCIADO := AContratoFabrica.ID; AContrato.ENVIADA_REVISADA := CONST_CONTRATO_ENVIADO_UECKO; AContrato.Post; AContrato.DataTable.ApplyUpdates; Result := True; end; 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.