# Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import _ from odoo.http import request, route from odoo.addons.website_sale.controllers.main import WebsiteSale class WebsiteSaleL10nMX(WebsiteSale): def _l10n_mx_edi_is_extra_info_needed(self): invoicing_step = request.website._get_checkout_step( '/shop/l10n_mx_invoicing_info' ) invoicing_info_needed = request.website.company_id.country_code == 'MX' if invoicing_step.is_published != invoicing_info_needed: invoicing_step.sudo().is_published = invoicing_info_needed return invoicing_info_needed @route() def shop_checkout(self, try_skip_step=False, **query_params): # Extends 'website_sale' # Prevent express checkout if self._l10n_mx_edi_is_extra_info_needed() and try_skip_step: try_skip_step = False return super().shop_checkout(try_skip_step=try_skip_step, query_params=query_params) @route('/shop/l10n_mx_invoicing_info', type='http', auth='public', website=True, sitemap=False) def l10n_mx_invoicing_info(self, **kw): if not self._l10n_mx_edi_is_extra_info_needed(): return request.redirect( request.website._get_checkout_step_values()['next_website_checkout_step_href'] ) order_sudo = request.cart if redirection := self._check_cart(order_sudo): return redirection partner = order_sudo.partner_id l10n_mx_edi_fields = [ request.env['ir.model.fields']._get('res.partner', 'l10n_mx_edi_fiscal_regime'), request.env['ir.model.fields']._get('account.move', 'l10n_mx_edi_usage'), request.env['ir.model.fields']._get('account.move', 'l10n_mx_edi_payment_method_id'), request.env['ir.model.fields']._get('res.partner', 'l10n_mx_edi_ieps_breakdown'), ] # === GET === default_vals = {} if request.httprequest.method == 'GET': default_vals['vat'] = partner.vat default_vals['need_invoice'] = not order_sudo.l10n_mx_edi_cfdi_to_public default_vals['l10n_mx_edi_fiscal_regime'] = partner.l10n_mx_edi_fiscal_regime default_vals['l10n_mx_edi_usage'] = order_sudo.l10n_mx_edi_usage default_vals['l10n_mx_edi_ieps_breakdown'] = partner.l10n_mx_edi_ieps_breakdown default_vals['l10n_mx_edi_payment_method_id'] = order_sudo.l10n_mx_edi_payment_method_id # === POST & possibly redirect === can_edit_vat = partner.can_edit_vat() errors = {} if request.httprequest.method == 'POST': order_sudo.l10n_mx_edi_cfdi_to_public = kw.get('need_invoice') != '1' if kw.get('need_invoice') == '1': default_vals = { 'vat': kw.get('vat'), 'need_invoice': True, 'l10n_mx_edi_fiscal_regime': kw.get('l10n_mx_edi_fiscal_regime'), 'l10n_mx_edi_usage': kw.get('l10n_mx_edi_usage'), 'l10n_mx_edi_ieps_breakdown': kw.get('l10n_mx_edi_ieps_breakdown') == 'on', 'l10n_mx_edi_payment_method_id': int(kw.get('l10n_mx_edi_payment_method_id', False)) or False, } partner_vals = {} # VAT field if not default_vals['vat']: errors['vat'] = _("The VAT number is required") elif can_edit_vat: vat, _country_code = request.env['res.partner']._run_vat_checks(partner.country_id, default_vals['vat'], validation='setnull') if not vat: errors['vat'] = partner._build_vat_error_message(partner.country_id.code.lower(), default_vals['vat'], partner.name) else: vat, _country_code = request.env['res.partner']._run_vat_checks(partner.country_id, default_vals['vat'], validation=False) partner_vals['vat'] = vat # Other fields order_sudo.l10n_mx_edi_usage = default_vals['l10n_mx_edi_usage'] order_sudo.l10n_mx_edi_payment_method_id = default_vals['l10n_mx_edi_payment_method_id'] partner_vals.update({ 'l10n_mx_edi_fiscal_regime': default_vals['l10n_mx_edi_fiscal_regime'], 'l10n_mx_edi_ieps_breakdown': default_vals['l10n_mx_edi_ieps_breakdown'], }) partner.write(partner_vals) if not errors: return request.redirect( request.website._get_checkout_step_values()['next_website_checkout_step_href'] ) else: return request.redirect( request.website._get_checkout_step_values()['next_website_checkout_step_href'] ) # === Render extra_info tab === values = { 'request': request, 'website_sale_order': order_sudo, 'post': kw, 'partner': partner.id, 'order': order_sudo, 'l10n_mx_edi_fields': l10n_mx_edi_fields, 'l10n_mx_edi_payment_methods': request.env['l10n_mx_edi.payment.method'].sudo().search([]), 'company_country_code': order_sudo.company_id.country_id.code, 'default_vals': default_vals, 'errors': errors, # flag for rendering the 'Extra Info' dot in the wizard_checkout 'l10n_mx_show_extra_info': True, 'can_edit_vat': can_edit_vat, } values.update(request.website._get_checkout_step_values()) return request.render("l10n_mx_edi_website_sale.l10n_mx_edi_invoicing_info", values)