(function(){ var M={'Khảo sát lập phương án':'v2k','Triển khai mục tiêu mới':'v2t','Họp khách hàng':'v2h','Điều động quân số':'v2d','Biến động':'v2b','Quân số':'v2q'}; var P={v2k:'@V2K@',v2t:'@V2T@',v2h:'@V2H@',v2d:'@V2D@',v2b:'@V2B@',v2q:'@V2Q@'}; var F={v2k:['kh','nd','st','td'],v2t:['mt','doi','qs','st','td'],v2h:['kh','ph','nd','kq','td'],v2d:['tu','den','sl'],v2b:['loai','mt','sl','nd'],v2q:['doi','mt','hd','tt','cd','tb']}; var BL={tang:'Tăng vị trí',giam:'Giảm vị trí',vipham:'Vi phạm kỷ luật',phananh:'Khách hàng phản ánh'}; var ADDL={v2k:'+ Thêm khảo sát',v2t:'+ Thêm mục tiêu',v2h:'+ Thêm cuộc họp',v2d:'+ Thêm điều động',v2b:'+ Thêm biến động'}; var SEP='\u00A7'; var CTX=null;var QPF=''; function NVCTX(){return {get:function(){return dItems;},set:function(a){dItems=a;},cur:function(){return dCurG;},save:function(){dAutoSave();}};} function C(s){return String(s==null?'':s).replace(/[\u00A7@\n\r]/g,' ').trim();} function enc(m,o){o=o||{};return P[m]+F[m].map(function(k){return C(o[k]);}).join(SEP);} function dec(t){if(typeof t!=='string'||t.charAt(0)!=='@')return null;for(var m in P){if(t.indexOf(P[m])===0){var a=t.slice(P[m].length).split(SEP),o={_m:m};F[m].forEach(function(k,i){o[k]=a[i]||'';});return o;}}return null;} function N(x){return parseInt(String(x==null?'':x).replace(/\D/g,''),10)||0;} function tbParse(s){return String(s||'').split(';').filter(function(x){return x.trim();}).map(function(x){var a=x.split(':');return [a[0]||'',a[1]||'',a[2]||'',a[3]||''];});} function tbSum(t){var s={n:0,mt:0,hd:0,th:0,tt:0,avg:0},rs=[];t.forEach(function(r){var h=N(r[2]),th=N(r[3]);if(!C(r[0])&&!h)return;s.n++;s.mt+=N(r[1]);s.hd+=h;s.th+=th;s.tt+=Math.max(h-th,0);if(h)rs.push(th/h*100);});s.avg=rs.length?rs.reduce(function(a,b){return a+b;},0)/rs.length:0;return s;} function fmtP(x){return (Math.round(x*100)/100).toFixed(2).replace('.',',')+'%';} window.v2TbSum=function(s){return tbSum(tbParse(s));}; function cdParse(s){return String(s||'').split(',').map(function(x){return x.split(':');}).filter(function(x){return x[0]&&x[0].trim();}).map(function(x){return [x[0].trim(),(x[1]||'').trim()];});} function hasTd(o){return !!o.td&&(o.st==='doing'||o.kq==='no'||o.kq==='wait');} function disp(o){var s=''; if(o._m==='v2k')s=(/^\s*khảo sát/i.test(o.kh||'')?String(o.kh).trim():'Khảo sát'+(o.kh?' '+o.kh:''))+(o.nd?': '+o.nd:'')+(o.st==='doing'?' (đang làm phương án)':''); else if(o._m==='v2t')s=(/^\s*mục\s*tiêu/i.test(o.mt||'')?'Triển khai '+String(o.mt).trim():'Triển khai mục tiêu'+(o.mt?' '+o.mt:''))+(o.doi?' · đội '+o.doi:'')+(o.qs?' · '+o.qs+' quân':'')+(o.st==='doing'?' (đang chuẩn bị)':''); else if(o._m==='v2h')s=(/^\s*họp/i.test(o.kh||'')?String(o.kh).trim():'Họp khách hàng'+(o.kh?' '+o.kh:''))+(o.ph?' (phối hợp '+o.ph+')':'')+(o.nd?': '+o.nd:'')+(o.kq==='no'?' — Chưa thống nhất':(o.kq==='wait'?' — Chờ khách phản hồi':'')); else if(o._m==='v2d')s='Đội '+(o.tu||'…')+' hỗ trợ đội '+(o.den||'…')+(o.sl?' ('+o.sl+' quân)':''); else if(o._m==='v2b'){var lo=o.loai||'tang';s=BL[lo]+(o.mt?': '+o.mt:'')+((lo==='tang'||lo==='giam')&&o.sl?' ('+o.sl+' vị trí)':'')+(o.nd?' — '+o.nd:'');}else if(o._m==='v2q'){var hd=N(o.hd),tt=N(o.tt),th=Math.max(hd-tt,0),a=[];if(o.doi)a.push(N(o.doi)+' đội');if(o.mt)a.push(N(o.mt)+' mục tiêu');if(o.hd)a.push('QS hợp đồng '+hd);if(o.tt)a.push('thực tế '+tt);if(hd&&o.tt!=='')a.push('thiếu '+th+' ('+String(Math.round(th/hd*1000)/10).replace('.',',')+'%)');var cl=cdParse(o.cd);if(cl.length){var tot=cl.reduce(function(x,z){return x+N(z[1]);},0);a.push('Cơ động '+tot+' ('+cl.map(function(z){return z[0]+': '+N(z[1]);}).join(', ')+')');}s=a.join(' · ');} if(hasTd(o))s+=' · Tồn đọng: '+o.td;return s;} function empty(o){if(o._m==='v2k'||o._m==='v2h')return !o.kh&&!o.nd;if(o._m==='v2t')return !o.mt;if(o._m==='v2d')return !o.tu&&!o.den;if(o._m==='v2b')return !o.mt&&!o.nd;if(o._m==='v2q')return true;return true;} window.v2Mode=function(g){return M[g]||'';}; window.v2Dec=dec;window.v2Enc=enc;window.v2HasTd=hasTd;window.v2BL=BL; window.v2DispO=function(o){return disp(o);}; window.v2Disp=function(t){var o=dec(t);return o?disp(o):null;}; window.v2Empty=function(t){var o=dec(t);return o?empty(o):null;}; function el(t,c){var e=document.createElement(t);if(c)e.className=c;return e;} function css(){if(document.getElementById('v2css'))return;var s=el('style');s.id='v2css';s.textContent='.v2w{display:flex;flex-direction:column;gap:8px}.v2c{position:relative;border:1px solid var(--line,#d6dde6);border-radius:10px;padding:10px 34px 10px 10px;display:flex;flex-direction:column;gap:7px}.v2r{display:flex;gap:6px;align-items:flex-end;flex-wrap:wrap}.v2f{display:flex;flex-direction:column;gap:2px;flex:1 1 140px;min-width:0}.v2l{font-size:11px;opacity:.7;white-space:nowrap}.v2f input{width:100%;box-sizing:border-box;padding:7px 9px;border:1px solid var(--line,#cbd5e1);border-radius:8px;background:transparent;color:inherit;font:inherit;font-size:14px}.v2s{display:flex;gap:5px;flex-wrap:wrap}.v2s button{padding:5px 11px;border-radius:999px;border:1px solid var(--line,#cbd5e1);background:transparent;color:inherit;font:inherit;font-size:12.5px;cursor:pointer;white-space:nowrap;opacity:.7}.v2s button.on{opacity:1;font-weight:600}.v2s button.on.ok{background:rgba(29,158,117,.15);border-color:#1d9e75;color:#1d9e75}.v2s button.on.wn{background:rgba(239,159,39,.15);border-color:#ef9f27;color:#c27a10}.v2s button.on.dg{background:rgba(226,75,74,.13);border-color:#e24b4a;color:#e24b4a}.v2td input{border-color:#ef9f27}.v2x{position:absolute;top:6px;right:6px;width:24px;height:24px;border:0;background:transparent;color:inherit;opacity:.5;font-size:18px;cursor:pointer}.v2arr{padding:0 2px 9px;opacity:.6}.v2tb{overflow-x:auto}.v2t{width:100%;border-collapse:collapse;table-layout:fixed;min-width:420px}.v2t th{font-size:11px;font-weight:500;opacity:.7;padding:4px 3px;white-space:nowrap;text-align:center}.v2t th:first-child{text-align:left}.v2t td{padding:3px;text-align:center;white-space:nowrap}.v2t td input{width:100%;box-sizing:border-box;padding:5px 6px;border:1px solid var(--line,#cbd5e1);border-radius:6px;background:transparent;color:inherit;font:inherit;font-size:13.5px;text-align:center}.v2t td:first-child input{text-align:left}.v2t tfoot td{font-weight:600;border-top:1px solid var(--line,#cbd5e1);padding:6px 3px}.v2t tfoot td:first-child{text-align:left}.v2ta{opacity:.75}.v2red{color:#e24b4a;font-weight:600}.v2calc{font-size:12px;color:#d9534f}.v2add{align-self:flex-start;padding:7px 12px;border-radius:8px;border:1px dashed var(--line,#cbd5e1);background:transparent;color:inherit;font:inherit;font-size:13px;cursor:pointer}';document.head.appendChild(s);} function card(mode,item,X){var o=dec(item.t)||{};var _qinfo='';if(mode==='v2q'){var _qe=!o.doi&&!o.mt&&!o.hd&&!o.tt&&!o.cd&&!o.tb;if(_qe&&QPF){var _p=dec(QPF);if(_p)o=_p;var _ld='';try{_ld=localStorage.getItem('nds_v2q_last_d')||'';}catch(_e){}_qinfo='Số hiện hành'+(_ld?' (cập nhật lần cuối '+_ld.slice(8,10)+'/'+_ld.slice(5,7)+')':'')+' — sửa ô nào sẽ lưu cập nhật mới cho hôm nay';}else if(!_qe)_qinfo='Đã cập nhật hôm nay';}var c=el('div','v2c');var tdBox=null,slBox=null,calcEl=null; function upd(){if(calcEl){var _h=N(o.hd),_t=N(o.tt);calcEl.textContent=_h?('Thiếu '+Math.max(_h-_t,0)+' quân · '+String(Math.round(Math.max(_h-_t,0)/_h*1000)/10).replace('.',',')+'% (tự tính)'):'';}if(tdBox)tdBox.style.display=hasTd({td:'x',st:o.st,kq:o.kq})?'':'none';if(slBox){var lo=o.loai||'tang';slBox.style.display=(lo==='tang'||lo==='giam')?'':'none';}} function sync(){var n={};F[mode].forEach(function(k){n[k]=o[k];});item.t=enc(mode,n);upd();if(mode==='v2q'){try{localStorage.setItem('nds_v2q_last',item.t);localStorage.setItem('nds_v2q_last_d',(typeof dDate!=='undefined'&&dDate)?dDate:((typeof rDate!=='undefined'&&rDate)?rDate:''));}catch(_e){}}X.save();} function fld(k,lb,ph,fx){var d=el('label','v2f');if(fx)d.style.flex=fx;var s=el('span','v2l');s.textContent=lb;var i=el('input');i.value=o[k]||'';i.placeholder=ph||'';i.oninput=function(){o[k]=i.value;sync();};d.appendChild(s);d.appendChild(i);return d;} function row(){var r=el('div','v2r');for(var i=0;iĐộiMục tiêuQS HĐThiếuQS thựcTỉ lệ';var TB=el('tbody');T.appendChild(TB);var TF=el('tfoot');T.appendChild(TF); function tbFoot(){var s=tbSum(tbl);TF.innerHTML=''+s.n+' đội'+s.mt+''+s.hd+''+s.th+''+s.tt+''+(s.n?fmtP(s.avg):'—')+'';} function tbSave(){o.tb=tbl.filter(function(r){return C(r[0])||N(r[1])||N(r[2])||N(r[3]);}).map(function(r){return [C(r[0]).replace(/[:;,]/g,' '),N(r[1]),N(r[2]),N(r[3])].join(':');}).join(';');var s=tbSum(tbl);if(s.n){o.doi=String(s.n);o.mt=String(s.mt);o.hd=String(s.hd);o.tt=String(s.tt);}tbFoot();sync();} function tbRow(r){var tr=el('tr');var a=el('td','v2ta'),p=el('td','v2tp'); function calc(){var h=N(r[2]),th=N(r[3]);a.textContent=String(r[2]||'')!==''?String(Math.max(h-th,0)):'';p.textContent=(h&&th)?fmtP(th/h*100):'—';p.className=(h&&th)?'v2tp v2red':'v2tp';} function ci(i,num){var td=el('td');var inp=el('input');inp.value=r[i]||'';if(num)inp.inputMode='numeric';inp.oninput=function(){if(num){inp.value=inp.value.replace(/\D/g,'');}r[i]=inp.value;calc();tbSave();};td.appendChild(inp);tr.appendChild(td);} ci(0,false);ci(1,true);ci(2,true);ci(3,true);tr.appendChild(a);tr.appendChild(p);var dx=el('td');var b=el('button','v2x');b.type='button';b.textContent='×';b.style.position='static';b.onclick=function(){var i=tbl.indexOf(r);if(i>=0)tbl.splice(i,1);tr.remove();tbSave();};dx.appendChild(b);tr.appendChild(dx);calc();TB.appendChild(tr);} tbl.forEach(tbRow);if(!tbl.length){var z0=['','','',''];tbl.push(z0);tbRow(z0);}tbFoot();tw.appendChild(T);c.appendChild(tw); var ad0=el('button','v2add');ad0.type='button';ad0.textContent='+ Thêm đội';ad0.onclick=function(){var z=['','','',''];tbl.push(z);tbRow(z);var f=TB.lastChild&&TB.lastChild.querySelector('input');if(f)f.focus();};c.appendChild(ad0);if(_qinfo){var _qi=el('div','v2l');_qi.style.whiteSpace='normal';_qi.textContent=_qinfo;c.appendChild(_qi);}var cdl=el('span','v2l');cdl.textContent='Cơ động hỗ trợ đội';c.appendChild(cdl);var cdw=el('div','v2w');c.appendChild(cdw);var cl=cdParse(o.cd); function cdSave(){o.cd=cl.filter(function(z){return C(z[0])||C(z[1]);}).map(function(z){return C(z[0]).replace(/[,:]/g,' ')+':'+C(z[1]).replace(/\D/g,'');}).join(',');sync();} function cdRow(z){var r=el('div','v2r');var a=el('input');a.placeholder='Đội, VD: DN01';a.value=z[0];var b=el('input');b.placeholder='Số';b.value=z[1];b.inputMode='numeric';var w1=el('label','v2f');w1.appendChild(a);var w2=el('label','v2f');w2.style.flex='0 0 80px';w2.appendChild(b);var d=el('button','v2x');d.type='button';d.textContent='×';d.style.position='static';a.oninput=function(){z[0]=a.value;cdSave();};b.oninput=function(){z[1]=b.value;cdSave();};d.onclick=function(){var i=cl.indexOf(z);if(i>=0)cl.splice(i,1);r.remove();cdSave();};r.appendChild(w1);r.appendChild(w2);r.appendChild(d);cdw.appendChild(r);} cl.forEach(cdRow);var ad=el('button','v2add');ad.type='button';ad.textContent='+ Thêm đội';ad.onclick=function(){var z=['',''];cl.push(z);cdRow(z);};c.appendChild(ad);} upd();return c;} window.v2Card=function(m,it,X){css();return card(m,it,X);};window.v2NVCTX=NVCTX;window.v2Css=css; window.v2Build=function(mode,box,ctx){css();QPF='';var X=ctx||NVCTX();CTX=X;var w=el('div','v2w');box.appendChild(w);var list=el('div','v2w');w.appendChild(list); var g=X.cur();var its=X.get().filter(function(z){return z.g===g;});its.forEach(function(it){list.appendChild(card(mode,it,X));}); if(!its.length){var _pf=null;if(mode==='v2q'){try{_pf=localStorage.getItem('nds_v2q_last');}catch(_e){}QPF=(_pf&&_pf.indexOf('@V2Q@')===0)?_pf:'';}var ni={g:g,t:enc(mode,{})};X.get().push(ni);list.appendChild(card(mode,ni,X));} var b=el('button','v2add');b.type='button';b.textContent=ADDL[mode]||'+ Thêm';b.onclick=function(){var ni={g:X.cur(),t:enc(mode,{})};X.get().push(ni);var cc=card(mode,ni,X);list.appendChild(cc);var f=cc.querySelector('input');if(f)f.focus();};if(mode!=='v2q')w.appendChild(b);}; document.addEventListener('keydown',function(e){if(e.key!=='Enter'||e.defaultPrevented||e.isComposing||e.keyCode===229)return;var t=e.target;if(!t||t.tagName!=='INPUT')return;var bd=document.getElementById('dtblbox'),br=document.getElementById('rtblbox');var inD=bd&&bd.contains(t),inR=br&&br.contains(t);if(!inD&&!inR)return;e.preventDefault();try{if(inD){var p=document.getElementById('dpreview');if(p&&typeof buildDailyText==='function')p.textContent=buildDailyText();}if(inR){var q=document.getElementById('rpreview');if(q&&typeof rBuildText==='function')q.textContent=rBuildText();}}catch(_e){}t.style.transition='box-shadow .2s';t.style.boxShadow='0 0 0 2px #1d9e75';setTimeout(function(){t.style.boxShadow='';},700);t.blur();}); })(); (function(){ var SEP='\u00A7'; function C(s){return String(s==null?'':s).replace(/[\u00A7@\n\r]/g,' ').trim();} function el(t,c){var e=document.createElement(t);if(c)e.className=c;return e;} var SCH={'@DEV@':[['name','Tên thiết bị','2 1 160px'],['qty','SL','0 0 60px'],['price','Đơn giá','0 0 100px'],['to','Cấp cho / NV nhận'],['st','Tình trạng',null,1]], '@REC@':[['pos','Vị trí tuyển','2 1 150px'],['target','Chỉ tiêu','0 0 70px'],['done','Đã tuyển','0 0 70px'],['fail','Không đạt','0 0 70px'],['src','Nguồn']], '@HTL@':[['room','Phòng',null,1],['price','Giá (₫)','0 0 110px']], '@KDN@':[['kh','Khách hàng'],['stage','Giai đoạn',null,1]], '@CSK@':[['kh','Khách hàng'],['loai','Loại',null,1],['tt','Trạng thái',null,1],['nd','Nội dung','2 1 180px']], '@DTH@':[['src','Nguồn thu','2 1 160px'],['amt','Số tiền','0 0 120px']], '@MKH@':[['kh','Tên khách hàng'],['nd','Ghi chú','2 1 180px']], '@MKT@':[['kh','Tên khách hàng'],['nd','Nội dung hợp đồng','2 1 180px']], '@HNOTE@':[['x','Ghi chú khách sạn']]}; if(!document.getElementById('ndsiecss')){var s=el('style');s.id='ndsiecss';s.textContent='.nds-editing{flex-wrap:wrap;border-color:#1d9e75!important}.nds-editing>*:not(.nds-ie){display:none!important}.nds-ie{flex:1 1 100%;display:flex;flex-direction:column;gap:7px;min-width:0}.nds-ie .v2c{border:0;padding:0}.nds-ie .v2x{display:none}.nds-ie textarea{width:100%;box-sizing:border-box;padding:7px 9px;border:1px solid #1d9e75;border-radius:8px;background:transparent;color:inherit;font:inherit;font-size:14px;resize:vertical}.nds-ieb{display:flex;justify-content:flex-end;gap:6px}.nds-ieb button{padding:5px 12px;border-radius:8px;font:inherit;font-size:12.5px;cursor:pointer;white-space:nowrap}.nds-ieb .y{background:#1d9e75;border:1px solid #1d9e75;color:#fff}.nds-ieb .n{background:transparent;border:1px solid #8aa0b5;color:inherit}';document.head.appendChild(s);} var CUR=null; function GDCTX(){return {get:function(){return rItems;},set:function(a){rItems=a;},cur:function(){return rCurG;},save:function(){rAutoSave();}};} function openEd(row,tx,it,opt){var old=it.t,save=opt.save,disp=opt.disp||function(x){return x;};var ed=el('div','nds-ie'); if(typeof old==='string'&&old.charAt(0)==='@'){var built=false;var v2=window.v2Dec?v2Dec(old):null; if(v2&&window.v2Card){var X=opt.side==='gd'?GDCTX():v2NVCTX();ed.appendChild(v2Card(v2._m,it,{get:X.get,set:X.set,cur:X.cur,save:function(){save();}}));built=true;} else{var k=old.indexOf('@',1);var pf=k>0?old.slice(0,k+1):'';var sc=SCH[pf]; if(sc){if(window.v2Css)v2Css();var a=pf==='@HNOTE@'?[old.slice(pf.length)]:old.slice(pf.length).split(SEP);var o={};sc.forEach(function(f,i){o[f[0]]=a[i]||'';});var r=el('div','v2r'); sc.forEach(function(f){var d=el('label','v2f');if(f[2])d.style.flex=f[2];var sp=el('span','v2l');sp.textContent=f[1];var inp=el('input');inp.value=o[f[0]]; if(f[3]){inp.readOnly=true;inp.title='Đổi ở form của nhóm';inp.style.opacity='.55';} else inp.oninput=function(){o[f[0]]=inp.value;it.t=pf+(pf==='@HNOTE@'?String(inp.value).replace(/[\n\r]/g,' '):sc.map(function(ff){return C(o[ff[0]]);}).join(SEP));save();}; d.appendChild(sp);d.appendChild(inp);r.appendChild(d);});ed.appendChild(r);built=true;}} if(!built)return;} else{var ta=el('textarea');ta.rows=2;ta.value=old||'';ta.oninput=function(){it.t=ta.value.replace(/[\n\r]+/g,' ').replace(/^@+/,'');save();};ed.appendChild(ta);} var bb=el('div','nds-ieb');var n=el('button','n');n.type='button';n.textContent='Huỷ';var y=el('button','y');y.type='button';y.textContent='✓ Xong';bb.appendChild(n);bb.appendChild(y);ed.appendChild(bb); function close(keep){CUR=null;if(!keep||(typeof it.t==='string'&&!it.t.trim())){if(it.t!==old){it.t=old;save();}}ed.remove();row.classList.remove('nds-editing');try{tx.textContent=disp(it.t);}catch(_e){}} CUR=close;y.onclick=function(){close(true);};n.onclick=function(){close(false);}; ed.addEventListener('keydown',function(e){if(e.isComposing||e.keyCode===229)return;if(e.key==='Enter'){e.preventDefault();close(true);}else if(e.key==='Escape'){e.preventDefault();close(false);}}); row.classList.add('nds-editing');row.appendChild(ed);var f=ed.querySelector('textarea,input:not([readonly])');if(f){f.focus();try{var L=f.value.length;f.setSelectionRange(L,L);}catch(_e){}}} window.ndsRowEdit=function(row,tx,it,opt){if(!row||!tx||!it)return;tx.style.cursor='pointer';tx.title='Bấm để sửa'; tx.addEventListener('click',function(){if(row.classList.contains('nds-editing'))return;if(CUR)CUR(true);try{openEd(row,tx,it,opt||{});}catch(_e){}});}; })(); (function(){ function E(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];});} function N(x){return parseInt(String(x==null?'':x).replace(/\D/g,''),10)||0;} function pct(a,b){return b?String(Math.round(a/b*1000)/10).replace('.',','):'0';} function two(x){return x<10?'0'+x:''+x;} function cdP(s){return String(s||'').split(',').map(function(x){return x.split(':');}).filter(function(x){return x[0]&&x[0].trim();}).map(function(x){return [x[0].trim(),N(x[1])];});} function IDISP(t){try{if(typeof rItemDisp==='function')return rItemDisp(t);}catch(e){}return t;} function IEMP(it){try{if(typeof rItemEmpty==='function')return rItemEmpty(it);}catch(e){}return !(it&&it.t&&String(it.t).trim());} function AD(){try{return allDaily||[];}catch(e){return [];}} function qOk(o){return o&&(o.doi||o.mt||o.hd||o.tt||o.cd);} function lastQ(lim,strict){var best=null,bd='';AD().forEach(function(r){if(!r||!r.date)return;if(strict?r.date>=lim:r.date>lim)return;(r.items||[]).forEach(function(it){var o=it&&window.v2Dec?v2Dec(it.t):null;if(o&&o._m==='v2q'&&qOk(o)&&r.date>=bd){best=o;bd=r.date;}});});return best?{o:best,d:bd}:null;} function dl(c,p,inv){if(p===null||p===undefined)return '';var x=c-p;if(!x)return 'không đổi';var up=x>0,good=inv?!up:up;return ''+(up?'▲':'▼')+Math.abs(x)+'';} var PAL=['#1e3a5f','#B8892C','#4a6f99','#d4a94e','#7a93b3','#8a6a1e','#a9b8ca','#5f7d5a']; var CB='border:1px solid #dfe5ec;border-radius:8px;padding:10px 12px',HB='font-size:11px;color:#5b6b7c;letter-spacing:.4px;margin-bottom:6px;white-space:nowrap;text-align:center;font-weight:600'; function sub(h){return h?''+h+'':'';} function qBlock(g){var L=lastQ(g.t,false),P=lastQ(g.f,true);if(!L)return '
Chưa nhập Quân số trong báo cáo ngày.
'; var o=L.o,p=P?P.o:null,hd=N(o.hd),tt=N(o.tt),th=Math.max(hd-tt,0); var big=function(v,u,d){return '
'+v+' '+u+''+sub(d)+'
';}; var bc=function(x,u){return '
'+x+'
'+u+'
';};var c1='
QUY MÔ VÙNG
'+bc(N(o.doi),'đội')+'
'+bc(N(o.mt),'mục tiêu')+'
'; var bar=function(lb,v,w,col,d){return '
'+lb+''+v+''+sub(d)+'
';}; var c2='
QUÂN SỐ
'+bar('Theo hợp đồng',hd,100,'#9fb3cb',p?dl(hd,N(p.hd)):'')+bar('Thực tế',tt,hd?Math.min(100,tt/hd*100):0,'#1e3a5f',p?dl(tt,N(p.tt)):'')+'
Thiếu '+th+' quân'+sub(p?dl(th,Math.max(N(p.hd)-N(p.tt),0),1):'')+'
'; var _ts=(o.tb&&window.v2TbSum)?v2TbSum(o.tb):null;if(_ts&&!_ts.n)_ts=null;var CI=2*Math.PI*44,fr=_ts?_ts.avg/100:(hd?th/hd:0); var c3='
TỈ LỆ THIẾU
'+(_ts?(Math.round(_ts.avg*100)/100).toFixed(2).replace('.',','):pct(th,hd))+'%'+(_ts?'TB '+_ts.n+' đội':th+' / '+hd)+'
'; var cl=cdP(o.cd),tot=cl.reduce(function(s,x){return s+x[1];},0),cdh=''; if(cl.length){var seg=cl.map(function(x,i){var w=tot?x[1]/tot*100:100/cl.length;return '
'+(cl.length<=3?E(x[0])+' · '+two(x[1]):'')+'
';}).join(''); var lg=cl.length>3?'
'+cl.map(function(x,i){return ''+E(x[0])+' · '+two(x[1])+'';}).join('')+'
':''; cdh='
CƠ ĐỘNG HỖ TRỢ ĐỘI
'+tot+' cơ động
'+seg+'
'+lg+'
';} return '
'+c1+c2+c3+'
'+cdh;} function U(a){var o=[];a.forEach(function(x){if(x&&o.indexOf(x)<0)o.push(x);});return o;} function TU(g,tu){var k=null;try{if(typeof _kpiCalc==='function')k=_kpiCalc('week',g);}catch(e){}var Y=0;try{Y=parseInt(String(window.myKpiHire||0).replace(/\D/g,''),10)||0;}catch(e){}var n=(k&&k.hireN!=null)?(+k.hireN||0):0; if(!Y&&!n)return 'Không';var ok=Y?n>=Y:true; var pill=Y?''+(ok?'✓ Đạt':'Chưa đạt')+'':''; return ''+n+(Y?'/'+Y:'')+''+pill+'';} function bdBlock(recs,g){var tg=[],gm=[],vp=[],pa=[],tu=[]; recs.forEach(function(r){(r.items||[]).forEach(function(it){if(!it||!it.t)return;var o=window.v2Dec?v2Dec(it.t):null; if(o&&o._m==='v2b'){if(!o.mt&&!o.nd)return;var lo=o.loai||'tang';var s=(o.mt||'')+((lo==='tang'||lo==='giam')&&N(o.sl)?' ('+N(o.sl)+' vị trí)':'')+(o.nd?(o.mt?' — ':'')+o.nd:'');(lo==='tang'?tg:lo==='giam'?gm:lo==='vipham'?vp:pa).push(s);} else if(it.g==='Tuyển nhân sự'&&!IEMP(it))tu.push(IDISP(it.t));});}); var V=function(a){a=U(a);return a.length?a.map(E).join('
'):'Không';}; var box=function(l,h){return '
'+l+'
'+h+'
';}; var tgh=(tg.length||gm.length)?('Tăng: '+(tg.length?U(tg).map(E).join('; '):'—')+'
Giảm: '+(gm.length?U(gm).map(E).join('; '):'—')):'Không'; return '
'+box('Tăng / giảm vị trí',tgh)+box('Vi phạm kỷ luật',V(vp))+box('Khách hàng phản ánh',V(pa))+box('Tuyển dụng',TU(g,tu))+'
';} var CATS=[['v2k','Khảo sát, lập phương án'],['v2t','Triển khai mục tiêu mới'],['v2h','Họp khách hàng'],['v2d','Điều động quân số'],['ot','Công tác khác']]; var SKIP={'Kế hoạch ngày mai':1,'Tuyển nhân sự':1,'Quân số':1,'Biến động':1}; function gather(recs){var D={v2k:[],v2t:[],v2h:[],v2d:[],ot:[]},T={v2k:[],v2t:[],v2h:[],v2d:[],ot:[]},LB={v2k:[],v2t:[],v2h:[],v2d:[],ot:[]}; recs.slice().sort(function(a,b){return (a.date||'')<(b.date||'')?-1:1;}).forEach(function(r){(r.items||[]).forEach(function(it){if(!it||!it.t||SKIP[it.g])return;var o=window.v2Dec?v2Dec(it.t):null,k,tx,td='',lb=''; if(o){if(!(o._m in D))return;if(window.v2Empty&&v2Empty(it.t))return;var o2={};for(var z in o)o2[z]=o[z];if(v2HasTd(o))td=o.td;o2.td='';tx=v2DispO(o2);k=o._m;lb=o.mt||o.kh||o.tu||'';} else{if(IEMP(it))return;tx=IDISP(it.t);if(typeof tx!=='string'||!tx.trim())return;if(it.t.charAt(0)==='@'&&tx===it.t)return;k='ot';lb=tx.length>32?tx.slice(0,30)+'…':tx;if(it.st==='doing'||it.st==='todo')td=(it.st==='doing'?'Đang xử lý':'Chưa xong');} var i=D[k].indexOf(tx);if(i<0){D[k].push(tx);T[k].push(td);LB[k].push(lb);}else T[k][i]=td;});}); return {D:D,T:T,L:LB};} function wkTable(recs){var x=gather(recs),D=x.D,T=x.T,LL=x.L,TD='padding:8px 10px;vertical-align:top;border-top:1px solid #e3e8ef',tot=0,ttd=0,rows=''; var th=function(s,c){return ''+s+'';}; CATS.forEach(function(c,i){var a=D[c[0]],t=T[c[0]],tds=[];a.forEach(function(_x,j){if(t[j])tds.push((a.length>1&&LL[c[0]][j]?LL[c[0]][j]+': ':'')+t[j]);});tot+=a.length;ttd+=tds.length;var bg=i%2?'#f8fafc':'#ffffff'; var ct=a.length?'':'Không phát sinh'; var th2=tds.length?tds.map(function(s){return '
'+E(s)+'
';}).join(''):'—'; rows+=''+(i+1)+''+c[1]+''+a.length+' việc'+ct+''+th2+'';}); var FT=TD+';background:#eef2f7;border-top:1.5px solid #1e3a5f;font-weight:600;color:#1e3a5f'; return ''+th('STT',1)+th('Hạng mục')+th('Nội dung thực hiện')+th('Tồn đọng')+''+rows+'
Tổng cộng'+tot+' việc'+ttd+' tồn đọng
';} function sec(n,t,b){return '
'+n+'
'+t+'
'+b+'
';} window.v2Week=function(g){var recs=(g&&g.recs)||[];return sec(1,'QUÂN SỐ VÀ BIẾN ĐỘNG',qBlock(g)+bdBlock(recs,g))+sec(2,'CÔNG VIỆC TRONG TUẦN',wkTable(recs));}; window.v2PlanParts=function(g){var recs=(g&&g.recs)||[],last={},news=[],cont=[]; recs.forEach(function(r){var has=(r.items||[]).some(function(it){return it&&it.g==='Kế hoạch ngày mai'&&!IEMP(it);});if(has&&(!last[r.who]||r.date>last[r.who].date))last[r.who]=r;}); Object.keys(last).forEach(function(w){(last[w].items||[]).forEach(function(it){if(it&&it.g==='Kế hoạch ngày mai'&&!IEMP(it)){var s=IDISP(it.t);if(s&&news.indexOf(s)<0)news.push(s);}});}); var x=gather(recs);CATS.forEach(function(c){x.D[c[0]].forEach(function(s,j){if(x.T[c[0]][j]&&cont.indexOf(s)<0)cont.push(s);});}); return {cont:cont,news:news};}; window.v2Plan=function(g,fb){if(fb&&fb.length&&typeof fb[0]!=='string')return fb;var recs=(g&&g.recs)||[],last={}; recs.forEach(function(r){var has=(r.items||[]).some(function(it){return it&&it.g==='Kế hoạch ngày mai'&&!IEMP(it);});if(has&&(!last[r.who]||r.date>last[r.who].date))last[r.who]=r;}); var out=[];Object.keys(last).forEach(function(w){(last[w].items||[]).forEach(function(it){if(it&&it.g==='Kế hoạch ngày mai'&&!IEMP(it)){var s=IDISP(it.t);if(s&&out.indexOf(s)<0)out.push(s);}});}); var x=gather(recs);CATS.forEach(function(c){x.D[c[0]].forEach(function(s,j){if(x.T[c[0]][j]){var p='Xử lý tồn đọng: '+s;if(out.indexOf(p)<0)out.push(p);}});}); return out.length?out:(fb||[]);}; })(); (function(){ function E(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];});} var RX=/\s*\((đang xử lý|chưa xong|\d+%)\)\s*$/i; function strip(x){return String(x||'').replace(/^@SG@[^|]*\|/,'').trim();} function key(x){return strip(x).replace(RX,'').toLowerCase().replace(/\s+/g,' ').trim();} function inR(d,f,t){d=String(d||'').slice(0,10);return !!d&&d>=f&&d<=t;} var PD='background:#fdf1dc;color:#8a5a0b',PP='background:#e8eef6;color:#1e3a5f'; function li(x,p){return '
  • '+E(x)+''+(p?''+E(p[0])+'':'')+'
  • ';} function hd(x){return '
  • '+x+'
  • ';} window.ndsPlanHTML=function(g,base){var f=g.f,t=g.t,cont=[],news=[],seen={}; function addC(x,p,o){var k=key(x);if(!k||seen[k])return;seen[k]=1;cont.push({t:strip(x).replace(RX,''),p:p,o:o});} if(window.myDeptType==='vung2'&&window.v2PlanParts){var vp=v2PlanParts(g);vp.cont.forEach(function(x){addC(x,['Tồn đọng',PD],200);});base=vp.news;} else{var sm=g.stMap||{},wt=[]; Object.keys(g.map||{}).forEach(function(gr){(g.map[gr]||[]).forEach(function(x){var tt=strip(x);if(!tt||tt.charAt(0)==='@')return;wt.push(tt.toLowerCase());var sv=sm[tt.toLowerCase()];if(sv==='doing')addC(tt,['Đang xử lý',PD],200);else if(sv==='todo')addC(tt,['Chưa xong',PD],150);});}); (typeof tasks!=='undefined'&&tasks?tasks:[]).forEach(function(tk){if(!tk||tk.kind!=='assign'||tk.archived)return;var pr=+tk.progress||0;if(pr>=100)return;var ti=String(tk.title||'').trim();if(!ti)return; var act=(tk.history||[]).some(function(h){return h&&inR(h.at,f,t);})||inR(tk.createdAt||tk.created||tk.at,f,t); if(!act){var lk=ti.toLowerCase();if(lk.length>=8)act=wt.some(function(w){return w.length>=8&&(w.indexOf(lk)>=0||lk.indexOf(w)>=0);});} if(act)addC(ti,[pr+'%',PP],pr);});} (base||[]).forEach(function(x){var k=key(x);if(!k||seen[k])return;seen[k]=1;news.push(strip(x));}); cont.sort(function(a,b){return b.o-a.o;}); var h=''; if(cont.length)h+=hd('TIẾP TỤC XỬ LÝ · '+cont.length+' việc')+cont.map(function(c){return li(c.t,c.p);}).join(''); if(news.length)h+=hd('KẾ HOẠCH MỚI')+news.map(function(x){return li(x);}).join(''); if(!cont.length&&!news.length)h+=li(''); return h;}; })(); window.v2FixReport=function(doc){var BT=''; doc.querySelectorAll('.sec table li').forEach(function(li){if(li.querySelector('.dx'))return;var sp=null,ss=li.querySelectorAll('span');for(var i=0;i.itx,.pad .plan li>.itx{flex:1 1 auto;min-width:0}.pad .sec li>.mvx,.pad .plan li>.mvx{margin-left:auto}.pad .sec li>.mvx,.pad .sec li>.cpx,.pad .sec li>.dx,.pad .plan li>.mvx,.pad .plan li>.cpx,.pad .plan li>.dx{flex:0 0 auto;white-space:nowrap}';(doc.head||doc.documentElement).appendChild(s);}}catch(e){}if(f0)f0(doc);};})(); (function(){var f1=window.v2FixReport;window.v2FixReport=function(doc){if(f1)f1(doc);try{ var BT=''; var LI=function(){return '
  • '+BT+'
  • ';}; doc.querySelectorAll('.sec table tr').forEach(function(tr){var tds=tr.children;if(tds.length!==4||tds[0].tagName!=='TD')return;if(!/^\d+$/.test((tds[0].textContent||'').trim()))return;var cell=tds[2];if(cell.querySelector('.v2addln'))return;var b=doc.createElement('button');b.type='button';b.className='v2addln noprint';b.textContent='+ dòng';b.style.cssText='margin-top:4px;padding:2px 10px;border:1px dashed #b8c2cc;border-radius:6px;background:transparent;color:#5b6b7c;font:inherit;font-size:11.5px;cursor:pointer';cell.appendChild(b);}); if(!doc.__v2addln){doc.__v2addln=1;doc.addEventListener('click',function(e){var b=e.target.closest&&e.target.closest('.v2addln');if(!b)return;e.preventDefault();var cell=b.parentNode;var ul=cell.querySelector('ul');if(!ul){var ph=cell.querySelector('i');if(ph)ph.remove();ul=doc.createElement('ul');ul.style.cssText='margin:0;padding:0;list-style:none';cell.insertBefore(ul,b);}ul.insertAdjacentHTML('beforeend',LI());var li=ul.lastElementChild;if(ul.children.length===1)li.style.borderTop='0';var it=li.querySelector('.itx');if(it)it.focus();});} }catch(e){}};})(); (function(){ function hs(s){var h=0;for(var i=0;i
    ';}; document.addEventListener('click',function(e){var b=e.target.closest&&e.target.closest('.v2wkfull');if(!b)return;e.preventDefault();var w=b.parentNode&&b.parentNode.parentNode;var src=w&&w.querySelector('.v2wkifr');if(!src)return;var md=b.closest('.overlay');if(md)md.style.display='none';var ov=document.createElement('div');ov.style.cssText='position:fixed;left:0;top:0;right:0;bottom:0;z-index:2147483000;background:#2a2f36;display:flex;flex-direction:column';ov.innerHTML='
    ';var f=document.createElement('iframe');f.style.cssText='flex:1;border:0;background:#fff;width:100%';f.srcdoc=src.srcdoc;ov.appendChild(f);var bs=ov.querySelectorAll('button');bs[0].onclick=function(){ov.remove();if(md)md.style.display='';};bs[1].onclick=function(){try{f.contentWindow.focus();f.contentWindow.print();}catch(_e){}};document.body.appendChild(ov);}); })(); (function(){ function E(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];});} function ymd(d){return d.getFullYear()+'-'+('0'+(d.getMonth()+1)).slice(-2)+'-'+('0'+d.getDate()).slice(-2);} function mon(d){d=new Date(d.getFullYear(),d.getMonth(),d.getDate());d.setDate(d.getDate()-((d.getDay()+6)%7));return d;} function addD(s,n){var p=s.split('-');var d=new Date(+p[0],+p[1]-1,+p[2]);d.setDate(d.getDate()+n);return d;} function dl(wk){var d=addD(wk,5);d.setHours(22,0,0,0);return d;} function dm(d){return ('0'+d.getDate()).slice(-2)+'/'+('0'+(d.getMonth()+1)).slice(-2);} var NB='padding:6px 12px;border-radius:8px;border:1px solid var(--line,#2a3b4d);background:var(--ink2,#1b2430);color:inherit;font:inherit;font-size:13px;cursor:pointer;white-space:nowrap'; var WK0=null; async function load(){var o=null,l=null;try{o=await apiPost('boardOverview',{});}catch(e){}try{l=await apiPost('listReports',{});}catch(e){}var depts=(o&&o.status===200&&o.data&&o.data.depts)?o.data.depts:[];var reps=(l&&l.status===200&&l.data&&l.data.reports)?l.data.reports:[];return {depts:depts,reps:reps.filter(function(x){return x.kind==='weekly';})};} function nm(d,reps){var r=reps.filter(function(x){return x.fromId===d.id;})[0];return {n:d.dept||(r&&r.dept)||d.name||d.company||d.id||'',s:(r&&r.sender)||d.owner||d.mgrName||d.name||''};} function repOf(D,id,wk){var a=D.reps.filter(function(x){return x.fromId===id&&x.period===wk;});return a[0]||null;} function stOf(rep,wk){if(!rep)return new Date()>dl(wk)?'miss':'wait';return new Date(rep.sentAt)<=dl(wk)?'ok':'late';} async function renderWk(p){if(!WK0)WK0=ymd(mon(new Date()));p.innerHTML='
    Đang tải…
    ';var D=await load(); function draw(){var wk=WK0,f=addD(wk,0),t=addD(wk,5);var rows=D.depts.map(function(d){var rep=repOf(D,d.id,wk);return {rep:rep,n:nm(d,D.reps),st:stOf(rep,wk)};}); var c={ok:0,late:0,miss:0,wait:0};rows.forEach(function(r){c[r.st]++;}); var tile=function(l,v,col){return '
    '+l+'
    '+v+'
    ';}; var pill=function(st){var m={ok:['Đúng hạn','#5fb08c','rgba(95,176,140,.15)'],late:['Trễ hạn','#E0A458','rgba(224,164,88,.15)'],miss:['Chưa gửi','#e06b6b','rgba(224,107,107,.14)'],wait:['Chưa gửi','#8aa0b4','rgba(138,160,180,.14)']}[st];return ''+m[0]+'';}; var h='
    Tuần '+dm(f)+' – '+dm(t)+'/'+t.getFullYear()+'Hạn nộp 22:00 thứ 7 ('+dm(t)+')
    '; h+='
    '+tile('Đã gửi',(c.ok+c.late)+'/'+rows.length,'inherit')+tile('Đúng hạn',c.ok,'#5fb08c')+tile('Trễ hạn',c.late,'#E0A458')+tile('Chưa gửi',c.miss+c.wait,'#e06b6b')+'
    '; h+='
    '+rows.map(function(r){var tm='—';if(r.rep){var d=new Date(r.rep.sentAt);tm=('0'+d.getHours()).slice(-2)+':'+('0'+d.getMinutes()).slice(-2)+' '+['CN','T2','T3','T4','T5','T6','T7'][d.getDay()]+' '+dm(d);} var sn=r.rep?(r.rep.seenCount?'Đã xem':'Chưa xem'):''; return '
    '+E(r.n.n)+'
    '+E(r.n.s)+(r.n.s?' · ':'')+tm+'
    '+pill(r.st)+sn+'
    ';}).join('')+'
    '; if(!rows.length)h+='
    Chưa có phòng nào.
    '; p.innerHTML=h; p.querySelectorAll('.v2wkp').forEach(function(b){b.onclick=function(){WK0=ymd(addD(WK0,+b.getAttribute('data-d')));draw();};}); p.querySelectorAll('.v2wkc').forEach(function(x){x.onclick=function(){var id=x.getAttribute('data-id');if(id&&typeof openBoardReport==='function')openBoardReport(id);};});} draw();} async function renderStat(p){p.innerHTML='
    Đang tải…
    ';var D=await load();var cur=mon(new Date()),wks=[];for(var i=7;i>=0;i--){var d=new Date(cur);d.setDate(d.getDate()-7*i);wks.push(ymd(d));} var rows=D.depts.map(function(d){var sts=wks.map(function(wk){return stOf(repOf(D,d.id,wk),wk);});return {n:nm(d,D.reps),sts:sts,ok:sts.filter(function(s){return s==='ok';}).length,due:sts.filter(function(s){return s!=='wait';}).length};}); var cell=function(s){var m={ok:['✓','#5fb08c','rgba(95,176,140,.16)'],late:['!','#E0A458','rgba(224,164,88,.16)'],miss:['✕','#e06b6b','rgba(224,107,107,.15)'],wait:['·','#8aa0b4','transparent']}[s];return ''+m[0]+'';}; var TH='font-size:11px;font-weight:600;color:var(--muted,#8aa0b4);padding:7px 4px;text-align:center;white-space:nowrap;border-bottom:1px solid var(--line,#2a3b4d)',TD='padding:7px 4px;text-align:center;border-bottom:1px solid var(--line,#2a3b4d);white-space:nowrap'; var h='
    8 tuần gần nhất
    '+wks.map(function(w){return '';}).join('')+'' +rows.map(function(r){return ''+r.sts.map(function(s){return '';}).join('')+'';}).join('')+'
    Phòng'+dm(addD(w,0))+'Đúng hạn
    '+E(r.n.n)+''+cell(s)+''+r.ok+'/'+r.due+'
    ' +'
    '+cell('ok')+' Đúng hạn'+cell('late')+' Trễ hạn'+cell('miss')+' Không gửi'+cell('wait')+' Chưa tới hạn
    '; p.innerHTML=h; var b=document.getElementById('v2wkcsv');if(b)b.onclick=function(){var lab={ok:'Đúng hạn',late:'Trễ hạn',miss:'Không gửi',wait:'Chưa tới hạn'};var L=[['Phòng'].concat(wks.map(function(w){return 'Tuần '+dm(addD(w,0));})).concat(['Đúng hạn'])];rows.forEach(function(r){L.push([r.n.n].concat(r.sts.map(function(s){return lab[s];})).concat([r.ok+' / '+r.due]));}); var csv='\uFEFF'+L.map(function(a){return a.map(function(x){return '"'+String(x).replace(/"/g,'""')+'"';}).join(',');}).join('\r\n');var u=URL.createObjectURL(new Blob([csv],{type:'text/csv;charset=utf-8'}));var a=document.createElement('a');a.href=u;a.download='thong-ke-bao-cao-tuan.csv';document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},500);};} function panel(){var p=document.getElementById('panelWk');if(p)return p;var ref=document.getElementById('panelBoard');if(!ref||!ref.parentNode)return null;p=document.createElement('div');p.id='panelWk';p.className=ref.className;p.classList.add('hidden');ref.parentNode.insertBefore(p,ref.nextSibling);return p;} function addNav(){if(document.getElementById('navWk'))return;var a1=document.getElementById('navBoard'),a2=document.getElementById('navBrowse');if(!a1||!a2)return; var a3=document.createElement('a');a3.id='navWk';a3.innerHTML='📑 Báo cáo tuần';var a4=document.createElement('a');a4.id='navWkStat';a4.innerHTML='📊 Thống kê báo cáo tuần'; a3.style.display=a1.style.display;a4.style.display=a1.style.display;a2.parentNode.insertBefore(a3,a2.nextSibling);a2.parentNode.insertBefore(a4,a3.nextSibling);a3.onclick=function(){boardNavTo('wk');};a4.onclick=function(){boardNavTo('wkstat');};} if(typeof window.boardNavTo==='function'){var _o=window.boardNavTo;window.boardNavTo=function(which){var p=panel(); if(which==='wk'||which==='wkstat'){try{boardHideAllPanels();}catch(e){}document.querySelectorAll('.sb-nav a').forEach(function(x){x.classList.remove('on');});document.body.classList.remove('nav-open');if(!p)return;p.classList.remove('hidden');var n=document.getElementById(which==='wk'?'navWk':'navWkStat');if(n)n.classList.add('on'); try{setDashTitle(which==='wk'?'Báo cáo tuần':'Thống kê báo cáo tuần',which==='wk'?'Báo cáo tuần các phòng gửi lên':'Đúng hạn · trễ hạn · không gửi theo tuần');}catch(e){}if(which==='wk')renderWk(p);else renderStat(p);return;} if(p)p.classList.add('hidden');return _o.apply(this,arguments);};} addNav();setInterval(addNav,250); })(); (function(){ function E(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];});} function isWk(){try{return typeof curReportKind!=='undefined'&&curReportKind==='weekly';}catch(e){return false;}} function dt(){try{return window.myDeptType||'';}catch(e){return '';}} var BT=''; function lines(){var g=null;try{g=wGather();}catch(e){}var recs=(g&&g.recs)?g.recs.slice():[];recs.sort(function(a,b){return (a.date||'')<(b.date||'')?-1:1;});var out=[],seen={}; recs.forEach(function(r){(r.items||[]).forEach(function(it){if(!it||typeof it.t!=='string')return;var gr=String(it.g||'').toLowerCase();if(gr.indexOf('kế hoạch')>=0||gr.indexOf('tuyển')>=0||gr.indexOf('mua sắm')>=0)return;var t=it.t.trim();var m=/^@SG@[^|]*\|([\s\S]*)$/.exec(t);if(m)t=m[1].trim();else if(t.charAt(0)==='@')return;if(!t)return;var k=t.toLowerCase();if(seen[k])return;seen[k]=1;out.push({t:t,st:it.st||'done'});});});return out;} function modal(html){var ov=document.createElement('div');ov.className='v2aiov';ov.style.cssText='position:fixed;left:0;top:0;right:0;bottom:0;z-index:2147483000;background:rgba(10,14,20,.6);display:flex;align-items:center;justify-content:center;padding:16px';ov.innerHTML='
    '+html+'
    ';document.body.appendChild(ov);return ov;} function liH(it){var x=it.t,i=x.indexOf(':'),body=(i>0&&i<70)?''+E(x.slice(0,i))+':'+E(x.slice(i+1)):E(x);var d=!!it.doing;return '
  • '+body+''+BT+'
  • ';} function apply(sections){var ifr=document.getElementById('reportFrame');var doc=ifr&&ifr.contentDocument;if(!doc)return false;var pad=doc.querySelector('.pad');if(!pad)return false; var olds=Array.prototype.filter.call(pad.querySelectorAll('.sec'),function(s){return !!s.querySelector(':scope > ul.items');}); var html=sections.map(function(s){return '
    '+E(String(s.title||'').toUpperCase())+'
      '+s.items.map(liH).join('')+'
    ';}).join(''); var tmp=doc.createElement('div');tmp.innerHTML=html;var anchor=olds.length?olds[0]:(pad.querySelector('.addwrap')||pad.querySelector('.plan')); while(tmp.firstChild){if(anchor&&anchor.parentNode)anchor.parentNode.insertBefore(tmp.firstChild,anchor);else pad.appendChild(tmp.firstChild);} olds.forEach(function(s){s.remove();});var k=0;pad.querySelectorAll('.sec .sechd .num').forEach(function(n){n.textContent=++k;});return true;} function btnSet(busy){var b=document.getElementById('rptAi');if(!b)return;b.disabled=!!busy;b.textContent=busy?'⏳ Đang gộp…':'✨ Gộp bằng AI';b.style.opacity=busy?'.7':'';} async function doRun(L){btnSet(true);try{if(typeof doRptSave==='function')await doRptSave(true);}catch(e){}var dept='';try{dept=rGetS('nds_daily_dept','');}catch(e){}var r=null; try{r=await apiPost('aiWeekly',{lines:L,dept:dept,week:(typeof curWeekKey!=='undefined'?curWeekKey:'')});}catch(e){}btnSet(false);var d=r&&r.data; if(!r||r.status!==200||!d||!d.ok){var m={limit:'Đã dùng hết 5 lượt gộp AI hôm nay, thử lại ngày mai.',nokey:'Máy chủ chưa có khóa API.',empty:'Không có dòng nào để gộp.',parse:'AI trả kết quả không hợp lệ, bấm gộp lại thử.',api:'Không gọi được AI'+(d&&d.msg?(': '+d.msg):'')+'.'};if(typeof toast==='function')toast((d&&m[d.error])||'Gộp không thành công, thử lại.');return;} var ok=apply(d.sections||[]);var n=0;(d.sections||[]).forEach(function(s){n+=s.items.length;}); if(typeof toast==='function')toast(ok?('✨ Đã gộp '+d.n+' dòng thành '+n+' mục'+(d.cached?' (dùng lại kết quả trước, không tốn phí)':'')+(d.miss?(' · '+d.miss+' dòng AI bỏ sót đã đưa vào mục Khác'):'')):'Không áp được vào báo cáo, tải lại thử');} function ask(){if(document.querySelector('.v2aiov'))return;var b=document.getElementById('rptAi');if(b&&b.disabled)return;var L=lines();if(!L.length){if(typeof toast==='function')toast('Tuần này chưa có dòng công việc nào để gộp');return;} var ov=modal('
    ✨ Gộp báo cáo tuần bằng AI
    AI sẽ đọc '+L.length+' dòng công việc trong tuần, gom việc cùng chủ đề và viết gọn lại. Các khối bảng và số liệu giữ nguyên. Bản đang mở được lưu vào Lịch sử trước, có thể quay lại.
    '); ov.querySelector('.aiNo').onclick=function(){ov.remove();};ov.querySelector('.aiGo').onclick=function(){ov.remove();doRun(L);};} if(!window.__v2aiBound){window.__v2aiBound=1;document.addEventListener('click',function(e){var b=e.target.closest&&e.target.closest('#rptAi');if(b){e.preventDefault();ask();}});setInterval(function(){var b=document.getElementById('rptAi');if(!b)return;b.style.display=(isWk()&&dt()!=='vung2')?'':'none';},1500);} var f2=window.v2FixReport;window.v2FixReport=function(doc){if(f2)f2(doc);try{if(!doc.getElementById('v2aiCss')){var cs=doc.createElement('style');cs.id='v2aiCss';cs.textContent='li[data-ai] .stx{display:none!important}';(doc.head||doc.documentElement).appendChild(cs);}doc.querySelectorAll('li .stx[style*="display:none"]').forEach(function(x){x.parentNode.setAttribute('data-ai','1');});var o=doc.getElementById('v2srcPop');if(o)o.remove();if(doc.__v2src)return;doc.__v2src=1; doc.addEventListener('click',function(e){var old=doc.getElementById('v2srcPop');var b=e.target.closest&&e.target.closest('.v2src');if(old){var same=old.__b===b;old.remove();if(same){e.preventDefault();return;}}if(!b)return;e.preventDefault();var a=[];try{a=JSON.parse(b.getAttribute('data-src')||'[]');}catch(_e){} var p=doc.createElement('div');p.id='v2srcPop';p.className='noprint';p.__b=b;p.style.cssText='position:absolute;z-index:9999;width:400px;max-width:90vw;background:#fff;border:1px solid #cbd5e1;border-radius:9px;box-shadow:0 8px 26px rgba(20,40,70,.22);padding:8px 10px;font-size:12px;color:#1e2c3a;line-height:1.5'; p.innerHTML='
    Gộp từ '+a.length+' dòng báo cáo ngày
    '+a.map(function(x){return '
    • '+E(x)+'
    ';}).join('');doc.body.appendChild(p); var r=b.getBoundingClientRect(),w=doc.defaultView,sx=w.pageXOffset||0,sy=w.pageYOffset||0,left=r.right+sx-400;if(left<8)left=8;p.style.left=left+'px';p.style.top=(r.bottom+sy+6)+'px';});}catch(_e){}}; })(); (function(){ var COL={DO:'#ff6b60',VANG:'#e9b44c',XANH:'#5fb08c',CHO:'#8aa0b4'}; var STM={sent:'Chưa xem',seen:'Đã xem',approved:'Đã duyệt',reviewed:'Đã nhận xét',needimprove:'Đã nhận xét',replied:'Đã phản hồi'}; var BS='padding:5px 10px;border-radius:7px;border:1px solid rgba(255,255,255,.18);background:none;color:inherit;cursor:pointer;font-size:12px;white-space:nowrap'; var DAY=null,LAST=null; function E(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];});} function two(n){return (n<10?'0':'')+n;} function ymd(d){return d.getFullYear()+'-'+two(d.getMonth()+1)+'-'+two(d.getDate());} function parse(s){var a=String(s).split('-');return new Date(+a[0],+a[1]-1,+a[2]);} function shift(s,n){var d=parse(s);do{d.setDate(d.getDate()+n);}while(d.getDay()===0);return ymd(d);} function defDay(){var d=new Date();if(d.getDay()===0)d.setDate(d.getDate()-1);return ymd(d);} function vn(s){var d=parse(s);return ['Chủ nhật','Thứ 2','Thứ 3','Thứ 4','Thứ 5','Thứ 6','Thứ 7'][d.getDay()]+', '+two(d.getDate())+'/'+two(d.getMonth()+1)+'/'+d.getFullYear();} function fdate(s){var a=String(s||'').split('-');return a.length===3?(a[2]+'/'+a[1]+'/'+a[0]):String(s||'');} function nm(s){return String(s||'').toLowerCase().replace(/\s+/g,' ').trim();} function tw(m){if(typeof toast==='function')toast(m);} function card(l,v,c){return '
    '+l+'
    '+v+'
    ';} function head(t,c,extra){return '
    '+t+''+(extra||'')+'
    ';} function rowHTML(x,bulkOn){ var lv=x.level,col=COL[lv]||COL.CHO,st=STM[x.status]||'',rs=[]; (x.issues||[]).forEach(function(i){rs.push(i.reason);});(x.rules||[]).forEach(function(r){rs.push(r);}); var line=lv==='XANH'?(x.summary||''):(rs.join(' · ')||x.summary||(lv==='CHO'?'Chờ AI chấm (tối đa 15 phút)':'')); var chk=(lv==='XANH'&&bulkOn&&x.status!=='approved')?'':''; var wr=(lv==='CHO')?'':''; return '
    '+chk +'
    '+E(x.dept)+' · '+E(x.sender)+(st?' · '+st:'')+'
    ' +'
    '+E(line)+'
    ' +wr+'
    '; } function panel(){var p=document.getElementById('panelAi');if(p)return p;var ref=document.getElementById('panelBoard');if(!ref||!ref.parentNode)return null;p=document.createElement('div');p.id='panelAi';p.className=ref.className;p.classList.add('hidden');ref.parentNode.insertBefore(p,ref.nextSibling);return p;} function addNav(){if(document.getElementById('navAi'))return;var ref=document.getElementById('navWkStat'),a1=document.getElementById('navBoard');if(!ref||!a1)return;var a=document.createElement('a');a.id='navAi';a.innerHTML='🤖 Duyệt nhanh AI';a.style.display=a1.style.display;ref.parentNode.insertBefore(a,ref.nextSibling);a.onclick=function(){boardNavTo('ai');};} async function render(p){ if(!DAY)DAY=defDay(); p.innerHTML='
    Đang tải…
    '; var r=null,dr=null; try{r=await apiPost('aiFlags',{day:DAY});dr=await apiPost('boardDepts',{});}catch(e){} if(!r||r.status!==200||!r.data||!r.data.ok){p.innerHTML='
    Không tải được dữ liệu, thử lại sau.
    ';return;} var D=r.data,rows=D.rows||[];LAST=D; var depts=(dr&&dr.status===200&&dr.data&&dr.data.depts)?dr.data.depts:[]; var C={DO:'var(--red)',VANG:'var(--brass)',XANH:'var(--teal)',CHO:'var(--muted)'}; var ST={sent:'Chưa xem',seen:'Đã xem',approved:'Đã duyệt',reviewed:'Đã nhận xét',needimprove:'Đã nhận xét',replied:'Đã phản hồi'}; var by={DO:[],VANG:[],XANH:[],CHO:[]};rows.forEach(function(x){(by[x.level]||by.CHO).push(x);}); var have={};rows.forEach(function(x){have[nm(x.dept)]=1;}); var miss=[],total=0;depts.forEach(function(d){var n=d.dept||d.company||'';if(!n||/test/i.test(n))return;total++;if(!have[nm(n)])miss.push(n);}); var tot=Math.max(total,rows.length); function pc(n){return tot?Math.round(n*100/tot):0;} var BT='padding:6px 14px;border-radius:8px;border:1px solid var(--line);background:none;color:var(--txt);cursor:pointer;font-size:13px;white-space:nowrap;font-family:inherit'; function kp(emo,cls,col,lb,val,n){return '
    '+emo+'
    '+lb+'
    '+val+'
    '+pc(n)+'%
    ';} function sec(emo,col,title,n,extra){return '
    '+emo+' '+title+'• '+n+''+(extra||'')+'
    ';} function row(x){var lv=x.level,col=C[lv]||C.CHO,st=ST[x.status]||'',rs=[]; (x.issues||[]).forEach(function(i){rs.push(i.reason);});(x.rules||[]).forEach(function(q){rs.push(q);}); var line=lv==='XANH'?(x.summary||''):(rs.join(' · ')||x.summary||(lv==='CHO'?'Chờ AI chấm (tối đa 15 phút)':'')); var chk=(lv==='XANH'&&D.bulkOn&&x.status!=='approved')?'':''; var wr=(lv==='CHO')?'':''; return '
    '+chk+'
    '+E(x.dept)+' · '+E(x.sender)+(st?' · '+st:'')+'
    '+E(line)+'
    '+wr+'›
    ';} var h='
    '; h+='
    '+vn(DAY)+'
    '; h+='
    '+kp('📄','i-blue','var(--blue)','Đã nộp',rows.length+'/'+tot,rows.length)+kp('✅','i-teal','var(--teal)','Bình thường',by.XANH.length,by.XANH.length)+kp('⚠️','i-gold','var(--brass)','Cần chú ý',by.VANG.length,by.VANG.length)+kp('⛔','i-red','var(--red)','Bất thường',by.DO.length,by.DO.length)+(by.CHO.length?kp('⏳','i-slate','var(--muted)','Chờ chấm',by.CHO.length,by.CHO.length):'')+'
    '; if(!D.bulkOn)h+='
    ⚡ Đang chạy song song: duyệt như cũ, nút Duyệt tất cả mở từ '+fdate(D.bulkFrom)+'.Thấy AI chấm sai thì bấm ⚑ trên dòng đó.
    '; if(!rows.length)h+='
    Chưa có báo cáo nào trong ngày này.
    '; if(by.DO.length)h+=sec('⛔',C.DO,'Bất thường',by.DO.length)+by.DO.map(row).join(''); if(by.VANG.length)h+=sec('⚠️',C.VANG,'Cần chú ý',by.VANG.length)+by.VANG.map(row).join(''); if(by.CHO.length)h+=sec('⏳',C.CHO,'Chờ chấm',by.CHO.length)+by.CHO.map(row).join(''); if(by.XANH.length){var na=by.XANH.filter(function(x){return x.status!=='approved';}).length; h+=sec('✅',C.XANH,'Bình thường',by.XANH.length,'')+by.XANH.map(row).join('');} if(miss.length)h+=sec('⏳',C.CHO,'Chưa nộp',miss.length)+'
    '+miss.map(function(n){return ''+E(n)+'';}).join('')+'
    '; p.innerHTML=h+'
    '; } function bind(p){if(p.__v2ai)return;p.__v2ai=1; p.addEventListener('click',async function(e){ var t=e.target.closest?e.target.closest('button'):null;if(!t)return; if(t.classList.contains('v2aiNav')){DAY=shift(DAY,+t.getAttribute('data-d'));render(p);return;} if(t.classList.contains('v2aiRef')){render(p);return;} if(t.classList.contains('v2aiOpen')){if(typeof openBoardReport==='function')openBoardReport(t.getAttribute('data-id'));return;} if(t.classList.contains('v2aiWrong')){var note=window.prompt('AI chấm chưa đúng ở đâu? (ví dụ: nên là Đỏ; hoặc không cần báo)');if(note===null)return;var rr=await apiPost('aiFlagWrong',{id:t.getAttribute('data-id'),note:note});tw(rr&&rr.status===200?'Đã ghi nhận, cảm ơn':'Không ghi nhận được');return;} if(t.classList.contains('v2aiBulk')){ if(!LAST||!LAST.bulkOn){tw('🔒 Đang chạy song song, mở từ '+fdate(LAST?LAST.bulkFrom:''));return;} var ids=[];p.querySelectorAll('.v2aiChk').forEach(function(c){if(c.checked)ids.push(c.getAttribute('data-id'));}); if(!ids.length){tw('Chưa chọn báo cáo nào');return;} if(!window.confirm('Duyệt '+ids.length+' báo cáo bình thường?'))return; var rb=await apiPost('aiBulkApprove',{ids:ids}); if(rb&&rb.status===200&&rb.data&&rb.data.ok)tw('✅ Đã duyệt '+rb.data.approved+' báo cáo'+(rb.data.skipped?(' · bỏ qua '+rb.data.skipped):''));else tw('Không duyệt được, thử lại'); render(p); } }); } (function(){var st=document.createElement('style');st.textContent='body.ai-mode #panelWork{display:none!important}';(document.head||document.documentElement).appendChild(st);})(); function leaveAi(){document.body.classList.remove('ai-mode');var p=document.getElementById('panelAi');if(p)p.classList.add('hidden');var n=document.getElementById('navAi');if(n)n.classList.remove('on');} document.addEventListener('click',function(e){var a=e.target.closest&&e.target.closest('.sb-nav a');if(a&&a.id!=='navAi'&&document.body.classList.contains('ai-mode'))leaveAi();},true); if(typeof window.boardNavTo==='function'){var _o2=window.boardNavTo;window.boardNavTo=function(which){var p=panel(); if(which==='ai'){try{boardHideAllPanels();}catch(e){}var w=document.getElementById('panelWk');if(w)w.classList.add('hidden');document.querySelectorAll('.sb-nav a').forEach(function(x){x.classList.remove('on');});document.body.classList.remove('nav-open');if(!p)return;p.classList.remove('hidden');var n=document.getElementById('navAi');if(n)n.classList.add('on');try{setDashTitle('Duyệt nhanh AI','AI chấm cờ báo cáo ngày các phòng');}catch(e){}document.body.classList.add('ai-mode');bind(p);render(p);return;} leaveAi();return _o2.apply(this,arguments);};} addNav();setInterval(addNav,250); })();