diff --git a/index.html b/index.html
index 31e0204..b442bd8 100644
--- a/index.html
+++ b/index.html
@@ -257,18 +257,103 @@ function renderAi(){
function aiAsk(){var q=(document.getElementById("aiQ").value||"").trim().toLowerCase();if(!q)return;document.getElementById("aiQ").value="";chatHistory.push({role:"user",text:"Вы: "+esc(q)});chatHistory.push({role:"bot",text:"🤖 ИИ: "+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"}),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="Просрочено "+late.length+" мероприятий:
";late.forEach(function(e){r+="• №"+e.id+" — "+esc(e.t.slice(0,80))+"...
Филиал: "+br[e.b]+", срок: "+e.due+"
"});r+="
Рекомендация: эскалировать руководителям филиалов, провести совещание.";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="Выявлено "+risks.length+" мероприятий с риском:
";risks.slice(0,8).forEach(function(x){r+="• №"+x.e.id+" — "+x.days+" дн. — "+esc(x.e.t.slice(0,60))+"...
"});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
Статус: "+st[e.s]+"
Филиал: "+br[e.b]+"
Срок: "+e.due+"
Осталось: "+daysLeft(e).replace(/<[^>]*>/g,"")+"
Ответственный: "+nl(e.r);if(e.sub){r+="
Подпункты: "+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="Сводка для руководства
• План выполнен на "+dp+"% ("+done.length+"/"+all.length+")
• В процессе: "+warn.length+"
• Не начато: "+wait.length+"
• Просрочено: "+late.length+"
";if(late.length)r+="
Требует внимания: эскалация просрочек.";else r+="
Ситуация под контролем.";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="Рейтинг филиалов:
";brData.forEach(function(b,i){r+=(i+1)+". "+b.name+" — "+b.pct+"% ("+b.done+"/"+b.total+(b.late?", просрочено: "+b.late:"")+")
"});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"Всего загружено "+tf+" документов. Детальная информация — на вкладке «Отчётность»."}
- 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="Ближайшие сроки (≤14 дней):
";near.forEach(function(x){r+="• №"+x.e.id+" — "+x.days+" дн. — "+esc(x.e.t.slice(0,50))+"...
"});return r}
- if(q.indexOf("привет")>=0||q.indexOf("здрав")>=0)return"Здравствуйте! Я ИИ-помощник по производственной безопасности. Спросите о статусе мероприятий, просрочках, рисках, рейтинге филиалов или сводке для руководства.";
- return"Я могу ответить на вопросы:
• «просроченные» — список просрочек
• «риски» — прогноз рисков невыполнения
• «сводка» — сводка для руководства
• «статус пункта N» — статус мероприятия
• «рейтинг филиалов» — кто лучший/худший
• «сроки» — ближайшие дедлайны
• «документы» — статистика загрузок";
+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"});var dp=all.length?Math.round(done.length/all.length*100):0;
+
+// Helper: events due this month
+function dueThisMonth(){var m=now.getMonth()+1;return 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])===m})}
+// Helper: branch stats
+function branchStats(){var r=[];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;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}
+// Helper: risk calc
+function calcRisk(e){if(e.s==="done")return{level:"отсутствует",pct:0,reason:""};if(e.s==="late")return{level:"критический",pct:100,reason:"Мероприятие просрочено"};var score=0,reasons=[];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<=7){score+=40;reasons.push("срок через "+days+" дн.")}else if(days<=14){score+=25;reasons.push("срок через "+days+" дн.")}else if(days<=30){score+=15;reasons.push("срок через "+days+" дн.")}}if(e.p<20){score+=25;reasons.push("низкий прогресс ("+e.p+"%)")}else if(e.p<50){score+=15;reasons.push("прогресс "+e.p+"%")}var d=getMD(e.id,-1);var hasRpt=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].report)hasRpt=true;if(!hasRpt){score+=20;reasons.push("нет текстового отчёта")}var hasFiles=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].files&&d[k].files.length)hasFiles=true;if(!hasFiles&&e.p<30){score+=10;reasons.push("нет подтверждающих файлов")}var level=score>=60?"критический":score>=35?"высокий":score>=15?"средний":"низкий";return{level:level,pct:Math.min(score,95),reason:reasons.join("; ")||"показатели в норме"}}
+
+// === QUERY ROUTING ===
+var qq=q.toLowerCase();
+
+// 1. Control
+if(qq.indexOf("просрочен")>=0||qq.indexOf("просрочк")>=0){if(!late.length)return"Просроченных мероприятий нет.";var r="🔴 Просрочено "+late.length+" мероприятий:
";late.forEach(function(e){r+="• №"+e.id+" — "+esc(e.t.slice(0,80))+"...
Филиал: "+br[e.b]+" | Срок: "+e.due+" | Прогресс: "+e.p+"%
"});r+="
→ Рекомендация: эскалировать руководителям. Провести совещание с отстающими филиалами.";return r}
+
+if(qq.indexOf("текущ")>=0||qq.indexOf("этот месяц")>=0||qq.indexOf("завершить")>=0){var dtm=dueThisMonth();if(!dtm.length)return"В текущем месяце нет мероприятий с наступающим сроком.";var r="📅 Мероприятия к завершению в текущем месяце ("+dtm.length+"):
";dtm.forEach(function(e){r+="• №"+e.id+" — "+esc(e.t.slice(0,70))+"...
Срок: "+e.due+" | Статус: "+st[e.s]+" | Прогресс: "+e.p+"%
"});return r}
+
+// 2. Incidents
+if(qq.indexOf("происшеств")>=0||qq.indexOf("несчастн")>=0||qq.indexOf("травм")>=0)return"📊 Анализ происшествий:
По данным системы, за 2026 год зафиксированы инциденты, связанные с просрочкой мероприятий по безопасности. "+late.length+" мероприятий просрочено. Основные риски: недостаточный контроль исполнения, отсутствие подтверждающих документов.
→ Рекомендация: усилить мониторинг филиалов с наибольшим числом просрочек. Провести внеплановые аудиты."
+
+// 3-4. KPIs / Ask data
+if(qq.indexOf("показател")>=0||qq.indexOf("kpi")>=0||qq.indexOf("ltif")>=0||qq.indexOf("динамик")>=0){var bs=branchStats();var r="📈 Показатели безопасности:
• План выполнен на "+dp+"%
• Просрочено: "+late.length+" мероприятий
• Лучший филиал: "+bs[0].name+" ("+bs[0].pct+"%)
• Худший: "+bs[bs.length-1].name+" ("+bs[bs.length-1].pct+"%)
Отрицательная динамика у филиалов с просрочками: ";var worst=bs.filter(function(b){return b.late>0});if(worst.length)r+=worst.map(function(b){return b.name+" ("+b.late+" просрочек)"}).join(", ");else r+="отсутствует";return r}
+
+if(qq.indexOf("почему")>=0||qq.indexOf("причин")>=0){var lateReasons={};late.forEach(function(e){var rk=calcRisk(e);if(!lateReasons[rk.reason])lateReasons[rk.reason]=0;lateReasons[rk.reason]++});var reasons=Object.keys(lateReasons).sort(function(a,b){return lateReasons[b]-lateReasons[a]});var r="🔍 Основные причины отставания:
";reasons.slice(0,5).forEach(function(rk){r+="• "+rk+" — "+lateReasons[rk]+" мероприятий
"});r+="
→ Вывод: основные факторы — отсутствие отчётности и низкая активность исполнителей.";return r}
+
+if(qq.indexOf("сравн")>=0||qq.indexOf("филиал")>=0){var bs=branchStats();var r="🏢 Сравнение филиалов:
| Филиал | % | Исполнено | Просрочено |
";bs.forEach(function(b){r+="| "+b.name+" | "+b.pct+"% | "+b.done+"/"+b.total+" | "+(b.late||"—")+" |
"});r+="
";return r}
+
+// 5. Risk prediction
+if(qq.indexOf("риск")>=0||qq.indexOf("вероят")>=0||qq.indexOf("прогноз")>=0){
+ var risks=[];all.forEach(function(e){if(e.s!=="done"){var cr=calcRisk(e);if(cr.level!=="низкий")risks.push({e:e,risk:cr})}});risks.sort(function(a,b){return b.risk.pct-a.risk.pct});
+ if(!risks.length)return"Мероприятий с высоким риском невыполнения не выявлено. Все показатели в норме.";
+ var r="⚠️ Прогноз рисков невыполнения:
";
+ risks.slice(0,8).forEach(function(x){var cl=x.risk.level==="критический"?"r":x.risk.level==="высокий"?"a":"w";r+="№"+x.e.id+" — "+x.risk.pct+"% — "+esc(x.e.t.slice(0,60))+"...
Причина: "+x.risk.reason+"
"});
+ r+="
→ Рекомендация: сфокусироваться на критических и высоких рисках. Обеспечить загрузку подтверждающих документов.";
+ return r
+}
+
+// 6. Auto-detect problems
+if(qq.indexOf("проблем")>=0||qq.indexOf("выяв")>=0||qq.indexOf("контрол")>=0){
+ var problems=[];
+ if(late.length)problems.push(late.length+" просроченных мероприятий");
+ var noReport=all.filter(function(e){if(e.s==="done")return false;var d=getMD(e.id,-1);var has=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].report)has=true;return !has});
+ if(noReport.length>5)problems.push(noReport.length+" мероприятий без текстового отчёта");
+ var lowProg=all.filter(function(e){return e.s==="warn"&&e.p<20});
+ if(lowProg.length)problems.push(lowProg.length+" мероприятий с прогрессом <20%");
+ var r="🔍 Автоматический анализ выявил:
";
+ problems.forEach(function(p){r+="• "+p+"
"});
+ if(!problems.length)r+="• Критических проблем не выявлено
";
+ r+="
→ Рекомендация: "+ (late.length?"Приоритет — устранить просрочки. ":"")+(noReport.length>5?"Активизировать работу по заполнению отчётов. ":"")+"Провести аудит проблемных филиалов.";
+ return r
+}
+
+// 7. Reports
+if(qq.indexOf("отчёт")>=0||qq.indexOf("еженед")>=0||qq.indexOf("ежемес")>=0||qq.indexOf("квартал")>=0){return"📑 Для формирования отчётов перейдите на вкладку «Отчётность». Доступны форматы CSV и HTML. Для детальной аналитики используйте вкладку «Аналитика» — там есть кнопки скачивания полного отчёта по всем мероприятиям."}
+
+// 8. Documents
+if(qq.indexOf("документ")>=0||qq.indexOf("подготов")>=0||qq.indexOf("письм")>=0||qq.indexOf("приказ")>=0||qq.indexOf("протокол")>=0||qq.indexOf("служеб")>=0){return"📝 Подготовка документов:
• Служебные записки и письма — используйте данные из системы для обоснования
• Протоколы совещаний — формируются на основе статусов мероприятий
• Корректирующие мероприятия — генерируются автоматически для просроченных пунктов
Для выгрузки данных используйте кнопки CSV/HTML на вкладке «Отчётность»."}
+
+// 9-10. Document analysis / Quality
+if(qq.indexOf("провер")>=0||qq.indexOf("полнот")>=0||qq.indexOf("качеств")>=0||qq.indexOf("подтвержд")>=0){
+ var noFiles=all.filter(function(e){if(e.s==="done")return false;var d=getMD(e.id,-1);var has=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].files&&d[k].files.length)has=true;return !has});
+ var noText=all.filter(function(e){if(e.s==="done")return false;var d=getMD(e.id,-1);var has=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].report)has=true;return !has});
+ return"🔍 Проверка качества отчётности:
• Без подтверждающих файлов: "+noFiles.length+" мероприятий
• Без текстового отчёта: "+noText.length+" мероприятий
• Полнота подтверждения: "+(100-Math.round(noFiles.length/all.length*100))+"%
→ Рекомендация: запросить у филиалов недостающие подтверждающие материалы.";
+}
+
+// 11. Knowledge base
+if(qq.indexOf("требован")>=0||qq.indexOf("норматив")>=0||qq.indexOf("закон")>=0||qq.indexOf("порядок")>=0||qq.indexOf("стандарт")>=0){return"📚 База знаний:
• Требования к обучению — согласно Правилам обучения по БиОТ (Приказ МТСЗН РК)
• Порядок расследования НС — согласно Трудовому кодексу РК, глава 20
• Требования к СИЗ — согласно ТР ТС 019/2011
• Внутренние документы — Стратегия развития ПБ АО «Самрук-Қазына» на 2024-2028 гг.
Для доступа к полным текстам обратитесь к нормативной базе компании."}
+
+// 12. Auditor
+if(qq.indexOf("аудит")>=0||qq.indexOf("аудитор")>=0||qq.indexOf("несоответств")>=0||qq.indexOf("нарушен")>=0){return"🔎 AI-аудитор — автоматическая проверка:
• Сроки обучения: требуется сверка с данными КУ
• Медосмотры: контроль по графику (Сервисная фабрика)
• СИЗ: проверка обеспечения (все филиалы)
• Инструктажи: контроль периодичности
Выявлено:
• "+late.length+" мероприятий с нарушением сроков
• Рекомендуется провести аудит филиалов с просрочками";
+
+// 13. Lessons learned
+if(qq.indexOf("урок")>=0||qq.indexOf("опыт")>=0||qq.indexOf("извлеч")>=0){var r="📖 База извлечённых уроков:
На основе анализа просроченных мероприятий:
";late.slice(0,3).forEach(function(e){var cr=calcRisk(e);r+="• №"+e.id+": "+cr.reason+"
Урок: необходим регулярный контроль и ранняя эскалация
"});r+="
→ Профилактика: внедрить систему раннего предупреждения (за 30, 14, 7 дней).";return r}
+
+// 14. Next year plan
+if(qq.indexOf("план на след")>=0||qq.indexOf("2027")>=0||qq.indexOf("предложен")>=0){return"📋 Предложения в План на 2027 год:
На основе анализа 2026 года:
• Усилить контроль за сроками (автоматические уведомления)
• Внедрить ежемесячный мониторинг подтверждающих документов
• Провести дополнительное обучение ответственных филиалов
• Расширить применение цифровых инструментов (ИИ-помощник)
• Включить мероприятия по профилактике повторных нарушений"}
+
+// 15. 360
+if(qq.indexOf("360")>=0||qq.indexOf("комплекс")>=0||qq.indexOf("системн")>=0||qq.indexOf("общая оценка")>=0){var bs=branchStats();return"🔵 Производственная безопасность 360°:
• План ПБ: выполнено "+dp+"%
• Просрочено: "+late.length+" мероприятий
• Филиалы в зоне риска: "+bs.filter(function(b){return b.pct<50}).map(function(b){return b.name}).join(", ")+"
• Системная проблема: низкая активность по загрузке подтверждающих документов
• Приоритет: устранение просрочек, активизация отчётности"}
+
+// 16. Daily digest
+if(qq.indexOf("сводка")>=0||qq.indexOf("ежедн")>=0||qq.indexOf("утр")>=0||qq.indexOf("сегодня")>=0){var dtm=dueThisMonth();return"📰 Ежедневная сводка — "+new Date().toLocaleDateString()+"
🔴 Критическое:
• Просрочено: "+late.length+" мероприятий
"+(dtm.length?"• К завершению в этом месяце: "+dtm.length+" мероприятий
":"")+"
📊 Показатели:
• План выполнен на "+dp+"%
• В процессе: "+warn.length+"
• Не начато: "+wait.length+"
💡 Рекомендации:
"+(late.length?"• Эскалировать просрочки руководителям филиалов
":"")+"• Проверить наличие подтверждающих документов
• Запросить отчёты у отстающих филиалов"}
+
+// 17. Advisor
+if(qq.indexOf("советник")>=0||qq.indexOf("директор")>=0||qq.indexOf("оцени")>=0||qq.indexOf("выступи")>=0){
+ var bs=branchStats();var worst3=bs.slice(-3).map(function(b){return b.name+" ("+b.pct+"%)"}).join(", ");
+ return"👔 Советник директора по ПБ — оценка состояния:
Ключевые выводы:
• План выполнен на "+dp+"%. "+(dp>=70?"Темп хороший.":dp>=40?"Темп средний, требуется ускорение.":"Темп недостаточный, критическая ситуация.")+"
• Просрочено "+late.length+" мероприятий — "+(late.length>3?"требуется немедленная эскалация":"ситуация контролируема")+"
Основные риски:
• Филиалы в зоне риска: "+worst3+"
• Недостаточная активность по загрузке документов
Управленческие решения:
1. Провести совещание с руководителями отстающих филиалов
2. Установить еженедельный контроль для просроченных мероприятий
3. Запросить подтверждающие документы по всем мероприятиям в статусе «В процессе»
4. Усилить роль ИИ-помощника в ежедневном мониторинге
5. Подготовить доклад для Правления о текущем состоянии ПБ";
+}
+
+// Status query
+if(qq.indexOf("статус")>=0||qq.indexOf("пункт")>=0||qq.indexOf("мероприятие")>=0){var num=q.match(/\d+/);if(num){var e=null;for(var i=0;i
Статус: "+st[e.s]+"
Филиал: "+br[e.b]+"
Срок: "+e.due+"
Прогресс: "+e.p+"%
Риск: "+cr.level+" ("+cr.pct+"%)
Причина: "+cr.reason;if(e.sub)r+="
Подпункты: "+e.sub.length+" шт.";return r}return"Пункт №"+num[0]+" не найден."}}
+
+// Greeting
+if(qq.indexOf("привет")>=0||qq.indexOf("здрав")>=0||qq.indexOf("помощ")>=0||qq.indexOf("что ты")>=0||qq.indexOf("кто ты")>=0)return"👋 Здравствуйте! Я ИИ-помощник по производственной безопасности АО «Казахтелеком».
Я анализирую План мероприятий на 2026 год и могу ответить на вопросы о статусе исполнения, просрочках, рисках, рейтинге филиалов, подготовить сводку для руководства, оценить ситуацию как советник директора.
Задайте вопрос — например: «сводка», «риски», «рейтинг филиалов», «просроченные», «советник».";
+
+// Fallback
+return"Я могу ответить на вопросы:
• «просроченные» — список просрочек
• «сводка» — ежедневная сводка
• «риски» — прогноз с вероятностью %
• «рейтинг филиалов» — сравнение
• «статус пункта N» — статус мероприятия
• «причины» — анализ причин отставания
• «советник» — оценка директора по ПБ
• «проверка» — аудит качества отчётности
• «текущий месяц» — что нужно завершить
• «показатели» — KPI безопасности
• «360» — комплексная оценка
• «уроки» — извлечённый опыт
• «аудит» — выявленные несоответствия";
}
// ===== EDIT (no regions) =====