PrefSuite - Cálculo de Precios según Volumen de Venta

Anuncio
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
Documentos relacionados
Descargar