@@ -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+="
"+k+(k==="admin"?" ⭐":"")+"
"+u.name+"
"+u.role+"
"+(u.branch||"—")+"
"+(u.region||"—")+"
"+(u.city||"—")+"
"}h+="
";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"
"+(x.number||"—")+"
"+x.date+"
"+x.location+"
"+x.observer+"
"+(x.overallSafe?"Безопасно":"Нарушения")+"
"+(x.totalViolations||0)+"
"}).join("")+"
");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();