false, 'error' => 'No autorizado']); exit; } $pedido_id = trim((string) ($_POST['pedido_id'] ?? '')); $resultado = trim((string) ($_POST['resultado'] ?? 'Llamada iniciada')); $observacion = trim((string) ($_POST['observacion'] ?? '')); $asesor_id = (int) $_SESSION['user_id']; if ($pedido_id === '') { echo json_encode(['success' => false, 'error' => 'ID de pedido faltante']); exit; } if ($resultado === '') { $resultado = 'Llamada iniciada'; } try { $pdo = db(); cc_test_ensure_historial_llamadas_table($pdo); $role = (string) ($_SESSION['user_role'] ?? ''); $isAdmin = in_array($role, ['Administrador', 'admin'], true); $tracking = null; if (!$isAdmin) { cc_test_ensure_tracking_table($pdo); $stmtTrack = $pdo->prepare('SELECT user_id, estado, assigned_at, promo_final_evidencia_path FROM callcenter_test_tracking WHERE source_key = ? LIMIT 1'); $stmtTrack->execute([$pedido_id]); $tracking = $stmtTrack->fetch(PDO::FETCH_ASSOC); $trackingUserId = $tracking ? (int) ($tracking['user_id'] ?? 0) : null; $storeKey = ''; try { $stmtOrder = $pdo->prepare('SELECT store_key FROM callcenter_test_orders WHERE source_key = ? LIMIT 1'); $stmtOrder->execute([$pedido_id]); $storeKey = trim((string) ($stmtOrder->fetchColumn() ?: '')); } catch (Throwable $lookupException) { $storeKey = ''; } $isRecoverablesQueue = cc_test_is_recoverables_store_key($storeKey); $canClaimRecoverable = $isRecoverablesQueue && cc_test_can_claim_recoverable_order($tracking); $needsRecoverableClaim = $canClaimRecoverable && ($tracking === null || $trackingUserId !== $asesor_id); if ($tracking === null) { if (!$canClaimRecoverable) { http_response_code(403); echo json_encode(['success' => false, 'error' => 'No autorizado para gestionar este pedido.']); exit; } } elseif ($trackingUserId !== $asesor_id && !$canClaimRecoverable) { http_response_code(403); echo json_encode(['success' => false, 'error' => 'No autorizado para gestionar este pedido.']); exit; } if ($needsRecoverableClaim) { cc_test_upsert_assignee($pdo, $pedido_id, $asesor_id); } } $stmt = $pdo->prepare('INSERT INTO historial_llamadas (pedido_id, asesor_id, resultado, observacion) VALUES (?, ?, ?, ?)'); $stmt->execute([$pedido_id, $asesor_id, $resultado, $observacion !== '' ? $observacion : null]); $countStmt = $pdo->prepare('SELECT COUNT(*) FROM historial_llamadas WHERE pedido_id = ?'); $countStmt->execute([$pedido_id]); $totalLlamadas = (int) $countStmt->fetchColumn(); echo json_encode(['success' => true, 'total_llamadas' => $totalLlamadas]); } catch (Throwable $e) { error_log('save_llamada.php: ' . $e->getMessage()); echo json_encode(['success' => false, 'error' => 'No se pudo registrar la llamada']); }