'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) ?? []; $lignes = $data['lignes'] ?? []; if (!is_array($lignes) || count($lignes) === 0) { http_response_code(400); echo json_encode(['error' => 'Aucune ligne à enregistrer']); exit; } const TYPES_VALIDES = ['ouverture', 'contenu', 'cloture', 'annulation']; try { $pdo = getDbConnection(); } catch (PDOException $e) { http_response_code(500); echo json_encode(['error' => 'Connexion base de données impossible']); exit; } $agent = trim((string) ($data['agent'] ?? '')); if ($agent === '') { // Agent par défaut piloté par la donnée (2 septembre 2026, décision de // Jean-Marc : plus question de figer un nom d'agent en dur ici — après // Lilou, retirée de ASP_Agents le même jour pour cause de confusions // récurrentes, un prochain agent par défaut pourrait tout aussi bien // changer). AGN_Defaut ('O'/'N') désigne l'agent de repli directement // en base, modifiable par Jean-Marc sans toucher au code. Repli // supplémentaire sur le premier agent de la table si aucun n'est // marqué par défaut (ne devrait pas arriver en usage normal, simple // filet de sécurité pour ne jamais laisser CVX_AgentTraitant vide). try { $stmtDefaut = $pdo->query( "SELECT AGN_Nom FROM ASP_Agents WHERE AGN_Defaut = 'O' ORDER BY AGN_Incr ASC LIMIT 1" ); $agent = $stmtDefaut->fetchColumn(); if ($agent === false || $agent === '') { $stmtPremier = $pdo->query('SELECT AGN_Nom FROM ASP_Agents ORDER BY AGN_Incr ASC LIMIT 1'); $agent = $stmtPremier->fetchColumn(); } } catch (PDOException $e) { $agent = false; } if ($agent === false || $agent === '') { $agent = 'Agent'; } } if (mb_strlen($agent) > 20) { $agent = mb_substr($agent, 0, 20); } // Un seul horodatage pour tout le lot reçu dans cet appel (même principe // que l'ancien fichier texte, qui datait le bloc entier plutôt que chaque // ligne individuellement — les lignes d'un même lot ont été dictées à // quelques secondes d'écart, la distinction n'aurait pas de sens). $horodatage = date('Y-m-d H:i:s'); $codeUser = $_SESSION['USR_Code']; $stmt = $pdo->prepare( 'INSERT INTO ASP_ConsignesVoix (CVX_Consigne, CVX_Type, CVX_DateHeure, CVX_CodeUser, CVX_AgentTraitant) VALUES (?, ?, ?, ?, ?)' ); $enregistrees = 0; try { foreach ($lignes as $entree) { // Accepte un objet {texte, type} (nouveau format) ou une simple // chaîne (ancien format, avant l'ajout du type par ligne) — // traitée alors comme une ligne de contenu ordinaire. if (is_array($entree)) { $texte = trim((string) ($entree['texte'] ?? '')); $type = (string) ($entree['type'] ?? 'contenu'); } else { $texte = trim((string) $entree); $type = 'contenu'; } if ($texte === '') { continue; } if (!in_array($type, TYPES_VALIDES, true)) { $type = 'contenu'; } // CVX_Consigne est un varchar(200) : une dictée plus longue est // tronquée plutôt que de faire échouer tout le lot (mb_substr pour // ne pas couper un caractère accentué en deux) — pas de perte // totale d'une ligne pour un dépassement de quelques caractères. if (mb_strlen($texte) > 200) { $texte = mb_substr($texte, 0, 200); } $stmt->execute([$texte, $type, $horodatage, $codeUser, $agent]); $enregistrees++; } } catch (PDOException $e) { http_response_code(500); echo json_encode(['error' => 'Erreur base de données : ' . $e->getMessage()]); exit; } if ($enregistrees === 0) { http_response_code(400); echo json_encode(['error' => 'Aucune ligne à enregistrer']); exit; } echo json_encode(['success' => true, 'lignes_enregistrees' => $enregistrees]);