From 70585ea0587891f4a196aac7ca4acce342ae35c6 Mon Sep 17 00:00:00 2001 From: Moldabayev_d Date: Mon, 21 Sep 2026 09:43:13 +0000 Subject: [PATCH] =?UTF-8?q?v1.3.1:=20isDemo=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=BF=D0=BE=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=B5=D0=BC=D0=BE=20(=D1=81=D0=B1=D1=80=D0=BE?= =?UTF-8?q?=D1=81=20=D0=BF=D1=80=D0=B8=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=D0=B5/JSON-restore,=20=D0=B0=D0=B2=D1=82=D0=BE-=D1=81?= =?UTF-8?q?=D0=B1=D1=80=D0=BE=D1=81=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=B5=D0=BC=D0=BE-=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D0=BD?= =?UTF-8?q?=D0=B5=D1=82),=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B8:=20?= =?UTF-8?q?=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=20Vibe=20AI,=20import?= =?UTF-8?q?=20=E2=80=94=20=C2=AB=D0=98=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9=20=D0=B8=20=D0=BD=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D0=B2=D0=BE=D0=B2=20=D1=81=D0=BE=20=D1=81=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=BE=D0=B9=20=D0=BF=D0=BE=20=D1=81=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=BD=D0=B8=D0=B3=D0=B5=C2=BB,=20?= =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=9C=D0=BE=D0=BD=D0=B8=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=20=D0=B8=D0=B7=20header=20(monitor.html=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BC=D0=B5=D1=81=D1=82=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/index.html b/index.html index 4c95b27..e92e9ea 100644 --- a/index.html +++ b/index.html @@ -144,7 +144,7 @@ tr.overall-green td:first-child{box-shadow:inset 4px 0 0 var(--green)}

КФУ-агент

Расчёт К1–К3 по Политике финансовой устойчивости — Долг/EBITDA, EBITDA/Проценты, Долг/Капитал · версия 1.3 - Мониторинг → +
@@ -170,7 +170,7 @@ tr.overall-green td:first-child{box-shadow:inset 4px 0 0 var(--green)}
-
Учебный пример: если реестр пуст, значения — синтетические (демо). Для рабочих расчётов загрузите выгрузку СУО или отчётность на шаге 1.
+
@@ -187,7 +187,7 @@ tr.overall-green td:first-child{box-shadow:inset 4px 0 0 var(--green)}
- Берёт данные только из загруженной книги: долг/прочие/EBITDA/проценты/капитал (млн → млрд), нормативы, источники адресов. Зоны — пересчёт ПГУ. + Импорт показателей и нормативов со сверкой по сводной книге. Данные берутся только из загруженной книги: долг/прочие/EBITDA/проценты/капитал (млн → млрд), нормативы, источники адресов.
@@ -385,7 +385,7 @@ tr.overall-green td:first-child{box-shadow:inset 4px 0 0 var(--green)}
  • методика из вкладки «Отчётность МСФО»
  • -
    Функции ИИ (извлечение из отчётности, подбор строк, агент) работают при открытии файла внутри Claude. Разбор выгрузки СУО, ручной ввод, расчёт и выгрузка в Excel работают и автономно в браузере.
    +
    ИИ анализирует данные текущего реестра через сервер Vibe AI. Исходный Excel остаётся в браузере; при запросе ИИ передаются показатели и выбранные фрагменты отчётности.
    @@ -638,7 +638,7 @@ function renderPivot(){ if(!keys.length) h+='Нет данных.'; t.innerHTML=h; } -function renderAll(){ S.registry.sort(sortKeys); renderRegistry(); renderParams(); renderCalc(); renderPivot(); } +function renderAll(){ S.registry.sort(sortKeys); if(S.isDemo && !S.registry.some(r=>(r.source||'').startsWith('Демо'))){ S.isDemo=false; } $('#demoBanner').hidden = !S.isDemo; renderRegistry(); renderParams(); renderCalc(); renderPivot(); } /* ---------- export ---------- */ function calcMatrix(){ @@ -723,14 +723,14 @@ $('#btnCsv').onclick = () => { /* ---------- state save / load ---------- */ $('#btnSaveState').onclick = () => { - const data = {v:1, saved:new Date().toISOString(), params:S.params, registry:S.registry, method:$('#methodText').value, agentExtra:$('#agentExtra').value}; + const data = {v:1, saved:new Date().toISOString(), isDemo:!!S.isDemo, params:S.params, registry:S.registry, method:$('#methodText').value, agentExtra:$('#agentExtra').value}; const blob = new Blob([JSON.stringify(data,null,1)],{type:'application/json'}); const a=document.createElement('a'); a.href=URL.createObjectURL(blob); a.download='КФУ_состояние.json'; a.click(); }; $('#btnLoadState').onclick = () => $('#stateFile').click(); $('#stateFile').onchange = e => { const f=e.target.files[0]; if(!f) return; - const rd=new FileReader(); rd.onload=()=>{ try{ const d=JSON.parse(rd.result); if(d.params) S.params={...S.params,...d.params}; if(d.registry) S.registry=d.registry; if(d.method) $('#methodText').value=d.method; if(d.agentExtra) $('#agentExtra').value=d.agentExtra; renderAll(); toast('Состояние загружено'); }catch(err){ toast('Не удалось прочитать JSON: '+err.message); } }; rd.readAsText(f); e.target.value=''; + const rd=new FileReader(); rd.onload=()=>{ try{ const d=JSON.parse(rd.result); if(d.params) S.params={...S.params,...d.params}; if(d.registry) S.registry=d.registry; if(d.method) $('#methodText').value=d.method; if(d.agentExtra) $('#agentExtra').value=d.agentExtra; S.isDemo = !!(d.isDemo && S.registry.some(r=>(r.source||'').startsWith('Демо'))); renderAll(); toast('Состояние загружено'); }catch(err){ toast('Не удалось прочитать JSON: '+err.message); } }; rd.readAsText(f); e.target.value=''; }; /* ---------- demo data (synthetic) ---------- */ @@ -749,13 +749,12 @@ const DEMO_ROWS = [ {name:'АО "ФНБ "Самрук-Казына"', period:'2025', debt:0.0, guar:0.0, ebitda:0.0, interest:0.0, equity:510.0, note:'демо, без EBITDA'}, {name:'Консолидированная группа 1', period:'2025', debt:132.0, guar:8.0, ebitda:25.0, interest:9.6, equity:180.0, note:'демо, консолидация'} ]; -S._demo = false; function loadDemo(){ DEMO_ROWS.forEach(r=>addRow({name:r.name, key:keyFor(r.name), period:r.period, source:'Демо (синтетика)', debt:r.debt, guar:r.guar, ebitda:r.ebitda, interest:r.interest, equity:r.equity, note:'Синтетические данные, '+r.note})); - S._demo = true; renderAll(); + S.isDemo = true; renderAll(); toast('Демо: синтетические данные — '+DEMO_ROWS.length+' компаний'); } -function toggleDemo(){ if(S._demo){ S.registry=S.registry.filter(r=>!(r.source||'').startsWith('Демо')); S._demo=false; renderAll(); toast('Демо-данные убраны'); } else loadDemo(); } +function toggleDemo(){ if(S.isDemo && S.registry.length === S.registry.filter(r=>(r.source||'').startsWith('Демо')).length){ S.registry=S.registry.filter(r=>!(r.source||'').startsWith('Демо')); S.isDemo=false; renderAll(); toast('Демо-данные убраны'); } else loadDemo(); } $('#btnDemo').onclick = toggleDemo; /* ---------- navigation ---------- */ @@ -793,6 +792,7 @@ async function importKfuBook(file){ const missing = EXPECT.filter(k=>!names.some(n=>n.includes(k))); if(missing.length || !names.some(n=>n.includes('план'))) throw new Error('в файле нет ожидаемых листов (' + [missing.join(', '),'«План 2026»'].filter(Boolean).join(', ') + '): это не сводная книга КФУ'); const r = window.KfuWorkbook.analyzeWorkbook(wb); + S.isDemo = false; if(!r.entries || !r.entries.length) throw new Error('в книге нет распознанных записей (листы компаний пустые?)'); const bad = r.entries.filter(x => x.debt==null && x.ebitda==null && x.equity==null && x.intExp==null); if(bad.length) throw new Error('по ' + bad.length + ' компаниям не найдено ни одного показателя (' + bad.map(x=>x.name).slice(0,4).join(', ') + '…) — проверьте файл');