From b089dec9127aae14e59496a3e9f2c864f1e23a55 Mon Sep 17 00:00:00 2001 From: Quentin Rouiller Date: Fri, 24 Jul 2026 02:35:59 +0200 Subject: [PATCH] =?UTF-8?q?v2026.5.48=20=E2=80=94=20Architecture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Architecture.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Architecture.md b/Architecture.md index 9ba00a0..441d5cf 100644 --- a/Architecture.md +++ b/Architecture.md @@ -167,6 +167,9 @@ Côté `background.js`, tous les hardcodes runtime ont été remplacés par des ## Configuration persistée +Clés ajoutées en v2026.5.48 (`admin_config`) : `teamEmails` (id → adresse), `moveEmailEnabled`, `moveEmailSubject`, `moveEmailBody`, `emailDomain` — toutes embarquées par l'export/import des paramètres. + + `chrome.storage.local["admin_config"]` : | Clé | Type | Rôle | Introduite | @@ -189,6 +192,24 @@ Côté `background.js`, tous les hardcodes runtime ont été remplacés par des --- +## Email de déplacement (v2026.5.48) + +- `_emailAfterMove(opts)` — après un déplacement appliqué : gardes dans l'ordre `MOVE_EMAIL_ENABLED`, `change.sansEmail` (case décochée = ce déplacement seulement), « vrai déplacement » (autre jour OU autre technicien) ; adresses validées ; le brouillon s'ouvre même sans adresse (toast « Adresse manquante ») ; URL `mailto:` avec destinataires joints par `;` (Outlook FR/CH) et sujet/corps `encodeURIComponent`, ancre insérée au DOM avant `click()` (requis Firefox). +- `_moveEmailRempli(modele, valeurs)` — remplit les `{variables}`, retire les lignes à puce/tiret restées vides, resserre les espaces par ligne en préservant l'indentation. +- Modèle : `MOVE_EMAIL_VARIABLES` (source unique des 11 variables), `MOVE_EMAIL_VARIABLE_GROUPES` (légende en 3 colonnes), `DEFAULT_MOVE_EMAIL_SUBJECT/BODY` (filets de 1er lancement, blocs AVANT / APRÈS). **Migration au boot** : `_empreinteModeleEmail` (empreinte tolérante — fins de ligne, espaces, tirets typographiques) compare le modèle stocké aux anciens modèles de base (`_ANCIENS_MODELES_BASE`) et le remplace par l'actuel ; un modèle personnalisé n'est jamais touché. +- Adresses : `_emailForTech` (saisie prime), `_emailDeduitDuNom` (`prenom.nom@`), `_fetchTechEmailFromEV` (annuaire EV : renvoie `{ email, fullName }` de la MÊME fiche), `_nomCompletCompatible` (garde anti-homonyme pour compléter un nom tronqué — le nom affiché sur les cartes vient de `cfg.team`, et `storeProject` suit désormais `TEAM` pour le nom). + +## Méta de réservation (v2026.5.48) + +- La méta (n°/ville/rue/catégorie) vit dans la réservation du STORE avec un horodatage `resMetaAt` — dans `ivMerge`, l'édition la plus récente gagne le bloc en entier (un champ vidé n'est pas ressuscité). +- Le carnet local (`reservation_meta`) est un **tampon de pose** : clé `date|tech|début-fin`, TTL 7 j calé sur la date cible, consommé une seule fois à l'ingestion (`_resMetaConsumeInto` dans `storeApplyFresh`), vidé du disque après un `storeSave` réussi. Plus aucune ré-injection au parse. +- Le TECH fait partie de l'identité `ivKey` des réservations/absences (un `actionId` recyclé entre techniciens ne fusionne plus) ; transfert de méta sur re-planification EasyVista seulement si le rapprochement est sans ambiguïté (même tech + jour + durée + créateur). + +## Durcissements v2026.5.48 + +- Reconnexion : `_checkForRestoredSession` retente le chargement si un écran plein est encore affiché à PHPSESSID inchangé, et ne masque les écrans pleins / ne toaste « Reconnecté » qu'après un rendu réel. +- Recherche : index du cache à vol unique (`_srCacheBuildInflight`), garde `_srSearchEnCours` contre les relances au survol, garde `isConnected` sur le clic-extérieur (un élément retiré du DOM pendant son clic n'est pas « dehors »), pastille de statut seulement pour les états finals. + ## Variables CSS dynamiques (v2026.5.44) Posées sur `:root` ou `html` par JS, lues partout dans le CSS :