diff --git a/AGENTS.md b/AGENTS.md index 02f1a16..b91a212 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,6 +13,13 @@ Arborescence clé: - `tests/`: TU backend (PHPUnit) - `frontend/`: app Nuxt (pages, composants, composables, services) - `migrations/`: migrations Doctrine +- `doc/`: documentation fonctionnelle et règles métier de référence + +## 1.1) Référentiel Fonctionnel (obligatoire) + +- Référence principale des règles métier: `doc/functional-rules.md` +- Toute intervention doit commencer par une vérification de cohérence avec cette documentation. +- Règle permanente: à chaque développement qui modifie le fonctionnel, la documentation dans `doc/` doit être mise à jour automatiquement dans la même intervention (pas de report). ## 2) Commandes utiles diff --git a/doc/functional-rules.md b/doc/functional-rules.md new file mode 100644 index 0000000..93902b1 --- /dev/null +++ b/doc/functional-rules.md @@ -0,0 +1,134 @@ +# Règles Fonctionnelles SIRH + +Ce document centralise les règles métier actuellement implémentées dans l'application. + +## 1) Utilisateurs et accès + +- `ROLE_ADMIN` + - accès complet aux écrans d'administration + - vue semaine des heures + - validation RH des lignes d'heures +- `ROLE_SELF` + - accès limité à son périmètre personnel +- Accès "Sites" (via `user_site_roles` avec rôle `SITE_ACCESS`) + - accès au périmètre des sites autorisés + - validation site des lignes d'heures + +## 2) Contrats + +- Le profil de temps de travail est porté par `Contract`: + - `trackingMode`: `TIME` ou `PRESENCE` + - `weeklyHours` (ex: 35, 39, 4, etc.) +- La nature RH est portée par période employé: + - `CDI`, `CDD`, `INTERIM` +- Historique des contrats employé: + - table `employee_contract_periods` + - un employé peut avoir plusieurs périodes + +### Règles de période + +- `CDI`: + - `endDate` doit être vide +- `CDD` / `INTERIM`: + - `endDate` obligatoire +- `endDate` ne peut pas être antérieure à `startDate` + +## 3) Heures (vue jour) + +- Saisie par salarié et par date: + - matin / après-midi / soir + - pour `PRESENCE`: demi-journées matin/après-midi +- Calculs affichés: + - `Jour`, `Nuit`, `Total` +- Heures de nuit: + - fenêtres `00:00-06:00` et `21:00-24:00` + +## 4) Absences + +- Les absences sont stockées par jour (découpage lors de l'écriture) +- Une absence peut être: + - journée complète + - demi-journée `AM` ou `PM` +- Colonne absence (vue jour): + - affiche le libellé + - fond coloré selon le type d'absence +- Si plusieurs absences de couleurs différentes sur le même jour: + - fallback rouge + +### Effet absence sur les heures + +- Absence `AM`: + - efface les heures du matin +- Absence `PM`: + - efface les heures d'après-midi et du soir +- Absence journée: + - efface toutes les plages horaires + +### Absences "comptées comme travaillées" + +- Si `countAsWorkedHours = true`: + - `TIME`: crédit de minutes selon contrat actif du jour + - `PRESENCE`: crédit d'unités (0.5 / demi-journée) + +## 5) Validations des lignes d'heures + +- Validation RH (`isValid`) + - action admin +- Validation site (`isSiteValid`) + - action chef de site + +### Verrouillage + +- Ligne validée RH: + - verrouillée pour modifications heures/absences +- Ligne validée site: + - verrouillée pour non-admin + - admin peut corriger +- Toute vraie modification d'une ligne: + - remet `isSiteValid = false` + - remet `isValid = false` +- Si aucun changement réel à l'enregistrement: + - les validations existantes ne sont pas altérées + +## 6) Heures supplémentaires (vue semaine) + +- Base de calcul: + - dépend du contrat actif par jour +- Tranche 25%: + - contrats <= 35h: de 35h à 43h + - contrats >= 39h: de 39h à 43h +- Tranche 50%: + - au-delà de 43h +- Nature `INTERIM`: + - pas de bonus 25% + - pas de bonus 50% + - pas de total récup + +## 7) Fériés + +- Les jours fériés sont identifiés et affichés +- Règle courante: + - absences bloquées sur jour férié + - saisie d'heures autorisée + +## 8) Impression absences (PDF) + +Filtres disponibles: +- période `from` / `to` +- sites +- nature de contrat (`CDI`, `CDD`, `INTERIM`) +- temps de travail (contrats de type Forfait, 35h, 39h, etc.) + +Tous les filtres checkbox sont cochés par défaut à l'ouverture du drawer. + +## 9) Employés + +- Création employé: + - prénom, nom, site + - type de contrat (nature RH) + - temps de travail + - dates début/fin (selon règles nature) +- Modification employé: + - uniquement prénom, nom, site + - pas de modification de contrat depuis ce drawer + diff --git a/frontend/components/AppTopNav.vue b/frontend/components/AppTopNav.vue new file mode 100644 index 0000000..4ceed70 --- /dev/null +++ b/frontend/components/AppTopNav.vue @@ -0,0 +1,43 @@ + + + diff --git a/frontend/components/EmployeeNameFilterInput.vue b/frontend/components/EmployeeNameFilterInput.vue index 8bc04fb..f77a596 100644 --- a/frontend/components/EmployeeNameFilterInput.vue +++ b/frontend/components/EmployeeNameFilterInput.vue @@ -1,18 +1,26 @@ diff --git a/frontend/components/SiteFilterSelector.vue b/frontend/components/SiteFilterSelector.vue index 405e40b..9e50590 100644 --- a/frontend/components/SiteFilterSelector.vue +++ b/frontend/components/SiteFilterSelector.vue @@ -1,25 +1,70 @@ diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue index ead9d69..bc96701 100644 --- a/frontend/layouts/default.vue +++ b/frontend/layouts/default.vue @@ -73,9 +73,12 @@ -
- -
+
+ +
+ +
+
diff --git a/frontend/pages/employees/[id].vue b/frontend/pages/employees/[id].vue new file mode 100644 index 0000000..d88e610 --- /dev/null +++ b/frontend/pages/employees/[id].vue @@ -0,0 +1,71 @@ + + + diff --git a/frontend/pages/employees.vue b/frontend/pages/employees/index.vue similarity index 83% rename from frontend/pages/employees.vue rename to frontend/pages/employees/index.vue index aa08583..a1a6d0b 100644 --- a/frontend/pages/employees.vue +++ b/frontend/pages/employees/index.vue @@ -1,24 +1,22 @@