window.leavesAll=window.leavesAll||[]; function lvFmt(d){var p=String(d||'').split('-');return p.length===3?p[2]+'/'+p[1]:'';} function lvToday(){var d=new Date();return d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);} function lvOn(who,date){return (window.leavesAll||[]).filter(function(l){return l.who===who&&l.from<=date&&l.to>=date;})[0]||null;} function lvCount(f,t,half){if(!f||!t||t0)n=0.5;return n;} function openLeave(who,name){ var E2=function(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return{'&':'&','<':'<','>':'>','"':'"'}[c];});}; var ov=document.createElement('div');ov.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:9999;display:flex;align-items:center;justify-content:center;padding:14px'; var m=document.createElement('div');m.style.cssText='background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:16px;width:100%;max-width:440px;max-height:90vh;overflow:auto;color:var(--txt)'; ov.appendChild(m);document.body.appendChild(ov);ov.onclick=function(ev){if(ev.target===ov)ov.remove();}; var t0=lvToday();var inp='background:var(--ink2);border:1px solid var(--line);border-radius:8px;padding:9px 10px;color:var(--txt);font:inherit;width:100%;min-width:0;box-sizing:border-box'; function draw(msg){ var y=t0.slice(0,4);var mine=(window.leavesAll||[]).filter(function(l){return l.who===who&&String(l.from).slice(0,4)===y;}).sort(function(a,b){return a.from gửi thay (đã gán từ trước).';} else if(cand.length){dg='
⚠ Chưa có ai báo cáo thay — chọn người gửi báo cáo thay trong thời gian bạn nghỉ
'+cand.map(function(x){return '';}).join('')+'
Người được chọn có quyền báo cáo thay đúng trong các ngày bạn nghỉ.
';} else{dg='
⚠ Phòng chưa có nhân viên nào để báo cáo thay.
';}} var h='
🌴 Nghỉ phép · '+E2(name)+'✕
' +'
Từ ngày
Đến ngày
' +'
Buổi
' +'
Lý do (không bắt buộc)
' +'
'+dg +(msg?'
'+E2(msg)+'
':'') +'' +'
Lịch sử nghỉ phép · '+y+'
'; if(!mine.length)h+='
Chưa có.
'; mine.forEach(function(l){h+='
'+lvFmt(l.from)+(l.to!==l.from?' → '+lvFmt(l.to):'')+(l.half==='am'?' (sáng)':(l.half==='pm'?' (chiều)':''))+(l.reason?' · '+E2(l.reason):'')+((l.delegates&&l.delegates.length)?' · báo cáo thay: '+E2(l.delegates.map(function(id){var x=(emps||[]).filter(function(y){return y.id===id;})[0];return x?x.name:'';}).filter(Boolean).join(', ')):'')+''+l.days+' ngàyXóa
';}); if(mine.length)h+='
Tổng năm '+y+''+tot+' ngày
'; m.innerHTML=h; var F=m.querySelector('#lvF'),T=m.querySelector('#lvT'),H=m.querySelector('#lvH'),Cn=m.querySelector('#lvC'); var DF=null,DT=null;var upd=function(){m.querySelectorAll('[data-dgl]').forEach(function(lb){var id=lb.getAttribute('data-dgl');var ov=(window.leavesAll||[]).filter(function(l){return l.who===id&&F.value&&T.value&&l.from<=T.value&&l.to>=F.value;})[0];var cb=lb.querySelector('input'),nt=lb.querySelector('[data-dgn]');if(ov){cb.checked=false;cb.disabled=true;lb.style.opacity='.5';nt.textContent='(nghỉ phép '+lvRange(ov)+')';}else{cb.disabled=false;lb.style.opacity='';nt.textContent='';}});var same=F.value&&F.value===T.value;H.disabled=!same;if(!same)H.value='';Cn.textContent='Số ngày nghỉ: '+lvCount(F.value,T.value,H.value)+' ngày (không tính Chủ nhật)';}; F.onchange=function(){if(T.value"]/g,function(c){return{'&':'&','<':'<','>':'>','"':'"'}[c];});} function lvDaysIn(l,a,b){var f=l.from>a?l.from:a,t=l.to0;});var d=0;inP.forEach(function(l){d+=lvDaysIn(l,a,b);});var yd=0;mine.forEach(function(l){yd+=lvDaysIn(l,y+'-01-01',y+'-12-31');});return {p:p,n:inP.length,d:d,yd:yd,list:inP};}); var chip=function(k,t){var on=per===k;return '';}; var cm=new Date().getMonth()+1;var ch='';for(var i=1;i<=cm;i++)ch+=chip('m'+i,'T'+i);ch+=chip('y','Cả năm'); var C='padding:8px;border-bottom:1px solid var(--line);white-space:nowrap;overflow:hidden;text-overflow:ellipsis'; var h='
🌴 Thống kê nghỉ phép · '+lbl+'
'+ch+'
'; h+='
'+['Họ tên','Số lần','Số ngày','Cả năm'].map(function(x,i){return '
'+x+'
';}).join(''); rows.forEach(function(r,ix){h+='
'+(r.list.length?'▸ ':'')+E3(r.p.name)+'
'+r.n+'
'+r.d+'
'+r.yd+'
'; h+='
'+r.list.map(function(l){return lvRange(l)+(l.half?(l.half==='am'?' (sáng)':' (chiều)'):'')+(l.reason?' · '+E3(l.reason):'')+' · '+lvDaysIn(l,a,b)+' ngày';}).join('
')+'
';}); h+='
';box.innerHTML=h; box.querySelectorAll('[data-lvp]').forEach(function(x){x.onclick=function(){window.__lvP=x.getAttribute('data-lvp');lvStatMount();};}); box.querySelectorAll('[data-lvr]').forEach(function(x){x.onclick=function(){var d=box.querySelector('[data-lvd="'+x.getAttribute('data-lvr')+'"]');if(d)d.style.display=(d.style.display==='none')?'block':'none';};}); var xb=box.querySelector('#lvXls');if(xb)xb.onclick=function(){var q=function(v){v=String(v==null?'':v);return '"'+v.replace(/"/g,'""')+'"';};var out=[['Họ tên','Từ ngày','Đến ngày','Buổi','Số ngày','Lý do'].map(q).join(',')];rows.forEach(function(r){r.list.forEach(function(l){out.push([r.p.name,l.from,l.to,l.half==='am'?'Sáng':(l.half==='pm'?'Chiều':'Cả ngày'),lvDaysIn(l,a,b),l.reason||''].map(q).join(','));});});out.push('');rows.forEach(function(r){out.push([r.p.name,'','','Tổng',r.d,''].map(q).join(','));});var blob=new Blob(['\ufeff'+out.join('\r\n')],{type:'text/csv;charset=utf-8'});var u=URL.createObjectURL(blob);var A=document.createElement('a');A.href=u;A.download='nghi-phep-'+lbl.replace(/[^0-9A-Za-z]+/g,'-')+'.csv';document.body.appendChild(A);A.click();A.remove();setTimeout(function(){URL.revokeObjectURL(u);},2000);}; } (function(){try{if(typeof renderStat==='function'){var _o=renderStat;renderStat=function(){var r=_o.apply(this,arguments);try{if(r&&r.then)r.then(function(){try{lvStatMount();}catch(e){}});else lvStatMount();}catch(e){}return r;};}}catch(e){}})();