From dd090ecb7ea922305f3eab101043e98043de533b Mon Sep 17 00:00:00 2001 From: tristan Date: Wed, 25 Mar 2026 10:16:53 +0100 Subject: [PATCH] =?UTF-8?q?feat=20:=20Ajout=20d'un=20onglet=20Observation?= =?UTF-8?q?=20sur=20la=20page=20employ=C3=A9=20+=20fonctionnalit=C3=A9=20d?= =?UTF-8?q?e=20verrouillage=20utilisateur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/packages/security.yaml | 2 + doc/functional-rules.md | 21 +- .../components/employees/ObservationTab.vue | 187 ++++++++++++++++++ frontend/composables/useEmployeeDetailPage.ts | 11 +- .../composables/useEmployeeObservation.ts | 61 ++++++ frontend/i18n/locales/fr.json | 10 + frontend/pages/employees/[id].vue | 30 ++- frontend/pages/users.vue | 40 +++- frontend/services/dto/observation.ts | 6 + frontend/services/dto/user.ts | 1 + frontend/services/observations.ts | 50 +++++ frontend/services/users.ts | 8 +- migrations/Version20260325081258.php | 32 +++ migrations/Version20260325084215.php | 26 +++ src/Entity/Observation.php | 130 ++++++++++++ src/Entity/User.php | 16 ++ src/Repository/ObservationRepository.php | 38 ++++ src/Security/UserChecker.php | 27 +++ src/State/SalaryRecapPrintProvider.php | 41 +++- templates/salary-recap/print.html.twig | 11 +- 20 files changed, 726 insertions(+), 22 deletions(-) create mode 100644 frontend/components/employees/ObservationTab.vue create mode 100644 frontend/composables/useEmployeeObservation.ts create mode 100644 frontend/services/dto/observation.ts create mode 100644 frontend/services/observations.ts create mode 100644 migrations/Version20260325081258.php create mode 100644 migrations/Version20260325084215.php create mode 100644 src/Entity/Observation.php create mode 100644 src/Repository/ObservationRepository.php create mode 100644 src/Security/UserChecker.php diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 17f38d2..647c890 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -19,6 +19,7 @@ security: pattern: ^/login_check stateless: true provider: app_user_provider + user_checker: App\Security\UserChecker json_login: check_path: /login_check username_path: username @@ -29,6 +30,7 @@ security: pattern: ^/api stateless: true provider: app_user_provider + user_checker: App\Security\UserChecker jwt: ~ logout: path: /api/logout diff --git a/doc/functional-rules.md b/doc/functional-rules.md index bdda7fc..cd9fa5a 100644 --- a/doc/functional-rules.md +++ b/doc/functional-rules.md @@ -372,7 +372,26 @@ Tous les filtres checkbox sont cochés par défaut à l'ouverture du drawer. - Justificatif Montant : upload via `/mileage_allowances/{id}/amount-receipt`, téléchargement via GET même URL - La suppression d'un frais supprime les deux fichiers justificatifs du disque -## 13) Notifications +## 13) Observations + +- Onglet "Observation" sur la fiche employé (icône `mdi:note-text-outline`) +- Entité `Observation` (table `observations`) +- Champs: + - `month` (mois, obligatoire) + - `content` (texte d'observation, obligatoire) +- Contrainte: une seule observation par mois par employé (unique sur `employee_id + month`) +- Tableau: colonnes Mois | Observation +- Drawer avec champs mois (`type="month"`) et textarea "Observation" +- CRUD standard: création, modification, suppression avec confirmation + +## 14) Verrouillage utilisateur + +- Champ `isLocked` (boolean, default false) sur l'entité `User` +- Un admin peut verrouiller/déverrouiller un utilisateur depuis la page Utilisateurs (checkbox dans le drawer) +- Un utilisateur verrouillé ne peut plus se connecter (vérification via `UserChecker` sur les firewalls `login` et `api`) +- Colonne "Statut" dans le tableau utilisateurs avec label "Actif" (vert) ou "Verrouillé" (rouge) + +## 15) Notifications - Icône cloche en topbar: - badge = nombre de notifications non lues diff --git a/frontend/components/employees/ObservationTab.vue b/frontend/components/employees/ObservationTab.vue new file mode 100644 index 0000000..87ca1b1 --- /dev/null +++ b/frontend/components/employees/ObservationTab.vue @@ -0,0 +1,187 @@ +