V1.22.23 Passage à Claude Code et création du BackOffice

This commit is contained in:
2026-09-11 13:38:34 +00:00
parent a9af2a5213
commit 05df1c5a28
28 changed files with 2660 additions and 670 deletions
+121
View File
@@ -0,0 +1,121 @@
<?php
/**
* ASPIC — collaborateur_experience_append.php
*
* Endpoint interne (10 septembre 2026, réflexions stratégiques section 20,
* suite) — même famille que collaborateurs_identite.php/
* collaborateur_dialogue.php : un outil de mise au point réservé à Jean-Marc,
* jamais destiné aux futurs utilisateurs.
*
* Appelé automatiquement par ecran_fond.html "au fil de l'eau", après CHAQUE
* réponse reçue du collaborateur pendant un essai "Tester l'identité" — pas
* seulement à la fermeture de la fenêtre de dialogue. Décision de Jean-Marc
* (10 septembre 2026) : il s'est rendu compte qu'il donne parfois, en
* testant, de vraies informations sur son projet (pas seulement des
* réglages de personnalité) et qu'il serait "un peu idiot" de les perdre si
* la fenêtre se ferme sans prévenir (fermeture d'onglet, plantage du
* navigateur) — d'où un ajout systématique dès que la réponse arrive,
* jamais différé à un clic sur "Fermer".
*
* Ajoute (ne remplace JAMAIS) un tour d'échange complet — ce que Jean-Marc a
* dit ET ce que le collaborateur a répondu, les deux, pas seulement la
* réponse — au texte déjà accumulé dans AGN_Experience. Ajout atomique côté
* SQL (CONCAT dans l'UPDATE, sans lecture préalable côté PHP) : pas de
* risque d'écraser un ajout concurrent, même si peu probable ici (Jean-Marc
* seul utilisateur réel à ce jour).
*
* Ce texte accumulé est volontairement brut, sans tri ni interprétation —
* c'est justement le rôle de "Modifier l'expérience" (collaborateurs_identite.php,
* PUT sur AGN_Experience) de permettre à Jean-Marc de faire le ménage après
* coup (retirer ce qui ne concernait que la mise au point de l'identité,
* garder ce qui a une vraie valeur de mémoire).
*
* Reçoit (POST, JSON) :
* { "AGN_Incr": 3, "premierEchange": true,
* "utilisateur": "...", "collaborateur": "..." }
* - "utilisateur"/"collaborateur" : le tour de dialogue qui vient d'avoir
* lieu (texte brut, jamais renvoyé ni ré-affiché ensuite par cet endpoint).
* - "premierEchange" (bool) : vrai pour le tout premier tour d'une session de
* test (voir selectionnerCollaborateurTest() dans ecran_fond.html) — fait
* précéder le tour d'un en-tête horodaté, pour distinguer les sessions
* entre elles dans le texte accumulé ; faux pour les tours suivants de la
* même session, qui s'ajoutent à la suite sans répéter cet en-tête.
*
* Le nom affiché pour Jean-Marc n'est jamais envoyé par le front : lu
* directement dans $_SESSION['USR_Prenom'] (ouverte par aspic.php), même
* principe que REA_NomAffiche dans realisations.php — une donnée de session
* fait foi, jamais une valeur transmise par le client.
*/
session_start();
header('Content-Type: application/json; charset=utf-8');
require __DIR__ . '/db.php';
if (empty($_SESSION['USR_Code'])) {
http_response_code(401);
echo json_encode(['error' => 'Non identifié — veuillez vous connecter.']);
exit;
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['error' => 'Méthode non autorisée']);
exit;
}
$data = json_decode(file_get_contents('php://input'), true) ?? [];
$incr = (int) ($data['AGN_Incr'] ?? 0);
$premierEchange = !empty($data['premierEchange']);
$texteUtilisateur = trim((string) ($data['utilisateur'] ?? ''));
$texteCollaborateur = trim((string) ($data['collaborateur'] ?? ''));
if ($incr <= 0) {
http_response_code(400);
echo json_encode(['error' => 'AGN_Incr manquant ou invalide']);
exit;
}
if ($texteUtilisateur === '' || $texteCollaborateur === '') {
http_response_code(400);
echo json_encode(['error' => 'Échange incomplet (message et réponse attendus tous les deux)']);
exit;
}
try {
$pdo = getDbConnection();
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Connexion base de données impossible']);
exit;
}
try {
$verif = $pdo->prepare('SELECT AGN_Prenom FROM ASP_Agents WHERE AGN_Incr = ?');
$verif->execute([$incr]);
$agent = $verif->fetch();
if (!$agent) {
http_response_code(404);
echo json_encode(['error' => 'Collaborateur introuvable']);
exit;
}
$nomUtilisateur = $_SESSION['USR_Prenom'] ?? 'Jean-Marc';
$nomCollaborateur = $agent['AGN_Prenom'] ?: 'Collaborateur';
$bloc = '';
if ($premierEchange) {
$bloc .= "\n--- " . date('d/m/Y H:i') . ' — session de test avec ' . $nomUtilisateur . " ---\n";
}
$bloc .= '[' . $nomUtilisateur . '] ' . $texteUtilisateur . "\n";
$bloc .= '[' . $nomCollaborateur . '] ' . $texteCollaborateur . "\n";
// CONCAT atomique : jamais de lecture préalable du texte existant côté
// PHP, donc jamais de risque d'écraser un ajout concurrent avec une
// valeur devenue périmée entre temps.
$stmt = $pdo->prepare(
"UPDATE ASP_Agents SET AGN_Experience = CONCAT(COALESCE(AGN_Experience, ''), ?) WHERE AGN_Incr = ?"
);
$stmt->execute([$bloc, $incr]);
echo json_encode(['success' => true]);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Erreur base de données : ' . $e->getMessage()]);
}