| Line 178... |
Line 178... |
| 178 |
.img-x:hover{background:rgba(255,255,255,.3)}
|
178 |
.img-x:hover{background:rgba(255,255,255,.3)}
|
| 179 |
.modal-back.show{display:flex}
|
179 |
.modal-back.show{display:flex}
|
| 180 |
.modal{background:#fff;border-radius:14px;max-width:780px;width:100%;padding:20px 22px;box-shadow:0 20px 60px rgba(10,20,50,.3);position:relative}
|
180 |
.modal{background:#fff;border-radius:14px;max-width:780px;width:100%;padding:20px 22px;box-shadow:0 20px 60px rgba(10,20,50,.3);position:relative}
|
| 181 |
.modal h3{margin:0 0 2px;font-size:17px;text-align:center}
|
181 |
.modal h3{margin:0 0 2px;font-size:17px;text-align:center}
|
| 182 |
.modal > .desc{text-align:center}
|
182 |
.modal > .desc{text-align:center}
|
| 183 |
.modal .x,.rh-panel .x{position:absolute;top:14px;right:16px;cursor:pointer;color:var(--soft);font-size:22px;line-height:1;border:0;background:none}
|
183 |
.modal .x,.rh-panel .x,.od-panel .x{position:absolute;top:14px;right:16px;cursor:pointer;color:var(--soft);font-size:22px;line-height:1;border:0;background:none}
|
| 184 |
/* journey totals bar */
|
184 |
/* journey totals bar */
|
| 185 |
.jstats{display:flex;gap:9px;margin:12px 0 2px;flex-wrap:wrap}
|
185 |
.jstats{display:flex;gap:9px;margin:12px 0 2px;flex-wrap:wrap}
|
| 186 |
.js{flex:1;min-width:104px;background:#f8f9fc;border:1px solid var(--line2);border-radius:10px;padding:9px 10px;text-align:center}
|
186 |
.js{flex:1;min-width:104px;background:#f8f9fc;border:1px solid var(--line2);border-radius:10px;padding:9px 10px;text-align:center}
|
| 187 |
.js .jv{font-size:15.5px;font-weight:760;color:var(--ink);font-variant-numeric:tabular-nums}
|
187 |
.js .jv{font-size:15.5px;font-weight:760;color:var(--ink);font-variant-numeric:tabular-nums}
|
| 188 |
.js .jl{font-size:10px;color:var(--soft);text-transform:uppercase;letter-spacing:.04em;margin-top:3px;font-weight:600}
|
188 |
.js .jl{font-size:10px;color:var(--soft);text-transform:uppercase;letter-spacing:.04em;margin-top:3px;font-weight:600}
|
| Line 225... |
Line 225... |
| 225 |
.rhexec{font-size:10px;color:var(--soft);font-weight:600;margin:3px 0 4px}
|
225 |
.rhexec{font-size:10px;color:var(--soft);font-weight:600;margin:3px 0 4px}
|
| 226 |
.rhtext{font-size:12px;color:#4a5468;line-height:1.45;word-break:break-word;white-space:pre-wrap}
|
226 |
.rhtext{font-size:12px;color:#4a5468;line-height:1.45;word-break:break-word;white-space:pre-wrap}
|
| 227 |
.rhloading,.rhempty{color:var(--soft);font-size:12px;text-align:center;padding:24px 8px}
|
227 |
.rhloading,.rhempty{color:var(--soft);font-size:12px;text-align:center;padding:24px 8px}
|
| 228 |
.rh-more{margin-top:10px;background:var(--brand);color:#fff;border:0;border-radius:8px;padding:9px;font-weight:650;font-size:12.5px;cursor:pointer;display:none}
|
228 |
.rh-more{margin-top:10px;background:var(--brand);color:#fff;border:0;border-radius:8px;padding:9px;font-weight:650;font-size:12.5px;cursor:pointer;display:none}
|
| 229 |
.rh-more:disabled{opacity:.6;cursor:default}
|
229 |
.rh-more:disabled{opacity:.6;cursor:default}
|
| - |
|
230 |
/* order-details drawer (stacks above the remark drawer) */
|
| - |
|
231 |
.od-back{position:fixed;inset:0;background:rgba(15,22,40,.42);z-index:1300;display:none}
|
| - |
|
232 |
.od-back.show{display:block}
|
| - |
|
233 |
.od-panel{position:absolute;top:0;right:0;height:100%;width:min(440px,94vw);background:#fff;box-shadow:-8px 0 30px rgba(20,30,60,.18);display:flex;flex-direction:column;padding:18px 18px 14px;transform:translateX(100%);transition:transform .22s ease}
|
| - |
|
234 |
.od-back.show .od-panel{transform:translateX(0)}
|
| - |
|
235 |
.od-panel h3{margin:0 0 2px;font-size:15px;color:var(--ink)}
|
| - |
|
236 |
.od-panel .desc{margin:0;font-size:12px;color:var(--soft)}
|
| - |
|
237 |
.od-body{flex:1;overflow-y:auto;margin-top:12px}
|
| - |
|
238 |
.odsum{display:flex;flex-wrap:wrap;gap:8px 18px;padding:10px 12px;background:#fbfcfe;border:1px solid var(--line2);border-radius:9px;margin-bottom:12px}
|
| - |
|
239 |
.odsum .k{font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--soft);font-weight:700}
|
| - |
|
240 |
.odsum .v{font-size:13px;font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums}
|
| - |
|
241 |
.odtable{width:100%;border-collapse:collapse;font-size:11.5px}
|
| - |
|
242 |
.odtable th{text-align:left;color:var(--soft);font-weight:700;font-size:9px;text-transform:uppercase;letter-spacing:.03em;padding:5px 6px;border-bottom:1px solid var(--line2)}
|
| - |
|
243 |
.odtable td{padding:6px;border-bottom:1px solid #eef1f7;color:#4a5468;vertical-align:top}
|
| - |
|
244 |
.odtable td.num{text-align:right;font-variant-numeric:tabular-nums}
|
| - |
|
245 |
.odloading,.odempty{color:var(--soft);font-size:12px;text-align:center;padding:24px 8px}
|
| 230 |
.tlcard .tm{flex:none;width:62px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#fff;font-weight:750;font-size:13px;padding:6px 4px;line-height:1.05}
|
246 |
.tlcard .tm{flex:none;width:62px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#fff;font-weight:750;font-size:13px;padding:6px 4px;line-height:1.05}
|
| 231 |
.tlcard .tm small{font-weight:600;font-size:8.5px;opacity:.9;text-transform:uppercase;letter-spacing:.04em;margin-top:3px}
|
247 |
.tlcard .tm small{font-weight:600;font-size:8.5px;opacity:.9;text-transform:uppercase;letter-spacing:.04em;margin-top:3px}
|
| 232 |
.tlcard .bd{padding:8px 11px;flex:1;min-width:0}
|
248 |
.tlcard .bd{padding:8px 11px;flex:1;min-width:0}
|
| 233 |
.tlcard .bd .ti{font-size:12.5px;font-weight:700;color:var(--ink);line-height:1.25;word-break:break-word}
|
249 |
.tlcard .bd .ti{font-size:12.5px;font-weight:700;color:var(--ink);line-height:1.25;word-break:break-word}
|
| 234 |
.tlcard .bd .stt{display:inline-block;font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;padding:1px 6px;border-radius:5px;margin-top:5px;color:#fff}
|
250 |
.tlcard .bd .stt{display:inline-block;font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;padding:1px 6px;border-radius:5px;margin-top:5px;color:#fff}
|
| Line 238... |
Line 254... |
| 238 |
.tlrow.left .tlextra{justify-content:flex-end}
|
254 |
.tlrow.left .tlextra{justify-content:flex-end}
|
| 239 |
.tlrow.right .tlextra{justify-content:flex-start}
|
255 |
.tlrow.right .tlextra{justify-content:flex-start}
|
| 240 |
.tlthumb{width:46px;height:46px;border-radius:8px;object-fit:cover;border:1px solid var(--line);cursor:pointer;background:#f1f3f9}
|
256 |
.tlthumb{width:46px;height:46px;border-radius:8px;object-fit:cover;border:1px solid var(--line);cursor:pointer;background:#f1f3f9}
|
| 241 |
.tlph{width:46px;height:46px;border-radius:8px;border:1px dashed #cfd6e6;background:#f4f6fb;display:flex;align-items:center;justify-content:center;color:#b3bcce;font-size:18px}
|
257 |
.tlph{width:46px;height:46px;border-radius:8px;border:1px dashed #cfd6e6;background:#f4f6fb;display:flex;align-items:center;justify-content:center;color:#b3bcce;font-size:18px}
|
| 242 |
.tlchip{font-size:10.5px;font-weight:600;color:var(--muted);background:#f1f3f9;border-radius:6px;padding:2px 7px;white-space:nowrap}
|
258 |
.tlchip{font-size:10.5px;font-weight:600;color:var(--muted);background:#f1f3f9;border-radius:6px;padding:2px 7px;white-space:nowrap}
|
| - |
|
259 |
.tlbadge{font-size:10.5px;font-weight:700;border:0;border-radius:6px;padding:2px 8px;white-space:nowrap;cursor:pointer;line-height:1.5}
|
| - |
|
260 |
.tlbadge.ord{background:#e7f0ff;color:#1c56c9}
|
| - |
|
261 |
.tlbadge.ord:hover{background:#d4e4ff}
|
| - |
|
262 |
.tlbadge.sch{background:#fff4e6;color:#c25709;cursor:default}
|
| 243 |
.exectabs{display:flex;gap:6px;justify-content:center;margin:12px 0 4px}
|
263 |
.exectabs{display:flex;gap:6px;justify-content:center;margin:12px 0 4px}
|
| 244 |
.exectab{padding:6px 14px;border-radius:8px;font-size:12.5px;font-weight:650;color:var(--muted);cursor:pointer;border:1px solid var(--line);background:#fff}
|
264 |
.exectab{padding:6px 14px;border-radius:8px;font-size:12.5px;font-weight:650;color:var(--muted);cursor:pointer;border:1px solid var(--line);background:#fff}
|
| 245 |
.exectab.active{background:var(--brand);color:#fff;border-color:var(--brand)}
|
265 |
.exectab.active{background:var(--brand);color:#fff;border-color:var(--brand)}
|
| 246 |
#bjMap{width:100%;height:460px;border-radius:12px;border:1px solid var(--line);margin-top:10px;background:#eef1f7;overflow:hidden}
|
266 |
#bjMap{width:100%;height:460px;border-radius:12px;border:1px solid var(--line);margin-top:10px;background:#eef1f7;overflow:hidden}
|
| 247 |
.bjlegend{display:flex;gap:16px;align-items:center;flex-wrap:wrap;margin-top:12px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#f8f9fc;font-size:12.5px;min-height:20px}
|
267 |
.bjlegend{display:flex;gap:16px;align-items:center;flex-wrap:wrap;margin-top:12px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#f8f9fc;font-size:12.5px;min-height:20px}
|
| Line 312... |
Line 332... |
| 312 |
<div class="rh-list" id="bj-rh-list"></div>
|
332 |
<div class="rh-list" id="bj-rh-list"></div>
|
| 313 |
<button class="rh-more" id="bj-rh-more" onclick="bjLoadRemarkHistory()">Load more</button>
|
333 |
<button class="rh-more" id="bj-rh-more" onclick="bjLoadRemarkHistory()">Load more</button>
|
| 314 |
</div>
|
334 |
</div>
|
| 315 |
</div>
|
335 |
</div>
|
| 316 |
|
336 |
|
| - |
|
337 |
<!-- order-details drawer — slides in from the right, above the remark drawer -->
|
| - |
|
338 |
<div class="od-back" id="bj-od-back" onclick="if(event.target===this)closeOrderDetail()">
|
| - |
|
339 |
<div class="od-panel" id="bj-od-panel">
|
| - |
|
340 |
<button class="x" onclick="closeOrderDetail()">×</button>
|
| - |
|
341 |
<h3 id="bj-od-title"></h3>
|
| - |
|
342 |
<p class="desc" id="bj-od-sub"></p>
|
| - |
|
343 |
<div class="od-body" id="bj-od-body"></div>
|
| - |
|
344 |
</div>
|
| - |
|
345 |
</div>
|
| - |
|
346 |
|
| 317 |
<script>
|
347 |
<script>
|
| 318 |
var CTX = '${rc.contextPath}';
|
348 |
var CTX = '${rc.contextPath}';
|
| 319 |
var BASE = CTX + '/beat-journey';
|
349 |
var BASE = CTX + '/beat-journey';
|
| 320 |
var LENS = 'today';
|
350 |
var LENS = 'today';
|
| 321 |
var TODAY = '$today';
|
351 |
var TODAY = '$today';
|
| Line 1477... |
Line 1507... |
| 1477 |
function tlSecs(t){ if(!t) return 1e9; var p=t.split(':'); return (+p[0])*3600+(+(p[1]||0))*60+(+(p[2]||0)); }
|
1507 |
function tlSecs(t){ if(!t) return 1e9; var p=t.split(':'); return (+p[0])*3600+(+(p[1]||0))*60+(+(p[2]||0)); }
|
| 1478 |
function toSec(t){ if(!t||t==='00:00:00') return 0; var p=t.split(':'); return (+p[0])*3600+(+(p[1]||0))*60+(+(p[2]||0)); }
|
1508 |
function toSec(t){ if(!t||t==='00:00:00') return 0; var p=t.split(':'); return (+p[0])*3600+(+(p[1]||0))*60+(+(p[2]||0)); }
|
| 1479 |
function fmtSec(s){ s=Math.max(0,Math.round(s)); var h=Math.floor(s/3600), m=Math.floor((s%3600)/60), ss=s%60; function z(n){return (n<10?'0':'')+n;} return z(h)+':'+z(m)+':'+z(ss); }
|
1509 |
function fmtSec(s){ s=Math.max(0,Math.round(s)); var h=Math.floor(s/3600), m=Math.floor((s%3600)/60), ss=s%60; function z(n){return (n<10?'0':'')+n;} return z(h)+':'+z(m)+':'+z(ss); }
|
| 1480 |
function jstat(v,l){ return '<div class="js"><div class="jv">'+v+'</div><div class="jl">'+l+'</div></div>'; }
|
1510 |
function jstat(v,l){ return '<div class="js"><div class="jv">'+v+'</div><div class="jl">'+l+'</div></div>'; }
|
| 1481 |
function hhmm(t){ return t? t.slice(0,5):''; }
|
1511 |
function hhmm(t){ return t? t.slice(0,5):''; }
|
| - |
|
1512 |
// Best-effort: pull a "when will they order" hint out of a free-text remark.
|
| - |
|
1513 |
// English + Hinglish. Display-only; returns '' when nothing recognizable is found.
|
| - |
|
1514 |
function bjScheduledFromRemark(remark){
|
| - |
|
1515 |
if(!remark) return '';
|
| - |
|
1516 |
var t = String(remark).toLowerCase();
|
| - |
|
1517 |
// day-after (before tomorrow/kal, since "parso" is distinct)
|
| - |
|
1518 |
if(/\b(day[\s-]?after(\s+tomorrow)?|parso)\b/.test(t)) return 'day after';
|
| - |
|
1519 |
if(/\b(tomorrow|kal|tmrw|tmr)\b/.test(t)) return 'tomorrow';
|
| - |
|
1520 |
if(/\b(today|aaj|abhi)\b/.test(t)) return 'today';
|
| - |
|
1521 |
// range "N-M days" / "N-M din" (check before single N)
|
| - |
|
1522 |
var range = t.match(/\b(\d{1,2})\s*[-–to]+\s*(\d{1,2})\s*(days?|din)\b/);
|
| - |
|
1523 |
if(range) return 'in '+range[1]+'–'+range[2]+' days';
|
| - |
|
1524 |
var nd = t.match(/\b(?:in\s+)?(\d{1,2})\s*(days?|din)\b/);
|
| - |
|
1525 |
if(nd) return 'in '+nd[1]+' day'+(nd[1]==='1'?'':'s');
|
| - |
|
1526 |
if(/\b(this\s*week|is\s*week|is\s*haft[ae])\b/.test(t)) return 'this week';
|
| - |
|
1527 |
if(/\b(next\s*week|agle\s*haft[ae]|agla\s*week)\b/.test(t)) return 'next week';
|
| - |
|
1528 |
// explicit "DD Mon" / "DD Month"
|
| - |
|
1529 |
var mon = t.match(/\b(\d{1,2})\s+(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\b/);
|
| - |
|
1530 |
if(mon){
|
| - |
|
1531 |
var M={jan:'Jan',feb:'Feb',mar:'Mar',apr:'Apr',may:'May',jun:'Jun',jul:'Jul',aug:'Aug',sep:'Sep',oct:'Oct',nov:'Nov',dec:'Dec'};
|
| - |
|
1532 |
return parseInt(mon[1],10)+' '+M[mon[2]];
|
| - |
|
1533 |
}
|
| - |
|
1534 |
// "DD/MM" or "DD-MM" (reject year-like / out-of-range month)
|
| - |
|
1535 |
var dm = t.match(/\b(\d{1,2})[\/\-](\d{1,2})\b(?!\d)/);
|
| - |
|
1536 |
if(dm && parseInt(dm[2],10)>=1 && parseInt(dm[2],10)<=12){
|
| - |
|
1537 |
var mo=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
|
| - |
|
1538 |
return parseInt(dm[1],10)+' '+mo[parseInt(dm[2],10)-1];
|
| - |
|
1539 |
}
|
| - |
|
1540 |
// weekday names (English + common Hinglish)
|
| - |
|
1541 |
var wk = t.match(/\b(monday|tuesday|wednesday|thursday|friday|saturday|sunday|somwar|mangalwar|budhwar|guruwar|shukrawar|shaniwar|raviwar|itwar)\b/);
|
| - |
|
1542 |
if(wk){
|
| - |
|
1543 |
var W={monday:'Mon',somwar:'Mon',tuesday:'Tue',mangalwar:'Tue',wednesday:'Wed',budhwar:'Wed',
|
| - |
|
1544 |
thursday:'Thu',guruwar:'Thu',friday:'Fri',shukrawar:'Fri',saturday:'Sat',shaniwar:'Sat',
|
| - |
|
1545 |
sunday:'Sun',raviwar:'Sun',itwar:'Sun'};
|
| - |
|
1546 |
return W[wk[1]];
|
| - |
|
1547 |
}
|
| - |
|
1548 |
return '';
|
| - |
|
1549 |
}
|
| 1482 |
function tlThumb(att){
|
1550 |
function tlThumb(att){
|
| 1483 |
if(att && window._mediaUrl) return '<img class="tlthumb" src="'+esc(window._mediaUrl+att)+'" onclick="bjOpenImage(this.src)" onerror="tlImgErr(this)">';
|
1551 |
if(att && window._mediaUrl) return '<img class="tlthumb" src="'+esc(window._mediaUrl+att)+'" onclick="bjOpenImage(this.src)" onerror="tlImgErr(this)">';
|
| 1484 |
return '<div class="tlph" title="No photo">📷</div>';
|
1552 |
return '<div class="tlph" title="No photo">📷</div>';
|
| 1485 |
}
|
1553 |
}
|
| 1486 |
function tlImgErr(im){ var d=document.createElement('div'); d.className='tlph'; d.title='Photo unavailable'; d.innerHTML='📷'; if(im.parentNode) im.parentNode.replaceChild(d, im); }
|
1554 |
function tlImgErr(im){ var d=document.createElement('div'); d.className='tlph'; d.title='Photo unavailable'; d.innerHTML='📷'; if(im.parentNode) im.parentNode.replaceChild(d, im); }
|
| Line 1523... |
Line 1591... |
| 1523 |
var extra='';
|
1591 |
var extra='';
|
| 1524 |
if(!x._punch){
|
1592 |
if(!x._punch){
|
| 1525 |
var chips='';
|
1593 |
var chips='';
|
| 1526 |
if(x.battery!=null) chips += '<span class="tlchip">🔋 '+x.battery+'%</span>';
|
1594 |
if(x.battery!=null) chips += '<span class="tlchip">🔋 '+x.battery+'%</span>';
|
| 1527 |
if(x.locOff!=null) chips += '<span class="tlchip">📴 '+x.locOff+'</span>';
|
1595 |
if(x.locOff!=null) chips += '<span class="tlchip">📴 '+x.locOff+'</span>';
|
| - |
|
1596 |
// billing-agenda partner stop: order badge(s) win; else a parsed "scheduled" chip
|
| - |
|
1597 |
if(x.billingAgenda){
|
| - |
|
1598 |
if(x.orders && x.orders.length){
|
| - |
|
1599 |
x.orders.slice(0,2).forEach(function(o){
|
| - |
|
1600 |
var label = o.invoice ? ('#'+o.invoice) : ('#'+o.orderId);
|
| - |
|
1601 |
chips += '<button type="button" class="tlbadge ord" title="View order details"'
|
| - |
|
1602 |
+ ' onclick="bjOpenOrderDetail('+o.orderId+','+x.taskId+')">🧾 '+esc(label)+'</button>';
|
| - |
|
1603 |
});
|
| - |
|
1604 |
if(x.orders.length>2) chips += '<span class="tlchip">+'+(x.orders.length-2)+'</span>';
|
| - |
|
1605 |
} else {
|
| - |
|
1606 |
var sch = bjScheduledFromRemark(x.remarks);
|
| - |
|
1607 |
if(sch) chips += '<span class="tlbadge sch" title="Scheduled (from remark)">📅 '+esc(sch)+'</span>';
|
| - |
|
1608 |
}
|
| - |
|
1609 |
}
|
| 1528 |
extra = '<div class="tlextra">'+tlThumb(x.attachment)+chips+'</div>';
|
1610 |
extra = '<div class="tlextra">'+tlThumb(x.attachment)+chips+'</div>';
|
| 1529 |
}
|
1611 |
}
|
| 1530 |
var card='<div class="tlcard">'+
|
1612 |
var card='<div class="tlcard">'+
|
| 1531 |
'<div class="tm" style="background:'+s.c+'">'+timeTop+'<small>'+tlabel+'</small></div>'+
|
1613 |
'<div class="tm" style="background:'+s.c+'">'+timeTop+'<small>'+tlabel+'</small></div>'+
|
| 1532 |
'<div class="bd"><div class="ti">'+esc(tlTitle(x))+'</div>'+
|
1614 |
'<div class="bd"><div class="ti">'+esc(tlTitle(x))+'</div>'+
|
| Line 1614... |
Line 1696... |
| 1614 |
var more=el('bj-rh-more');
|
1696 |
var more=el('bj-rh-more');
|
| 1615 |
more.disabled=false; more.textContent='Load more';
|
1697 |
more.disabled=false; more.textContent='Load more';
|
| 1616 |
more.style.display = hasMore ? 'block' : 'none';
|
1698 |
more.style.display = hasMore ? 'block' : 'none';
|
| 1617 |
}
|
1699 |
}
|
| 1618 |
|
1700 |
|
| - |
|
1701 |
/* ===================== ORDER DETAILS DRAWER ===================== */
|
| - |
|
1702 |
// Header + line items for one retail order a partner placed on the visit day.
|
| - |
|
1703 |
function bjOpenOrderDetail(orderId, fofoId){
|
| - |
|
1704 |
if(!orderId || !fofoId) return;
|
| - |
|
1705 |
window._od = { orderId:orderId, fofoId:fofoId };
|
| - |
|
1706 |
el('bj-od-title').innerHTML='🧾 Order #'+esc(orderId);
|
| - |
|
1707 |
el('bj-od-sub').textContent='Retail order placed on the visit day';
|
| - |
|
1708 |
el('bj-od-body').innerHTML='<div class="odloading"><div class="spinner"></div>Loading…</div>';
|
| - |
|
1709 |
el('bj-od-back').classList.add('show');
|
| - |
|
1710 |
fetch(CTX+'/beat-journey/order-detail?orderId='+encodeURIComponent(orderId)+'&fofoId='+encodeURIComponent(fofoId),
|
| - |
|
1711 |
{headers:{'Accept':'application/json'}})
|
| - |
|
1712 |
.then(function(r){ return r.json(); })
|
| - |
|
1713 |
.then(function(d){
|
| - |
|
1714 |
var st=window._od; if(!st || st.orderId!==orderId) return; // drawer changed mid-flight
|
| - |
|
1715 |
bjRenderOrderDetail(d);
|
| - |
|
1716 |
})
|
| - |
|
1717 |
.catch(function(){ el('bj-od-body').innerHTML='<div class="odempty">Could not load order details.</div>'; });
|
| - |
|
1718 |
}
|
| - |
|
1719 |
function closeOrderDetail(){ el('bj-od-back').classList.remove('show'); window._od=null; }
|
| - |
|
1720 |
function bjRenderOrderDetail(d){
|
| - |
|
1721 |
var hd=d.header;
|
| - |
|
1722 |
if(!hd){ el('bj-od-body').innerHTML='<div class="odempty">Order not found.</div>'; return; }
|
| - |
|
1723 |
var money=function(n){ return '₹'+(Math.round(Number(n)||0)).toLocaleString(); };
|
| - |
|
1724 |
var h='<div class="odsum">'
|
| - |
|
1725 |
+'<div><div class="k">Invoice</div><div class="v">'+esc(hd.invoice||('#'+hd.orderId))+'</div></div>'
|
| - |
|
1726 |
+'<div><div class="k">Amount</div><div class="v">'+money(hd.amount)+'</div></div>'
|
| - |
|
1727 |
+'<div><div class="k">Date</div><div class="v">'+esc((hd.date||'')+(hd.time?' '+hhmm(hd.time):''))+'</div></div>'
|
| - |
|
1728 |
+'</div>';
|
| - |
|
1729 |
var items=d.items||[];
|
| - |
|
1730 |
if(!items.length){ h+='<div class="odempty">No line items on this order.</div>'; el('bj-od-body').innerHTML=h; return; }
|
| - |
|
1731 |
h+='<table class="odtable"><thead><tr><th>Item</th><th class="num">Qty</th><th class="num">MOP</th></tr></thead><tbody>';
|
| - |
|
1732 |
items.forEach(function(it){
|
| - |
|
1733 |
var name=[it.brand,it.model,it.color].filter(function(s){return s;}).map(esc).join(' · ');
|
| - |
|
1734 |
h+='<tr><td>'+(name||'—')+'</td><td class="num">'+(it.qty||0)+'</td><td class="num">'+money(it.mop)+'</td></tr>';
|
| - |
|
1735 |
});
|
| - |
|
1736 |
h+='</tbody></table>';
|
| - |
|
1737 |
el('bj-od-body').innerHTML=h;
|
| - |
|
1738 |
}
|
| - |
|
1739 |
|
| 1619 |
/* ============================ APPROVAL ============================ */
|
1740 |
/* ============================ APPROVAL ============================ */
|
| 1620 |
function loadApproval(){
|
1741 |
function loadApproval(){
|
| 1621 |
spinner();
|
1742 |
spinner();
|
| 1622 |
var from=el('bj-start').value, to=el('bj-end').value;
|
1743 |
var from=el('bj-start').value, to=el('bj-end').value;
|
| 1623 |
var u=CTX+'/beat-report/approval/data?fromDate='+encodeURIComponent(from)+'&toDate='+encodeURIComponent(to)+qs();
|
1744 |
var u=CTX+'/beat-report/approval/data?fromDate='+encodeURIComponent(from)+'&toDate='+encodeURIComponent(to)+qs();
|