34849-vm/save_llamada.php
2026-08-07 07:36:47 +00:00

86 lines
3.3 KiB
PHP

<?php
require_once 'db/config.php';
require_once 'includes/callcenter_test_helpers.php';
session_start();
header('Content-Type: application/json');
if (!isset($_SESSION['user_id']) || !cc_test_current_user_can_access_module(db())) {
echo json_encode(['success' => 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']);
}