/** * Вкладка «Итоги» на /reports. */ (function (global) { const COPY = () => global.WespAnalyticsCopy || {}; function escapeHtml(value) { return String(value ?? "") .replace(/&/g, "&") .replace(//g, ">"); } function getDateParams() { const from = document.getElementById("date-from")?.value || ""; const to = document.getElementById("date-to")?.value || ""; return { date_from: from, date_to: to }; } function buildUrl() { const params = global.WespReportsFilters?.buildAnalyticsParams?.() || new URLSearchParams(getDateParams()); return `/api/analytics/finance?${params.toString()}`; } function valueToneClass(kind) { if (kind === "loss") return "analytics-kpi-card__value--loss"; if (kind === "risk") return "analytics-kpi-card__value--risk"; return ""; } function netHint(data) { const c = COPY().summary || {}; if (data.dominantIssue === "overload") return c.netHintOverload || ""; if (data.dominantIssue === "underload") return c.netHintUnderload || ""; return c.netHintBalanced || ""; } function overloadHint(data) { const c = COPY().summary || {}; if (Number(data.overloadRub) > 0) return c.overloadHint || ""; return c.overloadHintZero || c.overloadHint || ""; } function underloadHint(data) { const c = COPY().summary || {}; if (Number(data.underloadRub) > 0) return c.underloadHint || ""; return c.underloadHintZero || c.underloadHint || ""; } function netTone(data) { if (data.dominantIssue === "overload") return "loss"; if (data.dominantIssue === "underload") return "risk"; return ""; } function renderTopBar(data) { const top = data.topComponents || []; if (!top.length) { return `
${escapeHtml(COPY().summary?.empty || "")}
`; } const maxVal = Math.max( ...top.map((row) => Math.max(row.overloadRub, row.underloadRub)), 1 ); const rows = top .map((row) => { const isOverload = row.overloadRub > row.underloadRub; const main = isOverload ? `${COPY().formatRub(row.overloadRub)} перерасход` : `${COPY().formatRub(row.underloadRub)} недогруз`; const tone = isOverload ? "analytics-top-row__value--loss" : "analytics-top-row__value--risk"; const widthPct = Math.round( Math.min(100, (Math.max(row.overloadRub, row.underloadRub) / maxVal) * 1000) ) / 10; return ( `Загрузка итогов…
${escapeHtml(err.message)}