From f8b05f52f5ea7f31135f700b0e240ff563204085 Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Thu, 1 Mar 2018 17:45:15 +0100 Subject: [PATCH] [FIX] website_portal(_sale), base: prevent VAT edition if user has SO/invoices This commit prevent VAT and company name edition if an user has already at least one document (SO or invoice) for his partner or his related company partner. Any module can override this feature to add their own condition to prevent campany name/VAT edition. task-33088 Closes #23420 --- addons/account/controllers/portal.py | 6 +++-- addons/account/models/partner.py | 12 ++++++++++ addons/portal/controllers/portal.py | 30 ++++++++++++++---------- addons/portal/models/__init__.py | 3 ++- addons/portal/models/res_partner.py | 11 +++++++++ addons/portal/views/portal_templates.xml | 6 ++--- addons/sale/models/res_partner.py | 11 +++++++++ addons/website_sale/controllers/main.py | 4 ++++ addons/website_sale/views/templates.xml | 6 ++--- 9 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 addons/portal/models/res_partner.py 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 @@
- +
- +
- +