unit uGenerarPedidosProvUtils; interface uses SysUtils, Classes, uBizPedidosCliente, pngimage, JSDialog, dxGDIPlusClasses; type TdmGenerarPedidosProv = class(TDataModule) JsListaPedidosGenerados: TJSDialog; JsListaArticulosSinProveedor: TJSDialog; end; function GenerarPedidosProv(const IDPedido : Integer) : Boolean; overload; function GenerarPedidosProv(APedidoCli : IBizPedidoCliente) : Boolean; overload; function GenerarPedidosProv : Boolean; overload; implementation {$R *.dfm} uses uDialogUtils, Windows, uRTFUtils, uPedidosClienteController, uPedidosProveedorController, uProveedoresController, uDetallesPedidoProveedorController, uControllerDetallesBase, uBizPedidosProveedor, uBizDetallesPedidoProveedor, uBizContactos, schPedidosProveedorClient_Intf; var dmGenerarPedidosProv: TdmGenerarPedidosProv; APedidosClienteController : IPedidosClienteController; APedidosProveedorController : IPedidosProveedorController; ADetallesPedidosProvController : IDetallesPedidoProveedorController; AProveedoresController : IProveedoresController; procedure Inicializar; begin dmGenerarPedidosProv := TdmGenerarPedidosProv.Create(nil); APedidosClienteController := TPedidosClienteController.Create; APedidosProveedorController := TPedidosProveedorController.Create; ADetallesPedidosProvController := TDetallesPedidoProveedorController.Create; AProveedoresController := TProveedoresController.Create; end; procedure Finalizar; begin FreeAndNIL(dmGenerarPedidosProv); APedidosClienteController := nil; APedidosProveedorController := nil; ADetallesPedidosProvController := nil; AProveedoresController := nil; end; procedure AnadirLineasNoArticulos(AOrigen: IBizPedidoClienteArticulosPendientesPedirAProv; ADestino : IBizDetallesPedidoProveedor); var i : integer; begin if not Assigned(AOrigen) then raise Exception.Create ('Origen no asignado (AnadirLineasNoArticulos)'); if not Assigned(ADestino) then raise Exception.Create ('Destino no asignado (AnadirLineasNoArticulos)'); if not AOrigen.DataTable.Active then AOrigen.DataTable.Active := True; if not ADestino.DataTable.Active then ADestino.DataTable.Active := True; 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 ADetallesPedidosProvController.BeginUpdate(ADestino); AOrigen.DataTable.First; for i := 0 to AOrigen.DataTable.RecordCount - 1 do begin ADetallesPedidosProvController.Add(ADestino, TIPO_DETALLE_CONCEPTO); ADestino.Edit; ADestino.CONCEPTO := AOrigen.CONCEPTO; ADestino.CANTIDAD := AOrigen.CANT_PENDIENTE_PEDIR; // ADestino.IMPORTE_UNIDAD := AOrigen.IMPORTE_UNIDAD; // ADestino.IMPORTE_TOTAL := AOrigen.IMPORTE_TOTAL; // ADestino.DESCUENTO := AOrigen.DESCUENTO; // ADestino.IMPORTE_PORTE := AOrigen.IMPORTE_PORTE; ADestino.Post; AOrigen.Next; end; finally ADetallesPedidosProvController.EndUpdate(ADestino); end; end; function GenerarPedidosProv(const IDPedido : Integer) : Boolean; overload; var APedido : IBizPedidoCliente; begin Result := False; try if not Assigned(APedidosClienteController) then Inicializar; APedido := APedidosClienteController.Buscar(IDPedido); if Assigned(APedido) then Result := GenerarPedidosProv(APedido); finally if Assigned(APedidosClienteController) then Finalizar; end; end; function GenerarPedidosProv(APedidoCli : IBizPedidoCliente) : Boolean; overload; var APedidoProv : IBizPedidoProveedor; AArticulosPend : IBizPedidoClienteArticulosPendientesPedirAProv; AArticulosPendNoArticulos : IBizPedidoClienteArticulosPendientesPedirAProv; bAnadirNoArticulos: Boolean; ALista : TStringList; AListaArticulosSinProveedor : TStringList; begin Result := False; if not Assigned(APedidoCli) then raise Exception.Create('Pedido de cliente no asignado (GenerarPedidosProv)'); if not APedidoCli.DataTable.Active then APedidoCli.DataTable.Active := True; if not Assigned(APedidosClienteController) then Inicializar; AArticulosPend := APedidosClienteController.BuscarPendientesPedir(APedidoCli.ID); AArticulosPendNoArticulos := APedidosClienteController.BuscarPendientesPedirNoArticulos(APedidoCli.ID); if not Assigned(AArticulosPend) or not Assigned(AArticulosPendNoArticulos) then raise Exception.Create('Error al recuperar la lista de artículos pendientes de pedir (GenerarPedidosProv)'); ALista := TStringList.Create; AListaArticulosSinProveedor := TStringList.Create; try if not AArticulosPend.DataTable.Active then AArticulosPend.DataTable.Active := True; if not AArticulosPendNoArticulos.DataTable.Active then AArticulosPendNoArticulos.DataTable.Active := True; if (AArticulosPend.DataTable.RecordCount = 0) and (AArticulosPendNoArticulos.DataTable.RecordCount = 0) then begin ShowInfoMessage('Este pedido a cliente no tiene artículos pendientes que se tengan que pedir a los proveedores'); Exit; end; bAnadirNoArticulos := False; if (AArticulosPendNoArticulos.DataTable.RecordCount > 0) then bAnadirNoArticulos := (ShowConfirmMessage('Articulos', 'Desea añadir en el/los pedido/s a proveedor las lineas que no se corresponden con artículos (lineas texto libre)') = IDYES); APedidoProv := NIL; AArticulosPend.DataTable.First; while not AArticulosPend.DataTable.EOF do begin if Assigned(APedidoProv) and (AArticulosPend.ID_PROVEEDOR <> APedidoProv.ID_PROVEEDOR) then begin // AnadirLineasNoArticulos(AArticulosPendNoArticulos, APedidoProv.Detalles); AArticulosPendNoArticulos.DataTable.First; //siempre que empezamos a rellenar un pedido hay que empezar el recorrido de las descripciones libres para irlas metiendo y conservar el orden APedidosProveedorController.Guardar(APedidoProv); ALista.Add(APedidoProv.REFERENCIA + ': ' + APedidoProv.NOMBRE); APedidoProv := NIL; end; if not Assigned(APedidoProv) then begin APedidoProv := APedidosProveedorController.Nuevo; APedidoProv.Edit; while (AArticulosPend.ID_PROVEEDOR = 0) do begin AListaArticulosSinProveedor.Add(RtfToText(AArticulosPend.CONCEPTO)); AArticulosPend.Next; end; APedidoProv.Proveedor := (AProveedoresController.Buscar(AArticulosPend.ID_PROVEEDOR) as IBizProveedor); APedidoProv.ID_PEDIDO_CLIENTE := APedidoCli.ID; APedidoProv.REFERENCIA_CLIENTE := APedidoCli.REFERENCIA_CLIENTE; end; //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 ADetallesPedidosProvController.BeginUpdate(APedidoProv.Detalles); //si la posicion de la lineas descripcion es menor que el articulo que vamos a añadir, añadimos primero la linea descripcion while (not AArticulosPendNoArticulos.EOF) and (AArticulosPend.POSICION > AArticulosPendNoArticulos.POSICION) do begin ADetallesPedidosProvController.Add(APedidoProv.Detalles, TIPO_DETALLE_CONCEPTO); with APedidoProv.Detalles do begin Edit; CONCEPTO := AArticulosPendNoArticulos.CONCEPTO; CANTIDAD := AArticulosPendNoArticulos.CANT_PENDIENTE_PEDIR; // IMPORTE_UNIDAD := AArticulosPendNoArticulos.IMPORTE_UNIDAD; // IMPORTE_TOTAL := AArticulosPendNoArticulos.IMPORTE_TOTAL; // DESCUENTO := AArticulosPendNoArticulos.DESCUENTO; // IMPORTE_PORTE := AArticulosPendNoArticulos.IMPORTE_PORTE; Post; AArticulosPendNoArticulos.Next; end; end; ADetallesPedidosProvController.Add(APedidoProv.Detalles, TIPO_DETALLE_CONCEPTO); ADetallesPedidosProvController.AnadirArticulo(APedidoProv.Detalles, AArticulosPend.ID_ARTICULO); with APedidoProv.Detalles do begin Edit; CONCEPTO := AArticulosPend.CONCEPTO; CANTIDAD := AArticulosPend.CANT_PENDIENTE_PEDIR; Post; end; ADetallesPedidosProvController.EndUpdate(APedidoProv.Detalles); AArticulosPend.DataTable.Next; end; if Assigned(APedidoProv) then begin // AnadirLineasNoArticulos(AArticulosPendNoArticulos, APedidoProv.Detalles); AArticulosPendNoArticulos.DataTable.First; //siempre que empezamos a rellenar un pedido hay que empezar el recorrido de las descripciones libres para irlas metiendo y conservar el orden APedidosProveedorController.Guardar(APedidoProv); ALista.Add(APedidoProv.REFERENCIA + ': ' + APedidoProv.NOMBRE); APedidoProv := NIL; end; if AListaArticulosSinProveedor.Count > 0 then begin dmGenerarPedidosProv.JsListaArticulosSinProveedor.Content.Clear; dmGenerarPedidosProv.JsListaArticulosSinProveedor.Content.AddStrings(AListaArticulosSinProveedor); dmGenerarPedidosProv.JsListaArticulosSinProveedor.Execute; end; if ALista.Count > 0 then begin dmGenerarPedidosProv.JsListaPedidosGenerados.Content.Clear; dmGenerarPedidosProv.JsListaPedidosGenerados.Content.AddStrings(ALista); dmGenerarPedidosProv.JsListaPedidosGenerados.Execute; end; Result := True; finally FreeAndNIL(ALista); FreeAndNIL(AListaArticulosSinProveedor); AArticulosPend := NIL; if Assigned(APedidosClienteController) then Finalizar; end; end; function GenerarPedidosProv : Boolean; overload; var APedidoCli : IBizPedidoCliente; begin Result := False; try if not Assigned(APedidosClienteController) then Inicializar; APedidoCli := APedidosClienteController.ElegirPedidos(APedidosClienteController.BuscarPendientes, 'Elija el pedido de cliente que desea utilizar para dar de alta el pedido o pedidos a proveedor.' , False); if Assigned(APedidoCli) then Result := GenerarPedidosProv(APedidoCli); finally if Assigned(APedidosClienteController) then Finalizar; end; end; end.