From 8fe8c56c8a90b2eb6b1028fae932bfa3e6fc885e Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 8 Dec 2025 18:31:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20=D0=BE=D1=87=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myproject/cleanup_orphaned_kits.sql | 50 --------------------------- myproject/cleanup_showcase_kits.py | 52 ----------------------------- 2 files changed, 102 deletions(-) delete mode 100644 myproject/cleanup_orphaned_kits.sql delete mode 100644 myproject/cleanup_showcase_kits.py diff --git a/myproject/cleanup_orphaned_kits.sql b/myproject/cleanup_orphaned_kits.sql deleted file mode 100644 index c9aafbf..0000000 --- a/myproject/cleanup_orphaned_kits.sql +++ /dev/null @@ -1,50 +0,0 @@ --- Скрипт для очистки витринных комплектов без резервов --- Используется для схемы 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' - ) -); -*/ diff --git a/myproject/cleanup_showcase_kits.py b/myproject/cleanup_showcase_kits.py deleted file mode 100644 index 6c055af..0000000 --- a/myproject/cleanup_showcase_kits.py +++ /dev/null @@ -1,52 +0,0 @@ -""" -Скрипт для очистки витринных комплектов без резервов. -Запуск: 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)