From 3a2709b582cc2ab21a51620d272dbccaf276f956 Mon Sep 17 00:00:00 2001
From: Alexandre Boeglin <alex@nexedi.com>
Date: Thu, 12 Jul 2007 16:10:46 +0000
Subject: [PATCH] add splitAndDeferMovementList method.   this method will
 unlink and delete movements in movement_uid_list and   rebuild a new Packing
 List with them.   1/ change date in simulation, call TargetSolver and expand 
  2/ detach simulation movements from to-be-deleted movements   3/ delete
 movements   4/ call builder

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@15205 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5/Document/Delivery.py | 74 +++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/product/ERP5/Document/Delivery.py b/product/ERP5/Document/Delivery.py
index f6ebed74b6..66f89cb240 100644
--- a/product/ERP5/Document/Delivery.py
+++ b/product/ERP5/Document/Delivery.py
@@ -329,6 +329,80 @@ class Delivery(XMLObject, ImmobilisationDelivery):
         else:
           self.converge()
 
+    def splitAndDeferMovementList(self, start_date=None, stop_date=None,
+        movement_uid_list=[], delivery_builder=None):
+      """
+      this method will unlink and delete movements in movement_uid_list and
+      rebuild a new Packing List with them.
+      1/ change date in simulation, call TargetSolver and expand
+      2/ detach simulation movements from to-be-deleted movements
+      3/ delete movements
+        XXX make sure that all detached movements are deleted at the same
+        time, else the interaction workflow would reattach them to a delivery
+        rule.
+      4/ call builder
+      """
+      tag_list = []
+      movement_list = [x for x in self.getMovementList() if x.getUid() in
+          movement_uid_list]
+      if not movement_list: return
+
+      deferred_simulation_movement_list = []
+      # defer simulation movements
+      if start_date != None or stop_date != None:
+        for movement in movement_list:
+          start_date = start_date or movement.getStartDate()
+          stop_date = stop_date or movement.getStopDate()
+          for s_m in movement.getDeliveryRelatedValueList():
+            if s_m.getStartDate() != start_date or \
+                s_m.getStopDate() != stop_date:
+              s_m.edit(start_date=start_date, stop_date=stop_date)
+              deferred_simulation_movement_list.append(s_m)
+
+      solver_tag = '%s_splitAndDefer_solver' % self.getRelativeUrl()
+      expand_tag = '%s_splitAndDefer_expand' % self.getRelativeUrl()
+      detach_tag = '%s_splitAndDefer_detach' % self.getRelativeUrl()
+      build_tag = '%s_splitAndDefer_build' % self.getRelativeUrl()
+      # call solver and expand on deferrd movements
+      for movement in movement_list:
+        movement.activate(tag=solver_tag).solveMovement(
+            None, 'CopyToTarget')
+      tag_list.append(solver_tag)
+      for s_m in deferred_simulation_movement_list:
+        s_m.activate(after_tag=tag_list[:], tag=expand_tag).expand()
+      tag_list.append(expand_tag)
+
+      detached_movement_url_list = []
+      deleted_movement_uid_list = []
+      #detach simulation movements
+      for movement in movement_list:
+        movement_url = movement.getRelativeUrl()
+        movement_uid = getattr(movement,'uid',None)
+        if movement_uid: deleted_movement_uid_list.append(movement_uid)
+        for s_m in movement.getDeliveryRelatedValueList():
+          delivery_list = \
+              [x for x in s_m.getDeliveryList() if x != movement_url]
+          s_m.activate(after_tag=tag_list[:], tag=detach_tag).setDeliveryList(
+              delivery_list)
+          detached_movement_url_list.append(s_m.getRelativeUrl())
+      tag_list.append(detach_tag)
+
+      #delete delivery movements
+      # deleteContent uses the uid as a activity tag
+      self.activate(after_tag=tag_list[:]).deleteContent([movement.getId() for
+          movement in movement_list])
+      tag_list.extend(deleted_movement_uid_list)
+
+      # update causality state on self, after deletion
+      self.activate(after_tag=tag_list[:],
+          activity='SQLQueue').updateCausalityState()
+
+      # call builder on detached movements
+      builder = getattr(self.portal_deliveries, delivery_builder)
+      builder.activate(after_tag=tag_list[:], tag=build_tag).build(
+          movement_relative_url_list=detached_movement_url_list)
+
+
     #######################################################
     # Defer indexing process
     def reindexObject(self, *k, **kw):
-- 
2.30.9