From 22bbaa0ed34b2b88ad81c7e268d5c05fd9eddc0f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= <laurent.lecluse@unicaen.fr>
Date: Wed, 26 Apr 2023 15:58:24 +0200
Subject: [PATCH] =?UTF-8?q?#46387=20on=20peut=20saisir=20des=20d=C3=A9roga?=
 =?UTF-8?q?tions=20avant=20d'avoir=20des=20heures=20=C3=A0=20plafonner?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 module/Plafond/src/Service/PlafondService.php | 48 +++++++++++++------
 1 file changed, 33 insertions(+), 15 deletions(-)

diff --git a/module/Plafond/src/Service/PlafondService.php b/module/Plafond/src/Service/PlafondService.php
index 3f923e1c5c..aa1ee7205b 100755
--- a/module/Plafond/src/Service/PlafondService.php
+++ b/module/Plafond/src/Service/PlafondService.php
@@ -107,25 +107,43 @@ class PlafondService extends AbstractEntityService
 
 
 
-    /**
-     * @param TypeVolumeHoraire                                                          $typeVolumeHoraire
-     * @param Structure|Intervenant|ElementPedagogique|VolumeHoraire|FonctionReferentiel $entity
-     *
-     * @return PlafondControle[]
-     */
     public function derogations(TypeVolumeHoraire $typeVolumeHoraire, Intervenant $intervenant): array
     {
-        $sqls = [];
-
-        $sqls[] = $this->makeControleQuery($typeVolumeHoraire, $intervenant, null, false, false, false);
-        //$sqls[] = $this->makeControleQuery($typeVolumeHoraire, $intervenant, PlafondPerimetre::STRUCTURE, false, false, false);
-        //$sqls[] = $this->makeControleQuery($typeVolumeHoraire, $intervenant, PlafondPerimetre::ELEMENT, false, false, false);
-        //$sqls[] = $this->makeControleQuery($typeVolumeHoraire, $intervenant, PlafondPerimetre::REFERENTIEL, false, false, false);
-        //$sqls[] = $this->makeControleQuery($typeVolumeHoraire, $intervenant, PlafondPerimetre::VOLUME_HORAIRE, false, false, false);
+        $sql = "
+        SELECT
+          p.id id,
+          p.numero numero,
+          p.libelle libelle,
+          p.message message,
+          pp.code perimetre,
+          pe.code etat,
+          CASE pe.code WHEN 'bloquant' THEN 1 ELSE 0 END bloquant,
+          CASE WHEN COALESCE(tpi.heures,0) - ps.heures > 0 THEN 1 ELSE 0 END depassement,
+          COALESCE(tpi.heures,0) heures,
+          ps.heures plafond,
+          COALESCE(pd.heures,0) derogation
+        FROM
+          intervenant i
+          JOIN type_volume_horaire tvh ON 1=1
+          JOIN statut s ON s.id = i.statut_id
+          JOIN plafond_statut ps ON ps.statut_id = s.id AND ps.histo_destruction IS NULL
+          JOIN plafond p ON p.id = ps.plafond_id
+          JOIN plafond_perimetre pp ON pp.id = p.plafond_perimetre_id
+          JOIN plafond_etat pe ON pe.id = CASE tvh.code WHEN 'PREVU' THEN ps.plafond_etat_prevu_id WHEN 'REALISE' THEN ps.plafond_etat_realise_id ELSE 0 END
+          LEFT JOIN tbl_plafond_intervenant tpi ON tpi.intervenant_id = i.id AND tpi.plafond_id = p.id AND tpi.type_volume_horaire_id = tvh.id
+          LEFT JOIN plafond_derogation pd ON pd.histo_destruction IS NULL AND pd.intervenant_id = i.id AND pd.plafond_id = p.id
+        WHERE
+          i.id = :intervenant
+          AND tvh.id = :typeVolumeHoraire
+          AND pe.code NOT IN ('desactive', 'indicateur')
+        ";
 
-        $sql = implode("\n\nUNION ALL\n\n", $sqls);
+        $params = [
+            'intervenant' => $intervenant->getId(),
+            'typeVolumeHoraire' => $typeVolumeHoraire->getId(),
+        ];
+        $res = $this->getEntityManager()->getConnection()->fetchAllAssociative($sql, $params);
 
-        $res          = $this->getEntityManager()->getConnection()->fetchAllAssociative($sql);
         $depassements = [];
         foreach ($res as $r) {
             $depassements[] = PlafondControle::fromArray($r);
-- 
GitLab