From 739aa00a49ec6e6d92139ca9526b2079b2e94a98 Mon Sep 17 00:00:00 2001 From: Xavier ALT Date: Mon, 3 Apr 2023 16:16:00 +0000 Subject: [PATCH] [FIX] point_of_sale: fix loading of chart of account with default pos.config With `generic_coa` now installed by default, the default pos.config are automatically assigned a sale and an invoice journal, and trying to install afterward a country specific chart template result in the following error: 2023-04-03 16:29:27,642 9344 ERROR _testdb-162820-testdb-162820-point-of-sale odoo.sql_db: bad query: DELETE FROM "account_journal" WHERE id IN (1, 2, 3, 8, 4, 6, 9, 7, 5, 10) ERROR: update or delete on table "account_journal" violates foreign key constraint "pos_config_journal_id_fkey" on table "pos_config" DETAIL: Key (id)=(10) is still referenced from table "pos_config". Traceback (most recent call last): ... File "/home/odoo/src/odoo/saas-16.2/odoo/modules/loading.py", line 481, in load_modules processed_modules += load_marked_modules(env, graph, File "/home/odoo/src/odoo/saas-16.2/odoo/modules/loading.py", line 365, in load_marked_modules loaded, processed = load_module_graph( File "/home/odoo/src/odoo/saas-16.2/odoo/modules/loading.py", line 297, in load_module_graph module.write({'state': 'installed', 'latest_version': ver}) File "/home/odoo/src/odoo/saas-16.2/addons/account/models/ir_module.py", line 67, in write self.env['account.chart.template'].try_loading( File "/home/odoo/src/odoo/saas-16.2/addons/account/models/chart_template.py", line 141, in try_loading return self._load(template_code, company, install_demo) File "/home/odoo/src/odoo/saas-16.2/addons/point_of_sale/models/chart_template.py", line 16, in _load result = super()._load(template_code, company, install_demo) File "/home/odoo/src/odoo/saas-16.2/addons/account/models/chart_template.py", line 176, in _load self.env[model].search([('company_id', '=', company.id)]).with_context({MODULE_UNINSTALL_FLAG: True}).unlink() File "/home/odoo/src/odoo/saas-16.2/addons/account/models/account_journal.py", line 524, in unlink ret = super(AccountJournal, self).unlink() File "/home/odoo/src/odoo/saas-16.2/addons/mail/models/mail_thread.py", line 326, in unlink res = super(MailThread, self).unlink() File "/home/odoo/src/odoo/saas-16.2/addons/mail/models/mail_activity_mixin.py", line 246, in unlink result = super(MailActivityMixin, self).unlink() File "/home/odoo/src/odoo/saas-16.2/odoo/models.py", line 3635, in unlink cr.execute(query, (sub_ids,)) File "/home/odoo/src/odoo/saas-16.2/odoo/sql_db.py", line 311, in execute res = self._obj.execute(query, params) psycopg2.errors.ForeignKeyViolation: update or delete on table "account_journal" violates foreign key constraint "pos_config_journal_id_fkey" on table "pos_config" DETAIL: Key (id)=(10) is still referenced from table "pos_config". This commit also reset the journals on the existing pos.config so that `post_install_pos_localisation()` assign the right ones once the new chart template is loaded. We also only reset payment methods and journals in case we load a new chart of accounts (this fix the "reload" of the CoA when PoS is installed) closes odoo/odoo#117651 X-original-commit: 7a91c57f6bb47e40f0486ca06f0e1916b98db1f4 Signed-off-by: Joseph Caburnay (jcb) Signed-off-by: Xavier Alt (xal) --- addons/point_of_sale/models/chart_template.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/addons/point_of_sale/models/chart_template.py b/addons/point_of_sale/models/chart_template.py index 80f0d2fb455..fcda3d655a5 100644 --- a/addons/point_of_sale/models/chart_template.py +++ b/addons/point_of_sale/models/chart_template.py @@ -5,14 +5,20 @@ from odoo import models class AccountChartTemplate(models.AbstractModel): _inherit = 'account.chart.template' - def _load(self, template_code=False, company=False, install_demo=True): - """Remove the payment methods that are created for the company before installing the chart of accounts. + def _load(self, template_code, company, install_demo): + """Remove the payment methods that are created for the company and unset journals before installing the chart of accounts. - Keeping these existing pos.payment.method records interferes with the installation of chart of accounts + Keeping these existing pos.payment.method records and pos.config journals interferes with the installation of chart of accounts because pos.payment.method model has fields linked to account.journal and account.account records that are deleted during the loading of chart of accounts. """ - self.env['pos.payment.method'].search([('company_id', '=', company.id)]).unlink() + reload_template = template_code == company.chart_template + if not reload_template: + self.env['pos.payment.method'].search([('company_id', '=', company.id)]).unlink() + self.env["pos.config"].search([('company_id', '=', company.id)]).write({ + 'journal_id': False, + 'invoice_journal_id': False, + }) result = super()._load(template_code, company, install_demo) self.env['pos.config'].post_install_pos_localisation(companies=company) return result