Добавлен SQL скрипт для очистки витринных комплектов без резервов

This commit is contained in:
2025-12-08 18:30:32 +03:00
parent 5f1c982bf7
commit 3f1f73ea16
2 changed files with 102 additions and 0 deletions

View File

@@ -0,0 +1,50 @@
-- Скрипт для очистки витринных комплектов без резервов
-- Используется для схемы tenant: anatol
-- Переключаемся на схему anatol
SET search_path TO anatol;
-- 1. Проверяем проблемные комплекты (READ ONLY)
-- Витринные комплекты без зарезервированных компонентов
SELECT
pk.id,
pk.name,
s.name as showcase_name,
pk.status,
pk.is_temporary,
(SELECT COUNT(*) FROM inventory_reservation r
WHERE r.product_kit_id = pk.id
AND r.showcase_id = pk.showcase_id
AND r.status = 'reserved') as reserved_count
FROM products_productkit pk
INNER JOIN inventory_showcase s ON pk.showcase_id = s.id
WHERE pk.is_temporary = TRUE
AND pk.showcase_id IS NOT NULL
AND pk.status = 'active'
AND NOT EXISTS (
SELECT 1 FROM inventory_reservation r
WHERE r.product_kit_id = pk.id
AND r.showcase_id = pk.showcase_id
AND r.status = 'reserved'
);
-- 2. Удалить проблемные комплекты (ОПАСНО! Сначала проверьте результат выше)
-- Раскомментируйте следующие строки для удаления:
/*
DELETE FROM products_productkit
WHERE id IN (
SELECT pk.id
FROM products_productkit pk
WHERE pk.is_temporary = TRUE
AND pk.showcase_id IS NOT NULL
AND pk.status = 'active'
AND NOT EXISTS (
SELECT 1 FROM inventory_reservation r
WHERE r.product_kit_id = pk.id
AND r.showcase_id = pk.showcase_id
AND r.status = 'reserved'
)
);
*/

View File

@@ -0,0 +1,52 @@
"""
Скрипт для очистки витринных комплектов без резервов.
Запуск: python manage.py shell < cleanup_showcase_kits.py
"""
from django.db import connection
from products.models import ProductKit
from inventory.models import Reservation
# Устанавливаем схему tenant
schema_name = 'anatol'
with connection.cursor() as cursor:
cursor.execute(f'SET search_path TO {schema_name}')
print('=' * 70)
print(f'ОЧИСТКА ВИТРИННЫХ КОМПЛЕКТОВ БЕЗ РЕЗЕРВОВ (схема: {schema_name})')
print('=' * 70)
# Находим все активные витринные комплекты
showcase_kits = ProductKit.objects.filter(
is_temporary=True,
showcase__isnull=False,
status='active'
).select_related('showcase')
orphaned_kits = []
for kit in showcase_kits:
# Проверяем наличие зарезервированных компонентов
has_reservations = Reservation.objects.filter(
product_kit=kit,
showcase=kit.showcase,
status='reserved'
).exists()
if not has_reservations:
orphaned_kits.append(kit)
if not orphaned_kits:
print('\n✅ Проблемных комплектов не найдено. Все витринные комплекты имеют резервы.\n')
else:
print(f'\n⚠️ Найдено {len(orphaned_kits)} витринных комплектов БЕЗ РЕЗЕРВОВ:\n')
for kit in orphaned_kits:
print(
f' • ID: {kit.id} | "{kit.name}" | Витрина: {kit.showcase.name} | '
f'Цена: {kit.actual_price} руб.'
)
print('\n📝 Для удаления запустите скрипт с подтверждением')
print('Или удалите вручную через админку Django\n')
print('=' * 70)