diff --git a/account_invoice_change_analytic/__init__.py b/account_invoice_change_analytic/__init__.py new file mode 100644 index 00000000..40272379 --- /dev/null +++ b/account_invoice_change_analytic/__init__.py @@ -0,0 +1 @@ +from . import wizard diff --git a/account_invoice_change_analytic/__manifest__.py b/account_invoice_change_analytic/__manifest__.py new file mode 100644 index 00000000..16f91a7d --- /dev/null +++ b/account_invoice_change_analytic/__manifest__.py @@ -0,0 +1,23 @@ +{ + 'name': 'Account Invoice Change - Analytic', + 'author': 'Hibou Corp. ', + 'version': '12.0.1.0.0', + 'category': 'Accounting', + 'sequence': 95, + 'summary': 'Change Analytic Account on Invoice.', + 'description': """ +Adds fields and functionality to change the analytic account on all invoice lines +and subsequent documents. + + """, + 'website': 'https://hibou.io/', + 'depends': [ + 'account_invoice_change', + 'analytic', + ], + 'data': [ + 'wizard/invoice_change_views.xml', + ], + 'installable': True, + 'application': False, +} diff --git a/account_invoice_change_analytic/tests/__init__.py b/account_invoice_change_analytic/tests/__init__.py new file mode 100644 index 00000000..defd2696 --- /dev/null +++ b/account_invoice_change_analytic/tests/__init__.py @@ -0,0 +1 @@ +from . import test_invoice_change diff --git a/account_invoice_change_analytic/tests/test_invoice_change.py b/account_invoice_change_analytic/tests/test_invoice_change.py new file mode 100644 index 00000000..49448435 --- /dev/null +++ b/account_invoice_change_analytic/tests/test_invoice_change.py @@ -0,0 +1,46 @@ +from odoo.addons.account_invoice_change.tests.test_invoice_change import TestInvoiceChange + + +class TestWizard(TestInvoiceChange): + def test_invoice_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', + }) + + super(TestWizard, self).test_invoice_change_basic() + # Tests Adding an Analytic Account + self.assertFalse(self.invoice_basic.invoice_line_ids.mapped('account_analytic_id')) + ctx = {'active_model': 'account.invoice', 'active_ids': [self.invoice_basic.id]} + change = self.env['account.invoice.change'].with_context(ctx).create({}) + change.analytic_account_id = self.analytic_account + change.affect_change() + self.assertTrue(self.invoice_basic.invoice_line_ids.mapped('account_analytic_id')) + self.assertEqual(self.invoice_basic.move_id.mapped('line_ids.analytic_account_id'), self.analytic_account) + + # Tests Removing Analytic Account + new_invoice = self.invoice_basic.copy() + new_invoice.invoice_line_ids.account_analytic_id = self.analytic_account + new_invoice.action_invoice_open() + self.assertEqual(new_invoice.state, 'open') + self.assertEqual(new_invoice.move_id.mapped('line_ids.analytic_account_id'), self.analytic_account) + ctx = {'active_model': 'account.invoice', 'active_ids': [new_invoice.id]} + change = self.env['account.invoice.change'].with_context(ctx).create({}) + change.analytic_account_id = False + change.affect_change() + self.assertFalse(new_invoice.invoice_line_ids.mapped('account_analytic_id')) + self.assertFalse(new_invoice.move_id.mapped('line_ids.analytic_account_id')) + + # Tests Changing Analytic Account + new_invoice = self.invoice_basic.copy() + new_invoice.invoice_line_ids.account_analytic_id = self.analytic_account + new_invoice.action_invoice_open() + self.assertEqual(new_invoice.state, 'open') + self.assertEqual(new_invoice.move_id.mapped('line_ids.analytic_account_id'), self.analytic_account) + ctx = {'active_model': 'account.invoice', 'active_ids': [new_invoice.id]} + change = self.env['account.invoice.change'].with_context(ctx).create({}) + change.analytic_account_id = self.analytic_account2 + change.affect_change() + self.assertEqual(new_invoice.move_id.mapped('line_ids.analytic_account_id'), self.analytic_account2) diff --git a/account_invoice_change_analytic/wizard/__init__.py b/account_invoice_change_analytic/wizard/__init__.py new file mode 100644 index 00000000..8ec5d6da --- /dev/null +++ b/account_invoice_change_analytic/wizard/__init__.py @@ -0,0 +1 @@ +from . import invoice_change \ No newline at end of file diff --git a/account_invoice_change_analytic/wizard/invoice_change.py b/account_invoice_change_analytic/wizard/invoice_change.py new file mode 100644 index 00000000..c2003f6f --- /dev/null +++ b/account_invoice_change_analytic/wizard/invoice_change.py @@ -0,0 +1,41 @@ +from odoo import api, fields, models, _ + + +class InvoiceChangeWizard(models.TransientModel): + _inherit = 'account.invoice.change' + + analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account') + + def _analytic_account_id(self, invoice): + analytics = invoice.invoice_line_ids.mapped('account_analytic_id') + if len(analytics): + return analytics[0].id + return False + + @api.model + def default_get(self, fields): + rec = super(InvoiceChangeWizard, self).default_get(fields) + invoice = self.env['account.invoice'].browse(rec['invoice_id']) + rec.update({ + 'analytic_account_id': self._analytic_account_id(invoice), + }) + return rec + + + @api.multi + def affect_change(self): + old_analytic_id = self._analytic_account_id(self.invoice_id) + res = super(InvoiceChangeWizard, self).affect_change() + self._affect_analytic_change(old_analytic_id) + return res + + def _affect_analytic_change(self, old_analytic_id): + if old_analytic_id != self.analytic_account_id.id: + self.invoice_id.invoice_line_ids \ + .filtered(lambda l: l.account_analytic_id.id == old_analytic_id) \ + .write({'account_analytic_id': self.analytic_account_id.id}) + if self.invoice_id.move_id: + lines_to_affect = self.invoice_id.move_id \ + .line_ids.filtered(lambda l: l.analytic_account_id.id == old_analytic_id) + lines_to_affect.write({'analytic_account_id': self.analytic_account_id.id}) + lines_to_affect.create_analytic_lines() diff --git a/account_invoice_change_analytic/wizard/invoice_change_views.xml b/account_invoice_change_analytic/wizard/invoice_change_views.xml new file mode 100644 index 00000000..1aeb20e6 --- /dev/null +++ b/account_invoice_change_analytic/wizard/invoice_change_views.xml @@ -0,0 +1,13 @@ + + + + account.invoice.change.form.inherit + account.invoice.change + + + + + + + + \ No newline at end of file