Autosave: 20260205-063404
This commit is contained in:
parent
306385f2ae
commit
eb777eb9a8
@ -29,7 +29,7 @@ $cobertura_banner = 'assets/uploads/cobertura_banner.jpg';
|
||||
<div class="card-body">
|
||||
<?php if (file_exists($cobertura_banner)): ?>
|
||||
<p><strong>Banner Actual:</strong></p>
|
||||
<img src="<?php echo $cobertura_banner; ?>?v=<?php echo time(); ?>" alt="Banner Cobertura" class="img-fluid mb-3" style="max-width: 400px;">
|
||||
<img src="<?php echo $cobertura_banner; ?>?v=<?php echo time(); ?>" alt="Banner Cobertura" class="img-fluid mb-3">
|
||||
<?php else: ?>
|
||||
<p class="text-muted">No hay un banner de cobertura actualmente.</p>
|
||||
<?php endif; ?>
|
||||
|
||||
@ -22,7 +22,7 @@ $cobertura_xpress_banner = 'assets/uploads/cobertura_xpress_banner.jpg';
|
||||
<div class="card-body">
|
||||
<?php if (file_exists($cobertura_xpress_banner)): ?>
|
||||
<p><strong>Banner Actual:</strong></p>
|
||||
<img src="<?php echo $cobertura_xpress_banner; ?>?v=<?php echo time(); ?>" alt="Banner Cobertura Xpress" class="img-fluid mb-3" style="max-width: 400px;">
|
||||
<img src="<?php echo $cobertura_xpress_banner; ?>?v=<?php echo time(); ?>" alt="Banner Cobertura Xpress" class="img-fluid mb-3">
|
||||
<?php else: ?>
|
||||
<p class="text-muted">No hay un banner de Cobertura Xpress actualmente.</p>
|
||||
<?php endif; ?>
|
||||
|
||||
@ -74,6 +74,18 @@ $navItems = [
|
||||
'text' => 'Agregar Pedido',
|
||||
'roles' => ['Administrador', 'admin', 'Asesor', 'Control Logistico']
|
||||
],
|
||||
'agregar_pedidos_contraentrega' => [
|
||||
'url' => 'pedidos_contraentrega.php',
|
||||
'icon' => 'fa-hand-holding-usd',
|
||||
'text' => 'Agregar Pedidos Contraentrega',
|
||||
'roles' => ['Administrador', 'admin', 'Asesor', 'Control Logistico']
|
||||
],
|
||||
'ruta_contraentrega' => [
|
||||
'url' => 'ruta_contraentrega.php',
|
||||
'icon' => 'fa-route',
|
||||
'text' => 'Ruta Contraentrega',
|
||||
'roles' => ['Administrador', 'admin', 'Asesor', 'Control Logistico']
|
||||
],
|
||||
'inventario_group' => [
|
||||
'icon' => 'fa-warehouse',
|
||||
'text' => 'Inventario General',
|
||||
|
||||
270
pedidos_contraentrega.php
Normal file
270
pedidos_contraentrega.php
Normal file
@ -0,0 +1,270 @@
|
||||
<?php
|
||||
session_start();
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
header('Location: login.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
require_once 'db/config.php';
|
||||
$pdo = db();
|
||||
|
||||
$user_id = $_SESSION['user_id'];
|
||||
$user_role = $_SESSION['user_role'] ?? 'Asesor';
|
||||
|
||||
$pedido = [
|
||||
'id' => '',
|
||||
'dni_cliente' => '',
|
||||
'nombre_completo' => '',
|
||||
'celular' => '',
|
||||
'sede_envio' => '',
|
||||
'codigo_rastreo' => '',
|
||||
'codigo_tracking' => '',
|
||||
'producto' => '',
|
||||
'cantidad' => 1,
|
||||
'monto_total' => '',
|
||||
'monto_adelantado' => 0,
|
||||
'numero_operacion' => '',
|
||||
'fecha_recojo' => '',
|
||||
'asesor_id' => $user_id, // Default to current user
|
||||
'notas' => '',
|
||||
];
|
||||
$page_title = 'Agregar Pedido Contraentrega';
|
||||
|
||||
if (isset($_GET['id'])) {
|
||||
$page_title = 'Editar Pedido Contraentrega';
|
||||
$stmt = $pdo->prepare('SELECT * FROM pedidos WHERE id = ?');
|
||||
$stmt->execute([$_GET['id']]);
|
||||
$pedido = $stmt->fetch();
|
||||
if (!$pedido) {
|
||||
die('Pedido no encontrado.');
|
||||
}
|
||||
// Security check: Asesora can only edit their own pedidos
|
||||
if ($user_role === 'Asesor' && $pedido['asesor_id'] != $user_id) {
|
||||
die('Acceso denegado. No tienes permiso para editar este pedido.');
|
||||
}
|
||||
} else {
|
||||
// Security check: Only Administradors and asesores can create new pedidos
|
||||
if ($user_role !== 'Administrador' && $user_role !== 'Asesor') {
|
||||
die('Acceso denegado. No tienes permiso para crear nuevos pedidos.');
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch asesores or the current asesor's name
|
||||
$asesores = [];
|
||||
$current_asesor_nombre = '';
|
||||
if ($user_role === 'Administrador') {
|
||||
$stmt_asesores = $pdo->query("SELECT id, nombre_asesor FROM users WHERE role = 'Asesor' ORDER BY nombre_asesor");
|
||||
$asesores = $stmt_asesores->fetchAll();
|
||||
} else if ($user_role === 'Asesor') {
|
||||
$stmt_current_asesor = $pdo->prepare("SELECT nombre_asesor FROM users WHERE id = ?");
|
||||
$stmt_current_asesor->execute([$user_id]);
|
||||
$current_asesor_nombre = $stmt_current_asesor->fetchColumn();
|
||||
}
|
||||
|
||||
// Fetch products
|
||||
$stmt_products = $pdo->query("SELECT id, nombre FROM products ORDER BY nombre ASC");
|
||||
$products = $stmt_products->fetchAll();
|
||||
|
||||
?>
|
||||
<?php
|
||||
$pageTitle = 'Agregar Pedidos Contraentrega';
|
||||
include 'layout_header.php';
|
||||
?>
|
||||
|
||||
<?php if (isset($_GET['error'])):
|
||||
$error_message = htmlspecialchars($_GET['error']);
|
||||
?>
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<?php echo $error_message; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form action="save_pedido_contraentrega.php" method="POST" enctype="multipart/form-data">
|
||||
<input type="hidden" name="id" value="<?php echo htmlspecialchars($pedido['id']); ?>">
|
||||
<input type="hidden" name="referer" value="<?php echo htmlspecialchars($_SERVER['HTTP_REFERER'] ?? 'pedidos.php'); ?>">
|
||||
|
||||
<!-- Asesor ID handling -->
|
||||
<?php if ($user_role === 'Administrador'): ?>
|
||||
<div class="mb-3">
|
||||
<label for="asesor_id" class="form-label">Asesor Responsable</label>
|
||||
<select class="form-select" id="asesor_id" name="asesor_id" required>
|
||||
<option value="">Sin Asignar</option>
|
||||
<?php foreach ($asesores as $asesor): ?>
|
||||
<option value="<?php echo $asesor['id']; ?>" <?php echo ($pedido['asesor_id'] == $asesor['id']) ? 'selected' : ''; ?>><?php echo htmlspecialchars($asesor['nombre_asesor']); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="mb-3">
|
||||
<label for="asesor_nombre" class="form-label">Nombre del Asesor</label>
|
||||
<input type="text" class="form-control" id="asesor_nombre" value="<?php echo htmlspecialchars($current_asesor_nombre); ?>" disabled>
|
||||
<input type="hidden" name="asesor_id" value="<?php echo htmlspecialchars($user_id); ?>">
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="nombre_completo" class="form-label">Nombre Completo</label>
|
||||
<input type="text" class="form-control" id="nombre_completo" name="nombre_completo" value="<?php echo htmlspecialchars($pedido['nombre_completo']); ?>" required>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="dni_cliente" class="form-label">DNI</label>
|
||||
<input type="text" class="form-control" id="dni_cliente" name="dni" value="<?php echo htmlspecialchars($pedido['dni_cliente'] ?? ''); ?>" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="celular" class="form-label">Celular</label>
|
||||
<input type="text" class="form-control" id="celular" name="celular" value="<?php echo htmlspecialchars($pedido['celular']); ?>" required>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="sede_envio" class="form-label">Ciudad</label>
|
||||
<input type="text" class="form-control" id="sede_envio" name="sede_envio" value="<?php echo htmlspecialchars($pedido['sede_envio']); ?>" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="codigo_rastreo" class="form-label">Provincia/Distrito</label>
|
||||
<input type="text" class="form-control" id="codigo_rastreo" name="codigo_rastreo" value="<?php echo htmlspecialchars($pedido['codigo_rastreo']); ?>">
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="direccion_exacta" class="form-label">Direccion exacta</label>
|
||||
<input type="text" class="form-control" id="direccion_exacta" name="direccion_exacta" value="" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="referencia_domicilio" class="form-label">Referencia de domicilio</label>
|
||||
<input type="text" class="form-control" id="referencia_domicilio" name="referencia_domicilio" value="">
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="codigo_tracking" class="form-label">Coordenadas</label>
|
||||
<input type="text" class="form-control" id="codigo_tracking" name="codigo_tracking" value="<?php echo htmlspecialchars($pedido['codigo_tracking']); ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<h5>Productos</h5>
|
||||
<div id="productos-container">
|
||||
<div class="row producto-row mb-3">
|
||||
<div class="col-md-6">
|
||||
<label for="producto" class="form-label">Producto</label>
|
||||
<select class="form-select" name="productos[0][nombre]" required>
|
||||
<option value="">Seleccione un producto</option>
|
||||
<?php foreach ($products as $product): ?>
|
||||
<option value="<?php echo htmlspecialchars($product['nombre']); ?>" <?php echo ($pedido['producto'] == $product['nombre']) ? 'selected' : ''; ?>>
|
||||
<?php echo htmlspecialchars($product['nombre']); ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label for="cantidad" class="form-label">Cantidad</label>
|
||||
<input type="number" class="form-control" name="productos[0][cantidad]" value="<?php echo htmlspecialchars($pedido['cantidad']); ?>" required>
|
||||
</div>
|
||||
<div class="col-md-3 d-flex align-items-end">
|
||||
<button type="button" class="btn btn-danger btn-sm remove-producto-btn" style="display: none;">Eliminar</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" id="add-producto-btn" class="btn btn-success btn-sm mb-3">Agregar producto adicional</button>
|
||||
<hr>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="monto_total" class="form-label">Monto Total</label>
|
||||
<input type="number" step="0.01" class="form-control" id="monto_total" name="monto_total" value="<?php echo htmlspecialchars($pedido['monto_total']); ?>" required>
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="monto_adelantado" class="form-label">Monto Adelantado</label>
|
||||
<input type="number" step="0.01" class="form-control" id="monto_adelantado" name="monto_adelantado" value="<?php echo htmlspecialchars($pedido['monto_adelantado']); ?>">
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
<label for="numero_operacion" class="form-label">Número de Operación</label>
|
||||
<input type="text" class="form-control" id="numero_operacion" name="numero_operacion" value="<?php echo htmlspecialchars($pedido['numero_operacion'] ?? ''); ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="notas" class="form-label">Notas</label>
|
||||
<textarea class="form-control" id="notas" name="notas" rows="3"><?php echo htmlspecialchars($pedido['notas']); ?></textarea>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary">Guardar Pedido Contraentrega</button>
|
||||
<a href="<?php echo htmlspecialchars($_SERVER['HTTP_REFERER'] ?? 'pedidos.php'); ?>" class="btn btn-secondary">Cancelar</a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const container = document.getElementById('productos-container');
|
||||
const addBtn = document.getElementById('add-producto-btn');
|
||||
let productIndex = 0;
|
||||
|
||||
// Function to initialize remove buttons for existing rows
|
||||
const initRemoveButtons = () => {
|
||||
container.querySelectorAll('.producto-row').forEach((row, index) => {
|
||||
if (index > 0) {
|
||||
const removeBtn = row.querySelector('.remove-producto-btn');
|
||||
if(removeBtn) {
|
||||
removeBtn.style.display = 'block';
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
addBtn.addEventListener('click', function() {
|
||||
productIndex++;
|
||||
const firstRow = container.querySelector('.producto-row');
|
||||
const newRow = firstRow.cloneNode(true);
|
||||
|
||||
// Update names and clear values
|
||||
newRow.querySelector('select').name = `productos[${productIndex}][nombre]`;
|
||||
newRow.querySelector('select').value = '';
|
||||
newRow.querySelector('input[type="number"]').name = `productos[${productIndex}][cantidad]`;
|
||||
newRow.querySelector('input[type="number"]').value = '1';
|
||||
|
||||
// Show remove button
|
||||
const removeBtn = newRow.querySelector('.remove-producto-btn');
|
||||
if(removeBtn) {
|
||||
removeBtn.style.display = 'block';
|
||||
}
|
||||
|
||||
container.appendChild(newRow);
|
||||
});
|
||||
|
||||
container.addEventListener('click', function(e) {
|
||||
if (e.target && e.target.classList.contains('remove-producto-btn')) {
|
||||
const rowToRemove = e.target.closest('.producto-row');
|
||||
// Do not remove the first row
|
||||
if (rowToRemove !== container.querySelector('.producto-row')) {
|
||||
rowToRemove.remove();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Initialize for existing rows on edit
|
||||
productIndex = container.querySelectorAll('.producto-row').length - 1;
|
||||
initRemoveButtons();
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
if (urlParams.has('success')) {
|
||||
alert('SE AGREGO CORRECTAMENTE ✅');
|
||||
// Remove the success parameter from the URL without reloading the page
|
||||
const newUrl = window.location.pathname + window.location.hash;
|
||||
window.history.replaceState({}, document.title, newUrl);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php include 'layout_footer.php'; ?>
|
||||
214
ruta_contraentrega.php
Normal file
214
ruta_contraentrega.php
Normal file
@ -0,0 +1,214 @@
|
||||
<?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;
|
||||
}
|
||||
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 = 'RUTA CONTRAENTREGA'";
|
||||
$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 = "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>Cliente</th>
|
||||
<th>DNI</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>Monto Total</th>
|
||||
<th>Estado</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><?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['direccion_cliente'] ?? '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['codigo_tracking'] ?? 'N/A'); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['producto']); ?></td>
|
||||
<td><?php echo htmlspecialchars($pedido['monto_total']); ?></td>
|
||||
<td><span class="badge" style="<?php echo getStatusStyle($pedido['estado']); ?>"><?php echo htmlspecialchars($pedido['estado']); ?></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 en ruta contraentrega.</p>
|
||||
<?php endif; ?>
|
||||
</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' ? 13 : 12); ?>, "desc" ]],
|
||||
"paging": false,
|
||||
"lengthChange": false,
|
||||
"info": false
|
||||
});
|
||||
});
|
||||
</script>
|
||||
137
save_pedido_contraentrega.php
Normal file
137
save_pedido_contraentrega.php
Normal file
@ -0,0 +1,137 @@
|
||||
<?php
|
||||
session_start();
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
header('Location: login.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
require_once 'db/config.php';
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$pdo = db();
|
||||
|
||||
$id = $_POST['id'] ?? null;
|
||||
|
||||
$dni = trim($_POST['dni']);
|
||||
$nombre_completo = trim($_POST['nombre_completo']);
|
||||
$celular = trim($_POST['celular']);
|
||||
$sede_envio = trim($_POST['sede_envio']);
|
||||
$codigo_rastreo = trim($_POST['codigo_rastreo'] ?? '');
|
||||
$codigo_tracking = trim($_POST['codigo_tracking'] ?? '');
|
||||
$direccion_exacta = trim($_POST['direccion_exacta'] ?? '');
|
||||
$referencia_domicilio = trim($_POST['referencia_domicilio'] ?? '');
|
||||
|
||||
// --- Manejo de multiples productos ---
|
||||
$productos_post = $_POST['productos'] ?? [];
|
||||
$producto_nombres = [];
|
||||
$cantidad_total = 0;
|
||||
$productos_detalle = [];
|
||||
|
||||
if (!empty($productos_post)) {
|
||||
foreach ($productos_post as $p) {
|
||||
if (!empty($p['nombre']) && !empty($p['cantidad'])) {
|
||||
$producto_nombres[] = trim($p['nombre']);
|
||||
$cantidad_total += (int)$p['cantidad'];
|
||||
$productos_detalle[] = trim($p['nombre']) . ' (x' . (int)$p['cantidad'] . ')';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$producto = implode(', ', $producto_nombres);
|
||||
$cantidad = $cantidad_total;
|
||||
$notas_adicionales = "Detalle de productos: " . implode(', ', $productos_detalle);
|
||||
// --- Fin del manejo de multiples productos ---
|
||||
|
||||
$monto_total = filter_var($_POST['monto_total'], FILTER_VALIDATE_FLOAT);
|
||||
$monto_adelantado = filter_var($_POST['monto_adelantado'], FILTER_VALIDATE_FLOAT);
|
||||
$numero_operacion = trim($_POST['numero_operacion']);
|
||||
$notas = trim($_POST['notas']);
|
||||
|
||||
if (!empty($productos_detalle)) {
|
||||
$notas .= "\n\n" . $notas_adicionales;
|
||||
}
|
||||
|
||||
if (empty($dni) || empty($nombre_completo) || empty($celular) || empty($sede_envio) || empty($producto) || $cantidad === false || $monto_total === false) {
|
||||
die('Por favor, complete todos los campos obligatorios.');
|
||||
}
|
||||
|
||||
$monto_debe = $monto_total - $monto_adelantado;
|
||||
|
||||
$params = [
|
||||
'dni_cliente' => $dni,
|
||||
'nombre_completo' => $nombre_completo,
|
||||
'celular' => $celular,
|
||||
'sede_envio' => $sede_envio,
|
||||
'direccion_cliente' => $direccion_exacta,
|
||||
'referencia_domicilio' => $referencia_domicilio,
|
||||
'codigo_rastreo' => $codigo_rastreo,
|
||||
'codigo_tracking' => $codigo_tracking,
|
||||
'producto' => $producto,
|
||||
'cantidad' => $cantidad,
|
||||
'monto_total' => $monto_total,
|
||||
'monto_adelantado' => $monto_adelantado,
|
||||
'numero_operacion' => $numero_operacion,
|
||||
'monto_debe' => $monto_debe,
|
||||
'notas' => $notas,
|
||||
];
|
||||
|
||||
if ($id) {
|
||||
// UPDATE: Explicit and safe query
|
||||
$user_role = $_SESSION['user_role'] ?? '';
|
||||
|
||||
$sql_parts = [
|
||||
"dni_cliente = :dni_cliente",
|
||||
"nombre_completo = :nombre_completo",
|
||||
"celular = :celular",
|
||||
"sede_envio = :sede_envio",
|
||||
"direccion_cliente = :direccion_cliente",
|
||||
"referencia_domicilio = :referencia_domicilio",
|
||||
"codigo_rastreo = :codigo_rastreo",
|
||||
"codigo_tracking = :codigo_tracking",
|
||||
"producto = :producto",
|
||||
"cantidad = :cantidad",
|
||||
"monto_total = :monto_total",
|
||||
"monto_adelantado = :monto_adelantado",
|
||||
"numero_operacion = :numero_operacion",
|
||||
"monto_debe = :monto_debe",
|
||||
"notas = :notas",
|
||||
];
|
||||
|
||||
// Conditionally add asesor_id
|
||||
if ($user_role === 'Administrador' && !empty($_POST['asesor_id'])) {
|
||||
$sql_parts[] = "asesor_id = :asesor_id";
|
||||
$params['asesor_id'] = $_POST['asesor_id'];
|
||||
}
|
||||
|
||||
$sql = "UPDATE pedidos SET " . implode(", ", $sql_parts) . " WHERE id = :id";
|
||||
|
||||
$params['id'] = $id;
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
} else {
|
||||
// INSERT: The advisor is the user creating the order.
|
||||
$params['asesor_id'] = $_SESSION['user_id'];
|
||||
$params['estado'] = 'RUTA CONTRAENTREGA';
|
||||
|
||||
$columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, direccion_cliente, referencia_domicilio, codigo_rastreo, codigo_tracking, producto, cantidad, monto_total, monto_adelantado, numero_operacion, monto_debe, asesor_id, notas, estado";
|
||||
$values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :direccion_cliente, :referencia_domicilio, :codigo_rastreo, :codigo_tracking, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :monto_debe, :asesor_id, :notas, :estado";
|
||||
|
||||
$sql = "INSERT INTO pedidos ($columns_sql) VALUES ($values_sql)";
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
}
|
||||
|
||||
if (isset($_POST['id']) && !empty($_POST['id'])) {
|
||||
// Si se está editando un pedido, redirigir a la página de referencia o a la lista general.
|
||||
$redirect_url = $_POST['referer'] ?? 'pedidos_contraentrega.php';
|
||||
} else {
|
||||
// Si se está creando un nuevo pedido, redirigir al formulario con un mensaje de éxito.
|
||||
$redirect_url = 'pedidos_contraentrega.php?success=1';
|
||||
}
|
||||
header('Location: ' . $redirect_url);
|
||||
exit;
|
||||
|
||||
} else {
|
||||
header('Location: pedidos_contraentrega.php');
|
||||
exit;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user