unit uGenerarAlbaranesCliUtils; interface uses Windows, SysUtils, Classes, pngimage, JSDialog, uBizContratosCliente, uBizAlbaranesCliente; type TdmGenerarAlbaranesCli = class(TDataModule) JsListaAlbaranesGenerados: TJSDialog; end; function GenerarAlbaranCli(const IDContrato : Integer) : Boolean; overload; function GenerarAlbaranCli(AContrato : IBizContratoCliente; var AAlbaran: IBizAlbaranCliente) : Boolean; overload; // function ElegirPedidoYGenerarAlbaranCli(var IDAlbaran: Integer) : Boolean; implementation {$R *.dfm} uses uFactuGES_App, uDialogUtils, uBizDetallesContratoCliente, uBizDetallesAlbaranCliente, uContratosClienteController, uAlbaranesClienteController, uClientesController, uDetallesAlbaranClienteController, uControllerDetallesBase, uBizContactos, schContratosClienteClient_Intf, schAlbaranesClienteClient_Intf; var dmGenerarAlbaranesCli: TdmGenerarAlbaranesCli; AContratosClienteController : IContratosClienteController; AAlbaranesClienteController : IAlbaranesClienteController; ADetallesAlbaranesCliController : IDetallesAlbaranClienteController; AClientesController : IClientesController; { Métodos auxiliares } procedure CopiarContratoAAlbaran(AContrato: IBizContratoCliente; AAlbaran : IBizAlbaranCliente); begin if not Assigned(AAlbaran) then raise Exception.Create ('Albarán no asignado (CopiarContratoAAlbaran)'); if not Assigned(AContrato) then raise Exception.Create ('Pedido no asignado (CopiarContratoAAlbaran)'); if not AContrato.DataTable.Active then AContrato.DataTable.Active := True; // El albarán tiene que venir ya abierto y posicionado donde hay que copiar AAlbaran.ID_CLIENTE := AContrato.ID_CLIENTE; AAlbaran.ID_PEDIDO := AContrato.ID; AAlbaran.CALLE := AContrato.CALLE; AAlbaran.CODIGO_POSTAL := AContrato.CODIGO_POSTAL; AAlbaran.POBLACION := AContrato.POBLACION; AAlbaran.PROVINCIA := AContrato.PROVINCIA; AAlbaran.PERSONA_CONTACTO := AContrato.PERSONA_CONTACTO; AAlbaran.TELEFONO := AContrato.TELEFONO; AAlbaran.MOVIL := AContrato.MOVIL; AAlbaran.IMPORTE_NETO := AContrato.IMPORTE_NETO; AAlbaran.IMPORTE_PORTE := AContrato.IMPORTE_PORTE; AAlbaran.DESCUENTO := AContrato.DESCUENTO; AAlbaran.IMPORTE_DESCUENTO := AContrato.IMPORTE_DESCUENTO; AAlbaran.BASE_IMPONIBLE := AContrato.BASE_IMPONIBLE; AAlbaran.IVA := AContrato.IVA; AAlbaran.IMPORTE_IVA := AContrato.IMPORTE_IVA; AAlbaran.IMPORTE_TOTAL := AContrato.IMPORTE_TOTAL; AAlbaran.DataTable.FieldByName(fld_AlbaranesClienteOBSERVACIONES).AsVariant := AContrato.DataTable.FieldByName(fld_ContratosClienteOBSERVACIONES).AsVariant; AAlbaran.ID_FORMA_PAGO := AContrato.ID_FORMA_PAGO; AAlbaran.REFERENCIA_CLIENTE := AContrato.REFERENCIA_CLIENTE; end; procedure CopiarDetallesAAlbaran( AContrato: IBizContratoCliente; AAlbaran: IBizAlbaranCliente; AArticulos: IBizDetallesContratoCliente); var i : integer; ADetalles : IBizDetallesAlbaranCliente; ADetallesController : IDetallesAlbaranClienteController; begin if not Assigned(AAlbaran) then raise Exception.Create ('Albaran no asignado(CopiarDetallesAAlbaran)'); if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (CopiarDetallesAAlbaran)'); if not Assigned(AArticulos) then raise Exception.Create ('Artículos no asignado (CopiarDetallesAAlbaran)'); if not AArticulos.DataTable.Active then AArticulos.DataTable.Active := True; // El contrato tiene que venir ya abierto y posicionado donde hay que copiar ADetalles := AAlbaran.Detalles; ADetallesController := TDetallesAlbaranClienteController.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 := AArticulos.IMPORTE_UNIDAD; 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 dmGenerarAlbaranesCli := TdmGenerarAlbaranesCli.Create(nil); AContratosClienteController := TContratosClienteController.Create; AAlbaranesClienteController := TAlbaranesClienteController.Create; ADetallesAlbaranesCliController := TDetallesAlbaranClienteController.Create; AClientesController := TClientesController.Create; end; procedure Finalizar; begin FreeAndNIL(dmGenerarAlbaranesCli); AContratosClienteController := nil; AAlbaranesClienteController := nil; ADetallesAlbaranesCliController := nil; AClientesController := nil; end; function GenerarAlbaranCli(const IDContrato : Integer) : Boolean; overload; var Acontrato : IBizContratoCliente; AAlbaran : IBizAlbaranCliente; begin Result := False; try if not Assigned(AContratosClienteController) then Inicializar; Acontrato := AContratosClienteController.Buscar(IDContrato); if Assigned(Acontrato) then Result := GenerarAlbaranCli(Acontrato, AAlbaran); finally if Assigned(AContratosClienteController) then Finalizar; end; end; function GenerarAlbaranCli(AContrato : IBizContratoCliente; var AAlbaran: IBizAlbaranCliente) : Boolean; overload; var ARespuesta : Integer; AuxAlbaran : IBizAlbaranCliente; // AArticulosPendientes: IBizPedidoClienteArticulosPend; begin Result := False; AAlbaran := NIL; if not Assigned(AContrato) then raise Exception.Create('Pedido de cliente no asignado (GenerarAlbaranCli)'); if not AContrato.DataTable.Active then AContrato.DataTable.Active := True; if not Assigned(AContratosClienteController) then Inicializar; try { AArticulosPendientes := APedidosClienteController.ArticulosPendientes(APedido.ID); if not Assigned(AArticulosPendientes) then raise Exception.Create('Error al recuperar los artículos sin albarán del pedido (GenerarAlbaranCli)'); AArticulosPendientes.DataTable.Active := True; if AArticulosPendientes.DataTable.RecordCount = 0 then begin ShowWarningMessage('Generar albarán a partir del pedido', 'Todos los artículos de este pedido ya figuran en uno o más albaranes de cliente. Por lo que no se pueden generar nuevos albaranes para este pedido'); Exit; // Aunque es un exit, se ejecuta la parte del finally antes de salir. end; } AuxAlbaran := AAlbaranesClienteController.Nuevo; AuxAlbaran.ID_EMPRESA := AppFactuGES.EmpresaActiva.ID; AuxAlbaran.ID_TIENDA := AppFactuGES.TiendaActiva.ID; AuxAlbaran.TIENDA := AppFactuGES.TiendaActiva.NOMBRE; CopiarContratoAAlbaran(AContrato, AuxAlbaran); CopiarDetallesAAlbaran(AContrato, AuxAlbaran, AContrato.Detalles); //Sustituir por if de guardar if AAlbaranesClienteController.Guardar(AuxAlbaran) then begin AAlbaran := AuxAlbaran; with dmGenerarAlbaranesCli.JsListaAlbaranesGenerados do begin Instruction.Text := 'Se ha generado el albarán'; Content.Clear; Content.Add(Format('Se ha generado correctamente el albarán %s a partir del pedido de cliente' + #10#13, [AuxAlbaran.REFERENCIA])); Execute; ARespuesta := CustomButtonResult; case ARespuesta of 100 : begin // Ver el albarán AAlbaranesClienteController.Ver(AuxAlbaran); end; 200 : // Continuar; end; end; end; Result := True; finally // AArticulosPendientes := NIL; 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.