From b033244f999dcf18d5e3d5d8fe5ec23ee64a6dda Mon Sep 17 00:00:00 2001 From: "Nasreddin (bon)" Date: Thu, 2 Apr 2020 11:15:24 +0000 Subject: [PATCH] [FIX] hr_expense: Fix accounting fields edition + add test This fix will complete the task 1965890 by allowing the user with access rights to edit fields (reference, account_id, taxes_ids & analytic_account_id) depending the sheet state. Also added Tests to check if access rights on expense lines are working well depending on the expense.sheet.state and the user group. Task ID 2226352 closes odoo/odoo#53862 X-original-commit: f42c812916a50438078210c020f6144c7417d365 Signed-off-by: Yannick Tivisse (yti) Signed-off-by: bon-odoo --- addons/hr_expense/models/hr_expense.py | 2 +- addons/hr_expense/tests/test_expenses.py | 101 +++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index 57a7ca6fa7e..1e2b3835a7d 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -751,7 +751,7 @@ class HrExpenseSheet(models.Model): return self.env['account.journal'].search([('type', 'in', ['cash', 'bank']), ('company_id', '=', default_company_id)], limit=1) name = fields.Char('Expense Report Summary', required=True, tracking=True) - expense_line_ids = fields.One2many('hr.expense', 'sheet_id', string='Expense Lines', states={'approve': [('readonly', True)], 'done': [('readonly', True)], 'post': [('readonly', True)]}, copy=False) + expense_line_ids = fields.One2many('hr.expense', 'sheet_id', string='Expense Lines', copy=False) state = fields.Selection([ ('draft', 'Draft'), ('submit', 'Submitted'), diff --git a/addons/hr_expense/tests/test_expenses.py b/addons/hr_expense/tests/test_expenses.py index 657626cbf7e..0e12df38cfb 100644 --- a/addons/hr_expense/tests/test_expenses.py +++ b/addons/hr_expense/tests/test_expenses.py @@ -366,3 +366,104 @@ class TestExpenseRights(TestExpenseCommon): with self.assertRaises(AccessError): sheet_3.with_user(self.user_officer).refuse_sheet('') sheet_3.with_user(self.user_manager).refuse_sheet('') + + +class TestExpenseLinesRights(TestExpenseCommon): + + def setUp(self): + super(TestExpenseLinesRights, self).setUp() + + self.setUpAdditionalAccounts() + + self.product_expense = self.env['product.product'].create({ + 'name': "Delivered at cost", + 'standard_price': 700, + 'list_price': 700, + 'type': 'consu', + 'supplier_taxes_id': [(6, 0, [self.tax.id])], + 'default_code': 'CONSU-DELI-COST', + 'taxes_id': False, + 'property_account_expense_id': self.account_expense.id, + }) + + self.user_manager.write({ + 'groups_id': [(4, self.env.ref('account.group_account_user').id)], + }) + + def test_expense_lines_rights(self): + expense = self.env['hr.expense.sheet'].with_user(self.user_employee).create({ + 'name': 'Expense for John Smith', + 'employee_id': self.employee.id, + }) + expense_line = self.env['hr.expense'].with_user(self.user_employee).create({ + 'name': 'Car Travel Expenses', + 'employee_id': self.employee.id, + 'product_id': self.product_expense.id, + 'unit_amount': 700.00, + 'tax_ids': [(6, 0, [self.tax.id])], + 'sheet_id': expense.id, + 'analytic_account_id': self.analytic_account.id, + }) + expense.with_user(self.user_employee).action_submit_sheet() + + # STATE APPROVE + + expense.with_user(self.user_manager).approve_expense_sheets() + # Test User without Accountant Rights + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'reference': 'Test Reference'}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'tax_ids': [(6, 0, [self.tax.id])]}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'account_id': self.account_expense.id}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'analytic_account_id': self.analytic_account.id}) + # Test User with Accountant Rights + expense_line.with_user(self.user_manager).write({'reference': 'Test Reference'}) + expense_line.with_user(self.user_manager).write({'tax_ids': [(6, 0, [self.tax.id])]}) + expense_line.with_user(self.user_manager).write({'account_id': self.account_expense.id}) + expense_line.with_user(self.user_manager).write({'analytic_account_id': self.analytic_account.id}) + expense_line.invalidate_cache() + + # STATE POST + + expense.with_user(self.env.user).action_sheet_move_create() + # Test User without Accountant Rights + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'reference': 'Test Reference'}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'tax_ids': [(6, 0, [self.tax.id])]}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'account_id': self.account_expense.id}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'analytic_account_id': self.analytic_account.id}) + # Test User with Accountant Rights + expense_line.with_user(self.user_manager).write({'reference': 'Test Reference'}) + expense_line.invalidate_cache() + with self.assertRaises(UserError): + expense_line.with_user(self.user_manager).write({'tax_ids': [(6, 0, [self.tax.id])]}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_manager).write({'account_id': self.account_expense.id}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_manager).write({'analytic_account_id': self.analytic_account.id}) + + # STATE DONE + + expense.set_to_paid() + # Test User without Accountant Rights + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'reference': 'Test Reference'}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'tax_ids': [(6, 0, [self.tax.id])]}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'account_id': self.account_expense.id}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_employee).write({'analytic_account_id': self.analytic_account.id}) + # Test User with Accountant Rights + expense_line.with_user(self.user_manager).write({'reference': 'Test Reference'}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_manager).write({'tax_ids': [(6, 0, [self.tax.id])]}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_manager).write({'account_id': self.account_expense.id}) + with self.assertRaises(UserError): + expense_line.with_user(self.user_manager).write({'analytic_account_id': self.analytic_account.id})