""" Commande Django pour créer des données de test Usage: python manage.py seed_data """ from django.core.management.base import BaseCommand from django.contrib.auth import get_user_model from django.utils import timezone from decimal import Decimal from datetime import timedelta import random from api.models import Product, Transaction, Budget, Ad User = get_user_model() class Command(BaseCommand): help = 'Crée des données de test pour Akompta AI' def add_arguments(self, parser): parser.add_argument( '--clear', action='store_true', help='Supprimer toutes les données existantes avant de créer de nouvelles données', ) def handle(self, *args, **options): if options['clear']: self.stdout.write(self.style.WARNING('Suppression des données existantes...')) Product.objects.all().delete() Transaction.objects.all().delete() Budget.objects.all().delete() Ad.objects.all().delete() User.objects.filter(is_superuser=False).delete() self.stdout.write(self.style.SUCCESS('✓ Données supprimées')) # Créer des utilisateurs de test self.stdout.write('Création des utilisateurs...') # Utilisateur personnel personal_user, created = User.objects.get_or_create( email='demo@akompta.com', defaults={ 'first_name': 'Demo', 'last_name': 'User', 'account_type': 'personal', 'phone_number': '+22890123456', } ) if created: personal_user.set_password('demo123') personal_user.save() self.stdout.write(self.style.SUCCESS(f'✓ Utilisateur personnel créé: {personal_user.email}')) # Utilisateur business business_user, created = User.objects.get_or_create( email='business@akompta.com', defaults={ 'first_name': 'Business', 'last_name': 'Owner', 'account_type': 'business', 'business_name': 'AgriTech Solutions', 'sector': 'Agriculture', 'location': 'Lomé, Togo', 'ifu': '1234567890123', 'phone_number': '+22890987654', } ) if created: business_user.set_password('business123') business_user.business_agreed = True business_user.business_agreed_at = timezone.now() business_user.save() self.stdout.write(self.style.SUCCESS(f'✓ Utilisateur business créé: {business_user.email}')) # Créer des produits self.stdout.write('Création des produits...') products_data = [ {'name': 'Tomates', 'price': '800', 'unit': 'Kg', 'category': 'vente', 'stock_status': 'ok'}, {'name': 'Oignons', 'price': '600', 'unit': 'Kg', 'category': 'vente', 'stock_status': 'low'}, {'name': 'Riz', 'price': '450', 'unit': 'Kg', 'category': 'stock', 'stock_status': 'ok'}, {'name': 'Huile', 'price': '2500', 'unit': 'Litre', 'category': 'stock', 'stock_status': 'rupture'}, {'name': 'Maïs', 'price': '350', 'unit': 'Kg', 'category': 'vente', 'stock_status': 'ok'}, ] for user in [personal_user, business_user]: for prod_data in products_data: Product.objects.get_or_create( user=user, name=prod_data['name'], defaults={ 'description': f'{prod_data["name"]} de qualité premium', 'price': Decimal(prod_data['price']), 'unit': prod_data['unit'], 'category': prod_data['category'], 'stock_status': prod_data['stock_status'], } ) self.stdout.write(self.style.SUCCESS(f'✓ {len(products_data) * 2} produits créés')) # Créer des transactions self.stdout.write('Création des transactions...') categories_income = ['Ventes', 'Services', 'Consultation'] categories_expense = ['Transport', 'Loyer', 'Achats', 'Marketing', 'Salaires'] now = timezone.now() transaction_count = 0 for user in [personal_user, business_user]: # Transactions des 30 derniers jours for i in range(50): days_ago = random.randint(0, 30) trans_date = now - timedelta(days=days_ago) trans_type = random.choice(['income', 'expense']) if trans_type == 'income': category = random.choice(categories_income) amount = Decimal(random.randint(5000, 50000)) name = f'Vente {category}' else: category = random.choice(categories_expense) amount = Decimal(random.randint(1000, 30000)) name = f'Dépense {category}' Transaction.objects.create( user=user, name=name, amount=amount, type=trans_type, category=category, date=trans_date, currency='FCFA' ) transaction_count += 1 self.stdout.write(self.style.SUCCESS(f'✓ {transaction_count} transactions créées')) # Créer des budgets self.stdout.write('Création des budgets...') budgets_data = [ {'category': 'Transport', 'limit': '50000', 'color': '#3B82F6'}, {'category': 'Marketing', 'limit': '100000', 'color': '#EF4444'}, {'category': 'Achats', 'limit': '200000', 'color': '#10B981'}, ] budget_count = 0 for user in [personal_user, business_user]: for budget_data in budgets_data: Budget.objects.get_or_create( user=user, category=budget_data['category'], defaults={ 'limit': Decimal(budget_data['limit']), 'color': budget_data['color'], } ) budget_count += 1 self.stdout.write(self.style.SUCCESS(f'✓ {budget_count} budgets créés')) # Créer des annonces self.stdout.write('Création des annonces...') ads_data = [ { 'product_name': 'Engrais Bio Premium', 'owner_name': 'FertiTogo', 'description': 'Engrais biologique de haute qualité pour toutes cultures. Augmentez vos rendements naturellement.', 'whatsapp': '+22890111222', 'location': 'Lomé, Togo', 'is_verified': True, }, { 'product_name': 'Système d\'irrigation automatique', 'owner_name': 'AgroTech Solutions', 'description': 'Solutions d\'irrigation modernes pour optimiser votre consommation d\'eau.', 'whatsapp': '+22890333444', 'location': 'Kara, Togo', 'is_verified': True, }, { 'product_name': 'Semences certifiées', 'owner_name': 'SeedCorp Afrique', 'description': 'Semences de maïs, riz et soja certifiées et adaptées au climat ouest-africain.', 'whatsapp': '+22890555666', 'location': 'Sokodé, Togo', 'is_verified': True, }, ] for ad_data in ads_data: Ad.objects.get_or_create( user=business_user, product_name=ad_data['product_name'], defaults=ad_data ) self.stdout.write(self.style.SUCCESS(f'✓ {len(ads_data)} annonces créées')) # Résumé self.stdout.write(self.style.SUCCESS('\n' + '='*50)) self.stdout.write(self.style.SUCCESS('DONNÉES DE TEST CRÉÉES AVEC SUCCÈS')) self.stdout.write(self.style.SUCCESS('='*50)) self.stdout.write(self.style.SUCCESS('\nComptes de test :')) self.stdout.write(f' • Personnel: demo@akompta.com / demo123') self.stdout.write(f' • Business: business@akompta.com / business123') self.stdout.write(self.style.SUCCESS('\nVous pouvez maintenant tester l\'API !'))