From 85210d50cab06c329ddf2f163b78240b0471fa9d Mon Sep 17 00:00:00 2001
From: Jean-Paul Smets <jp@nexedi.com>
Date: Wed, 4 Aug 2010 19:14:29 +0000
Subject: [PATCH] Moved rules from erp5_simulation

git-svn-id: https://svn.erp5.org/repos/public/erp5/sandbox/amount_generator@37486 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../ERP5/Document/TradeModelSimulationRule.py | 81 +++++++++++++++++--
 1 file changed, 74 insertions(+), 7 deletions(-)

diff --git a/product/ERP5/Document/TradeModelSimulationRule.py b/product/ERP5/Document/TradeModelSimulationRule.py
index 8e4c314999..ecdb5ed565 100644
--- a/product/ERP5/Document/TradeModelSimulationRule.py
+++ b/product/ERP5/Document/TradeModelSimulationRule.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 ##############################################################################
 #
 # Copyright (c) 2010 Nexedi SA and Contributors. All Rights Reserved.
@@ -21,23 +22,89 @@
 #
 # 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 #
 ##############################################################################
-
+"""
+XXX This file is experimental for new simulation implementation, and
+will replace DeliveryRule.
+"""
+import zope.interface
 from AccessControl import ClassSecurityInfo
-from Products.ERP5Type import Permissions
-from Products.ERP5Legacy.Document.TradeModelRule import TradeModelRule
+from Products.ERP5Type import Permissions, PropertySheet, interfaces
+from Products.ERP5.Document.Predicate import Predicate
+from Products.ERP5.mixin.rule import RuleMixin, MovementGeneratorMixin
+from Products.ERP5.mixin.movement_collection_updater import \
+     MovementCollectionUpdaterMixin
 
-class TradeModelSimulationRule(TradeModelRule):
+class TradeModelSimulationRule(RuleMixin, MovementCollectionUpdaterMixin, Predicate):
   """
-  Rule for Trade Model
+    Rule for Trade Model
   """
   # CMF Type Definition
   meta_type = 'ERP5 Trade Model Simulation Rule'
   portal_type = 'Trade Model Simulation Rule'
-  add_permission = Permissions.AddPortalContent
 
   # Declarative security
   security = ClassSecurityInfo()
   security.declareObjectProtected(Permissions.AccessContentsInformation)
+
+  # Declarative interfaces
+  zope.interface.implements(interfaces.IRule,
+                            interfaces.IDivergenceController,
+                            interfaces.IMovementCollectionUpdater,)
+
+  # Default Properties
+  property_sheets = (
+    PropertySheet.Base,
+    PropertySheet.XMLObject,
+    PropertySheet.CategoryCore,
+    PropertySheet.DublinCore,
+    PropertySheet.Task,
+    PropertySheet.Predicate,
+    PropertySheet.Reference,
+    PropertySheet.Version,
+    PropertySheet.Rule
+    )
+
+  def _getMovementGenerator(self, context):
+    """
+    Return the movement generator to use in the expand process
+    """
+    return TradeModelRuleMovementGenerator(applied_rule=context, rule=self)
+
+  def _getMovementGeneratorContext(self, context):
+    """
+    Return the movement generator context to use for expand
+    """
+    return context
+
+  def _getMovementGeneratorMovementList(self, context):
+    """
+    Return the movement lists to provide to the movement generator
+    """
+    return []
+
+  def _isProfitAndLossMovement(self, movement):
+    # For a kind of trade rule, a profit and loss movement lacks source
+    # or destination.
+    return (movement.getSource() is None or movement.getDestination() is None)
+
+class TradeModelRuleMovementGenerator(MovementGeneratorMixin):
+
+  def _getInputMovementList(self, movement_list=None, rounding=False):
+    simulation_movement = self._applied_rule.getParentValue()
+    trade_model = simulation_movement.asComposedDocument()
+
+    if trade_model is None:
+      return
+
+    rule = self._applied_rule.getSpecialiseValue()
+    for amount in simulation_movement.getAggregatedAmountList(
+        # XXX add a 'trade_amount_generator' group type
+        amount_generator_type_list=('Purchase Trade Condition',
+                                    'Sale Trade Condition',
+                                    'Trade Model Line')):
+      yield self._applied_rule.newContent(
+        portal_type=RuleMixin.movement_type, temp_object=True,
+        **dict((k, v) for k, v in amount.__dict__.iteritems() if k[0] != '_'))
-- 
2.30.9