From 756e90d1744b7118cb13a7f7d1b286864715b970 Mon Sep 17 00:00:00 2001
From: Xiaowu Zhang <xiaowu.zhang@nexedi.com>
Date: Thu, 13 Dec 2018 15:57:19 +0000
Subject: [PATCH] testInventory: update test

remove useless test_21
update test_20 with various packing list
---
 product/ERP5/tests/testInventory.py | 838 +++++++++++++++-------------
 1 file changed, 443 insertions(+), 395 deletions(-)

diff --git a/product/ERP5/tests/testInventory.py b/product/ERP5/tests/testInventory.py
index 479d3998dd..b7c7d544cc 100644
--- a/product/ERP5/tests/testInventory.py
+++ b/product/ERP5/tests/testInventory.py
@@ -76,7 +76,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
     """
     return ('erp5_base', 'erp5_pdm', 'erp5_simulation', 'erp5_trade',
             'erp5_configurator_standard_trade_template',
-            'erp5_apparel', 'erp5_simulation_test')
+            'erp5_apparel', 'erp5_simulation_test', 'erp5_mrp')
 
   def setUpPreferences(self):
     #create apparel variation preferences
@@ -1230,21 +1230,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
       LOG('TestInventory._testGetInventory', 0, msg)
       LOG('SQL Query was : ', 0, str(simulation.getInventory(src__=1, **kw)))
       self.assertEqual(e_inventory, a_inventory, msg)
-  
-  def _testGetInventoryAssetPrice(self, expected, **kw):
-    """
-      Shared testing method
-    """
-    simulation = self.getPortal().portal_simulation
-    e_inventory = expected
-    LOG('Testing inventory with args :', 0, kw)
-    a_inventory = simulation.getInventoryAssetPrice(**kw)
-    if e_inventory != a_inventory:
-      msg = 'Inventory differs between expected (%s) and real (%s) price'\
-             % (repr(e_inventory), repr(a_inventory))
-      LOG('TestInventory._testGetInventoryAssetPrice', 0, msg)
-      LOG('SQL Query was : ', 0, str(simulation.getInventoryAssetPrice(src__=1, **kw)))
-      self.assertEqual(e_inventory, a_inventory, msg)
 
 
   def stepTestGetInventoryOnSimulationState(self, sequence=None,
@@ -3551,8 +3536,8 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
     packing_list = packing_list_module.newContent(
                               portal_type=packing_list_portal_type)
  
-    if kw.get('start_date', None) is not None:
-      start_date = stop_date = kw['start_date']
+    if kw.get('at_date', None) is not None:
+      start_date = stop_date = kw['at_date']
     else:
       start_date = stop_date = DateTime() - 2
     packing_list.edit(
@@ -3574,8 +3559,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
                            price = price
                           )
     sequence.edit(packing_list=packing_list)
-    return packing_list_line
-    
+
   
   def stepCreateSalePackingListToSectionNodeForFirstResource(self, sequence=None,
                                                     sequence_list=None,
@@ -3708,458 +3692,522 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
     sequence_list.addSequenceString(sequence_string)
     sequence_list.play(self)
 
-  def stepCreateIPLForModule(self, sequence=None, sequence_list=None, **kw):
-    node = sequence.get('node')
-    section = sequence.get('section')
-    other_node = sequence.get('other_node')
+  def stepInitialAWarehouseX(self, sequence=None, sequence_list=None, **kw):
+    #sale packing list
+    at_date = DateTime('2013/02/10 00:00:00 GMT+9')
     resource = sequence.get('resource')
-    packing_list_module = self.getPortal().getDefaultModule(
-                              portal_type='Internal Packing List')
-    packing_list = packing_list_module.newContent(
-                              portal_type='Internal Packing List')
-    start_date = stop_date = self.start_date_1
-    #same owner but different warehouse
-    packing_list.edit(
-                      specialise=self.business_process,
-                      source_section_value = section,
-                      source_value = node,
-                      destination_section_value = section,
-                      destination_value = other_node,
-                      start_date = start_date,
-                      stop_date = stop_date,
-                      price_currency = self.price_currency
-                     )
-    sequence.edit(packing_list=packing_list)
-
-  def stepCreatePackingListLineWithQuantity3(self, sequence=None,
-                                      sequence_list=None, **kw):
-    packing_list = sequence.get('packing_list')
-    resource_value = sequence.get('resource')
-    packing_list_line = packing_list.newContent(
-                  portal_type='Internal Packing List Line')
-    packing_list_line.edit(resource_value = resource_value,
-                           quantity = 3.
-                          )
-                          
-  def stepCreatePackingListLineWithQuantity_3(self, sequence=None,
-                                      sequence_list=None, **kw):
-    packing_list = sequence.get('packing_list')
-    resource_value = sequence.get('resource')
-    packing_list_line = packing_list.newContent(
-                  portal_type='Internal Packing List Line')
-    packing_list_line.edit(resource_value = resource_value,
-                           quantity = -3.
-                          )
-  
-  def stepCreatePackingListLineWithQuantity30(self, sequence=None,
-                                      sequence_list=None, **kw):
-    packing_list = sequence.get('packing_list')
-    resource_value = sequence.get('resource')
-    packing_list_line = packing_list.newContent(
-                  portal_type='Internal Packing List Line')
-    packing_list_line.edit(resource_value = resource_value,
-                           quantity = 30.
-                          )
-  
-  def stepCreatePackingListLineWithQuantity_30(self, sequence=None,
-                                      sequence_list=None, **kw):
-    packing_list = sequence.get('packing_list')
-    resource_value = sequence.get('resource')
-    packing_list_line = packing_list.newContent(
-                  portal_type='Internal Packing List Line')
-    packing_list_line.edit(resource_value = resource_value,
-                           quantity = -30.
-                          )
+    A = sequence.get('section')
+    X = sequence.get('node')
+    mirror_section = sequence.get('mirror_section')
+    mirror_node = sequence.get('mirror_node')
+   
+    self.stepCreatePackingList(sequence=sequence,
+                                 sequence_list=sequence_list,
+                                 section = A,
+                                 node = X,
+                                 mirror_section = mirror_section,
+                                 mirror_node = mirror_node,
+                                 resource = resource,
+                                 quantity = 100,
+                                 at_date = at_date,
+                                 packing_list = 'Sale Packing List')
 
-  def stepCreatePackingListLineWithQuantity33(self, sequence=None,
-                                      sequence_list=None, **kw):
-    packing_list = sequence.get('packing_list')
-    resource_value = sequence.get('resource')
-    packing_list_line = packing_list.newContent(
-                  portal_type='Internal Packing List Line')
-    packing_list_line.edit(resource_value = resource_value,
-                           quantity = 33.
-                          )
-  def stepTestMultiCancelInventory(self, sequence=None,
-                                 sequence_list=None, **kw):
-    resource_value = sequence.get('resource')
-    node_value = sequence.get('node')
-    other_node_value = sequence.get('other_node')
-    section_value = sequence.get('section')
-    at_date = self.start_date_1
-    self._testGetInventory(
-      expected=67,
-      section_uid=section_value.getUid(),
-      node_uid=node_value.getUid(),
-      resource_uid=resource_value.getUid(),
-      at_date=at_date)
-    self._testGetInventory(
-      expected=33,
-      section_uid=section_value.getUid(),
-      node_uid=other_node_value.getUid(),
-      resource_uid=resource_value.getUid(),
-      at_date=at_date)
-  
-  def test_20_InventoryWhenCancelInternalPackingList(self, quite=0, run=run_all_test):
-    """
-    When Company A's 33 of product G was shipped from warehouse X
-    to warehouse Y (ownership is still same, just location change)
-    in real world, an ERP5 user made many mistakes to enter the above
-    single fact and in the end he created five IPL(Internal Packing List)
-    to record the single fact.
-
-    IPL1 (quantity is wrong)
-      start_date 2013/Feb/10
-      source_section A       destination_section A
-      source X               destination Y
-      resource G    quantity 3
-      simulation_state 
-
-    IPL2 (Cancellation of IPL1)
-      start_date 2013/Feb/10
-      source_section A       destination_section A
-      source X               destination Y
-      resource G    quantity -3
-      simulation_state delivered
-
-    IPL3 (He made a mistake again!)
-      start_date 2013/Feb/10
-      source_section A       destination_section A
-      source X               destination Y
-      resource H    quantity 30
-      simulation_state delivered
-
-    IPL4 (Cancellation of IPL3)
-     start_date 2013/Feb/10
-     source_section A       destination_section A
-     source X               destination Y
-     resource H    quantity -30
-     simulation_state delivered
-
-    IPL5 (Finally he was able to enter data correctly!)
-     start_date 2013/Feb/10
-     source_section A       destination_section A
-     source X               destination Y
-     resource G    quantity 33
-     simulation_state delivered
-    """
-    if not run: return
-    self.start_date_1 = '2013/02/10 00:00:00 GMT+9'
-    sequence_list = SequenceList()
-    sequence_string = 'CreateOrganisationsForModule \
-                       CreateNotVariatedResource \
-                       Tic \
-                       CreatePackingListAtTheDate1 \
-                       CreatePackingListLine \
-                       Tic \
-                       DeliverPackingList \
-                       Tic \
-                       CreateIPLForModule \
-                       CreatePackingListLineWithQuantity3 \
-                       Tic \
-                       DeliverPackingList \
-                       Tic \
-                       CreateIPLForModule \
-                       CreatePackingListLineWithQuantity_3 \
-                       Tic \
-                       DeliverPackingList \
-                       Tic \
-                       CreateIPLForModule \
-                       CreatePackingListLineWithQuantity30 \
-                       Tic \
-                       DeliverPackingList \
-                       Tic \
-                       CreateIPLForModule \
-                       CreatePackingListLineWithQuantity_30\
-                       Tic \
-                       DeliverPackingList \
-                       Tic \
-                       CreateIPLForModule \
-                       CreatePackingListLineWithQuantity33 \
-                       Tic \
-                       DeliverPackingList\
-                       Tic \
-                       TestMultiCancelInventory\
-                       '
-    sequence_list.addSequenceString(sequence_string)
-    sequence_list.play(self)
-  
-  
-  def stepCreateOneMoreSection(self, sequence=None,
-                                 sequence_list=None, **kw):
-    self.stepCreateOrganisation(sequence=sequence,
-                        sequence_list=sequence_list, **kw)
-    one_more_section = sequence.get('organisation')
-    sequence.edit(
-          one_more_section = one_more_section
-        )
-  
-  def stepCreateSalePackingListToA(self, sequence=None,
-                                            sequence_list=None, **kw):
-    #A
-    section = sequence.get('section')
-    node = sequence.get('node')
+  def stepCreateIPLFromAWarehouseXToAWarehouseYWithQuantity3(self, sequence=None, sequence_list=None, **kw):
+    A = sequence.get('section')
+    X = sequence.get('node')
+    Y = sequence.get('other_node')
     resource = sequence.get('resource')
+    at_date = DateTime('2013/02/11 00:00:00 GMT+9')
+    
     self.stepCreatePackingList(sequence=sequence,
-                               sequence_list=sequence_list,
-                               section = section,
-                               node = node,
-                               resource = resource,
-                               quantity = 10,
-                               price = 100,
-                               packing_list = 'Sale Packing List')
-  
-  def stepCreatePurchasePackingListForASecond(self, sequence=None,
-                                            sequence_list=None, **kw):
-    #A
-    section = sequence.get('section')
-    node = sequence.get('node')
+                                 sequence_list=sequence_list,
+                                 section = A,
+                                 node = Y,
+                                 mirror_section = A,
+                                 mirror_node = X,
+                                 resource = resource,
+                                 quantity = 3,
+                                 at_date = at_date,
+                                 packing_list = 'Internal Packing List')
+
+  def stepCancelIPLFromAWarehouseXToAWarehouseYWithQuantity3(self, sequence=None, sequence_list=None, **kw):
+    A = sequence.get('section')
+    X = sequence.get('node')
+    Y = sequence.get('other_node')
     resource = sequence.get('resource')
+    at_date = DateTime('2013/02/11 02:00:00 GMT+9')
+    
     self.stepCreatePackingList(sequence=sequence,
-                               sequence_list=sequence_list,
-                               section = section,
-                               node = node,
-                               resource = resource,
-                               quantity = 15,
-                               price = 200,
-                               packing_list = 'Purchase Packing List')
-  
-  def stepCreatePurchasePackingListForAThird(self, sequence=None,
-                                            sequence_list=None, **kw):
-    #A
-    section = sequence.get('section')
-    node = sequence.get('node')
+                                 sequence_list=sequence_list,
+                                 section = A,
+                                 node = X,
+                                 mirror_section = A,
+                                 mirror_node = Y,
+                                 resource = resource,
+                                 quantity = 3,
+                                 at_date = at_date,
+                                 packing_list = 'Internal Packing List')
+
+  def stepCreateIPLFromAWarehouseXToAWarehouseYWithQuantity30(self, sequence=None, sequence_list=None, **kw):
+    A = sequence.get('section')
+    X = sequence.get('node')
+    Y = sequence.get('other_node')
     resource = sequence.get('resource')
+    at_date = DateTime('2013/02/13 04:00:00 GMT+9')
+    
     self.stepCreatePackingList(sequence=sequence,
-                               sequence_list=sequence_list,
-                               section = section,
-                               node = node,
-                               resource = resource,
-                               quantity = 20,
-                               price = 200,
-                               packing_list = 'Purchase Packing List')
+                                 sequence_list=sequence_list,
+                                 section = A,
+                                 node = Y,
+                                 mirror_section = A,
+                                 mirror_node = X,
+                                 resource = resource,
+                                 quantity = 30,
+                                 at_date = at_date,
+                                 packing_list = 'Internal Packing List')
 
-  def stepCreatePurchasePackingListForB(self, sequence=None,
-                                            sequence_list=None, **kw):
-    #B
-    section = sequence.get('other_section')
-    node = sequence.get('other_node')
+  def stepCancelIPLFromAWarehouseXToAWarehouseYWithQuantity30(self, sequence=None, sequence_list=None, **kw):
+    A = sequence.get('section')
+    X = sequence.get('node')
+    Y = sequence.get('other_node')
     resource = sequence.get('resource')
+    at_date = DateTime('2013/02/14 05:00:00 GMT+9')
+    
     self.stepCreatePackingList(sequence=sequence,
-                               sequence_list=sequence_list,
-                               section = section,
-                               node = node,
-                               resource = resource,
-                               quantity = 20,
-                               price = 55,
-                               packing_list = 'Purchase Packing List')
-
-  def stepCreateSalePackingListFromAToB(self, sequence=None,
+                                 sequence_list=sequence_list,
+                                 section = A,
+                                 node = X,
+                                 mirror_section = A,
+                                 mirror_node = Y,
+                                 resource = resource,
+                                 quantity = 30,
+                                 at_date = at_date,
+                                 packing_list = 'Internal Packing List')
+    
+  def stepCreateSPLFromAWarehouseXToBWarehouseYWithQuantity30(self, sequence=None,
                                       sequence_list=None, **kw):
-    #B
-    section = sequence.get('other_section')
-    node = sequence.get('other_node')
+    A = sequence.get('section')
+    X = sequence.get('node')
+    B = sequence.get('other_section')
+    Y = sequence.get('other_node')
     resource = sequence.get('resource')
-    #A
-    mirror_section = sequence.get('section')
-    mirror_node = sequence.get('node')
-    packing_list_line_a_to_b = self.stepCreatePackingList(sequence=sequence,
+    at_date = DateTime('2013/02/14 04:00:00 GMT+9')
+
+    self.stepCreatePackingList(sequence=sequence,
                                  sequence_list=sequence_list,
-                                 section = section,
-                                 node = node,
-                                 mirror_section = mirror_section,
-                                 mirror_node = mirror_node,
+                                 section = B,
+                                 node = Y,
+                                 mirror_section = A,
+                                 mirror_node = X,
                                  resource = resource,
                                  quantity = 30,
+                                 at_date = at_date,
                                  packing_list = 'Sale Packing List')
-    sequence.edit(packing_list_line_a_to_b = packing_list_line_a_to_b)
 
-  def stepCreatePurchasePackingListForCFromA(self, sequence=None,
+  def stepCreatePPLForCWarehouseXFromAWarehouseXWithQuantity10(self, sequence=None,
                                       sequence_list=None, **kw):
-    #C
-    section = sequence.get('one_more_section')
-    node = sequence.get('node')
     resource = sequence.get('resource')
-    #A
-    mirror_section = sequence.get('section')
-    mirror_node = sequence.get('node')
-    packing_list_line_a_to_c = self.stepCreatePackingList(sequence=sequence,
+    C = sequence.get('one_more_section')
+    X = sequence.get('node')
+    A = sequence.get('section')
+    X = sequence.get('node')
+    at_date = DateTime('2013/02/11 04:00:00 GMT+9')
+    self.stepCreatePackingList(sequence=sequence,
                                  sequence_list=sequence_list,
-                                 section = section,
-                                 node = node,
-                                 mirror_section = mirror_section,
-                                 mirror_node = mirror_node,
+                                 section = C,
+                                 node = X,
+                                 mirror_section = A,
+                                 mirror_node = X,
                                  resource = resource,
                                  quantity = 10,
+                                 at_date = at_date,
                                  packing_list = 'Purchase Packing List')
-    sequence.edit(packing_list_line_a_to_c = packing_list_line_a_to_c)
+  
+  def stepCancelSPLFromAWarehouseXToBWarehouseYWithQuantity30(self, sequence=None,
+                                      sequence_list=None, **kw):
+    A = sequence.get('section')
+    X = sequence.get('node')
+    B = sequence.get('other_section')
+    Y = sequence.get('other_node')
+    resource = sequence.get('resource')
+    at_date = DateTime('2013/02/14 06:00:00 GMT+9')
 
-  def stepCreatePurchasePackingListForCFromB(self, sequence=None,
+    self.stepCreatePackingList(sequence=sequence,
+                                 sequence_list=sequence_list,
+                                 section = A,
+                                 node = X,
+                                 mirror_section = B,
+                                 mirror_node = Y,
+                                 resource = resource,
+                                 quantity = 30,
+                                 at_date = at_date,
+                                 packing_list = 'Sale Packing List')
+  
+
+
+  def stepCreateProductionPFromAFactoryZToAWarehouseXWithQuantity10(self, sequence=None,
                                       sequence_list=None, **kw):
-    #C
-    section = sequence.get('one_more_section')
-    node = sequence.get('node')
+    A = sequence.get('section')
+    Z = sequence.get('factory')
+    X = sequence.get('node')
     resource = sequence.get('resource')
-    #B
-    mirror_section = sequence.get('other_section')
-    mirror_node = sequence.get('other_node')
-    packing_list_line_b_to_c = self.stepCreatePackingList(sequence=sequence,
+    at_date = DateTime('2013/02/14 08:00:00 GMT+9')
+
+    self.stepCreatePackingList(sequence=sequence,
                                  sequence_list=sequence_list,
-                                 section = section,
-                                 node = node,
-                                 mirror_section = mirror_section,
-                                 mirror_node = mirror_node,
+                                 section = A,
+                                 node = X,
+                                 mirror_section = A,
+                                 mirror_node = Z,
                                  resource = resource,
-                                 quantity = 5,
-                                 packing_list='Purchase Packing List')
-    sequence.edit(packing_list_line_b_to_c = packing_list_line_b_to_c)
+                                 quantity = 10,
+                                 at_date = at_date,
+                                 packing_list = 'Production Packing List')
 
-  def stepCreateSalePackingListFromCToA(self, sequence=None,
+
+  def stepCreateSPLFromAWarehouseXToBWarehouseYWithQuantity24(self, sequence=None,
                                       sequence_list=None, **kw):
-    #A
-    section = sequence.get('section')
-    node = sequence.get('node')
+    A = sequence.get('section')
+    X = sequence.get('node')
+    B = sequence.get('other_section')
+    Y = sequence.get('other_node')
     resource = sequence.get('resource')
-    #C
-    mirror_section = sequence.get('one_more_section')
-    mirror_node = sequence.get('node')
-    packing_list_line_c_to_a = self.stepCreatePackingList(sequence=sequence,
+    at_date = DateTime('2013/02/16 00:00:00 GMT+9')
+
+    self.stepCreatePackingList(sequence=sequence,
                                  sequence_list=sequence_list,
-                                 section = section,
-                                 node = node,
-                                 mirror_section = mirror_section,
-                                 mirror_node = mirror_node,
+                                 section = B,
+                                 node = Y,
+                                 mirror_section = A,
+                                 mirror_node = X,
                                  resource = resource,
-                                 quantity = 2,
+                                 quantity = 24,
+                                 at_date = at_date,
                                  packing_list = 'Sale Packing List')
-    sequence.edit(packing_list_line_c_to_a = packing_list_line_c_to_a)
 
+  def stepCreatePPLForCWarehouseXFromBWarehouseYWithQuantity5(self, sequence=None, sequence_list=None, **kw):
+    C = sequence.get('one_more_section')
+    X = sequence.get('node')
+    B = sequence.get('other_section')
+    Y = sequence.get('other_node')
+    resource = sequence.get('resource')
+    at_date = DateTime('2013/02/24 00:00:00 GMT+9')
+
+    self.stepCreatePackingList(sequence=sequence,
+                                 sequence_list=sequence_list,
+                                 section = C,
+                                 node = X,
+                                 mirror_section = B,
+                                 mirror_node = Y,
+                                 resource = resource,
+                                 quantity = 5,
+                                 at_date = at_date,
+                                 packing_list = 'Purchase Packing List')
+                                 
+                               
+  def stepCreateIPLFromAWarehouseXToAWarehouseYWithQuantity33(self, sequence=None, sequence_list=None, **kw):
+    A = sequence.get('section')
+    X = sequence.get('node')
+  
+    Y = sequence.get('other_node')
+    resource = sequence.get('resource')
+    at_date = DateTime('2013/02/25 01:00:00 GMT+9')
+
+    self.stepCreatePackingList(sequence=sequence,
+                                 sequence_list=sequence_list,
+                                 section = A,
+                                 node = Y,
+                                 mirror_section = A,
+                                 mirror_node = X,
+                                 resource = resource,
+                                 at_date = at_date,
+                                 quantity = 33,
+                                 packing_list = 'Internal Packing List')  
+                                 
+
+  def stepCancelPPLForCWarehouseXFromBWarehouseYWithQuantity5(self, sequence=None, sequence_list=None, **kw):
+    C = sequence.get('one_more_section')
+    X = sequence.get('node')
+    B = sequence.get('other_section')
+    Y = sequence.get('other_node')
+    resource = sequence.get('resource')
+    at_date = DateTime('2013/02/25 02:00:00 GMT+9')
+    self.stepCreatePackingList(sequence=sequence,
+                                 sequence_list=sequence_list,
+                                 section = B,
+                                 node = Y,
+                                 mirror_section = C,
+                                 mirror_node = X,
+                                 resource = resource,
+                                 quantity = 5,
+                                 at_date = at_date,
+                                 packing_list = 'Purchase Packing List')
+
+  def stepCreatePPLForCWarehouseXFromBWarehouseYWithQuantity10(self, sequence=None, sequence_list=None, **kw):
+    C = sequence.get('one_more_section')
+    X = sequence.get('node')
+    B = sequence.get('other_section')
+    Y = sequence.get('other_node')
+    resource = sequence.get('resource')
+    at_date = DateTime('2013/02/26 00:00:00 GMT+9')
+
+    self.stepCreatePackingList(sequence=sequence,
+                                 sequence_list=sequence_list,
+                                 section = C,
+                                 node = X,
+                                 mirror_section = B,
+                                 mirror_node = Y,
+                                 resource = resource,
+                                 quantity = 10,
+                                 at_date = at_date,
+                                 packing_list = 'Purchase Packing List')
+
+  def stepCreateOneMoreSection(self, sequence=None,
+                                 sequence_list=None, **kw):
+    self.stepCreateOrganisation(sequence=sequence,
+                        sequence_list=sequence_list, **kw)
+    one_more_section = sequence.get('organisation')
+    sequence.edit(
+          one_more_section = one_more_section
+        )
+  def stepCreateFactory(self, sequence=None,
+                                 sequence_list=None, **kw):
+    self.stepCreateOrganisation(sequence=sequence,
+                        sequence_list=sequence_list, **kw)
+    factory = sequence.get('organisation')
+    sequence.edit(
+          factory = factory
+        )
+  def stepDeliverProductionPackingList(self, sequence=None,
+                                      sequence_list=None, **kw):
+    # Switch to "started" state
+    packing_list = sequence.get('packing_list')
+    workflow_tool = self.getPortal().portal_workflow
+    workflow_tool.doActionFor(packing_list,
+                      "confirm_action", "production_packing_list_workflow")
+    self.commit()
+    # Apply tic so that the packing list is not in building state
+    self.tic() # acceptable here because this is not the job
+               # of the test to check if can do all transition
+               # without processing messages
+    workflow_tool.doActionFor(packing_list,
+                      "set_ready_action", "production_packing_list_workflow")
+    self.tic()
+    workflow_tool.doActionFor(packing_list,
+                      "start_action", "production_packing_list_workflow")
+    workflow_tool.doActionFor(packing_list,
+                      "stop_action", "production_packing_list_workflow")
+    workflow_tool.doActionFor(packing_list,
+                      "deliver_action", "production_packing_list_workflow")
 
-  def steptestCircularMovementQuantity(self, sequence=None,
-                            sequence_list=None, **kw):
+  def stepTestMultiCancelInventory(self, sequence=None,
+                                 sequence_list=None, **kw):
     resource_value = sequence.get('resource')
-    node_value = sequence.get('node')
-    other_node_value = sequence.get('other_node')
-    section_value = sequence.get('section')
-    other_section_value = sequence.get('other_section')
-    one_more_section_value = sequence.get('one_more_section')
-    #C
+    A = sequence.get('section')
+    B = sequence.get('other_section')
+    C = sequence.get('one_more_section')
+    X = sequence.get('node')
+    Y = sequence.get('other_node')
+
     self._testGetInventory(
-      expected=13,
-      section_uid=one_more_section_value.getUid(),
-      node_uid=node_value.getUid(),
-      resource_uid=resource_value.getUid()
-      )
-    #B
+      expected=33,
+      section_uid=A.getUid(),
+      node_uid=Y.getUid(),
+      resource_uid=resource_value.getUid())
+      
     self._testGetInventory(
-      expected=45,
-      section_uid=other_section_value.getUid(),
-      node_uid=other_node_value.getUid(),
-      resource_uid=resource_value.getUid()
-      )
-    #A
+      expected=43,
+      section_uid=A.getUid(),
+      node_uid=X.getUid(),
+      resource_uid=resource_value.getUid())
+
     self._testGetInventory(
-      expected=7,
-      section_uid=section_value.getUid(),
-      node_uid=node_value.getUid(),
-      resource_uid=resource_value.getUid()
-      )
-      
-  def steptestCircularMovementPrice(self, sequence=None,
-                            sequence_list=None, **kw):
-    resource_value = sequence.get('resource')
-    node_value = sequence.get('node')
-    other_node_value = sequence.get('other_node')
-    section_value = sequence.get('section')
-    other_section_value = sequence.get('other_section')
-    one_more_section_value = sequence.get('one_more_section')
-    #C
-    self._testGetInventoryAssetPrice(
-      expected=160,
-      section_uid=one_more_section_value.getUid(),
-      node_uid=node_value.getUid(),
-      resource_uid=resource_value.getUid(),
-      valuation_method='WeightedAverage'
-      )
-    #B
-    self._testGetInventoryAssetPrice(
-      expected=129,
-      section_uid=other_section_value.getUid(),
-      node_uid=other_node_value.getUid(),
-      resource_uid=resource_value.getUid(),
-      valuation_method='WeightedAverage'
-      )
-    #A
-    self._testGetInventoryAssetPrice(
-      expected=178,
-      section_uid=section_value.getUid(),
-      node_uid=node_value.getUid(),
-      resource_uid=resource_value.getUid(),
-      valuation_method='WeightedAverage'
-      )
+      expected=14,
+      section_uid=B.getUid(),
+      node_uid=Y.getUid(),
+      resource_uid=resource_value.getUid())
+
+    self._testGetInventory(
+      expected=20,
+      section_uid=C.getUid(),
+      node_uid=X.getUid(),
+      resource_uid=resource_value.getUid())
     
-  def test_21_CircularMovements(self, quite=0, run=run_all_test):
+    at_date = DateTime('2013/02/15 00:00:00 GMT+9')
+
+    self._testGetInventory(
+      expected=0,
+      section_uid=A.getUid(),
+      node_uid=Y.getUid(),
+      at_date = at_date,
+      resource_uid=resource_value.getUid())
+      
+    self._testGetInventory(
+      expected=100,
+      section_uid=A.getUid(),
+      node_uid=X.getUid(),
+      at_date = at_date,
+      resource_uid=resource_value.getUid())
+
+    self._testGetInventory(
+      expected=0,
+      section_uid=B.getUid(),
+      node_uid=Y.getUid(),
+      at_date = at_date,
+      resource_uid=resource_value.getUid())
+
+    self._testGetInventory(
+      expected=10,
+      section_uid=C.getUid(),
+      node_uid=X.getUid(),
+      at_date = at_date,
+      resource_uid=resource_value.getUid())
+      
+    at_date = DateTime('2013/02/25 00:00:00 GMT+9')
+
+    self._testGetInventory(
+      expected=0,
+      section_uid=A.getUid(),
+      node_uid=Y.getUid(),
+      at_date = at_date,
+      resource_uid=resource_value.getUid())
+      
+    self._testGetInventory(
+      expected=76,
+      section_uid=A.getUid(),
+      node_uid=X.getUid(),
+      at_date = at_date,
+      resource_uid=resource_value.getUid())
+
+    self._testGetInventory(
+      expected=19,
+      section_uid=B.getUid(),
+      node_uid=Y.getUid(),
+      at_date = at_date,
+      resource_uid=resource_value.getUid())
+
+    self._testGetInventory(
+      expected=15,
+      section_uid=C.getUid(),
+      node_uid=X.getUid(),
+      at_date = at_date,
+      resource_uid=resource_value.getUid())
+
+  
+  def test_20_InventoryWhenCancelPackingList(self, quite=0, run=run_all_test):
     """
-    Owner A, warehouse X, product G, quantity 10, total price is 1000
-    Owner B, warehouse Y, product G, quantity 20, total price is 1100
-    Owner C, warehouse X, product G, quantity 0 , total price is 0
+    initial 2013/02/10 00:00:00 GMT+9:
+    A warehouse X, has product: Notvariated 100
+    
+    2013/02/11 00:00:00 GMT+9
+    IPL 1: A warehouse X ----> A warehouse Y, quantity: 3
+    
+    2013/02/11 02:00:00 GMT+9
+    cancel IPL1
     
-    Then, product G was moved like below:
+    2013/02/13 04:00:00 GMT+9
+    IPL 2: A warehouse X ----> A warehouse Y, quantity: 30
+    
+    2013/02/14 04:00:00 GMT+9
+    SPL 1: A warehouse X ----> B warehouse Y, quantity: 30
+    
+    2013/02/14 05:00:00 GMT+9
+    cancel IPL2
+    
+    2013/02/11 04:00:00 GMT+9
+    PPL 1: A warehouse X ----> C warehouse X, quantity: 10
+    
+    2013/02/14 06:00:00 GMT+9
+    cancel SPL1
+    
+    2013/02/14 08:00:00 GMT+9
+    Production PL: A factory Z  ---> A warehouse X, quantity: 10
+    
+    2013/02/16 00:00:00 GMT+9
+    SPL 2: A warehouse X ----> B warehouse Y, quantity: 24
+    
+    2013/02/24 00:00:00 GMT+9
+    PPL 2: B warehouse Y ----> C warehouse X, quantity: 5
+    
+    2013/02/25 01:00:00 GMT+9
+    IPL 3: A warehouse X ----> A warehouse Y, quantity: 33
 
-    Owner A purchased 15 of product G for the price of 3000
-    Owner A purchased 20 of product G for the price of 4000
+    2013/02/25 02:00:00 GMT+9    
+    cancel PPL 2
     
-    Owner B purchased 30 of product G from Owner A(price is determined at the end of Nov).
-    Owner C purchased 10 of product G from Owner A(price is determined at the end of Nov).
-    Owner C get 5 of product G from Owner B(price is determined at the end of Nov).
-    Owner A get 2 of product G from Owner C(price is determined at the end of Nov).
+    2013/02/26 00:00:00 GMT+9
+    PPL 3: B warehouse Y ----> C warehouse X, quantity: 10
 
-    As we see in this example, product G was moved between A and B, B and
-    C, C and A, it is circulating. Then, at the end of Mouth, Price of
-    product G of Owner A depends on price of product G of owner B, this
-    kind of thing happens. (And if it is a real circulation, price can't be
-    decided, it must not happen, but theoretically it can happen.
     """
     if not run: return
     sequence_list = SequenceList()
     sequence_string = 'CreateOrganisationsForModule \
                        CreateOneMoreSection \
+                       CreateFactory \
                        CreateNotVariatedResource \
                        Tic \
-                       CreateSalePackingListToA \
+                       InitialAWarehouseX \
+                       Tic \
+                       DeliverPackingList \
+                       Tic \
+                       CreateIPLFromAWarehouseXToAWarehouseYWithQuantity3 \
                        Tic \
                        DeliverPackingList \
                        Tic \
-                       CreatePurchasePackingListForB \
+                       CancelIPLFromAWarehouseXToAWarehouseYWithQuantity3 \
                        Tic \
                        DeliverPackingList \
                        Tic \
-                       CreatePurchasePackingListForASecond \
+                       CreateIPLFromAWarehouseXToAWarehouseYWithQuantity30 \
+                       Tic \
+                       DeliverPackingList \
+                       Tic \
+                       CreateSPLFromAWarehouseXToBWarehouseYWithQuantity30 \
+                       Tic \
                        DeliverPackingList \
                        Tic \
-                       CreatePurchasePackingListForAThird \
+                       CancelIPLFromAWarehouseXToAWarehouseYWithQuantity30 \
+                       Tic \
+                       DeliverPackingList \
+                       Tic \
+                       CreatePPLForCWarehouseXFromAWarehouseXWithQuantity10 \
+                       Tic \
+                       DeliverPackingList\
+                       Tic \
+                       CancelSPLFromAWarehouseXToBWarehouseYWithQuantity30 \
+                       Tic \
                        DeliverPackingList \
                        Tic \
-                       CreateSalePackingListFromAToB\
+                       CreateProductionPFromAFactoryZToAWarehouseXWithQuantity10 \
+                       Tic \
+                       DeliverProductionPackingList \
+                       Tic \
+                       CreateSPLFromAWarehouseXToBWarehouseYWithQuantity24 \
+                       Tic \
                        DeliverPackingList \
                        Tic \
-                       CreatePurchasePackingListForCFromA\
+                       CreatePPLForCWarehouseXFromBWarehouseYWithQuantity5 \
+                       Tic \
                        DeliverPackingList \
                        Tic \
-                       CreatePurchasePackingListForCFromB\
+                       CreateIPLFromAWarehouseXToAWarehouseYWithQuantity33 \
+                       Tic \
                        DeliverPackingList \
                        Tic \
-                       CreateSalePackingListFromCToA\
+                       CancelPPLForCWarehouseXFromBWarehouseYWithQuantity5 \
+                       Tic \
                        DeliverPackingList \
                        Tic \
-                       steptestCircularMovementQuantity \
+                       CreatePPLForCWarehouseXFromBWarehouseYWithQuantity10 \
                        Tic \
-                       steptestCircularMovementPrice \
+                       DeliverPackingList \
+                       Tic \
+                       TestMultiCancelInventory\
                        '
     sequence_list.addSequenceString(sequence_string)
     sequence_list.play(self)
-
   
+ 
 
 def test_suite():
   suite = unittest.TestSuite()
-- 
2.30.9