unit uGenerarFacturasProvPedProvUtils; interface uses Windows, SysUtils, Classes, uBizPedidosProveedor, pngimage, JSDialog; type TdmGenerarFacturasProv = class(TDataModule) JsListaFacturasGeneradas: TJSDialog; end; function GenerarFacturaProv(const IDPedido : Integer) : Boolean; overload; function GenerarFacturaProv(APedidos : IBizPedidoProveedor) : Boolean; overload; function GenerarFacturaProv : Boolean; overload; implementation {$R *.dfm} uses uDialogUtils, uBizDetallesPedidoProveedor, uPedidosProveedorController, uDetallesPedidoProveedorController, uFacturasProveedorController, uBizFacturasProveedor, uBizDetallesFacturaProveedor; // , // , uProveedoresController, // , uControllerDetallesBase, // , uBizContactos, schPedidosClienteClient_Intf, // schPedidosProveedorClient_Intf; var dmGenerarFacturasProv: TdmGenerarFacturasProv; APedidosProveedorController : IPedidosProveedorController; ADetallesPedidosProveedorController : IDetallesPedidoProveedorController; AFacturasProveedorController : IFacturasProveedorController; // AProveedoresController : IProveedoresController; { Métodos auxiliares } {procedure CopiarPedidoAPedido(APedido: IBizPedidoCliente; APedido : IBizFacturaProveedor); begin if not Assigned(APedido) then raise Exception.Create ('Albarán no asignado (CopiarPedidoAPedido)'); if not Assigned(APedido) then raise Exception.Create ('Pedido no asignado (CopiarPedidoAPedido)'); if not APedido.DataTable.Active then APedido.DataTable.Active := True; // El albarán tiene que venir ya abierto y posicionado donde hay que copiar APedido.ID_CLIENTE := APedido.ID_CLIENTE; APedido.ID_PEDIDO := APedido.ID; APedido.CALLE := APedido.CALLE; APedido.CODIGO_POSTAL := APedido.CODIGO_POSTAL; APedido.POBLACION := APedido.POBLACION; APedido.PROVINCIA := APedido.PROVINCIA; APedido.PERSONA_CONTACTO := APedido.PERSONA_CONTACTO; APedido.TELEFONO := APedido.TELEFONO; APedido.IMPORTE_NETO := APedido.IMPORTE_NETO; APedido.IMPORTE_PORTE := APedido.IMPORTE_PORTE; APedido.DESCUENTO := APedido.DESCUENTO; APedido.IMPORTE_DESCUENTO := APedido.IMPORTE_DESCUENTO; APedido.BASE_IMPONIBLE := APedido.BASE_IMPONIBLE; APedido.IVA := APedido.IVA; APedido.IMPORTE_IVA := APedido.IMPORTE_IVA; APedido.IMPORTE_TOTAL := APedido.IMPORTE_TOTAL; APedido.DataTable.FieldByName(fld_PedidosClienteOBSERVACIONES).AsVariant := APedido.DataTable.FieldByName(fld_PedidosClienteOBSERVACIONES).AsVariant; APedido.ID_FORMA_PAGO := APedido.ID_FORMA_PAGO; end; procedure CopiarArticulosPendAPedido( APedido: IBizPedidoCliente; APedido: IBizFacturaProveedor; AArticulosPendientes: IBizPedidoClienteArticulosPend); var i : integer; ADetalles : IBizDetallesFacturaProveedor; ADetallesController : IDetallesFacturaProveedorController; begin if not Assigned(APedido) then raise Exception.Create ('Albarán no asignado (CopiarArticulosPendAPedido)'); if not Assigned(APedido) then raise Exception.Create ('Pedido no asignado (CopiarArticulosPendAPedido)'); if not Assigned(AArticulosPendientes) then raise Exception.Create ('Artículos pendientes no asignado (CopiarArticulosPendAPedido)'); if not AArticulosPendientes.DataTable.Active then AArticulosPendientes.DataTable.Active := True; // El albarán tiene que venir ya abierto y posicionado donde hay que copiar ADetalles := APedido.Detalles; ADetallesController := TDetallesFacturaProveedorController.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); AArticulosPendientes.DataTable.First; for i := 0 to AArticulosPendientes.DataTable.RecordCount - 1 do begin APedido.Detalles.First; if (APedido.Detalles.Locate('ID_ARTICULO', AArticulosPendientes.ID_ARTICULO, [])) then if (AArticulosPendientes.CANTIDAD_PENDIENTE > 0) then begin ADetallesController.Add(ADetalles, TIPO_DETALLE_CONCEPTO); ADetalles.Edit; ADetalles.REFERENCIA := APedido.Detalles.REFERENCIA; ADetalles.ID_ARTICULO := APedido.Detalles.ID_ARTICULO; ADetalles.CONCEPTO := APedido.Detalles.CONCEPTO; ADetalles.CANTIDAD := AArticulosPendientes.CANTIDAD_PENDIENTE; ADetalles.IMPORTE_UNIDAD := APedido.Detalles.IMPORTE_UNIDAD; ADetalles.IMPORTE_TOTAL := APedido.Detalles.IMPORTE_TOTAL; ADetalles.DESCUENTO := APedido.Detalles.DESCUENTO; ADetalles.IMPORTE_PORTE := APedido.Detalles.IMPORTE_PORTE; ADetalles.VISIBLE := APedido.Detalles.VISIBLE; ADetalles.REFERENCIA_PROVEEDOR := APedido.Detalles.REFERENCIA_PROVEEDOR; ADetalles.Post; AArticulosPendientes.Next; end; end; finally ADetallesController.EndUpdate(ADetalles); ADetallesController := NIL; end; end; } procedure Inicializar; begin dmGenerarFacturasProv := TdmGenerarFacturasProv.Create(nil); APedidosProveedorController := TPedidosProveedorController.Create; ADetallesPedidosProveedorController := TDetallesPedidoProveedorController.Create; AFacturasProveedorController := TFacturasProveedorController.Create; // AProveedoresController := TProveedoresController.Create; end; procedure Finalizar; begin FreeAndNIL(dmGenerarFacturasProv); APedidosProveedorController := nil; ADetallesPedidosProveedorController := nil; AFacturasProveedorController := nil; // AProveedoresController := nil; end; function GenerarFacturaProv(const IDPedido : Integer) : Boolean; overload; var APedido : IBizPedidoProveedor; begin Result := False; if not Assigned(APedidosProveedorController) then Inicializar; APedido := APedidosProveedorController.Buscar(IDPedido); Result := GenerarFacturaProv(APedido); if Assigned(APedidosProveedorController) then Finalizar; end; function GenerarFacturaProv(APedidos : IBizPedidoProveedor) : Boolean; overload; var ARespuesta : Integer; AFacturasNuevas : IBizFacturaProveedor; // AArticulos: IBizPedidoClienteArticulosPend; i: Integer; begin Result := False; if not Assigned(APedidosProveedorController) then Inicializar; if not Assigned(APedidos) then raise Exception.Create('Albarán de proveedor no asignado (GenerarFacturaProv)'); if not APedidos.DataTable.Active then APedidos.DataTable.Active := True; try AFacturasNuevas := AFacturasProveedorController.Nuevo(False); if AFacturasProveedorController.Anadir(AFacturasNuevas, APedidos.ID) then begin if AFacturasNuevas.DataTable.RecordCount = 1 then AFacturasProveedorController.Ver(AFacturasNuevas) else begin with dmGenerarFacturasProv.JsListaFacturasGeneradas.Content do begin Clear; AFacturasNuevas.DataTable.Last; for i := 0 to AFacturasNuevas.DataTable.RecordCount - 1 do begin if Length(AFacturasNuevas.REFERENCIA) > 0 then Add(AFacturasNuevas.REFERENCIA + ': ' + AFacturasNuevas.NOMBRE); AFacturasNuevas.DataTable.Prior; end; end; dmGenerarFacturasProv.JsListaFacturasGeneradas.Execute; end; // actRefrescar.Execute; end; finally AFacturasNuevas := NIL; end; end; function GenerarFacturaProv : Boolean; overload; var APedidos : IBizPedidoProveedor; begin { Result := False; if not Assigned(APedidosProveedorController) then Inicializar; APedidos := APedidosProveedorController.ElegirPedidos(APedidosProveedorController.BuscarSinFacturar, 'Elija el albarán o Pedidos de proveedor que desea utilizar para dar de alta la factura.' + #10#13 + 'Si elige Pedidos de proveedores diferentes se dará de alta una factura por cada uno de ellos.' , True); Result := GenerarFacturaProv(APedidos); if Assigned(APedidosProveedorController) then Finalizar; } end; end.