From e7fe0313334aca911d6ad3a23ae15cbf15cf6964 Mon Sep 17 00:00:00 2001
From: Romain Courteaud <romain@nexedi.com>
Date: Thu, 1 Sep 2005 12:50:11 +0000
Subject: [PATCH] Even if delivered, we should always calculate consequences
 (like in DeliveryRule). Simulation state which can expand simulation must be
 defined in workflows, not in rule.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@3718 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/Document/InvoiceRule.py | 124 ++++++++++++---------------
 1 file changed, 56 insertions(+), 68 deletions(-)

diff --git a/product/ERP5/Document/InvoiceRule.py b/product/ERP5/Document/InvoiceRule.py
index 936821d824..461d424183 100755
--- a/product/ERP5/Document/InvoiceRule.py
+++ b/product/ERP5/Document/InvoiceRule.py
@@ -61,7 +61,7 @@ class InvoiceRule(DeliveryRule):
 
     # Simulation workflow
     security.declareProtected(Permissions.ModifyPortalContent, 'expand')
-    def expand(self, applied_rule, force=0, **kw):
+    def expand(self, applied_rule, **kw):
       """
         Expands the current movement downward.
 
@@ -76,72 +76,60 @@ class InvoiceRule(DeliveryRule):
       # Only expand if my_invoice is not None and 
       # state is not 'confirmed'
       if my_invoice is not None:
-        # Only expand invoice rule if invoice not yet confirmed 
-        # (This is consistent with the fact that once simulation is 
-        # launched, we stick to it)
-        if force or \
-           (applied_rule.getLastExpandSimulationState() not in \
-                     self.getPortalReservedInventoryStateList() and \
-           applied_rule.getLastExpandSimulationState() not in \
-                      self.getPortalCurrentInventoryStateList()):
-          # First, check each contained movement and make
-          # a list of invoice_line ids which do not need to be copied
-          # eventually delete movement which do not exist anylonger
-          existing_uid_list = []
-          movement_type_list = applied_rule.getPortalMovementTypeList()
-          # non generic
-          invoice_movement_type_list = \
-                                 applied_rule.getPortalInvoiceMovementTypeList()
-          for movement in applied_rule.contentValues(
-                   filter={'portal_type':movement_type_list}):
-            invoice_element = movement.getDeliveryValue(
-                   portal_type=invoice_movement_type_list)
+        # First, check each contained movement and make
+        # a list of invoice_line ids which do not need to be copied
+        # eventually delete movement which do not exist anylonger
+        existing_uid_list = []
+        movement_type_list = applied_rule.getPortalMovementTypeList()
+        # non generic
+        invoice_movement_type_list = \
+                               applied_rule.getPortalInvoiceMovementTypeList()
+        for movement in applied_rule.contentValues(
+                 filter={'portal_type':movement_type_list}):
+          invoice_element = movement.getDeliveryValue(
+                 portal_type=invoice_movement_type_list)
 
-            if (invoice_element is None) or\
-               (invoice_element.hasCellContent()) or\
-               (len(invoice_element.getDeliveryRelatedValueList()) > 1):
-              # Our invoice_element is already related 
-              # to another simulation movement
-              # Delete ourselve
-  #             movement.flushActivity(invoke=0)
-              # XXX Make sure this is not deleted if already in delivery
-              applied_rule._delObject(movement.getId())  
-            else:
-              existing_uid_list_append(invoice_element.getUid())
-          # Copy each movement (line or cell) from the invoice
-          # non generic
-          for invoice_line_object in my_delivery.getMovementList(
-                   portal_type=self.getPortalInvoiceMovementTypeList()):
-            try:
-              # Only create if orphaned movement
-              if invoice_line_object.getUid() not in existing_uid_list:
-                # Generate a nicer ID
-                if invoice_line_object.getParentUid() ==\
-                                      invoice_line_object.getExplanationUid():
-                  # We are on a line
-                  new_id = invoice_line_object.getId()
-                else:
-                  # On a cell
-                  new_id = "%s_%s" % (invoice_line_object.getParentId(),
-                                      invoice_line_object.getId())
-                # Generate the simulation movement
-                new_sim_mvt = applied_rule.newContent(
-                                portal_type=invoice_line_type,
-                                id=new_id,
-                                order_value=invoice_line_object,
-                                delivery_value=invoice_line_object,
-                                # XXX Do we need to copy the quantity
-                                # Why not the resource, the variation,...
-                                quantity=invoice_line_object.getQuantity(),
-                                delivery_ratio=1,
-                                deliverable=1)
-            except AttributeError:
-              LOG('ERP5: WARNING', 0, 
-                  'AttributeError during expand on invoice line %s' \
-                  % invoice_line_object.absolute_url())
-          # Now we can set the last expand simulation state to the 
-          # current state
-          applied_rule.setLastExpandSimulationState(
-              my_invoice.getSimulationState())
+          if (invoice_element is None) or\
+             (invoice_element.hasCellContent()) or\
+             (len(invoice_element.getDeliveryRelatedValueList()) > 1):
+            # Our invoice_element is already related 
+            # to another simulation movement
+            # Delete ourselve
+  #           movement.flushActivity(invoke=0)
+            # XXX Make sure this is not deleted if already in delivery
+            applied_rule._delObject(movement.getId())  
+          else:
+            existing_uid_list_append(invoice_element.getUid())
+        # Copy each movement (line or cell) from the invoice
+        # non generic
+        for invoice_line_object in my_delivery.getMovementList(
+                 portal_type=self.getPortalInvoiceMovementTypeList()):
+          try:
+            # Only create if orphaned movement
+            if invoice_line_object.getUid() not in existing_uid_list:
+              # Generate a nicer ID
+              if invoice_line_object.getParentUid() ==\
+                                    invoice_line_object.getExplanationUid():
+                # We are on a line
+                new_id = invoice_line_object.getId()
+              else:
+                # On a cell
+                new_id = "%s_%s" % (invoice_line_object.getParentId(),
+                                    invoice_line_object.getId())
+              # Generate the simulation movement
+              new_sim_mvt = applied_rule.newContent(
+                              portal_type=invoice_line_type,
+                              id=new_id,
+                              order_value=invoice_line_object,
+                              delivery_value=invoice_line_object,
+                              # XXX Do we need to copy the quantity
+                              # Why not the resource, the variation,...
+                              quantity=invoice_line_object.getQuantity(),
+                              delivery_ratio=1,
+                              deliverable=1)
+          except AttributeError:
+            LOG('ERP5: WARNING', 0, 
+                'AttributeError during expand on invoice line %s' \
+                % invoice_line_object.absolute_url())
       # Pass to base class
-      Rule.expand(self, applied_rule, force=force, **kw)
+      Rule.expand(self, applied_rule, **kw)
-- 
2.30.9