From 6b0705c06096aed27d336c81f40d263146a26094 Mon Sep 17 00:00:00 2001 From: Christophe Draperi Date: Thu, 27 Nov 2025 09:31:33 +0100 Subject: [PATCH 1/4] [ADD] l10n_fr_department_crm --- l10n_fr_department_crm/__init__.py | 1 + l10n_fr_department_crm/__manifest__.py | 18 +++ l10n_fr_department_crm/models/__init__.py | 1 + l10n_fr_department_crm/models/crm_lead.py | 119 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 6919 bytes l10n_fr_department_crm/view/crm_lead.xml | 56 +++++++++ 6 files changed, 195 insertions(+) create mode 100644 l10n_fr_department_crm/__init__.py create mode 100644 l10n_fr_department_crm/__manifest__.py create mode 100644 l10n_fr_department_crm/models/__init__.py create mode 100644 l10n_fr_department_crm/models/crm_lead.py create mode 100644 l10n_fr_department_crm/static/description/icon.png create mode 100644 l10n_fr_department_crm/view/crm_lead.xml diff --git a/l10n_fr_department_crm/__init__.py b/l10n_fr_department_crm/__init__.py new file mode 100644 index 0000000000..9a7e03eded --- /dev/null +++ b/l10n_fr_department_crm/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/l10n_fr_department_crm/__manifest__.py b/l10n_fr_department_crm/__manifest__.py new file mode 100644 index 0000000000..5bc3438e9b --- /dev/null +++ b/l10n_fr_department_crm/__manifest__.py @@ -0,0 +1,18 @@ +{ + "name": "Leads French department", + "summary": "French Departments for crm leads", + "version": "18.0.0.0.2", + "category": "French Localization", + "author": "Informatique Prog, " + "Odoo Community Association (OCA)", + "maintainers": ["InformatiqueProg"], + "website": "https://github.com/InformatiqueProg/l10n_fr_department_crm", + "license": "AGPL-3", + "depends": ["crm", "l10n_fr_department"], + "data": [ + 'view/crm_lead.xml' + ], + "installable": True, + "application": False, + "auto_install": False, +} diff --git a/l10n_fr_department_crm/models/__init__.py b/l10n_fr_department_crm/models/__init__.py new file mode 100644 index 0000000000..3e9239b963 --- /dev/null +++ b/l10n_fr_department_crm/models/__init__.py @@ -0,0 +1 @@ +from . import crm_lead \ No newline at end of file diff --git a/l10n_fr_department_crm/models/crm_lead.py b/l10n_fr_department_crm/models/crm_lead.py new file mode 100644 index 0000000000..c602827c04 --- /dev/null +++ b/l10n_fr_department_crm/models/crm_lead.py @@ -0,0 +1,119 @@ +from collections import defaultdict +from odoo import api, fields, models + +# TODO after PR 701 merged +# - remove import unicode +# - replace FR_SPECIAL_ZIPCODES code by an import +# https://github.com/OCA/l10n-france/pull/701 +# Duplicate from l10n_fr_department/model/res_partner.py **START** +try: + from unidecode import unidecode +except ImportError: + unidecode = None +FR_SPECIAL_ZIPCODES = { + "42620": {"laval": "03"}, + "05110": {"claret": "04", "curbans": "04"}, + "05130": {"piegut": "04", "venterol": "04"}, + "05160": {"pontis": "04"}, + "06260": {"rochette": "04", "pierre": "04"}, + "48250": {"laveyrune": "07"}, + "43450": {"leyvaux": "15"}, + "33220": {"fougueyrolles": "24", "ponchapt": "24"}, + "05700": {"villebois": "26"}, + "01410": {"lajoux": "39"}, + "01590": {"chancia": "39", "lavancia": "39"}, + "52100": {"eulien": "51", "sapignicourt": "51"}, + "21340": {"change": "71"}, + "01200": {"eloise": "74"}, + "13780": {"riboux": "83"}, + "37160": {"buxeuil": "86"}, + "94390": {"paray": "91"}, +} + + +# Duplicate from l10n_fr_department/model/res_partner.py **END** + + +class CrmLead(models.Model): + _inherit = "crm.lead" + + country_department_id = fields.Many2one( + "res.country.department", + compute="_compute_country_department", + string="Country Department", + store=True, + ) + + @api.depends("zip", "city", "country_id") + # If a department code changes, it will have to be manually recomputed + def _compute_country_department(self): + department_code2id, fr_dom_countries_ids = self._fr_department_code() + + if not department_code2id: + self.country_department_id = False + else: + dpt_code2lead_ids = defaultdict(list) + for lead in self: + if lead.country_id.id in fr_dom_countries_ids and lead.zip: + dpt_code = self._fr_zipcode_city_to_department_code( + lead.zip, lead.city + ) + dpt_code2lead_ids[dpt_code].append(lead.id) + else: + dpt_code2lead_ids[None].append(lead.id) + for dpt_code, partner_ids in dpt_code2lead_ids.items(): + self.browse(partner_ids).country_department_id = department_code2id.get( + dpt_code + ) + + def _fr_department_code(self): + # Duplicate from l10n_fr_department/model/res_partner.py **START** + fr_dom_countries_codes = ("FR", "GP", "MQ", "GF", "RE", "YT") + fr_dom_countries_domain = [("code", "in", fr_dom_countries_codes)] + fr_dom_countries_sr = self.env["res.country"].search_read( + fr_dom_countries_domain, ["id"] + ) + fr_dom_countries_ids = [country["id"] for country in fr_dom_countries_sr] + # Retrieve all available departments by normalized department zip code + department_sr = self.env["res.country.department"].search_read( + [("country_id", "in", fr_dom_countries_ids)], ["code"] + ) + department_code2id = {dpt["code"]: dpt["id"] for dpt in department_sr} + # Duplicate from l10n_fr_department/model/res_partner.py **END** + return department_code2id, fr_dom_countries_ids + + # TODO remove after PR 701 merged + # https://github.com/OCA/l10n-france/pull/701 + # Duplicate from l10n_fr_department/model/res_partner.py **START** + @api.model + def _fr_zipcode_city_to_department_code(self, zipcode, city): + # https://fr.wikipedia.org/wiki/Liste_des_communes_de_France_dont_le_code_postal_ne_correspond_pas_au_d%C3%A9partement # noqa + zipcode = zipcode.replace(" ", "") + if len(zipcode) != 5: + return None + if city and zipcode in FR_SPECIAL_ZIPCODES: + city = unidecode(city).lower() + for city_keyword, dpt_code in FR_SPECIAL_ZIPCODES[zipcode].items(): + if city_keyword in city: + return dpt_code + code = zipcode[0:2] + # La Réunion + if code == "97": + code = zipcode[0:3] + # Le Port + if code == "978": + code = "974" + elif code == "20": + try: + zipcode = int(zipcode) + except ValueError: + return "20" + if 20000 <= zipcode < 20200: + # Corse du Sud / 2A + code = "2A" + elif 20200 <= zipcode <= 20620: + code = "2B" + else: + code = "20" + return code + # Duplicate from l10n_fr_department/model/res_partner.py **END** diff --git a/l10n_fr_department_crm/static/description/icon.png b/l10n_fr_department_crm/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..748d3e3b7ef50b667384463034cf51392bcf84d6 GIT binary patch literal 6919 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 literal 0 HcmV?d00001 diff --git a/l10n_fr_department_crm/view/crm_lead.xml b/l10n_fr_department_crm/view/crm_lead.xml new file mode 100644 index 0000000000..6527904159 --- /dev/null +++ b/l10n_fr_department_crm/view/crm_lead.xml @@ -0,0 +1,56 @@ + + + + l10n_fr_department_crm.opportunities.search + crm.lead + + + + + + + + + + l10n_fr_department_crm.opportunities.tree + crm.lead + + + + + + + + + + l10n_fr_department_crm.department_leads.form + crm.lead + + + + + + + + + + + From 3afccf74f7c22f92d5657a772f1f4d88813f6ec4 Mon Sep 17 00:00:00 2001 From: Christophe Draperi Date: Thu, 27 Nov 2025 10:28:29 +0100 Subject: [PATCH 2/4] [FIX] pre-commit fails --- l10n_fr_department_crm/__init__.py | 2 +- l10n_fr_department_crm/__manifest__.py | 9 ++--- l10n_fr_department_crm/models/__init__.py | 2 +- l10n_fr_department_crm/view/crm_lead.xml | 44 +++++++++++++---------- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/l10n_fr_department_crm/__init__.py b/l10n_fr_department_crm/__init__.py index 9a7e03eded..0650744f6b 100644 --- a/l10n_fr_department_crm/__init__.py +++ b/l10n_fr_department_crm/__init__.py @@ -1 +1 @@ -from . import models \ No newline at end of file +from . import models diff --git a/l10n_fr_department_crm/__manifest__.py b/l10n_fr_department_crm/__manifest__.py index 5bc3438e9b..bc5e33283c 100644 --- a/l10n_fr_department_crm/__manifest__.py +++ b/l10n_fr_department_crm/__manifest__.py @@ -3,15 +3,12 @@ "summary": "French Departments for crm leads", "version": "18.0.0.0.2", "category": "French Localization", - "author": "Informatique Prog, " - "Odoo Community Association (OCA)", + "author": "Informatique Prog, Odoo Community Association (OCA)", "maintainers": ["InformatiqueProg"], - "website": "https://github.com/InformatiqueProg/l10n_fr_department_crm", + "website": "https://github.com/OCA/l10n-france", "license": "AGPL-3", "depends": ["crm", "l10n_fr_department"], - "data": [ - 'view/crm_lead.xml' - ], + "data": ["view/crm_lead.xml"], "installable": True, "application": False, "auto_install": False, diff --git a/l10n_fr_department_crm/models/__init__.py b/l10n_fr_department_crm/models/__init__.py index 3e9239b963..e66f0d6cf4 100644 --- a/l10n_fr_department_crm/models/__init__.py +++ b/l10n_fr_department_crm/models/__init__.py @@ -1 +1 @@ -from . import crm_lead \ No newline at end of file +from . import crm_lead diff --git a/l10n_fr_department_crm/view/crm_lead.xml b/l10n_fr_department_crm/view/crm_lead.xml index 6527904159..5070502f72 100644 --- a/l10n_fr_department_crm/view/crm_lead.xml +++ b/l10n_fr_department_crm/view/crm_lead.xml @@ -3,13 +3,13 @@ l10n_fr_department_crm.opportunities.search crm.lead - + @@ -18,13 +18,13 @@ l10n_fr_department_crm.opportunities.tree crm.lead - + @@ -33,22 +33,28 @@ l10n_fr_department_crm.department_leads.form crm.lead - + - + - + From afe524f43a0128d4e8ece8db1389d647d4b12fdf Mon Sep 17 00:00:00 2001 From: Christophe Draperi Date: Thu, 27 Nov 2025 10:59:13 +0100 Subject: [PATCH 3/4] [FIX] missing readme --- l10n_fr_department_crm/models/crm_lead.py | 2 ++ l10n_fr_department_crm/readme/CONTRIBUTORS.md | 3 +++ l10n_fr_department_crm/readme/DESCRIPTION.md | 2 ++ 3 files changed, 7 insertions(+) create mode 100644 l10n_fr_department_crm/readme/CONTRIBUTORS.md create mode 100644 l10n_fr_department_crm/readme/DESCRIPTION.md diff --git a/l10n_fr_department_crm/models/crm_lead.py b/l10n_fr_department_crm/models/crm_lead.py index c602827c04..01cdfddff9 100644 --- a/l10n_fr_department_crm/models/crm_lead.py +++ b/l10n_fr_department_crm/models/crm_lead.py @@ -1,4 +1,5 @@ from collections import defaultdict + from odoo import api, fields, models # TODO after PR 701 merged @@ -116,4 +117,5 @@ def _fr_zipcode_city_to_department_code(self, zipcode, city): else: code = "20" return code + # Duplicate from l10n_fr_department/model/res_partner.py **END** diff --git a/l10n_fr_department_crm/readme/CONTRIBUTORS.md b/l10n_fr_department_crm/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..a6c14040b0 --- /dev/null +++ b/l10n_fr_department_crm/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Sylvain LE GAL ([Twitter](https://twitter.com/legalsylvain)), GRAP + (Groupement Régional Alimentaire de Proximité) +- Informatique Prog \<\> diff --git a/l10n_fr_department_crm/readme/DESCRIPTION.md b/l10n_fr_department_crm/readme/DESCRIPTION.md new file mode 100644 index 0000000000..5d575e75a5 --- /dev/null +++ b/l10n_fr_department_crm/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module adds a computed many2one *country_department_id* field on the +*crm_lead* object. From dcae38421973e84edb34d036006fa18a69497554 Mon Sep 17 00:00:00 2001 From: Christophe Draperi Date: Thu, 27 Nov 2025 13:52:55 +0100 Subject: [PATCH 4/4] [IMP] add FR translation --- l10n_fr_department_crm/i18n/fr.po | 33 +++++++++++++++++++ .../i18n/l10n_fr_department_crm-export.pot | 33 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 l10n_fr_department_crm/i18n/fr.po create mode 100644 l10n_fr_department_crm/i18n/l10n_fr_department_crm-export.pot diff --git a/l10n_fr_department_crm/i18n/fr.po b/l10n_fr_department_crm/i18n/fr.po new file mode 100644 index 0000000000..876cc0bdb7 --- /dev/null +++ b/l10n_fr_department_crm/i18n/fr.po @@ -0,0 +1,33 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_fr_department_crm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e-20250618\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-11-27 12:51+0000\n" +"PO-Revision-Date: 2025-11-27 12:51+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_fr_department_crm +#: model:ir.model.fields,field_description:l10n_fr_department_crm.field_crm_lead__country_department_id +msgid "Country Department" +msgstr "Département" + +#. module: l10n_fr_department_crm +#: model_terms:ir.ui.view,arch_db:l10n_fr_department_crm.crm_case_tree_view_oppor +#: model_terms:ir.ui.view,arch_db:l10n_fr_department_crm.crm_lead_view_form +#: model_terms:ir.ui.view,arch_db:l10n_fr_department_crm.view_crm_case_opportunities_filter +msgid "Department" +msgstr "Département" + +#. module: l10n_fr_department_crm +#: model:ir.model,name:l10n_fr_department_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Piste/opportunité" diff --git a/l10n_fr_department_crm/i18n/l10n_fr_department_crm-export.pot b/l10n_fr_department_crm/i18n/l10n_fr_department_crm-export.pot new file mode 100644 index 0000000000..40a78fc6ba --- /dev/null +++ b/l10n_fr_department_crm/i18n/l10n_fr_department_crm-export.pot @@ -0,0 +1,33 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_fr_department_crm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e-20250618\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-11-27 11:01+0000\n" +"PO-Revision-Date: 2025-11-27 11:01+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_fr_department_crm +#: model:ir.model.fields,field_description:l10n_fr_department_crm.field_crm_lead__country_department_id +msgid "Country Department" +msgstr "" + +#. module: l10n_fr_department_crm +#: model_terms:ir.ui.view,arch_db:l10n_fr_department_crm.crm_case_tree_view_oppor +#: model_terms:ir.ui.view,arch_db:l10n_fr_department_crm.crm_lead_view_form +#: model_terms:ir.ui.view,arch_db:l10n_fr_department_crm.view_crm_case_opportunities_filter +msgid "Department" +msgstr "" + +#. module: l10n_fr_department_crm +#: model:ir.model,name:l10n_fr_department_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr ""