From 0b0ff618cb71515741a0e399698fc09081762dda Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Nowak?= <luke@nexedi.com>
Date: Thu, 24 Dec 2009 10:49:02 +0000
Subject: [PATCH]  - split tax line trade condition testing to separate file

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@31456 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../tests/testTestTaxLineTradeCondition.py    | 1283 +++++++++++++++++
 product/ERP5/tests/testTradeCondition.py      | 1268 ----------------
 2 files changed, 1283 insertions(+), 1268 deletions(-)
 create mode 100644 product/ERP5/tests/testTestTaxLineTradeCondition.py

diff --git a/product/ERP5/tests/testTestTaxLineTradeCondition.py b/product/ERP5/tests/testTestTaxLineTradeCondition.py
new file mode 100644
index 0000000000..0a3dd9a987
--- /dev/null
+++ b/product/ERP5/tests/testTestTaxLineTradeCondition.py
@@ -0,0 +1,1283 @@
+import unittest
+import transaction
+from DateTime import DateTime
+from Products.ERP5.tests.testTradeCondition import TestWithSaleOrder, \
+    TestWithPurchaseOrder, TestWithSaleInvoice, TestWithPurchaseInvoice, \
+    TradeConditionTestCase, AccountingBuildTestCase
+
+class TestTaxLineCalculation(TradeConditionTestCase):
+  """Test calculating Tax Lines.
+  """
+  def test_apply_trade_condition_twice_and_tax_lines(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    # this creates a tax line, with quantity 0, and it will be updated when
+    # needed
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+    
+    # if we apply twice, we don't have the tax lines twice
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+
+  def test_apply_trade_condition_after_line_creation(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    order_line = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=10,
+                          price=10,)
+
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    transaction.commit()
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+  def test_simple_tax_model_line_calculation(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    # this creates a tax line, with quantity 0, and it will be updated when
+    # needed
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=10,
+                          price=10,)
+
+    transaction.commit()
+    # at the end of transaction, tax lines are updated
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(20, tax_line.getTotalPrice())
+    
+  def test_tax_model_line_calculation_with_two_lines(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    # this creates a tax line, with quantity 0, and it will be updated when
+    # needed
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line_1 = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=3,
+                          price=10,)
+    order_line_2 = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=7,
+                          price=10,)
+    
+    transaction.commit()
+    # at the end of transaction, tax lines are updated
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(20, tax_line.getTotalPrice())
+    
+    order_line_1_tax_line_list = \
+      order_line_1.DeliveryMovement_getCorrespondingTaxLineList()
+    self.assertEquals(1, len(order_line_1_tax_line_list))
+    tax_line = order_line_1_tax_line_list[0]
+    self.assertEquals(30, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(6, tax_line.getTotalPrice())
+
+    order_line_2_tax_line_list = \
+      order_line_2.DeliveryMovement_getCorrespondingTaxLineList()
+    self.assertEquals(1, len(order_line_2_tax_line_list))
+    tax_line = order_line_2_tax_line_list[0]
+    self.assertEquals(70, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(14, tax_line.getTotalPrice())
+
+  def test_tax_on_tax(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    base_2 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 2')
+    tax2 = self.portal.tax_module.newContent(
+                          portal_type='Tax',
+                          title='Tax 2')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  base_contribution_value=base_2,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_2,
+                  float_index=2,
+                  efficiency=0.5,
+                  resource_value=tax2)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    transaction.commit()
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(2, len(tax_line_list))
+    tax_line1 = [tl for tl in tax_line_list if
+                   tl.getResourceValue() == self.tax][0]
+    self.assertEquals(0, tax_line1.getQuantity())
+    self.assertEquals(0.2, tax_line1.getPrice())
+    self.assertEquals(1, tax_line1.getFloatIndex())
+    self.assertEquals([base_1], tax_line1.getBaseApplicationValueList())
+    self.assertEquals([base_2], tax_line1.getBaseContributionValueList())
+
+    tax_line2 = [tl for tl in tax_line_list if
+                   tl.getResourceValue() == tax2][0]
+    self.assertEquals(0, tax_line2.getQuantity())
+    self.assertEquals(0.5, tax_line2.getPrice())
+    self.assertEquals(2, tax_line2.getFloatIndex())
+    self.assertEquals([base_2], tax_line2.getBaseApplicationValueList())
+
+    order_line = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=3,
+                          price=10,)
+    transaction.commit()
+    self.assertEquals(30, tax_line1.getQuantity())
+    self.assertEquals((30*0.2), tax_line2.getQuantity())
+    
+    order_line.setQuantity(5)
+    transaction.commit()
+    self.assertEquals(50, tax_line1.getQuantity())
+    self.assertEquals((50*0.2), tax_line2.getQuantity())
+    
+    tax_movement_list = order_line.DeliveryMovement_getCorrespondingTaxLineList()
+    self.assertEquals(2, len(tax_movement_list))
+    tax_1_movement = [m for m in tax_movement_list if m.getPrice() == 0.2][0]
+    self.assertEquals(tax_1_movement.getQuantity(), 50)
+    tax_2_movement = [m for m in tax_movement_list if m.getPrice() == 0.5][0]
+    self.assertEquals(tax_2_movement.getQuantity(), 50*0.2)
+
+
+  def test_update_order_line_quantity_update_tax_line(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    # this creates a tax line, with quantity 0, and it will be updated when
+    # needed
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=10,
+                          price=10,)
+
+    transaction.commit()
+    # tax lines are updated
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(20, tax_line.getTotalPrice())
+    
+    # change the quantity on order_line,
+    order_line.setQuantity(20)
+    transaction.commit()
+    # the tax line is updated (by an interraction workflow at the end of
+    # transaction)
+    self.assertEquals(200, tax_line.getQuantity())
+    self.assertEquals(40, tax_line.getTotalPrice())
+
+  def test_delete_order_line_quantity_update_tax_line(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    # this creates a tax line, with quantity 0, and it will be updated when
+    # needed
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=10,
+                          price=10,)
+
+    transaction.commit()
+    # tax lines are updated
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(20, tax_line.getTotalPrice())
+    
+    # delete the order line
+    self.order.manage_delObjects([order_line.getId()])
+    # the tax line is updated
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(0, tax_line.getTotalPrice())
+
+  def test_clone_order_line_quantity_update_tax_line(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    # this creates a tax line, with quantity 0, and it will be updated when
+    # needed
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=10,
+                          price=10,)
+
+    transaction.commit()
+    # tax lines are updated
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(20, tax_line.getTotalPrice())
+    
+    # clone the order line
+    cloned_order_line = order_line.Base_createCloneDocument(batch_mode=1)
+    # the tax line is updated
+    self.assertEquals(200, tax_line.getQuantity())
+    self.assertEquals(40, tax_line.getTotalPrice())
+
+  def test_order_cell_and_tax_line(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    # make a resource with size variation
+    self.resource.setVariationBaseCategoryList(('size',))
+    self.resource.setVariationCategoryList(('size/big', 'size/small'))
+
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    # this creates a tax line, with quantity 0, and it will be updated when
+    # needed
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,)
+    order_line.setVariationCategoryList(('size/big', 'size/small'))
+    order_line.updateCellRange(base_id='movement')
+    cell_red = order_line.newCell('size/big',
+                                  portal_type=self.order_cell_type,
+                                  base_id='movement')
+    cell_red.setMappedValuePropertyList(['quantity', 'price'])
+    cell_red.setPrice(5)
+    cell_red.setQuantity(10)
+    cell_blue = order_line.newCell('size/small',
+                             portal_type=self.order_cell_type,
+                             base_id='movement')
+    cell_blue.setMappedValuePropertyList(['quantity', 'price'])
+    cell_blue.setPrice(2)
+    cell_blue.setQuantity(25)
+    self.assertEquals(100, order_line.getTotalPrice(fast=0))
+    
+    transaction.commit()
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+    
+    self.assertEquals(100, self.order.getTotalPrice(fast=0))
+    self.assertEquals(120, self.order.getTotalNetPrice(fast=0))
+
+
+  def test_hierarchical_order_line_and_tax_line(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    # this creates a tax line, with quantity 0, and it will be updated when
+    # needed
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line = self.order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,)
+    suborder_line1 = order_line.newContent(
+                          portal_type=self.order_line_type,
+                          quantity=4,
+                          price=5)
+    suborder_line2 = order_line.newContent(
+                          portal_type=self.order_line_type,
+                          quantity=2,
+                          price=40)
+
+    transaction.commit()
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+  
+  def test_base_contribution_pseudo_acquisition(self):
+    base_1 = self.base_amount.newContent(portal_type='Category',
+                                         title='Base 1')
+    self.resource.setBaseContributionValueList((base_1,))
+    line = self.order.newContent(portal_type=self.order_line_type)
+    self.assertEquals([], line.getBaseContributionValueList())
+    line.setResourceValue(self.resource)
+    self.assertEquals([base_1], line.getBaseContributionValueList())
+    line.setBaseContributionValueList([])
+    self.assertEquals([], line.getBaseContributionValueList())
+
+  def test_multiple_order_line_multiple_tax_line(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    base_2 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 2')
+    self.resource.setBaseContributionValueList((base_1, base_2))
+    tax_model_line_1 = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.1,
+                  resource_value=self.tax)
+    tax_model_line_2 = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_2,
+                  float_index=2,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    tax_model_line_1_2 = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value_list=(base_1, base_2),
+                  float_index=3,
+                  efficiency=0.3,
+                  resource_value=self.tax)
+    
+    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
+    line_1 = self.order.newContent(
+                  portal_type=self.order_line_type,
+                  quantity=1, price=1,
+                  resource_value=self.resource,
+                  base_contribution_value_list=(base_1,))
+    # -> tax_model_line_1 and tax_model_line_1_2 are applicable
+    line_2 = self.order.newContent(
+                  portal_type=self.order_line_type,
+                  quantity=2, price=2,
+                  resource_value=self.resource,
+                  base_contribution_value_list=(base_2,))
+    # -> tax_model_line_2 and tax_model_line_1_2 are applicable
+    line_3 = self.order.newContent(
+                  portal_type=self.order_line_type,
+                  quantity=3, price=3,
+                  resource_value=self.resource,
+                  base_contribution_value_list=(base_1, base_2))
+    # -> tax_model_line_1, tax_model_line_2 and tax_model_line_1_2 are applicable
+    #  (but they are not applied twice)
+
+    transaction.commit()
+    tax_line_list = self.order.contentValues(portal_type='Tax Line')
+    self.assertEquals(3, len(tax_line_list))
+    tax_line_1 = [x for x in tax_line_list if x.getPrice() == 0.1][0]
+    tax_line_2 = [x for x in tax_line_list if x.getPrice() == 0.2][0]
+    tax_line_3 = [x for x in tax_line_list if x.getPrice() == 0.3][0]
+
+    self.assertEquals(sum([line_1.getTotalPrice(),
+                           line_3.getTotalPrice()]), tax_line_1.getQuantity())
+    self.assertEquals(sum([line_2.getTotalPrice(),
+                           line_3.getTotalPrice()]), tax_line_2.getQuantity())
+    self.assertEquals(sum([line_1.getTotalPrice(),
+                           line_2.getTotalPrice(),
+                           line_3.getTotalPrice()]), tax_line_3.getQuantity())
+
+    tax_movement_list = line_1.DeliveryMovement_getCorrespondingTaxLineList()
+    self.assertEquals(2, len(tax_movement_list))
+    tax_1_movement = [m for m in tax_movement_list if m.getPrice() == 0.1][0]
+    self.assertEquals(tax_1_movement.getQuantity(), 1)
+    tax_3_movement = [m for m in tax_movement_list if m.getPrice() == 0.3][0]
+    self.assertEquals(tax_3_movement.getQuantity(), 1)
+    
+    tax_movement_list = line_2.DeliveryMovement_getCorrespondingTaxLineList()
+    self.assertEquals(2, len(tax_movement_list))
+    tax_2_movement = [m for m in tax_movement_list if m.getPrice() == 0.2][0]
+    self.assertEquals(tax_2_movement.getQuantity(), 4)
+    tax_3_movement = [m for m in tax_movement_list if m.getPrice() == 0.3][0]
+    self.assertEquals(tax_3_movement.getQuantity(), 4)
+    
+    tax_movement_list = line_3.DeliveryMovement_getCorrespondingTaxLineList()
+    self.assertEquals(3, len(tax_movement_list))
+    tax_1_movement = [m for m in tax_movement_list if m.getPrice() == 0.1][0]
+    self.assertEquals(tax_1_movement.getQuantity(), 9)
+    tax_2_movement = [m for m in tax_movement_list if m.getPrice() == 0.2][0]
+    self.assertEquals(tax_2_movement.getQuantity(), 9)
+    tax_3_movement = [m for m in tax_movement_list if m.getPrice() == 0.3][0]
+    self.assertEquals(tax_3_movement.getQuantity(), 9)
+    
+  def test_temp_order(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+
+    order = self.portal.getDefaultModule(self.order_type).newContent(
+                          portal_type=self.order_type,
+                          temp_object=1)
+    order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    tax_line_list = order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=10,
+                          price=40)
+    transaction.commit()
+
+    tax_line_list = order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(400, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+  
+  def test_temp_order_hierarchical(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+
+    order = self.portal.getDefaultModule(self.order_type).newContent(
+                          portal_type=self.order_type,
+                          temp_object=1)
+    order.Order_applyTradeCondition(self.trade_condition, force=1)
+
+    tax_line_list = order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(0, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order_line = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,)
+    suborder_line1 = order_line.newContent(
+                          portal_type=self.order_line_type,
+                          quantity=4,
+                          price=5)
+    suborder_line2 = order_line.newContent(
+                          portal_type=self.order_line_type,
+                          quantity=2,
+                          price=40)
+
+    transaction.commit()
+    tax_line_list = order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(0.2, tax_line.getPrice())
+  
+
+class TestTaxLineOrderSimulation(AccountingBuildTestCase):
+  """Test Simulation of Tax Lines on Orders
+  """
+  def test_tax_line_simulation(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    order = self.order
+    order.Order_applyTradeCondition(self.trade_condition, force=1)
+    order.setSourceSectionValue(self.vendor)
+    order.setSourceValue(self.vendor)
+    order.setDestinationSectionValue(self.client)
+    order.setDestinationValue(self.client)
+    order.setStartDate(DateTime(2001, 1, 1))
+    order_line = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=10,
+                          price=10,)
+    order.plan()
+    order.confirm()
+    self.assertEquals('confirmed', order.getSimulationState())
+    transaction.commit()
+    self.tic()
+    related_applied_rule_list = order.getCausalityRelatedValueList(
+                                      portal_type='Applied Rule')
+    self.assertEquals(1, len(related_applied_rule_list))
+    root_applied_rule = related_applied_rule_list[0]
+    simulation_movement_list = root_applied_rule.contentValues(
+                                   portal_type='Simulation Movement')
+    self.assertEquals(1, len(simulation_movement_list))
+    level2_applied_rule_list = simulation_movement_list[0].contentValues()
+    self.assertEquals(2, len(level2_applied_rule_list))
+    # first test the invoice movement, they should have base_contribution set
+    # correctly
+    invoice_rule_list = [ar for ar in level2_applied_rule_list if
+             ar.getSpecialiseValue().getPortalType() == 'Invoicing Rule']
+    self.assertEquals(1, len(invoice_rule_list))
+    invoice_simulation_movement_list = invoice_rule_list[0].contentValues()
+    self.assertEquals(1, len(invoice_simulation_movement_list))
+    invoice_simulation_movement = invoice_simulation_movement_list[0]
+    self.assertEquals(self.resource,
+        invoice_simulation_movement.getResourceValue())
+    self.assertEquals([base_1],
+        invoice_simulation_movement.getBaseContributionValueList())
+
+    # now test the tax movement
+    applied_tax_rule_list = [ar for ar in level2_applied_rule_list if
+             ar.getSpecialiseValue().getPortalType() == 'Tax Rule']
+    self.assertEquals(1, len(applied_tax_rule_list))
+    tax_simulation_movement_list = applied_tax_rule_list[0].contentValues()
+    self.assertEquals(1, len(tax_simulation_movement_list))
+    tax_simulation_movement = tax_simulation_movement_list[0]
+
+    self.assertEquals(self.tax, tax_simulation_movement.getResourceValue())
+    self.assertEquals([base_1],
+                      tax_simulation_movement.getBaseApplicationValueList())
+    self.assertEquals(100, tax_simulation_movement.getQuantity())
+    self.assertEquals(0.2, tax_simulation_movement.getPrice())
+    
+    # reexpand and check nothing changed
+    root_applied_rule.expand()
+    applied_tax_rule_list = [ar for ar in level2_applied_rule_list if
+             ar.getSpecialiseValue().getPortalType() == 'Tax Rule']
+    self.assertEquals(1, len(applied_tax_rule_list))
+    tax_simulation_movement_list = applied_tax_rule_list[0].contentValues()
+    self.assertEquals(1, len(tax_simulation_movement_list))
+    tax_simulation_movement = tax_simulation_movement_list[0]
+
+    self.assertEquals(self.tax, tax_simulation_movement.getResourceValue())
+    self.assertEquals([base_1],
+                      tax_simulation_movement.getBaseApplicationValueList())
+    self.assertEquals(100, tax_simulation_movement.getQuantity())
+    self.assertEquals(0.2, tax_simulation_movement.getPrice())
+
+  def test_2_tax_lines_simulation(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    order = self.order
+    order.Order_applyTradeCondition(self.trade_condition, force=1)
+    order.setSourceSectionValue(self.vendor)
+    order.setSourceValue(self.vendor)
+    order.setDestinationSectionValue(self.client)
+    order.setDestinationValue(self.client)
+    order.setStartDate(DateTime(2001, 1, 1))
+    order_line1 = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=2,
+                          price=15,)
+    order_line2 = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=7,
+                          price=10,)
+    order.plan()
+    order.confirm()
+    self.assertEquals('confirmed', order.getSimulationState())
+    transaction.commit()
+    self.tic()
+    related_applied_rule_list = order.getCausalityRelatedValueList(
+                                      portal_type='Applied Rule')
+    self.assertEquals(1, len(related_applied_rule_list))
+    root_applied_rule = related_applied_rule_list[0]
+    simulation_movement_list = root_applied_rule.contentValues(
+                                   portal_type='Simulation Movement')
+    self.assertEquals(2, len(simulation_movement_list))
+    # line 1
+    line1_simulation_movement_list = [sm for sm in simulation_movement_list
+          if sm.getOrderValue() == order_line1]
+    self.assertEquals(1, len(line1_simulation_movement_list))
+    simulation_movement = line1_simulation_movement_list[0]
+    self.assertEquals(2.0, simulation_movement.getQuantity())
+    applied_tax_rule_list = [ar for ar in simulation_movement.objectValues()
+        if ar.getSpecialiseValue().getPortalType() == 'Tax Rule']
+    self.assertEquals(1, len(applied_tax_rule_list))
+    tax_simulation_movement_list = applied_tax_rule_list[0].contentValues()
+    self.assertEquals(1, len(tax_simulation_movement_list))
+    tax_simulation_movement = tax_simulation_movement_list[0]
+    self.assertEquals(self.tax, tax_simulation_movement.getResourceValue())
+    self.assertEquals([base_1],
+                      tax_simulation_movement.getBaseApplicationValueList())
+    self.assertEquals(30, tax_simulation_movement.getQuantity())
+    self.assertEquals(0.2, tax_simulation_movement.getPrice())
+    
+    # line 2
+    line2_simulation_movement_list = [sm for sm in simulation_movement_list
+          if sm.getOrderValue() == order_line2]
+    self.assertEquals(1, len(line2_simulation_movement_list))
+    simulation_movement = line2_simulation_movement_list[0]
+    self.assertEquals(7., simulation_movement.getQuantity())
+    applied_tax_rule_list = [ar for ar in simulation_movement.objectValues()
+        if ar.getSpecialiseValue().getPortalType() == 'Tax Rule']
+    self.assertEquals(1, len(applied_tax_rule_list))
+    tax_simulation_movement_list = applied_tax_rule_list[0].contentValues()
+    self.assertEquals(1, len(tax_simulation_movement_list))
+    tax_simulation_movement = tax_simulation_movement_list[0]
+    self.assertEquals(self.tax, tax_simulation_movement.getResourceValue())
+    self.assertEquals([base_1],
+                      tax_simulation_movement.getBaseApplicationValueList())
+    self.assertEquals(70, tax_simulation_movement.getQuantity())
+    self.assertEquals(0.2, tax_simulation_movement.getPrice())
+
+
+  def test_tax_line_build(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    order = self.order
+    order.Order_applyTradeCondition(self.trade_condition, force=1)
+    order.setSourceSectionValue(self.vendor)
+    order.setSourceValue(self.vendor)
+    order.setDestinationSectionValue(self.client)
+    order.setDestinationValue(self.client)
+    order.setPriceCurrencyValue(self.currency)
+    order.setStartDate(DateTime(2001, 1, 1))
+    order_line = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=2,
+                          price=15,)
+    order.plan()
+    order.confirm()
+    self.assertEquals('confirmed', order.getSimulationState())
+    transaction.commit()
+    self.tic()
+    related_delivery = order.getCausalityRelatedValue(
+                  portal_type=('Purchase Packing List', 'Sale Packing List'))
+    self.assertNotEquals(related_delivery, None)
+    related_delivery.setReady()
+    related_delivery.start()
+    related_delivery.stop()
+    related_delivery.deliver()
+    self.assertEquals('delivered', related_delivery.getSimulationState())
+    transaction.commit()
+    self.tic()
+    
+    related_invoice = related_delivery.getCausalityRelatedValue(
+                  portal_type=('Purchase Invoice Transaction',
+                               'Sale Invoice Transaction'))
+    self.assertNotEquals(related_invoice, None)
+    invoice_line_list = related_invoice.contentValues(
+                  portal_type='Invoice Line')
+    tax_line_list = related_invoice.contentValues(
+                  portal_type='Tax Line')
+
+    self.assertEquals(1, len(invoice_line_list))
+    invoice_line = invoice_line_list[0]
+    self.assertEquals(2, invoice_line.getQuantity())
+    self.assertEquals(15, invoice_line.getPrice())
+    self.assertEquals(self.resource, invoice_line.getResourceValue())
+    self.assertEquals([base_1], invoice_line.getBaseContributionValueList())
+
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(30, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals([base_1], tax_line.getBaseApplicationValueList())
+    self.assertEquals([], tax_line.getBaseContributionValueList())
+
+    self.assertEquals('solved', related_invoice.getCausalityState())
+
+    # Of course, this invoice does not generate simulation again. An applied
+    # rule is created, but it is empty.
+    related_applied_rule = related_invoice.getCausalityRelatedValue(
+                                portal_type='Applied Rule')
+    self.assertEquals(0, len(related_applied_rule.objectValues()))
+    
+  def test_tax_line_build_accounting(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    order = self.order
+    order.Order_applyTradeCondition(self.trade_condition, force=1)
+    order.setSourceSectionValue(self.vendor)
+    order.setSourceValue(self.vendor)
+    order.setDestinationSectionValue(self.client)
+    order.setDestinationValue(self.client)
+    order.setPriceCurrencyValue(self.currency)
+    order.setStartDate(DateTime(2001, 1, 1))
+    order_line = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=2,
+                          price=15,)
+    order.plan()
+    order.confirm()
+    self.assertEquals('confirmed', order.getSimulationState())
+    transaction.commit()
+    self.tic()
+    related_delivery = order.getCausalityRelatedValue(
+                  portal_type=('Purchase Packing List', 'Sale Packing List'))
+    self.assertNotEquals(related_delivery, None)
+    related_delivery.setReady()
+    related_delivery.start()
+    related_delivery.stop()
+    related_delivery.deliver()
+    self.assertEquals('delivered', related_delivery.getSimulationState())
+    transaction.commit()
+    self.tic()
+    
+    related_invoice = related_delivery.getCausalityRelatedValue(
+                  portal_type=('Purchase Invoice Transaction',
+                               'Sale Invoice Transaction'))
+    self.assertNotEquals(related_invoice, None)
+    self.assertEquals('confirmed', related_invoice.getSimulationState())
+    self.assertEquals('solved', related_invoice.getCausalityState())
+    accounting_line_list = related_invoice.getMovementList(
+                    portal_type=self.portal.getPortalAccountingMovementTypeList())
+    self.assertEquals(0, len(accounting_line_list))
+
+    related_invoice.start()
+    transaction.commit()
+    self.tic()
+    self.assertEquals('started', related_invoice.getSimulationState())
+    self.assertEquals('solved', related_invoice.getCausalityState())
+
+    accounting_line_list = related_invoice.getMovementList(
+                    portal_type=self.portal.getPortalAccountingMovementTypeList())
+    self.assertEquals(3, len(accounting_line_list))
+    receivable_line = [l for l in accounting_line_list if
+                        l.getSourceValue() == self.receivable_account][0]
+    self.assertEquals(self.payable_account,
+                      receivable_line.getDestinationValue())
+    self.assertEquals(36, receivable_line.getSourceDebit())
+    
+    tax_line = [l for l in accounting_line_list if
+                        l.getSourceValue() == self.collected_tax_account][0]
+    self.assertEquals(self.refundable_tax_account,
+                      tax_line.getDestinationValue())
+    self.assertEquals(6, tax_line.getSourceCredit())
+
+    income_line = [l for l in accounting_line_list if
+                        l.getSourceValue() == self.income_account][0]
+    self.assertEquals(self.expense_account,
+                      income_line.getDestinationValue())
+    self.assertEquals(30, income_line.getSourceCredit())
+
+    # Of course, this invoice does not generate simulation again. An applied
+    # rule is created, but it is empty.
+    related_applied_rule = related_invoice.getCausalityRelatedValue(
+                                portal_type='Applied Rule')
+    self.assertEquals(0, len(related_applied_rule.objectValues()))
+
+    # and there's no other invoices
+    self.assertEquals(1, len(self.portal.accounting_module.contentValues()))
+
+
+  def test_tax_line_merged_build(self):
+    # an order with 2 lines and 1 tax line will later be built in an invoice
+    # with 2 lines and 1 tax line
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    resource2 = self.portal.product_module.newContent(
+                            portal_type='Product',
+                            title='Resource 2',
+                            base_contribution_value_list=[base_1])
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    order = self.order
+    order.Order_applyTradeCondition(self.trade_condition, force=1)
+    order.setSourceSectionValue(self.vendor)
+    order.setSourceValue(self.vendor)
+    order.setDestinationSectionValue(self.client)
+    order.setDestinationValue(self.client)
+    order.setPriceCurrencyValue(self.currency)
+    order.setStartDate(DateTime(2001, 1, 1))
+    order_line1 = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=2,
+                          price=15,)
+    order_line2 = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=resource2,
+                          quantity=7,
+                          price=10,)
+    transaction.commit()
+    # check existing tax line
+    tax_line_list = order.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals(2*15 + 7*10, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+
+    order.plan()
+    order.confirm()
+    self.assertEquals('confirmed', order.getSimulationState())
+    transaction.commit()
+    self.tic()
+    related_delivery = order.getCausalityRelatedValue(
+                  portal_type=('Purchase Packing List', 'Sale Packing List'))
+    self.assertNotEquals(related_delivery, None)
+    related_delivery.setReady()
+    related_delivery.start()
+    related_delivery.stop()
+    related_delivery.deliver()
+    self.assertEquals('delivered', related_delivery.getSimulationState())
+    transaction.commit()
+    self.tic()
+    
+    related_invoice = related_delivery.getCausalityRelatedValue(
+                  portal_type=('Purchase Invoice Transaction',
+                               'Sale Invoice Transaction'))
+    self.assertNotEquals(related_invoice, None)
+    invoice_line_list = related_invoice.contentValues(
+                  portal_type='Invoice Line')
+    tax_line_list = related_invoice.contentValues(
+                  portal_type='Tax Line')
+
+    self.assertEquals(2, len(invoice_line_list))
+
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(100, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals([base_1], tax_line.getBaseApplicationValueList())
+    self.assertEquals([], tax_line.getBaseContributionValueList())
+
+    self.assertEquals('solved', related_invoice.getCausalityState())
+
+  def test_tax_line_updated_on_invoice_line_change(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    order = self.order
+    order.Order_applyTradeCondition(self.trade_condition, force=1)
+    order.setSourceSectionValue(self.vendor)
+    order.setSourceValue(self.vendor)
+    order.setDestinationSectionValue(self.client)
+    order.setDestinationValue(self.client)
+    order.setPriceCurrencyValue(self.currency)
+    order.setStartDate(DateTime(2001, 1, 1))
+    order_line = order.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=2,
+                          price=15,)
+    order.plan()
+    order.confirm()
+    self.assertEquals('confirmed', order.getSimulationState())
+    transaction.commit()
+    self.tic()
+    related_delivery = order.getCausalityRelatedValue(
+                  portal_type=('Purchase Packing List', 'Sale Packing List'))
+    self.assertNotEquals(related_delivery, None)
+    related_delivery.setReady()
+    related_delivery.start()
+    related_delivery.stop()
+    related_delivery.deliver()
+    self.assertEquals('delivered', related_delivery.getSimulationState())
+    transaction.commit()
+    self.tic()
+    
+    related_invoice = related_delivery.getCausalityRelatedValue(
+                  portal_type=('Purchase Invoice Transaction',
+                               'Sale Invoice Transaction'))
+    self.assertNotEquals(related_invoice, None)
+    self.assertEquals('solved', related_invoice.getCausalityState())
+    invoice_line_list = related_invoice.contentValues(
+                  portal_type='Invoice Line')
+    tax_line_list = related_invoice.contentValues(
+                  portal_type='Tax Line')
+
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+    self.assertEquals(30, tax_line.getQuantity())
+    self.assertEquals(0.2, tax_line.getPrice())
+    self.assertEquals(self.tax, tax_line.getResourceValue())
+    self.assertEquals([base_1], tax_line.getBaseApplicationValueList())
+    self.assertEquals([], tax_line.getBaseContributionValueList())
+
+    self.assertEquals(1, len(invoice_line_list))
+    invoice_line = invoice_line_list[0]
+    # change a total price on the invoice_line,
+    invoice_line.setQuantity(3)
+    transaction.commit()
+    self.tic()
+    # it will be reflected on the tax line
+    self.assertEquals(45, tax_line.getQuantity())
+    self.assertTrue(tax_line.isDivergent())
+    # and the invoice is diverged
+    self.assertEquals('diverged', related_invoice.getCausalityState())
+    
+
+class TestTaxLineInvoiceSimulation(AccountingBuildTestCase):
+  """Test Simulation of Tax Lines on Invoices
+  """
+  def test_tax_line_simulation(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    tax_model_line = self.trade_condition.newContent(
+                  portal_type='Tax Model Line',
+                  base_application_value=base_1,
+                  float_index=1,
+                  efficiency=0.2,
+                  resource_value=self.tax)
+    
+    invoice = self.order
+    invoice.Order_applyTradeCondition(self.trade_condition, force=1)
+    invoice.setSourceSectionValue(self.vendor)
+    invoice.setSourceValue(self.vendor)
+    invoice.setDestinationSectionValue(self.client)
+    invoice.setDestinationValue(self.client)
+    invoice.setStartDate(DateTime(2001, 1, 1))
+    invoice.setPriceCurrencyValue(self.currency)
+    invoice_line = invoice.newContent(
+                          portal_type=self.order_line_type,
+                          resource_value=self.resource,
+                          quantity=10,
+                          price=10,)
+    tax_line_list = invoice.contentValues(portal_type='Tax Line')
+    self.assertEquals(1, len(tax_line_list))
+    tax_line = tax_line_list[0]
+
+    invoice.plan()
+    invoice.confirm()
+    invoice.start()
+    self.assertEquals('started', invoice.getSimulationState())
+    transaction.commit()
+    self.tic()
+    related_applied_rule_list = invoice.getCausalityRelatedValueList(
+                                      portal_type='Applied Rule')
+    self.assertEquals(1, len(related_applied_rule_list))
+    root_applied_rule = related_applied_rule_list[0]
+    simulation_movement_list = root_applied_rule.contentValues(
+                                   portal_type='Simulation Movement')
+    self.assertEquals(2, len(simulation_movement_list))
+    tax_simulation_movement_list = [m for m in simulation_movement_list
+                                    if m.getOrderValue() == tax_line]
+    self.assertEquals(1, len(tax_simulation_movement_list))
+    tax_simulation_movement = tax_simulation_movement_list[0]
+    self.assertEquals([base_1],
+        tax_simulation_movement.getBaseApplicationValueList())
+    self.assertEquals(100, tax_simulation_movement.getQuantity())
+    self.assertEquals(0.2, tax_simulation_movement.getPrice())
+    self.assertEquals(self.currency,
+                      tax_simulation_movement.getPriceCurrencyValue())
+
+    invoice_simulation_movement_list = [m for m in simulation_movement_list
+                                    if m.getOrderValue() == invoice_line]
+    self.assertEquals(1, len(invoice_simulation_movement_list))
+    invoice_simulation_movement = invoice_simulation_movement_list[0]
+    self.assertEquals([base_1],
+        invoice_simulation_movement.getBaseContributionValueList())
+    self.assertEquals(10, invoice_simulation_movement.getQuantity())
+    self.assertEquals(10, invoice_simulation_movement.getPrice())
+    self.assertEquals(self.currency,
+                      invoice_simulation_movement.getPriceCurrencyValue())
+    self.assertEquals(self.resource,
+                      invoice_simulation_movement.getResourceValue())
+
+    accounting_line_list = invoice.getMovementList(
+                            portal_type=('Sale Invoice Transaction Line',
+                                         'Purchase Invoice Transaction Line'))
+    self.assertEquals(3, len(accounting_line_list))
+    receivable_line = [l for l in accounting_line_list if
+                        l.getSourceValue() == self.receivable_account][0]
+    self.assertEquals(self.payable_account,
+                      receivable_line.getDestinationValue())
+    self.assertEquals(120, receivable_line.getSourceDebit())
+    
+    tax_line = [l for l in accounting_line_list if
+                        l.getSourceValue() == self.collected_tax_account][0]
+    self.assertEquals(self.refundable_tax_account,
+                      tax_line.getDestinationValue())
+    self.assertEquals(20, tax_line.getSourceCredit())
+
+    income_line = [l for l in accounting_line_list if
+                        l.getSourceValue() == self.income_account][0]
+    self.assertEquals(self.expense_account,
+                      income_line.getDestinationValue())
+    self.assertEquals(100, income_line.getSourceCredit())
+
+    self.assertEquals('solved', invoice.getCausalityState())
+
+
+class DiscountCalculation:
+  """Test Discount Calculations
+  """
+  def test_simple_discount_model_line_calculation(self):
+    base_1 = self.base_amount.newContent(
+                          portal_type='Category',
+                          title='Base 1')
+    self.resource.setBaseContributionValue(base_1)
+    discount_model_line =self.trade_condition.newContent(
+                    portal_type='Discount Model Line',
+                    base_application_value=base_1,
+                    float_index=1,
+                    efficiency=0.2,
+                    resource_value=self.discount)
+  
+
+class TestTaxLineCalculationSaleOrder(
+    TestTaxLineCalculation, TestWithSaleOrder):
+  pass
+
+class TestTaxLineCalculationPurchaseOrder(
+    TestTaxLineCalculation, TestWithPurchaseOrder):
+  pass
+
+class TestTaxLineCalculationSaleInvoice(
+    TestTaxLineCalculation, TestWithSaleInvoice):
+  def not_available(self):
+    pass
+  test_hierarchical_order_line_and_tax_line = not_available
+  test_temp_order_hierarchical = not_available
+
+class TestTaxLineCalculationPurchaseInvoice(
+    TestTaxLineCalculation, TestWithPurchaseInvoice):
+  def not_available(self):
+    pass
+  test_hierarchical_order_line_and_tax_line = not_available
+  test_temp_order_hierarchical = not_available
+
+class TestTaxLineOrderSimulationSaleOrder(
+      TestTaxLineOrderSimulation, TestWithSaleOrder):
+  pass
+
+class TestTaxLineOrderSimulationPurchaseOrder(
+      TestTaxLineOrderSimulation, TestWithPurchaseOrder):
+  pass
+
+class TestTaxLineInvoiceSimulationPurchaseInvoice(
+      TestTaxLineInvoiceSimulation, TestWithPurchaseInvoice):
+  pass
+
+class TestTaxLineInvoiceSimulationSaleInvoice(
+      TestTaxLineInvoiceSimulation, TestWithSaleInvoice):
+  pass
+
+def test_suite():
+  suite = unittest.TestSuite()
+  suite.addTest(unittest.makeSuite(TestTaxLineCalculationSaleOrder))
+  suite.addTest(unittest.makeSuite(TestTaxLineCalculationPurchaseOrder))
+  suite.addTest(unittest.makeSuite(TestTaxLineCalculationSaleInvoice))
+  suite.addTest(unittest.makeSuite(TestTaxLineCalculationPurchaseInvoice))
+  suite.addTest(unittest.makeSuite(TestTaxLineOrderSimulationSaleOrder))
+  suite.addTest(unittest.makeSuite(TestTaxLineOrderSimulationPurchaseOrder))
+  suite.addTest(unittest.makeSuite(TestTaxLineInvoiceSimulationPurchaseInvoice))
+  suite.addTest(unittest.makeSuite(TestTaxLineInvoiceSimulationSaleInvoice))
+  return suite
diff --git a/product/ERP5/tests/testTradeCondition.py b/product/ERP5/tests/testTradeCondition.py
index f5694d2dfa..ed92c92ce9 100644
--- a/product/ERP5/tests/testTradeCondition.py
+++ b/product/ERP5/tests/testTradeCondition.py
@@ -447,1233 +447,6 @@ class TestApplyTradeCondition(TradeConditionTestCase):
     self.order.Delivery_viewDiscount()
 
 
-class TestTaxLineCalculation(TradeConditionTestCase):
-  """Test calculating Tax Lines.
-  """
-  def test_apply_trade_condition_twice_and_tax_lines(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    # this creates a tax line, with quantity 0, and it will be updated when
-    # needed
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-    
-    # if we apply twice, we don't have the tax lines twice
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-
-  def test_apply_trade_condition_after_line_creation(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    order_line = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=10,
-                          price=10,)
-
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    transaction.commit()
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-  def test_simple_tax_model_line_calculation(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    # this creates a tax line, with quantity 0, and it will be updated when
-    # needed
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=10,
-                          price=10,)
-
-    transaction.commit()
-    # at the end of transaction, tax lines are updated
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(20, tax_line.getTotalPrice())
-    
-  def test_tax_model_line_calculation_with_two_lines(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    # this creates a tax line, with quantity 0, and it will be updated when
-    # needed
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line_1 = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=3,
-                          price=10,)
-    order_line_2 = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=7,
-                          price=10,)
-    
-    transaction.commit()
-    # at the end of transaction, tax lines are updated
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(20, tax_line.getTotalPrice())
-    
-    order_line_1_tax_line_list = \
-      order_line_1.DeliveryMovement_getCorrespondingTaxLineList()
-    self.assertEquals(1, len(order_line_1_tax_line_list))
-    tax_line = order_line_1_tax_line_list[0]
-    self.assertEquals(30, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(6, tax_line.getTotalPrice())
-
-    order_line_2_tax_line_list = \
-      order_line_2.DeliveryMovement_getCorrespondingTaxLineList()
-    self.assertEquals(1, len(order_line_2_tax_line_list))
-    tax_line = order_line_2_tax_line_list[0]
-    self.assertEquals(70, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(14, tax_line.getTotalPrice())
-
-  def test_tax_on_tax(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    base_2 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 2')
-    tax2 = self.portal.tax_module.newContent(
-                          portal_type='Tax',
-                          title='Tax 2')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  base_contribution_value=base_2,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_2,
-                  float_index=2,
-                  efficiency=0.5,
-                  resource_value=tax2)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    transaction.commit()
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(2, len(tax_line_list))
-    tax_line1 = [tl for tl in tax_line_list if
-                   tl.getResourceValue() == self.tax][0]
-    self.assertEquals(0, tax_line1.getQuantity())
-    self.assertEquals(0.2, tax_line1.getPrice())
-    self.assertEquals(1, tax_line1.getFloatIndex())
-    self.assertEquals([base_1], tax_line1.getBaseApplicationValueList())
-    self.assertEquals([base_2], tax_line1.getBaseContributionValueList())
-
-    tax_line2 = [tl for tl in tax_line_list if
-                   tl.getResourceValue() == tax2][0]
-    self.assertEquals(0, tax_line2.getQuantity())
-    self.assertEquals(0.5, tax_line2.getPrice())
-    self.assertEquals(2, tax_line2.getFloatIndex())
-    self.assertEquals([base_2], tax_line2.getBaseApplicationValueList())
-
-    order_line = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=3,
-                          price=10,)
-    transaction.commit()
-    self.assertEquals(30, tax_line1.getQuantity())
-    self.assertEquals((30*0.2), tax_line2.getQuantity())
-    
-    order_line.setQuantity(5)
-    transaction.commit()
-    self.assertEquals(50, tax_line1.getQuantity())
-    self.assertEquals((50*0.2), tax_line2.getQuantity())
-    
-    tax_movement_list = order_line.DeliveryMovement_getCorrespondingTaxLineList()
-    self.assertEquals(2, len(tax_movement_list))
-    tax_1_movement = [m for m in tax_movement_list if m.getPrice() == 0.2][0]
-    self.assertEquals(tax_1_movement.getQuantity(), 50)
-    tax_2_movement = [m for m in tax_movement_list if m.getPrice() == 0.5][0]
-    self.assertEquals(tax_2_movement.getQuantity(), 50*0.2)
-
-
-  def test_update_order_line_quantity_update_tax_line(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    # this creates a tax line, with quantity 0, and it will be updated when
-    # needed
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=10,
-                          price=10,)
-
-    transaction.commit()
-    # tax lines are updated
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(20, tax_line.getTotalPrice())
-    
-    # change the quantity on order_line,
-    order_line.setQuantity(20)
-    transaction.commit()
-    # the tax line is updated (by an interraction workflow at the end of
-    # transaction)
-    self.assertEquals(200, tax_line.getQuantity())
-    self.assertEquals(40, tax_line.getTotalPrice())
-
-  def test_delete_order_line_quantity_update_tax_line(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    # this creates a tax line, with quantity 0, and it will be updated when
-    # needed
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=10,
-                          price=10,)
-
-    transaction.commit()
-    # tax lines are updated
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(20, tax_line.getTotalPrice())
-    
-    # delete the order line
-    self.order.manage_delObjects([order_line.getId()])
-    # the tax line is updated
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(0, tax_line.getTotalPrice())
-
-  def test_clone_order_line_quantity_update_tax_line(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    # this creates a tax line, with quantity 0, and it will be updated when
-    # needed
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=10,
-                          price=10,)
-
-    transaction.commit()
-    # tax lines are updated
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(20, tax_line.getTotalPrice())
-    
-    # clone the order line
-    cloned_order_line = order_line.Base_createCloneDocument(batch_mode=1)
-    # the tax line is updated
-    self.assertEquals(200, tax_line.getQuantity())
-    self.assertEquals(40, tax_line.getTotalPrice())
-
-  def test_order_cell_and_tax_line(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    # make a resource with size variation
-    self.resource.setVariationBaseCategoryList(('size',))
-    self.resource.setVariationCategoryList(('size/big', 'size/small'))
-
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    # this creates a tax line, with quantity 0, and it will be updated when
-    # needed
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,)
-    order_line.setVariationCategoryList(('size/big', 'size/small'))
-    order_line.updateCellRange(base_id='movement')
-    cell_red = order_line.newCell('size/big',
-                                  portal_type=self.order_cell_type,
-                                  base_id='movement')
-    cell_red.setMappedValuePropertyList(['quantity', 'price'])
-    cell_red.setPrice(5)
-    cell_red.setQuantity(10)
-    cell_blue = order_line.newCell('size/small',
-                             portal_type=self.order_cell_type,
-                             base_id='movement')
-    cell_blue.setMappedValuePropertyList(['quantity', 'price'])
-    cell_blue.setPrice(2)
-    cell_blue.setQuantity(25)
-    self.assertEquals(100, order_line.getTotalPrice(fast=0))
-    
-    transaction.commit()
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-    
-    self.assertEquals(100, self.order.getTotalPrice(fast=0))
-    self.assertEquals(120, self.order.getTotalNetPrice(fast=0))
-
-
-  def test_hierarchical_order_line_and_tax_line(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    # this creates a tax line, with quantity 0, and it will be updated when
-    # needed
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line = self.order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,)
-    suborder_line1 = order_line.newContent(
-                          portal_type=self.order_line_type,
-                          quantity=4,
-                          price=5)
-    suborder_line2 = order_line.newContent(
-                          portal_type=self.order_line_type,
-                          quantity=2,
-                          price=40)
-
-    transaction.commit()
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-  
-  def test_base_contribution_pseudo_acquisition(self):
-    base_1 = self.base_amount.newContent(portal_type='Category',
-                                         title='Base 1')
-    self.resource.setBaseContributionValueList((base_1,))
-    line = self.order.newContent(portal_type=self.order_line_type)
-    self.assertEquals([], line.getBaseContributionValueList())
-    line.setResourceValue(self.resource)
-    self.assertEquals([base_1], line.getBaseContributionValueList())
-    line.setBaseContributionValueList([])
-    self.assertEquals([], line.getBaseContributionValueList())
-
-  def test_multiple_order_line_multiple_tax_line(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    base_2 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 2')
-    self.resource.setBaseContributionValueList((base_1, base_2))
-    tax_model_line_1 = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.1,
-                  resource_value=self.tax)
-    tax_model_line_2 = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_2,
-                  float_index=2,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    tax_model_line_1_2 = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value_list=(base_1, base_2),
-                  float_index=3,
-                  efficiency=0.3,
-                  resource_value=self.tax)
-    
-    self.order.Order_applyTradeCondition(self.trade_condition, force=1)
-    line_1 = self.order.newContent(
-                  portal_type=self.order_line_type,
-                  quantity=1, price=1,
-                  resource_value=self.resource,
-                  base_contribution_value_list=(base_1,))
-    # -> tax_model_line_1 and tax_model_line_1_2 are applicable
-    line_2 = self.order.newContent(
-                  portal_type=self.order_line_type,
-                  quantity=2, price=2,
-                  resource_value=self.resource,
-                  base_contribution_value_list=(base_2,))
-    # -> tax_model_line_2 and tax_model_line_1_2 are applicable
-    line_3 = self.order.newContent(
-                  portal_type=self.order_line_type,
-                  quantity=3, price=3,
-                  resource_value=self.resource,
-                  base_contribution_value_list=(base_1, base_2))
-    # -> tax_model_line_1, tax_model_line_2 and tax_model_line_1_2 are applicable
-    #  (but they are not applied twice)
-
-    transaction.commit()
-    tax_line_list = self.order.contentValues(portal_type='Tax Line')
-    self.assertEquals(3, len(tax_line_list))
-    tax_line_1 = [x for x in tax_line_list if x.getPrice() == 0.1][0]
-    tax_line_2 = [x for x in tax_line_list if x.getPrice() == 0.2][0]
-    tax_line_3 = [x for x in tax_line_list if x.getPrice() == 0.3][0]
-
-    self.assertEquals(sum([line_1.getTotalPrice(),
-                           line_3.getTotalPrice()]), tax_line_1.getQuantity())
-    self.assertEquals(sum([line_2.getTotalPrice(),
-                           line_3.getTotalPrice()]), tax_line_2.getQuantity())
-    self.assertEquals(sum([line_1.getTotalPrice(),
-                           line_2.getTotalPrice(),
-                           line_3.getTotalPrice()]), tax_line_3.getQuantity())
-
-    tax_movement_list = line_1.DeliveryMovement_getCorrespondingTaxLineList()
-    self.assertEquals(2, len(tax_movement_list))
-    tax_1_movement = [m for m in tax_movement_list if m.getPrice() == 0.1][0]
-    self.assertEquals(tax_1_movement.getQuantity(), 1)
-    tax_3_movement = [m for m in tax_movement_list if m.getPrice() == 0.3][0]
-    self.assertEquals(tax_3_movement.getQuantity(), 1)
-    
-    tax_movement_list = line_2.DeliveryMovement_getCorrespondingTaxLineList()
-    self.assertEquals(2, len(tax_movement_list))
-    tax_2_movement = [m for m in tax_movement_list if m.getPrice() == 0.2][0]
-    self.assertEquals(tax_2_movement.getQuantity(), 4)
-    tax_3_movement = [m for m in tax_movement_list if m.getPrice() == 0.3][0]
-    self.assertEquals(tax_3_movement.getQuantity(), 4)
-    
-    tax_movement_list = line_3.DeliveryMovement_getCorrespondingTaxLineList()
-    self.assertEquals(3, len(tax_movement_list))
-    tax_1_movement = [m for m in tax_movement_list if m.getPrice() == 0.1][0]
-    self.assertEquals(tax_1_movement.getQuantity(), 9)
-    tax_2_movement = [m for m in tax_movement_list if m.getPrice() == 0.2][0]
-    self.assertEquals(tax_2_movement.getQuantity(), 9)
-    tax_3_movement = [m for m in tax_movement_list if m.getPrice() == 0.3][0]
-    self.assertEquals(tax_3_movement.getQuantity(), 9)
-    
-  def test_temp_order(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-
-    order = self.portal.getDefaultModule(self.order_type).newContent(
-                          portal_type=self.order_type,
-                          temp_object=1)
-    order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    tax_line_list = order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=10,
-                          price=40)
-    transaction.commit()
-
-    tax_line_list = order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(400, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-  
-  def test_temp_order_hierarchical(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-
-    order = self.portal.getDefaultModule(self.order_type).newContent(
-                          portal_type=self.order_type,
-                          temp_object=1)
-    order.Order_applyTradeCondition(self.trade_condition, force=1)
-
-    tax_line_list = order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(0, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order_line = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,)
-    suborder_line1 = order_line.newContent(
-                          portal_type=self.order_line_type,
-                          quantity=4,
-                          price=5)
-    suborder_line2 = order_line.newContent(
-                          portal_type=self.order_line_type,
-                          quantity=2,
-                          price=40)
-
-    transaction.commit()
-    tax_line_list = order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(0.2, tax_line.getPrice())
-  
-
-class TestTaxLineOrderSimulation(AccountingBuildTestCase):
-  """Test Simulation of Tax Lines on Orders
-  """
-  def test_tax_line_simulation(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    order = self.order
-    order.Order_applyTradeCondition(self.trade_condition, force=1)
-    order.setSourceSectionValue(self.vendor)
-    order.setSourceValue(self.vendor)
-    order.setDestinationSectionValue(self.client)
-    order.setDestinationValue(self.client)
-    order.setStartDate(DateTime(2001, 1, 1))
-    order_line = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=10,
-                          price=10,)
-    order.plan()
-    order.confirm()
-    self.assertEquals('confirmed', order.getSimulationState())
-    transaction.commit()
-    self.tic()
-    related_applied_rule_list = order.getCausalityRelatedValueList(
-                                      portal_type='Applied Rule')
-    self.assertEquals(1, len(related_applied_rule_list))
-    root_applied_rule = related_applied_rule_list[0]
-    simulation_movement_list = root_applied_rule.contentValues(
-                                   portal_type='Simulation Movement')
-    self.assertEquals(1, len(simulation_movement_list))
-    level2_applied_rule_list = simulation_movement_list[0].contentValues()
-    self.assertEquals(2, len(level2_applied_rule_list))
-    # first test the invoice movement, they should have base_contribution set
-    # correctly
-    invoice_rule_list = [ar for ar in level2_applied_rule_list if
-             ar.getSpecialiseValue().getPortalType() == 'Invoicing Rule']
-    self.assertEquals(1, len(invoice_rule_list))
-    invoice_simulation_movement_list = invoice_rule_list[0].contentValues()
-    self.assertEquals(1, len(invoice_simulation_movement_list))
-    invoice_simulation_movement = invoice_simulation_movement_list[0]
-    self.assertEquals(self.resource,
-        invoice_simulation_movement.getResourceValue())
-    self.assertEquals([base_1],
-        invoice_simulation_movement.getBaseContributionValueList())
-
-    # now test the tax movement
-    applied_tax_rule_list = [ar for ar in level2_applied_rule_list if
-             ar.getSpecialiseValue().getPortalType() == 'Tax Rule']
-    self.assertEquals(1, len(applied_tax_rule_list))
-    tax_simulation_movement_list = applied_tax_rule_list[0].contentValues()
-    self.assertEquals(1, len(tax_simulation_movement_list))
-    tax_simulation_movement = tax_simulation_movement_list[0]
-
-    self.assertEquals(self.tax, tax_simulation_movement.getResourceValue())
-    self.assertEquals([base_1],
-                      tax_simulation_movement.getBaseApplicationValueList())
-    self.assertEquals(100, tax_simulation_movement.getQuantity())
-    self.assertEquals(0.2, tax_simulation_movement.getPrice())
-    
-    # reexpand and check nothing changed
-    root_applied_rule.expand()
-    applied_tax_rule_list = [ar for ar in level2_applied_rule_list if
-             ar.getSpecialiseValue().getPortalType() == 'Tax Rule']
-    self.assertEquals(1, len(applied_tax_rule_list))
-    tax_simulation_movement_list = applied_tax_rule_list[0].contentValues()
-    self.assertEquals(1, len(tax_simulation_movement_list))
-    tax_simulation_movement = tax_simulation_movement_list[0]
-
-    self.assertEquals(self.tax, tax_simulation_movement.getResourceValue())
-    self.assertEquals([base_1],
-                      tax_simulation_movement.getBaseApplicationValueList())
-    self.assertEquals(100, tax_simulation_movement.getQuantity())
-    self.assertEquals(0.2, tax_simulation_movement.getPrice())
-
-  def test_2_tax_lines_simulation(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    order = self.order
-    order.Order_applyTradeCondition(self.trade_condition, force=1)
-    order.setSourceSectionValue(self.vendor)
-    order.setSourceValue(self.vendor)
-    order.setDestinationSectionValue(self.client)
-    order.setDestinationValue(self.client)
-    order.setStartDate(DateTime(2001, 1, 1))
-    order_line1 = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=2,
-                          price=15,)
-    order_line2 = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=7,
-                          price=10,)
-    order.plan()
-    order.confirm()
-    self.assertEquals('confirmed', order.getSimulationState())
-    transaction.commit()
-    self.tic()
-    related_applied_rule_list = order.getCausalityRelatedValueList(
-                                      portal_type='Applied Rule')
-    self.assertEquals(1, len(related_applied_rule_list))
-    root_applied_rule = related_applied_rule_list[0]
-    simulation_movement_list = root_applied_rule.contentValues(
-                                   portal_type='Simulation Movement')
-    self.assertEquals(2, len(simulation_movement_list))
-    # line 1
-    line1_simulation_movement_list = [sm for sm in simulation_movement_list
-          if sm.getOrderValue() == order_line1]
-    self.assertEquals(1, len(line1_simulation_movement_list))
-    simulation_movement = line1_simulation_movement_list[0]
-    self.assertEquals(2.0, simulation_movement.getQuantity())
-    applied_tax_rule_list = [ar for ar in simulation_movement.objectValues()
-        if ar.getSpecialiseValue().getPortalType() == 'Tax Rule']
-    self.assertEquals(1, len(applied_tax_rule_list))
-    tax_simulation_movement_list = applied_tax_rule_list[0].contentValues()
-    self.assertEquals(1, len(tax_simulation_movement_list))
-    tax_simulation_movement = tax_simulation_movement_list[0]
-    self.assertEquals(self.tax, tax_simulation_movement.getResourceValue())
-    self.assertEquals([base_1],
-                      tax_simulation_movement.getBaseApplicationValueList())
-    self.assertEquals(30, tax_simulation_movement.getQuantity())
-    self.assertEquals(0.2, tax_simulation_movement.getPrice())
-    
-    # line 2
-    line2_simulation_movement_list = [sm for sm in simulation_movement_list
-          if sm.getOrderValue() == order_line2]
-    self.assertEquals(1, len(line2_simulation_movement_list))
-    simulation_movement = line2_simulation_movement_list[0]
-    self.assertEquals(7., simulation_movement.getQuantity())
-    applied_tax_rule_list = [ar for ar in simulation_movement.objectValues()
-        if ar.getSpecialiseValue().getPortalType() == 'Tax Rule']
-    self.assertEquals(1, len(applied_tax_rule_list))
-    tax_simulation_movement_list = applied_tax_rule_list[0].contentValues()
-    self.assertEquals(1, len(tax_simulation_movement_list))
-    tax_simulation_movement = tax_simulation_movement_list[0]
-    self.assertEquals(self.tax, tax_simulation_movement.getResourceValue())
-    self.assertEquals([base_1],
-                      tax_simulation_movement.getBaseApplicationValueList())
-    self.assertEquals(70, tax_simulation_movement.getQuantity())
-    self.assertEquals(0.2, tax_simulation_movement.getPrice())
-
-
-  def test_tax_line_build(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    order = self.order
-    order.Order_applyTradeCondition(self.trade_condition, force=1)
-    order.setSourceSectionValue(self.vendor)
-    order.setSourceValue(self.vendor)
-    order.setDestinationSectionValue(self.client)
-    order.setDestinationValue(self.client)
-    order.setPriceCurrencyValue(self.currency)
-    order.setStartDate(DateTime(2001, 1, 1))
-    order_line = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=2,
-                          price=15,)
-    order.plan()
-    order.confirm()
-    self.assertEquals('confirmed', order.getSimulationState())
-    transaction.commit()
-    self.tic()
-    related_delivery = order.getCausalityRelatedValue(
-                  portal_type=('Purchase Packing List', 'Sale Packing List'))
-    self.assertNotEquals(related_delivery, None)
-    related_delivery.setReady()
-    related_delivery.start()
-    related_delivery.stop()
-    related_delivery.deliver()
-    self.assertEquals('delivered', related_delivery.getSimulationState())
-    transaction.commit()
-    self.tic()
-    
-    related_invoice = related_delivery.getCausalityRelatedValue(
-                  portal_type=('Purchase Invoice Transaction',
-                               'Sale Invoice Transaction'))
-    self.assertNotEquals(related_invoice, None)
-    invoice_line_list = related_invoice.contentValues(
-                  portal_type='Invoice Line')
-    tax_line_list = related_invoice.contentValues(
-                  portal_type='Tax Line')
-
-    self.assertEquals(1, len(invoice_line_list))
-    invoice_line = invoice_line_list[0]
-    self.assertEquals(2, invoice_line.getQuantity())
-    self.assertEquals(15, invoice_line.getPrice())
-    self.assertEquals(self.resource, invoice_line.getResourceValue())
-    self.assertEquals([base_1], invoice_line.getBaseContributionValueList())
-
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(30, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals([base_1], tax_line.getBaseApplicationValueList())
-    self.assertEquals([], tax_line.getBaseContributionValueList())
-
-    self.assertEquals('solved', related_invoice.getCausalityState())
-
-    # Of course, this invoice does not generate simulation again. An applied
-    # rule is created, but it is empty.
-    related_applied_rule = related_invoice.getCausalityRelatedValue(
-                                portal_type='Applied Rule')
-    self.assertEquals(0, len(related_applied_rule.objectValues()))
-    
-  def test_tax_line_build_accounting(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    order = self.order
-    order.Order_applyTradeCondition(self.trade_condition, force=1)
-    order.setSourceSectionValue(self.vendor)
-    order.setSourceValue(self.vendor)
-    order.setDestinationSectionValue(self.client)
-    order.setDestinationValue(self.client)
-    order.setPriceCurrencyValue(self.currency)
-    order.setStartDate(DateTime(2001, 1, 1))
-    order_line = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=2,
-                          price=15,)
-    order.plan()
-    order.confirm()
-    self.assertEquals('confirmed', order.getSimulationState())
-    transaction.commit()
-    self.tic()
-    related_delivery = order.getCausalityRelatedValue(
-                  portal_type=('Purchase Packing List', 'Sale Packing List'))
-    self.assertNotEquals(related_delivery, None)
-    related_delivery.setReady()
-    related_delivery.start()
-    related_delivery.stop()
-    related_delivery.deliver()
-    self.assertEquals('delivered', related_delivery.getSimulationState())
-    transaction.commit()
-    self.tic()
-    
-    related_invoice = related_delivery.getCausalityRelatedValue(
-                  portal_type=('Purchase Invoice Transaction',
-                               'Sale Invoice Transaction'))
-    self.assertNotEquals(related_invoice, None)
-    self.assertEquals('confirmed', related_invoice.getSimulationState())
-    self.assertEquals('solved', related_invoice.getCausalityState())
-    accounting_line_list = related_invoice.getMovementList(
-                    portal_type=self.portal.getPortalAccountingMovementTypeList())
-    self.assertEquals(0, len(accounting_line_list))
-
-    related_invoice.start()
-    transaction.commit()
-    self.tic()
-    self.assertEquals('started', related_invoice.getSimulationState())
-    self.assertEquals('solved', related_invoice.getCausalityState())
-
-    accounting_line_list = related_invoice.getMovementList(
-                    portal_type=self.portal.getPortalAccountingMovementTypeList())
-    self.assertEquals(3, len(accounting_line_list))
-    receivable_line = [l for l in accounting_line_list if
-                        l.getSourceValue() == self.receivable_account][0]
-    self.assertEquals(self.payable_account,
-                      receivable_line.getDestinationValue())
-    self.assertEquals(36, receivable_line.getSourceDebit())
-    
-    tax_line = [l for l in accounting_line_list if
-                        l.getSourceValue() == self.collected_tax_account][0]
-    self.assertEquals(self.refundable_tax_account,
-                      tax_line.getDestinationValue())
-    self.assertEquals(6, tax_line.getSourceCredit())
-
-    income_line = [l for l in accounting_line_list if
-                        l.getSourceValue() == self.income_account][0]
-    self.assertEquals(self.expense_account,
-                      income_line.getDestinationValue())
-    self.assertEquals(30, income_line.getSourceCredit())
-
-    # Of course, this invoice does not generate simulation again. An applied
-    # rule is created, but it is empty.
-    related_applied_rule = related_invoice.getCausalityRelatedValue(
-                                portal_type='Applied Rule')
-    self.assertEquals(0, len(related_applied_rule.objectValues()))
-
-    # and there's no other invoices
-    self.assertEquals(1, len(self.portal.accounting_module.contentValues()))
-
-
-  def test_tax_line_merged_build(self):
-    # an order with 2 lines and 1 tax line will later be built in an invoice
-    # with 2 lines and 1 tax line
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    resource2 = self.portal.product_module.newContent(
-                            portal_type='Product',
-                            title='Resource 2',
-                            base_contribution_value_list=[base_1])
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    order = self.order
-    order.Order_applyTradeCondition(self.trade_condition, force=1)
-    order.setSourceSectionValue(self.vendor)
-    order.setSourceValue(self.vendor)
-    order.setDestinationSectionValue(self.client)
-    order.setDestinationValue(self.client)
-    order.setPriceCurrencyValue(self.currency)
-    order.setStartDate(DateTime(2001, 1, 1))
-    order_line1 = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=2,
-                          price=15,)
-    order_line2 = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=resource2,
-                          quantity=7,
-                          price=10,)
-    transaction.commit()
-    # check existing tax line
-    tax_line_list = order.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals(2*15 + 7*10, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-
-    order.plan()
-    order.confirm()
-    self.assertEquals('confirmed', order.getSimulationState())
-    transaction.commit()
-    self.tic()
-    related_delivery = order.getCausalityRelatedValue(
-                  portal_type=('Purchase Packing List', 'Sale Packing List'))
-    self.assertNotEquals(related_delivery, None)
-    related_delivery.setReady()
-    related_delivery.start()
-    related_delivery.stop()
-    related_delivery.deliver()
-    self.assertEquals('delivered', related_delivery.getSimulationState())
-    transaction.commit()
-    self.tic()
-    
-    related_invoice = related_delivery.getCausalityRelatedValue(
-                  portal_type=('Purchase Invoice Transaction',
-                               'Sale Invoice Transaction'))
-    self.assertNotEquals(related_invoice, None)
-    invoice_line_list = related_invoice.contentValues(
-                  portal_type='Invoice Line')
-    tax_line_list = related_invoice.contentValues(
-                  portal_type='Tax Line')
-
-    self.assertEquals(2, len(invoice_line_list))
-
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(100, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals([base_1], tax_line.getBaseApplicationValueList())
-    self.assertEquals([], tax_line.getBaseContributionValueList())
-
-    self.assertEquals('solved', related_invoice.getCausalityState())
-
-  def test_tax_line_updated_on_invoice_line_change(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    order = self.order
-    order.Order_applyTradeCondition(self.trade_condition, force=1)
-    order.setSourceSectionValue(self.vendor)
-    order.setSourceValue(self.vendor)
-    order.setDestinationSectionValue(self.client)
-    order.setDestinationValue(self.client)
-    order.setPriceCurrencyValue(self.currency)
-    order.setStartDate(DateTime(2001, 1, 1))
-    order_line = order.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=2,
-                          price=15,)
-    order.plan()
-    order.confirm()
-    self.assertEquals('confirmed', order.getSimulationState())
-    transaction.commit()
-    self.tic()
-    related_delivery = order.getCausalityRelatedValue(
-                  portal_type=('Purchase Packing List', 'Sale Packing List'))
-    self.assertNotEquals(related_delivery, None)
-    related_delivery.setReady()
-    related_delivery.start()
-    related_delivery.stop()
-    related_delivery.deliver()
-    self.assertEquals('delivered', related_delivery.getSimulationState())
-    transaction.commit()
-    self.tic()
-    
-    related_invoice = related_delivery.getCausalityRelatedValue(
-                  portal_type=('Purchase Invoice Transaction',
-                               'Sale Invoice Transaction'))
-    self.assertNotEquals(related_invoice, None)
-    self.assertEquals('solved', related_invoice.getCausalityState())
-    invoice_line_list = related_invoice.contentValues(
-                  portal_type='Invoice Line')
-    tax_line_list = related_invoice.contentValues(
-                  portal_type='Tax Line')
-
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-    self.assertEquals(30, tax_line.getQuantity())
-    self.assertEquals(0.2, tax_line.getPrice())
-    self.assertEquals(self.tax, tax_line.getResourceValue())
-    self.assertEquals([base_1], tax_line.getBaseApplicationValueList())
-    self.assertEquals([], tax_line.getBaseContributionValueList())
-
-    self.assertEquals(1, len(invoice_line_list))
-    invoice_line = invoice_line_list[0]
-    # change a total price on the invoice_line,
-    invoice_line.setQuantity(3)
-    transaction.commit()
-    self.tic()
-    # it will be reflected on the tax line
-    self.assertEquals(45, tax_line.getQuantity())
-    self.assertTrue(tax_line.isDivergent())
-    # and the invoice is diverged
-    self.assertEquals('diverged', related_invoice.getCausalityState())
-    
-
-class TestTaxLineInvoiceSimulation(AccountingBuildTestCase):
-  """Test Simulation of Tax Lines on Invoices
-  """
-  def test_tax_line_simulation(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    tax_model_line = self.trade_condition.newContent(
-                  portal_type='Tax Model Line',
-                  base_application_value=base_1,
-                  float_index=1,
-                  efficiency=0.2,
-                  resource_value=self.tax)
-    
-    invoice = self.order
-    invoice.Order_applyTradeCondition(self.trade_condition, force=1)
-    invoice.setSourceSectionValue(self.vendor)
-    invoice.setSourceValue(self.vendor)
-    invoice.setDestinationSectionValue(self.client)
-    invoice.setDestinationValue(self.client)
-    invoice.setStartDate(DateTime(2001, 1, 1))
-    invoice.setPriceCurrencyValue(self.currency)
-    invoice_line = invoice.newContent(
-                          portal_type=self.order_line_type,
-                          resource_value=self.resource,
-                          quantity=10,
-                          price=10,)
-    tax_line_list = invoice.contentValues(portal_type='Tax Line')
-    self.assertEquals(1, len(tax_line_list))
-    tax_line = tax_line_list[0]
-
-    invoice.plan()
-    invoice.confirm()
-    invoice.start()
-    self.assertEquals('started', invoice.getSimulationState())
-    transaction.commit()
-    self.tic()
-    related_applied_rule_list = invoice.getCausalityRelatedValueList(
-                                      portal_type='Applied Rule')
-    self.assertEquals(1, len(related_applied_rule_list))
-    root_applied_rule = related_applied_rule_list[0]
-    simulation_movement_list = root_applied_rule.contentValues(
-                                   portal_type='Simulation Movement')
-    self.assertEquals(2, len(simulation_movement_list))
-    tax_simulation_movement_list = [m for m in simulation_movement_list
-                                    if m.getOrderValue() == tax_line]
-    self.assertEquals(1, len(tax_simulation_movement_list))
-    tax_simulation_movement = tax_simulation_movement_list[0]
-    self.assertEquals([base_1],
-        tax_simulation_movement.getBaseApplicationValueList())
-    self.assertEquals(100, tax_simulation_movement.getQuantity())
-    self.assertEquals(0.2, tax_simulation_movement.getPrice())
-    self.assertEquals(self.currency,
-                      tax_simulation_movement.getPriceCurrencyValue())
-
-    invoice_simulation_movement_list = [m for m in simulation_movement_list
-                                    if m.getOrderValue() == invoice_line]
-    self.assertEquals(1, len(invoice_simulation_movement_list))
-    invoice_simulation_movement = invoice_simulation_movement_list[0]
-    self.assertEquals([base_1],
-        invoice_simulation_movement.getBaseContributionValueList())
-    self.assertEquals(10, invoice_simulation_movement.getQuantity())
-    self.assertEquals(10, invoice_simulation_movement.getPrice())
-    self.assertEquals(self.currency,
-                      invoice_simulation_movement.getPriceCurrencyValue())
-    self.assertEquals(self.resource,
-                      invoice_simulation_movement.getResourceValue())
-
-    accounting_line_list = invoice.getMovementList(
-                            portal_type=('Sale Invoice Transaction Line',
-                                         'Purchase Invoice Transaction Line'))
-    self.assertEquals(3, len(accounting_line_list))
-    receivable_line = [l for l in accounting_line_list if
-                        l.getSourceValue() == self.receivable_account][0]
-    self.assertEquals(self.payable_account,
-                      receivable_line.getDestinationValue())
-    self.assertEquals(120, receivable_line.getSourceDebit())
-    
-    tax_line = [l for l in accounting_line_list if
-                        l.getSourceValue() == self.collected_tax_account][0]
-    self.assertEquals(self.refundable_tax_account,
-                      tax_line.getDestinationValue())
-    self.assertEquals(20, tax_line.getSourceCredit())
-
-    income_line = [l for l in accounting_line_list if
-                        l.getSourceValue() == self.income_account][0]
-    self.assertEquals(self.expense_account,
-                      income_line.getDestinationValue())
-    self.assertEquals(100, income_line.getSourceCredit())
-
-    self.assertEquals('solved', invoice.getCausalityState())
-
-
-class DiscountCalculation:
-  """Test Discount Calculations
-  """
-  def test_simple_discount_model_line_calculation(self):
-    base_1 = self.base_amount.newContent(
-                          portal_type='Category',
-                          title='Base 1')
-    self.resource.setBaseContributionValue(base_1)
-    discount_model_line =self.trade_condition.newContent(
-                    portal_type='Discount Model Line',
-                    base_application_value=base_1,
-                    float_index=1,
-                    efficiency=0.2,
-                    resource_value=self.discount)
-  
-
 class TestTradeConditionSupplyLine(TradeConditionTestCase):
   """A trade condition can contain supply line and those supply lines are used
   in priority, for example to calculate the price
@@ -1907,39 +680,6 @@ class TestApplyTradeConditionPurchaseOrder(
       TestApplyTradeCondition, TestWithPurchaseOrder):
   pass
 
-class TestTaxLineCalculationSaleOrder(
-    TestTaxLineCalculation, TestWithSaleOrder):
-  pass
-class TestTaxLineCalculationPurchaseOrder(
-    TestTaxLineCalculation, TestWithPurchaseOrder):
-  pass
-class TestTaxLineCalculationSaleInvoice(
-    TestTaxLineCalculation, TestWithSaleInvoice):
-  def not_available(self):
-    pass
-  test_hierarchical_order_line_and_tax_line = not_available
-  test_temp_order_hierarchical = not_available
-class TestTaxLineCalculationPurchaseInvoice(
-    TestTaxLineCalculation, TestWithPurchaseInvoice):
-  def not_available(self):
-    pass
-  test_hierarchical_order_line_and_tax_line = not_available
-  test_temp_order_hierarchical = not_available
-
-class TestTaxLineOrderSimulationSaleOrder(
-      TestTaxLineOrderSimulation, TestWithSaleOrder):
-  pass
-class TestTaxLineOrderSimulationPurchaseOrder(
-      TestTaxLineOrderSimulation, TestWithPurchaseOrder):
-  pass
-
-class TestTaxLineInvoiceSimulationPurchaseInvoice(
-      TestTaxLineInvoiceSimulation, TestWithPurchaseInvoice):
-  pass
-class TestTaxLineInvoiceSimulationSaleInvoice(
-      TestTaxLineInvoiceSimulation, TestWithSaleInvoice):
-  pass
-
 class TestTradeConditionSupplyLineSaleOrder(
       TestTradeConditionSupplyLine, TestWithSaleOrder):
   pass
@@ -1966,14 +706,6 @@ def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestApplyTradeConditionSaleOrder))
   suite.addTest(unittest.makeSuite(TestApplyTradeConditionPurchaseOrder))
-  suite.addTest(unittest.makeSuite(TestTaxLineCalculationSaleOrder))
-  suite.addTest(unittest.makeSuite(TestTaxLineCalculationPurchaseOrder))
-  suite.addTest(unittest.makeSuite(TestTaxLineCalculationSaleInvoice))
-  suite.addTest(unittest.makeSuite(TestTaxLineCalculationPurchaseInvoice))
-  suite.addTest(unittest.makeSuite(TestTaxLineOrderSimulationSaleOrder))
-  suite.addTest(unittest.makeSuite(TestTaxLineOrderSimulationPurchaseOrder))
-  suite.addTest(unittest.makeSuite(TestTaxLineInvoiceSimulationPurchaseInvoice))
-  suite.addTest(unittest.makeSuite(TestTaxLineInvoiceSimulationSaleInvoice))
   suite.addTest(unittest.makeSuite(TestTradeConditionSupplyLineSaleOrder))
   suite.addTest(unittest.makeSuite(TestTradeConditionSupplyLinePurchaseOrder))
   suite.addTest(unittest.makeSuite(TestTradeConditionSupplyLineSaleInvoice))
-- 
2.30.9