File size: 7,072 Bytes
fa620e1
 
 
 
 
 
 
 
 
 
 
54d10b3
 
 
 
fa620e1
 
 
54d10b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa620e1
 
 
 
54d10b3
fa620e1
54d10b3
fa620e1
 
 
 
 
 
 
 
f808679
54d10b3
fa620e1
 
 
 
 
 
 
 
 
 
f808679
fa620e1
 
54d10b3
fa620e1
 
 
 
 
 
54d10b3
fa620e1
 
54d10b3
 
fa620e1
db2ab52
fa620e1
54d10b3
 
fa620e1
 
 
 
54d10b3
fa620e1
 
 
 
 
 
 
 
54d10b3
fa620e1
 
 
 
 
 
54d10b3
fa620e1
 
54d10b3
fa620e1
 
 
 
54d10b3
fa620e1
 
54d10b3
fa620e1
 
 
54d10b3
f808679
 
fa620e1
 
db2ab52
54d10b3
fa620e1
 
54d10b3
fa620e1
54d10b3
 
fa620e1
54d10b3
fa620e1
 
 
 
 
db2ab52
54d10b3
fa620e1
 
54d10b3
fa620e1
 
 
 
 
 
54d10b3
fa620e1
 
 
54d10b3
 
07ccd7f
54d10b3
 
 
 
 
fa620e1
54d10b3
 
fa620e1
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import os
import random
import pandas as pd
import chainlit as cl
from datetime import datetime
from urllib.parse import quote

# ===== CONFIGURACIÓN =====
os.environ["GRPC_ENABLE_FORK_SUPPORT"] = "False"
os.environ["ABSL_LOG_LEVEL"] = "ERROR"

# Definir rutas absolutas para asegurar que los archivos sean accesibles
EXCEL_PATH = os.path.abspath("MasterData SISO - Actualizada - Jan-29-2025.xlsx")
AUDIO_PATH = os.path.abspath("Manual del Operador de Tienda.wav")
CERTIFICATE_TEMPLATE = os.path.abspath("certificate_template_.pdf")

# ===== PREGUNTAS DEL EXAMEN =====
PREGUNTAS = [
    {"pregunta": "1. ¿Qué debe hacer el Operador cuando se active la alerta de la pantalla naranja? 🚨",
     "opciones": ["A) Ignorar la alerta ❌🚨", "B) Informar al Jefe de Tienda 👨💼",
                  "C) Recontar el dinero 💰", "D) Cerrar el turno 🔒"],
     "respuesta": "B"},
    
    {"pregunta": "2. ¿Quién verifica la cantidad de dinero? 💼💵",
     "opciones": ["A) El encargado de turno 👷♂️", "B) El Jefe de Tienda ❌",
                  "C) El Supervisor 👮♂️", "D) El Operador nuevamente 🔄"],
     "respuesta": "A"},
    
    {"pregunta": "3. ¿Hasta cuándo es responsable el Operador del efectivo? ⏳",
     "opciones": ["A) Hasta finalizar su jornada 🕔", "B) Hasta la última recogida 📦",
                  "C) Hasta cerrar el turno 🔐", "D) Hasta entregar al Jefe 👨💼"],
     "respuesta": "B"},
    
    {"pregunta": "4. ¿Qué hace el Jefe tras recoger el dinero? 💼➡️📦",
     "opciones": ["A) Depositar en caja 🏦", "B) Contar nuevamente 🔢",
                  "C) Actualizar ISSWEB 💻✅", "D) Entregar al Supervisor 👮♂️"],
     "respuesta": "C"},
    
    {"pregunta": "5. ¿Qué hacer con cada sobre antes de guardarlo? 📦👀",
     "opciones": ["A) Mostrar 5s al CCTV ⏱️✅", "B) Contar otra vez 🔢",
                  "C) Entregar al Jefe 👨💼", "D) Guardar en bolsillo 👖"],
     "respuesta": "A"}
]

# ===== FUNCIONES PARA MANEJO DEL EXCEL =====
def cargar_datos():
    """Carga los datos de Excel y los devuelve en un diccionario."""
    try:
        df = pd.read_excel(EXCEL_PATH, dtype={'SAPId': 'int32'})
        for col in ['Fecha', 'Calificacion', 'Curso']:
            if col not in df.columns:
                df[col] = None
        return df.set_index('SAPId').to_dict('index')
    except Exception as e:
        print(f"Error cargando datos: {str(e)}")
        return {}

def actualizar_excel(sap_id, aprobado):
    """Actualiza la hoja de Excel con el estado del usuario."""
    try:
        df = pd.read_excel(EXCEL_PATH)
        mask = df['SAPId'] == sap_id
        df.loc[mask, 'Fecha'] = datetime.now().strftime('%Y-%m-%d')
        df.loc[mask, 'Calificacion'] = 'aprobado' if aprobado else 'no aprobado'
        df.loc[mask, 'Curso'] = 'Manual De Operador De Tienda'
        df.to_excel(EXCEL_PATH, index=False)
    except Exception as e:
        print(f"Error actualizando Excel: {str(e)}")

# ===== CHAINLIT =====
@cl.on_chat_start
async def inicio():
    """Inicia el chat y solicita el SAP ID."""
    SAP_DICT = cargar_datos()
    cl.user_session.set("SAP_DICT", SAP_DICT)
    await cl.Message("🚀 **Sistema de Certificación - Operador de Tienda**\nIngrese su SAP ID:").send()

@cl.on_message
async def manejar_mensaje(message: cl.Message):
    """Maneja la entrada del usuario."""
    SAP_DICT = cl.user_session.get("SAP_DICT")
    user_data = cl.user_session.get("user_data")

    # Si ya está en examen, procesa la respuesta
    if user_data and user_data.get("en_examen"):
        await procesar_respuesta(message)
        return

    # Procesamos como SAP ID
    try:
        sap_id = int(message.content)
        if sap_id not in SAP_DICT:
            return await cl.Message("⛔️ ID no registrado").send()

        usuario = SAP_DICT[sap_id]
        respuesta = f"""
        🔍 **Usuario identificado** 🔍
        ├ N° Personal: {usuario['Número de personal']}
        ├ Status: {usuario['Status ocupación']}
        ├ Función: {usuario['FuncionName']}
        └ Centro Coste: {usuario['Centro de coste']}
        """

        cl.user_session.set("user_data", {
            "sap_id": sap_id,
            "puntaje": 0,
            "pregunta_actual": 0,
            "en_examen": True
        })

        await cl.Message(content=respuesta).send()
        await mostrar_pregunta()

    except ValueError:
        await cl.Message("⚠️ Solo números permitidos (Ej: 60000001)").send()

async def mostrar_pregunta():
    """Muestra la siguiente pregunta del examen."""
    user_data = cl.user_session.get("user_data")
    num_pregunta = user_data["pregunta_actual"]

    if num_pregunta >= len(PREGUNTAS):
        await mostrar_resultado()
        return

    p = PREGUNTAS[num_pregunta]
    mensaje = f"📝 **Pregunta {num_pregunta + 1}**\n{p['pregunta']}\n\n" + "\n".join(p['opciones'])
    await cl.Message(content=mensaje + "\n\n🔘 Respuesta (A/B/C/D):").send()

async def procesar_respuesta(message: cl.Message):
    """Procesa la respuesta de la pregunta actual."""
    user_data = cl.user_session.get("user_data")
    num_pregunta = user_data["pregunta_actual"]

    respuesta = message.content.strip().upper()
    if respuesta not in ['A', 'B', 'C', 'D']:
        await cl.Message("⚠️ **Formato incorrecto**. Respuesta = A/B/C/D").send()
        return

    correcta = PREGUNTAS[num_pregunta]['respuesta']
    if respuesta == correcta:
        user_data["puntaje"] += 1
        await cl.Message("✅ ¡Respuesta correcta! +1 punto").send()
    else:
        await cl.Message(f"❌ Respuesta incorrecta. La correcta es: {correcta}").send()

    user_data["pregunta_actual"] += 1
    cl.user_session.set("user_data", user_data)

    if user_data["pregunta_actual"] < len(PREGUNTAS):
        await mostrar_pregunta()
    else:
        await mostrar_resultado()

async def mostrar_resultado():
    """Muestra el resultado final del examen y adjunta el PDF o el audio."""
    user_data = cl.user_session.get("user_data")
    aprobado = user_data['puntaje'] >= 3
    actualizar_excel(user_data['sap_id'], aprobado)

    mensaje = f"🎉 **¡FELICITACIONES! APROBADO**\n" if aprobado else f"❌ **LO SENTIMOS, REPROBADO**\n"
    mensaje += f"Puntaje Final: {user_data['puntaje']}/5"

    if aprobado and os.path.exists(CERTIFICATE_TEMPLATE):
        await cl.Message(content=mensaje, elements=[cl.File(path=CERTIFICATE_TEMPLATE, name="Certificado de Aprobación")]).send()
    elif not aprobado and os.path.exists(AUDIO_PATH):
        await cl.Message(content=mensaje, elements=[cl.Audio(name="🎧 Material de Refuerzo", path=AUDIO_PATH, display="inline", autoplay=False)]).send()
    else:
        await cl.Message(content=mensaje + "\n⚠️ **Error: No se encontró el archivo**").send()

    cl.user_session.set("user_data", None)
    await cl.Message(content="\nIngrese nuevo SAP ID para otro examen:").send()

if __name__ == "__main__":
    from chainlit.cli import run_chainlit
    run_chainlit(__file__)