diff --git a/call_center_pro.php b/call_center_pro.php index 5a1cc8e0..070b2fc1 100644 --- a/call_center_pro.php +++ b/call_center_pro.php @@ -179,18 +179,31 @@ function cc_test_find_assessor_key_by_user_id(?int $userId, array $assessors): ? function cc_test_order_label(array $order): string { - if (!empty($order['is_agregado'])) { - return 'AGREGADOS'; - } - $codigo = trim((string) ($order['codigo'] ?? '')); if ($codigo !== '') { return '#' . ltrim($codigo, '#'); } + if (!empty($order['is_agregado'])) { + return 'AGREGADOS'; + } + return 'Sin número'; } +function cc_test_promo_final_badge_info(array $order): ?array +{ + if (empty($order['es_promo_final'])) { + return null; + } + + return [ + 'label' => 'Promo Final', + 'title' => 'Pedido movido a Promo Final', + 'class' => 'bg-success-subtle text-success-emphasis border', + ]; +} + function cc_test_badge_class(string $estado): string { return match (cc_test_normalize_state($estado)) { @@ -422,7 +435,7 @@ $_SESSION[cc_test_callcenter_view_session_key()] = cc_test_normalize_context_key $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 3 para pedidos nuevos desde el 29/07/2026 y desde el Día 4 para pedidos anteriores; cuando haya sustento pendiente en ese nuevo flujo, la tarjeta de Asignados hoy sigue visible y el celular aparece con candado hasta completarlo. 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. También puedes usar la vista Últimos 3 días hábiles para concentrar el seguimiento reciente. Cuando un pedido del nuevo flujo tiene sustento pendiente, su celular se muestra con candado en cualquier vista donde aparezca hasta completar ese paso; la llamada queda bloqueada hasta completarlo.'; + : '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 3 para pedidos nuevos desde el 29/07/2026 y desde el Día 4 para pedidos anteriores; desde ese momento el número queda visible para llamar y gestionar, y el sustento solo se usa para mover el pedido a Promo Final. 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. También puedes usar la vista Últimos 3 días hábiles para concentrar el seguimiento reciente.'; $errorMessage = null; $noticeMessage = null; @@ -702,12 +715,8 @@ try { $order['promo_final_evidencia_cargada'] = trim((string) ($order['promo_final_evidencia_path'] ?? '')) !== ''; $order['es_promo_final'] = $order['promo_final_habilitado'] && $order['promo_final_evidencia_cargada']; $order['promo_final_pendiente'] = $order['promo_final_habilitado'] && !$order['promo_final_evidencia_cargada']; - $order['llamada_bloqueada_dia3'] = $followupDayInfo !== null - && (int) ($followupDayInfo['day_number'] ?? 0) >= 3 - && !$order['promo_final_evidencia_cargada']; - $order['llamada_bloqueada_dia3_mensaje'] = $order['llamada_bloqueada_dia3'] - ? 'Celular oculto hasta completar el sustento de Día 3.' - : ''; + $order['llamada_bloqueada_dia3'] = false; + $order['llamada_bloqueada_dia3_mensaje'] = ''; $order['pendiente_logistica_destino'] = cc_test_is_tuani_store_key($storeKey) ? cc_test_pending_logistica_destination($order) : null; $order['pendiente_logistica'] = $order['pendiente_logistica_destino'] !== null; @@ -756,6 +765,8 @@ try { } unset($order); + $pendingPromoFinalCounts = cc_test_followup_pending_promo_final_counts($orders); + $orders = cc_test_mark_recoverables_duplicate_orders($pdo, $orders, $storeKey); $performanceOrders = $orders; @@ -987,15 +998,19 @@ try { $assessorInboxLockedOrders = []; if (!$isAdmin && !$isTuaniRecuperablesStore) { - $assessorInboxLockedOrders = array_values(array_filter($orders, static function (array $order): bool { - return !empty($order['llamada_bloqueada_dia3']); - })); + $currentUserLockKey = $currentUserId > 0 ? 'user:' . $currentUserId : ''; + if ($currentUserLockKey !== '') { + $assessorInboxLockedOrders = array_values(array_filter($orders, static function (array $order) use ($currentUserLockKey): bool { + return cc_test_followup_owner_lock_key($order) === $currentUserLockKey + && !empty($order['promo_final_pendiente']); + })); + } } $assessorInboxLockedCount = count($assessorInboxLockedOrders); $assessorInboxLocked = $assessorInboxLockedCount > 0; $assessorInboxLockedView = $assessorInboxLocked && $view === 'nuevos_hoy'; $assessorInboxLockNotice = $assessorInboxLocked - ? 'Tienes ' . $assessorInboxLockedCount . ' pedido' . ($assessorInboxLockedCount === 1 ? '' : 's') . ' con sustento pendiente para Promo Final. En esos casos, el celular aparece con candado y la llamada queda bloqueada hasta completar ese paso.' + ? 'Tienes ' . $assessorInboxLockedCount . ' pedido' . ($assessorInboxLockedCount === 1 ? '' : 's') . ' pendiente' . ($assessorInboxLockedCount === 1 ? '' : 's') . ' de Promo Final. Mientras existan pendientes, los pedidos de Día 1 mantienen el número oculto; cuando los muevas todos a Promo Final, el celular volverá a mostrarse.' : ''; $visibleOrdersTotalCount = count($visibleOrders); @@ -1360,7 +1375,7 @@ require_once 'layout_header.php';
-