291 lines
13 KiB
PHP
291 lines
13 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':
|
|
case 'EN DESTINO 🏬':
|
|
$bgColor = '#800080'; // purple
|
|
break;
|
|
case 'COMPLETADO':
|
|
case 'COMPLETADO ✅':
|
|
$bgColor = '#198754'; // dark green
|
|
break;
|
|
case 'GESTION':
|
|
$bgColor = '#6c757d'; // secondary grey
|
|
break;
|
|
}
|
|
return "background-color: {$bgColor} !important; {$style}";
|
|
}
|
|
|
|
$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 = 'En Destino 🏬'";
|
|
$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();
|
|
|
|
$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 = "Pedidos Listos para Recoger";
|
|
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="listos_para_recojo.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="listos_para_recojo.php" class="btn btn-secondary">Limpiar</a>
|
|
<?php if ($user_role === 'Administrador'): ?>
|
|
<a href="download_report.php" class="btn btn-success">Descargar Pedidos del Día</a>
|
|
<?php endif; ?>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Cliente</th>
|
|
<th>DNI</th>
|
|
<th>Celular</th>
|
|
<th>Producto</th>
|
|
<th>Sede de Envío</th>
|
|
<th>Monto Total</th>
|
|
<th>Monto Debe</th>
|
|
<th>Nro. Operación</th>
|
|
<th>Clave</th>
|
|
<th style="background-color: #d4edda; font-weight: bold;">Recojo Cliente (Día y Hora)</th>
|
|
<th>Estado</th>
|
|
<th>Asesor</th>
|
|
<th>Fecha Creación</th>
|
|
<th>Voucher Restante</th>
|
|
<th>Acciones</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php if (empty($pedidos)): ?>
|
|
<tr>
|
|
<td colspan="16" class="text-center">No hay pedidos listos para recoger.</td>
|
|
</tr>
|
|
<?php else: ?>
|
|
<?php foreach ($pedidos as $pedido): ?>
|
|
<tr>
|
|
<td><?php echo htmlspecialchars($pedido['id']); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['nombre_completo']); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['dni_cliente'] ?? 'N/A'); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['celular']); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['sede_envio'] ?? 'N/A'); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['monto_total']); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['monto_debe']); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['numero_operacion'] ?? 'N/A'); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['clave'] ?? 'N/A'); ?></td>
|
|
<td class="editable-recojo" data-id="<?php echo $pedido['id']; ?>" style="background-color: #d4edda; font-weight: bold;">
|
|
<span class="text" title="Doble clic para editar"><?php echo !empty($pedido['fecha_recojo']) ? htmlspecialchars($pedido['fecha_recojo']) : 'N/A'; ?></span>
|
|
<input type="text" class="form-control edit-input" style="display: none;" value="<?php echo htmlspecialchars($pedido['fecha_recojo'] ?? ''); ?>">
|
|
</td>
|
|
<td><span class="badge" style="<?php echo getStatusStyle($pedido['estado']); ?>"><?php echo ($pedido['estado'] == 'Gestion') ? 'GESTIONES ⚙️' : htmlspecialchars($pedido['estado']); ?></span></td>
|
|
<td><?php echo htmlspecialchars($pedido['asesor_nombre'] ?? 'N/A'); ?></td>
|
|
<td><?php echo htmlspecialchars($pedido['created_at']); ?></td>
|
|
<td>
|
|
<?php if (!empty($pedido['voucher_restante_path'])): ?>
|
|
<a href="<?php echo htmlspecialchars($pedido['voucher_restante_path']); ?>" target="_blank">Ver</a>
|
|
<?php else: ?>
|
|
N/A
|
|
<?php endif; ?>
|
|
</td>
|
|
<td>
|
|
<a href="pedido_form.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; ?>
|
|
<?php endif; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const editableCells = document.querySelectorAll('.editable-recojo');
|
|
|
|
editableCells.forEach(cell => {
|
|
const textSpan = cell.querySelector('.text');
|
|
const editInput = cell.querySelector('.edit-input');
|
|
|
|
// Switch to edit mode
|
|
cell.addEventListener('dblclick', () => {
|
|
textSpan.style.display = 'none';
|
|
editInput.style.display = 'block';
|
|
editInput.focus();
|
|
editInput.select();
|
|
});
|
|
|
|
const saveChanges = () => {
|
|
const originalValue = textSpan.textContent.trim();
|
|
const newValue = editInput.value.trim();
|
|
const pedidoId = cell.dataset.id;
|
|
|
|
// Switch back to text view
|
|
textSpan.textContent = newValue || 'N/A';
|
|
editInput.style.display = 'none';
|
|
textSpan.style.display = 'block';
|
|
|
|
if (newValue === originalValue) {
|
|
return; // No change, no need to save
|
|
}
|
|
|
|
// Save to server
|
|
fetch('update_recojo.php', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
body: `id=${pedidoId}&fecha_recojo=${encodeURIComponent(newValue)}`
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.success) {
|
|
cell.style.backgroundColor = '#d4edda'; // light green
|
|
setTimeout(() => { cell.style.backgroundColor = ''; }, 1500);
|
|
} else {
|
|
alert('Error al guardar: ' + (data.error || 'Error desconocido'));
|
|
textSpan.textContent = originalValue; // Revert on failure
|
|
}
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
alert('Hubo un error de conexión al intentar guardar.');
|
|
textSpan.textContent = originalValue; // Revert on failure
|
|
});
|
|
};
|
|
|
|
// Save on Enter or blur
|
|
editInput.addEventListener('keydown', (e) => {
|
|
if (e.key === 'Enter') {
|
|
e.preventDefault();
|
|
saveChanges();
|
|
} else if (e.key === 'Escape') {
|
|
editInput.value = textSpan.textContent.trim();
|
|
textSpan.style.display = 'block';
|
|
editInput.style.display = 'none';
|
|
}
|
|
});
|
|
|
|
editInput.addEventListener('blur', () => {
|
|
// We need a small delay because a click outside might be on another control
|
|
setTimeout(saveChanges, 100);
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<?php include 'layout_footer.php'; ?>
|