From 3f1c6dbab8f3055ffb573df3ad4be35eca13bdb0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20BOYER?= <t.boyer@si17.lan>
Date: Thu, 13 Feb 2025 17:44:08 +0100
Subject: [PATCH] [Bilan] Fix calcul et paragraphe des sous-traitants

---
 CHANGELOG.md                                  |  5 +-
 .../Generator/Word/ContractorGenerator.php    | 58 +++++++++++++------
 2 files changed, 43 insertions(+), 20 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index e5c075358..1b2eb5b2f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,6 @@ CHANGELOG
 =========
 ## [2.4.9] - 2025-XX-XX
 ### Ajout
-- [Global] Ajout des champs absents dans les documents Word générés depuis la liste des différents modules.
 - [Formulaire] Ajout d'un label aux champs type et liste des structures dans la gestion des droits des modèles d'AIPD et dans les référentiels, ainsi que dans la duplication.
 - [Accessibilité] Ajout du plan d'actions 2025.
 - [Preuves] Ajout de la possibilité de déposer des documents ayant comme extension .txt, .log, .csv et .md.
@@ -24,14 +23,16 @@ CHANGELOG
 - [Traitements] Le critère « Décisions automatisées avec effet » est renommé en « Décision automatique avec effet juridique ».
 - [Traitements] Le critère « Exclusion automatique d'un service » est renommé en « Exclusion du bénéfice d’un droit, d’un service ou contrat ».
 - [Traitements] Déplacement des mesures de sécurité et confidentialité par ordre alphabétique.
+- [Sous-traitants] Inversion de la case à cocher de l'envoi de données hors UE en dans l'UE.
 - [Indice de maturité] Modification du bouton de modification pour s'afficher que s'il y a des préconisations dans la synthèse d'un indice de maturité.
 - [Bilan] Modification de l'affichage des données du dernier indice de maturité dans le bilan.
 - [AIPD] Modification des dates des avis des acteurs pour ne rien afficher par défaut dans le PDF d'une AIPD.
 ### Fix
-- [Traitements] Fix de certains champs manquants dans le document Word généré depuis la liste des traitements.
+- [Global] Fix de certains champs manquants dans les documents PDF et Word générés depuis les différents modules.
 - [Indice de maturité] Fix de l'affichage du graphique dans le bilan et la synthèse d'un indice de maturité.
 - [Bilan] Fix de l'affichage de la date dans le tableau des actions de protection mises en place.
 - [Bilan] Fix de certaines données présentes dans le tableau annexe du registre des traitements.
+- [Bilan] Fix de certaines données calculées dans le paragraphe du registre des sous-traitants.
 - [Registre public] Fix affichage des durées de conservation.
 - [Migration] Fix d'une migration qui cause une erreur lors du déploiement.
 
diff --git a/src/Domain/Reporting/Generator/Word/ContractorGenerator.php b/src/Domain/Reporting/Generator/Word/ContractorGenerator.php
index 652ab0ad9..838bd1c1f 100644
--- a/src/Domain/Reporting/Generator/Word/ContractorGenerator.php
+++ b/src/Domain/Reporting/Generator/Word/ContractorGenerator.php
@@ -56,6 +56,25 @@ class ContractorGenerator extends AbstractGenerator implements ImpressionGenerat
         $nbMaintainsTreatmentRegister = 0;
         $nbSendingDataOutsideEu       = 0;
 
+        foreach ($data as $contractor) {
+            // Verified contractual clauses
+            if ($contractor->isContractualClausesVerified()) {
+                ++$nbVerifiedContractualClauses;
+            }
+            // Adopted security features
+            if ($contractor->isAdoptedSecurityFeatures()) {
+                ++$nbAdoptedSecurityFeatures;
+            }
+            // Maintains treatment register
+            if ($contractor->isMaintainsTreatmentRegister()) {
+                ++$nbMaintainsTreatmentRegister;
+            }
+            // Sending data outside EU
+            if (!$contractor->isSendingDataOutsideEu()) {
+                ++$nbSendingDataOutsideEu;
+            }
+        }
+
         $section->addTitle('Registre des sous-traitants', 2);
 
         if (empty($data)) {
@@ -65,7 +84,27 @@ class ContractorGenerator extends AbstractGenerator implements ImpressionGenerat
         }
 
         $section->addText("Un recensement des sous-traitants gérants des données à caractère personnel de {$collectivity} a été effectué.");
-        $section->addText("Il y a {$nbContractors} sous-traitants identifiés, les clauses contractuelles de {$nbVerifiedContractualClauses} d’entre eux ont été vérifiées. {$nbAdoptedSecurityFeatures} sous-traitants ont adopté les éléments de sécurité nécessaires. {$nbMaintainsTreatmentRegister} sous-traitants tiennent à jour un registre des traitements. {$nbSendingDataOutsideEu} sous-traitants envois des données hors UE.");
+        $section->addText("Il y a " . ($nbContractors == 1 ? " un sous-traitant identifié." : "{$nbContractors} sous-traitants identifiés."));
+        $section->addListItem(
+            ($nbVerifiedContractualClauses == 0 ? "Aucune clause contractuelle n’a été vérifiée ;" :
+            ($nbVerifiedContractualClauses == 1 ? "1 clause contractuelle a été vérifiée ;" :
+            "{$nbVerifiedContractualClauses} clauses contractuelles vérifiées ;"))
+        );
+        $section->addListItem(
+            ($nbAdoptedSecurityFeatures == 0 ? "Aucun sous-traitant n’a adopté les éléments de sécurité nécessaires ;" :
+            ($nbAdoptedSecurityFeatures == 1 ? "1 sous-traitant a adopté les éléments de sécurité nécessaires ;" :
+            "{$nbAdoptedSecurityFeatures} sous-traitants ont adopté les éléments de sécurité nécessaires ;"))
+        );
+        $section->addListItem(
+            ($nbMaintainsTreatmentRegister == 0 ? "Aucun sous-traitant ne tient à jour un registre des traitements ;" :
+            ($nbMaintainsTreatmentRegister == 1 ? "1 sous-traitant tient à jour un registre des traitements ;" :
+            "{$nbMaintainsTreatmentRegister} sous-traitants tiennent à jour un registre des traitements ;"))
+        );
+        $section->addListItem(
+            ($nbSendingDataOutsideEu == 0 ? "Aucun sous-traitant n'envoie des données hors Union européenne." :
+            ($nbSendingDataOutsideEu == 1 ? "1 sous-traitant envoie des données hors Union européenne." :
+            "{$nbSendingDataOutsideEu} sous-traitants envoient des données hors Union européenne."))
+        );
 
         $ContractorsListTable = $section->addTable($this->tableStyle);
         $ContractorsListTable->addRow(null, ['tblHeader' => true, 'cantsplit' => true]);
@@ -89,23 +128,6 @@ class ContractorGenerator extends AbstractGenerator implements ImpressionGenerat
             $cell->addText($contractor->isMaintainsTreatmentRegister() ? 'Oui' : 'Non');
             $cell = $ContractorsListTable->addCell(1500);
             $cell->addText($contractor->isSendingDataOutsideEu() ? 'Oui' : 'Non');
-
-            // Verified contractual clauses
-            if ($contractor->isContractualClausesVerified()) {
-                ++$nbVerifiedContractualClauses;
-            }
-            // Adopted security features
-            if ($contractor->isAdoptedSecurityFeatures()) {
-                ++$nbAdoptedSecurityFeatures;
-            }
-            // Maintains treatment register
-            if ($contractor->isMaintainsTreatmentRegister()) {
-                ++$nbMaintainsTreatmentRegister;
-            }
-            // Sending data outside EU
-            if (!$contractor->isSendingDataOutsideEu()) {
-                ++$nbSendingDataOutsideEu;
-            }
         }
     }
 
-- 
GitLab