From 14727183174aedc7f31a2f9cd238f66a03376016 Mon Sep 17 00:00:00 2001
From: Jean-Paul Smets <jp@nexedi.com>
Date: Thu, 5 Aug 2010 15:50:23 +0000
Subject: [PATCH] Original Tests

git-svn-id: https://svn.erp5.org/repos/public/erp5/sandbox/amount_generator@37570 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/tests/testInvoice.py             | 3526 -----------------
 .../tests/testPackingList.py                  |    0
 2 files changed, 3526 deletions(-)
 delete mode 100644 product/ERP5/tests/testInvoice.py
 rename product/{ERP5 => ERP5Legacy}/tests/testPackingList.py (100%)

diff --git a/product/ERP5/tests/testInvoice.py b/product/ERP5/tests/testInvoice.py
deleted file mode 100644
index 9872c42e21..0000000000
--- a/product/ERP5/tests/testInvoice.py
+++ /dev/null
@@ -1,3526 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004-2008 Nexedi SA and Contributors. All Rights Reserved.
-#          Sebastien Robin <seb@nexedi.com>
-#          Jerome Perrin <jerome@nexedi.com>
-#
-# WARNING: This program as such is intended to be used by professional
-# programmers who take the whole responsibility of assessing all potential
-# consequences resulting from its eventual inadequacies and bugs
-# End users who are looking for a ready-to-use solution with commercial
-# guarantees and support are strongly adviced to contract a Free Software
-# Service Company
-#
-# This program is Free Software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-##############################################################################
-"""
-  Tests invoice creation from simulation.
-
-"""
-
-import transaction
-from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
-from Products.ERP5Type.tests.utils import FileUpload, DummyMailHost
-from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
-from Products.ERP5OOo.OOoUtils import OOoParser
-from AccessControl.SecurityManagement import newSecurityManager
-from DateTime import DateTime
-from Acquisition import aq_parent
-from zLOG import LOG
-from Products.ERP5Type.tests.Sequence import SequenceList
-from testPackingList import TestPackingListMixin
-from testAccountingRules import TestAccountingRulesMixin
-
-class TestInvoiceMixin(TestPackingListMixin,
-                       TestAccountingRulesMixin,):
-  """Test methods for invoices
-  """
-  default_region = "europe/west/france"
-  vat_gap = 'fr/pcg/4/44/445/4457/44571'
-  vat_rate = 0.196
-  sale_gap = 'fr/pcg/7/70/707/7071/70712'
-  customer_gap = 'fr/pcg/4/41/411'
-  bank_gap = 'fr/pcg/5/51/512'
-  mail_delivery_mode = 'by_mail'
-  cpt_incoterm = 'cpt'
-  unit_piece_quantity_unit = 'unit/piece'
-  mass_quantity_unit = 'mass/kg'
-  oldMailhost = None
-
-  # (account_id, account_gap, account_type)
-  account_definition_list = (
-      ('receivable_vat', vat_gap, 'liability/payable/collected_vat',),
-      ('sale', sale_gap, 'income'),
-      ('customer', customer_gap, 'asset/receivable'),
-      ('refundable_vat', vat_gap, 'asset/receivable/refundable_vat'),
-      ('purchase', sale_gap, 'expense'),
-      ('supplier', customer_gap, 'liability/payable'),
-      ('bank', bank_gap, 'asset/cash/bank'),
-      )
-  # (line_id, source_account_id, destination_account_id, line_quantity)
-  transaction_line_definition_list = (
-      ('income', 'sale', 'purchase', 1.0),
-      ('receivable', 'customer', 'supplier', -1.0 - vat_rate),
-      ('collected_vat', 'receivable_vat', 'refundable_vat', vat_rate),
-      )
-
-  def getTitle(self):
-    return "Invoices"
-
-  def getBusinessTemplateList(self):
-    return ('erp5_base', 'erp5_pdm', 'erp5_trade', 'erp5_accounting',
-            'erp5_invoicing', 'erp5_simplified_invoicing', 'erp5_apparel',
-            'erp5_project', 'erp5_administration')
-
-  @UnrestrictedMethod
-  def createCategories(self):
-    """Create the categories for our test. """
-    for cat_string in self.getNeededCategoryList() :
-      base_cat = cat_string.split("/")[0]
-      path = self.getPortal().portal_categories[base_cat]
-      for cat in cat_string.split("/")[1:] :
-        if not cat in path.objectIds() :
-          path = path.newContent(
-                    portal_type='Category',
-                    id=cat,)
-        else:
-          path = path[cat]
-    # check categories have been created
-    for cat_string in self.getNeededCategoryList() :
-      self.assertNotEquals(None,
-                self.getCategoryTool().restrictedTraverse(cat_string),
-                cat_string)
-
-  def getNeededCategoryList(self):
-    """return a list of categories that should be created."""
-    return ('region/%s' % self.default_region,
-            'gap/%s' % self.vat_gap,
-            'gap/%s' % self.sale_gap,
-            'gap/%s' % self.customer_gap,
-            'gap/%s' % self.bank_gap,
-            'delivery_mode/%s' % self.mail_delivery_mode,
-            'incoterm/%s' % self.cpt_incoterm,
-            'quantity_unit/%s' % self.unit_piece_quantity_unit,
-            'quantity_unit/%s' % self.mass_quantity_unit,
-        )
-
-
-  def afterSetUp(self):
-    self.createCategories()
-    self.validateRules()
-    self.login()
-    self.oldMailHost = getattr(self.portal, 'MailHost', None)
-    if self.oldMailHost is not None:
-      self.portal.manage_delObjects(['MailHost'])
-      self.portal._setObject('MailHost', DummyMailHost('MailHost'))
-    transaction.commit()
-    self.tic()
-
-  def beforeTearDown(self):
-    transaction.abort()
-    self.tic()
-    # restore the original MailHost
-    if self.oldMailHost is not None:
-      self.portal.manage_delObjects(['MailHost'])
-      self.portal._setObject('MailHost', DummyMailHost('MailHost'))
-    for folder in (self.portal.accounting_module,
-                   self.portal.organisation_module,
-                   self.portal.sale_order_module,
-                   self.portal.purchase_order_module,
-                   self.portal.sale_packing_list_module,
-                   self.portal.purchase_packing_list_module,
-                   self.portal.portal_simulation,):
-      
-      folder.manage_delObjects([x for x in folder.objectIds() if x not in ('organisation_1','organisation_2','ppl_1','ppl_2')])
-     
-    transaction.commit()
-    self.tic()
-
-  def login(self):
-    """login, without manager role"""
-    uf = self.getPortal().acl_users
-    uf._doAddUser('test_invoice_user', '', ['Assignee', 'Assignor', 'Member',
-                               'Associate', 'Auditor', 'Author'], [])
-    user = uf.getUserById('test_invoice_user').__of__(uf)
-    newSecurityManager(None, user)
-
-  def stepCreateSaleInvoiceTransactionRule(self, sequence, **kw) :
-    """Create the rule for accounting. """
-    self.createInvoiceTransactionRule(resource=sequence.get('resource'))
-
-  @UnrestrictedMethod
-  def createInvoiceTransactionRule(self, resource=None):
-    """Create a sale invoice transaction rule with only one cell for
-    product_line/apparel and default_region
-    The accounting rule cell will have the provided resource, but this his more
-    or less optional (as long as price currency is set correctly on order)
-    """
-    portal = self.portal
-    account_module = portal.account_module
-    for account_id, account_gap, account_type \
-               in self.account_definition_list:
-      if not account_id in account_module.objectIds():
-        account = account_module.newContent(id=account_id)
-        account.setGap(account_gap)
-        account.setAccountType(account_type)
-        portal.portal_workflow.doActionFor(account, 'validate_action')
-
-    invoice_rule = portal.portal_rules.default_invoice_transaction_simulation_rule
-    if invoice_rule.getValidationState() == 'validated':
-      invoice_rule.invalidate()
-    invoice_rule.deleteContent(list(invoice_rule.objectIds()))
-    transaction.commit()
-    self.tic()
-    region_predicate = invoice_rule.newContent(portal_type = 'Predicate')
-    product_line_predicate = invoice_rule.newContent(portal_type = 'Predicate')
-    region_predicate.edit(
-      membership_criterion_base_category_list = ['destination_region'],
-      membership_criterion_category_list =
-                   ['destination_region/region/%s' % self.default_region ],
-      int_index = 1,
-      string_index = 'region'
-    )
-    product_line_predicate.edit(
-      membership_criterion_base_category_list = ['product_line'],
-      membership_criterion_category_list =
-                            ['product_line/apparel'],
-      int_index = 1,
-      string_index = 'product'
-    )
-    product_line_predicate.immediateReindexObject()
-    region_predicate.immediateReindexObject()
-
-    invoice_rule.updateMatrix()
-    cell_list = invoice_rule.getCellValueList(base_id='movement')
-    self.assertEquals(len(cell_list),1)
-    cell = cell_list[0]
-
-    for line_id, line_source_id, line_destination_id, line_ratio in \
-        self.transaction_line_definition_list:
-      line = cell.newContent(id=line_id,
-          portal_type='Accounting Transaction Line', quantity=line_ratio,
-          resource_value=resource,
-          source_value=account_module[line_source_id],
-          destination_value=account_module[line_destination_id])
-
-    invoice_rule.validate()
-    transaction.commit()
-    self.tic()
-
-  def stepCreateEntities(self, sequence, **kw) :
-    """Create a vendor and two clients. """
-    self.stepCreateOrganisation1(sequence, **kw)
-    self.stepCreateOrganisation2(sequence, **kw)
-    self.stepCreateOrganisation3(sequence, **kw)
-    self.stepCreateProject1(sequence, **kw)
-    self.stepCreateProject2(sequence, **kw)
-    vendor = sequence.get('organisation1')
-    vendor.setRegion(self.default_region)
-    vendor.validate()
-    sequence.edit(vendor=vendor)
-    client1 = sequence.get('organisation2')
-    client1.setRegion(self.default_region)
-    self.assertNotEquals(client1.getRegionValue(), None)
-    client1.validate()
-    sequence.edit(client1=client1)
-    client2 = sequence.get('organisation3')
-    self.assertEquals(client2.getRegionValue(), None)
-    client2.validate()
-    sequence.edit(client2=client2)
-
-  def stepCheckOrderRule(self, sequence=None, sequence_list=None, **kw):
-    """Check we have a related Order Rule"""
-    order = sequence.get('order')
-    simulation_tool = self.getSimulationTool()
-    # Check that there is an applied rule for our packing list
-    rule_list = [x for x in simulation_tool.objectValues()
-                            if x.getCausalityValue()==order]
-    self.assertNotEquals(len(rule_list), 0)
-    sequence.edit(order_rule_list = rule_list)
-
-    self.assertEquals(len(order.getMovementList()),
-                  sum([len(rule.objectIds()) for rule in rule_list]))
-
-  def stepCheckInvoicingRule(self, sequence=None, sequence_list=None, **kw):
-    """
-    Checks that the invoicing rule is applied and its values are correct.
-    """
-    order_rule_list = sequence.get('order_rule_list')
-    invoicing_rule_list = []
-    invoice_transaction_rule_list = []
-    for order_rule in order_rule_list :
-      for order_simulation_movement in order_rule.objectValues() :
-        temp_invoicing_rule_list = [ar for ar in order_simulation_movement.objectValues()[0].objectValues()[0].objectValues()
-          if ar.getSpecialiseValue().getPortalType() == 'Invoice Simulation Rule']
-        self.assertEquals(len(temp_invoicing_rule_list), 1)
-        invoicing_rule_list.extend(temp_invoicing_rule_list)
-    sequence.edit(invoicing_rule_list=invoicing_rule_list)
-    invoicing_rule = invoicing_rule_list[0]
-    sequence.edit(invoicing_rule = invoicing_rule)
-    for invoicing_rule in invoicing_rule_list:
-      self.assertEquals(invoicing_rule.getSpecialiseReference(),
-          'default_invoicing_rule')
-      self.assertEquals(invoicing_rule.getPortalType(),
-          'Applied Rule')
-      simulation_movement_list = invoicing_rule.objectValues()
-      self.assertNotEquals(len(simulation_movement_list), 0)
-      for simulation_movement in simulation_movement_list :
-        invoice_transaction_rule_list.extend([applied_rule for applied_rule
-          in simulation_movement.objectValues() if applied_rule \
-              .getSpecialiseValue().getPortalType()
-              == 'Invoice Transaction Simulation Rule'])
-        resource_list = sequence.get('resource_list')
-        self.assertEquals(simulation_movement.getPortalType(),
-                          'Simulation Movement')
-        self.assertTrue(simulation_movement.getResourceValue() in
-            resource_list)
-        self.assertTrue(simulation_movement.isConvergent())
-        # TODO: What is the invoice dates supposed to be ?
-        # is this done through profiles ?
-        #self.assertEquals(simulation_movement.getStartDate(),
-        #           sequence.get('order').getStartDate())
-        #self.assertEquals(simulation_movement.getStopDate(),
-        #            sequence.get('order').getStopDate())
-    sequence.edit(invoice_transaction_rule_list=invoice_transaction_rule_list)
-
-  def stepCheckInvoiceTransactionRule(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Checks that the applied invoice_transaction_rule is expanded and its movements are
-    consistent with its parent movement
-    """
-    invoice_transaction_rule_list = \
-        sequence.get('invoice_transaction_rule_list')
-    for applied_invoice_transaction_rule in invoice_transaction_rule_list:
-      parent_movement = aq_parent(applied_invoice_transaction_rule)
-      invoice_transaction_rule = \
-        applied_invoice_transaction_rule.getSpecialiseValue()
-      self.assertEquals(3, len(applied_invoice_transaction_rule.objectValues()))
-      for line_id, line_source_id, line_destination_id, line_ratio in \
-                                            self.transaction_line_definition_list:
-        movement = None
-        for simulation_movement in \
-                applied_invoice_transaction_rule.objectValues():
-          if simulation_movement.getSourceId() == line_source_id and\
-              simulation_movement.getDestinationId() == line_destination_id:
-            movement = simulation_movement
-            break
-
-        self.assertTrue(movement is not None)
-        self.assertEquals(movement.getCorrectedQuantity(), parent_movement.getPrice() *
-            parent_movement.getCorrectedQuantity() * line_ratio)
-        self.assertEquals(movement.getStartDate(),
-            parent_movement.getStartDate())
-        self.assertEquals(movement.getStopDate(),
-            parent_movement.getStopDate())
-
-  def modifyPackingListState(self, transition_name,
-                             sequence,packing_list=None):
-    """ calls the workflow for the packing list """
-    if packing_list is None:
-      packing_list = sequence.get('packing_list')
-    packing_list.portal_workflow.doActionFor(packing_list, transition_name)
-
-  def stepSetReadyPackingList(self, sequence=None, sequence_list=None, **kw):
-    """ set the Packing List as Ready. This must build the invoice. """
-    self.modifyPackingListState('set_ready_action', sequence=sequence)
-    packing_list = sequence.get('packing_list')
-    self.assertEquals(packing_list.getSimulationState(), 'ready')
-
-  def stepSetReadyNewPackingList(self, sequence=None,
-                                 sequence_list=None, **kw):
-    """ set the Packing List as Ready. This must build the invoice. """
-    packing_list = sequence.get('new_packing_list')
-    self.modifyPackingListState('set_ready_action', sequence=sequence,
-                                packing_list=packing_list)
-    self.assertEquals(packing_list.getSimulationState(), 'ready')
-
-  def stepStartPackingList(self, sequence=None, sequence_list=None, **kw):
-    self.modifyPackingListState('start_action', sequence=sequence)
-    packing_list = sequence.get('packing_list')
-    self.assertEquals(packing_list.getSimulationState(), 'started')
-
-  def stepStartNewPackingList(self, sequence=None, sequence_list=None, **kw):
-    packing_list = sequence.get('new_packing_list')
-    self.modifyPackingListState('start_action', sequence=sequence,
-                                packing_list=packing_list)
-    self.assertEquals(packing_list.getSimulationState(), 'started')
-
-  def stepStopPackingList(self, sequence=None, sequence_list=None, **kw):
-    self.modifyPackingListState('stop_action', sequence=sequence)
-    packing_list = sequence.get('packing_list')
-    self.assertEquals(packing_list.getSimulationState(), 'stopped')
-
-  def stepDeliverPackingList(self, sequence=None, sequence_list=None, **kw):
-    self.modifyPackingListState('deliver_action', sequence=sequence)
-    packing_list = sequence.get('packing_list')
-    self.assertEquals(packing_list.getSimulationState(), 'delivered')
-
-  def stepCancelPackingList(self, sequence=None, sequence_list=None, **kw):
-    self.modifyPackingListState('cancel_action', sequence=sequence)
-    packing_list = sequence.get('packing_list')
-    self.assertEquals(packing_list.getSimulationState(), 'cancelled')
-
-  def modifyInvoiceState(self, transition_name,
-                             sequence,invoice=None):
-    """ calls the workflow for the invoice """
-    if invoice is None:
-      invoice = sequence.get('invoice')
-    invoice.portal_workflow.doActionFor(invoice, transition_name)
-
-  def stepStartInvoice(self, sequence=None, sequence_list=None, **kw):
-    self.modifyInvoiceState('start_action', sequence=sequence)
-    invoice = sequence.get('invoice')
-    self.assertEquals(invoice.getSimulationState(), 'started')
-
-  def stepStartNewInvoice(self, sequence=None, sequence_list=None, **kw):
-    invoice = sequence.get('new_invoice')
-    self.modifyInvoiceState('start_action', sequence=sequence,
-                                invoice=invoice)
-    self.assertEquals(invoice.getSimulationState(), 'started')
-
-  def stepStopInvoice(self, sequence=None, sequence_list=None, **kw):
-    self.modifyInvoiceState('stop_action', sequence=sequence)
-    invoice = sequence.get('invoice')
-    self.assertEquals(invoice.getSimulationState(), 'stopped')
-
-  def stepDeliverInvoice(self, sequence=None, sequence_list=None, **kw):
-    self.modifyInvoiceState('deliver_action', sequence=sequence)
-    invoice = sequence.get('invoice')
-    self.assertEquals(invoice.getSimulationState(), 'delivered')
-
-  def stepCancelInvoice(self, sequence=None, sequence_list=None, **kw):
-    self.modifyInvoiceState('cancel_action', sequence=sequence)
-    invoice = sequence.get('invoice')
-    self.assertEquals(invoice.getSimulationState(), 'cancelled')
-
-
-  def stepSwitchPackingLists(self, sequence=None, sequence_list=None, **kw):
-    packing_list = sequence.get('packing_list')
-    new_packing_list = sequence.get('new_packing_list')
-    #invoice = new_packing_list.getDefaultCausalityRelatedValue(
-        #portal_type=self.invoice_portal_type)
-    sequence.edit(packing_list=new_packing_list,
-        new_packing_list=packing_list)#, invoice=invoice)
-
-  def stepSwitchInvoices(self, sequence=None, sequence_list=None, **kw):
-    invoice = sequence.get('invoice')
-    new_invoice = sequence.get('new_invoice')
-    sequence.edit(invoice=new_invoice, new_invoice=invoice)
-
-  def stepCheckPackingListSimulation(self, sequence=None, sequence_list=None, **kw):
-    """ checks that simulation movements related to the packing list are OK """
-    packing_list = sequence.get('packing_list')
-    order = sequence.get('order')
-    order_root_applied_rule = order.getCausalityRelatedValueList(
-                                  portal_type = 'Applied Rule')[0]
-    # check simulation movements from this packing list
-    for movement in packing_list.getMovementList() :
-      simulation_movement_list = movement.getOrderRelatedValueList()
-      self.assertNotEquals(len(simulation_movement_list), 0)
-      total_quantity = 0
-      for simulation_movement in simulation_movement_list :
-        total_quantity += simulation_movement.getQuantity()
-        # check that those movements come from the same root applied
-        # rule than the order.
-        self.assertEquals( simulation_movement.getRootAppliedRule(),
-                           order_root_applied_rule)
-      self.assertEquals(total_quantity, movement.getQuantity())
-
-  def checkMirrorAcquisition(self, object, acquired_object):
-    """
-      Check if properties are well acquired for mirrored case
-    """
-    # packing_list_movement, simulation_movement
-
-    self.assertEquals(acquired_object.getStartDate(), object.getStopDate())
-    self.assertEquals(acquired_object.getStopDate(), object.getStartDate())
-    self.assertEquals(acquired_object.getSourceValue(), \
-                      object.getDestinationValue())
-    self.assertEquals(acquired_object.getDestinationValue(), \
-                      object.getSourceValue())
-
-    self.assertEquals(acquired_object.getSourceSectionValue(), \
-                      object.getDestinationSectionValue())
-    self.assertEquals(acquired_object.getDestinationSectionValue(), \
-                      object.getSourceSectionValue())
-
-  def stepCheckInvoiceBuilding(self, sequence=None, sequence_list=None, **kw):
-    """
-    checks that the invoice is built with the default_invoice_builder
-    """
-    packing_list = sequence.get('packing_list')
-    related_invoice_list = packing_list.getCausalityRelatedValueList(
-                     portal_type=self.invoice_portal_type)
-
-    if packing_list.getPortalType() == 'Purchase Packing List':
-      packing_list_building_state = 'stopped'
-    else:
-      packing_list_building_state = 'started'
-    packing_list_state = packing_list.getSimulationState()
-    if packing_list_state != packing_list_building_state :
-      self.assertEquals(0, len(related_invoice_list))
-    else:
-      self.assertEquals(1, len(related_invoice_list))
-
-      invoice = related_invoice_list[0].getObject()
-      self.failUnless(invoice is not None)
-      # Invoices created by Delivery Builder are in confirmed state
-      self.assertEquals(invoice.getSimulationState(), 'confirmed')
-
-      # Get the list of simulation movements of packing list ...
-      packing_list_simulation_movement_list = []
-      for packing_list_movement in packing_list.getMovementList():
-           packing_list_simulation_movement_list.extend(
-                packing_list_movement.getDeliveryRelatedValueList())
-      # ... invoice simulation movement are their childrens.
-      simulation_movement_list = []
-      for p_l_simulation_movement in packing_list_simulation_movement_list :
-        for applied_rule in p_l_simulation_movement.objectValues() :
-          simulation_movement_list.extend(applied_rule.objectValues())
-
-      # First, test if each Simulation Movement is related to an
-      # Invoice Movement
-      invoice_relative_url = invoice.getRelativeUrl()
-      for simulation_movement in simulation_movement_list:
-        invoice_movement_list = simulation_movement.getDeliveryValueList()
-        self.assertEquals(len(invoice_movement_list), 1)
-        invoice_movement = invoice_movement_list[0]
-        self.failUnless(invoice_movement is not None)
-        self.assert_(invoice_movement.getRelativeUrl().\
-                              startswith(invoice_relative_url))
-
-      # Then, test if each Invoice movement is equals to the sum of somes
-      # Simulation Movements
-      for invoice_movement in invoice.getMovementList(portal_type = [
-                          self.invoice_cell_portal_type,
-                          self.invoice_line_portal_type]) :
-        related_simulation_movement_list = invoice_movement.\
-                 getDeliveryRelatedValueList(portal_type='Simulation Movement')
-        quantity = 0
-        total_price = 0
-        invoice_movement_quantity = invoice_movement.getQuantity()
-        for related_simulation_movement in related_simulation_movement_list:
-          quantity += related_simulation_movement.getQuantity()
-          total_price += related_simulation_movement.getPrice() *\
-                         related_simulation_movement.getQuantity()
-          # Test resource
-          self.assertEquals(invoice_movement.getResource(), \
-                            related_simulation_movement.getResource())
-          # Test resource variation
-          self.assertEquals(invoice_movement.getVariationText(), \
-                            related_simulation_movement.getVariationText())
-          self.assertEquals(invoice_movement.getVariationCategoryList(), \
-                        related_simulation_movement.getVariationCategoryList())
-          # Test acquisition
-          self.checkAcquisition(invoice_movement,
-                                related_simulation_movement)
-          # Test delivery ratio
-          self.assertEquals(related_simulation_movement.getQuantity() /\
-                            invoice_movement_quantity, \
-                            related_simulation_movement.getDeliveryRatio())
-
-        self.assertEquals(quantity, invoice_movement.getQuantity())
-        # Test price
-        self.assertEquals(total_price / quantity, invoice_movement.getPrice())
-
-      sequence.edit(invoice = invoice)
-
-      # Test causality
-      self.assertEquals(len(invoice.getCausalityValueList(
-                      portal_type = self.packing_list_portal_type)), 1)
-      self.assertEquals(invoice.getCausalityValue(), packing_list)
-
-      # Finally, test getTotalQuantity and getTotalPrice on Invoice
-      self.assertEquals(packing_list.getTotalQuantity(),
-                        invoice.getTotalQuantity())
-      self.assertEquals(packing_list.getTotalPrice(),
-                        invoice.getTotalPrice())
-
-  def stepCheckInvoicesConsistency(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Checks that all invoices are consistent:
-    - transaction lines match invoice lines
-    - no movement is divergent
-    """
-    invoice_list = self.getPortal()['accounting_module'].objectValues()
-    for invoice in invoice_list:
-      accounting_state_list = \
-          list(self.getPortal().getPortalCurrentInventoryStateList())
-      accounting_state_list.append('cancelled')
-      if invoice.getSimulationState() in accounting_state_list:
-        invoice_line_list = invoice.contentValues(
-            portal_type=self.invoice_line_portal_type)
-        invoice_transaction_line_list = invoice.contentValues(
-            portal_type=self.invoice_transaction_line_portal_type)
-        self.assertEquals(3, len(invoice_transaction_line_list))
-        expected_price = 0.0
-        for line in invoice_line_list:
-          expected_price += line.getTotalPrice()
-        for line_id, line_source, line_dest, line_ratio in \
-            self.transaction_line_definition_list:
-          for line in invoice.contentValues(
-              portal_type=self.invoice_transaction_line_portal_type):
-            if line.getSource() == 'account_module/%s' % line_source and \
-                line.getDestination() == 'account_module/%s' % line_dest:
-              break
-          else:
-            self.fail('No line found that matches %s' % line_id)
-          resource_precision = line.getResourceValue().getQuantityPrecision()
-          self.assertEquals(round(line.getQuantity(), resource_precision),
-              round(expected_price * line_ratio, resource_precision))
-
-  def stepCheckInvoiceLineHasReferenceAndIntIndex(self, sequence=None, **kw):
-    """Check that the unique invoice line in the invoice has reference and int
-    index.
-    """
-    invoice = sequence.get('invoice')
-    invoice_line_list = invoice.contentValues(
-                            portal_type=self.invoice_line_portal_type)
-    self.assertEquals(1, len(invoice_line_list))
-    invoice_line = invoice_line_list[0]
-    self.assertEquals(1, invoice_line.getIntIndex())
-    self.assertEquals('1', invoice_line.getReference())
-
-  def stepCheckPackingListInvoice(
-                      self, sequence=None, sequence_list=None, **kw):
-    """ Checks if the delivery builder is working as expected,
-        coping the atributes from packing list to invoice."""
-    packing_list = sequence.get('packing_list')
-    related_invoice_list = packing_list.getCausalityRelatedValueList(
-                     portal_type=self.invoice_portal_type)
-    self.assertEquals(len(related_invoice_list), 1)
-    invoice = related_invoice_list[0]
-    self.assertEquals(packing_list.getSource(), invoice.getSource())
-    self.assertEquals(packing_list.getDestination(), invoice.getDestination())
-    self.assertEquals(packing_list.getDestinationSection(), \
-                                       invoice.getDestinationSection())
-    self.assertEquals(packing_list.getSourceSection(), \
-                                       invoice.getSourceSection())
-    self.assertEquals(packing_list.getDestinationDecision(), \
-                                       invoice.getDestinationDecision())
-    self.assertEquals(packing_list.getSourceDecision(), \
-                                       invoice.getSourceDecision())
-    self.assertEquals(packing_list.getDestinationAdministration(), \
-                                       invoice.getDestinationAdministration())
-    self.assertEquals(packing_list.getSourceAdministration(), \
-                                       invoice.getSourceAdministration())
-    self.assertEquals(packing_list.getDestinationProject(), \
-                                       invoice.getDestinationProject())
-    self.assertEquals(packing_list.getSourceProject(), \
-                                       invoice.getSourceProject())
-    self.assertEquals(packing_list.getPriceCurrency(), \
-                                       invoice.getPriceCurrency())
-
-
-
-  def stepCheckDeliveryRuleForDeferred(
-                      self, sequence=None, sequence_list=None, **kw):
-    """ Checks that a delivery rule has been created when we took 'split
-        and defer' decision on the divergeant Packing List. """
-    # TODO
-
-  def stepCheckDeliveryRuleIsEmpty(
-                      self, sequence=None, sequence_list=None, **kw):
-    """ Checks that an empty delivery rule is created for the
-        convergeant Packing List"""
-    packing_list = sequence.get('packing_list')
-    self.failUnless(packing_list is not None)
-    simulation_tool = self.getSimulationTool()
-    # Check that there is an applied rule for our packing list
-    rule_list = [x for x in simulation_tool.objectValues()
-                          if x.getCausalityValue()==packing_list]
-    self.assertEquals(len(rule_list),1)
-    packing_list_rule = rule_list[0]
-    sequence.edit(packing_list_rule=packing_list_rule)
-    rule_line_list = packing_list_rule.objectValues()
-    packing_list_line_list = packing_list.objectValues()
-    self.assertEquals(len(packing_list_line_list),
-                      len(rule_line_list))
-    self.assertEquals(1, len(rule_line_list))
-    rule_line = rule_line_list[0]
-    packing_list_line = packing_list_line_list[0]
-    self.assertEquals(rule_line.getQuantity(), 10)
-    self.assertEquals(rule_line.getPrice(), 100)
-    self.assertEquals(rule_line.getDeliveryValue(),
-                      packing_list_line)
-    self.assertEquals(rule_line.getStartDate(),
-                      packing_list_line.getStartDate())
-    self.assertEquals(rule_line.getStopDate(),
-                      packing_list_line.getStopDate())
-    self.assertEquals(rule_line.getPortalType(),
-                      'Simulation Movement')
-
-
-  def stepCheckPackingList(self,sequence=None, sequence_list=None,**kw):
-    """  """
-    packing_list_module = self.getSalePackingListModule()
-    order_rule = sequence.get('order_rule')
-    order = sequence.get('order')
-    sale_packing_list_list = []
-    for o in packing_list_module.objectValues():
-      if o.getCausalityValue() == order:
-        sale_packing_list_list.append(o)
-    self.assertEquals(len(sale_packing_list_list), 1)
-    sale_packing_list = sale_packing_list_list[0]
-    sale_packing_list_line_list = sale_packing_list.objectValues()
-    self.assertEquals(len(sale_packing_list_line_list),1)
-    sale_packing_list_line = sale_packing_list_line_list[0]
-    product = sequence.get('resource')
-    self.assertEquals(sale_packing_list_line.getResourceValue(),
-                      product)
-    self.assertEquals(sale_packing_list_line.getPrice(),
-                      self.price1)
-    LOG('sale_packing_list_line.showDict()',0,
-          sale_packing_list_line.showDict())
-    self.assertEquals(sale_packing_list_line.getQuantity(),
-                      self.quantity1)
-    self.assertEquals(sale_packing_list_line.getTotalPrice(),
-                      self.total_price1)
-    sequence.edit(packing_list = sale_packing_list)
-
-  def stepCheckTwoInvoices(self,sequence=None, sequence_list=None, **kw):
-    """ checks invoice properties are well set. """
-    # Now we will check that we have two invoices created
-    packing_list = sequence.get('packing_list')
-    invoice_list = packing_list.getCausalityRelatedValueList(
-         portal_type=self.invoice_portal_type)
-    self.assertEquals(len(invoice_list),1)
-    invoice = invoice_list[0]
-    self.assertEquals(invoice.getSimulationState(), 'confirmed')
-    sequence.edit(invoice=invoice)
-    new_packing_list = sequence.get('new_packing_list')
-    new_invoice_list = new_packing_list.getCausalityRelatedValueList(
-        portal_type=self.invoice_portal_type)
-    self.assertEquals(len(new_invoice_list),1)
-    new_invoice = new_invoice_list[0]
-    self.assertEquals(new_invoice.getSimulationState(), 'confirmed')
-    sequence.edit(new_invoice=new_invoice)
-
-  def stepStartTwoInvoices(self,sequence=None, sequence_list=None, **kw):
-    """ start both invoices. """
-    portal = self.getPortal()
-    invoice = sequence.get('invoice')
-    new_invoice = sequence.get('new_invoice')
-    portal.portal_workflow.doActionFor(invoice, 'start_action')
-    portal.portal_workflow.doActionFor(new_invoice, 'start_action')
-
-  def stepCheckTwoInvoicesTransactionLines(self,sequence=None,
-                                           sequence_list=None, **kw):
-    """ checks invoice properties are well set. """
-    invoice = sequence.get('invoice')
-    new_invoice = sequence.get('new_invoice')
-    self.assertEquals(3,len(invoice.objectValues(
-        portal_type=self.invoice_transaction_line_portal_type)))
-    self.assertEquals(3,len(new_invoice.objectValues(
-        portal_type=self.invoice_transaction_line_portal_type)))
-    account_module = self.getAccountModule()
-    found_dict = {}
-    for line in invoice.objectValues(
-        portal_type=self.invoice_transaction_line_portal_type):
-      source_id = line.getSourceId()
-      found_dict[source_id] = line.getQuantity()
-    total_price = (self.default_quantity-1) * self.default_price
-    expected_dict = {
-      'sale' : total_price,
-      'receivable_vat' : total_price * self.vat_rate,
-      'customer' : - (total_price + total_price * self.vat_rate)
-      }
-    self.failIfDifferentSet(expected_dict.keys(),found_dict.keys())
-    for key in found_dict.keys():
-      self.assertAlmostEquals(expected_dict[key],found_dict[key],places=2)
-    found_dict = {}
-    for line in new_invoice.objectValues(
-        portal_type=self.invoice_transaction_line_portal_type):
-      source_id = line.getSourceId()
-      found_dict[source_id] = line.getQuantity()
-    total_price = 1 * self.default_price
-    expected_dict = {
-      'sale' : total_price,
-      'receivable_vat' : total_price * self.vat_rate,
-      'customer' : - (total_price + total_price * self.vat_rate)
-      }
-    self.failIfDifferentSet(expected_dict.keys(), found_dict.keys())
-    for key in found_dict.keys():
-      self.assertAlmostEquals(expected_dict[key], found_dict[key], places=2)
-
-  def stepRebuildAndCheckNothingIsCreated(self, sequence=None,
-                                           sequence_list=None, **kw):
-    """Rebuilds with sale_invoice_builder and checks nothing more is
-    created. """
-    accounting_module = self.getAccountingModule()
-    portal_type_list = ('Sale Invoice Transaction', 'Purchase Invoice Transaction')
-    sale_invoice_transaction_count = len(accounting_module.objectValues(
-      portal_type=portal_type_list))
-    for builder in self.getPortal().portal_deliveries.objectValues():
-      builder.build()
-    self.assertEquals(sale_invoice_transaction_count,
-                      len(accounting_module.objectValues(
-      portal_type=portal_type_list)))
-
-  def stepModifyInvoicesDate(self, sequence=None,
-                                           sequence_list=None, **kw):
-    """Change invoice date"""
-    invoice = sequence.get('invoice')
-    new_invoice = sequence.get('new_invoice')
-    invoice.edit(start_date=self.datetime,
-                 stop_date=self.datetime+1)
-    new_invoice.edit(start_date=self.datetime,
-                 stop_date=self.datetime+1)
-
-  def stepRemoveDateMovementGroupForTransactionBuilder(self, sequence=None,
-            sequence_list=None, **kw):
-    """
-    Remove DateMovementGroup
-    """
-    portal = self.getPortal()
-    builder = portal.portal_deliveries.sale_invoice_transaction_builder
-    delivery_movement_group_list = builder.getDeliveryMovementGroupList()
-    uf = self.getPortal().acl_users
-    uf._doAddUser('admin', '', ['Manager'], [])
-    user = uf.getUserById('admin').__of__(uf)
-    newSecurityManager(None, user)
-    for movement_group in delivery_movement_group_list:
-      if movement_group.getPortalType() == 'Property Movement Group':
-        # it contains 'start_date' and 'stop_date' only, so we remove
-        # movement group itself.
-        builder.deleteContent(movement_group.getId())
-    builder.newContent(
-      portal_type = 'Parent Explanation Movement Group',
-      collect_order_group='delivery',
-      int_index=len(delivery_movement_group_list)+1
-      )
-    user = uf.getUserById('test_invoice_user').__of__(uf)
-    newSecurityManager(None, user)
-
-  def stepEditInvoice(self, sequence=None, sequence_list=None, **kw):
-    """Edit the current invoice, to trigger updateAppliedRule."""
-    invoice = sequence.get('invoice')
-    invoice.edit()
-
-    # call updateAppliedRule directly, don't rely on edit interactions
-    rule_reference = 'default_invoice_rule'
-    self.assertNotEquals(0,
-        len(self.portal.portal_rules.searchFolder(reference=rule_reference)))
-    invoice.updateAppliedRule(rule_reference=rule_reference)
-
-  def stepCheckInvoiceRuleNotAppliedOnInvoiceEdit(self,
-                    sequence=None, sequence_list=None, **kw):
-    """If we call edit on the invoice, invoice rule should not be
-    applied on lines created by delivery builder."""
-    invoice = sequence.get('invoice')
-    # FIXME: empty applied rule should not be created
-    #self.assertEquals(len(invoice.getCausalityRelatedValueList(
-    #         portal_type=self.applied_rule_portal_type)), 0)
-    for invoice_mvt in invoice.getMovementList():
-      self.assertEquals(len(invoice_mvt.getOrderRelatedValueList(
-            portal_type=self.simulation_movement_portal_type)), 0)
-
-  def stepEditPackingList(self, sequence=None, sequence_list=None, **kw):
-    """Edit the current packing list, to trigger updateAppliedRule."""
-    packing_list = sequence.get('packing_list')
-    packing_list.edit()
-
-    # call updateAppliedRule directly, don't rely on edit interactions
-    rule_reference = 'default_delivery_rule'
-    self.assertNotEquals(0,
-        len(self.portal.portal_rules.searchFolder(reference=rule_reference)))
-    packing_list.updateAppliedRule(rule_reference=rule_reference)
-
-  def stepCheckDeliveryRuleNotAppliedOnPackingListEdit(self,
-                    sequence=None, sequence_list=None, **kw):
-    """If we call edit on the packing list, delivery rule should not be
-    applied on lines created by delivery builder."""
-    packing_list = sequence.get('packing_list')
-    # FIXME: empty applied rule should not be created
-    #self.assertEquals(len(packing_list.getCausalityRelatedValueList(
-    #         portal_type=self.applied_rule_portal_type)), 0)
-    for delivery_mvt in packing_list.getMovementList():
-      self.assertEquals(len(delivery_mvt.getOrderRelatedValueList(
-            portal_type=self.simulation_movement_portal_type)), 0)
-
-  def stepDecreaseInvoiceLineQuantity(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Set a decreased quantity on invoice lines
-    """
-    invoice = sequence.get('invoice')
-    quantity = sequence.get('line_quantity',default=self.default_quantity)
-    quantity = quantity - 1
-    sequence.edit(line_quantity=quantity)
-    for invoice_line in invoice.objectValues(
-        portal_type=self.invoice_line_portal_type):
-      invoice_line.edit(quantity=quantity)
-    sequence.edit(last_delta = sequence.get('last_delta', 0.0) - 1.0)
-
-  def stepIncreaseInvoiceLineQuantity(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Set a Increased quantity on invoice lines
-    """
-    invoice = sequence.get('invoice')
-    quantity = sequence.get('line_quantity',default=self.default_quantity)
-    quantity = quantity + 1
-    sequence.edit(line_quantity=quantity)
-    for invoice_line in invoice.objectValues(
-        portal_type=self.invoice_line_portal_type):
-      invoice_line.edit(quantity=quantity)
-    sequence.edit(last_delta = sequence.get('last_delta', 0.0) + 1.0)
-
-  def stepSetInvoiceLineQuantityToZero(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Set the quantity on invoice lines to zero
-    """
-    invoice = sequence.get('invoice')
-    #default_quantity = sequence.get('line_quantity',default_quantity)
-    quantity = 0.0
-    sequence.edit(line_quantity=quantity)
-    for invoice_line in invoice.objectValues(
-        portal_type=self.invoice_line_portal_type):
-      invoice_line.edit(quantity=quantity)
-    sequence.edit(last_delta = - self.default_quantity)
-
-  def stepChangeInvoiceStartDate(self, sequence=None, sequence_list=None, **kw):
-    """
-      Change the start_date of the invoice.
-    """
-    invoice = sequence.get('invoice')
-    invoice.edit(start_date=self.datetime + 15)
-
-  def stepCheckInvoiceIsCalculating(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Test if invoice is calculating
-    """
-    invoice = sequence.get('invoice')
-    self.assertEquals('calculating',invoice.getCausalityState())
-
-  def stepCheckInvoiceIsDiverged(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Test if invoice is diverged
-    """
-    invoice = sequence.get('invoice')
-    self.assertEquals('diverged',invoice.getCausalityState())
-
-  def stepCheckInvoiceIsSolved(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Test if invoice is solved
-    """
-    invoice = sequence.get('invoice')
-    self.assertEquals('solved', invoice.getCausalityState(),
-                      invoice.getDivergenceList())
-
-  def stepCheckInvoiceIsDivergent(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Test if invoice is divergent
-    """
-    invoice = sequence.get('invoice')
-    self.assertTrue(invoice.isDivergent())
-
-  def stepCheckInvoiceIsNotDivergent(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    Test if invoice is not divergent
-    """
-    invoice = sequence.get('invoice')
-    if invoice.isDivergent():
-      self.fail(invoice.getDivergenceList())
-
-  def stepSplitAndDeferInvoice(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    split and defer at the invoice level
-    """
-    invoice = sequence.get('invoice')
-    kw = {'listbox':[
-      {'listbox_key':line.getRelativeUrl(),
-       'choice':'SplitAndDefer'} for line in invoice.getMovementList()]}
-    self.portal.portal_workflow.doActionFor(
-      invoice,
-      'split_and_defer_action',
-      start_date=self.datetime + 15,
-      stop_date=self.datetime + 25,
-      **kw)
-    pass
-
-  def stepUnifyStartDateWithDecisionInvoice(self, sequence=None,
-                                            sequence_list=None):
-    invoice = sequence.get('invoice')
-    self._solveDeliveryGroupDivergence(invoice, 'start_date',
-                                       invoice.getRelativeUrl())
-
-  def stepAcceptDecisionQuantityInvoice(self,sequence=None, sequence_list=None):
-    invoice = sequence.get('invoice')
-    self._solveDivergence(invoice, 'quantity', 'accept')
-
-  def stepAcceptDecisionInvoice(self, sequence=None, sequence_list=None,
-      **kw):
-    """
-    accept decision at the invoice level
-    """
-    invoice = sequence.get('invoice')
-    invoice.portal_workflow.doActionFor(invoice,'accept_decision_action')
-
-  def stepCheckInvoiceSplitted(self, sequence=None, sequence_list=None, **kw):
-    """
-    Test if invoice was splitted
-    """
-    packing_list = sequence.get('packing_list')
-    invoice_list = packing_list.getCausalityRelatedValueList(
-        portal_type=self.invoice_portal_type)
-    self.assertEquals(2,len(invoice_list))
-    invoice1 = None
-    invoice2 = None
-    for invoice in invoice_list:
-      if invoice.getUid() == sequence.get('invoice').getUid():
-        invoice1 = invoice
-      else:
-        invoice2 = invoice
-    sequence.edit(new_invoice=invoice2)
-    for line in invoice1.objectValues(
-          portal_type=self.invoice_line_portal_type):
-      self.assertEquals(self.default_quantity-1,line.getQuantity())
-    for line in invoice2.objectValues(
-          portal_type=self.invoice_line_portal_type):
-      self.assertEquals(1,line.getQuantity())
-
-  def stepCheckInvoiceNotSplitted(self, sequence=None, sequence_list=None, **kw):
-    """
-    Test if invoice was not splitted
-    """
-    packing_list = sequence.get('packing_list')
-    invoice_list = packing_list.getCausalityRelatedValueList(
-        portal_type=self.invoice_portal_type)
-    self.assertEquals(1,len(invoice_list))
-    invoice1 = None
-    for invoice in invoice_list:
-      if invoice.getUid() == sequence.get('invoice').getUid():
-        invoice1 = invoice
-    last_delta = sequence.get('last_delta', 0.0)
-    for line in invoice1.objectValues(
-        portal_type=self.invoice_line_portal_type):
-      self.assertEquals(self.default_quantity + last_delta,
-          line.getQuantity())
-
-  def stepAddInvoiceLines(self, sequence=None, sequence_list=[]):
-    """
-    add some invoice and accounting lines to the invoice
-    """
-    invoice = sequence.get('invoice')
-    invoice.newContent(portal_type='Invoice Line',
-        resource_value=sequence.get('resource'), quantity=3, price=555)
-    invoice.newContent(portal_type='Sale Invoice Transaction Line',
-        id ='receivable', source='account_module/customer',
-        destination='account_module/supplier', quantity=-1665)
-    invoice.newContent(portal_type='Sale Invoice Transaction Line',
-        id='income', source='account_module/sale',
-        destination='account_module/purchase', quantity=1665)
-
-  def stepAddWrongInvoiceLines(self, sequence=None, sequence_list=[]):
-    """
-    add some wrong invoice and accounting lines to the invoice
-    """
-    invoice = sequence.get('invoice')
-    invoice.newContent(portal_type='Sale Invoice Transaction Line',
-        id='bad_movement', source='account_module/sale',
-        destination='account_module/purchase', quantity=2, price=4)
-    invoice.newContent(portal_type='Sale Invoice Transaction Line',
-        id='counter_bad_movement', source='account_module/sale',
-        destination='account_module/purchase', quantity=-2, price=4)
-    for movement in invoice.getMovementList():
-      movement.edit(resource_value=sequence.get('resource'))
-
-  def stepCheckStartInvoiceFail(self, sequence=None, sequence_list=[]):
-    """
-    checks that it's not possible to start an invoice with really wrong
-    lines
-    """
-    try:
-      self.tic()
-    except RuntimeError, exc:
-      invoice = sequence.get('invoice')
-      it_builder = self.portal.portal_deliveries.sale_invoice_transaction_builder
-      # check which activities are failing
-      self.assertTrue(str(exc).startswith('tic is looping forever.'),
-          '%s does not start with "tic is looping forever."' % str(exc))
-      msg_list = ['/'.join(x.object_path) for x in
-          self.getActivityTool().getMessageList()]
-      self.assertTrue(it_builder.getPath() in msg_list, '%s in %s' %
-          (it_builder.getPath(), msg_list))
-      # flush failing activities
-      activity_tool = self.getActivityTool()
-      activity_tool.manageClearActivities(keep=0)
-    else:
-      self.fail("Error: stepStartInvoice didn't fail, the builder script"
-          + " InvoiceTransaction_postTransactionLineGeneration should have"
-          + " complained that accounting movements use multiple resources")
-
-  def stepCheckSimulationTrees(self, sequence=None, sequence_list=[]):
-    """
-    check that rules are created in the order we expect them
-    """
-    applied_rule_set = set()
-    invoice = sequence.get('invoice')
-    for movement in invoice.getMovementList():
-      for sm in movement.getDeliveryRelatedValueList():
-        applied_rule_set.add(sm.getRootAppliedRule())
-
-    rule_dict = {
-        'Order Root Simulation Rule': {
-          'movement_type_list': ['Sale Order Line', 'Sale Order Cell'],
-          'next_rule_list': ['Delivery Simulation Rule', ],
-          },
-        'Delivery Simulation Rule': {
-          'movement_type_list': ['Sale Packing List Line', 'Sale Packing List Cell'],
-          'next_rule_list': ['Invoice Simulation Rule', ],
-          },
-        'Invoice Simulation Rule': {
-          'movement_type_list': invoice.getPortalInvoiceMovementTypeList(),
-          'next_rule_list': ['Invoice Transaction Simulation Rule', 'Trade Model Simulation Rule'],
-          },
-        'Trade Model Simulation Rule': {
-          'next_rule_list': ['Invoice Transaction Simulation Rule'],
-          },
-        'Invoice Simulation Rule': {
-          'movement_type_list': invoice.getPortalInvoiceMovementTypeList() \
-              + invoice.getPortalAccountingMovementTypeList(),
-          'next_rule_list': ['Invoice Transaction Simulation Rule', 'Payment Simulation Rule',
-            'Trade Model Simulation Rule'],
-          },
-        'Invoice Transaction Simulation Rule': {
-          'parent_movement_type_list': invoice.getPortalInvoiceMovementTypeList(),
-          'movement_type_list': invoice.getPortalAccountingMovementTypeList(),
-          'next_rule_list': ['Payment Simulation Rule'],
-          },
-        'Payment Simulation Rule': {
-          'parent_movement_type_list': invoice.getPortalAccountingMovementTypeList(),
-          'next_rule_list': [],
-          },
-        }
-
-    def checkTree(rule):
-      """
-      checks the tree recursively
-      """
-      rule_type = rule.getSpecialiseValue().getPortalType()
-      rule_def = rule_dict.get(rule_type, {})
-      for k, v in rule_def.iteritems():
-        if k == 'movement_type_list':
-          for movement in rule.objectValues():
-            if movement.getDeliveryValue() is not None:
-              self.assertTrue(movement.getDeliveryValue().getPortalType() in v,
-                  'looking for %s in %s on %s' % (
-                  movement.getDeliveryValue().getPortalType(), v,
-                  movement.getPath()))
-        elif k == 'next_rule_list':
-          for movement in rule.objectValues():
-            found_rule_dict = {}
-            for next_rule in movement.objectValues():
-              next_rule_type = next_rule.getSpecialiseValue().getPortalType()
-              self.assertTrue(next_rule_type in v,
-                  'looking for %s in %s on %s' % (
-                  next_rule_type, v, next_rule.getPath()))
-              n = found_rule_dict.get(next_rule_type, 0)
-              found_rule_dict[next_rule_type] = n + 1
-            # for each movement, we want to make sure that each rule is not
-            # instanciated more than once
-            if len(found_rule_dict):
-              self.assertEquals(set(found_rule_dict.itervalues()), set([1]))
-        elif k == 'parent_movement_type_list':
-          if rule.getParentValue().getDeliveryValue() is not None:
-            parent_type = rule.getParentValue().getDeliveryValue().getPortalType()
-            self.assertTrue(parent_type in v, 'looking for %s in %s on %s' % (
-                parent_type, v, rule.getParentValue().getPath()))
-        elif k == 'parent_id_list':
-          self.assertTrue(rule.getParentId() in v, 'looking for %s in %s on %s'
-              % (rule.getParentId(), v, rule.getPath()))
-      for movement in rule.objectValues():
-        for next_rule in movement.objectValues():
-          checkTree(next_rule)
-
-    for applied_rule in applied_rule_set:
-      checkTree(applied_rule)
-
-  def stepAddInvoiceLinesManyTransactions(self, sequence=None, sequence_list=[]):
-    """
-    add some invoice and accounting lines to the invoice
-    """
-    invoice = sequence.get('invoice')
-    invoice_line = invoice.newContent(portal_type='Invoice Line')
-    transaction_line_1 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
-    transaction_line_2 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
-    transaction.commit()
-    self.tic()
-    invoice_line.edit(resource_value=sequence.get('resource'), quantity=3,
-        price=555)
-    transaction_line_1.edit(id ='receivable', source='account_module/customer',
-        destination='account_module/supplier', quantity=-1665)
-    transaction_line_2.edit(
-        id='income', source='account_module/sale',
-        destination='account_module/purchase', quantity=1665)
-
-class TestInvoice(TestInvoiceMixin):
-  """Test methods for sale and purchase invoice.
-  Subclasses must defines portal types to use.
-  """
-  quiet = 1
-  def test_invoice_transaction_line_resource(self):
-    """
-    tests that simulation movements corresponding to accounting line have a
-    good resource in the simulation
-    """
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',
-                    product_line='apparel')
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='Currency',
-                                base_unit_quantity=0.01)
-    self.createInvoiceTransactionRule(currency)
-
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client',
-                            price_currency= currency.getRelativeUrl(),
-                            default_address_region=self.default_region)
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor',
-                            price_currency= currency.getRelativeUrl(),
-                            default_address_region=self.default_region)
-    order = self.portal.getDefaultModule(self.order_portal_type).newContent(
-                              portal_type=self.order_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008, 1, 1),
-                              price_currency_value=currency,
-                              title='Order')
-    order_line = order.newContent(portal_type=self.order_line_portal_type,
-                                  resource_value=resource,
-                                  quantity=1,
-                                  price=2)
-
-    order.confirm()
-    transaction.commit()
-    self.tic()
-
-    related_applied_rule = order.getCausalityRelatedValue(
-                             portal_type='Applied Rule')
-    order_movement = related_applied_rule.contentValues()[0]
-    delivery_applied_rule = order_movement.contentValues()[0]
-    delivery_movement = delivery_applied_rule.contentValues()[0]
-    invoice_applied_rule = delivery_movement.contentValues()[0]
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    invoice_transaction_applied_rule = invoice_movement.contentValues()[0]
-    invoice_transaction_movement =\
-         invoice_transaction_applied_rule.contentValues()[0]
-    self.assertEquals(currency,
-          invoice_transaction_movement.getResourceValue())
-    self.assertEquals(currency,
-          delivery_movement.getPriceCurrencyValue())
-
-    
-  def test_modify_planned_order_invoicing_rule(self):
-    """
-    tests that modifying a planned order affects movements from invoicing
-    rule
-    """
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',
-                    product_line='apparel')
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='Currency',
-                                base_unit_quantity=0.01)
-
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client',
-                            price_currency= currency.getRelativeUrl())
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor',
-                            price_currency= currency.getRelativeUrl())
-    order = self.portal.getDefaultModule(self.order_portal_type).newContent(
-                              portal_type=self.order_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008, 1, 1),
-                              price_currency_value=currency,
-                              title='Order')
-    order_line = order.newContent(portal_type=self.order_line_portal_type,
-                                  resource_value=resource,
-                                  quantity=1,
-                                  price=2)
-
-    other_entity = self.portal.organisation_module.newContent(
-                                    portal_type='Organisation',
-                                    title='Other Entity',
-                                    price_currency=currency.getRelativeUrl())
-    other_project = self.portal.project_module.newContent(
-                                    portal_type='Project',
-                                    title='Other Project')
-    order.plan()
-    transaction.commit()
-    self.tic()
-    self.assertEquals('planned', order.getSimulationState())
-
-    related_applied_rule = order.getCausalityRelatedValue(
-                             portal_type='Applied Rule')
-    delivery_movement = related_applied_rule.contentValues()[0]
-    invoice_applied_rule = delivery_movement.contentValues()[0]
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-
-    order_line.setSourceValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-                      invoice_movement.getSourceValue())
-
-    order_line.setDestinationValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-                      invoice_movement.getDestinationValue())
-
-    order_line.setSourceSectionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-                      invoice_movement.getSourceSectionValue())
-
-    # make sure destination_section != source_section, this might be needed by
-    # some rules
-    order_line.setSourceSectionValue(order_line.getDestinationSectionValue())
-
-    order_line.setDestinationSectionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-                 invoice_movement.getDestinationSectionValue())
-
-    order_line.setSourceAdministrationValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-                 invoice_movement.getSourceAdministrationValue())
-
-    order_line.setDestinationAdministrationValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-            invoice_movement.getDestinationAdministrationValue())
-
-    order_line.setSourceDecisionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-                 invoice_movement.getSourceDecisionValue())
-
-    order_line.setDestinationDecisionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-            invoice_movement.getDestinationDecisionValue())
-
-    order_line.setSourceProjectValue(other_project)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_project,
-                 invoice_movement.getSourceProjectValue())
-
-    order_line.setDestinationProjectValue(other_project)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_project,
-            invoice_movement.getDestinationProjectValue())
-
-    order_line.setSourcePaymentValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-                 invoice_movement.getSourcePaymentValue())
-
-    order_line.setDestinationPaymentValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-            invoice_movement.getDestinationPaymentValue())
-
-    order_line.setSourceFunctionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-                 invoice_movement.getSourceFunctionValue())
-
-    order_line.setDestinationFunctionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_entity,
-            invoice_movement.getDestinationFunctionValue())
-
-    self.assertNotEquals(123, order_line.getPrice())
-    order_line.setPrice(123)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(123,
-            invoice_movement.getPrice())
-
-    self.assertNotEquals(456, order_line.getQuantity())
-    order_line.setQuantity(456)
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(456,
-            invoice_movement.getQuantity())
-
-    other_resource = self.portal.product_module.newContent(
-                                        portal_type='Product',
-                                        title='Other Resource')
-    order_line.setResourceValue(other_resource)
-    transaction.commit()
-    self.tic()
-    # after changing 'resource', related simulation movement will be
-    # replaced with another id, and we need to find the appropriate one
-    # here.
-    delivery_movement = related_applied_rule.contentValues()[0]
-    invoice_applied_rule = delivery_movement.contentValues()[0]
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(other_resource,
-            invoice_movement.getResourceValue())
-
-    order_line.setStartDate(DateTime(2001, 02, 03))
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(DateTime(2001, 02, 03),
-                 invoice_movement.getStartDate())
-
-    order_line.setStopDate(DateTime(2002, 03, 04))
-    transaction.commit()
-    self.tic()
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    self.assertEquals(DateTime(2002, 03, 04),
-                 invoice_movement.getStopDate())
-
-  def test_modify_planned_order_invoice_transaction_rule(self):
-    """
-    tests that modifying a planned order affects movements from invoice
-    transaction rule
-    """
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',
-                    product_line='apparel')
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='Currency',
-                                base_unit_quantity=0.01)
-    self.createInvoiceTransactionRule(currency)
-
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client',
-                            default_address_region=self.default_region)
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor',
-                            default_address_region=self.default_region)
-    order = self.portal.getDefaultModule(self.order_portal_type).newContent(
-                              portal_type=self.order_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008, 1, 1),
-                              price_currency_value=currency,
-                              title='Order')
-    order_line = order.newContent(portal_type=self.order_line_portal_type,
-                                  resource_value=resource,
-                                  quantity=1,
-                                  price=2)
-    other_entity = self.portal.organisation_module.newContent(
-                                      portal_type='Organisation',
-                                      title='Other Entity',
-                                      default_address_region=self.default_region)
-    other_project = self.portal.project_module.newContent(
-                                      portal_type='Project',
-                                      title='Other Project')
-    order.plan()
-    transaction.commit()
-    self.tic()
-    self.assertEquals('planned', order.getSimulationState())
-
-    related_applied_rule = order.getCausalityRelatedValue(
-                             portal_type='Applied Rule')
-    order_movement = related_applied_rule.contentValues()[0]
-    delivery_applied_rule = order_movement.contentValues()[0]
-    delivery_movement = delivery_applied_rule.contentValues()[0]
-    invoice_applied_rule = delivery_movement.contentValues()[0]
-    invoice_movement = invoice_applied_rule.contentValues()[0]
-    invoice_transaction_applied_rule = invoice_movement.contentValues()[0]
-
-    # utility function to return the simulation movement that should be used
-    # for "income" line
-    def getIncomeSimulationMovement(applied_rule):
-      for movement in applied_rule.contentValues():
-        if movement.getDestination() == 'account_module/purchase'\
-            and movement.getSource() == 'account_module/sale':
-          return movement
-      self.fail('Income movement not found')
-
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-
-    order_line.setSourceSectionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(other_entity,
-                      invoice_transaction_movement.getSourceSectionValue())
-
-    # make sure destination_section != source_section, this might be needed by
-    # some rules
-    order_line.setSourceSectionValue(order_line.getDestinationSectionValue())
-
-    order_line.setDestinationSectionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-                 invoice_transaction_movement.getDestinationSectionValue())
-
-    order_line.setSourceAdministrationValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-                 invoice_transaction_movement.getSourceAdministrationValue())
-
-    order_line.setDestinationAdministrationValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-            invoice_transaction_movement.getDestinationAdministrationValue())
-
-    order_line.setSourceDecisionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-                 invoice_transaction_movement.getSourceDecisionValue())
-
-    order_line.setDestinationDecisionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-            invoice_transaction_movement.getDestinationDecisionValue())
-
-    order_line.setSourceProjectValue(other_project)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_project,
-                 invoice_transaction_movement.getSourceProjectValue())
-
-    order_line.setDestinationProjectValue(other_project)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_project,
-            invoice_transaction_movement.getDestinationProjectValue())
-
-    order_line.setSourceFunctionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-                 invoice_transaction_movement.getSourceFunctionValue())
-
-    order_line.setDestinationFunctionValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-            invoice_transaction_movement.getDestinationFunctionValue())
-
-    order_line.setSourcePaymentValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-                 invoice_transaction_movement.getSourcePaymentValue())
-
-    order_line.setDestinationPaymentValue(other_entity)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(other_entity,
-            invoice_transaction_movement.getDestinationPaymentValue())
-
-    order_line.setQuantity(1)
-    order_line.setPrice(123)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(123,
-            invoice_transaction_movement.getQuantity())
-
-    order_line.setQuantity(456)
-    order_line.setPrice(1)
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(456,
-            invoice_transaction_movement.getQuantity())
-
-    order_line.setStartDate(DateTime(2001, 02, 03))
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(DateTime(2001, 02, 03),
-                 invoice_transaction_movement.getStartDate())
-
-    order_line.setStopDate(DateTime(2002, 03, 04))
-    transaction.commit()
-    self.tic()
-    self.assertEquals(3, len(invoice_transaction_applied_rule))
-    invoice_transaction_movement = getIncomeSimulationMovement(
-                                        invoice_transaction_applied_rule)
-    self.assertEquals(DateTime(2002, 03, 04),
-                 invoice_transaction_movement.getStopDate())
-
-
-  def test_Invoice_viewAsODT(self):
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',)
-    client = self.portal.organisation_module.newContent(
-                              portal_type='Organisation', title='Client')
-    vendor = self.portal.organisation_module.newContent(
-                              portal_type='Organisation', title='Vendor')
-    invoice = self.portal.getDefaultModule(self.invoice_portal_type).newContent(
-                              portal_type=self.invoice_portal_type,
-                              start_date=DateTime(2008, 12, 31),
-                              title='Invoice',
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client)
-    line = invoice.newContent(portal_type=self.invoice_line_portal_type,
-                            resource_value=resource,
-                            quantity=10,
-                            price=3)
-    invoice.confirm()
-    transaction.commit()
-    self.tic()
-
-    odt = invoice.Invoice_viewAsODT()
-    from Products.ERP5OOo.tests.utils import Validator
-    odf_validator = Validator()
-    err_list = odf_validator.validate(odt)
-    if err_list:
-      self.fail(''.join(err_list))
-
-  def test_Invoice_viewAsODT_empty_image(self):
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',)
-    client = self.portal.organisation_module.newContent(
-                              portal_type='Organisation', title='Client')
-    client_logo = client.newContent(portal_type='Image',
-                                    id='default_image')
-    vendor = self.portal.organisation_module.newContent(
-                              portal_type='Organisation', title='Vendor')
-    vendor_logo = vendor.newContent(portal_type='Image',
-                                    id='default_image')
-    self.assertEquals(0, vendor_logo.getSize())
-    self.assertEquals(0, vendor.getDefaultImageWidth())
-    self.assertEquals(0, vendor.getDefaultImageHeight())
-    invoice = self.portal.getDefaultModule(self.invoice_portal_type).newContent(
-                              portal_type=self.invoice_portal_type,
-                              start_date=DateTime(2008, 12, 31),
-                              title='Invoice',
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client)
-    line = invoice.newContent(portal_type=self.invoice_line_portal_type,
-                            resource_value=resource,
-                            quantity=10,
-                            price=3)
-    invoice.confirm()
-    transaction.commit()
-    self.tic()
-
-    odt = invoice.Invoice_viewAsODT()
-    from Products.ERP5OOo.tests.utils import Validator
-    odf_validator = Validator()
-    err_list = odf_validator.validate(odt)
-    if err_list:
-      self.fail(''.join(err_list))
-
-    # the <draw:image> should not be present, because there's no logo
-    parser = OOoParser()
-    parser.openFromString(odt)
-    style_xml = parser.oo_files['styles.xml']
-    self.assert_('<draw:image' not in style_xml)
-
-  def test_Invoice_viewAsODT_invalid_image(self):
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',)
-    file_data = FileUpload(__file__, 'rb')
-    client = self.portal.organisation_module.newContent(
-                              portal_type='Organisation', title='Client')
-    client_logo = client.newContent(portal_type='Image',
-                                    id='default_image',
-                                    file=file_data)
-    vendor = self.portal.organisation_module.newContent(
-                              portal_type='Organisation', title='Vendor')
-    vendor_logo = vendor.newContent(portal_type='Image',
-                                    id='default_image',
-                                    file=file_data)
-
-    # width and height of an invalid image are -1 according to
-    # OFS.Image.getImageInfo maybe this is not what we want here ?
-    self.assertEquals(-1, vendor.getDefaultImageWidth())
-    self.assertEquals(-1, vendor.getDefaultImageHeight())
-
-    invoice = self.portal.getDefaultModule(self.invoice_portal_type).newContent(
-                              portal_type=self.invoice_portal_type,
-                              start_date=DateTime(2008, 12, 31),
-                              title='Invoice',
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client)
-    line = invoice.newContent(portal_type=self.invoice_line_portal_type,
-                            resource_value=resource,
-                            quantity=10,
-                            price=3)
-    invoice.confirm()
-    transaction.commit()
-    self.tic()
-
-    odt = invoice.Invoice_viewAsODT()
-    from Products.ERP5OOo.tests.utils import Validator
-    odf_validator = Validator()
-    err_list = odf_validator.validate(odt)
-    if err_list:
-      self.fail(''.join(err_list))
-
-  def test_invoice_building_with_cells(self):
-    # if the order has cells, the invoice built from that order must have
-    # cells too
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',
-                    variation_base_category_list=['size'])
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='Currency')
-
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client')
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor')
-    order = self.portal.getDefaultModule(self.order_portal_type).newContent(
-                              portal_type=self.order_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008, 1, 1),
-                              price_currency_value=currency,
-                              title='Order')
-
-    order_line = order.newContent(portal_type=self.order_line_portal_type,
-                                  resource_value=resource,)
-    order_line.setVariationBaseCategoryList(('size', ))
-    order_line.setVariationCategoryList(['size/Baby', 'size/Child/32'])
-    order_line.updateCellRange()
-
-    cell_baby = order_line.newCell('size/Baby', base_id='movement',
-                             portal_type=self.order_cell_portal_type)
-    cell_baby.edit(quantity=10,
-                   price=4,
-                   variation_category_list=['size/Baby'],
-                   mapped_value_property_list=['quantity', 'price'],)
-
-    cell_child_32 = order_line.newCell('size/Child/32', base_id='movement',
-                                 portal_type=self.order_cell_portal_type)
-    cell_child_32.edit(quantity=20,
-                       price=5,
-                       variation_category_list=['size/Child/32'],
-                       mapped_value_property_list=['quantity', 'price'],)
-    order.confirm()
-    transaction.commit()
-    self.tic()
-
-    related_packing_list = order.getCausalityRelatedValue(
-                                  portal_type=self.packing_list_portal_type)
-    self.assertNotEquals(related_packing_list, None)
-
-    related_packing_list.start()
-    related_packing_list.stop()
-    transaction.commit()
-    self.tic()
-
-    related_invoice = related_packing_list.getCausalityRelatedValue(
-                                  portal_type=self.invoice_portal_type)
-    self.assertNotEquals(related_invoice, None)
-
-    line_list = related_invoice.contentValues(
-                     portal_type=self.invoice_line_portal_type)
-    self.assertEquals(1, len(line_list))
-    invoice_line = line_list[0]
-
-    self.assertEquals(resource, invoice_line.getResourceValue())
-    self.assertEquals(['size'], invoice_line.getVariationBaseCategoryList())
-    self.assertEquals(2,
-          len(invoice_line.getCellValueList(base_id='movement')))
-
-    cell_baby = invoice_line.getCell('size/Baby', base_id='movement')
-    self.assertNotEquals(cell_baby, None)
-    self.assertEquals(resource, cell_baby.getResourceValue())
-    self.assertEquals(10, cell_baby.getQuantity())
-    self.assertEquals(4, cell_baby.getPrice())
-    self.assertTrue('size/Baby' in
-                    cell_baby.getVariationCategoryList())
-    self.assertTrue(cell_baby.isMemberOf('size/Baby'))
-
-    cell_child_32 = invoice_line.getCell('size/Child/32', base_id='movement')
-    self.assertNotEquals(cell_child_32, None)
-    self.assertEquals(resource, cell_child_32.getResourceValue())
-    self.assertEquals(20, cell_child_32.getQuantity())
-    self.assertEquals(5, cell_child_32.getPrice())
-    self.assertTrue('size/Child/32' in
-                    cell_child_32.getVariationCategoryList())
-    self.assertTrue(cell_child_32.isMemberOf('size/Child/32'))
-  
-  
-  
-  def test_invoice_created_from_packing_list_with_no_order(self):
-    # if the order has cells and an aggregate, the invoice built
-    #from that order must have
-    # cells too
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',
-                    variation_base_category_list=['size'])
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='Currency')
-
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client')
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor')
-    no_order_packing_list = \
-self.portal.getDefaultModule(self.packing_list_portal_type).newContent(
-                              portal_type=self.packing_list_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008, 1, 1),
-                              price_currency_value=currency,
-                              title='Order')
-
-    packing_list_line = no_order_packing_list.newContent(
-                        portal_type=self.packing_list_line_portal_type,
-                                  resource_value=resource,)
-    packing_list_line.setVariationBaseCategoryList(('size', ))
-    packing_list_line.setVariationCategoryList(['size/Baby', 'size/Child/32'])
-    packing_list_line.updateCellRange()
-
-    cell_baby = packing_list_line.newCell('size/Baby', base_id='movement',
-                             portal_type=self.packing_list_cell_portal_type)
-    cell_baby.edit(quantity=10,
-                   price=4,
-                   variation_category_list=['size/Baby'],
-                   mapped_value_property_list=['quantity', 'price'],)
-
-    cell_child_32 = packing_list_line.newCell(
-                                'size/Child/32',base_id='movement',
-                                 portal_type=self.packing_list_cell_portal_type)
-    cell_child_32.edit(quantity=20,
-                       price=5,
-                       variation_category_list=['size/Child/32'],
-                       mapped_value_property_list=['quantity', 'price'],)
-    no_order_packing_list.confirm()
-    transaction.commit()
-    self.tic()
-    self.assertNotEquals(no_order_packing_list, None)
-
-    no_order_packing_list.start()
-    no_order_packing_list.stop()
-    transaction.commit()
-    self.tic()
-
-    related_invoice = no_order_packing_list.getCausalityRelatedValue(
-                                  portal_type=self.invoice_portal_type)
-    self.assertNotEquals(related_invoice, None)
-
-    line_list = related_invoice.contentValues(
-                     portal_type=self.invoice_line_portal_type)
-    self.assertEquals(1, len(line_list))
-    invoice_line = line_list[0]
-
-    self.assertEquals(resource, invoice_line.getResourceValue())
-    self.assertEquals(['size'], invoice_line.getVariationBaseCategoryList())
-    self.assertEquals(2,
-          len(invoice_line.getCellValueList(base_id='movement')))
-
-    cell_baby = invoice_line.getCell('size/Baby', base_id='movement')
-    self.assertNotEquals(cell_baby, None)
-    self.assertEquals(resource, cell_baby.getResourceValue())
-    self.assertEquals(10, cell_baby.getQuantity())
-    self.assertEquals(4, cell_baby.getPrice())
-    self.assertTrue('size/Baby' in
-                    cell_baby.getVariationCategoryList())
-    self.assertTrue(cell_baby.isMemberOf('size/Baby'))
-
-    cell_child_32 = invoice_line.getCell('size/Child/32', base_id='movement')
-    self.assertNotEquals(cell_child_32, None)
-    self.assertEquals(resource, cell_child_32.getResourceValue())
-    self.assertEquals(20, cell_child_32.getQuantity())
-    self.assertEquals(5, cell_child_32.getPrice())
-    self.assertTrue('size/Child/32' in
-                    cell_child_32.getVariationCategoryList())
-    self.assertTrue(cell_child_32.isMemberOf('size/Child/32'))
-    
-  def test_invoice_building_with_cells_and_aggregate(self):
-    # if the order has cells and an aggregate, the invoice built
-    #from that order must have
-    # cells too
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',
-                    variation_base_category_list=['size'])
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='Currency')
-
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client')
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor')
-    order = self.portal.getDefaultModule(self.order_portal_type).newContent(
-                              portal_type=self.order_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008, 1, 1),
-                              price_currency_value=currency,
-                              title='Order')
-
-    order_line = order.newContent(portal_type=self.order_line_portal_type,
-                                  resource_value=resource,)
-    order_line.setVariationBaseCategoryList(('size', ))
-    order_line.setVariationCategoryList(['size/Baby', 'size/Child/32'])
-    order_line.updateCellRange()
-
-    cell_baby = order_line.newCell('size/Baby', base_id='movement',
-                             portal_type=self.order_cell_portal_type)
-    cell_baby.edit(quantity=10,
-                   price=4,
-                   variation_category_list=['size/Baby'],
-                   mapped_value_property_list=['quantity', 'price'],)
-
-    cell_child_32 = order_line.newCell('size/Child/32', base_id='movement',
-                                 portal_type=self.order_cell_portal_type)
-    cell_child_32.edit(quantity=20,
-                       price=5,
-                       variation_category_list=['size/Child/32'],
-                       mapped_value_property_list=['quantity', 'price'],)
-    order.confirm()
-    transaction.commit()
-    self.tic()
-
-    related_packing_list = order.getCausalityRelatedValue(
-                                  portal_type=self.packing_list_portal_type)
-    self.assertNotEquals(related_packing_list, None)
-
-    related_packing_list.start()
-    related_packing_list.stop()
-    transaction.commit()
-    self.tic()
-
-    related_invoice = related_packing_list.getCausalityRelatedValue(
-                                  portal_type=self.invoice_portal_type)
-    self.assertNotEquals(related_invoice, None)
-
-    line_list = related_invoice.contentValues(
-                     portal_type=self.invoice_line_portal_type)
-    self.assertEquals(1, len(line_list))
-    invoice_line = line_list[0]
-
-    self.assertEquals(resource, invoice_line.getResourceValue())
-    self.assertEquals(['size'], invoice_line.getVariationBaseCategoryList())
-    self.assertEquals(2,
-          len(invoice_line.getCellValueList(base_id='movement')))
-
-    cell_baby = invoice_line.getCell('size/Baby', base_id='movement')
-    self.assertNotEquals(cell_baby, None)
-    self.assertEquals(resource, cell_baby.getResourceValue())
-    self.assertEquals(10, cell_baby.getQuantity())
-    self.assertEquals(4, cell_baby.getPrice())
-    self.assertTrue('size/Baby' in
-                    cell_baby.getVariationCategoryList())
-    self.assertTrue(cell_baby.isMemberOf('size/Baby'))
-
-    cell_child_32 = invoice_line.getCell('size/Child/32', base_id='movement')
-    self.assertNotEquals(cell_child_32, None)
-    self.assertEquals(resource, cell_child_32.getResourceValue())
-    self.assertEquals(20, cell_child_32.getQuantity())
-    self.assertEquals(5, cell_child_32.getPrice())
-    self.assertTrue('size/Child/32' in
-                    cell_child_32.getVariationCategoryList())
-    self.assertTrue(cell_child_32.isMemberOf('size/Child/32'))
-    
-   
-  def test_description_copied_on_lines(self):
-    # if the order lines have different descriptions, description must be
-    # copied in the simulation and on created movements
-    resource = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource',)
-    resource2 = self.portal.getDefaultModule(
-        self.resource_portal_type).newContent(
-                    portal_type=self.resource_portal_type,
-                    title='Resource2',)
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='Currency')
-
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client')
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor')
-    order = self.portal.getDefaultModule(self.order_portal_type).newContent(
-                              portal_type=self.order_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008, 1, 1),
-                              price_currency_value=currency,
-                              title='Order')
-
-    order.newContent(portal_type=self.order_line_portal_type,
-                                  quantity=3,
-                                  price=10,
-                                  description='The first line',
-                                  resource_value=resource,)
-    order.newContent(portal_type=self.order_line_portal_type,
-                                  quantity=5,
-                                  price=10,
-                                  description='The second line',
-                                  resource_value=resource2,)
-
-    order.confirm()
-    transaction.commit()
-    self.tic()
-
-    related_packing_list = order.getCausalityRelatedValue(
-                                  portal_type=self.packing_list_portal_type)
-    self.assertNotEquals(related_packing_list, None)
-    
-    movement_list = related_packing_list.getMovementList()
-    self.assertEquals(2, len(movement_list))
-    self.assertEquals(['The first line'],
-        [m.getDescription() for m in movement_list if m.getQuantity() == 3])
-    self.assertEquals(['The second line'],
-        [m.getDescription() for m in movement_list if m.getQuantity() == 5])
-
-    related_packing_list.start()
-    related_packing_list.stop()
-    transaction.commit()
-    self.tic()
-
-    related_invoice = related_packing_list.getCausalityRelatedValue(
-                                  portal_type=self.invoice_portal_type)
-    self.assertNotEquals(related_invoice, None)
-
-    movement_list = related_invoice.getMovementList(
-                              portal_type=self.invoice_line_portal_type)
-    self.assertEquals(2, len(movement_list))
-    self.assertEquals(['The first line'],
-        [m.getDescription() for m in movement_list if m.getQuantity() == 3])
-    self.assertEquals(['The second line'],
-        [m.getDescription() for m in movement_list if m.getQuantity() == 5])
-
-
-  def test_CopyAndPaste(self):
-    """Test copy on paste on Invoice.
-    When an invoice is copy/pasted, references should be resetted.
-    """
-    accounting_module = self.portal.accounting_module
-    invoice = accounting_module.newContent(
-                    portal_type=self.invoice_portal_type)
-    invoice.edit(reference='reference',
-                 source_reference='source_reference',
-                 destination_reference='destination_reference',)
-    cb_data = accounting_module.manage_copyObjects([invoice.getId()])
-    copied, = accounting_module.manage_pasteObjects(cb_data)
-    new_invoice = accounting_module[copied['new_id']]
-    self.assertNotEquals(invoice.getReference(),
-                         new_invoice.getReference())
-    self.assertNotEquals(invoice.getSourceReference(),
-                         new_invoice.getSourceReference())
-    self.assertNotEquals(invoice.getDestinationReference(),
-                         new_invoice.getDestinationReference())
-
-  def test_delivery_mode_and_incoterm_on_invoice(self):
-    """
-    test that categories delivery_mode and incoterm are copied on 
-    the invoice by the delivery builder
-    """ 
-    resource = self.portal.product_module.newContent(
-                    portal_type='Product',
-                    title='Resource',
-                    product_line='apparel')
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='euro')
-    currency.setBaseUnitQuantity(0.01)
-    self.createInvoiceTransactionRule(currency)
-    transaction.commit()
-    self.tic()#execute transaction
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client',
-                            default_address_region=self.default_region)
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor',
-                            default_address_region=self.default_region)
-    order = self.portal.getDefaultModule(self.order_portal_type).newContent(
-                              portal_type=self.order_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008,10, 21),
-                              price_currency_value=currency,
-                              delivery_mode=self.mail_delivery_mode,
-                              incoterm=self.cpt_incoterm,
-                              title='Order')
-    order_line = order.newContent(portal_type=self.order_line_portal_type,
-                                  resource_value=resource,
-                                  quantity=5,
-                                  price=2)
-    order.confirm()
-    transaction.commit()
-    self.tic()
-    related_packing_list = order.getCausalityRelatedValue(
-                                portal_type=self.packing_list_portal_type)
-    self.assertNotEquals(related_packing_list, None)
-    self.assertEquals(related_packing_list.getDeliveryMode(),
-                         order.getDeliveryMode())
-    self.assertEquals(related_packing_list.getIncoterm(),
-                         order.getIncoterm())
-    related_packing_list.start()
-    related_packing_list.stop()
-    transaction.commit()
-    self.tic()
-    related_invoice = related_packing_list.getCausalityRelatedValue(
-                                  portal_type=self.invoice_portal_type)
-    self.assertNotEquals(related_invoice, None)
-    self.assertEquals(related_invoice.getDeliveryMode(),
-                         order.getDeliveryMode())
-    self.assertEquals(related_invoice.getIncoterm(),
-                         order.getIncoterm())
-                         
-                         
-  def test_01_quantity_unit_copied(self):
-    """
-    tests that when a resource uses different quantity unit that the
-    quantity units are copied on the packing list line and then the invoice
-    line using the delivery builers
-    """           
-    resource = self.portal.product_module.newContent(
-                    portal_type='Product',
-                    title='Resource',
-                    product_line='apparel')
-    resource.setQuantityUnitList([self.unit_piece_quantity_unit,
-                                 self.mass_quantity_unit])
-    currency = self.portal.currency_module.newContent(
-                                portal_type='Currency',
-                                title='euro')
-    currency.setBaseUnitQuantity(0.01)
-    transaction.commit()
-    self.tic()#execute transaction
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client',
-                            default_address_region=self.default_region)
-    vendor = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Vendor',
-                            default_address_region=self.default_region)
-    order = self.portal.getDefaultModule(self.order_portal_type).newContent(
-                              portal_type=self.order_portal_type,
-                              source_value=vendor,
-                              source_section_value=vendor,
-                              destination_value=client,
-                              destination_section_value=client,
-                              start_date=DateTime(2008,10, 21),
-                              price_currency_value=currency,
-                              delivery_mode=self.mail_delivery_mode,
-                              incoterm=self.cpt_incoterm,
-                              title='Order')
-    first_order_line = order.newContent(
-                          portal_type=self.order_line_portal_type,
-                                  resource_value=resource,
-                             quantity_unit = self.unit_piece_quantity_unit,
-                                  quantity=5,
-                                  price=3)
-    second_order_line = order.newContent( 
-                          portal_type=self.order_line_portal_type,
-                                  resource_value=resource,
-                             quantity_unit=self.mass_quantity_unit,
-                                  quantity=1.5,
-                                  price=2)
-    self.assertEquals(first_order_line.getQuantityUnit(),
-                      self.unit_piece_quantity_unit)
-    self.assertEquals(second_order_line.getQuantityUnit(),
-                      self.mass_quantity_unit)
-
-    order.confirm()
-    transaction.commit()
-    self.tic()
-    related_packing_list = order.getCausalityRelatedValue(
-                                portal_type=self.packing_list_portal_type)
-    self.assertNotEquals(related_packing_list, None)
-    movement_list = related_packing_list.getMovementList()
-    self.assertEquals(len(movement_list),2)
-    movement_list = sorted(movement_list, key=lambda x: x.getQuantity())
-    self.assertEquals(movement_list[0].getQuantityUnit(),
-                      self.mass_quantity_unit)
-    self.assertEquals(movement_list[0].getQuantity(), 1.5)
-    self.assertEquals(movement_list[1].getQuantityUnit(),
-                      self.unit_piece_quantity_unit)
-    self.assertEquals(movement_list[1].getQuantity(), 5)
-
-    related_packing_list.start()
-    related_packing_list.stop()
-    related_packing_list.deliver()
-    transaction.commit()
-    self.tic()
-    related_invoice = related_packing_list.getCausalityRelatedValue(
-                                portal_type=self.invoice_portal_type)
-    self.assertNotEquals(related_invoice, None)
-    movement_list = related_invoice.getMovementList()
-    self.assertEquals(len(movement_list),2)
-    movement_list = sorted(movement_list, key=lambda x: x.getQuantity())
-    self.assertEquals(movement_list[0].getQuantityUnit(),
-                      self.mass_quantity_unit)
-    self.assertEquals(movement_list[0].getQuantity(), 1.5)
-    self.assertEquals(movement_list[1].getQuantityUnit(),
-                      self.unit_piece_quantity_unit)
-    self.assertEquals(movement_list[1].getQuantity(), 5)
-
- 
-
-  def _acceptDivergenceOnInvoice(self, invoice, divergence_list):
-    builder_list = invoice.getBuilderList()
-    self.assertEquals(2, len(builder_list))
-    for builder in builder_list:
-      builder.solveDivergence(invoice.getRelativeUrl(),
-                              divergence_to_accept_list=divergence_list)
-
-  def test_accept_quantity_divergence_on_invoice_with_stopped_packing_list(
-                self, quiet=quiet):
-    sequence_list = SequenceList()
-    sequence = sequence_list.addSequenceString(self.PACKING_LIST_DEFAULT_SEQUENCE)
-    sequence_list.play(self, quiet=quiet)
-
-    packing_list = sequence.get('packing_list')
-    packing_list_line = packing_list.getMovementList()[0]
-    previous_quantity = packing_list_line.getQuantity()
-    
-    packing_list.setReady()
-    packing_list.start()
-    packing_list.stop()
-    self.assertEquals('stopped', packing_list.getSimulationState())
-    transaction.commit()
-    self.tic()
-
-    invoice = packing_list.getCausalityRelatedValue(
-                                  portal_type=self.invoice_portal_type)
-    self.assertNotEquals(invoice, None)
-    invoice_line_list = invoice.getMovementList()
-    self.assertEquals(1, len(invoice_line_list))
-    invoice_line = invoice_line_list[0]
-
-    new_quantity = invoice_line.getQuantity() * 2
-    invoice_line.setQuantity(new_quantity)
-    
-    transaction.commit()
-    self.tic()
-
-    self.assertTrue(invoice.isDivergent())
-    divergence_list = invoice.getDivergenceList()
-    self.assertEquals(1, len(divergence_list))
-
-    divergence = divergence_list[0]
-    self.assertEquals('quantity', divergence.tested_property)
-
-    # accept decision
-    self._acceptDivergenceOnInvoice(invoice, divergence_list)
-
-    transaction.commit()
-    self.tic()
-    self.assertEquals('solved', invoice.getCausalityState())
-
-    self.assertEquals([], invoice.getDivergenceList())
-    self.assertEquals(new_quantity, invoice_line.getQuantity())
-    self.assertEquals(new_quantity,
-          invoice_line.getDeliveryRelatedValue(portal_type='Simulation Movement'
-              ).getQuantity())
-
-    self.assertEquals([], packing_list.getDivergenceList())
-    self.assertEquals('solved', packing_list.getCausalityState())
- 
-  def _adoptDivergenceOnInvoice(self, invoice, divergence_list):
-    builder_list = invoice.getBuilderList()
-    self.assertEquals(2, len(builder_list))
-    for builder in builder_list:
-      builder.solveDivergence(invoice.getRelativeUrl(),
-                              divergence_to_adopt_list=divergence_list)
-
-  def test_adopt_quantity_divergence_on_invoice_line_with_stopped_packing_list(
-                self, quiet=quiet):
-    # #1053
-    sequence_list = SequenceList()
-    sequence = sequence_list.addSequenceString(self.PACKING_LIST_DEFAULT_SEQUENCE)
-    sequence_list.play(self, quiet=quiet)
-
-    packing_list = sequence.get('packing_list')
-    packing_list_line = packing_list.getMovementList()[0]
-    previous_quantity = packing_list_line.getQuantity()
-    previous_resource = packing_list_line.getResource()
-    previous_price = packing_list_line.getPrice()
-    
-    packing_list.setReady()
-    packing_list.start()
-    packing_list.stop()
-    self.assertEquals('stopped', packing_list.getSimulationState())
-    transaction.commit()
-    self.tic()
-
-    invoice = packing_list.getCausalityRelatedValue(
-                                  portal_type=self.invoice_portal_type)
-    self.assertNotEquals(invoice, None)
-    invoice_line_list = invoice.getMovementList()
-    self.assertEquals(1, len(invoice_line_list))
-    invoice_line = invoice_line_list[0]
-
-    new_quantity = invoice_line.getQuantity() * 2
-    invoice_line.setQuantity(new_quantity)
-    
-    transaction.commit()
-    self.tic()
-
-    self.assertTrue(invoice.isDivergent())
-    divergence_list = invoice.getDivergenceList()
-    self.assertEquals(1, len(divergence_list))
-
-    divergence = divergence_list[0]
-    self.assertEquals('quantity', divergence.tested_property)
-
-    # adopt prevision
-    self._adoptDivergenceOnInvoice(invoice, divergence_list)
-
-    transaction.commit()
-    self.tic()
-    self.assertEquals([], invoice.getDivergenceList())
-    self.assertEquals('solved', invoice.getCausalityState())
-
-    self.assertEquals(1,
-        len(invoice.getMovementList(portal_type=self.invoice_line_portal_type)))
-    self.assertEquals(0,
-        len(invoice.getMovementList(portal_type=self.invoice_transaction_line_portal_type)))
-
-    self.assertEquals(previous_resource, invoice_line.getResource())
-    self.assertEquals(previous_quantity, invoice_line.getQuantity())
-    self.assertEquals(previous_price, invoice_line.getPrice())
-    self.assertEquals(previous_quantity,
-          invoice_line.getDeliveryRelatedValue(portal_type='Simulation Movement'
-              ).getQuantity())
-
-    self.assertEquals([], packing_list.getDivergenceList())
-    self.assertEquals('solved', packing_list.getCausalityState())
- 
-
-
-class TestSaleInvoiceMixin(TestInvoiceMixin,
-                           ERP5TypeTestCase):
-  """Test sale invoice are created from orders then packing lists.
-
-    Those tests methods only work for sale, because sale and purchase invoice
-    are not built at the same time on packing list workflow.
-  """
-  quiet = 0
-  invoice_portal_type = 'Sale Invoice Transaction'
-  invoice_line_portal_type = 'Invoice Line'
-  invoice_cell_portal_type = 'Invoice Cell'
-  invoice_transaction_line_portal_type = 'Sale Invoice Transaction Line'
-  payment_portal_type = 'Payment Transaction'
-
-  # default sequence for one line of not varianted resource.
-  PACKING_LIST_DEFAULT_SEQUENCE = """
-      stepCreateEntities
-      stepCreateCurrency
-      stepCreateSaleInvoiceTransactionRule
-      stepCreateOrder
-      stepSetOrderProfile
-      stepSetOrderPriceCurrency
-      stepCreateNotVariatedResource
-      stepTic
-      stepCreateOrderLine
-      stepSetOrderLineResource
-      stepSetOrderLineDefaultValues
-      stepOrderOrder
-      stepTic
-      stepCheckDeliveryBuilding
-      stepConfirmOrder
-      stepTic
-      stepCheckOrderRule
-      stepCheckOrderSimulation
-      stepCheckDeliveryBuilding
-      stepAddPackingListContainer
-      stepAddPackingListContainerLine
-      stepSetContainerLineFullQuantity
-      stepTic
-      stepCheckPackingListIsPacked
-    """
-
-  # default sequence for two lines of not varianted resource.
-  PACKING_LIST_TWO_LINES_DEFAULT_SEQUENCE = """
-      stepCreateEntities
-      stepCreateCurrency
-      stepCreateSaleInvoiceTransactionRule
-      stepCreateOrder
-      stepSetOrderProfile
-      stepSetOrderPriceCurrency
-      stepCreateNotVariatedResource
-      stepTic
-      stepCreateOrderLine
-      stepSetOrderLineResource
-      stepSetOrderLineDefaultValues
-      stepCreateNotVariatedResource
-      stepTic
-      stepCreateOrderLine
-      stepSetOrderLineResource
-      stepSetOrderLineDefaultValues
-      stepOrderOrder
-      stepTic
-      stepCheckDeliveryBuilding
-      stepConfirmOrder
-      stepTic
-      stepCheckOrderRule
-      stepCheckOrderSimulation
-      stepCheckDeliveryBuilding
-      stepAddPackingListContainer
-      stepAddPackingListContainerLine
-      stepTic
-      stepSetContainerFullQuantity
-      stepTic
-      stepCheckPackingListIsPacked
-    """
-
-  # default sequence for one line of not varianted resource.
-  TWO_PACKING_LIST_DEFAULT_SEQUENCE = """
-      stepCreateEntities
-      stepCreateCurrency
-      stepCreateSaleInvoiceTransactionRule
-      stepCreateOrder
-      stepSetOrderProfile
-      stepSetOrderPriceCurrency
-      stepCreateNotVariatedResource
-      stepTic
-      stepCreateOrderLine
-      stepSetOrderLineResource
-      stepSetOrderLineDefaultValues
-      stepOrderOrder
-      stepTic
-      stepCheckDeliveryBuilding
-      stepConfirmOrder
-      stepTic
-      stepCheckOrderRule
-      stepCheckOrderSimulation
-      stepCheckDeliveryBuilding
-      stepDecreasePackingListLineQuantity
-      stepCheckPackingListIsCalculating
-      stepTic
-      stepCheckPackingListIsDiverged
-      stepSplitAndDeferPackingList
-      stepTic
-      stepCheckPackingListIsSolved
-      stepCheckPackingListSplitted
-      stepAddPackingListContainer
-      stepAddPackingListContainerLine
-      stepSetContainerLineFullQuantity
-      stepTic
-      stepCheckPackingListIsPacked
-      stepDefineNewPackingListContainer
-      stepTic
-      stepCheckNewPackingListIsPacked
-    """
-
-class TestSaleInvoice(TestSaleInvoiceMixin, TestInvoice, ERP5TypeTestCase):
-  """Tests for sale invoice.
-  """
-  quiet = 0
-
-  # fix inheritance
-  login = TestInvoiceMixin.login
-
-  @UnrestrictedMethod
-  def createCategories(self):
-    TestPackingListMixin.createCategories(self)
-    TestInvoiceMixin.createCategories(self)
-
-  getNeededCategoryList = TestInvoiceMixin.getNeededCategoryList
-
-  def test_01_SimpleInvoice(self, quiet=quiet):
-    """
-    Checks that a Simple Invoice is created from a Packing List
-    """
-    if not quiet:
-      self.logMessage('Simple Invoice')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-        base_sequence +
-      """
-        stepSetReadyPackingList
-        stepTic
-        stepStartPackingList
-        stepCheckInvoicingRule
-        stepTic
-        stepCheckInvoiceBuilding
-        stepRebuildAndCheckNothingIsCreated
-        stepCheckInvoicesConsistency
-        stepCheckInvoiceLineHasReferenceAndIntIndex
-      """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_02_TwoInvoicesFromTwoPackingList(self, quiet=quiet):
-    """
-    This test was created for the following bug:
-        - an order is created and confirmed
-        - the packing list is split
-        - the 2 packing list are delivered (at different date)
-        - 2 invoices are built, then we set the same date on both of them
-        - the accounting rules are generated and put in only one invoice !!,
-          so we have an invoice with twice the number of accounting rules
-          and an invoice with no accounting rules. both invoices are wrong
-    """
-    if not quiet: self.logMessage('Two Invoices from Two Packing List')
-    sequence_list = SequenceList()
-    for base_sequence in (self.TWO_PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-        base_sequence +
-      """
-        stepSetReadyPackingList
-        stepSetReadyNewPackingList
-        stepTic
-        stepStartPackingList
-        stepStartNewPackingList
-        stepTic
-        stepCheckTwoInvoices
-        stepRemoveDateMovementGroupForTransactionBuilder
-        stepStartTwoInvoices
-        stepTic
-        stepCheckTwoInvoicesTransactionLines
-        stepCheckInvoicesConsistency
-      """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_03_InvoiceEditAndInvoiceRule(self, quiet=quiet):
-    """
-    Invoice Rule should not be applied on invoice lines created from\
-    Packing List.
-
-    We want to prevent this from happening:
-      - Create a packing list
-      - An invoice is created from packing list
-      - Invoice is edited, updateAppliedRule is called
-      - A new Invoice Rule is created for this invoice, and accounting
-        movements for this invoice are present twice in the simulation.
-    """
-    if not quiet:
-      self.logMessage('Invoice Edit')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-        base_sequence +
-      """
-        stepSetReadyPackingList
-        stepTic
-        stepStartPackingList
-        stepCheckInvoicingRule
-        stepTic
-        stepCheckInvoiceBuilding
-        stepEditInvoice
-        stepCheckInvoiceRuleNotAppliedOnInvoiceEdit
-        stepCheckInvoicesConsistency
-      """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_04_PackingListEditAndInvoiceRule(self, quiet=quiet):
-    """
-    Delivery Rule should not be applied on packing list lines created\
-    from Order.
-    """
-    if not quiet:
-      self.logMessage('Packing List Edit')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-        base_sequence +
-      """
-        stepEditPackingList
-        stepCheckDeliveryRuleNotAppliedOnPackingListEdit
-        stepCheckInvoicesConsistency
-      """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_05_InvoiceEditPackingListLine(self, quiet=quiet):
-    """
-    Checks that editing a Packing List Line still creates a correct
-    Invoice
-    """
-    if not quiet:
-      self.logMessage('Packing List Line Edit')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-        base_sequence +
-    """
-      stepEditPackingListLine
-      stepSetReadyPackingList
-      stepTic
-      stepStartPackingList
-      stepCheckInvoicingRule
-      stepTic
-      stepCheckInvoiceBuilding
-      stepRebuildAndCheckNothingIsCreated
-      stepCheckInvoicesConsistency
-    """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_06_InvoiceDeletePackingListLine(self, quiet=quiet):
-    """
-    Checks that deleting a Packing List Line still creates a correct
-    Invoice
-    """
-    if not quiet:
-      self.logMessage('Packing List Line Delete')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_TWO_LINES_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-        base_sequence +
-    """
-      stepDeletePackingListLine
-      stepSetReadyPackingList
-      stepTic
-      stepStartPackingList
-      stepCheckInvoicingRule
-      stepTic
-      stepCheckInvoiceBuilding
-      stepRebuildAndCheckNothingIsCreated
-      stepCheckInvoicesConsistency
-    """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_07_InvoiceAddPackingListLine(self, quiet=quiet):
-    """
-    Checks that adding a Packing List Line still creates a correct
-    Invoice
-    """
-    if not quiet:
-      self.logMessage('Packing List Line Add')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE,
-        self.PACKING_LIST_TWO_LINES_DEFAULT_SEQUENCE) :
-      sequence_list.addSequenceString(
-        base_sequence +
-    """
-      stepAddPackingListLine
-      stepSetContainerFullQuantity
-      stepTic
-      stepSetReadyPackingList
-      stepTic
-      stepStartPackingList
-      stepCheckInvoicingRule
-      stepTic
-      stepCheckInvoiceBuilding
-      stepRebuildAndCheckNothingIsCreated
-      stepCheckInvoicesConsistency
-    """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_08_InvoiceDecreaseQuantity(self, quiet=quiet):
-    """
-    Change the quantity of a Invoice Line,
-    check that the invoice is divergent,
-    then split and defer, and check everything is solved
-    """
-    if not quiet:
-      self.logMessage('Invoice Decrease Quantity')
-    sequence = self.PACKING_LIST_DEFAULT_SEQUENCE + \
-    """
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-
-    stepDecreaseInvoiceLineQuantity
-    stepCheckInvoiceIsDivergent
-    stepCheckInvoiceIsCalculating
-    stepTic
-    stepCheckInvoiceIsDiverged
-    stepSplitAndDeferInvoice
-    stepTic
-
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-    stepCheckInvoiceSplitted
-
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-    """
-    self.playSequence(sequence, quiet=quiet)
-
-  def test_09_InvoiceChangeStartDateFail(self, quiet=quiet):
-    """
-    Change the start_date of a Invoice Line,
-    check that the invoice is divergent,
-    then accept decision, and check Packing list is divergent
-    """
-    if not quiet:
-      self.logMessage('Invoice Change Sart Date')
-    sequence = self.PACKING_LIST_DEFAULT_SEQUENCE + \
-    """
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-
-    stepChangeInvoiceStartDate
-    stepCheckInvoiceIsDivergent
-    stepCheckInvoiceIsCalculating
-    stepTic
-    stepCheckInvoiceIsDiverged
-    stepUnifyStartDateWithDecisionInvoice
-    stepTic
-
-    stepCheckInvoiceNotSplitted
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-
-    stepCheckPackingListIsDivergent
-    """
-    self.playSequence(sequence, quiet=quiet)
-
-  def test_09b_InvoiceChangeStartDateSucceed(self, quiet=quiet):
-    """
-    Change the start_date of a Invoice Line,
-    check that the invoice is divergent,
-    deliver the Packing List to make sure it's frozen,
-    then accept decision, and check everything is solved
-    """
-    if not quiet:
-      self.logMessage('Invoice Change Sart Date')
-    sequence = self.PACKING_LIST_DEFAULT_SEQUENCE + \
-    """
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-    stepStopPackingList
-    stepTic
-    stepDeliverPackingList
-    stepTic
-
-    stepChangeInvoiceStartDate
-    stepCheckInvoiceIsDivergent
-    stepCheckInvoiceIsCalculating
-    stepTic
-    stepCheckInvoiceIsDiverged
-    stepUnifyStartDateWithDecisionInvoice
-    stepTic
-
-    stepCheckInvoiceNotSplitted
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-    """
-    self.playSequence(sequence, quiet=quiet)
-
-  def test_10_AcceptDecisionOnPackingList(self, quiet=quiet):
-    """
-    - Increase or Decrease the quantity of a Packing List line
-    - Accept Decision on Packing List
-    - Packing List must not be divergent and use new quantity
-    - Invoice must not be divergent and use new quantity
-    """
-    if not quiet:
-      self.logMessage('InvoiceAcceptDecisionOnPackingList')
-    end_sequence = \
-    """
-    stepSetContainerFullQuantity
-    stepCheckPackingListIsCalculating
-    stepTic
-    stepCheckPackingListIsDiverged
-    stepAcceptDecisionQuantity
-    stepTic
-    stepCheckPackingListIsSolved
-    stepCheckPackingListNotSplitted
-
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-
-    stepStopPackingList
-    stepTic
-    stepDeliverPackingList
-    stepTic
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-
-    stepStartInvoice
-    stepTic
-    stepStopInvoice
-    stepTic
-    stepDeliverInvoice
-    stepTic
-    stepCheckInvoiceNotSplitted
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-    """
-
-    mid_sequence_list = ["""
-    stepCheckInvoicingRule
-    stepDecreasePackingListLineQuantity
-    """, """
-    stepCheckInvoicingRule
-    stepIncreasePackingListLineQuantity
-    """]
-
-    sequence_list = SequenceList()
-    for seq in mid_sequence_list:
-      sequence = self.PACKING_LIST_DEFAULT_SEQUENCE + \
-          seq + end_sequence
-      sequence_list.addSequenceString(sequence)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_16a_ManuallyAddedMovementsManyTransactions(self, quiet=quiet):
-    """
-    Checks that adding invoice lines and accounting lines to one invoice
-    generates correct simulation
-
-    In this case checks what is happening, where movements are added in
-    one transaction and edited in another
-    """
-    if not quiet:
-      self.logMessage('Invoice with Manually Added Movements in separate transactions')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-          base_sequence +
-          """
-          stepSetReadyPackingList
-          stepTic
-          stepStartPackingList
-          stepCheckInvoicingRule
-          stepTic
-          stepCheckInvoiceBuilding
-          stepRebuildAndCheckNothingIsCreated
-          stepCheckInvoicesConsistency
-          stepAddInvoiceLinesManyTransactions
-          stepTic
-          stepCheckInvoiceIsSolved
-          stepStartInvoice
-          stepTic
-          stepCheckSimulationTrees
-          """)
-    sequence_list.play(self, quiet=quiet)
-
-
-  def test_11_AcceptDecisionOnPackingListAndInvoice(self, quiet=quiet):
-    """
-    - Increase or Decrease the quantity of a Packing List line
-    - Accept Decision on Packing List
-    - Packing List must not be divergent and use new quantity
-    - Put old quantity on Invoice
-    - Accept Decision on Invoice
-    - Packing List must not be divergent and use new quantity
-    - Invoice must not be divergent and use old quantity
-    """
-    if not quiet:
-      self.logMessage('InvoiceAcceptDecisionOnPackingListAndInvoice')
-    mid_sequence = \
-    """
-    stepSetContainerFullQuantity
-    stepCheckPackingListIsCalculating
-    stepTic
-    stepCheckPackingListIsDiverged
-    stepAcceptDecisionQuantity
-    stepTic
-    stepCheckPackingListIsSolved
-    stepCheckPackingListNotSplitted
-
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-
-    stepStopPackingList
-    stepTic
-    stepDeliverPackingList
-    stepTic
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-    """
-    end_sequence = \
-    """
-    stepCheckInvoiceIsDiverged
-    stepAcceptDecisionQuantityInvoice
-    stepTic
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-    stepStartInvoice
-    stepTic
-    stepStopInvoice
-    stepTic
-    stepDeliverInvoice
-    stepTic
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-    stepCheckInvoiceNotSplitted
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-    """
-
-    mid_sequence_list = [("""
-    stepCheckInvoicingRule
-    stepDecreasePackingListLineQuantity
-    """, """
-    stepIncreaseInvoiceLineQuantity
-    stepTic
-    """), ("""
-    stepCheckInvoicingRule
-    stepIncreasePackingListLineQuantity
-    """, """
-    stepDecreaseInvoiceLineQuantity
-    stepTic
-    """)]
-
-    sequence_list = SequenceList()
-    for seq1, seq2 in mid_sequence_list:
-      sequence = self.PACKING_LIST_DEFAULT_SEQUENCE + \
-          seq1 + mid_sequence + seq2 + end_sequence
-      sequence_list.addSequenceString(sequence)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_12_SplitPackingListAndAcceptInvoice(self, quiet=quiet):
-    """
-    - Decrease the quantity of a Packing List line
-    - Split and Defer on Packing List
-    - Packing List must not be divergent and use new quantity
-    - splitted Packing List must not be divergent and use old - new quantity
-
-    - Put old quantity on Invoice1
-    - Accept Decision on Invoice1
-    - Packing List must not be divergent and use new quantity
-    - splitted Packing List must not be divergent and use old - new quantity
-    - Invoice1 must not be divergent and use old quantity
-
-    - set Invoice2 quantity to 0
-    - Accept Decision on Invoice2
-    - Packing List must not be divergent and use new quantity
-    - splitted Packing List must not be divergent and use old - new quantity
-    - Invoice1 must not be divergent and use old quantity
-    - Invoice2 must not be divergent and use 0 as quantity
-    """
-    if not quiet:
-      self.logMessage('InvoiceSplitPackingListAndAcceptInvoice')
-    sequence = self.PACKING_LIST_DEFAULT_SEQUENCE + \
-    """
-    stepCheckInvoicingRule
-    stepDecreasePackingListLineQuantity
-    stepSetContainerFullQuantity
-    stepCheckPackingListIsCalculating
-    stepTic
-    stepCheckPackingListIsDiverged
-    stepSplitAndDeferPackingList
-    stepTic
-    stepCheckPackingListIsSolved
-    stepCheckPackingListSplitted
-
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-    stepStopPackingList
-    stepTic
-    stepDeliverPackingList
-    stepTic
-    stepCheckPackingListIsSolved
-    stepCheckPackingListSplitted
-
-    stepIncreaseInvoiceLineQuantity
-    stepCheckInvoiceIsCalculating
-    stepTic
-    stepCheckInvoiceIsDiverged
-    stepAcceptDecisionQuantityInvoice
-    stepTic
-    stepStartInvoice
-    stepTic
-    stepStopInvoice
-    stepTic
-    stepDeliverInvoice
-    stepTic
-    stepCheckInvoiceIsSolved
-    stepCheckInvoiceNotSplitted
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-
-    stepSwitchPackingLists
-
-    stepAddPackingListContainer
-    stepSetContainerFullQuantity
-    stepTic
-    stepCheckPackingListIsSolved
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-    stepStopPackingList
-    stepTic
-    stepDeliverPackingList
-    stepTic
-    stepCheckPackingListIsSolved
-
-    stepSetInvoiceLineQuantityToZero
-    stepCheckInvoiceIsCalculating
-    stepTic
-    stepCheckInvoiceIsDiverged
-    stepAcceptDecisionQuantityInvoice
-    stepTic
-    stepStartInvoice
-    stepTic
-    stepStopInvoice
-    stepTic
-    stepDeliverInvoice
-    stepTic
-    stepCheckInvoiceIsSolved
-    stepCheckInvoiceNotSplitted
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-    """
-    self.playSequence(sequence, quiet=quiet)
-
-  def test_13_SplitAndDeferInvoice(self, quiet=quiet):
-    """
-    - Accept Order, Accept Packing List
-    - Decrease quantity on Invoice
-    - Split and defer Invoice
-    - Accept Invoice
-    - Accept splitted Invoice
-    - Packing List must not be divergent and use old quantity
-    - Invoice must not be divergent and use new quantity
-    - splitted Invoice must not be divergent and use old - new quantity
-    """
-    if not quiet:
-      self.logMessage('InvoiceSplitAndDeferInvoice')
-    sequence = self.PACKING_LIST_DEFAULT_SEQUENCE + \
-    """
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-    stepStopPackingList
-    stepTic
-    stepDeliverPackingList
-    stepTic
-    stepCheckPackingListIsSolved
-    stepCheckPackingListNotSplitted
-
-    stepDecreaseInvoiceLineQuantity
-    stepCheckInvoiceIsDivergent
-    stepCheckInvoiceIsCalculating
-    stepTic
-    stepCheckInvoiceIsDiverged
-    stepSplitAndDeferInvoice
-    stepTic
-    stepStartInvoice
-    stepTic
-    stepStopInvoice
-    stepTic
-    stepDeliverInvoice
-    stepTic
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-    stepCheckInvoiceSplitted
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-
-    stepSwitchInvoices
-
-    stepStartInvoice
-    stepTic
-    stepStopInvoice
-    stepTic
-    stepDeliverInvoice
-    stepTic
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-    """
-    self.playSequence(sequence, quiet=quiet)
-
-  def test_14_AcceptDecisionOnInvoice(self, quiet=quiet):
-    """
-    - Accept Order, Accept Packing List
-    - Increase or Decrease quantity on Invoice
-    - Accept Decision on Invoice
-    - Accept Invoice
-    - Packing List must not be divergent and use old quantity
-    - Invoice must not be divergent and use new quantity
-    """
-    if not quiet:
-      self.logMessage('InvoiceAcceptDecisionOnInvoice')
-    mid_sequence = \
-    """
-    stepSetReadyPackingList
-    stepTic
-    stepStartPackingList
-    stepCheckInvoicingRule
-    stepCheckInvoiceTransactionRule
-    stepTic
-    stepCheckInvoiceBuilding
-    stepStopPackingList
-    stepTic
-    stepDeliverPackingList
-    stepTic
-    stepCheckPackingListIsSolved
-    stepCheckPackingListNotSplitted
-    """
-    end_sequence = \
-    """
-    stepCheckInvoiceIsDivergent
-    stepCheckInvoiceIsCalculating
-    stepTic
-    stepCheckInvoiceIsDiverged
-    stepAcceptDecisionQuantityInvoice
-    stepTic
-    stepStartInvoice
-    stepTic
-    stepStopInvoice
-    stepTic
-    stepDeliverInvoice
-    stepTic
-
-    stepCheckPackingListIsNotDivergent
-    stepCheckPackingListIsSolved
-    stepCheckInvoiceTransactionRule
-
-    stepCheckInvoiceNotSplitted
-    stepCheckInvoiceIsNotDivergent
-    stepCheckInvoiceIsSolved
-
-    stepRebuildAndCheckNothingIsCreated
-    stepCheckInvoicesConsistency
-    """
-
-    mid_sequence_list = ["""
-    stepDecreaseInvoiceLineQuantity
-    """, """
-    stepIncreaseInvoiceLineQuantity
-    """]
-
-    sequence_list = SequenceList()
-    for seq in mid_sequence_list:
-      sequence = self.PACKING_LIST_DEFAULT_SEQUENCE + \
-          mid_sequence + seq + end_sequence
-      sequence_list.addSequenceString(sequence)
-    sequence_list.play(self, quiet=quiet)
-
-
-  def test_Reference(self):
-    # A reference is set automatically on Sale Invoice Transaction
-    supplier = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Supplier')
-    client = self.portal.organisation_module.newContent(
-                            portal_type='Organisation',
-                            title='Client')
-    currency = self.portal.currency_module.newContent(
-                            portal_type='Currency')
-    invoice = self.portal.accounting_module.newContent(
-                    portal_type='Sale Invoice Transaction',
-                    start_date=DateTime(),
-                    price_currency_value=currency,
-                    resource_value=currency,
-                    source_section_value=supplier,
-                    destination_section_value=client)
-    self.portal.portal_workflow.doActionFor(invoice, 'confirm_action')
-
-    self.assertEquals('1', invoice.getReference())
-
-  def test_16_ManuallyAddedMovements(self, quiet=quiet):
-    """
-    Checks that adding invoice lines and accounting lines to one invoice
-    generates correct simulation
-    """
-    if not quiet:
-      self.logMessage('Invoice with Manually Added Movements')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-          base_sequence +
-          """
-          stepSetReadyPackingList
-          stepTic
-          stepStartPackingList
-          stepCheckInvoicingRule
-          stepTic
-          stepCheckInvoiceBuilding
-          stepRebuildAndCheckNothingIsCreated
-          stepCheckInvoicesConsistency
-          stepAddInvoiceLines
-          stepTic
-          stepStartInvoice
-          stepTic
-          stepCheckSimulationTrees
-          """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_17_ManuallyAddedWrongMovements(self, quiet=quiet):
-    """
-    Checks that adding invoice lines and accounting lines to one invoice
-    generates correct simulation, even when adding very wrong movements
-    """
-    if not quiet:
-      self.logMessage('Invoice with Manually Added Movements')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-          base_sequence +
-          """
-          stepSetReadyPackingList
-          stepTic
-          stepStartPackingList
-          stepCheckInvoicingRule
-          stepTic
-          stepCheckInvoiceBuilding
-          stepAddWrongInvoiceLines
-          stepTic
-          stepStartInvoice
-          stepCheckStartInvoiceFail
-          stepCheckSimulationTrees
-          """)
-    sequence_list.play(self, quiet=quiet)
-
-  def test_18_compareInvoiceAndPackingList(self, quiet=quiet):
-    """
-    Checks that a Simple Invoice is created from a Packing List
-    """
-    if not quiet:
-      self.logMessage('Simple Invoice')
-    sequence_list = SequenceList()
-    for base_sequence in (self.PACKING_LIST_DEFAULT_SEQUENCE, ) :
-      sequence_list.addSequenceString(
-        base_sequence +
-      """
-        stepSetReadyPackingList
-        stepTic
-        stepStartPackingList
-        stepCheckInvoicingRule
-        stepTic
-        stepCheckInvoiceBuilding
-        stepCheckInvoicesConsistency
-        stepCheckPackingListInvoice
-      """)
-    sequence_list.play(self, quiet=quiet)
-
-  def _adoptDivergenceOnPackingList(self, packing_list, divergence_list):
-    builder_list = packing_list.getBuilderList()
-    for builder in builder_list:
-      builder.solveDivergence(packing_list.getRelativeUrl(),
-                              divergence_to_adopt_list=divergence_list)
-
-  def test_accept_quantity_divergence_on_invoice_with_started_packing_list(
-                        self, quiet=quiet):
-    # only applies to sale invoice, because purchase invoices are not built yet
-    # when the packing list is in started state
-    sequence_list = SequenceList()
-    sequence = sequence_list.addSequenceString(self.PACKING_LIST_DEFAULT_SEQUENCE)
-    sequence_list.play(self, quiet=quiet)
-
-    packing_list = sequence.get('packing_list')
-    packing_list_line = packing_list.getMovementList()[0]
-    previous_quantity = packing_list_line.getQuantity()
-    
-    packing_list.setReady()
-    packing_list.start()
-    self.assertEquals('started', packing_list.getSimulationState())
-    transaction.commit()
-    self.tic()
-
-    invoice = packing_list.getCausalityRelatedValue(
-                                  portal_type=self.invoice_portal_type)
-    self.assertNotEquals(invoice, None)
-    invoice_line_list = invoice.getMovementList()
-    self.assertEquals(1, len(invoice_line_list))
-    invoice_line = invoice_line_list[0]
-
-    new_quantity = invoice_line.getQuantity() * 2
-    invoice_line.setQuantity(new_quantity)
-    
-    transaction.commit()
-    self.tic()
-
-    self.assertTrue(invoice.isDivergent())
-    divergence_list = invoice.getDivergenceList()
-    self.assertEquals(1, len(divergence_list))
-
-    divergence = divergence_list[0]
-    self.assertEquals('quantity', divergence.tested_property)
-
-    # accept decision
-    self._acceptDivergenceOnInvoice(invoice, divergence_list)
-
-    transaction.commit()
-    self.tic()
-    self.assertEquals('solved', invoice.getCausalityState())
-
-    self.assertEquals([], invoice.getDivergenceList())
-    self.assertEquals(new_quantity, invoice_line.getQuantity())
-    self.assertEquals(new_quantity,
-          invoice_line.getDeliveryRelatedValue(portal_type='Simulation Movement'
-              ).getQuantity())
-
-    if invoice_line.getDeliveryRelatedValue().getParentValue().getSpecialiseId() == \
-        'new_invoice_simulation_rule':
-      # With new simulation solvers, changes on simulation movements will
-      # not backtrack.
-      pass
-    else:
-      # With legacy simulation solvers, changes on simulation movements
-      # will backtrack if simulation movements are not frozen.
-      # the packing list is divergent, because it is not frozen
-      self.assertEquals('diverged', packing_list.getCausalityState())
-      divergence_list = packing_list.getDivergenceList()
-      self.assertEquals(1, len(divergence_list))
-      divergence = divergence_list[0]
-      self.assertEquals('quantity', divergence.tested_property)
-      # if we adopt prevision on this packing list, both invoice and
-      # packing list will be solved
-      self._adoptDivergenceOnPackingList(packing_list, divergence_list)
-      transaction.commit()
-      self.tic()
-    self.assertEquals('solved', packing_list.getCausalityState())
-    self.assertEquals('solved', invoice.getCausalityState())
-  
-
-class TestPurchaseInvoice(TestInvoice, ERP5TypeTestCase):
-  """Tests for purchase invoice.
-  """
-  resource_portal_type = 'Product'
-  order_portal_type = 'Purchase Order'
-  order_line_portal_type = 'Purchase Order Line'
-  order_cell_portal_type = 'Purchase Order Cell'
-  packing_list_portal_type = 'Purchase Packing List'
-  packing_list_line_portal_type = 'Purchase Packing List Line'
-  packing_list_cell_portal_type = 'Purchase Packing List Cell'
-  invoice_portal_type = 'Purchase Invoice Transaction'
-  invoice_transaction_line_portal_type = 'Purchase Invoice Transaction Line'
-  invoice_line_portal_type = 'Invoice Line'
-  invoice_cell_portal_type = 'Invoice Cell'
-
-  # default sequence for one line of not varianted resource.
-  PACKING_LIST_DEFAULT_SEQUENCE = """
-      stepCreateEntities
-      stepCreateCurrency
-      stepCreateSaleInvoiceTransactionRule
-      stepCreateOrder
-      stepSetOrderProfile
-      stepSetOrderPriceCurrency
-      stepCreateNotVariatedResource
-      stepTic
-      stepCreateOrderLine
-      stepSetOrderLineResource
-      stepSetOrderLineDefaultValues
-      stepOrderOrder
-      stepTic
-      stepCheckDeliveryBuilding
-      stepConfirmOrder
-      stepTic
-      stepCheckOrderRule
-      stepCheckOrderSimulation
-      stepCheckDeliveryBuilding
-      stepTic
-    """
-
-import unittest
-def test_suite():
-  suite = unittest.TestSuite()
-  suite.addTest(unittest.makeSuite(TestSaleInvoice))
-  suite.addTest(unittest.makeSuite(TestPurchaseInvoice))
-  return suite
diff --git a/product/ERP5/tests/testPackingList.py b/product/ERP5Legacy/tests/testPackingList.py
similarity index 100%
rename from product/ERP5/tests/testPackingList.py
rename to product/ERP5Legacy/tests/testPackingList.py
-- 
2.30.9