34786-vm/liquidaciones.php
2025-12-12 16:33:10 +00:00

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'; ?>