diff --git a/config.json b/config.json new file mode 100644 index 0000000..9e8f518 --- /dev/null +++ b/config.json @@ -0,0 +1,85 @@ +{ + "archetype": "queue", + "product": { + "name": "Топ услуг B2C", + "purpose": "Дашборд топ-50 услуг по регионам · Июль 2026", + "entity": "услуга", + "view": "management" + }, + "statuses": { + "top": { "label": "Топ-10", "tone": "ok" }, + "middle": { "label": "11-30", "tone": "info" }, + "bottom": { "label": "31-50", "tone": "info" } + }, + "scenario": { + "headline": "Рейтинг услуг", + "control": "Посмотреть детали" + }, + "kpis": [ + { "value": "1 147 079", "label": "Покупок всего", "hint": "за июль 2026" }, + { "value": "14", "label": "Регионов", "hint": "в топ-50" }, + { "value": "96 183", "label": "Лидер по покупкам", "hint": "Аренда STB, Алматы" }, + { "value": "238,5 млн", "label": "Лидер по сумме", "hint": "ШПД FTTx, Астана" } + ], + "table": { + "columns": [ + { "key": "rank", "label": "#", "type": "num", "align": "right", "sortable": true }, + { "key": "region", "label": "Регион", "type": "text", "sortable": true }, + { "key": "service", "label": "Услуга", "type": "text", "sortable": true }, + { "key": "qty", "label": "Покупок", "type": "num", "align": "right", "sortable": true }, + { "key": "amount", "label": "Сумма", "type": "num", "align": "right", "sortable": true } + ], + "rows": [ + { "rank": 1, "region": "Астана", "service": "B2C Абонплата ШПД по FTTx ГТС (New)", "qty": 37372, "amount": 238463786.09, "status": "top" }, + { "rank": 2, "region": "г.Алматы", "service": "B2C Абонплата ШПД по FTTx ГТС (New)", "qty": 39671, "amount": 237005698.16, "status": "top" }, + { "rank": 3, "region": "г.Алматы", "service": "Абонплата ШПД по FTTx для B2C", "qty": 35588, "amount": 152893561.28, "status": "top" }, + { "rank": 4, "region": "Астана", "service": "2025 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 35637, "amount": 136187938.99, "status": "top" }, + { "rank": 5, "region": "Астана", "service": "B2C TV Plus Абонплата Full ГТС", "qty": 47661, "amount": 132060372.93, "status": "top" }, + { "rank": 6, "region": "Астана", "service": "2021 B2C Абонплата за мобильный номер Kcell GSM закр.", "qty": 61700, "amount": 123403164.43, "status": "top" }, + { "rank": 7, "region": "г.Алматы", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 57378, "amount": 110497209.55, "status": "top" }, + { "rank": 8, "region": "г.Алматы", "service": "2025 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 29997, "amount": 106749675.59, "status": "top" }, + { "rank": 9, "region": "Астана", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 52504, "amount": 99235780.41, "status": "top" }, + { "rank": 10, "region": "Астана", "service": "2022 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 36946, "amount": 96430127.27, "status": "top" }, + { "rank": 11, "region": "Астана", "service": "Абонплата ШПД по FTTx для B2C", "qty": 19565, "amount": 88834659.73, "status": "middle" }, + { "rank": 12, "region": "Астана", "service": "2024 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 22167, "amount": 83549325.34, "status": "middle" }, + { "rank": 13, "region": "г.Алматы", "service": "B2C TV Plus Абонплата Full ГТС", "qty": 31221, "amount": 83511013.05, "status": "middle" }, + { "rank": 14, "region": "г.Алматы", "service": "2021 B2C Абонплата за мобильный номер Kcell GSM закр.", "qty": 40838, "amount": 82748215.46, "status": "middle" }, + { "rank": 15, "region": "г.Семей", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 41486, "amount": 76400272.02, "status": "middle" }, + { "rank": 16, "region": "Астана", "service": "TV Plus Абонплата за Премиальный пакет ГТС", "qty": 29210, "amount": 71278165.09, "status": "middle" }, + { "rank": 17, "region": "г.Алматы", "service": "2022 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 24001, "amount": 62521274.30, "status": "middle" }, + { "rank": 18, "region": "Астана", "service": "2021 B2C Абонплата за мобильный номер Kcell GSM откр.", "qty": 27864, "amount": 59635624.39, "status": "middle" }, + { "rank": 19, "region": "г.Алматы", "service": "2024 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 15678, "amount": 58970815.48, "status": "middle" }, + { "rank": 20, "region": "г.Актобе", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 30641, "amount": 55819936.98, "status": "middle" }, + { "rank": 21, "region": "г.Алматы", "service": "B2C Абонплата за основной телефон ГТС", "qty": 52732, "amount": 49636818.50, "status": "middle" }, + { "rank": 22, "region": "г.Актобе", "service": "2021 B2C Абонплата за мобильный номер Kcell GSM закр.", "qty": 25178, "amount": 48000483.43, "status": "middle" }, + { "rank": 23, "region": "г.Алматы", "service": "TV Plus Абонплата за Премиальный пакет ГТС", "qty": 19055, "amount": 45298192.89, "status": "middle" }, + { "rank": 24, "region": "г.Павлодар", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 23334, "amount": 44857518.84, "status": "middle" }, + { "rank": 25, "region": "г.Алматы", "service": "B2C TV Plus Аренда STB оператора новое", "qty": 96183, "amount": 43252519.71, "status": "middle" }, + { "rank": 26, "region": "г.Караганда", "service": "Абонплата ШПД по FTTx для B2C", "qty": 8916, "amount": 41624727.66, "status": "middle" }, + { "rank": 27, "region": "Астана", "service": "2026 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 13685, "amount": 41618770.34, "status": "middle" }, + { "rank": 28, "region": "г.Алматы", "service": "2018 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 11568, "amount": 40199964.35, "status": "middle" }, + { "rank": 29, "region": "г.Тараз", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 21880, "amount": 39564813.34, "status": "middle" }, + { "rank": 30, "region": "г.Алматы", "service": "Абонплата ШПД по ADSL для B2C", "qty": 10710, "amount": 36238454.72, "status": "middle" }, + { "rank": 31, "region": "г.Алматы", "service": "2020 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 12148, "amount": 36010481.68, "status": "bottom" }, + { "rank": 32, "region": "г.Усть-Каменогорск", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 18362, "amount": 35883527.39, "status": "bottom" }, + { "rank": 33, "region": "г. Шымкент", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 19180, "amount": 35338634.51, "status": "bottom" }, + { "rank": 34, "region": "г. Шымкент", "service": "2021 B2C Абонплата за мобильный номер Kcell GSM закр.", "qty": 18945, "amount": 35138664.91, "status": "bottom" }, + { "rank": 35, "region": "Астана", "service": "B2C TV Plus Аренда STB оператора новое", "qty": 76655, "amount": 34746783.92, "status": "bottom" }, + { "rank": 36, "region": "Астана", "service": "2018 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 8705, "amount": 32905725.03, "status": "bottom" }, + { "rank": 37, "region": "г.Актобе", "service": "B2C Абонплата ШПД по FTTx ГТС (New)", "qty": 6742, "amount": 32313021.91, "status": "bottom" }, + { "rank": 38, "region": "г.Усть-Каменогорск", "service": "Абонплата ШПД по FTTx для B2C", "qty": 7269, "amount": 31834355.15, "status": "bottom" }, + { "rank": 39, "region": "г.Атырау", "service": "B2C Абонплата ШПД по FTTx ГТС (New)", "qty": 5495, "amount": 31688118.61, "status": "bottom" }, + { "rank": 40, "region": "г.Усть-Каменогорск", "service": "B2C Абонплата ШПД по FTTx ГТС (New)", "qty": 5600, "amount": 31520413.53, "status": "bottom" }, + { "rank": 41, "region": "Астана", "service": "B2C Аренда оборудования ONT оператора - новое", "qty": 87071, "amount": 31220264.09, "status": "bottom" }, + { "rank": 42, "region": "г.Павлодар", "service": "B2C Абонплата ШПД по FTTx ГТС (New)", "qty": 6104, "amount": 30831455.08, "status": "bottom" }, + { "rank": 43, "region": "г.Кокшетау", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 16818, "amount": 30654924.73, "status": "bottom" }, + { "rank": 44, "region": "г.Актобе", "service": "2025 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 8613, "amount": 30562705.78, "status": "bottom" }, + { "rank": 45, "region": "г.Костанай", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 16473, "amount": 30539180.35, "status": "bottom" }, + { "rank": 46, "region": "Енбекшиказахский район", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 17347, "amount": 30429552.38, "status": "bottom" }, + { "rank": 47, "region": "г.Актобе", "service": "2022 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 11709, "amount": 30303557.00, "status": "bottom" }, + { "rank": 48, "region": "г.Кызылорда", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 16539, "amount": 29772241.67, "status": "bottom" }, + { "rank": 49, "region": "г.Алматы", "service": "2026 B2C Абонплата за Домашний интернет FTTx ГТС", "qty": 10206, "amount": 29200316.21, "status": "bottom" }, + { "rank": 50, "region": "г.Караганда", "service": "2022 B2C Абонплата за мобильный номер MT-C GSM закр.", "qty": 15714, "amount": 28837871.98, "status": "bottom" } + ] + } +} diff --git a/index.html b/index.html index 4a9706c..b1e274f 100644 --- a/index.html +++ b/index.html @@ -1,589 +1,2497 @@ - - + + - - - Топ услуг B2C по регионам - - - - + + +KT AI – прототип + + + + + - -
-
-

Топ услуг B2C по регионам

-

Данные за июль 2026 года • Источник: ClickHouse АО «Казахтелеком»

+ + + + + + + +
+ + +
+
+ + + +
+ +
+ + + +
+ + +
+
+ + +
- -
- -
-
-
Топ-10 регионов по количеству покупок
-
-
-
-
Топ-10 услуг по количеству покупок
-
-
-
- -
- -
-
- -
- - - - - - - - - - - -
#РегионУслугаКол-во покупокСумма (₸)
-
-
- +/* ---------- Список ---------- */ +S.nav = i => { state.navIndex = i; renderNav(); render(); }; +S.filter = k => { state.statusFilter = k; state.page = 1; render(); }; +S.sel = (i, on) => { if (on) state.selected.add(i); else state.selected.delete(i); render(); }; +S.clearSel = () => { state.selected.clear(); render(); }; +S.toggleSidebar = () => { const sb = $("sidebar"); sb.dataset.open = sb.dataset.open === "true" ? "false" : "true"; }; + +/* ---------- AI-панель ---------- */ +let aiOpen = false; +S.toggleAi = () => { aiOpen = !aiOpen; $("aiPanel").style.display = aiOpen ? "flex" : "none"; $("aiFab").style.display = aiOpen ? "none" : "flex"; if (aiOpen) renderAi(); }; +// Правая панель «Активность» — лента действий агента/истории решений (референс из видео Kole Jain) +S.toggleActivity = () => { + const p = $("actPanel"); + if (p.style.display !== "none") { p.style.display = "none"; return; } + const tone = t => t === "info" ? "var(--kt-ai-status-info-fg)" : toneFg(t, "var(--kt-ai-fg-faint)"); + const items = CFG.activity || []; + p.innerHTML = '
Активность
' + + '
' + items.map(a => + '
' + + '
' + esc(a.title || "") + "
" + + '
' + esc([a.time, a.ago].filter(Boolean).join(" · ")) + "
" + + ((a.who || (a.tags && a.tags.length) || a.summary || a.link) ? + '
' + + (a.who ? '
Кто' + esc(a.who) + "
" : "") + + (a.tags && a.tags.length ? '
Данные' + a.tags.map(t => '' + esc(t) + "").join("") + "
" : "") + + (a.summary ? '
' + esc(a.summary) + "
" : "") + + (a.link ? '' : "") + + "
" : "") + + "
").join("") + "
"; + p.style.display = "block"; +}; +function renderAi() { + const ai = CFG.ai || {}; + $("aiPanel").innerHTML = + '
Ассистент
' + + '
' + + '
' + msgHtml("assistant", ai.intro || "Чем помочь?") + "
" + + '
' + + '
' + (ai.suggestions || []).map(s => '").join("") + "
" + + '
' + + '
' + + 'Сгенерировано ИИ
'; +} +function msgHtml(role, text, streaming) { + if (role === "user") return '
' + esc(text) + "
"; + return '
' + + '
' + esc(text) + "
"; +} +S.aiAsk = (q, chatId) => { + q = (q || "").trim(); if (!q) return; + const ai = CFG.ai || {}; + const chat = $(chatId || "aiChat"); + if (!chat) return; + const hero = document.getElementById("convHero"); + if (hero && chatId === "convChat") { // первый вопрос: hero складывается – интро становится первым сообщением, док уезжает вниз + chat.style.display = ""; + chat.insertAdjacentHTML("beforeend", msgHtml("assistant", (CFG.ai || {}).intro || "Здравствуйте! Чем могу помочь?")); + const dock = document.getElementById("convDock"); + if (dock) hero.parentElement.appendChild(dock); + hero.remove(); + } + chat.insertAdjacentHTML("beforeend", msgHtml("user", q)); + const a = (ai.answers || {})[q] || ai.fallback || "Ответ-заглушка прототипа."; + chat.insertAdjacentHTML("beforeend", msgHtml("assistant", "", true)); + const msg = chat.lastElementChild, body = msg.querySelector(".body"); + let i = 0; + const t = setInterval(() => { + body.textContent = a.slice(0, i += 4); + chat.scrollTop = chat.scrollHeight; + if (i >= a.length) { clearInterval(t); msg.dataset.streaming = ""; } + }, 16); + chat.scrollTop = chat.scrollHeight; +}; + +/* ---------- Топбар ---------- */ +function toast(text, tone) { + const d = document.createElement("div"); + d.className = "kt-ai-toast"; d.dataset.tone = tone || ""; + d.textContent = text; + $("toasts").appendChild(d); + setTimeout(() => d.remove(), 3500); +} +$("topSearch").addEventListener("input", e => { state.query = e.target.value; state.page = 1; render(); }); +$("themeToggle").onclick = () => { + const next = document.documentElement.dataset.theme === "light" ? "dark" : "light"; + document.documentElement.dataset.theme = next; + $("themeToggle").dataset.mode = next; +}; +document.addEventListener("keydown", e => { + if (e.key === "Escape") { S.close(); S.closeModal(); S.closeMenus(); if (aiOpen) S.toggleAi(); } + // Сочетание и его подпись включаются вместе: выключил подпись — выключено и + // сочетание, иначе в продукте живёт незаявленная горячая клавиша. + if ((CFG.search || {}).shortcut !== false && + (e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "k") { e.preventDefault(); $("topSearch").focus(); } +}); + +renderTop(); renderNav(); +$("view").innerHTML = renderSkeleton(); +setTimeout(render, 400); +setTimeout(S.maybeOnboarding, 900); + + +