2011-11-14 17:40:41 +00:00
unit uGenerarAlbaranesProvUtils;
interface
uses
2021-02-07 17:20:37 +00:00
Windows, SysUtils, Classes, uBizPedidosProveedor, pngimage, JSDialog,
uBizDetallesPedidoProveedor;
2011-11-14 17:40:41 +00:00
type
TdmGenerarAlbaranesProv = class( TDataModule)
JsListaAlbaranesGenerados: TJSDialog;
end ;
function GenerarAlbaranProv( const IDPedido : Integer ) : Boolean ; overload ;
function GenerarAlbaranProv( APedido : IBizPedidoProveedor) : Boolean ; overload ;
2021-02-07 17:20:37 +00:00
function GenerarAlbaranesProv( APedidos : IBizPedidoProveedor) : Boolean ; overload ;
2011-11-14 17:40:41 +00:00
function GenerarAlbaranProv : Boolean ; overload ;
2021-02-07 17:20:37 +00:00
function GenerarAlbaranesProv : Boolean ; overload ;
2011-11-14 17:40:41 +00:00
function RecibirPedidoProv( APedido: IBizPedidoProveedor) : Boolean ; overload ;
function RecibirPedidoProv: Boolean ; overload ;
implementation
{$R *.dfm}
uses
2021-02-07 17:20:37 +00:00
Dialogs, uDialogUtils, uBizDetallesAlbaranProveedor,
2011-11-14 17:40:41 +00:00
uPedidosProveedorController, uDetallesPedidoProveedorController,
uAlbaranesProveedorController, uProveedoresController,
uDetallesAlbaranProveedorController, uControllerDetallesBase,
uBizAlbaranesProveedor, uBizContactos, schPedidosProveedorClient_Intf,
schAlbaranesProveedorClient_Intf, uInventarioController, uBizInventario;
var
2021-02-07 17:20:37 +00:00
dmGenerarAlbaranesProv: TdmGenerarAlbaranesProv;
2011-11-14 17:40:41 +00:00
APedidosProveedorController : IPedidosProveedorController;
ADetallesPedidosProveedorController : IDetallesPedidoProveedorController;
AAlbaranesProveedorController : IAlbaranesProveedorController;
ADetallesAlbaranesController : IDetallesAlbaranProveedorController;
AProveedoresController : IProveedoresController;
AInventarioController : IInventarioController;
{ M<> todos auxiliares }
procedure CopiarPedidoAAlbaran( APedido: IBizPedidoProveedor;
AAlbaran : IBizAlbaranProveedor) ;
begin
if not Assigned( AAlbaran) then
raise Exception. Create ( 'Albar<61> n no asignado (CopiarPedidoAAlbaran)' ) ;
if not Assigned( APedido) then
raise Exception. Create ( 'Pedido no asignado (CopiarPedidoAAlbaran)' ) ;
if not APedido. DataTable. Active then
APedido. DataTable. Active : = True ;
// El albar<61> n tiene que venir ya abierto y posicionado donde hay que copiar
AAlbaran. ID_PROVEEDOR : = APedido. ID_PROVEEDOR;
AAlbaran. ID_PEDIDO : = APedido. ID;
AAlbaran. CALLE : = APedido. CALLE;
AAlbaran. CODIGO_POSTAL : = APedido. CODIGO_POSTAL;
AAlbaran. POBLACION : = APedido. POBLACION;
AAlbaran. PROVINCIA : = APedido. PROVINCIA;
AAlbaran. PERSONA_CONTACTO : = APedido. PERSONA_CONTACTO;
AAlbaran. TELEFONO : = APedido. TELEFONO;
AAlbaran. IMPORTE_NETO : = APedido. IMPORTE_NETO;
AAlbaran. IMPORTE_PORTE : = APedido. IMPORTE_PORTE;
AAlbaran. DESCUENTO : = APedido. DESCUENTO;
AAlbaran. IMPORTE_DESCUENTO : = APedido. IMPORTE_DESCUENTO;
AAlbaran. BASE_IMPONIBLE : = APedido. BASE_IMPONIBLE;
AAlbaran. IVA : = APedido. IVA;
AAlbaran. IMPORTE_IVA : = APedido. IMPORTE_IVA;
AAlbaran. IMPORTE_TOTAL : = APedido. IMPORTE_TOTAL;
AAlbaran. DataTable. FieldByName( fld_AlbaranesProveedorOBSERVACIONES) . AsVariant : = APedido. DataTable. FieldByName( fld_PedidosProveedorOBSERVACIONES) . AsVariant;
AAlbaran. ID_FORMA_PAGO : = APedido. ID_FORMA_PAGO;
end ;
procedure CopiarArticulosPendAAlbaran(
APedido: IBizPedidoProveedor;
AAlbaran: IBizAlbaranProveedor;
AArticulosPendientes: IBizDetallesPedidoProveedorPend) ;
var
i : integer ;
ADetalles : IBizDetallesAlbaranProveedor;
ADetallesController : IDetallesAlbaranProveedorController;
begin
if not Assigned( AAlbaran) then
raise Exception. Create ( 'Albar<61> n no asignado (CopiarArticulosPendAAlbaran)' ) ;
if not Assigned( APedido) then
raise Exception. Create ( 'Pedido no asignado (CopiarArticulosPendAAlbaran)' ) ;
if not Assigned( AArticulosPendientes) then
raise Exception. Create ( 'Art<72> culos pendientes no asignado (CopiarArticulosPendAAlbaran)' ) ;
if not AArticulosPendientes. DataTable. Active then
AArticulosPendientes. DataTable. Active : = True ;
// El albar<61> n tiene que venir ya abierto y posicionado donde hay que copiar
ADetalles : = AAlbaran. Detalles;
ADetallesController : = TDetallesAlbaranProveedorController. Create;
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
ADetallesController. BeginUpdate( ADetalles) ;
AArticulosPendientes. DataTable. First;
for i : = 0 to AArticulosPendientes. DataTable. RecordCount - 1 do
begin
APedido. Detalles. First;
if ( APedido. Detalles. Locate( 'ID_ARTICULO' , AArticulosPendientes. ID_ARTICULO, [ ] ) ) then
if ( AArticulosPendientes. CANTIDAD > 0 ) then
begin
ADetallesController. Add( ADetalles, TIPO_DETALLE_CONCEPTO) ;
ADetalles. Edit;
ADetalles. REFERENCIA : = APedido. Detalles. REFERENCIA;
ADetalles. ID_ARTICULO : = APedido. Detalles. ID_ARTICULO;
ADetalles. CONCEPTO : = APedido. Detalles. CONCEPTO;
ADetalles. CANTIDAD : = AArticulosPendientes. CANTIDAD;
ADetalles. IMPORTE_UNIDAD : = APedido. Detalles. IMPORTE_UNIDAD;
ADetalles. IMPORTE_TOTAL : = APedido. Detalles. IMPORTE_TOTAL;
ADetalles. DESCUENTO : = APedido. Detalles. DESCUENTO;
ADetalles. IMPORTE_PORTE : = APedido. Detalles. IMPORTE_PORTE;
ADetalles. VISIBLE : = APedido. Detalles. VISIBLE;
ADetalles. REFERENCIA_PROVEEDOR : = APedido. Detalles. REFERENCIA_PROVEEDOR;
ADetalles. Post;
AArticulosPendientes. Next;
end ;
end ;
finally
ADetallesController. EndUpdate( ADetalles) ;
ADetallesController : = NIL ;
end ;
end ;
procedure Inicializar;
begin
2021-02-07 17:20:37 +00:00
dmGenerarAlbaranesProv : = TdmGenerarAlbaranesProv. Create( nil ) ;
2011-11-14 17:40:41 +00:00
APedidosProveedorController : = TPedidosProveedorController. Create;
ADetallesPedidosProveedorController : = TDetallesPedidoProveedorController. Create;
AAlbaranesProveedorController : = TAlbaranesProveedorController. Create;
ADetallesAlbaranesController : = TDetallesAlbaranProveedorController. Create;
AProveedoresController : = TProveedoresController. Create;
AInventarioController : = TInventarioController. Create;
end ;
procedure Finalizar;
begin
2021-02-07 17:20:37 +00:00
FreeAndNIL( dmGenerarAlbaranesProv) ;
2011-11-14 17:40:41 +00:00
APedidosProveedorController : = nil ;
ADetallesPedidosProveedorController : = nil ;
AAlbaranesProveedorController : = nil ;
ADetallesAlbaranesController : = nil ;
AProveedoresController : = nil ;
AInventarioController : = nil ;
end ;
function GenerarAlbaranProv( const IDPedido : Integer ) : Boolean ; overload ;
var
APedido : IBizPedidoProveedor;
begin
try
if not Assigned( APedidosProveedorController) then
Inicializar;
APedido : = APedidosProveedorController. Buscar( IDPedido) ;
2021-02-07 17:20:37 +00:00
Result : = GenerarAlbaranesProv( APedido) ;
2011-11-14 17:40:41 +00:00
if Assigned( APedidosProveedorController) then
Finalizar;
finally
APedido : = NIL ;
end ;
end ;
function GenerarAlbaranProv( APedido : IBizPedidoProveedor) : Boolean ; overload ;
var
ARespuesta : Integer ;
AAlbaran : IBizAlbaranProveedor;
AArticulosPendientes: IBizDetallesPedidoProveedorPend;
begin
Result : = False ;
2021-02-07 17:20:37 +00:00
if not Assigned( APedidosProveedorController) then
Inicializar;
2011-11-14 17:40:41 +00:00
if not Assigned( APedido) then
2021-02-07 17:20:37 +00:00
raise Exception. Create( 'Pedidos de proveedor no asignado (GenerarAlbaranProv)' ) ;
2011-11-14 17:40:41 +00:00
if not APedido. DataTable. Active then
APedido. DataTable. Active : = True ;
try
AArticulosPendientes : = ADetallesPedidosProveedorController. ArticulosPendientes( APedido. ID) ;
if not Assigned( AArticulosPendientes) then
raise Exception. Create( 'Error al recuperar los art<72> culos sin albar<61> n del pedido (GenerarAlbaranProv)' ) ;
AArticulosPendientes. DataTable. Active : = True ;
if AArticulosPendientes. DataTable. RecordCount = 0 then
begin
ARespuesta : = ShowConfirmMessage( 'Generar albar<61> n a partir del pedido' , 'Todos los art<72> culos de este pedido ya figuran en uno o m<> s albaranes de proveedor.' +
#10 #13 + '<27> Desea generar de todas formas otro albar<61> n para este pedido?' ) ;
if ( ARespuesta = IDNO) then
Exit; // Aunque es un exit, se ejecuta la parte del finally antes de salir.
end ;
AAlbaran : = AAlbaranesProveedorController. Nuevo;
CopiarPedidoAAlbaran( APedido, AAlbaran) ;
CopiarArticulosPendAAlbaran( APedido, AAlbaran, AArticulosPendientes) ;
//Sustituir por if de guardar
if AAlbaranesProveedorController. Guardar( AAlbaran) then
begin
// ShowWarningMessage('Todos los art<72> culos que contiene el pedido no est<73> n en el cat<61> logo, y por lo tanto no se puede generar el albar<61> n');
2021-02-07 17:20:37 +00:00
with dmGenerarAlbaranesProv. JsListaAlbaranesGenerados do
2011-11-14 17:40:41 +00:00
begin
Instruction. Text : = 'Se ha generado el albar<61> n' ;
Content. Clear;
Content. Add( Format( 'Se ha generado correctamente el albar<61> n %s a partir del pedido de cliente' + #10 #13 , [ AAlbaran. REFERENCIA] ) ) ;
Execute;
ARespuesta : = CustomButtonResult;
case ARespuesta of
1 0 0 : begin
// Ver el albar<61> n
AAlbaranesProveedorController. Ver( AAlbaran) ;
end ;
2 0 0 : // Continuar;
end ;
end ;
end ;
Result : = True ;
finally
AArticulosPendientes : = NIL ;
if Assigned( APedidosProveedorController) then
Finalizar;
end ;
end ;
2021-02-07 17:20:37 +00:00
function GenerarAlbaranesProv( APedidos : IBizPedidoProveedor) : Boolean ; overload ;
var
AAlbaranesNuevos : IBizAlbaranProveedor;
i: Integer ;
ARespuesta : Integer ;
begin
Result : = False ;
if not Assigned( APedidosProveedorController) then
Inicializar;
if not Assigned( APedidos) then
2021-02-26 08:52:27 +00:00
raise Exception. Create( 'Pedidos de proveedor no asignado (GenerarAlbaranesProv)' ) ;
2021-02-07 17:20:37 +00:00
if not APedidos. DataTable. Active then
APedidos. DataTable. Active : = True ;
try
AAlbaranesNuevos : = AAlbaranesProveedorController. Nuevo( False ) ;
if AAlbaranesProveedorController. Anadir( AAlbaranesNuevos, APedidos) then
begin
if AAlbaranesNuevos. DataTable. RecordCount = 1 then
begin
with dmGenerarAlbaranesProv. JsListaAlbaranesGenerados do
begin
Instruction. Text : = 'Se ha generado el albar<61> n' ;
Content. Clear;
Content. Add( Format( 'Se ha generado correctamente el albar<61> n %s a partir del pedido de proveedor' + #10 #13 ,
[ AAlbaranesNuevos. REFERENCIA] ) ) ;
end ;
end
else begin
dmGenerarAlbaranesProv. JsListaAlbaranesGenerados. CustomButtons[ 1 ] . Destroy;
with dmGenerarAlbaranesProv. JsListaAlbaranesGenerados. Content do
begin
Clear;
AAlbaranesNuevos. DataTable. Last;
for i : = 0 to AAlbaranesNuevos. DataTable. RecordCount - 1 do
begin
if Length( AAlbaranesNuevos. REFERENCIA) > 0 then
Add( AAlbaranesNuevos. REFERENCIA + ': ' + AAlbaranesNuevos. NOMBRE) ;
AAlbaranesNuevos. DataTable. Prior;
end ;
end ;
end ;
dmGenerarAlbaranesProv. JsListaAlbaranesGenerados. Execute;
ARespuesta : = dmGenerarAlbaranesProv. JsListaAlbaranesGenerados. CustomButtonResult;
case ARespuesta of
1 0 0 : begin
// Ver el albar<61> n
AAlbaranesProveedorController. Ver( AAlbaranesNuevos) ;
end ;
2 0 0 : // Continuar;
end ;
end ;
finally
AAlbaranesNuevos : = NIL ;
end ;
end ;
2011-11-14 17:40:41 +00:00
function GenerarAlbaranProv : Boolean ; overload ;
2021-02-07 17:20:37 +00:00
//Solo generar<61> el albar<61> n correspondiente al pedido seleccionado
2011-11-14 17:40:41 +00:00
var
APedido : IBizPedidoProveedor;
begin
Result : = False ;
try
if not Assigned( APedidosProveedorController) then
Inicializar;
APedido : = APedidosProveedorController. ElegirPedidos( APedidosProveedorController. BuscarPendientesRecepcion,
'Elija el pedido de proveedor que desea utilizar para dar de alta el albar<61> n correspondiente.'
, False ) ;
2021-02-07 17:20:37 +00:00
2011-11-14 17:40:41 +00:00
if Assigned( APedido) then
Result : = GenerarAlbaranProv( APedido) ;
finally
if Assigned( APedidosProveedorController) then
Finalizar;
end ;
end ;
2021-02-07 17:20:37 +00:00
function GenerarAlbaranesProv : Boolean ; overload ;
// Generara tantos albaranes como proveedores distintos tenga en la lista de pedidos seleccionada
var
APedido : IBizPedidoProveedor;
begin
Result : = False ;
try
if not Assigned( APedidosProveedorController) then
Inicializar;
APedido : = APedidosProveedorController. ElegirPedidos( APedidosProveedorController. BuscarPendientesRecepcion,
'Elija el pedido o pedidos de proveedor que desea utilizar para dar de alta el albar<61> n correspondiente.'
, True ) ;
if Assigned( APedido) then
Result : = GenerarAlbaranesProv( APedido) ;
finally
if Assigned( APedidosProveedorController) then
Finalizar;
end ;
end ;
2011-11-14 17:40:41 +00:00
function RecibirPedidoProv( APedido: IBizPedidoProveedor) : Boolean ;
var
bGenerarAlbaran : Boolean ;
ARespuesta : Integer ;
AArticulosPendientes: IBizDetallesPedidoProveedorPend;
AAlbaran : IBizAlbaranProveedor;
AInventarioRecibido: IBizInventario;
begin
Result : = False ;
bGenerarAlbaran : = False ;
AInventarioRecibido : = NIL ;
if not Assigned( AInventarioController) then
Inicializar;
// <20> Hay almac<61> n asociado al pedido?
if APedido. ID_ALMACEN = 0 then
begin
if ( ShowConfirmMessage( 'Recepci<63> n de pedido a proveedor' , 'Este pedido no tiene un almac<61> n asociado por lo que se generar<61> el albar<61> n de proveedor correspondiente sin hacer ning<6E> n cambio en el stock de los almacenes.'
+ #10 #13 + #10 #13 + '<27> Desea continuar?' ) = IDYES) then
bGenerarAlbaran : = True ;
end
else begin
try
// En AInventarioRecibido tenemos la lista de articulos que hemos recibido y
// que utilizaremos para hacer el albar<61> n
AArticulosPendientes : = ADetallesPedidosProveedorController. ArticulosPendientes( APedido. ID) ;
if not Assigned( AArticulosPendientes) then
raise Exception. Create( 'Error al recuperar los art<72> culos pendientes de recibir del pedido (GenerarAlbaranProv)' ) ;
AArticulosPendientes. DataTable. Active : = True ;
if AArticulosPendientes. DataTable. RecordCount = 0 then
begin
ARespuesta : = ShowConfirmMessage( 'Generar albar<61> n a partir del pedido' , 'Todos los art<72> culos de este pedido ya figuran en uno o m<> s albaranes de proveedor.' +
#10 #13 + '<27> Desea generar de todas formas otro albar<61> n para este pedido?' ) ;
if ( ARespuesta = IDNO) then
Exit; // Aunque es un exit, se ejecuta la parte del finally antes de salir.
end ;
bGenerarAlbaran : = AInventarioController. EntradaPedido( nil , APedido, AArticulosPendientes, AInventarioRecibido) ;
except
on E : Exception do
ShowMessage( E. Message ) ;
end ;
end ;
if bGenerarAlbaran then
begin
try
AAlbaran : = AAlbaranesProveedorController. Nuevo;
// En AInventarioRecibido tenemos la lista de articulos que hemos recibido y
// que utilizaremos para hacer el albar<61> n
if AAlbaranesProveedorController. Anadir( AAlbaran, APedido. ID, AInventarioRecibido) then
AAlbaranesProveedorController. Ver( AAlbaran) ;
finally
AAlbaran : = NIL ;
end ;
end ;
if Assigned( AAlbaranesProveedorController) then
Finalizar;
// actRefrescar.Execute;
end ;
function RecibirPedidoProv: Boolean ; overload ;
var
APedido : IBizPedidoProveedor;
begin
Result : = False ;
try
if not Assigned( APedidosProveedorController) then
Inicializar;
APedido : = APedidosProveedorController. ElegirPedidos( APedidosProveedorController. BuscarPendientesRecepcion,
'Elija el pedido de proveedor que desea recibir.'
, False ) ;
if Assigned( APedido) then
Result : = RecibirPedidoProv( APedido) ;
finally
if Assigned( APedidosProveedorController) then
Finalizar;
end ;
end ;
end .