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