unit uGenerarFacturasProvAlbProvUtils; interface uses Windows, SysUtils, Classes, uBizAlbaranesProveedor, pngimage, JSDialog; type TdmGenerarFacturasProv = class(TDataModule) JsListaFacturasGeneradas: TJSDialog; end; function GenerarFacturaProv(const IDAlbaran : Integer) : Boolean; overload; function GenerarFacturaProv(AAlbaran : IBizAlbaranProveedor) : Boolean; overload; function GenerarFacturaProv : Boolean; overload; implementation {$R *.dfm} uses uDialogUtils, uBizFacturasProveedor, uBizDetallesFacturaProveedor, uAlbaranesProveedorController, uDetallesFacturaProveedorController, uFacturasProveedorController; // , // , uProveedoresController, // , uControllerDetallesBase, // , uBizContactos, schPedidosClienteClient_Intf, // schAlbaranesProveedorClient_Intf; var dmGenerarFacturasProv: TdmGenerarFacturasProv; AFacturasProveedorController : IFacturasProveedorController; AAlbaranesProveedorController : IAlbaranesProveedorController; ADetallesAlbaranesProveedorController : IDetallesFacturaProveedorController; // AProveedoresController : IProveedoresController; { Métodos auxiliares } {procedure CopiarPedidoAAlbaran(AAlbaran: IBizPedidoCliente; AAlbaran : IBizAlbaranProveedor); begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (CopiarPedidoAAlbaran)'); if not Assigned(AAlbaran) then raise Exception.Create ('Pedido no asignado (CopiarPedidoAAlbaran)'); if not AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; // El albarán tiene que venir ya abierto y posicionado donde hay que copiar AAlbaran.ID_CLIENTE := AAlbaran.ID_CLIENTE; AAlbaran.ID_PEDIDO := AAlbaran.ID; AAlbaran.CALLE := AAlbaran.CALLE; AAlbaran.CODIGO_POSTAL := AAlbaran.CODIGO_POSTAL; AAlbaran.POBLACION := AAlbaran.POBLACION; AAlbaran.PROVINCIA := AAlbaran.PROVINCIA; AAlbaran.PERSONA_CONTACTO := AAlbaran.PERSONA_CONTACTO; AAlbaran.TELEFONO := AAlbaran.TELEFONO; AAlbaran.IMPORTE_NETO := AAlbaran.IMPORTE_NETO; AAlbaran.IMPORTE_PORTE := AAlbaran.IMPORTE_PORTE; AAlbaran.DESCUENTO := AAlbaran.DESCUENTO; AAlbaran.IMPORTE_DESCUENTO := AAlbaran.IMPORTE_DESCUENTO; AAlbaran.BASE_IMPONIBLE := AAlbaran.BASE_IMPONIBLE; AAlbaran.IVA := AAlbaran.IVA; AAlbaran.IMPORTE_IVA := AAlbaran.IMPORTE_IVA; AAlbaran.IMPORTE_TOTAL := AAlbaran.IMPORTE_TOTAL; AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteOBSERVACIONES).AsVariant := AAlbaran.DataTable.FieldByName(fld_PedidosClienteOBSERVACIONES).AsVariant; AAlbaran.ID_FORMA_PAGO := AAlbaran.ID_FORMA_PAGO; end; procedure CopiarArticulosPendAAlbaran( AAlbaran: IBizPedidoCliente; AAlbaran: IBizAlbaranProveedor; AArticulosPendientes: IBizPedidoClienteArticulosPend); var i : integer; ADetalles : IBizDetallesFacturaProveedor; ADetallesController : IDetallesFacturaProveedorController; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (CopiarArticulosPendAAlbaran)'); if not Assigned(AAlbaran) then raise Exception.Create ('Pedido no asignado (CopiarArticulosPendAAlbaran)'); if not Assigned(AArticulosPendientes) then raise Exception.Create ('Artículos pendientes no asignado (CopiarArticulosPendAAlbaran)'); 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 := AAlbaran.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 AAlbaran.Detalles.First; if (AAlbaran.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 := AAlbaran.Detalles.REFERENCIA; ADetalles.ID_ARTICULO := AAlbaran.Detalles.ID_ARTICULO; ADetalles.CONCEPTO := AAlbaran.Detalles.CONCEPTO; ADetalles.CANTIDAD := AArticulosPendientes.CANTIDAD_PENDIENTE; ADetalles.IMPORTE_UNIDAD := AAlbaran.Detalles.IMPORTE_UNIDAD; ADetalles.IMPORTE_TOTAL := AAlbaran.Detalles.IMPORTE_TOTAL; ADetalles.DESCUENTO := AAlbaran.Detalles.DESCUENTO; ADetalles.IMPORTE_PORTE := AAlbaran.Detalles.IMPORTE_PORTE; ADetalles.VISIBLE := AAlbaran.Detalles.VISIBLE; ADetalles.REFERENCIA_PROVEEDOR := AAlbaran.Detalles.REFERENCIA_PROVEEDOR; ADetalles.Post; AArticulosPendientes.Next; end; end; finally ADetallesController.EndUpdate(ADetalles); ADetallesController := NIL; end; end; } procedure Inicializar; begin dmGenerarFacturasProv := TdmGenerarFacturasProv.Create(nil); AFacturasProveedorController := TFacturasProveedorController.Create; AAlbaranesProveedorController := TAlbaranesProveedorController.Create; ADetallesAlbaranesProveedorController := TDetallesFacturaProveedorController.Create; // AProveedoresController := TProveedoresController.Create; end; procedure Finalizar; begin FreeAndNIL(dmGenerarFacturasProv); AFacturasProveedorController := nil; AAlbaranesProveedorController := nil; ADetallesAlbaranesProveedorController := nil; // AProveedoresController := nil; end; function GenerarFacturaProv(const IDAlbaran : Integer) : Boolean; overload; var AAlbaran : IBizAlbaranProveedor; begin Result := False; try if not Assigned(AAlbaranesProveedorController) then Inicializar; AAlbaran := AAlbaranesProveedorController.Buscar(IDAlbaran); if Assigned(AAlbaran) then Result := GenerarFacturaProv(AAlbaran); if Assigned(AAlbaranesProveedorController) then Finalizar; finally AAlbaran := NIL; end; end; function GenerarFacturaProv(AAlbaran : IBizAlbaranProveedor) : Boolean; overload; var AFacturasNuevas : IBizFacturaProveedor; i: Integer; begin Result := False; if not Assigned(AAlbaranesProveedorController) then Inicializar; if not Assigned(AAlbaran) then raise Exception.Create('Albarán de proveedor no asignado (GenerarFacturaProv)'); if not AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; try AFacturasNuevas := AFacturasProveedorController.Nuevo(False); if AFacturasProveedorController.Anadir(AFacturasNuevas, AAlbaran) then begin if AFacturasNuevas.DataTable.RecordCount = 1 then begin if AFacturasNuevas.TIPO = CTE_TIPO_FACTURA then ShowInfoMessage('La factura se ha dado de alta con el código ' + AFacturasNuevas.REFERENCIA) else ShowInfoMessage('El abono se ha dado de alta con el código ' + AFacturasNuevas.REFERENCIA); end 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; end; finally AFacturasNuevas := NIL; end; end; function GenerarFacturaProv : Boolean; overload; var AAlbaranes : IBizAlbaranProveedor; begin Result := False; try if not Assigned(AAlbaranesProveedorController) then Inicializar; AAlbaranes := AAlbaranesProveedorController.ElegirAlbaranes(AAlbaranesProveedorController.BuscarSinFacturar, 'Elija el albarán o albaranes de proveedor que desea utilizar para dar de alta la factura.' + #10#13 + 'Si elige albaranes de proveedores diferentes se dará de alta una factura por cada uno de ellos.' , True); if Assigned(AAlbaranes) then Result := GenerarFacturaProv(AAlbaranes); if Assigned(AAlbaranesProveedorController) then Finalizar; finally AAlbaranes := Nil; end; end; end.