Bloqueo en base al limite de credito

Hola a todos, queria consultarles si existe una manera de realizar lo siguiente

  • Activar notificaciones al equipo de CxC cuando un cliente esté por llegar a su límite de crédito.

  • Configurar un candado que impida seguir generando documentos de venta cuando el cliente ya haya sobrepasado dicho límite.

He revisado las parametrizaciones de documento, pero no encuentro la opción exacta para configurar el candado y las notificaciones.

:backhand_index_pointing_right: ¿Alguien podría orientarme paso a paso en dónde se habilita esta configuración en SAP Business One?

¡Gracias de antemano por su apoyo!

Hola @alex98casteld Como estas? esta funcionalidad viene de manera nativa en SAP Business One, en mi caso utilizo la version 9.3 Version Hana, y cuento con las activaciones en Gestión/Inicializacion Sistema/Parametrizaciones, Check de Verificado para Limite de Crédito y Limite Comprometido.

Una vez que activas esto tendrás que definir los montos a ser controlados, normalmente esto en ciertas empresas la hacen según la categoría del Cliente (Ej: Cliente Oro, Plata, Bronce; definido segun el tipo de cliente cuanto compra) esto es nada mas a modo de que debes definir un criterio para poder definir un monto a asignar a cada Socio de Negocio en la Pestaña de Condiciones de Pago

Una vez que tengas esto configurado el sistema te alertará de que el Socio de Negocios ha superado el limite de Crédito.

Espero que te sea de Utilidad.

Saludos

Atte.,

FV

1 me gusta

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 ventaobject_type = '17' (tabla ORDR)

  • Entregasobject_type = '15' (tabla ODLN)

  • Facturas de deudorobject_type = '13' (tabla OINV)

En cada caso, el procedimiento hace lo siguiente:

  1. Declara variables locales LimiteCredito y RiesgoAcumulado.

  2. Con un SELECT, obtiene el límite de crédito (CreditLine) del socio de negocios (OCRD) y calcula el riesgo acumulado (Balance + DNotesBal + OrdersBal).

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

5 Me gusta

Hola @alex98casteld

Me alegra saber que no soy al único que le pasan estos casos.

Todos los casos son útiles, sin embargo en estas parametrizaciones he visto que cuando lo hago desde sap, los clientes quedan bloqueados inclusive para tramitar ofertas de venta (cotizaciones), sin embargo para nuestro proceso no es viable ya que esto significa estar activando y desactivando a los clientes, o simplemente no vender y pues esta es nuetra razon de ser.

Con lo anterior he creado un Query y una alerta que nos notifica cuando un cliente ha superado o va a superar su cupo, esta alerta llega a cierta hora según parametrices y así tu área contable y SAC puedan actuar y tramitar con el cliente antes de bloquearlo.

Te dejo el Query si te sirve

:small_blue_diamond: Reporte de clientes con cupo excedido o a punto de exceder
SELECT
-1 AS Orden, – :backhand_index_pointing_left: Esto asegura que la nota salga primero
‘NOTA:’ AS [Código Cliente],
‘**************************************************************’ AS [Nombre Cliente],
NULL AS [Cupo Asignado],
NULL AS [Saldo de Cuenta],
NULL AS [Entregas Abiertas],
NULL AS [Pedidos Clientes],
NULL AS [Total Comprometido],
NULL AS [Alerta]

UNION ALL
SELECT -1, NULL, ‘Si el cupo ya se superó, gestionar inmediatamente las OV abiertas pendientes de entrega con cartera para tramitar despacho.’,
NULL,NULL,NULL,NULL,NULL,NULL
UNION ALL
SELECT -1, NULL, ‘Si está a menos del 20% de alcanzarlo, coordinar con cartera antes de liberar nuevas órdenes.’,
NULL,NULL,NULL,NULL,NULL,NULL
UNION ALL
SELECT -1, NULL, ‘**************************************************************’,
NULL,NULL,NULL,NULL,NULL,NULL

UNION ALL

SELECT
0 AS Orden, – :backhand_index_pointing_left: Los datos reales salen después
T0.CardCode AS [Código Cliente],
T0.CardName AS [Nombre Cliente],
T0.CreditLine AS [Cupo Asignado],
T0.Balance AS [Saldo de Cuenta],

ISNULL((SELECT SUM(T2.LineTotal)
        FROM ODLN T1
        INNER JOIN DLN1 T2 ON T1.DocEntry = T2.DocEntry
        WHERE T1.CardCode = T0.CardCode
          AND T1.DocStatus = 'O'),0) AS [Entregas Abiertas],

ISNULL((SELECT SUM(T4.LineTotal)
        FROM ORDR T3
        INNER JOIN RDR1 T4 ON T3.DocEntry = T4.DocEntry
        WHERE T3.CardCode = T0.CardCode
          AND T3.DocStatus = 'O'),0) AS [Pedidos Clientes],

(T0.Balance
 + ISNULL((SELECT SUM(T2.LineTotal) FROM ODLN T1 INNER JOIN DLN1 T2 ON T1.DocEntry = T2.DocEntry WHERE T1.CardCode = T0.CardCode AND T1.DocStatus = 'O'),0)
 + ISNULL((SELECT SUM(T4.LineTotal) FROM ORDR T3 INNER JOIN RDR1 T4 ON T3.DocEntry = T4.DocEntry WHERE T3.CardCode = T0.CardCode AND T3.DocStatus = 'O'),0)
) AS [Total Comprometido],

CASE 
    WHEN (T0.Balance
          + ISNULL((SELECT SUM(T2.LineTotal) FROM ODLN T1 INNER JOIN DLN1 T2 ON T1.DocEntry = T2.DocEntry WHERE T1.CardCode = T0.CardCode AND T1.DocStatus = 'O'),0)
          + ISNULL((SELECT SUM(T4.LineTotal) FROM ORDR T3 INNER JOIN RDR1 T4 ON T3.DocEntry = T4.DocEntry WHERE T3.CardCode = T0.CardCode AND T3.DocStatus = 'O'),0)
         ) > T0.CreditLine 
    THEN 'YA SUPERÓ EL CUPO'
    
    WHEN (T0.Balance
          + ISNULL((SELECT SUM(T2.LineTotal) FROM ODLN T1 INNER JOIN DLN1 T2 ON T1.DocEntry = T2.DocEntry WHERE T1.CardCode = T0.CardCode AND T1.DocStatus = 'O'),0)
          + ISNULL((SELECT SUM(T4.LineTotal) FROM ORDR T3 INNER JOIN RDR1 T4 ON T3.DocEntry = T4.DocEntry WHERE T3.CardCode = T0.CardCode AND T3.DocStatus = 'O'),0)
         ) >= (T0.CreditLine * 0.8)
    THEN 'Está a menos del 20% de superar el cupo'

    ELSE '✅ Aún dentro del cupo'
END AS [Alerta]

FROM OCRD T0
WHERE
T0.CardCode LIKE ‘C-%’
AND T0.CreditLine > 0
AND T0.validFor = ‘Y’
AND (
(T0.Balance

  • ISNULL((SELECT SUM(T2.LineTotal) FROM ODLN T1 INNER JOIN DLN1 T2 ON T1.DocEntry = T2.DocEntry WHERE T1.CardCode = T0.CardCode AND T1.DocStatus = ‘O’),0)
  • ISNULL((SELECT SUM(T4.LineTotal) FROM ORDR T3 INNER JOIN RDR1 T4 ON T3.DocEntry = T4.DocEntry WHERE T3.CardCode = T0.CardCode AND T3.DocStatus = ‘O’),0)
    ) >= (T0.CreditLine * 0.8)
    )

ORDER BY Orden, [Alerta] DESC, [Total Comprometido] DESC;

Buenas tardes, aunque las opciones pueden funcionar para lo que necesitas, lo ideal es darle la opción a Cobranza de poder autorizar o rechazar alguna Orden de venta que a lo mejor supere su limite de crédito por una cantidad insignificante o que no represente un riesgo, por ejemplo si el cliente tiene 1000 pesos disponibles en su limite de crédito y requiere hacer una compra por 1050. Por tal motivo considero que un procedimiento de autorización sería la mejor manera de cubrir lo requerido:

Se puede construir un procedimiento de autorización que se dispare en la Orden de Venta cuando está supera el límite de crédito (tomando en cuenta ordenes ya confirmadas)

SELECT 'TRUE' 
FROM OCRD T0 
WHERE T0."CardCode" = $[ORDR."CardCode"] 
AND (T0."Balance" + T0."OrdersBal" + $[ORDR."DocTotal"])> T0."CreditLine";

Saludos.

1 me gusta

En nuestro caso, para hacer las ofertas como comentan, los comerciales, pueden cambiar el limite de riesgo a un valor superior para poder cotizar el precio en la oferta,y después volverlo a poner como estaba en la ficha del IC. Si les aceptan esa oferta, como vuelve a bloquearse, ya tiene que investigar que hacer, pedir más riesgo a nuestra aseguradora, hablar con el departamento de contabilidad, etc

El proceso de autorización seria lo mas recomendable es verdad, pero ‘prefieren’ saltarse el sistema de esta manera, y gerencia ha dado el visto bueno este metodo.

Saludos

1 me gusta