From 5602ac13b7c7cb788fc250024d0a7cd8d500b195 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Thu, 5 Jan 2012 09:13:25 +0100 Subject: [PATCH] [IMP] hr_payroll: modified the payroll engine in order to return the rate separately. Added a float precision for payroll rate. Original ideas from Yannick Buron. bzr revid: qdp-launchpad@openerp.com-20120105081325-2pstk4naim07cy2o --- addons/hr_payroll/hr_payroll.py | 28 +++++++++++++++------------ addons/hr_payroll/hr_payroll_data.xml | 6 ++++++ addons/hr_payroll/hr_payroll_view.xml | 9 ++++++--- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/addons/hr_payroll/hr_payroll.py b/addons/hr_payroll/hr_payroll.py index ce84079cc11..9162a25d002 100644 --- a/addons/hr_payroll/hr_payroll.py +++ b/addons/hr_payroll/hr_payroll.py @@ -585,14 +585,15 @@ class hr_payslip(osv.osv): #check if the rule can be applied if obj_rule.satisfy_condition(cr, uid, rule.id, localdict, context=context) and rule.id not in blacklist: #compute the amount of the rule - amount, qty = obj_rule.compute_rule(cr, uid, rule.id, localdict, context=context) + amount, qty, rate = obj_rule.compute_rule(cr, uid, rule.id, localdict, context=context) #check if there is already a rule computed with that code previous_amount = rule.code in localdict and localdict[rule.code] or 0.0 #set/overwrite the amount computed for this rule in the localdict - localdict[rule.code] = amount * qty + tot_rule = amount * qty * rate / 100.0 + localdict[rule.code] = tot_rule rules[rule.code] = rule #sum the amount for its salary category - localdict = _sum_salary_rule_category(localdict, rule.category_id, (amount * qty) - previous_amount) + localdict = _sum_salary_rule_category(localdict, rule.category_id, tot_rule - previous_amount) #create/overwrite the rule in the temporary results result_dict[key] = { 'salary_rule_id': rule.id, @@ -616,6 +617,7 @@ class hr_payslip(osv.osv): 'amount': amount, 'employee_id': contract.employee_id.id, 'quantity': qty, + 'rate': rate, } else: #blacklist this rule and its children @@ -780,7 +782,7 @@ class hr_salary_rule(osv.osv): ('code','Python Code'), ],'Amount Type', select=True, required=True, help="The computation method for the rule amount."), 'amount_fix': fields.float('Fixed Amount', digits_compute=dp.get_precision('Payroll'),), - 'amount_percentage': fields.float('Percentage (%)', digits_compute=dp.get_precision('Payroll'), help='For example, enter 50.0 to apply a percentage of 50%'), + 'amount_percentage': fields.float('Percentage (%)', digits_compute=dp.get_precision('Payroll Rate'), help='For example, enter 50.0 to apply a percentage of 50%'), 'amount_python_compute':fields.text('Python Code'), 'amount_percentage_base':fields.char('Percentage based on',size=1024, required=False, readonly=False, help='result will be affected to a variable'), 'child_ids':fields.one2many('hr.salary.rule', 'parent_rule_id', 'Child Salary Rule'), @@ -846,26 +848,26 @@ result = rules.NET > categories.NET * 0.10''', #TODO should add some checks on the type of result (should be float) def compute_rule(self, cr, uid, rule_id, localdict, context=None): """ - @param rule_id: id of rule to compute - @param localdict: dictionary containing the environement in which to compute the rule - @return: returns the result of computation and the quantity as floats + :param rule_id: id of rule to compute + :param localdict: dictionary containing the environement in which to compute the rule + :return: returns a tuple build as the base/amount computed, the quantity and the rate + :rtype: (float, float, float) """ rule = self.browse(cr, uid, rule_id, context=context) if rule.amount_select == 'fix': try: - return rule.amount_fix, eval(rule.quantity, localdict) + return rule.amount_fix, eval(rule.quantity, localdict), 100.0 except: raise osv.except_osv(_('Error'), _('Wrong quantity defined for salary rule %s (%s)')% (rule.name, rule.code)) elif rule.amount_select == 'percentage': try: - amount = rule.amount_percentage * eval(rule.amount_percentage_base, localdict) / 100 - return amount, eval(rule.quantity, localdict) + return eval(rule.amount_percentage_base, localdict), eval(rule.quantity, localdict), rule.amount_percentage except: raise osv.except_osv(_('Error'), _('Wrong percentage base or quantity defined for salary rule %s (%s)')% (rule.name, rule.code)) else: try: eval(rule.amount_python_compute, localdict, mode='exec', nocopy=True) - return localdict['result'], 'result_qty' in localdict and localdict['result_qty'] or 1.0 + return localdict['result'], 'result_qty' in localdict and localdict['result_qty'] or 1.0, 'result_rate' in localdict and localdict['result_rate'] or 100.0 except: raise osv.except_osv(_('Error'), _('Wrong python code defined for salary rule %s (%s) ')% (rule.name, rule.code)) @@ -923,7 +925,7 @@ class hr_payslip_line(osv.osv): if not ids: return {} res = {} for line in self.browse(cr, uid, ids, context=context): - res[line.id] = float(line.quantity) * line.amount + res[line.id] = float(line.quantity) * line.amount * line.rate / 100 return res _columns = { @@ -931,6 +933,7 @@ class hr_payslip_line(osv.osv): 'salary_rule_id':fields.many2one('hr.salary.rule', 'Rule', required=True), 'employee_id':fields.many2one('hr.employee', 'Employee', required=True), 'contract_id':fields.many2one('hr.contract', 'Contract', required=True, select=True), + 'rate': fields.float('Rate (%)', digits_compute=dp.get_precision('Payroll Rate')), 'amount': fields.float('Amount', digits_compute=dp.get_precision('Payroll')), 'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Payroll')), 'total': fields.function(_calculate_total, method=True, type='float', string='Total', digits_compute=dp.get_precision('Payroll'),store=True ), @@ -938,6 +941,7 @@ class hr_payslip_line(osv.osv): _defaults = { 'quantity': 1.0, + 'rate': 100.0, } hr_payslip_line() diff --git a/addons/hr_payroll/hr_payroll_data.xml b/addons/hr_payroll/hr_payroll_data.xml index c752a2ca3a4..227fa2e9013 100644 --- a/addons/hr_payroll/hr_payroll_data.xml +++ b/addons/hr_payroll/hr_payroll_data.xml @@ -79,5 +79,11 @@ 2 + + Payroll Rate + 4 + + + diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml index 5f2e977f116..2cf7cb8c4c4 100644 --- a/addons/hr_payroll/hr_payroll_view.xml +++ b/addons/hr_payroll/hr_payroll_view.xml @@ -169,7 +169,8 @@ - + + @@ -319,7 +320,8 @@ - + + @@ -329,7 +331,8 @@ - + +