Nuevo Commit

This commit is contained in:
2025-11-18 16:46:20 -03:00
parent be30b3ca18
commit 443de4ec0e
12 changed files with 1969 additions and 206 deletions

180
backend/add_questions.py Normal file
View File

@@ -0,0 +1,180 @@
"""
Script para agregar preguntas a un checklist basado en el formato del PDF
Ejecutar: docker cp add_questions.py checklist-backend:/app/ && docker-compose exec -T backend python /app/add_questions.py
"""
from app.core.database import SessionLocal
from app.models import Checklist, Question
# ID del checklist al que quieres agregar preguntas
CHECKLIST_ID = 2 # Cambia este número según el ID de tu checklist
db = SessionLocal()
# Verificar que el checklist existe
checklist = db.query(Checklist).filter(Checklist.id == CHECKLIST_ID).first()
if not checklist:
print(f"❌ Checklist con ID {CHECKLIST_ID} no encontrado")
exit(1)
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()