76 lines
3.2 KiB
JavaScript
76 lines
3.2 KiB
JavaScript
|
|
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|||
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|||
|
|
|
|||
|
|
// Le témoin de la planche (§ 15.1, § 11.5) : 260 personnes inventées,
|
|||
|
|
// « Témoin 001 » à « Témoin 260 », dont 3 exclues, sur la salle de la grande
|
|||
|
|
// démonstration — 33 tables, 29 de 8 sièges et 4 de 7 —, 4 tours, et un
|
|||
|
|
// placement retenu, daté, sur un plan retenu. Les 257 badges qu'il produit
|
|||
|
|
// donnent 65 planches A4 et 129 planches Lettre (§ 15.1).
|
|||
|
|
//
|
|||
|
|
// Chaque personne porte un courriel, des notes et un titre pressenti, que le
|
|||
|
|
// badge ne doit jamais imprimer (§ 11.4), et une personne sur cinq une
|
|||
|
|
// appartenance. Le plan du tour r range les 257 présentes à partir du rang
|
|||
|
|
// 64 × (r − 1), en boucle, et remplit les tables dans l'ordre de leurs
|
|||
|
|
// identifiants : chaque tour est une partition, les trois sièges libres
|
|||
|
|
// tombent à la dernière table. Aucune réservation, aucun titre. Chaque appel
|
|||
|
|
// rend une charge neuve.
|
|||
|
|
import { creerCharge } from '../../../src/stockage/document.js';
|
|||
|
|
import { H_RETENU, personne, placementDe, table } from './cas.js';
|
|||
|
|
|
|||
|
|
/** Les comptes du témoin, que les épreuves lisent plutôt que de les écrire. */
|
|||
|
|
export const FORME_TEMOIN = Object.freeze({
|
|||
|
|
participants: 260,
|
|||
|
|
exclus: 3,
|
|||
|
|
produits: 257,
|
|||
|
|
tables: 33,
|
|||
|
|
tours: 4,
|
|||
|
|
planchesA4: 65,
|
|||
|
|
planchesLettre: 129,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
/** Les identifiants des trois personnes exclues. */
|
|||
|
|
export const EXCLUS_TEMOIN = Object.freeze([50, 150, 250]);
|
|||
|
|
|
|||
|
|
const DECALAGE_PAR_TOUR = 64;
|
|||
|
|
|
|||
|
|
/** Le numéro d'une personne du témoin, sur trois chiffres. */
|
|||
|
|
export const numeroTemoin = (id) => String(id).padStart(3, '0');
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* La charge du témoin, état retenu, retenu daté de H_RETENU.
|
|||
|
|
*
|
|||
|
|
* @returns {import('../../../src/stockage/types.js').Charge}
|
|||
|
|
*/
|
|||
|
|
export function chargeTemoin() {
|
|||
|
|
const { participants, tables, tours } = FORME_TEMOIN;
|
|||
|
|
const charge = creerCharge({ id: 'evt-temoin', nom: 'Soirée des Lucioles', date: '2031-05-17', siegesParDefaut: 8, tours });
|
|||
|
|
charge.evenement.etat = 'retenu';
|
|||
|
|
charge.participants = Array.from({ length: participants }, (_, rang) => {
|
|||
|
|
const id = rang + 1;
|
|||
|
|
const n = numeroTemoin(id);
|
|||
|
|
return personne(id, null, `Témoin ${n}`, {
|
|||
|
|
appartenance: id % 5 === 0 ? 'Club des Merles' : null,
|
|||
|
|
courriel: `temoin${n}@exemple.test`,
|
|||
|
|
titrePressenti: `pressenti ${n}`,
|
|||
|
|
notes: `note confidentielle ${n}`,
|
|||
|
|
exclu: EXCLUS_TEMOIN.includes(id),
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
charge.tables = Array.from({ length: tables }, (_, rang) => table(rang + 1, rang + 1, rang < 29 ? null : 7));
|
|||
|
|
const presents = charge.participants.filter(({ exclu }) => !exclu).map(({ id }) => id);
|
|||
|
|
const plan = Array.from({ length: tours }, (_, r) => {
|
|||
|
|
const debut = (DECALAGE_PAR_TOUR * r) % presents.length;
|
|||
|
|
const ordre = [...presents.slice(debut), ...presents.slice(0, debut)];
|
|||
|
|
let rang = 0;
|
|||
|
|
const sieges = charge.tables.map((enregistrement) => {
|
|||
|
|
const liste = ordre.slice(rang, rang + (enregistrement.sieges ?? 8));
|
|||
|
|
rang += liste.length;
|
|||
|
|
return liste;
|
|||
|
|
});
|
|||
|
|
return { sieges };
|
|||
|
|
});
|
|||
|
|
charge.prochainsIds = { participant: participants + 1, table: tables + 1, proposition: 2 };
|
|||
|
|
charge.retenu = { proposition: 1, ...placementDe(charge, plan), horodatage: H_RETENU };
|
|||
|
|
return charge;
|
|||
|
|
}
|