From 1e26b62126538ff371b3712e5aad35eeae54fdb2 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Thu, 22 Nov 2018 12:30:00 -0800 Subject: [PATCH] Initial commit of `hr_expense_change` for 11.0 --- hr_expense_change/__init__.py | 1 + hr_expense_change/__manifest__.py | 30 +++++++++ hr_expense_change/tests/__init__.py | 1 + .../tests/test_expense_change.py | 20 ++++++ hr_expense_change/wizard/__init__.py | 1 + hr_expense_change/wizard/expense_change.py | 55 ++++++++++++++++ .../wizard/expense_change_views.xml | 66 +++++++++++++++++++ 7 files changed, 174 insertions(+) create mode 100644 hr_expense_change/__init__.py create mode 100644 hr_expense_change/__manifest__.py create mode 100644 hr_expense_change/tests/__init__.py create mode 100644 hr_expense_change/tests/test_expense_change.py create mode 100644 hr_expense_change/wizard/__init__.py create mode 100644 hr_expense_change/wizard/expense_change.py create mode 100644 hr_expense_change/wizard/expense_change_views.xml diff --git a/hr_expense_change/__init__.py b/hr_expense_change/__init__.py new file mode 100644 index 00000000..40272379 --- /dev/null +++ b/hr_expense_change/__init__.py @@ -0,0 +1 @@ +from . import wizard diff --git a/hr_expense_change/__manifest__.py b/hr_expense_change/__manifest__.py new file mode 100644 index 00000000..82f5e433 --- /dev/null +++ b/hr_expense_change/__manifest__.py @@ -0,0 +1,30 @@ +{ + 'name': 'HR Expense Change', + 'author': 'Hibou Corp. ', + 'version': '11.0.1.0.0', + 'category': 'Employees', + 'sequence': 95, + 'summary': 'Technical foundation for changing expenses.', + 'description': """ +Technical foundation for changing expenses. + +Creates wizard and permissions for making expense changes that can be +handled by other individual modules. + +This module implements, as examples, how to change the Date fields. + +Abstractly, individual 'changes' should come from specific 'fields' or capability +modules that handle the consequences of changing that field in whatever state the +the invoice is currently in. + + """, + 'website': 'https://hibou.io/', + 'depends': [ + 'hr_expense', + ], + 'data': [ + 'wizard/expense_change_views.xml', + ], + 'installable': True, + 'application': False, +} diff --git a/hr_expense_change/tests/__init__.py b/hr_expense_change/tests/__init__.py new file mode 100644 index 00000000..431d3587 --- /dev/null +++ b/hr_expense_change/tests/__init__.py @@ -0,0 +1 @@ +from . import test_expense_change diff --git a/hr_expense_change/tests/test_expense_change.py b/hr_expense_change/tests/test_expense_change.py new file mode 100644 index 00000000..7f39e2e8 --- /dev/null +++ b/hr_expense_change/tests/test_expense_change.py @@ -0,0 +1,20 @@ +from odoo.addons.hr_expense.tests.test_expenses import TestCheckJournalEntry + + +class TestExpenseChange(TestCheckJournalEntry): + + def test_expense_change_basic(self): + # posts expense and gets move ready at self.expense.account_move_id.id + self.test_journal_entry() + self.assertEqual(self.expense.expense_line_ids.date, self.expense.account_move_id.date) + + ctx = {'active_model': 'hr.expense', 'active_ids': self.expense.expense_line_ids.ids} + change = self.env['hr.expense.change'].with_context(ctx).create({}) + self.assertEqual(change.date, self.expense.expense_line_ids.date) + + change_date = '2018-01-01' + change.write({'date': change_date}) + + change.affect_change() + self.assertEqual(change_date, self.expense.expense_line_ids.date) + self.assertEqual(change_date, self.expense.account_move_id.date) diff --git a/hr_expense_change/wizard/__init__.py b/hr_expense_change/wizard/__init__.py new file mode 100644 index 00000000..72a7c8d3 --- /dev/null +++ b/hr_expense_change/wizard/__init__.py @@ -0,0 +1 @@ +from . import expense_change diff --git a/hr_expense_change/wizard/expense_change.py b/hr_expense_change/wizard/expense_change.py new file mode 100644 index 00000000..f2e21b20 --- /dev/null +++ b/hr_expense_change/wizard/expense_change.py @@ -0,0 +1,55 @@ +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class ExpenseChangeWizard(models.TransientModel): + _name = 'hr.expense.change' + _description = 'Expense Change' + + expense_id = fields.Many2one('hr.expense', string='Expense', readonly=True, required=True) + expense_company_id = fields.Many2one('res.company', related='expense_id.company_id') + date = fields.Date(string='Expense Date') + + @api.model + def default_get(self, fields): + rec = super(ExpenseChangeWizard, self).default_get(fields) + context = dict(self._context or {}) + active_model = context.get('active_model') + active_ids = context.get('active_ids') + + # Checks on context parameters + if not active_model or not active_ids: + raise UserError( + _("Programmation error: wizard action executed without active_model or active_ids in context.")) + if active_model != 'hr.expense': + raise UserError(_( + "Programmation error: the expected model for this action is 'hr.expense'. The provided one is '%d'.") % active_model) + + # Checks on received expense records + expense = self.env[active_model].browse(active_ids) + if len(expense) != 1: + raise UserError(_("Expense Change expects only one expense.")) + rec.update({ + 'expense_id': expense.id, + 'date': expense.date, + }) + return rec + + def _new_expense_vals(self): + vals = {} + if self.expense_id.date != self.date: + vals['date'] = self.date + return vals + + @api.multi + def affect_change(self): + self.ensure_one() + vals = self._new_expense_vals() + old_date = self.expense_id.date + if vals: + self.expense_id.write(vals) + if 'date' in vals and self.expense_id.sheet_id.account_move_id: + self.expense_id.sheet_id.account_move_id.write({'date': vals['date']}) + self.expense_id.sheet_id.account_move_id.line_ids\ + .filtered(lambda l: l.date_maturity == old_date).write({'date_maturity': vals['date']}) + return True diff --git a/hr_expense_change/wizard/expense_change_views.xml b/hr_expense_change/wizard/expense_change_views.xml new file mode 100644 index 00000000..00b68cae --- /dev/null +++ b/hr_expense_change/wizard/expense_change_views.xml @@ -0,0 +1,66 @@ + + + + + Expense Change + hr.expense.change + +
+ + + + + + + + +
+
+ +
+
+ + + Expense Change Wizard + ir.actions.act_window + hr.expense.change + form + form + new + + + + + hr.expense.form.inherit + hr.expense + + + +