""" Команда для создания примерных промокодов. """ from django.core.management.base import BaseCommand from django.utils import timezone from datetime import timedelta from apps.subscriptions.models import PromoCode, SubscriptionPlan from decimal import Decimal class Command(BaseCommand): help = 'Создает примерные промокоды для тестирования' def handle(self, *args, **options): self.stdout.write('Создание примерных промокодов...') now = timezone.now() # 1. Промокод на 10% скидку promo_10, created = PromoCode.objects.get_or_create( code='WELCOME10', defaults={ 'description': 'Приветственная скидка 10% для новых пользователей', 'discount_type': 'percentage', 'discount_value': Decimal('10'), 'valid_from': now, 'valid_until': now + timedelta(days=365), # Действует год 'max_uses_total': 1000, 'max_uses_per_user': 1, 'is_active': True, } ) if created: self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_10.code} (10% скидка)')) else: self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_10.code}')) # 2. Промокод на 20% скидку promo_20, created = PromoCode.objects.get_or_create( code='SUMMER20', defaults={ 'description': 'Летняя акция - скидка 20%', 'discount_type': 'percentage', 'discount_value': Decimal('20'), 'valid_from': now, 'valid_until': now + timedelta(days=90), # Действует 3 месяца 'max_uses_total': 500, 'max_uses_per_user': 1, 'is_active': True, } ) if created: self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_20.code} (20% скидка)')) else: self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_20.code}')) # 3. Промокод на фиксированную скидку 500 руб promo_fixed, created = PromoCode.objects.get_or_create( code='SAVE500', defaults={ 'description': 'Скидка 500 рублей на первую подписку', 'discount_type': 'fixed', 'discount_value': Decimal('500'), 'valid_from': now, 'valid_until': now + timedelta(days=180), # Действует 6 месяцев 'max_uses_total': 200, 'max_uses_per_user': 1, 'is_active': True, } ) if created: self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_fixed.code} (500 руб скидка)')) else: self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_fixed.code}')) # 4. Промокод на 30% скидку (ограниченный) promo_30, created = PromoCode.objects.get_or_create( code='VIP30', defaults={ 'description': 'VIP промокод - скидка 30%', 'discount_type': 'percentage', 'discount_value': Decimal('30'), 'valid_from': now, 'valid_until': now + timedelta(days=60), # Действует 2 месяца 'max_uses_total': 50, # Очень ограниченный 'max_uses_per_user': 1, 'is_active': True, } ) if created: self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_30.code} (30% скидка, ограниченный)')) else: self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_30.code}')) # 5. Промокод для определенных планов plan_per_student = SubscriptionPlan.objects.filter(slug='per-student-basic').first() if plan_per_student: promo_plan, created = PromoCode.objects.get_or_create( code='STUDENT15', defaults={ 'description': 'Скидка 15% на подписку "За ученика"', 'discount_type': 'percentage', 'discount_value': Decimal('15'), 'valid_from': now, 'valid_until': now + timedelta(days=120), 'max_uses_total': 300, 'max_uses_per_user': 1, 'is_active': True, } ) if created: promo_plan.applicable_plans.add(plan_per_student) self.stdout.write(self.style.SUCCESS(f'✓ Создан промокод: {promo_plan.code} (15% скидка, только для "За ученика")')) else: self.stdout.write(self.style.WARNING(f'⚠ Промокод уже существует: {promo_plan.code}')) self.stdout.write(self.style.SUCCESS('\n✓ Все промокоды созданы!')) self.stdout.write('\nДоступные промокоды:') self.stdout.write(' 1. WELCOME10 - 10% скидка (1000 использований)') self.stdout.write(' 2. SUMMER20 - 20% скидка (500 использований, 3 месяца)') self.stdout.write(' 3. SAVE500 - 500 руб скидка (200 использований)') self.stdout.write(' 4. VIP30 - 30% скидка (50 использований, ограниченный)') if plan_per_student: self.stdout.write(' 5. STUDENT15 - 15% скидка на "За ученика" (300 использований)')