34849-vm/ruta_contraentrega.php
2026-02-06 05:16:13 +00:00

354 lines
16 KiB
PHP

<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
require_once 'db/config.php';
function getStatusStyle($status) {
$style = 'color: white;'; // Default text color
$bgColor = '#0dcaf0'; // Default info blue
switch (strtoupper(trim($status))) {
case 'ROTULADO':
$bgColor = '#ffc107'; // yellow
$style = 'color: black;';
break;
case 'EN TRANSITO':
$bgColor = '#90EE90'; // light green
$style = 'color: black;';
break;
case 'EN DESTINO':
$bgColor = '#800080'; // purple
break;
case 'COMPLETADO':
case 'COMPLETADO ✅':
$bgColor = '#198754'; // dark green
break;
case 'GESTION':
$bgColor = '#6c757d'; // secondary grey
break;
case 'RUTA_CONTRAENTREGA':
$bgColor = '#007bff'; // primary blue
break;
case 'ENTREGA EXITOSA':
$bgColor = '#198754'; // dark green
break;
case 'RETORNADO':
$bgColor = '#dc3545'; // red
break;
}
return "background-color: {$bgColor} !important; {$style}";
}
function getFechaEntregaStyle($fecha) {
if (empty($fecha) || $fecha === '0000-00-00') {
return 'background-color: #f8f9fa; color: #6c757d;'; // Light grey for N/A
}
// Check if the date is in the past
if (strtotime($fecha) < time()) {
return 'background-color: #f8d7da; color: #721c24;'; // Light red for past dates
}
return 'background-color: #e0f7fa; color: black;'; // Light cyan background for upcoming dates
}
$pdo = db();
$user_id = $_SESSION['user_id'];
$user_role = $_SESSION['user_role'] ?? 'Asesor';
// Fetch years for the filter
$years_query = "SELECT DISTINCT YEAR(created_at) as year FROM pedidos";
if ($user_role === 'Asesor') {
$years_query .= " WHERE asesor_id = ?";
$years_stmt = $pdo->prepare($years_query);
$years_stmt->execute([$user_id]);
} else {
$years_stmt = $pdo->query($years_query);
}
$years = $years_stmt->fetchAll(PDO::FETCH_COLUMN);
// Filter logic
$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', 'ENTREGA EXITOSA', 'RETORNADO')";
$params = [];
if ($user_role === 'Asesor') {
$sql .= " AND p.asesor_id = ?";
$params[] = $user_id;
}
if (!empty($search_query)) {
$sql .= " AND (p.nombre_completo LIKE ? OR p.dni_cliente LIKE ? OR p.celular LIKE ?)";
$params[] = "%$search_query%";
$params[] = "%$search_query%";
$params[] = "%$search_query%";
}
if (!empty($selected_month)) {
$sql .= " AND MONTH(p.created_at) = ?";
$params[] = $selected_month;
}
if (!empty($selected_year)) {
$sql .= " AND YEAR(p.created_at) = ?";
$params[] = $selected_year;
}
$sql .= " ORDER BY p.created_at DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$pedidos = $stmt->fetchAll();
// Obtener el template de WhatsApp para contraentrega
$stmt_template = db()->prepare('SELECT valor FROM configuracion WHERE clave = ?');
$stmt_template->execute(['whatsapp_template_contraentrega']);
$whatsapp_template = $stmt_template->fetchColumn();
if ($whatsapp_template === false) {
// Fallback to a default message if not set in DB
$whatsapp_template = 'Hola, te escribo para confirmar que tu pedido ya llegó a destino. El monto que debes es {monto} y la dirección de entrega será {direccion}.';
}
$months = [
1 => 'Enero', 2 => 'Febrero', 3 => 'Marzo', 4 => 'Abril', 5 => 'Mayo', 6 => 'Junio',
7 => 'Julio', 8 => 'Agosto', 9 => 'Septiembre', 10 => 'Octubre', 11 => 'Noviembre', 12 => 'Diciembre'
];
?>
<?php
$pageTitle = "Ruta Contraentrega";
include 'layout_header.php';
?>
<?php if (isset($_SESSION['flash_message'])):
$flash = $_SESSION['flash_message'];
unset($_SESSION['flash_message']);
?>
<div class="alert alert-<?php echo htmlspecialchars($flash['type']); ?> alert-dismissible fade show" role="alert">
<?php echo htmlspecialchars($flash['message']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<div class="card mb-4">
<div class="card-body">
<form method="GET" action="ruta_contraentrega.php" class="row g-3 align-items-center">
<div class="col-auto">
<label for="q" class="form-label">Buscar</label>
<input type="text" name="q" id="q" class="form-control" value="<?php echo htmlspecialchars($search_query); ?>" placeholder="Nombre, DNI o Celular">
</div>
<div class="col-auto">
<label for="mes" class="form-label">Mes</label>
<select name="mes" id="mes" class="form-select">
<option value="">Todos</option>
<?php foreach ($months as $num => $name): ?>
<option value="<?php echo $num; ?>" <?php echo $selected_month == $num ? 'selected' : ''; ?>><?php echo $name; ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-auto">
<label for="año" class="form-label">Año</label>
<select name="año" id="año" class="form-select">
<option value="">Todos</option>
<?php foreach ($years as $year): ?>
<option value="<?php echo $year; ?>" <?php echo $selected_year == $year ? 'selected' : ''; ?>><?php echo $year; ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-auto mt-4">
<button type="submit" class="btn btn-info">Filtrar</button>
<a href="ruta_contraentrega.php" class="btn btn-secondary">Limpiar</a>
</div>
</form>
</div>
</div>
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table id="pedidos-table" class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>Seguimiento</th>
<th>Cliente</th>
<th>Celular</th>
<th>Dirección</th>
<th>Referencia</th>
<th>Ciudad</th>
<th>Provincia/Distrito</th>
<th>Coordenadas</th>
<th>Producto</th>
<th>Cantidad</th>
<th>Monto Total</th>
<th>Monto Debe</th>
<th>Estado</th>
<th>Fecha de Entrega</th>
<?php if ($user_role !== 'Asesor'): ?><th>Asesor</th><?php endif; ?>
<th>Fecha Creación</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<?php foreach ($pedidos as $pedido): ?>
<tr>
<td><?php echo htmlspecialchars($pedido['id']); ?></td>
<td class="editable" data-id="<?php echo $pedido['id']; ?>" data-field="seguimiento"><?php echo htmlspecialchars($pedido['seguimiento'] ?? ''); ?></td>
<td><?php echo htmlspecialchars($pedido['nombre_completo']); ?></td>
<td>
<?php
$celular = htmlspecialchars($pedido['celular']);
// Basic validation to ensure it's a potential number
if (!empty($celular)) {
// Prepend country code if missing (assuming Peru's country code '51')
$whatsapp_number = $celular;
if (strlen($celular) == 9 && substr($celular, 0, 1) == '9') {
$whatsapp_number = '51' . $celular;
}
$monto_debe = htmlspecialchars($pedido['monto_debe']);
$monto_formateado = 'S/' . $monto_debe;
$direccion = htmlspecialchars($pedido['direccion_exacta'] ?? 'N/A');
$cliente = htmlspecialchars($pedido['nombre_completo']);
// Reemplazar placeholders en la plantilla
$mensaje = str_replace(
['{cliente}', '{monto}', '{direccion}'],
[$cliente, $monto_formateado, $direccion],
$whatsapp_template
);
$mensaje_encoded = urlencode($mensaje);
$whatsapp_url = 'https://wa.me/' . $whatsapp_number . '?text=' . $mensaje_encoded;
echo $celular;
echo ' <a href="' . $whatsapp_url . '" target="_blank" rel="noopener noreferrer" style="text-decoration: none;">';
echo '<i class="fab fa-whatsapp" style="color: green; font-size: 1.5em; vertical-align: middle;"></i>';
echo '</a>';
} else {
echo 'N/A';
}
?>
</td>
<td><?php echo htmlspecialchars($pedido['direccion_exacta'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['referencia_domicilio'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['sede_envio'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['codigo_rastreo'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['coordenadas'] ?? 'N/A'); ?></td>
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
<td><?php echo htmlspecialchars($pedido['cantidad']); ?></td>
<td><?php echo htmlspecialchars($pedido['monto_total']); ?></td>
<td><?php echo htmlspecialchars($pedido['monto_debe']); ?></td>
<td><span class="badge" style="<?php echo getStatusStyle($pedido['estado']); ?>"><?php echo htmlspecialchars($pedido['estado']); ?></span></td>
<td><span class="badge" style="<?php echo getFechaEntregaStyle($pedido['fecha_entrega']); ?>"><?php echo htmlspecialchars(!empty($pedido['fecha_entrega']) && $pedido['fecha_entrega'] != '0000-00-00' ? date('d/m/Y', strtotime($pedido['fecha_entrega'])) : 'N/A'); ?></span></td>
<?php if ($user_role !== 'Asesor'): ?><td><?php echo htmlspecialchars($pedido['asesor_nombre'] ?? 'N/A'); ?></td><?php endif; ?>
<td><?php echo htmlspecialchars($pedido['created_at']); ?></td>
<td>
<a href="pedidos_contraentrega.php?id=<?php echo $pedido['id']; ?>" class="btn btn-sm btn-warning">Editar</a>
<?php if ($user_role === 'Administrador'): ?>
<a href="delete_pedido.php?id=<?php echo $pedido['id']; ?>" class="btn btn-sm btn-danger" onclick="return confirm('¿Estás seguro de que quieres eliminar este pedido?');">Eliminar</a>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php if (empty($pedidos)): ?>
<p class="text-center">No hay pedidos que coincidan con el filtro.</p>
<?php endif; ?>
</table>
</div>
</div>
</div>
<?php include 'layout_footer.php'; ?>
<script>
$(document).ready(function() {
$('#pedidos-table').DataTable({
"language": {
"url": "//cdn.datatables.net/plug-ins/1.10.25/i18n/Spanish.json"
},
"order": [[ <?php echo ($user_role !== 'Asesor' ? 15 : 14); ?>, "desc" ]],
"paging": false,
"lengthChange": false,
"info": false
});
});
document.addEventListener('DOMContentLoaded', function() {
const table = document.querySelector('.table');
table.addEventListener('click', function(e) {
if (e.target && e.target.classList.contains('editable')) {
const cell = e.target;
if (cell.querySelector('input')) {
return; // Already in edit mode
}
const originalContent = cell.textContent.trim();
const input = document.createElement('input');
input.type = 'text';
input.className = 'form-control form-control-sm';
input.value = originalContent === 'N/A' ? '' : originalContent;
cell.innerHTML = '';
cell.appendChild(input);
input.focus();
const saveChanges = function() {
const newValue = input.value.trim();
const pedidoId = cell.dataset.id;
const field = cell.dataset.field;
let endpoint = 'update_tracking.php'; // Default endpoint
if (field === 'clave') {
endpoint = 'update_clave.php';
}
// Restore original content visually
cell.textContent = newValue === '' ? 'N/A' : newValue;
// Send data to server
fetch(endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify({ id: pedidoId, field: field, value: newValue })
})
.then(response => response.json())
.then(data => {
if (data.error) {
console.error('Error:', data.error);
// Optionally revert the change and show an error message
cell.textContent = originalContent;
}
})
.catch(error => {
console.error('Fetch Error:', error);
cell.textContent = originalContent;
});
};
input.addEventListener('blur', saveChanges);
input.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
input.blur();
}
});
}
});
});
</script>