diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index b4d48bd7a0ce8a4daa48e3c579bd6f659ff4aafe..74a4acb8f47165575be30d4c8dd96b2a7473bc63 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 6e31eb96bbe40ddb957b0e0616960dcb9a689eb1..b68d32bcc473715f048ab0d301102ce6bd4f60ad 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 bf253ceb7b877e12b10853b488564ddb0a3bd18e..7b6a397c2ba9a15a1a36014dd12dc4f7bba0428e 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 0000000000000000000000000000000000000000..fefceb280d28574a2f99ba260a6f0b8efd138d00
--- /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 a41534ddf76b19083d70e88a01cd81f08e8c42f5..d6978945468fb84c5f21e6f9e91863a26f08fc2b 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 0000000000000000000000000000000000000000..c991b8e6b6d11b504721c1746fa7a566e5db6685
--- /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 60fd631360dd46a7d55f405999f9c4f8edcf19bd..59cc615b1db4bec302794c822cf6875596361105 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 0000000000000000000000000000000000000000..f935d1b182a113c2baa7c0a8d380301883934e84
--- /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 c3b793dbcd7aee223a0cccb3bc071d30855f5365..6d1c21f33c670627e0fe250e151441697d6dff93 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"