mirror of
https://github.com/JMP-MS/ASPIC.git
synced 2026-10-27 16:07:10 +00:00
122 lines
5.2 KiB
PHP
122 lines
5.2 KiB
PHP
<?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()]);
|
|
}
|