This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
LuisLeon_FactuGES2/Source/Modulos/Relaciones/Pedidos de cliente - Pedidos a proveedor/uGenerarPedidosProvUtils.pas

284 lines
10 KiB
ObjectPascal
Raw Blame History

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