131 lines
6.3 KiB
Python
131 lines
6.3 KiB
Python
"""
|
||
Команда для создания примерных промокодов.
|
||
"""
|
||
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 использований)')
|
||
|