在 OpenERP HR 费用模块中,我们需要一些自定义,我添加了两个字段,一个是从公司(x_adv)和到期金额(x_dueamt)中提取的预付款。我们的要求是计算到期金额(total_amount - x_adv)。我应该在哪里和什么地方写代码。
例如,员工 A 从公司预支项目 X 500 卢比,但他的总费用为 1000 卢比。现在我们要自动计算到期金额 500 INR(x_dueamt 是只读的)。
请帮助我们....提前谢谢...
在 OpenERP HR 费用模块中,我们需要一些自定义,我添加了两个字段,一个是从公司(x_adv)和到期金额(x_dueamt)中提取的预付款。我们的要求是计算到期金额(total_amount - x_adv)。我应该在哪里和什么地方写代码。
例如,员工 A 从公司预支项目 X 500 卢比,但他的总费用为 1000 卢比。现在我们要自动计算到期金额 500 INR(x_dueamt 是只读的)。
请帮助我们....提前谢谢...
您可以通过两种方式实现这一点:
advance taken from company
(1) 您可以在&上编写 on_change 方法,Total expense
因此当这两个字段有任何变化时,您可以计算金额并返回您为某个due amount
字段计算的值。
这是一个例子,
<field name="x_adv" on_change="onchange_amount(x_adv,total_expense)"/> <field name="total_expense" on_change="onchange_amount(x_adv,total_expense)"/> <field name="due_amount"/>
x_adv
在您的 .py 文件中写入 onchange_amount 函数,当&发生任何变化时,将调用此函数total_expense
。
def onchange_amount(self, cr, uid, ids, x_adv, total_amount, context={}):
// Your calculation
value = {'due_amount': calculate_value}
return {'value': value}
这可以正常工作,但如果结果字段(此处为 due_amount)是只读的,它将不会显示在客户端和数据库中。所以有第二种方法可以解决你的问题。
(2) 将due_amount设为场函数。
def _calculate_due_amount(self, cr, uid, ids, field_name, arg, context=None): res = {} if context is None: context = {} for current_ids in self.browse(cr, uid, ids, context=context)[0] // Your calculation res[current_ids] = calculated_amount return res 'due_amount': fields.function(_calculate_due_amount, string='Due Amount', help="Due amount of employee.", store={ 'your_object': (lambda self, cr, uid, ids, c={}: ids, ['x_adv', 'total_expense'], 10) }),
这是解决您的问题的最合适的方法之一。通过函数字段,您可以将值存储在数据库中,也可以将字段设为只读。希望这对你有用。