diff --git a/addons/hr_timesheet/models/hr_timesheet.py b/addons/hr_timesheet/models/hr_timesheet.py index 85d5973f751..4a54dea4f3f 100644 --- a/addons/hr_timesheet/models/hr_timesheet.py +++ b/addons/hr_timesheet/models/hr_timesheet.py @@ -121,16 +121,19 @@ class AccountAnalyticLine(models.Model): # Although this make a second loop on the vals, we need to wait the preprocess as it could change the company_id in the vals # TODO To be refactored in master - company_ids_in_vals = list({vals['company_id'] for vals in vals_list if vals.get('company_id', False)}) - employees = self.env['hr.employee'].with_context(active_test=False).search([('user_id', 'in', user_ids), ('company_id', 'in', [self.env.company.id] + company_ids_in_vals)]) - user_map = defaultdict(dict) + employees = self.env['hr.employee'].sudo().with_context(active_test=False).search([('user_id', 'in', user_ids)]) + employee_for_user_company = defaultdict(dict) for employee in employees: - user_map[employee.company_id.id][employee.user_id.id] = employee.id + employee_for_user_company[employee.user_id.id][employee.company_id.id] = employee.id for vals in vals_list: # compute employee only for timesheet lines, makes no sense for other lines if not vals.get('employee_id') and vals.get('project_id'): - vals['employee_id'] = user_map[vals.get('company_id', self.env.company.id)].get(vals.get('user_id', default_user_id), False) + employee_for_company = employee_for_user_company.get(vals.get('user_id', default_user_id), False) + if not employee_for_company: + continue + company_id = list(employee_for_company)[0] if len(employee_for_company) == 1 else vals.get('company_id', self.env.company.id) + vals['employee_id'] = employee_for_company.get(company_id, False) lines = super(AccountAnalyticLine, self).create(vals_list) for line, values in zip(lines, vals_list): diff --git a/addons/hr_timesheet/tests/test_timesheet.py b/addons/hr_timesheet/tests/test_timesheet.py index 3b4e7cb23ed..a3e3889aa1e 100644 --- a/addons/hr_timesheet/tests/test_timesheet.py +++ b/addons/hr_timesheet/tests/test_timesheet.py @@ -349,3 +349,48 @@ class TestTimesheet(TestCommonTimesheet): }) self.assertEqual(timesheet.project_id, second_project, 'The project_id of timesheet should be second_project') + + def test_create_timesheet_employee_not_in_company(self): + ''' ts.employee_id only if the user has an employee in the company or one employee for all companies. + ''' + company_2 = self.env['res.company'].create({'name': 'Company 2'}) + company_3 = self.env['res.company'].create({'name': 'Company 3'}) + + analytic_account = self.env['account.analytic.account'].create({ + 'name': 'Aa Aa', + 'company_id': company_3.id, + }) + project = self.env['project.project'].create({ + 'name': 'Aa Project', + 'company_id': company_3.id, + 'analytic_account_id': analytic_account.id, + }) + task = self.env['project.task'].create({ + 'name': 'Aa Task', + 'project_id': project.id, + }) + + Timesheet = self.env['account.analytic.line'].with_context(allowed_company_ids=[company_3.id, company_2.id, self.env.company.id]) + timesheet = Timesheet.create({ + 'name': 'Timesheet', + 'project_id': project.id, + 'task_id': task.id, + 'unit_amount': 2, + 'user_id': self.user_manager.id, + 'company_id': company_3.id, + }) + self.assertEqual(timesheet.employee_id, self.user_manager.employee_id, 'As there is a unique employee for this user, it must be found') + + self.env['hr.employee'].with_company(company_2).create({ + 'name': 'Employee 2', + 'user_id': self.user_manager.id, + }) + timesheet = Timesheet.create({ + 'name': 'Timesheet', + 'project_id': project.id, + 'task_id': task.id, + 'unit_amount': 2, + 'user_id': self.user_manager.id, + 'company_id': company_3.id, + }) + self.assertFalse(timesheet.employee_id, 'As there are several employees for this user, but none of them in this company, none must be found')