Files
ASPIC/php/realisations.php
T
2026-08-28 15:32:36 +02:00

101 lines
4.0 KiB
PHP

<?php
/**
* ASPIC — realisations.php
* Journal des actions réalisées sur un contact (ASP_Realisations). Voir
* journal de développement, section 2, pour la distinction entre ACT_Comment
* (commentaire générique du type d'action, ASP_Actions) et REA_Comment
* (commentaire propre à une occurrence, ASP_Realisations) — c'est bien
* REA_Comment qui est manipulé ici.
*
* GET ?id=<CNT_Incr> : historique des réalisations d'un contact, avec le
* libellé de l'action (jointure sur ASP_Actions), trié du plus ancien
* au plus récent.
* POST : journalise une nouvelle réalisation (REA_IncrContact, REA_Action
* obligatoires ; REA_Comment optionnel). REA_Date est déterminée côté
* serveur (NOW()).
*
* ⚠️ Session utilisateur intégrée le 24 août 2026 (voir journal, sections 14
* et 15) : accès réservé aux utilisateurs identifiés, et REA_CodeUser est
* désormais lu directement dans `$_SESSION['USR_Code']` (ouverte par
* `aspic.php`) — le champ REA_CodeUser du corps de la requête POST n'est
* plus utilisé et ne peut plus être falsifié par le client. Le "JMP" en dur
* précédent a été supprimé (n'avait de sens que faute de session).
*/
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;
}
$method = $_SERVER['REQUEST_METHOD'];
try {
$pdo = getDbConnection();
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Connexion base de données impossible']);
exit;
}
try {
switch ($method) {
case 'GET':
if (!isset($_GET['id'])) {
http_response_code(400);
echo json_encode(['error' => 'id (REA_IncrContact) manquant']);
exit;
}
$stmt = $pdo->prepare(
'SELECT r.REA_Incr, r.REA_Date, r.REA_CodeUser, r.REA_Action, r.REA_Comment,
a.ACT_Libelle
FROM ASP_Realisations r
LEFT JOIN ASP_Actions a ON a.ACT_Code = r.REA_Action
WHERE r.REA_IncrContact = ?
ORDER BY r.REA_Date ASC'
);
$stmt->execute([$_GET['id']]);
echo json_encode(['realisations' => $stmt->fetchAll()]);
break;
case 'POST':
$data = json_decode(file_get_contents('php://input'), true);
$idContact = $data['REA_IncrContact'] ?? null;
$action = $data['REA_Action'] ?? null;
if (!$idContact || !$action) {
http_response_code(400);
echo json_encode(['error' => 'REA_IncrContact et REA_Action sont obligatoires']);
exit;
}
// REA_CodeUser vient de la session (voir en-tête de ce fichier),
// plus du corps de la requête : impossible pour le client de se
// faire passer pour un autre utilisateur.
$codeUser = $_SESSION['USR_Code'];
$commentaire = $data['REA_Comment'] ?? '';
$stmt = $pdo->prepare(
'INSERT INTO ASP_Realisations (REA_IncrContact, REA_CodeUser, REA_Date, REA_Action, REA_Comment)
VALUES (?, ?, NOW(), ?, ?)'
);
$stmt->execute([$idContact, $codeUser, $action, $commentaire]);
echo json_encode(['id' => (int)$pdo->lastInsertId()]);
break;
default:
http_response_code(405);
echo json_encode(['error' => 'Méthode non autorisée']);
}
} catch (PDOException $e) {
// Toute exception PDO (ex. REA_Action trop long pour la colonne, valeur
// rejetée par une contrainte) renvoie du JSON exploitable côté front
// plutôt qu'une erreur PHP brute — voir contacts.php pour le même
// correctif du 24 août 2026.
http_response_code(500);
echo json_encode(['error' => 'Erreur base de données : ' . $e->getMessage()]);
}