diff --git a/product/ERP5/Document/PaySheetTransaction.py b/product/ERP5/Document/PaySheetTransaction.py index 036bdbdeb959e0d4b50baf56dae3871ac09e4a7a..5790089849aee6be0135f022317129941d020ace 100644 --- a/product/ERP5/Document/PaySheetTransaction.py +++ b/product/ERP5/Document/PaySheetTransaction.py @@ -29,6 +29,7 @@ from AccessControl import ClassSecurityInfo from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface from Products.ERP5.Document.Invoice import Invoice +from Products.ERP5Type.Utils import cartesianProduct from zLOG import LOG class PaySheetTransaction(Invoice): @@ -128,11 +129,11 @@ class PaySheetTransaction(Invoice): portal_type = 'Pay Sheet Line', title = title, description = description, + destination = self.getSourceSection(), source_section = \ self.getPortalObject().restrictedTraverse(res).getSource(), resource = res, destination_section = self.getDestinationSection(), - destination = self.getDestinationSection(), variation_base_category_list = ('tax_category', 'salary_range'), variation_category_list = var_cat_list, base_amount_list = base_amount_list, @@ -243,8 +244,8 @@ class PaySheetTransaction(Invoice): # in this dictionary will be saved the current amount corresponding to # the tuple (tax_category, base_amount) : - # current_amount = base_amount_current_value_dict[base_amount] - base_amount_current_value_dict = {} + # current_amount = base_amount_dict[base_amount][share] + base_amount_dict = {} def sortByIntIndex(a, b): return cmp(a.getIntIndex(), @@ -269,19 +270,23 @@ class PaySheetTransaction(Invoice): for paysheetcell in paysheetcell_list: tax_category = paysheetcell.getTaxCategory(base=1) if tax_category and paysheetcell.getQuantity(): - if base_amount_current_value_dict.has_key(base_amount): - old_val = base_amount_current_value_dict[base_amount] + if base_amount_dict.has_key(base_amount) and \ + base_amount_dict[base_amount].has_key(tax_category): + old_val = base_amount_dict[base_amount][tax_category] else: old_val = 0 new_val = old_val + paysheetcell.getQuantity() + if not base_amount_dict.has_key(base_amount): + base_amount_dict[base_amount]={} # increment the corresponding amount - base_amount_current_value_dict[base_amount] = new_val + base_amount_dict[base_amount][tax_category] = new_val # get not editables model lines model = self.getSpecialiseValue() model_line_list = model.contentValues(portal_type='Pay Sheet Model Line', sort_on='int_index') - model_line_list = [line for line in model_line_list if not line.getEditable()] + model_line_list = [line for line in model_line_list \ + if not line.getEditable()] pay_sheet_line_list = [] @@ -305,85 +310,112 @@ class PaySheetTransaction(Invoice): # description is used else: desc = ''.join(service.getDescription()) - - variation_share_list = model_line.getVariationCategoryList(\ - base_category_list=['tax_category',]) - variation_slice_list = model_line.getVariationCategoryList(\ - base_category_list=['salary_range',]) - - for slice in variation_slice_list: - for share in variation_share_list: - cell = model_line.getCell(slice, share) - if cell is None: - LOG('createNotEditablePaySheetLineList : cell is None') - continue - # get the slice : - model_slice = model_line.getParentValue().getCell(slice) - quantity = 0.0 - price = 0.0 - if model_slice is None: - LOG('createNotEditablePaySheetLineList : model_slice %s is None' %\ - slice) - continue + + + + base_category_list = model_line.getVariationBaseCategoryList() + list_of_list = [] + for base_cat in base_category_list: + list = model_line.getVariationCategoryList(base_category_list=base_cat) + list_of_list.append(list) + cartesian_product = cartesianProduct(list_of_list) + + slice = None + indice = 0 + for tuple in cartesian_product: + indice += 1 + cell = model_line.getCell(*tuple) + if cell is None: + continue + + tuple_dict = {} + for item in tuple: + # the dict key is the base category and value is the category path + tuple_dict[item.split('/')[0]] = \ + self.portal_categories.restrictedTraverse(item).getTitle() + tuple_dict[item.split('/')[0]+'_relative_url']=item + + #get the slice + if tuple_dict.has_key('salary_range'): + slice = tuple_dict['salary_range_relative_url'] + + #get the share + if tuple_dict.has_key('tax_category'): + share = tuple_dict['tax_category_relative_url'] + + # get the slice : + model_slice = model_line.getParentValue().getCell(slice) + quantity = 0.0 + price = 0.0 + model_slice_min = 0 + model_slice_max = 0 + if model_slice is None: + LOG('createNotEditablePaySheetLineList :', 0, 'model_slice %s is None' + % slice) + else: model_slice_min = model_slice.getQuantityRangeMin() model_slice_max = model_slice.getQuantityRangeMax() - ###################### - # calculation part : # - ###################### - - # get script in this order - # 1 - model_line script - # 2 - model script - # 3 - get the default calculation script - - # get the model line script - script_name = model_line.getCalculationScriptId() - if script_name is None: - # if model line script is None, get the default model script - script_name = model.getDefaultCalculationScriptId() - - if script_name is None: - # if no calculation script found, use a default script : - script_name = 'PaySheetTransaction_defaultCalculationScript' - - if getattr(self, script_name, None) is None: - raise ValueError, "Unable to find `%s` calculation script" % \ - script_name - calculation_script = getattr(self, script_name, None) - quantity=0 - price=0 - #LOG('script_name :', 0, script_name) - result = calculation_script(\ - base_amount_current_value_dict=base_amount_current_value_dict, - model_slice_min=model_slice_min, - model_slice_max=model_slice_max, - cell=cell,) - - quantity = result['quantity'] - price = result['price'] - - # Cell creation : - # Define an empty new cell - new_cell = { 'axe_list' : [share, slice], - 'quantity' : quantity, - 'price' : price, - } - cell_list.append(new_cell) - - # update base participation + ###################### + # calculation part : # + ###################### + + # get script in this order + # 1 - model_line script + # 2 - model script + # 3 - get the default calculation script + + # get the model line script + script_name = model_line.getCalculationScriptId() + if script_name is None: + # if model line script is None, get the default model script + script_name = model.getDefaultCalculationScriptId() + + if script_name is None: + # if no calculation script found, use a default script : + script_name = 'PaySheetTransaction_defaultCalculationScript' + + if getattr(self, script_name, None) is None: + raise ValueError, "Unable to find `%s` calculation script" % \ + script_name + calculation_script = getattr(self, script_name, None) + quantity=0 + price=0 + #LOG('script_name :', 0, script_name) + result = calculation_script(\ + base_amount_dict=base_amount_dict, + model_slice_min=model_slice_min, + model_slice_max=model_slice_max, + cell=cell,) + + quantity = result['quantity'] + price = result['price'] + + # Cell creation : + # Define an empty new cell + new_cell = { 'axe_list' : tuple, # share, slice + 'quantity' : quantity, + 'price' : price, + } + cell_list.append(new_cell) + + + base_participation_list = service.getBaseAmountList(base=1) for base_participation in base_participation_list: if quantity: - if base_amount_current_value_dict.has_key(base_participation): - old_val = base_amount_current_value_dict[base_participation] + if base_amount_dict.has_key(base_participation) and \ + base_amount_dict[base_participation].has_key(share): + old_val = base_amount_dict[base_participation][share] else: old_val = 0 new_val = old_val + quantity + if not base_amount_dict.has_key(base_participation): + base_amount_dict[base_participation]={} if price: new_val = round((old_val + quantity*price), precision) - base_amount_current_value_dict[base_participation] = new_val + base_amount_dict[base_participation][share] = new_val if cell_list: # create the PaySheetLine