245 lines
12 KiB
PHP
245 lines
12 KiB
PHP
<?php
|
|
require_once 'includes/header.php';
|
|
|
|
// Lógica para manejar el formulario de actualización
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['precios'])) {
|
|
$pdo = db();
|
|
$success = false;
|
|
|
|
// Actualizar precios de liquidación
|
|
if (isset($_POST['precios'])) {
|
|
$stmt_precio = $pdo->prepare("UPDATE movimientos SET precio_liquidacion = :precio WHERE id = :id AND tipo = 'Salida'");
|
|
foreach ($_POST['precios'] as $movimiento_id => $precio) {
|
|
if (!empty($precio)) {
|
|
$stmt_precio->execute([':precio' => $precio, ':id' => $movimiento_id]);
|
|
$success = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Actualizar cantidad de pedidos
|
|
if (isset($_POST['pedidos'])) {
|
|
$stmt_pedidos = $pdo->prepare("UPDATE movimientos SET cantidad_pedidos = :pedidos WHERE id = :id AND tipo = 'Salida'");
|
|
foreach ($_POST['pedidos'] as $movimiento_id => $pedidos) {
|
|
if (!empty($pedidos)) {
|
|
$stmt_pedidos->execute([':pedidos' => $pedidos, ':id' => $movimiento_id]);
|
|
$success = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($success) {
|
|
echo '<div class="alert alert-success">Liquidaciones actualizadas correctamente.</div>';
|
|
}
|
|
}
|
|
|
|
// Obtener todos los movimientos de salida
|
|
$pdo = db();
|
|
$stmt = $pdo->query("
|
|
SELECT
|
|
m.id,
|
|
m.fecha,
|
|
p.nombre as producto,
|
|
m.cantidad,
|
|
c.nombre as ciudad,
|
|
m.precio_liquidacion,
|
|
m.cantidad_pedidos
|
|
FROM movimientos m
|
|
JOIN productos p ON m.producto_id = p.id
|
|
JOIN ciudades c ON m.ciudad_origen_id = c.id
|
|
WHERE m.tipo = 'Salida'
|
|
ORDER BY DATE(m.fecha) DESC, c.nombre, p.nombre
|
|
");
|
|
|
|
$salidas = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// Agrupar salidas por fecha
|
|
$salidas_por_fecha = [];
|
|
foreach ($salidas as $salida) {
|
|
$fecha = date('Y-m-d', strtotime($salida['fecha']));
|
|
$salidas_por_fecha[$fecha][] = $salida;
|
|
}
|
|
|
|
// Obtener productos y ciudades para el formulario
|
|
$productos = $pdo->query("SELECT id, nombre FROM productos ORDER BY nombre")->fetchAll();
|
|
$ciudades = $pdo->query("SELECT id, nombre FROM ciudades ORDER BY nombre")->fetchAll();
|
|
|
|
$user_rol = $_SESSION['user_rol'] ?? '';
|
|
|
|
?>
|
|
|
|
<h1 class="mb-4">Liquidaciones de Salidas</h1>
|
|
|
|
<?php
|
|
if (isset($_GET['success']) && $_GET['success'] === 'added') {
|
|
echo '<div class="alert alert-success">Liquidación agregada correctamente.</div>';
|
|
}
|
|
if (isset($_GET['error'])) {
|
|
$error_msg = 'Ocurrió un error.';
|
|
if ($_GET['error'] === 'missing_fields') {
|
|
$error_msg = 'Por favor, complete todos los campos.';
|
|
} elseif ($_GET['error'] === 'db_error') {
|
|
$error_msg = 'Error al guardar en la base de datos.';
|
|
} elseif ($_GET['error'] === 'no_stock') {
|
|
$error_msg = 'No hay stock suficiente para realizar esta operación.';
|
|
}
|
|
echo '<div class="alert alert-danger">'.$error_msg.'</div>';
|
|
}
|
|
?>
|
|
|
|
<p>Aquí puedes ver todas las salidas de productos y asignar un precio de liquidación y la cantidad de pedidos a cada una.</p>
|
|
|
|
<?php if ($user_rol === 'admin' || $user_rol === 'administrador'): ?>
|
|
<!-- Botón para abrir el modal -->
|
|
<button type="button" class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#agregarLiquidacionModal">
|
|
<i class="fas fa-plus"></i> Agregar Liquidación
|
|
</button>
|
|
|
|
<!-- Modal para agregar liquidación -->
|
|
<div class="modal fade" id="agregarLiquidacionModal" tabindex="-1" aria-labelledby="agregarLiquidacionModalLabel" aria-hidden="true">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="agregarLiquidacionModalLabel">Agregar Nueva Liquidación</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<form action="handle_agregar_liquidacion.php" method="POST">
|
|
<div class="mb-3">
|
|
<label for="producto_id" class="form-label">Producto</label>
|
|
<select class="form-control" id="producto_id" name="producto_id" required>
|
|
<option value="">Seleccione un producto</option>
|
|
<?php foreach ($productos as $producto): ?>
|
|
<option value="<?php echo $producto['id']; ?>"><?php echo htmlspecialchars($producto['nombre']); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="ciudad_id" class="form-label">Ciudad</label>
|
|
<select class="form-control" id="ciudad_id" name="ciudad_id" required>
|
|
<option value="">Seleccione una ciudad</option>
|
|
<?php foreach ($ciudades as $ciudad): ?>
|
|
<option value="<?php echo $ciudad['id']; ?>"><?php echo htmlspecialchars($ciudad['nombre']); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="cantidad" class="form-label">Cantidad</label>
|
|
<input type="number" class="form-control" id="cantidad" name="cantidad" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="cantidad_pedidos" class="form-label">Cantidad de Pedidos</label>
|
|
<input type="number" class="form-control" id="cantidad_pedidos" name="cantidad_pedidos" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="precio_liquidacion" class="form-label">Precio Liquidación</label>
|
|
<input type="number" step="0.01" class="form-control" id="precio_liquidacion" name="precio_liquidacion" required>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary">Guardar Liquidación</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
|
|
<form method="POST" action="liquidaciones.php">
|
|
<?php if (empty($salidas_por_fecha)): ?>
|
|
<div class="alert alert-info">No hay salidas registradas para liquidar.</div>
|
|
<?php else: ?>
|
|
<div class="accordion" id="accordionLiquidaciones">
|
|
<?php foreach ($salidas_por_fecha as $fecha => $salidas_del_dia): ?>
|
|
<div class="accordion-item">
|
|
<h2 class="accordion-header" id="heading-<?php echo $fecha; ?>">
|
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse-<?php echo $fecha; ?>" aria-expanded="false" aria-controls="collapse-<?php echo $fecha; ?>">
|
|
<?php echo date('d/m/Y', strtotime($fecha)); ?> (<?php echo count($salidas_del_dia); ?> salidas)
|
|
</button>
|
|
</h2>
|
|
<div id="collapse-<?php echo $fecha; ?>" class="accordion-collapse collapse" aria-labelledby="heading-<?php echo $fecha; ?>" data-bs-parent="#accordionLiquidaciones">
|
|
<div class="accordion-body">
|
|
<table class="table table-bordered table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th>Producto</th>
|
|
<th>Ciudad</th>
|
|
<th>Cantidad de Pedidos</th>
|
|
<th>Cantidad</th>
|
|
<th>Precio Liquidación</th>
|
|
<th>Acciones</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php
|
|
$total_pedidos_dia = 0;
|
|
$total_precio_dia = 0;
|
|
$totales_por_ciudad = [];
|
|
|
|
foreach ($salidas_del_dia as $salida):
|
|
$total_pedidos_dia += (int)$salida['cantidad_pedidos'];
|
|
$total_precio_dia += (float)$salida['precio_liquidacion'];
|
|
|
|
if (!isset($totales_por_ciudad[$salida['ciudad']])) {
|
|
$totales_por_ciudad[$salida['ciudad']] = ['pedidos' => 0, 'precio' => 0];
|
|
}
|
|
$totales_por_ciudad[$salida['ciudad']]['pedidos'] += (int)$salida['cantidad_pedidos'];
|
|
$totales_por_ciudad[$salida['ciudad']]['precio'] += (float)$salida['precio_liquidacion'];
|
|
?>
|
|
<tr>
|
|
<td><?php echo htmlspecialchars($salida['producto']); ?></td>
|
|
<td><?php echo htmlspecialchars($salida['ciudad']); ?></td>
|
|
<td>
|
|
<input type="number" step="1" name="pedidos[<?php echo $salida['id']; ?>]" class="form-control" value="<?php echo htmlspecialchars($salida['cantidad_pedidos']); ?>">
|
|
</td>
|
|
<td><?php echo $salida['cantidad']; ?></td>
|
|
<td>
|
|
<input type="number" step="0.01" name="precios[<?php echo $salida['id']; ?>]" class="form-control" value="<?php echo htmlspecialchars($salida['precio_liquidacion']); ?>">
|
|
</td>
|
|
<td>
|
|
<a href="editar_liquidacion.php?id=<?php echo $salida['id']; ?>" class="btn btn-sm btn-warning">
|
|
<i class="fas fa-edit"></i>
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
<tfoot>
|
|
<tr>
|
|
<td colspan="2" class="text-end"><strong>Total del día:</strong></td>
|
|
<td><strong><?php echo $total_pedidos_dia; ?></strong></td>
|
|
<td></td>
|
|
<td><strong><?php echo number_format($total_precio_dia, 2); ?></strong></td>
|
|
</tr>
|
|
</tfoot>
|
|
</table>
|
|
|
|
<h5 class="mt-4">Resumen de Liquidación por Ciudad</h5>
|
|
<table class="table table-sm table-bordered">
|
|
<thead>
|
|
<tr>
|
|
<th>Ciudad</th>
|
|
<th>Total Pedidos</th>
|
|
<th>Monto Total Liquidado</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($totales_por_ciudad as $ciudad => $totales): ?>
|
|
<tr>
|
|
<td><?php echo htmlspecialchars($ciudad); ?></td>
|
|
<td><?php echo $totales['pedidos']; ?></td>
|
|
<td><?php echo number_format($totales['precio'], 2); ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary mt-3">Guardar Cambios</button>
|
|
<?php endif; ?>
|
|
</form>
|
|
|
|
<?php require_once 'includes/footer.php'; ?>
|