TaxRule.py 4.38 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
##############################################################################
#
# Copyright (c) 2002, 2005 Nexedi SARL and Contributors. All Rights Reserved.
#                    Jean-Paul Smets-Solanes <jp@nexedi.com>
#                    Romain Courteaud <romain@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
##############################################################################

from AccessControl import ClassSecurityInfo
31
from Products.ERP5Type import Permissions, PropertySheet, Constraint, interfaces
32 33 34 35 36 37 38 39 40 41 42 43 44 45
from Products.ERP5.Document.Rule import Rule
from Products.ERP5.Document.DeliveryRule import DeliveryRule

class TaxRule(DeliveryRule):
  """
  """
  # CMF Type Definition
  meta_type = 'ERP5 Tax Rule'
  portal_type = 'Tax Rule'

  # Declarative security
  security = ClassSecurityInfo()
  security.declareObjectProtected(Permissions.AccessContentsInformation)
  
46 47
  __implements__ = ( interfaces.IPredicate,
                     interfaces.IRule )
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

  # Default Properties
  property_sheets = ( PropertySheet.Base
                    , PropertySheet.XMLObject
                    , PropertySheet.CategoryCore
                    , PropertySheet.DublinCore
                    , PropertySheet.Task
                    )

  security.declareProtected(Permissions.ModifyPortalContent, 'expand')
  def expand(self, applied_rule, force=0, **kw):
    """ """ 
    movement_type = 'Simulation Movement'
    immutable_movement_list = []

    parent_simulation_movement = applied_rule.getParentValue()
    order_movement = parent_simulation_movement.getDefaultOrderValue()
    
    order_movement_dict = {}
    for s_m in applied_rule.objectValues():
      order_movement_dict.setdefault(s_m.getOrder(), []).append(s_m)

    order_movement_total_price = order_movement.getTotalPrice()
    parent_simulation_movement_total_price = \
                    parent_simulation_movement.getTotalPrice()

    # XXX round 
    if order_movement_total_price != 0 and \
        parent_simulation_movement_total_price != 0:
                      
      ratio = parent_simulation_movement_total_price / \
                           order_movement_total_price
      for tax_movement in order_movement\
                        .DeliveryMovement_getCorrespondingTaxLineList():
        existing_simulation_movement_list = order_movement_dict.get(
                                tax_movement.getRelativeUrl(), [])

        property_dict = dict()
        for prop in ('price', 'base_application_list',
87
                     'price_currency', 'payment_mode',
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
                     'base_contribution_list', 'resource'):
          property_dict[prop] = tax_movement.getProperty(prop)

        property_dict['quantity'] = tax_movement.getQuantity() * ratio

        if not existing_simulation_movement_list:
          applied_rule.newContent(
                portal_type=movement_type,
                order_value=tax_movement,
                order_ratio=1,
                delivery_ratio=1,
                deliverable=1,
                **property_dict )
        else:
          for existing_simulation_movement in \
                existing_simulation_movement_list:
104 105
            if existing_simulation_movement.getDelivery() is None\
                and not "split" in existing_simulation_movement.getId():
106
              existing_simulation_movement.edit(**property_dict)
107 108 109 110

    # Pass to base class
    Rule.expand(self, applied_rule, force=force, **kw)