diff --git a/partner_skills/__init__.py b/partner_skills/__init__.py
new file mode 100644
index 0000000..0650744
--- /dev/null
+++ b/partner_skills/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/partner_skills/__manifest__.py b/partner_skills/__manifest__.py
new file mode 100644
index 0000000..f244f7b
--- /dev/null
+++ b/partner_skills/__manifest__.py
@@ -0,0 +1,20 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+{
+ 'name': 'Partner Skills',
+ 'summary': "Add skill managment on partners",
+ 'version': "16.0.1.0.0",
+ 'author': "Clément Thomas",
+ 'license': "AGPL-3",
+ 'maintainer': 'Elabore',
+ 'category': 'Partner Tools',
+ 'website': 'https://odoo-community.org/',
+ 'depends': ['contacts'],
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'views/res_partner_skill_views.xml',
+ 'views/res_partner_views.xml',
+ ],
+ 'auto_install': False,
+ 'installable': True,
+}
diff --git a/partner_skills/i18n/fr.po b/partner_skills/i18n/fr.po
new file mode 100644
index 0000000..0a6a0b4
--- /dev/null
+++ b/partner_skills/i18n/fr.po
@@ -0,0 +1,143 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * partner_skills
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-10-28 08:49+0000\n"
+"PO-Revision-Date: 2024-10-28 08:49+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: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__active
+msgid "Active"
+msgstr "Actif"
+
+#. module: partner_skills
+#: model_terms:ir.ui.view,arch_db:partner_skills.res_partner_skill_view_search
+msgid "Archived"
+msgstr "Archivé"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__child_ids
+msgid "Child Skills"
+msgstr "Sous-Compétences"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__color
+msgid "Color"
+msgstr "Couleur"
+
+#. module: partner_skills
+#: model:ir.model,name:partner_skills.model_res_partner
+msgid "Contact"
+msgstr "Contact"
+
+#. module: partner_skills
+#: model_terms:ir.actions.act_window,help:partner_skills.action_partner_skill_form
+msgid "Create a Skill"
+msgstr "Créer une compétence"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__create_uid
+msgid "Created by"
+msgstr "Créée par"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__create_date
+msgid "Created on"
+msgstr "Crée le"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__display_name
+msgid "Display Name"
+msgstr "Nom"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__id
+msgid "ID"
+msgstr "ID"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill____last_update
+msgid "Last Modified on"
+msgstr "Dernière modification le"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__write_uid
+msgid "Last Updated by"
+msgstr "Dernière mise à jour par"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__write_date
+msgid "Last Updated on"
+msgstr "Dernière mise à jour le"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__parent_path
+msgid "Parent Path"
+msgstr "Chemin parent"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__parent_id
+msgid "Parent Skill"
+msgstr "Compétence parente"
+
+#. module: partner_skills
+#: model:ir.model,name:partner_skills.model_res_partner_skill
+msgid "Partner skill"
+msgstr "Compétence des partenaires"
+
+#. module: partner_skills
+#: model_terms:ir.ui.view,arch_db:partner_skills.res_partner_skill_view_search
+msgid "Search Partner Skills"
+msgstr "Recherche Compétences des partenaires"
+
+#. module: partner_skills
+#: model_terms:ir.ui.view,arch_db:partner_skills.view_partner_search_favorite
+#: model_terms:ir.ui.view,arch_db:partner_skills.view_partner_skill_form
+msgid "Skill"
+msgstr "Compétence"
+
+#. module: partner_skills
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner_skill__name
+msgid "Skill Name"
+msgstr "Nom de la compétence"
+
+#. module: partner_skills
+#: model:ir.actions.act_window,name:partner_skills.action_partner_skill_form
+#: model:ir.model.fields,field_description:partner_skills.field_res_partner__skill_ids
+#: model:ir.model.fields,field_description:partner_skills.field_res_users__skill_ids
+#: model:ir.ui.menu,name:partner_skills.menu_partner_skill_form
+#: model_terms:ir.ui.view,arch_db:partner_skills.view_partner_skill_list
+msgid "Skills"
+msgstr "Compétences"
+
+#. module: partner_skills
+#: model:ir.model.fields,help:partner_skills.field_res_partner_skill__active
+msgid "The active field allows you to hide the skill without removing it."
+msgstr "Le champ actif vous permet de cacher la compétence sans la supprimer."
+
+#. module: partner_skills
+#. odoo-python
+#: code:addons/partner_skills/models/res_partner_skill.py:0
+#, python-format
+msgid "You can not create recursive skills."
+msgstr "Vous ne pouvez pas créer de compétences récursives."
+
+#. module: partner_skills
+#: model_terms:ir.ui.view,arch_db:partner_skills.view_partner_skill_form
+msgid "e.g. \"Project management\""
+msgstr "ex: \"Gestion de projet\""
+
+#. module: partner_skills
+#: model_terms:ir.ui.view,arch_db:partner_skills.view_partner_form_skills
+msgid "e.g. \"Project management\", ..."
+msgstr "ex: \"Gestion de projet\""
diff --git a/partner_skills/models/__init__.py b/partner_skills/models/__init__.py
new file mode 100644
index 0000000..cac5d71
--- /dev/null
+++ b/partner_skills/models/__init__.py
@@ -0,0 +1,2 @@
+from . import res_partner
+from . import res_partner_skill
\ No newline at end of file
diff --git a/partner_skills/models/res_partner.py b/partner_skills/models/res_partner.py
new file mode 100644
index 0000000..f30acb5
--- /dev/null
+++ b/partner_skills/models/res_partner.py
@@ -0,0 +1,10 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+import logging
+from odoo import fields, models
+
+
+
+class ResPartner(models.Model):
+ _inherit = 'res.partner'
+
+ skill_ids = fields.Many2many('res.partner.skill', string='Skills')
\ No newline at end of file
diff --git a/partner_skills/models/res_partner_skill.py b/partner_skills/models/res_partner_skill.py
new file mode 100644
index 0000000..f8f4d65
--- /dev/null
+++ b/partner_skills/models/res_partner_skill.py
@@ -0,0 +1,50 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+from odoo import fields, models, api, _
+from random import randint
+from odoo.exceptions import ValidationError
+
+
+class ResPartnerSkill(models.Model):
+ _name = 'res.partner.skill'
+
+ _description = 'Partner skill'
+ _order = 'name'
+ _parent_store = True
+
+ def _get_default_color(self):
+ return randint(1, 11)
+
+ name = fields.Char(string='Skill Name', required=True, translate=True)
+ color = fields.Integer(string='Color', default=_get_default_color)
+ parent_id = fields.Many2one('res.partner.skill', string='Parent Skill', index=True, ondelete='cascade')
+ child_ids = fields.One2many('res.partner.skill', 'parent_id', string='Child Skills')
+ active = fields.Boolean(default=True, help="The active field allows you to hide the skill without removing it.")
+ parent_path = fields.Char(index=True, unaccent=False)
+
+ @api.constrains('parent_id')
+ def _check_parent_id(self):
+ if not self._check_recursion():
+ raise ValidationError(_('You can not create recursive skills.'))
+
+ def name_get(self):
+ """ Return the skills' display name, including their direct
+ parent by default.
+ """
+ res = []
+ for skill in self:
+ names = []
+ current = skill
+ while current:
+ names.append(current.name)
+ current = current.parent_id
+ res.append((skill.id, ' / '.join(reversed(names))))
+ return res
+
+ @api.model
+ def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
+ args = args or []
+ if name:
+ # Be sure name_search is symetric to name_get
+ name = name.split(' / ')[-1]
+ args = [('name', operator, name)] + args
+ return self._search(args, limit=limit, access_rights_uid=name_get_uid)
\ No newline at end of file
diff --git a/partner_skills/security/ir.model.access.csv b/partner_skills/security/ir.model.access.csv
new file mode 100644
index 0000000..2203a1b
--- /dev/null
+++ b/partner_skills/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"
+"access_res_partner_skill_group_user","res_partner_skill group_user","model_res_partner_skill","base.group_user",1,0,0,0
+"access_res_partner_skill_group_partner_manager","res_partner_skill group_partner_manager","model_res_partner_skill","base.group_partner_manager",1,1,1,1
\ No newline at end of file
diff --git a/partner_skills/views/res_partner_skill_views.xml b/partner_skills/views/res_partner_skill_views.xml
new file mode 100644
index 0000000..966eb28
--- /dev/null
+++ b/partner_skills/views/res_partner_skill_views.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+ Skills
+ res.partner.skill
+
+
+
+
+
+
+ Skills
+ res.partner.skill
+
+
+
+
+
+
+
+
+
+
+ res.partner.skill.view.search
+ res.partner.skill
+
+
+
+
+
+
+
+
+
+
+
+ Skills
+ ir.actions.act_window
+ res.partner.skill
+
+
+
+ Create a Skill
+
+
+
+
+
+
diff --git a/partner_skills/views/res_partner_views.xml b/partner_skills/views/res_partner_views.xml
new file mode 100644
index 0000000..bbb7486
--- /dev/null
+++ b/partner_skills/views/res_partner_views.xml
@@ -0,0 +1,50 @@
+
+
+
+
+ Add skills on partner kanban view
+ res.partner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Add skills on partner form view
+ res.partner
+ 13
+
+
+
+
+
+
+
+
+
+
+
+ Add favorite star
+ res.partner
+
+
+
+
+
+
+
+
+
+
+