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
yLineWithPrice
se usan para calcular los precios mediante las codeunits y interfaces relacionadas.TempSalesLine
yTempPriceListLine
son tablas temporales que almacenan los datos de línea de venta y de lista de precios, respectivamente.ReturnValue
se inicializa a0
, 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 de1
. - 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
- Gestión de precios dinámicos: Este procedimiento es ideal para calcular precios dinámicos basados en condiciones específicas de listas de precios.
- Promociones y descuentos: Puedes usarlo para aplicar precios promocionales o descuentos que dependan de fechas u otras reglas.
- 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.
- Optimización de la lógica de precios: Centraliza y automatiza el cálculo de precios, reduciendo errores manuales.
Beneficios del procedimiento
- Precisión en los cálculos: Garantiza que siempre se utilice el precio más adecuado según las reglas definidas.
- Flexibilidad: Soporta precios específicos para productos y precios generales en la misma lista.
- Eficiencia: Automatiza la selección de precios basados en fechas, reduciendo la necesidad de intervención manual.
- 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!