mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
[MIG] hr_payroll_commission: Backport to Odoo 12.0
Additionally, improved tests in `hr_commission` due to payroll installing a contract.
This commit is contained in:
@@ -5,6 +5,11 @@ from odoo.tests import common
|
||||
|
||||
class TestCommission(common.TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.user = self.browse_ref('base.user_demo')
|
||||
self.employee = self.browse_ref('hr.employee_qdp') # This is the employee associated with above user.
|
||||
|
||||
def _createUser(self):
|
||||
return self.env['res.users'].create({
|
||||
'name': 'Coach',
|
||||
@@ -23,6 +28,12 @@ class TestCommission(common.TransactionCase):
|
||||
})
|
||||
|
||||
def _createContract(self, employee, commission_rate, admin_commission_rate=0.0):
|
||||
other_contracts = self.env['hr.contract'].search([('employee_id', '=', employee.id)])
|
||||
if other_contracts:
|
||||
# couldn't get the demo contract to not be used if it is
|
||||
# installed e.g. by payroll...
|
||||
# tried, state->cancel + employee.invalidate_cache() etc.
|
||||
other_contracts.unlink()
|
||||
return self.env['hr.contract'].create({
|
||||
'date_start': '2016-01-01',
|
||||
'date_end': '2030-12-31',
|
||||
@@ -47,8 +58,8 @@ class TestCommission(common.TransactionCase):
|
||||
|
||||
coach = self._createEmployee(self.browse_ref('base.user_root'))
|
||||
coach_contract = self._createContract(coach, 12.0, admin_commission_rate=2.0)
|
||||
user = self.browse_ref('base.user_demo')
|
||||
emp = self.browse_ref('hr.employee_qdp') # This is the employee associated with above user.
|
||||
user = self.user
|
||||
emp = self.employee
|
||||
emp.address_home_id = user.partner_id # Important field for payables.
|
||||
emp.coach_id = coach
|
||||
|
||||
@@ -62,9 +73,12 @@ class TestCommission(common.TransactionCase):
|
||||
inv.action_invoice_open() # validate
|
||||
self.assertEqual(inv.state, 'open')
|
||||
self.assertTrue(inv.commission_ids, 'Commissions not created when invoice is validated.')
|
||||
self.assertTrue(inv.amount_for_commission())
|
||||
|
||||
user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == emp.id)
|
||||
self.assertEqual(len(user_commission), 1, 'Incorrect commission count %d (expect 1)' % len(user_commission))
|
||||
self.assertTrue(user_commission.rate)
|
||||
self.assertTrue(user_commission.amount)
|
||||
self.assertEqual(user_commission.state, 'draft', 'Commission is not draft.')
|
||||
self.assertFalse(user_commission.move_id, 'Commission has existing journal entry.')
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{
|
||||
'name': 'Commissions in Payslips',
|
||||
'author': 'Hibou Corp.',
|
||||
'version': '13.0.1.0.0',
|
||||
'version': '12.0.1.0.0',
|
||||
'license': 'OPL-1',
|
||||
'category': 'Accounting/Commissions',
|
||||
'sequence': 95,
|
||||
@@ -18,7 +18,6 @@ Reimburse Commissions in Payslips
|
||||
'data': [
|
||||
'views/hr_commission_views.xml',
|
||||
'views/hr_payslip_views.xml',
|
||||
'data/hr_payroll_commission_data.xml',
|
||||
],
|
||||
'demo': [
|
||||
'data/hr_payroll_commission_demo.xml',
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<!-- Salary Other Input -->
|
||||
<record id="commission_other_input" model="hr.payslip.input.type">
|
||||
<field name="name">Commissions</field>
|
||||
<field name="code">COMMISSION</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
@@ -13,8 +13,11 @@ result = inputs.COMMISSION.amount if inputs.COMMISSION else 0
|
||||
<field name="code">COMMISSION</field>
|
||||
<field name="category_id" ref="hr_payroll.BASIC"/>
|
||||
<field name="name">Commissions</field>
|
||||
<field name="sequence" eval="190"/>
|
||||
<field name="struct_id" ref="hr_payroll.structure_002"/>
|
||||
<field name="sequence" eval="90"/>
|
||||
</record>
|
||||
|
||||
<record id="hr_payroll.structure_base" model="hr.payroll.structure">
|
||||
<field eval="[(4, ref('hr_salary_rule_commission'), 0)]" name="rule_ids"/>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -23,10 +23,10 @@ class HrPayslip(models.Model):
|
||||
if not self.input_line_ids.filtered(lambda line: line.input_type_id == commission_type):
|
||||
self.commission_payment_ids.write({'payslip_id': False})
|
||||
|
||||
@api.onchange('employee_id', 'struct_id', 'contract_id', 'date_from', 'date_to')
|
||||
def _onchange_employee(self):
|
||||
res = super()._onchange_employee()
|
||||
if self.state == 'draft':
|
||||
@api.onchange('employee_id', 'date_from', 'date_to', 'contract_id')
|
||||
def onchange_employee(self):
|
||||
res = super().onchange_employee()
|
||||
if self.state == 'draft' and self.contract_id:
|
||||
self.commission_payment_ids = self.env['hr.commission.payment'].search([
|
||||
('employee_id', '=', self.employee_id.id),
|
||||
('pay_in_payslip', '=', True),
|
||||
@@ -36,19 +36,19 @@ class HrPayslip(models.Model):
|
||||
|
||||
@api.onchange('commission_payment_ids')
|
||||
def _onchange_commission_payment_ids(self):
|
||||
commission_type = self.env.ref('hr_payroll_commission.commission_other_input', raise_if_not_found=False)
|
||||
if not commission_type:
|
||||
return
|
||||
commission_code = 'COMMISSION'
|
||||
|
||||
total = sum(self.commission_payment_ids.mapped('commission_amount'))
|
||||
if not total:
|
||||
return
|
||||
|
||||
lines_to_keep = self.input_line_ids.filtered(lambda x: x.input_type_id != commission_type)
|
||||
lines_to_keep = self.input_line_ids.filtered(lambda x: x.code != commission_code)
|
||||
input_lines_vals = [(5, 0, 0)] + [(4, line.id, False) for line in lines_to_keep]
|
||||
input_lines_vals.append((0, 0, {
|
||||
'amount': total,
|
||||
'input_type_id': commission_type.id,
|
||||
'name': 'Commissions',
|
||||
'code': commission_code,
|
||||
'contract_id': self.contract_id.id,
|
||||
}))
|
||||
self.update({'input_line_ids': input_lines_vals})
|
||||
|
||||
|
||||
@@ -9,14 +9,14 @@ class TestCommissionPayslip(test_commission.TestCommission):
|
||||
|
||||
def test_commission(self):
|
||||
super().test_commission()
|
||||
commission_type = self.env.ref('hr_payroll_commission.commission_other_input')
|
||||
commission_code = 'COMMISSION'
|
||||
payslip = self.env['hr.payslip'].create({
|
||||
'name': 'test slip',
|
||||
'employee_id': self.employee.id,
|
||||
'date_from': date.today() - timedelta(days=1),
|
||||
'date_to': date.today() + timedelta(days=14),
|
||||
})
|
||||
payslip._onchange_employee()
|
||||
payslip.onchange_employee()
|
||||
self.assertFalse(payslip.commission_payment_ids)
|
||||
|
||||
# find unpaid commission payments from super().test_commission()
|
||||
@@ -28,10 +28,10 @@ class TestCommissionPayslip(test_commission.TestCommission):
|
||||
# press the button to pay it via payroll
|
||||
commission_payments.action_report_in_next_payslip()
|
||||
|
||||
payslip._onchange_employee()
|
||||
payslip.onchange_employee()
|
||||
# has attached commission payments
|
||||
self.assertTrue(payslip.commission_payment_ids)
|
||||
commission_input_lines = payslip.input_line_ids.filtered(lambda l: l.input_type_id == commission_type)
|
||||
commission_input_lines = payslip.input_line_ids.filtered(lambda l: l.code == commission_code)
|
||||
self.assertTrue(commission_input_lines)
|
||||
self.assertEqual(sum(commission_input_lines.mapped('amount')),
|
||||
sum(commission_payments.mapped('commission_amount')))
|
||||
|
||||
Reference in New Issue
Block a user