diff --git a/call_center_pro.php b/call_center_pro.php index 95746f00..279163e2 100644 --- a/call_center_pro.php +++ b/call_center_pro.php @@ -402,6 +402,9 @@ if (!isset($allowedViews[$view])) { $view = array_key_first($allowedViews) ?: 'pendientes_hoy'; } +$_SESSION[cc_test_callcenter_store_session_key()] = cc_test_normalize_context_key($storeKey); +$_SESSION[cc_test_callcenter_view_session_key()] = cc_test_normalize_context_key($view); + $viewStatesNote = $isTuaniRecuperablesStore ? 'Estados disponibles: Carritos recuperables, Seguimiento, Observados, Confirmados, Recuperados y Todos. Esta bandeja compartida está disponible para cualquier asesora y, cuando una asesora gestiona un carrito recuperable, el sistema lo asigna automáticamente a quien lo trabaja. Si el teléfono ya existe en TUANI principal, se marca en gris como Pedido repetido en tienda solo en esta bandeja.' : 'Estados disponibles: Por llamar, Devolver llamada, Observado, Se envió número de cuenta, Confirmado contraentrega, Confirmado envío, Cancelado y Repetido. Promo Final se habilita desde el Día 4 y exige imagen de sustento para mover el pedido. Además, esta bandeja principal incluye reparto intercalado diario: en modo automático reparte pedidos sin asignar entre asesoras activas; en modo manual el supervisor los mueve pedido por pedido.'; @@ -529,9 +532,10 @@ try { $stmtCurrent->execute([$sourceKey]); $currentAssignedUserIdRaw = $stmtCurrent->fetchColumn(); $currentAssignedUserId = $currentAssignedUserIdRaw !== null ? ((int) $currentAssignedUserIdRaw > 0 ? (int) $currentAssignedUserIdRaw : null) : null; + $isAdmin = in_array((string) ($_SESSION['user_role'] ?? ''), ['Administrador', 'admin'], true); - // Si el pedido ya está asignado, evitamos que se reasigne a otra asesora (solo permitimos dejarlo sin asignar). - if ($currentAssignedUserId !== null && $targetUserId !== null && (int) $currentAssignedUserId !== (int) $targetUserId) { + // Los asesores no pueden cambiar pedidos de otra asesora; el administrador sí puede reasignar directamente. + if (!$isAdmin && $currentAssignedUserId !== null && $targetUserId !== null && (int) $currentAssignedUserId !== (int) $targetUserId) { $currentLabel = 'otra asesora'; foreach ($assessors as $assessorKey => $assessor) { if ((int) ($assessor['id'] ?? 0) === (int) $currentAssignedUserId) { @@ -1386,13 +1390,9 @@ require_once 'layout_header.php'; diff --git a/gestiones_callcenter.php b/gestiones_callcenter.php index cccdc1fa..3ec69ed0 100644 --- a/gestiones_callcenter.php +++ b/gestiones_callcenter.php @@ -310,6 +310,9 @@ if (!isset($allowedViews[$view])) { $view = array_key_first($allowedViews) ?: 'pendientes_hoy'; } +$_SESSION[cc_test_callcenter_store_session_key()] = cc_test_normalize_context_key($storeKey); +$_SESSION[cc_test_callcenter_view_session_key()] = cc_test_normalize_context_key($view); + $viewStatesNote = $isTuaniRecuperablesStore ? 'Estados disponibles: Carritos recuperables, Seguimiento, Observados, Confirmados, Recuperados y Todos. Esta bandeja compartida está disponible para cualquier asesora y, cuando una asesora gestiona un carrito recuperable, el sistema lo asigna automáticamente a quien lo trabaja. Si el teléfono ya existe en TUANI principal, se marca en gris como Pedido repetido en tienda solo en esta bandeja.' : 'Estados disponibles: Por llamar, Devolver llamada, Observado, Se envió número de cuenta, Confirmado contraentrega, Confirmado envío, Cancelado y Repetido. Promo Final se habilita desde el Día 4 y exige imagen de sustento para mover el pedido.'; @@ -470,8 +473,10 @@ try { $currentUserIdRaw = $stmtCurrent->fetchColumn(); $currentUserId = $currentUserIdRaw !== null ? ((int) $currentUserIdRaw > 0 ? (int) $currentUserIdRaw : null) : null; - // Si el pedido ya está asignado, evitamos que se reasigne a otra asesora (solo permitimos dejarlo sin asignar). - if ($currentUserId !== null && $targetUserId !== null && (int) $currentUserId !== (int) $targetUserId) { + $isAdmin = in_array((string) ($_SESSION['user_role'] ?? ''), ['Administrador', 'admin'], true); + + // Los asesores no pueden cambiar pedidos de otra asesora; el administrador sí puede reasignar directamente. + if (!$isAdmin && $currentUserId !== null && $targetUserId !== null && (int) $currentUserId !== (int) $targetUserId) { $currentLabel = 'otra asesora'; foreach ($assessors as $assessorKey => $assessor) { if ((int) ($assessor['id'] ?? 0) === (int) $currentUserId) { @@ -545,18 +550,12 @@ try { $assignedCount = 0; $sameAssessorCount = 0; - $lockedCount = 0; $pdo->beginTransaction(); try { foreach ($sourceKeys as $sourceKey) { $currentUserId = $currentAssignments[$sourceKey] ?? null; - if ($currentUserId !== null && (int) $currentUserId !== $targetUserId) { - $lockedCount++; - continue; - } - if ($currentUserId !== null && (int) $currentUserId === $targetUserId) { $sameAssessorCount++; continue; @@ -582,9 +581,6 @@ try { if ($sameAssessorCount > 0) { $messageParts[] = $sameAssessorCount . ' ya estaba' . ($sameAssessorCount === 1 ? '' : 'n') . ' con esa misma asesora.'; } - if ($lockedCount > 0) { - $messageParts[] = $lockedCount . ' ya estaba' . ($lockedCount === 1 ? '' : 'n') . ' asignado' . ($lockedCount === 1 ? '' : 's') . ' a otra asesora y se dejó igual.'; - } $noticeMessage = !empty($messageParts) ? implode(' ', $messageParts) @@ -1631,7 +1627,7 @@ require_once 'layout_header.php'; -