{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/ims-reports.js?bust=20260618"],
  "sourcesContent": ["(function(){\r\n  'use strict';\r\n  const db=()=>window.SM.DB, ui=()=>window.SM.UI, util=()=>window.SM.UTIL;\r\n\r\n  // \u2500\u2500\u2500 REPORT CATALOGUE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  const REPORTS=[\r\n    {id:'stock_valuation',      cat:'inventory', label:'Stock valuation',          icon:'ti-coins',          desc:'Current stock \u00D7 cost price. Total capital tied up in stock.'},\r\n    {id:'stock_movements',      cat:'inventory', label:'Stock movement history',   icon:'ti-arrows-up-down', desc:'Every stock in/out per product with dates and references.'},\r\n    {id:'slow_movers',          cat:'inventory', label:'Slow movers / dead stock', icon:'ti-zzz',            desc:'Products with no sales in a chosen period, with their stock today.'},\r\n    {id:'clearance_planner',    cat:'inventory', label:'Clearance planner',        icon:'ti-discount-2',     desc:'What to clear and at what discount: free stock, value, sales, weeks of cover, suggested prices.'},\r\n    {id:'low_stock',            cat:'inventory', label:'Low stock / reorder alert',icon:'ti-alert-circle',   desc:'All products below safety threshold with suggested reorder.'},\r\n    {id:'stock_reconciliation', cat:'inventory', label:'Stock reconciliation',     icon:'ti-checks',         desc:'Opening + received \u2212 sold = closing stock per period.'},\r\n    {id:'container_discrepancy',cat:'inventory', label:'Container discrepancy',    icon:'ti-file-diff',      desc:'GRN expected vs received variances per container.'},\r\n    {id:'sales_summary',        cat:'sales',     label:'Sales summary',            icon:'ti-chart-line',     desc:'Total revenue by day, week, month or year.'},\r\n    {id:'sales_by_platform',    cat:'sales',     label:'Sales by platform',        icon:'ti-apps',           desc:'Revenue breakdown across all sales channels.'},\r\n    {id:'sales_by_product',     cat:'sales',     label:'Sales by product',         icon:'ti-box',            desc:'Best and worst selling products by units and revenue.'},\r\n    {id:'sales_by_customer',    cat:'sales',     label:'Sales by customer',        icon:'ti-users',          desc:'Revenue per wholesale customer.'},\r\n    {id:'sales_by_dropship_customer', cat:'dropship', label:'Sales by dropship customer', icon:'ti-truck-delivery', desc:'Revenue and order volume per dropship customer.'},\r\n    {id:'order_fulfilment',     cat:'sales',     label:'Order fulfilment rate',    icon:'ti-circle-check',   desc:'% delivered on time vs delayed vs failed.'},\r\n    {id:'delayed_orders',       cat:'sales',     label:'Delayed orders',           icon:'ti-clock-x',        desc:'All 5+ day delayed orders with courier and follow-up status.'},\r\n    {id:'returns',              cat:'sales',     label:'Returns & refunds',        icon:'ti-arrow-back-up',  desc:'All returned orders with reason, value and resolution.'},\r\n    {id:'platform_comparison',  cat:'sales',     label:'Platform comparison',      icon:'ti-chart-bar',      desc:'Side-by-side revenue comparison across all platforms.'},\r\n    {id:'price_overrides',      cat:'sales',     label:'Price overrides',          icon:'ti-alert-triangle', desc:'Order lines sold at a price different from the standard catalogue price, with reason.'},\r\n    {id:'po_history',           cat:'purchasing',label:'Purchase order history',   icon:'ti-file-invoice',   desc:'All POs with status, supplier, value and delivery performance.'},\r\n    {id:'supplier_performance', cat:'purchasing',label:'Supplier performance',     icon:'ti-building-store', desc:'On-time rate, accuracy, average lead time per supplier.'},\r\n    {id:'container_intelligence',cat:'purchasing',label:'Container intelligence',  icon:'ti-ship',           desc:'Per container: products, qty imported/sold/remaining, margin.'},\r\n    {id:'landed_cost',          cat:'purchasing',label:'Landed cost analysis',     icon:'ti-calculator',     desc:'True cost per unit including freight, duty and other charges.'},\r\n    {id:'purchase_vs_sales',    cat:'purchasing',label:'Purchase vs sales',        icon:'ti-arrows-exchange',desc:'Monthly buying spend vs selling revenue.'},\r\n    {id:'pl_report',            cat:'financial', label:'Profit & Loss',            icon:'ti-report-money',   desc:'Revenue minus COGS minus expenses = net profit. Monthly and annual.'},\r\n    {id:'vat_report',           cat:'financial', label:'VAT return',               icon:'ti-receipt-tax',    desc:'Output minus input VAT = liability. MTD-ready.'},\r\n    {id:'cash_flow',            cat:'financial', label:'Cash flow summary',        icon:'ti-cash',           desc:'Money in vs money out by period.'},\r\n    {id:'payables_ageing',      cat:'financial', label:'Payables ageing',          icon:'ti-clock-dollar',   desc:'What you owe suppliers grouped by age bands.'},\r\n    {id:'receivables_ageing',   cat:'financial', label:'Receivables ageing',       icon:'ti-clock-dollar',   desc:'What customers owe you grouped by age bands.'},\r\n    {id:'customer_statement',   cat:'financial', label:'Customer statement',       icon:'ti-user',           desc:'Full transaction history per wholesale customer.'},\r\n    {id:'supplier_statement',   cat:'financial', label:'Supplier statement',       icon:'ti-building-store', desc:'Full transaction history per supplier.'},\r\n    {id:'expense_breakdown',    cat:'financial', label:'Expense breakdown',        icon:'ti-receipt',        desc:'All expenses by category and period.'},\r\n    {id:'gross_margin_product', cat:'financial', label:'Gross margin by product',  icon:'ti-percentage',     desc:'Sale price minus landed cost per SKU.'},\r\n    {id:'gross_margin_channel', cat:'financial', label:'Gross margin by channel',  icon:'ti-chart-pie',      desc:'Which platform is most profitable.'},\r\n    {id:'claims_log',           cat:'financial', label:'Courier claims log',       icon:'ti-file-alert',     desc:'Every courier claim, open and closed, with outcome, settled amounts and dates.'},\r\n    {id:'courier_performance',  cat:'logistics', label:'Courier performance',      icon:'ti-truck',          desc:'Delivery success rate per courier (couriers only).'},\r\n    {id:'own_truck_performance',cat:'logistics', label:'Own truck performance',    icon:'ti-car',            desc:'Own fleet delivery rate and driver performance.'},\r\n    {id:'manifest_history',     cat:'logistics', label:'Manifest history',         icon:'ti-clipboard-list', desc:'All manifests with driver, vehicle, stops and outcomes.'},\r\n    {id:'courier_cost',         cat:'logistics', label:'Courier cost analysis',    icon:'ti-currency-pound', desc:'Total spend, average cost per parcel, volumetric vs actual.'},\r\n  ];\r\n\r\n  const CATS={\r\n    inventory:'Inventory',sales:'Sales & Orders',\r\n    purchasing:'Purchasing & Imports',financial:'Financial',logistics:'Logistics',\r\n    dropship:'Dropship'\r\n  };\r\n\r\n  async function load(){\r\n    const content=document.getElementById('ims-reports-content');\r\n    if(!content)return;\r\n    content.innerHTML=`\r\n      <div class=\"ims__filters\" style=\"margin-bottom:16px\">\r\n        <div class=\"ims__search-wrap\" style=\"max-width:320px\"><i class=\"ti ti-search\"></i><input class=\"ims__input\" type=\"text\" id=\"ims-rep-search\" placeholder=\"Search reports...\" oninput=\"window.IMS_REPORTS.filterReports()\"></div>\r\n        <select class=\"ims__select\" id=\"ims-rep-cat\" onchange=\"window.IMS_REPORTS.filterReports()\">\r\n          <option value=\"\">All categories</option>\r\n          ${Object.entries(CATS).map(([k,v])=>`<option value=\"${k}\">${v}</option>`).join('')}\r\n        </select>\r\n      </div>\r\n      <div id=\"ims-rep-grid\">${renderGrid(REPORTS)}</div>`;\r\n  }\r\n\r\n  function renderGrid(reports){\r\n    const byCat={};\r\n    reports.forEach(r=>{\r\n      if(!byCat[r.cat])byCat[r.cat]=[];\r\n      byCat[r.cat].push(r);\r\n    });\r\n    return Object.entries(byCat).map(([cat,reps])=>`\r\n      <div style=\"margin-bottom:20px\">\r\n        <h3 style=\"font-size:13px;font-weight:700;color:var(--ims-text-muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:10px\">${CATS[cat]||cat}</h3>\r\n        <div style=\"display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px\">\r\n          ${reps.map(r=>`\r\n            <div class=\"ims__card\" style=\"cursor:pointer;transition:box-shadow .15s\" onmouseenter=\"this.style.boxShadow='var(--ims-shadow-md)'\" onmouseleave=\"this.style.boxShadow=''\" onclick=\"window.IMS_REPORTS.runReport('${r.id}')\">\r\n              <div style=\"display:flex;align-items:flex-start;gap:10px\">\r\n                <div style=\"width:36px;height:36px;border-radius:8px;background:var(--ims-accent-bg);display:flex;align-items:center;justify-content:center;flex-shrink:0\">\r\n                  <i class=\"ti ${r.icon}\" style=\"font-size:18px;color:var(--ims-accent)\"></i>\r\n                </div>\r\n                <div>\r\n                  <div style=\"font-size:13px;font-weight:600;color:var(--ims-text);margin-bottom:3px\">${r.label}</div>\r\n                  <div style=\"font-size:12px;color:var(--ims-text-muted);line-height:1.4\">${r.desc}</div>\r\n                </div>\r\n              </div>\r\n            </div>`).join('')}\r\n        </div>\r\n      </div>`).join('');\r\n  }\r\n\r\n  function filterReports(){\r\n    const search=document.getElementById('ims-rep-search')?.value?.toLowerCase()||'';\r\n    const cat=document.getElementById('ims-rep-cat')?.value||'';\r\n    const filtered=REPORTS.filter(r=>\r\n      (!cat||r.cat===cat)&&\r\n      (!search||r.label.toLowerCase().includes(search)||r.desc.toLowerCase().includes(search))\r\n    );\r\n    const grid=document.getElementById('ims-rep-grid');\r\n    if(grid)grid.innerHTML=filtered.length?renderGrid(filtered):`<div class=\"ims__empty\"><i class=\"ti ti-search\"></i><p>No reports match your search</p></div>`;\r\n  }\r\n\r\n  // \u2500\u2500\u2500 DATE RANGE PICKER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  function getDateRange(){\r\n    const from=document.getElementById('ims-rep-from')?.value;\r\n    const to=document.getElementById('ims-rep-to')?.value;\r\n    return{from:from||null,to:to||null};\r\n  }\r\n\r\n  // The range chosen with Apply is kept (also when switching to another\r\n  // report). It used to be reset to the default as the report redrew,\r\n  // before being read, so every report ran on its default range.\r\n  let _range=null;\r\n  function dateRangeHtml(defaultDays=30){\r\n    const to=_range?.to||new Date().toISOString().split('T')[0];\r\n    const from=_range?.from||new Date(Date.now()-defaultDays*86400000).toISOString().split('T')[0];\r\n    return`<div class=\"ims-rep-range no-print\" style=\"display:flex;gap:8px;align-items:center;margin-bottom:14px\">\r\n      <label style=\"font-size:12px;color:var(--ims-text-sec);white-space:nowrap\">Date range:</label>\r\n      <input class=\"ims__input\" type=\"date\" id=\"ims-rep-from\" value=\"${from}\" style=\"width:140px\">\r\n      <span style=\"font-size:12px;color:var(--ims-text-muted)\">to</span>\r\n      <input class=\"ims__input\" type=\"date\" id=\"ims-rep-to\" value=\"${to}\" style=\"width:140px\">\r\n      <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_REPORTS.refreshCurrentReport()\"><i class=\"ti ti-refresh\"></i> Apply</button>\r\n    </div>`;\r\n  }\r\n\r\n  let _currentReportId=null;\r\n  function refreshCurrentReport(){\r\n    const from=document.getElementById('ims-rep-from')?.value, to=document.getElementById('ims-rep-to')?.value;\r\n    if(from||to) _range={from:from||null,to:to||null};\r\n    if(_currentReportId)runReport(_currentReportId);\r\n  }\r\n\r\n  // \u2500\u2500\u2500 RUN REPORT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  async function runReport(id){\r\n    _currentReportId=id;\r\n    const rep=REPORTS.find(r=>r.id===id);\r\n    if(!rep)return;\r\n    ui().openModal(`Report: ${rep.label}`,`<div class=\"ims__loading\"><i class=\"ti ti-loader-2 ims__spin\"></i></div>`,\r\n      `<button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Close</button>\r\n       <button class=\"ims__btn ims__btn--secondary\" id=\"ims-rep-print-btn\" style=\"display:none\" onclick=\"window.IMS_REPORTS.printCurrentReport()\"><i class=\"ti ti-printer\"></i> Print</button>\r\n       <button class=\"ims__btn ims__btn--secondary\" id=\"ims-rep-csv-btn\" style=\"display:none\" onclick=\"window.IMS_REPORTS.exportCurrentCSV()\"><i class=\"ti ti-download\"></i> Export CSV</button>`,'xl');\r\n    await generateReport(id);\r\n  }\r\n\r\n  let _reportData=[];\r\n  let _reportHeaders=[];\r\n  let _reportTitle='';\r\n\r\n  // Each run draws into its own fresh area. If the report is run again\r\n  // (Apply, a tickbox) before the last run finished, the earlier run's\r\n  // output lands in its own detached area and never shows. (Before, both\r\n  // runs added their tables to the same screen, so it showed, and printed,\r\n  // twice.)\r\n  let _runSeq=0;\r\n  async function generateReport(id){\r\n    const host=document.getElementById('ims-modal-body');\r\n    if(!host)return;\r\n    const my=++_runSeq;\r\n    const body=document.createElement('div'); body.className='ims-rep-run';\r\n    host.innerHTML=''; host.appendChild(body);\r\n    const rep=REPORTS.find(r=>r.id===id);\r\n    _reportTitle=rep?.label||id;\r\n\r\n    try{\r\n      switch(id){\r\n        case 'stock_valuation':      await rptStockValuation(body);     break;\r\n        case 'stock_movements':      await rptStockMovements(body);     break;\r\n        case 'slow_movers':          await rptSlowMovers(body);         break;\r\n        case 'low_stock':            await rptLowStock(body);           break;\r\n        case 'clearance_planner':    await rptClearance(body);          break;\r\n        case 'stock_reconciliation': await rptStockRecon(body);         break;\r\n        case 'container_discrepancy':await rptContainerDiscrepancy(body);break;\r\n        case 'sales_summary':        await rptSalesSummary(body);       break;\r\n        case 'sales_by_platform':    await rptSalesByPlatform(body);    break;\r\n        case 'sales_by_product':     await rptSalesByProduct(body);     break;\r\n        case 'sales_by_customer':    await rptSalesByCustomer(body);    break;\r\n        case 'sales_by_dropship_customer': await rptSalesByDropshipCustomer(body); break;\r\n        case 'order_fulfilment':     await rptOrderFulfilment(body);    break;\r\n        case 'delayed_orders':       await rptDelayedOrders(body);      break;\r\n        case 'returns':              await rptReturns(body);            break;\r\n        case 'platform_comparison':  await rptPlatformComparison(body); break;\r\n        case 'po_history':           await rptPOHistory(body);          break;\r\n        case 'supplier_performance': await rptSupplierPerf(body);       break;\r\n        case 'container_intelligence':await rptContainerIntel(body);    break;\r\n        case 'landed_cost':          await rptLandedCost(body);         break;\r\n        case 'purchase_vs_sales':    await rptPurchaseVsSales(body);    break;\r\n        case 'pl_report':            await rptPL(body);                 break;\r\n        case 'vat_report':           await rptVAT(body);                break;\r\n        case 'cash_flow':            await rptCashFlow(body);           break;\r\n        case 'payables_ageing':      await rptPayablesAgeing(body);     break;\r\n        case 'receivables_ageing':   await rptReceivablesAgeing(body);  break;\r\n        case 'customer_statement':   await rptCustomerStatement(body);  break;\r\n        case 'supplier_statement':   await rptSupplierStatement(body);  break;\r\n        case 'expense_breakdown':    await rptExpenseBreakdown(body);   break;\r\n        case 'gross_margin_product': await rptGrossMarginProduct(body); break;\r\n        case 'gross_margin_channel': await rptGrossMarginChannel(body); break;\r\n        case 'claims_log':           await rptClaimsLog(body);          break;\r\n        case 'price_overrides':      await rptPriceOverrides(body);    break;\r\n        case 'courier_performance':  await rptCourierPerf(body);        break;\r\n        case 'own_truck_performance':await rptOwnTruckPerf(body);       break;\r\n        case 'manifest_history':     await rptManifestHistory(body);    break;\r\n        case 'courier_cost':         await rptCourierCost(body);        break;\r\n        default: body.innerHTML=`<div class=\"ims__coming-soon\"><i class=\"ti ti-chart-bar\"></i><h3>${_reportTitle}</h3><p>This report is available in the next update.</p></div>`;\r\n      }\r\n      if(my!==_runSeq) return;   // a newer run has taken over\r\n      document.getElementById('ims-rep-print-btn').style.display='inline-flex';\r\n      document.getElementById('ims-rep-csv-btn').style.display='inline-flex';\r\n    }catch(e){\r\n      body.innerHTML=`<div class=\"ims__alert ims__alert--danger\"><i class=\"ti ti-alert-circle\"></i><span>Failed to generate report: ${e.message}</span></div>`;\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500\u2500 READING EVERY ROW \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // The database returns at most 1,000 rows per request, so reports read in\r\n  // pages until everything is in (before, anything past 1,000 rows was\r\n  // silently left out). Same options as DB.select; a request for a single\r\n  // row or a set limit goes to DB.select unchanged.\r\n  const _rawClient=()=>window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\r\n  async function _sel(table,opts={}){\r\n    if(opts.limit||opts.single||opts.maybeSingle) return db().select(table,opts);\r\n    const client=_rawClient(), page=1000, out=[];\r\n    for(let start=0;start<500000;start+=page){\r\n      let q=client.from(table).select(opts.select||'*');\r\n      if(!opts.noCompanyFilter&&window.SM.AUTH.company?.id) q=q.eq('company_id',window.SM.AUTH.company.id);\r\n      Object.entries(opts.eq||{}).forEach(([k,v])=>{q=q.eq(k,v);});\r\n      Object.entries(opts.neq||{}).forEach(([k,v])=>{q=q.neq(k,v);});\r\n      Object.entries(opts.in||{}).forEach(([k,v])=>{q=q.in(k,v);});\r\n      Object.entries(opts.ilike||{}).forEach(([k,v])=>{q=q.ilike(k,`%${v}%`);});\r\n      Object.entries(opts.gte||{}).forEach(([k,v])=>{q=q.gte(k,v);});\r\n      Object.entries(opts.lte||{}).forEach(([k,v])=>{q=q.lte(k,v);});\r\n      Object.entries(opts.is||{}).forEach(([k,v])=>{q=q.is(k,v);});\r\n      const orders=opts.order?(Array.isArray(opts.order)?opts.order:[opts.order]):[];\r\n      orders.forEach(o=>{q=q.order(o.col,{ascending:o.asc!==false});});\r\n      if(!orders.length&&!opts._noIdOrder) q=q.order('id',{ascending:true});   // a fixed order, so pages never overlap or skip\r\n      const {data,error}=await q.range(start,start+page-1);\r\n      // A table without an \"id\" column: read again without that sort order.\r\n      if(error&&!orders.length&&!opts._noIdOrder&&start===0&&/\\bid\\b/.test(error.message||'')) return _sel(table,{...opts,_noIdOrder:true});\r\n      if(error) return {data:out.length?out:null,error};\r\n      out.push(...(data||[]));\r\n      if(!data||data.length<page) break;\r\n    }\r\n    return {data:out,error:null};\r\n  }\r\n  // Rows whose column is one of many ids: asked in batches of 150 (a short,\r\n  // safe request each), every batch read in full.\r\n  async function _inChunks(table,select,col,ids,extra){\r\n    const client=_rawClient(), out=[], uniq=[...new Set(ids)];\r\n    for(let i=0;i<uniq.length;i+=150){\r\n      const part=uniq.slice(i,i+150);\r\n      for(let start=0;;start+=1000){\r\n        let q=client.from(table).select(select).in(col,part);\r\n        if(extra) q=extra(q);\r\n        const {data,error}=await q.order('id',{ascending:true}).range(start,start+999);\r\n        if(error) return {data:out,error};\r\n        out.push(...(data||[]));\r\n        if(!data||data.length<1000) break;\r\n      }\r\n    }\r\n    return {data:out,error:null};\r\n  }\r\n\r\n  function tbl(headers,rows,emptyMsg='No data'){\r\n    _reportHeaders=headers; _reportData=rows;\r\n    if(!rows.length)return`<div class=\"ims__empty\"><i class=\"ti ti-inbox\"></i><p>${emptyMsg}</p></div>`;\r\n    return`<div class=\"ims__table-wrap\"><table class=\"ims__table\">\r\n      <thead><tr>${headers.map(h=>`<th>${util().sanitize(h)}</th>`).join('')}</tr></thead>\r\n      <tbody>${rows.map(row=>`<tr>${row.map(cell=>`<td>${cell}</td>`).join('')}</tr>`).join('')}</tbody>\r\n    </table></div>`;\r\n  }\r\n\r\n  // \u2500\u2500\u2500 INVENTORY REPORTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  async function rptStockValuation(body){\r\n    if(!window.SM.AUTH.canSeeCost()){body.innerHTML=`<div class=\"ims__coming-soon\"><i class=\"ti ti-lock\"></i><h3>Restricted</h3><p>Stock valuation is visible to Admin and Import Manager only.</p></div>`;return;}\r\n    const {data:stock}=await _sel('stock_levels',{select:'quantity,reserved_qty,warehouse_id,product_id,products(name,sku,category),warehouses(name)',noCompanyFilter:true});\r\n    const productIds=[...new Set((stock||[]).map(s=>s.product_id).filter(Boolean))];\r\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\r\n    const {data:costPrices}=productIds.length\r\n      ? await client.from('product_prices').select('product_id,price').eq('price_type','cost').is('platform_id',null).in('product_id',productIds)\r\n      : {data:[]};\r\n    const costMap={};\r\n    (costPrices||[]).forEach(p=>{costMap[p.product_id]=p.price||0;});\r\n    const rows=(stock||[]).filter(s=>s.products).map(s=>{\r\n      const cost=costMap[s.product_id]||0;\r\n      const val=(s.quantity||0)*cost;\r\n      return[util().sanitize(s.products?.sku||'\u2014'),util().sanitize(s.products?.name||'\u2014'),util().sanitize(s.products?.category||'\u2014'),util().sanitize(s.warehouses?.name||'\u2014'),s.quantity||0,s.reserved_qty||0,(s.quantity||0)-(s.reserved_qty||0),util().formatCurrency(cost),util().formatCurrency(val)];\r\n    }).sort((a,b)=>parseFloat(b[8].replace(/[\u00A3,]/g,''))-parseFloat(a[8].replace(/[\u00A3,]/g,'')));\r\n    const total=rows.reduce((s,r)=>s+parseFloat(r[8].replace(/[\u00A3,]/g,'')),0);\r\n    body.innerHTML=`<div style=\"text-align:right;margin-bottom:10px;font-size:15px;font-weight:700\">Total stock value: <span style=\"color:var(--ims-accent)\">${util().formatCurrency(total)}</span></div>`+\r\n      tbl(['SKU','Product','Category','Warehouse','On hand','Reserved','Available','Cost price','Stock value'],rows,'No stock records');\r\n  }\r\n\r\n  async function rptStockMovements(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'quantity,movement_type,reference,reason,created_at,products(name,sku),warehouses(name),users(name)',order:{col:'created_at',asc:false},limit:200};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:movements}=await _sel('stock_movements',opts);\r\n    const rows=(movements||[]).map(m=>[util().formatDate(m.created_at),util().sanitize(m.products?.name||'\u2014'),util().sanitize(m.products?.sku||'\u2014'),util().sanitize(m.movement_type),`<span style=\"color:${(m.quantity||0)<0?'var(--ims-danger)':'var(--ims-success)'};font-weight:600\">${(m.quantity||0)>0?'+':''}${m.quantity||0}</span>`,util().sanitize(m.warehouses?.name||'\u2014'),util().sanitize(m.reference||'\u2014'),util().sanitize(m.reason||'\u2014'),util().sanitize(m.users?.name||'\u2014')]);\r\n    body.innerHTML+=tbl(['Date','Product','SKU','Type','Qty','Warehouse','Reference','Reason','User'],rows);\r\n  }\r\n\r\n  // Products with no sales in the chosen period, with their stock\r\n  // position. Sales are orders taken (cancelled and refunded orders not\r\n  // counted). Products with no stock are hidden unless ticked.\r\n  let _slowShowEmpty=false;\r\n  function setSlowShowEmpty(v){ _slowShowEmpty=!!v; refreshCurrentReport(); }\r\n  async function rptSlowMovers(body){\r\n    body.innerHTML=dateRangeHtml(90);\r\n    const{from,to}=getDateRange();\r\n    const fromTs=(from||'2000-01-01')+'T00:00:00', toTs=(to||new Date().toISOString().split('T')[0])+'T23:59:59';\r\n    const [{data:products},{data:stock},{data:orders}]=await Promise.all([\r\n      _sel('products',{select:'id,name,sku,category'}),\r\n      _sel('stock_levels',{select:'id,product_id,quantity,reserved_qty,reserved_by_allocations'}),\r\n      _sel('orders',{select:'id,created_at,status'})\r\n    ]);\r\n    const live=(orders||[]).filter(o=>!['cancelled','refunded'].includes(o.status));\r\n    const when={}; live.forEach(o=>{when[o.id]=o.created_at;});\r\n    const {data:items}=await _inChunks('order_items','id,order_id,product_id,quantity','order_id',live.map(o=>o.id));\r\n    const sold={}, last={};\r\n    (items||[]).forEach(i=>{ if(!i.product_id) return; const t=when[i.order_id]; if(!t) return;\r\n      if(t>=fromTs&&t<=toTs) sold[i.product_id]=(sold[i.product_id]||0)+(Number(i.quantity)||0);\r\n      if(!last[i.product_id]||t>last[i.product_id]) last[i.product_id]=t; });\r\n    const pos={}; (stock||[]).forEach(x=>{ const p=pos[x.product_id]=pos[x.product_id]||{on:0,res:0,ring:0};\r\n      p.on+=Number(x.quantity)||0; p.res+=Number(x.reserved_qty)||0; p.ring+=Number(x.reserved_by_allocations)||0; });\r\n    const today=Date.now();\r\n    const list=(products||[]).filter(p=>!sold[p.id]).map(p=>{ const q=pos[p.id]||{on:0,res:0,ring:0}; return {...p,...q,free:Math.max(0,q.on-q.res-q.ring),last:last[p.id]||null}; })\r\n      .filter(p=>_slowShowEmpty||p.on>0).sort((a,b)=>b.free-a.free||b.on-a.on);\r\n    const hidden=(products||[]).filter(p=>!sold[p.id]&&!((pos[p.id]?.on||0)>0)).length;\r\n    const rows=list.map(p=>[util().sanitize(p.sku||'-'),util().sanitize(p.name||'-'),util().sanitize(p.category||'-'),p.on,p.res,p.ring,`<strong>${p.free}</strong>`,\r\n      p.last?util().formatDate(p.last):'Never',p.last?Math.floor((today-new Date(p.last))/86400000):'-']);\r\n    body.innerHTML+=`<div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:8px\"><i class=\"ti ti-info-circle\"></i><span>Products with <strong>no sales</strong> between ${util().formatDate(fromTs)} and ${util().formatDate(toTs)}, with their stock today (all warehouses). Cancelled and refunded orders are not counted.</span></div>\r\n      <label class=\"no-print\" style=\"display:flex;gap:6px;align-items:center;font-size:12px;margin-bottom:8px;cursor:pointer\"><input type=\"checkbox\" ${_slowShowEmpty?'checked':''} onchange=\"window.IMS_REPORTS.setSlowShowEmpty(this.checked)\"> Include products with no stock${_slowShowEmpty?'':` (${hidden} hidden)`}</label>`+\r\n      tbl(['SKU','Product','Category','On hand','Reserved for orders','Ring-fenced for partners','Free stock','Last sold','Days since last sale'],rows,'Every product with stock has sold in this period');\r\n  }\r\n\r\n  // \u2500\u2500\u2500 CLEARANCE PLANNER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // The whole inventory, as of today. For each product: free stock (on hand\r\n  // less stock reserved for orders and ring-fenced for dropship partners),\r\n  // sales over 30 / 90 / 180 / 365 days (real orders; cancelled and refunded\r\n  // not counted), weeks of cover, and the EXCESS: units above what normally\r\n  // sells in the target period. Only the excess is discounted, so good\r\n  // sellers holding a lot of stock keep most of it at full price. Discounts\r\n  // rise with weeks of cover. New lines (first received recently) and\r\n  // unlisted products (no retail price, never sold) are listed apart, not\r\n  // discounted. Totals use products that have BOTH a cost and a price, so\r\n  // they compare like for like. Products can be removed from the plan\r\n  // (until the page is reloaded) before printing or exporting.\r\n  const _clr={basis:'rrp',target:26,newDays:90,dSlow:10,dVslow:20,dStag:30,dDead:35,showHealthy:false,allCols:false,category:'',warehouse:'',removed:new Set()};\r\n  function setClearance(field,value){\r\n    if(['dSlow','dVslow','dStag','dDead'].includes(field)) _clr[field]=Math.max(0,Math.min(95,parseFloat(value)||0));\r\n    else if(field==='target') _clr[field]=Math.max(1,Math.min(104,parseInt(value,10)||26));\r\n    else if(field==='newDays') _clr[field]=Math.max(0,Math.min(365,parseInt(value,10)||0));\r\n    else if(field==='showHealthy'||field==='allCols') _clr[field]=!!value;\r\n    else _clr[field]=value;\r\n    refreshCurrentReport();\r\n  }\r\n  function clearanceRemove(id){ _clr.removed.add(id); refreshCurrentReport(); }\r\n  // Tickboxes at the start of each row; \"Remove selected\" takes them all out.\r\n  function clearancePickChanged(){\r\n    const n=document.querySelectorAll('#ims-modal-body input.ims-clr-pick:checked').length;\r\n    const el=document.getElementById('ims-clr-count'); if(el) el.textContent=n;\r\n    const btn=document.getElementById('ims-clr-remove'); if(btn) btn.disabled=!n;\r\n  }\r\n  function clearancePickAll(cb){\r\n    cb.closest('table')?.querySelectorAll('input.ims-clr-pick').forEach(x=>{x.checked=cb.checked;});\r\n    clearancePickChanged();\r\n  }\r\n  function clearanceRemoveSelected(){\r\n    const picked=[...document.querySelectorAll('#ims-modal-body input.ims-clr-pick:checked')].map(x=>x.value);\r\n    if(!picked.length){ ui().toast('Tick the products to remove first','warning'); return; }\r\n    picked.forEach(id=>_clr.removed.add(id)); refreshCurrentReport();\r\n  }\r\n  function clearanceRestoreAll(){ _clr.removed.clear(); refreshCurrentReport(); }\r\n  const CLR_CLASS={dead:['danger','Dead'],stag:['danger','Stagnant'],vslow:['warning','Very slow'],slow:['info','Slow'],healthy:['success','Healthy']};\r\n  async function rptClearance(body){\r\n    body.innerHTML='<div class=\"ims__loading\"><i class=\"ti ti-loader-2 ims__spin\"></i></div>';\r\n    const [{data:products},{data:stock},{data:orders},{data:whs},{data:receipts}]=await Promise.all([\r\n      _sel('products',{select:'id,name,sku,category'}),\r\n      _sel('stock_levels',{select:'id,product_id,warehouse_id,quantity,reserved_qty,reserved_by_allocations'}),\r\n      _sel('orders',{select:'id,created_at,status'}),\r\n      _sel('warehouses',{select:'id,name'}),\r\n      _sel('stock_movements',{select:'id,product_id,quantity,movement_type,created_at',in:{movement_type:['import_received','stock_in']}})\r\n    ]);\r\n    const ids=(products||[]).map(p=>p.id);\r\n    const {data:prices}=await _inChunks('product_prices','id,product_id,price,price_type,platform_id','product_id',ids,q=>q.in('price_type',['cost','rrp','wholesale']).is('platform_id',null));\r\n    const live=(orders||[]).filter(o=>!['cancelled','refunded'].includes(o.status));\r\n    const when={}; live.forEach(o=>{when[o.id]=Date.parse(o.created_at);});\r\n    const historyFrom=live.length?Math.min(...live.map(o=>when[o.id])):null;\r\n    const {data:items}=await _inChunks('order_items','id,order_id,product_id,quantity','order_id',live.map(o=>o.id));\r\n    const now=Date.now(), DAY=86400000, r2=n=>Math.round(n*100)/100;\r\n    const sales={};\r\n    (items||[]).forEach(i=>{ if(!i.product_id) return; const t=when[i.order_id]; if(!t) return;\r\n      const x=sales[i.product_id]=sales[i.product_id]||{d30:0,d90:0,d180:0,d365:0,last:0}; const q=Number(i.quantity)||0, age=now-t;\r\n      if(age<=30*DAY) x.d30+=q; if(age<=90*DAY) x.d90+=q; if(age<=180*DAY) x.d180+=q; if(age<=365*DAY) x.d365+=q; if(t>x.last) x.last=t; });\r\n    const firstIn={}; (receipts||[]).forEach(m=>{ if((Number(m.quantity)||0)<=0) return; const t=Date.parse(m.created_at); if(!firstIn[m.product_id]||t<firstIn[m.product_id]) firstIn[m.product_id]=t; });\r\n    const price={}; (prices||[]).forEach(p=>{ (price[p.product_id]=price[p.product_id]||{})[p.price_type]=Number(p.price); });\r\n    const free={}; (stock||[]).forEach(x=>{ if(_clr.warehouse&&x.warehouse_id!==_clr.warehouse) return;\r\n      free[x.product_id]=(free[x.product_id]||0)+Math.max(0,(Number(x.quantity)||0)-(Number(x.reserved_qty)||0)-(Number(x.reserved_by_allocations)||0)); });\r\n    const disc={dead:_clr.dDead,stag:_clr.dStag,vslow:_clr.dVslow,slow:_clr.dSlow,healthy:0};\r\n    const basisName=_clr.basis==='rrp'?'Retail (RRP)':'Wholesale', basisWord=_clr.basis==='rrp'?'retail':'wholesale';\r\n    const all=(products||[]).filter(p=>(free[p.id]||0)>0&&(!_clr.category||p.category===_clr.category)).map(p=>{\r\n      const s=sales[p.id]||{d30:0,d90:0,d180:0,d365:0,last:0}, f=free[p.id];\r\n      const perWeek=s.d90>0?s.d90/(90/7):(s.d180>0?s.d180/(180/7):(s.d365>0?s.d365/(365/7):0));\r\n      const cover=perWeek>0?f/perWeek:Infinity;\r\n      const days=s.last?Math.floor((now-s.last)/DAY):null;\r\n      const deadNow=(days===null||days>=180);\r\n      // Dead stock: an old sale is no reason to hold any back, so all of it\r\n      // is excess. Otherwise keep enough for the target weeks (rounded up).\r\n      const keep=(!deadNow&&perWeek>0)?Math.ceil(perWeek*_clr.target):0;\r\n      const excess=Math.max(0,f-keep);\r\n      const cost=price[p.id]?.cost, base=price[p.id]?.[_clr.basis];\r\n      const isNew=firstIn[p.id]&&(now-firstIn[p.id])<_clr.newDays*DAY;\r\n      const unlisted=_clr.basis==='rrp'&&base==null&&!s.last;\r\n      const cls=deadNow?'dead':cover>104?'stag':cover>52?'vslow':cover>_clr.target?'slow':'healthy';\r\n      const group=isNew?'new':unlisted?'unlisted':'plan';\r\n      const d=group==='plan'?disc[cls]:0;\r\n      const suggested=base!=null?r2(base*(1-d/100)):null;\r\n      const margin=(suggested!=null&&cost!=null)?r2(suggested-cost):null;\r\n      return {...p,free:f,s,days,cover,keep,excess,cls,group,cost,base,d,suggested,margin,firstIn:firstIn[p.id]||null,complete:cost!=null&&base!=null};\r\n    });\r\n    const removedList=all.filter(p=>_clr.removed.has(p.id));\r\n    const kept=all.filter(p=>!_clr.removed.has(p.id));\r\n    const plan=kept.filter(p=>p.group==='plan'&&(_clr.showHealthy||(p.cls!=='healthy'&&p.excess>0)));\r\n    const toClear=plan.filter(p=>p.cls!=='healthy'&&p.excess>0);\r\n    const newOnes=kept.filter(p=>p.group==='new'), unlisted=kept.filter(p=>p.group==='unlisted');\r\n    const order={dead:0,stag:1,vslow:2,slow:3,healthy:4};\r\n    plan.sort((a,b)=>order[a.cls]-order[b.cls]||((b.cost||0)*b.excess)-((a.cost||0)*a.excess)||b.excess-a.excess);\r\n    const sum=(arr,fn)=>r2(arr.reduce((t,p)=>t+(fn(p)||0),0));\r\n    const full=toClear.filter(p=>p.complete), noCost=toClear.filter(p=>p.cost==null).length, noPrice=toClear.filter(p=>p.base==null).length;\r\n    const below=full.filter(p=>p.margin<0);\r\n    const fm=n=>util().formatCurrency(n), fmtD=t=>t?util().formatDate(new Date(t).toISOString()):'-';\r\n    const num=(field,val,w=56)=>`<input class=\"ims__input ims__input--sm\" type=\"number\" min=\"0\" value=\"${val}\" style=\"width:${w}px\" onchange=\"window.IMS_REPORTS.setClearance('${field}',this.value)\">`;\r\n    const ctl=`<div class=\"no-print\" style=\"display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:8px;font-size:12px\">\r\n        <label>Price basis <select class=\"ims__select\" style=\"width:auto;font-size:12px\" onchange=\"window.IMS_REPORTS.setClearance('basis',this.value)\"><option value=\"rrp\" ${_clr.basis==='rrp'?'selected':''}>Retail (RRP)</option><option value=\"wholesale\" ${_clr.basis==='wholesale'?'selected':''}>Wholesale</option></select></label>\r\n        <label>Keep at full price: ${num('target',_clr.target)} weeks of sales</label>\r\n        <label>New if first received within ${num('newDays',_clr.newDays)} days</label>\r\n      </div>\r\n      <div class=\"no-print\" style=\"display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:8px;font-size:12px\">\r\n        <span>Discounts:</span>\r\n        <label>Slow (${_clr.target} to 52 weeks) ${num('dSlow',_clr.dSlow)}%</label>\r\n        <label>Very slow (52 to 104) ${num('dVslow',_clr.dVslow)}%</label>\r\n        <label>Stagnant (104+) ${num('dStag',_clr.dStag)}%</label>\r\n        <label>Dead (no sale 180+ days) ${num('dDead',_clr.dDead)}%</label>\r\n      </div>\r\n      <div class=\"no-print\" style=\"display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:10px;font-size:12px\">\r\n        <label>Category <select class=\"ims__select\" style=\"width:auto;font-size:12px\" onchange=\"window.IMS_REPORTS.setClearance('category',this.value)\"><option value=\"\">All</option>${[...new Set((products||[]).map(p=>p.category).filter(Boolean))].sort().map(c=>`<option ${c===_clr.category?'selected':''}>${util().sanitize(c)}</option>`).join('')}</select></label>\r\n        <label>Warehouse <select class=\"ims__select\" style=\"width:auto;font-size:12px\" onchange=\"window.IMS_REPORTS.setClearance('warehouse',this.value)\"><option value=\"\">All</option>${(whs||[]).map(w=>`<option value=\"${w.id}\" ${w.id===_clr.warehouse?'selected':''}>${util().sanitize(w.name)}</option>`).join('')}</select></label>\r\n        <label style=\"display:flex;gap:4px;align-items:center\"><input type=\"checkbox\" ${_clr.showHealthy?'checked':''} onchange=\"window.IMS_REPORTS.setClearance('showHealthy',this.checked)\"> Show healthy products</label>\r\n        <label style=\"display:flex;gap:4px;align-items:center\"><input type=\"checkbox\" ${_clr.allCols?'checked':''} onchange=\"window.IMS_REPORTS.setClearance('allCols',this.checked)\"> Show all columns</label>\r\n      </div>\r\n      ${removedList.length?`<div class=\"no-print\" style=\"font-size:12px;margin-bottom:8px;padding:6px 8px;background:var(--ims-bg-subtle,#f5f5f5);border-radius:6px\">${removedList.length} removed from this plan: ${removedList.map(p=>util().sanitize(p.name||p.sku)).join(', ')}. <a href=\"javascript:void(0)\" onclick=\"window.IMS_REPORTS.clearanceRestoreAll()\">Restore all</a></div>`:''}`;\r\n    const card=(label,val,red)=>`<div style=\"border:1px solid var(--ims-border,#ddd);border-radius:8px;padding:8px 10px;min-width:150px\"><div style=\"font-size:11px;color:var(--ims-text-muted,#666)\">${label}</div><div style=\"font-weight:700;font-size:15px;${red?'color:var(--ims-danger,#c00)':''}\">${val}</div></div>`;\r\n    const cnt=k=>toClear.filter(p=>p.cls===k).length;\r\n    const summary=`<div style=\"display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px\">\r\n        ${card('Products to clear',`${toClear.length} <span style=\"font-weight:400;font-size:11px\">(${cnt('dead')} dead, ${cnt('stag')} stagnant, ${cnt('vslow')} very slow, ${cnt('slow')} slow)</span>`)}\r\n        ${card('Excess units',sum(toClear,p=>p.excess))}\r\n        ${card('Excess stock value (at cost)',fm(sum(full,p=>p.cost*p.excess)))}\r\n        ${card(`Cash from excess at suggested ${basisWord} prices`,fm(sum(full,p=>p.suggested*p.excess)))}\r\n        ${card('Below cost',below.length?`${below.length} products, loss ${fm(sum(below,p=>-p.margin*p.excess))}`:'None',below.length>0)}\r\n      </div>\r\n      <div style=\"font-size:11px;color:var(--ims-text-muted,#666);margin-bottom:8px\">Sales history from ${historyFrom?fmtD(historyFrom):'-'}, so \"no sale\" means none since then. Basis: ${basisName}. Only the excess is discounted: units above ${_clr.target} weeks of sales stay at full price. Discounts: Slow ${_clr.dSlow}%, Very slow ${_clr.dVslow}%, Stagnant ${_clr.dStag}%, Dead ${_clr.dDead}%. Values and cash are for products with both a cost and a ${basisWord} price${noCost||noPrice?`: <strong>${noCost} without a cost price${noPrice?`, ${noPrice} without a ${basisWord} price`:''} are not in these totals</strong>`:''}.${noCost&&window.SM.AUTH.canSeeCost?.()?` <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" style=\"font-size:11px;padding:1px 8px\" onclick=\"window.IMS_INVENTORY?.openCostUpdate('missing')\" title=\"Fill in the missing cost prices\"><i class=\"ti ti-currency-pound\"></i> Add cost prices</button>`:''} Free stock excludes stock reserved for orders and ring-fenced for dropship partners.${_clr.warehouse?` Warehouse: ${util().sanitize((whs||[]).find(w=>w.id===_clr.warehouse)?.name||'')}.`:''}${_clr.category?` Category: ${util().sanitize(_clr.category)}.`:''}</div>`;\r\n    // Columns: [header, printed?, cell(p)]. Columns not printed are still on\r\n    // screen and in the Excel export.\r\n    const red=v=>`<span style=\"color:var(--ims-danger,#c00);font-weight:700\">${v}</span>`;\r\n    // [header, on the compact screen view, on the (landscape) printout, cell].\r\n    // Every column is in the Excel export.\r\n    const cols=[\r\n      ['SKU',1,1,p=>util().sanitize(p.sku||'-')],['Product',1,1,p=>util().sanitize(p.name||'-')],['Category',0,1,p=>util().sanitize(p.category||'-')],\r\n      ['Class',1,1,p=>{const [c,l]=CLR_CLASS[p.cls];return `<span class=\"ims__pill ims__pill--${c}\" style=\"font-size:10px;white-space:nowrap\">${l}</span>`;}],\r\n      ['Free stock',1,1,p=>p.free],['Keep at full price',0,0,p=>p.keep],['Excess',1,1,p=>`<strong>${p.excess}</strong>`],\r\n      ['Cost',0,1,p=>p.cost!=null?fm(p.cost):'-'],['Excess value',0,1,p=>p.cost!=null?fm(p.cost*p.excess):'-'],\r\n      ['Sold 30 days',0,0,p=>p.s.d30],['Sold 90 days',0,0,p=>p.s.d90],['Sold 180 days',0,0,p=>p.s.d180],['Sold 365 days',0,0,p=>p.s.d365],\r\n      ['Last sold',1,1,p=>p.s.last?fmtD(p.s.last):'Never'],['Days since',0,0,p=>p.days===null?'-':p.days],\r\n      ['Weeks of cover',1,1,p=>p.cover===Infinity?'No sales':(p.cover>=520?'520+':String(Math.round(p.cover)))],\r\n      ['Discount',1,1,p=>p.d?`${p.d}%`:'-'],['Price',1,1,p=>p.base!=null?fm(p.base):'-'],\r\n      ['Suggested price',1,1,p=>p.suggested==null?'-':(p.margin!=null&&p.margin<0?red(fm(p.suggested)):fm(p.suggested))],\r\n      ['Margin per unit',0,0,p=>p.margin==null?'-':(p.margin<0?red(fm(p.margin)):fm(p.margin))],\r\n      ['Margin %',1,1,p=>p.margin!=null&&p.suggested?`${Math.round(p.margin/p.suggested*100)}%`:'-'],\r\n      ['Note',1,1,p=>p.margin!=null&&p.margin<0?`<span style=\"color:var(--ims-danger,#c00)\">Below cost: loss ${fm(-p.margin)} per unit</span>`:util().sanitize([p.base==null?`No ${basisWord} price`:'',p.cost==null?'No cost price':''].filter(Boolean).join('; '))]\r\n    ];\r\n    const line='border-bottom:1px solid var(--ims-border,#cfcfcf)';\r\n    // Widths: product names get room; SKUs smaller and on one line.\r\n    const widthOf=h=>h==='Product'?'min-width:170px;':h==='SKU'?'font-size:11px;white-space:nowrap;':'';\r\n    const attrs=(h,compact,printed,isHead)=>{\r\n      const cls=printed?'':' class=\"no-print\"';\r\n      const hide=(!compact&&!_clr.allCols)?'display:none;':'';\r\n      return `${cls}${compact?'':' data-extra=\"1\"'} style=\"${hide}${widthOf(h)}${isHead?'':line}\"`;\r\n    };\r\n    const pickHead=`<th class=\"no-print\" style=\"width:28px\"><input type=\"checkbox\" title=\"Tick all\" onchange=\"window.IMS_REPORTS.clearancePickAll(this)\"></th>`;\r\n    const pickCell=p=>`<td class=\"no-print\" style=\"${line}\"><input type=\"checkbox\" class=\"ims-clr-pick\" value=\"${util().sanitize(p.id)}\" onchange=\"window.IMS_REPORTS.clearancePickChanged()\"></td>`;\r\n    const bar=`<div class=\"no-print\" style=\"display:flex;gap:8px;align-items:center;margin:4px 0 8px;font-size:12px\">\r\n        <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" id=\"ims-clr-remove\" disabled onclick=\"window.IMS_REPORTS.clearanceRemoveSelected()\"><i class=\"ti ti-x\"></i> Remove selected (<span id=\"ims-clr-count\">0</span>)</button>\r\n        <span style=\"color:var(--ims-text-muted,#666)\">Tick products to leave them out of this plan, its totals, the printout and the export.</span></div>`;\r\n    const table=plan.length?`${bar}<div class=\"ims__table-wrap\"><table class=\"ims__table\" data-export=\"1\">\r\n        <thead><tr>${pickHead}${cols.map(([h,c,pr])=>`<th${attrs(h,c,pr,true)}>${h}</th>`).join('')}</tr></thead>\r\n        <tbody>${plan.map(p=>`<tr>${pickCell(p)}${cols.map(([h,c,pr,fn])=>`<td${attrs(h,c,pr,false)}>${fn(p)}</td>`).join('')}</tr>`).join('')}</tbody>\r\n      </table></div>`:`<div class=\"ims__empty\"><i class=\"ti ti-inbox\"></i><p>Nothing to clear: no product has stock above ${_clr.target} weeks of sales</p></div>`;\r\n    const side=(title,why,list,extra)=>list.length?`<div style=\"margin-top:14px\"><strong style=\"font-size:13px\">${title} (${list.length})</strong> <span style=\"font-size:11px;color:var(--ims-text-muted,#666)\">${why}</span>\r\n        <div class=\"ims__table-wrap\"><table class=\"ims__table\"><thead><tr>${pickHead}<th>SKU</th><th>Product</th><th>Free stock</th><th>${extra[0]}</th></tr></thead>\r\n        <tbody>${list.map(p=>`<tr>${pickCell(p)}<td style=\"${line}${widthOf('SKU')}\">${util().sanitize(p.sku||'-')}</td><td style=\"${line}\">${util().sanitize(p.name||'-')}</td><td style=\"${line}\">${p.free}</td><td style=\"${line}\">${extra[1](p)}</td></tr>`).join('')}</tbody></table></div></div>`:'';\r\n    body.innerHTML=ctl+summary+table+\r\n      side('New stock: too early to judge',`First received within the last ${_clr.newDays} days, so not discounted yet.`,newOnes,['First received',p=>fmtD(p.firstIn)])+\r\n      side('Not listed: no retail price, never sold','Needs a price and a listing, not a discount.',unlisted,['Category',p=>util().sanitize(p.category||'-')]);\r\n    _reportHeaders=cols.map(c=>c[0]); _reportData=plan.map(p=>cols.map(c=>c[3](p)));\r\n  }\r\n\r\n  async function rptLowStock(body){\r\n    const {data:stock}=await _sel('stock_levels',{select:'quantity,reserved_qty,products(name,sku,category,reorder_threshold,reorder_quantity)',order:{col:'quantity'}});\r\n    const rows=(stock||[]).filter(s=>s.products&&(s.quantity||0)<=(s.products?.reorder_threshold||10)).map(s=>[util().sanitize(s.products?.sku||'\u2014'),util().sanitize(s.products?.name||'\u2014'),util().sanitize(s.products?.category||'\u2014'),s.quantity||0,s.products?.reorder_threshold||10,s.products?.reorder_quantity||50,`<span class=\"ims__pill ims__pill--${(s.quantity||0)<=0?'danger':'warning'}\">${(s.quantity||0)<=0?'Out of stock':'Low'}</span>`]);\r\n    body.innerHTML=tbl(['SKU','Product','Category','Stock','Threshold','Reorder qty','Status'],rows,'All stock levels healthy');\r\n  }\r\n\r\n  async function rptStockRecon(body){\r\n    body.innerHTML=dateRangeHtml(30);\r\n    const{from,to}=getDateRange();\r\n    const {data:products}=await _sel('products',{select:'id,name,sku'});\r\n    const fromTs=(from||'2020-01-01')+'T00:00:00', toTs=(to||new Date().toISOString().split('T')[0])+'T23:59:59';\r\n    const {data:movements}=await _sel('stock_movements',{select:'id,product_id,quantity,movement_type',gte:{created_at:fromTs},lte:{created_at:toTs}});\r\n    const {data:stock}=await _sel('stock_levels',{select:'id,quantity,product_id'});\r\n    // Orders taken in the period (cancelled and refunded not counted), next\r\n    // to what was sent (\"sold\" movements happen when goods leave).\r\n    const {data:ords}=await _sel('orders',{select:'id,status',gte:{created_at:fromTs},lte:{created_at:toTs}});\r\n    const {data:its}=await _inChunks('order_items','id,product_id,quantity','order_id',(ords||[]).filter(o=>!['cancelled','refunded'].includes(o.status)).map(o=>o.id));\r\n    const ordered={}; (its||[]).forEach(i=>{ if(i.product_id) ordered[i.product_id]=(ordered[i.product_id]||0)+(Number(i.quantity)||0); });\r\n    const closingOf={}; (stock||[]).forEach(x=>{ closingOf[x.product_id]=(closingOf[x.product_id]||0)+(Number(x.quantity)||0); });\r\n    const rows=(products||[]).map(p=>{\r\n      const mv=movements?.filter(m=>m.product_id===p.id)||[];\r\n      const received=mv.filter(m=>['stock_in','import_received'].includes(m.movement_type)).reduce((s,m)=>s+(m.quantity||0),0);\r\n      const sold=mv.filter(m=>['sale','stock_out'].includes(m.movement_type)).reduce((s,m)=>s+Math.abs(m.quantity||0),0);\r\n      const closing=closingOf[p.id]||0;   // all warehouses (it used to take one warehouse only)\r\n      return[util().sanitize(p.sku||'-'),util().sanitize(p.name||'-'),received,ordered[p.id]||0,sold,closing];\r\n    });\r\n    body.innerHTML+=tbl(['SKU','Product','Received in period','Ordered in period','Sent in period','Closing stock (all warehouses)'],rows);\r\n  }\r\n\r\n  async function rptContainerDiscrepancy(body){\r\n    const {data:grns}=await _sel('grn_records',{select:'grn_number,created_at,imports(container_number),grn_discrepancies(product_name,expected_qty,received_qty,variance,reason)',order:{col:'created_at',asc:false}});\r\n    const rows=[];\r\n    (grns||[]).forEach(grn=>{\r\n      (grn.grn_discrepancies||[]).forEach(d=>{\r\n        rows.push([util().sanitize(grn.imports?.container_number||'\u2014'),util().sanitize(grn.grn_number),util().formatDate(grn.created_at),util().sanitize(d.product_name||'\u2014'),d.expected_qty||0,d.received_qty||0,`<span style=\"color:${(d.variance||0)<0?'var(--ims-danger)':'var(--ims-success)'};font-weight:600\">${(d.variance||0)>0?'+':''}${d.variance||0}</span>`,util().sanitize(d.reason||'\u2014')]);\r\n      });\r\n    });\r\n    body.innerHTML=tbl(['Container','GRN #','Date','Product','Expected','Received','Variance','Reason'],rows,'No discrepancies recorded');\r\n  }\r\n\r\n  // \u2500\u2500\u2500 SALES REPORTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  async function rptSalesSummary(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'total_value,created_at,status',order:{col:'created_at'}};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    const delivered=(orders||[]).filter(o=>o.status==='delivered');\r\n    const totalRevenue=delivered.reduce((s,o)=>s+(o.total_value||0),0);\r\n    const byMonth={};\r\n    delivered.forEach(o=>{const m=o.created_at?.slice(0,7)||'';byMonth[m]=(byMonth[m]||0)+(o.total_value||0);});\r\n    const rows=Object.entries(byMonth).sort().map(([m,v])=>[m,util().formatCurrency(v)]);\r\n    body.innerHTML+=`<div style=\"display:flex;gap:16px;margin-bottom:14px\">\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Total revenue</div><div class=\"ims__stat-value ims__stat-value--success\" style=\"font-size:20px\">${util().formatCurrency(totalRevenue)}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Orders delivered</div><div class=\"ims__stat-value\" style=\"font-size:20px\">${delivered.length}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Average order value</div><div class=\"ims__stat-value\" style=\"font-size:20px\">${delivered.length?util().formatCurrency(totalRevenue/delivered.length):util().formatCurrency(0)}</div></div>\r\n    </div>`+tbl(['Month','Revenue'],rows);\r\n  }\r\n\r\n  async function rptSalesByPlatform(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'total_value,platforms(name)',neq:{fulfillment_type:'dropship'},order:{col:'total_value',asc:false}};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    const byPlatform={};\r\n    (orders||[]).forEach(o=>{const p=o.platforms?.name||'Unknown';byPlatform[p]=(byPlatform[p]||{count:0,revenue:0});byPlatform[p].count++;byPlatform[p].revenue+=(o.total_value||0);});\r\n    const rows=Object.entries(byPlatform).sort((a,b)=>b[1].revenue-a[1].revenue).map(([p,v])=>[util().sanitize(p),v.count,util().formatCurrency(v.revenue),util().formatCurrency(v.count?v.revenue/v.count:0)]);\r\n    body.innerHTML+=tbl(['Platform','Orders','Revenue','Avg order value'],rows);\r\n  }\r\n\r\n  async function rptSalesByProduct(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    // Get company orders first, then their items\r\n    const opts={select:'id,created_at,status',order:{col:'created_at'}};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    // Cancelled and refunded orders are not sales.\r\n    const orderIds=(orders||[]).filter(o=>!['cancelled','refunded'].includes(o.status)).map(o=>o.id);\r\n    body.innerHTML+=`<div style=\"font-size:12px;color:var(--ims-text-muted);margin-bottom:8px\">${orderIds.length} orders in the period (cancelled and refunded orders are not counted).</div>`;\r\n    if(!orderIds.length){body.innerHTML+=tbl(['SKU','Product','Units sold','Revenue','Avg unit price'],[]);return;}\r\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\r\n    const {data:items}=await _inChunks('order_items','id,quantity,unit_price,total_price,product_name,sku','order_id',orderIds);\r\n    const byProduct={};\r\n    (items||[]).forEach(i=>{const k=i.sku||i.product_name||'\u2014';if(!byProduct[k])byProduct[k]={name:i.product_name||i.sku,sku:i.sku,units:0,revenue:0};byProduct[k].units+=(i.quantity||0);byProduct[k].revenue+=(i.total_price||0);});\r\n    const rows=Object.values(byProduct).sort((a,b)=>b.revenue-a.revenue).map(p=>[util().sanitize(p.sku||'\u2014'),util().sanitize(p.name||'\u2014'),p.units,util().formatCurrency(p.revenue),util().formatCurrency(p.units?p.revenue/p.units:0)]);\r\n    body.innerHTML+=tbl(['SKU','Product','Units sold','Revenue','Avg unit price'],rows);\r\n  }\r\n\r\n  async function rptSalesByCustomer(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'customer_name,total_value,order_type,fulfillment_type',eq:{order_type:'wholesale'},order:{col:'total_value',asc:false}};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    // Dropship orders are also order_type:'wholesale' \u2014 exclude them here\r\n    // since they already have their own dedicated \"Sales by dropship\r\n    // customer\" report, or revenue gets double-counted across both.\r\n    const byCust={};\r\n    (orders||[]).filter(o=>o.fulfillment_type!=='dropship').forEach(o=>{const k=o.customer_name||'Unknown';if(!byCust[k])byCust[k]={orders:0,revenue:0};byCust[k].orders++;byCust[k].revenue+=(o.total_value||0);});\r\n    const rows=Object.entries(byCust).sort((a,b)=>b[1].revenue-a[1].revenue).map(([name,v])=>[util().sanitize(name),v.orders,util().formatCurrency(v.revenue),util().formatCurrency(v.orders?v.revenue/v.orders:0)]);\r\n    body.innerHTML+=tbl(['Customer','Orders','Total spend','Avg order value'],rows);\r\n  }\r\n\r\n  async function rptSalesByDropshipCustomer(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'total_value,dropship_customers(business_name)',eq:{fulfillment_type:'dropship'},order:{col:'total_value',asc:false}};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    const byCust={};\r\n    (orders||[]).forEach(o=>{const c=o.dropship_customers?.business_name||'Unknown';byCust[c]=(byCust[c]||{count:0,revenue:0});byCust[c].count++;byCust[c].revenue+=(o.total_value||0);});\r\n    const total=Object.values(byCust).reduce((s,v)=>s+v.revenue,0);\r\n    const rows=Object.entries(byCust).sort((a,b)=>b[1].revenue-a[1].revenue).map(([c,v])=>[util().sanitize(c),v.count,util().formatCurrency(v.revenue),total>0?((v.revenue/total)*100).toFixed(1)+'%':'0%',util().formatCurrency(v.count?v.revenue/v.count:0)]);\r\n    body.innerHTML+=tbl(['Dropship customer','Orders','Revenue','% of total','Avg order value'],rows,'No dropship orders in this period');\r\n  }\r\n\r\n  async function rptOrderFulfilment(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'status,dispatched_at'};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    const total=(orders||[]).length;\r\n    const delivered=(orders||[]).filter(o=>o.status==='delivered').length;\r\n    const delayed=(orders||[]).filter(o=>util().isDelayed(o)).length;\r\n    const failed=(orders||[]).filter(o=>o.status==='failed_delivery').length;\r\n    const lost=(orders||[]).filter(o=>o.status==='lost').length;\r\n    const rate=total?((delivered/total)*100).toFixed(1):0;\r\n    body.innerHTML+=`<div style=\"display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-bottom:14px\">\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Total orders</div><div class=\"ims__stat-value\" style=\"font-size:20px\">${total}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Delivered</div><div class=\"ims__stat-value ims__stat-value--success\" style=\"font-size:20px\">${delivered}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Delayed</div><div class=\"ims__stat-value ims__stat-value--${delayed>0?'warning':''}\" style=\"font-size:20px\">${delayed}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Failed</div><div class=\"ims__stat-value ims__stat-value--${failed>0?'danger':''}\" style=\"font-size:20px\">${failed}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Fulfilment rate</div><div class=\"ims__stat-value ims__stat-value--${rate>=95?'success':rate>=80?'warning':'danger'}\" style=\"font-size:20px\">${rate}%</div></div>\r\n    </div>`;\r\n  }\r\n\r\n  async function rptDelayedOrders(body){\r\n    const {data:orders}=await _sel('orders',{select:'order_number,customer_name,postcode,dispatched_at,status,platforms(name)',eq:{status:'dispatched'}});\r\n    const delayed=(orders||[]).filter(o=>util().isDelayed(o));\r\n    const rows=delayed.map(o=>[util().sanitize(o.order_number),util().sanitize(o.customer_name||'\u2014'),util().sanitize(o.platforms?.name||'\u2014'),util().sanitize(o.postcode||'\u2014'),util().formatDate(o.dispatched_at),`${util().daysSince(o.dispatched_at)} days`]);\r\n    body.innerHTML=tbl(['Order #','Customer','Platform','Postcode','Dispatched','Days delayed'],rows,'No delayed orders');\r\n  }\r\n\r\n  async function rptReturns(body){\r\n    const {data:orders}=await _sel('orders',{select:'order_number,customer_name,total_value,status,created_at',in:{status:['return_requested','return_received','refunded']}});\r\n    const rows=(orders||[]).map(o=>[util().sanitize(o.order_number),util().sanitize(o.customer_name||'\u2014'),util().formatCurrency(o.total_value),o.status,util().formatDate(o.created_at)]);\r\n    body.innerHTML=tbl(['Order #','Customer','Value','Status','Date'],rows,'No returns');\r\n  }\r\n\r\n  async function rptPlatformComparison(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'total_value,platforms(name)',neq:{status:'cancelled',fulfillment_type:'dropship'}};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    const map={};\r\n    (orders||[]).forEach(o=>{const p=o.platforms?.name||'Unknown';if(!map[p])map[p]={orders:0,revenue:0};map[p].orders++;map[p].revenue+=(o.total_value||0);});\r\n    const total=Object.values(map).reduce((s,v)=>s+v.revenue,0);\r\n    const rows=Object.entries(map).sort((a,b)=>b[1].revenue-a[1].revenue).map(([p,v])=>[util().sanitize(p),v.orders,util().formatCurrency(v.revenue),total>0?((v.revenue/total)*100).toFixed(1)+'%':'0%',util().formatCurrency(v.orders?v.revenue/v.orders:0)]);\r\n    body.innerHTML+=tbl(['Platform','Orders','Revenue','% of total','Avg order'],rows);\r\n  }\r\n\r\n  // \u2500\u2500\u2500 PURCHASING REPORTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  async function rptPOHistory(body){\r\n    const {data:pos}=await _sel('purchase_orders',{select:'po_number,status,total_value,currency,expected_delivery,created_at,suppliers(name)',order:{col:'created_at',asc:false}});\r\n    const rows=(pos||[]).map(p=>[util().sanitize(p.po_number),util().sanitize(p.suppliers?.name||'\u2014'),p.expected_delivery?util().formatDate(p.expected_delivery):'\u2014',util().formatDate(p.created_at),util().formatCurrency(p.total_value),util().pill(p.status)]);\r\n    body.innerHTML=tbl(['PO #','Supplier','Expected','Created','Value','Status'],rows);\r\n  }\r\n\r\n  async function rptSupplierPerf(body){\r\n    const {data:pos}=await _sel('purchase_orders',{select:'status,expected_delivery,suppliers(name)',neq:{status:'draft'}});\r\n    const map={};\r\n    (pos||[]).forEach(p=>{const s=p.suppliers?.name||'Unknown';if(!map[s])map[s]={total:0,completed:0,onTime:0,late:0};map[s].total++;if(p.status==='completed'){map[s].completed++;if(p.expected_delivery&&new Date(p.expected_delivery)>=new Date())map[s].onTime++;else map[s].late++;}});\r\n    const rows=Object.entries(map).map(([s,v])=>[util().sanitize(s),v.total,v.completed,v.onTime,v.late,v.completed?((v.onTime/v.completed)*100).toFixed(0)+'%':'\u2014']);\r\n    body.innerHTML=tbl(['Supplier','Total POs','Completed','On time','Late','On-time rate'],rows);\r\n  }\r\n\r\n  async function rptContainerIntel(body){\r\n    const {data:imports}=await _sel('imports',{select:'container_number,landed_cost,suppliers(name),import_items(qty_expected,qty_received,qty_remaining)',order:{col:'created_at',asc:false}});\r\n    const rows=(imports||[]).map(imp=>{\r\n      const received=(imp.import_items||[]).reduce((s,i)=>s+(i.qty_received||0),0);\r\n      const remaining=(imp.import_items||[]).reduce((s,i)=>s+(i.qty_remaining||0),0);\r\n      return[util().sanitize(imp.container_number||'\u2014'),util().sanitize(imp.suppliers?.name||'\u2014'),received,received-remaining,remaining,util().formatCurrency(imp.landed_cost)];\r\n    });\r\n    body.innerHTML=tbl(['Container','Supplier','Received','Sold','Remaining','Landed cost'],rows);\r\n  }\r\n\r\n  async function rptLandedCost(body){\r\n    if(!window.SM.AUTH.canSeeCost()){body.innerHTML=`<div class=\"ims__coming-soon\"><i class=\"ti ti-lock\"></i><h3>Restricted</h3><p>Landed cost analysis is visible to Admin and Import Manager only.</p></div>`;return;}\r\n    const {data:imports}=await _sel('imports',{select:'container_number,landed_cost,suppliers(name),import_items(qty_received,products(name,sku,cost_price))'});\r\n    const rows=[];\r\n    (imports||[]).forEach(imp=>{\r\n      const items=imp.import_items?.filter(i=>(i.qty_received||0)>0&&i.products)||[];\r\n      const totalUnits=items.reduce((s,i)=>s+(i.qty_received||0),0);\r\n      const costPerUnit=totalUnits>0?(imp.landed_cost||0)/totalUnits:0;\r\n      items.forEach(item=>{\r\n        const trueCost=(item.products?.cost_price||0)+costPerUnit;\r\n        rows.push([util().sanitize(imp.container_number||'\u2014'),util().sanitize(item.products?.sku||'\u2014'),util().sanitize(item.products?.name||'\u2014'),item.qty_received||0,util().formatCurrency(item.products?.cost_price||0),util().formatCurrency(costPerUnit),util().formatCurrency(trueCost)]);\r\n      });\r\n    });\r\n    body.innerHTML=tbl(['Container','SKU','Product','Qty','Product cost','Freight/unit','True landed cost'],rows);\r\n  }\r\n\r\n  async function rptPurchaseVsSales(body){\r\n    const {data:pos}=await _sel('purchase_orders',{select:'total_value,created_at',neq:{status:'draft'},order:{col:'created_at'}});\r\n    const {data:orders}=await _sel('orders',{select:'total_value,created_at',eq:{status:'delivered'},order:{col:'created_at'}});\r\n    const months={};\r\n    (pos||[]).forEach(p=>{const m=p.created_at?.slice(0,7)||'';if(!months[m])months[m]={purchases:0,sales:0};months[m].purchases+=(p.total_value||0);});\r\n    (orders||[]).forEach(o=>{const m=o.created_at?.slice(0,7)||'';if(!months[m])months[m]={purchases:0,sales:0};months[m].sales+=(o.total_value||0);});\r\n    const rows=Object.entries(months).sort().map(([m,v])=>[m,util().formatCurrency(v.purchases),util().formatCurrency(v.sales),util().formatCurrency(v.sales-v.purchases)]);\r\n    body.innerHTML=tbl(['Month','Purchases','Sales','Net'],rows);\r\n  }\r\n\r\n  // \u2500\u2500\u2500 FINANCIAL REPORTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  async function rptPL(body){\r\n    if(!window.SM.AUTH.hasRole('super_admin','admin','accounts_staff')){body.innerHTML=`<div class=\"ims__coming-soon\"><i class=\"ti ti-lock\"></i><h3>Restricted</h3><p>P&L report is visible to Admin and Accounts Staff only.</p></div>`;return;}\r\n    body.innerHTML=dateRangeHtml(365);\r\n    const{from,to}=getDateRange();\r\n    const opts={};\r\n    if(from)opts.gte={date:from};\r\n    if(to)opts.lte={date:to};\r\n    const {data:txs}=await _sel('transactions',{...opts,order:{col:'date'}});\r\n    const income=(txs||[]).filter(t=>t.type==='income').reduce((s,t)=>s+(t.amount||0),0);\r\n    const cogs=(txs||[]).filter(t=>t.type==='expense'&&t.category==='Cost of goods sold').reduce((s,t)=>s+(t.amount||0),0);\r\n    const expenses=(txs||[]).filter(t=>t.type==='expense'&&t.category!=='Cost of goods sold').reduce((s,t)=>s+(t.amount||0),0);\r\n    const gross=income-cogs;\r\n    const net=gross-expenses;\r\n    const expByCat=(txs||[]).filter(t=>t.type==='expense'&&t.category!=='Cost of goods sold').reduce((acc,t)=>{acc[t.category]=(acc[t.category]||0)+(t.amount||0);return acc;},{});\r\n    body.innerHTML+=`<table class=\"ims__table\"><tbody>\r\n      <tr><td style=\"padding-left:0\"><strong>Sales revenue</strong></td><td style=\"text-align:right;font-weight:700;color:var(--ims-success)\">${util().formatCurrency(income)}</td></tr>\r\n      <tr><td style=\"padding-left:20px;color:var(--ims-text-sec)\">Less: Cost of goods sold</td><td style=\"text-align:right;color:var(--ims-text-sec)\">(${util().formatCurrency(cogs)})</td></tr>\r\n      <tr style=\"border-top:2px solid var(--ims-border)\"><td><strong>Gross profit</strong></td><td style=\"text-align:right;font-weight:700;color:${gross>=0?'var(--ims-success)':'var(--ims-danger)'}\">${util().formatCurrency(gross)}</td></tr>\r\n      <tr><td colspan=\"2\" style=\"padding:6px 0 2px;font-size:12px;font-weight:600;color:var(--ims-text-muted)\">OPERATING EXPENSES</td></tr>\r\n      ${Object.entries(expByCat).map(([cat,amt])=>`<tr><td style=\"padding-left:20px;color:var(--ims-text-sec)\">${util().sanitize(cat)}</td><td style=\"text-align:right;color:var(--ims-text-sec)\">(${util().formatCurrency(amt)})</td></tr>`).join('')}\r\n      <tr style=\"border-top:1px solid var(--ims-border)\"><td style=\"padding-left:20px\"><strong>Total expenses</strong></td><td style=\"text-align:right;font-weight:600\">(${util().formatCurrency(expenses)})</td></tr>\r\n      <tr style=\"border-top:2px solid var(--ims-border);font-size:15px\"><td><strong>Net profit / (loss)</strong></td><td style=\"text-align:right;font-weight:700;color:${net>=0?'var(--ims-success)':'var(--ims-danger)'}\">${util().formatCurrency(net)}</td></tr>\r\n    </tbody></table>`;\r\n  }\r\n\r\n  async function rptVAT(body){\r\n    body.innerHTML=dateRangeHtml(90);\r\n    const{from,to}=getDateRange();\r\n    const opts={};\r\n    if(from)opts.gte={date:from};\r\n    if(to)opts.lte={date:to};\r\n    const {data:txs}=await _sel('transactions',{...opts});\r\n    const outputVAT=(txs||[]).filter(t=>t.type==='income').reduce((s,t)=>s+(t.vat_amount||0),0);\r\n    const inputVAT=(txs||[]).filter(t=>t.type==='expense').reduce((s,t)=>s+(t.vat_amount||0),0);\r\n    const net=outputVAT-inputVAT;\r\n    body.innerHTML+=`<table class=\"ims__table\"><tbody>\r\n      <tr><td>Box 1: VAT due on sales</td><td style=\"text-align:right;font-weight:600\">${util().formatCurrency(outputVAT)}</td></tr>\r\n      <tr><td>Box 2: VAT due on acquisitions</td><td style=\"text-align:right\">\u00A30.00</td></tr>\r\n      <tr><td>Box 3: Total VAT due</td><td style=\"text-align:right;font-weight:600\">${util().formatCurrency(outputVAT)}</td></tr>\r\n      <tr><td>Box 4: VAT reclaimed</td><td style=\"text-align:right;font-weight:600\">${util().formatCurrency(inputVAT)}</td></tr>\r\n      <tr style=\"border-top:2px solid var(--ims-border)\"><td><strong>Box 5: Net VAT</strong></td><td style=\"text-align:right;font-weight:700;color:${net>0?'var(--ims-danger)':'var(--ims-success)'}\">${util().formatCurrency(Math.abs(net))} ${net>0?'(payable)':'(refund)'}</td></tr>\r\n    </tbody></table>`;\r\n  }\r\n\r\n  async function rptCashFlow(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={order:{col:'date'}};\r\n    if(from)opts.gte={date:from};\r\n    if(to)opts.lte={date:to};\r\n    const {data:txs}=await _sel('transactions',{...opts});\r\n    const byWeek={};\r\n    (txs||[]).forEach(t=>{\r\n      const d=new Date(t.date);\r\n      const wk=`${d.getFullYear()}-W${Math.ceil((d.getDate()+new Date(d.getFullYear(),d.getMonth(),1).getDay())/7)}`;\r\n      if(!byWeek[wk])byWeek[wk]={in:0,out:0};\r\n      if(t.type==='income')byWeek[wk].in+=(t.amount||0);\r\n      else byWeek[wk].out+=(t.amount||0);\r\n    });\r\n    const rows=Object.entries(byWeek).sort().map(([w,v])=>[w,util().formatCurrency(v.in),util().formatCurrency(v.out),util().formatCurrency(v.in-v.out)]);\r\n    body.innerHTML+=tbl(['Week','Money in','Money out','Net'],rows);\r\n  }\r\n\r\n  async function rptPayablesAgeing(body){\r\n    const {data:payables}=await _sel('accounts_payable',{select:'amount,paid_amount,due_date,suppliers(name)',neq:{status:'paid'}});\r\n    const rows=(payables||[]).filter(p=>p.due_date).map(p=>{\r\n      const outstanding=(p.amount||0)-(p.paid_amount||0);\r\n      const daysOverdue=util().daysSince(p.due_date);\r\n      const notYetDue=daysOverdue<=0;\r\n      const band=notYetDue?'Not yet due':daysOverdue<=30?'0\u201330d':daysOverdue<=60?'31\u201360d':daysOverdue<=90?'61\u201390d':'90d+';\r\n      return[util().sanitize(p.suppliers?.name||'\u2014'),util().formatDate(p.due_date),util().formatCurrency(outstanding),notYetDue?'\u2014':daysOverdue+'d',`<span class=\"ims__pill ims__pill--${notYetDue?'neutral':daysOverdue>60?'danger':daysOverdue>30?'warning':'neutral'}\">${band}</span>`];\r\n    }).sort((a,b)=>parseInt(b[3])-parseInt(a[3])||0);\r\n    body.innerHTML=tbl(['Supplier','Due date','Outstanding','Age','Band'],rows,'No outstanding payables');\r\n  }\r\n\r\n  async function rptReceivablesAgeing(body){\r\n    const {data:receivables}=await _sel('accounts_receivable',{select:'amount,paid_amount,due_date,status,customers(business_name)',neq:{status:'paid'}});\r\n    const rows=(receivables||[]).filter(r=>r.status!=='provisional'&&r.due_date).map(r=>{\r\n      const outstanding=(r.amount||0)-(r.paid_amount||0);\r\n      const daysOverdue=util().daysSince(r.due_date);\r\n      const notYetDue=daysOverdue<=0;\r\n      const band=notYetDue?'Not yet due':daysOverdue<=30?'0\u201330d':daysOverdue<=60?'31\u201360d':daysOverdue<=90?'61\u201390d':'90d+';\r\n      return[util().sanitize(r.customers?.business_name||'\u2014'),util().formatDate(r.due_date),util().formatCurrency(outstanding),notYetDue?'\u2014':daysOverdue+'d',`<span class=\"ims__pill ims__pill--${notYetDue?'neutral':daysOverdue>60?'danger':daysOverdue>30?'warning':'neutral'}\">${band}</span>`];\r\n    }).sort((a,b)=>parseInt(b[3])-parseInt(a[3])||0);\r\n    body.innerHTML=tbl(['Customer','Due date','Outstanding','Age','Band'],rows,'No outstanding receivables');\r\n  }\r\n\r\n  async function rptCustomerStatement(body){\r\n    const {data:customers}=await _sel('customers',{order:{col:'business_name'}});\r\n    if(!customers?.length){body.innerHTML='<div class=\"ims__empty\"><i class=\"ti ti-users\"></i><p>No customers found</p></div>';return;}\r\n    const opts=(customers||[]).map(c=>`<option value=\"${c.id}\">${util().sanitize(c.business_name)}</option>`).join('');\r\n    body.innerHTML=`\r\n      <div class=\"ims__form-group\" style=\"margin-bottom:14px\">\r\n        <label class=\"ims__label\">Select customer</label>\r\n        <select class=\"ims__select\" id=\"ims-stmt-cust\" onchange=\"window.IMS_REPORTS.loadCustomerStatement()\"><option value=\"\">Choose customer...</option>${opts}</select>\r\n      </div>\r\n      <div id=\"ims-stmt-body\"></div>`;\r\n  }\r\n\r\n  async function loadCustomerStatement(){\r\n    const id=document.getElementById('ims-stmt-cust')?.value;\r\n    const body=document.getElementById('ims-stmt-body');\r\n    if(!id||!body)return;\r\n    const {data:orders}=await _sel('orders',{select:'order_number,total_value,status,created_at',eq:{customer_id:id},order:{col:'created_at',asc:false}});\r\n    const {data:receivables}=await _sel('accounts_receivable',{select:'amount,paid_amount,created_at,status',eq:{customer_id:id},order:{col:'created_at',asc:false},noCompanyFilter:true});\r\n    const totalSpend=(orders||[]).reduce((s,o)=>s+(o.total_value||0),0);\r\n    const outstanding=(receivables||[]).filter(r=>r.status!=='paid').reduce((s,r)=>s+((r.amount||0)-(r.paid_amount||0)),0);\r\n    body.innerHTML=`<div style=\"display:flex;gap:12px;margin-bottom:14px\">\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Total orders</div><div class=\"ims__stat-value\" style=\"font-size:18px\">${(orders||[]).length}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Total spend</div><div class=\"ims__stat-value ims__stat-value--success\" style=\"font-size:18px\">${util().formatCurrency(totalSpend)}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Outstanding</div><div class=\"ims__stat-value ims__stat-value--${outstanding>0?'danger':''}\" style=\"font-size:18px\">${util().formatCurrency(outstanding)}</div></div>\r\n    </div>`+tbl(['Order #','Value','Status','Date'],(orders||[]).map(o=>[util().sanitize(o.order_number),util().formatCurrency(o.total_value),util().pill(o.status),util().formatDate(o.created_at)]));\r\n  }\r\n\r\n  async function rptSupplierStatement(body){\r\n    const {data:suppliers}=await _sel('suppliers',{order:{col:'name'}});\r\n    const opts=(suppliers||[]).map(s=>`<option value=\"${s.id}\">${util().sanitize(s.name)}</option>`).join('');\r\n    body.innerHTML=`\r\n      <div class=\"ims__form-group\" style=\"margin-bottom:14px\">\r\n        <label class=\"ims__label\">Select supplier</label>\r\n        <select class=\"ims__select\" id=\"ims-sup-stmt\" onchange=\"window.IMS_REPORTS.loadSupplierStatement()\"><option value=\"\">Choose supplier...</option>${opts}</select>\r\n      </div><div id=\"ims-sup-stmt-body\"></div>`;\r\n  }\r\n\r\n  async function loadSupplierStatement(){\r\n    const id=document.getElementById('ims-sup-stmt')?.value;\r\n    const body=document.getElementById('ims-sup-stmt-body');\r\n    if(!id||!body)return;\r\n    const {data:pos}=await _sel('purchase_orders',{select:'po_number,total_value,status,created_at',eq:{supplier_id:id},order:{col:'created_at',asc:false}});\r\n    const {data:payables}=await _sel('accounts_payable',{select:'amount,paid_amount,status',eq:{supplier_id:id},noCompanyFilter:true});\r\n    const totalOrdered=(pos||[]).reduce((s,p)=>s+(p.total_value||0),0);\r\n    const outstanding=(payables||[]).filter(p=>p.status!=='paid').reduce((s,p)=>s+((p.amount||0)-(p.paid_amount||0)),0);\r\n    body.innerHTML=`<div style=\"display:flex;gap:12px;margin-bottom:14px\">\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Total POs</div><div class=\"ims__stat-value\" style=\"font-size:18px\">${(pos||[]).length}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Total ordered</div><div class=\"ims__stat-value\" style=\"font-size:18px\">${util().formatCurrency(totalOrdered)}</div></div>\r\n      <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Outstanding</div><div class=\"ims__stat-value ims__stat-value--${outstanding>0?'warning':''}\" style=\"font-size:18px\">${util().formatCurrency(outstanding)}</div></div>\r\n    </div>`+tbl(['PO #','Value','Status','Date'],(pos||[]).map(p=>[util().sanitize(p.po_number),util().formatCurrency(p.total_value),util().pill(p.status),util().formatDate(p.created_at)]));\r\n  }\r\n\r\n  async function rptExpenseBreakdown(body){\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={eq:{type:'expense'},order:{col:'date',asc:false}};\r\n    if(from)opts.gte={date:from};\r\n    if(to)opts.lte={date:to};\r\n    const {data:txs}=await _sel('transactions',{...opts});\r\n    const byCat=(txs||[]).reduce((acc,t)=>{acc[t.category]=(acc[t.category]||0)+(t.amount||0);return acc;},{});\r\n    const total=Object.values(byCat).reduce((s,v)=>s+v,0);\r\n    const rows=Object.entries(byCat).sort((a,b)=>b[1]-a[1]).map(([cat,amt])=>[util().sanitize(cat),util().formatCurrency(amt),total?((amt/total)*100).toFixed(1)+'%':'0%']);\r\n    body.innerHTML+=tbl(['Category','Amount','% of total'],rows,'No expense records');\r\n  }\r\n\r\n  async function rptGrossMarginProduct(body){\r\n    if(!window.SM.AUTH.canSeeCost()){body.innerHTML=`<div class=\"ims__coming-soon\"><i class=\"ti ti-lock\"></i><h3>Restricted</h3><p>Gross margin reports are visible to Admin and Import Manager only.</p></div>`;return;}\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'id'};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    const orderIds=(orders||[]).map(o=>o.id);\r\n    if(!orderIds.length){body.innerHTML+=tbl(['SKU','Product','Units','Revenue','Cost','Gross margin','Margin %'],[]);return;}\r\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\r\n    const {data:items}=await _inChunks('order_items','id,quantity,total_price,cost_price,product_name,sku','order_id',orderIds);\r\n    const byProd={};\r\n    (items||[]).forEach(i=>{const k=i.sku||i.product_name||'\u2014';if(!byProd[k])byProd[k]={name:i.product_name||i.sku,sku:i.sku,units:0,revenue:0,cost:0};byProd[k].units+=(i.quantity||0);byProd[k].revenue+=(i.total_price||0);byProd[k].cost+=(i.cost_price||0)*(i.quantity||0);});\r\n    const rows=Object.values(byProd).sort((a,b)=>b.revenue-a.revenue).map(p=>{const margin=p.revenue-p.cost;const pct=p.revenue?((margin/p.revenue)*100).toFixed(1):0;return[util().sanitize(p.sku||'\u2014'),util().sanitize(p.name||'\u2014'),p.units,util().formatCurrency(p.revenue),util().formatCurrency(p.cost),util().formatCurrency(margin),pct+'%'];});\r\n    body.innerHTML+=tbl(['SKU','Product','Units','Revenue','Cost','Gross margin','Margin %'],rows);\r\n  }\r\n\r\n  async function rptGrossMarginChannel(body){\r\n    if(!window.SM.AUTH.canSeeCost()){body.innerHTML=`<div class=\"ims__coming-soon\"><i class=\"ti ti-lock\"></i><h3>Restricted</h3><p>Gross margin reports are visible to Admin and Import Manager only.</p></div>`;return;}\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'id,total_value,platforms(name)'};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    const orderIds=(orders||[]).map(o=>o.id);\r\n    if(!orderIds.length){body.innerHTML+=tbl(['Platform','Revenue','Cost','Gross margin','Margin %'],[]);return;}\r\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\r\n    const {data:items}=await _inChunks('order_items','id,order_id,cost_price,quantity','order_id',orderIds);\r\n    const itemsByOrder={};\r\n    (items||[]).forEach(i=>{if(!itemsByOrder[i.order_id])itemsByOrder[i.order_id]=[];itemsByOrder[i.order_id].push(i);});\r\n    const byPlat={};\r\n    (orders||[]).forEach(o=>{const p=o.platforms?.name||'Unknown';if(!byPlat[p])byPlat[p]={revenue:0,cost:0};byPlat[p].revenue+=(o.total_value||0);(itemsByOrder[o.id]||[]).forEach(i=>{byPlat[p].cost+=((i.cost_price||0)*(i.quantity||0));});});\r\n    const rows=Object.entries(byPlat).sort((a,b)=>b[1].revenue-a[1].revenue).map(([p,v])=>{const m=v.revenue-v.cost;const pct=v.revenue?((m/v.revenue)*100).toFixed(1):0;return[util().sanitize(p),util().formatCurrency(v.revenue),util().formatCurrency(v.cost),util().formatCurrency(m),pct+'%'];});\r\n    body.innerHTML+=tbl(['Platform','Revenue','Cost','Gross margin','Margin %'],rows);\r\n  }\r\n\r\n  // All courier claims, open and closed, with the outcome. This is part of\r\n  // the claims history: finished cases leave Logistics > Lost Orders and\r\n  // are found here and in Accounts > Claims. It reads the official columns\r\n  // (claim_ref, amount_claimed, amount_settled) and falls back to the\r\n  // older ones (claim_reference, items_value, settled_amount) for older\r\n  // rows. It used to read only the older ones, so a claim settled from\r\n  // Lost Orders (for example CLM-00002) showed no settled amount.\r\n  async function rptClaimsLog(body){\r\n    const {data:claims}=await _sel('claims',{\r\n      select:'id,claim_ref,claim_reference,courier_claim_ref,claim_type,amount_claimed,items_value,status,raised_at,settled_at,rejected_at,rejection_reason,amount_settled,settled_amount,orders(order_number),couriers(name)',\r\n      order:{col:'raised_at',asc:false}\r\n    });\r\n    const LABELS={raised:'Raised',acknowledged:'Acknowledged',escalated_14:'Escalated',overdue_30:'Overdue',\r\n      settled:'Settled',rejected:'Rejected',recovered:'Parcel found',written_off:'Written off'};\r\n    const PILLS={raised:'warning',acknowledged:'info',escalated_14:'danger',overdue_30:'danger',\r\n      settled:'success',rejected:'danger',recovered:'success',written_off:'neutral'};\r\n    const CLOSED=['settled','rejected','recovered','written_off'];\r\n    const list=claims||[];\r\n    let open=0, claimed=0, settledTotal=0, writtenOff=0;\r\n    const rows=list.map(c=>{\r\n      const value=parseFloat(c.amount_claimed ?? c.items_value)||0;\r\n      const settled=c.amount_settled ?? c.settled_amount;\r\n      const closedAt=c.settled_at||c.rejected_at||null;\r\n      const ref=c.claim_ref||c.claim_reference;\r\n      claimed+=value;\r\n      if(!CLOSED.includes(c.status)) open++;\r\n      if(settled!=null) settledTotal+=parseFloat(settled)||0;\r\n      if(c.status==='rejected'||c.status==='written_off') writtenOff+=value;\r\n      const note=(c.status==='rejected'||c.status==='written_off')?(c.rejection_reason||''):'';\r\n      return [\r\n        ref?util().sanitize(ref):(c.status==='written_off'?'No claim':'-'),\r\n        util().sanitize(c.courier_claim_ref||'-'),\r\n        util().sanitize(c.orders?.order_number||'-'),\r\n        util().sanitize(c.couriers?.name||'-'),\r\n        c.claim_type==='damaged'?'Damaged':'Lost',\r\n        util().formatCurrency(value),\r\n        util().formatDate(c.raised_at),\r\n        `<span class=\"ims__pill ims__pill--${PILLS[c.status]||'neutral'}\">${util().sanitize(LABELS[c.status]||c.status)}</span>`,\r\n        settled!=null?util().formatCurrency(settled):'-',\r\n        closedAt?util().formatDate(closedAt):'-',\r\n        util().sanitize(note)\r\n      ];\r\n    });\r\n    const summary=list.length?`<div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:12px\"><i class=\"ti ti-info-circle\"></i><span><strong>${list.length}</strong> claim(s): <strong>${open}</strong> open. Claimed ${util().formatCurrency(claimed)}, settled ${util().formatCurrency(settledTotal)}, written off ${util().formatCurrency(writtenOff)}.</span></div>`:'';\r\n    body.innerHTML=summary+tbl(['Claim ref','Courier ref','Order #','Courier','Type','Claim value','Raised','Status','Settled','Closed','Note'],rows,'No claims');\r\n  }\r\n\r\n  // \u2500\u2500\u2500 LOGISTICS REPORTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  async function rptCourierPerf(body){\r\n    // Classify by orders.status, not shipments.status \u2014 shipments has no\r\n    // distinct 'lost' value (it falls back to 'failed' there), so lost\r\n    // parcels were being counted as generic delivery failures. Logistics'\r\n    // own buildShipmentsStats already classifies by orders.status for\r\n    // this same reason.\r\n    const {data:shipments}=await _sel('shipments',{select:'orders(status),couriers(name)',eq:{ship_mode:'courier',is_return_collection:false}});   // delivery performance: return collections left out\r\n    const byCourier={};\r\n    (shipments||[]).forEach(s=>{\r\n      const c=s.couriers?.name||'Unknown';\r\n      if(!byCourier[c])byCourier[c]={total:0,delivered:0,failed:0,lost:0};\r\n      byCourier[c].total++;\r\n      const orderStatus=s.orders?.status;\r\n      if(orderStatus==='delivered')byCourier[c].delivered++;\r\n      else if(orderStatus==='failed_delivery')byCourier[c].failed++;\r\n      else if(orderStatus==='lost')byCourier[c].lost++;\r\n    });\r\n    const rows=Object.entries(byCourier).sort((a,b)=>b[1].total-a[1].total).map(([c,v])=>{const rate=v.total?((v.delivered/v.total)*100).toFixed(1):0;return[util().sanitize(c),v.total,v.delivered,v.failed,v.lost,`<span style=\"color:${rate>=95?'var(--ims-success)':rate>=80?'var(--ims-warning)':'var(--ims-danger)'};font-weight:600\">${rate}%</span>`];});\r\n    body.innerHTML=`<div class=\"ims__alert ims__alert--info\"><i class=\"ti ti-info-circle\"></i><span>Courier deliveries only \u2014 own truck performance is in a separate report.</span></div>`+\r\n      tbl(['Courier','Total shipments','Delivered','Failed','Lost','Success rate'],rows,'No courier shipments');\r\n  }\r\n\r\n  async function rptOwnTruckPerf(body){\r\n    const {data:manifests}=await _sel('manifests',{select:'status,manifest_number,drivers(name),manifest_items(delivery_status)',order:{col:'created_at',asc:false}});\r\n    const rows=(manifests||[]).map(m=>{\r\n      const items=m.manifest_items||[];\r\n      const delivered=items.filter(i=>i.delivery_status==='delivered').length;\r\n      const failed=items.filter(i=>i.delivery_status==='failed').length;\r\n      const total=items.length;\r\n      const rate=total?((delivered/total)*100).toFixed(0):0;\r\n      return[util().sanitize(m.manifest_number),util().sanitize(m.drivers?.name||'\u2014'),total,delivered,failed,rate+'%',util().pill(m.status)];\r\n    });\r\n    body.innerHTML=tbl(['Manifest','Driver','Stops','Delivered','Failed','Success rate','Status'],rows,'No own truck manifests');\r\n  }\r\n\r\n  async function rptManifestHistory(body){\r\n    const {data:manifests}=await _sel('manifests',{select:'manifest_number,status,dispatched_at,drivers(name),vehicles(registration),manifest_items(delivery_status)',order:{col:'dispatched_at',asc:false}});\r\n    const rows=(manifests||[]).map(m=>{const items=m.manifest_items||[];const d=items.filter(i=>i.delivery_status==='delivered').length;return[util().sanitize(m.manifest_number),util().sanitize(m.drivers?.name||'\u2014'),util().sanitize(m.vehicles?.registration||'\u2014'),m.dispatched_at?util().formatDate(m.dispatched_at):'\u2014',items.length,d,util().pill(m.status)];});\r\n    body.innerHTML=tbl(['Manifest','Driver','Vehicle','Date','Stops','Delivered','Status'],rows);\r\n  }\r\n\r\n  async function rptCourierCost(body){\r\n    const {data:shipments}=await _sel('shipments',{select:'charge_amount,weight_actual,weight_vol,weight_charged,couriers(name)',eq:{ship_mode:'courier'}});\r\n    const byCourier={};\r\n    (shipments||[]).forEach(s=>{const c=s.couriers?.name||'Unknown';if(!byCourier[c])byCourier[c]={count:0,total:0,vol:0,actual:0};byCourier[c].count++;byCourier[c].total+=(s.charge_amount||0);if((s.weight_vol||0)>(s.weight_actual||0))byCourier[c].vol++;else byCourier[c].actual++;});\r\n    const rows=Object.entries(byCourier).sort((a,b)=>b[1].total-a[1].total).map(([c,v])=>[util().sanitize(c),v.count,util().formatCurrency(v.total),util().formatCurrency(v.count?v.total/v.count:0),v.vol+' vol / '+v.actual+' actual']);\r\n    body.innerHTML=tbl(['Courier','Shipments','Total spend','Avg per parcel','Charge basis'],rows,'No courier cost data');\r\n  }\r\n\r\n  async function rptPriceOverrides(body){\r\n    if(!window.SM.AUTH.isAdmin()&&!window.SM.AUTH.canSeeCost()){\r\n      body.innerHTML=`<div class=\"ims__coming-soon\"><i class=\"ti ti-lock\"></i><h3>Restricted</h3><p>Price override log is visible to Admin only.</p></div>`;return;\r\n    }\r\n    body.innerHTML=dateRangeHtml();\r\n    const{from,to}=getDateRange();\r\n    const opts={select:'id',order:{col:'created_at',asc:false}};\r\n    if(from)opts.gte={created_at:from+'T00:00:00'};\r\n    if(to)opts.lte={created_at:to+'T23:59:59'};\r\n    opts.eq={has_price_override:true};\r\n    const {data:orders}=await _sel('orders',opts);\r\n    const orderIds=(orders||[]).map(o=>o.id);\r\n    if(!orderIds.length){\r\n      body.innerHTML+=`<div class=\"ims__alert ims__alert--success\" style=\"margin-top:14px\"><i class=\"ti ti-check\"></i><span>No price overrides in this period \u2014 all orders used standard catalogue prices.</span></div>`;\r\n      return;\r\n    }\r\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\r\n    const {data:items}=await _inChunks('order_items','id,order_id,product_name,sku,quantity,unit_price,standard_price,override_pct,override_reason,price_overridden','order_id',orderIds,q=>q.eq('price_overridden',true));\r\n\r\n    // Get order details\r\n    const {data:orderDetails}=await _sel('orders',{\r\n      select:'id,order_number,customer_name,created_at,platforms(name)',\r\n      in:{id:orderIds},noCompanyFilter:true\r\n    });\r\n    const orderMap={};\r\n    (orderDetails||[]).forEach(o=>{orderMap[o.id]=o;});\r\n\r\n    const rows=(items||[]).map(i=>{\r\n      const o=orderMap[i.order_id];\r\n      const direction=i.override_pct<0?'danger':'success';\r\n      return [\r\n        util().sanitize(o?.order_number||'\u2014'),\r\n        util().formatDate(o?.created_at),\r\n        util().sanitize(o?.customer_name||'\u2014'),\r\n        util().sanitize(o?.platforms?.name||'\u2014'),\r\n        util().sanitize(i.product_name||'\u2014'),\r\n        util().sanitize(i.sku||'\u2014'),\r\n        i.quantity,\r\n        util().formatCurrency(i.standard_price),\r\n        util().formatCurrency(i.unit_price),\r\n        `<span style=\"color:var(--ims-${direction});font-weight:600\">${i.override_pct>0?'+':''}${(i.override_pct||0).toFixed(1)}%</span>`,\r\n                util().formatCurrency((i.unit_price-i.standard_price)*(i.quantity||1)),\r\n        util().sanitize(i.override_reason||'\u2014')\r\n      ];\r\n    });\r\n\r\n        // Charged minus standard: negative = discounts given (revenue below\r\n    // standard), positive = premiums charged. This matches the sign of\r\n    // override_pct and the red/green colouring on each row. The previous\r\n    // formula was standard minus charged, which labelled every discount\r\n    // as a premium.\r\n    const totalVariance=(items||[]).reduce((s,i)=>s+((i.unit_price-i.standard_price)*(i.quantity||1)),0);\r\n    body.innerHTML+=`\r\n      <div class=\"ims__alert ims__alert--${totalVariance<0?'danger':'warning'}\" style=\"margin-top:14px;margin-bottom:14px\">\r\n        <i class=\"ti ti-alert-triangle\"></i>\r\n        <span><strong>${rows.length} price override(s)</strong> across ${orderIds.length} order(s) in this period.\r\n        Total revenue variance from standard prices: <strong>${util().formatCurrency(Math.abs(totalVariance))}</strong>\r\n        ${totalVariance<0?' below standard (discounts given)':' above standard (premiums charged)'}</span>\r\n      </div>`+\r\n      tbl(['Order #','Date','Customer','Platform','Product','SKU','Qty','Standard price','Charged price','Variance %','Revenue impact','Reason'],rows);\r\n  }\r\n\r\n  // \u2500\u2500\u2500 PRINT / EXPORT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  // Prints what is on screen, tidied for paper: no controls; the period\r\n  // as a line of text (UK dates); notes as plain text; code-like first\r\n  // columns (SKU, order no., date...) kept on one line; numbers aligned.\r\n  // Styles go on the cells themselves: a <style> block would make the\r\n  // print helper leave out the StockMaestro header.\r\n  function printCurrentReport(){\r\n    const host=document.getElementById('ims-modal-body');\r\n    if(!host)return;\r\n    const uk=v=>{ const m=String(v||'').match(/^(\\d{4})-(\\d{2})-(\\d{2})$/); return m?`${m[3]}/${m[2]}/${m[1]}`:''; };\r\n    const from=document.getElementById('ims-rep-from')?.value, to=document.getElementById('ims-rep-to')?.value;\r\n    const period=host.querySelector('.ims-rep-range')&&(from||to)?`<p style=\"font-size:11px;margin:0 0 8px\"><strong>Period:</strong> ${uk(from)||'start'} to ${uk(to)||'today'}</p>`:'';\r\n    const box=host.cloneNode(true);\r\n    box.querySelectorAll('.no-print,input,button,select').forEach(el=>el.remove());\r\n    box.querySelectorAll('[data-extra]').forEach(el=>{ el.style.display=''; });   // printed columns hidden on the compact screen view\r\n    box.querySelectorAll('.ims__alert').forEach(a=>{ const p=document.createElement('p'); p.setAttribute('style','font-size:11px;color:#444;margin:0 0 8px'); p.textContent=a.textContent.replace(/\\s+/g,' ').trim(); a.replaceWith(p); });\r\n    const addStyle=(el,css)=>el.setAttribute('style',`${el.getAttribute('style')||''};${css}`);\r\n    box.querySelectorAll('table').forEach(t=>{\r\n      addStyle(t,'font-size:10px');\r\n      const first=(t.querySelector('thead th')?.textContent||'').trim();\r\n      const codeFirst=/^(SKU|Order|Date|Invoice|Courier ref|PO|GRN|Container|Claim)/i.test(first);\r\n      t.querySelectorAll('tr').forEach(tr=>{\r\n        const cells=[...tr.children];\r\n        cells.forEach(c=>{ if(c.tagName==='TD') addStyle(c,'border-bottom:1px solid #bdbdbd'); });   // a clear line under every row\r\n        if(codeFirst&&cells[0]) addStyle(cells[0],'white-space:nowrap');\r\n        cells.forEach(c=>{ if(c.tagName==='TD'&&/^[-+]?\u00A3?-?[\\d,]+(\\.\\d+)?%?$/.test(c.textContent.trim())) addStyle(c,'text-align:right'); });\r\n      });\r\n    });\r\n    util().print(period+box.innerHTML,_reportTitle,{landscape:_currentReportId==='clearance_planner'});\r\n  }\r\n  // The table on screen, as plain text (so the file always matches the\r\n  // screen, even if the report was run again while loading).\r\n  function _screenTable(){\r\n    const host=document.getElementById('ims-modal-body');\r\n    const tables=[...(host?.querySelectorAll('table')||[])];\r\n    const t=host?.querySelector('table[data-export]')||tables[tables.length-1]; if(!t) return null;   // the report's main table\r\n    const ths=[...t.querySelectorAll('thead th')];\r\n    const useCol=ths.map(h=>h.textContent.trim()!=='');   // leave out button-only columns (no heading)\r\n    const headers=ths.filter((h,i)=>useCol[i]).map(h=>h.textContent.replace(/\\s+/g,' ').trim());\r\n    const rows=[...t.querySelectorAll('tbody tr')].map(tr=>[...tr.children].filter((c,i)=>useCol[i]!==false).map(c=>c.textContent.replace(/\\s+/g,' ').trim()));\r\n    return headers.length?{headers,rows}:null;\r\n  }\r\n\r\n  function exportCurrentCSV(){\r\n    const shown=_screenTable();\r\n    if(shown){ util().exportCSV(shown.headers,shown.rows,_reportTitle.toLowerCase().replace(/\\s/g,'_')); return; }\r\n    if(!_reportHeaders.length){ui().toast('No data to export','warning');return;}\r\n    const plainRows=_reportData.map(row=>row.map(cell=>{\r\n      const tmp=document.createElement('div');\r\n      tmp.innerHTML=String(cell??'');   // a 0 stays 0 (it used to export as an empty cell)\r\n      return tmp.textContent||tmp.innerText||'';\r\n    }));\r\n    util().exportCSV(_reportHeaders,plainRows,_reportTitle.toLowerCase().replace(/\\s/g,'_'));\r\n  }\r\n\r\n  window.addEventListener('ims:panel',e=>{if(e.detail.panel==='reports')load();});\r\n  window.IMS_REPORTS={load,filterReports,runReport,refreshCurrentReport,setSlowShowEmpty,setClearance,clearanceRemove,clearanceRestoreAll,clearancePickChanged,clearancePickAll,clearanceRemoveSelected,loadCustomerStatement,loadSupplierStatement,printCurrentReport,exportCurrentCSV};\r\n})();"],
  "mappings": "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",
  "names": ["unlisted", "red"]
}
