From 0ad0478df66907eb70aaadc08323c444bed039e9 Mon Sep 17 00:00:00 2001
From: benjamin <benjamin@le-filament.com>
Date: Thu, 18 Jul 2024 16:04:17 +0200
Subject: [PATCH] [UPD] Add departments

---
 .pre-commit-config.yaml       |  7 ++++++-
 __manifest__.py               |  2 ++
 models/__init__.py            |  1 +
 models/res_department.py      | 26 ++++++++++++++++++++++++++
 models/res_partner.py         | 23 +++++++++++++++++++++++
 security/ir.model.access.csv  |  3 +++
 security/partner_security.xml |  4 +++-
 views/res_department.xml      | 28 ++++++++++++++++++++++++++++
 views/res_partner.xml         |  3 +++
 9 files changed, 95 insertions(+), 2 deletions(-)
 create mode 100644 models/res_department.py
 create mode 100644 security/ir.model.access.csv
 create mode 100644 views/res_department.xml

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index b4d48bd..74a4acb 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -27,6 +27,11 @@ repos:
         entry: found forbidden files; remove them
         language: fail
         files: "\\.rej$"
+      - id: en-po-files
+        name: en.po files cannot exist
+        entry: found a en.po file
+        language: fail
+        files: '[a-zA-Z0-9_]*/i18n/en\.po$'
   - repo: https://github.com/oca/maintainer-tools
     rev: dfba427ba03900b69e0a7f2c65890dc48921d36a
     hooks:
@@ -96,7 +101,7 @@ repos:
       - id: pyupgrade
         args: ["--keep-percent-format"]
   - repo: https://github.com/PyCQA/isort
-    rev: 5.9.3
+    rev: 5.12.0
     hooks:
       - id: isort
         name: isort except __init__.py
diff --git a/__manifest__.py b/__manifest__.py
index 6e31eb9..b68d32b 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -9,8 +9,10 @@
     "data": [
         # security
         "security/partner_security.xml",
+        "security/ir.model.access.csv",
         # datas
         # views
+        "views/res_department.xml",
         "views/res_partner.xml",
         # views menu
         # wizard
diff --git a/models/__init__.py b/models/__init__.py
index bf253ce..7b6a397 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -1,4 +1,5 @@
 # Copyright 2023 Le Filament (https://le-filament.com)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 
+from . import res_department
 from . import res_partner
diff --git a/models/res_department.py b/models/res_department.py
new file mode 100644
index 0000000..fefceb2
--- /dev/null
+++ b/models/res_department.py
@@ -0,0 +1,26 @@
+# © 2019 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import fields, models
+
+
+class ResDepartment(models.Model):
+    _description = "Départements"
+    _name = "res.department"
+    _order = "code"
+
+    name = fields.Char(string="Nom", size=128, required=True)
+    code = fields.Char(
+        string="Numéro",
+        size=3,
+        required=True,
+    )
+    state_id = fields.Many2one(comodel_name="res.country.state", string="Région")
+
+    _sql_constraints = [
+        (
+            "code_uniq",
+            "unique (code)",
+            "You cannot have two departments with the same code!",
+        )
+    ]
diff --git a/models/res_partner.py b/models/res_partner.py
index a41534d..d697894 100644
--- a/models/res_partner.py
+++ b/models/res_partner.py
@@ -14,6 +14,13 @@ class ResPartner(models.Model):
     user_id = fields.Many2one(default=lambda self: self.env.user)
 
     # New fields
+    department_id = fields.Many2one(
+        comodel_name="res.department",
+        string="Département",
+        compute="_compute_department_id",
+        store=True,
+        readonly=False,
+    )
     is_purchasing_centre = fields.Boolean(
         string="Est une centrale d'achat",
         default=False,
@@ -40,6 +47,22 @@ class ResPartner(models.Model):
     # ------------------------------------------------------
     # Computed fields / Search Fields
     # ------------------------------------------------------
+    @api.depends("zip", "country_id")
+    def _compute_department_id(self):
+        for partner in self:
+            if partner.zip and partner.country_id == self.env.ref("base.fr"):
+                try:
+                    zip_dep = partner.zip[:2]
+                    if zip_dep == "97":
+                        zip_dep = partner.zip[:3]
+
+                    partner.department_id = (
+                        self.env["res.department"]
+                        .sudo()
+                        .search([("code", "=", zip_dep)])
+                    )
+                except Exception:
+                    partner.department_id = False
 
     # ------------------------------------------------------
     # Onchange / Constraints
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
new file mode 100644
index 0000000..c991b8e
--- /dev/null
+++ b/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+user_res_department,user_res_department,model_res_department,,1,0,0,0
+admin_res_department,admin_res_department,model_res_department,base.group_erp_manager,1,1,1,1
diff --git a/security/partner_security.xml b/security/partner_security.xml
index 60fd631..59cc615 100644
--- a/security/partner_security.xml
+++ b/security/partner_security.xml
@@ -15,7 +15,9 @@
     <record id="res_partner_vendor" model="ir.rule">
         <field name="name">res.partner.vendor</field>
         <field name="model_id" ref="base.model_res_partner" />
-        <field name="domain_force">['|', '|', ('user_id', '=', user.id), ('partner_share', '=', False), ('is_purchasing_centre', '=', True)]</field>
+        <field
+            name="domain_force"
+        >['|', '|', ('user_id', '=', user.id), ('partner_share', '=', False), ('is_purchasing_centre', '=', True)]</field>
         <field name="groups" eval="[(4, ref('emgidi_partner.group_partner_vendor'))]" />
     </record>
 </odoo>
diff --git a/views/res_department.xml b/views/res_department.xml
new file mode 100644
index 0000000..f935d1b
--- /dev/null
+++ b/views/res_department.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <record id="res_department_tree_view" model="ir.ui.view">
+        <field name="name">res.department.tree</field>
+        <field name="model">res.department</field>
+        <field name="arch" type="xml">
+            <tree editable="top">
+                <field name="code" />
+                <field name="name" />
+                <field name="state_id" />
+            </tree>
+        </field>
+    </record>
+
+    <record id="res_department_act_window" model="ir.actions.act_window">
+        <field name="name">Départements</field>
+        <field name="type">ir.actions.act_window</field>
+        <field name="res_model">res.department</field>
+        <field name="view_mode">tree</field>
+    </record>
+
+    <menuitem
+        id="menu_action_department"
+        action="res_department_act_window"
+        parent="contacts.menu_localisation"
+        sequence="100"
+    />
+</odoo>
diff --git a/views/res_partner.xml b/views/res_partner.xml
index c3b793d..6d1c21f 100644
--- a/views/res_partner.xml
+++ b/views/res_partner.xml
@@ -41,6 +41,9 @@
         <field name="model">res.partner</field>
         <field name="inherit_id" ref="base.view_partner_form" />
         <field name="arch" type="xml">
+            <xpath expr="//field[@name='vat']" position="before">
+                <field name="department_id" options="{'no_create': 1, 'no_edit': 1}" />
+            </xpath>
             <xpath expr="//group/group[2]" position="after">
                 <group
                     name="purchasing_centre"
-- 
GitLab