Utilidades en Business Central: Cálculo del PVP basado en Listas de Precios (Parte 8)

Aprende cómo calcular el PVP de un producto utilizando datos de listas de precios en Business Central, optimizando la gestión de precios en tus desarrollos.

En esta octava entrega de la serie sobre utilidades para Business Central, quiero enseñarte un procedimiento que se encarga de calcular el PVP de un producto basándose en una lista de precios. Este cálculo es especialmente útil cuando trabajas con estructuras complejas de precios, como ofertas o reglas específicas para determinados artículos. El procedimiento que veremos, CalcPVP, combina lógica de precios y validación de fechas para encontrar el precio más adecuado según las condiciones.

¡Vamos manos a la obra! 😵


Procedimiento CalcPVP

El procedimiento CalcPVP toma como entrada un código de producto (ItemNo) y un código de lista de precios (PVPCode). Devuelve el precio unitario calculado que corresponde a ese producto según las reglas de la lista de precios especificada. Este es el código:

procedure CalcPVP(ItemNo: Code[20]; PVPCode: Code[20]) ReturnValue: Decimal
var
    TempSalesLine: Record "Sales Line" temporary;
    TempPriceListLine: Record "Price List Line" temporary;
    SalesLinePrice: Codeunit "Sales Line - Price";
    PriceCalculationMgt: codeunit "Price Calculation Mgt.";
    PriceCalculation: Interface "Price Calculation";
    LineWithPrice: Interface "Line With Price";
    PriceType: Enum "Price Type";
    InsertValue: Boolean;
begin
    Clear(PriceCalculation);
    Clear(LineWithPrice);
    Clear(SalesLinePrice);
    Clear(PriceCalculationMgt);

    ReturnValue := 0;
    InsertValue := false;

    //rellenamos las variables para buscar el pvp
    TempSalesLine.Init();
    TempSalesLine.Type := TempSalesLine.Type::Item;
    TempSalesLine."No." := ItemNo;
    TempSalesLine.Quantity := 1;
    TempSalesLine.Insert();

    LineWithPrice := SalesLinePrice;
    LineWithPrice.SetLine(PriceType::Sale, TempSalesLine);

    //añadimos las variables
    PriceCalculationMgt.GetHandler(LineWithPrice, PriceCalculation);

    //rellanamos la variable temporal
    PriceCalculation.FindPrice(TempPriceListLine, true);

    //filtramos los datos recogidos
    TempPriceListLine.Reset();
    TempPriceListLine.SetRange("Price List Code", PVPCode);
    TempPriceListLine.SetRange("Product No.", ItemNo);

    //si despues del filtro da 0 es porque no hay producto especifico y se busca sin producto
    if TempPriceListLine.Count = 0 then
        TempPriceListLine.SetRange("Product No.");

    if TempPriceListLine.FindSet() then
        repeat
            if (format(TempPriceListLine."Starting Date") = '') and (format(TempPriceListLine."Ending Date") = '') then
                InsertValue := true;

            if (TempPriceListLine."Starting Date" <= Today()) and (format(TempPriceListLine."Ending Date") = '') then
                InsertValue := true;

            if (TempPriceListLine."Starting Date" <= Today()) and (TempPriceListLine."Ending Date" > Today()) then
                InsertValue := true;

            if InsertValue then begin
                if TempPriceListLine."Unit Price" < ReturnValue then
                    ReturnValue := TempPriceListLine."Unit Price";

                if ReturnValue = 0 then
                    ReturnValue := TempPriceListLine."Unit Price";
            end;
        until TempPriceListLine.Next() = 0;
end;

Explicación detallada del procedimiento

1. Inicialización

El procedimiento comienza inicializando varias variables:

  • PriceCalculation y LineWithPrice se usan para calcular los precios mediante las codeunits y interfaces relacionadas.
  • TempSalesLine y TempPriceListLine son tablas temporales que almacenan los datos de línea de venta y de lista de precios, respectivamente.
  • ReturnValue se inicializa a 0, asegurando que cualquier cálculo de precio comienza desde un valor neutral.
  • La variable InsertValue se utiliza para determinar si un precio cumple con las condiciones requeridas y debe considerarse en el cálculo.

2. Preparación de la línea temporal de venta

Se crea una línea temporal de venta en la tabla TempSalesLine con los datos básicos necesarios:

  • El tipo de línea se establece como Item.
  • Se asigna el código del producto (ItemNo) y una cantidad de 1.
  • La línea temporal se inserta en la tabla para usarla en los cálculos posteriores.

3. Configuración para el cálculo de precios

La lógica de precios utiliza la codeunit Sales Line - Price a través de la interfaz LineWithPrice. Se establece el tipo de precio (PriceType::Sale) y se asocia con la línea temporal de venta. Luego, se obtiene un manejador de precios (PriceCalculation) utilizando la codeunit Price Calculation Mgt.. Esto permite acceder a la funcionalidad de cálculo de precios disponible en Business Central.

4. Recuperación de precios en la lista temporal

El método PriceCalculation.FindPrice se utiliza para llenar la tabla temporal TempPriceListLine con las posibles entradas de precios. A continuación, se filtran los datos:

  • Se aplica un rango en Price List Code para limitar los resultados a la lista de precios especificada.
  • Se filtra por Product No. para buscar coincidencias exactas con el código de producto proporcionado.
  • Si no se encuentran precios específicos para el producto, se elimina el filtro en Product No. para buscar precios generales.

5. Validación de las fechas y cálculo del precio

Una vez obtenidos los datos, se recorren las líneas de precios temporales con las siguientes condiciones:

  • Si las fechas de inicio y fin están vacías, el precio es válido.
  • Si la fecha de inicio es menor o igual a la actual y no hay una fecha de fin, el precio también es válido.
  • Si la fecha de inicio es menor o igual a la actual y la fecha de fin es mayor a la actual, el precio se considera válido.

Si las condiciones se cumplen, se compara el precio de la línea con el ReturnValue. Si el precio actual es menor que el valor actual, se actualiza ReturnValue. Si el precio inicial es 0, se asigna directamente el precio de la línea.


Aplicaciones prácticas del procedimiento

  1. Gestión de precios dinámicos: Este procedimiento es ideal para calcular precios dinámicos basados en condiciones específicas de listas de precios.
  2. Promociones y descuentos: Puedes usarlo para aplicar precios promocionales o descuentos que dependan de fechas u otras reglas.
  3. Compatibilidad con sistemas externos: Si estás integrando Business Central con un sistema de comercio electrónico, este procedimiento garantiza que siempre se use el precio correcto.
  4. Optimización de la lógica de precios: Centraliza y automatiza el cálculo de precios, reduciendo errores manuales.

Beneficios del procedimiento

  1. Precisión en los cálculos: Garantiza que siempre se utilice el precio más adecuado según las reglas definidas.
  2. Flexibilidad: Soporta precios específicos para productos y precios generales en la misma lista.
  3. Eficiencia: Automatiza la selección de precios basados en fechas, reduciendo la necesidad de intervención manual.
  4. Integración robusta: Es compatible con los estándares de precios de Business Central, facilitando su integración con módulos nativos y personalizados.

Conclusión

En esta octava entrega, he explicado cómo calcular el PVP de un producto utilizando listas de precios y validación de fechas. Este procedimiento es una herramienta poderosa para gestionar precios de forma dinámica y eficiente en Business Central.

Para seguir todos los posts de esta serie, puedes encontrarlos bajo la etiqueta #UtilsBc.

Espero que este procedimiento te resulte práctico para tus proyectos en Business Central.

Si quieres ver el código completo, está en GitHub.

¡Hasta la próxima entrega!

Share your love

Leave a Reply

Your email address will not be published. Required fields are marked *