Сообщение когда нет работников у админа

This commit is contained in:
Dauren777 2026-06-04 07:21:36 +00:00
parent 9d2ce89573
commit f1be670631

View File

@ -150,7 +150,7 @@ function printConfirm(){if(!lastSubmitted)return;var e=lastSubmitted;var w=windo
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+"\ериод: "+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");if(isA()){var all=allU();var rows="";for(var k in all){if(k==="admin")continue;var u=all[k];var q=getUserQuota({role:u.role,freq:u.freq||""});var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===k&&new Date(a.date)>=p.s}).length;var pct=Math.round(done/q.c*100);var cl=pct>=200?"#00B4D8":pct>=100?"#2D6A4F":pct>=50?"#E76F51":"#E63946";var st=pct>100?"🔵 Перевып. +"+(done-q.c):pct>=100?"🟢 Выполнен":"🔴 Отстаёт на "+(q.c-done);rows+="<tr><td><b>"+u.name+"</b></td><td>"+u.role+"</td><td>"+(u.branch||"—")+"</td><td>"+(u.region||"—")+"</td><td>"+(u.city||"—")+"</td><td>"+q.l+"</td><td><div style=\"display:flex;align-items:center;gap:8px\"><div style=\"flex:1;height:12px;border-radius:6px;background:#E2E6EB;overflow:hidden\"><div style=\"height:100%;border-radius:6px;width:"+Math.min(pct,200)+"%;background:"+cl+";transition:width .5s\"></div></div><span style=\"font-size:12px;white-space:nowrap\">"+done+"/"+q.c+"</span></div></td><td style=\"font-size:12px;font-weight:600\">"+st+"</td><td><span style=\"font-size:12px;color:var(--g5)\">"+p.l+"</span></td></tr>"}c.innerHTML="<div style=\"background:var(--white);border-radius:var(--rl);padding:20px;box-shadow:var(--sh);margin-bottom:16px\"><h3>👥 График всех работников</h3><div style=\"font-size:12px;color:var(--g5);margin-bottom:10px\">Вы админ — видите данные всех. Проводить ПАБ вам не нужно.</div></div><div class=\"tw\"><table class=\"dt\"><thead><tr><th>ФИО</th><th>Должность</th><th>Филиал</th><th>Регион</th><th>Город</th><th>Норма</th><th>Прогресс</th><th>Статус</th><th>Период</th></tr></thead><tbody>"+rows+"</tbody></table></div><div style=\"background:var(--white);border-radius:var(--rl);padding:16px;box-shadow:var(--sh);margin-top:12px;display:flex;gap:8px;flex-wrap:wrap\"><button class=\"btn bp bs\" onclick=\"swP('DB')\">📊 Дашборд</button><button class=\"btn bo bs\" onclick=\"swP('HS')\">📁 История</button><button class=\"btn bo bs\" onclick=\"downloadWorkerReport()\">👥 Скачать CSV</button></div>";return}var q=getUserQuota(U);if(q.c===0)q={c:1,p:"month",l:"1 раз в месяц"};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.round(done/q.c*100);var over=pct>100;var cl=over?"#00B4D8":pct>=100?"#2D6A4F":pct>=50?"#E76F51":"#E63946";var barW=Math.min(pct,200);var need=Math.max(0,q.c-done);var extra=done-q.c;c.innerHTML="<div style=\"background:var(--white);border-radius:var(--rl);padding:20px;box-shadow:var(--sh);margin-bottom:16px\"><h3>📅 "+p.l+"</h3><div style=\"font-size:12px;color:var(--g5);margin-bottom:10px\">Минимум: <b>"+q.l+"</b> | "+U.role+"</div><div style=\"height:16px;border-radius:8px;background:#E2E6EB;overflow:hidden;margin-bottom:6px\"><div style=\"height:100%;border-radius:8px;width:"+barW+"%;background:"+cl+";transition:width .5s;max-width:200%\"></div></div><div style=\"font-size:12px;font-weight:600\">Проведено: <b>"+done+"</b> (мин: "+q.c+")"+(over?" — <span style=\"color:#00B4D8\">✅ перевыполнено на +"+extra+"!</span>":done>=q.c?" — ✅ план выполнен!":" — осталось: <span style=\"color:#E63946\">"+need+"</span>")+"</div>"+(need>0?"<div style=\"margin-top:10px\"><button class=\"btn bp bs\" onclick=\"sendScheduleReminder()\">✉️ Напомнить</button></div>":"")+"</div><div style=\"background:var(--white);border-radius:var(--rl);padding:20px;box-shadow:var(--sh)\">👤 <b>"+U.name+"</b> — "+U.role+"<br><span style=\"font-size:12px;color:var(--g5)\">"+(U.branch||"—")+" | "+(U.dept||"—")+" | "+(U.region||"—")+" | "+(U.city||"—")+" | "+U.email+"</span></div>"+(done>0?"<div style=\"margin-top:16px;background:var(--white);border-radius:var(--rl);padding:20px;box-shadow:var(--sh)\"><h4 style=\"margin-bottom:8px\">📋 Проведённые:</h4>"+getA().filter(function(a){return a.createdBy===U.login}).slice(0,10).map(function(a){return"<div style=\"background:var(--g1);padding:8px 12px;border-radius:var(--r);margin-bottom:6px;font-size:13px\">"+a.date+" — "+a.location+" — <span class=\"badge "+(a.overallSafe?"badge-s":"badge-d")+"\">"+(a.overallSafe?"Безопасно":"Нарушений: "+a.totalViolations)+"</span></div>"}).join("")+"</div>":"")}
function rMS(){var c=document.getElementById("msc");if(!c)return;document.getElementById("sa").classList.remove("sh","dg");if(isA()){var all=allU();var rows="",wCount=0;for(var k in all){if(k==="admin")continue;wCount++;var u=all[k];var q=getUserQuota({role:u.role,freq:u.freq||""});var p=gp(q.p);var done=getA().filter(function(a){return a.createdBy===k&&new Date(a.date)>=p.s}).length;var pct=Math.round(done/q.c*100);var cl=pct>=200?"#00B4D8":pct>=100?"#2D6A4F":pct>=50?"#E76F51":"#E63946";var st=pct>100?"🔵 Перевып. +"+(done-q.c):pct>=100?"🟢 Выполнен":"🔴 Отстаёт на "+(q.c-done);rows+="<tr><td><b>"+u.name+"</b></td><td>"+u.role+"</td><td>"+(u.branch||"—")+"</td><td>"+(u.region||"—")+"</td><td>"+(u.city||"—")+"</td><td>"+q.l+"</td><td><div style=\"display:flex;align-items:center;gap:8px\"><div style=\"flex:1;height:12px;border-radius:6px;background:#E2E6EB;overflow:hidden\"><div style=\"height:100%;border-radius:6px;width:"+Math.min(pct,200)+"%;background:"+cl+";transition:width .5s\"></div></div><span style=\"font-size:12px;white-space:nowrap\">"+done+"/"+q.c+"</span></div></td><td style=\"font-size:12px;font-weight:600\">"+st+"</td><td><span style=\"font-size:12px;color:var(--g5)\">"+p.l+"</span></td></tr>"}var tbl=wCount>0?"<div class=\"tw\"><table class=\"dt\"><thead><tr><th>ФИО</th><th>Должность</th><th>Филиал</th><th>Регион</th><th>Город</th><th>Норма</th><th>Прогресс</th><th>Статус</th><th>Период</th></tr></thead><tbody>"+rows+"</tbody></table></div>":"<div class=\"nd\"><span class=\"icon\">👥</span><p>Нет зарегистрированных работников.<br>Работники должны зарегистрироваться на странице входа.</p></div>";c.innerHTML="<div style=\"background:var(--white);border-radius:var(--rl);padding:20px;box-shadow:var(--sh);margin-bottom:16px\"><h3>👥 График всех работников</h3><div style=\"font-size:12px;color:var(--g5);margin-bottom:10px\">Вы админ — видите данные всех. Проводить ПАБ вам не нужно.</div></div>"+tbl+"<div style=\"background:var(--white);border-radius:var(--rl);padding:16px;box-shadow:var(--sh);margin-top:12px;display:flex;gap:8px;flex-wrap:wrap\"><button class=\"btn bp bs\" onclick=\"swP('DB')\">📊 Дашборд</button><button class=\"btn bo bs\" onclick=\"swP('HS')\">📁 История</button><button class=\"btn bo bs\" onclick=\"downloadWorkerReport()\">👥 Скачать CSV</button></div>";return}var q=getUserQuota(U);if(q.c===0)q={c:1,p:"month",l:"1 раз в месяц"};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.round(done/q.c*100);var over=pct>100;var cl=over?"#00B4D8":pct>=100?"#2D6A4F":pct>=50?"#E76F51":"#E63946";var barW=Math.min(pct,200);var need=Math.max(0,q.c-done);var extra=done-q.c;c.innerHTML="<div style=\"background:var(--white);border-radius:var(--rl);padding:20px;box-shadow:var(--sh);margin-bottom:16px\"><h3>📅 "+p.l+"</h3><div style=\"font-size:12px;color:var(--g5);margin-bottom:10px\">Минимум: <b>"+q.l+"</b> | "+U.role+"</div><div style=\"height:16px;border-radius:8px;background:#E2E6EB;overflow:hidden;margin-bottom:6px\"><div style=\"height:100%;border-radius:8px;width:"+barW+"%;background:"+cl+";transition:width .5s;max-width:200%\"></div></div><div style=\"font-size:12px;font-weight:600\">Проведено: <b>"+done+"</b> (мин: "+q.c+")"+(over?" — <span style=\"color:#00B4D8\">✅ перевыполнено на +"+extra+"!</span>":done>=q.c?" — ✅ план выполнен!":" — осталось: <span style=\"color:#E63946\">"+need+"</span>")+"</div>"+(need>0?"<div style=\"margin-top:10px\"><button class=\"btn bp bs\" onclick=\"sendScheduleReminder()\">✉️ Напомнить</button></div>":"")+"</div><div style=\"background:var(--white);border-radius:var(--rl);padding:20px;box-shadow:var(--sh)\">👤 <b>"+U.name+"</b> — "+U.role+"<br><span style=\"font-size:12px;color:var(--g5)\">"+(U.branch||"—")+" | "+(U.dept||"—")+" | "+(U.region||"—")+" | "+(U.city||"—")+" | "+U.email+"</span></div>"+(done>0?"<div style=\"margin-top:16px;background:var(--white);border-radius:var(--rl);padding:20px;box-shadow:var(--sh)\"><h4 style=\"margin-bottom:8px\">📋 Проведённые:</h4>"+getA().filter(function(a){return a.createdBy===U.login}).slice(0,10).map(function(a){return"<div style=\"background:var(--g1);padding:8px 12px;border-radius:var(--r);margin-bottom:6px;font-size:13px\">"+a.date+" — "+a.location+" — <span class=\"badge "+(a.overallSafe?"badge-s":"badge-d")+"\">"+(a.overallSafe?"Безопасно":"Нарушений: "+a.totalViolations)+"</span></div>"}).join("")+"</div>":"")}
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,ov=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)ov++;else 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()?"<div class=\"fb\"><button class=\"btn bp bs\" onclick=\"downloadFullCSV()\">📥 CSV данные</button><button class=\"btn bo bs\" onclick=\"downloadWorkerReport()\">👥 CSV работники</button><button class=\"btn bo bs\" onclick=\"downloadSummaryHTML()\">📊 HTML отчёт</button><span style=\"color:var(--g2);margin:0 4px\">|</span><button class=\"btn bd bs\" onclick=\"clearAllAudits()\">🗑️ Очистить всё</button><button class=\"btn bo bs\" onclick=\"clearAuditsByDate()\">📅 Очистить период</button><button class=\"btn bo bs\" onclick=\"showAllUsers()\">👥 Пользователи</button></div>":"")+"<div class=\"sg\"><div class=\"sc\"><div class=\"sl\">Всего аудитов</div><div class=\"sv\">"+total+"</div></div><div class=\"sc gr\"><div class=\"sl\">Безопасно</div><div class=\"sv\">"+allSafe+"</div></div><div class=\"sc rd\"><div class=\"sl\">С нарушениями</div><div class=\"sv\">"+wd+"</div></div><div class=\"sc bl\"><div class=\"sl\">Нарушений</div><div class=\"sv\">"+tv+"</div></div><div class=\"sc bl\"><div class=\"sl\">Перевыполняют</div><div class=\"sv\">"+ov+"</div></div><div class=\"sc gr\"><div class=\"sl\">Выполняют</div><div class=\"sv\">"+ot+"</div></div><div class=\"sc rd\"><div class=\"sl\">Отстают</div><div class=\"sv\">"+bh+"</div></div></div><div class=\"cc\" style=\"margin-bottom:16px\"><h3>🟢🔴 Соотношение</h3><div class=\"rb\"><div class=\"rs\" style=\"width:"+sp+"%\"></div><div class=\"ru\" style=\"width:"+dp+"%\"></div></div><div class=\"rl2\"><span>Безопасные: "+allSafe+"</span><span>С нарушениями: "+wd+"</span></div></div><div class=\"cg\"><div class=\"cc\"><h3>📂 По категориям</h3><canvas id=\"ch1\"></canvas></div><div class=\"cc\"><h3>📅 По датам</h3><canvas id=\"ch2\"></canvas></div><div class=\"cc\"><h3>🔝 Топ-10</h3><canvas id=\"ch3\"></canvas></div></div>";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)}