unit uGenerarPedidosProvUtils; interface uses SysUtils, Classes, uBizContratosCliente, uBizPedidosProveedor, pngimage, JSDialog; type TdmGenerarPedidosProv = class(TDataModule) JsListaPedidosGenerados: TJSDialog; JsListaPedidosAsignadosAContrato: TJSDialog; end; // function GenerarPedidosProv(const IDPedido : Integer) : Boolean; overload; // function GenerarPedidosProv(APedidoCli : IBizPedidoCliente) : Boolean; overload; // function GenerarPedidosProv : Boolean; overload; function AsignarContratoAPedidos(AContrato : IBizContratoCliente; var APedidos: IBizPedidoProveedor): Boolean; implementation {$R *.dfm} uses uDialogUtils, uContratosClienteController, uPedidosProveedorController, uProveedoresController, uDetallesPedidoProveedorController, uControllerDetallesBase, uBizContactos, schPedidosProveedorClient_Intf; var dmGenerarPedidosProv: TdmGenerarPedidosProv; AContratosClienteController : IContratosClienteController; APedidosProveedorController : IPedidosProveedorController; ADetallesPedidosProvController : IDetallesPedidoProveedorController; AProveedoresController : IProveedoresController; procedure Inicializar; begin dmGenerarPedidosProv := TdmGenerarPedidosProv.Create(nil); AContratosClienteController := TContratosClienteController.Create; APedidosProveedorController := TPedidosProveedorController.Create; ADetallesPedidosProvController := TDetallesPedidoProveedorController.Create; AProveedoresController := TProveedoresController.Create; end; procedure Finalizar; begin FreeAndNIL(dmGenerarPedidosProv); AContratosClienteController := nil; APedidosProveedorController := nil; ADetallesPedidosProvController := nil; AProveedoresController := nil; end; function AsignarContratoAPedidos(AContrato : IBizContratoCliente; var APedidos: IBizPedidoProveedor): Boolean; var i: integer; begin Result := False; if not Assigned(APedidos) then raise Exception.Create ('Pedidos no asignadas (AsignarContratoAPedidos)'); if not Assigned(AContrato) then raise Exception.Create ('Contrato no asignado (AsignarContratoAPedidos)'); if not APedidos.DataTable.Active then APedidos.DataTable.Active := True; if not Assigned(AContratosClienteController) then Inicializar; with dmGenerarPedidosProv.JsListaPedidosAsignadosAContrato do begin Content.Clear; APedidos.DataTable.First; for i := 0 to APedidos.DataTable.RecordCount - 1 do begin if (APedidos.SITUACION = SITUACION_PEDIDO_PENDIENTE) then begin APedidos.Edit; APedidos.ID_CONTRATO_CLIENTE := AContrato.ID; APedidos.REF_CON_CLIENTE := AContrato.REFERENCIA; APedidos.NOMBRE_CLIENTE := AContrato.NOMBRE_CLIENTE; Content.Add(APedidos.REFERENCIA + ': Asignado contrato ' + AContrato.REFERENCIA); APedidos.Post; Result := True; end else Content.Add(APedidos.REFERENCIA + ': El pedido está parcialmente recibido o recibido, por lo que no se puede modificar el contrato asociado ' + APedidos.REF_CON_CLIENTE); APedidos.Next; end; end; dmGenerarPedidosProv.JsListaPedidosAsignadosAContrato.Execute; APedidos.DataTable.ApplyUpdates; 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.