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(); }