Chris – Test
Group WIP / Open Order Dashboard
Senior management view of current open sales orders • September 2026 extract
Revenue by Company
Revenue by Expected Shipping Month
Top Customers by Open Order Value
Top 10 Open Orders
| Order | Company | Customer | ETA | Value |
|---|
Exceptions / Actions
| Order | Company | Status | Customer | Estimated Shipping | Timing | Risk | Value |
|---|
`).join('')||'
';}function esc(s){return String(s??'').replace(/[&"']/g,c=>({'&':'&','':'>','"':'"',"'":'''}[c]))}function render(){const a=getFiltered(),total=sum(a,o=>o.value),thisM=sum(a.filter(o=>o.timing==='This Month'),o=>o.value),nextM=sum(a.filter(o=>o.timing==='Next Month'),o=>o.value),future=sum(a.filter(o=>o.timing==='Future'),o=>o.value),noEta=sum(a.filter(o=>o.timing==='No Valid ETA'),o=>o.value);document.getElementById('kTotal').textContent=GBP.format(total);document.getElementById('kTotalSub').textContent=NUM.format(a.length)+' sales orders';document.getElementById('kOrders').textContent=NUM.format(a.length);document.getElementById('kAvg').textContent='Average '+GBP.format(a.length?total/a.length:0);document.getElementById('kThis').textContent=GBP.format(thisM);document.getElementById('kThisPct').textContent=pct(thisM,total);document.getElementById('kNext').textContent=GBP.format(nextM);document.getElementById('kNextPct').textContent=pct(nextM,total);document.getElementById('kFuture').textContent=GBP.format(future);document.getElementById('kFuturePct').textContent=pct(future,total);document.getElementById('kNoEta').textContent=GBP.format(noEta);document.getElementById('kNoEtaPct').textContent=pct(noEta,total);document.getElementById('entityBars').innerHTML=barHTML(aggregate(a,'entity'));document.getElementById('monthBars').innerHTML=barHTML(aggregate(a,'ship_month'));document.getElementById('customerBars').innerHTML=barHTML(aggregate(a,'customer'));const top=[...a].sort((x,y)=>y.value-x.value).slice(0,10);document.getElementById('topOrders').innerHTML=top.map(o=>`
`).join('');const exc=[...a].filter(o=>o.risk!=='OK').sort((x,y)=>y.value-x.value);document.getElementById('exceptions').innerHTML=exc.map(o=>`
`).join('')||'
';}function resetFilters(){['entity','status','timing'].forEach(id=>document.getElementById(id).value='');document.getElementById('search').value='';render();}['entity','status','timing'].forEach(id=>document.getElementById(id).addEventListener('change',render));document.getElementById('search').addEventListener('input',render);render();


