{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/ims-dashboard.js?bust=20260531"],
  "sourcesContent": ["// StockMaestro Dashboard v3.0 \u2014 Redesigned (Phase 4)\r\n(function () {\r\n  'use strict';\r\n\r\n  // window.IMS is a confusing alias for the whole window.SM namespace\r\n  // (set as `window.IMS = window.SM` in ims-core.js) \u2014 NOT the actual\r\n  // config object with delayedDays/appName on it, which lives at\r\n  // window.SM.IMS instead. Every bare `IMS.delayedDays` reference in\r\n  // this file was silently resolving to the wrong object (producing\r\n  // \"undefined\"), since this module never destructured the real one.\r\n  const { IMS } = window.SM;\r\n\r\n  // Consistent color assignment for platform channel badges \u2014 known\r\n  // platforms get deliberate, recognizable colors; anything else falls\r\n  // back to a stable hash-based color so it's still consistent run to\r\n  // run, never random.\r\n  const CHANNEL_COLORS = {\r\n    'amazon uk': '#F59E0B', 'amazon': '#F59E0B',\r\n    'ebay uk': '#7C3AED', 'ebay': '#7C3AED',\r\n    'temu': '#64748B',\r\n    'tiktok shop': '#EC4899', 'tiktok': '#EC4899',\r\n    'tesco': '#10B981',\r\n    'b&q / tradepoint': '#0EA5E9', 'b&q': '#0EA5E9',\r\n    'retailer / wholesaler': '#2563EB', 'wholesale': '#2563EB',\r\n    'website / own store': '#475569', 'website': '#475569'\r\n  };\r\n  function channelColor(name) {\r\n    const key = (name || '').toLowerCase().trim();\r\n    if (CHANNEL_COLORS[key]) return CHANNEL_COLORS[key];\r\n    let hash = 0;\r\n    for (let i = 0; i < key.length; i++) hash = key.charCodeAt(i) + ((hash << 5) - hash);\r\n    const palette = ['#F59E0B','#7C3AED','#64748B','#EC4899','#0EA5E9','#2563EB','#10B981','#475569'];\r\n    return palette[Math.abs(hash) % palette.length];\r\n  }\r\n  function avatarColor(name) {\r\n    const palette = ['#F59E0B','#7C3AED','#2563EB','#10B981','#EF4444','#0EA5E9','#EC4899'];\r\n    let hash = 0;\r\n    const key = (name || '?').toLowerCase();\r\n    for (let i = 0; i < key.length; i++) hash = key.charCodeAt(i) + ((hash << 5) - hash);\r\n    return palette[Math.abs(hash) % palette.length];\r\n  }\r\n\r\n  let _trendChartInst = null, _marketChartInst = null;\r\n  let _lastOrders = [];       // cached from the last load(), so range-switching recomputes instantly without re-querying\r\n  let _trendRangeDays = 30;   // currently selected trend chart range\r\n\r\n  async function load() {\r\n    const { AUTH, DB, UI, UTIL } = window.SM;\r\n\r\n    // Orders & revenue trend (totals, avg order value, best day) is\r\n    // commercially sensitive at a glance \u2014 restrict it to Admin/Super\r\n    // Admin only, matching how other admin-only areas are gated\r\n    // elsewhere in the app.\r\n    const trendPanel = document.getElementById('ims-dash-trend-panel');\r\n    if (trendPanel) trendPanel.style.display = AUTH.isAdmin() ? '' : 'none';\r\n\r\n    let companyId = AUTH.company?.id;\r\n    if (!companyId) {\r\n      for (let i = 0; i < 10; i++) {\r\n        await new Promise(r => setTimeout(r, 300));\r\n        companyId = AUTH.company?.id;\r\n        if (companyId) break;\r\n      }\r\n    }\r\n    if (!companyId) { console.warn('[Dashboard] Company not loaded after retries'); return; }\r\n\r\n    UI.loading('ims-dash-stats', 'Loading stats...');\r\n\r\n    try {\r\n      const safeQuery = async (table, opts) => {\r\n        try {\r\n          const timeout = new Promise(r => setTimeout(() => r({ data: [], error: null }), 5000));\r\n          const query = DB.select(table, opts);\r\n          return await Promise.race([query, timeout]);\r\n        } catch (e) { return { data: [], error: e }; }\r\n      };\r\n\r\n      const canSeeCost = AUTH.canSeeCost();\r\n\r\n      const queries = [\r\n        safeQuery('orders', {\r\n          select: 'id,status,dispatched_at,total_value,created_at,order_number,customer_name,fulfillment_type,platforms(name)',\r\n          order: { col: 'created_at', asc: false }\r\n        }),\r\n        safeQuery('stock_levels', {\r\n          select: 'quantity,reserved_qty,product_id,warehouse_id,products(name,sku,reorder_threshold)'\r\n        }),\r\n        safeQuery('imports', { select: 'id,status,container_number,eta' }),\r\n        safeQuery('claims', { select: 'id,status' }),\r\n        safeQuery('accounts_payable', { select: 'amount,paid_amount', neq: { status: 'paid' } }),\r\n        safeQuery('logistics_jobs', { select: 'id,status,job_type', eq: { status: 'unassigned' } }),\r\n        safeQuery('orders', {\r\n          select: 'id,status,delivery_method,fulfillment_type',\r\n          eq: { fulfillment_type: 'dropship', delivery_method: 'self_arrange' }\r\n        }),\r\n        safeQuery('orders', {\r\n          select: 'id,payment_status,unpaid_expires_at',\r\n          eq: { payment_status: 'unpaid', fulfillment_type: 'retail' }\r\n        }),\r\n        safeQuery('deals', { select: 'id,name,valid_to,is_active', eq: { is_active: true } })\r\n      ];\r\n      // Only query cost prices for users permitted to see them \u2014 matches\r\n      // AUTH.canSeeCost() gating already used elsewhere in the app\r\n      // (Inventory, Purchases, Reports).\r\n      if (canSeeCost) {\r\n        queries.push(safeQuery('product_prices', {\r\n          select: 'product_id,price', eq: { price_type: 'cost' }, is: { platform_id: null }, noCompanyFilter: true\r\n        }));\r\n      }\r\n\r\n      const results = await Promise.all(queries);\r\n      const [ordersRes, stockRes, importsRes, claimsRes, payablesRes, logisticsRes, dsOrdersRes, unpaidRes, dealsRes] = results;\r\n      const costRes = canSeeCost ? results[9] : null;\r\n\r\n      const orders = ordersRes.data || [];\r\n      const stock = stockRes.data || [];\r\n      const imports = importsRes.data || [];\r\n      const claims = claimsRes.data || [];\r\n      const payables = payablesRes.data || [];\r\n      const logistics = logisticsRes.data || [];\r\n      const dsOrders = dsOrdersRes.data || [];\r\n      const unpaidOrders = unpaidRes.data || [];\r\n      const deals = dealsRes.data || [];\r\n      const costPrices = costRes?.data || [];\r\n\r\n      const today2 = new Date().toISOString().split('T')[0];\r\n      const activeDeals = deals.filter(d => d.valid_to >= today2);\r\n      const expiringDeals = deals.filter(d => {\r\n        const daysLeft = (new Date(d.valid_to) - new Date()) / 86400000;\r\n        return daysLeft >= 0 && daysLeft <= 3;\r\n      });\r\n\r\n      const today = new Date(); today.setHours(0, 0, 0, 0);\r\n      const tomorrow = new Date(today); tomorrow.setDate(tomorrow.getDate() + 1);\r\n\r\n      // Packed orders hand off to Logistics (they appear in Unassigned Jobs\r\n      // awaiting a courier), so Order Management's default view deliberately\r\n      // excludes them. Counting them here made the KPI unreachable: the card\r\n      // showed 1, you clicked through, and the list was empty.\r\n      const openOrders = orders.filter(o => ['confirmed', 'picking'].includes(o.status) && o.fulfillment_type !== 'dropship');\r\n      const delayedOrders = orders.filter(o => {\r\n        if (o.fulfillment_type === 'dropship') return false;\r\n        if (!o.dispatched_at || o.status !== 'dispatched') return false;\r\n        return Math.floor((new Date() - new Date(o.dispatched_at)) / 86400000) >= IMS.delayedDays;\r\n      });\r\n      const todayDispatches = orders.filter(o => {\r\n        if (!o.dispatched_at || o.fulfillment_type === 'dropship') return false;\r\n        const d = new Date(o.dispatched_at); d.setHours(0, 0, 0, 0);\r\n        return d.getTime() === today.getTime();\r\n      });\r\n      const pendingImports = imports.filter(i => ['ordered', 'in_transit', 'customs'].includes(i.status));\r\n      const grnPending = imports.filter(i => i.status === 'grn_pending');\r\n      const lowStock = stock.filter(s => s.products && s.quantity > 0 && s.quantity <= (s.products.reorder_threshold || 10));\r\n      const outOfStock = stock.filter(s => s.quantity <= 0 && s.products);\r\n      // Overstocked \u2014 per confirmed default: quantity > 5x reorder threshold.\r\n      const overstocked = stock.filter(s => s.products && s.quantity > 5 * (s.products.reorder_threshold || 10));\r\n      const openClaims = claims.filter(c => ['raised', 'acknowledged', 'escalated_14', 'overdue_30'].includes(c.status));\r\n      const totalPayables = payables.reduce((sum, p) => sum + ((p.amount || 0) - (p.paid_amount || 0)), 0);\r\n      const unassignedJobs = logistics.length;\r\n      const selfCollection = dsOrders.filter(o => !['collected', 'cancelled', 'delivered'].includes(o.status)).length;\r\n      const allUnpaid = unpaidOrders.filter(o => !['cancelled', 'refunded'].includes(o.status));\r\n      const expiringToday = allUnpaid.filter(o => o.unpaid_expires_at && new Date(o.unpaid_expires_at) <= tomorrow && new Date(o.unpaid_expires_at) > new Date());\r\n\r\n      // Total inventory value \u2014 cost-gated per confirmed decision.\r\n      let totalStockVal = null;\r\n      if (canSeeCost) {\r\n        const costMap = {};\r\n        costPrices.forEach(cp => { costMap[cp.product_id] = cp.price; });\r\n        totalStockVal = stock.reduce((sum, s) => sum + ((s.quantity || 0) * (costMap[s.product_id] || 0)), 0);\r\n      }\r\n\r\n      // New orders created today \u2014 a real, honest data point for the\r\n      // Open Orders card, rather than a fabricated trend percentage\r\n      // (there's no historical snapshot table to compare current open\r\n      // counts against, so a true trend can't be computed truthfully).\r\n      const newToday = orders.filter(o => {\r\n        if (o.fulfillment_type === 'dropship') return false;\r\n        const d = new Date(o.created_at); d.setHours(0, 0, 0, 0);\r\n        return d.getTime() === today.getTime();\r\n      }).length;\r\n\r\n      // Which delayed orders are actively being chased? Logging a follow-up\r\n      // in the Tracking tab writes an order_tracking_events row but leaves\r\n      // orders.status as 'dispatched' (correctly \u2014 the parcel is still not\r\n      // delivered), so the dashboard previously couldn't tell a chased order\r\n      // from a completely ignored one. A chase counts as \"live\" for 2 days;\r\n      // after that the courier has gone quiet again and it needs re-actioning.\r\n      const RECHASE_DAYS = 2;\r\n      const chasedIds = new Set();\r\n      if (delayedOrders.length) {\r\n        const delayedIds = delayedOrders.map(o => o.id);\r\n        const cutoff = Date.now() - RECHASE_DAYS * 86400000;\r\n\r\n        // Two sources: Logistics' current follow-up flow writes to\r\n        // order_tracking_events, while the retired Order Management flow\r\n        // wrote to courier_followups. Historical chases live in the latter,\r\n        // so both are checked to avoid false \"not yet chased\" warnings.\r\n        const [trackRes, legacyRes] = await Promise.all([\r\n          safeQuery('order_tracking_events', {\r\n            select: 'order_id,created_at',\r\n            eq: { tracking_status: 'Follow-up sent to courier' },\r\n            in: { order_id: delayedIds }\r\n          }),\r\n          safeQuery('courier_followups', {\r\n            select: 'order_id,email_sent_at',\r\n            in: { order_id: delayedIds }\r\n          })\r\n        ]);\r\n\r\n        (trackRes.data || []).forEach(e => {\r\n          if (new Date(e.created_at).getTime() >= cutoff) chasedIds.add(e.order_id);\r\n        });\r\n        (legacyRes.data || []).forEach(e => {\r\n          if (e.email_sent_at && new Date(e.email_sent_at).getTime() >= cutoff) chasedIds.add(e.order_id);\r\n        });\r\n      }\r\n      const unactionedDelayed = delayedOrders.filter(o => !chasedIds.has(o.id));\r\n      const chasedDelayed     = delayedOrders.filter(o =>  chasedIds.has(o.id));\r\n\r\n      _lastOrders = orders;\r\n      renderPriorityStats({ openOrders, delayedOrders, unactionedDelayed, lowStock, outOfStock, allUnpaid, newToday });\r\n      renderTrendChart(orders, _trendRangeDays);\r\n      renderMarketChart(orders);\r\n      renderAttentionStrip({\r\n        unassignedJobs, openClaims, delayedOrders, unactionedDelayed, chasedDelayed,\r\n        grnPending, pendingImports,\r\n        totalPayables, selfCollection, expiringToday, activeDeals, expiringDeals\r\n      });\r\n      renderInventoryHealth({ lowStock, outOfStock, overstocked, totalStockVal, stockTotal: stock.length });\r\n      loadRecentOrdersEnhanced(orders);\r\n\r\n      // Badge shows only Open Orders count \u2014 matching exactly what\r\n      // Order Management's default view displays (confirmed/picking\r\n      // status only) when clicked from the sidebar. Previously this\r\n      // added Delayed Orders too, but delayed orders are 'dispatched'\r\n      // status and never appear in that default view, so the badge\r\n      // number could never match what you'd actually see after clicking.\r\n      UI.updateBadge('ims-badge-orders', openOrders.length);\r\n      UI.updateBadge('ims-badge-imports', pendingImports.length + grnPending.length);\r\n      UI.updateBadge('ims-badge-logistics', unassignedJobs);\r\n\r\n      const alertEl = document.getElementById('ims-dash-alert');\r\n      if (alertEl) {\r\n        // Only warn about orders nobody has chased (or where the last chase\r\n        // is now stale). Warning about orders already being followed up is\r\n        // just noise, and trains people to ignore the banner.\r\n        if (unactionedDelayed.length > 0) {\r\n          alertEl.innerHTML = `\r\n            <div class=\"ims__alert ims__alert--warning\">\r\n              <i class=\"ti ti-alert-triangle\" aria-hidden=\"true\"></i>\r\n              <span><strong>${unactionedDelayed.length} order${unactionedDelayed.length > 1 ? 's' : ''}</strong> dispatched ${IMS.delayedDays}+ days ago with no recent follow-up \u2014 chase the courier and log it in Tracking.${chasedDelayed.length ? ` (${chasedDelayed.length} other${chasedDelayed.length > 1 ? 's' : ''} already being chased.)` : ''}</span>\r\n              <button class=\"ims__alert-action\" onclick=\"window.SM.UI.showPanel('logistics')\">Go to Tracking</button>\r\n            </div>`;\r\n        } else {\r\n          alertEl.innerHTML = '';\r\n        }\r\n      }\r\n    } catch (err) {\r\n      console.error('[Dashboard]', err);\r\n      window.SM.UI.toast('Failed to load dashboard data', 'error');\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500\u2500 PRIORITY KPIs (4 cards only) \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 renderPriorityStats({ openOrders, delayedOrders, unactionedDelayed, lowStock, outOfStock, allUnpaid, newToday }) {\r\n    const { UTIL } = window.SM;\r\n    const el = document.getElementById('ims-dash-stats');\r\n    if (!el) return;\r\n\r\n    const lowStockTotal = lowStock.length + outOfStock.length;\r\n    const cards = [\r\n      {\r\n        label: 'Open orders', value: openOrders.length, click: 'orders-open',\r\n        icon: 'ti-shopping-cart', color: 'var(--ims-accent)', bg: 'var(--ims-accent-bg)',\r\n        sub: newToday > 0 ? `+${newToday} new today` : 'Awaiting dispatch'\r\n      },\r\n      {\r\n        // Value stays the honest total \u2014 the parcels are still undelivered\r\n        // and the money is still at risk, so chasing one doesn't make it\r\n        // disappear. The sub-line carries the actionable number instead.\r\n        label: 'Delayed orders', value: delayedOrders.length, click: 'logistics-delayed',\r\n        icon: 'ti-clock-exclamation',\r\n        color: unactionedDelayed.length > 0 ? 'var(--ims-danger)' : (delayedOrders.length > 0 ? 'var(--ims-warning)' : 'var(--ims-success)'),\r\n        bg: unactionedDelayed.length > 0 ? 'var(--ims-danger-bg)' : (delayedOrders.length > 0 ? 'var(--ims-warning-bg)' : 'var(--ims-success-bg)'),\r\n        sub: delayedOrders.length === 0\r\n          ? `${IMS.delayedDays}+ days, no delivery`\r\n          : (unactionedDelayed.length > 0 ? `${unactionedDelayed.length} not yet chased` : 'All being chased')\r\n      },\r\n      {\r\n        label: 'Low stock items', value: lowStockTotal, click: 'inventory-lowstock',\r\n        icon: 'ti-alert-triangle', color: lowStockTotal > 0 ? 'var(--ims-warning)' : 'var(--ims-success)',\r\n        bg: lowStockTotal > 0 ? 'var(--ims-warning-bg)' : 'var(--ims-success-bg)',\r\n        sub: `${outOfStock.length} out of stock`\r\n      },\r\n      {\r\n        label: 'Unpaid orders', value: allUnpaid.length, click: 'orders-unpaid',\r\n        icon: 'ti-currency-pound', color: allUnpaid.length > 0 ? 'var(--ims-danger)' : 'var(--ims-success)',\r\n        bg: allUnpaid.length > 0 ? 'var(--ims-danger-bg)' : 'var(--ims-success-bg)',\r\n        sub: 'Payment not received'\r\n      }\r\n    ];\r\n\r\n    el.innerHTML = cards.map(c => `\r\n      <div class=\"ims__stat ims__stat--priority ims__stat--clickable\" onclick=\"window.IMS_DASHBOARD.statClick('${c.click}')\" role=\"button\" tabindex=\"0\" title=\"Click to view\">\r\n        <div class=\"ims__stat-top\">\r\n          <div class=\"ims__stat-icon\" style=\"background:${c.bg};color:${c.color}\"><i class=\"ti ${c.icon}\" aria-hidden=\"true\"></i></div>\r\n        </div>\r\n        <div class=\"ims__stat-value\" style=\"font-size:27px\">${c.value}</div>\r\n        <div class=\"ims__stat-sub\">${c.label} <span style=\"color:var(--ims-text-muted)\">\u00B7 ${c.sub}</span></div>\r\n      </div>\r\n    `).join('');\r\n  }\r\n\r\n  // \u2500\u2500\u2500 ORDERS & REVENUE TREND (30 days, real data) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  function renderTrendChart(orders, rangeDays) {\r\n    const { UTIL } = window.SM;\r\n    const canvas = document.getElementById('ims-dash-trend-chart');\r\n    if (!canvas || !window.Chart) return;\r\n    rangeDays = rangeDays || 30;\r\n\r\n    const subEl = document.getElementById('ims-dash-trend-sub');\r\n    if (subEl) subEl.textContent = `Last ${rangeDays} days`;\r\n\r\n    const opsOrders = orders.filter(o => o.fulfillment_type !== 'dropship');\r\n    const now = new Date(); now.setHours(0, 0, 0, 0);\r\n    const days = [];\r\n    for (let i = rangeDays - 1; i >= 0; i--) {\r\n      const d = new Date(now); d.setDate(d.getDate() - i);\r\n      days.push(d);\r\n    }\r\n    const dayKey = d => d.toISOString().split('T')[0];\r\n    const ordersByDay = {}, revenueByDay = {};\r\n    days.forEach(d => { ordersByDay[dayKey(d)] = 0; revenueByDay[dayKey(d)] = 0; });\r\n\r\n    const cutoffCurrent = new Date(now); cutoffCurrent.setDate(cutoffCurrent.getDate() - rangeDays);\r\n    const cutoffPrior = new Date(now); cutoffPrior.setDate(cutoffPrior.getDate() - (rangeDays * 2));\r\n    let last30Count = 0, last30Rev = 0, prior30Count = 0, prior30Rev = 0;\r\n    let bestDay = null, bestDayCount = 0;\r\n\r\n    opsOrders.forEach(o => {\r\n      const created = new Date(o.created_at);\r\n      const key = created.toISOString().split('T')[0];\r\n      if (ordersByDay.hasOwnProperty(key)) {\r\n        ordersByDay[key]++;\r\n        revenueByDay[key] += (o.total_value || 0);\r\n      }\r\n      if (created >= cutoffCurrent) {\r\n        last30Count++; last30Rev += (o.total_value || 0);\r\n        const dayCount = ordersByDay[key] || 0;\r\n        if (dayCount > bestDayCount) { bestDayCount = dayCount; bestDay = created; }\r\n      } else if (created >= cutoffPrior && created < cutoffCurrent) {\r\n        prior30Count++; prior30Rev += (o.total_value || 0);\r\n      }\r\n    });\r\n\r\n    const labels = days.map(d => d.getDate());\r\n    const orderData = days.map(d => ordersByDay[dayKey(d)]);\r\n    const revenueData = days.map(d => Math.round(revenueByDay[dayKey(d)]));\r\n\r\n    if (_trendChartInst) _trendChartInst.destroy();\r\n    const isDark = document.querySelector('.ims__app-wrap')?.getAttribute('data-theme') === 'dark';\r\n    const gridColor = isDark ? '#1D2739' : '#F1F5F9';\r\n    const textColor = isDark ? '#94A3B8' : '#64748B';\r\n    const accentColor = isDark ? '#3B82F6' : '#2563EB';\r\n    const successColor = isDark ? '#34D399' : '#10B981';\r\n\r\n    _trendChartInst = new Chart(canvas, {\r\n      type: 'line',\r\n      data: {\r\n        labels,\r\n        datasets: [\r\n          { label: 'Orders', data: orderData, borderColor: accentColor, backgroundColor: 'transparent', borderWidth: 2.5, tension: .35, pointRadius: 0, yAxisID: 'y' },\r\n          { label: 'Revenue', data: revenueData, borderColor: successColor, backgroundColor: isDark ? 'rgba(52,211,153,0.08)' : 'rgba(16,185,129,0.07)', borderWidth: 2.5, tension: .35, pointRadius: 0, fill: true, yAxisID: 'y1' }\r\n        ]\r\n      },\r\n      options: {\r\n        responsive: true, interaction: { mode: 'index', intersect: false },\r\n        plugins: { legend: { display: false } },\r\n        scales: {\r\n          x: { grid: { display: false }, ticks: { color: textColor, maxTicksLimit: 8, font: { size: 11 } } },\r\n          y: { position: 'left', grid: { color: gridColor }, ticks: { color: textColor, font: { size: 11 } } },\r\n          y1: { position: 'right', grid: { display: false }, ticks: { color: textColor, font: { size: 11 }, callback: v => '\u00A3' + v } }\r\n        }\r\n      }\r\n    });\r\n\r\n    const summaryEl = document.getElementById('ims-dash-trend-summary');\r\n    if (summaryEl) {\r\n      const orderTrendPct = prior30Count > 0 ? Math.round(((last30Count - prior30Count) / prior30Count) * 100) : null;\r\n      const revTrendPct = prior30Rev > 0 ? Math.round(((last30Rev - prior30Rev) / prior30Rev) * 100) : null;\r\n      const avgOrderVal = last30Count > 0 ? last30Rev / last30Count : 0;\r\n      const trendHtml = (pct) => pct === null ? '' : `<div class=\"ims__chart-summary-trend\" style=\"color:${pct >= 0 ? 'var(--ims-success)' : 'var(--ims-danger)'}\">${pct >= 0 ? '\u2191' : '\u2193'} ${Math.abs(pct)}% vs prior ${rangeDays}d</div>`;\r\n      summaryEl.innerHTML = `\r\n        <div class=\"ims__chart-summary-item\">\r\n          <div class=\"ims__chart-summary-label\">Total orders</div>\r\n          <div class=\"ims__chart-summary-value\">${last30Count}</div>\r\n          ${trendHtml(orderTrendPct)}\r\n        </div>\r\n        <div class=\"ims__chart-summary-item\">\r\n          <div class=\"ims__chart-summary-label\">Total revenue</div>\r\n          <div class=\"ims__chart-summary-value\">${UTIL.formatCurrency(last30Rev)}</div>\r\n          ${trendHtml(revTrendPct)}\r\n        </div>\r\n        <div class=\"ims__chart-summary-item\">\r\n          <div class=\"ims__chart-summary-label\">Avg. order value</div>\r\n          <div class=\"ims__chart-summary-value\">${UTIL.formatCurrency(avgOrderVal)}</div>\r\n        </div>\r\n        <div class=\"ims__chart-summary-item\">\r\n          <div class=\"ims__chart-summary-label\">Best day</div>\r\n          <div class=\"ims__chart-summary-value\">${bestDay ? bestDay.toLocaleDateString('en-GB', { day: '2-digit', month: 'short' }) : '\u2014'}</div>\r\n          <div class=\"ims__chart-summary-trend\" style=\"color:var(--ims-text-muted)\">${bestDayCount} order${bestDayCount === 1 ? '' : 's'}</div>\r\n        </div>`;\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500\u2500 SALES BY MARKETPLACE (30 days, real data) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  function renderMarketChart(orders) {\r\n    const { UTIL } = window.SM;\r\n    const canvas = document.getElementById('ims-dash-market-chart');\r\n    const listEl = document.getElementById('ims-dash-market-list');\r\n    if (!canvas || !window.Chart) return;\r\n\r\n    const now = new Date();\r\n    const cutoff30 = new Date(now); cutoff30.setDate(cutoff30.getDate() - 30);\r\n    const recent = orders.filter(o => new Date(o.created_at) >= cutoff30);\r\n\r\n    const byPlatform = {};\r\n    recent.forEach(o => {\r\n      const name = o.fulfillment_type === 'dropship' ? 'Dropship' : (o.platforms?.name || 'Other');\r\n      byPlatform[name] = (byPlatform[name] || 0) + (o.total_value || 0);\r\n    });\r\n    const total = Object.values(byPlatform).reduce((s, v) => s + v, 0);\r\n    const sorted = Object.entries(byPlatform).sort((a, b) => b[1] - a[1]);\r\n\r\n    if (_marketChartInst) _marketChartInst.destroy();\r\n    if (!sorted.length) {\r\n      canvas.style.display = 'none';\r\n      if (listEl) listEl.innerHTML = '<div style=\"font-size:12px;color:var(--ims-text-muted);text-align:center;padding:16px 0\">No orders in the last 30 days</div>';\r\n      return;\r\n    }\r\n    canvas.style.display = '';\r\n\r\n    const labels = sorted.map(([name]) => name);\r\n    const values = sorted.map(([, val]) => val);\r\n    const colors = labels.map(l => channelColor(l));\r\n\r\n    _marketChartInst = new Chart(canvas, {\r\n      type: 'doughnut',\r\n      data: { labels, datasets: [{ data: values, backgroundColor: colors, borderWidth: 0, spacing: 2 }] },\r\n      options: { responsive: true, maintainAspectRatio: false, cutout: '72%', plugins: { legend: { display: false } } }\r\n    });\r\n\r\n    if (listEl) {\r\n      listEl.innerHTML = sorted.map(([name, val]) => {\r\n        const pct = total > 0 ? Math.round((val / total) * 100) : 0;\r\n        return `\r\n          <div class=\"ims__market-row\">\r\n            <span class=\"ims__market-name\">${window.SM.UTIL.sanitize(name)}</span>\r\n            <div class=\"ims__market-track\"><div class=\"ims__market-fill\" style=\"width:${pct}%;background:${channelColor(name)}\"></div></div>\r\n            <span class=\"ims__market-pct\">${pct}%</span>\r\n          </div>`;\r\n      }).join('');\r\n    }\r\n  }\r\n\r\n  // \u2500\u2500\u2500 NEEDS ATTENTION \u2014 signature section \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  // Combines the brief's 5 named items with every other operational\r\n  // stat the previous 14-card layout tracked (Outstanding payables,\r\n  // Ready for collection, Unpaid \u2014 expiring, Active deals) \u2014 per\r\n  // confirmed decision, nothing gets dropped, just re-homed here as\r\n  // compact triage cards instead of full-size KPI tiles.\r\n  function renderAttentionStrip({ unassignedJobs, openClaims, delayedOrders, unactionedDelayed, chasedDelayed, grnPending, pendingImports, totalPayables, selfCollection, expiringToday, activeDeals, expiringDeals }) {\r\n    const { UTIL } = window.SM;\r\n    const el = document.getElementById('ims-dash-attn');\r\n    const totalEl = document.getElementById('ims-dash-attn-total');\r\n    if (!el) return;\r\n\r\n    const items = [\r\n      { num: unassignedJobs, label: 'Unassigned jobs', sub: 'Ready to assign a courier', sev: unassignedJobs > 0 ? 'mid' : 'low', click: 'logistics' },\r\n      { num: openClaims.length, label: 'Open claims', sub: 'With couriers', sev: openClaims.length > 0 ? 'high' : 'low', click: 'accounts' },\r\n      // This strip is specifically \"what needs me to do something\", so the\r\n      // number here is the unactioned count, not the raw delayed total.\r\n      { num: unactionedDelayed.length, label: 'Delayed orders', sub: chasedDelayed.length ? `${chasedDelayed.length} more being chased` : `${IMS.delayedDays}+ days, no delivery`, sev: unactionedDelayed.length > 0 ? 'high' : 'low', click: 'logistics-delayed' },\r\n      { num: grnPending.length, label: 'GRN pending', sub: 'Arrived, awaiting check', sev: grnPending.length > 0 ? 'mid' : 'low', click: 'imports' },\r\n      { num: pendingImports.length, label: 'Pending imports', sub: 'In transit or customs', sev: 'low', click: 'imports' },\r\n      { num: UTIL.formatCurrency(totalPayables), label: 'Outstanding payables', sub: 'Unpaid supplier invoices', sev: totalPayables > 0 ? 'mid' : 'low', click: 'accounts' },\r\n      { num: selfCollection, label: 'Ready for collection', sub: 'Customer self-collection', sev: 'low', click: 'dropship-collection' },\r\n      { num: expiringToday.length, label: 'Unpaid \u2014 expiring', sub: 'Expire within 24h', sev: expiringToday.length > 0 ? 'high' : 'low', click: 'orders-unpaid' },\r\n      { num: activeDeals.length, label: 'Active deals', sub: expiringDeals.length > 0 ? `${expiringDeals.length} expiring soon` : 'All deals current', sev: expiringDeals.length > 0 ? 'mid' : 'low', click: 'deals' }\r\n    ];\r\n\r\n    const totalCount = items.reduce((s, i) => s + (typeof i.num === 'number' ? i.num : 0), 0);\r\n    if (totalEl) totalEl.textContent = `${totalCount} items across ${items.length} areas`;\r\n\r\n    el.innerHTML = items.map(i => `\r\n      <div class=\"ims__attn-card ims__attn-card--${i.sev}\" onclick=\"window.IMS_DASHBOARD.statClick('${i.click}')\" role=\"button\" tabindex=\"0\">\r\n        <div class=\"ims__attn-num\">${i.num}</div>\r\n        <div class=\"ims__attn-label\">${i.label}</div>\r\n        <div class=\"ims__attn-sub\">${i.sub}</div>\r\n      </div>`).join('');\r\n  }\r\n\r\n  // \u2500\u2500\u2500 RECENT ORDERS \u2014 enhanced table \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 loadRecentOrdersEnhanced(orders) {\r\n    const { UTIL } = window.SM;\r\n    const tbody = document.getElementById('ims-dash-orders');\r\n    if (!tbody) return;\r\n\r\n    const recent = orders.slice(0, 10);\r\n    if (!recent.length) {\r\n      tbody.innerHTML = '<tr><td colspan=\"5\" class=\"ims__table-empty\">No orders yet</td></tr>';\r\n      return;\r\n    }\r\n\r\n    tbody.innerHTML = recent.map(o => {\r\n      const isDelayed = UTIL.isDelayed(o);\r\n      const status = isDelayed ? 'delayed' : o.status;\r\n      const channelName = o.fulfillment_type === 'dropship' ? 'Dropship' : (o.platforms?.name || '\u2014');\r\n      const cName = o.customer_name || '\u2014';\r\n      const initials = cName.trim().split(/\\s+/).map(w => w[0]).join('').toUpperCase().slice(0, 2) || '?';\r\n      return `\r\n        <tr class=\"${isDelayed ? 'ims__row--delayed' : ''}\" style=\"cursor:pointer\"\r\n          onclick=\"window.SM.UI.showPanel('orders');setTimeout(()=>window.IMS_ORDERS?.openOrder('${o.id}'),400)\">\r\n          <td>\r\n            <div class=\"ims__cust-cell\">\r\n              <div class=\"ims__cust-avatar\" style=\"background:${avatarColor(cName)}\">${initials}</div>\r\n              <div>\r\n                <div style=\"font-weight:600;font-size:13px\">${UTIL.sanitize(cName)}</div>\r\n                <div class=\"ims__cust-order\">${UTIL.sanitize(o.order_number)}</div>\r\n              </div>\r\n            </div>\r\n          </td>\r\n          <td><span class=\"ims__chan-badge\"><span class=\"ims__chan-dot\" style=\"background:${channelColor(channelName)}\"></span>${UTIL.sanitize(channelName)}</span></td>\r\n          <td style=\"font-weight:600\">${UTIL.formatCurrency(o.total_value)}</td>\r\n          <td>${UTIL.pill(status)}</td>\r\n          <td>\r\n            <div class=\"ims__row-actions\">\r\n              <button onclick=\"event.stopPropagation();window.SM.UI.showPanel('orders');setTimeout(()=>window.IMS_ORDERS?.openOrder('${o.id}'),400)\" title=\"View\"><i class=\"ti ti-eye\"></i></button>\r\n            </div>\r\n          </td>\r\n        </tr>`;\r\n    }).join('');\r\n  }\r\n\r\n  // \u2500\u2500\u2500 INVENTORY HEALTH \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  function renderInventoryHealth({ lowStock, outOfStock, overstocked, totalStockVal, stockTotal }) {\r\n    const { UTIL } = window.SM;\r\n    const el = document.getElementById('ims-dash-health');\r\n    if (!el) return;\r\n\r\n    const healthyCount = Math.max(0, stockTotal - lowStock.length - outOfStock.length - overstocked.length);\r\n    const rows = [\r\n      { label: 'Out of stock', count: outOfStock.length, color: 'var(--ims-danger)' },\r\n      { label: 'Low stock', count: lowStock.length, color: 'var(--ims-warning)' },\r\n      { label: 'Overstocked', count: overstocked.length, color: 'var(--ims-accent)' },\r\n      { label: 'Healthy', count: healthyCount, color: 'var(--ims-success)' }\r\n    ];\r\n    const maxCount = Math.max(1, ...rows.map(r => r.count));\r\n\r\n    el.innerHTML = rows.map((r, i) => `\r\n      <div class=\"ims__health-item\">\r\n        <div class=\"ims__health-top\">\r\n          <span class=\"ims__health-name\"><span class=\"ims__health-dot\" style=\"background:${r.color}\"></span>${r.label}</span>\r\n          <span class=\"ims__health-val\">${r.count} SKU${r.count === 1 ? '' : 's'}</span>\r\n        </div>\r\n        <div class=\"ims__health-track\"><div class=\"ims__health-fill\" style=\"width:${Math.round((r.count / maxCount) * 100)}%;background:${r.color}\"></div></div>\r\n      </div>\r\n      ${i < rows.length - 1 ? '<div class=\"ims__health-divider\"></div>' : ''}\r\n    `).join('') + `\r\n      <div class=\"ims__invval-box\">\r\n        <div>\r\n          <div style=\"font-size:11px;color:var(--ims-text-muted);font-weight:600\">Total inventory value</div>\r\n          <div style=\"font-size:18px;font-weight:800;letter-spacing:-.01em\">${totalStockVal === null ? '\u2014' : UTIL.formatCurrency(totalStockVal)}</div>\r\n        </div>\r\n        ${totalStockVal === null ? '<div style=\"font-size:11px;color:var(--ims-text-muted)\">Restricted to Admin roles</div>' : ''}\r\n      </div>`;\r\n  }\r\n\r\n  // \u2500\u2500\u2500 TREND CHART DATE RANGE \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 setTrendRange(days) {\r\n    _trendRangeDays = days;\r\n    const wrap = document.getElementById('ims-dash-trend-range');\r\n    wrap?.querySelectorAll('button').forEach(b => {\r\n      b.classList.toggle('ims__seg-active', parseInt(b.dataset.days, 10) === days);\r\n    });\r\n    renderTrendChart(_lastOrders, days);\r\n  }\r\n\r\n  // \u2500\u2500\u2500 STAT / CARD CLICK ROUTING \u2014 unchanged from before \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n  function statClick(target) {\r\n    if (target === 'inventory-lowstock') {\r\n      window.SM.UI.showPanel('inventory');\r\n      setTimeout(() => {\r\n        if (!window.IMS_INVENTORY) return;\r\n        window.IMS_INVENTORY.initTabs();\r\n        const tabs = document.getElementById('ims-inv-tabs');\r\n        tabs?.querySelectorAll('.ims__tab').forEach(t => t.classList.remove('ims__tab--active'));\r\n        const stockTab = tabs?.querySelector('[data-tab=\"stock\"]');\r\n        if (stockTab) stockTab.classList.add('ims__tab--active');\r\n        window.IMS_INVENTORY.loadStock().then(() => {\r\n          setTimeout(() => {\r\n            const f = document.getElementById('ims-stk-filter');\r\n            if (f) { f.value = 'low'; window.IMS_INVENTORY.loadStockData(); }\r\n          }, 400);\r\n        });\r\n      }, 400);\r\n    } else if (target === 'dropship-collection') {\r\n      window.SM.UI.showPanel('dropship');\r\n      setTimeout(() => {\r\n        if (!window.IMS_DROPSHIP) return;\r\n        const tabs = document.getElementById('ims-ds-tabs');\r\n        if (tabs) {\r\n          tabs.querySelectorAll('.ims__tab').forEach(t => t.classList.remove('ims__tab--active'));\r\n          const ordersTab = tabs.querySelector('[data-tab=\"orders\"]');\r\n          if (ordersTab) {\r\n            ordersTab.classList.add('ims__tab--active');\r\n            ordersTab.click();\r\n          }\r\n        }\r\n        setTimeout(() => window.IMS_DROPSHIP.loadOrders('self_arrange_pending'), 200);\r\n      }, 400);\r\n    } else if (target === 'orders-delayed') {\r\n      window.SM.UI.showPanel('orders');\r\n      setTimeout(() => {\r\n        const s = document.getElementById('ims-orders-status');\r\n        if (s) { s.value = 'delayed'; s.dispatchEvent(new Event('change')); }\r\n      }, 400);\r\n    } else if (target === 'orders-dispatched-today') {\r\n      window.SM.UI.showPanel('orders');\r\n      setTimeout(() => {\r\n        const s = document.getElementById('ims-orders-status');\r\n        if (s) { s.value = 'dispatched'; s.dispatchEvent(new Event('change')); }\r\n      }, 400);\r\n    } else if (target === 'orders-unpaid') {\r\n      window.SM.UI.showPanel('orders');\r\n      setTimeout(() => {\r\n        if (!window.IMS_ORDERS) return;\r\n        window.IMS_ORDERS.showHistory();\r\n        setTimeout(() => {\r\n          const p = document.getElementById('ims-hist-payment');\r\n          const from = document.getElementById('ims-hist-from');\r\n          if (from) from.value = '';\r\n          if (p) { p.value = 'unpaid'; p.dispatchEvent(new Event('change')); }\r\n        }, 400);\r\n      }, 200);\r\n    } else if (target === 'orders-open') {\r\n      // Explicitly CLEAR the status filter rather than just opening the\r\n      // panel. The dropdown holds whatever was last selected, so arriving\r\n      // from the Delayed card previously left 'delayed' applied and the\r\n      // Open card appeared to show the wrong orders. Blank status is\r\n      // Order Management's own open-orders view.\r\n      window.SM.UI.showPanel('orders');\r\n      setTimeout(() => {\r\n        const s = document.getElementById('ims-orders-status');\r\n        if (s) { s.value = ''; s.dispatchEvent(new Event('change')); }\r\n      }, 400);\r\n    } else if (target === 'logistics-delayed') {\r\n      window.SM.UI.showPanel('logistics');\r\n      setTimeout(() => {\r\n        document.getElementById('ims-log-tabs')\r\n          ?.querySelector('[data-tab=\"tracking\"]')?.click();\r\n        // loadTracking() is async and builds its filter bar only after the\r\n        // query returns, so poll for the control instead of guessing a\r\n        // delay. Clearing the filter afterwards restores the full list.\r\n        const applyFilter = (tries = 0) => {\r\n          const f = document.getElementById('ims-track-filter');\r\n          if (f) {\r\n            f.value = 'delayed';\r\n            window.IMS_LOGISTICS?.filterTracking?.();\r\n          } else if (tries < 20) {\r\n            setTimeout(() => applyFilter(tries + 1), 150);\r\n          }\r\n        };\r\n        applyFilter();\r\n      }, 400);\r\n    } else {\r\n      window.SM.UI.showPanel(target);\r\n    }\r\n  }\r\n\r\n  window.addEventListener('ims:panel', e => {\r\n    if (e.detail.panel === 'dashboard') load();\r\n  });\r\n  window.addEventListener('ims:ready', load);\r\n\r\n  window.IMS_DASHBOARD = { load, statClick, setTrendRange };\r\n\r\n})();"],
  "mappings": "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",
  "names": []
}
