diff --git a/Build/Build.fbp5 b/Build/Build.fbp5 index 514ba2c3..5573f26d 100644 --- a/Build/Build.fbp5 +++ b/Build/Build.fbp5 @@ -15249,7 +15249,7 @@ Comments= - + 0 @@ -15260,12 +15260,12 @@ Comments= True 0 1252 - 11 + 12 Release False - + - False + True True False @@ -15273,7 +15273,7 @@ Comments= False False False - False + True True False False @@ -15283,15 +15283,15 @@ Comments= False False False - 3081 + 3082 - 0 + 1 0 0 False 0 - + True 0 @@ -15304,18 +15304,18 @@ Comments= False False False - [] + [usPackages,usCompiler,usLinker,usVersionInfo] False False @@ -15323,23 +15323,20 @@ Comments= False False False - True + False True True False False %package_path% - + False %modules_dcp_path% - True + False - True + False False True @@ -15353,7 +15350,7 @@ Comments= True %library_path% 0 - True + False 0 1048576 16384 @@ -15365,7 +15362,7 @@ Comments= False fa8 - True + False False True diff --git a/Database/scripts/factuges.sql b/Database/scripts/factuges.sql index f9559311..0a26be40 100644 --- a/Database/scripts/factuges.sql +++ b/Database/scripts/factuges.sql @@ -3105,6 +3105,7 @@ ALTER TABLE EMPRESAS_CONTACTOS ADD CONSTRAINT FK_EMPRESAS_CONTACTOS FOREIGN KEY ALTER TABLE EMPRESAS_DATOS_BANCO ADD CONSTRAINT FK_EMPRESAS_DATOS_BANCO FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE FACTURAS_CLIENTE ADD CONSTRAINT FK_FACTURAS_CLIENTE_EMPRESAS FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION; ALTER TABLE FACTURAS_PROVEEDOR ADD CONSTRAINT FK_FACTURAS_PROVEEDOR_EMPRESAS FOREIGN KEY (ID_EMPRESA) REFERENCES EMPRESAS (ID) ON DELETE NO ACTION ON UPDATE NO ACTION; +ALTER TABLE PEDIDOS_PROVEEDOR ADD CONSTRAINT FK_PEDIDOS_PROVEEDOR_1 FOREIGN KEY (ID_FACTURA) REFERENCES FACTURAS_PROVEEDOR (ID) ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE MOVIMIENTOS ADD CONSTRAINT FK_MOVIMIENTOS FOREIGN KEY (ID_ARTICULO) REFERENCES ARTICULOS (ID); ALTER TABLE MOVIMIENTOS ADD CONSTRAINT FK_MOVIMIENTOS2 FOREIGN KEY (ID_ALMACEN) REFERENCES ALMACENES (ID); ALTER TABLE PAGOS_CLIENTE ADD CONSTRAINT FK_PAGOS_CLIENTE FOREIGN KEY (ID_RECIBO) REFERENCES RECIBOS_CLIENTE (ID); diff --git a/Source/Base/Base.dproj b/Source/Base/Base.dproj index aba0a919..8f2d3b40 100644 --- a/Source/Base/Base.dproj +++ b/Source/Base/Base.dproj @@ -53,57 +53,57 @@ MainSource - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fConfigurarConexion
diff --git a/Source/Modulos/Albaranes de proveedor/Views/uEditorAlbaranesProveedor.dfm b/Source/Modulos/Albaranes de proveedor/Views/uEditorAlbaranesProveedor.dfm index 15d367b6..c4a0dbad 100644 --- a/Source/Modulos/Albaranes de proveedor/Views/uEditorAlbaranesProveedor.dfm +++ b/Source/Modulos/Albaranes de proveedor/Views/uEditorAlbaranesProveedor.dfm @@ -2,6 +2,7 @@ inherited fEditorAlbaranesProveedor: TfEditorAlbaranesProveedor Caption = 'Lista de albaranes de proveedor' ClientWidth = 606 ExplicitWidth = 614 + ExplicitHeight = 240 PixelsPerInch = 96 TextHeight = 13 inherited JvNavPanelHeader: TJvNavPanelHeader diff --git a/Source/Modulos/Albaranes de proveedor/Views/uEditorAlbaranesProveedor.pas b/Source/Modulos/Albaranes de proveedor/Views/uEditorAlbaranesProveedor.pas index 4529759d..0c8b4ebf 100644 --- a/Source/Modulos/Albaranes de proveedor/Views/uEditorAlbaranesProveedor.pas +++ b/Source/Modulos/Albaranes de proveedor/Views/uEditorAlbaranesProveedor.pas @@ -80,7 +80,7 @@ end; procedure TfEditorAlbaranesProveedor.actGenerarFacturaExecute(Sender: TObject); begin inherited; - GenerarFacturaProv(Albaranes.ID); + GenerarFacturaProvAlbProv(Albaranes.ID); actRefrescar.Execute; end; diff --git a/Source/Modulos/Facturas de proveedor/Controller/FacturasProveedor_controller.dproj b/Source/Modulos/Facturas de proveedor/Controller/FacturasProveedor_controller.dproj index 33722ea2..1594b53c 100644 --- a/Source/Modulos/Facturas de proveedor/Controller/FacturasProveedor_controller.dproj +++ b/Source/Modulos/Facturas de proveedor/Controller/FacturasProveedor_controller.dproj @@ -41,21 +41,21 @@ Delphi.Personality Package -FalseTrueFalseTrueFalseFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.01.0.0.0FacturasProveedor_controller.dpk +FalseTrueFalseFalseFalseFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.01.0.0.0FacturasProveedor_controller.dpk MainSource - - - - - - - - + + + + + + + + @@ -68,7 +68,7 @@ diff --git a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/PedProv_FacProv_relation.rc b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/PedProv_FacProv_relation.rc index e69de29b..153736af 100644 --- a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/PedProv_FacProv_relation.rc +++ b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/PedProv_FacProv_relation.rc @@ -0,0 +1,22 @@ +1 VERSIONINFO +FILEVERSION 1,0,0,0 +PRODUCTVERSION 1,0,0,0 +FILEFLAGSMASK 0x3FL +FILEFLAGS 0x00L +FILEOS 0x40004L +FILETYPE 0x1L +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0A04E4" + BEGIN + VALUE "FileVersion", "1.0.0.0\0" + VALUE "ProductVersion", "1.0.0.0\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0C0A, 1252 + END +END diff --git a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/PedProv_FacProv_relation.res b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/PedProv_FacProv_relation.res index 86c94e6a..8b251f31 100644 Binary files a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/PedProv_FacProv_relation.res and b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/PedProv_FacProv_relation.res differ diff --git a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedProvUtils.pas b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedProvUtils.pas deleted file mode 100644 index fc04178d..00000000 --- a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedProvUtils.pas +++ /dev/null @@ -1,234 +0,0 @@ -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. diff --git a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedProvUtils.dfm b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedUtils.dfm similarity index 98% rename from Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedProvUtils.dfm rename to Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedUtils.dfm index 182262d7..e035a753 100644 --- a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedProvUtils.dfm +++ b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedUtils.dfm @@ -1,4 +1,4 @@ -object dmGenerarFacturasProv: TdmGenerarFacturasProv +object dmGenerarFacturasProvPed: TdmGenerarFacturasProvPed OldCreateOrder = False Height = 176 Width = 254 diff --git a/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedUtils.pas b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedUtils.pas new file mode 100644 index 00000000..c88a9a52 --- /dev/null +++ b/Source/Modulos/Relaciones/Pedidos de proveedor - Facturas de proveedor/uGenerarFacturasProvPedUtils.pas @@ -0,0 +1,436 @@ +unit uGenerarFacturasProvPedUtils; + +interface + +uses + Windows, SysUtils, Classes, uBizPedidosProveedor, uBizFacturasProveedor, pngimage, JSDialog; + +type + TdmGenerarFacturasProvPed = class(TDataModule) + JsListaFacturasGeneradas: TJSDialog; + end; + + function GenerarFacturaProvPed(const IDPedido : Integer; const CopiarDetalles: Boolean = True) : Boolean; overload; + function GenerarFacturaProvPed(APedidos : IBizPedidoProveedor; const CopiarDetalles: Boolean = True) : Boolean; overload; + function GenerarFacturaProvPed : Boolean; overload; + + function GenerarFacturas(AFacturas : IBizFacturaProveedor; AListaPedidos : IBizPedidoProveedor; const CopiarDetalles: Boolean = True): Boolean; + +implementation + +{$R *.dfm} + +uses + uDialogUtils, uDADataTable, + uBizDetallesPedidoProveedor, + uPedidosProveedorController, uDetallesPedidoProveedorController, + uFacturasProveedorController, uControllerDetallesBase, + schPedidosProveedorClient_Intf, schFacturasProveedorClient_Intf, + uBizDetallesFacturaProveedor, uDetallesFacturaProveedorController; + +// , +// , uProveedoresController, +// , + + +// , uBizContactos, +// schPedidosProveedorClient_Intf; + +var + dmGenerarFacturasProvPed: TdmGenerarFacturasProvPed; + 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 CopiarArticulosPedido(AOrigen: IBizDetallesPedidoProveedor; + ADestino : IBizDetallesFacturaProveedor); +var + i : integer; + ADetallesController : IDetallesFacturaProveedorController; +begin + if not Assigned(AOrigen) then + raise Exception.Create ('Origen no asignado (CopiarArticulosPedido)'); + + if not Assigned(ADestino) then + raise Exception.Create ('Destino no asignado (CopiarArticulosPedido)'); + + if not AOrigen.DataTable.Active then + AOrigen.DataTable.Active := True; + + if not ADestino.DataTable.Active then + ADestino.DataTable.Active := True; + + 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(ADestino); + + AOrigen.DataTable.First; + for i := 0 to AOrigen.DataTable.RecordCount - 1 do + begin + ADetallesController.Add(ADestino, TIPO_DETALLE_CONCEPTO); + ADestino.Edit; + ADestino.REFERENCIA := AOrigen.REFERENCIA; + if AOrigen.ID_ARTICULO > 0 then + ADestino.ID_ARTICULO := AOrigen.ID_ARTICULO; + ADestino.CONCEPTO := AOrigen.CONCEPTO; + ADestino.CANTIDAD := AOrigen.CANTIDAD; + ADestino.IMPORTE_UNIDAD := AOrigen.IMPORTE_UNIDAD; + ADestino.IMPORTE_TOTAL := AOrigen.IMPORTE_TOTAL; + ADestino.DESCUENTO := AOrigen.DESCUENTO; + ADestino.IMPORTE_PORTE := AOrigen.IMPORTE_PORTE; + ADestino.VISIBLE := AOrigen.VISIBLE; + ADestino.REFERENCIA_PROVEEDOR := AOrigen.REFERENCIA_PROVEEDOR; + ADestino.Post; + AOrigen.Next; + end; + finally + ADetallesController.EndUpdate(ADestino); + ADetallesController := NIL; + end; +end; + +procedure Inicializar; +begin + dmGenerarFacturasProvPed := TdmGenerarFacturasProvPed.Create(nil); + APedidosProveedorController := TPedidosProveedorController.Create; + ADetallesPedidosProveedorController := TDetallesPedidoProveedorController.Create; + AFacturasProveedorController := TFacturasProveedorController.Create; +end; + +procedure Finalizar; +begin + FreeAndNIL(dmGenerarFacturasProvPed); + APedidosProveedorController := nil; + ADetallesPedidosProveedorController := nil; + AFacturasProveedorController := nil; +end; + + +function GenerarFacturaProvPed(const IDPedido : Integer; const CopiarDetalles: Boolean = True) : Boolean; overload; +var + APedido : IBizPedidoProveedor; +begin + Result := False; + if not Assigned(APedidosProveedorController) then + Inicializar; + + APedido := APedidosProveedorController.Buscar(IDPedido); + Result := GenerarFacturaProvPed(APedido, CopiarDetalles); + + if Assigned(APedidosProveedorController) then + Finalizar; +end; + +function GenerarFacturaProvPed(APedidos : IBizPedidoProveedor; const CopiarDetalles: Boolean = True) : Boolean; overload; +var + ARespuesta : Integer; + AFacturasNuevas : IBizFacturaProveedor; + i: Integer; +begin + Result := False; + + if not Assigned(APedidos) then + raise Exception.Create('Pedido de proveedor no asignado (GenerarFacturaProvPed)'); + + if not APedidos.DataTable.Active then + APedidos.DataTable.Active := True; + + if not Assigned(APedidosProveedorController) then + Inicializar; + + try + AFacturasNuevas := AFacturasProveedorController.Nuevo(False); + if GenerarFacturas(AFacturasNuevas, APedidos, CopiarDetalles) 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 dmGenerarFacturasProvPed.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; + dmGenerarFacturasProvPed.JsListaFacturasGeneradas.Execute; + end; + + Result := True; + end; + finally + AFacturasNuevas := NIL; + if Assigned(APedidosProveedorController) then + Finalizar; + end; +end; + +function GenerarFacturaProvPed : Boolean; overload; +var + APedidos : IBizPedidoProveedor; +begin + Result := False; + if not Assigned(APedidosProveedorController) then + Inicializar; + + APedidos := APedidosProveedorController.ElegirPedidos(APedidosProveedorController.BuscarSinFacturar, + 'Elija el pedido 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 := GenerarFacturaProvPed(APedidos); + + if Assigned(APedidosProveedorController) then + Finalizar; +end; + +function GenerarFacturas(AFacturas : IBizFacturaProveedor; AListaPedidos : IBizPedidoProveedor; const CopiarDetalles: Boolean = True): Boolean; +var + AFacturaActual : IBizFacturaProveedor; + APedidosController : IPedidosProveedorController; + I: Integer; + bEnEdicion : Boolean; + +begin + // ATENCIÓN!!! AFacturas tiene que estar vacio para no pisar facturas + // ya generadas. + if not Assigned(AFacturas) then + raise Exception.Create ('Factura no asignado (Anadir)'); + + if not Assigned(AListaPedidos) then + raise Exception.Create ('Pedidos no asignados (Anadir)'); + + if not AFacturas.DataTable.Active then + AFacturas.DataTable.Active := True; + + if not AListaPedidos.DataTable.Active then + AListaPedidos.DataTable.Active := True; + + APedidosController := TPedidosProveedorController.Create; + try + // Ordenar por fecha de albaran + AListaPedidos.DataTable.Sort([fld_PedidosProveedorFECHA_PEDIDO], [uDADataTable.sdAscending]); + AListaPedidos.First; + for I := 0 to AListaPedidos.DataTable.RecordCount - 1 do + begin + AListaPedidos._Proveedor := NIL; + AFacturaActual := NIL; + + // Busco si hay alguna factura ya hecha de ese Proveedor + AFacturas.DataTable.First; + if AFacturas.DataTable.Locate(fld_FacturasProveedorID_PROVEEDOR, AListaPedidos.ID_PROVEEDOR, []) then + begin + AFacturaActual := AFacturas; + AFacturasProveedorController.RecuperarProveedor(AFacturaActual); + AFacturaActual.Proveedor.DataTable.Active := True; + end + else begin + // No hay factura de ese Proveedor. Creo una nueva + AFacturasProveedorController.Anadir(AFacturas); + APedidosController.RecuperarProveedor(AListaPedidos); + AFacturas.Proveedor := AListaPedidos.Proveedor; + AFacturaActual := AFacturas; + end; + + // Ya tengo la factura. Le añado los conceptos del pedido + AFacturaActual.Detalles.DataTable.Last; + + //Se pone la referencia del pedido y el total y nos olvidamos de los detalles + if not CopiarDetalles then + begin + AFacturasProveedorController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_CONCEPTO); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := 'Pedido ' + AListaPedidos.REFERENCIA; + CANTIDAD := 1; + IMPORTE_UNIDAD := AListaPedidos.IMPORTE_TOTAL; //Tecsitel no utiliza el IVA en los pedidos por lo tanto el + //importe total es lo que queremos (IMPORTE_NETO+IMPORTE_PORTE) + Post; + end; + end + //Se copian los detalles del pedido a la factura + else + begin + // Añado el título + AFacturasProveedorController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_TITULO); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := 'Pedido ' + AListaPedidos.REFERENCIA + ' del ' + DateToStr(AListaPedidos.FECHA_PEDIDO); + Post; + end; + // Añado el contenido del presupuesto + CopiarArticulosPedido(AListaPedidos.Detalles, AFacturaActual.Detalles); + + //En el caso de tener porte el presupuesto se añade una fila con el importe + if (AListaPedidos.IMPORTE_PORTE > 0) then + begin + AFacturasProveedorController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_CONCEPTO); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := 'Porte del pedido'; + CANTIDAD := 1; + IMPORTE_UNIDAD := AListaPedidos.IMPORTE_PORTE; + Post; + end; + end; + + //En el caso de tener descuento (bonificación) el presupuesto se añade una fila con el importe +{ if (AListaPresupuestos.IMPORTE_DESCUENTO > 0) then + begin + AFacturasClienteController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_CONCEPTO); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := 'Bonificación ' + FloatToStr(AListaPresupuestos.DESCUENTO) + '%'; + CANTIDAD := -1; + IMPORTE_UNIDAD := AListaPresupuestos.IMPORTE_DESCUENTO; + Post; + end; + end; +} + // Añado el resumen + AFacturasProveedorController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_SUBTOTAL); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := 'Total del pedido ' + AListaPedidos.REFERENCIA; + Post; + end; + end; + + // Añado una línea en blanco + AFacturasProveedorController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_CONCEPTO); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := ''; + Post; + end; + + // Guardo la factura que acabo de generar o editar + AFacturaActual.CalcularImporteTotal; + AFacturasProveedorController.Guardar(AFacturaActual); + // Asocio la factura con el presupuesto + AListaPedidos.Edit; + AListaPedidos.ID_FACTURA := AFacturaActual.ID; + AListaPedidos.Post; + APedidosController.Guardar(AListaPedidos); + + AListaPedidos.Next; + end; + Result := True; + finally + APedidosController := NIL; + end; +end; + + +end. diff --git a/Source/Modulos/Relaciones/Presupuestos de cliente - Facturas de cliente/uGenerarFacturasCliPreCliUtils.pas b/Source/Modulos/Relaciones/Presupuestos de cliente - Facturas de cliente/uGenerarFacturasCliPreCliUtils.pas index a763a11a..ea200d84 100644 --- a/Source/Modulos/Relaciones/Presupuestos de cliente - Facturas de cliente/uGenerarFacturasCliPreCliUtils.pas +++ b/Source/Modulos/Relaciones/Presupuestos de cliente - Facturas de cliente/uGenerarFacturasCliPreCliUtils.pas @@ -185,7 +185,6 @@ begin APresupuestosClienteController := TPresupuestosClienteController.Create; ADetallesPresupuestosClienteController := TDetallesPresupuestoClienteController.Create; AFacturasClienteController := TFacturasClienteController.Create; -// AProveedoresController := TProveedoresController.Create; end; procedure Finalizar; @@ -194,7 +193,6 @@ begin APresupuestosClienteController := nil; ADetallesPresupuestosClienteController := nil; AFacturasClienteController := nil; -// AProveedoresController := nil; end; diff --git a/Source/Servidor/FactuGES_Server.RES b/Source/Servidor/FactuGES_Server.RES index e2e74863..d46a0c73 100644 Binary files a/Source/Servidor/FactuGES_Server.RES and b/Source/Servidor/FactuGES_Server.RES differ diff --git a/Source/Servidor/FactuGES_Server.dpr b/Source/Servidor/FactuGES_Server.dpr index 6a91b438..d7a128f2 100644 --- a/Source/Servidor/FactuGES_Server.dpr +++ b/Source/Servidor/FactuGES_Server.dpr @@ -117,18 +117,18 @@ uses schAlmacenesServer_Intf in '..\Modulos\Almacenes\Model\schAlmacenesServer_Intf.pas', schInventarioClient_Intf in '..\Modulos\Inventario\Model\schInventarioClient_Intf.pas', schInventarioServer_Intf in '..\Modulos\Inventario\Model\schInventarioServer_Intf.pas', - schPedidosProveedorClient_Intf in '..\Modulos\Pedidos a proveedor\Model\schPedidosProveedorClient_Intf.pas', - schPedidosProveedorServer_Intf in '..\Modulos\Pedidos a proveedor\Model\schPedidosProveedorServer_Intf.pas', schAlbaranesProveedorClient_Intf in '..\Modulos\Albaranes de proveedor\Model\schAlbaranesProveedorClient_Intf.pas', schAlbaranesProveedorServer_Intf in '..\Modulos\Albaranes de proveedor\Model\schAlbaranesProveedorServer_Intf.pas', schArticulosClient_Intf in '..\Modulos\Articulos\Model\schArticulosClient_Intf.pas', schArticulosServer_Intf in '..\Modulos\Articulos\Model\schArticulosServer_Intf.pas', uRptPresupuestosCliente_Server in '..\Modulos\Presupuestos de cliente\Reports\uRptPresupuestosCliente_Server.pas' {RptPresupuestosCliente: TDataModule}, uRptWordPresupuestoCliente in '..\Modulos\Presupuestos de cliente\Reports\uRptWordPresupuestoCliente.pas' {RptWordPresupuestoCliente: TDataModule}, - schFacturasProveedorClient_Intf in '..\Modulos\Facturas de proveedor\Model\schFacturasProveedorClient_Intf.pas', - schFacturasProveedorServer_Intf in '..\Modulos\Facturas de proveedor\Model\schFacturasProveedorServer_Intf.pas', schContactosClient_Intf in '..\Modulos\Contactos\Model\schContactosClient_Intf.pas', - schContactosServer_Intf in '..\Modulos\Contactos\Model\schContactosServer_Intf.pas'; + schContactosServer_Intf in '..\Modulos\Contactos\Model\schContactosServer_Intf.pas', + schPedidosProveedorClient_Intf in '..\Modulos\Pedidos a proveedor\Model\schPedidosProveedorClient_Intf.pas', + schPedidosProveedorServer_Intf in '..\Modulos\Pedidos a proveedor\Model\schPedidosProveedorServer_Intf.pas', + schFacturasProveedorClient_Intf in '..\Modulos\Facturas de proveedor\Model\schFacturasProveedorClient_Intf.pas', + schFacturasProveedorServer_Intf in '..\Modulos\Facturas de proveedor\Model\schFacturasProveedorServer_Intf.pas'; {$R *.res} {$R ..\Servicios\RODLFile.res} diff --git a/Source/Servidor/FactuGES_Server.rc b/Source/Servidor/FactuGES_Server.rc index b51f4147..1620c99b 100644 --- a/Source/Servidor/FactuGES_Server.rc +++ b/Source/Servidor/FactuGES_Server.rc @@ -14,7 +14,7 @@ BEGIN BEGIN VALUE "FileVersion", "1.2.3.0\0" VALUE "ProductVersion", "1.2.3.0\0" - VALUE "CompileDate", "miércoles, 20 de agosto de 2008 16:35\0" + VALUE "CompileDate", "jueves, 21 de agosto de 2008 13:44\0" END END BLOCK "VarFileInfo"