from sqlalchemy.orm import Session from backend.app.models.users import User, WorkerProfile, CustomerProfile from backend.app.models.jobs import Job from backend.app.models.bookings import Booking from backend.app.models.wallet import WalletTransaction from backend.app.models.roster import RosterWorker from backend.app.models.alerts import AdminAlert from backend.app.core.security import get_password_hash def seed_db(db: Session): """Pre-populates the database with initial viva seed data if empty.""" # Check if DB is already seeded if db.query(User).first() is not None: print("Database already seeded.") return False print("Seeding database...") # 1. Create Default Admin admin = User( name="Chandan Admin", phone="9999999999", role="admin", password_hash=get_password_hash("admin123") ) db.add(admin) # 2. Create Default Customer customer = User( name="Harsh", phone="9876543210", role="customer", password_hash=get_password_hash("pass123") ) db.add(customer) db.flush() cust_profile = CustomerProfile(user_id=customer.id, wallet_balance=8200) db.add(cust_profile) # 3. Create Default Mediator mediator = User( name="Rafiq Thekedar", phone="9876599999", role="mediator", password_hash=get_password_hash("pass123") ) db.add(mediator) db.flush() med_cust_profile = CustomerProfile(user_id=mediator.id, wallet_balance=5000) db.add(med_cust_profile) # 4. Create Seed Workers workers_data = [ ("Ramesh Kumar", "9876500001", "Mason", 650, 4.8, 126, 97, 67, 34, True, True), ("Imran Ali", "9876500002", "Electrician", 800, 4.7, 88, 95, 35, 45, True, True), ("Sita Devi", "9876500003", "Painter", 700, 4.9, 112, 99, 58, 72, True, True), ("Babulal Meena", "9876500004", "Helper", 500, 4.4, 46, 91, 26, 67, True, False), ("Karan Singh", "9876500005", "Carpenter", 750, 4.6, 73, 92, 74, 58, False, True), ("Mohan Lal", "9876500006", "Plumber", 720, 4.5, 65, 93, 46, 28, True, True), ] workers = [] for name, phone, skill, rate, rating, completed, completion, x, y, online, verified in workers_data: user = User( name=name, phone=phone, role="worker", password_hash=get_password_hash("pass123") ) db.add(user) db.flush() # Calculate distance import math dist = round(math.sqrt((x - 50)**2 + (y - 50)**2) / 15, 1) or 1.2 prof = WorkerProfile( user_id=user.id, skill=skill, rate=rate, rating=rating, distance=dist, online=online, verified=verified, completed_jobs=completed, completion_rate=completion, map_x=x, map_y=y ) db.add(prof) workers.append(user) db.flush() # 5. Create Seed Jobs jobs_data = [ ("Mason", "Mansarovar, Jaipur", 1300, "POSTED", "Boundary wall repair and cement finishing."), ("Painter", "Vaishali Nagar", 2800, "ACCEPTED", "Two rooms wall putty and primer."), ("Electrician", "Malviya Nagar", 900, "IN_PROGRESS", "Switch board repair and fan installation."), ] jobs = [] for skill, loc, budget, status, desc in jobs_data: job = Job( customer_id=customer.id, skill_required=skill, location=loc, budget=budget, description=desc, status=status ) db.add(job) jobs.append(job) db.flush() # 6. Create Seed Bookings bookings_data = [ ("B-2401", "Boundary wall repair", workers[0].id, 1300, "ACCEPTED", jobs[0].id), ("B-2402", "Switch board repair", workers[1].id, 900, "IN_PROGRESS", jobs[2].id), ] for code, title, worker_id, amount, status, job_id in bookings_data: booking = Booking( code=code, customer_id=customer.id, worker_id=worker_id, amount=amount, status=status, job_id=job_id ) db.add(booking) db.flush() # 7. Create Seed Wallet Transactions tx_data = [ ("Wallet top-up via UPI", 5000, "credit"), ("Escrow hold for B-2401", -1300, "hold"), ("Escrow hold for B-2402", -900, "hold"), ("Refund from cancelled booking", 600, "credit"), ] for label, amount, tx_type in tx_data: tx = WalletTransaction( user_id=customer.id, label=label, amount=amount, type=tx_type ) db.add(tx) # 8. Create Seed Roster Workers roster_data = [ ("Rafiq", "Helper", "IVR only", "Available", 1200), ("Sunita", "Painter", "Verified", "On job", 820), ("Dinesh", "Mason", "Verified", "Available", 1440), ] for name, skill, phone_status, status, commission in roster_data: roster_worker = RosterWorker( mediator_id=mediator.id, name=name, skill=skill, phone_status=phone_status, status=status, commission=commission ) db.add(roster_worker) # 9. Create Seed Admin Alerts alerts_data = [ ("Dispute", "B-2397 quality issue pending admin review", "red"), ("Fraud", "Duplicate Aadhaar hash detected for two accounts", "orange"), ("IVR", "23 non-smartphone workers received daily job alerts", "gray"), ] for type_, text, severity in alerts_data: alert = AdminAlert( type=type_, text=text, severity=severity, status="active" ) db.add(alert) db.commit() print("Database seeded successfully!") return True