From 231995df766d95e2fb52ca16894c87a4fdfcf7b7 Mon Sep 17 00:00:00 2001 From: Dauren777 Date: Thu, 4 Jun 2026 06:39:05 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B5=20=D0=9F=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=BE=D0=B4=D0=B8=D1=87=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=9F=D0=90=D0=91=20=D0=BF=D1=80=D0=B8=20=D1=80=D0=B5=D0=B3?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20+=20getUserQ?= =?UTF-8?q?uota?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.html | 27 +++++++++++++++++++-------- index.html | 11 ++++++----- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/app.html b/app.html index 05a98b4..8448de5 100644 --- a/app.html +++ b/app.html @@ -103,7 +103,18 @@ var PQ={"Директор департамента ЦА":{c:1,p:"halfyear",l:"1 var U,editId,charts={},lastSubmitted,vrc=6; try{U=JSON.parse(sessionStorage.getItem("pab_user"));if(!U)location.href="index.html"}catch(e){location.href="index.html"} document.getElementById("dn").textContent=U.login+" ("+U.role+")"; -function isA(){return U&&U.login==="admin"}function getU(){try{return JSON.parse(localStorage.getItem("pab_users")||"{}")}catch(e){return{}}}function allU(){var r=getU();r.admin={pass:"admin",name:"Администратор",role:"Руководитель",email:"admin@telecom.kz",branch:"АО «Казахтелеком»",dept:"ЦА",region:"Центральный",oblast:"—",city:"г. Астана"};return r}function getA(){try{return JSON.parse(localStorage.getItem("pab_audits")||"[]")}catch(e){return[]}}function saveA(d){localStorage.setItem("pab_audits",JSON.stringify(d))}function gq(r){return PQ[r]||PQ["Сотрудник"]}function gp(p){var n=new Date();if(p==="month")return{s:new Date(n.getFullYear(),n.getMonth(),1),l:n.toLocaleString("ru",{month:"long",year:"numeric"})};if(p==="quarter"){var q=Math.floor(n.getMonth()/3);return{s:new Date(n.getFullYear(),q*3,1),l:(q+1)+"-й квартал "+n.getFullYear()}}if(p==="halfyear"){var h=n.getMonth()<6?0:1;return{s:new Date(n.getFullYear(),h*6,1),l:(h+1)+"-е полугодие "+n.getFullYear()}}return{s:new Date(2020,0,1),l:"весь период"}}function esc(s){return(s||"").replace(/&/g,"&").replace(/"/g,""").replace(//g,">")} +function isA(){return U&&U.login==="admin"}function getU(){try{return JSON.parse(localStorage.getItem("pab_users")||"{}")}catch(e){return{}}}function allU(){var r=getU();r.admin={pass:"admin",name:"Администратор",role:"Руководитель",email:"admin@telecom.kz",branch:"АО «Казахтелеком»",dept:"ЦА",region:"Центральный",oblast:"—",city:"г. Астана"};return r}function getA(){try{return JSON.parse(localStorage.getItem("pab_audits")||"[]")}catch(e){return[]}}function saveA(d){localStorage.setItem("pab_audits",JSON.stringify(d))}function gq(r){var q=PQ[r];if(q)return q;return{c:0,p:null,l:"Без графика"}} +function getUserQuota(user){ + if(user.freq){ + var parts=user.freq.split(","); + if(parts.length===2){ + var c=parseInt(parts[0]),p=parts[1],pl={month:"месяц",quarter:"квартал",halfyear:"полгода"}; + var l=c===0?"Без графика":c+" раз(а) в "+ (pl[p]||p); + return{c:c,p:p,l:l}; + } + } + return gq(user.role); +}function gp(p){var n=new Date();if(p==="month")return{s:new Date(n.getFullYear(),n.getMonth(),1),l:n.toLocaleString("ru",{month:"long",year:"numeric"})};if(p==="quarter"){var q=Math.floor(n.getMonth()/3);return{s:new Date(n.getFullYear(),q*3,1),l:(q+1)+"-й квартал "+n.getFullYear()}}if(p==="halfyear"){var h=n.getMonth()<6?0:1;return{s:new Date(n.getFullYear(),h*6,1),l:(h+1)+"-е полугодие "+n.getFullYear()}}return{s:new Date(2020,0,1),l:"весь период"}}function esc(s){return(s||"").replace(/&/g,"&").replace(/"/g,""").replace(//g,">")} function swP(n){ ["NA","MS","DB","VL","HS"].forEach(function(id){var el=document.getElementById("p"+id);if(el)el.classList.remove("ac")}); @@ -137,11 +148,11 @@ function resetF(){document.getElementById("pn").value="";document.getElementById function sendEmailConfirm(){if(!lastSubmitted)return;var e=lastSubmitted,to=e.email||U.email||"";if(!to||to.indexOf("@")<0){alert("Нет email");return}location.href="mailto:"+encodeURIComponent(to)+"?subject="+encodeURIComponent("ПАБ №"+(e.number||"—"))+"&body="+encodeURIComponent("Подтверждение ПАБ\nБланк: "+(e.number||"—")+"\nДата: "+e.date+"\nМесто: "+e.location+"\nСтатус: "+(e.overallSafe?"БЕЗОПАСНО":"НАРУШЕНИЙ: "+e.totalViolations))} function printConfirm(){if(!lastSubmitted)return;var e=lastSubmitted;var w=window.open("","_blank","width=700,height=800");w.document.write("ПАБ

БЛАНК ПАБ №"+(e.number||"—")+" от "+e.date+"

Место: "+e.location+" | Наблюдатель: "+e.observer+" | Статус: "+(e.overallSafe?"БЕЗОПАСНО":"НАРУШЕНИЙ: "+e.totalViolations)+"

");w.document.close()} -function checkSA(){if(!U||isA()){document.getElementById("sa").classList.remove("sh","dg");return}var q=gq(U.role);if(!q.p)return;var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===U.login&&new Date(a.date)>=p.s}).length;var need=Math.max(0,q.c-done);var sa=document.getElementById("sa"),at=document.getElementById("sat");sa.classList.remove("sh","dg");if(need>0){at.textContent="⚠️ Отставание ("+p.l+"): "+done+" из "+q.c+". Осталось: "+need;sa.classList.add("sh");if(need>=q.c)sa.classList.add("dg")}} -function sendScheduleReminder(){if(!U)return;var q=gq(U.role);var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===U.login&&new Date(a.date)>=p.s}).length;var need=Math.max(0,q.c-done);var to=U.email||"";if(!to||to.indexOf("@")<0){alert("Нет email");return}location.href="mailto:"+encodeURIComponent(to)+"?subject="+encodeURIComponent("График ПАБ — "+p.l)+"&body="+encodeURIComponent("График: "+q.l+"\nПериод: "+p.l+"\nВыполнено: "+done+" из "+q.c+(need>0?"\nОтставание: "+need:"\nГрафик выполнен!"))} -function rMS(){var c=document.getElementById("msc");if(!c)return;document.getElementById("sa").classList.remove("sh","dg");var q=gq(U.role);if(q.c===0){c.innerHTML="

📅 Без графика

Для должности «"+U.role+"» график не установлен.

";return}var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===U.login&&new Date(a.date)>=p.s}).length;var pct=Math.min(100,Math.round(done/q.c*100));var cl=pct>=100?"#2D6A4F":pct>=50?"#E76F51":"#E63946";var need=Math.max(0,q.c-done);c.innerHTML="

📅 "+p.l+"

Норматив: "+q.l+" | "+U.role+"
Выполнено: "+done+" из "+q.c+" ("+pct+"%) "+(need>0?"— осталось: "+need+"":"— ✅ выполнено!")+"
"+(need>0?"
":"")+"
👤 "+U.name+" — "+U.role+"
"+(U.branch||"—")+" | "+(U.dept||"—")+" | "+(U.region||"—")+" | "+(U.city||"—")+" | "+U.email+"
"+(done>0?"

📋 Проведённые:

"+getA().filter(function(a){return a.createdBy===U.login}).slice(0,10).map(function(a){return"
"+a.date+" — "+a.location+" — "+(a.overallSafe?"Безопасно":"Нарушений: "+a.totalViolations)+"
"}).join("")+"
":"")} +function checkSA(){if(!U||isA()){document.getElementById("sa").classList.remove("sh","dg");return}var q=getUserQuota(U);if(!q.p)return;var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===U.login&&new Date(a.date)>=p.s}).length;var need=Math.max(0,q.c-done);var sa=document.getElementById("sa"),at=document.getElementById("sat");sa.classList.remove("sh","dg");if(need>0){at.textContent="⚠️ Отставание ("+p.l+"): "+done+" из "+q.c+". Осталось: "+need;sa.classList.add("sh");if(need>=q.c)sa.classList.add("dg")}} +function sendScheduleReminder(){if(!U)return;var q=getUserQuota(U);var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===U.login&&new Date(a.date)>=p.s}).length;var need=Math.max(0,q.c-done);var to=U.email||"";if(!to||to.indexOf("@")<0){alert("Нет email");return}location.href="mailto:"+encodeURIComponent(to)+"?subject="+encodeURIComponent("График ПАБ — "+p.l)+"&body="+encodeURIComponent("График: "+q.l+"\nПериод: "+p.l+"\nВыполнено: "+done+" из "+q.c+(need>0?"\nОтставание: "+need:"\nГрафик выполнен!"))} +function rMS(){var c=document.getElementById("msc");if(!c)return;document.getElementById("sa").classList.remove("sh","dg");var q=getUserQuota(U);if(q.c===0){c.innerHTML="

📅 Без графика

Для должности «"+U.role+"» график не установлен.

";return}var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===U.login&&new Date(a.date)>=p.s}).length;var pct=Math.min(100,Math.round(done/q.c*100));var cl=pct>=100?"#2D6A4F":pct>=50?"#E76F51":"#E63946";var need=Math.max(0,q.c-done);c.innerHTML="

📅 "+p.l+"

Норматив: "+q.l+" | "+U.role+"
Выполнено: "+done+" из "+q.c+" ("+pct+"%) "+(need>0?"— осталось: "+need+"":"— ✅ выполнено!")+"
"+(need>0?"
":"")+"
👤 "+U.name+" — "+U.role+"
"+(U.branch||"—")+" | "+(U.dept||"—")+" | "+(U.region||"—")+" | "+(U.city||"—")+" | "+U.email+"
"+(done>0?"

📋 Проведённые:

"+getA().filter(function(a){return a.createdBy===U.login}).slice(0,10).map(function(a){return"
"+a.date+" — "+a.location+" — "+(a.overallSafe?"Безопасно":"Нарушений: "+a.totalViolations)+"
"}).join("")+"
":"")} -function rDB(){var c=document.getElementById("dbc");if(!c)return;var audits=getA();var all=allU();var total=audits.length,allSafe=audits.filter(function(a){return a.overallSafe}).length,wd=audits.filter(function(a){return !a.overallSafe}).length,tv=audits.reduce(function(s,a){return s+(a.totalViolations||0)},0);var ul=[];for(var k in all)if(k!=="admin")ul.push({login:k,role:all[k].role});var ot=0,bh=0;ul.forEach(function(u){var q=gq(u.role);if(!q.p)return;var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===u.login&&new Date(a.date)>=p.s}).length;if(done>=q.c)ot++;else bh++});var sp=total>0?(allSafe/total*100):50,dp=total>0?(wd/total*100):50;c.innerHTML=(isA()?"
|
":"")+"
Всего аудитов
"+total+"
Безопасно
"+allSafe+"
С нарушениями
"+wd+"
Нарушений
"+tv+"
Выполняют график
"+ot+"
Отстают
"+bh+"

🟢🔴 Соотношение

Безопасные: "+allSafe+"С нарушениями: "+wd+"

📂 По категориям

📅 По датам

🔝 Топ-10

";setTimeout(function(){for(var ck in charts)try{charts[ck].destroy()}catch(e){}charts={};var ctx1=document.getElementById("ch1");if(ctx1)charts.cat=new Chart(ctx1,{type:"bar",data:{labels:CATS.map(function(c){return c.title.split(". ")[1]}),datasets:[{label:"Нарушений",data:CATS.map(function(cat){return audits.reduce(function(s,a){var c=a.categories&&a.categories[cat.id];return s+(c?c.items.length:0)},0)}),backgroundColor:"#E63946",borderRadius:6}]},options:{responsive:true,plugins:{legend:{display:false}},scales:{y:{beginAtZero:true,ticks:{stepSize:1}}}}});var dates={};audits.forEach(function(a){if(!dates[a.date])dates[a.date]=0;dates[a.date]+=(a.totalViolations||0)});var sd=Object.keys(dates).sort();var ctx2=document.getElementById("ch2");if(ctx2)charts.tl=new Chart(ctx2,{type:"line",data:{labels:sd,datasets:[{label:"Нарушений",data:sd.map(function(d){return dates[d]}),borderColor:"#E63946",backgroundColor:"rgba(230,57,70,0.08)",fill:true,tension:0.3,pointRadius:5}]},options:{responsive:true,plugins:{legend:{display:false}},scales:{y:{beginAtZero:true,ticks:{stepSize:1}}}}});var ic={};audits.forEach(function(a){if(a.categories){Object.values(a.categories).forEach(function(cat){if(cat.items)cat.items.forEach(function(it){ic[it.item]=(ic[it.item]||0)+1})})}});var ti=Object.entries(ic).sort(function(a,b){return b[1]-a[1]}).slice(0,10);var ctx3=document.getElementById("ch3");if(ctx3)charts.top=new Chart(ctx3,{type:"bar",data:{labels:ti.map(function(i){return i[0].length>30?i[0].slice(0,30)+"...":i[0]}),datasets:[{label:"Раз",data:ti.map(function(i){return i[1]}),backgroundColor:["#E63946","#E76F51","#F4A261","#E9C46A","#2A9D8F","#264653","#00B4D8","#0077B6","#023E8A","#6C757D"],borderRadius:4}]},options:{indexAxis:"y",responsive:true,plugins:{legend:{display:false}},scales:{x:{beginAtZero:true,ticks:{stepSize:1}}}}})},300)} +function rDB(){var c=document.getElementById("dbc");if(!c)return;var audits=getA();var all=allU();var total=audits.length,allSafe=audits.filter(function(a){return a.overallSafe}).length,wd=audits.filter(function(a){return !a.overallSafe}).length,tv=audits.reduce(function(s,a){return s+(a.totalViolations||0)},0);var ul=[];for(var k in all)if(k!=="admin")ul.push({login:k,role:all[k].role});var ot=0,bh=0;ul.forEach(function(u){var q=getUserQuota(u);if(!q.p)return;var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===u.login&&new Date(a.date)>=p.s}).length;if(done>=q.c)ot++;else bh++});var sp=total>0?(allSafe/total*100):50,dp=total>0?(wd/total*100):50;c.innerHTML=(isA()?"
|
":"")+"
Всего аудитов
"+total+"
Безопасно
"+allSafe+"
С нарушениями
"+wd+"
Нарушений
"+tv+"
Выполняют график
"+ot+"
Отстают
"+bh+"

🟢🔴 Соотношение

Безопасные: "+allSafe+"С нарушениями: "+wd+"

📂 По категориям

📅 По датам

🔝 Топ-10

";setTimeout(function(){for(var ck in charts)try{charts[ck].destroy()}catch(e){}charts={};var ctx1=document.getElementById("ch1");if(ctx1)charts.cat=new Chart(ctx1,{type:"bar",data:{labels:CATS.map(function(c){return c.title.split(". ")[1]}),datasets:[{label:"Нарушений",data:CATS.map(function(cat){return audits.reduce(function(s,a){var c=a.categories&&a.categories[cat.id];return s+(c?c.items.length:0)},0)}),backgroundColor:"#E63946",borderRadius:6}]},options:{responsive:true,plugins:{legend:{display:false}},scales:{y:{beginAtZero:true,ticks:{stepSize:1}}}}});var dates={};audits.forEach(function(a){if(!dates[a.date])dates[a.date]=0;dates[a.date]+=(a.totalViolations||0)});var sd=Object.keys(dates).sort();var ctx2=document.getElementById("ch2");if(ctx2)charts.tl=new Chart(ctx2,{type:"line",data:{labels:sd,datasets:[{label:"Нарушений",data:sd.map(function(d){return dates[d]}),borderColor:"#E63946",backgroundColor:"rgba(230,57,70,0.08)",fill:true,tension:0.3,pointRadius:5}]},options:{responsive:true,plugins:{legend:{display:false}},scales:{y:{beginAtZero:true,ticks:{stepSize:1}}}}});var ic={};audits.forEach(function(a){if(a.categories){Object.values(a.categories).forEach(function(cat){if(cat.items)cat.items.forEach(function(it){ic[it.item]=(ic[it.item]||0)+1})})}});var ti=Object.entries(ic).sort(function(a,b){return b[1]-a[1]}).slice(0,10);var ctx3=document.getElementById("ch3");if(ctx3)charts.top=new Chart(ctx3,{type:"bar",data:{labels:ti.map(function(i){return i[0].length>30?i[0].slice(0,30)+"...":i[0]}),datasets:[{label:"Раз",data:ti.map(function(i){return i[1]}),backgroundColor:["#E63946","#E76F51","#F4A261","#E9C46A","#2A9D8F","#264653","#00B4D8","#0077B6","#023E8A","#6C757D"],borderRadius:4}]},options:{indexAxis:"y",responsive:true,plugins:{legend:{display:false}},scales:{x:{beginAtZero:true,ticks:{stepSize:1}}}}})},300)} function rVL(){var c=document.getElementById("vlc");if(!c)return;var audits=getA();var today=new Date().toISOString().split("T")[0];var allV=[];audits.forEach(function(a){if(!a.violations)return;a.violations.forEach(function(v){var dd=v.date||"",done=v.done&&v.done.trim();var st="pending";if(done)st="done";else if(dd&&dd
Всего
"+allV.length+"
Устранено
"+allV.filter(function(v){return v.status==="done"}).length+"
Просрочено
"+allV.filter(function(v){return v.status==="overdue"}).length+"
В работе
"+allV.filter(function(v){return v.status==="pending"}).length+"
"+allV.map(function(v,i){var sc=v.status==="done"?"badge-s":v.status==="overdue"?"badge-d":"badge-w";var sl=v.status==="done"?"Устранено":v.status==="overdue"?"Просрочено":"В работе";return""}).join("")+"
НесоответствиеАудитИсполнительВидМерыОтветственныйСрокЗавершениеСтатус
"+(i+1)+""+v.nc+""+v.auditDate+""+v.executor+""+v.type+""+(v.measure||"—")+""+v.responsible+""+(v.date||"—")+""+(v.done||"—")+""+sl+"
"} @@ -150,11 +161,11 @@ function exportCSV(){var audits=getA();if(audits.length===0){alert("Нет да function editA(id){if(!isA()){alert("Только администратор");return}var a=getA().find(function(x){return x.id===id});if(!a)return;editId=id;swP("NA");setTimeout(function(){document.getElementById("pn").value=a.number||"";document.getElementById("pd").value=a.date||"";document.getElementById("ps").value=a.timeStart||"";document.getElementById("pe").value=a.timeEnd||"";document.getElementById("pl").value=a.location||"";document.getElementById("pr").value=a.region||"";document.getElementById("pw").value=a.workType||"";document.getElementById("pc").value=a.workerCount||1;document.getElementById("po").value=a.observer||"";document.getElementById("por").value=a.observerRole||"";document.getElementById("psv").value=a.supervisor||"";document.getElementById("psr").value=a.supervisorRole||"";document.getElementById("pem").value=a.email||"";setO(a.overallSafe?"safe":"danger");CATS.forEach(function(cat){var cd=a.categories&&a.categories[cat.id];var it=cd?cd.items:[];it.forEach(function(i){var idx=cat.items.indexOf(i.item);if(idx>=0){var cb=document.getElementById("cb-"+cat.id+"-"+idx);if(cb){cb.checked=true;cb.parentElement.classList.add("ck")}if(i.other){var o=document.getElementById("other-"+cat.id);if(o){o.value=i.other;o.style.display="block";o.classList.add("vs")}}}});document.getElementById("ascb-"+cat.id).checked=it.length===0;document.getElementById("as-"+cat.id).classList.toggle("ac2",it.length===0);updateCatTotal(cat.id)});document.getElementById("vr").innerHTML="";if(a.violations&&a.violations.length>0){vrc=a.violations.length;document.getElementById("vr").innerHTML=a.violations.map(function(v,i){return mkV(i+1,v)}).join("")}else{vrc=1;document.getElementById("vr").innerHTML=mkV(1)}setDL(a.dialogue||[])},200)} function delA(id){if(!isA()){alert("Только администратор");return}if(!confirm("Удалить?"))return;saveA(getA().filter(function(a){return a.id!==id}));rHT()} function downloadFullCSV(){var audits=getA();if(audits.length===0){alert("Нет данных");return}var all=allU();var h="Бланк №;Дата;Время;Место;Тип;Наблюдатель;Должность;Руководитель;Филиал;Подразделение;Регион;Область;Город;Статус;Нарушений";var rows=audits.map(function(a){var u=all[a.createdBy]||{};return(a.number||"")+";"+a.date+";"+(a.timeStart||"")+"-"+(a.timeEnd||"")+";\""+a.location+"\";\""+(a.workType||"")+"\";\""+a.observer+"\";\""+(a.observerRole||"")+"\";\""+(a.supervisor||"")+"\";\""+(u.branch||"")+"\";\""+(u.dept||"")+"\";\""+(u.region||"")+"\";\""+(u.oblast||"")+"\";\""+(u.city||"")+"\";"+(a.overallSafe?"Безопасно":"Нарушения")+";"+(a.totalViolations||0)});var csv="\uFEFF"+h+"\n"+rows.join("\n");var blob=new Blob([csv],{type:"text/csv"});var url=URL.createObjectURL(blob);var dl=document.createElement("a");dl.href=url;dl.download="pab-full.csv";dl.click();URL.revokeObjectURL(url)} -function downloadWorkerReport(){var audits=getA();var all=allU();var ul=[];for(var k in all)if(k!=="admin")ul.push({login:k,name:all[k].name,role:all[k].role,branch:all[k].branch||"",dept:all[k].dept||"",region:all[k].region||"",oblast:all[k].oblast||"",city:all[k].city||"",email:all[k].email||""});if(ul.length===0){alert("Нет работников");return}var h="Логин;ФИО;Должность;Филиал;Подразделение;Регион;Область;Город;Email;График;Период;Выполнено;Нужно;Статус";var rows=ul.map(function(u){var q=gq(u.role);if(!q.p)return u.login+";\""+u.name+"\";\""+u.role+"\";\""+u.branch+"\";\""+u.dept+"\";\""+u.region+"\";\""+u.oblast+"\";\""+u.city+"\";\""+u.email+"\";Без графика;;;0;—";var p=gp(q.p);var done=audits.filter(function(a){return a.createdBy===u.login&&new Date(a.date)>=p.s}).length;var st=done>=q.c?"Выполнен":"Отстаёт ("+(q.c-done)+")";return u.login+";\""+u.name+"\";\""+u.role+"\";\""+u.branch+"\";\""+u.dept+"\";\""+u.region+"\";\""+u.oblast+"\";\""+u.city+"\";\""+u.email+"\";\""+q.l+"\";\""+p.l+"\";"+done+";"+q.c+";\""+st+"\""});var csv="\uFEFF"+h+"\n"+rows.join("\n");var blob=new Blob([csv],{type:"text/csv"});var url=URL.createObjectURL(blob);var dl=document.createElement("a");dl.href=url;dl.download="pab-workers.csv";dl.click();URL.revokeObjectURL(url)} -function downloadSummaryHTML(){var audits=getA();var all=allU();var ul=[];for(var k in all)if(k!=="admin")ul.push({login:k,name:all[k].name,role:all[k].role,branch:all[k].branch||"",dept:all[k].dept||"",region:all[k].region||"",city:all[k].city||""});var total=audits.length,allSafe=audits.filter(function(a){return a.overallSafe}).length,wd=audits.filter(function(a){return !a.overallSafe}).length,tv=audits.reduce(function(s,a){return s+(a.totalViolations||0)},0);var ot=0,bh=0;ul.forEach(function(u){var q=gq(u.role);if(!q.p)return;var p=gp(q.p);var done=audits.filter(function(a){return a.createdBy===u.login&&new Date(a.date)>=p.s}).length;if(done>=q.c)ot++;else bh++});var wr=ul.map(function(u){var q=gq(u.role);if(!q.p)return""+u.name+""+u.role+""+u.branch+""+u.dept+""+u.region+""+u.city+"Без графика—";var p=gp(q.p);var done=audits.filter(function(a){return a.createdBy===u.login&&new Date(a.date)>=p.s}).length;var c=done>=q.c?"green":"red";return""+u.name+""+u.role+""+u.branch+""+u.dept+""+u.region+""+u.city+""+done+"/"+q.c+" ("+q.l+")"+p.l+""}).join("");var h="Отчёт ПАБ

📊 Сводный отчёт ПАБ

Сформирован: "+new Date().toLocaleString("ru")+"

Всего аудитов
"+total+"
Безопасно
"+allSafe+"
С нарушениями
"+wd+"
Нарушений
"+tv+"
Выполняют график
"+ot+"
Отстают
"+bh+"

👥 График

"+wr+"
ФИОДолжностьФилиалПодразделениеРегионГородПрогрессПериод
";var w=window.open("","_blank","width=1000,height=800");w.document.write(h);w.document.close()} +function downloadWorkerReport(){var audits=getA();var all=allU();var ul=[];for(var k in all)if(k!=="admin")ul.push({login:k,name:all[k].name,role:all[k].role,branch:all[k].branch||"",dept:all[k].dept||"",region:all[k].region||"",oblast:all[k].oblast||"",city:all[k].city||"",email:all[k].email||""});if(ul.length===0){alert("Нет работников");return}var h="Логин;ФИО;Должность;Филиал;Подразделение;Регион;Область;Город;Email;График;Период;Выполнено;Нужно;Статус";var rows=ul.map(function(u){var q=getUserQuota(u);if(!q.p)return u.login+";\""+u.name+"\";\""+u.role+"\";\""+u.branch+"\";\""+u.dept+"\";\""+u.region+"\";\""+u.oblast+"\";\""+u.city+"\";\""+u.email+"\";Без графика;;;0;—";var p=gp(q.p);var done=audits.filter(function(a){return a.createdBy===u.login&&new Date(a.date)>=p.s}).length;var st=done>=q.c?"Выполнен":"Отстаёт ("+(q.c-done)+")";return u.login+";\""+u.name+"\";\""+u.role+"\";\""+u.branch+"\";\""+u.dept+"\";\""+u.region+"\";\""+u.oblast+"\";\""+u.city+"\";\""+u.email+"\";\""+q.l+"\";\""+p.l+"\";"+done+";"+q.c+";\""+st+"\""});var csv="\uFEFF"+h+"\n"+rows.join("\n");var blob=new Blob([csv],{type:"text/csv"});var url=URL.createObjectURL(blob);var dl=document.createElement("a");dl.href=url;dl.download="pab-workers.csv";dl.click();URL.revokeObjectURL(url)} +function downloadSummaryHTML(){var audits=getA();var all=allU();var ul=[];for(var k in all)if(k!=="admin")ul.push({login:k,name:all[k].name,role:all[k].role,branch:all[k].branch||"",dept:all[k].dept||"",region:all[k].region||"",city:all[k].city||""});var total=audits.length,allSafe=audits.filter(function(a){return a.overallSafe}).length,wd=audits.filter(function(a){return !a.overallSafe}).length,tv=audits.reduce(function(s,a){return s+(a.totalViolations||0)},0);var ot=0,bh=0;ul.forEach(function(u){var q=getUserQuota(u);if(!q.p)return;var p=gp(q.p);var done=audits.filter(function(a){return a.createdBy===u.login&&new Date(a.date)>=p.s}).length;if(done>=q.c)ot++;else bh++});var wr=ul.map(function(u){var q=getUserQuota(u);if(!q.p)return""+u.name+""+u.role+""+u.branch+""+u.dept+""+u.region+""+u.city+"Без графика—";var p=gp(q.p);var done=audits.filter(function(a){return a.createdBy===u.login&&new Date(a.date)>=p.s}).length;var c=done>=q.c?"green":"red";return""+u.name+""+u.role+""+u.branch+""+u.dept+""+u.region+""+u.city+""+done+"/"+q.c+" ("+q.l+")"+p.l+""}).join("");var h="Отчёт ПАБ

📊 Сводный отчёт ПАБ

Сформирован: "+new Date().toLocaleString("ru")+"

Всего аудитов
"+total+"
Безопасно
"+allSafe+"
С нарушениями
"+wd+"
Нарушений
"+tv+"
Выполняют график
"+ot+"
Отстают
"+bh+"

👥 График

"+wr+"
ФИОДолжностьФилиалПодразделениеРегионГородПрогрессПериод
";var w=window.open("","_blank","width=1000,height=800");w.document.write(h);w.document.close()} function clearAllAudits(){if(!isA())return;if(!confirm("Удалить ВСЕ аудиты?"))return;if(!confirm("Точно?"))return;localStorage.removeItem("pab_audits");alert("Удалено")} function clearAuditsByDate(){if(!isA())return;var from=prompt("С даты (ГГГГ-ММ-ДД):","");if(!from)return;var to=prompt("По дату (ГГГГ-ММ-ДД):","");var audits=getA();var before=audits.length;audits=audits.filter(function(a){if(a.dateto)return true;return false});if(before===audits.length){alert("Нет аудитов за период");return}if(!confirm("Удалить "+(before-audits.length)+"?"))return;saveA(audits);alert("Удалено "+(before-audits.length))} -function showAllUsers(){if(!isA())return;var all=allU();var h="

👥 Пользователи

";for(var k in all){var u=all[k],q=gq(u.role);h+=""}h+="
ЛогинФИОДолжностьФилиалПодразделениеРегионОбластьГородEmailГрафик
"+k+(k==="admin"?" ⭐":"")+""+u.name+""+u.role+""+(u.branch||"—")+""+(u.dept||"—")+""+(u.region||"—")+""+(u.oblast||"—")+""+(u.city||"—")+""+(u.email||"—")+""+q.l+"
";var w=window.open("","_blank","width=1000,height=600");w.document.write("Пользователи"+h+"");w.document.close()} +function showAllUsers(){if(!isA())return;var all=allU();var h="

👥 Пользователи

";for(var k in all){var u=all[k],q=getUserQuota(u);h+=""}h+="
ЛогинФИОДолжностьФилиалПодразделениеРегионОбластьГородEmailГрафик
"+k+(k==="admin"?" ⭐":"")+""+u.name+""+u.role+""+(u.branch||"—")+""+(u.dept||"—")+""+(u.region||"—")+""+(u.oblast||"—")+""+(u.city||"—")+""+(u.email||"—")+""+q.l+"
";var w=window.open("","_blank","width=1000,height=600");w.document.write("Пользователи"+h+"");w.document.close()} document.getElementById("pd").value=new Date().toISOString().split("T")[0]; document.getElementById("po").value=U.name;document.getElementById("por").value=U.role||""; diff --git a/index.html b/index.html index 94c26e1..fcd9058 100644 --- a/index.html +++ b/index.html @@ -40,6 +40,7 @@ button:hover{background:#48CAE4} + @@ -55,15 +56,15 @@ document.getElementById('tR').onclick=function(){document.getElementById('loginF document.getElementById('lb').onclick=function(){ var u=document.getElementById('lu').value.trim().toLowerCase(); var p=document.getElementById('lp').value.trim(); - if(u==='admin'&&p==='admin'){sessionStorage.setItem('pab_user',JSON.stringify({login:'admin',name:'Администратор',role:'Руководитель',email:'admin@telecom.kz',branch:'АО «Казахтелеком»',dept:'ЦА',region:'Центральный',oblast:'—',city:'г. Астана'}));location.href='app.html';return} - var users={};try{users=JSON.parse(localStorage.getItem('pab_users')||'{}')}catch(e){}if(users[u]&&users[u].pass===p){sessionStorage.setItem('pab_user',JSON.stringify({login:u,name:users[u].name,role:users[u].role,email:users[u].email||'',branch:users[u].branch||'',dept:users[u].dept||'',region:users[u].region||'',oblast:users[u].oblast||'',city:users[u].city||''}));location.href='app.html';return} + if(u==='admin'&&p==='admin'){sessionStorage.setItem('pab_user',JSON.stringify({login:'admin',name:'Администратор',role:'Руководитель',freq:'0,month',email:'admin@telecom.kz',branch:'АО «Казахтелеком»',dept:'ЦА',region:'Центральный',oblast:'—',city:'г. Астана'}));location.href='app.html';return} + var users={};try{users=JSON.parse(localStorage.getItem('pab_users')||'{}')}catch(e){}if(users[u]&&users[u].pass===p){sessionStorage.setItem('pab_user',JSON.stringify({login:u,name:users[u].name,role:users[u].role,freq:users[u].freq||'',email:users[u].email||'',branch:users[u].branch||'',dept:users[u].dept||'',region:users[u].region||'',oblast:users[u].oblast||'',city:users[u].city||''}));location.href='app.html';return} document.getElementById('lerr').style.display='block' }; document.getElementById('lp').onkeydown=function(e){if(e.key==='Enter')document.getElementById('lb').onclick()}; document.getElementById('rbb').onclick=function(){ - var l=document.getElementById('rl').value.trim().toLowerCase(),p=document.getElementById('rp').value.trim(),n=document.getElementById('rn').value.trim(),em=document.getElementById('re').value.trim(),r=document.getElementById('rr').value,br=document.getElementById('rb').value.trim(),dp=document.getElementById('rd').value.trim(),rg=document.getElementById('rg').value.trim(),ob=document.getElementById('ro').value.trim(),ct=document.getElementById('rc').value.trim(); - var e=document.getElementById('rerr'),ok=document.getElementById('rok');ok.style.display='none';if(!l||l.length<2){e.textContent='Логин мин. 2 символа';e.style.display='block';return}if(!p||p.length<3){e.textContent='Пароль мин. 3 символа';e.style.display='block';return}if(!n){e.textContent='Укажите ФИО';e.style.display='block';return}if(!r){e.textContent='Выберите должность';e.style.display='block';return}if(!em||em.indexOf('@')<0){e.textContent='Укажите Email';e.style.display='block';return}if(!br){e.textContent='Укажите филиал';e.style.display='block';return}if(!rg){e.textContent='Укажите регион';e.style.display='block';return}if(!ct){e.textContent='Укажите город';e.style.display='block';return}if(!dp){e.textContent='Укажите подразделение';e.style.display='block';return} - var users={};try{users=JSON.parse(localStorage.getItem('pab_users')||'{}')}catch(e){}if(users[l]){e.textContent='Логин занят';e.style.display='block';return}e.style.display='none';users[l]={pass:p,name:n,email:em,role:r,branch:br,dept:dp,region:rg,oblast:ob,city:ct};localStorage.setItem('pab_users',JSON.stringify(users));ok.style.display='block';document.getElementById('lu').value=l;setTimeout(function(){ok.style.display='none';document.getElementById('tL').onclick()},2000) + var l=document.getElementById('rl').value.trim().toLowerCase(),p=document.getElementById('rp').value.trim(),n=document.getElementById('rn').value.trim(),em=document.getElementById('re').value.trim(),r=document.getElementById('rr').value,fr=document.getElementById('rf').value,br=document.getElementById('rb').value.trim(),dp=document.getElementById('rd').value.trim(),rg=document.getElementById('rg').value.trim(),ob=document.getElementById('ro').value.trim(),ct=document.getElementById('rc').value.trim(); + var e=document.getElementById('rerr'),ok=document.getElementById('rok');ok.style.display='none';if(!l||l.length<2){e.textContent='Логин мин. 2 символа';e.style.display='block';return}if(!p||p.length<3){e.textContent='Пароль мин. 3 символа';e.style.display='block';return}if(!n){e.textContent='Укажите ФИО';e.style.display='block';return}if(!r){e.textContent='Выберите должность';e.style.display='block';return}if(!em||em.indexOf('@')<0){e.textContent='Укажите Email';e.style.display='block';return}if(!br){e.textContent='Укажите филиал';e.style.display='block';return}if(!rg){e.textContent='Укажите регион';e.style.display='block';return}if(!ct){e.textContent='Укажите город';e.style.display='block';return}if(!dp){e.textContent='Укажите подразделение';e.style.display='block';return}if(!fr){e.textContent='Укажите периодичность ПАБ';e.style.display='block';return} + var users={};try{users=JSON.parse(localStorage.getItem('pab_users')||'{}')}catch(e){}if(users[l]){e.textContent='Логин занят';e.style.display='block';return}e.style.display='none';users[l]={pass:p,name:n,email:em,role:r,freq:fr,branch:br,dept:dp,region:rg,oblast:ob,city:ct};localStorage.setItem('pab_users',JSON.stringify(users));ok.style.display='block';document.getElementById('lu').value=l;setTimeout(function(){ok.style.display='none';document.getElementById('tL').onclick()},2000) };