This discussion explains the idea of unified transformation algorithm which should be common to all AggregagtedAmountList generators.
Table of Contents
Discussion and Transformation Algorithm¶
Please refer to ERP5 Taxes and Discounts to better understand.
It also provides some answers to the Discussion on Taxes
It does not discuss (yet) rounding issues.
# Generic Transformation Algorithm
# the same algorithm should apply to payroll, taxes and MRP transformations
# Set the common arbitrary base amounts in a dictionary
base_amount = {
'delivery': 1,
'employee': 100,
}
# Set ungrouped empty result list
ungrouped_result = []
# Build the amounts from delivery lines and trade model lines
for line in delivery.contentValues(use='product'):
# Set line level base application amounts
for application in line.getBaseApplicationList(): # Acquired from Resource
base_amount[application] = total_price=line.getTotalPrice()
# Set line level arbitrary base amounts
base_amount.update(dict(
price=line.getPrice(),
quantity=line.getQuantity(),
unit=(line.getQuantityUnit() == 'unit') * line.getQuantity(),
ton=(line.getQuantityUnit() == 'ton') * line.getQuantity(),
# more base applications could be set here
))
# Feed the result with trade model (which must be ordered through constraint resolution)
for trade_model_line in trade_model.contentValues(portal_type="Trade Model Line"):
if trade_model_line.getResource():
# This line has a resource, it is an output line
amount = Amount(resource=trade_model_line.getResource(),
# Resource can be a VAT service or a Component in MRP
quantity=base_amount[trade_model_line.getBaseApplication()]
*(trade_model_line.getQuantity() or 1.0),
# Quantity is used a multiplier (like in transformations for MRP)
price=trade_model_line.getPrice(),
# Price could be empty here (like in Transformation)
# or set to the price of a product (ex. a Stamp)
# or set to a tax ratio (ie. price per value units)
base_contribution_list=trade_model_line.getBaseContributionList(),
# We save here the base contribution so that they can
# be later used by getTotalPrice on the delivery itself
)
ungrouped_result.append(amount)
else:
# This line has a no resource, it is an intermediate line
value = base_amount[trade_model_line.getBaseApplication()]
*(trade_model_line.getQuantity() or 1.0)
# Quantity is used as a multiplier
*(trade_model_line.getPrice() or 1.0)
# Price is used as a ratio (also a kind of multiplier)
for key in trade_model_line.getBaseContribution():
base_amount[key] += value
# Compute the grouped result
grouped_result = SomeMovementGroup(ungrouped_result)
# Return result
return grouped_result
Related Articles¶