diff --git a/index.html b/index.html index 0b358c3..35883e6 100644 --- a/index.html +++ b/index.html @@ -118,9 +118,6 @@ td{border-bottom:1px solid var(--gray-200)}tr:hover td{background:var(--cyan-50)
ИИ-Агент ПБ
-
@@ -158,23 +155,17 @@ function sb(s){var m={done:"green",warn:"amber",late:"red",wait:"gray"};return'< function pct(p){var c=p>=80?"var(--green)":p>=40?"var(--amber)":"var(--red)";return'
'+p+'%
'} var users={ - "curator@telecom.kz":{name:"Куратор Плана",branch:0,role:"curator",region:-1}, - "dpp@telecom.kz":{name:"Директор ДПБ (Вы)",branch:0,role:"branch",region:0}, - "admin@telecom.kz":{name:"Администратор",branch:0,role:"admin",region:-1}, - "ahmetov@telecom.kz":{name:"Ахметов К.Т.",branch:6,role:"branch",region:4}, - "serikov@telecom.kz":{name:"Сериков А.М.",branch:1,role:"branch",region:3}, - "nurlanov@telecom.kz":{name:"Нурланов Д.С.",branch:8,role:"branch",region:5}, - "aliev@telecom.kz":{name:"Алиев Г.С.",branch:4,role:"branch",region:2}, - "tulegenov@telecom.kz":{name:"Тулегенов Е.А.",branch:2,role:"branch",region:1}, - "saparov@telecom.kz":{name:"Сапаров А.Д.",branch:3,role:"branch",region:1}, - "maratov@telecom.kz":{name:"Маратов Ж.К.",branch:5,role:"branch",region:3}, - "iskakov@telecom.kz":{name:"Искаков Р.Н.",branch:7,role:"branch",region:0}, - "north@telecom.kz":{name:"Отв. Северный регион",branch:1,role:"region",region:3}, - "almaty@telecom.kz":{name:"Отв. Алматинский регион",branch:2,role:"region",region:1}, - "south@telecom.kz":{name:"Отв. Южный регион",branch:4,role:"region",region:2}, - "center@telecom.kz":{name:"Отв. Центральный регион",branch:0,role:"region",region:0}, - "east@telecom.kz":{name:"Отв. Восточный регион",branch:6,role:"region",region:4}, - "west@telecom.kz":{name:"Отв. Западный регион",branch:8,role:"region",region:5} + "curator@telecom.kz":{name:"Куратор Плана",branch:0,role:"curator"}, + "dpp@telecom.kz":{name:"Директор ДПБ (Вы)",branch:0,role:"branch"}, + "admin@telecom.kz":{name:"Администратор",branch:0,role:"admin"}, + "ahmetov@telecom.kz":{name:"Ахметов К.Т.",branch:6,role:"branch"}, + "serikov@telecom.kz":{name:"Сериков А.М.",branch:1,role:"branch"}, + "nurlanov@telecom.kz":{name:"Нурланов Д.С.",branch:8,role:"branch"}, + "aliev@telecom.kz":{name:"Алиев Г.С.",branch:4,role:"branch"}, + "tulegenov@telecom.kz":{name:"Тулегенов Е.А.",branch:2,role:"branch"}, + "saparov@telecom.kz":{name:"Сапаров А.Д.",branch:3,role:"branch"}, + "maratov@telecom.kz":{name:"Маратов Ж.К.",branch:5,role:"branch"}, + "iskakov@telecom.kz":{name:"Искаков Р.Н.",branch:7,role:"branch"} }; var curUser=null,curMonth=5,curRegion=0,editSubIdx=-1; @@ -193,30 +184,12 @@ function saveEvents(){localStorage.setItem("samruk_ev",JSON.stringify(events))} function addLog(action,eventId,detail){var l=JSON.parse(localStorage.getItem("samruk_log")||"[]");l.push({ts:new Date().toISOString(),user:curUser.name,role:curUser.role,action:action,eid:eventId,detail:detail||""});if(l.length>500)l=l.slice(-500);localStorage.setItem("samruk_log",JSON.stringify(l))} function getLog(){return JSON.parse(localStorage.getItem("samruk_log")||"[]")} -function getMy(){if(!curUser||!events)return[];var list;if(curUser.role==="admin"||curUser.role==="curator"){list=events}else if(curUser.role==="region"){list=events.filter(function(e){return branchRegion[e.b]===curUser.region})}else{list=events.filter(function(e){return e.b===curUser.branch})} - // Apply curator's filter - if(curFilter&&(curUser.role==="curator"||curUser.role==="admin")){ - if(curFilter.type==="branch")list=list.filter(function(e){return e.b===curFilter.id}) - else if(curFilter.type==="region")list=list.filter(function(e){return branchRegion[e.b]===curFilter.id}) - } - return list} - -function setFilter(val){ - if(!val){curFilter=null}else{var p=val.split("_");curFilter={type:p[0],id:parseInt(p[1])}} - renderAll()} +function getMy(){if(!curUser||!events)return[];if(curUser.role==="admin"||curUser.role==="curator")return events;return events.filter(function(e){return e.b===curUser.branch})} // Auth -function doLogin(e){e.preventDefault();var em=document.getElementById("loginEmail").value.trim().toLowerCase();if(users[em]){ curUser={email:em,name:users[em].name,branch:users[em].branch,role:users[em].role,region:users[em].region};localStorage.setItem("samruk_u",JSON.stringify(curUser));addLog("вошёл");showApp()}else{document.getElementById("loginErr").style.display="block"}return false} +function doLogin(e){e.preventDefault();var em=document.getElementById("loginEmail").value.trim().toLowerCase();if(users[em]){ curUser={email:em,name:users[em].name,branch:users[em].branch,role:users[em].role};localStorage.setItem("samruk_u",JSON.stringify(curUser));addLog("вошёл");showApp()}else{document.getElementById("loginErr").style.display="block"}return false} function doLogout(){addLog("вышел");localStorage.removeItem("samruk_u");curUser=null;document.getElementById("loginScreen").style.display="flex";document.getElementById("app").style.display="none"} -function showApp(){document.getElementById("loginScreen").style.display="none";document.getElementById("app").style.display="block";var label=curUser.name+" · "+(curUser.role==="curator"||curUser.role==="admin"?"Все регионы":curUser.role==="region"?regions[curUser.region]:branches[curUser.branch]);document.getElementById("userLabel").innerHTML=""+label+""; - // Populate branch filter for curator/admin - var sel=document.getElementById("branchFilter"); - if(curUser.role==="curator"||curUser.role==="admin"){ - sel.style.display="inline-block";sel.innerHTML=''; - regions.forEach(function(r,ri){sel.innerHTML+='';branches.forEach(function(b,bi){if(branchRegion[bi]===ri)sel.innerHTML+=''})}); - sel.value=curFilter?(curFilter.type+"_"+curFilter.id):""; - }else{sel.style.display="none"} - renderAll()} +function showApp(){document.getElementById("loginScreen").style.display="none";document.getElementById("app").style.display="block";var label=curUser.name+" · "+(curUser.role==="curator"||curUser.role==="admin"?"Все регионы":branches[curUser.branch]);document.getElementById("userLabel").innerHTML=""+label+"";renderAll()} // Notifs function notifsUpdate(){ @@ -281,12 +254,11 @@ function renderDashboard(){ h+=''; h+='
'; - // Branch detail for curator if(curUser.role==="curator"||curUser.role==="admin"){ - h+='

📋 Сводка по филиалам — что загружено

'; + h+='

📋 Сводка по филиалам — что загружено

ФилиалРегионМеропр.С отчётамиФайловПрогресс
'; branches.forEach(function(b,bi){var items=events.filter(function(e){return e.b===bi}),withRpt=0,totalFiles=0; - items.forEach(function(e){var d=getMD(e.id,-1);var has=false;for(var k in d){if(d.hasOwnProperty(k)&&d[k]&&(d[k].report||(d[k].files&&d[k].files.length))){has=true;totalFiles+=(d[k].files||[]).length}}if(e.sub)e.sub.forEach(function(s,si){var sd=getMD(e.id,si);for(var sk in sd){if(sd.hasOwnProperty(sk)&&sd[sk]&&(sd[sk].report||(sd[sk].files&&sd[sk].files.length))){has=true;totalFiles+=(sd[sk].files||[]).length}}});if(has)withRpt++}); - h+=''; + items.forEach(function(e){var has=false;regions.forEach(function(r,ri){var d=getMD(e.id,ri,-1);for(var k in d){if(d.hasOwnProperty(k)&&d[k]&&(d[k].report||(d[k].files&&d[k].files.length))){has=true;totalFiles+=(d[k].files||[]).length}}if(e.sub)e.sub.forEach(function(s,si){var sd=getMD(e.id,ri,si);for(var sk in sd){if(sd.hasOwnProperty(sk)&&sd[sk]&&(sd[sk].report||(sd[sk].files&&sd[sk].files.length))){has=true;totalFiles+=(sd[sk].files||[]).length}}})});if(has)withRpt++}); + h+=''; }); h+='
ФилиалМеропр.С отчётамиФайловПрогресс
'+b+''+regions[branchRegion[bi]]+''+items.length+''+(withRpt?withRpt+' ✅':'—')+''+(totalFiles||'—')+''+pct(items.length?Math.round(withRpt/items.length*100):0)+'
'+b+''+items.length+''+(withRpt?withRpt+' ✅':'—')+''+(totalFiles||'—')+''+pct(items.length?Math.round(withRpt/items.length*100):0)+'
'; } @@ -296,11 +268,14 @@ function renderDashboard(){ function downloadReport(){ var from=parseInt(document.getElementById("rptFrom").value),to=parseInt(document.getElementById("rptTo").value); - var my=getMy(),csv="№;Регион;Филиал;Мероприятие;Подпункт;Раздел;Статус;Прогресс;Срок;Факт;Отчёт (текст);Файлы\n"; + var my=getMy(),csv="№;Филиал;Мероприятие;Подпункт;Регион;Раздел;Статус;Прогресс;Срок;Факт;Отчёт (текст);Файлы\n"; my.forEach(function(e){ - function addRow(subLabel,subIdx){var rep="",fls="",d=getMD(e.id,subIdx); + function addRow(subLabel,subIdx){regions.forEach(function(r,ri){var rep="",fls="",d=getMD(e.id,ri,subIdx); for(var i=from;i<=to;i++){var m=months[i];if(d[m]){if(d[m].report)rep+=M(i)+": "+d[m].report.replace(/"/g,'""')+"; ";if(d[m].files&&d[m].files.length)fls+=M(i)+": "+d[m].files.map(function(f){return f.name}).join(", ")+"; "}} - csv+=e.id+';'+regions[branchRegion[e.b]]+';'+branches[e.b]+';"'+e.t.replace(/"/g,'""')+'";'+(subLabel||"общее")+';'+sections[e.sec]+';'+statusMap[e.s]+';'+e.p+'%;'+e.due+';'+(e.done||"—")+';"'+rep+'";"'+fls+'"\n';} + csv+=e.id+';'+branches[e.b]+';"'+e.t.replace(/"/g,'""')+'";'+(subLabel||"общее")+';'+r+';'+sections[e.sec]+';'+statusMap[e.s]+';'+e.p+'%;'+e.due+';'+(e.done||"—")+';"'+rep+'";"'+fls+'"\n'})} + addRow("",-1); + if(e.sub) e.sub.forEach(function(s,i){ addRow(s.l,i); }); + }); addRow("",-1); if(e.sub) e.sub.forEach(function(s,i){ addRow(s.l,i); }); }); @@ -315,12 +290,12 @@ function downloadHTML(){ my.forEach(function(e){ var scls={done:"g",warn:"a",late:"r",wait:"w"}[e.s]; h+='

'+e.id+'. '+esc(e.t)+'

'; - h+='
Регион: '+regions[branchRegion[e.b]]+'Филиал: '+branches[e.b]+'Раздел: '+sections[e.sec]+'Срок: '+e.due+'Факт: '+(e.done||"—")+'Прогресс: '+e.p+'%'+statusMap[e.s]+'
'; + h+='
Филиал: '+branches[e.b]+'Раздел: '+sections[e.sec]+'Срок: '+e.due+'Факт: '+(e.done||"—")+'Прогресс: '+e.p+'%'+statusMap[e.s]+'
'; h+='
Ответственный: '+esc(e.r)+'
'; - // Main event data - h+=renderMonthBlock(e.id,-1,"Общие материалы",from,to); - // Sub-items - if(e.sub) e.sub.forEach(function(s,i){ h+='
'+s.l+') '+esc(s.t)+'';h+=renderMonthBlock(e.id,i,"",from,to);h+='
'}); + // Main event data — all regions + regions.forEach(function(r,ri){h+=renderMonthBlock(e.id,ri,-1,r,from,to)}); + // Sub-items — all regions + if(e.sub) e.sub.forEach(function(s,i){ h+='
'+s.l+') '+esc(s.t)+'';regions.forEach(function(r,ri){h+=renderMonthBlock(e.id,ri,i,"",from,to)});h+='
'}); h+='
🤖 ИИ: '+esc(e.ai)+'
'; }); h+=''; @@ -333,8 +308,8 @@ function downloadHTML(){ } } -function renderMonthBlock(id,si,label,from,to){ - var d=getMD(id,si),has=false,html=''; +function renderMonthBlock(id,ri,si,label,from,to){ + var d=getMD(id,ri,si),has=false,html=''; for(var i=from;i<=to;i++){var m=months[i];if(d[m]&&(d[m].report||(d[m].files&&d[m].files.length))){ has=true;html+='
'+M(i)+(label?' — '+label:'')+''; if(d[m].report)html+='

'+esc(d[m].report)+'

'; @@ -353,7 +328,7 @@ function renderMyEvents(){ h+='
'; var sf=document.getElementById("mySF");sf=sf?sf.value:""; var list=my;if(sf)list=list.filter(function(e){return e.s===sf}); - h+=''; + h+='
Мероприятие / ПодпунктыРегионФилиалРазделСрокПрогрессСтатус
'; list.forEach(function(e){ var hasSub = e.sub && e.sub.length; var sc = getSC(e.id); @@ -362,10 +337,9 @@ function renderMyEvents(){ h+=''; h+=''; - h+=''; h+=''; h+=''; h+='';
Мероприятие / ПодпунктыФилиалРазделСрокПрогрессСтатус
'+e.id+''; if(hasSub) h+=''+(expandedEvents[e.id]?'▼':'▶')+''; - h+=''+esc(e.t)+''; + h+=''+esc(e.t)+''; if(hasSub) h+=' ('+subDone+'/'+subTotal+')'; h+=''+regions[branchRegion[e.b]]+''+branches[e.b]+''+["I","II","III","IV","V"][e.sec]+''+e.due+''+pct(e.p)+''+sb(e.s)+'