From 82bca45582e669fa8676fbc452bb9518b78e4cdd Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 15 Jul 2026 05:59:10 +0000 Subject: [PATCH] Autosave: 20260715-060021 --- call_center_pro.php | 128 +++-- db/migrations/091_add_color_hex_to_users.sql | 3 + gestiones_callcenter.php | 483 +++++++++++++++++-- includes/callcenter_test_helpers.php | 123 ++++- 4 files changed, 656 insertions(+), 81 deletions(-) create mode 100644 db/migrations/091_add_color_hex_to_users.sql diff --git a/call_center_pro.php b/call_center_pro.php index a010cdec..3f116ff6 100644 --- a/call_center_pro.php +++ b/call_center_pro.php @@ -445,6 +445,73 @@ try { require_once 'layout_header.php'; ?> + +
@@ -579,7 +646,7 @@ require_once 'layout_header.php';
- +
@@ -712,7 +779,7 @@ require_once 'layout_header.php';
Nota:
N° Pedido -
+
-
+ > @@ -756,36 +821,37 @@ require_once 'layout_header.php';
Asignar a asesora
Sin asignar - - KARINA - - ESTEFANYA - - CARMEN + + + + + Asignado
- + - - $assessor): ?> - - - - - - + + $assessor): ?> + + + + + + - + +
- + - + WhatsApp - diff --git a/db/migrations/091_add_color_hex_to_users.sql b/db/migrations/091_add_color_hex_to_users.sql new file mode 100644 index 00000000..c8510aee --- /dev/null +++ b/db/migrations/091_add_color_hex_to_users.sql @@ -0,0 +1,3 @@ +-- Add configurable color for call center assessors in the assignment panel. +ALTER TABLE `users` + ADD COLUMN IF NOT EXISTS `color_hex` VARCHAR(7) NULL AFTER `nombre_asesor`; diff --git a/gestiones_callcenter.php b/gestiones_callcenter.php index 66faab62..43482b28 100644 --- a/gestiones_callcenter.php +++ b/gestiones_callcenter.php @@ -414,6 +414,28 @@ try { })); } + if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_assessor_color') { + $assessorKey = cc_test_normalize_user_key((string) ($_POST['assessor_key'] ?? '')); + if ($assessorKey === '' || !isset($assessors[$assessorKey])) { + throw new RuntimeException('No se encontró la asesora seleccionada.'); + } + + $colorHex = cc_test_normalize_hex_color((string) ($_POST['color_hex'] ?? '')); + if ($colorHex === null) { + throw new RuntimeException('Selecciona un color válido.'); + } + + cc_test_ensure_column($pdo, 'users', 'color_hex', 'VARCHAR(7) NULL AFTER `nombre_asesor`'); + + $stmtUpdateAssessorColor = $pdo->prepare('UPDATE users SET color_hex = :color_hex WHERE id = :id LIMIT 1'); + $stmtUpdateAssessorColor->bindValue(':color_hex', $colorHex, PDO::PARAM_STR); + $stmtUpdateAssessorColor->bindValue(':id', (int) ($assessors[$assessorKey]['id'] ?? 0), PDO::PARAM_INT); + $stmtUpdateAssessorColor->execute(); + + $noticeMessage = 'Color actualizado para ' . ($assessors[$assessorKey]['label'] ?? $assessorKey) . '.'; + $assessors[$assessorKey]['color_hex'] = $colorHex; + } + if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'auto_assign_cupo') { $openStates = cc_test_open_states(); @@ -690,6 +712,21 @@ try { 'remaining' => $remaining, 'text_class' => (string) ($styles['text'] ?? 'text-secondary'), 'badge_class' => (string) ($styles['badge'] ?? 'bg-secondary-subtle text-secondary-emphasis border'), + 'accent_style' => cc_test_assessor_css_vars($assessorKey, $assessors[$assessorKey]['color_hex'] ?? null), + ]; + } + + $assessorUiCatalog = []; + foreach ($orderedAssessorKeys as $assessorKey) { + if (!isset($assessors[$assessorKey])) { + continue; + } + + $catalogColorHex = cc_test_assessor_effective_color_hex($assessorKey, $assessors[$assessorKey]['color_hex'] ?? null); + $assessorUiCatalog[$assessorKey] = [ + 'label' => (string) ($assessors[$assessorKey]['label'] ?? $assessorKey), + 'color_hex' => $catalogColorHex, + 'contrast_hex' => cc_test_assessor_contrast_text_hex($catalogColorHex), ]; } @@ -798,8 +835,62 @@ require_once 'layout_header.php'; box-shadow: inset 4px 0 0 #0d6efd; } +.cc-callcenter-assessor-summary-card { + border-left: .45rem solid var(--cc-assessor-accent, #adb5bd) !important; + background-color: rgba(var(--cc-assessor-accent-rgb, 173, 181, 189), .16); + box-shadow: inset 0 0 0 1px rgba(var(--cc-assessor-accent-rgb, 173, 181, 189), .22); +} + .cc-callcenter-assign-form { - padding: .5rem !important; + width: 100%; + padding: .72rem !important; + border: 1px solid rgba(var(--cc-assessor-accent-rgb, 173, 181, 189), .38) !important; + border-left: .55rem solid var(--cc-assessor-accent, #adb5bd); + background-color: var(--cc-assessor-accent, #adb5bd); + color: var(--cc-assessor-accent-contrast, #212529); + box-shadow: none; +} + +.cc-callcenter-assign-form.is-unassigned { + border-color: rgba(0, 0, 0, .10) !important; + border-left-color: #FFFFFF; + background-color: #FFFFFF; + color: #212529; + box-shadow: 0 .65rem 1.4rem rgba(15, 23, 42, .06), inset 0 0 0 1px rgba(0, 0, 0, .05); +} + +.cc-callcenter-assign-form .text-muted { + color: var(--cc-assessor-accent-contrast, #212529) !important; + opacity: .88; +} + +.cc-callcenter-assign-form.is-unassigned .text-muted { + color: #6C757D !important; + opacity: 1; +} + +.cc-callcenter-assign-form .cc-callcenter-assessor-badge { + background-color: rgba(0, 0, 0, .16); + color: var(--cc-assessor-accent-contrast, #212529); + border-color: rgba(0, 0, 0, .16) !important; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .08); +} + +.cc-callcenter-assign-form.is-unassigned .cc-callcenter-assessor-badge { + background-color: #F8F9FA; + color: #6C757D; + border-color: rgba(0, 0, 0, .12) !important; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .04); +} + +.cc-callcenter-assign-form .cc-callcenter-assessor-badge .cc-callcenter-color-dot { + border: 1px solid rgba(0, 0, 0, .18); + box-shadow: none; +} + +.cc-callcenter-assign-form.is-unassigned .cc-callcenter-assessor-badge .cc-callcenter-color-dot { + background: #ADB5BD; + border-color: rgba(0, 0, 0, .12); } .cc-callcenter-assign-row { @@ -807,20 +898,126 @@ require_once 'layout_header.php'; flex-wrap: nowrap; align-items: center; gap: .35rem; + padding: .5rem; + border-radius: .95rem; + background-color: transparent; + box-shadow: none; +} + +.cc-callcenter-assign-form.is-unassigned .cc-callcenter-assign-row { + background-color: #FFFFFF; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .08); } .cc-callcenter-assign-row .form-select { - min-width: 11rem; - flex: 1 1 11rem; + min-width: 10rem; + flex: 1 1 10rem; + border-color: rgba(0, 0, 0, .18); + background-color: rgba(0, 0, 0, .12); + color: var(--cc-assessor-accent-contrast, #212529); + font-weight: 700; +} + +.cc-callcenter-assign-form.is-unassigned .cc-callcenter-assign-row .form-select { + border-color: rgba(0, 0, 0, .16); + background-color: #FFFFFF; + color: #212529; +} + +.cc-callcenter-assign-row .form-select:focus { + border-color: rgba(0, 0, 0, .24); + box-shadow: 0 0 0 .2rem rgba(0, 0, 0, .12); } .cc-callcenter-assign-submit { flex: 0 0 auto; white-space: nowrap; + border-color: rgba(0, 0, 0, .18) !important; + background-color: rgba(0, 0, 0, .16) !important; + color: var(--cc-assessor-accent-contrast, #212529) !important; + font-weight: 700; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .08); } -.cc-callcenter-actions { - gap: .35rem !important; +.cc-callcenter-assessor-badge { + display: inline-flex; + align-items: center; + gap: .3rem; + background-color: var(--cc-assessor-accent, #adb5bd); + color: var(--cc-assessor-accent-contrast, #212529); + border-color: var(--cc-assessor-accent, #adb5bd) !important; + font-weight: 600; +} + +.cc-callcenter-color-trigger { + display: inline-flex; + align-items: center; + justify-content: center; + gap: .3rem; + padding: .2rem .55rem; + white-space: nowrap; + border-color: rgba(0, 0, 0, .18) !important; + background-color: rgba(0, 0, 0, .12); + color: var(--cc-assessor-accent-contrast, #212529); + font-weight: 700; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .08); +} + +.cc-callcenter-color-trigger:hover:not(:disabled), +.cc-callcenter-assign-submit:hover:not(:disabled) { + filter: brightness(.97); + transform: translateY(-1px); +} + +.cc-callcenter-color-trigger:disabled { + opacity: .72; + background-color: rgba(0, 0, 0, .10); +} + +.cc-callcenter-assign-form.is-unassigned .cc-callcenter-color-trigger { + background-color: #F1F3F5; + color: #6C757D; + border-color: rgba(0, 0, 0, .12) !important; + box-shadow: none; +} + +.cc-callcenter-assign-form.is-unassigned .cc-callcenter-color-trigger:disabled { + background-color: #F1F3F5; +} + +.cc-callcenter-color-trigger .cc-callcenter-color-dot { + width: .72rem; + height: .72rem; + border-radius: 999px; + background: var(--cc-assessor-accent, #adb5bd); + border: 1px solid rgba(0, 0, 0, .24); + box-shadow: none; + flex: 0 0 auto; +} + +.cc-callcenter-assign-form.is-unassigned .cc-callcenter-color-trigger .cc-callcenter-color-dot { + background: #ADB5BD; + border-color: rgba(0, 0, 0, .16); +} + +.cc-callcenter-assessor-badge .cc-callcenter-color-dot { + width: .55rem; + height: .55rem; + border-radius: 999px; + background: var(--cc-assessor-accent-contrast, #212529); + border: 1px solid rgba(255, 255, 255, .35); + box-shadow: none; + flex: 0 0 auto; +} + +.cc-callcenter-assessor-summary-card .cc-callcenter-color-dot { + width: .55rem; + height: .55rem; + border-radius: 999px; + background: var(--cc-assessor-accent, #adb5bd); + border: 1px solid rgba(0, 0, 0, .12); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .22); + flex: 0 0 auto; } .cc-callcenter-action-btn { @@ -1015,10 +1212,13 @@ require_once 'layout_header.php';
-
+
-
- Pendientes: +
+ + +
+ Pendientes:
Cupo restante ()
@@ -1171,51 +1371,46 @@ require_once 'layout_header.php'; } } - $assignFormClass = 'border rounded-3 p-1 text-start shadow-sm cc-callcenter-assign-form'; - if ($unassigned) { - $assignFormClass .= ' bg-light'; - } elseif ($assignedAssessorKey === 'KARINA') { - $assignFormClass .= ' bg-primary-subtle border-primary'; - } elseif ($assignedAssessorKey === 'ESTEFANYA') { - $assignFormClass .= ' bg-success-subtle border-success'; - } elseif ($assignedAssessorKey === 'CARMEN') { - $assignFormClass .= ' bg-warning-subtle border-warning'; - } else { - $assignFormClass .= ' bg-secondary-subtle border-secondary'; - } + $selectedAssessorKeyForSelect = $assignedAssessorKey !== null + ? (string) $assignedAssessorKey + : ''; - if ($unassigned) { - $selectedAssessorKeyForSelect = !empty($recommendedAssessorKey) ? (string) $recommendedAssessorKey : ''; - } else { - $selectedAssessorKeyForSelect = $assignedAssessorKey !== null ? (string) $assignedAssessorKey : ''; - } + $assignAccentKey = $selectedAssessorKeyForSelect !== '' + ? (string) $selectedAssessorKeyForSelect + : ($assignedAssessorKey !== null ? (string) $assignedAssessorKey : ''); - $buttonLabel = $unassigned - ? 'Asignar pedido' - : ($assignedAssessorKey !== null ? 'Guardar asignación' : 'Desasignar'); + $assignAccentHex = $assignAccentKey !== '' + ? cc_test_assessor_effective_color_hex( + $assignAccentKey, + $assessors[$assignAccentKey]['color_hex'] ?? null + ) + : '#FFFFFF'; + + $assignFormStyle = cc_test_assessor_css_vars( + $assignAccentKey !== '' ? $assignAccentKey : 'DEFAULT', + $assignAccentHex + ); + $assignFormIsUnassigned = $assignAccentKey === ''; + + $badgeLabel = $unassigned + ? 'Sin asignar' + : (string) ($assessors[$assignedAssessorKey]['label'] ?? ($assignedAssessorKey ?? 'Asignado')); ?> -
+
Asignar a asesora
- - Sin asignar - - KARINA - - ESTEFANYA - - CARMEN - - Asignado - + + + +
- @@ -1227,7 +1422,13 @@ require_once 'layout_header.php'; - + + +
@@ -1748,6 +1949,50 @@ require_once 'layout_header.php'; ", $modalsHtml); ?> + +
@@ -1786,6 +2031,7 @@ require_once 'layout_header.php';