diff --git a/backend/main.py b/backend/main.py index f7077b0..b6ea4ad 100644 --- a/backend/main.py +++ b/backend/main.py @@ -36,6 +36,21 @@ def _startup(): # Refresco cada 4 min en segundo plano (TTL del caché es 5 min) start_background_refresh(services.refrescar_todo, interval=1800) + # Historial de estado de asesores: revisa Chatwoot cada 5 min y guarda los + # cambios (ON/OFF) en historial_estado_asesor. Solo entre 05:00 y 23:59. + import threading, time as _t + from datetime import datetime as _dt + def _loop_asesores(): + while True: + try: + h = _dt.now().hour + if 5 <= h <= 23: + services.registrar_estado_asesores() + except Exception as e: + print(f"[historial asesores loop] {e}") + _t.sleep(300) + threading.Thread(target=_loop_asesores, daemon=True).start() + # ── Salud / utilidades ───────────────────────────────────────────────────── @app.get("/api/health") @@ -383,6 +398,20 @@ def post_usuario_rol(payload: dict = Body(...)): except Exception as e: raise HTTPException(status_code=500, detail=str(e)) +@app.post("/api/usuarios/email") +def post_usuario_email(payload: dict = Body(...)): + try: + return services.usuarios_actualizar_email(payload.get("id",""), payload.get("email","")) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@app.post("/api/usuarios/password") +def post_usuario_password(payload: dict = Body(...)): + try: + return services.usuarios_actualizar_password(payload.get("id",""), payload.get("password","")) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + @app.post("/api/usuarios/eliminar") def post_usuario_eliminar(payload: dict = Body(...)): try: @@ -390,6 +419,34 @@ def post_usuario_eliminar(payload: dict = Body(...)): except Exception as e: raise HTTPException(status_code=500, detail=str(e)) +@app.get("/api/roles") +def get_roles(): + try: + return services.roles_listar() + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@app.get("/api/roles/modulos") +def get_roles_modulos(): + try: + return services.roles_modulos_disponibles() + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@app.post("/api/roles/guardar") +def post_rol_guardar(payload: dict = Body(...)): + try: + return services.rol_guardar(payload.get("rol",""), payload.get("modulos",[])) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@app.post("/api/roles/eliminar") +def post_rol_eliminar(payload: dict = Body(...)): + try: + return services.rol_eliminar(payload.get("rol","")) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + # ── VENDEDORES MANUALES (Comisiones) ─────────────────────────────────────── @app.get("/api/comisiones/vendedores") @@ -511,5 +568,20 @@ def set_asesor_estado(agent_id: int = Query(...), online: bool = Query(...)): raise HTTPException(status_code=500, detail=str(e)) +@app.get("/api/asesores/historial") +def get_asesor_historial(email: str = Query(...)): + try: + return services.historial_asesor(email) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +@app.post("/api/asesores/registrar") +def post_asesor_registrar(): + try: + return services.registrar_estado_asesores() + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=False)