From 781a17836d6dc1e4126fb24e32a57a35c46bc61f Mon Sep 17 00:00:00 2001
From: Jean-Philippe Metivier <jean-philippe.metivier@unicaen.fr>
Date: Tue, 18 Mar 2025 11:43:44 +0100
Subject: [PATCH] =?UTF-8?q?Assertion=20pour=20les=20demandes=20externes=20?=
 =?UTF-8?q?+=20fix=20pour=20la=20mise=20en=20copies=20de=20sup=C3=A9rieurs?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../config/merged/demande-externe.config.php  |  4 ++
 .../src/Assertion/DemandeExterneAssertion.php | 38 ++++++++++++++-----
 .../Notification/NotificationService.php      |  1 +
 3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/module/DemandeExterne/config/merged/demande-externe.config.php b/module/DemandeExterne/config/merged/demande-externe.config.php
index c4f88ce0..2e993953 100644
--- a/module/DemandeExterne/config/merged/demande-externe.config.php
+++ b/module/DemandeExterne/config/merged/demande-externe.config.php
@@ -40,6 +40,10 @@ return [
                             DemandeexternePrivileges::DEMANDEEXTERNE_SUPPRIMER,
                             DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_AGENT,
                             DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_VALIDEUR,
+                            DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_GESTIONNAIRE,
+                            DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_RESPONSABLE,
+                            DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_DRH,
+                            DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_DGS,
                             DemandeexternePrivileges::DEMANDEEXTERNE_GERER,
                         ],
                         'resources' => ['DemandeExterne'],
diff --git a/module/DemandeExterne/src/Assertion/DemandeExterneAssertion.php b/module/DemandeExterne/src/Assertion/DemandeExterneAssertion.php
index fa24ac8c..346ef17f 100644
--- a/module/DemandeExterne/src/Assertion/DemandeExterneAssertion.php
+++ b/module/DemandeExterne/src/Assertion/DemandeExterneAssertion.php
@@ -74,9 +74,6 @@ class DemandeExterneAssertion extends AbstractAssertion
         switch ($role->getRoleId()) {
             case AppRoleProvider::ADMIN_TECH :
             case AppRoleProvider::ADMIN_FONC :
-            case AppRoleProvider::DRH :
-            case AppRoleProvider::DGS :
-            case FormationRoles::GESTIONNAIRE_FORMATION :
             case FormationRoles::RESPONSABLE_FORMATION :
                 return true;
             case AgentRoleProvider::ROLE_AGENT :
@@ -85,14 +82,28 @@ class DemandeExterneAssertion extends AbstractAssertion
             case AgentRoleProvider::ROLE_VALIDATEUR :
                 $valideurs = array_map(function (AgentValidateur $a) { return $a->getValidateur(); }, $this->getAgentValidateurService()->getAgentsValidateursByAgent($agent));
                 $isValideur = DemandeExterneAssertion::userInAgents($user, $valideurs);
-                switch ($privilege) {
-                    case DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_VALIDEUR :
-                        return $isValideur and ($demande->isEtatActif(DemandeExterneEtats::ETAT_VALIDATION_AGENT));
-                    default :
-                        return $isValideur;
-                }
+                return match ($privilege) {
+                    DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_VALIDEUR => $isValideur and ($demande->isEtatActif(DemandeExterneEtats::ETAT_VALIDATION_AGENT)),
+                    default => $isValideur,
+                };
+            case FormationRoles::GESTIONNAIRE_FORMATION :
+                return match ($privilege) {
+                    DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_GESTIONNAIRE => $demande->isEtatActif(DemandeExterneEtats::ETAT_VALIDATION_VALIDEUR),
+                    default => true
+                };
+            case AppRoleProvider::DRH :
+                return match ($privilege) {
+                    DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_DRH => $demande->isEtatActif(DemandeExterneEtats::ETAT_VALIDATION_RESPONSABLE),
+                    default => true
+                };
+            case AppRoleProvider::DGS :
+                return match ($privilege) {
+                    DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_DGS => $demande->isEtatActif(DemandeExterneEtats::ETAT_VALIDATION_DRH),
+                    default => true
+                };
             case RoleProvider::RESPONSABLE :
                 if ($privilege === DemandeexternePrivileges::DEMANDEEXTERNE_MODIFIER and !$demande->isEtatActif(DemandeExterneEtats::ETAT_CREATION_EN_COURS)) return false;
+                if ($privilege === DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_RESPONSABLE) return $demande->isEtatActif(DemandeExterneEtats::ETAT_VALIDATION_GESTIONNAIRE);
                 $structures = $this->getAgentService()->computesStructures($agent);
                 $responsables = DemandeExterneAssertion::agentInStructures(RoleProvider::RESPONSABLE, $structures);
                 return DemandeExterneAssertion::userInAgents($user, $responsables);
@@ -140,9 +151,18 @@ class DemandeExterneAssertion extends AbstractAssertion
             'valider-valideur',
             'refuser-valideur'
             => $this->computeAssertion($entity, DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_VALIDEUR),
+            'valider-gestionnaire',
+            'refuser-gestionnaire'
+            => $this->computeAssertion($entity, DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_GESTIONNAIRE),
+            'valider-responsable',
+            'refuser-responsable'
+            => $this->computeAssertion($entity, DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_RESPONSABLE),
             'valider-drh',
             'refuser-drh'
             => $this->computeAssertion($entity, DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_DRH),
+            'valider-dgs',
+            'refuser-dgs'
+            => $this->computeAssertion($entity, DemandeexternePrivileges::DEMANDEEXTERNE_VALIDER_DGS),
             default => true,
         };
     }
diff --git a/module/Formation/src/Formation/Service/Notification/NotificationService.php b/module/Formation/src/Formation/Service/Notification/NotificationService.php
index f2daee31..4b4f9146 100644
--- a/module/Formation/src/Formation/Service/Notification/NotificationService.php
+++ b/module/Formation/src/Formation/Service/Notification/NotificationService.php
@@ -285,6 +285,7 @@ class NotificationService
             $superieurs = $this->getAgentValidateurService()->getAgentsValidateursByAgent($agent);
             foreach ($superieurs as $superieur) $copie[] = $superieur->getValidateur()->getEmail();
         }
+        $copie = (empty($copie)) ? null : implode(",", $copie);
 
         if ($inscrit->getIndividu() !== null AND $inscrit->getIndividu()->getEmail() !== null) {
             $rendu = $this->getRenduService()->generateRenduByTemplateCode(MailTemplates::SESSION_CONVOCATION, $vars);
-- 
GitLab