96 lines
3.5 KiB
PHP
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();
|
|
}
|