From 23af7294d399c0666d667863bb776d695d54c98e Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 24 Jul 2026 07:41:17 +0000 Subject: [PATCH] Autosave: 20260724-074242 --- call_center_pro.php | 18 +++++++-------- gestiones_callcenter.php | 33 +++++++++++----------------- includes/callcenter_test_helpers.php | 22 +++++++++++++++++++ index.php | 16 +++++++++++++- layout_header.php | 13 ++++++++++- simular_asignacion.php | 18 ++++++++++++++- 6 files changed, 88 insertions(+), 32 deletions(-) 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'; -
Si un pedido ya está tomado por otra asesora, el sistema lo deja igual y te avisa.
+
Desde aquí puedes reasignar pedidos tomados sin liberarlos primero; la asesora seleccionada reemplaza a la anterior.
@@ -1736,6 +1732,7 @@ require_once 'layout_header.php'; $selectedAssessorKeyForSelect = $assignedAssessorKey !== null ? (string) $assignedAssessorKey : ''; + $buttonLabel = $unassigned ? 'Asignar pedido' : 'Guardar asignación'; $assignAccentKey = $selectedAssessorKeyForSelect !== '' ? (string) $selectedAssessorKeyForSelect @@ -1775,13 +1772,9 @@ require_once 'layout_header.php'; - + diff --git a/includes/callcenter_test_helpers.php b/includes/callcenter_test_helpers.php index a2b3f96e..21dff39f 100644 --- a/includes/callcenter_test_helpers.php +++ b/includes/callcenter_test_helpers.php @@ -822,6 +822,28 @@ function cc_test_callcenter_assessor_filter_clear_values(): array return ['ALL', 'TODAS', 'TODOS', '__ALL__']; } +function cc_test_callcenter_store_session_key(): string +{ + return 'callcenter_store'; +} + +function cc_test_callcenter_view_session_key(): string +{ + return 'callcenter_view'; +} + +function cc_test_normalize_context_key(?string $value): string +{ + $value = trim((string) $value); + if ($value === '') { + return ''; + } + + $value = preg_replace('/\s+/', ' ', $value) ?? $value; + + return mb_strtolower($value); +} + function cc_test_resolve_callcenter_assessor_filter(array $assessors, ?string $incomingFilter = null, bool $useSessionFallback = true, bool $persistSession = true): string { $sessionKey = cc_test_callcenter_assessor_filter_session_key(); diff --git a/index.php b/index.php index 3372832b..dab2d86a 100644 --- a/index.php +++ b/index.php @@ -1,6 +1,20 @@ 'assessor', + 'callcenter_store' => 'store', + 'callcenter_view' => 'view', +] as $sessionKey => $paramKey) { + if (!empty($_SESSION[$sessionKey])) { + $callCenterParams[$paramKey] = (string) $_SESSION[$sessionKey]; + } +} +$callCenterUrl = 'gestiones_callcenter.php'; +if (!empty($callCenterParams)) { + $callCenterUrl .= '?' . http_build_query($callCenterParams); +} $pageTitle = 'Inicio | Panel CRM y Administración'; $pageDescription = 'Entrada rápida al sistema CRM y panel de administración.'; ?> @@ -104,7 +118,7 @@ $pageDescription = 'Entrada rápida al sistema CRM y panel de administración.'; - Abrir Base de Datos Pedidos + Abrir Base de Datos Pedidos
diff --git a/layout_header.php b/layout_header.php index cc51dbb2..8090c629 100644 --- a/layout_header.php +++ b/layout_header.php @@ -37,8 +37,19 @@ $currentAssessorFilter = cc_test_normalize_user_key($_GET['assessor'] ?? ($_SESS if (in_array($currentAssessorFilter, cc_test_callcenter_assessor_filter_clear_values(), true)) { $currentAssessorFilter = ''; } +$currentCallCenterStore = cc_test_normalize_context_key($_GET['store'] ?? ($_SESSION[cc_test_callcenter_store_session_key()] ?? '')); +$currentCallCenterView = cc_test_normalize_context_key($_GET['view'] ?? ($_SESSION[cc_test_callcenter_view_session_key()] ?? '')); $shouldPersistAssessor = $currentAssessorFilter !== ''; -$callCenterPersistentParams = $shouldPersistAssessor ? ['assessor' => $currentAssessorFilter] : []; +$callCenterPersistentParams = []; +if ($shouldPersistAssessor) { + $callCenterPersistentParams['assessor'] = $currentAssessorFilter; +} +if ($currentCallCenterStore !== '') { + $callCenterPersistentParams['store'] = $currentCallCenterStore; +} +if ($currentCallCenterView !== '') { + $callCenterPersistentParams['view'] = $currentCallCenterView; +} $appendCallCenterParams = static function (string $url) use ($callCenterPersistentParams): string { if (empty($callCenterPersistentParams)) { return $url; diff --git a/simular_asignacion.php b/simular_asignacion.php index 832b12bf..c8be6ee9 100644 --- a/simular_asignacion.php +++ b/simular_asignacion.php @@ -39,4 +39,20 @@ foreach ($pedidos as $id) { echo "

Simulación Exitosa

"; echo "Se han asignado " . count($pedidos) . " pedidos al usuario $username (ID: $userId).
"; -echo "Ahora puedes verlos en el panel de gestión: Ir a Base de Datos Pedidos"; + +$callCenterParams = []; +foreach ([ + 'callcenter_assessor_filter' => 'assessor', + 'callcenter_store' => 'store', + 'callcenter_view' => 'view', +] as $sessionKey => $paramKey) { + if (!empty($_SESSION[$sessionKey])) { + $callCenterParams[$paramKey] = (string) $_SESSION[$sessionKey]; + } +} +$callCenterUrl = 'gestiones_callcenter.php'; +if (!empty($callCenterParams)) { + $callCenterUrl .= '?' . http_build_query($callCenterParams); +} + +echo "Ahora puedes verlos en el panel de gestión: Ir a Base de Datos Pedidos";