# billing/management/commands/seed_billing.py import random from django.core.management.base import BaseCommand from django.utils import timezone from faker import Faker from billing.models import ( Payment, ) from devices.models import Device from api.models import User class Command(BaseCommand): help = "Seeds payment models with dummy data." def add_arguments(self, parser): parser.add_argument( "--number", type=int, default=10, help="The number of payments to create.", ) def handle(self, *args, **options): number = options["number"] fake = Faker() users = User.objects.all() if not users.exists(): self.stdout.write( self.style.ERROR( "No users found. Please seed users first (e.g., python manage.py seed_users)." ) ) return all_devices = Device.objects.all() if not all_devices.exists(): self.stdout.write( self.style.ERROR( "No devices found. Please seed devices first (e.g., python manage.py seed_devices)." ) ) return self.stdout.write(self.style.NOTICE(f"Seeding {number} payments...")) for _ in range(number): random_user = random.choice(users) num_devices_to_attach = random.randint(1, min(3, len(all_devices))) devices_for_payment = random.sample( list(all_devices), num_devices_to_attach ) paid_status = fake.boolean(chance_of_getting_true=80) paid_at_date = fake.date_time_this_year() if paid_status else None if paid_at_date and timezone.is_naive(paid_at_date): paid_at_date = timezone.make_aware(paid_at_date) expires_at_date = None if paid_at_date: from datetime import timedelta expires_at_date = paid_at_date + timedelta( days=30 * fake.random_int(min=1, max=12) ) payment_method = fake.random_element( elements=[choice[0] for choice in Payment.PAYMENT_TYPES] ) payment = Payment.objects.create( number_of_months=fake.random_int(min=1, max=12), amount=fake.pydecimal( left_digits=4, right_digits=2, positive=True, min_value=100.00, max_value=5000.00, ), paid=paid_status, user=random_user, paid_at=paid_at_date, method=payment_method, expires_at=expires_at_date, updated_at=timezone.now(), ) payment.devices.set(devices_for_payment) self.stdout.write(self.style.SUCCESS(f"Successfully seeded {number} payments."))