-- Создание резервов для всех позиций заказов без резервов SET search_path TO grach; -- Проверяем наличие активного склада DO $$ DECLARE warehouse_id_val INT; created_count INT := 0; BEGIN -- Получаем ID активного склада (если есть) SELECT id INTO warehouse_id_val FROM grach.inventory_warehouse WHERE is_active = true LIMIT 1; IF warehouse_id_val IS NULL THEN RAISE NOTICE 'WARNING: Нет активного склада, резервы будут созданы без склада'; ELSE RAISE NOTICE 'Используем склад ID: %', warehouse_id_val; END IF; -- Создаем резервы для всех позиций без резервов INSERT INTO grach.inventory_reservation ( order_item_id, product_id, warehouse_id, quantity, status, reserved_at, released_at, converted_at ) SELECT oi.id, COALESCE(oi.product_id, oi.product_kit_id), warehouse_id_val, oi.quantity, 'reserved', CURRENT_TIMESTAMP, NULL, NULL FROM grach.orders_orderitem oi LEFT JOIN grach.inventory_reservation r ON r.order_item_id = oi.id WHERE r.id IS NULL -- Только позиции без резервов AND (oi.product_id IS NOT NULL OR oi.product_kit_id IS NOT NULL) -- Есть товар ON CONFLICT DO NOTHING; GET DIAGNOSTICS created_count = ROW_COUNT; RAISE NOTICE 'Создано резервов: %', created_count; END $$; -- Проверяем результат SELECT COUNT(*) as total_items, COUNT(r.id) as items_with_reservations, COUNT(*) - COUNT(r.id) as items_without_reservations FROM grach.orders_orderitem oi LEFT JOIN grach.inventory_reservation r ON r.order_item_id = oi.id;