From dd8c9ab6d3be42e46304be428344cddc2bf0a769 Mon Sep 17 00:00:00 2001 From: desdelinux Date: Sun, 30 Jul 2023 10:44:25 -0500 Subject: [PATCH 1/3] [ADD] Welcome l10n_pe_website_sale New module that adds peruvian requirements to the website ecommerce * Add fields to the checkout form *Identification type *City *District * Add logic to validate the new fields * Take into account the identification type when validating the VAT in the checkout form * Change label name for the vat field, to show "Number" instead of "VAT number". * Add demo data to display a peruvian website and show products with taxes * Add module translations * Hide default city --- addons/l10n_pe_website_sale/README.rst | 2 + addons/l10n_pe_website_sale/__init__.py | 3 + addons/l10n_pe_website_sale/__manifest__.py | 27 ++++ .../controllers/__init__.py | 2 + .../l10n_pe_website_sale/controllers/main.py | 77 +++++++++++ .../data/ir_model_fields.xml | 15 ++ .../demo/website_demo.xml | 33 +++++ addons/l10n_pe_website_sale/i18n/es.po | 76 +++++++++++ .../l10n_pe_website_sale/models/__init__.py | 5 + .../l10n_pe_website_sale/models/res_city.py | 10 ++ .../models/res_country_state.py | 10 ++ addons/l10n_pe_website_sale/models/website.py | 12 ++ .../static/description/icon.png | Bin 0 -> 2025 bytes .../static/src/js/website_sale.js | 80 +++++++++++ .../l10n_pe_website_sale/views/templates.xml | 128 ++++++++++++++++++ 15 files changed, 480 insertions(+) create mode 100644 addons/l10n_pe_website_sale/README.rst create mode 100644 addons/l10n_pe_website_sale/__init__.py create mode 100644 addons/l10n_pe_website_sale/__manifest__.py create mode 100644 addons/l10n_pe_website_sale/controllers/__init__.py create mode 100644 addons/l10n_pe_website_sale/controllers/main.py create mode 100644 addons/l10n_pe_website_sale/data/ir_model_fields.xml create mode 100644 addons/l10n_pe_website_sale/demo/website_demo.xml create mode 100644 addons/l10n_pe_website_sale/i18n/es.po create mode 100644 addons/l10n_pe_website_sale/models/__init__.py create mode 100644 addons/l10n_pe_website_sale/models/res_city.py create mode 100644 addons/l10n_pe_website_sale/models/res_country_state.py create mode 100644 addons/l10n_pe_website_sale/models/website.py create mode 100644 addons/l10n_pe_website_sale/static/description/icon.png create mode 100644 addons/l10n_pe_website_sale/static/src/js/website_sale.js create mode 100644 addons/l10n_pe_website_sale/views/templates.xml diff --git a/addons/l10n_pe_website_sale/README.rst b/addons/l10n_pe_website_sale/README.rst new file mode 100644 index 0000000000000..a3af9b1d7f793 --- /dev/null +++ b/addons/l10n_pe_website_sale/README.rst @@ -0,0 +1,2 @@ +Be able to see Identification Type in ecommerce checkout form. +============================================================== diff --git a/addons/l10n_pe_website_sale/__init__.py b/addons/l10n_pe_website_sale/__init__.py new file mode 100644 index 0000000000000..4dcc9d3a4b7ae --- /dev/null +++ b/addons/l10n_pe_website_sale/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from . import controllers +from . import models diff --git a/addons/l10n_pe_website_sale/__manifest__.py b/addons/l10n_pe_website_sale/__manifest__.py new file mode 100644 index 0000000000000..2ee49824dad79 --- /dev/null +++ b/addons/l10n_pe_website_sale/__manifest__.py @@ -0,0 +1,27 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + "name": "Peruvian eCommerce", + "version": "0.1", + "summary": "Be able to see Identification Type in ecommerce checkout form.", + "category": "Accounting/Localizations/Website", + "author": "Vauxoo, Odoo", + "license": "LGPL-3", + "depends": [ + "website_sale", + "l10n_pe", + ], + "data": [ + "data/ir_model_fields.xml", + "views/templates.xml", + ], + "demo": [ + "demo/website_demo.xml", + ], + "assets": { + "web.assets_frontend": [ + "l10n_pe_website_sale/static/src/js/website_sale.js", + ], + }, + "installable": True, + "auto_install": True, +} diff --git a/addons/l10n_pe_website_sale/controllers/__init__.py b/addons/l10n_pe_website_sale/controllers/__init__.py new file mode 100644 index 0000000000000..9a57ed53e4786 --- /dev/null +++ b/addons/l10n_pe_website_sale/controllers/__init__.py @@ -0,0 +1,2 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from . import main diff --git a/addons/l10n_pe_website_sale/controllers/main.py b/addons/l10n_pe_website_sale/controllers/main.py new file mode 100644 index 0000000000000..f561163336f80 --- /dev/null +++ b/addons/l10n_pe_website_sale/controllers/main.py @@ -0,0 +1,77 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo import http +from odoo.http import request + +from odoo.addons.website_sale.controllers.main import WebsiteSale + + +class L10nPEWebsiteSale(WebsiteSale): + def _get_mandatory_fields_billing(self, country_id=False): + """Extend mandatory fields to add new identification and responsibility fields when company is Peru""" + res = super()._get_mandatory_fields_billing(country_id) + if request.website.sudo().company_id.country_id.code == "PE": + res += ["l10n_latam_identification_type_id", "vat"] + return res + + def _get_country_related_render_values(self, kw, render_values): + res = super()._get_country_related_render_values(kw, render_values) + + if request.website.sudo().company_id.country_id.code == "PE": + values = render_values["checkout"] + state = ( + "state_id" in values + and values["state_id"] != "" + and request.env["res.country.state"].browse(int(values["state_id"])) + ) + city = ( + "city_id" in values + and values["city_id"] != "" + and request.env["res.city"].browse(int(values["city_id"])) + ) + to_include = { + "identification": kw.get("l10n_latam_identification_type_id"), + "identification_types": request.env["l10n_latam.identification.type"].sudo().search( + ["|", ("country_id", "=", False), ("country_id.code", "=", "PE")] + ), + } + if state: + to_include["state"] = state + to_include["state_cities"] = state.get_website_sale_cities() + if city: + to_include["city"] = city + to_include["city_districts"] = city.get_website_sale_districts() + res.update(to_include) + return res + + def _get_vat_validation_fields(self, data): + res = super()._get_vat_validation_fields(data) + if request.website.sudo().company_id.country_id.code == "PE": + res.update( + { + "l10n_latam_identification_type_id": int(data["l10n_latam_identification_type_id"]) + if data.get("l10n_latam_identification_type_id") + else False + } + ) + res.update({"name": data["name"] if data.get("name") else False}) + return res + + @http.route( + ['/shop/state_infos/'], + type="json", + auth="public", + methods=["POST"], + website=True, + ) + def state_infos(self, state, mode, **kw): + return dict( + cities=[(c.id, c.name, c.l10n_pe_code) for c in state.get_website_sale_cities(mode=mode)], + ) + + @http.route( + ['/shop/city_infos/'], type="json", auth="public", methods=["POST"], website=True + ) + def city_infos(self, city, mode, **kw): + return dict( + districts=[(d.id, d.name, d.code) for d in city.get_website_sale_districts(mode=mode)], + ) diff --git a/addons/l10n_pe_website_sale/data/ir_model_fields.xml b/addons/l10n_pe_website_sale/data/ir_model_fields.xml new file mode 100644 index 0000000000000..ec726f3b716d3 --- /dev/null +++ b/addons/l10n_pe_website_sale/data/ir_model_fields.xml @@ -0,0 +1,15 @@ + + + + + res.partner + + + + diff --git a/addons/l10n_pe_website_sale/demo/website_demo.xml b/addons/l10n_pe_website_sale/demo/website_demo.xml new file mode 100644 index 0000000000000..959181ca8e8d4 --- /dev/null +++ b/addons/l10n_pe_website_sale/demo/website_demo.xml @@ -0,0 +1,33 @@ + + + + + (PE) Peruvian Website + + + + + + + + + + + + + + + + + + diff --git a/addons/l10n_pe_website_sale/i18n/es.po b/addons/l10n_pe_website_sale/i18n/es.po new file mode 100644 index 0000000000000..e4ab639ab5066 --- /dev/null +++ b/addons/l10n_pe_website_sale/i18n/es.po @@ -0,0 +1,76 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_pe_website_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-04-04 22:20+0000\n" +"PO-Revision-Date: 2023-04-04 22:20+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_pe_website_sale +#: model_terms:ir.ui.view,arch_db:l10n_pe_website_sale.partner_info +msgid "" +"Changing Identification type is not allowed once document(s) have been " +"issued for your account. Please contact us directly for this operation." +msgstr "" +"No se permite cambiar el tipo de identificación una vez que se hayan emitido los documentos " +"para su cuenta. Póngase en contacto con nosotros directamente para esta operación." + +#. module: l10n_pe_website_sale +#: model:ir.model,name:l10n_pe_website_sale.model_res_city +#: model_terms:ir.ui.view,arch_db:l10n_pe_website_sale.partner_address_info +msgid "City" +msgstr "Ciudad" + +#. module: l10n_pe_website_sale +#: model_terms:ir.ui.view,arch_db:l10n_pe_website_sale.partner_address_info +msgid "City..." +msgstr "Ciudad..." + +#. module: l10n_pe_website_sale +#: model:ir.model,name:l10n_pe_website_sale.model_res_country_state +msgid "Country state" +msgstr "Estado" + +#. module: l10n_pe_website_sale +#: model_terms:ir.ui.view,arch_db:l10n_pe_website_sale.partner_address_info +msgid "District" +msgstr "Distrito" + +#. module: l10n_pe_website_sale +#: model_terms:ir.ui.view,arch_db:l10n_pe_website_sale.partner_address_info +msgid "District..." +msgstr "Distrito..." + +#. module: l10n_pe_website_sale +#: model_terms:ir.ui.view,arch_db:l10n_pe_website_sale.partner_info +msgid "Identification Type" +msgstr "Tipo de Identificación" + +#. module: l10n_pe_website_sale +#: model_terms:ir.ui.view,arch_db:l10n_pe_website_sale.partner_info +msgid "Identification Type..." +msgstr "Tipo de Identificación..." + +#. module: l10n_pe_website_sale +#: model:website,prevent_zero_price_sale_text:l10n_pe_website_sale.default_website_pe +msgid "Not Available For Sale" +msgstr "No disponible para la venta" + +#. module: l10n_pe_website_sale +#: model_terms:ir.ui.view,arch_db:l10n_pe_website_sale.address +msgid "Number" +msgstr "Número" + +#. module: l10n_pe_website_sale +#: model:ir.model,name:l10n_pe_website_sale.model_website +msgid "Website" +msgstr "Sitio web" diff --git a/addons/l10n_pe_website_sale/models/__init__.py b/addons/l10n_pe_website_sale/models/__init__.py new file mode 100644 index 0000000000000..632d7f9e11361 --- /dev/null +++ b/addons/l10n_pe_website_sale/models/__init__.py @@ -0,0 +1,5 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import res_city +from . import res_country_state +from . import website diff --git a/addons/l10n_pe_website_sale/models/res_city.py b/addons/l10n_pe_website_sale/models/res_city.py new file mode 100644 index 0000000000000..27ed34ba9a00d --- /dev/null +++ b/addons/l10n_pe_website_sale/models/res_city.py @@ -0,0 +1,10 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class City(models.Model): + _inherit = "res.city" + + def get_website_sale_districts(self, mode="billing"): + return self.env["l10n_pe.res.city.district"].sudo().search([("city_id", "=", self.id)]) diff --git a/addons/l10n_pe_website_sale/models/res_country_state.py b/addons/l10n_pe_website_sale/models/res_country_state.py new file mode 100644 index 0000000000000..4e9bf899d0426 --- /dev/null +++ b/addons/l10n_pe_website_sale/models/res_country_state.py @@ -0,0 +1,10 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class CountryState(models.Model): + _inherit = "res.country.state" + + def get_website_sale_cities(self, mode="billing"): + return self.env["res.city"].sudo().search([("state_id", "=", self.id)]) diff --git a/addons/l10n_pe_website_sale/models/website.py b/addons/l10n_pe_website_sale/models/website.py new file mode 100644 index 0000000000000..1a28e3c8794d6 --- /dev/null +++ b/addons/l10n_pe_website_sale/models/website.py @@ -0,0 +1,12 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class Website(models.Model): + _inherit = "website" + + def _display_partner_b2b_fields(self): + """Peruvian localization must always display b2b fields""" + self.ensure_one() + return self.company_id.country_id.code == "PE" or super()._display_partner_b2b_fields() diff --git a/addons/l10n_pe_website_sale/static/description/icon.png b/addons/l10n_pe_website_sale/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e6080d3f776f5588fd81695c870dafe08ac60b85 GIT binary patch literal 2025 zcmViN5&HwOiWRXjgZ#X*;rU&cX)Zl5*KG@Za_drLqkbPNl;f;U{Fw3 zT3TUIQCLk)RL2w=fr5x%UudJGr#d=7Mn+6lR$r5pmv(k~qok%iJwsq%W>r;QZfrscB~w#coSmLhQd((gZCYDjR8(75S6x3p zMr>?ynwy?+aduo>V(P^Ja&vlVX=;#>l|eyBV`FT5e1ShdL`zFieSL(7h>V_}q7SYx z`TY14uPb+We|AYy!VVKmOjA=+U3z+cn3$U_x>00gX-G&+xVXH{&CkET!?j85GYFQ!TD-q( z#S<8bFEz?0EzKGrg@uQUjFHr~x>{OaP*7E0Ut@+XGPJa|<>lu~OHH?7Nb8L>6Shg0x{S)9ge z#@nBi+o?05BW&-O`6}#xjX3Ku)egZkYRmbAA=&}In zodNZ?oci_MpU3#*$+?mvJFm=vF_NN)x1?pNs&JKi41=V>>&>sstxS)9k&B_6000D}Nklu9drmWo=PkAq+pA+Y%ubhu!CTq}nxtK~rJQzY%FN6iwqs^yW@ct) zX68+hWRa{VOP2KRcI)>qUwpaGJ-wgEKun)9&1`hjCY?qQF#UA%)V+*us@Xh+fXSu# zwDG03noog@0F9;8Nid4WR4dTf!cUD$7PR9)Q6~t$PaYRPl{`eyzJ#d#gx?QI-a`qg z15{Fn?4kb0)U0qA6LrsmyBA!FgPPmBa{rT%JKYaJa_M0w8Q54k_&`izg>R$ERAAk3J_0jql9=H)r zsaP0_dZT?&?~gzIzH;jqZ@$*qB|}kETRWSNd};gIPd0!4&gM-^7OuWy zUKCZsQ6y>St+G+^Q)@S@{$SH*k;t=8KK9^k*RK*&2M=X|y!iU58t)qmTNl~h0zp%n^~Ac$#lqE120~F^EFppG5dn~XA*K0v;;}AvMBa+$WUjW zd*MarpEvugS%f^rEQ}=k#y(@L?zcuE1)ku**ykHVmD&26aH7S+TXniqUJB6&-6;=> zO4Xk##76o1&n4B=c9qmF2$CswQ4U2^N?)FYK^??&M1o`!p@fXeu7+w!P)vcRIX=qA zQxla^9*`(Y5k(JYt4Zy>GsX_r&0m>U%JWJa zm79x=%Ff0_d2JNMUn2MmN3LNMe>2YJ0R91>&M0a;_u}K=ZVMB*-<)a;JAf|c=47#s zA9z}7_8T}Bg_+nU&^6MJivmBkRbjkZ4Ad|%_r_3lrK1~48@NB6!JSvf8b&p;AME^m zu#bRA9>b^>=83vKgk`U6?1$oi_iBuRdzD#S*hjS)yjLYwcgPyjYp=>|5|5R}oL5ne z{;yM+QdF@aRFxE!rR1$qHC2#MX^*NAwcNo4)KV^~mqIscxq~|TD7BQ|RUl0jRMpE$ zwW=w(<)&DW<H_bnWrDcJRmir-ntV*ekZLbg)H5P{y9tMhSRvHavB%q zbK;`Xoir{gkH$rn)3_+vjnbEjAvvK0&qmR-2Xb_hDq=`ZA2hl!%sC?^Wm^s63GCFtGZi4s+n$)@AotcK~00000NkvXX Hu0mjfq`3Wy literal 0 HcmV?d00001 diff --git a/addons/l10n_pe_website_sale/static/src/js/website_sale.js b/addons/l10n_pe_website_sale/static/src/js/website_sale.js new file mode 100644 index 0000000000000..ad9d4966f8d72 --- /dev/null +++ b/addons/l10n_pe_website_sale/static/src/js/website_sale.js @@ -0,0 +1,80 @@ +odoo.define("l10n_pe_website_sale.website_sale", function (require) { + "use strict"; + + var _ = require("web.utils"); + var websiteSale = require("website_sale.website_sale"); + var publicWidget = require("web.public.widget"); + + publicWidget.registry.WebsiteSale = websiteSale.WebsiteSale.extend({ + events: _.extend({}, websiteSale.WebsiteSale.prototype.events, { + 'change select[name="state_id"]': "_onChangeState", + 'change select[name="city_id"]': "_onChangeCity", + }), + _changeState: function () { + if (!$("#state_id").val()) { + return; + } + this._rpc({ + route: "/shop/state_infos/" + $("#state_id").val(), + params: { + mode: $("#country_id").attr("mode"), + }, + }).then(function (data) { + // populate cities and display + var selectCities = $("select[name='city_id']"); + var selectDistricts = $("select[name='l10n_pe_district']"); + if (data.cities.length) { + selectCities.html(""); + selectCities.append($("