git-svn-id: https://192.168.0.254/svn/Proyectos.LuisLeon_FactuGES2/trunk@238 b2cfbe5a-eba1-4a0c-8b32-7feea0a119f2
284 lines
10 KiB
ObjectPascal
284 lines
10 KiB
ObjectPascal
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.
|