PaySheetModel.py 5 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) 2007, Nexedi SA and Contributors. All Rights Reserved.
#                    Fabien Morin <fabien@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
32
from Products.ERP5.Document.TradeCondition import TradeCondition
33
from Products.ERP5Type.XMLMatrix import XMLMatrix
34
from zLOG import LOG, WARNING, DEBUG
35

36 37

class PaySheetModel(TradeCondition, XMLMatrix):
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
    """
      PaySheetModel are used to define calculating rules specific to a 
      date, a convention, a enmployees group...
      This permit to applied a whole of calculating rules on a whole of
      pay sheets
    """

    meta_type = 'ERP5 Pay Sheet Model'
    portal_type = 'Pay Sheet Model'
    isPredicate = 1

    # Declarative security
    security = ClassSecurityInfo()
    security.declareObjectProtected(Permissions.AccessContentsInformation)

    # Declarative properties
    property_sheets = ( PropertySheet.Base
                      , PropertySheet.XMLObject
                      , PropertySheet.CategoryCore
                      , PropertySheet.DublinCore
                      , PropertySheet.Folder
                      , PropertySheet.Comment
                      , PropertySheet.Arrow
                      , PropertySheet.TradeCondition
                      , PropertySheet.Order
                      , PropertySheet.PaySheetModel
                      , PropertySheet.MappedValue
                      , PropertySheet.Amount
                      , PropertySheet.DefaultAnnotationLine
                      )

69
    def getReferenceDict(self, portal_type_list, get_none_reference=0):
70
      '''
71
        return all objects reference and id of the model wich portal_type is in the
72
        portal_type_list
73 74 75 76
        - parameters :
          o get_none_reference : permit to get a dict with all references
          not defined. This is usefull to get all object on the model paysheet
          inherite from.
77
      '''
78 79
      reference_dict={}

80 81 82 83 84 85 86 87 88 89 90
      object_list = self.contentValues(portal_type=portal_type_list,
          sort_on='id')

      for object in object_list:
        reference_method = getattr(object, 'getReference', None)
        if reference_method is None:
          LOG('PaySheetModel getReferenceList', 0, '%s have not '
              'getReference method' % object.getTitle() or
              object.getRelativeUrl())
        else:
          reference = reference_method()
91 92 93
          if reference is not None and not get_none_reference:
            reference_dict[reference]=object.getId()
          elif reference is None and get_none_reference:
94
            reference_dict[object.getId()]=object.getId()
95

96
      return reference_dict
97 98 99 100 101 102 103 104 105 106 107 108

    def getInheritanceModelReferenceDict(self, model_reference_dict,
        model_list, portal_type_list, reference_list):
      '''
        return a dict with the model url as key and a list of reference 
        as value. Normaly, a Reference appear only one time in the final output
      '''
      # handle the case where just one model is given
      if type(model_list) != type([]):
        model_list = [model_list,]

      for model in model_list:
109 110
        model_reference_list=model.getReferenceDict(portal_type_list)
        id_list = []
111

112
        for reference in model_reference_list.keys():
113 114
          if reference not in reference_list:
            reference_list.append(reference)
115
            id_list.append(model_reference_list[reference])
116

117 118
        if id_list != []:
          model_reference_dict[model.getRelativeUrl()]=id_list
119 120

        new_model_list = model.getSpecialiseValueList()
121
        self.getInheritanceModelReferenceDict(\
122 123 124 125 126
            model_reference_dict=model_reference_dict,
            model_list=new_model_list,
            portal_type_list=portal_type_list,
            reference_list=reference_list,)
      return model_reference_dict