V1.15.17 Evolutions des consignes

This commit is contained in:
2026-09-08 01:29:41 +00:00
parent d287607e45
commit 0f7437fa77
18 changed files with 1361 additions and 121 deletions
+73 -6
View File
@@ -69,6 +69,23 @@
* pas de distinction Saisie/Validation (tout s'applique à l'enregistrement),
* pas de vérification en temps réel côté écran pour l'instant — décision de
* Jean-Marc du 6 septembre 2026, priorité à la robustesse.
*
* Journalisation des Traitements IA dans ASP_Realisations (7 septembre 2026,
* soir) : appliquerConsignes() peut remonter, via son paramètre par référence
* $journalisationsIA, une ou plusieurs entrées à journaliser (ex. code postal
* déduit par l'IA depuis la ville — voir consigne_completer_code_postal()).
* Écrites ICI, directement en base, plutôt que laissées au front-end comme
* CNT_CRE/CNT_MAJ (voir liste_contacts.html, validerFormulaireContact()) :
* REA_CodeUser/REA_NomAffiche reçoivent alors le nom d'agent IA (ex. "Matilda"
* — voir ASP_Agents.AGN_Prenom, et CNS_Agent sur la consigne qui a déclenché le
* Traitement), pas
* l'utilisateur humain de la session — hors de portée de realisations.php,
* qui impose volontairement $_SESSION['USR_Code'] (correctif de sécurité du
* 24 août 2026, voir ce fichier) et ne doit surtout pas rouvrir la
* possibilité qu'un client falsifie REA_CodeUser. Best-effort (try/catch
* séparé) : un souci de journalisation ne doit jamais faire échouer
* l'enregistrement du contact lui-même, même principe que la journalisation
* CNT_CRE/CNT_MAJ côté front.
*/
session_start();
@@ -122,6 +139,43 @@ function construireMotifLike(string $valeur): array
return [$motif, '\\'];
}
/**
* Journalise dans ASP_Realisations les Traitements IA remontés par
* appliquerConsignes() (voir moteur_consignes.php et le commentaire d'en-tête
* de ce fichier) — ex. code postal déduit de la ville. Best-effort : une
* exception ici est avalée (juste consignée au log serveur), jamais renvoyée
* au client — un souci de journalisation ne doit pas laisser croire que
* l'enregistrement du contact a échoué alors qu'il a réussi.
*/
function journaliserRealisationsIA(PDO $pdo, int $idContact, array $journalisationsIA): void
{
if (!$journalisationsIA) return;
try {
// REA_CodeUser ET REA_NomAffiche reçoivent la même valeur pour un
// agent IA (7 septembre 2026, nuit — "le prénom de l'agent en dur",
// Jean-Marc) : contrairement à un utilisateur humain, un agent n'a
// pas de code technique court séparé de son nom affiché — la valeur
// vient déjà en clair de CNS_Agent (voir moteur_consignes.php),
// aucune recherche supplémentaire à faire ici.
$stmt = $pdo->prepare(
'INSERT INTO ASP_Realisations (REA_IncrContact, REA_CodeUser, REA_NomAffiche, REA_Date, REA_Action, REA_Comment)
VALUES (?, ?, ?, NOW(), ?, ?)'
);
foreach ($journalisationsIA as $j) {
$nomAgent = (string)($j['agent'] ?? 'IA');
$stmt->execute([
$idContact,
$nomAgent,
$nomAgent,
(string)($j['action'] ?? 'IA'),
(string)($j['commentaire'] ?? ''),
]);
}
} catch (PDOException $e) {
error_log('ASPIC contacts: échec journalisation ASP_Realisations (Traitement IA) : ' . $e->getMessage());
}
}
try {
switch ($method) {
case 'GET':
@@ -199,10 +253,14 @@ try {
case 'POST':
$data = json_decode(file_get_contents('php://input'), true) ?? [];
$erreurConsigne = appliquerConsignes($pdo, 'Contacts', 'Création', $data);
$erreurConsigne = appliquerConsignes($pdo, 'Contacts', 'Création', $data, $agentConsigne, $journalisationsIA, $avertissementsIA);
if ($erreurConsigne !== null) {
http_response_code(400);
echo json_encode(['error' => $erreurConsigne]);
// 'agent' (CNS_Agent, 7 septembre 2026) : vaut JSON null si la
// consigne en échec n'en a pas — sans effet côté front, où
// afficherToast n'affiche la ligne agent que si la valeur est
// présente et non vide.
echo json_encode(['error' => $erreurConsigne, 'agent' => $agentConsigne]);
exit;
}
@@ -245,7 +303,14 @@ try {
$stmtCode = $pdo->prepare('UPDATE ASP_Contacts SET CNT_Code = ? WHERE CNT_Incr = ?');
$stmtCode->execute([$code, $nouvelIncr]);
echo json_encode(['id' => $nouvelIncr, 'code' => $code]);
journaliserRealisationsIA($pdo, $nouvelIncr, $journalisationsIA);
// 'avertissements' (7 septembre 2026, nuit) : messages à afficher
// immédiatement à l'écran, voir moteur_consignes.php ("_avertissement")
// — distinct de la journalisation ci-dessus, qui va dans
// l'historique mais ne s'affiche pas tout de suite. Tableau vide
// la plupart du temps, le front-end n'affiche alors rien.
echo json_encode(['id' => $nouvelIncr, 'code' => $code, 'avertissements' => $avertissementsIA]);
break;
case 'PUT':
@@ -256,10 +321,10 @@ try {
}
$data = json_decode(file_get_contents('php://input'), true) ?? [];
$erreurConsigne = appliquerConsignes($pdo, 'Contacts', 'Modification', $data);
$erreurConsigne = appliquerConsignes($pdo, 'Contacts', 'Modification', $data, $agentConsigne, $journalisationsIA, $avertissementsIA);
if ($erreurConsigne !== null) {
http_response_code(400);
echo json_encode(['error' => $erreurConsigne]);
echo json_encode(['error' => $erreurConsigne, 'agent' => $agentConsigne]);
exit;
}
@@ -295,7 +360,9 @@ try {
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
echo json_encode(['success' => true]);
journaliserRealisationsIA($pdo, (int)$_GET['id'], $journalisationsIA);
echo json_encode(['success' => true, 'avertissements' => $avertissementsIA]);
break;
case 'DELETE':