unit uGenerarFacturasCliUtils; interface uses Windows, SysUtils, Classes, pngimage, JSDialog, uBizContratosCliente, uBizFacturasCliente; type TdmGenerarFacturasCli = class(TDataModule) JsListaFacturasGenerados: TJSDialog; end; function GenerarFacturaCli(const IDContrato : Integer) : Boolean; overload; function GenerarFacturaCli(AContrato : IBizContratoCliente; var AFactura: IBizFacturaCliente) : Boolean; overload; // function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean; implementation {$R *.dfm} uses uDialogUtils, uBizDetallesContratoCliente, uBizDetallesFacturaCliente, uContratosClienteController, uFacturasClienteController, uClientesController, uDetallesFacturaClienteController, uControllerDetallesBase, uBizContactos, schFacturasClienteClient_Intf, uFactuGES_App, schContratosClienteClient_Intf, uBizDetallesPresupuestoCliente, uCalculosUtils; var dmGenerarFacturasCli: TdmGenerarFacturasCli; AContratosClienteController : IContratosClienteController; AFacturasClienteController : IFacturasClienteController; AClientesController : IClientesController; { Métodos auxiliares } procedure CopiarContratoAFactura(AContrato: IBizContratoCliente; AFactura : IBizFacturaCliente); begin if not Assigned(AFactura) then raise Exception.Create ('Factura no asignado (CopiarContratoAFactura)'); if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (CopiarContratoAFactura)'); if not AContrato.DataTable.Active then AContrato.DataTable.Active := True; // La factura tiene que venir ya abierto y posicionado donde hay que copiar AFactura.ID_CLIENTE := AContrato.ID_CLIENTE; // Lo dejamos listo para que se localize la subcuenta contable asociada al cliente AFacturasClienteController.RecuperarCliente(AFactura); AFactura.Cliente.Open; AFactura.NIF_CIF := AContrato.NIF_CIF; AFactura.NOMBRE := AContrato.NOMBRE; AFactura.CALLE := AContrato.CALLE; AFactura.POBLACION := AContrato.POBLACION; AFactura.PROVINCIA := AContrato.PROVINCIA; AFactura.CODIGO_POSTAL := AContrato.CODIGO_POSTAL; // AFactura.PERSONA_CONTACTO := AContrato.PERSONA_CONTACTO; // AFactura.DataTable.FieldByName(fld_FacturasClientePLAZO_ENTREGA).AsVariant := AContrato.DataTable.FieldByName(fld_ContratosClientePLAZO_ENTREGA).AsVariant; AFactura.DataTable.FieldByName(fld_FacturasClienteOBSERVACIONES).AsVariant := AContrato.DataTable.FieldByName(fld_ContratosClienteOBSERVACIONES).AsVariant; AFactura.IMPORTE_NETO := AContrato.IMPORTE_NETO; AFactura.IMPORTE_PORTE := AContrato.IMPORTE_PORTE; AFactura.DESCUENTO := AContrato.DESCUENTO; AFactura.IMPORTE_DESCUENTO := AContrato.IMPORTE_DESCUENTO; AFactura.BASE_IMPONIBLE := AContrato.BASE_IMPONIBLE; AFactura.ID_TIPO_IVA := AContrato.ID_TIPO_IVA; AFactura.IVA := AContrato.IVA; AFactura.IMPORTE_IVA := AContrato.IMPORTE_IVA; AFactura.IMPORTE_TOTAL := AContrato.IMPORTE_TOTAL; // AFactura.ID_VENDEDOR := AContrato.ID_VENDEDOR; AFactura.RECARGO_EQUIVALENCIA := AContrato.RECARGO_EQUIVALENCIA; AFactura.RE := AContrato.RE; AFactura.IMPORTE_RE := AContrato.IMPORTE_RE; AFactura.ID_CONTRATO := AContrato.ID; AFactura.ID_FORMA_PAGO := AContrato.ID_FORMA_PAGO; end; procedure CopiarDetallesAFactura( AContrato: IBizContratoCliente; AFactura: IBizFacturaCliente; AArticulos: IBizDetallesContratoCliente); var i : integer; ADetalles : IBizDetallesFacturaCliente; ADetallesController : IDetallesFacturaClienteController; begin if not Assigned(AFactura) then raise Exception.Create ('Factura no asignada (CopiarDetallesAFactura)'); if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (CopiarDetallesAFactura)'); if not Assigned(AArticulos) then raise Exception.Create ('Artículos no asignado (CopiarDetallesAFatura)'); if not AArticulos.DataTable.Active then AArticulos.DataTable.Active := True; // El contrato tiene que venir ya abierto y posicionado donde hay que copiar ADetalles := AFactura.Detalles; ADetallesController := TDetallesFacturaClienteController.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 ADetallesController.Add(ADetalles, AArticulos.TIPO_DETALLE); ADetalles.Edit; ADetalles.REFERENCIA := AArticulos.REFERENCIA; ADetalles.ID_ARTICULO := AArticulos.ID_ARTICULO; if (AArticulos.PROPIEDAD <> '') then ADetalles.CONCEPTO := AArticulos.PROPIEDAD + ' '+ AArticulos.CONCEPTO else ADetalles.CONCEPTO := AArticulos.CONCEPTO; if not AArticulos.CANTIDADIsNull then ADetalles.CANTIDAD := AArticulos.CANTIDAD; if not AArticulos.IMPORTE_UNIDADIsNull then ADetalles.IMPORTE_UNIDAD := CalcularImporteNeto(AArticulos.IMPORTE_UNIDAD, AArticulos.INCREMENTO, AArticulos.DECREMENTO); 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.REFERENCIA_PROVEEDOR := AArticulos.REFERENCIA_PROVEEDOR; ADetalles.Post; AArticulos.Next; end; finally ADetallesController.EndUpdate(ADetalles); ADetallesController := NIL; end; end; procedure Inicializar; begin dmGenerarFacturasCli := TdmGenerarFacturasCli.Create(nil); AContratosClienteController := TContratosClienteController.Create; AFacturasClienteController := TFacturasClienteController.Create; AClientesController := TClientesController.Create; end; procedure Finalizar; begin FreeAndNIL(dmGenerarFacturasCli); AContratosClienteController := nil; AFacturasClienteController := nil; AClientesController := nil; end; function GenerarFacturaCli(const IDContrato : Integer) : Boolean; overload; var AContrato : IBizContratoCliente; AFactura : IBizFacturaCliente; begin Result := False; try if not Assigned(AContratosClienteController) then Inicializar; AContrato := AContratosClienteController.Buscar(IDContrato); if Assigned(AContrato) then Result := GenerarFacturaCli(AContrato, AFactura); finally if Assigned(AContratosClienteController) then Finalizar; end; end; function GenerarFacturaCli(AContrato : IBizContratoCliente; var AFactura: IBizFacturaCliente) : Boolean; overload; var ARespuesta : Integer; begin AFactura := NIL; if not Assigned(AContrato) then raise Exception.Create('Contrato de cliente no asignado (GenerarContratoCli)'); if not AContrato.DataTable.Active then AContrato.DataTable.Active := True; if not Assigned(AContratosClienteController) then Inicializar; try AFactura := AFacturasClienteController.Nuevo; AFactura.ID_EMPRESA := AppFactuGES.EmpresaActiva.ID; AFactura.ID_TIENDA := AContrato.ID_TIENDA; AFactura.TIENDA := AContrato.TIENDA; //Solicitado por Angélica, al generar una factura a partir del contrato, que se copie el IVA asignado en el contrato // AFactura.ID_TIPO_IVA := AppFactuGES.EmpresaActiva.ID_TIPO_IVA; //SIEMPRE SE ASIGNARÄ EL IVA DE LA EMPRESA ACTIVA CopiarContratoAFactura(AContrato, AFactura); CopiarDetallesAFactura(AContrato, AFactura, AContrato.Detalles); //Sustituir por if de guardar if AFacturasClienteController.Guardar(AFactura) then begin with dmGenerarFacturasCli.JsListaFacturasGenerados do begin Instruction.Text := 'Se ha generado la factura'; Content.Clear; Content.Add(Format('Se ha generado correctamente la factura %s a partir del contrato de cliente' + #10#13, [AFactura.REFERENCIA])); Execute; ARespuesta := CustomButtonResult; case ARespuesta of 100 : begin // Ver el albarán AFacturasClienteController.Ver(AFactura); end; 200 : // Continuar; end; end; end; Result := True; finally if Assigned(AContratosClienteController) 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; } end.