diff --git a/assets/uploads/vouchers/6a1201ed80004-454.png b/assets/uploads/vouchers/6a1201ed80004-454.png new file mode 100644 index 00000000..e4b49cee Binary files /dev/null and b/assets/uploads/vouchers/6a1201ed80004-454.png differ diff --git a/ruta_contraentrega.php b/ruta_contraentrega.php index f7cd0386..61a15332 100644 --- a/ruta_contraentrega.php +++ b/ruta_contraentrega.php @@ -33,6 +33,10 @@ function getStatusStyle($status) { case 'RUTA_CONTRAENTREGA': $bgColor = '#007bff'; // primary blue break; + case 'PENDIENTE': + $bgColor = '#fff3cd'; // cream + $style = 'color: #5f4700;'; + break; case 'ENTREGA EXITOSA': $bgColor = '#198754'; // dark green break; @@ -44,7 +48,8 @@ function getStatusStyle($status) { $bgColor = '#fd7e14'; // orange break; case 'CANCELADO': - $bgColor = '#6c757d'; // grey + case 'CANCELAR': + $bgColor = '#8b1e2d'; // guinda/red for cancelled break; case 'REPROGRAMADO': $bgColor = '#6f42c1'; // indigo/purple @@ -59,7 +64,7 @@ function getPaqueteStyle($paquete) { if ($paquete === 'NO CONTESTA, VOLVER A LLAMAR') return 'background-color: #fd7e14; color: white;'; // Orange if ($paquete === 'PENDIENTE A RETORNO') return 'background-color: #dc3545; color: white;'; // Red if ($paquete === 'COMPLETADO') return 'background-color: #198754; color: white;'; // Success green - if ($paquete === 'RETORNADO') return 'background-color: #6c757d; color: white;'; // Grey + if ($paquete === 'RETORNADO') return 'background-color: #dc3545; color: white;'; // Same red as PENDIENTE A RETORNO if ($paquete === 'ANULADO') return 'background-color: #212529; color: white;'; // Dark return 'background-color: #6c757d; color: white;'; // Secondary grey } @@ -97,7 +102,7 @@ $selected_month = $_GET['mes'] ?? ''; $selected_year = $_GET['año'] ?? ''; $search_query = $_GET['q'] ?? ''; -$sql = "SELECT p.*, u.nombre_asesor as asesor_nombre FROM pedidos p LEFT JOIN users u ON p.asesor_id = u.id WHERE p.estado IN ('RUTA_CONTRAENTREGA', 'NO CONTESTO, VOLVER A LLAMAR', 'CANCELADO', 'REPROGRAMADO', 'ENTREGA EXITOSA')"; +$sql = "SELECT p.*, u.nombre_asesor as asesor_nombre FROM pedidos p LEFT JOIN users u ON p.asesor_id = u.id WHERE p.estado IN ('RUTA_CONTRAENTREGA', 'PENDIENTE', 'NO CONTESTO, VOLVER A LLAMAR', 'NO CONTESTO, DEVOLVER LLAMADA', 'CANCELADO', 'REPROGRAMADO', 'ENTREGA EXITOSA', 'RETORNADO')"; $params = []; if ($user_role === 'Asesor') { @@ -156,6 +161,40 @@ include 'layout_header.php'; +
@@ -230,9 +269,9 @@ include 'layout_header.php'; - - - + + + @@ -310,7 +349,8 @@ function getPaqueteStyleJS(paquete) { if (paquete === 'RUTA') return 'background-color: #0dcaf0; color: black;'; if (paquete === 'ANULADO') return 'background-color: #212529; color: white;'; if (paquete === 'PENDIENTE A RETORNO') return 'background-color: #dc3545; color: white;'; - if (paquete === 'RETORNADO') return 'background-color: #6c757d; color: white;'; + if (paquete === 'RETORNADO') return 'background-color: #dc3545; color: white;'; + if (paquete === 'COMPLETADO') return 'background-color: #198754; color: white;'; return 'background-color: #6c757d; color: white;'; } @@ -322,11 +362,16 @@ function getStatusStyleJS(status) { case 'RUTA_CONTRAENTREGA': bgColor = '#007bff'; break; + case 'PENDIENTE': + bgColor = '#fff3cd'; + style = 'color: #5f4700;'; + break; case 'NO CONTESTO, VOLVER A LLAMAR': bgColor = '#fd7e14'; break; case 'CANCELADO': - bgColor = '#6c757d'; + case 'CANCELAR': + bgColor = '#8b1e2d'; break; case 'REPROGRAMADO': bgColor = '#6f42c1'; @@ -334,6 +379,12 @@ function getStatusStyleJS(status) { case 'ENTREGA EXITOSA': bgColor = '#198754'; break; + case 'RETORNADO': + bgColor = '#dc3545'; + break; + case 'NO CONTESTO, DEVOLVER LLAMADA': + bgColor = '#fd7e14'; + break; default: bgColor = '#6c757d'; } @@ -374,7 +425,8 @@ document.addEventListener('DOMContentLoaded', function() { {val: 'RUTA', text: 'RUTA'}, {val: 'ANULADO', text: 'ANULADO'}, {val: 'PENDIENTE A RETORNO', text: 'PENDIENTE A RETORNO'}, - {val: 'RETORNADO', text: 'RETORNADO'} + {val: 'RETORNADO', text: 'RETORNADO'}, + {val: 'COMPLETADO', text: 'COMPLETADO'} ]; options.forEach(opt => { @@ -444,7 +496,8 @@ document.addEventListener('DOMContentLoaded', function() { const options = [ {val: 'RUTA_CONTRAENTREGA', text: 'RUTA_CONTRAENTREGA'}, - {val: 'NO CONTESTO, VOLVER A LLAMAR', text: 'NO CONTESTO, VOLVER A LLAMAR'}, + {val: 'PENDIENTE', text: 'PENDIENTE'}, + {val: 'NO CONTESTO, DEVOLVER LLAMADA', text: 'NO CONTESTO, DEVOLVER LLAMADA'}, {val: 'CANCELADO', text: 'CANCELADO'}, {val: 'REPROGRAMADO', text: 'REPROGRAMADO'}, {val: 'ENTREGA EXITOSA', text: 'ENTREGA EXITOSA'} @@ -454,6 +507,14 @@ document.addEventListener('DOMContentLoaded', function() { const option = document.createElement('option'); option.value = opt.val; option.text = opt.text; + if (opt.val === 'CANCELADO') { + option.style.backgroundColor = '#8b1e2d'; + option.style.color = '#ffffff'; + } + if (opt.val === 'PENDIENTE') { + option.style.backgroundColor = '#fff3cd'; + option.style.color = '#5f4700'; + } if (opt.val === currentVal) option.selected = true; select.appendChild(option); }); diff --git a/save_pedido_contraentrega.php b/save_pedido_contraentrega.php index d282c64c..5111bb9c 100644 --- a/save_pedido_contraentrega.php +++ b/save_pedido_contraentrega.php @@ -59,6 +59,20 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $banco = trim($_POST['banco'] ?? ''); $notas = trim($_POST['notas'] ?? ''); + // Normalizar Paquete: el selector "Seleccionar" llega como cadena vacía, + // pero la columna ENUM permite NULL y no permite ''. + $tipo_paquete = isset($_POST['tipo_paquete']) ? trim((string)$_POST['tipo_paquete']) : null; + if ($tipo_paquete === '') { + $tipo_paquete = null; + } + $tipos_paquete_validos = ['RUTA', 'CONTRAENTREGA', 'NO CONTESTA, VOLVER A LLAMAR', 'PENDIENTE A RETORNO', 'COMPLETADO', 'RETORNADO', 'ANULADO']; + if ($tipo_paquete !== null && !in_array($tipo_paquete, $tipos_paquete_validos, true)) { + $error_message = urlencode('El paquete seleccionado no es válido. Seleccione una opción de la lista.'); + $id_param = $id ? '&id=' . $id : ''; + header('Location: pedidos_contraentrega.php?error=' . $error_message . $id_param); + exit; + } + if (!empty($productos_detalle)) { $notas .= "\n\n" . $notas_adicionales; } @@ -115,7 +129,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { 'notas' => $notas, 'seguimiento' => $seguimiento, 'fecha_entrega' => $fecha_entrega, - 'tipo_paquete' => $_POST['tipo_paquete'] ?? null, + 'tipo_paquete' => $tipo_paquete, ]; try { diff --git a/update_estado.php b/update_estado.php index 2dff003a..cdbbce6b 100644 --- a/update_estado.php +++ b/update_estado.php @@ -21,7 +21,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { try { $pdo = db(); - $valid_states = ['RUTA_CONTRAENTREGA', 'NO CONTESTO, VOLVER A LLAMAR', 'CANCELADO', 'REPROGRAMADO', 'ENTREGA EXITOSA', 'RETORNADO', 'NO CONTESTO, DEVOLVER LLAMADA']; + $valid_states = ['RUTA_CONTRAENTREGA', 'PENDIENTE', 'NO CONTESTO, VOLVER A LLAMAR', 'CANCELADO', 'REPROGRAMADO', 'ENTREGA EXITOSA', 'RETORNADO', 'NO CONTESTO, DEVOLVER LLAMADA']; if (!in_array($estado, $valid_states)) { echo json_encode(['success' => false, 'message' => 'Estado inválido']); exit;