diff --git a/hr_expense_change_analytic/__init__.py b/hr_expense_change_analytic/__init__.py new file mode 100644 index 00000000..40272379 --- /dev/null +++ b/hr_expense_change_analytic/__init__.py @@ -0,0 +1 @@ +from . import wizard diff --git a/hr_expense_change_analytic/__manifest__.py b/hr_expense_change_analytic/__manifest__.py new file mode 100644 index 00000000..7eea3391 --- /dev/null +++ b/hr_expense_change_analytic/__manifest__.py @@ -0,0 +1,23 @@ +{ + 'name': 'HR Expense Change - Analytic', + 'author': 'Hibou Corp. ', + 'version': '11.0.1.0.0', + 'category': 'Employees', + 'sequence': 96, + 'summary': 'Change Analytic Account on Expense.', + 'description': """ +Adds fields and functionality to change the analytic account on expense +and subsequent documents. + + """, + 'website': 'https://hibou.io/', + 'depends': [ + 'hr_expense_change', + 'analytic', + ], + 'data': [ + 'wizard/expense_change_views.xml', + ], + 'installable': True, + 'application': False, +} diff --git a/hr_expense_change_analytic/tests/__init__.py b/hr_expense_change_analytic/tests/__init__.py new file mode 100644 index 00000000..431d3587 --- /dev/null +++ b/hr_expense_change_analytic/tests/__init__.py @@ -0,0 +1 @@ +from . import test_expense_change diff --git a/hr_expense_change_analytic/tests/test_expense_change.py b/hr_expense_change_analytic/tests/test_expense_change.py new file mode 100644 index 00000000..a7923f45 --- /dev/null +++ b/hr_expense_change_analytic/tests/test_expense_change.py @@ -0,0 +1,33 @@ +from odoo.addons.hr_expense_change.tests.test_expense_change import TestExpenseChange + + +class TestWizard(TestExpenseChange): + def test_expense_change_basic(self): + self.analytic_account = self.env['account.analytic.account'].create({ + 'name': 'test account', + }) + self.analytic_account2 = self.env['account.analytic.account'].create({ + 'name': 'test account2', + }) + + self.expense.expense_line_ids.write({'analytic_account_id': False}) + + super(TestWizard, self).test_expense_change_basic() + + # Tests Adding an Analytic Account + self.assertFalse(self.expense.expense_line_ids.analytic_account_id) + ctx = {'active_model': 'hr.expense', 'active_ids': self.expense.expense_line_ids.ids} + change = self.env['hr.expense.change'].with_context(ctx).create({}) + change.analytic_account_id = self.analytic_account + change.affect_change() + self.assertEqual(self.expense.expense_line_ids.analytic_account_id, self.analytic_account) + + # Tests Changing + change.analytic_account_id = self.analytic_account2 + change.affect_change() + self.assertEqual(self.expense.expense_line_ids.analytic_account_id, self.analytic_account2) + + # Tests Removing + change.analytic_account_id = False + change.affect_change() + self.assertFalse(self.expense.expense_line_ids.analytic_account_id) diff --git a/hr_expense_change_analytic/wizard/__init__.py b/hr_expense_change_analytic/wizard/__init__.py new file mode 100644 index 00000000..2d905886 --- /dev/null +++ b/hr_expense_change_analytic/wizard/__init__.py @@ -0,0 +1 @@ +from . import expense_change \ No newline at end of file diff --git a/hr_expense_change_analytic/wizard/expense_change.py b/hr_expense_change_analytic/wizard/expense_change.py new file mode 100644 index 00000000..d4463043 --- /dev/null +++ b/hr_expense_change_analytic/wizard/expense_change.py @@ -0,0 +1,57 @@ +from odoo import api, fields, models, _ + + +class ExpenseChangeWizard(models.TransientModel): + _inherit = 'hr.expense.change' + + analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account') + analytic_account_warning = fields.Char(string='Analytic Account Warning', compute='_compute_analytic_warning') + + @api.model + def default_get(self, fields): + rec = super(ExpenseChangeWizard, self).default_get(fields) + expense = self.env['hr.expense'].browse(rec['expense_id']) + rec.update({ + 'analytic_account_id': expense.analytic_account_id.id, + }) + return rec + + @api.onchange('expense_id', 'analytic_account_id') + @api.multi + def _compute_analytic_warning(self): + self.ensure_one() + expenses = self._find_expenses_to_write_analytic(self.expense_id.analytic_account_id.id) + if len(expenses) <= 1: + self.analytic_account_warning = '' + else: + other_expenses = expenses - self.expense_id + self.analytic_account_warning = '%d other expenses will be changed. (%s)' % \ + (len(other_expenses), ', '.join(other_expenses.mapped('name'))) + + + + @api.multi + def affect_change(self): + old_analytic_id = self.expense_id.analytic_account_id.id + res = super(ExpenseChangeWizard, self).affect_change() + self._affect_analytic_change(old_analytic_id) + return res + + def _find_expenses_to_write_analytic(self, old_analytic_id): + if self.analytic_account_id.id == old_analytic_id: + return [] + # Essentially, if you have a move, you must write all related expenses and lines. + if not self.expense_id.sheet_id.account_move_id: + return self.expense_id + return self.expense_id.sheet_id.expense_line_ids\ + .filtered(lambda l: l.analytic_account_id.id == old_analytic_id) + + def _affect_analytic_change(self, old_analytic_id): + expenses_to_affect = self._find_expenses_to_write_analytic(old_analytic_id) + if expenses_to_affect: + expenses_to_affect.write({'analytic_account_id': self.analytic_account_id.id}) + + lines_to_affect = self.expense_id.sheet_id.account_move_id \ + .line_ids.filtered(lambda l: l.analytic_account_id.id == old_analytic_id and l.debit) + lines_to_affect.write({'analytic_account_id': self.analytic_account_id.id}) + lines_to_affect.create_analytic_lines() diff --git a/hr_expense_change_analytic/wizard/expense_change_views.xml b/hr_expense_change_analytic/wizard/expense_change_views.xml new file mode 100644 index 00000000..06d9749a --- /dev/null +++ b/hr_expense_change_analytic/wizard/expense_change_views.xml @@ -0,0 +1,14 @@ + + + + hr.expense.change.form.inherit + hr.expense.change + + + + + + + + + \ No newline at end of file