beginTransaction(); // 1. Verificar stock actual $stmt = $pdo->prepare("SELECT stock_actual FROM stock_por_ciudad WHERE producto_id = :producto_id AND ciudad_id = :ciudad_id FOR UPDATE"); $stmt->execute(['producto_id' => $producto_id, 'ciudad_id' => $ciudad_id]); $stock_disponible = $stmt->fetchColumn(); if ($stock_disponible === false || $stock_disponible < $cantidad) { header('Location: /liquidaciones.php?error=no_stock'); $pdo->rollBack(); exit(); } // 2. Actualizar el stock en la ciudad $stmt_stock = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual - :cantidad WHERE producto_id = :producto_id AND ciudad_id = :ciudad_id"); $stmt_stock->execute([':cantidad' => $cantidad, ':producto_id' => $producto_id, ':ciudad_id' => $ciudad_id]); // 3. Insertar el movimiento de salida $stmt = $pdo->prepare(" INSERT INTO movimientos (tipo, producto_id, cantidad, ciudad_origen_id, cantidad_pedidos, precio_liquidacion, fecha, usuario_id) VALUES ('Salida', :producto_id, :cantidad, :ciudad_id, :cantidad_pedidos, :precio_liquidacion, NOW(), :usuario_id) "); $user_id = get_current_user_id(); $stmt->execute([ ':producto_id' => $producto_id, ':cantidad' => $cantidad, ':ciudad_id' => $ciudad_id, ':cantidad_pedidos' => $cantidad_pedidos, ':precio_liquidacion' => $precio_liquidacion, ':usuario_id' => $user_id ]); // Confirmar transacción $pdo->commit(); header('Location: /liquidaciones.php?success=added'); exit; } catch (PDOException $e) { // Revertir transacción en caso de error if ($pdo->inTransaction()) { $pdo->rollBack(); } // Manejo de errores error_log($e->getMessage()); header('Location: /liquidaciones.php?error=db_error'); exit; } } else { // Si no es POST, redirigir header('Location: /liquidaciones.php'); exit; } ?>