false, 'message' => 'No autorizado']); exit; } if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(['success' => false, 'message' => 'Método no permitido']); exit; } $sourceKey = trim((string) ($_POST['source_key'] ?? '')); $estado = trim((string) ($_POST['estado'] ?? 'POR LLAMAR')); $nota = trim((string) ($_POST['nota_seguimiento'] ?? '')); $validStates = ['POR LLAMAR', 'REINTENTO', 'CONFIRMADO']; if ($sourceKey === '' || !preg_match('/^[a-f0-9]{40}$/', $sourceKey)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Pedido de prueba inválido']); exit; } if (!in_array($estado, $validStates, true)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Estado inválido']); exit; } if (mb_strlen($nota) > 3000) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'La nota es demasiado larga']); exit; } try { $pdo = db(); $stmt = $pdo->prepare( 'INSERT INTO callcenter_test_tracking (source_key, estado, nota_seguimiento, user_id) VALUES (:source_key, :estado, :nota, :user_id) ON DUPLICATE KEY UPDATE estado = VALUES(estado), nota_seguimiento = VALUES(nota_seguimiento), user_id = VALUES(user_id), updated_at = CURRENT_TIMESTAMP' ); $stmt->execute([ ':source_key' => $sourceKey, ':estado' => $estado, ':nota' => $nota, ':user_id' => (int) $_SESSION['user_id'], ]); echo json_encode([ 'success' => true, 'message' => 'Seguimiento actualizado correctamente.', 'estado' => $estado, ]); } catch (Throwable $exception) { http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'No se pudo guardar el seguimiento.', ]); }