diff --git a/configs/bank-landing/README.md b/configs/bank-landing/README.md index 68f290f..d59e83a 100644 --- a/configs/bank-landing/README.md +++ b/configs/bank-landing/README.md @@ -103,31 +103,11 @@ taler-wallet-cli exchanges accept-tos https://exchange.hacktivism.ch/ --- -## Live stats (central host collector · hernani systemd) +## Live stats (in bank container) -**Primary:** user **hernani** on koopa runs `taler-landing-stats.timer` -(`scripts/taler-landing/`). That process full-scans **all bank accounts** -(except `exchange` double-count), paginates every ledger, writes -`stats.json` with **GOA alt units** (`amount_alt` / Kilo-GOA / Mega-GOA / …), -and refreshes exchange + merchant stats the same way. - -```bash -# on koopa as hernani -./scripts/taler-landing/install-landing-stats-host.sh -sudo loginctl enable-linger hernani -systemctl --user start taler-landing-stats.service -``` - -See **`scripts/taler-landing/README.md`**. - -**Fallback:** in-container `landing-stats.sh` (below) if the host timer is down. -It now also scans admin + all users (skips only `exchange`). - -## Live stats (in bank container · fallback) - -Stats are **not** computed in the browser. A small script can still run -**inside the bank container**, query libeufin (all accounts), and write a -public JSON file next to the landing assets. +Stats are **not** computed on the laptop or host browser. A small script runs +**inside the bank container**, queries libeufin for the demo funding account +(`explorer`), and writes a public JSON file next to the landing assets. | Piece | Path / role | |-------|-------------| @@ -151,9 +131,9 @@ public JSON file next to the landing assets. | Env | Default | Meaning | |-----|---------|---------| -| `TX_DELTA` | `-200000` | per-account ledger window (`GET …/transactions?delta=`) | -| `ACCOUNTS_DELTA` | `-10000` | account-list window (`GET /accounts?delta=`) | -| `MAX_SCAN_ACCOUNTS` | `0` (unlimited) | max usernames to scan; `0` = all | +| `TX_DELTA` | `-50000` | per-account ledger window (`GET …/transactions?delta=`) | +| `ACCOUNTS_DELTA` | `-500` | account-list window (`GET /accounts?delta=`) | +| `MAX_SCAN_ACCOUNTS` | `500` | max usernames to scan | Older defaults (`TX_DELTA=-100`, `MAX_SCAN_ACCOUNTS=80`) **undercounted** credits/withdraws and account totals on this stack. Empty accounts often return **HTTP 204** (no body) — diff --git a/configs/bank-landing/goa-amount.js b/configs/bank-landing/goa-amount.js deleted file mode 100644 index 67c3859..0000000 --- a/configs/bank-landing/goa-amount.js +++ /dev/null @@ -1,169 +0,0 @@ -/* Compact GOA / CUR:amount display using currency alt_unit_names. - * Large values → "1.23 Mega-GOA" (title = full GOA:n) so landing tiles fit. - */ -(function (global) { - "use strict"; - - var DEFAULT_ALT = { - "24": "Yotta-GOA", - "21": "Zetta-GOA", - "18": "Exa-GOA", - "15": "Peta-GOA", - "12": "Tera-GOA", - "9": "Giga-GOA", - "6": "Mega-GOA", - "3": "Kilo-GOA", - "0": "GOA", - "-1": "Deci-GOA", - "-2": "Centi-GOA", - "-3": "Milli-GOA", - "-6": "Micro-GOA", - "-7": "Deci-Micro-GOA", - "-8": "Atomic-GOA" - }; - - var THRESHOLD = 1000; - - function parseAmount(s) { - if (s == null || s === "") return { cur: "GOA", val: 0 }; - if (typeof s === "number") return { cur: "GOA", val: s }; - var t = String(s).trim(); - var i = t.indexOf(":"); - if (i < 0) return { cur: "GOA", val: parseFloat(t) || 0 }; - return { - cur: t.slice(0, i) || "GOA", - val: parseFloat(t.slice(i + 1)) || 0 - }; - } - - function fmtCoeff(v) { - if (!isFinite(v)) return "?"; - var a = Math.abs(v); - if (Math.abs(a - Math.round(a)) < 1e-9) return String(Math.round(v)); - var s = v.toFixed(4).replace(/\.?0+$/, ""); - return s; - } - - function baseStr(cur, val) { - if (!isFinite(val)) return String(cur) + ":?"; - if (Math.abs(val - Math.round(val)) < 1e-9) return cur + ":" + Math.round(val); - return cur + ":" + String(val).replace(/(\.\d*?[1-9])0+$/, "$1").replace(/\.0+$/, ""); - } - - /** - * @param {string|number} amount - * @param {object} [altMap] - * @returns {{ display: string, title: string, raw: string, usedAlt: boolean }} - */ - function format(amount, altMap) { - if (amount == null || amount === "") { - return { display: "—", title: "", raw: "", usedAlt: false }; - } - // Prefer server-provided alt if caller passes object {amount, amount_alt} - if (typeof amount === "object" && amount) { - if (amount.amount_alt) { - var rawO = amount.amount || amount.amount_full || String(amount.amount_alt); - return { - display: String(amount.amount_alt), - title: amount.amount_full || rawO, - raw: String(rawO), - usedAlt: true - }; - } - amount = amount.amount || amount.amount_full || ""; - } - - var alt = altMap || global.__GOA_ALT_UNITS || DEFAULT_ALT; - var p = parseAmount(amount); - var raw = baseStr(p.cur, p.val); - // Foreign currencies must not pick up Kilo-GOA / Mega-GOA labels - var baseName = (alt && alt["0"]) || p.cur; - var curU = String(p.cur || "").toUpperCase(); - var baseU = String(baseName || "").toUpperCase(); - if (curU && curU !== "GOA" && (baseU === "GOA" || baseU.indexOf("GOA") !== -1)) { - return { display: raw, title: raw, raw: raw, usedAlt: false }; - } - if (p.val === 0) { - return { display: raw, title: raw, raw: raw, usedAlt: false }; - } - if (Math.abs(p.val) < THRESHOLD) { - return { display: raw, title: raw, raw: raw, usedAlt: false }; - } - - var scales = []; - Object.keys(alt || {}).forEach(function (k) { - var n = parseInt(k, 10); - if (!isNaN(n)) scales.push({ sc: n, name: String(alt[k]) }); - }); - scales.sort(function (a, b) { return b.sc - a.sc; }); - - var abs = Math.abs(p.val); - var chosen = null; - for (var i = 0; i < scales.length; i++) { - var unit = Math.pow(10, scales[i].sc); - if (!(unit > 0)) continue; - var coeff = abs / unit; - if (coeff >= 1) { - chosen = { - sc: scales[i].sc, - name: scales[i].name, - coeff: p.val >= 0 ? coeff : -coeff - }; - break; - } - } - if (!chosen || chosen.sc === 0) { - return { display: raw, title: raw, raw: raw, usedAlt: false }; - } - var short = fmtCoeff(chosen.coeff) + " " + chosen.name; - return { - display: short, - title: short + " (" + raw + ")", - raw: raw, - usedAlt: true - }; - } - - function setText(el, amount, altMap) { - if (!el) return; - var f = format(amount, altMap); - el.textContent = f.display; - if (f.title && f.title !== f.display) el.setAttribute("title", f.title); - else el.removeAttribute("title"); - } - - function setById(id, amount, altMap) { - setText(document.getElementById(id), amount, altMap); - } - - /** Prefer amount_alt from stats row, else format amount. */ - function pick(rowOrAmount, altMap) { - if (rowOrAmount && typeof rowOrAmount === "object") { - if (rowOrAmount.amount_alt) { - return format({ - amount: rowOrAmount.amount, - amount_alt: rowOrAmount.amount_alt, - amount_full: rowOrAmount.amount_full - }, altMap); - } - return format(rowOrAmount.amount || rowOrAmount.total_amount, altMap); - } - return format(rowOrAmount, altMap); - } - - function rememberAlt(stats) { - if (stats && stats.alt_unit_names && typeof stats.alt_unit_names === "object") { - global.__GOA_ALT_UNITS = stats.alt_unit_names; - } - } - - global.GoaAmount = { - format: format, - setText: setText, - setById: setById, - pick: pick, - rememberAlt: rememberAlt, - DEFAULT_ALT: DEFAULT_ALT, - THRESHOLD: THRESHOLD - }; -})(typeof window !== "undefined" ? window : globalThis); diff --git a/configs/bank-landing/index.html b/configs/bank-landing/index.html index bd47143..f172304 100644 --- a/configs/bank-landing/index.html +++ b/configs/bank-landing/index.html @@ -1491,34 +1491,6 @@ tw run-until-done && tw balance - - - -