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

96 lines
3.5 KiB
PHP

<?php
require_once 'includes/header.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: liquidaciones.php');
exit();
}
// Validar que el usuario sea administrador
if (!isset($_SESSION['user_rol']) || ($_SESSION['user_rol'] !== 'admin' && $_SESSION['user_rol'] !== 'administrador')) {
header('Location: login.php?error=unauthorized');
exit();
}
// Validar campos
$movimiento_id = $_POST['movimiento_id'] ?? null;
$producto_id = $_POST['producto_id'] ?? null;
$ciudad_id = $_POST['ciudad_id'] ?? null;
$cantidad = $_POST['cantidad'] ?? null;
$cantidad_pedidos = $_POST['cantidad_pedidos'] ?? null;
$precio_liquidacion = $_POST['precio_liquidacion'] ?? null;
$fecha = $_POST['fecha'] ?? null;
if (empty($movimiento_id) || empty($producto_id) || empty($ciudad_id) || empty($cantidad) || !isset($cantidad_pedidos) || !isset($precio_liquidacion) || empty($fecha)) {
header('Location: editar_liquidacion.php?id=' . $movimiento_id . '&error=missing_fields');
exit();
}
$pdo = db();
// Iniciar transacción
$pdo->beginTransaction();
try {
// 1. Obtener el movimiento original para revertir el stock
$stmt = $pdo->prepare("SELECT producto_id, ciudad_origen_id, cantidad FROM movimientos WHERE id = ?");
$stmt->execute([$movimiento_id]);
$movimiento_original = $stmt->fetch(PDO::FETCH_ASSOC);
if ($movimiento_original) {
// Revertir el stock del producto original en la ciudad de origen
$stmt_revert = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual + ? WHERE producto_id = ? AND ciudad_id = ?");
$stmt_revert->execute([$movimiento_original['cantidad'], $movimiento_original['producto_id'], $movimiento_original['ciudad_origen_id']]);
}
// 2. Verificar si hay suficiente stock para el nuevo producto/cantidad en la nueva ciudad
$stmt_stock = $pdo->prepare("SELECT stock_actual FROM stock_por_ciudad WHERE producto_id = ? AND ciudad_id = ?");
$stmt_stock->execute([$producto_id, $ciudad_id]);
$stock_actual = $stmt_stock->fetchColumn();
if ($stock_actual === false || $stock_actual < $cantidad) {
// Si no hay suficiente stock, revertir la transacción y redirigir con error
$pdo->rollBack();
header('Location: editar_liquidacion.php?id=' . $movimiento_id . '&error=no_stock');
exit();
}
// 3. Actualizar el movimiento
$sql = "UPDATE movimientos
SET producto_id = ?,
ciudad_origen_id = ?,
cantidad = ?,
cantidad_pedidos = ?,
precio_liquidacion = ?,
fecha = ?
WHERE id = ?";
$stmt_update = $pdo->prepare($sql);
$stmt_update->execute([
$producto_id,
$ciudad_id,
$cantidad,
$cantidad_pedidos,
$precio_liquidacion,
$fecha,
$movimiento_id
]);
// 4. Actualizar el stock para el nuevo producto/ciudad
$stmt_update_stock = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual - ? WHERE producto_id = ? AND ciudad_id = ?");
$stmt_update_stock->execute([$cantidad, $producto_id, $ciudad_id]);
// Confirmar la transacción
$pdo->commit();
header('Location: liquidaciones.php?success=updated');
exit();
} catch (Exception $e) {
// Si hay un error, revertir la transacción
$pdo->rollBack();
// Log del error (opcional)
// error_log($e->getMessage());
header('Location: editar_liquidacion.php?id=' . $movimiento_id . '&error=db_error');
exit();
}