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;