diff --git a/crm_lead_approval/README.rst b/crm_lead_approval/README.rst
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/crm_lead_approval/__init__.py b/crm_lead_approval/__init__.py
new file mode 100644
index 00000000000..9b4296142f4
--- /dev/null
+++ b/crm_lead_approval/__init__.py
@@ -0,0 +1,2 @@
+from . import models
+from . import wizard
diff --git a/crm_lead_approval/__manifest__.py b/crm_lead_approval/__manifest__.py
new file mode 100644
index 00000000000..cef6256e5f0
--- /dev/null
+++ b/crm_lead_approval/__manifest__.py
@@ -0,0 +1,19 @@
+# Copyright 2024 INVITU SARL
+# License AGPL-3 or later (https://www.gnu.org/licenses/agpl.html).
+{
+ "name": "CRM Lead Approval",
+ "summary": "This module allows to approve or not a lead.",
+ "version": "17.0.1.0.0",
+ "author": "INVITU SARL, Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "website": "https://github.com/OCA/crm",
+ "depends": [
+ "crm",
+ ],
+ "data": [
+ "security/ir.model.access.csv",
+ "views/res_config_settings.xml",
+ "views/crm_lead_views.xml",
+ "wizard/approval_wizard_views.xml",
+ ],
+}
diff --git a/crm_lead_approval/models/__init__.py b/crm_lead_approval/models/__init__.py
new file mode 100644
index 00000000000..d80948bd5a5
--- /dev/null
+++ b/crm_lead_approval/models/__init__.py
@@ -0,0 +1,3 @@
+from . import crm_lead
+from . import res_config_settings
+from . import res_company
diff --git a/crm_lead_approval/models/crm_lead.py b/crm_lead_approval/models/crm_lead.py
new file mode 100644
index 00000000000..1e1e34714f3
--- /dev/null
+++ b/crm_lead_approval/models/crm_lead.py
@@ -0,0 +1,28 @@
+from odoo import fields, models
+
+
+class CrmLead(models.Model):
+ _inherit = "crm.lead"
+ _description = "Crm leads approval"
+
+ approval = fields.Selection(
+ [
+ ("none", "None"),
+ ("done", "Approve"),
+ ("normal", "Reserved"),
+ ("blocked", "Disapprove"),
+ ],
+ default="none",
+ tracking=True,
+ )
+ approval_comment = fields.Text(string="Observation", tracking=True)
+ to_be_approved = fields.Boolean(
+ string="To be approved", compute="_compute_approve", help="Help note"
+ )
+
+ def _compute_approve(self):
+ for record in self:
+ record.to_be_approved = (
+ record.team_id in self.env.company.approval_team_ids
+ or record.tag_ids in self.env.company.approval_tag_ids
+ )
diff --git a/crm_lead_approval/models/res_company.py b/crm_lead_approval/models/res_company.py
new file mode 100644
index 00000000000..781f0a5619a
--- /dev/null
+++ b/crm_lead_approval/models/res_company.py
@@ -0,0 +1,8 @@
+from odoo import fields, models
+
+
+class ResCompany(models.Model):
+ _inherit = "res.company"
+
+ approval_team_ids = fields.Many2many("crm.team", string="Authorized Sales Teams")
+ approval_tag_ids = fields.Many2many("crm.tag", string="Authorized Tags")
diff --git a/crm_lead_approval/models/res_config_settings.py b/crm_lead_approval/models/res_config_settings.py
new file mode 100644
index 00000000000..9aac2b01ae5
--- /dev/null
+++ b/crm_lead_approval/models/res_config_settings.py
@@ -0,0 +1,18 @@
+from odoo import fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+ _inherit = "res.config.settings"
+
+ approval_team_ids = fields.Many2many(
+ "crm.team",
+ string="Authorized Sales Teams",
+ readonly=False,
+ related="company_id.approval_team_ids",
+ )
+ approval_tag_ids = fields.Many2many(
+ "crm.tag",
+ string="Authorized CRM Tags",
+ readonly=False,
+ related="company_id.approval_tag_ids",
+ )
diff --git a/crm_lead_approval/pyproject.toml b/crm_lead_approval/pyproject.toml
new file mode 100644
index 00000000000..4231d0cccb3
--- /dev/null
+++ b/crm_lead_approval/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/crm_lead_approval/security/ir.model.access.csv b/crm_lead_approval/security/ir.model.access.csv
new file mode 100644
index 00000000000..bd1b6e5b0e5
--- /dev/null
+++ b/crm_lead_approval/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_crm_approval_wizard,access_crm_approval_wizard,model_crm_approval_wizard,base.group_user,1,1,1,1
diff --git a/crm_lead_approval/views/crm_lead_views.xml b/crm_lead_approval/views/crm_lead_views.xml
new file mode 100644
index 00000000000..9f353745543
--- /dev/null
+++ b/crm_lead_approval/views/crm_lead_views.xml
@@ -0,0 +1,67 @@
+
%s:
%s