mirror of
https://github.com/JMP-MS/ASPIC.git
synced 2026-10-27 16:07:10 +00:00
178 lines
8.3 KiB
PHP
178 lines
8.3 KiB
PHP
<?php
|
|
/**
|
|
* ASPIC — collaborateurs_identite.php
|
|
*
|
|
* Endpoint interne (10 septembre 2026, réflexions stratégiques section 20 —
|
|
* "collaborateurs", identité propre à chacun) — PAS un endpoint destiné aux
|
|
* futurs utilisateurs, sur le même principe que dictees_test.php/
|
|
* contact_ia_test.html : un outil de mise au point réservé à Jean-Marc.
|
|
*
|
|
* Lit/écrit deux colonnes texte libre sur ASP_Agents, éditées à la main par
|
|
* Jean-Marc en base avant tout premier essai — même principe qu'AGN_Variantes/
|
|
* AGN_Photo :
|
|
*
|
|
* ALTER TABLE ASP_Agents
|
|
* ADD COLUMN AGN_Identite TEXT NULL DEFAULT NULL AFTER AGN_Couleur;
|
|
*
|
|
* - AGN_Identite : parcours de vie, expérience professionnelle, traits de
|
|
* caractère — écrit par Jean-Marc lui-même via "Construire une identité".
|
|
* - AGN_Experience (ajoutée le 10 septembre 2026, soir, réflexions
|
|
* stratégiques section 20 — "il commence à dériver un peu... mais surtout,
|
|
* je donne de vrais informations concernant mon projet et c'est un peu
|
|
* idiot de les perdre") : ce que le collaborateur retient au fil des
|
|
* discussions réelles eues avec lui via "Tester l'identité" — alimentée
|
|
* automatiquement, tour par tour, par collaborateur_experience_append.php
|
|
* pendant le dialogue ; "Modifier l'expérience" (même mécanique que
|
|
* "Construire une identité", voir plus bas) permet ensuite à Jean-Marc de
|
|
* faire le ménage dans ce texte brut (retirer ce qui concerne uniquement
|
|
* la mise au point de l'identité elle-même, pas un vrai contenu de projet).
|
|
*
|
|
* Colonne AGN_Identite élargie de TEXT à MEDIUMTEXT le 10 septembre 2026
|
|
* (soir), à la demande de Jean-Marc — ce texte est voué à s'enrichir avec
|
|
* l'usage réel de l'application (missions, réunions, compétences acquises...)
|
|
* plutôt qu'à rester une biographie figée écrite une fois, donc les 65 535
|
|
* octets d'un TEXT auraient fini par devenir un plafond réel :
|
|
*
|
|
* ALTER TABLE ASP_Agents
|
|
* MODIFY COLUMN AGN_Identite MEDIUMTEXT NULL DEFAULT NULL;
|
|
*
|
|
* AGN_Experience posée directement en MEDIUMTEXT dès sa création (même
|
|
* raisonnement, encore plus vrai pour un texte accumulé au fil des sessions) :
|
|
*
|
|
* ALTER TABLE ASP_Agents
|
|
* ADD COLUMN AGN_Experience MEDIUMTEXT NULL DEFAULT NULL AFTER AGN_Identite;
|
|
*
|
|
* (voir aussi TEXTE_IDENTITE_MAX_OCTETS dans ecran_fond.html, qui reflète
|
|
* cette même limite côté indicateur de saisie — partagé par les deux champs.)
|
|
*
|
|
* Volontairement séparé d'agents.php : celui-ci reste l'endpoint de lecture
|
|
* publique consommé par ecran_fond.html (portraits, couleurs, rôles) — jamais
|
|
* question qu'AGN_Identite ou AGN_Experience y transitent, puisque ces deux
|
|
* données doivent rester invisibles d'un utilisateur ordinaire (décision
|
|
* explicite de Jean-Marc, réflexions stratégiques section 20 : l'identité de
|
|
* chaque collaborateur n'est pas consultable telle quelle, seule une
|
|
* présentation synthétisée par le collaborateur lui-même pourra un jour en
|
|
* être tirée, dans une future Mission — voir réflexions stratégiques section
|
|
* 18). Même principe pour AGN_Experience, par cohérence.
|
|
*
|
|
* Accès : simple session ouverte, même principe que tous les autres endpoints
|
|
* du projet (contacts.php, todolist.php...) — PAS de vérification renforcée
|
|
* par USR_Code précis. Décision explicite de Jean-Marc (10 septembre 2026,
|
|
* revenant sur le premier réglage plus strict envisagé) : il reste seul
|
|
* utilisateur réel de l'application pour encore plusieurs mois, inutile de
|
|
* s'imposer une friction (retrouver puis coder en dur son propre USR_Code)
|
|
* pour un risque nul dans l'immédiat. Cette page reste malgré tout un outil
|
|
* interne, jamais lié depuis la navigation normale de l'application — rien
|
|
* n'affiche AGN_Identite ailleurs (voir plus haut).
|
|
* ⚠️ À REVOIR le jour où un second utilisateur réel (collaborateur humain,
|
|
* client bêta) aura un compte MIRADOR sur la même base : remettre une
|
|
* vérification par rôle (ex. nouvelle colonne USR_Administrateur, encore
|
|
* inexistante à ce jour) avant d'ouvrir l'accès à qui que ce soit d'autre que
|
|
* Jean-Marc.
|
|
*/
|
|
|
|
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;
|
|
}
|
|
|
|
try {
|
|
$pdo = getDbConnection();
|
|
} catch (PDOException $e) {
|
|
http_response_code(500);
|
|
echo json_encode(['error' => 'Connexion base de données impossible']);
|
|
exit;
|
|
}
|
|
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
|
|
if ($method === 'GET') {
|
|
try {
|
|
$stmt = $pdo->query(
|
|
'SELECT AGN_Incr, AGN_Prenom, AGN_Fonction, AGN_Photo, AGN_Couleur, AGN_Identite, AGN_Experience, AGN_Relationnel
|
|
FROM ASP_Agents ORDER BY AGN_OrdreAffichage ASC'
|
|
);
|
|
echo json_encode(['collaborateurs' => $stmt->fetchAll()]);
|
|
} catch (PDOException $e) {
|
|
http_response_code(500);
|
|
echo json_encode(['error' => 'Erreur base de données : ' . $e->getMessage()]);
|
|
}
|
|
exit;
|
|
}
|
|
|
|
if ($method === 'PUT') {
|
|
$data = json_decode(file_get_contents('php://input'), true) ?? [];
|
|
$incr = (int) ($data['AGN_Incr'] ?? 0);
|
|
|
|
// Un seul des champs à la fois dans le corps de la requête — jamais
|
|
// plusieurs ensemble côté front (voir champActif dans bo_collaborateurs.html :
|
|
// un onglet par champ — Identité/Expérience/Relationnel — jamais deux
|
|
// édités dans le même appel). AGN_Relationnel (11 septembre 2026) : posture
|
|
// relationnelle du collaborateur envers l'équipe, statique pour l'instant
|
|
// — distincte d'AGN_Identite (caractère individuel) et d'AGN_Experience
|
|
// (qui s'enrichit par append, voir collaborateur_experience_append.php).
|
|
// Whitelist stricte plutôt qu'un nom de colonne construit depuis une clé
|
|
// arbitraire du JSON reçu, même si en pratique cette donnée ne vient
|
|
// jamais d'ailleurs que du front interne — même esprit défensif que le
|
|
// reste du projet (voir contacts.php, contact_ia_interprete.php).
|
|
$champsAutorises = ['AGN_Identite', 'AGN_Experience', 'AGN_Relationnel'];
|
|
$champ = null;
|
|
foreach ($champsAutorises as $c) {
|
|
if (array_key_exists($c, $data)) {
|
|
$champ = $c;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ($incr <= 0) {
|
|
http_response_code(400);
|
|
echo json_encode(['error' => 'AGN_Incr manquant ou invalide']);
|
|
exit;
|
|
}
|
|
if ($champ === null) {
|
|
http_response_code(400);
|
|
echo json_encode(['error' => 'Aucun champ à mettre à jour (AGN_Identite ou AGN_Experience attendu)']);
|
|
exit;
|
|
}
|
|
|
|
// Champ volontairement libre, sans limite de longueur imposée ici
|
|
// (MEDIUMTEXT côté base, voir en-tête) : une identité — ou une expérience
|
|
// accumulée — bien écrite peut dépasser largement la taille d'un champ de
|
|
// fiche habituel (Nom, Ville...) de ce projet, et grandira encore avec
|
|
// l'usage réel de l'application — le seul garde-fou vit côté front-end
|
|
// (voir TEXTE_IDENTITE_MAX_OCTETS/compteur-identite dans ecran_fond.html).
|
|
$valeur = trim((string) ($data[$champ] ?? ''));
|
|
|
|
try {
|
|
// Existence vérifiée par un SELECT séparé plutôt que sur rowCount() de
|
|
// l'UPDATE (même précaution que contacts.php, section PUT — un texte
|
|
// identique au texte déjà enregistré donnerait rowCount() = 0 alors
|
|
// que le collaborateur existe bien).
|
|
$verif = $pdo->prepare('SELECT AGN_Incr FROM ASP_Agents WHERE AGN_Incr = ?');
|
|
$verif->execute([$incr]);
|
|
if (!$verif->fetch()) {
|
|
http_response_code(404);
|
|
echo json_encode(['error' => 'Collaborateur introuvable']);
|
|
exit;
|
|
}
|
|
|
|
// $champ vient exclusivement de $champsAutorises ci-dessus, jamais
|
|
// directement de $data : interpolation sans risque d'injection.
|
|
$stmt = $pdo->prepare("UPDATE ASP_Agents SET {$champ} = ? WHERE AGN_Incr = ?");
|
|
$stmt->execute([$valeur !== '' ? $valeur : null, $incr]);
|
|
echo json_encode(['success' => true]);
|
|
} catch (PDOException $e) {
|
|
http_response_code(500);
|
|
echo json_encode(['error' => 'Erreur base de données : ' . $e->getMessage()]);
|
|
}
|
|
exit;
|
|
}
|
|
|
|
http_response_code(405);
|
|
echo json_encode(['error' => 'Méthode non autorisée']);
|