diff --git a/models/calendar.py b/models/calendar.py
index 7eee2bb42aacb086c5b12ed84fd9c10a32c76872..9022995d4a88b05c708a94b62f830f730f1dc1d7 100644
--- a/models/calendar.py
+++ b/models/calendar.py
@@ -5,7 +5,7 @@ import pytz
 from datetime import timedelta
 
 from odoo import models, fields, api
-from odoo.exceptions import UserError
+from odoo.exceptions import UserError, ValidationError
 
 
 class CGScopCalendar(models.Model):
@@ -107,6 +107,31 @@ class CGScopCalendar(models.Model):
            fields.Datetime.now() > self.coop_id.ur_regional_convention_date:
             self.ur_regional_convention_id = self.coop_id.ur_regional_convention_id
 
+    # ------------------------------------------------------
+    # Contrains
+    # ------------------------------------------------------
+    @api.constrains('project_id', 'start', 'stop')
+    def _check_activity_code(self):
+        for event in self:
+            if event.project_id:
+                # Récupère les entrées en intersection
+                # avec la plage horaire
+                entries = self.search([
+                    '|',
+                    '&',
+                    ('start', '>', event.start),
+                    ('start', '<', event.stop),
+                    '&',
+                    ('stop', '>', event.start),
+                    ('stop', '<', event.stop),
+                    ('user_id', '=', self.env.uid),
+                    ('project_id', '=', event.project_id.id),
+                    ('id', '!=', event.id)])
+                if entries:
+                    raise ValidationError(
+                        "Vous ne pourvez programmer 2 évènements avec le "
+                        "même code activité sur la même plage horaire")
+
     # ------------------------------------------------------
     # Fonction boutons
     # ------------------------------------------------------