from django.core.management.base import BaseCommand from django.db import connection, transaction from orders.models import Order from inventory.models import Sale, SaleBatchAllocation, Stock, StockBatch, Warehouse class Command(BaseCommand): help = 'Исправляет дубликаты продаж для указанного заказа' def add_arguments(self, parser): parser.add_argument('order_number', type=str, help='Номер заказа') parser.add_argument('--tenant', type=str, default='buba', help='Схема тенанта') def handle(self, *args, **options): order_number = options['order_number'] tenant = options['tenant'] connection.set_schema(tenant) try: order = Order.objects.get(order_number=order_number) except Order.DoesNotExist: self.stdout.write(self.style.ERROR(f'Заказ {order_number} не найден в тенанте {tenant}')) return sales = Sale.objects.filter(order=order).order_by('date') self.stdout.write(f"Заказ {order.order_number}: найдено {sales.count()} продаж") if sales.count() <= 1: self.stdout.write(self.style.SUCCESS("Дубликатов нет, всё в порядке")) return # Оставляем первую продажу, остальные удаляем first_sale = sales.first() duplicate_sales = sales.exclude(id=first_sale.id) self.stdout.write(f"\nОставляем продажу ID {first_sale.id}") self.stdout.write(f"Удаляем {duplicate_sales.count()} дубликатов:") with transaction.atomic(): for sale in duplicate_sales: self.stdout.write(f" - Продажа ID {sale.id}: {sale.product.name} x {sale.quantity}") # Получаем SaleBatchAllocation для восстановления товара allocations = SaleBatchAllocation.objects.filter(sale=sale) # Восстанавливаем товар в партиях for alloc in allocations: batch = alloc.batch self.stdout.write(f" Восстанавливаем партию ID {batch.id}: +{alloc.quantity}") batch.quantity += alloc.quantity batch.is_active = True batch.save() # Удаляем продажу (каскадно удалятся и SaleBatchAllocation) sale.delete() # Обновляем Stock for item in order.items.all(): product = item.product or item.product_kit if product: warehouse = order.pickup_warehouse or Warehouse.objects.filter(is_active=True).first() if warehouse: stock, _ = Stock.objects.get_or_create(product=product, warehouse=warehouse) stock.refresh_from_batches() self.stdout.write(f"\nStock обновлен для {product.name}:") self.stdout.write(f" quantity_available: {stock.quantity_available}") self.stdout.write(f" quantity_reserved: {stock.quantity_reserved}") self.stdout.write(f" quantity_free: {stock.quantity_free}") self.stdout.write(self.style.SUCCESS("\n✅ Дубликаты удалены, товар восстановлен на складе")) # Проверяем результат sales_after = Sale.objects.filter(order=order) self.stdout.write(f"\nПосле исправления: {sales_after.count()} продаж")