diff --git a/website_account_fiscal_position_partner_type/__init__.py b/website_account_fiscal_position_partner_type/__init__.py index 6b9e5664d3..b1973aa9f6 100644 --- a/website_account_fiscal_position_partner_type/__init__.py +++ b/website_account_fiscal_position_partner_type/__init__.py @@ -2,3 +2,4 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import controllers +from . import models diff --git a/website_account_fiscal_position_partner_type/__manifest__.py b/website_account_fiscal_position_partner_type/__manifest__.py index f3412bf10f..5d093d041c 100644 --- a/website_account_fiscal_position_partner_type/__manifest__.py +++ b/website_account_fiscal_position_partner_type/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Website Account Fiscal Position Partner Type", - "version": "13.0.0.0.1", + "version": "15.0.1.0.0", "category": "Website", "website": "https://github.com/OCA/e-commerce", "author": "Sygel Technology," "Odoo Community Association (OCA)", @@ -12,5 +12,9 @@ "installable": True, "development_status": "Beta", "depends": ["account_fiscal_position_partner_type", "website_sale"], - "data": ["views/website_sale.xml"], + "data": [ + "views/website_sale.xml", + "views/portal_templates.xml", + "views/auth_signup_login_templates.xml", + ], } diff --git a/website_account_fiscal_position_partner_type/controllers/__init__.py b/website_account_fiscal_position_partner_type/controllers/__init__.py index 9c53ff8f86..65fa27a301 100644 --- a/website_account_fiscal_position_partner_type/controllers/__init__.py +++ b/website_account_fiscal_position_partner_type/controllers/__init__.py @@ -2,3 +2,4 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import main +from . import portal diff --git a/website_account_fiscal_position_partner_type/controllers/main.py b/website_account_fiscal_position_partner_type/controllers/main.py index 62d4edaca1..7f1c9be5af 100644 --- a/website_account_fiscal_position_partner_type/controllers/main.py +++ b/website_account_fiscal_position_partner_type/controllers/main.py @@ -1,9 +1,10 @@ # Copyright 2021 Valentin Vinagre # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import http +from odoo import _, http from odoo.http import request +from odoo.addons.auth_signup.controllers.main import AuthSignupHome from odoo.addons.website_sale.controllers.main import WebsiteSale @@ -18,6 +19,39 @@ def values_postprocess(self, order, mode, values, errors, error_msg): ) return new_values, errors, error_msg + def checkout_form_validate(self, mode, all_form_values, data): + old_context = request.context + request.context = dict( + request.context, + fiscal_position_type=all_form_values.get("fiscal_position_type"), + ) + error, error_message = super().checkout_form_validate( + mode, all_form_values, data + ) + request.context = old_context + if data.get("fiscal_position_type"): + partner_su = ( + request.env["res.partner"] + .sudo() + .browse(int(data["partner_id"])) + .exists() + ) + fiscal_position_type_change = ( + partner_su + and "fiscal_position_type" in data + and data["fiscal_position_type"] != partner_su.fiscal_position_type + ) + if fiscal_position_type_change and not partner_su.can_edit_vat(): + error["fiscal_position_type"] = "error" + error_message.append( + _( + "Changing partner type is not allowed once invoices have " + "been issued for your account. Please contact us directly" + " for this operation." + ) + ) + return error, error_message + @http.route() def address(self, **kw): res = super(WebsiteSale, self).address(**kw) @@ -49,3 +83,22 @@ def address(self, **kw): } ) return res + + +class AuthSignupHome(AuthSignupHome): + def get_auth_signup_qcontext(self): + qcontext = super().get_auth_signup_qcontext() + qcontext.update( + {k: v for (k, v) in request.params.items() if k in {"fiscal_position_type"}} + ) + afp_obj = request.env["account.fiscal.position"].sudo() + qcontext["fiscpostypevalues"] = dict( + afp_obj._fields["fiscal_position_type"].selection + ) + return qcontext + + def _prepare_signup_values(self, qcontext): + values = super()._prepare_signup_values(qcontext) + if "fiscal_position_type" in qcontext: + values["fiscal_position_type"] = qcontext["fiscal_position_type"] + return values diff --git a/website_account_fiscal_position_partner_type/controllers/portal.py b/website_account_fiscal_position_partner_type/controllers/portal.py new file mode 100644 index 0000000000..ca0b6c085a --- /dev/null +++ b/website_account_fiscal_position_partner_type/controllers/portal.py @@ -0,0 +1,44 @@ +# Copyright 2023 Manuel Regidor +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _ +from odoo.http import request + +from odoo.addons.portal.controllers.portal import CustomerPortal + + +class CustomerPortal(CustomerPortal): + + CustomerPortal.OPTIONAL_BILLING_FIELDS += ["fiscal_position_type"] + + def details_form_validate(self, data): + error, error_message = super().details_form_validate(data) + partner = request.env.user.partner_id + if ( + not partner.can_edit_vat() + and "fiscal_position_type" in data + and data.get("fiscal_position_type") != partner.fiscal_position_type + ): + error["fiscal_position_type"] = "error" + error_message.append( + _( + "Changing Partner Type is not allowed once document(s) have " + "been issued for your account. Please contact us directly for" + " this operation." + ) + ) + return error, error_message + + def _prepare_portal_layout_values(self): + vals = super()._prepare_portal_layout_values() + afp_obj = request.env["account.fiscal.position"].sudo() + partner = request.env.user.partner_id + vals.update( + { + "fiscpostypevalues": dict( + afp_obj._fields["fiscal_position_type"].selection + ), + "fiscal_position_type_selected": partner.fiscal_position_type, + } + ) + return vals diff --git a/website_account_fiscal_position_partner_type/models/__init__.py b/website_account_fiscal_position_partner_type/models/__init__.py new file mode 100644 index 0000000000..a227d7676d --- /dev/null +++ b/website_account_fiscal_position_partner_type/models/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2023 Manuel Regidor +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import res_users +from . import res_partner diff --git a/website_account_fiscal_position_partner_type/models/res_partner.py b/website_account_fiscal_position_partner_type/models/res_partner.py new file mode 100644 index 0000000000..cf29672283 --- /dev/null +++ b/website_account_fiscal_position_partner_type/models/res_partner.py @@ -0,0 +1,15 @@ +# Copyright 2023 Manuel Regidor +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3). + +from odoo import api, models + + +class Partner(models.Model): + _inherit = "res.partner" + + @api.model + def signup_retrieve_info(self, token): + res = super().signup_retrieve_info(token) + partner = self._signup_retrieve_partner(token, raise_exception=True) + res.update({"fiscal_position_type_selected": partner.fiscal_position_type}) + return res diff --git a/website_account_fiscal_position_partner_type/models/res_users.py b/website_account_fiscal_position_partner_type/models/res_users.py new file mode 100644 index 0000000000..88a1cd97ea --- /dev/null +++ b/website_account_fiscal_position_partner_type/models/res_users.py @@ -0,0 +1,29 @@ +# Copyright 2023 Manuel Regidor +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl-3). + +from odoo import api, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + @api.model + def signup(self, values, token=None): + if token: + partner = self.env["res.partner"]._signup_retrieve_partner( + token, check_validity=True, raise_exception=True + ) + partner_user = partner.user_ids and partner.user_ids[0] or False + # Don't update fiscal_position_type if partner related to user + # exists (i.e. when resetting password) + if partner_user: + values.pop("fiscal_position_type", None) + return super().signup(values, token) + + def _create_user_from_template(self, values): + user = super()._create_user_from_template(values) + if user and user.partner_id and values.get("fiscal_position_type"): + user.partner_id.write( + {"fiscal_position_type": values.get("fiscal_position_type")} + ) + return user diff --git a/website_account_fiscal_position_partner_type/views/auth_signup_login_templates.xml b/website_account_fiscal_position_partner_type/views/auth_signup_login_templates.xml new file mode 100644 index 0000000000..ae76fcee76 --- /dev/null +++ b/website_account_fiscal_position_partner_type/views/auth_signup_login_templates.xml @@ -0,0 +1,35 @@ + + + + + diff --git a/website_account_fiscal_position_partner_type/views/portal_templates.xml b/website_account_fiscal_position_partner_type/views/portal_templates.xml new file mode 100644 index 0000000000..9b694d31bb --- /dev/null +++ b/website_account_fiscal_position_partner_type/views/portal_templates.xml @@ -0,0 +1,37 @@ + + + + + diff --git a/website_account_fiscal_position_partner_type/views/website_sale.xml b/website_account_fiscal_position_partner_type/views/website_sale.xml index 8d3ab7f35e..fd78c53e18 100644 --- a/website_account_fiscal_position_partner_type/views/website_sale.xml +++ b/website_account_fiscal_position_partner_type/views/website_sale.xml @@ -20,6 +20,8 @@ id="fiscal_position_type" name="fiscal_position_type" class="form-control" + t-att-disabled="'1' if not can_edit_vat else None" + t-attf-class="form-control #{error.get('fiscal_position_type') and 'is-invalid' or ''}" >