[Erp5-report] r30868 - /erp5/trunk/products/ERP5/tests/testTradeModelLine.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Nov 26 04:34:28 CET 2009


Author: yusei
Date: Thu Nov 26 04:34:28 2009
New Revision: 30868

URL: http://svn.erp5.org?rev=30868&view=rev
Log:
Add a test for rounding.

Modified:
    erp5/trunk/products/ERP5/tests/testTradeModelLine.py

Modified: erp5/trunk/products/ERP5/tests/testTradeModelLine.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testTradeModelLine.py?rev=30868&r1=30867&r2=30868&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testTradeModelLine.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testTradeModelLine.py [utf8] Thu Nov 26 04:34:28 2009
@@ -2488,6 +2488,170 @@
     self.assertEqual(100 - 10 + 1500*0.05,
                      getTotalAmount(amount_list))
 
+  def test_tradeModelLineWithRounding(self):
+    """
+      Test if trade model line works with rounding.
+    """
+    from Products.ERP5.PropertySheet.TradeModelLine import (
+      TARGET_LEVEL_MOVEMENT,
+      TARGET_LEVEL_DELIVERY)
+
+    trade_condition = self.createTradeCondition()
+    # create a model line and set target level to `delivery`
+    tax = self.createTradeModelLine(trade_condition,
+                                    reference='TAX',
+                                    base_application_list=['base_amount/tax'],
+                                    base_contribution_list=['base_amount/total_tax'])
+    tax.edit(price=0.05, target_level=TARGET_LEVEL_DELIVERY)
+
+    # create a rounding model for tax
+    rounding_model = self.portal.portal_roundings.newContent(portal_type='Rounding Model')
+    rounding_model.setDecimalRoundingOption('ROUND_DOWN')
+    rounding_model.setDecimalExponent('1')
+    rounding_model.setRoundedPropertyId('total_price')
+    rounding_model._setMembershipCriterionCategoryList(['base_contribution/base_amount/total_tax'])
+    rounding_model._setMembershipCriterionBaseCategoryList(['base_contribution'])
+    rounding_model.validate()
+
+    # create an order
+    resource_A = self.createResource('Product', title='A')
+    resource_B = self.createResource('Product', title='B')
+    order = self.createOrder()
+    order.setSpecialiseValue(trade_condition)
+    order_line_1 = order.newContent(portal_type=self.order_line_portal_type,
+                                    price=3333, quantity=1,
+                                    resource_value=resource_A,
+                                    base_contribution_list=['base_amount/tax'])
+    order_line_2 = order.newContent(portal_type=self.order_line_portal_type,
+                                    price=171, quantity=1,
+                                    resource_value=resource_B,
+                                    base_contribution_list=['base_amount/tax'])
+
+    transaction.commit()
+    self.tic()
+
+    # check the result without rounding
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=False)
+    self.assertEqual(1, len(amount_list))
+    self.assertEqual(set([order_line_1, order_line_2]),
+                     set(amount_list[0].getCausalityValueList()))
+    self.assertEqual((3333+171)*0.05, amount_list[0].getTotalPrice())
+    # check the result with rounding
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=True)
+    self.assertEqual(1, len(amount_list))
+    self.assertEqual(set([order_line_1, order_line_2]),
+                     set(amount_list[0].getCausalityValueList()))
+    self.assertEqual(175, amount_list[0].getTotalPrice())
+
+    # change tax trade model line to `movement` level
+    tax.edit(target_level=TARGET_LEVEL_MOVEMENT)
+
+    def getTotalAmount(amount_list):
+      result = 0
+      for amount in amount_list:
+        if amount.getBaseContribution() in ('base_amount/total', 'base_amount/total_tax'):
+          result += amount.getTotalPrice()
+      return result
+
+    # check the result without rounding
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=False)
+    self.assertEqual(2, len(amount_list))
+    self.assertEqual(3333*0.05+171*0.05, getTotalAmount(amount_list))
+    # check the result with rounding
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=True)
+    self.assertEqual(2, len(amount_list))
+    self.assertEqual(174, getTotalAmount(amount_list))
+
+    # check getAggregatedAmountList result of each movement
+    # order line 1
+    amount_list = trade_condition.getAggregatedAmountList(order_line_1,
+                                                          rounding=False)
+    self.assertEqual(1, len(amount_list))
+    self.assertEqual(3333*0.05, amount_list[0].getTotalPrice())
+    amount_list = trade_condition.getAggregatedAmountList(order_line_1,
+                                                          rounding=True)
+    self.assertEqual(1, len(amount_list))
+    self.assertEqual(166, amount_list[0].getTotalPrice())
+    # order line 2
+    amount_list = trade_condition.getAggregatedAmountList(order_line_2,
+                                                          rounding=False)
+    self.assertEqual(1, len(amount_list))
+    self.assertEqual(171*0.05, amount_list[0].getTotalPrice())
+    amount_list = trade_condition.getAggregatedAmountList(order_line_2,
+                                                          rounding=True)
+    self.assertEqual(1, len(amount_list))
+    self.assertEqual(8, amount_list[0].getTotalPrice())
+
+    # change rounding model definition
+    rounding_model.setDecimalRoundingOption('ROUND_UP')
+    rounding_model.setDecimalExponent('1')
+    rounding_model.setRoundedPropertyIdList(['total_price', 'quantity'])
+
+    # change quantity
+    order_line_1.edit(quantity=3.3333)
+
+    transaction.commit()
+    self.tic()
+
+    # check the result without rounding
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=False)
+    self.assertEqual(2, len(amount_list))
+    self.assertEqual(3.3333*3333*0.05+171*0.05, getTotalAmount(amount_list))
+    # check the result with rounding
+    # both quantity and total price will be rounded so that the expression
+    # should be "round_up(round_up(3.3333 * 3333) * 0.05) + round_up(round_up
+    # (1* 171) * 0.05)"
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=True)
+    self.assertEqual(2, len(amount_list))
+    self.assertEqual(565, getTotalAmount(amount_list))
+
+    # create a rounding model to round quantity property of order line
+    rounding_model_for_quantity = self.portal.portal_roundings.newContent(portal_type='Rounding Model')
+    rounding_model_for_quantity.setDecimalRoundingOption('ROUND_DOWN')
+    rounding_model_for_quantity.setDecimalExponent('1')
+    rounding_model_for_quantity.setRoundedPropertyId('quantity')
+    rounding_model_for_quantity._setMembershipCriterionCategoryList(['base_contribution/base_amount/tax'])
+    rounding_model_for_quantity._setMembershipCriterionBaseCategoryList(['base_contribution'])
+    rounding_model_for_quantity.validate()
+
+    transaction.commit()
+    self.tic()
+
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=True)
+    # The expression should be "round_up(round_up(round_down(3.3333) * 3333)
+    # * 0.05) + round_up(round_up(round_down(1) * 171) * 0.05)"
+    self.assertEqual(2, len(amount_list))
+    self.assertEqual(509, getTotalAmount(amount_list))
+
+    # create a rounding model to round price property of order line
+    rounding_model_for_price = self.portal.portal_roundings.newContent(portal_type='Rounding Model')
+    rounding_model_for_price.setDecimalRoundingOption('ROUND_UP')
+    rounding_model_for_price.setDecimalExponent('0.1')
+    rounding_model_for_price.setRoundedPropertyId('price')
+    rounding_model_for_price._setMembershipCriterionCategoryList(['base_contribution/base_amount/tax'])
+    rounding_model_for_price._setMembershipCriterionBaseCategoryList(['base_contribution'])
+    rounding_model_for_price.validate()
+
+    # change price
+    order_line_2.edit(price=171.1234)
+    # invalidate rounding model for total price
+    rounding_model.invalidate()
+
+    transaction.commit()
+    self.tic()
+
+    # check the result without rounding
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=False)
+    self.assertEqual(2, len(amount_list))
+    self.assertEqual(3.3333*3333*0.05+171.1234*0.05, getTotalAmount(amount_list))
+    # check the result with rounding
+    amount_list = trade_condition.getAggregatedAmountList(order, rounding=True)
+    # The expression should be "round_down(3.3333) * round_up(3333) * 0.05 +
+    # round_down(1) * round_up(171.1234) * 0.05"
+    self.assertEqual(2, len(amount_list))
+    self.assertEqual(508.51000000000005, getTotalAmount(amount_list))
+
+
 class TestTradeModelLineSale(TestTradeModelLine):
   invoice_portal_type = 'Sale Invoice Transaction'
   invoice_line_portal_type = 'Invoice Line'




More information about the Erp5-report mailing list