diff --git a/index.html b/index.html
index 311e7ba..b7ed775 100644
--- a/index.html
+++ b/index.html
@@ -299,6 +299,10 @@ body{
+
+
+
+
+
@@ -533,7 +547,7 @@ function saveRegisteredUsers(data){localStorage.setItem('safetyAuditRegisteredUs
function getAllUsers(){return{...getRegisteredUsers(),...PREDEFINED_USERS}}
// ========== STATE ==========
-let currentUser=null,currentPanel='newAudit',editId=null,charts={};
+let currentUser=null,currentPanel='newAudit',editId=null,charts={},lastSubmitted=null;
function isAdmin(){return currentUser&¤tUser.login==='admin'}
@@ -552,6 +566,7 @@ function init(){
document.getElementById('regLogin').addEventListener('keydown',function(e){if(e.key==='Enter')doRegister();});
document.getElementById('regPass').addEventListener('keydown',function(e){if(e.key==='Enter')doRegister();});
document.getElementById('regName').addEventListener('keydown',function(e){if(e.key==='Enter')doRegister();});
+ document.getElementById('regEmail').addEventListener('keydown',function(e){if(e.key==='Enter')doRegister();});
}
init();
@@ -759,6 +774,7 @@ function submitAudit(){
observerRole:document.getElementById('pabObserverRole').value.trim(),
supervisor:document.getElementById('pabSupervisor').value.trim(),
supervisorRole:document.getElementById('pabSupervisorRole').value.trim(),
+ email:document.getElementById('pabEmail').value.trim()||currentUser.email||'',
overallSafe:overallSafe,
categories:cats,
totalViolations:totalViolations,
@@ -772,10 +788,8 @@ function submitAudit(){
else{audits.unshift(entry);}
saveAudits(audits);
resetAuditForm();
- const s=document.getElementById('formSuccess');
- s.style.display='block';
- setTimeout(()=>s.style.display='none',3000);
- window.scrollTo({top:0,behavior:'smooth'});
+ lastSubmitted=entry;
+ showSuccess(entry);
}
function resetAuditForm(){
@@ -790,6 +804,7 @@ function resetAuditForm(){
document.getElementById('pabObserverRole').value='';
document.getElementById('pabSupervisor').value='';
document.getElementById('pabSupervisorRole').value='';
+ document.getElementById('pabEmail').value=currentUser?currentUser.email||'':'';
setOverall('safe');
editId=null;
CATEGORIES.forEach(cat=>{
@@ -809,6 +824,88 @@ function resetAuditForm(){
document.getElementById('formSuccess').style.display='none';
}
+function showSuccess(entry){
+ const catsWithVio=CATEGORIES.filter(cat=>{
+ const c=entry.categories&&entry.categories[cat.id];
+ return c&&c.items.length>0;
+ }).map(c=>c.title).join(', ')||'все категории безопасны';
+
+ document.getElementById('successDetail').innerHTML=`
+ Бланк №${entry.number||'—'} | ${entry.date} | ${entry.timeStart||'—'}—${entry.timeEnd||'—'}
+ Место: ${entry.location} | Тип: ${entry.workType||'—'}
+ Наблюдатель: ${entry.observer} | Статус: ${entry.overallSafe?'ВСЕ БЕЗОПАСНО':'ВЫЯВЛЕНО '+entry.totalViolations+' НАРУШЕНИЙ'}
+ Категории с нарушениями: ${catsWithVio}
+ ${entry.email?'
Копия отправляется на: '+entry.email+'':''}`;
+
+ const s=document.getElementById('formSuccess');
+ s.style.display='block';
+ window.scrollTo({top:s.offsetTop-80,behavior:'smooth'});
+ setTimeout(()=>{if(s.style.display==='block')s.style.display='none';},30000);
+}
+
+function sendEmailConfirm(){
+ if(!lastSubmitted)return;
+ const e=lastSubmitted;
+ const emailTo=e.email||currentUser.email||'';
+ const subject='ПАБ №'+(e.number||'—')+' от '+e.date;
+ const body=`ПОДТВЕРЖДЕНИЕ ПОВЕДЕНЧЕСКОГО АУДИТА БЕЗОПАСНОСТИ (ПАБ)
+
+Бланк ПАБ №: ${e.number||'—'}
+Дата: ${e.date}
+Время: ${e.timeStart||'—'} — ${e.timeEnd||'—'}
+Место: ${e.location}
+Тип работы: ${e.workType||'—'}
+Наблюдатель: ${e.observer} (${e.observerRole||'—'})
+Руководитель: ${e.supervisor||'—'} (${e.supervisorRole||'—'})
+Статус: ${e.overallSafe?'ВСЕ БЕЗОПАСНО':'ВЫЯВЛЕНО НАРУШЕНИЙ: '+e.totalViolations}
+
+=== РЕЗУЛЬТАТЫ ПО КАТЕГОРИЯМ ===
+${CATEGORIES.map(cat=>{
+ const cdata=e.categories&&e.categories[cat.id];
+ const items=cdata?cdata.items:[];
+ return cat.title+': '+(items.length===0?'БЕЗОПАСНО':items.length+' наруш.: '+items.map(it=>it.item+(it.other?' ('+it.other+')':'')).join('; '));
+}).join('\n')}
+
+${e.violations&&e.violations.length>0?'\n=== НЕСООТВЕТСТВИЯ ===\n'+e.violations.map((v,i)=>(i+1)+'. '+v.nc+' | Исп: '+v.executor+' | Меры: '+v.measure+' | Отв: '+v.responsible).join('\n'):''}
+
+Аудит проведён в системе ПАБ. ${e.overallSafe?'Нарушений не выявлено.':'Требуются корректирующие меры.'}`;
+
+ if(emailTo&&emailTo.includes('@')){
+ window.location.href='mailto:'+encodeURIComponent(emailTo)+'?subject='+encodeURIComponent(subject)+'&body='+encodeURIComponent(body);
+ }else{
+ alert('Не указан email для отправки. Укажите email в форме аудита или при регистрации.');
+ }
+}
+
+function printConfirm(){
+ if(!lastSubmitted)return;
+ const e=lastSubmitted;
+ const w=window.open('','_blank','width=700,height=800');
+ w.document.write(`ПАБ №${e.number||'—'}
+
+
+БЛАНК ПАБ №${e.number||'—'} от ${e.date}
+Время: ${e.timeStart||'—'} — ${e.timeEnd||'—'} | Место: ${e.location}
+Тип работы: ${e.workType||'—'} | Наблюдаемых: ${e.workerCount||0}
+Наблюдатель: ${e.observer} (${e.observerRole||'—'})
+Руководитель: ${e.supervisor||'—'} (${e.supervisorRole||'—'})
+Статус: ${e.overallSafe?'ВСЕ БЕЗОПАСНО':'ВЫЯВЛЕНО '+e.totalViolations+' НАРУШЕНИЙ'}
+${CATEGORIES.map(cat=>{
+ const cdata=e.categories&&e.categories[cat.id];
+ const items=cdata?cdata.items:[];
+ let rows='';
+ items.forEach(it=>{rows+='| ☒ | '+it.item+(it.other?' — '+it.other:'')+' |
';});
+ return ''+cat.title+' — '+(items.length===0?'БЕЗОПАСНО':items.length+' наруш.')+'
';
+}).join('')}
+${e.violations&&e.violations.length>0?'НЕСООТВЕТСТВИЯ
| № | Несоответствие | Исполнитель | Меры | Ответственный | Дата |
'+e.violations.map((v,i)=>'| '+(i+1)+' | '+v.nc+' | '+v.executor+' | '+v.measure+' | '+v.responsible+' | '+v.date+' |
').join('')+'
':''}
+`);
+ w.document.close();
+}
+
// ========== DATA STORAGE ==========
function getAudits(){try{return JSON.parse(localStorage.getItem('safetyAudits')||'[]')}catch(e){return[]}}
function saveAudits(data){localStorage.setItem('safetyAudits',JSON.stringify(data))}
@@ -827,6 +924,7 @@ function doRegister(){
const login=document.getElementById('regLogin').value.trim().toLowerCase();
const pass=document.getElementById('regPass').value.trim();
const name=document.getElementById('regName').value.trim();
+ const email=document.getElementById('regEmail').value.trim();
const role=document.getElementById('regRole').value;
const err=document.getElementById('regError');
const ok=document.getElementById('regSuccess');
@@ -834,16 +932,18 @@ function doRegister(){
if(!login||login.length<2){err.textContent='Логин должен быть минимум 2 символа';err.style.display='block';return;}
if(!pass||pass.length<3){err.textContent='Пароль должен быть минимум 3 символа';err.style.display='block';return;}
if(!name){err.textContent='Укажите ФИО';err.style.display='block';return;}
+ if(!email||!email.includes('@')){err.textContent='Укажите корректный Email';err.style.display='block';return;}
const allUsers=getAllUsers();
if(allUsers[login]){err.textContent='Такой логин уже занят';err.style.display='block';return;}
err.style.display='none';
const users=getRegisteredUsers();
- users[login]={pass:pass,name:name,role:role};
+ users[login]={pass:pass,name:name,email:email,role:role};
saveRegisteredUsers(users);
ok.style.display='block';
document.getElementById('regLogin').value='';
document.getElementById('regPass').value='';
document.getElementById('regName').value='';
+ document.getElementById('regEmail').value='';
document.getElementById('loginUser').value=login;
setTimeout(()=>{switchLoginTab('login');ok.style.display='none';},2000);
}
@@ -865,13 +965,15 @@ function doLogout(){
document.getElementById('loginScreen').style.display='flex';
document.getElementById('appScreen').style.display='none';
document.getElementById('loginUser').value='';document.getElementById('loginPass').value='';
- document.getElementById('regLogin').value='';document.getElementById('regPass').value='';document.getElementById('regName').value='';
+ document.getElementById('regLogin').value='';document.getElementById('regPass').value='';document.getElementById('regName').value='';document.getElementById('regEmail').value='';
document.getElementById('loginError').style.display='none';document.getElementById('regError').style.display='none';document.getElementById('regSuccess').style.display='none';
}
function showApp(){
document.getElementById('loginScreen').style.display='none';
document.getElementById('appScreen').style.display='block';
document.getElementById('displayName').textContent=currentUser.login+' ('+currentUser.role+')';
+ document.getElementById('pabObserver').value=currentUser.name;
+ document.getElementById('pabEmail').value=currentUser.email||'';
switchPanel('newAudit',document.querySelector('[data-panel="newAudit"]'));
}
@@ -1049,6 +1151,7 @@ function editAudit(id){
document.getElementById('pabObserverRole').value=a.observerRole||'';
document.getElementById('pabSupervisor').value=a.supervisor||'';
document.getElementById('pabSupervisorRole').value=a.supervisorRole||'';
+ document.getElementById('pabEmail').value=a.email||'';
setOverall(a.overallSafe?'safe':'danger');
CATEGORIES.forEach(cat=>{
const cdata=a.categories&&a.categories[cat.id];