AlonsoYSal_FactuGES2/Source/Modulos/Relaciones/Pedidos de cliente - Pedidos a proveedor/uGenerarPedidosProvUtils.pas
2019-11-18 10:36:42 +00:00

188 lines
5.8 KiB
ObjectPascal
Raw Permalink Blame History

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<72>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<72>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.