2025-08-27 13:04:41 +03:00

292 lines
11 KiB
Python

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