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