unit uGenerarPedidosProvUtils; interface uses SysUtils, Classes, uBizPedidosCliente, pngimage, JSDialog; type TdmGenerarPedidosProv = class(TDataModule) JsListaPedidosGenerados: TJSDialog; end; function GenerarPedidosProv(const IDPedido : Integer) : Boolean; overload; function GenerarPedidosProv(APedidoCli : IBizPedidoCliente) : Boolean; overload; function GenerarPedidosProv : Boolean; overload; implementation {$R *.dfm} uses uDialogUtils, uPedidosClienteController, uPedidosProveedorController, uProveedoresController, uDetallesPedidoProveedorController, uControllerDetallesBase, uBizPedidosProveedor, 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; 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; ALista : 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); if not Assigned(AArticulosPend) then raise Exception.Create('Error al recuperar la lista de artículos pendientes de pedir (GenerarPedidosProv)'); ALista := TStringList.Create; try if not AArticulosPend.DataTable.Active then AArticulosPend.DataTable.Active := True; if AArticulosPend.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; APedidoProv := NIL; AArticulosPend.DataTable.First; while not AArticulosPend.DataTable.EOF do begin if Assigned(APedidoProv) and (AArticulosPend.ID_PROVEEDOR <> APedidoProv.ID_PROVEEDOR) then begin APedidosProveedorController.Guardar(APedidoProv); ALista.Add(APedidoProv.REFERENCIA + ': ' + APedidoProv.NOMBRE); APedidoProv := NIL; end; if not Assigned(APedidoProv) then begin APedidoProv := APedidosProveedorController.Nuevo; APedidoProv.Edit; APedidoProv.Proveedor := (AProveedoresController.Buscar(AArticulosPend.ID_PROVEEDOR) as IBizProveedor); APedidoProv.ID_PEDIDO_CLIENTE := APedidoCli.ID; 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 ADetallesController.BeginUpdate(APedidoProv.Detalles); ADetallesPedidosProvController.Add(APedidoProv.Detalles, TIPO_DETALLE_CONCEPTO); ADetallesPedidosProvController.AnadirArticulo(APedidoProv.Detalles, AArticulosPend.ID_ARTICULO); with APedidoProv.Detalles do begin Edit; CANTIDAD := AArticulosPend.CANT_PENDIENTE_PEDIR; Post; end; ADetallesController.EndUpdate(APedidoProv.Detalles); AArticulosPend.DataTable.Next; end; if Assigned(APedidoProv) then begin APedidosProveedorController.Guardar(APedidoProv); ALista.Add(APedidoProv.REFERENCIA + ': ' + APedidoProv.NOMBRE); APedidoProv := NIL; 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); 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.