2010-08-11 10:53:06 +00:00
unit uGenerarPedidosProvUtils;
interface
uses
2013-06-25 17:03:57 +00:00
SysUtils, Classes, uBizPedidosCliente, pngimage, JSDialog, dxGDIPlusClasses;
2010-08-11 10:53:06 +00:00
type
TdmGenerarPedidosProv = class( TDataModule)
JsListaPedidosGenerados: TJSDialog;
2013-06-25 17:03:57 +00:00
JsListaArticulosSinProveedor: TJSDialog;
2010-08-11 10:53:06 +00:00
end ;
function GenerarPedidosProv( const IDPedido : Integer ) : Boolean ; overload ;
function GenerarPedidosProv( APedidoCli : IBizPedidoCliente) : Boolean ; overload ;
function GenerarPedidosProv : Boolean ; overload ;
implementation
{$R *.dfm}
uses
2013-06-25 17:03:57 +00:00
uDialogUtils, Windows, uRTFUtils,
2010-08-11 10:53:06 +00:00
uPedidosClienteController, uPedidosProveedorController, uProveedoresController,
uDetallesPedidoProveedorController, uControllerDetallesBase,
2013-06-25 17:03:57 +00:00
uBizPedidosProveedor, uBizDetallesPedidoProveedor, uBizContactos, schPedidosProveedorClient_Intf;
2010-08-11 10:53:06 +00:00
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 ;
2013-06-25 17:03:57 +00:00
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 ;
2010-08-11 10:53:06 +00:00
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;
2013-06-25 17:03:57 +00:00
AArticulosPendNoArticulos : IBizPedidoClienteArticulosPendientesPedirAProv;
bAnadirNoArticulos: Boolean ;
2010-08-11 10:53:06 +00:00
ALista : TStringList;
2013-06-25 17:03:57 +00:00
AListaArticulosSinProveedor : TStringList;
2010-08-11 10:53:06 +00:00
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) ;
2013-06-25 17:03:57 +00:00
AArticulosPendNoArticulos : = APedidosClienteController. BuscarPendientesPedirNoArticulos( APedidoCli. ID) ;
if not Assigned( AArticulosPend)
or not Assigned( AArticulosPendNoArticulos) then
2010-08-11 10:53:06 +00:00
raise Exception. Create( 'Error al recuperar la lista de art<72> culos pendientes de pedir (GenerarPedidosProv)' ) ;
ALista : = TStringList. Create;
2013-06-25 17:03:57 +00:00
AListaArticulosSinProveedor : = TStringList. Create;
2010-08-11 10:53:06 +00:00
try
if not AArticulosPend. DataTable. Active then
AArticulosPend. DataTable. Active : = True ;
2013-06-25 17:03:57 +00:00
if not AArticulosPendNoArticulos. DataTable. Active then
AArticulosPendNoArticulos. DataTable. Active : = True ;
if ( AArticulosPend. DataTable. RecordCount = 0 )
and ( AArticulosPendNoArticulos. DataTable. RecordCount = 0 ) then
2010-08-11 10:53:06 +00:00
begin
ShowInfoMessage( 'Este pedido a cliente no tiene art<72> culos pendientes que se tengan que pedir a los proveedores' ) ;
Exit;
end ;
2013-06-25 17:03:57 +00:00
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) ;
2010-08-11 10:53:06 +00:00
APedidoProv : = NIL ;
AArticulosPend. DataTable. First;
while not AArticulosPend. DataTable. EOF do
begin
if Assigned( APedidoProv) and
( AArticulosPend. ID_PROVEEDOR < > APedidoProv. ID_PROVEEDOR) then
begin
2015-09-10 17:10:22 +00:00
// 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
2010-08-11 10:53:06 +00:00
APedidosProveedorController. Guardar( APedidoProv) ;
ALista. Add( APedidoProv. REFERENCIA + ': ' + APedidoProv. NOMBRE) ;
APedidoProv : = NIL ;
end ;
if not Assigned( APedidoProv) then
begin
APedidoProv : = APedidosProveedorController. Nuevo;
APedidoProv. Edit;
2013-06-25 17:03:57 +00:00
while ( AArticulosPend. ID_PROVEEDOR = 0 ) do
begin
AListaArticulosSinProveedor. Add( RtfToText( AArticulosPend. CONCEPTO) ) ;
AArticulosPend. Next;
end ;
2010-08-11 10:53:06 +00:00
APedidoProv. Proveedor : = ( AProveedoresController. Buscar( AArticulosPend. ID_PROVEEDOR) as IBizProveedor) ;
APedidoProv. ID_PEDIDO_CLIENTE : = APedidoCli. ID;
2013-06-25 17:03:57 +00:00
APedidoProv. REFERENCIA_CLIENTE : = APedidoCli. REFERENCIA_CLIENTE;
2010-08-11 10:53:06 +00:00
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
2010-08-26 17:10:53 +00:00
ADetallesPedidosProvController. BeginUpdate( APedidoProv. Detalles) ;
2010-08-11 10:53:06 +00:00
2015-09-10 17:10:22 +00:00
//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 ;
2010-08-11 10:53:06 +00:00
ADetallesPedidosProvController. Add( APedidoProv. Detalles, TIPO_DETALLE_CONCEPTO) ;
ADetallesPedidosProvController. AnadirArticulo( APedidoProv. Detalles, AArticulosPend. ID_ARTICULO) ;
with APedidoProv. Detalles do
begin
Edit;
2013-06-25 17:03:57 +00:00
CONCEPTO : = AArticulosPend. CONCEPTO;
2010-08-11 10:53:06 +00:00
CANTIDAD : = AArticulosPend. CANT_PENDIENTE_PEDIR;
Post;
end ;
2010-08-26 17:10:53 +00:00
ADetallesPedidosProvController. EndUpdate( APedidoProv. Detalles) ;
2010-08-11 10:53:06 +00:00
AArticulosPend. DataTable. Next;
end ;
if Assigned( APedidoProv) then
begin
2015-09-10 17:10:22 +00:00
// 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
2010-08-11 10:53:06 +00:00
APedidosProveedorController. Guardar( APedidoProv) ;
ALista. Add( APedidoProv. REFERENCIA + ': ' + APedidoProv. NOMBRE) ;
APedidoProv : = NIL ;
end ;
2013-06-25 17:03:57 +00:00
if AListaArticulosSinProveedor. Count > 0 then
begin
dmGenerarPedidosProv. JsListaArticulosSinProveedor. Content. Clear;
dmGenerarPedidosProv. JsListaArticulosSinProveedor. Content. AddStrings( AListaArticulosSinProveedor) ;
dmGenerarPedidosProv. JsListaArticulosSinProveedor. Execute;
end ;
2010-08-11 10:53:06 +00:00
if ALista. Count > 0 then
begin
dmGenerarPedidosProv. JsListaPedidosGenerados. Content. Clear;
dmGenerarPedidosProv. JsListaPedidosGenerados. Content. AddStrings( ALista) ;
dmGenerarPedidosProv. JsListaPedidosGenerados. Execute;
end ;
Result : = True ;
finally
FreeAndNIL( ALista) ;
2013-06-25 17:03:57 +00:00
FreeAndNIL( AListaArticulosSinProveedor) ;
2010-08-11 10:53:06 +00:00
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 .