fix: revert to proven working base + only login fix

This commit is contained in:
Dauren777 2026-06-11 11:25:37 +00:00
parent 32a0bbd4a1
commit bd59b32284

View File

@ -92,7 +92,7 @@ tr:hover{background:#FAFBFC}
<div id="main">
<div class="top"><h2 id="page_title">Мероприятия</h2>
<div style="display:flex;gap:8px;align-items:center">
<span id="stor_ind" class="stor-bar"></span> <button class="btn btn-sm btn-r" style="padding:2px 8px;font-size:11px" onclick="clearFiles()" title="Очистить все файлы">Очистить файлы</button>
<span id="stor_ind" class="stor-bar"></span>
<button class="btn btn-sm btn-o" onclick="saveBackup()">Резерв</button>
<button class="btn btn-sm btn-g" onclick="document.getElementById('fu').click()">Восст.</button>
<input type="file" id="fu" accept=".json" style="display:none" onchange="loadBackup(this)">
@ -152,13 +152,7 @@ tr:hover{background:#FAFBFC}
<option value="h1">1-е полугодие</option>
<option value="h2">2-е полугодие</option>
</select>
<div style="display:flex;gap:4px;flex-wrap:wrap;margin-bottom:4px" id="rp_quick_months"></div><span style="font-size:12px;color:#64748B">с</span> <select id="rp_month_from" onchange="renderReports()" style="padding:6px 8px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px">
<option value="0">Январь</option><option value="1">Февраль</option><option value="2">Март</option>
<option value="3">Апрель</option><option value="4">Май</option><option value="5">Июнь</option>
<option value="6">Июль</option><option value="7">Август</option><option value="8">Сентябрь</option>
<option value="9">Октябрь</option><option value="10">Ноябрь</option><option value="11">Декабрь</option>
</select>
<span style="font-size:12px;color:#64748B">по</span> <select id="rp_month_to" onchange="renderReports()" style="padding:6px 8px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px">
<select id="rp_month" onchange="renderReports()" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;display:none">
<option value="0">Январь</option><option value="1">Февраль</option><option value="2">Март</option>
<option value="3">Апрель</option><option value="4">Май</option><option value="5">Июнь</option>
<option value="6">Июль</option><option value="7">Август</option><option value="8">Сентябрь</option>
@ -179,7 +173,6 @@ tr:hover{background:#FAFBFC}
<button class="btn btn-sm" onclick="dlHTML()">HTML</button>
<button class="btn btn-sm btn-o" onclick="dlWord()">Word</button>
<button class="btn btn-sm btn-r" onclick="dlPdf()">PDF</button>
<button class="btn btn-sm" style="background:#7C3AED;color:#fff" onclick="dlZip()">ZIP</button>
</div>
<p id="rp_count" style="font-size:12px;color:#64748B;margin-top:8px"></p>
</div>
@ -1019,12 +1012,6 @@ function init(){
}
if(cu)showApp()
}
function clearFiles(){
if(!confirm("\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043D\u044B\u0435 \u0444\u0430\u0439\u043B\u044B? \u042D\u0442\u043E \u043E\u0441\u0432\u043E\u0431\u043E\u0434\u0438\u0442 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435."))return;
var keys=[];for(var k in localStorage){if(localStorage.hasOwnProperty(k)&&k.indexOf("sf_")===0)keys.push(k)}
for(var i=0;i<keys.length;i++){localStorage.removeItem(keys[i])}
storCheck();alert("\u0423\u0434\u0430\u043B\u0435\u043D\u043E "+keys.length+" \u0444\u0430\u0439\u043B\u043E\u0432")
}
function doLogin(){
var e=document.getElementById("lem").value.trim().toLowerCase();
@ -1212,10 +1199,6 @@ function openEv(id,subIdx){
for(var i=0;i<evs.length;i++){if(evs[i].id===id){e=evs[i];break}}
if(!e)return;
var fk=subIdx!==undefined?"sf_"+id+"_s"+subIdx:"sf_"+id;
var now=new Date();var curMonth=now.getMonth();
var savedMonth=localStorage.getItem("evmonth_"+id);
var selMonth=savedMonth!==null?parseInt(savedMonth,10):curMonth;
var fkBase="sf_"+id+"_m"+selMonth+(subIdx!==undefined?"_s"+subIdx:"");
var h="<div style='max-width:700px'>";
var titlePre=subIdx!==undefined?"N"+id+"."+e.sub[subIdx].l+" ":"N"+id+". ";
h+="<h3 style='margin-bottom:8px;padding-right:30px'>"+titlePre+esc(e.t)+"</h3>";
@ -1239,7 +1222,12 @@ function openEv(id,subIdx){
h+="<div style='margin-bottom:12px;padding:10px;background:#F0F9FF;border-radius:8px'><strong>AI-анализ:</strong> <span style='font-size:13px;color:#64748B'>"+esc(e.ai||"\u2014")+"</span></div>";
h+="<div style='margin-bottom:12px'><strong>Отчётность:</strong></div>";
h+="<div style='margin-bottom:8px;display:flex;gap:8px;flex-wrap:wrap;align-items:center'>";
h+="<span style='font-size:12px;margin-left:8px'>Месяц:</span> <select id='evm_"+e.id+"' onchange='switchEvMonth("+e.id+","+(subIdx!==undefined?subIdx:"null")+")' style='padding:4px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px'>";
h+="<span style='font-size:12px'>Количество:</span> <input type='number' id='evq_"+e.id+"' value='"+(e.q||"")+"' min='0' style='width:80px;padding:4px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px'>";
var now=new Date();
var curMonth=now.getMonth();
var savedMonth=localStorage.getItem("evmonth_"+e.id);
var selMonth=savedMonth!==null?parseInt(savedMonth,10):curMonth;
h+="<span style='font-size:12px;margin-left:8px'>Месяц:</span> <select id='evm_"+e.id+"' style='padding:4px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px'>";
var mnames=["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"];
for(var mi=0;mi<12;mi++){
h+="<option value='"+mi+"'";
@ -1247,11 +1235,11 @@ function openEv(id,subIdx){
h+=">"+mnames[mi]+"</option>"
}
h+="</select></div>";
h+="<div style='margin-bottom:12px'><textarea id='evn_"+e.id+"' placeholder='Примечание / описание выполнения...' style='width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px;resize:vertical;min-height:50px'>"+esc(subIdx!==undefined?((localStorage.getItem("sn_"+e.id+"_s"+subIdx+"_m"+selMonth)||"")):(localStorage.getItem("sn_"+e.id+"_m"+selMonth)||e.n||""))+"</textarea></div>";
h+="<div style='margin-bottom:12px'><textarea id='evn_"+e.id+"' placeholder='Примечание / описание выполнения...' style='width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px;resize:vertical;min-height:50px'>"+esc(subIdx!==undefined?((localStorage.getItem("sn_"+e.id+"_s"+subIdx)||"")):(e.n||""))+"</textarea></div>";
h+="<div style='margin-bottom:12px'><strong>Файлы:</strong>";
if(cu&&cu.bg===0){
for(var bi=0;bi<brs.length;bi++){
var bk=fkBase+"_b"+bi;
var bk=fk+"_b"+bi;
var fd=localStorage.getItem(bk);
if(fd){
try{
@ -1259,20 +1247,20 @@ function openEv(id,subIdx){
if(fa.length)h+="<div style='font-size:11px;color:#64748B;margin-top:4px'><strong>"+esc(brs[bi])+":</strong></div>";
for(var fi=0;fi<fa.length;fi++){
var f=fa[fi];
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='openFile("+e.id+","+fi+","+bi+")'>Открыть</a> <a onclick='dlFile("+e.id+","+fi+","+bi+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+","+bi+")'>Удалить</a></div>"
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='dlFile("+e.id+","+fi+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+")'>Удалить</a></div>"
}
}catch(ex){}
}
}
}else{
var bk=fkBase+"_b"+(cu?cu.bg:0);
var bk=fk+"_b"+(cu?cu.bg:0);
var fd=localStorage.getItem(bk);
if(fd){
try{
var fa=JSON.parse(fd);
for(var fi=0;fi<fa.length;fi++){
var f=fa[fi];
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='openFile("+e.id+","+fi+","+(cu?cu.bg:0)+")'>Открыть</a> <a onclick='dlFile("+e.id+","+fi+","+(cu?cu.bg:0)+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+","+(cu?cu.bg:0)+")'>Удалить</a></div>"
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='dlFile("+e.id+","+fi+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+")'>Удалить</a></div>"
}
}catch(ex){}
}
@ -1306,20 +1294,27 @@ function closeModal(){
document.getElementById("modal").style.display="none"
}
function switchEvMonth(id,subIdx){
var inm=document.getElementById("evm_"+id);if(!inm)return;
var mv=inm.value;
var inn=document.getElementById("evn_"+id);
if(inn)try{localStorage.setItem("sn_"+id+subSuffix+"_m"+mv,inn.value.trim())}catch(e){}
try{localStorage.setItem("evmonth_"+id,mv)}catch(e){}
openEv(id,subIdx!==null?subIdx:undefined)
}
function saveEvModal(id){
var sel=document.getElementById("evs_"+id);
for(var i=0;i<evs.length;i++){if(evs[i].id===id){if(sel)evs[i].s=sel.value;if(sel&&sel.value==="done"&&(evs[i].done==="\\u2014"||!evs[i].done)){var d=new Date();evs[i].done=d.getDate()+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear()}break}}
var inq=document.getElementById("evq_"+id);
var inn=document.getElementById("evn_"+id);
for(var i=0;i<evs.length;i++){
if(evs[i].id===id){
if(sel)evs[i].s=sel.value;
if(inq)evs[i].q=parseInt(inq.value,10)||0;
if(inn){if(curSub!==null){try{localStorage.setItem("sn_"+id+"_s"+curSub,inn.value.trim())}catch(e){}}else{evs[i].n=inn.value.trim()}}
if(sel&&sel.value==="done"&&(evs[i].done==="\u2014"||!evs[i].done)){
var d=new Date();
evs[i].done=d.getDate()+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear()
}
break
}
}
var inm=document.getElementById("evm_"+id);
if(inm){var mv=inm.value;try{localStorage.setItem("evmonth_"+id,mv)}catch(e){};var inn=document.getElementById("evn_"+id);var subSuffix2=curSub!==null?"_s"+curSub:"";if(inn)try{localStorage.setItem("sn_"+id+subSuffix2+"_m"+mv,inn.value.trim())}catch(e){}}
saveEv();closeModal();renderEv()
if(inm)try{localStorage.setItem("evmonth_"+id,inm.value)}catch(e){}
saveEv();
closeModal();
renderEv()
}
function chgSt(id){
var sel=document.getElementById("evs_"+id);
@ -1340,35 +1335,28 @@ function upFile(id){
var inp=document.getElementById("fu_"+id);
if(!inp||!inp.files||!inp.files[0])return;
var f=inp.files[0];
if(f.size>2097152){alert("\u0424\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 2MB. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0441\u0436\u043C\u0438\u0442\u0435 \u0444\u0430\u0439\u043B.");return}
if(f.size>3145728){alert("\u0424\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 3MB");return}
var fr=new FileReader();
var subKey=curSub!==null?"_s"+curSub:"";
var inm=document.getElementById("evm_"+id);
var monthKey=inm?"_m"+inm.value:"";
var brKey="_b"+(cu?cu.bg:0);
var fname=f.name;var fsize=f.size;
fr.onload=function(){
var key="sf_"+id+monthKey+subKey+brKey;
var arr=[];var ex=localStorage.getItem(key);if(ex){try{arr=JSON.parse(ex)}catch(e){}}
var arr=[];
var ex=localStorage.getItem(key);
if(ex){try{arr=JSON.parse(ex)}catch(e){}}
var d=new Date();
arr.push({n:fname,s:fsize,d:d.getDate()+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear(),u:cu?cu.n:"",data:fr.result});
try{localStorage.setItem(key,JSON.stringify(arr))}catch(e){alert("\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F. \u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.");return}
arr.push({n:f.name,s:f.size,d:d.getDate()+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear(),u:cu?cu.n:"",data:fr.result});
try{localStorage.setItem(key,JSON.stringify(arr))}catch(e){alert("\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F")}
openEv(id,curSub!==null?curSub:undefined)
};
fr.readAsDataURL(f)
}
function openFile(id,idx,br){
var inm=document.getElementById("evm_"+id);
var mk=inm?"_m"+inm.value:"";var bk="_b"+(br!==undefined?br:(cu?cu.bg:0));
var key="sf_"+id+mk+(curSub!==null?"_s"+curSub:"")+bk;
var ex=localStorage.getItem(key);if(!ex)return;
try{var arr=JSON.parse(ex);var f=arr[idx];if(f&&f.data){var w=window.open("","_blank");w.document.write("<iframe src='"+f.data+"' style='width:100%;height:100%;border:none'></iframe>")}}catch(e){}
}
function dlFile(id,idx,br){
function dlFile(id,idx){
var inm=document.getElementById("evm_"+id);
var monthKey=inm?"_m"+inm.value:"";
var brKey="_b"+(br!==undefined?br:(cu?cu.bg:0));
var key="sf_"+id+monthKey+(curSub!==null?"_s"+curSub:"")+brKey;
var key="sf_"+id+monthKey+(curSub!==null?"_s"+curSub:"")+"_b"+(cu?cu.bg:0);
var ex=localStorage.getItem(key);
if(!ex)return;
try{
@ -1383,12 +1371,11 @@ function dlFile(id,idx,br){
document.body.removeChild(a)
}catch(e){}
}
function delFile(id,idx,br){
function delFile(id,idx){
if(!confirm("\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0444\u0430\u0439\u043B?"))return;
var inm=document.getElementById("evm_"+id);
var monthKey=inm?"_m"+inm.value:"";
var brKey="_b"+(br!==undefined?br:(cu?cu.bg:0));
var key="sf_"+id+monthKey+(curSub!==null?"_s"+curSub:"")+brKey;
var key="sf_"+id+monthKey+(curSub!==null?"_s"+curSub:"")+"_b"+(cu?cu.bg:0);
var ex=localStorage.getItem(key);
if(!ex)return;
try{
@ -1402,11 +1389,11 @@ function delFile(id,idx,br){
function saveBackup(){
saveEv();
var backup={events:evs.map(function(e){return{id:e.id,s:e.s,p:e.p,done:e.done,h:e.h,q:e.q,n:e.n}}),files:{}};
var fkeys=[];for(var k in localStorage){if(localStorage.hasOwnProperty(k)&&k.indexOf("sf_")===0)fkeys.push(k)}
for(var i=0;i<fkeys.length;i++){backup.files[fkeys[i]]=localStorage.getItem(fkeys[i])}
var blob=new Blob([JSON.stringify(backup,null,2)],{type:"application/json"});
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="backup_"+new Date().toISOString().slice(0,10)+".json";a.click()
var blob=new Blob([JSON.stringify(evs,null,2)],{type:"application/json"});
var a=document.createElement("a");
a.href=URL.createObjectURL(blob);
a.download="backup_"+new Date().toISOString().slice(0,10)+".json";
a.click()
}
function loadBackup(inp){
if(!inp.files||!inp.files[0])return;
@ -1414,13 +1401,15 @@ function loadBackup(inp){
fr.onload=function(){
try{
var d=JSON.parse(fr.result);
if(!d||!d.events){alert("\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442");return}
var out=[];for(var i=0;i<d.events.length;i++){out.push({id:d.events[i].id,s:d.events[i].s||"warn",p:d.events[i].p||0,done:d.events[i].done||"\u2014",h:d.events[i].h||[],q:d.events[i].q||0,n:d.events[i].n||""})}
if(!d||!d.length){alert("\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442");return}
var out=[];
for(var i=0;i<d.length;i++){
out.push({id:d[i].id,s:d[i].s||"warn",p:d[i].p||0,done:d[i].done||"\u2014",h:d[i].h||[]})
}
localStorage.setItem("se5",JSON.stringify(out));
if(d.files){var fk=Object.keys(d.files);for(var i=0;i<fk.length;i++){try{localStorage.setItem(fk[i],d.files[fk[i]])}catch(e){}}}
loadEv();renderEv();
var fc=d.files?Object.keys(d.files).length:0;
alert("\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E "+out.length+" \u0437\u0430\u043F\u0438\u0441\u0435\u0439, "+fc+" \u0444\u0430\u0439\u043B\u043E\u0432")
loadEv();
renderEv();
alert("\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E "+out.length+" \u0437\u0430\u043F\u0438\u0441\u0435\u0439")
}catch(e){alert("\u041E\u0448\u0438\u0431\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438")}
};
fr.readAsText(inp.files[0])
@ -1438,7 +1427,7 @@ function storCheck(){
}
var max=5242880;
var pct=Math.round(used/max*100);
el.textContent="\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435: "+pct+"% ("+Math.round(used/1024)+"KB)"+(pct>80?" \u2014 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u00AB\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B\u00BB":"")
el.textContent="\u0425\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435: "+pct+"% ("+Math.round(used/1024)+"KB)"
}catch(e){el.textContent=""}
}
@ -1467,7 +1456,7 @@ function renderAnalytics(){
}
}
problem.sort(function(a,b){return a.dr-b.dr});
var pt=problem.slice(0,5);
var pt=problem.slice(0,10);
if(pt.length){
var ph="<table><tr><th>N</th><th>\u041C\u0435\u0440\u043E\u043F\u0440\u0438\u044F\u0442\u0438\u0435</th><th>\u0424\u0438\u043B\u0438\u0430\u043B</th><th>\u0421\u0442\u0430\u0442\u0443\u0441</th><th>\u0414\u043D\u0435\u0439</th></tr>";
for(var i=0;i<pt.length;i++){
@ -1483,13 +1472,29 @@ function renderAnalytics(){
}
function getFilteredEvs(){
var period=document.getElementById("rp_period").value;
var statusF=document.getElementById("rp_status").value;
var year=parseInt(document.getElementById("rp_year").value,10)||2026;
var months=getReportMonths();
var month=parseInt(document.getElementById("rp_month").value,10)||0;
var months=[];
if(period==="month"){months=[month]}
else if(period==="q1"){months=[0,1,2]}
else if(period==="q2"){months=[3,4,5]}
else if(period==="q3"){months=[6,7,8]}
else if(period==="q4"){months=[9,10,11]}
else if(period==="h1"){months=[0,1,2,3,4,5]}
else if(period==="h2"){months=[6,7,8,9,10,11]}
else if(period==="year"){months=[0,1,2,3,4,5,6,7,8,9,10,11]}
var r=[];
for(var i=0;i<evs.length;i++){
var e=evs[i];if(statusF&&e.s!==statusF)continue;
var dp=e.due.split(".");if(dp.length===3){var em=parseInt(dp[1],10)-1;var ey=parseInt(dp[2],10);if(ey===year&&months.indexOf(em)!==-1)r.push(e)}
var e=evs[i];
if(statusF&&e.s!==statusF)continue;
var dp=e.due.split(".");
if(dp.length===3){
var em=parseInt(dp[1],10)-1;
var ey=parseInt(dp[2],10);
if(ey===year&&months.indexOf(em)!==-1)r.push(e)
}
}
return r
}
@ -1507,38 +1512,13 @@ function getReportPeriod(){
if(period==="h2")return "2-\u0435 \u043F\u043E\u043B\u0443\u0433\u043E\u0434\u0438\u0435 "+year;
return year+" \u0433\u043E\u0434"
}
function rpPeriodChange(){}
function getReportPeriod(){
var period=document.getElementById("rp_period").value;
var year=document.getElementById("rp_year").value;
var mFrom=parseInt(document.getElementById("rp_month_from").value,10)||0;
var mTo=parseInt(document.getElementById("rp_month_to").value,10)||11;
var mn=["\u044F\u043D\u0432\u0430\u0440\u044C","\u0444\u0435\u0432\u0440\u0430\u043B\u044C","\u043C\u0430\u0440\u0442","\u0430\u043F\u0440\u0435\u043B\u044C","\u043C\u0430\u0439","\u0438\u044E\u043D\u044C","\u0438\u044E\u043B\u044C","\u0430\u0432\u0433\u0443\u0441\u0442","\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u043E\u043A\u0442\u044F\u0431\u0440\u044C","\u043D\u043E\u044F\u0431\u0440\u044C","\u0434\u0435\u043A\u0430\u0431\u0440\u044C"];
if(period==="year")return year+" \u0433\u043E\u0434";
if(period==="q1")return "I \u043A\u0432. "+year;
if(period==="q2")return "II \u043A\u0432. "+year;
if(period==="q3")return "III \u043A\u0432. "+year;
if(period==="q4")return "IV \u043A\u0432. "+year;
if(period==="h1")return "1-\u0435 \u043F\u043E\u043B\u0443\u0433\u043E\u0434\u0438\u0435 "+year;
if(period==="h2")return "2-\u0435 \u043F\u043E\u043B\u0443\u0433\u043E\u0434\u0438\u0435 "+year;
if(period==="month")return mn[mFrom]+" "+year;
return mn[mFrom]+" \u2014 "+mn[mTo]+" "+year
}
function getReportMonths(){
var period=document.getElementById("rp_period").value;
var mFrom=parseInt(document.getElementById("rp_month_from").value,10)||0;
var mTo=parseInt(document.getElementById("rp_month_to").value,10)||11;
var months=[];
if(period==="year"){for(var i=0;i<12;i++)months.push(i)}
else if(period==="q1")months=[0,1,2];else if(period==="q2")months=[3,4,5];
else if(period==="q3")months=[6,7,8];else if(period==="q4")months=[9,10,11];
else if(period==="h1")months=[0,1,2,3,4,5];else if(period==="h2")months=[6,7,8,9,10,11];
else if(period==="month")months=[mFrom];
else{for(var i=mFrom;i<=mTo;i++)months.push(i)}
return months
function rpPeriodChange(){
var v=document.getElementById("rp_period").value;
var mSel=document.getElementById("rp_month");
if(v==="month"){mSel.style.display="inline-block"}else{mSel.style.display="none"}
renderReports()
}
function renderReports(){
var qm=document.getElementById("rp_quick_months");if(qm){var mnames=["\u042F\u043D\u0432","\u0424\u0435\u0432","\u041C\u0430\u0440","\u0410\u043F\u0440","\u041C\u0430\u0439","\u0418\u044E\u043D","\u0418\u044E\u043B","\u0410\u0432\u0433","\u0421\u0435\u043D","\u041E\u043A\u0442","\u041D\u043E\u044F","\u0414\u0435\u043A"];var h="";for(var i=0;i<12;i++){h+="<button class='btn btn-sm' style='padding:3px 8px;font-size:11px;"+(i===0?"background:#005BAA;color:#fff":"")+"' onclick=\'document.getElementById(\"rp_period\").value=\"month\";document.getElementById(\"rp_month_from\").value="+i+";document.getElementById(\"rp_month_to\").value="+i+";renderReports()\'>"+mnames[i]+"</button>"}qm.innerHTML=h}
var fl=getFilteredEvs();
var cnt=document.getElementById("rp_count");
if(cnt)cnt.textContent="Выбрано мероприятий: "+fl.length;
@ -1549,110 +1529,77 @@ function dlCSV(){
var csv="\uFEFFN;\u041C\u0435\u0440\u043E\u043F\u0440\u0438\u044F\u0442\u0438\u0435;\u0424\u0438\u043B\u0438\u0430\u043B;\u0421\u0440\u043E\u043A;\u0421\u0442\u0430\u0442\u0443\u0441;\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441;\u041A\u043E\u043B-\u0432\u043E;\u041F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0435;\u041E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439\n";
for(var i=0;i<fl.length;i++){
var e=fl[i];
csv+=e.id+";\""+esc(e.t)+"\";\""+brs[e.b]+"\";"+e.due+";"+stn[e.s]+";"+(e.p||0)+"%;\""+esc(e.n||"")+"\"+"\";\""+esc(nl2c(e.r))+"\"\n"
csv+=e.id+";\""+esc(e.t)+"\";\""+brs[e.b]+"\";"+e.due+";"+stn[e.s]+";"+(e.p||0)+"%;"+(e.q||"")+";\""+esc(e.n||"")+"\";\""+esc(nl2c(e.r))+"\"\n"
}
var blob=new Blob([csv],{type:"text/csv;charset=utf-8"});
var a=document.createElement("a");
a.href=URL.createObjectURL(blob);
a.download="report_"+document.getElementById("rp_year").value+"_"+getReportPeriod().replace(/\s/g,"_")+".csv";
a.download="report_"+document.getElementById("rp_year").value+"_"+(parseInt(document.getElementById("rp_month").value,10)+1)+".csv";
a.click()
}
function dlHTML(){
var fl=getFilteredEvs();var periodLabel=getReportPeriod();var months=getReportMonths();
var mn=["\u042F\u043D\u0432\u0430\u0440\u044C","\u0424\u0435\u0432\u0440\u0430\u043B\u044C","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B\u044C","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u041E\u043A\u0442\u044F\u0431\u0440\u044C","\u041D\u043E\u044F\u0431\u0440\u044C","\u0414\u0435\u043A\u0430\u0431\u0440\u044C"];
var hh="<!DOCTYPE html><html><head><meta charset='utf-8'><title>\u041E\u0442\u0447\u0451\u0442 \u041F\u0411 \u0437\u0430 "+periodLabel+"</title><style>body{font:14px Arial,sans-serif;padding:30px;color:#1A1A2E}h2{font-size:20px;margin-bottom:4px}h3{font-size:14px;color:#005BAA;margin:16px 0 4px;border-bottom:1px solid #ddd;padding-bottom:6px}.meta{font-size:12px;color:#1A1A2E;margin:2px 0 6px 0;background:#F0F4FF;padding:6px 10px;border-radius:4px}.desc{font-size:12px;color:#1A1A2E;margin:6px 0;padding:10px;background:#F0F4FF;border-radius:4px;border-left:4px solid #005BAA}.files{font-size:11px;margin:6px 0}.files .fg{margin:4px 0 8px 0;padding:4px 8px;background:#f9f9f9;border-radius:4px}.files .fgl{font-weight:600;color:#005BAA;font-size:11px}.files a{color:#005BAA;display:block;margin:2px 0 2px 8px}@media print{body{padding:10mm}}</style></head><body><h2>\u041F\u043B\u0430\u043D \u041F\u0411</h2><p>QAZAQtelecom HSE \u0437\u0430 "+periodLabel+"</p><p style='font-size:11px;color:#64748B'>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</p><br>";
for(var i=0;i<fl.length;i++){var e=fl[i];var sn=secs[e.sec].split(". ")[1]||secs[e.sec];
var fl=getFilteredEvs();
var periodLabel=getReportPeriod();
var hh="<!DOCTYPE html><html><head><meta charset='utf-8'><title>\u041E\u0442\u0447\u0451\u0442 \u041F\u0411 \u0437\u0430 "+periodLabel+"</title><style>body{font:14px Arial,sans-serif;padding:30px;color:#1A1A2E} h2{font-size:20px;margin-bottom:4px} h3{font-size:14px;color:#005BAA;margin:16px 0 4px} table{border-collapse:collapse;width:100%;margin-bottom:12px} th,td{border:1px solid #ccc;padding:6px 10px;font-size:12px;text-align:left;vertical-align:top} th{background:#0A1628;color:#fff} .desc{font-size:12px;color:#64748B;margin:4px 0 8px 0;padding:6px;background:#F8FAFC;border-radius:4px} .files{margin:4px 0;font-size:11px} .files a{color:#005BAA;display:block;margin:2px 0} .qty{font-weight:600;color:#2E7D32} @media print{body{padding:10mm}}</style></head><body><h2>\u041F\u043B\u0430\u043D \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0439 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438</h2><p>QAZAQtelecom HSE \u0437\u0430 "+periodLabel+"</p><p style='font-size:11px;color:#64748B'>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</p><br>";
for(var i=0;i<fl.length;i++){
var e=fl[i];
hh+="<h3>N"+e.id+". "+esc(e.t)+"</h3>";
hh+="<div class='meta'>\u0420\u0430\u0437\u0434\u0435\u043B | "+esc(sn)+" | \u0421\u0440\u043E\u043A: "+e.due+" | "+stn[e.s]+"</div>";
var rn="";for(var mi=0;mi<months.length;mi++){var nk="sn_"+e.id+"_m"+months[mi];var sv=localStorage.getItem(nk);if(sv){rn=sv;break}}
if(!rn&&e.n)rn=e.n;
if(rn)hh+="<div class='desc'><strong>\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F:</strong><br>"+esc(rn)+"</div>";
var fhtml="";var hasAny=false;
for(var mi=0;mi<months.length;mi++){
var fg="";var mk="_m"+months[mi];
for(var si=-1;si<(e.sub?e.sub.length:0);si++){var sk=si>=0?"_s"+si:"";
for(var bk=0;bk<brs.length;bk++){
var key="sf_"+e.id+mk+sk+"_b"+bk;var fd=localStorage.getItem(key);
if(fd){try{var arr=JSON.parse(fd);for(var fi=0;fi<arr.length;fi++){var f=arr[fi];if(f&&f.n&&f.data)fg+="<a href='"+f.data+"' download='"+esc(f.n)+"'>\uD83D\uDCC4 "+esc(f.n)+" ("+Math.round((f.s||0)/1024)+" KB)</a>"}}catch(ex){}}
hh+="<table><tr><th style='width:120px'>\u0421\u0440\u043E\u043A</th><td>"+e.due+"</td><th style='width:120px'>\u0421\u0442\u0430\u0442\u0443\u0441</th><td>"+stn[e.s]+"</td><th style='width:120px'>\u0424\u0438\u043B\u0438\u0430\u043B</th><td>"+brs[e.b]+"</td><th style='width:120px'>\u041E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439</th><td>"+esc(nl2c(e.r))+"</td></tr></table>";
if(e.n)hh+="<div class='desc'><strong>\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435:</strong> "+esc(e.n)+"</div>";
if(e.q)hh+="<div class='qty'>\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: "+e.q+"</div>";
var fhtml="";
for(var si=-1;si<(e.sub?e.sub.length:0);si++){
var sk=si>=0?"_s"+si:"";
for(var bk=0;bk<brs.length;bk++){
var key="sf_"+e.id+sk+"_b"+bk;
var fd=localStorage.getItem(key);
if(fd){
try{var arr=JSON.parse(fd);
for(var fi=0;fi<arr.length;fi++){
var f=arr[fi];
if(f&&f.n)fhtml+="<a href='"+f.data+"' download='"+esc(f.n)+"'>"+esc(f.n)+" ("+Math.round((f.s||0)/1024)+" KB)</a>"
}}catch(ex){}
}
}
if(fg){fhtml+="<div class='fg'><div class='fgl'>"+mn[months[mi]]+":</div>"+fg+"</div>";hasAny=true}
}
if(hasAny)hh+="<div class='files'><strong>\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B:</strong>"+fhtml+"</div>";
if(fhtml)hh+="<div class='files'><strong>\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B:</strong><br>"+fhtml+"</div>";
}
hh+="<p style='font-size:11px;color:#64748B'><em>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
var blob=new Blob([hh],{type:"text/html"});var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="report_pb_"+periodLabel.replace(/\s/g,"_")+".html";a.click()
hh+="<br><p style='font-size:11px;color:#64748B'><em>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
var blob=new Blob([hh],{type:"text/html"});
var a=document.createElement("a");
a.href=URL.createObjectURL(blob);
a.download="report_pb_"+periodLabel.replace(/\s/g,"_")+".html";
a.click()
}
function dlWord(){
var fl=getFilteredEvs();var periodLabel=getReportPeriod();var months=getReportMonths();
var mn=["\u042F\u043D\u0432\u0430\u0440\u044C","\u0424\u0435\u0432\u0440\u0430\u043B\u044C","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B\u044C","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u041E\u043A\u0442\u044F\u0431\u0440\u044C","\u041D\u043E\u044F\u0431\u0440\u044C","\u0414\u0435\u043A\u0430\u0431\u0440\u044C"];
var hh="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'><head><meta charset='utf-8'><title>\\u041E\\u0442\\u0447\\u0451\\u0442 \\u041F\\u0411 \\u0437\\u0430 "+periodLabel+"</title><style>@page{size:A4;margin:20mm}body{font:12pt 'Times New Roman'}h2{font-size:16pt;text-align:center}h3{font-size:12pt;color:#005BAA;border-bottom:1px solid #ccc;padding-bottom:4pt}.meta{font-size:10pt;color:#555;margin:2pt 0 6pt 0}.desc{font-size:10pt;color:#555;margin:4pt 0;padding:6pt;background:#f9f9f9}.files{font-size:9pt;margin:4pt 0}.files a{color:#005BAA;display:block}.qty{font-weight:600;color:#2E7D32}</style></head><body><h2>\\u041F\\u043B\\u0430\\u043D \\u041F\\u0411</h2><p style='text-align:center'>AO \\u00AB\\u041A\\u0430\\u0437\\u0430\\u0445\\u0442\\u0435\\u043B\\u0435\\u043A\\u043E\\u043C\\u00BB \\u0437\\u0430 "+periodLabel+"</p><br>";
for(var i=0;i<fl.length;i++){var e=fl[i];var sn=secs[e.sec].split(". ")[1]||secs[e.sec];
hh+="<h3>N"+e.id+". "+esc(e.t)+"</h3>";
hh+="<p class='meta'>\\u0420\\u0430\\u0437\\u0434\\u0435\\u043B | "+esc(sn)+" | \\u0421\\u0440\\u043E\\u043A: "+e.due+" | "+stn[e.s]+"</p>";
var rn="";var rq=0;for(var mi=0;mi<months.length;mi++){var nk="sn_"+e.id+"_m"+months[mi];var sv=localStorage.getItem(nk);if(sv){rn=sv;break}var qk="sq_"+e.id+"_m"+months[mi];var qv=localStorage.getItem(qk);if(qv)rq=parseInt(qv,10)||0}
if(!rn&&e.n)rn=e.n;if(!rq&&e.q)rq=e.q;
if(rn)hh+="<p class='desc'><strong>\\u041E\\u043F\\u0438\\u0441\\u0430\\u043D\\u0438\\u0435:</strong> "+esc(rn)+"</p>";
if(rq)hh+="<p class='qty'>\\u041A\\u043E\\u043B\\u0438\\u0447\\u0435\\u0441\\u0442\\u0432\\u043E: "+rq+"</p>";
var fhtml="";for(var mi=0;mi<months.length;mi++){var fg="";var mk="_m"+months[mi];
for(var si=-1;si<(e.sub?e.sub.length:0);si++){var sk=si>=0?"_s"+si:"";
for(var bk=0;bk<brs.length;bk++){var key="sf_"+e.id+mk+sk+"_b"+bk;var fd=localStorage.getItem(key);
if(fd){try{var arr=JSON.parse(fd);for(var fi=0;fi<arr.length;fi++){var f=arr[fi];if(f&&f.n)fg+="<a href='"+f.data+"'>"+esc(f.n)+" ("+Math.round((f.s||0)/1024)+" KB)</a>"}}catch(ex){}}
}}
if(fg)fhtml+="<p><strong>"+mn[months[mi]]+":</strong><br>"+fg+"</p>"}
if(fhtml)hh+="<div class='files'><strong>\\u041F\\u043E\\u0434\\u0442\\u0432\\u0435\\u0440\\u0436\\u0434\\u0430\\u044E\\u0449\\u0438\\u0435 \\u0444\\u0430\\u0439\\u043B\\u044B:</strong><br>"+fhtml+"</div>";
var fl=getFilteredEvs();
var month=parseInt(document.getElementById("rp_month").value,10)+1;
var year=document.getElementById("rp_year").value;
var hh="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'><head><meta charset='utf-8'><title>Отчёт План ПБ "+month+"."+year+"</title><style>@page{size:A4;margin:20mm}body{font:12pt 'Times New Roman'}h2{font-size:16pt;text-align:center}table{border-collapse:collapse;width:100%}th,td{border:1px solid #000;padding:4px 8px;font-size:11pt}th{background:#ddd}</style></head><body><h2>План производственной безопасности</h2><p style='text-align:center'>AO «Казахтелеком» за "+month+"."+year+"</p><br><table><tr><th>N</th><th>Мероприятие</th><th>Филиал</th><th>Срок</th><th>Статус</th><th>Прогресс</th><th>Кол-во</th><th>Примечание</th></tr>";
for(var i=0;i<fl.length;i++){
var e=fl[i];
hh+="<tr><td>"+e.id+"</td><td>"+esc(e.t)+"</td><td>"+brs[e.b]+"</td><td>"+e.due+"</td><td>"+stn[e.s]+"</td><td>"+(e.p||0)+"%</td><td>"+(e.q||"")+"</td><td>"+esc(e.n||"")+"</td></tr>"
}
hh+="<p style='font-size:9pt;color:#888'><em>\\u041E\\u0442\\u0447\\u0451\\u0442 \\u0441\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
var blob=new Blob([hh],{type:"application/msword"});var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="report_pb_"+periodLabel.replace(/\\s/g,"_")+".doc";a.click()
hh+="</table><p><br><em>Отчёт сформирован: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
var blob=new Blob([hh],{type:"application/msword"});
var a=document.createElement("a");
a.href=URL.createObjectURL(blob);
a.download="report_pb_"+year+"_"+month+".doc";
a.click()
}
function dlPdf(){
var fl=getFilteredEvs();var periodLabel=getReportPeriod();
var hh="<!DOCTYPE html><html><head><meta charset='utf-8'><title>\\u041E\\u0442\\u0447\\u0451\\u0442 \\u041F\\u0411 \\u0437\\u0430 "+periodLabel+"</title><style>body{font:14px Arial;padding:20px}h2{font-size:20px}h3{font-size:14px;color:#005BAA;border-bottom:1px solid #ccc;padding-bottom:4px}.meta{font-size:12px;color:#555;margin:4px 0}table{border-collapse:collapse;width:100%}th,td{border:1px solid #ccc;padding:6px 10px;font-size:12px;text-align:left}th{background:#0B1A2E;color:#fff}@media print{body{padding:10mm}}</style></head><body><h2>\\u041F\\u043B\\u0430\\u043D \\u041F\\u0411</h2><p>QAZAQtelecom HSE \\u0437\\u0430 "+periodLabel+"</p><br><table><tr><th>N</th><th>\\u041C\\u0435\\u0440\\u043E\\u043F\\u0440\\u0438\\u044F\\u0442\\u0438\\u0435</th><th>\\u0424\\u0438\\u043B\\u0438\\u0430\\u043B</th><th>\\u0421\\u0440\\u043E\\u043A</th><th>\\u0421\\u0442\\u0430\\u0442\\u0443\\u0441</th><th>%</th><th>\\u041A\\u043E\\u043B-\\u0432\\u043E</th><th>\\u041F\\u0440\\u0438\\u043C\\u0435\\u0447\\u0430\\u043D\\u0438\\u0435</th></tr>";
for(var i=0;i<fl.length;i++){var e=fl[i];hh+="<tr><td>"+e.id+"</td><td>"+esc(e.t)+"</td><td>"+brs[e.b]+"</td><td>"+e.due+"</td><td>"+stn[e.s]+"</td><td>"+(e.p||0)+"%</td><td>"+(e.q||"")+"</td><td>"+esc(e.n||"")+"</td></tr>"}
hh+="</table><p><em>\\u041E\\u0442\\u0447\\u0451\\u0442 \\u0441\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p><script>window.onload=function(){window.print()}<\/script></body></html>";
var w=window.open("","_blank","width=900,height=700");w.document.write(hh);w.document.close()
}
function dlZip(){
var fl=getFilteredEvs();var periodLabel=getReportPeriod();
var zipParts=[];var offsets=[];var centralDir=[];var offset=0;
function addFile(name,bytes){
var encoder=new TextEncoder();var data=typeof bytes==="string"?encoder.encode(bytes):new Uint8Array(bytes);
var nameBytes=encoder.encode(name);var crc=crc32(data);
var localHeader=new Uint8Array(30+nameBytes.length);var v=new DataView(localHeader.buffer);
v.setUint32(0,0x04034b50,true);v.setUint16(8,0,true);v.setUint16(10,0,true);v.setUint16(26,nameBytes.length,true);
v.setUint32(14,crc,true);v.setUint32(18,data.length,true);v.setUint32(22,data.length,true);
localHeader.set(nameBytes,30);zipParts.push(localHeader);zipParts.push(data);
var cd=new Uint8Array(46+nameBytes.length);var cdv=new DataView(cd.buffer);
cdv.setUint32(0,0x02014b50,true);cdv.setUint16(8,0,true);cdv.setUint16(10,0,true);cdv.setUint16(28,nameBytes.length,true);
cdv.setUint32(16,crc,true);cdv.setUint32(20,data.length,true);cdv.setUint32(24,data.length,true);cdv.setUint32(42,offset,true);
cd.set(nameBytes,46);centralDir.push(cd);offset+=30+nameBytes.length+data.length
var fl=getFilteredEvs();
var month=parseInt(document.getElementById("rp_month").value,10)+1;
var year=document.getElementById("rp_year").value;
var hh="<!DOCTYPE html><html><head><meta charset='utf-8'><title>Отчёт План ПБ "+month+"."+year+"</title><style>body{font:14px Arial;padding:20px}table{border-collapse:collapse;width:100%}th,td{border:1px solid #ccc;padding:6px 10px;font-size:12px;text-align:left}th{background:#0B1A2E;color:#fff}@media print{body{padding:10mm}table{page-break-inside:auto}tr{page-break-inside:avoid}}</style></head><body><h2>План производственной безопасности</h2><p>AO «Казахтелеком» за "+month+"."+year+"</p><br><table><tr><th>N</th><th>Мероприятие</th><th>Филиал</th><th>Срок</th><th>Статус</th><th>Прогресс</th><th>Кол-во</th><th>Примечание</th></tr>";
for(var i=0;i<fl.length;i++){
var e=fl[i];
hh+="<tr><td>"+e.id+"</td><td>"+esc(e.t)+"</td><td>"+brs[e.b]+"</td><td>"+e.due+"</td><td>"+stn[e.s]+"</td><td>"+(e.p||0)+"%</td><td>"+(e.q||"")+"</td><td>"+esc(e.n||"")+"</td></tr>"
}
function crc32(data){var c=0xffffffff;for(var i=0;i<data.length;i++){c^=data[i];for(var j=0;j<8;j++){if(c&1)c=(c>>>1)^0xedb88320;else c>>>=1}}return(c^0xffffffff)>>>0}
var html='<!DOCTYPE html><html><head><meta charset="utf-8"><title>Отчёт ПБ за '+periodLabel+'</title><style>body{font:14px Arial;padding:20px}h2{font-size:20px}h3{font-size:14px;color:#005BAA;border-bottom:1px solid #ccc}.meta{font-size:12px;color:#555}.desc{font-size:12px;margin:6px 0;padding:8px;background:#f9f9f9}.files{font-size:11px;margin:4px 0}</style></head><body><h2>План ПБ — QAZAQtelecom HSE</h2><p>Период: '+periodLabel+'</p><p>Дата: '+new Date().toLocaleDateString("ru-RU")+'</p><br>';
for(var i=0;i<fl.length;i++){var e=fl[i];var sn=secs[e.sec].split(". ")[1]||secs[e.sec];
html+='<h3>N'+e.id+'. '+esc(e.t)+'</h3><div class="meta">Раздел | '+esc(sn)+' | Срок: '+e.due+' | '+stn[e.s]+'</div>';
if(e.n)html+='<div class="desc"><strong>Описание:</strong> '+esc(e.n)+'</div>';
}
html+='<p><em>Отчёт сформирован: '+new Date().toLocaleDateString("ru-RU")+'</em></p></body></html>';
addFile("report.html",html);
for(var i=0;i<fl.length;i++){var e=fl[i];
for(var mi=0;mi<12;mi++){var mk="_m"+mi;
for(var si=-1;si<(e.sub?e.sub.length:0);si++){var sk=si>=0?"_s"+si:"";
for(var bk=0;bk<brs.length;bk++){var key="sf_"+e.id+mk+sk+"_b"+bk;var fd=localStorage.getItem(key);
if(fd){try{var arr=JSON.parse(fd);for(var fi=0;fi<arr.length;fi++){var f=arr[fi];if(f&&f.n&&f.data){var b64=f.data.split(",")[1];if(b64){var bin=Uint8Array.from(atob(b64),function(c){return c.charCodeAt(0)});addFile("event_"+e.id+"/"+esc(f.n),bin)}}}}catch(ex){}}
}
}
}
}
var cdOffset=offset;for(var i=0;i<centralDir.length;i++)zipParts.push(centralDir[i]);
var cdSize=zipParts.reduce(function(s,p){return s+p.length},0)-cdOffset;
var eocd=new Uint8Array(22);var ev=new DataView(eocd.buffer);
ev.setUint32(0,0x06054b50,true);ev.setUint16(8,centralDir.length,true);ev.setUint16(10,centralDir.length,true);
ev.setUint32(12,cdSize,true);ev.setUint32(16,cdOffset,true);
zipParts.push(eocd);
var blob=new Blob(zipParts,{type:"application/zip"});
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="report_pb_"+periodLabel.replace(/\s/g,"_")+".zip";a.click()
hh+="</table><p><br><em>Отчёт сформирован: "+new Date().toLocaleDateString("ru-RU")+"</em></p><script>window.onload=function(){window.print()}<\/script></body></html>";
var w=window.open("","_blank","width=900,height=700");
w.document.write(hh);
w.document.close()
}
function hseSend(){
var btn=document.getElementById("hse_btn");
@ -2007,17 +1954,21 @@ function saveUsers(){
try{localStorage.setItem("ext_users",JSON.stringify(ex))}catch(e){}
}
function dlAnalyticsPPT(){
var total=evs.length;var done=0,late=0,warn=0;
for(var i=0;i<evs.length;i++){if(evs[i].s==="done")done++;else if(evs[i].s==="late")late++;else warn++}
var total=evs.length;
var done=0,late=0,warn=0;
for(var i=0;i<evs.length;i++){
if(evs[i].s==="done")done++;else if(evs[i].s==="late")late++;else warn++
}
var pct=total?Math.round(done/total*100):0;
var brd=[];for(var i=0;i<brs.length;i++){brd.push({n:brs[i],t:0,d:0})}
var brd=[];
for(var i=0;i<brs.length;i++){brd.push({n:brs[i],t:0,d:0})}
for(var i=0;i<evs.length;i++){var e=evs[i];brd[e.b].t++;if(e.s==="done")brd[e.b].d++}
brd.sort(function(a,b){return(b.d/b.t||0)-(a.d/a.t||0)});
var h="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:p='urn:schemas-microsoft-com:office:powerpoint'><head><meta charset='utf-8'><title>\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430 HSE</title><style>body{font:18px Arial;padding:30px}@page{size:A4 landscape;margin:15mm}h1{color:#005BAA;font-size:28px}.num{font-size:48px;font-weight:800;color:#005BAA}.pct{font-size:72px;font-weight:800;color:"+(pct>=70?"#10B981":pct>=40?"#F59E0B":"#EF4444")+"}.bar{height:28px;background:#005BAA;border-radius:6px;margin:8px 0}.slide{page-break-after:always;min-height:350px}table{border-collapse:collapse;width:100%}td{padding:12px 20px;border:1px solid #ddd;font-size:16px}th{background:#0A1628;color:#fff;padding:10px 14px;font-size:13px}</style></head><body><div class='slide'><h1>QAZAQtelecom HSE \u2014 \u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430 \u041F\u0411</h1><p>\u0414\u0430\u0442\u0430: "+new Date().toLocaleDateString("ru-RU")+"</p><br><div style='text-align:center'><div class='pct'>"+pct+"%</div><p style='font-size:20px;color:#64748B'>\u041E\u0431\u0449\u0438\u0439 \u043F\u0440\u043E\u0446\u0435\u043D\u0442 \u0438\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F</p></div><br><table><tr><td style='text-align:center'><div class='num'>"+total+"</div>\u0412\u0441\u0435\u0433\u043E</td><td style='text-align:center'><div class='num'>"+done+"</div>\u0418\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u043E</td><td style='text-align:center'><div class='num'>"+warn+"</div>\u0412 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0435</td><td style='text-align:center'><div class='num' style='color:#EF4444'>"+late+"</div>\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E</td></tr></table><div class='bar' style='width:"+Math.round(pct*5)+"px'></div></div><div class='slide'><h2>\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u0444\u0438\u043B\u0438\u0430\u043B\u043E\u0432</h2><table><tr><th>\u2116</th><th>\u0424\u0438\u043B\u0438\u0430\u043B</th><th>\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E</th><th>%</th></tr>";
for(var i=0;i<brd.length;i++){var bp=brd[i].t?Math.round(brd[i].d/brd[i].t*100):0;h+="<tr><td>"+(i+1)+"</td><td>"+esc(brd[i].n)+"</td><td>"+brd[i].d+"/"+brd[i].t+"</td><td><div class='bar' style='width:"+(bp*2)+"px'></div> "+bp+"%</td></tr>"}
h+="</table></div></body></html>";
var blob=new Blob([h],{type:"application/vnd.ms-powerpoint"});
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics_"+new Date().toISOString().slice(0,10)+".ppt";a.click()
var h="<!DOCTYPE html><html><head><meta charset='utf-8'><title>\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430 HSE</title><style>body{font:16px Arial;padding:30px}@page{size:A4 landscape;margin:10mm}h1{color:#005BAA;font-size:24px}.num{font-size:36px;font-weight:800;color:#005BAA}.bar{height:20px;background:#005BAA;border-radius:4px;margin:2px 0}table{border-collapse:collapse}td{padding:8px 16px;border:1px solid #ddd}@media print{body{padding:5mm}}</style></head><body><h1>QAZAQtelecom HSE \u2014 \u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430</h1><p>\u0414\u0430\u0442\u0430: "+new Date().toLocaleDateString("ru-RU")+"</p><br><table><tr><td style='text-align:center'><div class='num'>"+total+"</div>\u0412\u0441\u0435\u0433\u043E</td><td style='text-align:center'><div class='num'>"+done+"</div>\u0418\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u043E</td><td style='text-align:center'><div class='num'>"+warn+"</div>\u0412 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0435</td><td style='text-align:center'><div class='num'>"+late+"</div>\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E</td></tr></table><br><p>\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435: <strong>"+pct+"%</strong></p><div class='bar' style='width:"+Math.round(pct*4)+"px'></div><br><h3>\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u0444\u0438\u043B\u0438\u0430\u043B\u043E\u0432</h3><table>";
for(var i=0;i<brd.length;i++){var bp=brd[i].t?Math.round(brd[i].d/brd[i].t*100):0;h+="<tr><td>"+(i+1)+". "+esc(brd[i].n)+"</td><td>"+brd[i].d+"/"+brd[i].t+"</td><td><div class='bar' style='width:"+bp+"px'></div></td><td>"+bp+"%</td></tr>"}
h+="</table></body></html>";
var blob=new Blob([h],{type:"application/vnd.openxmlformats-officedocument.presentationml.presentation"});
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics_"+new Date().toISOString().slice(0,10)+".pptx";a.click()
}
function dlAnalyticsPDF(){
var h=document.getElementById("tab_analytics").innerHTML;
@ -2036,6 +1987,6 @@ function dlAnalyticsWord(){
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics.doc";a.click()
}
</script></script></script></script></script></script></script>
</script></script>
</body>
</html>