diff --git a/app.html b/app.html index 3705014..c076569 100644 --- a/app.html +++ b/app.html @@ -79,7 +79,7 @@ td{padding:8px 12px;border-bottom:1px solid #F2F4F7}tr:hover td{background:#F2F4

📁 История

- +
БланкДатаМестоНаблюдательСтатусНарушений
Нет записей
@@ -135,7 +135,7 @@ function rDB(){ var c=document.getElementById("dbc");if(!c)return; var a=getA(),all=allU();var t=a.length,sf=a.filter(function(x){return x.overallSafe}).length,wd=a.filter(function(x){return !x.overallSafe}).length,tv=a.reduce(function(s,x){return s+(x.totalViolations||0)},0); var ot=0,bh=0,ov=0;for(var k in all){if(k==="admin")continue;var u=all[k];var q=getUserQuota(u);if(!q.p)continue;var p=gp(q.p);var d=a.filter(function(x){return x.createdBy===k&&new Date(x.date)>=p.s}).length;if(d>q.c)ov++;else if(d>=q.c)ot++;else bh++} - var adb=isA()?"
":""; + var adb=isA()?"
|
":""; c.innerHTML=adb+"
"+t+"
Всего аудитов
"+sf+"
Безопасно
"+wd+"
С нарушениями
"+tv+"
Нарушений
"+ov+"
Перевыполняют
"+ot+"
Выполняют
"+bh+"
Отстают
"+ "

📂 Нарушения по категориям

📅 Динамика по датам

"+ "

🔝 Топ-10 нарушений

"; @@ -182,6 +182,40 @@ function delA(id){if(!isA()){alert("Только админ");return}if(!confirm function downloadFullCSV(){var a=getA();if(a.length===0){alert("Нет данных");return}var all=allU(),h="Бланк №;Дата;Место;Наблюдатель;Филиал;Регион;Статус;Нарушений",rs=a.map(function(x){var u=all[x.createdBy]||{};return(x.number||"")+";"+x.date+";"+x.location+";"+x.observer+";"+(u.branch||"")+";"+(u.region||"")+";"+(x.overallSafe?"Безопасно":"Нарушения")+";"+(x.totalViolations||0)}),csv="\uFEFF"+h+"\n"+rs.join("\n"),bl=new Blob([csv],{type:"text/csv"}),ur=URL.createObjectURL(bl),dl=document.createElement("a");dl.href=ur;dl.download="pab-full.csv";dl.click();URL.revokeObjectURL(ur)} function showAllUsers(){if(!isA())return;var all=allU(),h="

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

";for(var k in all){var u=all[k];h+=""}h+="
ЛогинФИОДолжностьФилиалРегионГород
"+k+(k==="admin"?" ⭐":"")+""+u.name+""+u.role+""+(u.branch||"—")+""+(u.region||"—")+""+(u.city||"—")+"
";var w=window.open("","_blank","width=800,height=500");w.document.write("Пользователи"+h+"");w.document.close()} function downloadSummaryHTML(){var a=getA(),all=allU(),t=a.length;var w=window.open("","_blank","width=800,height=600");w.document.write("Отчёт ПАБ

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

Сформирован: "+new Date().toLocaleString("ru")+" | Всего аудитов: "+t+"

📋 Аудиты

"+a.map(function(x){return""}).join("")+"
ДатаМестоНаблюдательСтатусНарушений
"+(x.number||"—")+""+x.date+""+x.location+""+x.observer+""+(x.overallSafe?"Безопасно":"Нарушения")+""+(x.totalViolations||0)+"
");w.document.close()} +function exportData(){ + var data={users:getU(),audits:getA(),exported:new Date().toISOString()}; + var json=JSON.stringify(data,null,2); + var blob=new Blob([json],{type:"application/json"}); + var url=URL.createObjectURL(blob);var dl=document.createElement("a"); + dl.href=url;dl.download="pab-data-"+new Date().toISOString().split("T")[0]+".json";dl.click();URL.revokeObjectURL(url); + alert("Файл сохранён. Отправьте его админу для импорта."); +} +function importData(){ + var input=document.createElement("input");input.type="file";input.accept=".json"; + input.onchange=function(){ + var file=this.files[0];if(!file)return; + var reader=new FileReader(); + reader.onload=function(e){ + try{ + var data=JSON.parse(e.target.result); + if(data.audits&&confirm("Импортировать "+data.audits.length+" аудитов и пользователей? Текущие данные будут объединены.")){ + var curA=getA(),curU=getU(); + // Merge audits (avoid duplicates by id) + var ids={};curA.forEach(function(a){ids[a.id]=true}); + data.audits.forEach(function(a){if(!ids[a.id])curA.push(a)}); + saveA(curA); + // Merge users + for(var k in data.users){if(!curU[k])curU[k]=data.users[k]} + localStorage.setItem("pab_users",JSON.stringify(curU)); + alert("Импортировано! Аудитов: "+curA.length+", пользователей: "+Object.keys(curU).length); + rDB();rHS();rVL();rMS(); + } + }catch(ex){alert("Ошибка чтения файла")} + }; + reader.readAsText(file); + }; + input.click(); +} rHS();