diff --git a/tools/finlab/dashboard/server.py b/tools/finlab/dashboard/server.py index 955a366..cecc093 100644 --- a/tools/finlab/dashboard/server.py +++ b/tools/finlab/dashboard/server.py @@ -21,6 +21,8 @@ from fastapi.staticfiles import StaticFiles from finlab import ( alerts, data, + digest as digest_mod, + fundamental, indicators as ind, plan as plan_mod, scanner, @@ -168,6 +170,38 @@ def api_plan(ticker: str, capital: float = 1427.0): return _clean({"plan": p, "render": plan_mod.render(p)}) +# ── Analyses rapides (boutons one-click, finlab pur) ────────────────────────── +@app.get("/api/digest") +def api_digest(theme: str = "all", target: float = 5.0): + return {"text": digest_mod.build(theme, target)} + + +@app.get("/api/fundamentals") +def api_fundamentals(ticker: str): + return _clean({"snapshot": fundamental.snapshot(ticker)}) + + +@app.get("/api/analyze") +def api_analyze(ticker: str, capital: float = 1427.0): + """Analyse one-click d'une action : technique + fondamental + plan R:R (finlab pur).""" + out = {"ticker": ticker} + try: + out["technical"] = technical.analyze(ticker) + except Exception as e: + out["technical"] = {"error": str(e)} + try: + out["fundamental"] = fundamental.snapshot(ticker) + except Exception as e: + out["fundamental"] = {"error": str(e)} + try: + p = plan_mod.plan(ticker, capital) + out["plan"] = p + out["plan_render"] = plan_mod.render(p) + except Exception as e: + out["plan"] = {"error": str(e)} + return _clean(out) + + # ── Import de relevés (image → analysée par la Console IA) ───────────────────── IMPORTS_DIR = data.ROOT / "imports" _IMG_EXT = {".png", ".jpg", ".jpeg", ".webp", ".gif"} diff --git a/tools/finlab/dashboard/static/index.html b/tools/finlab/dashboard/static/index.html index 84d4ea6..9e4fd70 100644 --- a/tools/finlab/dashboard/static/index.html +++ b/tools/finlab/dashboard/static/index.html @@ -37,6 +37,12 @@ .atab:hover{border-color:var(--acc);color:#fff} .atab.on{background:var(--acc);border-color:var(--acc);color:#fff} .atag{font-size:11px;opacity:.85} + .qa-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px} + .btn.qa{text-align:left;padding:8px 10px;font-size:12.5px} + #resBody table{width:100%} + #resBody pre{background:var(--bg);padding:12px;border-radius:8px;white-space:pre-wrap;font-size:12.5px} + #resBody .kv{display:flex;justify-content:space-between;padding:4px 6px;border-bottom:1px solid var(--line);font-size:13px} + #resBody .kv b{color:#fff} .row .t{font-weight:600;color:#fff} .row .s{font-size:12px;color:var(--mut)} .mono{font-variant-numeric:tabular-nums} @@ -154,8 +160,20 @@ - +