import datetime from time import sleep import json, random, string, decimal from django.core.management.base import BaseCommand from django.test import Client from django.contrib.auth import get_user_model from plans.models import Order, PlanPricing, AbstractOrder, UserPlan, BillingInfo,Plan from inventory.services import decodevin from inventory.tasks import create_user_dealer from inventory.models import AdditionalServices, Car, CarColors, CarFinance, CarMake, CustomGroup, Customer, Dealer, ExteriorColors, InteriorColors, Lead, UnitOfMeasure,Vendor,Staff from django_ledger.models import PurchaseOrderModel,ItemTransactionModel,ItemModel,EntityModel from django_q.tasks import async_task from faker import Faker from appointment.models import Appointment, AppointmentRequest, Service, StaffMember User = get_user_model() fake = Faker() class Command(BaseCommand): help = "Seed a full dealership via the real signup & downstream views" def handle(self, *args, **opts): dealers = Dealer.objects.filter(name__icontains="reyan").all() dealer = dealers.first() # for dealer in dealers: # self._create_random_po(dealer) # self._create_random_vendors(dealer) # self._create_random_staff(dealer) self._create_random_cars(dealer) # self._create_random_customers(dealer) # self._create_randome_services(dealer) # self._create_random_lead(dealer) # dealer = Dealer.objects.get(name="Dealer #6") # coa_model = dealer.entity.get_default_coa() # inventory_account = dealer.entity.get_all_accounts().get(name="Inventory (Cars)") # uom = dealer.entity.get_uom_all().get(name="Unit") # item = dealer.entity.create_item_inventory(coa_model=coa_model,inventory_account=inventory_account,uom_model=uom,item_type=ItemModel.ITEM_TYPE_MATERIAL, name=f"Test item {random.randint(1,9999)}") # item = ItemTransactionModel.objects.create(item_name=f"Test item {random.randint(1,9999)}", entity=dealer.entity) # po = PurchaseOrderModel.objects.first() self.stdout.write(self.style.SUCCESS(f"✅ PO created for {dealers}")) def _create_random_po(self, dealer): for i in range(random.randint(1,70)): try: e: EntityModel = dealer.entity e.create_purchase_order(po_title=f"Test PO {random.randint(1,9999)}-{i}") except Exception as e: self.stderr.write(self.style.ERROR(f"Error : {e}")) def _create_random_vendors(self, dealer): for i in range(random.randint(1,50)): try: name = fake.name() n = random.randint(1,9999) phone = f"05678{random.randint(0,9)}{random.randint(0,9)}{random.randint(0,9)}{random.randint(0,9)}{random.randint(0,9)}" Vendor.objects.create(dealer=dealer, name=f"{name}{n}", arabic_name=f"{name}{n}", email=f"{name}{n}@tenhal.sa", phone_number=phone,crn=f"CRN {n}", vrn=f"VRN {n}", address=f"Address {fake.address()}",contact_person=f"Contact Person {name}{n}") except Exception as e: pass def _create_random_staff(self, dealer): for i in range(5): name = f"{fake.name()}{i}" email = fake.email() password = "Tenhal@123" user = User.objects.create_user(username=email, email=email, password=password) user.is_staff = True user.save() # staff_member = StaffMember.objects.create(user=user) # services = Service.objects.all() # for service in services: # staff_member.services_offered.add(service) staff = Staff.objects.create(dealer=dealer,user=user,name=name,arabic_name=name,phone_number=fake.phone_number(),active=True) groups = CustomGroup.objects.filter(dealer=dealer) random_group = random.choice(list(groups)) staff.add_group(random_group.group) # for i in range(random.randint(1,15)): # n = random.randint(1,9999) # phone = f"05678{random.randint(1,9999)}{random.randint(1,9999)}{random.randint(1,9999)}{random.randint(1,9999)}{random.randint(1,9999)}" # Vendor.objects.create(dealer=dealer, name=f"{fake.name}", arabic_name=f"{fake.first_name_female()} {fake.last_name_female()}", email=f"vendor{n}@test.com", phone_number=phone,crn=f"CRN {n}", vrn=f"VRN {n}", address=f"Address {fake.address()}",contact_person=f"Contact Person {n}") def _create_random_cars(self,dealer): vendors = Vendor.objects.filter(dealer=dealer).all() vin_list = [ "1B3ES56C13D120225", "1GB4KYC86FF131536", "1HSHXAHR15J136217", "1G1ZT52845F231124", "1J4GK48K43W721617", "JTDBE32K430163717", "1J4FA69S05P331572", "2FMGK5D86EBD28496", "KNADE243696530337", "1N4AL21EX8N499928", "1N4AL21E49N400571", "1G2NW12E54C145398", ] for vin in vin_list: try: for _ in range(random.randint(1,2)): vin = f"{vin[:-4]}{random.randint(0, 9)}{random.randint(0, 9)}{random.randint(0, 9)}{random.randint(0, 9)}" result = decodevin(vin) make = CarMake.objects.get(name=result["maker"]) model = make.carmodel_set.filter(name__contains=result["model"]).first() if not model or model == "": model = random.choice(make.carmodel_set.all()) year = result["modelYear"] serie = random.choice(model.carserie_set.all()) trim = random.choice(serie.cartrim_set.all()) vendor = random.choice(vendors) print(make, model, serie, trim, vendor,vin) car = Car.objects.create( vin=vin, id_car_make=make, id_car_model=model, id_car_serie=serie, id_car_trim=trim, vendor=vendor, year=(int(year) or 2025), receiving_date=datetime.datetime.now(), dealer=dealer, mileage=0, ) print(car) cp=random.randint(10000, 100000) CarFinance.objects.create( car=car, cost_price=cp, selling_price=0,marked_price=cp+random.randint(2000, 7000) ) CarColors.objects.create( car=car, interior=random.choice(InteriorColors.objects.all()), exterior=random.choice(ExteriorColors.objects.all()), ) print(make, model, serie, trim) except Exception as e: print(e) def _create_random_customers(self,dealer): for i in range(random.randint(1,60)): try: c = Customer( dealer=dealer, title="MR", first_name=fake.name(), last_name=fake.last_name(), gender="m", email=fake.email(), phone_number=fake.phone_number(), address=fake.address(), national_id=random.randint(1000000000, 9999999999), ) c.create_user_model() c.create_customer_model() c.save() except Exception as e: pass def _create_randome_services(self,dealer): additional_services = [ { "name": "Vehicle registration transfer assistance", "arabic_name": "مساعدة في نقل ملكية السيارة", "price": decimal.Decimal(random.randrange(100, 1000)), "description": "This is service 1", }, { "name": "Paperwork collection", "arabic_name": "جمع الأوراق", "price": decimal.Decimal(random.randrange(100, 1000)), "description": "This is service 2", }, { "name": "Inspection and test drives", "arabic_name": "فحص وقيادة تجريبية", "price": decimal.Decimal(random.randrange(100, 1000)), "description": "This is service 3", }, { "name": "Shipping and transportation", "arabic_name": "شحن ونقل", "price": decimal.Decimal(random.randrange(100, 1000)), "description": "This is service 4", }, ] uom = UnitOfMeasure.EACH for additional_service in additional_services: AdditionalServices.objects.create( name=additional_service["name"], arabic_name=additional_service["arabic_name"], price=additional_service["price"], description=additional_service["description"], dealer=dealer, uom=uom ) def _create_random_lead(self,dealer): for i in range(random.randint(1,60)): try: first_name = fake.name() last_name = fake.last_name() email = fake.email() phone = fake.phone_number() address = fake.address() staff = random.choice(Staff.objects.filter(dealer=dealer)) make = random.choice(CarMake.objects.all()) model = random.choice(make.carmodel_set.all()) lead = Lead.objects.create( dealer=dealer, first_name=first_name, last_name=last_name, email=email, phone_number=phone, address=address, lead_type="customer", id_car_make=make, id_car_model=model, source="website", channel="website", staff=staff ) c = Customer( dealer=dealer, title="MR", first_name=first_name, last_name=last_name, gender="m", email=email, phone_number=phone, address=address, national_id=random.randint(1000000000, 9999999999), ) c.create_user_model() c.create_customer_model() c.save() lead.customer = c lead.save() except Exception as e: pass