diff --git a/CHANGELOG.md b/CHANGELOG.md index aa7e90c3932e5e17f9a037a109179e07996be53d..57a1793057387362c0122498480a926279f619cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ CHANGELOG ========= +## [2.4.8] - 2024-12-10 +### Changement +- [Global] Divers renommages et traductions. +### Fix +- [Traitements] Fix du tri par ordre croissant ou décroissant de plusieurs colonnes dans la liste des traitements. +- [Logiciels et supports] Fix des boutons d'ajout et de génération visibles en administrateur alors que le module est inactif. +- [Violation] Fix de la date dans la confirmation d'archivage d'une violation. +- [Violation] Fix du tri par ordre croissant ou décroissant de plusieurs colonnes dans la liste des violations. +- [Preuves] Fix des actions en trop et manquantes en lecteur dans les preuves. +- [Indice de maturité] Fix de l'accès à une page de l'indice de maturité par un lecteur. +- [Espace documentaire] Fix de l'ordre d'affichage des éléments du champ des catégories dans la vue grille et liste, ainsi que dans l'ajout/modification d'un document. +- [Espace documentaire] Fix de l'accès aux documents partagés via un lien de partage. +- [Bilan] Fix du module logiciels et supports listé dans les registres recensés alors que le module est inactif. + ## [2.4.7] - 2024-11-25 ### Ajout - [Global] Ajout de la possibilité de lier des traitements, des sous-traitants, des logiciels et supports, des demandes, des violations, des preuves, ainsi que des actions de protection depuis chacun d'entre eux. @@ -35,10 +49,10 @@ CHANGELOG ### Fix - [Connexion] Fix du favicon pour être celui renseigné dans le .env. - [Tableau de bord] Fix des calculs des demandes à traiter. -- [Plan d'actions] Fix du trie par ordre croissant ou décroissant de la colonne "Date de création". +- [Plan d'actions] Fix du tri par ordre croissant ou décroissant de la colonne "Date de création". - [Plan d'actions] Fix de l'accès à la liste du plan d'actions par un lecteur. - [Espace documentaire] Fix de l'accès à la vue grille de l'espace documentaire par un lecteur. -- [Structures] Fix du trie par ordre croissant ou décroissant de plusieurs colonnes dans la liste des structures. +- [Structures] Fix du tri par ordre croissant ou décroissant de plusieurs colonnes dans la liste des structures. - [Sécurité] Cloisonnement d'accès des données, des actions et des interfaces selon le périmètre de l'utilisateur et de sa structure (modules complémentaires). - [Sécurité] Un traitement n'étant plus public ne pourra pas être consulté depuis le registre public. ### Migration @@ -55,10 +69,10 @@ CHANGELOG - [Global] Suppression de divers messages générés par console.log. - [Logiciels et supports] Suppression de la limite du nombre de caractères maximums de certains champs. ### Fix -- [Traitements] Fix du trie par ordre croissant ou décroissant de certaines colonnes. +- [Traitements] Fix du tri par ordre croissant ou décroissant de certaines colonnes. - [Traitements] Fix de la limite de caractères du message d'erreur de certains champs. - [Logiciels et supports] Fix de l'accès à la liste des logiciels et supports par un référent multi-structures. -- [Demandes] Fix du trie par ordre croissant ou décroissant de certaines colonnes. +- [Demandes] Fix du tri par ordre croissant ou décroissant de certaines colonnes. - [Bilan] Fix de certaines données présentes dans le tableau du registre des violations. - [AIPD] Fix du sommaire dans le PDF d'une AIPD. - [AIPD] Fix de la couleur de certains tags dans le PDF d'une AIPD. diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index 28c4c7b4a786f87092c6b37211e63321d17c1607..6953fcc8b93f6f43e626c4973039f996bb1b3619 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -1,5 +1,5 @@ parameters: - app.version: "2.4.7" + app.version: "2.4.8" framework: secret: '%env(APP_SECRET)%' diff --git a/config/packages/security.yaml b/config/packages/security.yaml index ffde78779a0eb282a9018da2bcba84b1ae0a0d69..a949353b69bc93962ef1839acce6752a8297b712 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -78,7 +78,7 @@ security: - { path: ^/modele-analyse, roles: ROLE_ADMIN } - { path: ^/mesure-protection, roles: ROLE_ADMIN } - { path: ^/espace-documentaire/creer$, roles: ROLE_ADMIN } - - { path: ^/espace-documentaire/telecharger, roles: ROLE_USER } + - { path: ^/espace-documentaire/telecharger, roles: ROLE_PREVIEW } - { path: ^/espace-documentaire/modifier/.+$, roles: ROLE_ADMIN } - { path: ^/espace-documentaire/supprimer/.+$, roles: ROLE_ADMIN } - { path: ^/espace-documentaire/categorie, roles: ROLE_ADMIN } diff --git a/src/Domain/Documentation/Controller/DocumentController.php b/src/Domain/Documentation/Controller/DocumentController.php index 162c0692519f391b7ef0042bd8ecd1e7c8fa0985..22755c0508cf4fb870e427801bfc26630994754e 100644 --- a/src/Domain/Documentation/Controller/DocumentController.php +++ b/src/Domain/Documentation/Controller/DocumentController.php @@ -221,10 +221,7 @@ class DocumentController extends CRUDController $user->setDocumentView(false); $this->entityManager->flush(); - $categories = $this - ->getDoctrine() - ->getRepository(Model\Category::class) - ->findAll(); + $categories = $this->categoryRepository->findAll(['name' => 'ASC']); return $this->render($this->getTemplatingBasePath('list'), [ 'objects' => $this->getListData(), @@ -242,10 +239,7 @@ class DocumentController extends CRUDController $user->setDocumentView(true); $this->entityManager->flush(); - $categories = $this - ->getDoctrine() - ->getRepository(Model\Category::class) - ->findAll(); + $categories = $this->categoryRepository->findAll(['name' => 'ASC']); return $this->render($this->getTemplatingBasePath('grid'), [ 'objects' => $this->getListData(), @@ -305,10 +299,6 @@ class DocumentController extends CRUDController if (!$doc) { throw new NotFoundHttpException('Document introuvable'); } - // check if user is creator or admin - if (!$this->authorizationChecker->isGranted('ROLE_ADMIN') && $this->userProvider->getAuthenticatedUser() !== $doc->getCreator()) { - throw new NotFoundHttpException('Document introuvable'); - } if ($doc->getIsLink()) { return $this->redirect($doc->getUrl()); diff --git a/src/Domain/Documentation/Form/Type/DocumentType.php b/src/Domain/Documentation/Form/Type/DocumentType.php index 1c2d4ced8ffc7ab3c416a069752cc228ae1ce8da..c2a59d514d1fbc14bfef3dd812dab86f0af3e837 100644 --- a/src/Domain/Documentation/Form/Type/DocumentType.php +++ b/src/Domain/Documentation/Form/Type/DocumentType.php @@ -25,6 +25,8 @@ declare(strict_types=1); namespace App\Domain\Documentation\Form\Type; use App\Domain\Documentation\Model; +use Doctrine\ORM\EntityRepository; +use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Form\AbstractType; @@ -73,8 +75,12 @@ class DocumentType extends AbstractType implements EventSubscriberInterface 'purify_html' => true, ]) ->add('categories', EntityType::class, [ - 'label' => 'documentation.document.label.categories', - 'class' => 'App\Domain\Documentation\Model\Category', + 'label' => 'documentation.document.label.categories', + 'class' => 'App\Domain\Documentation\Model\Category', + 'query_builder' => function (EntityRepository $er): QueryBuilder { + return $er->createQueryBuilder('c') + ->orderBy('c.name', 'ASC'); + }, 'choice_label' => 'name', 'multiple' => true, 'required' => false, diff --git a/src/Domain/Documentation/Model/Document.php b/src/Domain/Documentation/Model/Document.php index 4db950f56924ceca08aa84a3a349235d4a419b43..f21e087a17d1b09149f2ac0b50678913e7afcaf2 100644 --- a/src/Domain/Documentation/Model/Document.php +++ b/src/Domain/Documentation/Model/Document.php @@ -121,6 +121,8 @@ class Document * inverseJoinColumns={@ORM\JoinColumn(name="document_id", referencedColumnName="id")} * ) * + * @ORM\OrderBy({"name" = "ASC"}) + * * @var Collection|Category[] */ private $categories; diff --git a/src/Domain/Maturity/Controller/SurveyController.php b/src/Domain/Maturity/Controller/SurveyController.php index c25cfbb05dab0a07133b25f8bf501b62aaa0ea73..977c7fe02abd6263655390f914575d01e23a90a8 100644 --- a/src/Domain/Maturity/Controller/SurveyController.php +++ b/src/Domain/Maturity/Controller/SurveyController.php @@ -45,6 +45,7 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\RouterInterface; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; @@ -352,6 +353,12 @@ class SurveyController extends CRUDController /** @var User $user */ $user = $this->getUser(); + if ( + !$this->authorizationChecker->isGranted('ROLE_USER') + ) { + throw new AccessDeniedHttpException('Vous n\'avez pas accès à cette fonctionalité'); + } + return $this->render($this->getTemplatingBasePath('start'), [ 'totalItem' => $this->referentielRepository->count(), 'route' => $this->router->generate('maturity_survey_referentiel_datatables', ['collectivity' => $user->getCollectivity()->getId()->toString()]), diff --git a/src/Domain/Registry/Controller/ProofController.php b/src/Domain/Registry/Controller/ProofController.php index 43f2efa49d421a9725100b8233e743017f094e7c..7e2e6041fbe86c5411f1a3d99c7d6fa7e441c71e 100644 --- a/src/Domain/Registry/Controller/ProofController.php +++ b/src/Domain/Registry/Controller/ProofController.php @@ -472,14 +472,14 @@ class ProofController extends CRUDController { $cellContent = ''; $user = $this->userProvider->getAuthenticatedUser(); - if ($this->authorizationChecker->isGranted('ROLE_USER')) { + if ($this->authorizationChecker->isGranted('ROLE_PREVIEW')) { $cellContent .= '<a href="' . $this->router->generate('registry_proof_download', ['id' => $proof->getId()]) . '"> <i aria-hidden="true" class="fa fa-download"></i> ' . $this->translator->trans('global.action.download') . ' </a>'; } - if ($user->hasAccessTo($proof)) { + if ($this->authorizationChecker->isGranted('ROLE_USER') && $user->hasAccessTo($proof)) { if (\is_null($proof->getDeletedAt())) { $cellContent .= '<a href="' . $this->router->generate('registry_proof_edit', ['id' => $proof->getId()]) . '"> <i aria-hidden="true" class="fa fa-pencil"></i> ' . diff --git a/src/Domain/Registry/Controller/TreatmentController.php b/src/Domain/Registry/Controller/TreatmentController.php index 893d34185d3bea4fe08b9295b214770d563079ae..33ab376d06537f00b21c390ec8735c29e3477e0a 100644 --- a/src/Domain/Registry/Controller/TreatmentController.php +++ b/src/Domain/Registry/Controller/TreatmentController.php @@ -705,32 +705,31 @@ class TreatmentController extends CRUDController if ($this->userProvider->getAuthenticatedUser()->hasServices()) { return [ '1' => 'name', - '2' => 'collectivite', - '3' => 'service', - '4' => 'statut', - '5' => 'baseLegal', - '6' => 'logiciel', - '7' => 'enTantQue', - '8' => 'gestionnaire', - '9' => 'sousTraitant', - '10' => 'sensitiveData', - '11' => 'controleAcces', - '12' => 'tracabilite', - '13' => 'saving', - '14' => 'update', - '15' => 'other', - '16' => 'entitledPersons', - '17' => 'openAccounts', - '18' => 'specificitiesDelivered', - '19' => 'public', - '20' => 'responsableTraitement', - '21' => 'specific_traitement', - '22' => 'conformite_traitement', - '23' => 'avis_aipd', - '24' => 'exempt_AIPD', - '25' => 'createdAt', - '26' => 'updatedAt', - '27' => 'actions', + '2' => 'service', + '3' => 'statut', + '4' => 'baseLegal', + '5' => 'logiciel', + '6' => 'enTantQue', + '7' => 'gestionnaire', + '8' => 'sousTraitant', + '9' => 'sensitiveData', + '10' => 'controleAcces', + '11' => 'tracabilite', + '12' => 'saving', + '13' => 'update', + '14' => 'other', + '15' => 'entitledPersons', + '16' => 'openAccounts', + '17' => 'specificitiesDelivered', + '18' => 'public', + '19' => 'responsableTraitement', + '20' => 'specific_traitement', + '21' => 'conformite_traitement', + '22' => 'avis_aipd', + '23' => 'exempt_AIPD', + '24' => 'createdAt', + '25' => 'updatedAt', + '26' => 'actions', ]; } diff --git a/src/Domain/Registry/Controller/ViolationController.php b/src/Domain/Registry/Controller/ViolationController.php index 3cc504290cb48804e7357ad1e76f1f293db2c5db..700f52825dd2e3dbdc772d67b50000736fbec39c 100644 --- a/src/Domain/Registry/Controller/ViolationController.php +++ b/src/Domain/Registry/Controller/ViolationController.php @@ -237,7 +237,6 @@ class ViolationController extends CRUDController return [ 'date', 'service', - 'service', 'nature', 'inProgress', 'cause', diff --git a/src/Domain/Reporting/Generator/Word/OverviewGenerator.php b/src/Domain/Reporting/Generator/Word/OverviewGenerator.php index 000fcb2b4238f388a70fadd4cc20841d8ea79100..c5985418a83c1f32a8eb25b4ed1ac236456d9b87 100644 --- a/src/Domain/Reporting/Generator/Word/OverviewGenerator.php +++ b/src/Domain/Reporting/Generator/Word/OverviewGenerator.php @@ -270,7 +270,7 @@ class OverviewGenerator extends AbstractGenerator if (in_array(ReviewData::CONTRACTOR_REGISTRY, $collectivity->getReviewData()->getSections())) { $section->addListItem('Sous-traitants'); } - if (in_array(ReviewData::TOOL_REGISTRY, $collectivity->getReviewData()->getSections())) { + if ($collectivity->isHasModuleTools() && in_array(ReviewData::TOOL_REGISTRY, $collectivity->getReviewData()->getSections())) { $section->addListItem('Logiciels et supports'); } if (in_array(ReviewData::REQUEST_REGISTRY, $collectivity->getReviewData()->getSections())) { diff --git a/src/Infrastructure/ORM/Registry/Repository/Treatment.php b/src/Infrastructure/ORM/Registry/Repository/Treatment.php index bea9790551fd37a4875e556ecd785fc5c586a408..571eaabb7ff592e0bb3fff2cec7a491b239c2cce 100644 --- a/src/Infrastructure/ORM/Registry/Repository/Treatment.php +++ b/src/Infrastructure/ORM/Registry/Repository/Treatment.php @@ -388,6 +388,13 @@ class Treatment extends CRUDRepository implements Repository\Treatment case 'specific_traitement': $queryBuilder->addOrderBy('o.systematicMonitoring + o.largeScaleCollection + o.vulnerablePeople + o.dataCrossing + o.evaluationOrRating + o.automatedDecisionsWithLegalEffect + o.automaticExclusionService + o.innovativeUse', $orderDir); break; + case 'sousTraitant': + $queryBuilder + ->addSelect('COUNT(DISTINCT sous_traitants.id) as contractorCount') + ->addOrderBy('contractorCount', $orderDir) + ->groupBy('o.id') + ; + break; case 'service': $queryBuilder->leftJoin('o.service', 'service_sort'); $queryBuilder->addOrderBy('service_sort.name', $orderDir); diff --git a/src/Infrastructure/ORM/Registry/Repository/Violation.php b/src/Infrastructure/ORM/Registry/Repository/Violation.php index f7840ea0fd9bd092b329954fcdb4446383acdf87..0e68c2b9f0dcd7cafeb1d71c4baf35d13d0844cd 100644 --- a/src/Infrastructure/ORM/Registry/Repository/Violation.php +++ b/src/Infrastructure/ORM/Registry/Repository/Violation.php @@ -28,6 +28,7 @@ use App\Application\Traits\RepositoryUtils; use App\Domain\Registry\Dictionary\ViolationCauseDictionary; use App\Domain\Registry\Dictionary\ViolationGravityDictionary; use App\Domain\Registry\Dictionary\ViolationNatureDictionary; +use App\Domain\Registry\Dictionary\ViolationNotificationDictionary; use App\Domain\Registry\Model; use App\Domain\Registry\Repository; use App\Domain\User\Model\Collectivity; @@ -390,9 +391,18 @@ class Violation implements Repository\Violation WHEN o.gravity = \'' . ViolationGravityDictionary::GRAVITY_LIMITED . '\' THEN 2 WHEN o.gravity = \'' . ViolationGravityDictionary::GRAVITY_MAXIMUM . '\' THEN 3 WHEN o.gravity = \'' . ViolationGravityDictionary::GRAVITY_NEGLIGIBLE . '\' THEN 4 - ELSE 4 END) AS HIDDEN hidden_gravity') + ELSE 5 END) AS HIDDEN hidden_gravity') ->addOrderBy('hidden_gravity', $orderDir); break; + case 'notification': + $queryBuilder->addSelect('(case + WHEN o.notification = \'' . ViolationNotificationDictionary::NOTIFICATION_NOTHING . '\' THEN 1 + WHEN o.notification = \'' . ViolationNotificationDictionary::NOTIFICATION_CNIL . '\' THEN 2 + WHEN o.notification = \'' . ViolationNotificationDictionary::NOTIFICATION_CROSS_BORDER . '\' THEN 3 + WHEN o.notification = \'' . ViolationNotificationDictionary::NOTIFICATION_OTHER . '\' THEN 4 + ELSE 5 END) AS HIDDEN hidden_notif') + ->addOrderBy('hidden_notif', $orderDir); + break; case 'createdAt': $queryBuilder->addOrderBy('o.createdAt', $orderDir); break; diff --git a/templates/Aipd/Analyse_impact/pdf.html.twig b/templates/Aipd/Analyse_impact/pdf.html.twig index 5c8336a1cd15a3c56429354d662a2b4be2d84699..a7c1e7539c82bf7c0d502a56b358d85f0b0add63 100644 --- a/templates/Aipd/Analyse_impact/pdf.html.twig +++ b/templates/Aipd/Analyse_impact/pdf.html.twig @@ -623,10 +623,10 @@ <p>Le graphique ci dessous représente les risques résiduels sur la disponibilité, l'intégrité et la confidentialité des données à caractère personnel</p> <div class="reportGraph"><canvas id="dicResiduels-chart"></canvas></div> <div class="separator"></div> - <div>Le plan d’action ci-après présente les mesures de sécurité liées aux seuls scénarios de menaces dont l’impact est refusé.</div> + <div>Le plan d’actions ci-après présente les mesures de sécurité liées aux seuls scénarios de menaces dont l’impact est refusé.</div> <div class="separator"></div> <div class="box box-solid box-primary"> - <div class="box-header with-border">Actions conseillées par le DPD à mettre en place</div> + <div class="box-header with-border">Plan d'actions</div> <div class="box-body"> <table class="table table-bordered"> <tr> diff --git a/templates/Registry/Tool/list.html.twig b/templates/Registry/Tool/list.html.twig index f23a203758f14dc20910558956837070dbfd4715..9936ca72bdd9760ec9488cae3ead2f850aeb5c07 100644 --- a/templates/Registry/Tool/list.html.twig +++ b/templates/Registry/Tool/list.html.twig @@ -24,17 +24,17 @@ {% block body %} <div class="row"> <div class="col-xs-12 mb-1"> - {% if (is_granted('ROLE_USER') and app.user.collectivity.hasModuleTools) or is_granted('ROLE_ADMIN') %} + {% if (is_granted('ROLE_USER') and app.user.collectivity.hasModuleTools) %} <a href="{{ path('registry_tool_create') }}" class="btn btn-default"> <i aria-hidden="true" class="fa fa-plus"></i> {{ 'registry.tool.action.new'|trans }} </a> {% endif %} - {% if app.user.collectivity.hasModuleTools or is_granted('ROLE_ADMIN') %} - <a href="{{ path('registry_tool_report') }}" class="btn btn-default"> - <i aria-hidden="true" class="fa fa-clipboard-list"></i> - {{ 'global.action.report'|trans }} - </a> + {% if app.user.collectivity.hasModuleTools %} + <a href="{{ path('registry_tool_report') }}" class="btn btn-default"> + <i aria-hidden="true" class="fa fa-clipboard-list"></i> + {{ 'global.action.report'|trans }} + </a> {% endif %} {% if category is defined and category and category.documents|length > 0 %} <a href="{{ path('documentation_document_index') }}?category={{ category.id }}" class="btn btn-default pull-right"> diff --git a/templates/Registry/Treatment/list.html.twig b/templates/Registry/Treatment/list.html.twig index 8a6706ed6a6324c60bcee4a0e9f9fb659b41d281..8325de3d9413e2e2b03e1ca700e184293e3978db 100644 --- a/templates/Registry/Treatment/list.html.twig +++ b/templates/Registry/Treatment/list.html.twig @@ -313,7 +313,7 @@ {"data": "logiciel", "visible": true}, {"data": "enTantQue", "visible": false}, {"data": "gestionnaire", "visible": true}, - {"data": "sousTraitant", "visible": false, "orderable": false}, + {"data": "sousTraitant", "visible": false, "orderable": true}, {"data": "sensitiveData", "visible": true}, {"data": "controleAcces", "visible": false}, {"data": "tracabilite", "visible": false}, @@ -344,7 +344,7 @@ {"data": "logiciel", "visible": true}, {"data": "enTantQue", "visible": false}, {"data": "gestionnaire", "visible": true}, - {"data": "sousTraitant", "visible": false, "orderable": false}, + {"data": "sousTraitant", "visible": false, "orderable": true}, {"data": "sensitiveData", "visible": true}, {"data": "controleAcces", "visible": false}, {"data": "tracabilite", "visible": false}, @@ -377,7 +377,7 @@ {"data": "logiciel", "visible": true}, {"data": "enTantQue", "visible": false}, {"data": "gestionnaire", "visible": true}, - {"data": "sousTraitant", "visible": false, "orderable": false}, + {"data": "sousTraitant", "visible": false, "orderable": true}, {"data": "sensitiveData", "visible": true}, {"data": "controleAcces", "visible": false}, {"data": "tracabilite", "visible": false}, diff --git a/templates/Registry/Violation/delete.html.twig b/templates/Registry/Violation/delete.html.twig index e9f361d33b7e3019f534f1f5903f9252892f0074..eb18a1420f628ffd00f536b2856dd6e92641babf 100644 --- a/templates/Registry/Violation/delete.html.twig +++ b/templates/Registry/Violation/delete.html.twig @@ -26,7 +26,7 @@ <div class="box box-solid"> <div class="box-header"></div> <div class="box-body"> - <p>{{ 'registry.violation.label.archive_confirm'|trans({ '%date%': object.createdAt|date('d/m/Y') }) }}</p> + <p>{{ 'registry.violation.label.archive_confirm'|trans({ '%date%': object.date|date('d/m/Y') }) }}</p> </div> <div class="box-footer"> <a href="{{ path('registry_violation_list') }}" class="btn btn-default">