v69: откат к v62 (рабочая версия)

This commit is contained in:
Dauren777 2026-06-09 15:19:50 +00:00
parent 200b92bf56
commit e5388e99ca

View File

@ -202,7 +202,6 @@ function renderAn(){
var all=ev||[],done=all.filter(function(e){return e.s==="done"}),late=all.filter(function(e){return e.s==="late"}),warn=all.filter(function(e){return e.s==="warn"}),wait=all.filter(function(e){return e.s==="wait"});
var dp=all.length?Math.round(done.length/all.length*100):0;
var h="<div class='stats'><div class='stat'><div class='n'>"+all.length+"</div><div class='l'>Всего</div></div><div class='stat g'><div class='n'>"+done.length+"</div><div class='l'>Исполнено ("+dp+"%)</div></div><div class='stat a'><div class='n'>"+warn.length+"</div><div class='l'>В процессе</div></div><div class='stat r'><div class='n'>"+late.length+"</div><div class='l'>Просрочено</div></div><div class='stat'><div class='n'>"+wait.length+"</div><div class='l'>Не начато</div></div></div>";
h+="<div class='fr' style='margin-bottom:16px'><button class='btn btn-sm' onclick='dAnCSV()'>📥 Скачать CSV (все)</button><button class='btn btn-sm btn-ghost' onclick='dAnHTML()'>📄 Скачать HTML (все)</button></div>";
// Chart
h+="<div class='card'><h3>Динамика по кварталам</h3><div class='chart-bar'><div style='height:55%;background:var(--green)'></div><div style='height:70%;background:var(--green)'></div><div style='height:82%;background:var(--cyan)'></div><div style='height:"+dp+"%;background:var(--cyan)'></div></div><div style='display:flex;gap:8px;padding:8px 0 0;font-size:11px;color:var(--gray-500);text-align:center'><span style='flex:1'>Q1 факт</span><span style='flex:1'>Q2 прогноз</span><span style='flex:1'>Q3 план</span><span style='flex:1'>Q4 цель</span></div></div>";
// Branch ranking
@ -221,18 +220,16 @@ function nu(){var all=ev||[],n=[],now=new Date();all.forEach(function(e){if(e.s=
document.getElementById("nc").textContent=n.length;document.getElementById("nc").style.display=n.length?"inline-block":"none";
document.getElementById("nd").innerHTML=n.length?n.map(function(x){return"<div class='it'><b>"+x.c+" "+esc(x.m)+"</b><span>Срок: "+x.t+"</span></div>"}).join(""):"<div class='it' style='text-align:center;color:var(--gray-500)'>Нет уведомлений</div>"}
function dAnCSV(){var all=ev||[],csv="\uFEFF№;Филиал;Мероприятие;Подпункты;Раздел;Статус;Прогресс;Срок;Осталось;Факт;Описание\n";all.forEach(function(e){var rep="";var d=getMD(e.id,-1);for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].report)rep+=d[k].report.replace(/"/g,'""')+"; ";csv+=e.id+";"+br[e.b]+";\""+e.t.replace(/"/g,'""')+"\";"+(e.sub?e.sub.length:"—")+";"+sec[e.sec]+";"+st[e.s]+";"+e.p+"%;"+e.due+";"+daysLeft(e).replace(/<[^>]*>/g,"")+";"+(e.done||"—")+";\""+rep+"\"\n"});var a=document.createElement("a");a.href=URL.createObjectURL(new Blob([csv]));a.download="analitika.csv";a.click()}
function dAnHTML(){var all=ev||[];var h="<!DOCTYPE html><html><head><meta charset='utf-8'><title>Аналитика ПБ</title><style>body{font:13px/1.5 Arial;max-width:1100px;margin:0 auto;padding:24px}h1{color:#0B1A2E}h2{color:#00B4D8;margin-top:24px}table{width:100%;border-collapse:collapse;margin-bottom:16px}th,td{padding:8px 12px;text-align:left;font-size:12px;border:1px solid #ddd}th{background:#0B1A2E;color:#fff;font-weight:600}.g{color:#10B981}.a{color:#F59E0B}.r{color:#EF4444}.w{color:#64748B}.done td{background:#f0fff4}.late td{background:#fff5f5}</style></head><body><h1>📊 Аналитика ПБ — все мероприятия</h1><p>Сформирован: "+new Date().toLocaleDateString()+"</p><table><tr><th></th><th>Мероприятие</th><th>Подпункты</th><th>Филиал</th><th>Раздел</th><th>Статус</th><th>Срок</th><th>Осталось</th><th>Факт</th></tr>";
all.forEach(function(e){var cl=e.s==="done"?"done":e.s==="late"?"late":"";h+="<tr class='"+cl+"'><td>"+e.id+"</td><td>"+esc(e.t)+"</td><td>"+(e.sub?e.sub.length:"—")+"</td><td>"+esc(br[e.b])+"</td><td>"+sec[e.sec]+"</td><td><b class='"+{done:"g",warn:"a",late:"r",wait:"w"}[e.s]+"'>"+st[e.s]+"</b></td><td>"+e.due+"</td><td>"+daysLeft(e).replace(/<[^>]*>/g,"")+"</td><td>"+(e.done||"—")+"</td></tr>"});
h+="</table></body></html>";
try{var a=document.createElement("a");a.href=URL.createObjectURL(new Blob(["\uFEFF"+h],{type:"text/html"}));a.download="analitika.html";a.click()}catch(e){alert("Слишком большой")}}
// ===== REPORTS =====
function renderRp(){var b=0;for(var i=0;i<localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf("sf_")===0)b+=localStorage.getItem(k).length*2}
var h="<div class='card'><h3>📥 Сводный отчёт</h3><div class='fr'><select id='rf'>";for(var i=0;i<ms.length;i++)h+="<option value='"+i+"'>"+M(i)+"</option>";
var h="<div class='card'><h3>Сводный отчёт</h3><div class='fr'><select id='rf'>";for(var i=0;i<ms.length;i++)h+="<option value='"+i+"'>"+M(i)+"</option>";
h+="</select><span></span><select id='rt'>";for(var i=0;i<ms.length;i++)h+="<option value='"+i+"'"+(i===11?" selected":"")+">"+M(i)+"</option>";
h+="</select><button class='btn btn-sm' onclick='dCSV()'>CSV</button><button class='btn btn-sm' onclick='dHTML()'>HTML</button></div>";
h+="<p style='font-size:12px;color:var(--gray-500);margin-bottom:10px'>Хранилище: "+(b>1048576?(b/1048576).toFixed(1)+" МБ":(b/1024).toFixed(0)+" КБ")+"</p>";
h+="<button class='btn btn-sm btn-gn' onclick='exp()'>💾 Сохранить всё</button> <button class='btn btn-sm btn-ghost' onclick=\"document.getElementById('if').click()\">📥 Загрузить</button> <input type='file' id='if' accept='.json' style='display:none' onchange='imp(this)'> <button class='btn btn-sm btn-red' onclick='clr()'>🗑 Очистить</button></div>";
function dDOC_removed(){}//placeholder
document.getElementById("pg-rp").innerHTML=h}
function dCSV(){var f=parseInt(document.getElementById("rf").value),t=parseInt(document.getElementById("rt").value),all=ev||[],csv="\uFEFF№;Филиал;Мероприятие;Статус;Осталось;Срок\n";all.forEach(function(e){csv+=e.id+";"+br[e.b]+";\""+e.t.replace(/"/g,'""')+"\";"+st[e.s]+";"+daysLeft(e).replace(/<[^>]*>/g,"")+";"+e.due+"\n"});var a=document.createElement("a");a.href=URL.createObjectURL(new Blob([csv]));a.download="otchet.csv";a.click()}
function dHTML(){var f=parseInt(document.getElementById("rf").value),t=parseInt(document.getElementById("rt").value),all=ev||[],h="<!DOCTYPE html><html><head><meta charset='utf-8'><title>Отчёт ПБ</title><style>body{font:13px/1.5 Arial;max-width:1000px;margin:0 auto;padding:24px}.ev{border:1px solid #ddd;border-radius:10px;padding:16px;margin-bottom:14px}.badge{display:inline-block;padding:3px 8px;border-radius:4px;font-size:10px;font-weight:700}.g{background:#D1FAE5;color:#065F46}.a{background:#FEF3C7;color:#92400E}.r{background:#FEE2E2;color:#991B1B}.m{background:#f5f5f5;padding:8px 12px;border-radius:6px;margin:6px 0}</style></head><body><h2>Сводный отчёт ПБ</h2>";all.forEach(function(e){var cl={done:"g",warn:"a",late:"r",wait:""}[e.s];h+="<div class='ev'><h3>"+e.id+". "+esc(e.t)+"</h3><p>"+br[e.b]+" | "+sec[e.sec]+" | Срок: "+e.due+" | <span class='badge "+cl+"'>"+st[e.s]+"</span></p>";var d=getMD(e.id,-1);for(var i=f;i<=t;i++){var m=ms[i];if(d[m]&&d[m].report)h+="<div class='m'><b>"+M(i)+"</b><p>"+esc(d[m].report)+"</p></div>"}if(e.sub)e.sub.forEach(function(s,si){var sd=getMD(e.id,si);for(var i=f;i<=t;i++){var m=ms[i];if(sd[m]&&sd[m].report)h+="<div class='m' style='border-left:3px solid #00B4D8'><b>"+s.l+") "+M(i)+"</b><p>"+esc(sd[m].report)+"</p></div>"}});h+="</div>"});h+="</body></html>";try{var a=document.createElement("a");a.href=URL.createObjectURL(new Blob(["\uFEFF"+h],{type:"text/html"}));a.download="otchet.html";a.click()}catch(e){alert("Слишком большой отчёт")}}
function exp(){var d={events:ev,date:new Date().toISOString(),files:{},sc:{}};for(var i=0;i<localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf("sf_")===0)d.files[k]=localStorage.getItem(k);if(k.indexOf("ss_")===0)d.sc[k]=localStorage.getItem(k)}var a=document.createElement("a");a.href=URL.createObjectURL(new Blob([JSON.stringify(d)]));a.download="backup.json";a.click()}
function imp(inp){if(!inp.files.length)return;var r=new FileReader();r.onload=function(evt){try{var d=JSON.parse(evt.target.result);ev=d.events;saveEv();for(var k in d.files)localStorage.setItem(k,d.files[k]);for(var k in d.sc)localStorage.setItem(k,d.sc[k]);alert("OK. Обновите.");location.reload()}catch(e){alert("Ошибка")}};r.readAsText(inp.files[0])}
function clr(){if(!confirm("Удалить все файлы?"))return;var ks=[];for(var i=0;i<localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf("sf_")===0||k.indexOf("ss_")===0)ks.push(k)}ks.forEach(function(k){localStorage.removeItem(k)});alert("Очищено");renderRp()}
@ -254,25 +251,18 @@ function renderAi(){
function aiAsk(){var q=(document.getElementById("aiQ").value||"").trim().toLowerCase();if(!q)return;document.getElementById("aiQ").value="";chatHistory.push({role:"user",text:"<b>Вы:</b> "+esc(q)});chatHistory.push({role:"bot",text:"<b>🤖 ИИ:</b> "+aiAnswer(q)});renderAi();var el=document.getElementById("aiChat");if(el)el.scrollTop=el.scrollHeight}
function aiAnswer(q){
var all=ev||[],now=new Date(),late=all.filter(function(e){return e.s==="late"}),done=all.filter(function(e){return e.s==="done"}),warn=all.filter(function(e){return e.s==="warn"}),dp=all.length?Math.round(done.length/all.length*100):0;
function bs(){var r=[];br.forEach(function(b,i){var it=all.filter(function(e){return e.b===i}),d=it.filter(function(e){return e.s==="done"}).length,l=it.filter(function(e){return e.s==="late"}).length;r.push({name:b,done:d,total:it.length,late:l,pct:it.length?Math.round(d/it.length*100):0})});r.sort(function(a,b){return b.pct-a.pct});return r}
function cr(e){if(e.s==="done")return{l:"отсутствует",p:0};if(e.s==="late")return{l:"критический",p:100};var s=0;var p=e.due.split(".");if(p.length===3){var d=new Date(parseInt(p[2]),parseInt(p[1])-1,parseInt(p[0])),days=Math.round((d-now)/86400000);if(days<=7)s+=40;else if(days<=14)s+=25;else if(days<=30)s+=15}if(e.p<20)s+=25;else if(e.p<50)s+=15;var md=getMD(e.id,-1),hr=false;for(var k in md)if(md.hasOwnProperty(k)&&md[k]&&md[k].report)hr=true;if(!hr)s+=20;var l=s>=60?"критический":s>=35?"высокий":s>=15?"средний":"низкий";return{l:l,p:Math.min(s,95)}}
var qq=q.toLowerCase();
if(qq.indexOf("просрочен")>=0){if(!late.length)return"Просрочек нет.";var r="<b>Просрочено "+late.length+":</b><br>";late.forEach(function(e){r+="• №"+e.id+" — "+esc(e.t.slice(0,70))+"...<br> "+br[e.b]+" | срок "+e.due+"<br>"});return r}
if(qq.indexOf("текущ")>=0||qq.indexOf("месяц")>=0){var dtm=all.filter(function(e){if(e.s==="done"||e.s==="late")return false;var p=e.due.split(".");return p.length===3&&parseInt(p[1])===(now.getMonth()+1)});return dtm.length?"<b>К завершению в этом месяце ("+dtm.length+"):</b><br>"+dtm.map(function(e){return"• №"+e.id+" — "+esc(e.t.slice(0,60))+"... ("+e.due+")"}).join("<br>"):"В этом месяце срочных мероприятий нет."}
if(qq.indexOf("риск")>=0||qq.indexOf("прогноз")>=0){var risks=[];all.forEach(function(e){if(e.s!=="done"){var c=cr(e);if(c.l!=="низкий")risks.push({e:e,risk:c})}});risks.sort(function(a,b){return b.risk.p-a.risk.p});if(!risks.length)return"Рисков не выявлено.";var r="<b>Прогноз рисков:</b><br>";risks.slice(0,8).forEach(function(x){r+="• <b>№"+x.e.id+"</b> — "+x.risk.p+"% ("+x.risk.l+") — "+esc(x.e.t.slice(0,50))+"...<br>"});return r}
if(qq.indexOf("рейтинг")>=0||qq.indexOf("филиал")>=0||qq.indexOf("сравн")>=0){var bsd=bs(),r="<b>Рейтинг филиалов:</b><br>";bsd.forEach(function(b,i){r+=(i+1)+". "+b.name+" — "+b.pct+"% ("+b.done+"/"+b.total+(b.late?", просрочено:"+b.late:"")+")<br>"});return r}
if(qq.indexOf("сводка")>=0||qq.indexOf("ежедн")>=0||qq.indexOf("утр")>=0){return"<b>Сводка на "+new Date().toLocaleDateString()+"</b><br>• План: "+dp+"% ("+done.length+"/"+all.length+")<br>• Просрочено: "+late.length+"<br>В процессе: "+warn.length+"<br>Не начато: "+(all.length-done.length-late.length-warn.length)+"<br><br><b>→ Рекомендации:</b><br>"+(late.length?"• Эскалировать просрочки<br>":"")+"• Проверить подтверждающие документы<br>• Запросить отчёты у отстающих";}
if(qq.indexOf("советник")>=0||qq.indexOf("директор")>=0){var bsd=bs(),w3=bsd.slice(-3).map(function(b){return b.name+" ("+b.pct+"%)"}).join(", ");return"<b>👔 Советник директора по ПБ:</b><br><br><b>Выводы:</b><br>• План: "+dp+"%. "+(dp>=70?"Темп хороший.":dp>=40?"Темп средний.":"Критично!")+"<br>• Просрочено: "+late.length+"<br><br><b>Риски:</b> "+w3+"<br><br><b>Решения:</b><br>1. Совещание с отстающими филиалами<br>2. Еженедельный контроль просрочек<br>3. Запросить документы у всех в статусе «В процессе»<br>4. Усилить ИИ-мониторинг<br>5. Доклад Правлению";}
if(qq.indexOf("почему")>=0||qq.indexOf("причин")>=0){return"<b>Причины отставания:</b><br>• Отсутствие текстовых отчётов<br>• Нет подтверждающих файлов<br>• Низкая активность исполнителей<br>• Приближение сроков без обновлений<br><br><b>→ Решение:</b> активизировать загрузку отчётов и документов.";}
if(qq.indexOf("проверк")>=0||qq.indexOf("качеств")>=0||qq.indexOf("подтвержд")>=0){var nf=all.filter(function(e){if(e.s==="done")return false;var d=getMD(e.id,-1),h=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].files&&d[k].files.length)h=true;return !h});return"<b>Проверка качества:</b><br>• Без файлов: "+nf.length+" мероприятий<br>• Полнота: "+(100-Math.round(nf.length/all.length*100))+"%<br><br><b>→ Рекомендация:</b> запросить недостающие документы.";}
if(qq.indexOf("аудит")>=0)return"<b>🔎 AI-аудитор:</b><br>• "+late.length+" мероприятий с нарушением сроков<br>• Рекомендуется аудит отстающих филиалов<br>• Проверить: обучение, медосмотры, СИЗ, инструктажи";
if(qq.indexOf("360")>=0||qq.indexOf("комплекс")>=0){var bsd=bs();return"<b>ПБ 360°:</b><br>• План: "+dp+"%<br>• Зона риска: "+bsd.filter(function(b){return b.pct<50}).map(function(b){return b.name}).join(", ")+"<br>• Приоритет: устранить просрочки, активизировать отчётность";}
if(qq.indexOf("показател")>=0||qq.indexOf("kpi")>=0){var bsd=bs();return"<b>KPI безопасности:</b><br>• План: "+dp+"%<br>• Лучший: "+bsd[0].name+" ("+bsd[0].pct+"%)<br>• Худший: "+bsd[bsd.length-1].name+" ("+bsd[bsd.length-1].pct+"%)<br>• Просрочено: "+late.length;}
if(qq.indexOf("статус")>=0||qq.indexOf("пункт")>=0){var num=q.match(/\d+/);if(num){var e=null;for(var i=0;i<all.length;i++)if(all[i].id===parseInt(num[0])){e=all[i];break}if(e){var c=cr(e);return"<b>Пункт №"+e.id+"</b><br>Статус: "+st[e.s]+"<br>Филиал: "+br[e.b]+"<br>Срок: "+e.due+"<br>Риск: "+c.l+" ("+c.p+"%)";}return"Пункт №"+num[0]+" не найден.";}}
if(qq.indexOf("привет")>=0||qq.indexOf("здрав")>=0||qq.indexOf("помощ")>=0)return"👋 Я ИИ-помощник по ПБ АО «Казахтелеком». Спросите: «сводка», «риски», «рейтинг филиалов», «советник», «статус пункта N».";
return"Спросите: <b>сводка</b> · <b>риски</b> · <b>рейтинг филиалов</b> · <b>советник</b> · <b>просроченные</b> · <b>проверка</b> · <b>аудит</b> · <b>360</b> · <b>статус пункта N</b> · <b>причины</b> · <b>показатели</b>";
function aiAnswer(q){var all=ev||[],now=new Date(),late=all.filter(function(e){return e.s==="late"}),done=all.filter(function(e){return e.s==="done"}),warn=all.filter(function(e){return e.s==="warn"}),wait=all.filter(function(e){return e.s==="wait"});
// Query routing
if(q.indexOf("просрочен")>=0||q.indexOf("просрочк")>=0||q.indexOf("сорван")>=0){if(!late.length)return"Просроченных мероприятий нет. План выполняется без отклонений.";var r="<b>Просрочено "+late.length+" мероприятий:</b><br>";late.forEach(function(e){r+="• №"+e.id+" — "+esc(e.t.slice(0,80))+"...<br> Филиал: "+br[e.b]+", срок: "+e.due+"<br>"});r+="<br><b>Рекомендация:</b> эскалировать руководителям филиалов, провести совещание.";return r}
if(q.indexOf("риск")>=0||q.indexOf("невыполнен")>=0||q.indexOf("угроз")>=0){var risks=[];all.forEach(function(e){if(e.s!=="done"&&e.s!=="late"){var p=e.due.split(".");if(p.length===3){var d=new Date(parseInt(p[2]),parseInt(p[1])-1,parseInt(p[0]));var days=Math.round((d-now)/86400000);if(days<=30)risks.push({e:e,days:days})}}});risks.sort(function(a,b){return a.days-b.days});if(!risks.length)return"Мероприятий с риском невыполнения в ближайшие 30 дней не выявлено.";var r="<b>Выявлено "+risks.length+" мероприятий с риском:</b><br>";risks.slice(0,8).forEach(function(x){r+="• №"+x.e.id+" — "+x.days+" дн. — "+esc(x.e.t.slice(0,60))+"...<br>"});return r}
if(q.indexOf("статус")>=0||q.indexOf("пункт")>=0||q.indexOf("мероприятие")>=0){var num=q.match(/\d+/);if(num){var e=null;for(var i=0;i<all.length;i++)if(all[i].id===parseInt(num[0])){e=all[i];break}if(e){var r="<b>Пункт №"+e.id+"</b><br>Статус: "+st[e.s]+"<br>Филиал: "+br[e.b]+"<br>Срок: "+e.due+"<br>Осталось: "+daysLeft(e).replace(/<[^>]*>/g,"")+"<br>Ответственный: "+nl(e.r);if(e.sub){r+="<br>Подпункты: "+e.sub.length+" шт."}return r}return"Пункт №"+num[0]+" не найден в плане."}}
if(q.indexOf("сводка")>=0||q.indexOf("руководств")>=0||q.indexOf("правлен")>=0||q.indexOf("итог")>=0||q.indexOf("обзор")>=0){var dp=all.length?Math.round(done.length/all.length*100):0;var r="<b>Сводка для руководства</b><br>• План выполнен на "+dp+"% ("+done.length+"/"+all.length+")<br>В процессе: "+warn.length+"<br>Не начато: "+wait.length+"<br>• Просрочено: "+late.length+"<br>";if(late.length)r+="<br><b>Требует внимания:</b> эскалация просрочек.";else r+="<br>Ситуация под контролем.";return r}
if(q.indexOf("рейтинг")>=0||q.indexOf("филиал")>=0||q.indexOf("отста")>=0||q.indexOf("худш")>=0||q.indexOf("лучш")>=0){var brData=[];br.forEach(function(b,i){var it=all.filter(function(e){return e.b===i});var d=it.filter(function(e){return e.s==="done"}).length;var l=it.filter(function(e){return e.s==="late"}).length;brData.push({name:b,done:d,total:it.length,late:l,pct:it.length?Math.round(d/it.length*100):0})});brData.sort(function(a,b){return b.pct-a.pct});var r="<b>Рейтинг филиалов:</b><br>";brData.forEach(function(b,i){r+=(i+1)+". "+b.name+" — "+b.pct+"% ("+b.done+"/"+b.total+(b.late?", просрочено: "+b.late:"")+")<br>"});return r}
if(q.indexOf("график")>=0||q.indexOf("диаграм")>=0||q.indexOf("динамик")>=0){return"График доступен на вкладке «Аналитика». Переключитесь для просмотра визуализации."}
if(q.indexOf("документ")>=0||q.indexOf("файл")>=0){var tf=0;all.forEach(function(e){var d=getMD(e.id,-1);for(var k in d)if(d.hasOwnProperty(k))tf+=(d[k].files||[]).length;if(e.sub)e.sub.forEach(function(si){var sd=getMD(e.id,si);for(var k in sd)if(sd.hasOwnProperty(k))tf+=(sd[k].files||[]).length})});return"Всего загружено <b>"+tf+"</b> документов. Детальная информация — на вкладке «Отчётность»."}
if(q.indexOf("срок")>=0||q.indexOf("дедлайн")>=0){var near=[];all.forEach(function(e){if(e.s!=="done"&&e.s!=="late"){var p=e.due.split(".");if(p.length===3){var d=new Date(parseInt(p[2]),parseInt(p[1])-1,parseInt(p[0]));var days=Math.round((d-now)/86400000);if(days<=14)near.push({e:e,days:days})}}});near.sort(function(a,b){return a.days-b.days});if(!near.length)return"Ближайших сроков исполнения в течение 14 дней нет.";var r="<b>Ближайшие сроки (≤14 дней):</b><br>";near.forEach(function(x){r+="• №"+x.e.id+" — "+x.days+" дн. — "+esc(x.e.t.slice(0,50))+"...<br>"});return r}
if(q.indexOf("привет")>=0||q.indexOf("здрав")>=0)return"Здравствуйте! Я ИИ-помощник по производственной безопасности. Спросите о статусе мероприятий, просрочках, рисках, рейтинге филиалов или сводке для руководства.";
return"Я могу ответить на вопросы:<br><b>«просроченные»</b> — список просрочек<br><b>«риски»</b> — прогноз рисков невыполнения<br><b>«сводка»</b> — сводка для руководства<br><b>«статус пункта N»</b> — статус мероприятия<br><b>«рейтинг филиалов»</b> — кто лучший/худший<br><b>«сроки»</b> — ближайшие дедлайны<br><b>«документы»</b> — статистика загрузок";
}
// ===== EDIT (no regions) =====
@ -294,7 +284,7 @@ function oe(id,mi,si){
h+="<label>Описание</label><textarea id='mr2_s"+i+"'>"+esc(scd.report||"")+"</textarea>";
h+="<label>Количество</label><input type='number' id='mq2_s"+i+"' min='0' value='"+(scd.qty||0)+"'>";
scfs.forEach(function(f,fi){h+="<div class='fl'><span class='nm' onclick='dlF2("+e.id+","+cm+","+fi+","+i+")'>📄 "+esc(f.name)+"</span><span class='sz'>"+(f.size/1024).toFixed(0)+" КБ · "+(f.date||"")+"</span><button onclick='rmF2("+e.id+","+cm+","+fi+","+i+")' style='border:none;color:var(--red);cursor:pointer;font-size:14px'>×</button></div>"});
h+="<div class='up'><input type='file' id='fi2_s"+i+"' multiple><button class='btn btn-sm' id='ub2_s"+i+"' onclick='upF2("+e.id+","+cm+","+i+")' style='margin-top:8px'>📤 Загрузить</button><p style='font-size:10px;color:var(--gray-500);margin-top:6px'>PDF, DOC/DOCX, XLS/XLSX, JPG/PNG, PPT/PPTX · до 3 МБ</p></div></div>";
h+="<div class='up'><input type='file' id='fi2_s"+i+"' multiple><button class='btn btn-sm' id='ub2_s"+i+"' onclick='upF2("+e.id+","+cm+","+i+")' style='margin-top:8px'>📤 Загрузить</button></div></div>";
}
});
h+="<label>Месяц</label><div class='mt'>";ms.forEach(function(_,i){h+="<span class='"+(i===cm?"on":"")+"' onclick='oe("+e.id+","+i+","+esi+")'>"+M(i)+"</span>"});h+="</div>";
@ -305,7 +295,7 @@ function oe(id,mi,si){
h+="<label>Описание</label><textarea id='mr2' placeholder='Опишите проведённую работу, результаты, проблемы...'>"+esc(cd.report||"")+"</textarea>";
h+="<label>Количество</label><input type='number' id='mq2' min='0' value='"+(cd.qty||0)+"'>";
cfs.forEach(function(f,i){h+="<div class='fl'><span class='nm' onclick='dlF2("+e.id+","+cm+","+i+",-1)'>📄 "+esc(f.name)+"</span><span class='sz'>"+(f.size/1024).toFixed(0)+" КБ · "+(f.date||"")+"</span><button onclick='rmF2("+e.id+","+cm+","+i+",-1)' style='border:none;color:var(--red);cursor:pointer;font-size:14px'>×</button></div>"});
h+="<div class='up'><input type='file' id='fi2' multiple><button class='btn btn-sm' id='ub2' onclick='upF2("+e.id+","+cm+",-1)' style='margin-top:8px'>📤 Загрузить</button><p style='font-size:10px;color:var(--gray-500);margin-top:6px'>PDF, DOC/DOCX, XLS/XLSX, JPG/PNG, PPT/PPTX · до 3 МБ</p></div>";
h+="<div class='up'><input type='file' id='fi2' multiple><button class='btn btn-sm' id='ub2' onclick='upF2("+e.id+","+cm+",-1)' style='margin-top:8px'>📤 Загрузить</button><p style='font-size:10px;color:var(--gray-500);margin-top:6px'>PDF, DOC, XLS, фото, презентации</p></div>";
}
h+="<div class='ai-block'><b>🤖 ИИ-анализ:</b> "+esc(e.ai)+"</div>";