unit uGenerarContratosCliUtils; interface uses Windows, SysUtils, Classes, pngimage, JSDialog, uBizPresupuestosCliente, uBizContratosCliente; type TdmGenerarContratosCli = class(TDataModule) JsListaContratosGenerados: TJSDialog; end; function GenerarContratoCli(const IDPresupuesto : Integer; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload; // function GenerarContratoCli(APresupuesto : IBizPresupuestoCliente; var AContrato: IBizContratoCliente; // const APreguntaMostrarContrato : Boolean = True) : Boolean; overload; function GenerarContratosCli : Boolean; overload; function GenerarContratosCli(APresupuestos : IBizPresupuestoCliente) : Boolean; overload; // function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean; implementation {$R *.dfm} uses uDialogUtils, uBizDetallesPresupuestoCliente, uBizDetallesContratoCliente, uPresupuestosClienteController, uContratosClienteController, uClientesController, uDetallesContratoClienteController, uControllerDetallesBase, uBizContactos, schPresupuestosClienteClient_Intf, schContratosClienteClient_Intf, uDireccionesContactoController, uBizDireccionesContacto, uFactuGES_App; var dmGenerarContratosCli: TdmGenerarContratosCli; APresupuestosClienteController : IPresupuestosClienteController; AContratosClienteController : IContratosClienteController; ADireccionesController : IDireccionesContactoController; AClientesController : IClientesController; { Métodos auxiliares } procedure PreguntarMostrarContrato(AContrato : IBizContratoCliente); var ARespuesta : Integer; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (PreguntaSiMostrarContrato)'); with dmGenerarContratosCli.JsListaContratosGenerados do begin Instruction.Text := 'Se ha generado el contrato'; Content.Clear; Content.Add(Format('Se ha generado correctamente el contrato %s a partir del presupuesto de cliente' + #10#13, [AContrato.REFERENCIA])); Execute; ARespuesta := CustomButtonResult; case ARespuesta of 100 : begin // Ver el albarán AContratosClienteController.Ver(AContrato); end; 200 : // Continuar; end; end; end; procedure CopiarPresupuestoAContrato(APresupuesto: IBizPresupuestoCliente; AContrato : IBizContratoCliente); var FDireccion: IBizDireccionesContacto; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (CopiarPresupuestoAContrato)'); if not Assigned(APresupuesto) then raise Exception.Create ('Presupuesto no asignado (CopiarPresupuestoAContrato)'); if not APresupuesto.DataTable.Active then APresupuesto.DataTable.Active := True; // El contrato tiene que venir ya abierto y posicionado donde hay que copiar AContrato.ID_CLIENTE := APresupuesto.ID_CLIENTE; AContrato.NIF_CIF := APresupuesto.NIF_CIF; AContrato.NOMBRE := APresupuesto.NOMBRE; APresupuestosClienteController.RecuperarCliente(APresupuesto); APresupuesto.Cliente.Open; FDireccion := ADireccionesController.Nuevo; try if (not APresupuesto.ID_DIRECCIONIsNull) and (ADireccionesController.Localizar(APresupuesto.Cliente.Direcciones, APresupuesto.ID_DIRECCION)) then ADireccionesController.CopiarDireccion(APresupuesto.Cliente.Direcciones, FDireccion) else ADireccionesController.CopiarDireccionFiscal(APresupuesto.Cliente, FDireccion); AContrato.CALLE := FDireccion.CALLE; AContrato.POBLACION := FDireccion.POBLACION; AContrato.PROVINCIA := FDireccion.PROVINCIA; AContrato.CODIGO_POSTAL := FDireccion.CODIGO_POSTAL; finally FDireccion := NIL; end; AContrato.TELEFONO := APresupuesto.Cliente.TELEFONO_1; AContrato.MOVIL := APresupuesto.Cliente.MOVIL_1; AContrato.PERSONA_CONTACTO := APresupuesto.PERSONA_CONTACTO; AContrato.DataTable.FieldByName(fld_ContratosClientePLAZO_ENTREGA).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClientePLAZO_ENTREGA).AsVariant; AContrato.DataTable.FieldByName(fld_ContratosClienteOBSERVACIONES).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClienteOBSERVACIONES).AsVariant; AContrato.IMPORTE_NETO := APresupuesto.IMPORTE_NETO; AContrato.IMPORTE_PORTE := APresupuesto.IMPORTE_PORTE; AContrato.DESCUENTO := APresupuesto.DESCUENTO; AContrato.IMPORTE_DESCUENTO := APresupuesto.IMPORTE_DESCUENTO; AContrato.BASE_IMPONIBLE := APresupuesto.BASE_IMPONIBLE; AContrato.ID_TIPO_IVA := APresupuesto.ID_TIPO_IVA; AContrato.IVA := APresupuesto.IVA; AContrato.IMPORTE_IVA := APresupuesto.IMPORTE_IVA; AContrato.IMPORTE_TOTAL := APresupuesto.IMPORTE_TOTAL; AContrato.ID_VENDEDOR := APresupuesto.ID_VENDEDOR; AContrato.RECARGO_EQUIVALENCIA := APresupuesto.RECARGO_EQUIVALENCIA; AContrato.RE := APresupuesto.RE; AContrato.IMPORTE_RE := APresupuesto.IMPORTE_RE; AContrato.TIPO_CONTRATO := APresupuesto.TIPO_PRESUPUESTO; AContrato.REFERENCIA_CLIENTE := APresupuesto.REFERENCIA_CLIENTE; AContrato.ID_FORMA_PAGO := APresupuesto.ID_FORMA_PAGO; AContrato.DataTable.FieldByName(fld_ContratosClienteFORMA_PAGO).AsVariant := APresupuesto.DataTable.FieldByName(fld_PresupuestosClienteFORMA_PAGO).AsVariant; end; procedure CopiarDetallesAContrato( APresupuesto: IBizPresupuestoCliente; AContrato: IBizContratoCliente; AArticulos: IBizDetallesPresupuestoCliente); var i : integer; ADetalles : IBizDetallesContratoCliente; ADetallesController : IDetallesContratoClienteController; begin if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (CopiarDetallesAContrato)'); if not Assigned(APresupuesto) then raise Exception.Create ('Presupuesto no asignado (CopiarDetallesAContrato)'); if not Assigned(AArticulos) then raise Exception.Create ('Artículos no asignado (CopiarDetallesAContrato)'); if not AArticulos.DataTable.Active then AArticulos.DataTable.Active := True; // El contrato tiene que venir ya abierto y posicionado donde hay que copiar ADetalles := AContrato.Detalles; 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(ADetalles); AArticulos.DataTable.First; for i := 0 to AArticulos.DataTable.RecordCount - 1 do begin //En el caso de tener algún capitulo de cocina vacio (cocina de presupuestos) //se añade un capitulo de cocina con sus propiedades para el contrato if ((AArticulos.TIPO_DETALLE = TIPO_DETALLE_TITULO) and (AArticulos.TIPO_ARTICULO = TIPO_CAPITULO_C_VACIO)) then ADetallesController.AnadirCapitulo(TIPO_CAPITULO_C,'MUEBLES DE COCINA ', False, ADetalles); //En contratos ya no existirá ningún capitulo opcional todos sumarán if (AArticulos.TIPO_DETALLE = TIPO_DETALLE_TITULO_OPCIONAL) then ADetallesController.Add(ADetalles, TIPO_DETALLE_TITULO) else ADetallesController.Add(ADetalles, AArticulos.TIPO_DETALLE); ADetalles.Edit; ADetalles.REFERENCIA := AArticulos.REFERENCIA; ADetalles.ID_ARTICULO := AArticulos.ID_ARTICULO; ADetalles.TIPO_ARTICULO := AArticulos.TIPO_ARTICULO; ADetalles.PROPIEDAD := AArticulos.PROPIEDAD; ADetalles.CONCEPTO := AArticulos.CONCEPTO; if not AArticulos.CANTIDADIsNull then ADetalles.CANTIDAD := AArticulos.CANTIDAD; if not AArticulos.IMPORTE_UNIDADIsNull then ADetalles.IMPORTE_UNIDAD := AArticulos.IMPORTE_UNIDAD; if not AArticulos.IMPORTE_TOTALIsNull then ADetalles.IMPORTE_TOTAL := AArticulos.IMPORTE_TOTAL; if not AArticulos.DESCUENTOIsNull then ADetalles.DESCUENTO := AArticulos.DESCUENTO; if not AArticulos.IMPORTE_PORTEIsNull then ADetalles.IMPORTE_PORTE := AArticulos.IMPORTE_PORTE; ADetalles.VISIBLE := AArticulos.VISIBLE; ADetalles.VALORADO := AArticulos.VALORADO; ADetalles.REFERENCIA_PROVEEDOR := AArticulos.REFERENCIA_PROVEEDOR; ADetalles.Post; AArticulos.Next; end; finally ADetallesController.EndUpdate(ADetalles); ADetallesController := NIL; end; end; procedure Inicializar; begin dmGenerarContratosCli := TdmGenerarContratosCli.Create(nil); APresupuestosClienteController := TPresupuestosClienteController.Create; AContratosClienteController := TContratosClienteController.Create; AClientesController := TClientesController.Create; ADireccionesController := TDireccionesContactoController.Create; end; procedure Finalizar; begin FreeAndNIL(dmGenerarContratosCli); APresupuestosClienteController := nil; AContratosClienteController := nil; AClientesController := nil; ADireccionesController := nil; end; function GenerarContratoCli(const IDPresupuesto : Integer; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload; var APresupuesto : IBizPresupuestoCliente; AContrato : IBizContratoCliente; begin Result := False; try if not Assigned(APresupuestosClienteController) then Inicializar; APresupuesto := APresupuestosClienteController.Buscar(IDPresupuesto); if Assigned(APresupuesto) then Result := GenerarContratosCli(APresupuesto); //, AContrato); finally if Assigned(APresupuestosClienteController) then Finalizar; end; end; //Desactivamos la creación de contrato anterior //UN UNICO CONTRATO POR PRESUPUESTO { function GenerarContratoCli(APresupuesto : IBizPresupuestoCliente; var AContrato: IBizContratoCliente; const APreguntaMostrarContrato : Boolean = True) : Boolean; overload; begin AContrato := NIL; if not Assigned(APresupuesto) then raise Exception.Create('Presupuesto de cliente no asignado (GenerarContratoCli)'); if not APresupuesto.DataTable.Active then APresupuesto.DataTable.Active := True; if not Assigned(APresupuestosClienteController) then Inicializar; try AContrato := AContratosClienteController.Nuevo; AContrato.ID_EMPRESA := AppFactuGES.EmpresaActiva.ID; AContrato.ID_TIENDA := AppFactuGES.TiendaActiva.ID; AContrato.TIENDA := AppFactuGES.TiendaActiva.NOMBRE; CopiarPresupuestoAContrato(APresupuesto, AContrato); CopiarDetallesAContrato(APresupuesto, AContrato, APresupuesto.Detalles); //Sustituir por if de guardar if AContratosClienteController.Guardar(AContrato) then begin // Asocio el contrato al presupuesto APresupuesto.Edit; APresupuesto.ID_CONTRATO := AContrato.ID; APresupuesto.Post; APresupuestosClienteController.Guardar(APresupuesto); if APreguntaMostrarContrato then PreguntarMostrarContrato(AContrato); end; Result := True; finally if Assigned(APresupuestosClienteController) then Finalizar; end; end; } { function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean; overload; var APedido : IBizPedidoCliente; AAlbaran : IBizAlbaranCliente; begin Result := False; IDAlbaran := -1; AAlbaran := NIL; try if not Assigned(APedidosClienteController) then Inicializar; APedido := APedidosClienteController.ElegirPedidos(APedidosClienteController.BuscarPendientes, 'Elija el pedido de cliente que desea utilizar para dar de alta el albarán de cliente.' , False); if Assigned(APedido) then begin Result := GenerarAlbaranCli(APedido, AAlbaran); if Result then IDAlbaran := AAlbaran.ID; end; finally if Assigned(APedidosClienteController) then Finalizar; end; end; } function GenerarContratosCli : Boolean; overload; // Generara tantos contratos como clientes distintos tenga en la lista de presupuestos seleccionada var APresupuestos : IBizPresupuestoCliente; begin Result := False; try if not Assigned(APresupuestosClienteController) then Inicializar; APresupuestos := APresupuestosClienteController.ElegirPresupuestos(APresupuestosClienteController.BuscarSinContrato, 'Elija el presupuesto/s de cliente aceptado que desea utilizar para dar de alta el/los contrato/s correspondiente.' , True); if Assigned(APresupuestos) then Result := GenerarContratosCli(APresupuestos); finally if Assigned(APresupuestosClienteController) then Finalizar; end; end; function GenerarContratosCli(APresupuestos : IBizPresupuestoCliente) : Boolean; overload; var AContratosNuevos : IBizContratoCliente; i: Integer; ARespuesta : Integer; begin Result := False; if not Assigned(APresupuestosClienteController) then Inicializar; if not Assigned(APresupuestos) then raise Exception.Create('Presupuestos de cliente no asignado (GenerarContratosCli)'); if not APresupuestos.DataTable.Active then APresupuestos.DataTable.Active := True; try AContratosNuevos := AContratosClienteController.Nuevo(False); if AContratosClienteController.Anadir(AContratosNuevos, APresupuestos) then begin if AContratosNuevos.DataTable.RecordCount = 1 then begin with dmGenerarContratosCli.JsListaContratosGenerados do begin Instruction.Text := 'Se ha generado el contrato'; Content.Clear; Content.Add(Format('Se ha generado correctamente el contrato %s a partir del presupuesto de cliente seleccionado' + #10#13, [AContratosNuevos.REFERENCIA])); end; end else begin dmGenerarContratosCli.JsListaContratosGenerados.CustomButtons[0].Destroy; with dmGenerarContratosCli.JsListaContratosGenerados.Content do begin Clear; AContratosNuevos.DataTable.Last; for i := 0 to AContratosNuevos.DataTable.RecordCount - 1 do begin if Length(AContratosNuevos.REFERENCIA) > 0 then Add(AContratosNuevos.REFERENCIA + ': ' + AContratosNuevos.NOMBRE); AContratosNuevos.DataTable.Prior; end; end; end; dmGenerarContratosCli.JsListaContratosGenerados.Execute; ARespuesta := dmGenerarContratosCli.JsListaContratosGenerados.CustomButtonResult; case ARespuesta of 100 : begin // Ver el contrato AContratosClienteController.Ver(AContratosNuevos); end; 200 : // Continuar; end; end; finally AContratosNuevos := NIL; end; end; end.