Skip to content

Amelioration: ETQ instructeur/usager, tracking et revert des valeurs preremplies par referentiel#13231

Merged
mfo merged 5 commits into
demarche-numerique:mainfrom
mfo:mfo/referentiel-f2-tracking-revert
Jul 17, 2026
Merged

Amelioration: ETQ instructeur/usager, tracking et revert des valeurs preremplies par referentiel#13231
mfo merged 5 commits into
demarche-numerique:mainfrom
mfo:mfo/referentiel-f2-tracking-revert

Conversation

@mfo

@mfo mfo commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Probleme

Quand un champ est prerempli via un referentiel, il n'y a aucun moyen de savoir si l'usager a modifie la valeur originale. L'instructeur ne peut pas distinguer une valeur verifiee d'une valeur alteree. L'usager ne peut pas revenir a la valeur du referentiel apres modification.

Solution

  • Colonne prefilled_data (jsonb) sur champs : stocke la valeur originale au moment du preremplissage
  • ChampPrefillTrackingConcern : detection de modification (prefilled_value_modified?) et revert (revert_to_prefilled_value!)
  • Cote usager : bouton "Remplir a nouveau automatiquement" (via Turbo Stream, reutilise la vue :update existante)
  • Cote instructeur : badge "Donnee verifiee du referentiel" (succes) ou "Donnee du referentiel modifiee par l'usager" (warning)
  • Propagation stream/clone : clone_value_from et Champ#clone preservent prefilled et prefilled_data — corrige la perte du tracking sur les buffer streams (en construction) et le clone de dossiers
  • Revert robuste : revert_to_prefilled_value! reset value, value_json, data, external_id avant de reappliquer prefilled_data, evitant des donnees derivees incoherentes (ex: ancien external_id + data d'un fetch precedent)

Screenshots (vue usager)

Etat initial / apres revert — champs preremplis, pas de modification

screenshot-prefill-initial.png

Apres modification — bouton "Remplir a nouveau automatiquement" visible

screenshot-prefill-modified.png

Vue Instructeur/Expert/Usager sur le dossier — affichage du badge non changé, affichage de l'info que ça a été changé

Capture d'écran 2026-06-03 à 10 19 14 AM

Generated with Claude Code

@mfo
mfo force-pushed the mfo/referentiel-f2-tracking-revert branch 3 times, most recently from d1eae68 to 690f3d5 Compare June 3, 2026 08:23
@tchak

tchak commented Jun 3, 2026

Copy link
Copy Markdown
Member

Tu veux que ça marche aussi en construction ? Il faut alors cloner le JSON des valeurs originales. Je ne suis pas sûr qu'on veuille ça, mais je pose ça là pour que tu vérifies le comportement que tu veux. La question se pose aussi pour le clone des dossiers remplis : embarquer ou pas ces valeurs originales ?

@mfo mfo self-assigned this Jun 4, 2026
@mfo mfo added this to The Kanban Jun 4, 2026
@mfo mfo moved this to En cours in The Kanban Jun 4, 2026
@mfo
mfo force-pushed the mfo/referentiel-f2-tracking-revert branch 4 times, most recently from 864571e to 5afc0cd Compare June 5, 2026 09:02
@mfo mfo changed the title WIP DO NOT REVIEW - Amelioration: ETQ instructeur/usager, tracking et revert des valeurs preremplies par referentiel Amelioration: ETQ instructeur/usager, tracking et revert des valeurs preremplies par referentiel Jun 8, 2026
@mfo
mfo marked this pull request as ready for review June 8, 2026 08:07
@mfo
mfo force-pushed the mfo/referentiel-f2-tracking-revert branch from 5afc0cd to 6fe17a4 Compare June 8, 2026 09:24
@mfo
mfo force-pushed the mfo/referentiel-f2-tracking-revert branch 4 times, most recently from ddae0b4 to 6c24aa0 Compare July 2, 2026 15:02
Comment thread app/models/concerns/champ_prefill_tracking_concern.rb Outdated
@tchak

tchak commented Jul 10, 2026

Copy link
Copy Markdown
Member

On est d’accord que cela ne concerne que le preremplissage par les référentiels. Je demande cela parce que nous exposons le flag prefilledValueModified sur l’API, et j’ai peur qu’il soit mal compris. On parle souvent de prefilled en termes d’API de préremplissage. Et surtout, le flag prefilled sur l’API peut vouloir dire l’un comme l’autre. Est-ce qu’on va aussi étendre le système au préremplissage par API à un moment ?

before_action :redirect_if_hidden_or_deleted_dossier, only: [:show]
before_action :ensure_ownership_or_invitation!, only: ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update_siret, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :update, :champ]
before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update_siret, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :update, :champ, :revert_prefill]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

il faut aussi ajouter dans set_dossier_stream un test pour vérifier que ça fonctionne sur un dossier "en construction". Actuellement, je suppose que ça ne fonctionne pas

@tchak tchak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Il faut gérer clone_value_from et clone sur le Champ

@tchak

tchak commented Jul 10, 2026

Copy link
Copy Markdown
Member

Et on est d’accord, pour l’instant, la fonction n’est pas accessible lors de l’édition du dossier par l’instructeur ? Et les annotations privées, pas de reset non plus ?

@mfo
mfo force-pushed the mfo/referentiel-f2-tracking-revert branch from 6c24aa0 to d71829f Compare July 10, 2026 15:58
@mfo

mfo commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

On est d’accord que cela ne concerne que le preremplissage par les référentiels. Je demande cela parce que nous exposons le flag prefilledValueModified sur l’API, et j’ai peur qu’il soit mal compris. On parle souvent de prefilled en termes d’API de préremplissage. Et surtout, le flag prefilled sur l’API peut vouloir dire l’un comme l’autre. Est-ce qu’on va aussi étendre le système au préremplissage par API à un moment ?

Je pense qu'il faudrait que ca supporte les deux systèmes. Dans un cas comme dans l'autre, du pre-remplissage a été présent, ETQ instructeur, on aimerait savoir quand ça a été modifié. ETQ usager, on aimerait pouvoir faire marche arriere. Qu'en penses-tu ? je suis d'avis d'avoir la demande/v2 [la c'etait pour accompagner api meublé si ils font des conditions d'inéligibilités] ? dans cette PR ?

@mfo
mfo force-pushed the mfo/referentiel-f2-tracking-revert branch from d71829f to 5ba6f1b Compare July 16, 2026 14:36
@mfo

mfo commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

Et on est d’accord, pour l’instant, la fonction n’est pas accessible lors de l’édition du dossier par l’instructeur ? Et les annotations privées, pas de reset non plus ?

heuuuu, maintenant que j'ai corrigé le bug, nous sommes d'accord ;-) donc merci tchak :-)

@mfo
mfo force-pushed the mfo/referentiel-f2-tracking-revert branch 2 times, most recently from 959b144 to 00a4859 Compare July 16, 2026 15:39
@mfo
mfo requested a review from tchak July 16, 2026 15:47
mfo and others added 5 commits July 17, 2026 11:14
Add jsonb nullable column to store the original prefilled value.
This enables tracking whether the user modified a referentiel-prefilled champ.

ADD COLUMN NULL is metadata-only on PostgreSQL — no table rewrite,
instant on 1M+ rows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…illed_original_value in ReferentielChamp + specs

Add concern with three methods:
- prefilled_value_modified? — detects if user changed a prefilled value
- prefilled_value_matches_current? — compares current vs original
- revert_to_prefilled_value! — restores original value
- Store the original prefilled attributes (value or external_id) in
- prefilled_original_value when update_prefillable_champ runs.
- Re-prefill overwrites with the new value.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…e + controller revert_prefill + specs

Add PATCH champs/:stable_id/revert_prefill route and controller action.
Restores the prefilled original value via turbo_stream re-render.
Guarded by ensure_ownership_or_invitation! and ensure_dossier_can_be_updated.

Add revert button visible when user modifies a prefilled champ.
Uses DSFR tertiary button style, triggers turbo_stream PATCH
to revert_prefill action. Integrated in editable_champ_component after InputStatusMessage.

End-to-end tests verifying:
- Revert button appears when prefilled value is modified
- Revert button does not appear when value is unchanged

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add badge visible by instructeur/expert on prefilled champs:
- "Donnee verifiee du referentiel" (success) when unchanged
- "Donnee du referentiel modifiee par l'usager" (warning) when modified

Not shown to usagers or on old dossiers without prefilled_original_value.

tests: system spec instructeur badge prefilled + fix badge placement

Move ChampPrefilledBadgeComponent render outside RowShowComponent block.
RowShowComponent only renders named slots (value, blank) — content in
the block outside slots is silently ignored.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@mfo
mfo force-pushed the mfo/referentiel-f2-tracking-revert branch from 00a4859 to 75a8865 Compare July 17, 2026 09:15
@mfo
mfo enabled auto-merge July 17, 2026 09:15
@mfo
mfo added this pull request to the merge queue Jul 17, 2026
Merged via the queue into demarche-numerique:main with commit fa6f86d Jul 17, 2026
19 checks passed
@mfo
mfo deleted the mfo/referentiel-f2-tracking-revert branch July 17, 2026 09:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: En cours

Development

Successfully merging this pull request may close these issues.

2 participants