From e4b6244bcfab1b9123b34f53c46a37bca758b0b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9o=20BOYER?= <t.boyer@si17.lan>
Date: Mon, 10 Mar 2025 14:38:29 +0100
Subject: [PATCH] =?UTF-8?q?Changelog=20+=20Crit=C3=A8res=20de=20risques=20?=
 =?UTF-8?q?+=20Message=20donn=C3=A9es=20sensibles?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- Ajout d'un message si des données sensibles sont sélectionnées
- Maj traductions
- Maj Changelog
- Fix console Uncaught ReferenceError: $ is not defined dans l'évaluation de la conformité d'un traitement
---
 CHANGELOG.md                                  |  7 +++
 .../registry/translations/messages.fr.yaml    |  5 +-
 docs/docutilisateur.md                        |  4 +-
 .../Word/ConformiteTraitementGenerator.php    |  2 +-
 .../Generator/Word/TreatmentGenerator.php     |  2 +-
 .../Conformite_traitement/_form.html.twig     | 32 ++++-------
 .../Conformite_traitement/_form_js.html.twig  | 53 +++++++++++++++++++
 templates/Registry/Treatment/_form.html.twig  |  4 ++
 .../Registry/Treatment/_form_render.html.twig | 53 +++++++++++++++++++
 templates/Registry/Treatment/list.html.twig   |  6 +--
 10 files changed, 138 insertions(+), 30 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index cd257f108..239bf5c44 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@ CHANGELOG
 ### Ajout
 - [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.
+- [Traitements] Ajout d'un message si une ou plusieurs données sensibles sont sélectionnées dans le champ « Catégorie de données ».
 - [Preuves] Ajout de la possibilité de déposer des documents ayant comme extension .txt, .log, .csv et .md.
 - [Bilan] Ajout du score moyen de l'indice de maturité dans le bilan et dans le document Word de synthèse.
 - [Référentiels] Ajout du nom de l'élément modifié dans la gestion des droits des référentiels.
@@ -20,6 +21,7 @@ CHANGELOG
 - [Traitements] Déplacement des champs finalités et état.
 - [Traitements] Modification du champ finalités en sélecteur.
 - [Traitements] Déplacement du consentement demandé et du format du bloc détails au bloc informations générales.
+- [Traitements] Le terme « Traitement spécifique » est renommé en « Critères de risques ».
 - [Traitements] Déplacement des critères spécifiques par ordre alphabétique.
 - [Traitements] Le critère « Croisement de données » est renommé en « Croisement d’ensemble de données ».
 - [Traitements] Le critère « Décisions automatisées avec effet » est renommé en « Décision automatique avec effet juridique ».
@@ -36,11 +38,16 @@ CHANGELOG
 - [AIPD] Suppression du bouton pour enregistrer un brouillon dans l'étape 5 d'évaluation d'une AIPD.
 ### Fix
 - [Global] Fix de certains champs manquants dans les documents PDF et Word générés depuis les différents modules.
+- [Global] Fix des liaisons entre les éléments de même module.
+- [Actions de protection] Fix de la liaison avec une preuve.
 - [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.
 - [AIPD] Fix de coquilles dans le modèle d'AIPD par défaut.
+- [Structures] Fix du message d'erreur lorsque deux SIRENS sont identiques.
+- [Structures] Fix de la gestion du logo de la structure depuis la visualisation de sa structure.
+- [Structures] Fix de suppression d'une structure si des utilisateurs ont des notifications liées.
 - [Registre public] Fix affichage des durées de conservation.
 - [Migration] Fix d'une migration qui peut causer une erreur lors du déploiement.
 
diff --git a/config/domain/registry/translations/messages.fr.yaml b/config/domain/registry/translations/messages.fr.yaml
index e786e89e9..b73fa85fd 100644
--- a/config/domain/registry/translations/messages.fr.yaml
+++ b/config/domain/registry/translations/messages.fr.yaml
@@ -49,6 +49,8 @@ registry:
             data_category_other: Autres catégories
             recipient_category: Catégorie de destinataires
             exempt_AIPD: Est exempté d'AIPD
+            sensitive_data: Données sensibles
+            sensitive_data_selected: Une ou plusieurs données sensibles ont été sélectionnées.
             large_scale_collection: Collecte à large échelle
             data_crossing: Croisement d’ensemble de données
             automated_decisions_with_legal_effect: Décision automatique avec effet juridique
@@ -97,7 +99,6 @@ registry:
             deactivate_all_confirm: Souhaitez-vous vraiment désactiver %object% traitement%s% ?
             public_registry_message: La configuration du registre public permet de choisir les champs du registre des traitements qui seront accessibles en lecture dans le registre public.
         list:
-            sensitive_data: Données sensibles
             entitled_persons: Ressortir les personnes habilitées
             open_accounts: Procédure d’ouverture des comptes clairement identifiée
             procedure: Procédure
@@ -116,7 +117,7 @@ registry:
             last_aipd: Analyse d'impact
             recipients: Destinataires
             security: Mesures de sécurité et confidentialité
-            specific: Traitement spécifique
+            specific: Critères de risques
             statut_dpo: Statut et préconisations DPD
         flashbag:
             success:
diff --git a/docs/docutilisateur.md b/docs/docutilisateur.md
index 3792bdf08..0c5222495 100644
--- a/docs/docutilisateur.md
+++ b/docs/docutilisateur.md
@@ -219,9 +219,9 @@ Dans les destinataires des données, il est possible de renseigner les élément
 
 ``Astuce : Recenser un sous-traitant avant un traitement permet de le rattacher directement au moment de la création du traitement.``
 
-#### Traitement spécifique
+#### Critères de risques
 
-Un ou plusieurs traitements spécifiques vont peut-être conditionner une analyse d’impact, notamment s'ils sont croisés avec des données sensibles. Il est possible de renseigner les éléments suivants :
+Un ou plusieurs critères de risques vont peut-être conditionner une analyse d’impact, notamment s'ils sont croisés avec des données sensibles. Il est possible de renseigner les éléments suivants :
 * **Est exempté d'AIPD** : Si le traitement est exempté, il n'y aura pas d'indication alertant de la nécessité de réaliser une AIPD. Il est cependant toujours possible d'en réaliser une si souhaité ;
 * **Collecte à large échelle** : Vise à traiter un volume considérable de données à caractère personnel, par exemple au niveau régional... ;
 * **Croisement d’ensemble de données** : Croisement ou combinaison d’ensemble de données ;
diff --git a/src/Domain/Reporting/Generator/Word/ConformiteTraitementGenerator.php b/src/Domain/Reporting/Generator/Word/ConformiteTraitementGenerator.php
index 9f9139be8..f1e6785f7 100644
--- a/src/Domain/Reporting/Generator/Word/ConformiteTraitementGenerator.php
+++ b/src/Domain/Reporting/Generator/Word/ConformiteTraitementGenerator.php
@@ -204,7 +204,7 @@ class ConformiteTraitementGenerator extends AbstractGenerator implements Impress
 
         $tableNeedAipd = $section->addTable($tableStyleConformite);
         $tableNeedAipd->addRow(null, ['tblHeader' => true, 'cantsplit' => true]);
-        foreach (['Nom du traitement', 'Données sensibles', 'Traitement spécifique'] as $element) {
+        foreach (['Nom du traitement', 'Données sensibles', 'Critères de risques'] as $element) {
             $cell = $tableNeedAipd->addCell(2500, $this->cellHeadStyle);
             $cell->addText($element, $this->textHeadStyle);
         }
diff --git a/src/Domain/Reporting/Generator/Word/TreatmentGenerator.php b/src/Domain/Reporting/Generator/Word/TreatmentGenerator.php
index 35fa660c0..a683b5d5d 100644
--- a/src/Domain/Reporting/Generator/Word/TreatmentGenerator.php
+++ b/src/Domain/Reporting/Generator/Word/TreatmentGenerator.php
@@ -531,7 +531,7 @@ class TreatmentGenerator extends AbstractGenerator implements ImpressionGenerato
             $section->addTitle('Destinataires', 3);
             $this->addTable($section, $goalData, false, self::TABLE_ORIENTATION_VERTICAL);
 
-            $section->addTitle('Traitement spécifique', 3);
+            $section->addTitle('Critères de risques', 3);
             $this->addTable($section, $specificData, false, self::TABLE_ORIENTATION_VERTICAL);
 
             $section->addTitle('Détails - Personnes concernées', 3);
diff --git a/templates/Registry/Conformite_traitement/_form.html.twig b/templates/Registry/Conformite_traitement/_form.html.twig
index ea1ccd9e6..92a5bf33a 100644
--- a/templates/Registry/Conformite_traitement/_form.html.twig
+++ b/templates/Registry/Conformite_traitement/_form.html.twig
@@ -5,29 +5,19 @@
 {% endif %}
 
 {{ form_start(form) }}
-
-<div class="row"></div>
-{% do form.reponses.setRendered() %}
-{% include 'Registry/Conformite_traitement/_form_reponse.html.twig' with {'form': form.reponses} %}
-<div class="content-header content-header-custom-padding">
-    <h1>
-        {{ 'registry.treatment.title.edit'|trans }}
-        <small>{{ form.vars.value }}</small>
-    </h1>
-</div>
-
-{% include 'Registry/Treatment/_form.html.twig' with {'form': form.traitement, 'object': form.vars.value.traitement} %}
-{% do form.traitement.setRendered() %}
-
-
+    {% do form.reponses.setRendered() %}
+    {% include 'Registry/Conformite_traitement/_form_reponse.html.twig' with {'form': form.reponses} %}
+    <div class="content-header content-header-custom-padding">
+        <h1>
+            {{ 'registry.treatment.title.edit'|trans }}
+            <small>{{ form.vars.value }}</small>
+        </h1>
+    </div>
+
+    {% include 'Registry/Treatment/_form.html.twig' with {'form': form.traitement, 'object': form.vars.value.traitement} %}
+    {% do form.traitement.setRendered() %}
 {{ form_end(form) }}
 
 {% block javascripts %}
-<script>
-    $(document).ready(function(){
-
-    });
-
-</script>
     {{ encore_entry_script_tags('js/collectionManager') }}
 {% endblock %}
diff --git a/templates/Registry/Conformite_traitement/_form_js.html.twig b/templates/Registry/Conformite_traitement/_form_js.html.twig
index 8739b8360..53f745606 100644
--- a/templates/Registry/Conformite_traitement/_form_js.html.twig
+++ b/templates/Registry/Conformite_traitement/_form_js.html.twig
@@ -95,5 +95,58 @@
             }
         })
 
+        // Fonction pour vérifier l'affichage de l'élément "sensitiveData"
+        function checkSelectedItems() {
+            var shouldDisplay = false;  // Flag pour déterminer si on doit afficher le texte
+
+            // 1. Vérification des éléments du <select> au chargement de la page
+            $('#treatment_dataconformite_traitement_traitement_dataCategoriesCategories option').each(function() {
+                var optionSelected = $(this).is(':selected');  // Vérifier si l'option est sélectionnée
+                var fontWeight = $(this).css('font-weight');
+
+                // Vérifier si l'option est sélectionnée et en gras
+                if (optionSelected && fontWeight === '700') {  // 700 correspond à 'bold'
+                    shouldDisplay = true;  // On marque qu'on doit afficher l'élément
+                }
+            });
+
+            // Si un élément en gras et sélectionné est trouvé dans le <select>, on affiche l'élément
+            if (shouldDisplay) {
+                $('.sensitiveData').show();
+            } else {
+                $('.sensitiveData').hide();
+            }
+
+            // 2. Vérification des éléments du dropdown si l'utilisateur interagit avec la liste
+            $('#conformite_traitement_traitement_dataCategories').closest('.dropdown').find('ul.dropdown-menu a').each(function() {
+                var ariaSelected = $(this).attr('aria-selected');
+                var fontWeight = $(this).css('font-weight');
+
+                // Si un élément est sélectionné et en gras
+                if (ariaSelected === "true" && fontWeight === '700') {
+                    shouldDisplay = true;  // On marque qu'on doit afficher l'élément
+                }
+            });
+
+            // Si un élément en gras et sélectionné est trouvé dans le dropdown, on affiche l'élément
+            if (shouldDisplay) {
+                $('.sensitiveData').show();
+            } else {
+                $('.sensitiveData').hide();
+            }
+        }
+
+        // Vérifie l'état initial dès que la page est chargée (sur <select>)
+        checkSelectedItems();
+
+        // Lors du changement dans le dropdown (changement dans <select>)
+        $('#conformite_traitement_traitement_dataCategories').on('changed.bs.select', function() {
+            checkSelectedItems();
+        });
+
+        // Lorsqu'un élément <a> est sélectionné/déselectionné dans le dropdown
+        $('#conformite_traitement_traitement_dataCategories').on('click', '.dropdown-menu a', function() {
+            checkSelectedItems();
+        });
     })
 </script>
diff --git a/templates/Registry/Treatment/_form.html.twig b/templates/Registry/Treatment/_form.html.twig
index ea9bd5bfa..d826ac6fa 100644
--- a/templates/Registry/Treatment/_form.html.twig
+++ b/templates/Registry/Treatment/_form.html.twig
@@ -105,6 +105,10 @@
             <div class="box-header with-border"><h3 class="box-title">{{ 'registry.treatment.tab.specific'|trans }}</h3></div>
             <div class="box-body">
                 {{ form_row(form.exempt_AIPD) }}
+                <p class="sensitiveData callout callout-default text-muted">
+                    <i aria-hidden="true" class="fa fa-square-check"></i> <strong>{{ 'registry.treatment.label.sensitive_data'|trans }}</strong><br>
+                    {{ 'registry.treatment.label.sensitive_data_selected'|trans }}
+                </p>
                 {{ form_row(form.largeScaleCollection) }}
                 {{ form_row(form.dataCrossing) }}
                 {{ form_row(form.automatedDecisionsWithLegalEffect) }}
diff --git a/templates/Registry/Treatment/_form_render.html.twig b/templates/Registry/Treatment/_form_render.html.twig
index c40c3ade5..a98eb4d3f 100644
--- a/templates/Registry/Treatment/_form_render.html.twig
+++ b/templates/Registry/Treatment/_form_render.html.twig
@@ -55,5 +55,58 @@
         $('#treatment_legalBasis').on('change', function(){
             toggleConsentFields();
         });
+
+        // Fonction pour vérifier l'affichage de l'élément "sensitiveData"
+        function checkSelectedItems() {
+            // 1. Vérification des éléments du <select> au chargement de la page
+            var shouldDisplay = false;  // Flag pour déterminer si on doit afficher le texte
+
+            // Recherche des éléments sélectionnés et en gras dans le <select>
+            $('#treatment_dataCategories option:selected').each(function() {
+                var fontWeight = $(this).css('font-weight');
+
+                if (fontWeight === '700') {  // 700 correspond à 'bold'
+                    shouldDisplay = true;  // On marque qu'on doit afficher l'élément
+                }
+            });
+
+            // Si un élément en gras et sélectionné est trouvé dans le <select>, on affiche l'élément
+            if (shouldDisplay) {
+                $('.sensitiveData').show();
+            } else {
+                $('.sensitiveData').hide();
+            }
+
+            // 2. Vérification des éléments du dropdown si l'utilisateur interagit avec la liste
+            $('#treatment_dataCategories').closest('.dropdown').find('ul.dropdown-menu a').each(function() {
+                var ariaSelected = $(this).attr('aria-selected');
+                var fontWeight = $(this).css('font-weight');
+
+                // Si un élément est sélectionné et en gras
+                if (ariaSelected === "true" && fontWeight === '700') {
+                    shouldDisplay = true;  // On marque qu'on doit afficher l'élément
+                }
+            });
+
+            // Si un élément en gras et sélectionné est trouvé dans le dropdown, on affiche l'élément
+            if (shouldDisplay) {
+                $('.sensitiveData').show();
+            } else {
+                $('.sensitiveData').hide();
+            }
+        }
+
+        // Vérifie l'état initial dès que la page est chargée (sur <select>)
+        checkSelectedItems();
+
+        // Lors du changement dans le dropdown (changement dans <select>)
+        $('#treatment_dataCategories').on('changed.bs.select', function() {
+            checkSelectedItems();
+        });
+
+        // Lorsqu'un élément <a> est sélectionné/déselectionné dans le dropdown
+        $('#treatment_dataCategories').on('click', '.dropdown-menu a', function() {
+            checkSelectedItems();
+        });
     });
 </script>
diff --git a/templates/Registry/Treatment/list.html.twig b/templates/Registry/Treatment/list.html.twig
index 68bd1b6f8..d29447be7 100644
--- a/templates/Registry/Treatment/list.html.twig
+++ b/templates/Registry/Treatment/list.html.twig
@@ -137,7 +137,7 @@
                                 </th>
                                 <th scope="col">
                                     <select class="form-control" id="search_sensitive_data" style="width: 100%;">
-                                        <option value="">{{ 'registry.treatment.list.sensitive_data'|trans }}</option>
+                                        <option value="">{{ 'registry.treatment.label.sensitive_data'|trans }}</option>
                                         <option value="1">{{ 'global.label.yes'|trans }}</option>
                                         <option value="0">{{ 'global.label.no'|trans }}</option>
                                     </select>
@@ -215,7 +215,7 @@
                                             <option value="{{ key }}">{{ subject }}</option>
                                         {% endfor %}
                                     </select>
-                                </th> <!-- Traitement spécifique -->
+                                </th> <!-- Critères de risques -->
                                 <th scope="col"> <!-- Conformité Traitement -->
                                     <select class="form-control" id="search_conformite_traitement" style="width: 100%;">
                                         <option value="">{{ 'registry.conformite_traitement.label.conformite_traitement'|trans }}</option>
@@ -262,7 +262,7 @@
                                 <th scope="col">{{ 'registry.treatment.label.author'|trans }}</th>
                                 <th scope="col">{{ 'registry.treatment.label.manager'|trans }}</th>
                                 <th scope="col">{{ 'global.label.linked_contractor'|trans }}</th>
-                                <th scope="col">{{ 'registry.treatment.list.sensitive_data'|trans }}</th>
+                                <th scope="col">{{ 'registry.treatment.label.sensitive_data'|trans }}</th>
                                 <th scope="col">{{ 'registry.treatment.label.security_access_control'|trans }}</th>
                                 <th scope="col">{{ 'registry.treatment.label.security_update'|trans }}</th>
                                 <th scope="col">{{ 'registry.treatment.label.security_saving'|trans }}</th>
-- 
GitLab