V1.18.19 Mise en place des collaborateurs

This commit is contained in:
2026-09-10 06:24:16 +00:00
parent 67614908c3
commit 0dee1c7ebd
12 changed files with 407 additions and 28 deletions
+16 -1
View File
@@ -52,7 +52,22 @@ try {
// contact_ia_interprete.php) — la clé JSON change de nom avec la colonne, // contact_ia_interprete.php) — la clé JSON change de nom avec la colonne,
// pas d'alias de compatibilité gardé, pour ne pas laisser deux noms // pas d'alias de compatibilité gardé, pour ne pas laisser deux noms
// cohabiter pour la même chose. // cohabiter pour la même chose.
$stmt = $pdo->query('SELECT AGN_Incr, AGN_Prenom, AGN_Fonction, AGN_Variantes FROM ASP_Agents ORDER BY AGN_Incr ASC'); //
// AGN_Photo (9 septembre 2026, écran assistants) : nom de fichier de la
// photo de l'agent (ex. "assistant_matilda.jpg"), colonne éditée à la
// main par Jean-Marc — même principe que AGN_Variantes. Valeur
// vide/absente tolérée côté écran (repli visuel, voir ecran_fond.html) :
// un agent sans photo reste affiché.
//
// AGN_Couleur (9 septembre 2026) : couleur pastel affectée à l'agent (ex.
// "#A6D9F2"), pas encore utilisée par aucun écran à ce stade — récupérée
// ici par anticipation (même table, même endpoint), voir réflexions
// stratégiques pour son usage prévu (post-its par assistant notamment).
//
// ORDER BY AGN_OrdreAffichage (9 septembre 2026) remplace AGN_Incr :
// Jean-Marc pilote désormais l'ordre d'affichage indépendamment de
// l'ordre de création des agents (ex. écran assistants).
$stmt = $pdo->query('SELECT AGN_Incr, AGN_Prenom, AGN_Fonction, AGN_Variantes, AGN_Photo, AGN_Couleur FROM ASP_Agents ORDER BY AGN_OrdreAffichage ASC');
echo json_encode(['agents' => $stmt->fetchAll()]); echo json_encode(['agents' => $stmt->fetchAll()]);
} catch (PDOException $e) { } catch (PDOException $e) {
http_response_code(500); http_response_code(500);
Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

+312 -17
View File
@@ -455,6 +455,90 @@
} }
.postit .pastille-urgence-postit.rouge{ background:#c0392b; } .postit .pastille-urgence-postit.rouge{ background:#c0392b; }
.postit .pastille-urgence-postit.orange{ background:#ff5a1f; } .postit .pastille-urgence-postit.orange{ background:#ff5a1f; }
/* Portraits des assistants, écran 2 (9 septembre 2026 — voir journal).
Même principe d'attachement que #postits-layer pour le fond liège :
#assistants-layer est déplacé (au sens JS) à l'intérieur de la slide du
fond "tasseaux gris" (index 1) à chaque fois qu'elle existe, voir
creerFondSlide()/changerFond() plus bas — invisible tant qu'un autre
fond est affiché, sans dupliquer sa logique de position. position:absolute
(pas fixed) : positionné par rapport à ce conteneur local (lui-même
inset:0 dans la slide, elle-même calée sur le rectangle "contain"), pas
par rapport à la fenêtre — voir positionner().
Nombre de colonnes non codé en dur (décision de Jean-Marc, 9 septembre
2026) : une carte par agent réellement renvoyé par agents.php, largeur
de colonne = largeur totale / nombre d'agents — s'adapte donc tout seul
si un agent est ajouté ou retiré, sans repasser par ce fichier. */
#assistants-layer{
position:absolute;
inset:0;
}
.assistant-carte{
position:absolute;
display:flex;
flex-direction:column;
align-items:center;
pointer-events:none; /* purement visuel pour l'instant, comme les post-its */
}
.assistant-cadre{
background:#fff;
box-shadow:2px 4px 8px rgba(0,0,0,.35);
box-sizing:border-box;
display:block;
}
.assistant-photo{
display:block;
width:100%;
height:100%;
object-fit:cover;
}
/* Repli visuel pour un agent sans AGN_Photo renseignée (ex. le temps que
Jean-Marc dépose la photo) : même esprit que le "?" utilisé dans les
essais visuels, jamais un cadre vide sans explication. */
.assistant-photo-repli{
display:flex;align-items:center;justify-content:center;
width:100%;height:100%;
background:#e0e0dc;
color:#9a9a95;
font-weight:700;
font-family:"Segoe UI","Arial",sans-serif;
}
.assistant-nom{
margin-top:6px;
font-weight:700;
color:#2a2a2a;
font-family:"Segoe UI","Arial",sans-serif;
white-space:nowrap;
line-height:1.15;
}
.assistant-fonction{
color:#3a3a3a;
font-weight:700; /* forcé en gras le 9 septembre 2026 (retour Jean-Marc) : la ligne passait inaperçue sur le fond tasseaux */
font-family:"Segoe UI","Arial",sans-serif;
white-space:nowrap;
line-height:1.15;
}
/* Panneau "Bureau des assistants" (9 septembre 2026) : même esprit que les
cadres photo (liseré blanc, ombre portée) mais fond gris plutôt que
blanc — posé une seule fois (pas par agent) dans l'espace qui reste
libre sous les 2 dernières colonnes (aujourd'hui Léon et Sophia, voir
positionner()), tant qu'il n'y a rien d'autre à y afficher. */
.bureau-panneau{
position:absolute;
box-sizing:border-box;
background:#cfcfc9;
border-style:solid;
border-color:#fff;
box-shadow:2px 4px 8px rgba(0,0,0,.35);
display:flex;
align-items:center;
justify-content:center;
text-align:center;
color:#2a2a2a;
font-weight:700;
font-family:"Segoe UI","Arial",sans-serif;
pointer-events:none;
}
</style> </style>
</head> </head>
<body> <body>
@@ -625,19 +709,24 @@ Créé par Mevelia Solutions">
// milieu géométrique — même principe que le 7 septembre). labelCx = centre // milieu géométrique — même principe que le 7 septembre). labelCx = centre
// du rectangle blanc de l'étiquette, mesuré indépendamment (les 9 // du rectangle blanc de l'étiquette, mesuré indépendamment (les 9
// rectangles ne sont pas exactement centrés dans leur classeur). // rectangles ne sont pas exactement centrés dans leur classeur).
// Nouvelle répartition (9 septembre 2026, réflexion stratégique de
// Jean-Marc — regroupement plus cohérent des rubriques, ex. Prospection
// fusionnée dans Contacts, En-cours+Journalier scindés différemment en
// Missions/Propositions/Livraisons/Journalier). Reprend exactement les 9
// positions physiques déjà mesurées sur l'avant-plan (x1/x2/labelCx
// inchangés, dans l'ordre des classeurs sur la photo) : seuls les
// libellés/ids/href changent, aucune nouvelle mesure de pixels nécessaire
// tant que l'avant-plan lui-même ne change pas.
const CLASSEURS = [ const CLASSEURS = [
{id:'consignes', label:'Consignes', x1:44, x2:83, labelCx:63.5, href:null}, {id:'catalogue', label:'Catalogue', x1:44, x2:83, labelCx:63.5, href:null},
{id:'contacts', label:'Contacts', x1:83, x2:120, labelCx:101.0, href:'liste_contacts.html'}, {id:'documents', label:'Documents', x1:83, x2:120, labelCx:101.0, href:null},
{id:'catalogue', label:'Catalogue', x1:120, x2:158, labelCx:138.5, href:null}, {id:'contacts', label:'Contacts', x1:120, x2:158, labelCx:138.5, href:'liste_contacts.html'},
// "Documentations" (id interne conservé pour l'historique) reste affiché {id:'missions', label:'Missions', x1:158, x2:197, labelCx:177.0, href:null},
// "Documents", police forcée sur le plafond commun — voir raisonnement {id:'propositions', label:'Propositions', x1:197, x2:239, labelCx:216.0, href:null},
// inchangé du 7 septembre 2026 (toujours valable, indépendant de l'image). {id:'livraisons', label:'Livraisons', x1:239, x2:280, labelCx:259.0, href:null},
{id:'documentations', label:'Documents', x1:158, x2:197, labelCx:177.0, href:null}, {id:'factures', label:'Factures', x1:280, x2:321, labelCx:300.5, href:null},
{id:'prospection', label:'Prospection', x1:197, x2:239, labelCx:216.0, href:null}, {id:'journalier', label:'Journalier', x1:321, x2:363, labelCx:341.5, href:null},
{id:'communication', label:'Réseaux', x1:239, x2:280, labelCx:259.0, href:null}, {id:'gestion', label:'Gestion', x1:363, x2:415, labelCx:383.5, href:null},
{id:'en-cours', label:'En cours', x1:280, x2:321, labelCx:300.5, href:null},
{id:'factures', label:'Factures', x1:321, x2:363, labelCx:341.5, href:null},
{id:'journalier', label:'Journalier', x1:363, x2:415, labelCx:383.5, href:null},
]; ];
// Zone cliquable/survolable du micro et centre de l'icône : remesurés le // Zone cliquable/survolable du micro et centre de l'icône : remesurés le
@@ -666,7 +755,11 @@ Créé par Mevelia Solutions">
// Y remesuré le 8 septembre 2026 (soir), même recadrage. // Y remesuré le 8 septembre 2026 (soir), même recadrage.
// Redescendue un peu le 8 septembre 2026 (soir), retour de Jean-Marc // Redescendue un peu le 8 septembre 2026 (soir), retour de Jean-Marc
// après 6ᵉ test réel (trop remontée la fois précédente) : 401 → 404. // après 6ᵉ test réel (trop remontée la fois précédente) : 401 → 404.
const PASTILLE_CONTACTS_CENTRE_X = 101, PASTILLE_CONTACTS_CENTRE_Y = 404; // X déplacé le 9 septembre 2026 : "Contacts" passe du 2ᵉ au 3ᵉ classeur
// dans la nouvelle répartition (voir tableau CLASSEURS) — X reprend le
// labelCx du nouvel emplacement (138.5) pour que la pastille reste sous
// le bon classeur ; Y inchangé (même hauteur de trou sur les 9 classeurs).
const PASTILLE_CONTACTS_CENTRE_X = 138.5, PASTILLE_CONTACTS_CENTRE_Y = 404;
const PASTILLE_CONTACTS_DIAM_FRAC = 17 / IMG_W; const PASTILLE_CONTACTS_DIAM_FRAC = 17 / IMG_W;
// Zone des post-its personnels (2 septembre 2026, premier affichage réel // Zone des post-its personnels (2 septembre 2026, premier affichage réel
@@ -709,6 +802,38 @@ Créé par Mevelia Solutions">
const FLECHE_PRECEDENTE_CENTRE_X = 962, FLECHE_CENTRE_Y = 410; const FLECHE_PRECEDENTE_CENTRE_X = 962, FLECHE_CENTRE_Y = 410;
const FLECHE_SUIVANTE_CENTRE_X = 998; const FLECHE_SUIVANTE_CENTRE_X = 998;
// -------- Portraits des assistants, écran 2 (9 septembre 2026) --------
// Réglages issus des essais visuels validés par Jean-Marc (voir journal) :
// marge réduite au-dessus de la tête, visage recentré, cadrage descendant
// sur le buste, taille réduite de 15% par rapport au tout premier essai.
// ASSISTANT_PHOTO_RATIO doit rester cohérent avec le recadrage utilisé pour
// produire les fichiers assistant_<prenom>.jpg (outillage côté Claude) — à
// revoir ensemble si Jean-Marc fournit un jour des photos au format déjà
// différent.
const ASSISTANT_ZONE_TOP = 14; // marge haute, px de référence (IMG_H)
const ASSISTANT_PHOTO_H_MAX = 162; // hauteur max de la photo (hors liseré), px de référence
const ASSISTANT_PHOTO_RATIO = 0.657; // largeur / hauteur de la photo
const ASSISTANT_MAT = 5; // épaisseur du liseré blanc, px de référence
const ASSISTANT_COL_MARGE = 0.85; // fraction de la largeur de colonne réellement utilisable (reste = gouttière)
const ASSISTANT_NOM_POLICE_FRAC = 17 / IMG_W;
const ASSISTANT_FONCTION_POLICE_FRAC = 12 / IMG_W;
// Panneau "Bureau des assistants" (9 septembre 2026, retour Jean-Marc) :
// posé dans l'espace qui reste libre sous les 2 dernières colonnes de
// portraits (aujourd'hui Léon et Sophia), entre le bas du texte des
// cartes et le haut du plateau du bureau. BUREAU_PANNEAU_BAS reprend la
// même limite que CLASSEURS_Y2/MICRO_ZONE_Y2 plus haut (haut du plateau,
// commun à toute la largeur de l'image) avec la même petite marge de
// sécurité que ZONE_POSTITS_Y2.
const BUREAU_PANNEAU_BAS = 390; // px de référence (IMG_H)
const BUREAU_PANNEAU_GAP = 8; // espace entre le texte des cartes et le panneau, px de référence
const BUREAU_PANNEAU_POLICE_FRAC = 16 / IMG_W;
// Le panneau est un encadré ajusté au texte (mesuré, voir positionner()),
// pas une zone qui occupe tout l'espace disponible — cet espace ne sert
// qu'à centrer l'encadré (retour Jean-Marc, 9 septembre 2026).
const BUREAU_PANNEAU_PAD_H = 16; // marge intérieure horizontale, px de référence
const BUREAU_PANNEAU_PAD_V = 10; // marge intérieure verticale, px de référence
/** /**
* Petit générateur pseudo-aléatoire déterministe (0..1), à partir d'un * Petit générateur pseudo-aléatoire déterministe (0..1), à partir d'un
* entier (TDL_Incr) — pour que le jitter (rotation/décalage) d'un post-it * entier (TDL_Incr) — pour que le jitter (rotation/décalage) d'un post-it
@@ -924,6 +1049,92 @@ Créé par Mevelia Solutions">
postit.style.top = (caseTop + (caseH - postitTaille) / 2 + decalageY) + 'px'; postit.style.top = (caseTop + (caseH - postitTaille) / 2 + decalageY) + 'px';
postit.style.transform = 'rotate(' + rotation.toFixed(1) + 'deg)'; postit.style.transform = 'rotate(' + rotation.toFixed(1) + 'deg)';
}); });
// Portraits des assistants (écran 2) : nombre de colonnes = nombre de
// cartes réellement créées par creerCartesAssistants() (voir plus bas),
// pas de valeur codée en dur — la largeur de colonne se recalcule donc
// toute seule si un agent est ajouté ou retiré côté ASP_Agents. scale
// convertit un px de référence (IMG_W/IMG_H) en px écran ; identique
// dans les deux sens puisque le rectangle "contain" respecte toujours le
// ratio IMG_W/IMG_H (voir calcul de dispW/dispH plus haut).
const cartesAssistants = coucheAssistants.querySelectorAll('.assistant-carte');
if (cartesAssistants.length > 0) {
const scale = dispW / IMG_W;
const colW = dispW / cartesAssistants.length;
const matPx = ASSISTANT_MAT * scale;
let photoH = ASSISTANT_PHOTO_H_MAX * scale;
// Contrainte de largeur : si la colonne est trop étroite pour la
// hauteur visée (beaucoup d'agents), on réduit la photo en proportion
// plutôt que de déborder sur la colonne voisine.
const largeurMaxCarte = colW * ASSISTANT_COL_MARGE;
if (photoH * ASSISTANT_PHOTO_RATIO + 2 * matPx > largeurMaxCarte) {
photoH = (largeurMaxCarte - 2 * matPx) / ASSISTANT_PHOTO_RATIO;
}
const photoW = photoH * ASSISTANT_PHOTO_RATIO;
const carteW = photoW + 2 * matPx;
const carteH = photoH + 2 * matPx;
const topPx = ASSISTANT_ZONE_TOP * scale;
const nomPx = ASSISTANT_NOM_POLICE_FRAC * dispW;
const fonctionPx = ASSISTANT_FONCTION_POLICE_FRAC * dispW;
cartesAssistants.forEach(function (carte, index) {
const cx = colW * index + colW / 2;
carte.style.left = (cx - carteW / 2) + 'px';
carte.style.top = topPx + 'px';
carte.style.width = carteW + 'px';
const cadre = carte.querySelector('.assistant-cadre');
cadre.style.width = carteW + 'px';
cadre.style.height = carteH + 'px';
cadre.style.padding = matPx + 'px';
const nomEl = carte.querySelector('.assistant-nom');
if (nomEl) nomEl.style.fontSize = nomPx + 'px';
const fonctionEl = carte.querySelector('.assistant-fonction');
if (fonctionEl) fonctionEl.style.fontSize = fonctionPx + 'px';
const repli = carte.querySelector('.assistant-photo-repli');
if (repli) repli.style.fontSize = (photoH * 0.3) + 'px';
});
// Panneau "Bureau des assistants" : la zone sous les 2 dernières
// colonnes (aujourd'hui Léon et Sophia) ne sert qu'à CENTRER
// l'encadré — l'encadré lui-même est ajusté au texte (mesuré via
// ctxMesure, voir plus haut), pas étiré sur toute la zone (retour
// Jean-Marc, 9 septembre 2026). Bas du texte des cartes calculé
// analytiquement (pas mesuré en DOM) : coucheAssistants peut être
// parquée hors document (fond non affiché), où
// offsetHeight/getBoundingClientRect renverraient 0.
if (cartesAssistants.length >= 2) {
const nomLigne = nomPx * 1.15; // line-height:1.15, voir .assistant-nom
const nomMargeHaut = 6 * scale; // margin-top:6px, voir .assistant-nom
const fonctionLigne = fonctionPx * 1.15; // line-height:1.15, voir .assistant-fonction
const basCarte = topPx + carteH + nomMargeHaut + nomLigne + fonctionLigne;
const zoneTop = basCarte + BUREAU_PANNEAU_GAP * scale;
const zoneBas = BUREAU_PANNEAU_BAS * scale;
const zoneGauche = colW * (cartesAssistants.length - 2);
const zoneLargeur = colW * 2;
const zoneCentreX = zoneGauche + zoneLargeur / 2;
const zoneCentreY = zoneTop + (zoneBas - zoneTop) / 2;
const panneauPolicePx = BUREAU_PANNEAU_POLICE_FRAC * dispW;
ctxMesure.font = '700 ' + panneauPolicePx + 'px "Segoe UI","Arial",sans-serif';
const texteLargeur = ctxMesure.measureText(panneauBureau.textContent).width;
const padH = BUREAU_PANNEAU_PAD_H * scale;
const padV = BUREAU_PANNEAU_PAD_V * scale;
const panneauLargeur = texteLargeur + 2 * padH;
const panneauHauteur = panneauPolicePx * 1.15 + 2 * padV;
panneauBureau.style.display = 'flex';
panneauBureau.style.left = (zoneCentreX - panneauLargeur / 2) + 'px';
panneauBureau.style.top = (zoneCentreY - panneauHauteur / 2) + 'px';
panneauBureau.style.width = panneauLargeur + 'px';
panneauBureau.style.height = panneauHauteur + 'px';
panneauBureau.style.borderWidth = matPx + 'px';
panneauBureau.style.fontSize = panneauPolicePx + 'px';
} else {
panneauBureau.style.display = 'none';
}
} else {
panneauBureau.style.display = 'none';
}
} }
// -------- Fonds interchangeables (8 septembre 2026) -------- // -------- Fonds interchangeables (8 septembre 2026) --------
// 3 fonds codés en dur (décision de Jean-Marc, pas de liste extensible // 3 fonds codés en dur (décision de Jean-Marc, pas de liste extensible
@@ -948,16 +1159,36 @@ Créé par Mevelia Solutions">
const couchePostits = document.createElement('div'); const couchePostits = document.createElement('div');
couchePostits.id = 'postits-layer'; couchePostits.id = 'postits-layer';
// Portraits des assistants (écran 2, 9 septembre 2026) : même principe que
// couchePostits ci-dessus — un noeud créé une seule fois, rempli de façon
// asynchrone par chargerAgentsEcranAssistants() plus bas, déplacé (jamais
// dupliqué) entre les slides par creerFondSlide().
const coucheAssistants = document.createElement('div');
coucheAssistants.id = 'assistants-layer';
// Panneau "Bureau des assistants" (voir commentaire CSS .bureau-panneau et
// constantes BUREAU_PANNEAU_* plus haut) : contenu statique, créé une
// seule fois ici et jamais recréé par creerCartesAssistants() (qui ne
// touche qu'aux .assistant-carte) — seule sa position/taille est
// recalculée à chaque appel de positionner().
const panneauBureau = document.createElement('div');
panneauBureau.className = 'bureau-panneau';
panneauBureau.textContent = 'Bureau des assistants';
coucheAssistants.appendChild(panneauBureau);
function creerFondSlide(index) { function creerFondSlide(index) {
const slide = document.createElement('div'); const slide = document.createElement('div');
slide.className = 'fond-slide'; slide.className = 'fond-slide';
slide.style.backgroundImage = "url('" + FONDS[index] + "')"; slide.style.backgroundImage = "url('" + FONDS[index] + "')";
// Le fond liège (index 0) embarque la couche des post-its : un simple // Le fond liège (index 0) embarque la couche des post-its, le fond
// appendChild déplace le noeud existant (le retire au passage de son // tasseaux gris (index 1, écran assistants) la couche des portraits : un
// ancien parent, s'il en avait un) — pas de duplication, pas de perte du // simple appendChild déplace le noeud existant (le retire au passage de
// contenu déjà chargé par chargerMesPostits(). // son ancien parent, s'il en avait un) — pas de duplication, pas de perte
// du contenu déjà chargé.
if (index === 0) { if (index === 0) {
slide.appendChild(couchePostits); slide.appendChild(couchePostits);
} else if (index === 1) {
slide.appendChild(coucheAssistants);
} }
return slide; return slide;
} }
@@ -1151,6 +1382,70 @@ Créé par Mevelia Solutions">
} }
chargerMesPostits(); chargerMesPostits();
// Portraits des assistants, écran 2 (9 septembre 2026 — voir journal et
// réflexions stratégiques). Source : agents.php, qui sert déjà
// AGN_Prenom/AGN_Fonction pour le pilotage vocal — AGN_Photo (nom de
// fichier, ex. "assistant_matilda.jpg") et le tri par AGN_OrdreAffichage
// s'y ajoutent pour cet écran (voir commentaire d'en-tête de agents.php). Un agent sans
// AGN_Photo reste affiché (repli visuel "?", voir .assistant-photo-repli) :
// jamais de colonne manquante silencieusement. Nombre de colonnes non codé
// en dur : une carte par agent réellement renvoyé (voir positionner()).
function creerCartesAssistants() {
// Ne retire que les cartes (pas le panneau "Bureau des assistants",
// ajouté une seule fois à la création de coucheAssistants — voir
// panneauBureau plus haut).
coucheAssistants.querySelectorAll('.assistant-carte').forEach(function (el) { el.remove(); });
(agentsEcranAssistants || []).forEach(function (agent) {
const carte = document.createElement('div');
carte.className = 'assistant-carte';
const cadre = document.createElement('div');
cadre.className = 'assistant-cadre';
if (agent.AGN_Photo) {
const img = document.createElement('img');
img.className = 'assistant-photo';
img.alt = agent.AGN_Prenom || '';
img.src = agent.AGN_Photo;
cadre.appendChild(img);
} else {
const repli = document.createElement('div');
repli.className = 'assistant-photo-repli';
repli.textContent = '?';
cadre.appendChild(repli);
}
carte.appendChild(cadre);
const nom = document.createElement('div');
nom.className = 'assistant-nom';
nom.textContent = agent.AGN_Prenom || '';
carte.appendChild(nom);
if (agent.AGN_Fonction) {
const fonction = document.createElement('div');
fonction.className = 'assistant-fonction';
fonction.textContent = agent.AGN_Fonction;
carte.appendChild(fonction);
}
coucheAssistants.appendChild(carte);
});
positionner(); // place les cartes qui viennent d'être (re)créées
}
let agentsEcranAssistants = [];
async function chargerAgentsEcranAssistants() {
try {
const reponse = await fetch('agents.php');
if (!reponse.ok) throw new Error('HTTP ' + reponse.status);
const data = await reponse.json();
agentsEcranAssistants = data.agents || [];
creerCartesAssistants();
} catch (erreur) {
console.error('Erreur de chargement de agents.php (écran assistants) :', erreur);
}
}
chargerAgentsEcranAssistants();
// Lien visible "→ Liste des tâches" retiré le 2 septembre 2026 à la // Lien visible "→ Liste des tâches" retiré le 2 septembre 2026 à la
// demande de Jean-Marc. Échap avait été conservé ce soir-là comme // demande de Jean-Marc. Échap avait été conservé ce soir-là comme
// échappatoire silencieuse vers liste_todolist.html, pour ne pas rester // échappatoire silencieuse vers liste_todolist.html, pour ne pas rester
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 83 KiB

+11 -9
View File
@@ -59,9 +59,9 @@ Pour les trois documents de ce projet (ce journal — résumé/index —, les R
- 29. Interprétation vocale des contacts par LLM - 29. Interprétation vocale des contacts par LLM
- 30. Chantier des consignes — moteur générique - 30. Chantier des consignes — moteur générique
*(Numérotation et titres repris du découpage fait par Jean-Marc le 31 août 2026, légèrement reformulés par lui à cette occasion — se référer aux fichiers eux-mêmes pour le libellé exact. Section 27 (Pilotage vocal) validée de bout en bout et son fichier définitif déposé dans `/journal` le 2 septembre 2026. Section 28 (Écran de fond) ouverte le 2 septembre 2026, toujours **en cours** — passée d'une maquette graphique exploratoire à un premier essai fonctionnel réel, puis (soirée du 2 au 3 septembre) à une pastille de comptage sur le classeur Contacts et à un premier affichage réel des post-its personnels sur le tableau de liège, puis (8 septembre 2026, matin) à un bureau à trois fonds interchangeables (liège actuel, futur écran assistants, futur tableau de bord) navigables par deux flèches, avant-plan désormais séparé du code des fonds — fichier de section mis à jour ce jour-là, à déposer par Jean-Marc, voir Statut actuel. Section 29 (Interprétation vocale des contacts par LLM) ouverte et son fichier définitif déposé le 4 septembre 2026 après validation de bout en bout sur un premier corpus réel ; fichiers de section à déposer par Jean-Marc, voir Statut actuel. Section 30 (Chantier des consignes — moteur générique) ouverte le 6 septembre 2026, fichier définitif rédigé le soir même après validation de bout en bout du mécanisme sur des cas réels ; **substantiellement complétée le 7 septembre 2026** (hiérarchisation cohérence/Tests/IA, traçabilité de l'agent, `REA_NomAffiche`, premier appel IA réel dans une consigne avec avertissement bloquant) ; **complétée à nouveau le 8 septembre 2026** (unicité mail/portable, retrait des points sur les numéros, échecs de `consigne_completer_code_postal()` rendus non-silencieux) — fichier de section mis à jour à déposer par Jean-Marc, voir Statut actuel.)* *(Numérotation et titres repris du découpage fait par Jean-Marc le 31 août 2026, légèrement reformulés par lui à cette occasion — se référer aux fichiers eux-mêmes pour le libellé exact. Section 27 (Pilotage vocal) validée de bout en bout et son fichier définitif déposé dans `/journal` le 2 septembre 2026. Section 28 (Écran de fond) ouverte le 2 septembre 2026, toujours **en cours** — passée d'une maquette graphique exploratoire à un premier essai fonctionnel réel, puis (soirée du 2 au 3 septembre) à une pastille de comptage sur le classeur Contacts et à un premier affichage réel des post-its personnels sur le tableau de liège, puis (8 septembre 2026, matin) à un bureau à trois fonds interchangeables (liège actuel, futur écran assistants, futur tableau de bord) navigables par deux flèches, avant-plan désormais séparé du code des fonds, puis (9-10 septembre 2026) à un écran 2 ("assistants") réellement présenté (portraits, couleurs, rôles) et à une nouvelle répartition des 9 classeurs suivant le cycle de vie d'une affaire — fichier de section mis à jour ce jour-là, à déposer par Jean-Marc, voir Statut actuel. Section 29 (Interprétation vocale des contacts par LLM) ouverte et son fichier définitif déposé le 4 septembre 2026 après validation de bout en bout sur un premier corpus réel ; fichiers de section à déposer par Jean-Marc, voir Statut actuel. Section 30 (Chantier des consignes — moteur générique) ouverte le 6 septembre 2026, fichier définitif rédigé le soir même après validation de bout en bout du mécanisme sur des cas réels ; **substantiellement complétée le 7 septembre 2026** (hiérarchisation cohérence/Tests/IA, traçabilité de l'agent, `REA_NomAffiche`, premier appel IA réel dans une consigne avec avertissement bloquant) ; **complétée à nouveau le 8 septembre 2026** (unicité mail/portable, retrait des points sur les numéros, échecs de `consigne_completer_code_postal()` rendus non-silencieux) — fichier de section mis à jour à déposer par Jean-Marc, voir Statut actuel.)*
## Statut actuel (2-8 septembre 2026) ## Statut actuel (2-10 septembre 2026)
**Écrans "Identification" et "Liste des contacts"** (avec panneau détail intégré) : aboutis depuis le 25 août 2026, testés en production. **Prospection** (formulaire externe, vérification mail, envoi de doc) : livrée et testée en conditions réelles le 26 août 2026 (section 18). **Dépôt Git** en place depuis le 27-28 août (section 20), avec circuit de livraison FileZilla → SSH VPS → `git push` (section 23) — l'écriture directe par Claude reste bloquée côté proxy Anthropic, contournement adopté sans gêne. **MIRADOR** (authentification centralisée multi-bases, identifiant = email) branché et validé à deux utilisateurs le 30 août 2026, déployé sur `aspic.mvl-tls.fr` (développement) et `crm.aspic.bzh` (test), chacun avec son propre environnement Docker (sections 21, 24, 25). **Écrans "Identification" et "Liste des contacts"** (avec panneau détail intégré) : aboutis depuis le 25 août 2026, testés en production. **Prospection** (formulaire externe, vérification mail, envoi de doc) : livrée et testée en conditions réelles le 26 août 2026 (section 18). **Dépôt Git** en place depuis le 27-28 août (section 20), avec circuit de livraison FileZilla → SSH VPS → `git push` (section 23) — l'écriture directe par Claude reste bloquée côté proxy Anthropic, contournement adopté sans gêne. **MIRADOR** (authentification centralisée multi-bases, identifiant = email) branché et validé à deux utilisateurs le 30 août 2026, déployé sur `aspic.mvl-tls.fr` (développement) et `crm.aspic.bzh` (test), chacun avec son propre environnement Docker (sections 21, 24, 25).
@@ -119,7 +119,9 @@ Version incrémentée une seule fois pour l'ensemble de cette session (pastille
Version incrémentée une seule fois pour l'ensemble de cette session (uniquement `<code>`) : **V1.17.18**. Version incrémentée une seule fois pour l'ensemble de cette session (uniquement `<code>`) : **V1.17.18**.
**Prochain chantier annoncé par Jean-Marc pour la session suivante : écran 2 ("assistants") — gérer les attributions de Matilda.** À rapprocher des points déjà notés plus bas dans "Reste à faire" (discriminant humain/agent sur `ASP_ToDoList`, répartition dynamique des 70% par charge de tâches, `AGN_Couleur`) — rien de plus précisé à ce stade sur le périmètre exact. **9-10 septembre 2026 : écran 2 ("assistants") — portraits des assistants, nouvelle texture de fond, et réorganisation des 9 classeurs (V1.18.19).** Détail technique complet en section 28 du journal ; fil stratégique de la réorganisation des classeurs en Réflexions stratégiques, section 19. Résumé : nouvelle texture de fond pour l'écran 2 (tasseaux de bois, filigrane retiré) ; conception puis intégration réelle de la présentation des assistants sur cet écran — portraits recadrés en photo d'identité, couleurs pastel par assistant (`AGN_Couleur`), rôle affiché en gras sous le nom (`AGN_Fonction`), colonnes calculées dynamiquement depuis le nombre réel d'agents de `ASP_Agents` (jamais un nombre codé en dur), panneau "Bureau des assistants" dimensionné à son texte dans l'espace restant. Nouvelles colonnes `AGN_Photo` (nom de fichier de la photo, éditée à la main comme `AGN_Variantes`) et `AGN_OrdreAffichage` (tri de l'écran, indépendant de `AGN_Incr`) ajoutées par Jean-Marc à `ASP_Agents`. En parallèle, Jean-Marc a revu la classification des 9 classeurs du bureau pour suivre le cycle de vie réel d'une affaire (Catalogue, Documents, Contacts, Missions, Propositions, Livraisons, Factures, Journalier, Gestion) — mêmes 9 positions physiques, seuls les libellés changent ; un point de vigilance (la pastille de comptage des contacts, positionnée indépendamment du tableau des classeurs) a été identifié et corrigé avant livraison pour continuer à suivre "Contacts" à sa nouvelle position. `<code>` avancé dès le début de session à la demande de Jean-Marc (V1.17.18 → V1.18.18) ; `<conception>` avancé en fin de session (18 → 19), la réorganisation des classeurs étant jugée par Jean-Marc suffisamment structurante pour justifier une nouvelle section des Réflexions stratégiques. Version : **V1.18.19**.
**Prochain chantier annoncé par Jean-Marc : gérer les attributions de tâches des assistants.** L'écran 2 ("assistants") est désormais présenté (portraits, couleurs, rôles) mais ne porte encore aucune action réelle — à rapprocher des points déjà notés plus bas dans "Reste à faire" (discriminant humain/agent sur `ASP_ToDoList`, répartition dynamique des 70% par charge de tâches, exploitation réelle d'`AGN_Couleur`) — rien de plus précisé à ce stade sur le périmètre exact.
**Reste à faire, noté au passage :** **Reste à faire, noté au passage :**
- Décider s'il faut renforcer le prompt d'extraction pour neutraliser les mots parasites/formules de politesse dictés autour d'une adresse mail (bug identifié le 4 septembre sur le corpus réel, correction non encore actée par Jean-Marc). - Décider s'il faut renforcer le prompt d'extraction pour neutraliser les mots parasites/formules de politesse dictés autour d'une adresse mail (bug identifié le 4 septembre sur le corpus réel, correction non encore actée par Jean-Marc).
@@ -135,13 +137,12 @@ Version incrémentée une seule fois pour l'ensemble de cette session (uniquemen
- Le problème des lettres avalées sur les mots inventés/sigles (ex. "mvl-tls.fr") reste entier, sans solution de contournement identifiée à ce stade — à garder en tête, pas à considérer comme résolu par le mode adresse. - Le problème des lettres avalées sur les mots inventés/sigles (ex. "mvl-tls.fr") reste entier, sans solution de contournement identifiée à ce stade — à garder en tête, pas à considérer comme résolu par le mode adresse.
- Reconnecter `micro.js` (vrai pilotage) sur le micro de l'écran de fond une fois la phase de mise au point terminée — une ligne à changer dans `ecran_fond.html`. - Reconnecter `micro.js` (vrai pilotage) sur le micro de l'écran de fond une fois la phase de mise au point terminée — une ligne à changer dans `ecran_fond.html`.
- Étendre `MARQUEUR_FIN_LIGNE` dans `micro.js` pour accepter "puis" en plus de "ensuite" (retour d'usage de Jean-Marc, 3 septembre) — sans urgence. - Étendre `MARQUEUR_FIN_LIGNE` dans `micro.js` pour accepter "puis" en plus de "ensuite" (retour d'usage de Jean-Marc, 3 septembre) — sans urgence.
- Continuer à observer les agents actifs (Viktor, Matilda, Léon, Nikita) en usage réel ; ajuster `AGN_Variantes` en base si de nouvelles confusions apparaissent. - Continuer à observer les agents actifs (Viktor, Matilda, Léon, Nikita, Sophia) en usage réel ; ajuster `AGN_Variantes` en base si de nouvelles confusions apparaissent.
- Documentation utilisateur : le panneau de détail du contact, la ToDoList et le pilotage vocal restent à documenter (mise à jour du 3 septembre limitée à l'écran d'accueil et à la liste des contacts) — l'outil de banque de dictées et le chantier des consignes n'ont volontairement pas vocation à y figurer pour l'instant, ce sont des chantiers internes, pas des modules utilisateur finalisés. - Documentation utilisateur : le panneau de détail du contact, la ToDoList, le pilotage vocal et l'écran des assistants restent à documenter (mise à jour du 3 septembre limitée à l'écran d'accueil et à la liste des contacts ; l'écran assistants volontairement laissé de côté pour l'instant, tant qu'il ne porte aucune action réelle, voir 9-10 septembre) — l'outil de banque de dictées et le chantier des consignes n'ont volontairement pas vocation à y figurer pour l'instant, ce sont des chantiers internes, pas des modules utilisateur finalisés.
- **Écran de fond, écran 2 ("assistants") : prochain chantier annoncé par Jean-Marc — gérer les attributions de Matilda** (voir plus haut). Contenu réel de l'écran 3 (tableau de bord) toujours entièrement à concevoir ; décider si les autres objets de l'avant-plan (carnet, téléphone) doivent devenir cliquables ; trancher un jour le sort de la piste "maquette liège + post-its par agent" (Claude Design, mise de côté pour cet essai, pas explicitement abandonnée). - **Gérer réellement les attributions de tâches des assistants (Matilda et les autres)** — chantier annoncé par Jean-Marc le 8 septembre, toujours pas commencé (voir plus haut). Contenu réel de l'écran 3 (tableau de bord) toujours entièrement à concevoir ; décider si les autres objets de l'avant-plan (carnet, téléphone) doivent devenir cliquables ; trancher un jour le sort de la piste "maquette liège + post-its par agent" (Claude Design, mise de côté pour cet essai, pas explicitement abandonnée).
- Section 28 du journal détaillé : combler, si l'occasion se présente, un trou de documentation relevé le 8 septembre — le passage d'un classeur unique ("Contacts") à neuf classeurs (Consignes, Contacts, Catalogue, Documents, Prospection, Réseaux, En-cours, Factures, Journalier) a eu lieu dans une session intermédiaire (aux alentours du 7 septembre) jamais consignée dans le fichier de section correspondant.
- Concevoir les deux signes graphiques distincts pour les post-its "à corriger"/"à valider" (réflexions stratégiques, section 12) — le premier acté (point d'interrogation), le second encore à choisir. - Concevoir les deux signes graphiques distincts pour les post-its "à corriger"/"à valider" (réflexions stratégiques, section 12) — le premier acté (point d'interrogation), le second encore à choisir.
- Tableau de liège : coder la répartition dynamique des 70% entre assistants par charge de tâches (formule actée, voir Statut actuel) — bloqué tant que la ToDoList des assistants n'existe pas réellement. **À rapprocher du prochain chantier (écran 2, attributions de Matilda).** - Tableau de liège : coder la répartition dynamique des 70% entre assistants par charge de tâches (formule actée, voir Statut actuel) — bloqué tant que la ToDoList des assistants n'existe pas réellement. **À rapprocher du chantier des attributions des assistants.**
- Étendre `ASP_ToDoList`/`todolist.php` pour qu'un assistant puisse être attributaire d'une tâche (discriminant humain/agent à définir) — préalable à la répartition dynamique et aux couleurs de post-it par assistant (`AGN_Couleur`, à ajouter). **À rapprocher du prochain chantier (écran 2, attributions de Matilda).** - Étendre `ASP_ToDoList`/`todolist.php` pour qu'un assistant puisse être attributaire d'une tâche (discriminant humain/agent à définir) — préalable à la répartition dynamique et à l'exploitation réelle des couleurs de post-it par assistant (`AGN_Couleur`, déjà ajoutée à `ASP_Agents` mais encore inutilisée par aucun écran). **À rapprocher du chantier des attributions des assistants.**
- Écran "journalier" (trace des réalisations, humain + assistants) — donnée déjà quasi disponible (`TDL_RealDate`/`TDL_RealUser`/`TDL_RealText`), écran de consultation à construire. - Écran "journalier" (trace des réalisations, humain + assistants) — donnée déjà quasi disponible (`TDL_RealDate`/`TDL_RealUser`/`TDL_RealText`), écran de consultation à construire.
- Revoir les règles de calcul des pastilles rouge/orange/vert (`calculerGroupe()`) pour éviter un tableau trop chargé en rouge/orange maintenant que le vert quitte le tableau immédiatement. - Revoir les règles de calcul des pastilles rouge/orange/vert (`calculerGroupe()`) pour éviter un tableau trop chargé en rouge/orange maintenant que le vert quitte le tableau immédiatement.
- Décider du comportement du clic sur un post-it (aujourd'hui inerte) : ouvrir `liste_todolist.html` sur la tâche précise, ou afficher un détail directement sur l'écran de fond. - Décider du comportement du clic sur un post-it (aujourd'hui inerte) : ouvrir `liste_todolist.html` sur la tâche précise, ou afficher un détail directement sur l'écran de fond.
@@ -154,3 +155,4 @@ Version incrémentée une seule fois pour l'ensemble de cette session (uniquemen
- Distinction Saisie/Validation réellement exploitée un jour dans le moteur de consignes (temps réel), si le besoin redevient assez fort pour justifier la complexité écartée le 6 septembre. - Distinction Saisie/Validation réellement exploitée un jour dans le moteur de consignes (temps réel), si le besoin redevient assez fort pour justifier la complexité écartée le 6 septembre.
- Ouvrir le chantier du dialogue simulé avec Claude intégré à ASPIC (bulles de dialogue façon SMS, mission dédiée, clé API Anthropic) — faisabilité confirmée le 8 septembre 2026 (réflexions stratégiques, section 18), rien conçu ni codé à ce stade. - Ouvrir le chantier du dialogue simulé avec Claude intégré à ASPIC (bulles de dialogue façon SMS, mission dédiée, clé API Anthropic) — faisabilité confirmée le 8 septembre 2026 (réflexions stratégiques, section 18), rien conçu ni codé à ce stade.
- **Ménage dans la structure de `ASP_Consignes`** (8 septembre 2026) : Jean-Marc a repéré des champs qui lui semblent redondants (`CNS_TexteDefinition`/`CNS_TexteAffiche` en particulier) — à examiner ensemble avant de toucher au schéma, pour ne pas supprimer un champ qui sert ailleurs sans qu'on l'ait vérifié. - **Ménage dans la structure de `ASP_Consignes`** (8 septembre 2026) : Jean-Marc a repéré des champs qui lui semblent redondants (`CNS_TexteDefinition`/`CNS_TexteAffiche` en particulier) — à examiner ensemble avant de toucher au schéma, pour ne pas supprimer un champ qui sert ailleurs sans qu'on l'ait vérifié.
- Contenu réel des classeurs Missions, Propositions, Livraisons et Gestion (nouvelle classification du 9-10 septembre, voir réflexions stratégiques section 19) — aucun écran ni donnée derrière à ce stade, seule la classification cible est fixée.
@@ -323,3 +323,21 @@ Version : `<code>` avait déjà avancé plus tôt dans cette même session de tr
- Conception de l'écran de dialogue (mission dédiée, bulles, choix du modèle Anthropic) — faisabilité confirmée, rien conçu ni codé à ce stade. - Conception de l'écran de dialogue (mission dédiée, bulles, choix du modèle Anthropic) — faisabilité confirmée, rien conçu ni codé à ce stade.
Session sans aucune ligne de code applicative touchée — seule la partie `<conception>` du numéro de version avance, de 17 à 18, premier cas réel d'une session purement dédiée à la réflexion depuis l'instauration du format à trois niveaux (6 septembre 2026, section 15) : **V1.15.18**. Session sans aucune ligne de code applicative touchée — seule la partie `<conception>` du numéro de version avance, de 17 à 18, premier cas réel d'une session purement dédiée à la réflexion depuis l'instauration du format à trois niveaux (6 septembre 2026, section 15) : **V1.15.18**.
## 19. Refonte de la classification en 9 classeurs — aligner les catégories du bureau sur le cycle de vie réel d'une affaire (9-10 septembre 2026)
**Origine.** En marge du chantier de l'écran 2 ("assistants", voir journal de développement section 28), Jean-Marc a repris de son côté la liste des 9 classeurs physiquement posés sur le bureau — mise en place lors d'une session intermédiaire aux alentours du 7 septembre 2026, jamais formellement consignée ni comme décision stratégique ni dans le détail technique du journal (trou de documentation déjà relevé le 8 septembre, voir section 28 du journal). Cette première liste (Consignes, Contacts, Catalogue, Documents, Prospection, Réseaux, En-cours, Factures, Journalier) juxtaposait des catégories de nature hétérogène — des objets métier (Contacts, Factures), une étape de processus (Prospection, En-cours), un mécanisme interne (Consignes) et un attribut d'assistant qui n'a rien à faire dans une classification de documents (Réseaux, qui est en réalité `AGN_Fonction` de l'assistant Nikita) — sans qu'un principe de classement unique les relie.
**La nouvelle répartition, pensée comme le cycle de vie d'une affaire plutôt que comme un inventaire d'objets.** Jean-Marc a proposé une liste resserrée à neuf classeurs toujours, mais cette fois organisée dans l'ordre où une affaire se déroule réellement chez lui : **Catalogue** (la liste des prestations réalisables), **Documents**, **Contacts** (cumulant prospects et clients — un contact n'a plus besoin de changer de classeur en devenant client), **Missions** (en cours et réalisées), **Propositions**, **Livraisons**, **Factures**, **Journalier**, **Gestion**. Chaque classeur y a maintenant sa place dans une même logique de progression (de ce qu'on propose à ce qu'on facture), plutôt que de mélanger des objets et des étapes sans hiérarchie commune.
**Deux choix de fond, au-delà du simple renommage :**
- **Contacts cumule prospects et clients.** Un même classeur pour tout le cycle de la relation — cohérent avec la donnée déjà en place côté base (aucune distinction structurelle entre prospect et client dans `ASP_Contacts`, seul le contenu réel des échanges le dit) : la classification suit ici la réalité déjà actée du modèle de données, plutôt que de recréer une frontière artificielle.
- **Consignes disparaît de la vue "classeurs".** Cohérent avec la nature même de ce mécanisme (sections 14, 15, 17) : une consigne est un réglage du fonctionnement des assistants, pas un document ou une affaire à classer — elle n'avait sa place dans les classeurs du bureau que par un raccourci de mise en œuvre initiale, pas par nature. Elle continuera d'exister comme mécanisme (table `ASP_Consignes`, futur écran de gestion évoqué en section 15), simplement plus comme un classeur visible du bureau à l'ancienne.
**Une contrainte assumée, pas subie : rester dans la limite de 9 classeurs.** Jean-Marc s'est explicitement imposé de retrouver une classification cohérente sans dépasser le nombre de classeurs déjà physiquement dessinés sur l'avant-plan du bureau (section 28 du journal, image fixe fournie le 8 septembre) — la contrainte visuelle existante a été un guide pour la réflexion business, pas un obstacle à contourner en redessinant l'image.
**Répercussion technique, anticipée par construction plutôt que découverte après coup :** la conservation des 9 positions physiques exactes (mêmes coordonnées x1/x2/étiquette sur l'image de référence, seuls les libellés et identifiants changent) a permis un renommage sans aucune retouche de l'avant-plan. Un seul point de vigilance identifié et corrigé avant livraison, propre à ce changement précis : la pastille de comptage des contacts (`PASTILLE_CONTACTS_CENTRE_X`) était positionnée par une coordonnée **indépendante** du tableau des classeurs, calée sur l'ancienne 2ᵉ position — un renommage naïf des seuls libellés l'aurait laissée sous "Documents" au lieu de suivre "Contacts" à sa nouvelle 3ᵉ position. Voir journal de développement, section 28, pour le détail technique de cette correction.
**Statut.** Décision actée et codée le soir même (voir journal, section 28, pour le détail des 9 classeurs et de leur position). Rien de plus engagé sur le contenu réel de chacun de ces classeurs (Missions, Propositions, Livraisons et Gestion n'ont, à ce stade, aucun écran ni donnée derrière eux — seul Contacts reste fonctionnel) : cette section fixe la classification cible, pas son implémentation fonctionnelle classeur par classeur, qui reste à construire un par un.
Cette clarification du classement documentaire est jugée par Jean-Marc suffisamment structurante pour faire avancer la partie `<conception>` du numéro de version — `<code>` avait déjà avancé en tout début de cette même session (V1.17.18 → V1.18.18) pour le code produit ce soir sur l'écran des assistants ; cette section fait avancer `<conception>` de 18 à 19 : nouvelle version **V1.18.19**.
@@ -253,3 +253,52 @@ Carrousel fonctionnel et validé par Jean-Marc sur son propre écran, après les
- Contenu réel de l'écran 3 (tableaux de bord) — seul le fond (tableau blanc) existe à ce stade. - Contenu réel de l'écran 3 (tableaux de bord) — seul le fond (tableau blanc) existe à ce stade.
- Combler, si l'occasion se présente, le trou de documentation relevé en tête de cette section (passage à neuf classeurs, session non consignée ici, aux alentours du 7 septembre). - Combler, si l'occasion se présente, le trou de documentation relevé en tête de cette section (passage à neuf classeurs, session non consignée ici, aux alentours du 7 septembre).
- Revalider l'ensemble des repères de l'avant-plan (classeurs, micro, pastille, flèches) si Jean-Marc devait encore retoucher cette image à l'avenir — toute nouvelle version demande, comme cette fois, une vérification de décalage avant de corriger au jugé. - Revalider l'ensemble des repères de l'avant-plan (classeurs, micro, pastille, flèches) si Jean-Marc devait encore retoucher cette image à l'avenir — toute nouvelle version demande, comme cette fois, une vérification de décalage avant de corriger au jugé.
## 9-10 septembre 2026 : écran 2 "assistants" — portraits, couleurs, rôles, panneau "Bureau des assistants" ; nouvelle texture de fond ; réorganisation des 9 classeurs (V1.18.19)
*Réflexion stratégique associée à la réorganisation des classeurs : Réflexions stratégiques, section 19.*
### Nouvelle texture de fond pour l'écran 2
Jean-Marc a fourni une nouvelle image de tasseaux de bois pour `fond_bureau_2.jpg` (générée par un outil externe, filigrane "Pippit AI" à retirer). Filigrane retiré par échantillonnage d'une couleur de fond propre (pixel de contrôle à l'écart de tout motif) et peinture d'un rectangle de cette couleur sur l'emprise exacte du logo, avant recadrage à la spécification 1024×457 (recadrage `(127,90,1216,576)` sur la source 1344×576). Jean-Marc a préféré cette texture à un essai précédent aux tasseaux plus épais, jugés trop proches d'un aspect "planche de décoffrage" que d'une vraie décoration de bureau.
### Conception des portraits d'assistants — de la maquette au rendu final
Jean-Marc a fait générer par un outil externe (Pippit) les portraits de plusieurs assistants, avec la même problématique de filigrane à retirer que pour le fond. Plusieurs itérations de maquette avant intégration réelle dans le code, chacune corrigée à partir d'un retour direct de Jean-Marc sur l'image envoyée :
- **Répartition en colonnes.** Proposition initiale à 4 colonnes de largeur uniforme (une par assistant existant), écartée par Jean-Marc au profit de 5 colonnes dès le premier essai réel — la 5ᵉ laissée vide, faute d'un nom pour un futur cinquième assistant (Jean-Marc a écarté "Lilou", pourtant "un parfait 5ème élément", à cause de la confusion déjà vécue avec "Gilou" lors du pilotage vocal, voir journal section 27).
- **Cadrage de la photo.** Un premier essai en médaillon rond a été retenu, recentré (visage au milieu du médaillon, même hauteur au-dessus de la tête), puis abandonné au profit d'un cadrage rectangulaire façon "photo d'identité" une fois les photos de Sophia et Léon reçues au même format. Un entourage de couleur par assistant a été testé puis retiré à la demande de Jean-Marc ("l'entouré de couleur c'est pas terrible en fait"), pour ne garder qu'un simple mat blanc, dans le même esprit que les cadres déjà utilisés sur ce bureau. Le cadrage a ensuite été affiné à deux reprises : d'abord pour montrer toute la hauteur de la photo (buste), puis, à l'inverse, pour réduire légèrement l'espace au-dessus de la tête et réduire la taille globale de la photo de 15%.
- **Couleurs pastel par assistant.** Codes calculés en HSL (saturation 75%, luminosité 80%) pour rester visuellement homogènes avec le jaune post-it déjà en place (`--postit-jaune`), avec une teinte par agent : bleu ciel (`#A6D9F2`, Matilda), vert clair (`#A6F2B3`, Léon), violet clair (`#C6A6F2`, Viktor), rose (`#F2A6C6`, Nikita), orange clair (`#F2CCA6`, Sophia, ajoutée au dernier moment). Couleurs stockées dans la nouvelle colonne `AGN_Couleur` (voir plus bas), pas encore exploitées par cet écran (prévues à terme pour les post-its du tableau de liège, voir journal section 28 précédent, et pour les bulles de dialogue de la future Mission, voir réflexions stratégiques section 18) — seulement portées ici en anticipation.
- **Rôle affiché sous le nom.** Une ligne de texte en gras sous le prénom de chaque assistant, dans une teinte grise sobre (`#3a3a3a`) : Matilda "Administratif", Viktor "Commercial", Nikita "Réseaux", Léon "Gestion", Sophia "Communication" — texte porté par la nouvelle colonne `AGN_Fonction`, taille de police du prénom augmentée par rapport à celle du rôle pour bien distinguer les deux lignes.
- **Panneau "Bureau des assistants".** Une fois les 5 photos (4 assistants + 1 case vide) posées sur 5 colonnes, il restait un espace libre sous les deux dernières colonnes (Léon, Sophia). Jean-Marc a demandé d'y afficher, dans un encadré du même style que les photos (fond gris, bordure blanche), le texte "Bureau des assistants" — un premier essai occupant toute la zone disponible a été corrigé à la demande de Jean-Marc ("l'encadré doit être autour du texte et ne pas occuper toute la zone") : l'encadré final est dimensionné au plus près du texte (mesure réelle via un `<canvas>` de mesure déjà présent dans le fichier pour les étiquettes de classeurs) et centré dans l'espace disponible, pas étiré à ses limites.
### Intégration réelle dans l'application
Une fois le rendu validé sur maquette, passage au code réel une fois Jean-Marc en mesure de fournir la vraie structure de `ASP_Agents` :
- **Stockage de la photo :** nouvelle colonne `AGN_Photo` (choix retenu après question posée à Jean-Marc entre plusieurs options — colonne dédiée plutôt que convention de nommage implicite), contenant le nom de fichier de la photo (ex. `assistant_matilda.jpg`), éditée à la main par Jean-Marc comme `AGN_Variantes` — valeur vide tolérée côté écran (repli visuel avec un simple "?" à la place de la photo), un agent sans photo restant affiché.
- **Ordre d'affichage :** nouvelle colonne `AGN_OrdreAffichage`, pilotée par Jean-Marc indépendamment de l'ordre de création des agents (`AGN_Incr`) — utilisée pour trier l'écran des assistants (Matilda, Viktor, Nikita, Léon, Sophia) et remplace `AGN_Incr` dans le tri de `agents.php`.
- **Nombre de colonnes calculé dynamiquement :** décision prise après question posée à Jean-Marc (calcul depuis `ASP_Agents` plutôt que 5 colonnes codées en dur) — cohérent avec le principe déjà établi sur ce projet de sortir du code en dur (réflexions stratégiques, section 15) : le nombre de colonnes de l'écran assistants, la largeur de chaque colonne et la position du panneau "Bureau des assistants" sont recalculés à chaque chargement à partir du nombre réel d'agents renvoyés par `agents.php`, jamais figés à 5.
- **Nommage des fichiers photo :** convention `assistant_<prenom>.jpg` (et non `agent_<prenom>.jpg`, choix initial de Claude) — corrigée pour correspondre aux valeurs réelles saisies par Jean-Marc dans `AGN_Photo`. Fichiers de production recadrés selon une même recette précise (mesurée par analyse de pixels sur des images repères plutôt que devinée) : `pad=160, crop_h=1200, y0=19`, ratio largeur/hauteur `0.657`, watermark nettoyé par la même méthode que pour le fond (`assistant_leon.jpg`, `assistant_sophia.jpg`).
- **Architecture retenue dans `ecran_fond.html` :** nouvelle couche `#assistants-layer` (`coucheAssistants`), attachée au fond 2 par le même mécanisme de réattachement de nœud DOM déjà en place pour les post-its du fond 1 (`creerFondSlide()` déplace la bonne couche vers la bonne diapositive de fond selon l'index affiché — aucune duplication de logique de position). `chargerAgentsEcranAssistants()` interroge `agents.php` une fois au chargement et appelle `creerCartesAssistants()`, qui reconstruit une carte par agent (`.assistant-carte` : cadre photo ou repli "?", nom, rôle) sans jamais recréer le panneau "Bureau des assistants" lui-même (créé une seule fois, seules ses coordonnées sont recalculées). `positionner()` calcule, pour chaque colonne, la largeur (`dispW / nombre de cartes`), la taille de la photo (contrainte par la largeur de colonne autant que par la hauteur maximale), puis — uniquement si au moins deux colonnes sont affichées — la position du panneau "Bureau des assistants" en mesurant son texte réel via le canevas de mesure et en le centrant dans l'espace restant sous les deux dernières colonnes.
### Réorganisation des 9 classeurs
En parallèle du chantier ci-dessus, Jean-Marc a revu de son côté la répartition des 9 classeurs du bureau — voir Réflexions stratégiques, section 19, pour le raisonnement business complet (classement suivant le cycle de vie d'une affaire plutôt qu'un inventaire hétérogène d'objets). Nouvelle liste, mêmes 9 positions physiques sur l'avant-plan qu'auparavant (seuls les libellés/identifiants du tableau `CLASSEURS` changent, aucune coordonnée x1/x2/étiquette retouchée) : Catalogue, Documents, Contacts, Missions, Propositions, Livraisons, Factures, Journalier, Gestion. Ce nouveau libellé referme, pour sa part la plus visible, le trou de documentation relevé le 8 septembre ci-dessus (le passage à 9 classeurs vers le 7 septembre n'avait jamais été consigné ici) — même si le détail de cette session intermédiaire elle-même reste non reconstitué.
**Point de vigilance identifié et corrigé avant livraison :** la pastille de comptage des contacts (`PASTILLE_CONTACTS_CENTRE_X = 101`, positionnée sous l'ancien classeur "Contacts" en 2ᵉ position) est une coordonnée indépendante du tableau `CLASSEURS`, pas dérivée de sa position — un simple renommage des libellés l'aurait laissée sous "Documents" (nouvelle 2ᵉ position) au lieu de suivre "Contacts" à sa nouvelle 3ᵉ position. Repositionnée à `138.5` (Y inchangé) après vérification.
### Fichiers touchés
`fond_bureau_2.jpg` (nouvelle texture), `agents.php` (colonnes `AGN_Photo`/`AGN_OrdreAffichage`/`AGN_Couleur`, tri par `AGN_OrdreAffichage`), `ecran_fond.html` (couche assistants, cartes dynamiques, panneau "Bureau des assistants", tableau `CLASSEURS` relabellisé, `PASTILLE_CONTACTS_CENTRE_X` repositionnée), `assistant_matilda.jpg` / `assistant_viktor.jpg` / `assistant_nikita.jpg` / `assistant_leon.jpg` / `assistant_sophia.jpg` (nouveaux, photos de production recadrées). Côté base : colonnes `AGN_Photo`, `AGN_OrdreAffichage`, `AGN_Couleur` ajoutées par Jean-Marc directement à `ASP_Agents` (voir convention actée en tête de journal sur les exports SQL transmis).
### Statut en fin de session
Écran 2 fonctionnel côté présentation (portraits, couleurs, rôles, panneau), mais sans aucune action réelle derrière (aucun clic fonctionnel, pas d'attribution de tâches) — la présentation seule était l'objet de cette session, conformément au chantier annoncé le 8 septembre ("gérer les attributions de Matilda" reste entier, voir "Reste à faire"). `<code>` avancé dès le début de session à la demande de Jean-Marc (V1.17.18 → V1.18.18) ; `<conception>` avancé en fin de session (18 → 19) pour la réorganisation des classeurs jugée par Jean-Marc comme une évolution conceptuelle majeure (voir réflexions stratégiques, section 19) — nouvelle version **V1.18.19**.
**Reste à faire, noté au passage :**
- Gérer réellement les attributions de tâches de Matilda et des autres assistants (chantier annoncé par Jean-Marc le 8 septembre, non commencé) — discriminant humain/agent sur `ASP_ToDoList`, répartition dynamique des 70% par charge de tâches (voir "Point ouvert, non tranché" plus haut).
- Exploiter enfin `AGN_Couleur`, portée sur cet écran mais encore inutilisée par aucun affichage réel (post-its du tableau de liège, bulles de dialogue d'une future Mission).
- Contenu réel des classeurs Missions, Propositions, Livraisons et Gestion — aucun écran ni donnée derrière à ce stade, seule la classification est fixée (voir réflexions stratégiques, section 19).
- Reconstituer, si l'occasion se présente, le détail de la session intermédiaire (~7 septembre) qui avait fait passer d'un classeur unique à 9 classeurs — non fait, faute de matière, comme déjà noté le 8 septembre.
+1 -1
View File
@@ -50,7 +50,7 @@
* capacité à détecter un déploiement resté en retard. * capacité à détecter un déploiement resté en retard.
*/ */
const ASPIC_VERSION = 'V1.17.18'; const ASPIC_VERSION = 'V1.18.19';
if (basename($_SERVER['SCRIPT_NAME']) === 'version.php') { if (basename($_SERVER['SCRIPT_NAME']) === 'version.php') {
header('Content-Type: application/json; charset=utf-8'); header('Content-Type: application/json; charset=utf-8');