Hola,
Nosotros para impedir que se puedan crear Pedidos, Entregas y Facturas de Venta cuando un cliente ha superado su riesgo de crédito, utilizamos una Transaction Notification. Te comparto la idea por si te sirve de referencia.
En nuestro caso, queríamos que también se tuvieran en cuenta los Pedidos de cliente dentro del riesgo acumulado, y la solución que aplicamos fue esta.
El patrón lo hemos replicado para tres objetos:
-
Pedidos de venta → object_type = '17'
(tabla ORDR)
-
Entregas → object_type = '15'
(tabla ODLN)
-
Facturas de deudor → object_type = '13'
(tabla OINV)
En cada caso, el procedimiento hace lo siguiente:
-
Declara variables locales LimiteCredito
y RiesgoAcumulado
.
-
Con un SELECT
, obtiene el límite de crédito (CreditLine
) del socio de negocios (OCRD
) y calcula el riesgo acumulado (Balance + DNotesBal + OrdersBal
).
-
Si el riesgo acumulado supera el límite de crédito, marca error y bloquea la transacción mostrando un mensaje.
En otras palabras, se evita guardar o actualizar el documento si el cliente ya ha superado su límite de crédito considerando saldos abiertos, notas de débito y pedidos abiertos.
– ADD YOUR CODE HERE
if :object_type = ‘17’ AND ( :transaction_type = ‘A’ OR :transaction_type = ‘U’ ) THEN
declare LimiteCredito double;
declare RiesgoAcumulado double;
select IFNULL(T1.“CreditLine”, 0), IFNULL(T1.“Balance”, 0) + IFNULL(T1.“DNotesBal”, 0) + IFNULL(T1.“OrdersBal”, 0)
into LimiteCredito, RiesgoAcumulado
frOM “ORDR” T0
INNER JOIN “OCRD” T1 ON T0.“CardCode” = T1.“CardCode” where T0.“DocEntry” = :list_of_cols_val_tab_del;
if :RiesgoAcumulado > :LimiteCredito then
error := 1;
error_message := ‘El cliente ha supero el riego máximo considerando los pedidos’;
end if;
end if;
if :object_type = ‘15’ AND ( :transaction_type = ‘A’ OR :transaction_type = ‘U’ ) THEN
declare LimiteCredito double;
declare RiesgoAcumulado double;
select IFNULL(T1.“CreditLine”, 0), IFNULL(T1.“Balance”, 0) + IFNULL(T1.“DNotesBal”, 0) + IFNULL(T1.“OrdersBal”, 0)
into LimiteCredito, RiesgoAcumulado
frOM “ODLN” T0
INNER JOIN “OCRD” T1 ON T0.“CardCode” = T1.“CardCode” where T0.“DocEntry” = :list_of_cols_val_tab_del;
if :RiesgoAcumulado > :LimiteCredito then
error := 1;
error_message := ‘El cliente ha supero el riego máximo considerando los pedidos’;
end if;
end if;
if :object_type = ‘13’ AND ( :transaction_type = ‘A’ OR :transaction_type = ‘U’ ) THEN
declare LimiteCredito double;
declare RiesgoAcumulado double;
select IFNULL(T1.“CreditLine”, 0), IFNULL(T1.“Balance”, 0) + IFNULL(T1.“DNotesBal”, 0) + IFNULL(T1.“OrdersBal”, 0)
into LimiteCredito, RiesgoAcumulado
frOM “OINV” T0
INNER JOIN “OCRD” T1 ON T0.“CardCode” = T1.“CardCode” where T0.“DocEntry” = :list_of_cols_val_tab_del;
if :RiesgoAcumulado > :LimiteCredito then
error := 1;
error_message := ‘El cliente ha supero el riego máximo considerando los pedidos’;
end if;
end if;
Un saludo