""" Script para agregar preguntas a un checklist basado en el formato del PDF Ejecutar: docker-compose exec -T backend python /app/add_questions.py """ from app.core.database import SessionLocal from app.models import Checklist, Question, User db = SessionLocal() # Obtener el usuario admin admin = db.query(User).filter(User.username == "admin").first() if not admin: print("❌ Usuario admin no encontrado") exit(1) # Verificar si ya existe un checklist, si no, crearlo checklist = db.query(Checklist).filter(Checklist.name == "Inspección Preventiva de Vehículos").first() if not checklist: print("📋 Creando checklist...") checklist = Checklist( name="Inspección Preventiva de Vehículos", description="Checklist completo para inspección preventiva de vehículos", ai_mode="off", scoring_enabled=True, created_by=admin.id ) db.add(checklist) db.commit() db.refresh(checklist) print(f"✅ Checklist creado con ID: {checklist.id}") else: print(f"✅ Usando checklist existente: {checklist.name} (ID: {checklist.id})") CHECKLIST_ID = checklist.id print(f"✅ Agregando preguntas al checklist: {checklist.name}") # Definir todas las preguntas por sección questions_data = [ # DOCUMENTACIÓN ('Documentación', 'Cédula Verde', 'pass_fail', 2, False), ('Documentación', 'Verificación Técnica Vehicular', 'pass_fail', 2, False), ('Documentación', 'Póliza de Seguro', 'pass_fail', 2, False), ('Documentación', 'Licencia de conducir del chofer', 'pass_fail', 2, False), # EXTERIOR DEL VEHÍCULO ('Exterior', 'Estado de carrocería', 'good_bad', 1, True), ('Exterior', 'Espejo retrovisor izquierdo', 'pass_fail', 1, True), ('Exterior', 'Espejo retrovisor derecho', 'pass_fail', 1, True), ('Exterior', 'Parabrisas delantero', 'pass_fail', 1, True), ('Exterior', 'Luneta trasera', 'pass_fail', 1, True), ('Exterior', 'Cristales laterales', 'pass_fail', 1, True), ('Exterior', 'Escobillas limpiaparabrisas', 'pass_fail', 1, True), ('Exterior', 'Antena', 'pass_fail', 1, False), ('Exterior', 'Tapa de combustible', 'pass_fail', 1, True), ('Exterior', 'Paragolpes delantero', 'pass_fail', 1, True), ('Exterior', 'Paragolpes trasero', 'pass_fail', 1, True), # NEUMÁTICOS ('Neumáticos', 'Neumático delantero izquierdo - Presión', 'pass_fail', 1, True), ('Neumáticos', 'Neumático delantero izquierdo - Banda de rodadura', 'good_bad', 2, True), ('Neumáticos', 'Neumático delantero derecho - Presión', 'pass_fail', 1, True), ('Neumáticos', 'Neumático delantero derecho - Banda de rodadura', 'good_bad', 2, True), ('Neumáticos', 'Neumático trasero izquierdo - Presión', 'pass_fail', 1, True), ('Neumáticos', 'Neumático trasero izquierdo - Banda de rodadura', 'good_bad', 2, True), ('Neumáticos', 'Neumático trasero derecho - Presión', 'pass_fail', 1, True), ('Neumáticos', 'Neumático trasero derecho - Banda de rodadura', 'good_bad', 2, True), ('Neumáticos', 'Neumático de auxilio - Estado', 'pass_fail', 1, True), # SISTEMA ELÉCTRICO ('Sistema Eléctrico', 'Batería - Estado', 'good_bad', 2, True), ('Sistema Eléctrico', 'Luces de posición delanteras', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Luces bajas', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Luces altas', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Luces de giro delanteras', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Luces de freno', 'pass_fail', 2, False), ('Sistema Eléctrico', 'Luces de retroceso', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Luces traseras', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Luces de giro traseras', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Luz de patente', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Luz interior', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Bocina', 'pass_fail', 1, False), ('Sistema Eléctrico', 'Testigos en tablero', 'pass_fail', 1, True), # MOTOR ('Motor', 'Nivel de aceite', 'pass_fail', 2, True), ('Motor', 'Fugas de aceite', 'pass_fail', 2, True), ('Motor', 'Filtro de aceite', 'status', 1, True), ('Motor', 'Nivel de refrigerante', 'pass_fail', 1, True), ('Motor', 'Fugas de refrigerante', 'pass_fail', 2, True), ('Motor', 'Estado de mangueras', 'pass_fail', 1, True), ('Motor', 'Filtro de aire', 'status', 1, True), ('Motor', 'Correa de distribución', 'pass_fail', 2, True), ('Motor', 'Correas auxiliares', 'pass_fail', 1, True), # FRENOS ('Frenos', 'Pastillas/zapatas delanteras', 'good_bad', 2, True), ('Frenos', 'Discos/tambores delanteros', 'good_bad', 2, True), ('Frenos', 'Pastillas/zapatas traseras', 'good_bad', 2, True), ('Frenos', 'Discos/tambores traseros', 'good_bad', 2, True), ('Frenos', 'Nivel de líquido de frenos', 'pass_fail', 2, False), ('Frenos', 'Porcentaje de humedad en líquido', 'numeric', 1, False), ('Frenos', 'Freno de mano', 'pass_fail', 2, False), # SUSPENSIÓN Y DIRECCIÓN ('Suspensión', 'Amortiguadores delanteros', 'pass_fail', 2, True), ('Suspensión', 'Amortiguadores traseros', 'pass_fail', 2, True), ('Suspensión', 'Cojinetes de ruedas', 'pass_fail', 2, False), ('Suspensión', 'Rótulas', 'pass_fail', 2, True), ('Suspensión', 'Bieletas', 'pass_fail', 1, True), ('Suspensión', 'Bujes', 'pass_fail', 1, True), ('Dirección', 'Nivel de líquido de dirección', 'pass_fail', 1, True), ('Dirección', 'Estado de cremallera/caja', 'pass_fail', 2, True), ('Dirección', 'Fugas en dirección', 'pass_fail', 2, True), # INTERIOR ('Interior', 'Tablero de instrumentos', 'pass_fail', 1, True), ('Interior', 'Funcionamiento de velocímetro', 'pass_fail', 1, False), ('Interior', 'Funcionamiento de cuentakilómetros', 'pass_fail', 1, False), ('Interior', 'Cinturones de seguridad delanteros', 'pass_fail', 2, True), ('Interior', 'Cinturones de seguridad traseros', 'pass_fail', 2, True), ('Interior', 'Asientos', 'pass_fail', 1, True), ('Interior', 'Apoyacabezas', 'pass_fail', 1, True), ('Interior', 'Aire acondicionado', 'pass_fail', 1, False), ('Interior', 'Calefacción', 'pass_fail', 1, False), ('Interior', 'Radio/sistema de audio', 'pass_fail', 1, False), ('Interior', 'Ceniceros', 'pass_fail', 1, False), ('Interior', 'Encendedor', 'pass_fail', 1, False), ('Interior', 'Guantera', 'pass_fail', 1, False), ('Interior', 'Tapizado', 'good_bad', 1, True), # SEGURIDAD ('Seguridad', 'Matafuego - Fecha de vencimiento', 'pass_fail', 2, True), ('Seguridad', 'Matafuego - Presión', 'pass_fail', 2, True), ('Seguridad', 'Balizas triangulares', 'pass_fail', 1, True), ('Seguridad', 'Botiquín de primeros auxilios', 'pass_fail', 1, True), ('Seguridad', 'Llave de ruedas', 'pass_fail', 1, False), ('Seguridad', 'Gato hidráulico', 'pass_fail', 1, False), ('Seguridad', 'Chaleco reflectivo', 'pass_fail', 1, False), # TRANSMISIÓN ('Transmisión', 'Nivel de aceite de transmisión', 'pass_fail', 1, True), ('Transmisión', 'Fugas en transmisión', 'pass_fail', 2, True), ('Transmisión', 'Estado de embrague', 'pass_fail', 2, False), ('Transmisión', 'Funcionamiento de cambios', 'pass_fail', 2, False), # ESCAPE ('Escape', 'Estado del sistema de escape', 'pass_fail', 1, True), ('Escape', 'Fugas en escape', 'pass_fail', 2, True), ('Escape', 'Silenciador', 'pass_fail', 1, True), ('Escape', 'Catalizador', 'pass_fail', 1, True), # PRUEBA DE RUTA ('Prueba de Ruta', 'Arranque del motor', 'pass_fail', 2, False), ('Prueba de Ruta', 'Ralentí estable', 'pass_fail', 1, False), ('Prueba de Ruta', 'Aceleración', 'pass_fail', 2, False), ('Prueba de Ruta', 'Frenado', 'pass_fail', 2, False), ('Prueba de Ruta', 'Dirección', 'pass_fail', 2, False), ('Prueba de Ruta', 'Cambios de marcha', 'pass_fail', 2, False), ('Prueba de Ruta', 'Ruidos anormales', 'pass_fail', 2, True), ('Prueba de Ruta', 'Vibraciones', 'pass_fail', 1, True), ] # Agregar todas las preguntas max_score = 0 for idx, (section, text, qtype, points, photos) in enumerate(questions_data): question = Question( checklist_id=checklist.id, section=section, text=text, type=qtype, points=points, order=idx + 1, allow_photos=photos, max_photos=3 if photos else 0, requires_comment_on_fail=False ) db.add(question) max_score += points # Actualizar puntuación máxima del checklist checklist.max_score = max_score db.commit() print(f'✅ Se agregaron {len(questions_data)} preguntas al checklist') print(f'✅ Puntuación máxima: {max_score} puntos') print(f'\nDesglose por sección:') # Contar preguntas por sección from collections import Counter sections = Counter([s for s, _, _, _, _ in questions_data]) for section, count in sections.items(): section_points = sum(p for s, _, _, p, _ in questions_data if s == section) print(f' - {section}: {count} preguntas ({section_points} puntos)') db.close()