""" Script para poblar la base de datos con usuarios demo (ciudadano + empleado + admin). Uso: python seed.py """ from sqlalchemy import text from app.database import Base, engine, SessionLocal from app.models import User, Address, Report, ServiceRating from app.models.user import UserRole from app.services.auth_service import hash_password from app.services.eta_service import assign_route import uuid from datetime import datetime, timedelta # Asegurar que todas las tablas existen (creará las nuevas columnas si no existen) Base.metadata.create_all(bind=engine) # Migración manual: si la BD ya existía sin la columna `role`, añadirla with engine.connect() as conn: try: conn.execute(text("ALTER TABLE users ADD COLUMN role VARCHAR DEFAULT 'CIUDADANO'")) conn.commit() print("✓ Columna 'role' añadida a tabla users") except Exception: pass # Ya existía db = SessionLocal() # ─── Limpiar TODO para empezar fresco ──────────────────────────────────── print("Limpiando datos previos...") db.query(ServiceRating).delete() db.query(Report).delete() db.query(Address).delete() db.query(User).delete() db.commit() # ─── Definir usuarios demo ─────────────────────────────────────────────── USERS = [ { "full_name": "María González Demo", "email": "demo@celaya.gob.mx", "phone": "461-123-4567", "password": "Celaya2026", "role": UserRole.CIUDADANO.value, "addresses": [ {"label": "Casa", "street": "Calle Hidalgo 245", "colony": "Centro", "lat": 20.5215, "lng": -100.8142, "is_default": True}, {"label": "Trabajo", "street": "Av. Tecnológico 1500", "colony": "Ciudad Industrial", "lat": 20.5450, "lng": -100.7950, "is_default": False}, ], }, { "full_name": "Carlos Hernández (Empleado)", "email": "empleado@celaya.gob.mx", "phone": "461-200-1000", "password": "Empleado2026", "role": UserRole.EMPLEADO.value, "addresses": [], }, { "full_name": "Lic. Patricia Ramírez (Admin)", "email": "admin@celaya.gob.mx", "phone": "461-100-0001", "password": "Admin2026", "role": UserRole.ADMIN.value, "addresses": [], }, ] created_users = {} for u in USERS: user = User( full_name=u["full_name"], email=u["email"], phone=u["phone"], hashed_password=hash_password(u["password"]), role=u["role"], is_active=True, ) db.add(user) db.commit() db.refresh(user) created_users[u["role"]] = user print(f"✓ {u['role']}: {u['email']} (id={user.id})") for addr in u["addresses"]: route_id = assign_route(addr["lat"], addr["lng"]) a = Address( user_id=user.id, label=addr["label"], street=addr["street"], colony=addr["colony"], city="Celaya", lat=addr["lat"], lng=addr["lng"], route_id=route_id, is_default=addr["is_default"], ) db.add(a) db.commit() print(f" 📍 {addr['label']} en {addr['street']} → {route_id}") # ─── Reportes demo del ciudadano ───────────────────────────────────────── ciudadano = created_users[UserRole.CIUDADANO.value] addresses = db.query(Address).filter(Address.user_id == ciudadano.id).all() reportes_demo = [ {"addr": 0, "type": "RETRASO", "desc": "El camión pasó 40 min tarde el viernes", "status": "RESUELTO", "days": 5}, {"addr": 0, "type": "NO_PASO", "desc": "Hoy el camión no pasó por la cuadra", "status": "EN_PROCESO", "days": 2}, {"addr": 1, "type": "ACUMULACION", "desc": "Basura acumulada en la esquina", "status": "PENDIENTE", "days": 1}, {"addr": 0, "type": "OTRO", "desc": "Solicito información sobre día festivo", "status": "PENDIENTE", "days": 0}, ] for r in reportes_demo: folio = f"MRL-{datetime.utcnow().strftime('%Y%m%d')}-{str(uuid.uuid4())[:6].upper()}" rep = Report( user_id=ciudadano.id, address_id=addresses[r["addr"]].id, folio=folio, report_type=r["type"], description=r["desc"], status=r["status"], ) db.add(rep) db.commit() db.refresh(rep) rep.created_at = datetime.utcnow() - timedelta(days=r["days"]) db.commit() print(f" 📋 {folio} | {r['type']} | {r['status']}") # Calificación rating = ServiceRating( user_id=ciudadano.id, address_id=addresses[0].id, rating=4, comment="El servicio mejoró este mes, gracias", ) db.add(rating) db.commit() print(f" ⭐ Calificación 4★") db.close() # ─── Resumen ───────────────────────────────────────────────────────────── print() print("═" * 65) print(" ✅ BASE DE DATOS POBLADA") print("═" * 65) print() print(" CREDENCIALES DE DEMO:") print() print(" 🧑 CIUDADANO") print(" 📧 demo@celaya.gob.mx") print(" 🔑 Celaya2026") print() print(" 👮 EMPLEADO (ve y resuelve reportes)") print(" 📧 empleado@celaya.gob.mx") print(" 🔑 Empleado2026") print() print(" 🛡️ ADMIN (acceso total + gestión de usuarios)") print(" 📧 admin@celaya.gob.mx") print(" 🔑 Admin2026") print()