Commit ff2036f3 authored by Kourser's avatar Kourser
Browse files

Variables : ne plus afficher « {{media}} » à un joueur

Le fichier posait la règle : « repli générique : garantit qu'aucun de
ces jetons ne reste visible côté joueur ». Cinq variables sur neuf
l'appliquaient. Manquaient les quatre plus citées des kits — {{edr}}
(83 occurrences), {{ville}} (42), {{partenaire}} (38), {{media}} (9).

Or le parcours de création laisse ces champs facultatifs. Valider sans
rien saisir suffisait donc à obtenir, dans l'annuaire des joueurs, un
contact nommé « {{media}} — rédaction », des publications situées « dans
la région de {{ville}} » et un appel à passer à « {{partenaire}} —
astreinte ».

Les replis sont des groupes nominaux, choisis pour rester lisibles à la
place du jeton dans les phrases des kits. {{organisation}} n'en reçoit
pas : il en a déjà un meilleur, le nom de l'organisation qui joue.

Co-Authored-By: default avatarClaude Opus 5 <noreply@anthropic.com>
parent 2d316ee9
Loading
Loading
Loading
Loading
+9 −1
Changes for apps/api/src/common/personalization.spec.ts: 9 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -11,7 +11,9 @@ describe('buildVars', () => {
  it('rogne les valeurs et ignore celles qui sont vides', () => {
    const vars = buildVars(null, { organisation: '  Hélios  ', ville: '   ' });
    expect(vars.organisation).toBe('Hélios');
    expect(vars.ville).toBeUndefined();
    // Saisie vide : elle est bien ignorée, et c'est le repli générique qui prend
    // la place — jamais le jeton brut, qui s'afficherait tel quel au joueur.
    expect(vars.ville).toBe('la ville');
  });

  it('n’expose pas startAt, qui est une date et non un texte', () => {
@@ -27,6 +29,12 @@ describe('buildVars', () => {
  it('resout toujours les variables a repli, saisies ou par defaut', () => {
    const defaults = buildVars(null, undefined);
    expect(defaults.cours_deau).toBe('la rivière');
    // Les quatre plus citées des kits : sans repli, elles s'affichaient en clair
    // (« {{media}} — rédaction » dans l'annuaire des joueurs).
    expect(defaults.edr).toBe("l'antivirus");
    expect(defaults.ville).toBe('la ville');
    expect(defaults.partenaire).toBe('le prestataire informatique');
    expect(defaults.media).toBe('la presse locale');
    expect(defaults.prefecture).toBe('la préfecture');
    expect(defaults.gestionnaire_reseau).toBe('le gestionnaire du réseau');
    // Cites par les kits REMPAR25 depuis la conversion des crochets litteraux.
+20 −0
Changes for apps/api/src/common/personalization.ts: 20 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -70,6 +70,21 @@ const VARIABLE_DEFAULTS: Record<string, string> = {
  // Systemes internes cites par les kits REMPAR25.
  intranet: 'intranet',
  portail_rh: 'portail RH',
  /*
   * Les quatre plus citees des kits — 83 occurrences pour {{edr}}, 42 pour
   * {{ville}}, 38 pour {{partenaire}}, 9 pour {{media}} — n'avaient AUCUN repli,
   * alors que le parcours de creation laisse ces champs facultatifs. Un exercice
   * cree en validant sans rien saisir affichait donc aux joueurs un contact
   * d'annuaire nomme « {{media}} — rédaction », des publications « dans la région
   * de {{ville}} » et un appel a passer a « {{partenaire}} — astreinte ».
   *
   * Les replis sont des groupes nominaux, choisis pour rester lisibles a la place
   * du jeton dans les phrases des kits.
   */
  edr: "l'antivirus",
  ville: 'la ville',
  partenaire: 'le prestataire informatique',
  media: 'la presse locale',
};

/** Contexte (mise en situation) nettoyé, ou undefined si aucun champ renseigné. */
@@ -104,6 +119,11 @@ export function buildVars(
    if (typeof value === 'string' && value.trim() !== '') vars[key] = value.trim();
  }
  if (sector && sector.trim()) vars.secteur = sector.trim();
  /*
   * {{organisation}} n'a pas de repli FIXE : il en existe un meilleur, le nom de
   * l'organisation qui joue, injecte par l'instantane d'identite (cf.
   * `exerciseSnapshot`). Un repli generique ici masquerait ce reglage.
   */
  // Repli generique : garantit qu'aucun de ces jetons ne reste visible cote joueur.
  for (const [key, fallback] of Object.entries(VARIABLE_DEFAULTS)) {
    if (!vars[key]) vars[key] = fallback;