# Aggregated Amount Unified Algorithm

discussion explaining the idea of a unified transformation algorithm
• Last Update:2016-04-08
• Version:001
• Language:en

This discussion explains the idea of unified transformation algorithm which should be common to all AggregagtedAmountList generators.

```# 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```