From 24e89a3fbebe57beaaa81c4d03a897e4b859ba16 Mon Sep 17 00:00:00 2001 From: Yolann Sabaux Date: Thu, 2 Jun 2022 13:24:51 +0000 Subject: [PATCH] [FIX] account: prevent deletion partner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Steps to reproduce: - Create a partner-individual, assign to a company - Create an invoice and set the new partner as the customer - Go to the partner view - Delete it Issue: - It is possible to delete it Cause: The constraint in "account.move.line" uses the "commercial_partner_id" as the partner Solution: - Prevent the unlink if the partner is used in 'account.move' -> To delete in Master - add "ondelete='restrict' for partner and commercial_parner in 'account.move' opw-2858789 closes odoo/odoo#94591 X-original-commit: 7d37f5ef7ecd87aea666d96dc8200a74c8dc0b31 Signed-off-by: William André (wan) --- addons/account/i18n/account.pot | 6 ++++++ addons/account/models/account_move.py | 4 ++-- addons/account/models/partner.py | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/addons/account/i18n/account.pot b/addons/account/i18n/account.pot index 8015a9d23f2..c8dcbb331e7 100644 --- a/addons/account/i18n/account.pot +++ b/addons/account/i18n/account.pot @@ -10522,6 +10522,12 @@ msgstr "" msgid "Reconciliation Parts" msgstr "" +#. module: account +#: code:addons/account/models/partner.py:0 +#, python-format +msgid "Record cannot be deleted. Partner used in Accounting" +msgstr "" + #. module: account #: code:addons/account/models/account_tax.py:0 #, python-format diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 541ddcfe6c8..79614cc6702 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -200,9 +200,9 @@ class AccountMove(models.Model): partner_id = fields.Many2one('res.partner', readonly=True, tracking=True, states={'draft': [('readonly', False)]}, check_company=True, - string='Partner', change_default=True) + string='Partner', change_default=True, ondelete='restrict') commercial_partner_id = fields.Many2one('res.partner', string='Commercial Entity', store=True, readonly=True, - compute='_compute_commercial_partner_id') + compute='_compute_commercial_partner_id', ondelete='restrict') country_code = fields.Char(related='company_id.account_fiscal_country_id.code', readonly=True) user_id = fields.Many2one(string='User', related='invoice_user_id', help='Technical field used to fit the generic behavior in mail templates.') diff --git a/addons/account/models/partner.py b/addons/account/models/partner.py index 800ab708eec..bbbd1b4235a 100644 --- a/addons/account/models/partner.py +++ b/addons/account/models/partner.py @@ -9,7 +9,7 @@ from psycopg2 import sql, DatabaseError from odoo import api, fields, models, _ from odoo.osv import expression from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT -from odoo.exceptions import ValidationError +from odoo.exceptions import ValidationError, UserError from odoo.addons.base.models.res_partner import WARNING_MESSAGE, WARNING_HELP _logger = logging.getLogger(__name__) @@ -621,6 +621,20 @@ class ResPartner(models.Model): vals['supplier_rank'] = 1 return super().create(vals_list) + @api.ondelete(at_uninstall=False) + def _unlink_if_partner_in_account_move(self): + """ + Prevent the deletion of a partner "Individual", child of a company if: + - partner in 'account.move' + - state: all states (draft and posted) + """ + moves = self.sudo().env['account.move'].search_count([ + ('partner_id', 'in', self.ids), + ('state', 'in', ['draft', 'posted']), + ]) + if moves: + raise UserError(_("The partner cannot be deleted because it is used in Accounting")) + def _increase_rank(self, field, n=1): if self.ids and field in ['customer_rank', 'supplier_rank']: try: