AbetoDesign_FactuGES2/Source/Modulos/Relaciones/Pedidos a proveedor - Contratos de cliente/uGenerarPedidosProvUtils.pas
2026-03-03 11:38:24 +01:00

236 lines
7.2 KiB
ObjectPascal
Raw Blame History

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