diff --git a/addons/account/controllers/portal.py b/addons/account/controllers/portal.py index 4303f972f93..155c38d1a05 100644 --- a/addons/account/controllers/portal.py +++ b/addons/account/controllers/portal.py @@ -139,12 +139,14 @@ class PortalAccount(CustomerPortal): error, error_message = super(PortalAccount, self).details_form_validate(data) # prevent VAT/name change if invoices exist partner = request.env['res.users'].browse(request.uid).partner_id - invoices = request.env['account.invoice'].sudo().search_count([('partner_id', '=', partner.id), ('state', 'not in', ['draft', 'cancel'])]) - if invoices: + if not partner.can_edit_vat(): if 'vat' in data and (data['vat'] or False) != (partner.vat or False): error['vat'] = 'error' error_message.append(_('Changing VAT number is not allowed once invoices have been issued for your account. Please contact us directly for this operation.')) if 'name' in data and (data['name'] or False) != (partner.name or False): error['name'] = 'error' error_message.append(_('Changing your name is not allowed once invoices have been issued for your account. Please contact us directly for this operation.')) + if 'company_name' in data and (data['company_name'] or False) != (partner.company_name or False): + error['company_name'] = 'error' + error_message.append(_('Changing your company name is not allowed once invoices have been issued for your account. Please contact us directly for this operation.')) return error, error_message diff --git a/addons/account/models/partner.py b/addons/account/models/partner.py index a1fa22a824c..f28cec604b5 100644 --- a/addons/account/models/partner.py +++ b/addons/account/models/partner.py @@ -441,3 +441,15 @@ class ResPartner(models.Model): action['domain'] = literal_eval(action['domain']) action['domain'].append(('partner_id', 'child_of', self.id)) return action + + def can_edit_vat(self): + can_edit_vat = super(ResPartner, self).can_edit_vat() + if not can_edit_vat: + return can_edit_vat + Invoice = self.env['account.invoice'] + has_invoice = Invoice.search([ + ('type', 'in', ['out_invoice', 'out_refund']), + ('partner_id', 'child_of', self.commercial_partner_id.id), + ('state', 'not in', ['draft', 'cancel']) + ], limit=1) + return can_edit_vat and not (bool(has_invoice)) diff --git a/addons/portal/controllers/portal.py b/addons/portal/controllers/portal.py index c12a10ebfaf..ee0d9454567 100644 --- a/addons/portal/controllers/portal.py +++ b/addons/portal/controllers/portal.py @@ -198,19 +198,23 @@ class CustomerPortal(Controller): error_message.append(_('Invalid Email! Please enter a valid email address.')) # vat validation - partner = request.env["res.partner"] - if data.get("vat") and hasattr(partner, "check_vat"): - if data.get("country_id"): - data["vat"] = request.env["res.partner"].fix_eu_vat_number(int(data.get("country_id")), data.get("vat")) - partner_dummy = partner.new({ - 'vat': data['vat'], - 'country_id': (int(data['country_id']) - if data.get('country_id') else False), - }) - try: - partner_dummy.check_vat() - except ValidationError: - error["vat"] = 'error' + partner = request.env.user.partner_id + if data.get("vat") and partner and partner.vat != data.get("vat"): + if partner.can_edit_vat(): + if hasattr(partner, "check_vat"): + if data.get("country_id"): + data["vat"] = request.env["res.partner"].fix_eu_vat_number(int(data.get("country_id")), data.get("vat")) + partner_dummy = partner.new({ + 'vat': data['vat'], + 'country_id': (int(data['country_id']) + if data.get('country_id') else False), + }) + try: + partner_dummy.check_vat() + except ValidationError: + error["vat"] = 'error' + else: + error_message.append(_('Changing VAT number is not allowed once document(s) have been issued for your account. Please contact us directly for this operation.')) # error message for empty required fields if [err for err in error.values() if err == 'missing']: diff --git a/addons/portal/models/__init__.py b/addons/portal/models/__init__.py index 320a9e84f38..5e3573d88dc 100644 --- a/addons/portal/models/__init__.py +++ b/addons/portal/models/__init__.py @@ -3,4 +3,5 @@ from . import mail_thread from . import mail_message -from . import portal_mixin \ No newline at end of file +from . import portal_mixin +from . import res_partner diff --git a/addons/portal/models/res_partner.py b/addons/portal/models/res_partner.py new file mode 100644 index 00000000000..4c8d02943c5 --- /dev/null +++ b/addons/portal/models/res_partner.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + def can_edit_vat(self): + return True diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml index 64f24c95271..6c21e669fea 100644 --- a/addons/portal/views/portal_templates.xml +++ b/addons/portal/views/portal_templates.xml @@ -256,11 +256,11 @@

- +

-
+
- +
diff --git a/addons/sale/models/res_partner.py b/addons/sale/models/res_partner.py index c77bb965620..26039c1f2f6 100644 --- a/addons/sale/models/res_partner.py +++ b/addons/sale/models/res_partner.py @@ -25,3 +25,14 @@ class ResPartner(models.Model): partner_ids = [partner.id] + item.get('child_ids') # then we can sum for all the partner's child partner.sale_order_count = sum(mapped_data.get(child, 0) for child in partner_ids) + + def can_edit_vat(self): + can_edit_vat = super(ResPartner, self).can_edit_vat() + if not can_edit_vat: + return can_edit_vat + SaleOrder = self.env['sale.order'] + has_so = SaleOrder.search([ + ('partner_id', 'child_of', self.commercial_partner_id.id), + ('state', 'in', ['sent', 'sale', 'done']) + ], limit=1) + return can_edit_vat and not bool(has_so) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 9ef132937eb..20d08265b24 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -590,6 +590,7 @@ class WebsiteSale(http.Controller): return redirection mode = (False, False) + can_edit_vat = False def_country_id = order.partner_id.country_id values, errors = {}, {} @@ -598,6 +599,7 @@ class WebsiteSale(http.Controller): # IF PUBLIC ORDER if order.partner_id.id == request.website.user_id.sudo().partner_id.id: mode = ('new', 'billing') + can_edit_vat = True country_code = request.session['geoip'].get('country_code') if country_code: def_country_id = request.env['res.country'].search([('code', '=', country_code)], limit=1) @@ -608,6 +610,7 @@ class WebsiteSale(http.Controller): if partner_id > 0: if partner_id == order.partner_id.id: mode = ('edit', 'billing') + can_edit_vat = order.partner_id.can_edit_vat() else: shippings = Partner.search([('id', 'child_of', order.partner_id.commercial_partner_id.ids)]) if partner_id in shippings.mapped('id'): @@ -651,6 +654,7 @@ class WebsiteSale(http.Controller): 'partner_id': partner_id, 'mode': mode, 'checkout': values, + 'can_edit_vat': can_edit_vat, 'country': country, 'countries': country.get_website_sale_countries(mode=mode[1]), "states": country.get_website_sale_states(mode=mode[1]), diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index fae39820b64..e008c155968 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -1161,14 +1161,14 @@
- +
- +
- +