Cálculo de Precios según Volumen de Venta WhitePaper Febrero de 07 Contenidos 1. Propósito _____________________________________________ 3 2. Introducción ___________________________________________ 4 3. Aplicar el cálculo de venta por volumen a un PAF______________________ 5 4. Evento Sales_RecalculatePerVolume _____________________________ 6 4.1. RawMaterialVolumeItems (colección) _________________________________ 6 4.1.1. Propiedades ________________________________________________________ 6 4.1.2. Métodos___________________________________________________________ 6 4.2. RawMaterialVolumeItem (elemento en la colección)_________________________ 6 4.2.1. Propiedades ________________________________________________________ 6 4.2.2. Métodos___________________________________________________________ 7 4.3. TariffExceptions (clase) __________________________________________ 7 4.3.1. Métodos___________________________________________________________ 7 5. Ejemplo Evento Sales_RecalculatePerVolume________________________ 9 Cálculo de Precios según Volumen de Venta | WhitePaper | 2 1. Propósito En este documento se explica cómo modificar los precios de una tarifa determinada en los documentos de venta en base al volumen total de material incluido en dicho documento de venta. Esta funcionalidad se implementa a través de VBA en la librería de usuario, PrefUserVB. Por ello, esta documentación está dirigida básicamente, a los programadores de esta librería, teniendo los conocimientos necesarios en VBA para poder trabajar en ello. Por otro lado, se basa en la existencia de materias primas, por lo que el lector del documento debe conocer cómo crear una materia prima y sus colores asociados. Cálculo de Precios según Volumen de Venta | WhitePaper | 3 2. Introducción Se ha añadido a PrefGest la funcionalidad de poder alterar los precios de venta en función del volumen de un presupuesto. Es, por tanto, necesario que el programa pueda calcular dicho volumen. Los materiales tendrán definidos los dxf correspondientes, los Kg/m, tendrán definidas materias primas y asociadas a los colores (Véase WP2006.3.077 Materia Prima.doc y WP2006.3.012 Gestión de Precios en Documentos de Venta.doc ). Lo que va a hacer el programa es, a través de un objeto ActiveX, darnos a conocer para un PAF, la cantidad de cada materia prima y color ( RawMaterial ) y por otro lado proporcionarnos una clase para modificar los precios (TarifExceptions). Cálculo de Precios según Volumen de Venta | WhitePaper | 4 3. Aplicar el cálculo de venta por volumen a un PAF Una vez creado el PAF y guardado podemos “recalcular” el precio para que se tengan en cuenta las variaciones del precio del material en función de la cantidad implicada en el presupuesto. Figura 1. Acceso a la opción del menú para calcular el PAF según volumen. Esto hará que se recalcule cada línea del PAF y por tanto se vuelvan a generar los precios por metro, esta vez pudiendo variarlos en función de la cantidad total del material en el PAF. A continuación es explica la lógica detrás de esto. Cálculo de Precios según Volumen de Venta | WhitePaper | 5 4. Evento Sales_RecalculatePerVolume Tenemos como parámetros de entrada: Sales: la aplicación SalesDoc: el documento de ventas actual TarifExceptions: será el objeto que nos permitirá cambiar precios RawMaterial: es la colección de materias primas con sus datos de peso, color… 4.1. RawMaterialVolumeItems (colección) 4.1.1. Propiedades Count: contador de la colección. Item: propiedad para acceder a cada materia prima de la colección, devolviendo un elemento RawMaterialVolumeItem. SupplierCode: proveedor asociado a la materia prima. 4.1.2. Métodos AddReference: añade una referencia a una materia prima de la colección. Al método se le pasa el código del material, el color y la cantidad. Reset: resetea la colección. AddGeneratedMaterial: añade un material generado a la colección, esto añadirá la cantidad de materia prima correspondiente. 4.2. RawMaterialVolumeItem (elemento en la colección) Este es el objeto que contiene cada una de las materias primas del documento de ventas. 4.2.1. Propiedades RawMaterial: cadena con el código de la materia prima. RawMaterialUnitType: esta es una propiedad de solo lectura que contiene el enumerado que asigna la unidad en la que se tarifa la materia prima. Quantification: cantidad en kilos de la materia prima. Cálculo de Precios según Volumen de Venta | WhitePaper | 6 4.2.2. Métodos GetColorQuantification: devuelve los kilos de materia prima del color pasado como entrada 4.3. TariffExceptions (clase) Esta clase nos va a permitir modificar las diferentes tarifas aplicadas al presupuesto 4.3.1. Métodos AddLabourAmountException: Modifica el precio de la mano de obra para la tarifa determinada. AddMaterialAmountException: Modifica el precio del material para la tarifa determinada. AddSurfacerAmountException: Modifica el precio de la superficie para la tarifa determinada. AddModelMaterialCoefficientException: Modifica el porcentage aplicado al tipo de producto determinado en la tarifa indicada. AddRawMaterialAmountException: Modifica para una materia prima, un proveedor y una tarifa determinados el precio por Kilo. AddModelTotalAmountExceptionForResellerSalesTariff: Modifica el precio final del modelo directamente sobre el documento de ventas realizado por el distribuidora sus clientes. AddModelTotalAmountExceptionForResellerTariff: Modifica el precio final del modelo directamente sobre el documento de ventas realizado por la fábrica a sus distribuidores. AddModelTotalCoefficientExceptionForResellerSalesTariff: Realiza un incremento sobre el precio final del modelo directamente sobre el documento de ventas realizado por el distribuidora sus clientes Realiza un incremento sobre el precio final del modelo directamente sobre el documento de ventas realizado por la fábrica a sus distribuidores. AddModelTotalCoefficientExceptionForResellerTariff: GetExceptionsXMLSerialization: devuelve en formato xml las excepciones aplicadas al modelo. PutExceptionsXMLSerialization: se pueden asignar las excepciones en formato xml. A continuación se muestra un ejemplo de una cadena xml de TariffExceptions <Exceptions> <MaterialGroupCoefficientExceptions> <MaterialGroupCoefficientException tariffType="0" tariffName="Price Increment" priceGroup="0" priceGroupIsWildcard="1" colour="" colourIsWildcard="1" factor="1.3" /> </MaterialGroupCoefficientExceptions> <LabourGroupCoefficientExceptions> <LabourGroupCoefficientException tariffType="0" tariffName="Price Increment" priceGroup="0" priceGroupIsWildcard="1" factor="1.3" /> </LabourGroupCoefficientExceptions> </Exceptions> RemoveLabourAmountException: elimina la modificación establecida para el precio de la mano de Cálculo de Precios según Volumen de Venta | WhitePaper | 7 obra para la tarifa determinada. RemoveMaterialAmountException: elimina la modificación establecida para el precio del material para la tarifa determinada. RemoveSurfacerAmountException: elimina la modificación establecida para el precio de la superficie para la tarifa determinada. RemoveModelMaterialCoefficientException: elimina la modificación porcentage aplicado al tipo de producto determinado en la tarifa indicada. establecida para el RemoveRawMaterialAmountException: elimina la modificación establecida para para una materia prima, un proveedor y una tarifa determinados el precio por Kilo. elimina la modificación establecida para el precio del modelo neto que se aplica a la tarifa que la tienda calcula para sus clientes en un PAF. RemoveModelTotalAmountExceptionForResellerSalesTariff: elimina la modificación establecida para el precio del modelo neto que se aplica a la tarifa que la fábrica calcula para sus distribuidores en un PAF. RemoveModelTotalAmountExceptionForResellerTariff: elimina el incremento establecido sobre el precio neto del modelo que se aplica a la tarifa que la tienda calcula para sus clientes en un PAF. RemoveModelTotalCoefficientExceptionForResellerSalesTariff: elimina el incremento establecido sobre el precio neto del modelo que se aplica a la tarifa que la fábrica calcula para sus distribuidores en un PAF. RemoveModelTotalCoefficientExceptionForResellerTariff: Cálculo de Precios según Volumen de Venta | WhitePaper | 8 5. Ejemplo Evento Sales_RecalculatePerVolume En el ejemplo adjunto se manipulan los precios por kilo de la materia prima del aluminio según unos baremos previamente establecidos por el proveedor (menos de 500 libras, entre 500 y 1000…) Se obtiene la variable pKGAddOn que modifica el precio por kg original de la tarifa para los dos tipos de materia prima ( “ALUMINUM 6063” y “ALUMINUM 6005”) bok = TarifExceptions.AddRawMaterialAmountException(ttNormal, "VPV", "ALUMINUM 6063", 1, pKGAddOn * kg2lb / currencyparity) bok = TarifExceptions.AddRawMaterialAmountException(ttNormal, "VPV", "ALUMINUM 6005", 1, pKGAddOn * kg2lb / currencyparity) En este mismo ejemplo se modifica también el precio de la pintura por superficie en función de unos intervalos previamente acordados con el proveedor igual que en el caso del precio por kg. Se obtiene la variable pPILFAddOn que modifica el precio por m2. TarifExceptions.AddMaterialSurfaceAmountException(ttNormal, "VPV", colour, 1, pPILFAddOn * ppilf2m_m / currencyparity) La particularidad de este ejemplo es que las excepciones vienen definidas en una cadena xml de configuración permitiendo al usuario modificar los precios sin necesidad de recompilar la dll, puesto que se leen estas modificaciones de la base de datos. Public Sub Sales_RecalculatePerVolume(ByVal Sales As PrefGest.ISales, ByVal salesdoc As PrefSales.ISalesDoc, ByVal TarifExceptions As PrefCAD.ITariffExceptions, ByVal RawMaterial As PrefCAD.IRawMaterialVolumeItems) Dim Dim Dim Dim Dim Dim Dim Dim Dim projectWeightLB As Double colourWeight As Double colour As String itRMV As RawMaterialVolumeItem rawMat As String kg2lb As Double ppilf2m_m As Double pKGAddOn As Double pPILFAddOn As Double Dim bok As Boolean Dim currencyparity As Double currencyparity = 0.769 ppilf2m_m = 1000000 / (25.4 * 12 * 25.4) kg2lb = 1 / 0.454 For Each itRMV In RawMaterial rawMat = itRMV.RawMaterial Cálculo de Precios según Volumen de Venta | WhitePaper | 9 projectWeightLB = itRMV.Quantification * kg2lb Dim Dim Dim Dim xnodelist As msxml2.IXMLDOMNodeList xmlColoursList As msxml2.IXMLDOMNodeList intcont As Integer i2 As Integer If Not xSavedAddOnPrices Is Nothing Then Set xnodelist = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPound/Extrude/Weigth/ Interval") If Not xnodelist Is Nothing Then If projectWeightLB < 500 Then For i = 0 To xnodelist.Length - 1 If xnodelist(i).Attributes.getNamedItem("lSup").nodeValue = "499" Then pKGAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If Next ElseIf (projectWeightLB >= 500 And projectWeightLB < 1000) Then For i = 0 To xnodelist.Length - 1 If xnodelist(i).Attributes.getNamedItem("lSup").nodeValue = "999" Then pKGAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If Next ElseIf projectWeightLB >= 1000 Then For i = 0 To xnodelist.Length - 1 If xnodelist(i).Attributes.getNamedItem("lSup").nodeValue = "" Then pKGAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If Next End If End If Set xnodelist = Nothing End If bok = TarifExceptions.AddRawMaterialAmountException(ttNormal, "VPV", "ALUMINUM 6063", 1, pKGAddOn * kg2lb / currencyparity) bok = TarifExceptions.AddRawMaterialAmountException(ttNormal, "VPV", "ALUMINUM 6005", 1, pKGAddOn * kg2lb / currencyparity) 'special colours change 'in the VPV tariff the price for <= 5000 lb is inserted If projectWeightLB >= 5000 And projectWeightLB < 7000 Then Cálculo de Precios según Volumen de Venta | WhitePaper | 10 Set xmlColoursList = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour") If Not xmlColoursList Is Nothing Then For intcont = 0 To xmlColoursList.Length - 1 colour = xmlColoursList(intcont).Attributes.getNamedItem("NAME").nodeValue Set xnodelist = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour[@NAME=""" + colour + """]/Weight/Interval") For i2 = 0 To xnodelist.Length - 1 If xnodelist(i2).Attributes.getNamedItem("lSup").nodeValue = "7000" Then pPILFAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If bok = TarifExceptions.AddMaterialSurfaceAmountException(ttNormal, "VPV", colour, 1, pPILFAddOn * ppilf2m_m / currencyparity) Next Next End If Set xnodelist = Nothing Set xmlColoursList = Nothing ElseIf projectWeightLB >= 7000 And projectWeightLB < 10000 Then Set xmlColoursList = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour") If Not xmlColoursList Is Nothing Then For intcont = 0 To xmlColoursList.Length - 1 colour = xmlColoursList(intcont).Attributes.getNamedItem("NAME").nodeValue Set xnodelist = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour[@NAME=""" + colour + """]/Weight/Interval") For i2 = 0 To xnodelist.Length - 1 If xnodelist(i2).Attributes.getNamedItem("lSup").nodeValue = "10000" Then pPILFAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If bok = TarifExceptions.AddMaterialSurfaceAmountException(ttNormal, "VPV", colour, 1, pPILFAddOn * ppilf2m_m / currencyparity) Next Next End If Set xnodelist = Nothing Set xmlColoursList = Nothing Cálculo de Precios según Volumen de Venta | WhitePaper | 11 ElseIf (projectWeightLB >= CDbl(10000)) And (projectWeightLB < CDbl(20000)) Then Set xmlColoursList = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour") If Not xmlColoursList Is Nothing Then For intcont = 0 To xmlColoursList.Length - 1 colour = xmlColoursList(intcont).Attributes.getNamedItem("NAME").nodeValue Set xnodelist = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour[@NAME=""" + colour + """]/Weight/Interval") For i2 = 0 To xnodelist.Length - 1 If xnodelist(i2).Attributes.getNamedItem("lSup").nodeValue = "20000" Then pPILFAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If bok = TarifExceptions.AddMaterialSurfaceAmountException(ttNormal, "VPV", colour, 1, pPILFAddOn * ppilf2m_m / currencyparity) Next Next End If Set xnodelist = Nothing Set xmlColoursList = Nothing ElseIf projectWeightLB >= 20000 And projectWeightLB < 40000 Then Set xmlColoursList = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour") If Not xmlColoursList Is Nothing Then For intcont = 0 To xmlColoursList.Length - 1 colour = xmlColoursList(intcont).Attributes.getNamedItem("NAME").nodeValue Set xnodelist = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour[@NAME=""" + colour + """]/Weight/Interval") For i2 = 0 To xnodelist.Length - 1 If xnodelist(i2).Attributes.getNamedItem("lSup").nodeValue = "40000" Then pPILFAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If bok = TarifExceptions.AddMaterialSurfaceAmountException(ttNormal, "VPV", colour, 1, pPILFAddOn * ppilf2m_m / currencyparity) Next Next Cálculo de Precios según Volumen de Venta | WhitePaper | 12 End If Set xnodelist = Nothing Set xmlColoursList = Nothing ElseIf projectWeightLB >= 40000 And projectWeightLB < 50000 Then Set xmlColoursList = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour") If Not xmlColoursList Is Nothing Then For intcont = 0 To xmlColoursList.Length - 1 colour = xmlColoursList(intcont).Attributes.getNamedItem("NAME").nodeValue Set xnodelist = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour[@NAME=""" + colour + """]/Weight/Interval") For i2 = 0 To xnodelist.Length - 1 If xnodelist(i2).Attributes.getNamedItem("lSup").nodeValue = "50000" Then pPILFAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If bok = TarifExceptions.AddMaterialSurfaceAmountException(ttNormal, "VPV", colour, 1, pPILFAddOn * ppilf2m_m / currencyparity) Next Next End If Set xnodelist = Nothing Set xmlColoursList = Nothing ElseIf projectWeightLB >= 50000 Then Set xmlColoursList = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour") If Not xmlColoursList Is Nothing Then For intcont = 0 To xmlColoursList.Length - 1 colour = xmlColoursList(intcont).Attributes.getNamedItem("NAME").nodeValue Set xnodelist = xSavedAddOnPrices.selectNodes("descendant::AddOnPrices/PerPerimetralInch/Paint/ Colour[@NAME=""" + colour + """]/Weight/Interval") For i2 = 0 To xnodelist.Length - 1 If xnodelist(i2).Attributes.getNamedItem("lSup").nodeValue = "" Then pPILFAddOn = xnodelist(i).Attributes.getNamedItem("Value").nodeValue Exit For End If bok = TarifExceptions.AddMaterialSurfaceAmountException(ttNormal, "VPV", colour, 1, pPILFAddOn * ppilf2m_m / currencyparity) Next Next Cálculo de Precios según Volumen de Venta | WhitePaper | 13 End If Set xnodelist = Nothing Set xmlColoursList = Nothing End If Next End Sub Cálculo de Precios según Volumen de Venta | WhitePaper | 14