Skip to content

#minor (2636 2637) Permettre l'export des actions aux opérateurs, administrateurs locaux #1439

Merged
superfeedboy merged 31 commits intodevelopfrom
issue/2636-2637
Mar 25, 2026
Merged

#minor (2636 2637) Permettre l'export des actions aux opérateurs, administrateurs locaux #1439
superfeedboy merged 31 commits intodevelopfrom
issue/2636-2637

Conversation

@ch-benard
Copy link
Copy Markdown
Contributor

@ch-benard ch-benard commented Mar 16, 2026

🧾 Ticket Trello

https://trello.com/c/8jz3Zzmv/2636
https://trello.com/c/lzbVwxrI/2637

🛠 Description de la PR

Accorder aux opérateurs et aux correspondants l'autorisation d'exporter les actions concernant leur territoire
Permettre aux administrateurs de donner ou retirer sélectivement l'accès aux financements des actions pour les utilisateurs ayant le rôle "Acteur national", et corriger plusieurs bugs liés à l'export des actions.

Fonctionnalités

Option d'accès aux financements

  • Ajout d'une nouvelle option access_action_finances pour le rôle "Acteur national"
  • Interface d'administration permettant d'activer/désactiver l'option via une checkbox
  • Affichage visuel de l'état de l'option (coche verte ✓ / croix rouge ✗)
  • Persistance correcte de l'état après sauvegarde

Sélection intelligente de l'année par défaut

  • L'export des actions propose maintenant automatiquement l'année la plus pertinente :
    • Année en cours - 1 si disponible
    • Sinon, l'année passée la plus récente
    • Sinon, la première année disponible

Corrections de bugs

Export des actions

  1. Erreur SQL : Correction de l'erreur "invalid reference to FROM-clause entry for table 'departements'" lors de l'export depuis un profil opérateur
  2. Sections manquantes : Les titres "Commentaires" et "Mises à jour" s'affichent maintenant correctement dans les exports sans financements
  3. Réactivité : Correction des erreurs de réactivité Vue lors de l'ouverture de la modale d'export

Interface utilisateur

  1. Dépendance circulaire : Résolution de l'erreur "Cannot access 'TableauDeBordView' before initialization" après déconnexion

Détails techniques

Backend

  • Migration de base de données pour supporter la nouvelle option
  • Correction des alias SQL dans les clauses WHERE
  • Ajustement dynamique des positions de colonnes Excel

Frontend

  • Gestion de la réactivité avec Object.assign pour préserver les références
  • Utilisation de watch avec immediate: true pour la mise à jour des valeurs calculées
  • Lazy loading des composants pour éviter les dépendances circulaires
  • Gestion correcte des objets Ref Vue

Tests réalisés

  • Activation/désactivation de l'option via l'interface admin
  • Persistance de l'état après sauvegarde et rechargement
  • Export des actions depuis un profil opérateur (sans financements)
  • Export des actions depuis un profil avec accès aux financements
  • Vérification des titres de sections dans les exports Excel
  • Sélection de l'année par défaut dans la modale d'export
  • Déconnexion sans erreur de dépendance circulaire

Corrections de dernière minutes #1

Refactorisation : Mutualisation des migrations de rafraîchissement de vues SQL

Contexte

Plusieurs migrations utilisent un pattern répétitif pour rafraîchir des vues SQL :

  • DROP VIEW dans une transaction
  • CREATE VIEW avec la nouvelle définition
  • Gestion du rollback en cas d'erreur

Ce code était dupliqué dans de nombreuses migrations, rendant la maintenance difficile.

Changements
Nouvelles fonctions mutualisées

refreshView(viewName, createOldView, createNewView)

  • Pour rafraîchir une vue SQL unique
  • Gère automatiquement les transactions et rollbacks
  • Paramètres : nom de la vue, requête SQL ancienne (rollback), requête SQL nouvelle

refreshViewCascade(views[])

  • Pour rafraîchir plusieurs vues SQL interdépendantes
  • Drop les vues dans l'ordre, recrée en ordre inverse (vues "base" d'abord)
  • Utilise reduce() pour respecter les règles ESLint
  • Paramètre : tableau d'objets {name, oldView, newView}
Migrations refactorisées
Migration Avant Après Réduction
30000070-06 39 lignes 5 lignes 87%
30000106-03 39 lignes 5 lignes 87%
30000051-01 64 lignes 42 lignes 34%
Bénéfices
  • Maintenabilité : Code centralisé dans des helpers réutilisables
  • Lisibilité : Structure déclarative plus claire
  • Cohérence : Pattern uniforme pour toutes les migrations de vues
  • Réduction de code : -89 lignes au total
  • Sécurité : Gestion des transactions et rollbacks garantie
Tests
  • Rollback de 30000106-03 : fonctionne
  • Rollback de 30000106-02 : fonctionne
  • Rollback de 30000106-01 : fonctionne
  • Les migrations utilisent les nouvelles fonctions mutualisées
Notes techniques
  • Les fonctions utilisent reduce() au lieu de for...of pour respecter les règles ESLint du projet
  • Les vues en cascade sont droppées dans l'ordre et recréées en ordre inverse pour gérer les dépendances
  • Tous les imports sont placés en haut des fichiers (conformité ESLint)

Corrections de dernière minutes #2

Corriger l'affichage du bouton "Modifier les options" qui s'affichait pour des rôles n'ayant aucune option configurable (notamment direct_collaborator).

Modifications apportées

Frontend
  1. FicheAccesActionModifyOptions.vue

    • Ajout d'une vérification dynamique hasAvailableOptions qui vérifie si le rôle possède des options dans permissions_description
    • Le bouton ne s'affiche plus que si rolePermissions.options.length > 0
    • Approche générique et maintenable : pas besoin de lister les rôles à exclure
  2. FicheAccesBodyOptions.vue

    • Alignement sur la structure de la branche develop
    • Remplacement de CheckableGroup par des composants Checkbox individuels
    • Ajout des props variant="checkbox", direction="col" et :active
    • Déplacement du bouton de validation à l'intérieur du conteneur des options
  3. ModalExportLien.vue

    • Remplacement du composant Button par DsfrButton (disponible globalement)
    • Correction : la prop :loading n'existe pas dans DsfrButton
    • Utilisation de :disabled="disabled || isLoading" à la place
Backend
  1. permissions_description.ts
    • Documentation explicite des permissions d'export des actions :
      • direct_collaborator : "Exporter les actions" (avec financements)
      • association : "Exporter les actions" (hors financements)
    • Ces permissions sont déjà accordées par la migration 30000106-01, cette modification améliore juste la documentation

Résultat

  • Le bouton "Modifier les options" ne s'affiche plus pour les rôles sans options configurables (direct_collaborator, external_observator, etc.)
  • Le panneau d'options utilise les mêmes composants que dans develop
  • Les permissions d'export sont correctement documentées
  • Correction d'un bug d'utilisation de DsfrButton avec une prop inexistante

📸 Captures d'écran

{5FC9B290-064B-4090-BB28-56CC6FB24C19}

🚨 Notes pour la mise en production

  • Migrations à exécuter:
    • 30000106-01-add-action-export-permission-to-operators-and-correspondents.js
    • 30000106-02-create-permission-option-access_action_finances.js
    • 30000106-03-refresh-user_actual_permissions-for-access_action_finances.js

@ch-benard ch-benard requested a review from superfeedboy March 16, 2026 12:56
@ch-benard ch-benard self-assigned this Mar 16, 2026
@tristanrobert
Copy link
Copy Markdown
Contributor

tristanrobert commented Mar 16, 2026

Snyk checks have passed. No issues have been found so far.

Status Scan Engine Critical High Medium Low Total (0)
Open Source Security 0 0 0 0 0 issues

💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse.

refers to https://trello.com/c/8jz3Zzmv/2636

- Ajouter l'option 'access_action_finances' au rôle national_establisment
- Créer la migration ajoutant la nouvelle option aux permissions
- Permettre un accès sélectif au financements des actions aux
  acteurs nationaux
…sations utilisateur

refers to https://trello.com/c/8jz3Zzmv/2636

- Ajouter l'affichage conditionnel des options en mode édition
- Assurer la persistance de l'état des cases à cocher après l'enregistrement
- Ajouter des indicateurs visuels (coche verte/croix rouge) en fonction de l'état des options
- Corriger les problèmes de réactivité liés à Object.assign afin de préserver les références
- Réinitialiser le formulaire lors du passage en mode édition pour afficher les valeurs actuelles des options
- S'assurer que les options sont toujours traitées comme des tableaux
 refers to https://trello.com/c/lzbVwxrI/2637

- Remplacer « departements.code » par « d.code » dans la clause WHERE
- Remplacer « regions.code » par « r.code » dans la clause WHERE
- Correction de l'erreur "référence non valide à une entrée de la clause FROM"
- S'assurer que les alias correspondent à ceux utilisés dans la requête SQL principale
… financières sont exclues

 refers to https://trello.com/c/8jz3Zzmv/2636-liste-des-actions-permettre-lexport-des-actions-par-le-correspondant-admin-local

- Déplacer la section "COMMENTAIRES" de la plage AF1:AG1 vers AD1:AF1
- Déplacer la section "MISE À JOUR" de la plage AH1:AI1 vers AG1:AH1
- Corriger l'absence de titres de section lorsque les colonnes financières ne sont pas incluses
- Ajuster les plages de colonnes de 12 positions pour tenir compte de la suppression des colonnes financières
…s l'exportation d'actions

 refers to https://trello.com/c/8jz3Zzmv/2636-liste-des-actions-permettre-lexport-des-actions-par-le-correspondant-admin-local

- Par défaut : l'année en cours - 1 si disponible
- Sinon, sélectionner l'année passée la plus récente
- Rendre par défaut à l'année la plus ancienne disponible s'il n'y a pas d'années passées
- Corriger les problèmes de réactivité liés aux valeurs d'année calculées
- Gérer la structure de l'objet Ref pour les données relatives aux années
- Utiliser watch avec le drapeau immediate pour mettre à jour l'année sélectionnée
 refers to https://trello.com/c/8jz3Zzmv/2636

- Utiliser le chargement différé pour le composant TableauDeBordView
- Remplacer l'importation directe par la syntaxe d'importation dynamique ()
- Corriger l'erreur 'Impossible d'accéder à “TableauDeBordView” avant l'initialisation'
- Prévenir les problèmes de dépendance circulaire au démarrage de l'application
…actions

- Déterminer les départements autorisés en fonction des zones d'intervention de l'utilisateur
…t de supprimer l'option elle-même

refers to https://trello.com/c/8jz3Zzmv/2636

- Eviter une erreur de contrainte de clé étrangère. Si des utilisateurs ont déjà l'option "access_action_finances" assignée dans "user_permission_options", la migration down échouera.
refers to https://trello.com/c/8jz3Zzmv/2636
refers to https://trello.com/c/lzbVwxrI/2637

- Ajoute `refreshView()` pour rafraîchir une vue SQL unique
- Ajoute `refreshViewCascade()` pour rafraîchir plusieurs vues interdépendantes
- Gère automatiquement les transactions et rollbacks
- Utilise `reduce()` pour respecter les règles ESLint (pas de `for...of` avec `await`)"
 refers to https://trello.com/c/8jz3Zzmv/2636
refers to https://trello.com/c/lzbVwxrI/2637

- Refactorise 30000070-06 : 39 lignes → 5 lignes
- Refactorise 30000106-03 : 39 lignes → 5 lignes
- Améliore la maintenabilité et réduit la duplication de code
refers to https://trello.com/c/8jz3Zzmv/2636
refers to https://trello.com/c/lzbVwxrI/2637

- Refactorise 30000051-01 : 64 lignes → 42 lignes
- Simplifie la gestion de 6 vues SQL interdépendantes
- Utilise une structure déclarative plus lisible"
@MTES-MCT MTES-MCT deleted a comment from sonarqubecloud bot Mar 23, 2026
Copy link
Copy Markdown
Contributor

@superfeedboy superfeedboy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Quelques proposition d'évolution accessibilité/DSFR et modifications visuelles des options.

…nible

refers to https://trello.com/c/8jz3Zzmv/2636
refers to https://trello.com/c/lzbVwxrI/2637

Ajouter une vérification dynamique pour afficher le bouton "Modifier les options"
uniquement si le rôle de l'utilisateur possède des options configurables dans
permissions_description. Cela évite d'afficher un bouton inutile pour les rôles
comme direct_collaborator qui n'ont pas d'options à gérer.
refers to https://trello.com/c/8jz3Zzmv/2636
refers to https://trello.com/c/lzbVwxrI/2637

Remplacer CheckableGroup par des composants Checkbox individuels
pour correspondre à la structure utilisée dans develop.
…escription

refers to https://trello.com/c/8jz3Zzmv/2636
refers to https://trello.com/c/lzbVwxrI/2637

Ajouter explicitement les permissions d'export des actions pour les rôles
direct_collaborator (avec financements) et association (hors financements)
dans leurs local_permissions respectives pour une meilleure documentation
refers to https://trello.com/c/8jz3Zzmv/2636
refers to https://trello.com/c/lzbVwxrI/2637

Remplacer le composant Button par DsfrButton.
Corriger  l'utilisation de la prop :loading qui n'existe pas dans DsfrButton
en utilisant :disabled à la place pour désactiver le bouton pendant le chargement
@sonarqubecloud
Copy link
Copy Markdown

@superfeedboy superfeedboy merged commit 30284d7 into develop Mar 25, 2026
7 checks passed
@superfeedboy superfeedboy deleted the issue/2636-2637 branch March 25, 2026 17:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants