[Erp5-report] r32460 kazuhiko - /erp5/trunk/products/ERP5/Document/InvoiceTransactionRule.py

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Feb 12 03:36:10 CET 2010


Author: kazuhiko
Date: Fri Feb 12 03:36:08 2010
New Revision: 32460

URL: http://svn.erp5.org?rev=32460&view=rev
Log:
simplify invoice transaction rule implementation by merging non-bpm case and bpm case.

Modified:
    erp5/trunk/products/ERP5/Document/InvoiceTransactionRule.py

Modified: erp5/trunk/products/ERP5/Document/InvoiceTransactionRule.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/InvoiceTransactionRule.py?rev=32460&r1=32459&r2=32460&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/InvoiceTransactionRule.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/InvoiceTransactionRule.py [utf8] Fri Feb 12 03:36:08 2010
@@ -31,7 +31,7 @@
 from Products.ERP5.Document.Rule import Rule
 from Products.ERP5.Document.PredicateMatrix import PredicateMatrix
 
-from zLOG import LOG, BLATHER, INFO, PROBLEM
+from zLOG import LOG, BLATHER, INFO, PROBLEM, WARNING
 
 class InvoiceTransactionRule(Rule, PredicateMatrix):
   """
@@ -51,7 +51,7 @@
   security.declareObjectProtected(Permissions.AccessContentsInformation)
 
 #### Helper method for expand
-  def _generatePrevisionListBPM(self, applied_rule, **kw):
+  def _generatePrevisionList(self, applied_rule, **kw):
     """
     Generate a list of movements, that should be children of this rule,
     based on its context (parent movement, delivery, configuration ...)
@@ -108,12 +108,12 @@
           input_movement, business_path))
 
         prevision_line.update(
-          source_list = [accounting_rule_cell_line.getSource()],
-          destination_list = [accounting_rule_cell_line.getDestination()],
+          source = accounting_rule_cell_line.getSource(),
+          destination = accounting_rule_cell_line.getDestination(),
           quantity = (input_movement.getCorrectedQuantity() *
             input_movement.getPrice(0.0)) *
             accounting_rule_cell_line.getQuantity(),
-          resource_list = [resource],
+          resource = resource,
           price = 1,
         )
         if resource is not None:
@@ -144,103 +144,6 @@
         prevision_list.append(prevision_line)
     return prevision_list
 
-  def _generatePrevisionList(self, applied_rule, **kw):
-    """
-    Generate a list of movements, that should be children of this rule,
-    based on its context (parent movement, delivery, configuration ...)
-
-    These previsions are acrually returned as dictionaries.
-    """
-    if self._isBPM():
-      return self._generatePrevisionListBPM(applied_rule, **kw)
-    prevision_list = []
-    context_movement = applied_rule.getParentValue()
-
-    # Find a matching cell
-    cell = self._getMatchingCell(context_movement)
-
-    if cell is not None : # else, we do nothing
-      for accounting_rule_cell_line in cell.objectValues() :
-        # get the resource (in that order):
-        #  * resource from the invoice (using deliveryValue)
-        #  * price_currency from the invoice
-        #  * price_currency from the parents simulation movement's
-        # deliveryValue
-        #  * price_currency from the top level simulation movement's
-        # orderValue
-        resource = None
-        invoice_line = context_movement.getDeliveryValue()
-        if invoice_line is not None :
-          invoice = invoice_line.getExplanationValue()
-          resource = invoice.getProperty('resource',
-                     invoice.getProperty('price_currency', None))
-        if resource is None :
-          # search the resource on parents simulation movement's deliveries
-          simulation_movement = applied_rule.getParentValue()
-          portal_simulation = self.getPortalObject().portal_simulation
-          while resource is None and \
-                      simulation_movement != portal_simulation :
-            delivery = simulation_movement.getDeliveryValue()
-            if delivery is not None:
-              resource = delivery.getProperty('price_currency', None)
-            if (resource is None) and \
-               (simulation_movement.getParentValue().getParentValue() \
-                                      == portal_simulation) :
-              # we are on the first simulation movement, we'll try
-              # to get the resource from it's order price currency.
-              order = simulation_movement.getOrderValue()
-              if order is not None:
-                resource = order.getProperty('price_currency', None)
-            simulation_movement = simulation_movement\
-                                        .getParentValue().getParentValue()
-        if resource is None :
-          # last resort : get the resource from the rule
-          resource = accounting_rule_cell_line.getResource() or cell.getResource()
-          if resource in (None, '') :
-            # XXX this happen in many order, so this log is probably useless
-            LOG("InvoiceTransactionRule", PROBLEM,
-                "expanding %s: without resource" % applied_rule.getPath())
-        # XXX Harcoded list
-        prevision_line = {
-            'source': accounting_rule_cell_line.getSource(),
-            'source_section': context_movement.getSourceSection(),
-            'source_decision': context_movement.getSourceDecision(),
-            'source_administration': context_movement.getSourceAdministration(),
-            'source_project': context_movement.getSourceProject(),
-            'source_function': context_movement.getSourceFunction(),
-            'source_payment': context_movement.getSourcePayment(),
-            'destination': accounting_rule_cell_line.getDestination(),
-            'destination_section': context_movement.getDestinationSection(),
-            'destination_decision': context_movement.getDestinationDecision(),
-            'destination_administration': context_movement.getDestinationAdministration(),
-            'destination_project': context_movement.getDestinationProject(),
-            'destination_function': context_movement.getDestinationFunction(),
-            'destination_payment': context_movement.getDestinationPayment(),
-            'start_date': context_movement.getStartDate(),
-            'stop_date': context_movement.getStopDate(),
-            'resource': resource,
-#               'variation_category_list': \
-#                   accounting_rule_cell_line.getVariationCategoryList(),
-#               'variation_property_dict': \
-#                   accounting_rule_cell_line.getVariationPropertyDict(),
-#               'aggregate_list': accounting_rule_cell_line.getAggregateList(),
-#               'price_currency': accounting_rule_cell_line.getPriceCurrency(),
-            # calculate (quantity * price) * cell_quantity
-            'quantity': (context_movement.getCorrectedQuantity() *
-              context_movement.getPrice(0.0)) * accounting_rule_cell_line.getQuantity(),
-#               'quantity_unit': accounting_rule_cell_line.getQuantityUnit(),
-            'price': 1,
-            'force_update': 1,
-            }
-
-        if accounting_rule_cell_line.hasProperty('generate_prevision_script_id'):
-          generate_prevision_script_id = \
-                accounting_rule_cell_line.getGeneratePrevisionScriptId()
-          prevision_line.update(getattr(context_movement,
-                                        generate_prevision_script_id)(prevision_line))
-        prevision_list.append(prevision_line)
-    return prevision_list
-
   security.declareProtected(Permissions.ModifyPortalContent, 'expand')
   def expand(self, applied_rule, force=0, **kw):
     """
@@ -252,72 +155,7 @@
         modify, remove)
     - add/modify/remove child movements to match prevision
     """
-    if self._isBPM():
-      Rule.expand(self, applied_rule, force=force, **kw)
-      return
-
-    add_list, modify_dict, \
-        delete_list = self._getCompensatedMovementList(applied_rule,
-        matching_property_list=['resource', 'source',
-               'destination','destination_total_asset_price',
-              'source_total_asset_price'],**kw)
-
-    if len(add_list) or len(modify_dict):
-      pass#import pdb; pdb.set_trace()
-
-    for movement_id in delete_list:
-      applied_rule._delObject(movement_id)
-
-    for movement, prop_dict in modify_dict.items():
-      applied_rule[movement].edit(**prop_dict)
-
-    for movement_dict in add_list:
-      if 'id' in movement_dict.keys():
-        mvmt_id = applied_rule._get_id(movement_dict.pop('id'))
-        new_mvmt = applied_rule.newContent(id=mvmt_id,
-            portal_type=self.movement_type)
-      else:
-        new_mvmt = applied_rule.newContent(portal_type=self.movement_type)
-      new_mvmt.edit(**movement_dict)
-      #set asset_price on movement when resource is different from price
-      #currency of the source/destination section
-      currency = new_mvmt.getResourceValue()
-      if currency is not None:
-        currency_url = currency.getRelativeUrl()
-        dest_section = new_mvmt.getDestinationSectionValue()
-        if dest_section is not None:
-          dest_currency_url = dest_section.getProperty('price_currency', None)
-        else:
-          dest_currency_url = None
-        if dest_currency_url is not None and currency_url != dest_currency_url:
-          precision = dest_section.getPriceCurrencyValue().getQuantityPrecision()
-          dest_exchange_ratio = currency.getPrice(context=new_mvmt.asContext(
-            categories=['price_currency/%s' % dest_currency_url,
-                        'resource/%s' % currency_url],
-            start_date=new_mvmt.getStartDate()))
-          if dest_exchange_ratio is not None:
-            new_mvmt.edit(destination_total_asset_price=round(
-             (dest_exchange_ratio*
-              applied_rule.getParentValue().getTotalPrice()),precision))
-
-        source_section = new_mvmt.getSourceSectionValue()
-        if source_section is not None:
-          source_currency_url = source_section.getProperty('price_currency', None)
-        else:
-          source_currency_url = None
-        if source_currency_url is not None and currency_url != source_currency_url:
-          precision = source_section.getPriceCurrencyValue().getQuantityPrecision()
-          source_exchange_ratio = currency.getPrice(context=new_mvmt.asContext(
-            categories=['price_currency/%s' % source_currency_url,
-                        'resource/%s' % currency_url],
-            start_date=new_mvmt.getStartDate()))
-          if source_exchange_ratio is not None:
-            new_mvmt.setSourceTotalAssetPrice(round(
-       source_exchange_ratio*applied_rule.getParentValue().getTotalPrice(),
-            precision))
-
-    # Pass to base class
-    Rule.expand(self, applied_rule, force=force, **kw)
+    return Rule._expand(self, applied_rule, force=force, **kw)
 
   # Matrix related
   security.declareProtected( Permissions.ModifyPortalContent,
@@ -380,18 +218,12 @@
 
   def _getCurrencyRatioAndPrecisionByArrow(self, arrow, prevision_line):
     from Products.ERP5Type.Document import newTempSimulationMovement
-    try:
-      prevision_currency = prevision_line['resource_list'][0]
-    except IndexError:
-      prevision_currency = None
+    prevision_currency = prevision_line.get('resource', None)
     temporary_movement = newTempSimulationMovement(self.getPortalObject(),
         '1', **prevision_line)
     exchange_ratio = None
     precision = None
-    try:
-      section = prevision_line['%s_list' % arrow][0]
-    except IndexError:
-      section = None
+    section = prevision_line.get(arrow, None)
     if section is not None:
       currency_url = self.restrictedTraverse(section).getProperty(
           'price_currency', None)
@@ -407,4 +239,51 @@
         start_date=temporary_movement.getStartDate()))
     return exchange_ratio, precision
 
-
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getExpandablePropertyList')
+  def getExpandablePropertyList(self, default=None):
+    """
+    Return a list of properties used in expand.
+    """
+    property_list = self._baseGetExpandablePropertyList()
+    # For backward compatibility, we keep for some time the list
+    # of hardcoded properties. Theses properties should now be
+    # defined on the rule itself
+    if len(property_list) == 0:
+      LOG("Invoice Transaction Rule , getExpandablePropertyList", WARNING,
+                 "Hardcoded properties set, please define your rule correctly")
+      property_list = (
+        'destination_administration',
+        'destination_decision',
+        'destination_function',
+        'destination_payment',
+        'destination_project',
+        'destination_section',
+        'source_administration',
+        'source_decision',
+        'source_function',
+        'source_payment',
+        'source_project',
+        'source_section',
+        'start_date',
+        'stop_date',
+      )
+    return property_list
+
+  security.declareProtected(Permissions.AccessContentsInformation,
+                            'getMatchingPropertyList')
+  def getMatchingPropertyList(self, default=None):
+    """
+    Return a list of properties used in expand.
+    """
+    property_list = self._baseGetMatchingPropertyList()
+    # For backward compatibility, we keep for some time the list
+    # of hardcoded properties. Theses properties should now be
+    # defined on the rule itself
+    if len(property_list) == 0:
+      LOG("Invoice Transaction Rule , getMatchingPropertyList", WARNING,
+          "Hardcoded properties set, please define your rule correctly")
+      property_list=['resource', 'source', 'destination',
+                     'destination_total_asset_price',
+                     'source_total_asset_price']
+    return property_list




More information about the Erp5-report mailing list