diff --git a/Build/Build.fbp5 b/Build/Build.fbp5 index 51ac3bc9..6ff531f2 100644 --- a/Build/Build.fbp5 +++ b/Build/Build.fbp5 @@ -14771,12 +14771,12 @@ Comments= True 0 1252 - 11 + 12 Release False - False + True True False @@ -14815,7 +14815,7 @@ Comments= False False False - [] + [usPackages,usCompiler,usLinker,usVersionInfo] False False False False False - True + False True True False @@ -14862,8 +14862,7 @@ Comments= False False True - - + %library_path% 0 True 0 diff --git a/Source/Modulos/Albaranes de cliente/AlbaranesCliente_Group.groupproj b/Source/Modulos/Albaranes de cliente/AlbaranesCliente_Group.groupproj index df930f8c..499b0286 100644 --- a/Source/Modulos/Albaranes de cliente/AlbaranesCliente_Group.groupproj +++ b/Source/Modulos/Albaranes de cliente/AlbaranesCliente_Group.groupproj @@ -12,6 +12,7 @@ + @@ -141,14 +142,23 @@ + + + + + + + + + - + - + - + \ No newline at end of file diff --git a/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dpk b/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dpk index c0194af4..89a6fdb7 100644 Binary files a/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dpk and b/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dpk differ diff --git a/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dproj b/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dproj index bfcd40cd..03b9e2c1 100644 --- a/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dproj +++ b/Source/Modulos/Albaranes de cliente/Views/AlbaranesCliente_view.dproj @@ -42,7 +42,11 @@ Delphi.Personality Package -FalseTrueFalseTrueFalseFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.01.0.0.0 +FalseTrueFalseFalseFalseFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.01.0.0.0 + + + + File c:\archivos de programa\borland\delphi10\Bin\dclIntraweb_80_100.bpl not found File c:\archivos de programa\borland\delphi10\Bin\dclnet100.bpl not found File c:\archivos de programa\borland\delphi10\Bin\dclsoap100.bpl not found @@ -54,25 +58,31 @@ MainSource - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +
fEditorAlbaranCliente
@@ -130,11 +140,6 @@
frViewElegirArticulosAlbaranesCliente
TFrame
- - - - - diff --git a/Source/Modulos/Relaciones/Albaranes de cliente - Facturas de cliente/uGenerarFacturasCliAlbCliUtils.pas b/Source/Modulos/Relaciones/Albaranes de cliente - Facturas de cliente/uGenerarFacturasCliAlbCliUtils.pas index a6131e3b..6decf921 100644 --- a/Source/Modulos/Relaciones/Albaranes de cliente - Facturas de cliente/uGenerarFacturasCliAlbCliUtils.pas +++ b/Source/Modulos/Relaciones/Albaranes de cliente - Facturas de cliente/uGenerarFacturasCliAlbCliUtils.pas @@ -3,7 +3,7 @@ unit uGenerarFacturasCliAlbCliUtils; interface uses - Windows, SysUtils, Classes, uBizAlbaranesCliente, pngimage, JSDialog; + Windows, SysUtils, Classes, uBizAlbaranesCliente, uBizFacturasCliente, pngimage, JSDialog; type TdmGenerarFacturasCli = class(TDataModule) @@ -14,24 +14,26 @@ type function GenerarFacturaCli(AAlbaran : IBizAlbaranCliente) : Boolean; overload; function GenerarFacturaCli : Boolean; overload; + function GenerarFacturas(AFacturas : IBizFacturaCliente; AListaAlbaranes : IBizAlbaranCliente): Boolean; + implementation {$R *.dfm} uses - uDialogUtils, - uBizFacturasCliente, - uBizDetallesFacturaCliente, + DB, uDialogUtils, uDADataTable, uControllerDetallesBase, + + uBizDetallesFacturaCliente, uBizDetallesAlbaranCliente, uAlbaranesClienteController, uDetallesFacturaClienteController, - uFacturasClienteController; + uFacturasClienteController, schFacturasClienteClient_Intf, schAlbaranesClienteClient_Intf; // , // , uProveedoresController, // , uControllerDetallesBase, -// , uBizContactos, schPedidosClienteClient_Intf, -// schAlbaranesClienteClient_Intf; +// , uBizContactos, , +// ; var dmGenerarFacturasCli: TdmGenerarFacturasCli; @@ -134,6 +136,56 @@ begin end; end; } +procedure CopiarArticulosAlbaran(AOrigen: IBizDetallesAlbaranCliente; + ADestino : IBizDetallesFacturaCliente); +var + i : integer; + ADetallesController : IDetallesFacturaClienteController; +begin + if not Assigned(AOrigen) then + raise Exception.Create ('Origen no asignado (CopiarArticulosAlbaran)'); + + if not Assigned(ADestino) then + raise Exception.Create ('Destino no asignado (CopiarArticulosAlbaran)'); + + if not AOrigen.DataTable.Active then + AOrigen.DataTable.Active := True; + + if not ADestino.DataTable.Active then + ADestino.DataTable.Active := True; + + 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(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 dmGenerarFacturasCli := TdmGenerarFacturasCli.Create(nil); @@ -184,18 +236,18 @@ var begin Result := False; - if not Assigned(AAlbaranesClienteController) then - Inicializar; - if not Assigned(AAlbaran) then raise Exception.Create('Albarán de proveedor no asignado (GenerarFacturaCli)'); if not AAlbaran.DataTable.Active then AAlbaran.DataTable.Active := True; + if not Assigned(AAlbaranesClienteController) then + Inicializar; + try AFacturasNuevas := AFacturasClienteController.Nuevo(False); - if AFacturasClienteController.Anadir(AFacturasNuevas, AAlbaran) then + if GenerarFacturas(AFacturasNuevas, AAlbaran) then begin if AFacturasNuevas.DataTable.RecordCount = 1 then begin @@ -220,11 +272,10 @@ begin end; end; - if Assigned(AAlbaranesClienteController) then - Finalizar; - finally AFacturasNuevas := NIL; + if Assigned(AAlbaranesClienteController) then + Finalizar; end; end; @@ -251,4 +302,127 @@ begin end; end; +function GenerarFacturas(AFacturas : IBizFacturaCliente; AListaAlbaranes : IBizAlbaranCliente): Boolean; +var + AFacturaActual : IBizFacturaCliente; + AAlbaranesController : IAlbaranesClienteController; + 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 asignada (Anadir)'); + + if not Assigned(AListaAlbaranes) then + raise Exception.Create ('Albaranes no asignados (Anadir)'); + + if not AFacturas.DataTable.Active then + AFacturas.DataTable.Active := True; + + if not AListaAlbaranes.DataTable.Active then + AListaAlbaranes.DataTable.Active := True; + +// ShowHourglassCursor; +// Application.ProcessMessages; + + AAlbaranesController := TAlbaranesClienteController.Create; + try + // Ordenar por fecha de albaran + AListaAlbaranes.DataTable.Sort([fld_AlbaranesClienteFECHA_ALBARAN], [uDADataTable.sdAscending]); + AListaAlbaranes.First; + for I := 0 to AListaAlbaranes.DataTable.RecordCount - 1 do + begin + AListaAlbaranes._Cliente := NIL; + AFacturaActual := NIL; + + // Busco si hay alguna factura ya hecha de ese cliente + AFacturas.DataTable.First; + if AFacturas.DataTable.Locate(fld_FacturasClienteID_CLIENTE, AListaAlbaranes.ID_CLIENTE, []) then + begin + AFacturaActual := AFacturas; + AFacturasClienteController.RecuperarCliente(AFacturaActual); + AFacturaActual.Cliente.DataTable.Active := True; + end + else begin + // No hay factura de ese cliente. Creo una nueva + AFacturasClienteController.Anadir(AFacturas); + AAlbaranesController.RecuperarCliente(AListaAlbaranes); + AListaAlbaranes.Cliente.DataTable.Active := True; + AFacturas.Cliente := AListaAlbaranes.Cliente; + + //Si el albaran es de tipo devolución hacemos la factura de tipo abono + if (AListaAlbaranes.TIPO = CTE_TIPO_ALBARAN_DEV) then + begin + bEnEdicion := (AFacturas.DataTable.State in dsEditModes); + if not bEnEdicion then + AFacturas.Edit; + AFacturas.TIPO := CTE_TIPO_ABONO; + AFacturas.Post; + if bEnEdicion then + AFacturas.Edit; + end; + + AFacturaActual := AFacturas; + end; + + // Ya tengo la factura. Le añado los conceptos del albarán + AFacturaActual.Detalles.DataTable.Last; + // Añado el título + AFacturasClienteController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_TITULO); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := 'Albarán ' + AListaAlbaranes.REFERENCIA + ' del ' + DateToStr(AListaAlbaranes.FECHA_ALBARAN); + Post; + end; + // Añado el contenido del albarán + CopiarArticulosAlbaran(AListaAlbaranes.Detalles, AFacturaActual.Detalles); + + AFacturasClienteController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_CONCEPTO); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := 'Porte del albarán'; + CANTIDAD := 1; + IMPORTE_UNIDAD := AListaAlbaranes.IMPORTE_PORTE; + Post; + end; + + // Añado el resumen + AFacturasClienteController.DetallesController.Add(AFacturaActual.Detalles, TIPO_DETALLE_SUBTOTAL); + with AFacturaActual.Detalles do + begin + Edit; + CONCEPTO := 'Total del albarán ' + AListaAlbaranes.REFERENCIA; + Post; + end; + + // Añado una línea en blanco + AFacturasClienteController.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; + AFacturasClienteController.Guardar(AFacturaActual); + // Asocio la factura con el albarán + AListaAlbaranes.Edit; + AListaAlbaranes.ID_FACTURA := AFacturaActual.ID; + AListaAlbaranes.Post; + AAlbaranesController.Guardar(AListaAlbaranes); + + AListaAlbaranes.Next; + end; + Result := True; + finally + AAlbaranesController := NIL; +// HideHourglassCursor + end; +end; + end. diff --git a/Source/Modulos/Relaciones/Albaranes de proveedor - Facturas de proveedor/uGenerarFacturasProvAlbProvUtils.pas b/Source/Modulos/Relaciones/Albaranes de proveedor - Facturas de proveedor/uGenerarFacturasProvAlbProvUtils.pas index 97673cb5..112125ca 100644 --- a/Source/Modulos/Relaciones/Albaranes de proveedor - Facturas de proveedor/uGenerarFacturasProvAlbProvUtils.pas +++ b/Source/Modulos/Relaciones/Albaranes de proveedor - Facturas de proveedor/uGenerarFacturasProvAlbProvUtils.pas @@ -247,15 +247,15 @@ var 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; + if not Assigned(AAlbaranesProveedorController) then + Inicializar; + try AFacturasNuevas := AFacturasProveedorController.Nuevo(False); if GenerarFacturas(AFacturasNuevas, AAlbaran) then @@ -285,6 +285,8 @@ begin finally AFacturasNuevas := NIL; + if Assigned(AAlbaranesClienteController) then + Finalizar; 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 688dc2f7..90a8e7a9 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 @@ -413,7 +413,7 @@ begin // Self.Guardar(AFacturaActual); // Asocio la factura con el presupuesto AListaPresupuestos.Edit; -// AListaPresupuestos.ID_FACTURA := AFacturaActual.ID; + AListaPresupuestos.ID_FACTURA := AFacturaActual.ID; AListaPresupuestos.Post; APresupuestosController.Guardar(AListaPresupuestos);