{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/ims-logistics.js?bust=20260705"],
  "sourcesContent": ["// StockMaestro Logistics v2.2 \u2014 Build 3 \u2014 with Tracking Tab\n(function(){\n  'use strict';\n  const db=()=>window.SM.DB, ui=()=>window.SM.UI, util=()=>window.SM.UTIL;\n\n  let _courierCache=null; // cached active couriers list \u2014 avoids a fresh\n                           // network round-trip every time a tracking/\n                           // courier-assignment modal is opened\n\n  async function _getActiveCouriers(){\n    if(_courierCache) return _courierCache;\n    const {data}=await db().select('couriers',{eq:{is_active:true},order:{col:'name'}});\n    _courierCache=data||[];\n    return _courierCache;\n  }\n\n  // \u2500\u2500\u2500 TAB ATTENTION BADGES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // A badge means \"this needs you\", not \"here is how many records exist\".\n  // Shipments, Routes and Fleet are reference/config lists and deliberately\n  // carry no badge - a permanent number on those would train people to\n  // ignore all badges, including the ones that matter.\n  function setTabBadge(tab, count, variant){\n    const el = document.querySelector(`#ims-log-tabs [data-tab=\"${tab}\"]`);\n    if(!el) return;\n    let badge = el.querySelector('.ims__tab-badge');\n    if(!count){ badge?.remove(); return; }\n    if(!badge){ badge = document.createElement('span'); el.appendChild(badge); }\n    badge.className = 'ims__tab-badge' + (variant === 'warn' ? ' ims__tab-badge--warn' : '');\n    badge.textContent = count > 99 ? '99+' : String(count);\n  }\n\n  async function refreshTabBadges(){\n    try {\n      const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n      const [jobsRes, manRes, courRes] = await Promise.all([\n        client.from('logistics_jobs').select('id').eq('status','unassigned'),\n        db().select('manifests',{ select:'id,dispatched_at' }),\n        db().select('couriers',{ select:'id,cs_email,claims_email', eq:{ is_active:true } })\n      ]);\n      setTabBadge('unassigned', (jobsRes.data||[]).length);\n      setTabBadge('manifests',  (manRes.data ||[]).filter(m => !m.dispatched_at).length, 'warn');\n      setTabBadge('couriers',   (courRes.data||[]).filter(c => !c.cs_email || !c.claims_email).length, 'warn');\n    } catch(e){\n      // Badges are cosmetic - never let them break the panel.\n      console.warn('[tab badges]', e);\n    }\n  }\n\n  function initTabs(){\n    const tabs=document.getElementById('ims-log-tabs');\n    if(!tabs)return;\n    // The Services tab is added here, so ims-system.liquid needs no change.\n    if(!tabs.querySelector('[data-tab=\"services\"]')){\n      const svc=document.createElement('div'); svc.className='ims__tab'; svc.dataset.tab='services'; svc.textContent='Services';\n      const after=tabs.querySelector('[data-tab=\"couriers\"]');\n      if(after) after.insertAdjacentElement('afterend',svc); else tabs.appendChild(svc);\n    }\n    // initTabs runs every time Logistics is opened: add the click handlers\n    // once only (they used to stack up, so one click loaded a tab several\n    // times after a few visits).\n    if(tabs.dataset.bound==='1') return;\n    tabs.dataset.bound='1';\n    tabs.querySelectorAll('.ims__tab').forEach(tab=>{\n      tab.addEventListener('click',()=>{\n        tabs.querySelectorAll('.ims__tab').forEach(t=>t.classList.remove('ims__tab--active'));\n        tab.classList.add('ims__tab--active');\n        loadTab(tab.dataset.tab);\n      });\n    });\n  }\n\n  function loadTab(tab){\n    refreshTabBadges();\n    switch(tab){\n      case 'tracking':   loadTracking();   break;\n      case 'unassigned': loadUnassigned(); break;\n      case 'owntruck':   loadOwnTruckQueue(); break;\n      case 'shipments':  loadShipments();  break;\n      case 'manifests':  loadManifests();  break;\n      case 'routes':     loadRoutes();     break;\n      case 'fleet':      loadFleet();      break;\n      case 'couriers':   loadCouriers();   break;\n      case 'services':   loadServices();   break;\n    }\n  }\n\n  // \u2500\u2500\u2500 ALREADY-DELIVERED GUARD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Confirming delivery can be reached from three independent places\n  // (Tracking, a manifest stop, self-collection) with no shared lock\n  // between them. Stock deduction is already protected by its own guard,\n  // but nothing stops the same order being marked delivered twice through\n  // two different screens \u2014 which would still duplicate the delivery\n  // email and the activity log entry. This is checked first in each of\n  // the three delivery-confirmation functions.\n  async function _isAlreadyDelivered(orderId){\n    const { data } = await db().select('orders', {\n      select: 'status', eq: { id: orderId }, maybeSingle: true, noCompanyFilter: true\n    });\n    return data?.status === 'delivered';\n  }\n\n  // \u2500\u2500\u2500 SHARED ACTIVITY LOG HELPER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Readable names for the actions Logistics records. The Orders screen\n  // shows the action exactly as saved, so it is saved readable (the same\n  // style as \"Order created\"). Keep in step with ACTION_LABELS in the\n  // driver-api Edge Function, which records the driver app's actions.\n  const ACTION_LABELS = {\n    dispatched: 'Dispatched',\n    delivered: 'Delivered',\n    delivery_failed: 'Delivery failed',\n    delivery_partial: 'Part delivered',\n    re_attempt_requested: 'Re-attempt requested',\n    status_update: 'Status update',\n    cancelled: 'Order cancelled',\n    tracking_updated: 'Tracking updated',\n    courier_followup: 'Courier chased',\n    marked_lost: 'Marked lost',\n    claim_raised: 'Claim raised',\n    damage_claim_raised: 'Damage claim raised',\n    claim_reminder: 'Claim reminder sent',\n    claim_settled: 'Claim settled',\n    claim_rejected: 'Claim rejected',\n    claim_recovered: 'Parcel found',\n    parcel_returned_damaged: 'Parcel returned damaged',\n    closed_without_claim: 'Closed without claim',\n    queued_own_truck: 'Queued for own van',\n    reassigned_own_truck: 'Moved to own van',\n    back_to_unassigned: 'Back to Unassigned',\n    removed_from_manifest: 'Removed from manifest',\n    return_requested: 'Return requested',\n    return_received: 'Return received',\n    return_collected: 'Return collected',\n    return_pickup_arranged: 'Van pick-up arranged',\n    return_pickup_cancelled: 'Van pick-up cancelled',\n    return_pickup_planned: 'Van pick-up put on a manifest',\n    return_pickup_unplanned: 'Van pick-up taken off a manifest',\n    return_pickup_failed: 'Van pick-up failed',\n    return_collection_booked: 'Courier collection booked',\n    return_collection_updated: 'Courier collection updated',\n    return_collection_cancelled: 'Courier collection cancelled',\n    cod_collected: 'COD collected',\n    cod_bank_transfer: 'COD paid by bank transfer (to confirm)',\n    cod_bank_transfer_confirmed: 'COD bank transfer confirmed',\n    cod_not_collected: 'COD not collected',\n    service_done: 'Service done',\n    service_not_done: 'Service not done'\n  };\n  function _actionLabel(a){\n    if(!a) return a;\n    if(ACTION_LABELS[a]) return ACTION_LABELS[a];\n    // An action without a name yet: \"some_action\" -> \"Some action\".\n    return /_/.test(a) ? a.charAt(0).toUpperCase() + a.slice(1).replace(/_/g, ' ') : a;\n  }\n\n  // Written with the plain client, exactly as the Orders screen writes it.\n  // order_activity_log has no company_id column (an entry belongs to the\n  // company through its order). This used db().insert, which adds\n  // company_id to every row, so the database refused every Logistics entry\n  // and the refusal was never checked: no Logistics activity was ever saved\n  // (found Oct 2026). A refusal is now reported once per session.\n  let _logWarned = false;\n  async function logActivity(orderId, oldStatus, newStatus, action, notes){\n    try {\n      const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n      const user = window.SM.AUTH.user;\n      const { error } = await client.from('order_activity_log').insert({\n        order_id:   orderId,\n        user_id:    user?.id || null,\n        user_name:  user?.name || user?.email || 'System',\n        action:     _actionLabel(action),\n        old_value:  oldStatus ? String(oldStatus) : null,\n        new_value:  newStatus ? String(newStatus) : null,\n        notes:      notes || null,\n        created_at: new Date().toISOString()\n      });\n      if (error) throw error;\n    } catch(e){\n      console.warn('[logActivity] failed:', e.message);\n      if (!_logWarned) {\n        _logWarned = true;\n        ui().toast(`The action was done, but it could not be written to the order's activity log: ${e.message}`, 'warning', 8000);\n      }\n    }\n  }\n\n  // \u2500\u2500\u2500 STOCK DEDUCTION ON DELIVERY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Reservation happens at order creation (reserved_qty) and is held\n  // through picking/packing/despatch. Only once the order is actually\n  // delivered do we touch physical stock: decrement quantity, release\n  // the reservation, and log a 'sale' movement for reporting.\n  async function deductStockOnDelivery(orderId, orderNumber){\n    // Guard against double-deduction \u2014 this can be called more than once\n    // for the same order (Tracking confirm, manifest stop update, and\n    // self-collection all call it independently, with no shared lock).\n    // A 'sale' movement referencing this exact order already existing\n    // means stock was already deducted once; skip silently rather than\n    // deducting twice.\n    const { data: alreadyDeducted } = await db().select('stock_movements', {\n      eq: { reference: orderNumber, movement_type: 'sale' }, limit: 1, noCompanyFilter: true\n    });\n    if (alreadyDeducted?.length) return;\n\n    const { data: ord } = await db().select('orders', {\n      select: 'warehouse_id,fulfillment_type,order_items(product_id,quantity)',\n      eq: { id: orderId }, maybeSingle: true, noCompanyFilter: true\n    });\n\n    // Dropship orders have no warehouse of their own: their units come out\n    // of the partner's allocation warehouse, exactly as on collection\n    // (deductDropshipStock in ims-dropship.js). Before, a van delivery of a\n    // dropship order found no warehouse here and changed nothing.\n    if (ord?.fulfillment_type === 'dropship') {\n      if (!window.IMS_DROPSHIP?.deductDropshipStock) {\n        ui().toast(`Stock for ${orderNumber} was not updated: the Dropship module did not load. Please report this.`, 'error', 10000);\n        return;\n      }\n      const r = await window.IMS_DROPSHIP.deductDropshipStock(orderId, orderNumber, 'Order delivered');\n      if (r?.problems?.length) {\n        ui().toast(`${orderNumber} delivered, but stock could not be updated for: ${r.problems.join(', ')}. Please check stock levels.`, 'warning', 10000);\n      }\n      return;\n    }\n\n    const whId  = ord?.warehouse_id;\n    const items = ord?.order_items || [];\n    if (!whId || !items.length) return;\n    // One line at a time, so two lines of the same product cannot both read\n    // the same starting figure and overwrite each other.\n    for (const item of items) {\n      if (!item.product_id) continue;\n      const { data: sl } = await db().select('stock_levels', {\n        eq: { product_id: item.product_id, warehouse_id: whId }, maybeSingle: true, noCompanyFilter: true\n      });\n      if (sl) {\n        await db().update('stock_levels', sl.id, {\n          quantity:     Math.max(0, (sl.quantity||0) - (item.quantity||0)),\n          reserved_qty: Math.max(0, (sl.reserved_qty||0) - (item.quantity||0))\n        });\n      }\n      await db().insert('stock_movements', {\n        product_id:    item.product_id,\n        warehouse_id:  whId,\n        movement_type: 'sale',\n        quantity:      -(item.quantity||0),\n        reference:     orderNumber || null,\n        reason:        'Order delivered',\n        user_id:       window.SM.AUTH.user?.id\n      });\n    }\n  }\n\n  // \u2500\u2500\u2500 SMART RESTOCK (shared) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Used any time goods are coming back into the warehouse: parcel found,\n  // return received, a refund, or a dropship return. quantity is only ever\n  // actually reduced by deductStockOnDelivery() above, which runs once an\n  // order is delivered or collected (and logs a 'sale' movement). An order\n  // that never got that far (lost in transit, a failed delivery returned\n  // to base) only ever had reserved_qty increased at order creation, so\n  // for those this releases the reservation instead of adding stock that\n  // never left. It checks which case applies (does a 'sale' movement\n  // exist for this order?) and does the right thing either way.\n  //\n  // Runs at most ONCE per order. The order carries a restocked_at stamp:\n  // the first call stamps it and does the work; every later call, from\n  // any screen and with any reason wording, sees the stamp and does\n  // nothing. The previous guard looked for a stock movement with the SAME\n  // reason text, so \"Customer return received\" followed by \"Refund\n  // processed\" ran twice, which for a delivered order would add its stock\n  // back twice. (orders.restocked_at added 25 Sep 2026; orders already\n  // restocked before then were stamped at the same time.)\n  //\n  // Returns the number of line items processed (0 if already done, or if\n  // there is nothing to do).\n  async function smartRestock(orderId, orderNumber, reason){\n    const restockReason = reason || 'Stock returned';\n\n    const { data: ord } = await db().select('orders', {\n      select: 'warehouse_id,restocked_at,fulfillment_type,order_items(product_id,quantity)',\n      eq: { id: orderId }, maybeSingle: true, noCompanyFilter: true\n    });\n    if (!ord || ord.restocked_at) return 0;\n    // Dropship orders follow the dropship rules: units go back to the shelf\n    // (if they had left) and to the partner's allocation. Before, returns of\n    // dropship orders found no warehouse here and put nothing back.\n    if (ord.fulfillment_type === 'dropship') {\n      if (!window.IMS_DROPSHIP?.restoreDropshipStock) {\n        ui().toast(`Stock for ${orderNumber} was not updated: the Dropship module did not load. Please report this.`, 'error', 10000);\n        return 0;\n      }\n      return await window.IMS_DROPSHIP.restoreDropshipStock(orderId, orderNumber, reason);\n    }\n    const whId  = ord.warehouse_id;\n    const items = ord.order_items || [];\n    if (!whId || !items.length) return 0;\n\n    // Claim the stamp FIRST. The update only matches while restocked_at is\n    // still empty, so if two restocks start at the same moment only one\n    // can claim it; the other gets no row back and stops here.\n    const authClient = window.supabase.createClient(\n      window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY,\n      {global:{headers:{Authorization:`Bearer ${window.SM.AUTH.session?.access_token}`}}}\n    );\n    const { data: claimed, error: stampErr } = await authClient.from('orders')\n      .update({ restocked_at: new Date().toISOString() })\n      .eq('id', orderId)\n      .is('restocked_at', null)\n      .select('id');\n    if (stampErr) {\n      ui().toast(`Stock for ${orderNumber} was not updated: ${stampErr.message}`, 'error', 8000);\n      return 0;\n    }\n    if (!claimed?.length) return 0;\n\n    // Goods have physically left if the order was delivered ('sale') or\n    // written off as lost ('write_off'). Either way, bringing them back\n    // must add them to on-hand, not just release a reservation.\n    const { data: saleMoves } = await db().select('stock_movements', {\n      eq: { reference: orderNumber }, in: { movement_type: ['sale', 'write_off'] }, limit: 1, noCompanyFilter: true\n    });\n    const wasDelivered = !!(saleMoves?.length);\n\n    // One line at a time, so two lines of the same product cannot both\n    // read the same starting figure and overwrite each other.\n    let processed = 0;\n    const failedLines = [];\n    for (const item of items) {\n      if (!item.product_id) continue;\n      const { data: sl } = await db().select('stock_levels', {\n        eq: { product_id: item.product_id, warehouse_id: whId }, maybeSingle: true, noCompanyFilter: true\n      });\n      if (wasDelivered) {\n        // Stock genuinely left, so this reverses that deduction.\n        if (sl) {\n          const { error } = await db().update('stock_levels', sl.id, { quantity: (sl.quantity||0) + (item.quantity||0) });\n          if (error) { failedLines.push(item.product_id); continue; }\n        }\n        await db().insert('stock_movements', {\n          product_id: item.product_id, warehouse_id: whId, movement_type: 'stock_in',\n          quantity: (item.quantity||0), reference: orderNumber || null,\n          reason: restockReason, user_id: window.SM.AUTH.user?.id\n        });\n      } else {\n        // Stock never actually left, so only release the reservation.\n        // Adding to quantity here would inflate stock that was never removed.\n        if (sl) {\n          const { error } = await db().update('stock_levels', sl.id, {\n            reserved_qty: Math.max(0,(sl.reserved_qty||0)-(item.quantity||0))\n          });\n          if (error) { failedLines.push(item.product_id); continue; }\n        }\n        await db().insert('stock_movements', {\n          product_id: item.product_id, warehouse_id: whId, movement_type: 'stock_in',\n          quantity: 0, reference: orderNumber || null,\n          reason: `${restockReason} (never delivered: reservation released, no quantity change)`,\n          user_id: window.SM.AUTH.user?.id\n        });\n      }\n      processed++;\n    }\n    if (failedLines.length) {\n      ui().toast(`Stock for ${orderNumber}: ${failedLines.length} line(s) could not be updated. Please check them in Inventory.`, 'warning', 10000);\n    }\n    return processed;\n  }\n\n  // \u2500\u2500\u2500 TRACKING TAB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// \u2500\u2500\u2500 TRACKING TAB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const TRACKING_STATUSES = [\n    'Collected by courier',\n    'At collection depot',\n    'In transit',\n    'At delivery depot',\n    'Out for delivery',\n    'Delivered \u2713',\n    'Failed delivery',\n    'Re-attempt requested',\n    'Return requested',\n    'Return in transit',\n    'Return received'\n  ];\n\n  async function loadTracking(){\n    const content = document.getElementById('ims-log-content');\n    if(!content) return;\n\n    // Preserve the user's current filter/sort selections across reloads.\n    // Every status-changing action (Delivered, Failed, Lost, Re-attempt,\n    // Return, etc.) calls loadTracking() to refresh the list \u2014 which\n    // previously rebuilt the filter bar from scratch every time via a\n    // fresh buildFilterBar() call, silently resetting platform, courier,\n    // status, and sort back to their defaults on every edit.\n    const prevPlatform = document.getElementById('ims-track-platform')?.value || '';\n    const prevCourier  = document.getElementById('ims-track-courier')?.value  || '';\n    const prevStatus   = document.getElementById('ims-track-filter')?.value   || '';\n    const prevSort     = document.getElementById('ims-track-sort')?.value     || 'newest';\n    // The search text is kept too, so a refresh (after an action, or a live\n    // update) no longer empties the search box.\n    const prevSearch   = document.getElementById('ims-track-search')?.value   || '';\n\n    content.innerHTML = `<div class=\"ims__loading\"><i class=\"ti ti-loader-2 ims__spin\"></i></div>`;\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const companyId = window.SM.AUTH.company?.id;\n\n    // \u2500\u2500 0. Exclude orders still sitting unassigned in Logistics \u2500\u2500\u2500\u2500\n    // A job can be 'dispatched' at order level the moment it leaves\n    // Order Management, but it hasn't actually shipped until a courier,\n    // own-truck slot, or self-collection has been assigned. Tracking\n    // should only show orders past that point.\n    const { data: unassignedJobs } = await client\n      .from('logistics_jobs')\n      .select('order_id')\n      .eq('status', 'unassigned');\n    const unassignedOrderIds = (unassignedJobs || []).map(j => j.order_id).filter(Boolean);\n\n    // \u2500\u2500 1. Main orders query \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    let trackingQuery = client\n      .from('orders')\n      .select('id,order_number,external_ref,status,fulfillment_type,order_type,customer_name,end_customer_name,postcode,end_postcode,dispatched_at,failed_delivery_count,failure_reason,last_failed_at,return_reason,platforms(name),created_at')\n      .eq('company_id', companyId)\n      .in('status', ['dispatched','failed_delivery','re_attempted','return_in_transit']);\n    if (unassignedOrderIds.length) {\n      trackingQuery = trackingQuery.not('id', 'in', `(${unassignedOrderIds.map(id => `\"${id}\"`).join(',')})`);\n    }\n    const { data: orders } = await trackingQuery.order('dispatched_at', { ascending: false });\n\n    const items = orders || [];\n    if(!items.length){\n      content.innerHTML = buildFilterBar([], []) +\n        '<div id=\"ims-tracking-table-wrap\"><div class=\"ims__empty\"><i class=\"ti ti-circle-check\"></i><p>No orders in transit</p><p style=\"font-size:12px;color:var(--ims-text-muted);margin-top:6px\">All dispatched orders have been delivered or resolved</p></div></div>' +\n        '<div id=\"ims-lost-orders-wrap\"></div>';\n      window._trackingOrders   = [];\n      window._shipmentMap      = {};\n      window._latestEventMap   = {};\n      window._trackingEventMap = {};\n      const sortElEmpty = document.getElementById('ims-track-sort');\n      if(sortElEmpty) sortElEmpty.value = prevSort;\n      const searchElEmpty = document.getElementById('ims-track-search');\n      if(searchElEmpty) searchElEmpty.value = prevSearch;\n      loadLostOrders();\n      return;\n    }\n\n    const orderIds = items.map(o => o.id);\n\n    // \u2500\u2500 2. Shipments query (parallel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const { data: shipments } = await client\n      .from('shipments')\n      .select('order_id,tracking_number,courier_order_ref,courier_id,couriers(id,name,cs_email,claims_email,tracking_url_base,requires_postcode,postcode_param,tracking_form_only)')\n      .in('order_id', orderIds).eq('is_return_collection', false)\n      .order('created_at', { ascending: false });\n\n    // Build shipment map \u2014 one shipment per order (latest)\n    const shipmentMap = {};\n    (shipments || []).forEach(s => {\n      if(!shipmentMap[s.order_id]) shipmentMap[s.order_id] = s;\n    });\n\n    // \u2500\u2500 2b. Manifest linkage (own-fleet deliveries) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Tracking previously had no awareness of manifests at all \u2014 an\n    // order correctly dispatched via your own fleet on a real manifest\n    // was treated identically to a courier shipment with no tracking\n    // number, showing \"Check shipment status\" (which makes no sense for\n    // a manifest delivery) instead of the actual manifest it's on.\n    const { data: manifestLinks } = await client\n      .from('logistics_jobs')\n      .select('order_id, manifest_items(manifest_id, manifests(manifest_number, status, dispatched_at, drivers(name)))')\n      .in('order_id', orderIds);\n    const manifestMap = {};\n    (manifestLinks || []).forEach(lj => {\n      const mi = (lj.manifest_items || [])[0];\n      if (mi?.manifests) {\n        manifestMap[lj.order_id] = {\n          manifestId: mi.manifest_id,\n          manifestNumber: mi.manifests.manifest_number,\n          driverName: mi.manifests.drivers?.name || null,\n          dispatchedAt: mi.manifests.dispatched_at\n        };\n      }\n    });\n\n    // \u2500\u2500 3. Tracking events query (parallel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const { data: trackingEvents } = await client\n      .from('order_tracking_events')\n      .select('id,order_id,tracking_status,notes,user_name,created_at')\n      .in('order_id', orderIds)\n      .order('created_at', { ascending: false });\n\n    // Build latest event map + full history map\n    const latestEventMap  = {};\n    const trackingEventMap = {};\n    (trackingEvents || []).forEach(e => {\n      if(!latestEventMap[e.order_id])  latestEventMap[e.order_id] = e;\n      if(!trackingEventMap[e.order_id]) trackingEventMap[e.order_id] = [];\n      trackingEventMap[e.order_id].push(e);\n    });\n\n    // \u2500\u2500 4. Build dynamic filter options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const platformSet = new Set();\n    items.forEach(o => { if(o.platforms?.name) platformSet.add(o.platforms.name); });\n\n    const courierSet = new Set();\n    items.forEach(o => {\n      const s = shipmentMap[o.id];\n      if(s?.couriers?.name) courierSet.add(s.couriers.name);\n    });\n\n    // \u2500\u2500 5. Store globally for filter reuse \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    window._trackingOrders   = items;\n    window._shipmentMap      = shipmentMap;\n    window._latestEventMap   = latestEventMap;\n    window._trackingEventMap = trackingEventMap;\n    window._manifestMap      = manifestMap;\n\n    content.innerHTML = buildFilterBar([...platformSet], [...courierSet]) +\n      '<div id=\"ims-tracking-table-wrap\">' + buildTrackingTable(items, shipmentMap, latestEventMap, manifestMap) + '</div>' +\n      '<div id=\"ims-lost-orders-wrap\"></div>';\n\n    // Restore the user's previous filter/sort selections onto the freshly\n    // rendered dropdowns, then reapply them to the freshly loaded list.\n    const platEl = document.getElementById('ims-track-platform');\n    const courEl = document.getElementById('ims-track-courier');\n    const statEl = document.getElementById('ims-track-filter');\n    const sortEl = document.getElementById('ims-track-sort');\n    if(platEl) platEl.value = prevPlatform;\n    if(courEl) courEl.value = prevCourier;\n    if(statEl) statEl.value = prevStatus;\n    if(sortEl) sortEl.value = prevSort;\n    const searchEl = document.getElementById('ims-track-search');\n    if(searchEl) searchEl.value = prevSearch;\n    filterTracking();\n\n    // Load lost orders section below tracking table\n    loadLostOrders();\n  }\n\n  function buildFilterBar(platforms, couriers){\n    const platOpts = platforms.map(p => `<option value=\"${util().sanitize(p)}\">${util().sanitize(p)}</option>`).join('');\n    const courierOpts = couriers.map(c => `<option value=\"${util().sanitize(c)}\">${util().sanitize(c)}</option>`).join('');\n    return `\n      <div class=\"ims__filters\" style=\"margin-bottom:14px\">\n        <div class=\"ims__search-wrap\" style=\"max-width:240px\">\n          <i class=\"ti ti-search\"></i>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-track-search\" placeholder=\"Tracking #, courier order no., order, manifest, customer...\" autocomplete=\"off\" oninput=\"window.IMS_LOGISTICS.filterTracking()\">\n        </div>\n        <select class=\"ims__select\" id=\"ims-track-platform\" onchange=\"window.IMS_LOGISTICS.filterTracking()\">\n          <option value=\"\">All platforms</option>${platOpts}\n        </select>\n        <select class=\"ims__select\" id=\"ims-track-courier\" onchange=\"window.IMS_LOGISTICS.filterTracking()\">\n          <option value=\"\">All couriers</option>${courierOpts}\n        </select>\n        <select class=\"ims__select\" id=\"ims-track-filter\" onchange=\"window.IMS_LOGISTICS.filterTracking()\">\n          <option value=\"\">All in-flight</option>\n          <option value=\"alert\">3+ day \u2014 check status</option>\n          <option value=\"delayed\">5+ day \u2014 overdue</option>\n          <option value=\"failed_delivery\">Failed delivery</option>\n          <option value=\"re_attempted\">Re-attempted</option>\n          <option value=\"return_in_transit\">Returns in transit</option>\n          <option value=\"dropship\">Dropship only</option>\n        </select>\n        <select class=\"ims__select\" id=\"ims-track-sort\" onchange=\"window.IMS_LOGISTICS.filterTracking()\">\n          <option value=\"newest\">Sort: Newest first</option>\n          <option value=\"oldest\">Sort: Oldest first</option>\n          <option value=\"order_number\">Sort: Order number</option>\n        </select>\n        <div style=\"font-size:11px;color:var(--ims-text-sec);display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-left:4px\">\n          <span class=\"ims-track-swatch\" data-filter=\"alert\" style=\"display:flex;align-items:center;gap:4px;cursor:pointer;padding:2px 6px;border-radius:4px;border:1.5px solid transparent\" onclick=\"window.IMS_LOGISTICS.toggleSwatchFilter('alert')\"><span style=\"display:inline-block;width:10px;height:10px;background:#FEF3C7;border:1px solid #D97706;border-radius:2px\"></span>3d alert</span>\n          <span class=\"ims-track-swatch\" data-filter=\"delayed\" style=\"display:flex;align-items:center;gap:4px;cursor:pointer;padding:2px 6px;border-radius:4px;border:1.5px solid transparent\" onclick=\"window.IMS_LOGISTICS.toggleSwatchFilter('delayed')\"><span style=\"display:inline-block;width:10px;height:10px;background:#FEE2E2;border:1px solid #DC2626;border-radius:2px\"></span>5d overdue</span>\n          <span class=\"ims-track-swatch\" data-filter=\"failed_delivery\" style=\"display:flex;align-items:center;gap:4px;cursor:pointer;padding:2px 6px;border-radius:4px;border:1.5px solid transparent\" onclick=\"window.IMS_LOGISTICS.toggleSwatchFilter('failed_delivery')\"><span style=\"display:inline-block;width:10px;height:10px;background:#FED7AA;border:1px solid #EA580C;border-radius:2px\"></span>Failed</span>\n          <span class=\"ims-track-swatch\" data-filter=\"re_attempted\" style=\"display:flex;align-items:center;gap:4px;cursor:pointer;padding:2px 6px;border-radius:4px;border:1.5px solid transparent\" onclick=\"window.IMS_LOGISTICS.toggleSwatchFilter('re_attempted')\"><span style=\"display:inline-block;width:10px;height:10px;background:#DBEAFE;border:1px solid #2563EB;border-radius:2px\"></span>Re-attempted</span>\n          <span class=\"ims-track-swatch\" data-filter=\"return_in_transit\" style=\"display:flex;align-items:center;gap:4px;cursor:pointer;padding:2px 6px;border-radius:4px;border:1.5px solid transparent\" onclick=\"window.IMS_LOGISTICS.toggleSwatchFilter('return_in_transit')\"><span style=\"display:inline-block;width:10px;height:10px;background:#EDE9FE;border:1px solid #7C3AED;border-radius:2px\"></span>Return</span>\n        </div>\n      </div>`;\n  }\n\n  // Swatches are a shortcut into the exact same filter the dropdown\n  // already provides \u2014 clicking one sets the dropdown's value and\n  // re-runs filterTracking(), so there is only ever one filtering\n  // code path. Clicking an already-active swatch clears the filter.\n  function toggleSwatchFilter(filterValue){\n    const sel = document.getElementById('ims-track-filter');\n    if(!sel) return;\n    sel.value = sel.value === filterValue ? '' : filterValue;\n    filterTracking();\n  }\n\n  function buildTrackingTable(items, shipmentMap, latestEventMap, manifestMap){\n    manifestMap = manifestMap || {};\n    const now = new Date();\n    if(!items.length){\n      return `<div class=\"ims__empty\"><i class=\"ti ti-inbox\"></i><p>No orders match this filter</p></div>`;\n    }\n    const rows = items.map(o => {\n      const manifestInfo = manifestMap[o.id] || null;\n      const dispatched = o.dispatched_at ? new Date(o.dispatched_at) : null;\n      const daysSince  = dispatched ? Math.floor((now - dispatched) / 86400000) : null;\n      const isAlert    = o.status === 'dispatched' && daysSince !== null && daysSince >= 3 && daysSince < 5;\n      const isDelayed  = o.status === 'dispatched' && daysSince !== null && daysSince >= 5;\n      const isFailed   = o.status === 'failed_delivery';\n      const isReAttempt= o.status === 're_attempted';\n      const isReturn   = o.status === 'return_in_transit';\n\n      // Row background\n      let rowBg = '';\n      if(isDelayed)    rowBg = 'background:#FEE2E2';\n      else if(isAlert) rowBg = 'background:#FEF3C7';\n      else if(isFailed)rowBg = 'background:#FED7AA';\n      else if(isReAttempt) rowBg = 'background:#DBEAFE';\n      else if(isReturn)    rowBg = 'background:#EDE9FE';\n\n      // Platform badge\n      const platName  = o.platforms?.name || '\u2014';\n      const platBadge = `<span class=\"ims__pill ims__pill--info\" style=\"font-size:10px\">${util().sanitize(platName)}</span>`;\n\n      // Fulfillment type badge\n      const ftColor = o.fulfillment_type === 'dropship' ? 'warning' : o.order_type === 'wholesale' ? 'accent' : 'neutral';\n      const ftLabel = o.fulfillment_type === 'dropship' ? 'Dropship' : o.order_type === 'wholesale' ? 'Wholesale' : 'Retail';\n      const ftBadge = `<span class=\"ims__pill ims__pill--${ftColor}\" style=\"font-size:10px\">${ftLabel}</span>`;\n\n      // Customer \u2014 dropship uses end_customer_name\n      const custName = util().sanitize(o.customer_name || o.end_customer_name || '\u2014');\n\n      // Postcode \u2014 dropship uses end_postcode\n      const postcode = util().sanitize(o.postcode || o.end_postcode || '\u2014');\n\n      // Shipment data\n      const shipment     = shipmentMap[o.id];\n      const trackingNum  = shipment?.tracking_number || null;\n      const courier      = shipment?.couriers || null;\n      // Manifest-shipped orders show their manifest reference here instead\n      // of a dash \u2014 there's genuinely no courier tracking number for an\n      // own-fleet delivery, but there is real, relevant reference info.\n      const trackingCell = manifestInfo\n        ? `<span class=\"ims__link\" onclick=\"window.IMS_LOGISTICS.openManifest?.('${util().jsArg(manifestInfo.manifestId||'')}')\" title=\"On manifest ${util().sanitize(manifestInfo.manifestNumber)}\"><i class=\"ti ti-truck\"></i> ${util().sanitize(manifestInfo.manifestNumber)}</span>${manifestInfo.driverName ? `<div style=\"font-size:10px;color:var(--ims-text-muted)\">${util().sanitize(manifestInfo.driverName)}</div>` : ''}`\n        : (trackingNum ? util().sanitize(trackingNum) : '<span style=\"color:var(--ims-text-muted)\">\u2014</span>')\n          + (shipment?.courier_order_ref ? `<div style=\"font-size:10px;color:var(--ims-text-muted);font-family:inherit\" title=\"Courier order no.\">Order no. ${util().sanitize(shipment.courier_order_ref)}</div>` : '');\n\n      // Track button \u2014 only if tracking number AND courier URL exists\n      // (manifest deliveries have no external tracking page to link to)\n      const trackUrl = !manifestInfo && trackingNum && courier?.tracking_url_base\n        ? util().buildTrackingUrl(courier, trackingNum, o.postcode || o.end_postcode || '')\n        : null;\n      const trackBtn = trackUrl\n        ? util().trackingLink(courier, trackingNum, o.postcode || o.end_postcode || '', courier?.tracking_form_only ? '<i class=\"ti ti-clipboard-copy\"></i>' : '<i class=\"ti ti-external-link\"></i>', 'ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon')\n        : '';\n\n      // Days display\n      const daysDisplay = daysSince !== null\n        ? `<span style=\"font-weight:700;color:${isDelayed?'var(--ims-danger)':isAlert?'var(--ims-warning)':'var(--ims-text)'}\">${daysSince}d</span>`\n        : '\u2014';\n\n      // Status column \u2014 pill + latest tracking event below\n      const latestEvent = latestEventMap[o.id];\n      let statusBadge = '';\n      if(manifestInfo){\n        // Own-fleet delivery \u2014 courier-chasing language (\"Check shipment\n        // status\", \"Overdue \u2014 update tracking\") makes no sense here, this\n        // was already on a real manifest with a real driver assigned.\n        if(isDelayed)    statusBadge = `<div style=\"font-size:10px;color:var(--ims-danger);margin-top:3px;font-weight:600\">Still out ${daysSince}d \u2014 confirm with driver</div>`;\n        else if(isAlert) statusBadge = `<div style=\"font-size:10px;color:var(--ims-warning);margin-top:3px;font-weight:600\">Confirm delivery with driver</div>`;\n      } else {\n        if(isDelayed)    statusBadge = `<div style=\"font-size:10px;color:var(--ims-danger);margin-top:3px;font-weight:600\">Overdue \u2014 update tracking</div>`;\n        else if(isAlert) statusBadge = `<div style=\"font-size:10px;color:var(--ims-warning);margin-top:3px;font-weight:600\">Check shipment status</div>`;\n      }\n      if(isFailed)statusBadge = `<div style=\"font-size:10px;color:var(--ims-danger);margin-top:3px;font-weight:600\">Action required</div>`;\n      else if(isReAttempt) statusBadge = `<div style=\"font-size:10px;color:var(--ims-accent);margin-top:3px\">Following up</div>`;\n      else if(isReturn)    statusBadge = `<div style=\"font-size:10px;color:#7C3AED;margin-top:3px\">Return in transit</div>`;\n\n      const latestLine = latestEvent\n        ? `<div style=\"font-size:10px;color:var(--ims-text-sec);margin-top:3px;font-style:italic\">${util().sanitize(latestEvent.tracking_status)} \u2014 ${util().formatDate(latestEvent.created_at)}</div>`\n        : statusBadge;\n\n      const statusCell = `<div>${util().pill(o.status)}</div>${latestLine}`;\n\n      // Action buttons \u2014 vary by order status\n      const trackingEditBtn = `<button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openEditTracking('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}','${util().jsArg(trackingNum?util().sanitize(trackingNum):'')}','${util().jsArg(courier?.id||shipment?.courier_id||'')}','${util().jsArg(shipment?.courier_order_ref||'')}')\" title=\"Set/edit tracking number and courier order no.\"><i class=\"ti ti-barcode\"></i></button>`;\n      const updateBtn = `<button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openTrackingUpdate('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Update tracking status\"><i class=\"ti ti-pencil\"></i></button>`;\n      const historyBtn = `<button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openTrackingHistory('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"View tracking history\"><i class=\"ti ti-history\"></i></button>`;\n      const sysLogBtn  = `<button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openActivityLog('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"View system activity log\"><i class=\"ti ti-list-details\"></i></button>`;\n      // Super Admin only, and only where there is actually a courier to\n      // undo \u2014 an own-truck or self-collection job has nothing to reverse.\n      const reassignBtn = (window.SM.AUTH.isSuperAdmin() && courier && ['dispatched','re_attempted'].includes(o.status))\n        ? `<button class=\"ims__btn ims__btn--warning ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.reassignToOwnTruck('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Assigned to a courier by mistake? Reassign to own truck\"><i class=\"ti ti-truck-return\"></i></button>`\n        : '';\n\n      let actionBtns = '';\n      if(o.status === 'dispatched' || o.status === 're_attempted'){\n        // \"Follow up with courier\" is meaningless for a manifest delivery \u2014\n        // there's no external courier to chase, the driver is your own.\n        const showFollowUp = !manifestInfo && daysSince !== null && daysSince >= 3;\n        actionBtns = `\n          <button class=\"ims__btn ims__btn--success ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.confirmDelivered('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Confirm delivered\"><i class=\"ti ti-check\"></i> Delivered</button>\n          <button class=\"ims__btn ims__btn--danger ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.openFailedDelivery('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Mark failed delivery\"><i class=\"ti ti-x\"></i> Failed</button>\n          ${showFollowUp ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.openCourierFollowUp('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Follow up with courier\"><i class=\"ti ti-mail\"></i> Follow up</button>` : ''}`;\n      } else if(o.status === 'failed_delivery'){\n        actionBtns = `\n          <button class=\"ims__btn ims__btn--info ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.requestReAttempt('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Request re-attempt\"><i class=\"ti ti-refresh\"></i> Re-attempt</button>\n          <button class=\"ims__btn ims__btn--warning ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.requestReturn('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Return to warehouse\"><i class=\"ti ti-arrow-back-up\"></i> Return</button>\n          <button class=\"ims__btn ims__btn--danger ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.markAsLost('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Mark as lost\"><i class=\"ti ti-alert-triangle\"></i> Mark lost</button>`;\n      } else if(o.status === 'return_in_transit'){\n        actionBtns = `\n          <button class=\"ims__btn ims__btn--success ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.markReturnReceived('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Mark return received\"><i class=\"ti ti-package-import\"></i> Return received</button>`;\n      }\n\n      return `<tr style=\"${rowBg}\" data-order-id=\"${o.id}\" data-status=\"${o.status}\" data-days=\"${daysSince||0}\" data-ft=\"${o.fulfillment_type||''}\" data-platform=\"${util().sanitize(platName)}\" data-courier=\"${util().sanitize(courier?.name||'')}\">\n        <td><span class=\"ims__link\" onclick=\"window.IMS_ORDERS?.openOrder('${util().jsArg(o.id)}')\">${util().sanitize(o.order_number)}</span></td>\n        <td style=\"font-size:11px;color:var(--ims-text-muted)\">${util().sanitize(o.external_ref||'\u2014')}</td>\n        <td>${platBadge}</td>\n        <td>${ftBadge}</td>\n        <td>${custName}</td>\n        <td style=\"font-size:12px;font-family:monospace\">${trackingCell}</td>\n        <td style=\"font-size:12px\">${postcode}</td>\n        <td style=\"font-size:11px;white-space:nowrap\">${dispatched ? util().formatDate(o.dispatched_at) : '\u2014'}</td>\n        <td style=\"text-align:center\">${daysDisplay}</td>\n        <td>${statusCell}</td>\n        <td>\n          <div class=\"ims__btn-group\" style=\"flex-wrap:nowrap\">\n            ${trackingEditBtn}\n            ${trackBtn}\n            ${updateBtn}\n            ${historyBtn}\n            ${sysLogBtn}\n            ${reassignBtn}\n            ${actionBtns}\n          </div>\n        </td>\n      </tr>`;\n    }).join('');\n\n    return `<div class=\"ims__card\" style=\"overflow-x:auto\">\n      <div class=\"ims__table-wrap\">\n        <table class=\"ims__table\" id=\"ims-tracking-table\">\n          <thead><tr>\n            <th>Order #</th><th>Ref</th><th>Platform</th><th>Type</th><th>Customer</th>\n            <th>Tracking #</th><th>Postcode</th><th>Dispatched</th>\n            <th style=\"text-align:center\">Days</th><th>Status</th><th>Actions</th>\n          </tr></thead>\n          <tbody id=\"ims-tracking-tbody\">${rows}</tbody>\n        </table>\n      </div>\n    </div>`;\n  }\n\n  function filterTracking(){\n    const platFilter    = document.getElementById('ims-track-platform')?.value || '';\n    const courierFilter = document.getElementById('ims-track-courier')?.value  || '';\n    const statusFilter  = document.getElementById('ims-track-filter')?.value   || '';\n    const now           = new Date();\n\n    let filtered = window._trackingOrders || [];\n\n    // Text search \u2014 partial match across tracking number (from the shipment\n    // map), courier order no., order number, manifest number (own-van\n    // orders: \"MF-00082\" or \"82\") and customer name. This is the field that was\n    // genuinely missing: a valid tracking number returned nothing because\n    // nothing here ever looked at shipments.tracking_number.\n    const searchTerm = (document.getElementById('ims-track-search')?.value || '').trim().toLowerCase();\n    if(searchTerm){\n      filtered = filtered.filter(o => {\n        const s = (window._shipmentMap || {})[o.id];\n        const tracking = (s?.tracking_number || '').toLowerCase();\n        const courierRef = (s?.courier_order_ref || '').toLowerCase();\n        const orderNum = (o.order_number || '').toLowerCase();\n        const custName = (o.customer_name || o.end_customer_name || '').toLowerCase();\n        const mfNum = ((window._manifestMap || {})[o.id]?.manifestNumber || '').toLowerCase();\n        return tracking.includes(searchTerm) || courierRef.includes(searchTerm) || orderNum.includes(searchTerm) || custName.includes(searchTerm) || mfNum.includes(searchTerm);\n      });\n    }\n\n    // Platform filter\n    if(platFilter) filtered = filtered.filter(o => o.platforms?.name === platFilter);\n\n    // Courier filter \u2014 uses shipment map\n    if(courierFilter) filtered = filtered.filter(o => {\n      const s = (window._shipmentMap || {})[o.id];\n      return s?.couriers?.name === courierFilter;\n    });\n\n    // Status filter\n    if(statusFilter === 'alert')\n      filtered = filtered.filter(o => { const d = o.dispatched_at ? Math.floor((now - new Date(o.dispatched_at))/86400000) : 0; return o.status==='dispatched' && d>=3 && d<5; });\n    else if(statusFilter === 'delayed')\n      filtered = filtered.filter(o => { const d = o.dispatched_at ? Math.floor((now - new Date(o.dispatched_at))/86400000) : 0; return o.status==='dispatched' && d>=5; });\n    else if(statusFilter === 'failed_delivery')   filtered = filtered.filter(o => o.status==='failed_delivery');\n    else if(statusFilter === 're_attempted')       filtered = filtered.filter(o => o.status==='re_attempted');\n    else if(statusFilter === 'return_in_transit')  filtered = filtered.filter(o => o.status==='return_in_transit');\n    else if(statusFilter === 'dropship')           filtered = filtered.filter(o => o.fulfillment_type==='dropship');\n\n    // Sort \u2014 defaults to Newest first, matching loadTracking()'s own query\n    // order exactly, so the initial page load and this dropdown's default\n    // agree. All three values must stay in sync: the query order, this\n    // fallback, and the dropdown's first <option>.\n    const sortOrder = document.getElementById('ims-track-sort')?.value || 'newest';\n    if(sortOrder === 'newest'){\n      filtered = [...filtered].sort((a,b) => new Date(b.dispatched_at||b.created_at) - new Date(a.dispatched_at||a.created_at));\n    } else if(sortOrder === 'order_number'){\n      filtered = [...filtered].sort((a,b) => (a.order_number||'').localeCompare(b.order_number||'', undefined, {numeric:true}));\n    } else {\n      filtered = [...filtered].sort((a,b) => new Date(a.dispatched_at||a.created_at) - new Date(b.dispatched_at||b.created_at));\n    }\n\n    // Rebuild only the table body \u2014 target the dedicated wrapper by ID,\n    // never the ambiguous '.ims__card' class, since the Lost Orders\n    // section below also uses that class. Using .innerHTML (not\n    // .outerHTML) on this wrapper means the wrapper div itself is never\n    // destroyed, so it stays reliably targetable no matter how many\n    // times the filter toggles between empty and non-empty results \u2014\n    // previously, an empty result replaced the entire wrapper (via\n    // outerHTML + querySelector), leaving nothing for the next filter\n    // click to find except the Lost Orders card by accident, which then\n    // got silently overwritten.\n    const wrap = document.getElementById('ims-tracking-table-wrap');\n    if(wrap){\n      wrap.innerHTML = buildTrackingTable(filtered, window._shipmentMap||{}, window._latestEventMap||{}, window._manifestMap||{});\n    }\n\n    // Highlight whichever swatch (if any) matches the active filter\n    document.querySelectorAll('.ims-track-swatch').forEach(el=>{\n      el.style.borderColor = el.dataset.filter === statusFilter ? 'var(--ims-text-sec)' : 'transparent';\n    });\n  }\n\n  // \u2500\u2500\u2500 EDIT / SET TRACKING NUMBER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Orders can reach 'dispatched' via several paths \u2014 single courier\n  // assign (confirmCourierAssignment, which DOES collect a tracking\n  // number), bulk courier assign (confirmBulkAssign, which does NOT),\n  // own truck, or a manifest \u2014 so a tracking number may never have been\n  // recorded. This lets staff add or correct one directly from Tracking.\n  async function openEditTracking(orderId, orderNumber, currentTracking, currentCourierId, currentCourierRef){\n    const couriers=await _getActiveCouriers();\n    const courierOpts=(couriers||[]).map(c=>`<option value=\"${c.id}\" ${c.id===currentCourierId?'selected':''}>${util().sanitize(c.name)}</option>`).join('');\n    ui().openModal(`Set tracking \u2014 ${orderNumber}`,`\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Enter the courier's tracking number (to track it on their website) and, if they gave one, their own order number (for example V1's VDI number). The order number is what courier invoices list, so the invoice check matches it exactly.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label ims__label--req\">Courier</label><select class=\"ims__select\" id=\"ims-et-courier\"><option value=\"\">Select courier</option>${courierOpts}</select></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Tracking / consignment number</label><input class=\"ims__input\" type=\"text\" id=\"ims-et-tracking\" value=\"${util().sanitize(currentTracking||'')}\" placeholder=\"Enter tracking number\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Courier order no.</label><input class=\"ims__input\" type=\"text\" id=\"ims-et-corder\" value=\"${util().sanitize(currentCourierRef||'')}\" placeholder=\"Optional, e.g. VDI242546\"><span class=\"ims__input-hint\">Enter at least one of the two.</span></div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveTrackingNumber('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-check\"></i> Save</button>\n    `,'sm');\n  }\n\n  async function saveTrackingNumber(orderId, orderNumber){\n    const courierId=document.getElementById('ims-et-courier')?.value;\n    const tracking=document.getElementById('ims-et-tracking')?.value?.trim()||'';\n    const courierRef=document.getElementById('ims-et-corder')?.value?.trim()||'';\n    if(!courierId){ui().toast('Please select a courier','error');return;}\n    if(!tracking&&!courierRef){ui().toast('Please enter the tracking number, the courier order no., or both','error');return;}\n\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:existing}=await client.from('shipments').select('id').eq('order_id',orderId).eq('is_return_collection',false).order('created_at',{ascending:false}).limit(1).maybeSingle();\n\n    if(existing){\n      const {error}=await client.from('shipments').update({courier_id:courierId,tracking_number:tracking||null,courier_order_ref:courierRef||null}).eq('id',existing.id);\n      if(error){ui().toast('Failed: '+error.message,'error');return;}\n    } else {\n      const {error}=await db().insert('shipments',{\n        order_id:orderId,courier_id:courierId,tracking_number:tracking||null,courier_order_ref:courierRef||null,\n        ship_mode:'courier',status:'dispatched',dispatched_at:new Date().toISOString()\n      });\n      if(error){ui().toast('Failed: '+error.message,'error');return;}\n    }\n\n    await logActivity(orderId, null, null, 'tracking_updated', [tracking?`Tracking number: ${tracking}`:'',courierRef?`Courier order no.: ${courierRef}`:''].filter(Boolean).join(', '));\n    if(tracking) window.SM.SHOPIFY?.sync('tracking',[orderId]);   // website orders: tracking shown in Shopify\n    ui().closeModal();\n    ui().toast('Saved','success');\n    loadTracking();\n  }\n\n  // \u2500\u2500\u2500 OPEN TRACKING UPDATE MODAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function openTrackingUpdate(orderId, orderNumber){\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n\n    // Fetch existing events for this order (ascending for history)\n    const { data: events } = await client\n      .from('order_tracking_events')\n      .select('tracking_status,notes,user_name,created_at')\n      .eq('order_id', orderId)\n      .order('created_at', { ascending: true });\n\n    const historyRows = (events || []).map((e, i) => {\n      const isLatest = i === (events.length - 1);\n      return `<tr style=\"${isLatest ? 'font-weight:600;background:var(--ims-surface2)' : ''}\">\n        <td style=\"font-size:11px;white-space:nowrap\">${util().formatDate(e.created_at)}${util().formatDateTime ? ' ' + new Date(e.created_at).toLocaleTimeString('en-GB',{hour:'2-digit',minute:'2-digit'}) : ''}</td>\n        <td style=\"font-size:12px\">${util().sanitize(e.user_name||'System')}</td>\n        <td>${util().sanitize(e.tracking_status)}</td>\n        <td style=\"font-size:12px;color:var(--ims-text-sec)\">${util().sanitize(e.notes||'\u2014')}</td>\n      </tr>`;\n    }).join('');\n\n    const historySection = events?.length\n      ? `<hr class=\"ims__divider\">\n         <strong style=\"font-size:13px\">Tracking history</strong>\n         <div class=\"ims__table-wrap\" style=\"margin-top:8px;max-height:220px;overflow-y:auto\">\n           <table class=\"ims__table\">\n             <thead><tr><th>Date/Time</th><th>User</th><th>Status</th><th>Notes</th></tr></thead>\n             <tbody>${historyRows}</tbody>\n           </table>\n         </div>`\n      : `<hr class=\"ims__divider\"><div style=\"font-size:12px;color:var(--ims-text-muted);padding:8px 0\">No tracking updates recorded yet. Add the first one above.</div>`;\n\n    const statusOpts = TRACKING_STATUSES.map(s =>\n      `<option value=\"${s}\">${s}</option>`\n    ).join('');\n\n    ui().openModal(`Update tracking \u2014 ${orderNumber}`, `\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Tracking status</label>\n          <select class=\"ims__select\" id=\"ims-tev-status\">\n            <option value=\"\">Select status...</option>\n            ${statusOpts}\n          </select>\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Notes</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-tev-notes\" placeholder=\"e.g. Driver attempted at 2pm, card left\">\n        </div>\n      </div>\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-top:4px;margin-bottom:0\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Selecting <strong>Delivered \u2713</strong> or <strong>Failed delivery</strong> will trigger the full automation flow automatically.</span>\n      </div>\n      ${historySection}\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveTrackingEvent('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\">\n        <i class=\"ti ti-check\"></i> Save update\n      </button>\n    `, 'lg');\n  }\n\n  // \u2500\u2500\u2500 SAVE TRACKING EVENT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function saveTrackingEvent(orderId, orderNumber){\n    const status = document.getElementById('ims-tev-status')?.value;\n    const notes  = document.getElementById('ims-tev-notes')?.value?.trim() || null;\n\n    if(!status){ ui().toast('Please select a tracking status','error'); return; }\n\n    // Insert to order_tracking_events\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { error } = await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: status,\n      notes:           notes,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n\n    if(error){ ui().toast('Failed to save: ' + error.message, 'error'); return; }\n\n    // Trigger automation based on status\n    if(status === 'Delivered \u2713'){\n      ui().closeModal();\n      await confirmDelivered(orderId, orderNumber);\n    } else if(status === 'Failed delivery'){\n      ui().closeModal();\n      openFailedDelivery(orderId, orderNumber);\n    } else if(status === 'Return received'){\n      ui().closeModal();\n      markReturnReceived(orderId, orderNumber);\n    } else if(status === 'Return requested'){\n      // Previously this just logged the text \"Return requested\" with no\n      // actual status change, so the row never turned purple the way the\n      // proper Failed Delivery \u2192 Return flow does. Routes through the same\n      // requestReturn() used there, so however staff initiate a return,\n      // the order genuinely moves to return_in_transit and the row colour\n      // matches reality.\n      ui().closeModal();\n      requestReturn(orderId, orderNumber);\n    } else {\n      ui().closeModal();\n      ui().toast(`Tracking updated: ${status}`, 'success');\n      loadTracking();\n    }\n  }\n\n  // \u2500\u2500\u2500 OPEN TRACKING HISTORY VIEWER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function openTrackingHistory(orderId, orderNumber){\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { data: events } = await client\n      .from('order_tracking_events')\n      .select('tracking_status,notes,user_name,created_at')\n      .eq('order_id', orderId)\n      .order('created_at', { ascending: true });\n\n    const items = events || [];\n    const rows = items.map((e, i) => {\n      const isLatest = i === items.length - 1;\n      const dt = new Date(e.created_at);\n      const timeStr = dt.toLocaleTimeString('en-GB', {hour:'2-digit', minute:'2-digit'});\n      return `<tr style=\"${isLatest ? 'background:var(--ims-surface2);font-weight:600' : ''}\">\n        <td style=\"font-size:11px;white-space:nowrap\">${util().formatDate(e.created_at)} ${timeStr}</td>\n        <td style=\"font-size:12px\">${util().sanitize(e.user_name||'System')}</td>\n        <td>\n          <span class=\"ims__pill ims__pill--${\n            e.tracking_status.includes('Delivered') ? 'success' :\n            e.tracking_status.includes('Failed') || e.tracking_status.includes('Return') ? 'danger' :\n            e.tracking_status.includes('Out for delivery') ? 'accent' : 'neutral'\n          }\" style=\"font-size:11px\">${util().sanitize(e.tracking_status)}</span>\n          ${isLatest ? '<span style=\"font-size:10px;color:var(--ims-text-muted);margin-left:6px\">\u2190 current</span>' : ''}\n        </td>\n        <td style=\"font-size:12px;color:var(--ims-text-sec)\">${util().sanitize(e.notes||'\u2014')}</td>\n      </tr>`;\n    }).join('');\n\n    ui().openModal(`Tracking history \u2014 ${orderNumber}`, `\n      ${!items.length\n        ? `<div class=\"ims__empty\"><i class=\"ti ti-history\"></i><p>No tracking updates yet</p><p style=\"font-size:12px;color:var(--ims-text-muted)\">Use the pencil button on the tracking row to add updates</p></div>`\n        : `<div class=\"ims__table-wrap\">\n            <table class=\"ims__table\">\n              <thead><tr><th>Date/Time</th><th>User</th><th>Status</th><th>Notes</th></tr></thead>\n              <tbody>${rows}</tbody>\n            </table>\n          </div>`\n      }\n    `, `\n      <button class=\"ims__btn ims__btn--secondary\" onclick=\"window.IMS_LOGISTICS.openTrackingUpdate('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}');window.SM.UI.closeModal()\">\n        <i class=\"ti ti-pencil\"></i> Add update\n      </button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal()\">Close</button>\n    `, 'lg');\n  }\n\n  // \u2500\u2500\u2500 COURIER TRACKING-NUMBER GATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Orders dispatched via courier on/after this date must have a\n  // tracking number recorded before they can be confirmed Delivered or\n  // Failed \u2014 enforced going forward only, per explicit decision not to\n  // retroactively block orders already in Tracking without one. Own\n  // truck, self-collection, and manifest deliveries are never subject\n  // to this (no third-party courier tracking exists for those methods).\n  // Adjust this date if you want the enforcement start point to differ\n  // from today.\n  const COURIER_TRACKING_ENFORCEMENT_DATE = '2026-07-04';\n\n  async function _blockedForMissingTracking(orderId, dispatchedAt){\n    if(!dispatchedAt) return false;\n    if(new Date(dispatchedAt) < new Date(COURIER_TRACKING_ENFORCEMENT_DATE)) return false;\n\n    // Not courier-shipped (own truck / self-collection / manifest) \u2014\n    // no assigned_courier_id means no third-party tracking applies.\n    const { data: job } = await db().select('logistics_jobs',{\n      select:'assigned_courier_id', eq:{order_id:orderId}, maybeSingle:true, noCompanyFilter:true\n    });\n    if(!job?.assigned_courier_id) return false;\n\n    const { data: ship } = await db().select('shipments',{\n      select:'tracking_number', eq:{order_id:orderId,is_return_collection:false}, order:{col:'created_at',asc:false}, limit:1, maybeSingle:true, noCompanyFilter:true\n    });\n    return !(ship?.tracking_number && ship.tracking_number.trim());\n  }\n\n  function confirmDelivered(orderId, orderNumber){\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Confirm delivery \u2014 ${orderNumber}`, `\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>This will close the order from tracking. For wholesale orders, a receivable will be created automatically.</span>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label ims__label--req\">Delivery date</label>\n        <input class=\"ims__input\" type=\"date\" id=\"ims-delconf-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.confirmDeliveredSave('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-check\"></i> Confirm delivery</button>\n    `, 'sm');\n  }\n\n  // Shared by updateDelivery (the manifest's own dropdown) and\n  // confirmDeliveredSave (the Tracking tab) - a delivery can legitimately\n  // be marked from either screen, so both need to keep the parent\n  // manifest's own status in sync rather than only one of them knowing\n  // how. Closes out the manifest once every one of its stops has reached\n  // a final state; previously only the manifest-dropdown path did this at\n  // all, so anything resolved via Tracking left its manifest stuck on\n  // 'dispatched' forever regardless of how many stops were actually done.\n  async function checkManifestCompletion(manifestId){\n    if(!manifestId) return;\n    const {data:allItems} = await db().select('manifest_items',{\n      select:'delivery_status', eq:{manifest_id:manifestId}, noCompanyFilter:true\n    });\n    // A stop with an outcome means the van has left: mark it departed if\n    // nobody pressed \"Van departed\", so its orders can no longer be amended.\n    if((allItems||[]).some(i=>i.delivery_status && i.delivery_status!=='pending')){\n      const {data:mf}=await db().select('manifests',{select:'departed_at',eq:{id:manifestId},maybeSingle:true,noCompanyFilter:true});\n      if(mf && !mf.departed_at) await db().update('manifests',manifestId,{departed_at:new Date().toISOString(),departed_by:window.SM.AUTH.user?.id||null});\n    }\n    const unresolved = (allItems||[]).filter(i=>!['delivered','failed','partial','collected'].includes(i.delivery_status));\n    if(allItems?.length && !unresolved.length){\n      await db().update('manifests',manifestId,{status:'completed'});\n    }\n  }\n\n  async function confirmDeliveredSave(orderId, orderNumber){\n    const dateVal = document.getElementById('ims-delconf-date')?.value;\n    if(!dateVal){ ui().toast('Please select a delivery date','error'); return; }\n\n    if(await _isAlreadyDelivered(orderId)){\n      ui().toast(`${orderNumber} is already marked delivered \u2014 no changes made.`,'warning',5000);\n      ui().closeModal();\n      loadTracking();\n      return;\n    }\n\n    const deliveredAt = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n\n    const { data: order } = await db().select('orders',{\n      select:'status,order_type,customer_id,total_value,order_number,dispatched_at,platform_id,payment_status',\n      eq:{id:orderId}, maybeSingle:true, noCompanyFilter:true\n    });\n\n    if(await _blockedForMissingTracking(orderId, order?.dispatched_at)){\n      ui().toast('This courier order has no tracking number recorded yet. Please close this and add one first using the barcode icon on the Tracking tab, then mark delivered.','error',7000);\n      return;\n    }\n\n    const oldStatus = order?.status || 'dispatched';\n    await db().update('orders', orderId, {\n      status: 'delivered',\n      delivered_at: deliveredAt\n    });\n    // Keep the shipments record's own status field in sync \u2014 it's a\n    // separate field from orders.status and was previously never\n    // updated after creation, leaving it stuck on 'dispatched' forever.\n    const { data: ship } = await db().select('shipments',{\n      select:'id', eq:{order_id:orderId,is_return_collection:false}, order:{col:'created_at',asc:false}, limit:1, maybeSingle:true, noCompanyFilter:true\n    });\n    if(ship?.id) await db().update('shipments', ship.id, { status:'delivered' });\n    await logActivity(orderId, oldStatus, 'delivered', 'delivered', null);\n    await deductStockOnDelivery(orderId, orderNumber);\n\n    // Keep the manifest stop's own record in sync too, if this order was\n    // on one \u2014 Tracking is a genuinely valid place to mark a delivery\n    // from, not just the manifest's own dropdown, so this needs to update\n    // manifest_items and check completion the same way that path does.\n    const { data: job } = await db().select('logistics_jobs',{\n      select:'id', eq:{order_id:orderId}, maybeSingle:true, noCompanyFilter:true\n    });\n    if(job?.id){\n      const { data: mi } = await db().select('manifest_items',{\n        select:'id,manifest_id', eq:{logistics_job_id:job.id}, maybeSingle:true, noCompanyFilter:true\n      });\n      if(mi?.id){\n        await db().update('manifest_items', mi.id, { delivery_status:'delivered', delivered_at: deliveredAt });\n        await checkManifestCompletion(mi.manifest_id);\n      }\n    }\n\n    // Book the marketplace commission as an expense on delivery, mirroring\n    // how the wholesale receivable auto-creates here. Only for orders on a\n    // platform with a commission rate set (marketplaces) \u2014 direct sales have\n    // no rate and book nothing. Guarded against double-booking via a\n    // reference tag unique to this order + category.\n    if (order?.platform_id) {\n      const client2 = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n      const { data: rate } = await client2.from('platform_commissions')\n        .select('commission_percent,commission_fixed')\n        .eq('company_id', window.SM.AUTH.company?.id)\n        .eq('platform_id', order.platform_id)\n        .maybeSingle();\n      const calc = util().calcCommission(order.total_value, rate);\n      if (calc.hasCommission && calc.commission > 0) {\n        const ref = `COMM-${order.order_number}`;\n        const { data: already } = await client2.from('transactions')\n          .select('id').eq('reference', ref).eq('category', 'Marketplace fees').maybeSingle();\n        if (!already) {\n          await client2.from('transactions').insert({\n            company_id:  window.SM.AUTH.company?.id,\n            date:        deliveredAt.split('T')[0],\n            type:        'expense',\n            category:    'Marketplace fees',\n            amount:      calc.commission,\n            reference:   ref,\n            description: `Commission on ${order.order_number}`,\n            user_id:     window.SM.AUTH.user?.id || null\n          });\n        }\n      }\n    }\n\n    // Auto-create accounts_receivable for wholesale orders\n    if(order?.order_type === 'wholesale' && order?.customer_id){\n      const { data: existing } = await db().select('accounts_receivable',{\n        eq:{ order_id: orderId }, maybeSingle:true, noCompanyFilter:true\n      });\n      const { data: cust } = await db().select('customers',{select:'credit_terms',eq:{id:order.customer_id},maybeSingle:true,noCompanyFilter:true});\n      const dueDate = util().resolveReceivableDueDate(order.payment_status, cust?.credit_terms);\n      if(!existing){\n        if(dueDate){\n          await db().insert('accounts_receivable',{\n            order_id:    orderId,\n            customer_id: order.customer_id,\n            amount:      order.total_value || 0,\n            paid_amount: 0,\n            status:      'unpaid',\n            invoice_ref: order.order_number,\n            due_date:    dueDate\n          });\n          ui().closeModal();\n          ui().toast(`${orderNumber} delivered \u2014 receivable created in Accounts`, 'success', 5000);\n        } else {\n          ui().closeModal();\n          ui().toast(`${orderNumber} marked delivered`, 'success');\n        }\n      } else if(existing.status === 'provisional'){\n        // A provisional receivable was raised when this order first went\n        // out on its manifest \u2014 marking delivered here (rather than via\n        // the manifest's own dropdown) previously left it stuck at\n        // provisional forever, showing \"In transit\" in Accounts\n        // regardless of the order actually being delivered. This flips\n        // it the same correct way updateDelivery() already does.\n        if(dueDate){\n          await db().update('accounts_receivable', existing.id, { status:'unpaid', due_date: dueDate });\n        } else {\n          await db().update('accounts_receivable', existing.id, { status:'paid', paid_amount: existing.amount, due_date: new Date().toISOString().split('T')[0] });\n        }\n        ui().closeModal();\n        ui().toast(`${orderNumber} marked delivered`, 'success');\n      } else {\n        ui().closeModal();\n        ui().toast(`${orderNumber} marked delivered`, 'success');\n      }\n    } else {\n      ui().closeModal();\n      ui().toast(`${orderNumber} marked delivered`, 'success');\n    }\n    window.SM.EMAIL.send(orderId, 'delivered');\n    loadTracking();\n  }\n\n  // \u2500\u2500\u2500 FAILED DELIVERY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function openFailedDelivery(orderId, orderNumber){\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Failed delivery \u2014 ${orderNumber}`, `\n      <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-alert-triangle\"></i>\n        <span>Record the failed delivery attempt. You will then choose to request a re-attempt or return the shipment.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Failed delivery date</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-fail-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Reason for failed delivery</label>\n          <select class=\"ims__select\" id=\"ims-fail-reason\">\n            <option value=\"\">Select reason...</option>\n            <option value=\"No one home\">No one home</option>\n            <option value=\"Access issues\">Access / gate / entry issues</option>\n            <option value=\"Wrong address\">Wrong address details</option>\n            <option value=\"Customer refused delivery\">Customer refused delivery</option>\n            <option value=\"Damaged in transit\">Damaged in transit</option>\n            <option value=\"Courier lost parcel\">Courier lost parcel</option>\n            <option value=\"Other\">Other</option>\n          </select>\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\" id=\"ims-fail-other-wrap\" style=\"display:none\">\n          <label class=\"ims__label\">Other reason (specify)</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-fail-other\" placeholder=\"Describe reason\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label\">Additional notes</label>\n          <textarea class=\"ims__textarea\" id=\"ims-fail-notes\" rows=\"2\" placeholder=\"Courier reference, contact made, etc.\"></textarea>\n        </div>\n      </div>\n      <hr class=\"ims__divider\">\n      <strong style=\"font-size:13px\">What would you like to do next?</strong>\n      <div id=\"ims-fail-choices-normal\" style=\"display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px\">\n        <div style=\"padding:14px;border:1.5px solid var(--ims-border);border-radius:var(--ims-radius);cursor:pointer\" onclick=\"window.IMS_LOGISTICS._failChoice='reattempt';document.querySelectorAll('.ims-fail-choice').forEach(el=>el.style.borderColor='var(--ims-border)');this.style.borderColor='var(--ims-accent)';\" class=\"ims-fail-choice\">\n          <div style=\"font-weight:600;margin-bottom:4px\"><i class=\"ti ti-refresh\" style=\"color:var(--ims-accent)\"></i> Request re-attempt</div>\n          <div style=\"font-size:12px;color:var(--ims-text-sec)\">Ask courier to attempt delivery again. Order stays on tracking as blue until delivered.</div>\n        </div>\n        <div style=\"padding:14px;border:1.5px solid var(--ims-border);border-radius:var(--ims-radius);cursor:pointer\" onclick=\"window.IMS_LOGISTICS._failChoice='return';document.querySelectorAll('.ims-fail-choice').forEach(el=>el.style.borderColor='var(--ims-border)');this.style.borderColor='var(--ims-warning)';\" class=\"ims-fail-choice\">\n          <div style=\"font-weight:600;margin-bottom:4px\"><i class=\"ti ti-arrow-back-up\" style=\"color:var(--ims-warning)\"></i> Return to warehouse</div>\n          <div style=\"font-size:12px;color:var(--ims-text-sec)\">Instruct courier to return shipment. Order turns purple on tracking until received back.</div>\n        </div>\n      </div>\n      <div id=\"ims-fail-choices-lost\" style=\"display:none;margin-top:10px\">\n        <div style=\"padding:14px;border:1.5px solid var(--ims-danger);border-radius:var(--ims-radius);background:var(--ims-danger-bg)\">\n          <div style=\"font-weight:600;margin-bottom:4px;color:var(--ims-danger)\"><i class=\"ti ti-alert-triangle\"></i> Mark order as lost</div>\n          <div style=\"font-size:12px;color:var(--ims-text-sec)\">Since the courier has confirmed the parcel is lost, there's nothing to re-attempt or return. Confirming below marks the order as lost and moves it to Lost &amp; Damaged, where you can raise a courier claim.</div>\n        </div>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.confirmFailed('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-check\"></i> Confirm & proceed</button>\n    `, 'lg');\n    window.IMS_LOGISTICS._failChoice = null;\n\n    // Script tags injected via innerHTML (as openModal() does) never\n    // execute in any browser \u2014 that's why this listener previously did\n    // nothing at all. Attaching it here, as a normal JS call right after\n    // the modal's HTML is in the DOM, is the correct approach.\n    document.getElementById('ims-fail-reason')?.addEventListener('change', function(){\n      const otherWrap = document.getElementById('ims-fail-other-wrap');\n      if(otherWrap) otherWrap.style.display = this.value === 'Other' ? '' : 'none';\n      const isLost = this.value === 'Courier lost parcel';\n      const normalChoices = document.getElementById('ims-fail-choices-normal');\n      const lostChoice = document.getElementById('ims-fail-choices-lost');\n      if(normalChoices) normalChoices.style.display = isLost ? 'none' : '';\n      if(lostChoice) lostChoice.style.display = isLost ? '' : 'none';\n      window.IMS_LOGISTICS._failChoice = isLost ? 'lost' : null;\n    });\n  }\n\n  async function confirmFailed(orderId, orderNumber){\n    const dateVal     = document.getElementById('ims-fail-date')?.value;\n    const reasonSel   = document.getElementById('ims-fail-reason')?.value;\n    const reasonOther = document.getElementById('ims-fail-other')?.value?.trim();\n    const notes       = document.getElementById('ims-fail-notes')?.value?.trim();\n    const choice      = window.IMS_LOGISTICS._failChoice;\n\n    if(!dateVal){ ui().toast('Please select the failed delivery date','error'); return; }\n    if(!reasonSel){ ui().toast('Please select a reason','error'); return; }\n    if(reasonSel === 'Other' && !reasonOther){ ui().toast('Please specify the reason','error'); return; }\n    if(!choice){ ui().toast('Please select re-attempt or return','error'); return; }\n\n    const finalReason = reasonSel === 'Other' ? reasonOther : reasonSel;\n    const fullNotes   = notes ? `${finalReason} \u2014 ${notes}` : finalReason;\n    const failedAt    = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n\n    const { data: orderData } = await db().select('orders',{\n      select:'status,failed_delivery_count,dispatched_at',\n      eq:{id:orderId}, maybeSingle:true, noCompanyFilter:true\n    });\n\n    if(await _blockedForMissingTracking(orderId, orderData?.dispatched_at)){\n      ui().toast('This courier order has no tracking number recorded yet. Please close this and add one first using the barcode icon on the Tracking tab, then try again.','error',7000);\n      return;\n    }\n\n    const authClient = window.supabase.createClient(\n      window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY,\n      {global:{headers:{Authorization:`Bearer ${window.SM.AUTH.session?.access_token}`}}}\n    );\n\n    // A courier-confirmed lost parcel has no re-attempt/return path \u2014\n    // go straight to lost, matching markAsLost()/confirmMarkAsLost()'s\n    // own flow, including the follow-up \"raise a claim?\" prompt.\n    if(choice === 'lost'){\n      const oldStatus = orderData?.status || 'dispatched';\n\n      const { error: lostErr } = await authClient.from('orders')\n        .update({ status:'lost' }).eq('id', orderId);\n      if(lostErr){ ui().toast('Failed to mark as lost: ' + lostErr.message, 'error'); return; }\n\n      const { data: lostShip } = await authClient.from('shipments')\n        .select('id').eq('order_id',orderId).eq('is_return_collection',false).order('created_at',{ascending:false}).limit(1).maybeSingle();\n      // shipments.status has a DB check constraint with no 'lost' value \u2014\n      // only pending/packed/dispatched/in_transit/out_for_delivery/\n      // delivered/failed/returned are allowed. 'failed' is the closest\n      // valid state; orders.status retains the precise 'lost' distinction\n      // and is what the Shipments tab's analytics actually classify by.\n      if(lostShip?.id) await authClient.from('shipments').update({status:'failed'}).eq('id',lostShip.id);\n\n      await authClient.from('order_tracking_events').insert({\n        company_id:      window.SM.AUTH.company?.id,\n        order_id:        orderId,\n        tracking_status: 'Marked as lost',\n        notes:           fullNotes,\n        created_at:      failedAt,\n        user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n        user_id:         window.SM.AUTH.user?.id || null\n      });\n      await logActivity(orderId, oldStatus, 'lost', 'marked_lost', fullNotes);\n\n      ui().closeModal();\n      loadTracking();\n\n      setTimeout(()=>{\n        ui().openModal('Raise courier claim?', `\n          <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:0\">\n            <i class=\"ti ti-info-circle\"></i>\n            <span><strong>${util().sanitize(orderNumber)}</strong> has been marked as lost. Would you like to raise a courier claim now?</span>\n          </div>\n        `, `\n          <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Not now</button>\n          <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal();setTimeout(()=>window.IMS_LOGISTICS.openRaiseClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}'),300)\">\n            <i class=\"ti ti-file-alert\"></i> Raise courier claim\n          </button>\n        `, 'sm');\n      }, 600);\n      return;\n    }\n\n    // 1. Use already-fetched status and fail count\n    const oldStatus  = orderData?.status || 'dispatched';\n    const failCount  = (orderData?.failed_delivery_count || 0) + 1;\n\n    // 2. Save failed_delivery status\n    const { error: failErr } = await authClient.from('orders').update({\n      status:               'failed_delivery',\n      failure_reason:       finalReason,\n      last_failed_at:       failedAt,\n      failed_delivery_count: failCount\n    }).eq('id', orderId);\n    if(failErr){ ui().toast('Failed to update order: ' + failErr.message, 'error'); return; }\n\n    const { data: failShip } = await authClient.from('shipments')\n      .select('id').eq('order_id',orderId).eq('is_return_collection',false).order('created_at',{ascending:false}).limit(1).maybeSingle();\n    // shipments.status constraint has no 'failed_delivery' value \u2014 'failed' is correct here.\n    if(failShip?.id) await authClient.from('shipments').update({status:'failed'}).eq('id',failShip.id);\n\n    // 3. Log to tracking events\n    await authClient.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Failed delivery',\n      notes:           fullNotes,\n      created_at:      failedAt,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, oldStatus, 'failed_delivery', 'delivery_failed', fullNotes);\n\n    ui().closeModal();\n\n    // 4. Proceed with choice \u2014 pass finalReason so return knows why\n    if(choice === 'reattempt'){\n      await requestReAttempt(orderId, orderNumber, true);\n    } else {\n      await requestReturn(orderId, orderNumber, true, finalReason);\n    }\n  }\n\n  // \u2500\u2500\u2500 RE-ATTEMPT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function requestReAttempt(orderId, orderNumber, skipModal = false){\n    if(skipModal){\n      const authClient = window.supabase.createClient(\n        window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY,\n        {global:{headers:{Authorization:`Bearer ${window.SM.AUTH.session?.access_token}`}}}\n      );\n      const { error: raErr } = await authClient.from('orders').update({\n        status:                   're_attempted',\n        re_attempt_requested_at:  new Date().toISOString()\n      }).eq('id', orderId);\n      if(raErr){ ui().toast('Failed to update order: ' + raErr.message, 'error'); return; }\n\n      await authClient.from('order_tracking_events').insert({\n        company_id:      window.SM.AUTH.company?.id,\n        order_id:        orderId,\n        tracking_status: 'Re-attempt requested',\n        notes:           'Courier re-attempt requested',\n        user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n        user_id:         window.SM.AUTH.user?.id || null\n      });\n      await logActivity(orderId, 'failed_delivery', 're_attempted', 're_attempt_requested', 'Re-attempt requested with courier');\n      ui().toast(`${orderNumber} \u2014 re-attempt requested. Row is now blue on tracking.`, 'success', 5000);\n      loadTracking();\n      return;\n    }\n\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Request re-attempt \u2014 ${orderNumber}`, `\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>This will update the order status to <strong>Re-attempted</strong> and highlight it blue on tracking for follow-up until delivered or failed again.</span>\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-bottom:10px\">\n        <label class=\"ims__label ims__label--req\">Re-attempt requested date</label>\n        <input class=\"ims__input\" type=\"date\" id=\"ims-reattempt-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label\">Notes for courier (optional)</label>\n        <textarea class=\"ims__textarea\" id=\"ims-reattempt-notes\" rows=\"2\" placeholder=\"e.g. Customer will be home on Wednesday afternoon\"></textarea>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.confirmReAttempt('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-refresh\"></i> Confirm re-attempt</button>\n    `, 'sm');\n  }\n\n  async function confirmReAttempt(orderId, orderNumber){\n    const dateVal = document.getElementById('ims-reattempt-date')?.value;\n    const notes = document.getElementById('ims-reattempt-notes')?.value?.trim();\n    if(!dateVal){ ui().toast('Please select the re-attempt requested date','error'); return; }\n    const requestedAt = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n\n    const authClient = window.supabase.createClient(\n      window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY,\n      {global:{headers:{Authorization:`Bearer ${window.SM.AUTH.session?.access_token}`}}}\n    );\n    const { error } = await authClient.from('orders').update({\n      status:                  're_attempted',\n      re_attempt_requested_at: requestedAt\n    }).eq('id', orderId);\n    if(error){ ui().toast('Failed: ' + error.message, 'error'); return; }\n\n    await authClient.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Re-attempt requested',\n      notes:           notes || 'Re-attempt requested with courier',\n      created_at:      requestedAt,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, 'failed_delivery', 're_attempted', 're_attempt_requested', notes || 'Re-attempt requested with courier');\n    ui().closeModal();\n    ui().toast(`${orderNumber} \u2014 re-attempt requested. Row is now blue on tracking.`, 'success', 5000);\n    loadTracking();\n  }\n\n  // \u2500\u2500\u2500 RETURN TO WAREHOUSE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function requestReturn(orderId, orderNumber, skipModal = false, returnReason = null){\n    if(skipModal){\n      const authClient = window.supabase.createClient(\n        window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY,\n        {global:{headers:{Authorization:`Bearer ${window.SM.AUTH.session?.access_token}`}}}\n      );\n\n      // Guard against re-triggering this on an order that's already been\n      // resolved \u2014 e.g. selecting \"Return requested\" from the Tracking log\n      // dropdown on an order that was already marked received back at the\n      // warehouse days ago, which would otherwise silently regress a\n      // correctly-closed order back to return_in_transit.\n      const { data: current } = await authClient.from('orders').select('status').eq('id', orderId).maybeSingle();\n      if(current && ['return_received','delivered','refunded','cancelled'].includes(current.status)){\n        ui().toast(`${orderNumber} is already ${current.status.replace('_',' ')} \u2014 a return can't be re-requested from here.`, 'warning', 6000);\n        return;\n      }\n\n      const notes = returnReason || 'Return to warehouse requested';\n\n      const { error: retErr } = await authClient.from('orders').update({\n        status:               'return_in_transit',\n        return_requested_at:  new Date().toISOString(),\n        return_reason:        returnReason || null\n      }).eq('id', orderId);\n      if(retErr){ ui().toast('Failed to update order: ' + retErr.message, 'error'); return; }\n\n      await authClient.from('order_tracking_events').insert({\n        company_id:      window.SM.AUTH.company?.id,\n        order_id:        orderId,\n        tracking_status: 'Return in transit',\n        notes:           notes,\n        user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n        user_id:         window.SM.AUTH.user?.id || null\n      });\n      await logActivity(orderId, 'failed_delivery', 'return_in_transit', 'return_requested', notes);\n      ui().toast(`${orderNumber} \u2014 return requested. Row is now purple on tracking.`, 'info', 5000);\n      loadTracking();\n\n      // If reason is damage-related, prompt to raise a claim\n      if(returnReason && returnReason.toLowerCase().includes('damage')){\n        setTimeout(()=>{\n          ui().openModal('Raise damage claim?', `\n            <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:0\">\n              <i class=\"ti ti-alert-triangle\"></i>\n              <span><strong>${util().sanitize(orderNumber)}</strong> is returning due to damage in transit. Would you like to raise a courier claim for the damaged goods?</span>\n            </div>\n          `, `\n            <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Not now</button>\n            <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal();setTimeout(()=>window.IMS_LOGISTICS.openRaiseClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}'),300)\">\n              <i class=\"ti ti-file-alert\"></i> Raise damage claim\n            </button>\n          `, 'sm');\n        }, 800);\n      }\n      return;\n    }\n\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Return to warehouse \u2014 ${orderNumber}`, `\n      <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-alert-triangle\"></i>\n        <span>This will instruct the courier to return the shipment. The order will appear <strong>purple</strong> on tracking until the return is received at the warehouse.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Return requested date</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-return-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Return reason</label>\n          <select class=\"ims__select\" id=\"ims-return-reason\">\n            <option value=\"\">Select reason...</option>\n            <option value=\"Customer refused\">Customer refused delivery</option>\n            <option value=\"Wrong address \u2014 cannot locate\">Wrong address \u2014 cannot locate</option>\n            <option value=\"Damaged \u2014 returning for inspection\">Damaged \u2014 returning for inspection</option>\n            <option value=\"No one home \u2014 multiple attempts\">No one home \u2014 multiple attempts</option>\n            <option value=\"Order cancelled by customer\">Order cancelled by customer</option>\n            <option value=\"Other\">Other</option>\n          </select>\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label\">Additional notes</label>\n          <textarea class=\"ims__textarea\" id=\"ims-return-notes\" rows=\"2\" placeholder=\"Courier reference number, contact made, etc.\"></textarea>\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label style=\"display:flex;align-items:center;gap:8px;cursor:pointer\">\n            <input type=\"checkbox\" id=\"ims-return-notify\" checked> Notify courier by email to arrange the return\n          </label>\n          <span class=\"ims__input-hint\">Opens an editable email to the courier's customer-service address before finishing.</span>\n        </div>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--warning\" onclick=\"window.IMS_LOGISTICS.confirmReturn('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-arrow-back-up\"></i> Confirm return</button>\n    `, 'sm');\n  }\n\n  // Opens an editable email asking the courier to arrange return of the\n  // consignment to our warehouse. Uses the same direct-send helper as\n  // follow-ups/claims - optional, editable, and only sent on confirm.\n  async function openReturnNotify(orderId, orderNumber, reasonNote){\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { data: ship } = await client.from('shipments')\n      .select('tracking_number,couriers(name,cs_email)')\n      .eq('order_id', orderId).eq('is_return_collection', false).order('created_at',{ascending:false}).limit(1).maybeSingle();\n\n    const courier     = ship?.couriers;\n    const courierName = courier?.name || 'Courier';\n    // Delivered by our own van: there is no courier to notify (the goods\n    // come back on the van).\n    if(!ship){\n      ui().toast(`${orderNumber} was delivered by our own van: no courier to notify. The goods come back on the van; use \"Return received\" when they are back.`,'info',9000);\n      return;\n    }\n    const csEmail     = courier?.cs_email || '';\n    const tracking    = ship?.tracking_number || 'N/A';\n    const compName    = window.SM.AUTH.company?.name || 'MDF London Ltd';\n\n    const subject = `Return request - ${tracking} - ${orderNumber}`;\n    const body =\n`Dear ${courierName} Team,\n\nWe would like to arrange the return of the consignment below to our warehouse.\n\nTracking Number:   ${tracking}\nOrder Reference:   ${orderNumber}\nReason:            ${reasonNote || 'Return to sender'}\n\nPlease advise on the process for returning this consignment to us, including any reference number, collection arrangements, or charges that apply.\n\nKind regards,\n${compName}`;\n\n    ui().openModal(`Notify courier - return ${orderNumber}`, `\n      <div class=\"ims__form-grid\" style=\"margin-bottom:12px\">\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Send to</label>\n          <input class=\"ims__input\" type=\"email\" id=\"ims-rn-email\" value=\"${util().sanitize(csEmail)}\" placeholder=\"Courier customer-service email\">\n          ${csEmail?'':`<span class=\"ims__input-hint\" style=\"color:var(--ims-warning)\">${util().sanitize(courier?.name||'This courier')} has no customer-services email yet: add it in Logistics &rarr; Couriers, and it will fill in by itself next time.</span>`}\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Subject</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-rn-subject\" value=\"${util().sanitize(subject)}\">\n        </div>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label\">Email body (edit as needed before sending)</label>\n        <textarea class=\"ims__textarea\" id=\"ims-rn-body\" rows=\"13\" style=\"font-family:monospace;font-size:12px\">${util().sanitize(body)}</textarea>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Skip email</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.sendReturnNotify('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-send\"></i> Send to courier</button>\n    `, 'lg');\n  }\n\n  async function sendReturnNotify(orderId, orderNumber){\n    const to      = document.getElementById('ims-rn-email')?.value?.trim() || '';\n    const subject = document.getElementById('ims-rn-subject')?.value || '';\n    const body    = document.getElementById('ims-rn-body')?.value || '';\n    if(!to){ ui().toast('Please enter the courier email','error'); return; }\n\n    const result = await sendCourierEmail({\n      to, subject, body,\n      cc: window.SM.AUTH.company?.email || 'salesmdflondon@gmail.com',\n      orderId,\n      emailType: 'courier_return_request',\n      logNote: `Return notification sent to courier for ${orderNumber}`\n    });\n    if(!result.sent) return;\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Return request sent to courier',\n      notes:           `Return notification emailed to ${to}`,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n\n    ui().closeModal();\n    ui().toast(`Return request sent to ${to}`, 'success', 5000);\n    loadTracking();\n  }\n\n  async function confirmReturn(orderId, orderNumber){\n    const dateVal = document.getElementById('ims-return-date')?.value;\n    const reason = document.getElementById('ims-return-reason')?.value;\n    const notes  = document.getElementById('ims-return-notes')?.value?.trim();\n    if(!dateVal){ ui().toast('Please select the return requested date','error'); return; }\n    if(!reason){ ui().toast('Please select a return reason','error'); return; }\n    const fullNotes = notes ? `${reason} \u2014 ${notes}` : reason;\n    const requestedAt = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n\n    const authClient = window.supabase.createClient(\n      window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY,\n      {global:{headers:{Authorization:`Bearer ${window.SM.AUTH.session?.access_token}`}}}\n    );\n    const { data: ord } = await authClient.from('orders').select('status').eq('id',orderId).single();\n    const { error } = await authClient.from('orders').update({\n      status:              'return_in_transit',\n      return_requested_at: requestedAt,\n      return_reason:       reason\n    }).eq('id', orderId);\n    if(error){ ui().toast('Failed: ' + error.message, 'error'); return; }\n\n    await authClient.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Return in transit',\n      notes:           fullNotes,\n      created_at:      requestedAt,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, ord?.status || 'failed_delivery', 'return_in_transit', 'return_requested', fullNotes);\n    const notifyCourier = document.getElementById('ims-return-notify')?.checked;\n    ui().closeModal();\n    ui().toast(`${orderNumber} - return to warehouse initiated. Row is now purple on tracking.`, 'info', 5000);\n    loadTracking();\n\n    // Optional courier notification - opens an editable email, does not\n    // auto-send. Deferred slightly so it does not clash with the toast/claim\n    // prompt, and skipped silently if damage (the claim prompt takes priority).\n    if (notifyCourier && !reason.toLowerCase().includes('damage')) {\n      setTimeout(() => openReturnNotify(orderId, orderNumber, fullNotes), 400);\n    }\n\n    // Prompt claim if damage-related\n    if(reason.toLowerCase().includes('damage')){\n      setTimeout(()=>{\n        ui().openModal('Raise damage claim?', `\n          <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:0\">\n            <i class=\"ti ti-alert-triangle\"></i>\n            <span><strong>${util().sanitize(orderNumber)}</strong> is returning due to damage. Would you like to raise a courier claim?</span>\n          </div>\n        `, `\n          <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Not now</button>\n          <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal();setTimeout(()=>window.IMS_LOGISTICS.openRaiseClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}'),300)\">\n            <i class=\"ti ti-file-alert\"></i> Raise damage claim\n          </button>\n        `, 'sm');\n      }, 800);\n    }\n  }\n\n  // \u2500\u2500\u2500 MARK RETURN RECEIVED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function markReturnReceived(orderId, orderNumber){\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Return received \u2014 ${orderNumber}`, `\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Confirm the shipment has been physically received back at the warehouse. The order will move to the <strong>Lost &amp; Damaged</strong> section below for claim management.</span>\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-bottom:10px\">\n        <label class=\"ims__label ims__label--req\">Return received date</label>\n        <input class=\"ims__input\" type=\"date\" id=\"ims-retrcv-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-bottom:10px\">\n        <label class=\"ims__label\">Stock action</label>\n        <select class=\"ims__select\" id=\"ims-retrcv-stock\">\n          <option value=\"restore\">Restore stock to inventory</option>\n          <option value=\"inspect\">Hold for inspection \u2014 do not restore yet</option>\n          <option value=\"damaged\">Mark as damaged \u2014 do not restore</option>\n        </select>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label\">Notes</label>\n        <textarea class=\"ims__textarea\" id=\"ims-retrcv-notes\" rows=\"2\" placeholder=\"Condition of goods, any damage noted...\"></textarea>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--success\" onclick=\"window.IMS_LOGISTICS.confirmReturnReceived('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-package-import\"></i> Confirm received</button>\n    `, 'sm');\n  }\n\n  async function confirmReturnReceived(orderId, orderNumber){\n    const dateVal      = document.getElementById('ims-retrcv-date')?.value;\n    const stockAction = document.getElementById('ims-retrcv-stock')?.value;\n    const notes       = document.getElementById('ims-retrcv-notes')?.value?.trim();\n    if(!dateVal){ ui().toast('Please select the return received date','error'); return; }\n    const fullNotes   = `Stock action: ${stockAction}${notes ? ' \u2014 ' + notes : ''}`;\n    const receivedAt = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n\n    const authClient = window.supabase.createClient(\n      window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY,\n      {global:{headers:{Authorization:`Bearer ${window.SM.AUTH.session?.access_token}`}}}\n    );\n\n    const { error: rcvErr } = await authClient.from('orders').update({\n      status:             'return_received',\n      return_received_at: receivedAt\n    }).eq('id', orderId);\n    if(rcvErr){ ui().toast('Failed: ' + rcvErr.message, 'error'); return; }\n\n    await authClient.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Return received at warehouse',\n      notes:           fullNotes,\n      created_at:      receivedAt,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, 'return_in_transit', 'return_received', 'return_received', fullNotes);\n    // A courier collection for this return is now complete.\n    await authClient.from('shipments').update({status:'returned'}).eq('order_id',orderId).eq('is_return_collection',true).neq('status','returned');\n\n    let toastMsg = `${orderNumber} \u2014 return received at warehouse.`;\n\n    if(stockAction === 'restore'){\n      // Delegates to the shared smartRestock helper \u2014 this order came back\n      // via return_in_transit (a failed delivery attempt), meaning it very\n      // likely never actually reached 'delivered', so quantity was never\n      // deducted in the first place (only reserved at order creation).\n      // smartRestock checks this and releases the reservation instead of\n      // wrongly inflating quantity; if the order genuinely was delivered\n      // before this return, it restocks correctly instead.\n      const restockedCount = await smartRestock(orderId, orderNumber, 'Customer return received');\n      toastMsg += restockedCount ? ' Stock updated.' : ' No stock action taken (already processed, or nothing to restock).';\n    } else if(stockAction === 'damaged'){\n      toastMsg += ' Marked as damaged \u2014 stock not restored.';\n    } else {\n      toastMsg += ' Held for inspection.';\n    }\n\n    ui().closeModal();\n    ui().toast(toastMsg, 'success', 6000);\n    loadTracking();\n\n    // Receiving stock back and refunding the customer are two separate\n    // steps \u2014 nudge staff toward closing the loop rather than letting an\n    // order sit here indefinitely with the customer never actually\n    // refunded. Staggered later if the damage-claim prompt below is also\n    // about to show, so the two don't collide.\n    const { data: payStatus } = await authClient.from('orders').select('payment_status,total_value').eq('id', orderId).maybeSingle();\n    if(payStatus?.payment_status !== 'refunded'){\n      setTimeout(()=>{\n        ui().openModal('Refund still pending', `\n          <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:0\">\n            <i class=\"ti ti-alert-triangle\"></i>\n            <span><strong>${util().sanitize(orderNumber)}</strong> has been received back, but the customer hasn't been refunded yet. This order is flagged <strong>Refund pending</strong> in the Lost &amp; Damaged list until that's done.</span>\n          </div>\n        `, `\n          <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Not now</button>\n          <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal();setTimeout(()=>window.IMS_ORDERS?.processRefund('${util().jsArg(orderId)}',${payStatus?.total_value||0}),300)\">\n            <i class=\"ti ti-currency-pound\"></i> Process refund now\n          </button>\n        `, 'sm');\n      }, stockAction === 'damaged' ? 1400 : 800);\n    }\n\n    // If damaged stock action, prompt to raise claim\n    if(stockAction === 'damaged'){\n      setTimeout(()=>{\n        ui().openModal('Raise damage claim?', `\n          <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:0\">\n            <i class=\"ti ti-alert-triangle\"></i>\n            <span><strong>${util().sanitize(orderNumber)}</strong> has been received back damaged. Would you like to raise a courier claim for the damaged goods?</span>\n          </div>\n        `, `\n          <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Not now</button>\n          <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal();setTimeout(()=>window.IMS_LOGISTICS.openRaiseClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}'),300)\">\n            <i class=\"ti ti-file-alert\"></i> Raise damage claim\n          </button>\n        `, 'sm');\n      }, 800);\n    }\n  }\n\n  // \u2500\u2500\u2500 MARK AS LOST \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function markAsLost(orderId, orderNumber){\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Mark as lost \u2014 ${orderNumber}`, `\n      <div class=\"ims__alert ims__alert--danger\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-alert-triangle\"></i>\n        <span>Marking this order as lost will remove it from the tracking list and move it to the <strong>Lost &amp; Damaged</strong> section. Only use this when the courier has confirmed the parcel cannot be located.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Date confirmed lost</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-lost-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Reason</label>\n          <select class=\"ims__select\" id=\"ims-lost-reason\">\n            <option value=\"\">Select reason...</option>\n            <option value=\"Courier confirmed lost\">Courier confirmed lost</option>\n            <option value=\"No delivery after multiple attempts \u2014 presumed lost\">No delivery after multiple attempts \u2014 presumed lost</option>\n            <option value=\"Tracking shows no movement \u2014 presumed lost\">Tracking shows no movement \u2014 presumed lost</option>\n            <option value=\"Customer reports not received \u2014 courier cannot locate\">Customer reports not received \u2014 courier cannot locate</option>\n            <option value=\"Damaged beyond use \u2014 total loss\">Damaged beyond use \u2014 total loss</option>\n          </select>\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label\">Additional notes</label>\n          <textarea class=\"ims__textarea\" id=\"ims-lost-notes\" rows=\"2\" placeholder=\"Any additional context...\"></textarea>\n        </div>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--danger\" onclick=\"window.IMS_LOGISTICS.confirmMarkAsLost('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\">\n        <i class=\"ti ti-alert-triangle\"></i> Confirm \u2014 mark as lost\n      </button>\n    `, 'sm');\n  }\n\n  async function confirmMarkAsLost(orderId, orderNumber){\n    const dateVal = document.getElementById('ims-lost-date')?.value;\n    const reason = document.getElementById('ims-lost-reason')?.value;\n    const notes  = document.getElementById('ims-lost-notes')?.value?.trim();\n    if(!dateVal){ ui().toast('Please select the date confirmed lost','error'); return; }\n    if(!reason){ ui().toast('Please select a reason','error'); return; }\n    const fullNotes = notes ? `${reason} \u2014 ${notes}` : reason;\n    const lostAt = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n\n    const authClient = window.supabase.createClient(\n      window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY,\n      {global:{headers:{Authorization:`Bearer ${window.SM.AUTH.session?.access_token}`}}}\n    );\n\n    const { data: ord } = await authClient.from('orders')\n      .select('status').eq('id', orderId).single();\n\n    const { error: lostErr } = await authClient.from('orders')\n      .update({ status:'lost' }).eq('id', orderId);\n    if(lostErr){ ui().toast('Failed to mark as lost: ' + lostErr.message, 'error'); return; }\n\n    await authClient.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Marked as lost',\n      notes:           fullNotes,\n      created_at:      lostAt,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, ord?.status || 'failed_delivery', 'lost', 'marked_lost', fullNotes);\n\n    ui().closeModal();\n    loadTracking();\n\n    setTimeout(()=>{\n      ui().openModal('Raise courier claim?', `\n        <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:0\">\n          <i class=\"ti ti-info-circle\"></i>\n          <span><strong>${util().sanitize(orderNumber)}</strong> has been marked as lost. Would you like to raise a courier claim now?</span>\n        </div>\n      `, `\n        <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Not now</button>\n        <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal();setTimeout(()=>window.IMS_LOGISTICS.openRaiseClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}'),300)\">\n          <i class=\"ti ti-file-alert\"></i> Raise courier claim\n        </button>\n      `, 'sm');\n    }, 600);\n  }\n\n\n  // \u2500\u2500\u2500 COURIER FOLLOW-UP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Sends a courier-facing email (follow-up or claim) directly via the\n  // send-order-email Edge Function. Unlike customer emails these are B2B and\n  // can legitimately repeat (you may chase the same order many times), so\n  // there is NO dedup \u2014 every send is logged as its own row. Claims CC the\n  // company Gmail for a paper trail; routine follow-ups do not. Reply-to is\n  // the company Gmail so courier replies land where staff already work.\n  async function sendCourierEmail({ to, subject, body, cc, orderId, emailType, logNote }) {\n    if (!to || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(to.trim())) {\n      ui().toast('No valid courier email address \u2014 add one in Logistics \u2192 Couriers, or copy the email and send manually.', 'error', 7000);\n      return { sent: false };\n    }\n    // Plain-text body \u2192 simple HTML (preserve line breaks), so it renders\n    // correctly while still reading as a normal typed email.\n    const htmlBody = `<div style=\"font-family:Arial,sans-serif;font-size:14px;line-height:1.6;color:#0F172A;white-space:pre-wrap\">${util().sanitize(body)}</div>`;\n    try {\n      const res = await fetch(`${window.IMS_SUPABASE_URL}/functions/v1/send-order-email`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${window.IMS_SUPABASE_ANON_KEY}` },\n        body: JSON.stringify({ to: to.trim(), subject, html: htmlBody, cc: cc || undefined })\n      });\n      const out = await res.json().catch(() => ({}));\n      const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n\n      if (!res.ok || !out.success) {\n        const msg = out.error || `HTTP ${res.status}`;\n        await client.from('email_log').insert({\n          order_id: orderId, email_type: emailType, recipient: to.trim(),\n          subject, status: 'failed', error_message: msg\n        }).then(()=>{}, ()=>{});\n        ui().toast(`Email failed to send: ${msg}`, 'error', 8000);\n        return { sent: false, error: msg };\n      }\n\n      await client.from('email_log').insert({\n        order_id: orderId, email_type: emailType, recipient: to.trim(),\n        subject, status: 'sent', error_message: logNote || null\n      }).then(()=>{}, ()=>{});\n      return { sent: true };\n    } catch (err) {\n      ui().toast(`Email failed: ${String(err?.message || err)}`, 'error', 8000);\n      return { sent: false, error: String(err) };\n    }\n  }\n\n  async function openCourierFollowUp(orderId, orderNumber){\n    const shipment = (window._shipmentMap || {})[orderId];\n    const order    = (window._trackingOrders || []).find(o => o.id === orderId);\n    const courier  = shipment?.couriers || null;\n    const tracking = shipment?.tracking_number || 'N/A';\n    const postcode = order?.postcode || order?.end_postcode || 'N/A';\n    const custName = order?.customer_name || order?.end_customer_name || 'N/A';\n    const dispDate = order?.dispatched_at ? util().formatDate(order.dispatched_at) : 'N/A';\n    const daysSince= order?.dispatched_at ? Math.floor((new Date() - new Date(order.dispatched_at))/86400000) : '?';\n    const compName = window.SM.AUTH.company?.name || 'MDF London Ltd';\n    const csEmail  = courier?.cs_email || '';\n    const courierName = courier?.name || 'Courier';\n\n    // Status-aware wording, driven off the reliable orders.status field.\n    // A re-attempted order is a different conversation from a still-in-transit\n    // one, and phrasing it as such shows the courier we're tracking it\n    // properly. The last known tracking note (if any) is quoted for\n    // reference rather than used to build sentences, since it's manually\n    // entered and often stale.\n    const isReattempt = order?.status === 're_attempted';\n    const lastNote = order?.last_tracking_note || '';\n\n    const subject = isReattempt\n      ? `Re-attempt update requested \u2014 ${orderNumber} \u2014 ${tracking}`\n      : `Delivery update requested \u2014 ${orderNumber} \u2014 ${tracking}`;\n\n    const opening = isReattempt\n      ? `We previously reported a failed delivery on this shipment and a re-delivery was requested. It still has not shown a successful delivery, and we would like an update.`\n      : `We are following up on the shipment below, dispatched on ${dispDate} (${daysSince} days ago), which has not yet shown delivery confirmation.`;\n\n    const body =\n`Dear ${courierName} Customer Services,\n\n${opening}\n\nOrder Reference:   ${orderNumber}\nTracking Number:   ${tracking}\nDispatch Date:     ${dispDate}\nDays in Transit:   ${daysSince} days\nDelivery Postcode: ${postcode}\nCustomer Name:     ${custName}${lastNote ? `\nLast known status: ${lastNote}` : ''}\n\nPlease could you provide an update on the current status and expected delivery date? If the parcel cannot be located, please advise on next steps for raising a formal claim.\n\nKind regards,\n${compName}`;\n\n    ui().openModal(`Follow up courier \u2014 ${orderNumber}`, `\n      ${!csEmail ? `<div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:12px\"><i class=\"ti ti-alert-triangle\"></i><span>No customer services email configured for ${util().sanitize(courierName)}. Go to Logistics \u2192 Couriers \u2192 Edit to add one. Template still available below.</span></div>` : ''}\n      <div class=\"ims__form-grid\" style=\"margin-bottom:12px\">\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">To (courier CS email)</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-fu-email\" value=\"${util().sanitize(csEmail)}\" placeholder=\"courier@example.com\">\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Subject</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-fu-subject\" value=\"${util().sanitize(subject)}\">\n        </div>\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-bottom:10px\">\n        <label class=\"ims__label\">Email body (copy and paste into your email client)</label>\n        <textarea class=\"ims__textarea\" id=\"ims-fu-body\" rows=\"14\" style=\"font-family:monospace;font-size:12px\">${util().sanitize(body)}</textarea>\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-bottom:10px\">\n        <label class=\"ims__label\">Internal note (logged to tracking history)</label>\n        <input class=\"ims__input\" type=\"text\" id=\"ims-fu-note\" placeholder=\"e.g. Chased DPD \u2014 awaiting response\">\n      </div>\n      <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"\n        const b=document.getElementById('ims-fu-body');\n        const s=document.getElementById('ims-fu-subject');\n        navigator.clipboard.writeText('To: '+document.getElementById('ims-fu-email').value+'\\\\nSubject: '+s.value+'\\\\n\\\\n'+b.value)\n          .then(()=>window.SM.UI.toast('Email copied to clipboard','success'))\n          .catch(()=>window.SM.UI.toast('Copy failed \u2014 please select and copy manually','warning'));\n      \"><i class=\"ti ti-copy\"></i> Copy instead</button>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveFollowUp('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\">\n        <i class=\"ti ti-send\"></i> Send follow-up\n      </button>\n    `, 'lg');\n  }\n\n  async function saveFollowUp(orderId, orderNumber){\n    const note    = document.getElementById('ims-fu-note')?.value?.trim() || '';\n    const to      = document.getElementById('ims-fu-email')?.value?.trim() || '';\n    const subject = document.getElementById('ims-fu-subject')?.value || '';\n    const body    = document.getElementById('ims-fu-body')?.value || '';\n\n    const result = await sendCourierEmail({\n      to, subject, body, orderId,\n      emailType: 'courier_followup',\n      logNote: note || 'Courier chased for shipment update'\n    });\n    // If the send failed, keep the modal open so nothing is lost and the\n    // user can fix the address or copy the email instead.\n    if (!result.sent) return;\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Follow-up sent to courier',\n      notes:           note || 'Courier chased for shipment update',\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, null, null, 'courier_followup', `Follow-up emailed to courier${note ? ' \u2014 ' + note : ''}`);\n    ui().closeModal();\n    ui().toast(`Follow-up sent to ${to}`, 'success');\n    loadTracking();\n  }\n\n  // \u2500\u2500\u2500 RAISE COURIER CLAIM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function openRaiseClaim(orderId, orderNumber, claimType='lost'){\n    const client   = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    let shipment = (window._shipmentMap || {})[orderId] || (window._lostShipMap || {})[orderId];\n    const order    = (window._lostOrders  || []).find(o => o.id === orderId)\n                  || (window._trackingOrders || []).find(o => o.id === orderId);\n\n    // Fetch full order if not in cache\n    let orderData = order;\n    if(!orderData){\n      const { data } = await db().select('orders',{\n        select:'id,order_number,external_ref,status,customer_name,end_customer_name,postcode,end_postcode,total_value,dispatched_at,order_type,platforms(name)',\n        eq:{id:orderId}, maybeSingle:true, noCompanyFilter:true\n      });\n      orderData = data;\n    }\n\n    // Fetch shipment fresh if it's in neither cache \u2014 this happens right\n    // after an order is marked lost, since the main tracking query that\n    // builds window._shipmentMap explicitly excludes 'lost' orders, and\n    // window._lostShipMap may not have been populated yet either (e.g.\n    // when raising a claim immediately from the \"mark as lost\" prompt,\n    // before Lost Orders has fully re-rendered).\n    if(!shipment){\n      const { data: freshShipment } = await client\n        .from('shipments')\n        .select('order_id,tracking_number,courier_id,couriers(name,claims_email,cs_email,tracking_url_base,requires_postcode,postcode_param,tracking_form_only)').eq('is_return_collection',false)\n        .eq('order_id', orderId)\n        .order('created_at', { ascending: false })\n        .limit(1)\n        .maybeSingle();\n      shipment = freshShipment || null;\n    }\n\n    const courier      = shipment?.couriers || null;\n    const courierId    = shipment?.courier_id || null;\n    const courierName  = courier?.name || 'Unknown courier';\n    const claimsEmail  = courier?.claims_email || '';\n    const tracking     = shipment?.tracking_number || 'N/A';\n    const postcode     = orderData?.postcode || orderData?.end_postcode || 'N/A';\n    const custName     = orderData?.customer_name || orderData?.end_customer_name || 'N/A';\n    const dispDate     = orderData?.dispatched_at ? util().formatDate(orderData.dispatched_at) : 'N/A';\n    // A damage claim is very often for less than the full order value \u2014\n    // only some items/boxes arrived damaged \u2014 so it still defaults to the\n    // full total as a sensible starting point, but staff can edit this\n    // down to the actual damaged portion before sending.\n    const claimAmt     = orderData?.total_value || 0;\n    const compName     = window.SM.AUTH.company?.name || 'MDF London Ltd';\n    // Marketplace's own order reference (e.g. the Temu/Amazon order ID).\n    // Couriers and marketplaces both key off this, so it belongs in the\n    // claim email \u2014 our internal ORD-xxxxx number means nothing to them.\n    const extRef       = orderData?.external_ref || '';\n\n    // Generate claim ref\n    // Order by claim_ref itself (not created_at, which does not exist on\n    // this table - that silently returned nothing and reset every claim to\n    // CLM-00001). Since refs are zero-padded to 5 digits, string-descending\n    // order matches numeric order and reliably finds the highest existing\n    // number to increment from.\n    const { data: lastClaim } = await client.from('claims')\n      .select('claim_ref').not('claim_ref','is',null)\n      .order('claim_ref', { ascending: false }).limit(1).maybeSingle();\n    const claimRef = util().generateRef('CLM', lastClaim?.claim_ref);\n\n    const { subject, body } = buildClaimEmail(claimType, {\n      courierName, orderNumber, extRef, claimRef, tracking, dispDate, postcode, custName, claimAmt, compName\n    });\n\n    ui().openModal(`Raise courier claim \u2014 ${orderNumber}`, `\n      <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px\">\n        <div><span class=\"ims__label\">Claim reference</span><div style=\"font-weight:700;font-size:15px;color:var(--ims-accent)\">${claimRef}</div></div>\n        <div><span class=\"ims__label\">Courier</span><div>${util().sanitize(courierName)}</div></div>\n        <div><span class=\"ims__label\">Order</span><div>${util().sanitize(orderNumber)}</div></div>\n        <div><span class=\"ims__label\">Tracking #</span><div style=\"font-family:monospace\">${util().sanitize(tracking)}</div></div>\n        <div><span class=\"ims__label\">Marketplace ref</span><div style=\"font-family:monospace\">${extRef ? util().sanitize(extRef) : '<span style=\"color:var(--ims-text-muted);font-family:inherit\">Not set</span>'}</div></div>\n      </div>\n      <div class=\"ims__form-grid\" style=\"margin-bottom:12px\">\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Claim type</label>\n          <select class=\"ims__select\" id=\"ims-clm-type\" onchange=\"window.IMS_LOGISTICS.syncClaimType('${util().jsArg(orderNumber)}','${util().jsArg(courierName)}','${util().jsArg(extRef)}','${util().jsArg(claimRef)}','${util().jsArg(tracking)}','${util().jsArg(dispDate)}','${util().jsArg(postcode)}','${util().jsArg(custName)}','${util().jsArg(compName)}')\">\n            <option value=\"lost\" ${claimType==='lost'?'selected':''}>Lost / undelivered</option>\n            <option value=\"damaged\" ${claimType==='damaged'?'selected':''}>Damaged</option>\n          </select>\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Amount claimed (\u00A3)</label>\n          <input class=\"ims__input\" type=\"number\" step=\"0.01\" id=\"ims-clm-amount\" value=\"${claimAmt.toFixed(2)}\" oninput=\"window.IMS_LOGISTICS.syncClaimAmount()\">\n          ${claimType==='damaged'?'<span class=\"ims__input-hint\">Defaults to the full order value \u2014 reduce this if only part of the order was affected</span>':''}\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Claims email</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-clm-email\" value=\"${util().sanitize(claimsEmail)}\" placeholder=\"claims@courier.com\">\n          ${!claimsEmail ? '<span class=\"ims__input-hint\" style=\"color:var(--ims-warning)\">No claims email set \u2014 configure in Couriers tab</span>' : ''}\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Subject</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-clm-subject\" value=\"${util().sanitize(subject)}\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label\">Internal description</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-clm-desc\" value=\"${claimType==='damaged'?'Damaged':'Lost'} shipment \u2014 ${util().sanitize(orderNumber)} \u2014 ${util().sanitize(courierName)}\">\n        </div>\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-bottom:10px\">\n        <label class=\"ims__label\">Email body (copy and paste into your email client)</label>\n        <textarea class=\"ims__textarea\" id=\"ims-clm-body\" rows=\"16\" style=\"font-family:monospace;font-size:12px\">${util().sanitize(body)}</textarea>\n      </div>\n      <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"\n        const to=document.getElementById('ims-clm-email').value;\n        const sub=document.getElementById('ims-clm-subject').value;\n        const bod=document.getElementById('ims-clm-body').value;\n        navigator.clipboard.writeText('To: '+to+'\\\\nSubject: '+sub+'\\\\n\\\\n'+bod)\n          .then(()=>window.SM.UI.toast('Claim email copied to clipboard','success'))\n          .catch(()=>window.SM.UI.toast('Copy failed \u2014 select and copy manually','warning'));\n      \"><i class=\"ti ti-copy\"></i> Copy instead</button>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel \u2014 raise later</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}','${util().jsArg(claimRef)}','${util().jsArg(courierId||'')}')\">\n        <i class=\"ti ti-send\"></i> Send &amp; save claim \u2014 ${claimRef}\n      </button>\n    `, 'xl');\n  }\n\n  // Shared by openRaiseClaim (initial render) and syncClaimType (dropdown\n  // change) so the two can never drift out of sync with each other.\n  function buildClaimEmail(claimType, d){\n    const subject = claimType==='damaged'\n      ? `Damage Claim - ${d.tracking} - ${d.orderNumber} - ${d.claimRef}`\n      : `Formal Courier Claim - ${d.tracking} - ${d.orderNumber} - ${d.claimRef}`;\n    const openingLine = claimType==='damaged'\n      ? 'We are writing to raise a claim regarding a shipment that was returned to us in a damaged condition, as detailed below.'\n      : 'We are formally raising a claim for a lost/undelivered shipment as detailed below.';\n    const closingLine = claimType==='damaged'\n      ? 'The parcel was returned to us with visible damage to the contents. We request formal investigation and compensation in accordance with your claims policy.'\n      : 'Despite our follow-up communications, this shipment has not been delivered and cannot be located. We request formal investigation and compensation in accordance with your claims policy.';\n    const body =\n`Dear ${d.courierName} Claims Department,\n\n${openingLine}\n\nClaim Reference:   ${d.claimRef}\nOrder Reference:   ${d.orderNumber}${d.extRef ? `\nMarketplace Ref:   ${d.extRef}` : ''}\nTracking Number:   ${d.tracking}\nDispatch Date:     ${d.dispDate}\nDelivery Postcode: ${d.postcode}\nCustomer Name:     ${d.custName}\nAmount Claimed:    \u00A3${d.claimAmt.toFixed(2)}\n\n${closingLine}\n\nPlease acknowledge receipt of this claim and advise on the next steps and timeline.\n\nKind regards,\n${d.compName}`;\n    return { subject, body };\n  }\n\n  // Regenerates subject + body when the claim type dropdown is switched,\n  // preserving whatever amount is currently in the form.\n  function syncClaimType(orderNumber, courierName, extRef, claimRef, tracking, dispDate, postcode, custName, compName){\n    const claimType = document.getElementById('ims-clm-type')?.value || 'lost';\n    const claimAmt = parseFloat(document.getElementById('ims-clm-amount')?.value) || 0;\n    const { subject, body } = buildClaimEmail(claimType, {\n      courierName, orderNumber, extRef, claimRef, tracking, dispDate, postcode, custName, claimAmt, compName\n    });\n    const subjectEl = document.getElementById('ims-clm-subject');\n    const bodyEl = document.getElementById('ims-clm-body');\n    const descEl = document.getElementById('ims-clm-desc');\n    if(subjectEl) subjectEl.value = subject;\n    if(bodyEl) bodyEl.value = body;\n    if(descEl) descEl.value = `${claimType==='damaged'?'Damaged':'Lost'} shipment \u2014 ${orderNumber} \u2014 ${courierName}`;\n  }\n\n  // Keeps the \"Amount Claimed: \u00A3X.XX\" line in the email body in sync with\n  // the amount field as it's edited, so what gets sent always matches.\n  function syncClaimAmount(){\n    const amt = parseFloat(document.getElementById('ims-clm-amount')?.value) || 0;\n    const bodyEl = document.getElementById('ims-clm-body');\n    if (!bodyEl) return;\n    bodyEl.value = bodyEl.value.replace(/Amount Claimed:\\s*\u00A3[\\d.,]+/, `Amount Claimed:    \u00A3${amt.toFixed(2)}`);\n  }\n\n  async function saveClaim(orderId, orderNumber, claimRef, courierId){\n    const amount    = parseFloat(document.getElementById('ims-clm-amount')?.value) || 0;\n    const claimType = document.getElementById('ims-clm-type')?.value || 'lost';\n    const desc      = document.getElementById('ims-clm-desc')?.value?.trim() || '';\n    const to        = document.getElementById('ims-clm-email')?.value?.trim() || '';\n    const subject   = document.getElementById('ims-clm-subject')?.value || '';\n    const body      = document.getElementById('ims-clm-body')?.value || '';\n\n    // Send first \u2014 if the courier email can't go, don't record the claim as\n    // raised, so \"raised\" always means the courier was actually notified.\n    // Claims CC the company Gmail for a paper trail.\n    const result = await sendCourierEmail({\n      to, subject, body,\n      cc: window.SM.AUTH.company?.email || 'salesmdflondon@gmail.com',\n      orderId, emailType: 'courier_claim',\n      logNote: `${claimRef} \u2014 \u00A3${amount.toFixed(2)}`\n    });\n    if (!result.sent) return;\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n\n    const { error } = await client.from('claims').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      courier_id:      courierId || null,\n      claim_reference: claimRef,\n      claim_ref:       claimRef,\n      claim_type:      claimType,\n      items_value:     amount,\n      amount_claimed:  amount,\n      description:     desc,\n      status:          'raised',\n      raised_at:       new Date().toISOString()\n    });\n\n    if(error){ ui().toast('Failed to save claim: ' + error.message, 'error'); return; }\n\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Claim raised',\n      notes:           `${claimRef} \u2014 \u00A3${amount.toFixed(2)} claimed`,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    // A damaged-return claim's order sits at return_received (goods really\n    // are back in the warehouse, just unsellable), not lost \u2014 the old\n    // hardcoded 'lost'\u2192'lost' label here was misleading for that case even\n    // though it never actually touched the real order status (logActivity\n    // only writes to the audit log).\n    const fromStatus = claimType === 'damaged' ? 'return_received' : 'lost';\n    await logActivity(orderId, fromStatus, fromStatus, claimType === 'damaged' ? 'damage_claim_raised' : 'claim_raised', `${claimRef} \u2014 \u00A3${amount.toFixed(2)}`);\n\n    ui().closeModal();\n    ui().toast(`Claim ${claimRef} sent to courier & raised \u2014 visible in Accounts \u2192 Claims`, 'success', 5000);\n    loadLostOrders();\n  }\n\n  // \u2500\u2500\u2500 LOST ORDERS 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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // \u2500\u2500\u2500 COURIER-ISSUED CLAIM REFERENCE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Couriers issue their own claim reference only after they acknowledge\n  // the claim, so this can't be captured at raise time \u2014 it's entered\n  // afterwards from the Lost Orders row and stored alongside our own\n  // internal CLM-xxxxx reference, not instead of it.\n  function openCourierClaimRef(claimId, internalRef, currentRef){\n    ui().openModal(`Courier claim reference \u2014 ${internalRef}`, `\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:12px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Enter the reference number the courier gave you when they acknowledged this claim. Your internal reference <strong>${util().sanitize(internalRef)}</strong> is kept as-is.</span>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label\">Courier claim reference</label>\n        <input class=\"ims__input\" type=\"text\" id=\"ims-ccr-value\" value=\"${util().sanitize(currentRef || '')}\" placeholder=\"e.g. XDP-CLM-88213\" style=\"font-family:monospace\">\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveCourierClaimRef('${util().jsArg(claimId)}')\"><i class=\"ti ti-check\"></i> Save reference</button>\n    `, 'sm');\n  }\n\n  async function saveCourierClaimRef(claimId){\n    const val = document.getElementById('ims-ccr-value')?.value?.trim() || '';\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { error } = await client.from('claims')\n      .update({ courier_claim_ref: val || null })\n      .eq('id', claimId);\n    if(error){ ui().toast('Failed to save: ' + error.message, 'error'); return; }\n    ui().closeModal();\n    ui().toast(val ? 'Courier claim reference saved' : 'Courier claim reference cleared', 'success');\n    loadLostOrders();\n  }\n\n  // Claim statuses that mean the case is finished. 'recovered' is set by\n  // \"Parcel found\" (saleable); 'written_off' by \"Close without claim\".\n  const CLOSED_CLAIM_STATUSES = ['settled', 'rejected', 'recovered', 'written_off'];\n\n  // Finished cases leave Lost Orders but stay available here: the full\n  // claims history in Accounts > Claims (and Reports > Courier claims log).\n  function viewClosedClaims(){\n    window.SM.UI.showPanel('accounts');\n    setTimeout(() => window.IMS_ACCOUNTS?.switchTab?.('claims'), 300);\n  }\n\n  async function loadLostOrders(){\n    const wrap = document.getElementById('ims-lost-orders-wrap');\n    if(!wrap) return;\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const companyId = window.SM.AUTH.company?.id;\n\n    // Pull lost orders + return_received (damaged returns back at warehouse awaiting claim)\n    // return_in_transit stays in main tracking table\n    const { data: lostOrders } = await client\n      .from('orders')\n      .select('id,order_number,external_ref,status,fulfillment_type,order_type,customer_name,end_customer_name,postcode,end_postcode,total_value,payment_status,dispatched_at,platforms(name),created_at')\n      .eq('company_id', companyId)\n      .in('status', ['lost','return_received'])\n      .order('dispatched_at', { ascending: false });\n\n    // Also pull orders with a valid claim that may have moved to other statuses\n    const { data: claimedRows } = await client\n      .from('claims')\n      .select('order_id')\n      .eq('company_id', companyId)\n      .not('claim_ref','is',null);\n\n    const claimedIds  = (claimedRows||[]).map(c=>c.order_id).filter(Boolean);\n    const existingIds = (lostOrders||[]).map(o=>o.id);\n    const extraIds    = claimedIds.filter(id=>!existingIds.includes(id));\n\n    let extraOrders = [];\n    if(extraIds.length){\n      const {data:extras} = await client.from('orders')\n        .select('id,order_number,external_ref,status,fulfillment_type,order_type,customer_name,end_customer_name,postcode,end_postcode,total_value,payment_status,dispatched_at,platforms(name),created_at')\n        .in('id', extraIds);\n      extraOrders = extras || [];\n    }\n\n    const allItems = [...(lostOrders||[]), ...extraOrders];\n    const items = allItems;\n    window._lostOrders = items;\n\n    if(!items.length){\n      wrap.innerHTML = `<div class=\"ims__empty\" style=\"padding:30px\"><i class=\"ti ti-circle-check\"></i><p style=\"font-size:13px\">No lost or damaged orders</p></div>`;\n      return;\n    }\n\n    const orderIds = items.map(o => o.id);\n\n    // Shipments for lost orders\n    const { data: shipments } = await client\n      .from('shipments')\n      .select('order_id,tracking_number,courier_id,couriers(name,claims_email,cs_email,tracking_url_base,requires_postcode,postcode_param,tracking_form_only)').eq('is_return_collection',false)\n      .in('order_id', orderIds)\n      .order('created_at', { ascending: false });\n\n    const lostShipMap = {};\n    (shipments || []).forEach(s => { if(!lostShipMap[s.order_id]) lostShipMap[s.order_id] = s; });\n    window._lostShipMap = lostShipMap;\n\n    // Claims for lost orders\n    const { data: claims } = await client\n      .from('claims')\n      .select('id,order_id,claim_ref,courier_claim_ref,claim_type,status,amount_claimed,amount_settled,raised_at,settled_at,rejected_at')\n      .in('order_id', orderIds)\n      .order('raised_at', { ascending: false });\n\n    const claimMap = {};\n    (claims || []).forEach(c => { if(!claimMap[c.order_id]) claimMap[c.order_id] = c; });\n\n    // Latest tracking event per lost order\n    const { data: events } = await client\n      .from('order_tracking_events')\n      .select('order_id,tracking_status,created_at')\n      .in('order_id', orderIds)\n      .order('created_at', { ascending: false });\n\n    const lostLatestEvent = {};\n    (events || []).forEach(e => { if(!lostLatestEvent[e.order_id]) lostLatestEvent[e.order_id] = e; });\n\n    // Only cases that still need action stay on this list: goods back with\n    // a refund still pending, a claim still open, or a lost order with no\n    // claim yet. Finished cases (claim settled, rejected, parcel found, or\n    // closed without a claim) leave the list and stay available in\n    // Accounts > Claims and Reports > Courier claims log.\n    const isOpenCase = o => {\n      const c = claimMap[o.id];\n      if (o.status === 'return_received' && o.payment_status !== 'refunded') return true;\n      if (c) return !CLOSED_CLAIM_STATUSES.includes(c.status);\n      return o.status === 'lost';\n    };\n    const openItems = items.filter(isOpenCase);\n    const historyLink = `<span class=\"ims__link\" style=\"font-size:12px\" onclick=\"window.IMS_LOGISTICS.viewClosedClaims()\"><i class=\"ti ti-archive\"></i> View closed claims</span>`;\n    if (!openItems.length) {\n      wrap.innerHTML = `<div class=\"ims__empty\" style=\"padding:30px\"><i class=\"ti ti-circle-check\"></i><p style=\"font-size:13px\">No open lost or damaged cases</p><p style=\"margin-top:6px\">${historyLink}</p></div>`;\n      return;\n    }\n\n    const rows = openItems.map(o => {\n      const shipment   = lostShipMap[o.id];\n      const claim      = claimMap[o.id];\n      const courier    = shipment?.couriers || null;\n      const courierName= courier?.name || '\u2014';\n      const tracking   = shipment?.tracking_number || '\u2014';\n      const postcode   = o.postcode || o.end_postcode || '\u2014';\n      const custName   = util().sanitize(o.customer_name || o.end_customer_name || '\u2014');\n      const lostDate   = util().formatDate(o.dispatched_at || o.created_at);\n      const daysSince  = o.dispatched_at ? Math.floor((new Date() - new Date(o.dispatched_at))/86400000) : '?';\n      const latestEvt  = lostLatestEvent[o.id];\n\n      // Claim status badge\n      let claimBadge = '<span class=\"ims__pill ims__pill--neutral\" style=\"font-size:10px\">No claim</span>';\n      let claimRef   = '\u2014';\n      if(claim){\n        // Show our internal CLM-xxxxx on top and the courier's own claim\n        // reference beneath it once they've issued one \u2014 both are needed:\n        // theirs for chasing the courier, ours for internal records.\n        const internalRef = util().sanitize(claim.claim_ref || '\u2014');\n        claimRef = claim.courier_claim_ref\n          ? `${internalRef}<div style=\"font-size:10px;font-weight:500;color:var(--ims-text-sec);font-family:monospace;margin-top:2px\" title=\"Courier claim reference\">${util().sanitize(claim.courier_claim_ref)}</div>`\n          : `${internalRef}<div style=\"font-size:10px;font-weight:400;color:var(--ims-text-muted);margin-top:2px\">No courier ref</div>`;\n        const claimColors = {\n          raised:'warning', acknowledged:'info', escalated_14:'danger',\n          overdue_30:'danger', settled:'success', rejected:'danger',\n          recovered:'success', written_off:'neutral'\n        };\n        const claimLabels = {\n          raised:'Raised', acknowledged:'Acknowledged', escalated_14:'Escalated',\n          overdue_30:'Overdue', settled:'Settled', rejected:'Rejected',\n          recovered:'Parcel found', written_off:'Written off'\n        };\n        claimBadge = `<span class=\"ims__pill ims__pill--${claimColors[claim.status]||'neutral'}\" style=\"font-size:10px\">${claimLabels[claim.status]||claim.status}</span>`;\n        if(claim.claim_type === 'damaged'){\n          claimBadge += ` <span class=\"ims__pill ims__pill--accent\" style=\"font-size:9px\" title=\"Claim for damaged goods, not a total loss\">Damaged</span>`;\n        }\n        if(claim.status === 'settled' && claim.amount_settled){\n          claimBadge += `<div style=\"font-size:10px;color:var(--ims-success);margin-top:2px\">\u00A3${claim.amount_settled.toFixed(2)} settled</div>`;\n        }\n        if(claim.status === 'rejected'){\n          claimBadge += `<div style=\"font-size:10px;color:var(--ims-danger);margin-top:2px\">Written off as expense</div>`;\n        }\n      }\n\n      // Latest status line\n      const latestLine = latestEvt\n        ? `<div style=\"font-size:10px;color:var(--ims-text-sec);margin-top:2px;font-style:italic\">${util().sanitize(latestEvt.tracking_status)} \u2014 ${util().formatDate(latestEvt.created_at)}</div>`\n        : '';\n\n      // Receiving stock back and refunding the customer are two separate\n      // steps (logistics vs accounts) with nothing previously connecting\n      // them \u2014 an order could sit at return_received indefinitely with\n      // the customer never actually refunded, and nothing surfaced that.\n      const refundPending = o.status === 'return_received' && o.payment_status !== 'refunded';\n      const refundBadge = refundPending\n        ? `<div style=\"margin-top:3px\"><span class=\"ims__pill ims__pill--danger\" style=\"font-size:9px\" title=\"Goods are back but the customer has not been refunded yet\">Refund pending</span></div>`\n        : '';\n\n      // Action buttons\n      const canRaiseClaim   = !claim;\n      // Some orders land here still mid-transit rather than genuinely\n      // lost or already received back \u2014 give a direct way to close that\n      // out here too, instead of forcing a hunt through Tracking (which\n      // may not even show the order if its logistics_jobs entry is in an\n      // unusual state).\n      const canMarkReceived = o.status !== 'return_received' && o.status !== 'lost';\n      // Claim actions only while the claim is still open. \"Parcel found\"\n      // (saleable) closes a claim too, so Settle, Reject and Parcel found\n      // must not show after it. Before, they still did, which is how\n      // CLM-00002 was settled on top of a \"Parcel found\".\n      const claimOpen       = !!claim && !CLOSED_CLAIM_STATUSES.includes(claim.status);\n      const canSettle       = claimOpen;\n      const canReject       = claimOpen;\n      // A lost order that will never be claimed (for example lost on our\n      // own van) can be closed and written off. Admin only: posts an expense.\n      const canCloseNoClaim = !claim && o.status === 'lost' && window.SM.AUTH.isAdmin();\n      const canAddCourierRef = !!claim;\n      // Reminders only make sense while a claim is genuinely outstanding.\n      const canChaseClaim    = claimOpen;\n      const claimDaysOut     = claim?.raised_at\n        ? Math.floor((Date.now() - new Date(claim.raised_at).getTime()) / 86400000) : 0;\n\n      const actions = `<div class=\"ims__btn-group\" style=\"flex-wrap:nowrap\">\n        <button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openTrackingHistory('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"View full activity log\"><i class=\"ti ti-history\"></i></button>\n        <button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.addLostOrderNote('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Add manual note\"><i class=\"ti ti-pencil\"></i></button>\n        ${canMarkReceived ? `<button class=\"ims__btn ims__btn--success ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.markReturnReceived('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Mark as received back at the warehouse\"><i class=\"ti ti-package-import\"></i> Return received</button>` : ''}\n        ${refundPending ? `<button class=\"ims__btn ims__btn--danger ims__btn--sm\" onclick=\"window.IMS_ORDERS?.processRefund('${util().jsArg(o.id)}',${o.total_value||0})\" title=\"Customer has not been refunded yet\"><i class=\"ti ti-currency-pound\"></i> Process refund</button>` : ''}\n        ${canRaiseClaim ? `<button class=\"ims__btn ims__btn--warning ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.openRaiseClaim('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\" title=\"Raise courier claim\"><i class=\"ti ti-file-alert\"></i> Raise claim</button>` : ''}\n        ${canCloseNoClaim ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.openCloseNoClaim('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}',${o.total_value||0})\" title=\"No claim will be made: close this case and write it off\"><i class=\"ti ti-archive\"></i> Close without claim</button>` : ''}\n        ${canAddCourierRef ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openCourierClaimRef('${util().jsArg(claim.id)}','${util().jsArg(claim.claim_ref||'')}','${util().jsArg(claim.courier_claim_ref||'')}')\" title=\"${claim.courier_claim_ref ? 'Edit' : 'Add'} courier claim reference\"><i class=\"ti ti-hash\"></i></button>` : ''}\n        ${canChaseClaim ? `<button class=\"ims__btn ${claimDaysOut >= 14 ? 'ims__btn--warning' : 'ims__btn--secondary'} ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openClaimFollowUp('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}','${util().jsArg(claim.id)}')\" title=\"Send claim reminder to courier${claimDaysOut ? ' (' + claimDaysOut + ' days outstanding)' : ''}\"><i class=\"ti ti-bell-ringing\"></i></button>` : ''}\n        ${canSettle     ? `<button class=\"ims__btn ims__btn--success ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.openSettleClaim('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}','${util().jsArg(claim.id)}','${util().jsArg(claim.claim_ref)}',${claim.amount_claimed})\" title=\"Settle claim\"><i class=\"ti ti-cash\"></i> Settle</button>` : ''}\n        ${canSettle     ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.openParcelFound('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}','${util().jsArg(claim.id)}','${util().jsArg(claim.claim_ref)}')\" title=\"Parcel found and returned - close claim with no charge\"><i class=\"ti ti-package\"></i> Parcel found</button>` : ''}\n        ${canReject     ? `<button class=\"ims__btn ims__btn--danger ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.openRejectClaim('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}','${util().jsArg(claim.id)}','${util().jsArg(claim.claim_ref)}',${claim.amount_claimed})\" title=\"Reject claim\"><i class=\"ti ti-x\"></i> Reject</button>` : ''}\n      </div>`;\n\n      return `<tr>\n        <td><span class=\"ims__link\" onclick=\"window.IMS_ORDERS?.openOrder('${util().jsArg(o.id)}')\">${util().sanitize(o.order_number)}</span>${refundBadge}</td>\n        <td style=\"font-family:monospace;font-size:11px;color:var(--ims-text-sec)\">${o.external_ref ? util().sanitize(o.external_ref) : '\u2014'}</td>\n        <td><span class=\"ims__pill ims__pill--info\" style=\"font-size:10px\">${util().sanitize(o.platforms?.name||'\u2014')}</span></td>\n        <td>${custName}</td>\n        <td style=\"font-size:12px\">${util().sanitize(courierName)}</td>\n        <td style=\"font-family:monospace;font-size:12px\">${util().sanitize(tracking)}</td>\n        <td style=\"font-size:11px\">${lostDate}</td>\n        <td style=\"font-size:12px;font-weight:600;color:var(--ims-accent)\">${claimRef}</td>\n        <td>${claimBadge}</td>\n        <td style=\"font-size:12px;color:var(--ims-warning);font-weight:600\">${daysSince}d${latestLine}</td>\n        <td>${actions}</td>\n      </tr>`;\n    }).join('');\n\n    wrap.innerHTML = `\n      <div class=\"ims__card\" style=\"margin-top:20px\">\n        <div class=\"ims__card-header\">\n          <div class=\"ims__card-title\"><i class=\"ti ti-alert-triangle\" style=\"color:var(--ims-danger)\"></i>Lost Orders (${openItems.length})</div>\n          <span style=\"font-size:12px;color:var(--ims-text-muted)\">Open cases only. Finished cases: ${historyLink}</span>\n        </div>\n        <div class=\"ims__table-wrap\">\n          <table class=\"ims__table\">\n            <thead><tr>\n              <th>Order #</th><th>Marketplace ref</th><th>Platform</th><th>Customer</th><th>Courier</th>\n              <th>Tracking #</th><th>Lost on</th><th>Claim #</th>\n              <th>Claim status</th><th>Days</th><th>Actions</th>\n            </tr></thead>\n            <tbody>${rows}</tbody>\n          </table>\n        </div>\n      </div>`;\n  }\n\n  // \u2500\u2500\u2500 ADD MANUAL NOTE TO LOST ORDER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // \u2500\u2500\u2500 CLAIM FOLLOW-UP / REMINDER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Chases a courier on an outstanding claim. Unlike the initial claim,\n  // reminders can legitimately be sent repeatedly, so there is no dedup -\n  // each chase is its own logged event. Days-outstanding is computed from\n  // the claim's raised_at so the courier sees exactly how long it has sat.\n  async function openClaimFollowUp(orderId, orderNumber, claimId){\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { data: claim } = await client.from('claims')\n      .select('id,claim_ref,courier_claim_ref,amount_claimed,raised_at,status')\n      .eq('id', claimId).maybeSingle();\n    if(!claim){ ui().toast('Claim not found','error'); return; }\n\n    const ship        = (window._lostShipMap || {})[orderId];\n    const courier     = ship?.couriers;\n    const courierName = courier?.name || 'Courier';\n    const claimsEmail = courier?.claims_email || '';\n    const tracking    = ship?.tracking_number || 'N/A';\n    const compName    = window.SM.AUTH.company?.name || 'MDF London Ltd';\n    const raisedDate  = claim.raised_at ? util().formatDate(claim.raised_at) : 'N/A';\n    const daysOut     = claim.raised_at\n      ? Math.floor((Date.now() - new Date(claim.raised_at).getTime()) / 86400000)\n      : 0;\n    const amount      = parseFloat(claim.amount_claimed || 0);\n\n    const subject = `Claim reminder - ${claim.claim_ref}${claim.courier_claim_ref ? ' / ' + claim.courier_claim_ref : ''} - ${orderNumber}`;\n\n    const body =\n`Dear ${courierName} Claims Department,\n\nWe are following up on the claim below, which was raised ${daysOut} day${daysOut===1?'':'s'} ago and remains unresolved. We have not yet received an update or settlement decision.\n\nOur Claim Reference:    ${claim.claim_ref}${claim.courier_claim_ref ? `\nYour Claim Reference:   ${claim.courier_claim_ref}` : ''}\nOrder Reference:        ${orderNumber}\nTracking Number:        ${tracking}\nDate Claim Raised:      ${raisedDate}\nDays Outstanding:       ${daysOut}\nAmount Claimed:         ${util().formatCurrency(amount)}\n\nPlease provide an update on the current status of this claim, including any reference number, the stage of investigation, and an expected resolution date.\n\nIf any further information or documentation is required from us to progress this claim, please let us know and we will supply it promptly.\n\nKind regards,\n${compName}`;\n\n    ui().openModal(`Claim reminder - ${util().sanitize(claim.claim_ref)}`, `\n      <div class=\"ims__alert ${daysOut >= 14 ? 'ims__alert--warning' : 'ims__alert--info'}\" style=\"margin-bottom:12px\">\n        <i class=\"ti ti-clock-exclamation\"></i>\n        <span>This claim has been outstanding for <strong>${daysOut} day${daysOut===1?'':'s'}</strong>${claim.courier_claim_ref ? '' : ' and has <strong>no courier reference</strong> recorded yet'}.</span>\n      </div>\n      <div class=\"ims__form-grid\" style=\"margin-bottom:12px\">\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Send to</label>\n          <input class=\"ims__input\" type=\"email\" id=\"ims-cfu-email\" value=\"${util().sanitize(claimsEmail)}\" placeholder=\"Courier claims email\">\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Subject</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-cfu-subject\" value=\"${util().sanitize(subject)}\">\n        </div>\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-bottom:12px\">\n        <label class=\"ims__label\">Email body (edit as needed before sending)</label>\n        <textarea class=\"ims__textarea\" id=\"ims-cfu-body\" rows=\"14\" style=\"font-family:monospace;font-size:12px\">${util().sanitize(body)}</textarea>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label\">Internal note for the tracking log</label>\n        <input class=\"ims__input\" type=\"text\" id=\"ims-cfu-note\" placeholder=\"e.g. 3rd chaser sent - escalate to account manager if no reply by Friday\">\n        <span class=\"ims__input-hint\">Recorded against this order's tracking history alongside the reminder.</span>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"\n        const to=document.getElementById('ims-cfu-email').value;\n        const s=document.getElementById('ims-cfu-subject').value;\n        const b=document.getElementById('ims-cfu-body').value;\n        navigator.clipboard.writeText('To: '+to+'\\\\nSubject: '+s+'\\\\n\\\\n'+b)\n          .then(()=>window.SM.UI.toast('Copied','success'))\n          .catch(()=>window.SM.UI.toast('Copy failed','warning'));\n      \"><i class=\"ti ti-copy\"></i> Copy instead</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveClaimFollowUp('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}','${util().jsArg(claimId)}','${util().jsArg(claim.claim_ref)}',${daysOut})\">\n        <i class=\"ti ti-send\"></i> Send reminder\n      </button>\n    `, 'lg');\n  }\n\n  async function saveClaimFollowUp(orderId, orderNumber, claimId, claimRef, daysOut){\n    const to      = document.getElementById('ims-cfu-email')?.value?.trim() || '';\n    const subject = document.getElementById('ims-cfu-subject')?.value || '';\n    const body    = document.getElementById('ims-cfu-body')?.value || '';\n    const note    = document.getElementById('ims-cfu-note')?.value?.trim() || '';\n\n    const result = await sendCourierEmail({\n      to, subject, body,\n      cc: window.SM.AUTH.company?.email || 'salesmdflondon@gmail.com',\n      orderId,\n      emailType: 'courier_claim_reminder',\n      logNote: `${claimRef} - reminder after ${daysOut} days${note ? ' - ' + note : ''}`\n    });\n    if(!result.sent) return;\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Claim reminder sent to courier',\n      notes:           `${claimRef} - chased after ${daysOut} day${daysOut===1?'':'s'}${note ? '. ' + note : ''}`,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, null, null, 'claim_reminder', `Claim reminder sent for ${claimRef} (${daysOut} days outstanding)${note ? ' - ' + note : ''}`);\n\n    ui().closeModal();\n    ui().toast(`Reminder sent to ${to} and logged`, 'success', 5000);\n    loadLostOrders();\n  }\n\n  function addLostOrderNote(orderId, orderNumber){\n    ui().openModal(`Add note \u2014 ${orderNumber}`, `\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label ims__label--req\">Note</label>\n        <textarea class=\"ims__textarea\" id=\"ims-lostnote-text\" rows=\"4\" placeholder=\"e.g. Called courier 28/06 \u2014 advised 5 working days for investigation...\"></textarea>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveLostOrderNote('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\">\n        <i class=\"ti ti-check\"></i> Save note\n      </button>\n    `, 'sm');\n  }\n\n  async function saveLostOrderNote(orderId, orderNumber){\n    const note = document.getElementById('ims-lostnote-text')?.value?.trim();\n    if(!note){ ui().toast('Please enter a note','error'); return; }\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Manual note',\n      notes:           note,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    ui().closeModal();\n    ui().toast('Note saved to tracking history', 'success');\n    loadLostOrders();\n  }\n\n  // \u2500\u2500\u2500 SETTLE CLAIM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function openSettleClaim(orderId, orderNumber, claimId, claimRef, amountClaimed){\n    ui().openModal(`Settle claim \u2014 ${claimRef}`, `\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Settlement amount will be recorded as <strong>income</strong> under \"Courier claim settlement\" in Accounts \u2192 Transactions.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Amount settled (\u00A3)</label>\n          <input class=\"ims__input\" type=\"number\" step=\"0.01\" id=\"ims-settle-amount\" value=\"${parseFloat(amountClaimed).toFixed(2)}\">\n          <span class=\"ims__input-hint\">Amount claimed: \u00A3${parseFloat(amountClaimed).toFixed(2)}</span>\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Settlement date</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-settle-date\" value=\"${new Date().toISOString().split('T')[0]}\">\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Courier payment reference</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-settle-ref\" placeholder=\"e.g. CLM-DPD-2026-4471\">\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Notes</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-settle-notes\" placeholder=\"e.g. Full settlement received via BACS\">\n        </div>\n      </div>\n      <div class=\"ims__alert ims__alert--warning\" style=\"margin-top:4px\">\n        <i class=\"ti ti-alert-triangle\"></i>\n        <span>If this order had an open <strong>accounts receivable</strong>, please write it off manually in <strong>Accounts \u2192 Receivables</strong> after settling.</span>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--success\" onclick=\"window.IMS_LOGISTICS.confirmSettleClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}','${util().jsArg(claimId)}','${util().jsArg(claimRef)}')\">\n        <i class=\"ti ti-cash\"></i> Confirm settlement\n      </button>\n    `, 'sm');\n  }\n\n  // Closes a claim, but only while it is still open: the update matches\n  // nothing once the claim is settled, rejected, recovered or written off.\n  // So two clicks, or the same claim closed from Accounts and from Lost\n  // Orders at once, cannot both go through (no double income or double\n  // write-off). Returns { ok: true }, { already: true } or { error }.\n  async function _closeClaim(claimId, fields){\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { data, error } = await client.from('claims')\n      .update(fields)\n      .eq('id', claimId)\n      .not('status', 'in', `(${CLOSED_CLAIM_STATUSES.join(',')})`)\n      .select('id');\n    if (error) return { error };\n    if (!data?.length) return { already: true };\n    return { ok: true };\n  }\n\n  async function confirmSettleClaim(orderId, orderNumber, claimId, claimRef){\n    const amount  = parseFloat(document.getElementById('ims-settle-amount')?.value) || 0;\n    const date    = document.getElementById('ims-settle-date')?.value;\n    const ref     = document.getElementById('ims-settle-ref')?.value?.trim() || '';\n    const notes   = document.getElementById('ims-settle-notes')?.value?.trim() || '';\n    if(!amount || amount <= 0){ ui().toast('Please enter a valid settlement amount','error'); return; }\n    if(!date){ ui().toast('Please select the settlement date','error'); return; }\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { data: claim } = await client.from('claims').select('courier_id,couriers(name)').eq('id',claimId).maybeSingle();\n    const courierName = claim?.couriers?.name || 'Courier';\n\n    // Both settled-amount columns are written, so Lost Orders, Accounts >\n    // Claims and Reports all show the same figure.\n    const closed = await _closeClaim(claimId, {\n      status:         'settled',\n      amount_settled: amount,\n      settled_amount: amount,\n      settled_at:     new Date(date).toISOString(),\n      settlement_ref: ref || null\n    });\n    if (closed.error) { ui().toast(`Claim ${claimRef} not settled: ${closed.error.message}. Nothing was changed.`, 'error', 10000); return; }\n    if (closed.already) {\n      ui().closeModal();\n      ui().toast(`Claim ${claimRef} is already closed. Nothing was changed.`, 'warning', 6000);\n      loadLostOrders();\n      return;\n    }\n\n    const problems = [];\n    const { error: txErr } = await db().insert('transactions',{\n      date:        date,\n      type:        'income',\n      category:    'Courier claim settlement',\n      description: `Claim settlement: ${claimRef}, ${orderNumber}, ${courierName}${notes ? ', ' + notes : ''}`,\n      amount:      amount,\n      reference:   claimRef\n    });\n    if (txErr) problems.push(`the settlement could not be recorded in Accounts (${txErr.message})`);\n\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Claim settled',\n      notes:           `${claimRef}: \u00A3${amount.toFixed(2)} settled${ref ? ', ref ' + ref : ''}`,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, 'lost', 'lost', 'claim_settled', `${claimRef}: \u00A3${amount.toFixed(2)}`);\n\n    // The courier has paid for the goods, so they are gone for good:\n    // take them off stock (skipped if they were delivered or put back).\n    const wo = await writeOffOrderStock(orderId, orderNumber, `Claim ${claimRef} settled: goods lost or damaged, taken off stock`);\n    wo.problems.forEach(p => problems.push(`stock could not be written off for ${p}`));\n\n    ui().closeModal();\n    if (problems.length) {\n      ui().toast(`Claim ${claimRef} settled, but ${problems.join('; ')}. Please put this right by hand.`, 'warning', 15000);\n    } else {\n      ui().toast(`Claim ${claimRef} settled: \u00A3${amount.toFixed(2)} recorded as income in Accounts${wo.done ? `, ${wo.done} line(s) taken off stock` : ''}`, 'success', 6000);\n    }\n    loadLostOrders();\n  }\n\n  // \u2500\u2500\u2500 REJECT CLAIM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function openRejectClaim(orderId, orderNumber, claimId, claimRef, amountClaimed){\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Reject claim \u2014 ${claimRef}`, `\n      <div class=\"ims__alert ims__alert--danger\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-alert-triangle\"></i>\n        <span>Rejecting this claim means the loss falls on the company. <strong>\u00A3${parseFloat(amountClaimed).toFixed(2)}</strong> will be recorded as an operating expense (write-off) in Accounts \u2192 Transactions.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Rejection date</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-reject-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Rejection reason</label>\n          <select class=\"ims__select\" id=\"ims-reject-reason\">\n            <option value=\"\">Select reason...</option>\n            <option value=\"Courier rejected \u2014 insufficient evidence\">Courier rejected \u2014 insufficient evidence</option>\n            <option value=\"Courier rejected \u2014 outside claim window\">Courier rejected \u2014 outside claim window</option>\n            <option value=\"Courier rejected \u2014 terms and conditions exclusion\">Courier rejected \u2014 terms and conditions exclusion</option>\n            <option value=\"Claim withdrawn \u2014 resolved directly with customer\">Claim withdrawn \u2014 resolved directly with customer</option>\n            <option value=\"Courier rejected \u2014 no response after multiple attempts\">Courier rejected \u2014 no response after multiple attempts</option>\n            <option value=\"Other\">Other</option>\n          </select>\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label\">Additional notes</label>\n          <textarea class=\"ims__textarea\" id=\"ims-reject-notes\" rows=\"2\" placeholder=\"Any further context...\"></textarea>\n        </div>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--danger\" onclick=\"window.IMS_LOGISTICS.confirmRejectClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}','${util().jsArg(claimId)}','${util().jsArg(claimRef)}',${amountClaimed})\">\n        <i class=\"ti ti-x\"></i> Confirm rejection \u2014 write off \u00A3${parseFloat(amountClaimed).toFixed(2)}\n      </button>\n    `, 'sm');\n  }\n\n  async function confirmRejectClaim(orderId, orderNumber, claimId, claimRef, amountClaimed){\n    const dateVal = document.getElementById('ims-reject-date')?.value;\n    const reason = document.getElementById('ims-reject-reason')?.value;\n    const notes  = document.getElementById('ims-reject-notes')?.value?.trim() || '';\n    if(!dateVal){ ui().toast('Please select the rejection date','error'); return; }\n    if(!reason){ ui().toast('Please select a rejection reason','error'); return; }\n    const fullReason = notes ? `${reason}: ${notes}` : reason;\n    const rejectedAt = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { data: claim } = await client.from('claims').select('courier_id,couriers(name)').eq('id',claimId).maybeSingle();\n    const courierName = claim?.couriers?.name || 'Courier';\n    const amount = parseFloat(amountClaimed) || 0;\n\n    const closed = await _closeClaim(claimId, {\n      status:            'rejected',\n      rejected_at:       rejectedAt,\n      rejection_reason:  fullReason\n    });\n    if (closed.error) { ui().toast(`Claim ${claimRef} not rejected: ${closed.error.message}. Nothing was changed.`, 'error', 10000); return; }\n    if (closed.already) {\n      ui().closeModal();\n      ui().toast(`Claim ${claimRef} is already closed. Nothing was changed.`, 'warning', 6000);\n      loadLostOrders();\n      return;\n    }\n\n    const problems = [];\n    // A rejected claim is the company's loss. The category name is kept\n    // exactly as before so existing reports keep grouping these together.\n    const { error: txErr } = await db().insert('transactions',{\n      date:        dateVal,\n      type:        'expense',\n      category:    'Write-off \\u2014 Rejected courier claim',\n      description: `Claim rejected: ${claimRef}, ${orderNumber}, ${courierName}, ${reason}`,\n      amount:      amount,\n      reference:   claimRef\n    });\n    if (txErr) problems.push(`the write-off could not be recorded in Accounts (${txErr.message})`);\n\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Claim rejected',\n      notes:           `${claimRef}: \u00A3${amount.toFixed(2)} written off as expense. ${fullReason}`,\n      created_at:      rejectedAt,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, 'lost', 'lost', 'claim_rejected', `${claimRef}: written off \u00A3${amount.toFixed(2)}`);\n\n    // The goods are gone and nobody is paying for them: take them off\n    // stock (skipped if they were delivered or put back).\n    const wo = await writeOffOrderStock(orderId, orderNumber, `Claim ${claimRef} rejected: goods lost or damaged, taken off stock`);\n    wo.problems.forEach(p => problems.push(`stock could not be written off for ${p}`));\n\n    ui().closeModal();\n    if (problems.length) {\n      ui().toast(`Claim ${claimRef} rejected, but ${problems.join('; ')}. Please put this right by hand.`, 'warning', 15000);\n    } else {\n      ui().toast(`Claim ${claimRef} rejected: \u00A3${amount.toFixed(2)} written off as an expense in Accounts${wo.done ? `, ${wo.done} line(s) taken off stock` : ''}`, 'danger', 7000);\n    }\n    loadLostOrders();\n  }\n\n  // \u2500\u2500\u2500 PARCEL FOUND \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // The parcel has physically come back. What happens depends on its\n  // condition:\n  //  - saleable: the claim closes as 'recovered' with no money moving, and\n  //    the goods go back to stock;\n  //  - damaged: the goods are NOT restocked and the claim stays OPEN, so\n  //    it can still be settled (the courier pays) or rejected.\n  // Staff must also tick a box confirming the parcel is really back. Two\n  // mistaken \"Parcel found\" entries caused trouble before (CLM-00002).\n  function openParcelFound(orderId, orderNumber, claimId, claimRef){\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Parcel found - ${claimRef}`, `\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-package\"></i>\n        <span>Use this only when the parcel has <strong>physically come back to us</strong>. If the goods are saleable, the claim closes with no money moving and they go back to stock. If they are damaged, the claim stays open so it can still be settled or rejected.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Date returned to us</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-pf-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Condition of goods</label>\n          <select class=\"ims__select\" id=\"ims-pf-condition\">\n            <option value=\"\">Select condition...</option>\n            <option value=\"saleable\">Saleable: add back to stock and close the claim</option>\n            <option value=\"damaged\">Damaged: do NOT restock, keep the claim open</option>\n          </select>\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label\">Notes</label>\n          <textarea class=\"ims__textarea\" id=\"ims-pf-notes\" rows=\"2\" placeholder=\"e.g. returned by courier depot, packaging intact...\"></textarea>\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label style=\"display:flex;align-items:flex-start;gap:8px;cursor:pointer;font-size:13px\">\n            <input type=\"checkbox\" id=\"ims-pf-confirm\" style=\"margin-top:3px\">\n            <span>I confirm this parcel is <strong>physically back in our warehouse</strong>.</span>\n          </label>\n        </div>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--success\" onclick=\"window.IMS_LOGISTICS.confirmParcelFound('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}','${util().jsArg(claimId)}','${util().jsArg(claimRef)}')\">\n        <i class=\"ti ti-check\"></i> Confirm parcel found\n      </button>\n    `, 'sm');\n  }\n\n  async function restockFoundParcel(orderId, orderNumber){\n    // Delegates to the shared smartRestock helper, which works out whether\n    // the goods had left stock (delivered or written off) and does the\n    // right thing either way, and never runs twice for the same order.\n    return await smartRestock(orderId, orderNumber, 'Parcel found - returned to stock');\n  }\n\n  async function confirmParcelFound(orderId, orderNumber, claimId, claimRef){\n    const dateVal   = document.getElementById('ims-pf-date')?.value;\n    const condition = document.getElementById('ims-pf-condition')?.value;\n    const notes     = document.getElementById('ims-pf-notes')?.value?.trim() || '';\n    if(!dateVal){ ui().toast('Please select the date returned','error'); return; }\n    if(!condition){ ui().toast('Please select the condition of the goods','error'); return; }\n    if(!document.getElementById('ims-pf-confirm')?.checked){\n      ui().toast('Please tick the box to confirm the parcel is physically back in the warehouse','error');\n      return;\n    }\n\n    const foundAt = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const userName = window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User';\n\n    if (condition === 'damaged') {\n      // Goods are back but cannot be sold. The claim stays open so it can\n      // be settled or rejected; settling or rejecting then takes the\n      // damaged goods off stock.\n      await client.from('order_tracking_events').insert({\n        company_id:      window.SM.AUTH.company?.id,\n        order_id:        orderId,\n        tracking_status: 'Parcel returned damaged',\n        notes:           `${claimRef}: parcel back but damaged, not restocked. Claim stays open.${notes ? ' ' + notes : ''}`,\n        created_at:      foundAt,\n        user_name:       userName,\n        user_id:         window.SM.AUTH.user?.id || null\n      });\n      await logActivity(orderId, 'lost', 'lost', 'parcel_returned_damaged', `${claimRef}: parcel back damaged, claim still open`);\n      ui().closeModal();\n      ui().toast(`${claimRef}: parcel recorded as returned damaged. Not restocked. The claim stays open so it can be settled or rejected.`, 'info', 8000);\n      loadLostOrders();\n      return;\n    }\n\n    // Saleable: close the claim (only if still open), then restock.\n    const closed = await _closeClaim(claimId, {\n      status:           'recovered',\n      settled_at:       foundAt,\n      rejection_reason: `Parcel found and returned - saleable${notes ? ' - ' + notes : ''}`\n    });\n    if (closed.error) { ui().toast(`Claim ${claimRef} not updated: ${closed.error.message}. Nothing was changed.`, 'error', 10000); return; }\n    if (closed.already) {\n      ui().closeModal();\n      ui().toast(`Claim ${claimRef} is already closed. Nothing was changed.`, 'warning', 6000);\n      loadLostOrders();\n      return;\n    }\n\n    const restocked = await restockFoundParcel(orderId, orderNumber);\n\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Parcel found - claim closed',\n      notes:           `${claimRef} - parcel returned (saleable)${restocked ? ` - ${restocked} item line(s) restocked` : ''}${notes ? '. ' + notes : ''}`,\n      created_at:      foundAt,\n      user_name:       userName,\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, 'lost', 'lost', 'claim_recovered', `${claimRef} - parcel found (saleable)${restocked ? `, ${restocked} line(s) restocked` : ''}`);\n\n    ui().closeModal();\n    ui().toast(`Claim ${claimRef} closed - parcel found${restocked ? `, ${restocked} item line(s) added back to stock` : ', no stock change needed'}`, 'success', 7000);\n    loadLostOrders();\n  }\n\n  // \u2500\u2500\u2500 WRITE OFF LOST GOODS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // When a lost case is closed for good (claim settled, claim rejected, or\n  // closed without a claim), the goods are gone. An order that never\n  // reached 'delivered' never had its on-hand stock reduced (only reserved\n  // at order creation), so its stock would otherwise show units that no\n  // longer exist, forever. This takes them off: on-hand down, reservation\n  // released, and a 'write_off' movement logged (kept separate from sales).\n  // Skipped if the goods were already taken off (a 'sale' or 'write_off'\n  // movement exists) or were put back (the order is stamped restocked).\n  // Returns { done, problems }.\n  async function writeOffOrderStock(orderId, orderNumber, reason){\n    const { data: moved } = await db().select('stock_movements', {\n      eq: { reference: orderNumber }, in: { movement_type: ['sale', 'write_off'] }, limit: 1, noCompanyFilter: true\n    });\n    if (moved?.length) return { done: 0, problems: [] };\n\n    const { data: ord } = await db().select('orders', {\n      select: 'warehouse_id,restocked_at,fulfillment_type,order_items(product_id,product_name,quantity)',\n      eq: { id: orderId }, maybeSingle: true, noCompanyFilter: true\n    });\n    // Dropship orders: off the shelf and out of the partner's reservation,\n    // in the allocation's warehouse (ims-dropship.js).\n    if (ord?.fulfillment_type === 'dropship') {\n      if (!window.IMS_DROPSHIP?.writeOffDropshipStock) return { done: 0, problems: ['the Dropship module did not load'] };\n      return await window.IMS_DROPSHIP.writeOffDropshipStock(orderId, orderNumber, reason);\n    }\n    if (!ord || ord.restocked_at) return { done: 0, problems: [] };\n    const whId  = ord.warehouse_id;\n    const items = ord.order_items || [];\n    if (!whId || !items.length) return { done: 0, problems: [] };\n\n    let done = 0;\n    const problems = [];\n    // One line at a time, so two lines of the same product cannot both\n    // read the same starting figure and overwrite each other.\n    for (const item of items) {\n      if (!item.product_id) continue;\n      const { data: sl } = await db().select('stock_levels', {\n        eq: { product_id: item.product_id, warehouse_id: whId }, maybeSingle: true, noCompanyFilter: true\n      });\n      if (sl) {\n        const { error } = await db().update('stock_levels', sl.id, {\n          quantity:     Math.max(0, (sl.quantity || 0) - (item.quantity || 0)),\n          reserved_qty: Math.max(0, (sl.reserved_qty || 0) - (item.quantity || 0))\n        });\n        if (error) { problems.push(item.product_name || item.product_id); continue; }\n      }\n      await db().insert('stock_movements', {\n        product_id: item.product_id, warehouse_id: whId, movement_type: 'write_off',\n        quantity: -(item.quantity || 0), reference: orderNumber || null,\n        reason, user_id: window.SM.AUTH.user?.id\n      });\n      done++;\n    }\n    return { done, problems };\n  }\n\n  // \u2500\u2500\u2500 CLOSE WITHOUT CLAIM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // For a lost order that will never be claimed (for example lost on our\n  // own van, or a courier that will not accept a claim). Records the case\n  // as closed ('written_off') in the claims history so it still shows in\n  // Accounts > Claims and the Courier claims log, posts the loss as an\n  // expense, and takes the goods off stock. Admin and Super Admin only.\n  function openCloseNoClaim(orderId, orderNumber, totalValue){\n    if(!window.SM.AUTH.isAdmin()){ ui().toast('Only an Admin can close a case without a claim','error'); return; }\n    const todayStr = new Date().toISOString().split('T')[0];\n    ui().openModal(`Close without claim - ${util().sanitize(orderNumber)}`, `\n      <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-alert-triangle\"></i>\n        <span>Use this when <strong>no courier claim will be made</strong>. The amount below is recorded as an expense in Accounts, the goods are taken off stock, and the case moves to the claims history.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Amount to write off (\u00A3)</label>\n          <input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-cnc-amount\" value=\"${(parseFloat(totalValue) || 0).toFixed(2)}\">\n          <span class=\"ims__input-hint\">Defaults to the order value</span>\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Date</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-cnc-date\" value=\"${todayStr}\" max=\"${todayStr}\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Reason</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-cnc-reason\" placeholder=\"e.g. Lost on own delivery run, courier will not accept a claim\">\n        </div>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--danger\" onclick=\"window.IMS_LOGISTICS.confirmCloseNoClaim('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-archive\"></i> Close and write off</button>\n    `, 'sm');\n  }\n\n  async function confirmCloseNoClaim(orderId, orderNumber){\n    if(!window.SM.AUTH.isAdmin()){ ui().toast('Only an Admin can close a case without a claim','error'); return; }\n    const amount  = parseFloat(document.getElementById('ims-cnc-amount')?.value);\n    const dateVal = document.getElementById('ims-cnc-date')?.value;\n    const reason  = document.getElementById('ims-cnc-reason')?.value?.trim();\n    if(isNaN(amount) || amount < 0){ ui().toast('Please enter a valid amount','error'); return; }\n    if(!dateVal){ ui().toast('Please select the date','error'); return; }\n    if(!reason){ ui().toast('Please enter a reason','error'); return; }\n    const closedAt = new Date(`${dateVal}T${new Date().toTimeString().split(' ')[0]}`).toISOString();\n\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    // Only for a case with no claim at all: if one exists (for example\n    // just raised on another screen), stop rather than double up.\n    const { data: existing } = await client.from('claims').select('id').eq('order_id', orderId).limit(1);\n    if (existing?.length) {\n      ui().closeModal();\n      ui().toast(`${orderNumber} already has a claim record. Nothing was changed.`, 'warning', 6000);\n      loadLostOrders();\n      return;\n    }\n\n    const ship = (window._lostShipMap || {})[orderId];\n    const { error: insErr } = await client.from('claims').insert({\n      company_id:       window.SM.AUTH.company?.id,\n      order_id:         orderId,\n      courier_id:       ship?.courier_id || null,\n      claim_type:       'lost',\n      status:           'written_off',\n      amount_claimed:   amount,\n      items_value:      amount,\n      description:      `Closed without claim: ${reason}`,\n      rejection_reason: reason,\n      raised_at:        closedAt,\n      rejected_at:      closedAt\n    });\n    if (insErr) { ui().toast(`Case not closed: ${insErr.message}. Nothing was changed.`, 'error', 10000); return; }\n\n    const problems = [];\n    if (amount > 0) {\n      const { error: txErr } = await db().insert('transactions',{\n        date:        dateVal,\n        type:        'expense',\n        category:    'Write-off: lost shipment (no claim)',\n        description: `Lost shipment written off, no claim: ${orderNumber}, ${reason}`,\n        amount:      amount,\n        reference:   orderNumber\n      });\n      if (txErr) problems.push(`the write-off could not be recorded in Accounts (${txErr.message})`);\n    }\n\n    await client.from('order_tracking_events').insert({\n      company_id:      window.SM.AUTH.company?.id,\n      order_id:        orderId,\n      tracking_status: 'Closed without claim',\n      notes:           `\u00A3${amount.toFixed(2)} written off. ${reason}`,\n      created_at:      closedAt,\n      user_name:       window.SM.AUTH.user?.name || window.SM.AUTH.user?.email || 'User',\n      user_id:         window.SM.AUTH.user?.id || null\n    });\n    await logActivity(orderId, 'lost', 'lost', 'closed_without_claim', `\u00A3${amount.toFixed(2)} written off: ${reason}`);\n\n    const wo = await writeOffOrderStock(orderId, orderNumber, `Lost, closed without claim: ${reason}`);\n    wo.problems.forEach(p => problems.push(`stock could not be written off for ${p}`));\n\n    ui().closeModal();\n    if (problems.length) {\n      ui().toast(`${orderNumber} closed without claim, but ${problems.join('; ')}. Please put this right by hand.`, 'warning', 15000);\n    } else {\n      ui().toast(`${orderNumber} closed without claim: \u00A3${amount.toFixed(2)} written off${wo.done ? `, ${wo.done} line(s) taken off stock` : ''}`, 'success', 7000);\n    }\n    loadLostOrders();\n  }\n\n// \u2500\u2500\u2500 ACTIVITY LOG VIEWER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function openActivityLog(orderId, orderNumber){\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { data: logs } = await client\n      .from('order_activity_log')\n      .select('*')\n      .eq('order_id', orderId)\n      .order('created_at', { ascending: true });\n\n    const items = logs || [];\n    const statusLabels = {\n      confirmed:'Confirmed', picking:'Picking', packed:'Packed',\n      dispatched:'Dispatched', delivered:'Delivered',\n      failed_delivery:'Failed delivery', re_attempted:'Re-attempted',\n      return_in_transit:'Return in transit', return_received:'Return received',\n      cancelled:'Cancelled', collected:'Collected', lost:'Lost', refunded:'Refunded'\n    };\n    const actionLabels = {\n      delivered:'Delivered \u2713',\n      delivery_failed:'Delivery failed',\n      re_attempt_requested:'Re-attempt requested',\n      return_requested:'Return requested',\n      return_received:'Return received \u2713',\n      status_update:'Status update'\n    };\n\n    const rows = items.map(log => {\n      const oldS = log.old_value ? (statusLabels[log.old_value] || log.old_value) : '\u2014';\n      const newS = log.new_value ? (statusLabels[log.new_value] || log.new_value) : '\u2014';\n      const act  = log.action     ? (actionLabels[log.action]     || log.action)     : '\u2014';\n      const arrow = log.old_value && log.new_value ? `${oldS} \u2192 ${newS}` : newS;\n      return `<tr>\n        <td style=\"font-size:11px;white-space:nowrap\">${log.created_at ? util().formatDateTime ? util().formatDateTime(log.created_at) : util().formatDate(log.created_at) : '\u2014'}</td>\n        <td style=\"font-size:12px\">${util().sanitize(log.user_name||'System')}</td>\n        <td>${util().sanitize(arrow)}</td>\n        <td style=\"font-size:12px;color:var(--ims-text-sec)\">${util().sanitize(act)}</td>\n        <td style=\"font-size:12px;color:var(--ims-text-sec)\">${util().sanitize(log.notes||'\u2014')}</td>\n      </tr>`;\n    }).join('');\n\n    ui().openModal(`Activity log \u2014 ${orderNumber}`, `\n      ${!items.length\n        ? `<div class=\"ims__empty\"><i class=\"ti ti-history\"></i><p>No activity logged yet</p><p style=\"font-size:12px;color:var(--ims-text-muted)\">Activity is recorded when status changes are made from the tracking tab</p></div>`\n        : `<div class=\"ims__table-wrap\">\n            <table class=\"ims__table\">\n              <thead><tr><th>Date / time</th><th>User</th><th>Status change</th><th>Action</th><th>Notes</th></tr></thead>\n              <tbody>${rows}</tbody>\n            </table>\n          </div>`\n      }\n    `, `<button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal()\">Close</button>`, 'lg');\n  }\n\n  // \u2500\u2500\u2500 REASSIGN COURIER \u2192 OWN TRUCK (Super Admin only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Assigning a courier creates a shipments row, flips the job to\n  // assigned_courier, dispatches the order, AND books a courier charge as\n  // an expense. Undoing it has to reverse all of that \u2014 particularly the\n  // charge, or you stay permanently out of pocket in Accounts for a courier\n  // that was never used. The order itself stays 'dispatched' because it is\n  // still going out, just on our own truck instead.\n  async function reassignToOwnTruck(orderId, orderNumber){\n    if(!window.SM.AUTH.isSuperAdmin()){ ui().toast('Only Super Admin can reassign a dispatched order','error'); return; }\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n\n    const {data:shipment}=await client.from('shipments')\n      .select('id,tracking_number,charge_amount,couriers(name)')\n      .eq('order_id',orderId).eq('is_return_collection',false).order('created_at',{ascending:false}).limit(1).maybeSingle();\n\n    const charge=shipment?.charge_amount||0;\n    const courierName=shipment?.couriers?.name||'courier';\n\n    ui().openModal(`Reassign to own truck \u2014 ${util().sanitize(orderNumber)}`,`\n      <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:12px\">\n        <i class=\"ti ti-alert-triangle\"></i>\n        <span>This order is currently assigned to <strong>${util().sanitize(courierName)}</strong>${shipment?.tracking_number?` with tracking <strong>${util().sanitize(shipment.tracking_number)}</strong>`:''}.</span>\n      </div>\n      <p style=\"font-size:13px;color:var(--ims-text-sec);margin-bottom:12px\">Reassigning will:</p>\n      <ul style=\"font-size:13px;color:var(--ims-text-sec);margin:0 0 12px 18px;line-height:1.7\">\n        <li>Remove the courier shipment and its tracking number</li>\n        <li>Move the job into the own-truck delivery queue</li>\n        ${charge>0?`<li><strong>Reverse the courier charge of ${util().formatCurrency(charge)}</strong> from Accounts</li>`:''}\n        <li>Keep the order as <strong>Dispatched</strong> \u2014 it is still going out, just on our own truck</li>\n      </ul>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label\">Reason (recorded in the order's activity log)</label>\n        <input class=\"ims__input\" type=\"text\" id=\"ims-rot-reason\" placeholder=\"e.g. Assigned to courier in error \u2014 own truck delivery\">\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--danger\" onclick=\"window.IMS_LOGISTICS.confirmReassignToOwnTruck('${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\"><i class=\"ti ti-truck\"></i> Reassign to own truck</button>\n    `,'sm');\n  }\n\n  async function confirmReassignToOwnTruck(orderId, orderNumber){\n    if(!window.SM.AUTH.isSuperAdmin()){ ui().toast('Only Super Admin can reassign a dispatched order','error'); return; }\n    const reason=document.getElementById('ims-rot-reason')?.value?.trim()||'Reassigned from courier to own truck';\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n\n    const {data:shipment}=await client.from('shipments')\n      .select('id,tracking_number,charge_amount')\n      .eq('order_id',orderId).eq('is_return_collection',false).order('created_at',{ascending:false}).limit(1).maybeSingle();\n\n    // Reverse the courier charge. The transaction was written with\n    // reference = tracking number, which is the only link back to it.\n    if(shipment?.charge_amount>0 && shipment?.tracking_number){\n      const {error:txErr}=await client.from('transactions')\n        .delete()\n        .eq('reference',shipment.tracking_number)\n        .eq('category','Courier charges');\n      if(txErr){\n        ui().toast('Could not reverse the courier charge: '+txErr.message+' \u2014 reassignment stopped so your accounts stay correct.','error',8000);\n        return;\n      }\n    }\n\n    if(shipment?.id){\n      const {error:shipErr}=await client.from('shipments').delete().eq('id',shipment.id);\n      if(shipErr){ ui().toast('Failed to remove shipment: '+shipErr.message,'error',6000); return; }\n    }\n\n    const {data:job}=await client.from('logistics_jobs')\n      .select('id').eq('order_id',orderId).eq('is_return_collection',false).order('created_at',{ascending:false}).limit(1).maybeSingle();\n    if(job?.id){\n      await db().update('logistics_jobs',job.id,{\n        job_type:'own_truck', status:'scheduled', assigned_courier_id:null\n      });\n    }\n\n    await logActivity(orderId,'dispatched','dispatched','reassigned_own_truck',`${reason}${shipment?.charge_amount>0?` \u2014 courier charge of ${util().formatCurrency(shipment.charge_amount)} reversed`:''}`);\n    // Website orders: the courier fulfilment (and its tracking) is undone in\n    // Shopify; it is fulfilled again when the order goes on a manifest.\n    window.SM.SHOPIFY?.sync('unfulfil',[orderId]);\n\n    ui().closeModal();\n    ui().toast(`${orderNumber} reassigned to own truck${shipment?.charge_amount>0?` \u2014 ${util().formatCurrency(shipment.charge_amount)} courier charge reversed`:''}`,'success',6000);\n    loadTracking();\n  }\n\n  async function loadUnassigned(){\n    const content=document.getElementById('ims-log-content');\n    if(!content)return;\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:jobs}=await client.from('logistics_jobs')\n      .select('id,job_type,status,collection_slot,orders(id,order_number,customer_name,postcode,address,total_value,order_type,customer_id,platforms(name),customers(delivery_arrangement))')\n      .eq('status','unassigned')\n      .order('created_at');\n    const items=jobs||[];\n    const deliveries=items.filter(j=>j.job_type==='delivery');\n    const collections=items.filter(j=>['collection','courier_collection'].includes(j.job_type));\n    const selfCollection=items.filter(j=>j.job_type==='self_collection');\n\n    ui().updateBadge('ims-badge-logistics',items.length);\n\n    content.innerHTML=`\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;flex-wrap:wrap;gap:8px\">\n        <div style=\"font-size:13px;color:var(--ims-text-sec)\">\n          <strong>${deliveries.length}</strong> deliveries &nbsp;|&nbsp;\n          <strong>${collections.length}</strong> collections &nbsp;|&nbsp;\n          <strong>${selfCollection.length}</strong> self-collection\n        </div>\n        <div class=\"ims__btn-group\">\n          <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.bulkAssignCourier()\"><i class=\"ti ti-truck\"></i> Assign to courier</button>\n          <button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.planRoute()\"><i class=\"ti ti-route\"></i> Plan route</button>\n        </div>\n      </div>\n      ${!items.length?`<div class=\"ims__empty\">\n        <i class=\"ti ti-check\" aria-hidden=\"true\"></i>\n        <p>No unassigned jobs</p>\n        <p style=\"font-size:12px;color:var(--ims-text-muted);margin-top:6px\">Jobs appear here automatically once orders are marked Packed in <span class=\"ims__link\" onclick=\"window.SM.UI.showPanel('orders')\" style=\"cursor:pointer\">Order Management</span></p>\n      </div>`:''}\n      ${deliveries.length?`\n        <div class=\"ims__card\" style=\"margin-bottom:12px\">\n          <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:10px\">\n            <div class=\"ims__card-title\"><i class=\"ti ti-truck\" aria-hidden=\"true\"></i>Deliveries (${deliveries.length})</div>\n            <div class=\"ims__btn-group\">\n              <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.printPicklist()\">\n                <i class=\"ti ti-printer\"></i> Print picklist\n              </button>\n            </div>\n          </div>\n          <div class=\"ims__table-wrap\">\n            <table class=\"ims__table\">\n              <thead><tr><th><input type=\"checkbox\" id=\"ims-delivery-all\" onchange=\"window.IMS_LOGISTICS.toggleAll('delivery',this.checked)\"></th><th>Order #</th><th>Customer</th><th>Postcode</th><th>Type</th><th>Value</th><th>Actions</th></tr></thead>\n              <tbody>${deliveries.map(j=>{\n                // Show the sales channel (Temu, Amazon, Website, Retailer /\n                // Wholesaler...) rather than the internal retail/wholesale\n                // flag \u2014 \"Retail\" told you nothing useful about where the\n                // order actually came from.\n                const orderType=j.orders?.order_type;\n                const platName=j.orders?.platforms?.name;\n                const typePill=platName\n                  ?`<span class=\"ims__pill ims__pill--${orderType==='wholesale'?'info':'neutral'}\">${util().sanitize(platName)}</span>`\n                  :orderType==='wholesale'\n                    ?'<span class=\"ims__pill ims__pill--info\">Wholesale</span>'\n                    :orderType==='retail'\n                      ?'<span class=\"ims__pill ims__pill--neutral\">Retail</span>'\n                      :'';\n                const arrangement=j.orders?.customers?.delivery_arrangement;\n                const arrangementPill=arrangement==='customer_collects'\n                  ?'<span class=\"ims__pill ims__pill--warning\" title=\"Customer\\'s standing arrangement on file \u2014 confirm before assigning a courier\"><i class=\"ti ti-home\"></i> Customer collects</span>'\n                  :arrangement==='mdf_delivers'\n                    ?'<span class=\"ims__pill ims__pill--success\" title=\"Customer\\'s standing arrangement on file\"><i class=\"ti ti-truck\"></i> We deliver</span>'\n                    :'';\n                return `<tr>\n                <td><input type=\"checkbox\" class=\"ims-job-check\" value=\"${j.id}\" data-order-id=\"${j.orders?.id||''}\" data-type=\"delivery\"></td>\n                <td><span class=\"ims__link\" onclick=\"window.IMS_ORDERS.openOrder('${util().jsArg(j.orders?.id||'')}')\">${util().sanitize(j.orders?.order_number||'\u2014')}</span></td>\n                <td>${util().sanitize(j.orders?.customer_name||'\u2014')}</td>\n                <td>${util().sanitize(j.orders?.postcode||'\u2014')}</td>\n                <td style=\"white-space:nowrap\">${typePill} ${arrangementPill}</td>\n                <td>${util().formatCurrency(j.orders?.total_value)}</td>\n                <td><div class=\"ims__btn-group\">\n                  <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.assignJobCourier('${util().jsArg(j.id)}')\" title=\"Book courier\"><i class=\"ti ti-truck-delivery\"></i> Courier</button>\n                  <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.assignOwnTruck('${util().jsArg(j.id)}','${util().jsArg(j.orders?.id||'')}')\" title=\"Own truck delivers\"><i class=\"ti ti-truck\"></i> We deliver</button>\n                  <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.markSelfCollection('${util().jsArg(j.id)}','${util().jsArg(j.orders?.id||'')}')\" title=\"Customer collects\"><i class=\"ti ti-home\"></i> Self-collect</button>\n                  <button class=\"ims__btn ims__btn--danger ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.cancelUnassignedOrder('${util().jsArg(j.id)}','${util().jsArg(j.orders?.id||'')}','${util().jsArg(j.orders?.order_number||'')}')\" title=\"Cancel order\"><i class=\"ti ti-x\"></i></button>\n                </div></td>\n              </tr>`;\n              }).join('')}\n              </tbody>\n            </table>\n          </div>\n        </div>` : ''}\n      ${collections.length?`\n        <div class=\"ims__card\" style=\"margin-bottom:12px\">\n          <div class=\"ims__card-title\" style=\"margin-bottom:10px\"><i class=\"ti ti-package-import\" aria-hidden=\"true\"></i>Collections (${collections.length})</div>\n          <div class=\"ims__table-wrap\">\n            <table class=\"ims__table\">\n              <thead><tr><th>Order #</th><th>Customer</th><th>Postcode</th><th>Type</th><th>Actions</th></tr></thead>\n              <tbody>${collections.map(j=>`<tr>\n                <td><span class=\"ims__link\" onclick=\"window.IMS_ORDERS.openOrder('${util().jsArg(j.orders?.id||'')}')\">${util().sanitize(j.orders?.order_number||'\u2014')}</span></td>\n                <td>${util().sanitize(j.orders?.customer_name||'\u2014')}</td>\n                <td>${util().sanitize(j.orders?.postcode||'\u2014')}</td>\n                <td>${util().pill(j.job_type)}</td>\n                <td><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.assignJobCourier('${util().jsArg(j.id)}')\"><i class=\"ti ti-truck\"></i> Assign courier</button></td>\n              </tr>`).join('')}\n              </tbody>\n            </table>\n          </div>\n        </div>` : ''}\n      ${selfCollection.length?`\n        <div class=\"ims__card\">\n          <div class=\"ims__card-title\" style=\"margin-bottom:10px\"><i class=\"ti ti-home\" aria-hidden=\"true\"></i>Ready for customer collection (${selfCollection.length})</div>\n          <div class=\"ims__table-wrap\">\n            <table class=\"ims__table\">\n              <thead><tr><th>Order #</th><th>Customer</th><th>Postcode</th><th>Slot</th><th>Actions</th></tr></thead>\n              <tbody>${selfCollection.map(j=>`<tr>\n                <td><span class=\"ims__link\" onclick=\"window.IMS_ORDERS.openOrder('${util().jsArg(j.orders?.id||'')}')\">${util().sanitize(j.orders?.order_number||'\u2014')}</span></td>\n                <td>${util().sanitize(j.orders?.customer_name||'\u2014')}</td>\n                <td>${util().sanitize(j.orders?.postcode||'\u2014')}</td>\n                <td>${j.collection_slot?util().formatDateTime(j.collection_slot):'No slot set'}</td>\n                <td>\n                  ${j.status==='collected'\n                    ? `<span class=\"ims__pill ims__pill--success\"><i class=\"ti ti-check\"></i> Collected</span>`\n                    : `<div class=\"ims__btn-group\">\n                        <button class=\"ims__btn ims__btn--success ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.showSelfCollectionModal('${util().jsArg(j.id)}','${util().jsArg(j.orders?.id||'')}','${util().jsArg(j.orders?.order_number||'')}')\"><i class=\"ti ti-check\"></i> Mark collected</button>\n                        <button class=\"ims__btn ims__btn--danger ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.cancelSelfCollection('${util().jsArg(j.id)}','${util().jsArg(j.orders?.id||'')}')\" title=\"Move back to delivery\"><i class=\"ti ti-arrow-back-up\"></i></button>\n                      </div>`}\n                </td>\n              </tr>`).join('')}\n              </tbody>\n            </table>\n          </div>\n        </div>` : ''}`;\n  }\n\n  function toggleAll(type,checked){\n    document.querySelectorAll(`.ims-job-check[data-type=\"${type}\"]`).forEach(cb=>{cb.checked=checked;});\n  }\n\n  // \u2500\u2500\u2500 AUTOMATIC COURIER CHARGE (rate cards) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Works out what a courier priced by product type and zone (e.g. V1)\n  // should charge for an order, per order (consignment), as V1 invoices:\n  //  1. zone from the postcode (district beats area; else the default zone);\n  //  2. if any item is in a weight band, the whole order takes the band\n  //     that fits its total weight; otherwise the order takes the price of\n  //     its highest-priced item type;\n  //  3. plus extras (those linked to services on the order are ticked\n  //     automatically), room of choice floors, then fuel %.\n  // The result pre-fills the charge, which staff can still change; the\n  // calculated figure and its breakdown are saved for the invoice check.\n  const _acState = {};   // per job: { calc, ticked:Set|null, touched }\n  const _rcOutward = pc => { const c = _rcPc(pc); return c.length >= 5 ? c.slice(0, -3) : c; };\n  const _rcArea = out => (String(out).match(/^[A-Z]{1,2}/) || [''])[0];\n  const _money = n => Math.round((Number(n) || 0) * 100) / 100;\n\n  async function _rateCardCharge({ courierId, orderId, postcode, weightKg, floor, ticked, date }) {\n    const db_ = _rcDb(), today = date || _rcToday();   // the rate card in force on this date\n    const { data: cards } = await db_.from('courier_rate_cards').select('*').eq('courier_id', courierId).eq('pricing_method', 'type_zone').order('valid_from', { ascending: false });\n    const card = (cards || []).find(c => String(c.valid_from) <= today);\n    if (!card) return null;   // not a rate card courier (or no version in force yet)\n    const [zonesR, pcsR, typesR, ratesR, extrasR, itemsR] = await Promise.all([\n      db_.from('courier_zones').select('*').eq('courier_id', courierId).order('sort_order', { ascending: true }),\n      db_.from('courier_zone_postcodes').select('id,zone_id,prefix').eq('courier_id', courierId),\n      db_.from('courier_product_types').select('*').eq('courier_id', courierId),\n      db_.from('courier_card_rates').select('*').eq('card_id', card.id),\n      db_.from('courier_card_extras').select('*').eq('card_id', card.id).order('sort_order', { ascending: true }),\n      db_.from('order_items').select('product_id,product_name,quantity,service_id').eq('order_id', orderId)\n    ]);\n    const zones = zonesR.data || [], pcs = pcsR.data || [], types = typesR.data || [], rates = ratesR.data || [], extras = extrasR.data || [], items = itemsR.data || [];\n    const flags = [];\n    // 1. zone\n    const outward = _rcOutward(postcode), area = _rcArea(outward);\n    const hit = pcs.find(p => p.prefix === outward) || pcs.find(p => p.prefix === area);\n    const zone = hit ? zones.find(z => z.id === hit.zone_id) : zones.find(z => z.kind === 'default');\n    if (!zone) flags.push('No zone found for this postcode');\n    if (zone?.kind === 'not_served') flags.push(`${outward || 'This postcode'} is in \"${zone.name}\" for this courier`);\n    // 2. the order's rate\n    const products = items.filter(i => i.product_id);\n    const { data: map } = products.length\n      ? await db_.from('courier_product_map').select('product_id,type_id').eq('courier_id', courierId).in('product_id', products.map(i => i.product_id))\n      : { data: [] };\n    const typeOf = pid => types.find(t => t.id === (map || []).find(m => m.product_id === pid)?.type_id);\n    const priceOf = t => (zone && t) ? rates.find(r => r.type_id === t.id && r.zone_id === zone.id)?.price : null;\n    products.forEach(i => { if (!typeOf(i.product_id)) flags.push(`${i.product_name} has no type on this rate card`); });\n    const itemTypes = products.map(i => typeOf(i.product_id)).filter(Boolean);\n    let rateLine = null;\n    if (itemTypes.some(t => t.max_weight_kg != null)) {\n      const bands = types.filter(t => t.max_weight_kg != null).sort((a, b) => a.max_weight_kg - b.max_weight_kg);\n      const w = Number(weightKg) || 0;\n      let band = bands.find(t => w <= Number(t.max_weight_kg));\n      if (!band) { band = bands[bands.length - 1]; flags.push(`The order weighs ${w} kg, more than the largest band (${band.max_weight_kg} kg)`); }\n      if (!w) flags.push('No weight entered: the smallest weight band was used');\n      rateLine = { label: `${band.name} (order weight ${w} kg)`, type: band.name, price: priceOf(band) };\n    } else if (itemTypes.length) {\n      const top = itemTypes.map(t => ({ t, p: priceOf(t) })).sort((a, b) => (b.p ?? -1) - (a.p ?? -1))[0];\n      rateLine = { label: top.t.name, type: top.t.name, price: top.p };\n    }\n    if (rateLine && (rateLine.price === null || rateLine.price === undefined) && zone?.kind !== 'not_served') flags.push(`No price set for \"${rateLine.type}\" in ${zone?.name || 'this zone'}`);\n    // 3. extras, floors, fuel\n    const svcQty = {}; items.filter(i => i.service_id).forEach(i => { svcQty[i.service_id] = (svcQty[i.service_id] || 0) + (i.quantity || 1); });\n    const extraRows = extras.map(e => {\n      const auto = !!(e.service_id && svcQty[e.service_id]);\n      const on = ticked ? ticked.has(e.id) : auto;\n      const qty = e.per === 'item' ? (svcQty[e.service_id] || 1) : 1;\n      return { id: e.id, name: e.name, unit: Number(e.price) || 0, per: e.per, qty, auto, on, amount: on ? _money((Number(e.price) || 0) * qty) : 0 };\n    });\n    const fl = Math.max(0, parseInt(floor, 10) || 0);\n    const floorAmt = fl >= 1 ? _money((Number(card.floor_first) || 0) + (fl - 1) * (Number(card.floor_extra) || 0)) : 0;\n    const base = _money((rateLine?.price || 0) + extraRows.reduce((t, e) => t + e.amount, 0) + floorAmt);\n    const fuel = _money(base * (Number(card.fuel_pct) || 0) / 100);\n    return { method: 'type_zone', card, zone, outward, area, matched: hit?.prefix || null, zones, rateLine, extras: extraRows,\n             floor: fl, floorAmt, base, fuelPct: Number(card.fuel_pct) || 0, fuel, total: _money(base + fuel), flags,\n             excludesVat: !!card.prices_exclude_vat };\n  }\n\n  // For checking a courier invoice: what a delivery should have cost, from\n  // the rate card in force on its dispatch date, using the same rules as\n  // \"Assign to courier\". The weight is the one saved on the shipment, or\n  // else the order's box weight. Returns null for couriers without a rate\n  // card. Used by Accounts for deliveries sent before the charge was saved.\n  async function calcExpectedForShipment({ courierId, orderId, postcode, date, weightKg }) {\n    let w = Number(weightKg) || 0;\n    if (!w && orderId) {\n      const { data: items } = await _rcDb().from('order_items').select('product_id,product_name,sku,quantity').eq('order_id', orderId);\n      const sum = await util().getOrderBoxSummary(items || []);\n      w = sum?.hasData ? (Number(sum.totalWeightKg) || 0) : 0;\n    }\n    return _rateCardCharge({ courierId, orderId, postcode, weightKg: w, floor: 0, ticked: null, date });\n  }\n\n  // Refreshes the charge panel in \"Assign to courier\".\n  async function refreshCourierCharge(jobId) {\n    const panel = document.getElementById('ims-ac-breakdown'); if (!panel) return;\n    const st = _acState[jobId] = _acState[jobId] || { ticked: null, touched: false };\n    const courierId = document.getElementById('ims-ac-courier')?.value;\n    const chargeEl = document.getElementById('ims-ac-charge');\n    if (!courierId) { panel.innerHTML = ''; st.calc = null; return; }\n    panel.innerHTML = '<div style=\"font-size:12px;color:var(--ims-text-muted)\"><i class=\"ti ti-loader-2 ims__spin\"></i> Working out the charge...</div>';\n    const { data: job } = await db().select('logistics_jobs', { eq: { id: jobId }, maybeSingle: true, noCompanyFilter: true });\n    const { data: order } = await db().select('orders', { select: 'postcode', eq: { id: job?.order_id }, maybeSingle: true, noCompanyFilter: true });\n    const weight = parseFloat(document.getElementById('ims-ac-weight')?.value) || 0;\n    const floor = document.getElementById('ims-ac-floor')?.value || 0;\n    let calc = await _rateCardCharge({ courierId, orderId: job?.order_id, postcode: order?.postcode || '', weightKg: weight, floor, ticked: st.ticked });\n    if (!calc) {\n      // A courier priced by weight: the same calculation as on saving, shown first.\n      const dims = (document.getElementById('ims-ac-dims')?.value || '').split(/[x\u00D7]/i).map(d => parseFloat(d) || 0);\n      let total = 0;\n      if (weight > 0) {\n        const { data: r } = await _rcDb().rpc('calculate_courier_charge', { p_courier_id: courierId, p_weight_kg: weight, p_length_cm: dims[0] || 0, p_width_cm: dims[1] || 0, p_height_cm: dims[2] || 0, p_postcode: order?.postcode || '' });\n        total = _money(r?.total || 0);\n      }\n      calc = { method: 'weight', total, flags: weight > 0 ? [] : ['Enter the weight to work out the charge'] };\n    }\n    st.calc = calc;\n    if (chargeEl && !st.touched) chargeEl.value = calc.total ? calc.total.toFixed(2) : '';\n    const fm = n => util().formatCurrency(n);\n    const flagsHtml = calc.flags.length ? `<div class=\"ims__alert ims__alert--warning\" style=\"margin:6px 0\"><i class=\"ti ti-alert-triangle\"></i><span>${calc.flags.map(x => util().sanitize(x)).join('<br>')}</span></div>` : '';\n    if (calc.method === 'weight') {\n      panel.innerHTML = `<div style=\"font-size:12px\">Priced by weight bands: <strong>${calc.total ? fm(calc.total) : '-'}</strong></div>${flagsHtml}`;\n      return;\n    }\n    const moveOpts = calc.zones.filter(z => z.id !== calc.zone?.id).map(z => `<option value=\"${z.id}\">${util().sanitize(z.name)}</option>`).join('');\n    panel.innerHTML = `\n      <div style=\"border:1px solid var(--ims-border);border-radius:var(--ims-radius);padding:8px 10px;font-size:12px\">\n        <div style=\"display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap\">\n          <span>Zone: <strong>${util().sanitize(calc.zone?.name || '-')}</strong> <span style=\"color:var(--ims-text-muted)\">(${util().sanitize(calc.outward || '-')}${calc.matched ? `, listed as ${util().sanitize(calc.matched)}` : ', not listed: default zone'})</span></span>\n          ${_rcAdmin() && calc.outward ? `<span>Wrong zone? <select class=\"ims__select\" id=\"ims-ac-movezone\" style=\"width:auto;font-size:11px;padding:2px 4px\"><option value=\"\">Move ${util().sanitize(calc.outward)} to...</option>${moveOpts}</select> <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.moveChargePostcode('${util().jsArg(jobId)}','${util().jsArg(calc.outward)}')\">Move</button></span>` : ''}\n        </div>\n        <table style=\"width:100%;margin-top:6px;border-collapse:collapse\">\n          <tr><td>${util().sanitize(calc.rateLine?.label || 'No priced items')}</td><td style=\"text-align:right\">${calc.rateLine?.price != null ? fm(calc.rateLine.price) : '-'}</td></tr>\n          ${calc.extras.map(e => `<tr><td><label style=\"display:flex;gap:6px;align-items:center\"><input type=\"checkbox\" ${e.on ? 'checked' : ''} onchange=\"window.IMS_LOGISTICS.toggleChargeExtra('${util().jsArg(jobId)}','${util().jsArg(e.id)}',this.checked)\"> ${util().sanitize(e.name)}${e.qty > 1 ? ` x${e.qty}` : ''}${e.auto ? ' <span class=\"ims__pill ims__pill--info\" style=\"font-size:10px\">on the order</span>' : ''}</label></td><td style=\"text-align:right\">${e.on ? fm(e.amount) : ''}</td></tr>`).join('')}\n          ${calc.floor ? `<tr><td>Room of choice: floor ${calc.floor}</td><td style=\"text-align:right\">${fm(calc.floorAmt)}</td></tr>` : ''}\n          <tr><td>Fuel ${calc.fuelPct}%</td><td style=\"text-align:right\">${fm(calc.fuel)}</td></tr>\n          <tr style=\"border-top:1px solid var(--ims-border);font-weight:700\"><td>Expected charge${calc.excludesVat ? ' (excl. VAT)' : ''}</td><td style=\"text-align:right\">${fm(calc.total)}</td></tr>\n        </table>\n      </div>${flagsHtml}`;\n  }\n  function toggleChargeExtra(jobId, extraId, on) {\n    const st = _acState[jobId]; if (!st?.calc?.extras) return;\n    st.ticked = new Set(st.calc.extras.filter(e => e.on).map(e => e.id));\n    on ? st.ticked.add(extraId) : st.ticked.delete(extraId);\n    refreshCourierCharge(jobId);\n  }\n  function chargeEdited(jobId) { (_acState[jobId] = _acState[jobId] || {}).touched = true; }\n  // \"Wrong zone?\": move this postcode district for this courier, then recalculate.\n  async function moveChargePostcode(jobId, outward) {\n    if (!_rcAdmin()) { ui().toast('Only an Admin can change courier zones', 'error'); return; }\n    const zoneId = document.getElementById('ims-ac-movezone')?.value;\n    if (!zoneId) { ui().toast('Choose the zone to move it to', 'warning'); return; }\n    const courierId = document.getElementById('ims-ac-courier')?.value;\n    const db_ = _rcDb();\n    const { data: ex } = await db_.from('courier_zone_postcodes').select('id').eq('courier_id', courierId).eq('prefix', outward).maybeSingle();\n    const res = ex ? await db_.from('courier_zone_postcodes').update({ zone_id: zoneId }).eq('id', ex.id)\n                   : await db_.from('courier_zone_postcodes').insert({ company_id: window.SM.AUTH.company?.id, courier_id: courierId, zone_id: zoneId, prefix: outward });\n    if (res.error) { ui().toast('Not moved: ' + res.error.message, 'error', 8000); return; }\n    ui().toast(`${outward} moved for this courier; the charge has been recalculated`, 'success');\n    refreshCourierCharge(jobId);\n  }\n\n  async function assignJobCourier(jobId){\n    const [{data:couriers},{data:job}]=await Promise.all([\n      db().select('couriers',{eq:{is_active:true},order:{col:'name'}}),\n      db().select('logistics_jobs',{eq:{id:jobId},maybeSingle:true,noCompanyFilter:true})\n    ]);\n    const courierOpts=(couriers||[]).map(c=>`<option value=\"${c.id}\">${util().sanitize(c.name)}</option>`).join('');\n\n    // Auto-fetch real weight/dimensions from the product catalogue's\n    // packaging (box) data via the shared UTIL.getOrderBoxSummary()\n    // helper, so staff don't have to look this up and type it in\n    // manually every time. Multiple boxes can't be meaningfully summed\n    // into one L\u00D7W\u00D7H, so in that case only weight is auto-filled and a\n    // per-box breakdown is shown as a hint instead of a fabricated\n    // combined dimension.\n    let autoWeight='', autoDims='', boxHint='';\n    if(job?.order_id){\n      const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n      const {data:orderItems}=await client.from('order_items')\n        .select('product_id,product_name,sku,quantity').eq('order_id',job.order_id);\n      const summary=await util().getOrderBoxSummary(orderItems||[]);\n      if(summary.hasData){\n        if(summary.totalWeightKg>0) autoWeight=summary.totalWeightKg;\n        if(summary.totalBoxes===1){\n          const onlyBox=summary.lines.find(l=>l.boxes.length)?.boxes[0];\n          if(onlyBox) autoDims=`${onlyBox.length_cm||''}x${onlyBox.width_cm||''}x${onlyBox.height_cm||''}`;\n        } else if(summary.totalBoxes>1){\n          const breakdown=summary.lines.flatMap(l=>l.boxes.map(b=>`${b.length_cm||'?'}\u00D7${b.width_cm||'?'}\u00D7${b.height_cm||'?'}cm`)).join(', ');\n          boxHint=`<span class=\"ims__input-hint\">${summary.totalBoxes} boxes total \u2014 enter combined or largest box dimensions. Breakdown: ${util().sanitize(breakdown)}</span>`;\n        }\n      }\n    }\n\n    delete _acState[jobId];\n    const R = `window.IMS_LOGISTICS.refreshCourierCharge('${util().jsArg(jobId)}')`;\n    ui().openModal('Assign to courier',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label ims__label--req\">Courier</label><select class=\"ims__select\" id=\"ims-ac-courier\" onchange=\"${R}\"><option value=\"\">Select courier</option>${courierOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Tracking number</label><input class=\"ims__input\" type=\"text\" id=\"ims-ac-tracking\" placeholder=\"Enter tracking number\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Courier order no.</label><input class=\"ims__input\" type=\"text\" id=\"ims-ac-corder\" placeholder=\"Optional, e.g. VDI242546\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Weight (kg)</label><input class=\"ims__input\" type=\"number\" step=\"0.1\" id=\"ims-ac-weight\" placeholder=\"Parcel weight\" value=\"${autoWeight}\" onchange=\"${R}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Dimensions (L\u00D7W\u00D7H cm)</label><input class=\"ims__input\" type=\"text\" id=\"ims-ac-dims\" placeholder=\"e.g. 60x50x40\" value=\"${autoDims}\" onchange=\"${R}\">${boxHint}</div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Room of choice: floor</label><input class=\"ims__input\" type=\"number\" min=\"0\" step=\"1\" id=\"ims-ac-floor\" value=\"0\" title=\"0 = ground floor / doorstep\" onchange=\"${R}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Charge (\u00A3)</label><input class=\"ims__input\" type=\"number\" min=\"0\" step=\"0.01\" id=\"ims-ac-charge\" placeholder=\"Worked out automatically\" oninput=\"window.IMS_LOGISTICS.chargeEdited('${util().jsArg(jobId)}')\"></div>\n        <div class=\"ims__form-group ims__form-group--full\" id=\"ims-ac-breakdown\"></div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.confirmCourierAssignment('${util().jsArg(jobId)}')\"><i class=\"ti ti-check\"></i> Assign &amp; dispatch</button>\n    `,'');\n  }\n\n  async function confirmCourierAssignment(jobId){\n    const courierId=document.getElementById('ims-ac-courier')?.value;\n    const tracking=document.getElementById('ims-ac-tracking')?.value?.trim();\n    if(!courierId){ui().toast('Please select a courier','error');return;}\n    if(!tracking){ui().toast('Tracking number is required','error');return;}\n    const {data:job}=await db().select('logistics_jobs',{eq:{id:jobId},maybeSingle:true,noCompanyFilter:true});\n    if(!job){ui().toast('Job not found','error');return;}\n    let chargeAmount=0;\n    const weight=parseFloat(document.getElementById('ims-ac-weight')?.value)||0;\n    const dimsRaw=document.getElementById('ims-ac-dims')?.value||'';\n    const dims=dimsRaw.split(/[x\u00D7]/i).map(d=>parseFloat(d)||0);\n    // The charge box (worked out automatically, or changed by staff) is\n    // what is saved. If it is empty, the charge is worked out as before.\n    const typedCharge=document.getElementById('ims-ac-charge')?.value;\n    const st=_acState[jobId]||{}; const calc=st.calc||null;\n    if(typedCharge!==undefined&&typedCharge!==''&&!isNaN(parseFloat(typedCharge))){\n      chargeAmount=_money(parseFloat(typedCharge));\n    } else if(calc?.total){\n      chargeAmount=calc.total;\n    } else if(weight>0&&courierId){\n      const {data:order}=await db().select('orders',{eq:{id:job.order_id},maybeSingle:true,noCompanyFilter:true,select:'postcode'});\n      const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n      const {data:chargeResult}=await client.rpc('calculate_courier_charge',{\n        p_courier_id:courierId,p_weight_kg:weight,\n        p_length_cm:dims[0]||0,p_width_cm:dims[1]||0,p_height_cm:dims[2]||0,\n        p_postcode:order?.postcode||''\n      });\n      if(chargeResult?.total) chargeAmount=chargeResult.total;\n    }\n    await db().insert('shipments',{\n      order_id:job.order_id,courier_id:courierId,tracking_number:tracking,\n      ship_mode:'courier',status:'dispatched',\n      dispatched_at:new Date().toISOString(),\n      weight_actual:weight||null,\n      dimensions_cm:dimsRaw||null,\n      charge_amount:chargeAmount,\n      courier_order_ref:document.getElementById('ims-ac-corder')?.value?.trim()||null,\n      expected_charge:calc?.total??null,\n      charge_breakdown:calc?(calc.method==='type_zone'?{method:'type_zone',zone:calc.zone?.name||null,outward:calc.outward,rate:calc.rateLine,extras:calc.extras.filter(e=>e.on).map(e=>({name:e.name,qty:e.qty,amount:e.amount})),floor:calc.floor,floor_amount:calc.floorAmt,base:calc.base,fuel_pct:calc.fuelPct,fuel:calc.fuel,total:calc.total,flags:calc.flags}:{method:'weight',total:calc.total}):null,\n      rate_card_id:calc?.card?.id||null,\n      zone_name:calc?.zone?.name||null\n    });\n    await db().update('logistics_jobs',jobId,{status:'assigned_courier',assigned_courier_id:courierId});\n    if(job.order_id){\n      const { data: ord } = await db().select('orders',{select:'status',eq:{id:job.order_id},maybeSingle:true,noCompanyFilter:true});\n      await db().update('orders',job.order_id,{status:'dispatched',dispatched_at:new Date().toISOString()});\n      await logActivity(job.order_id, ord?.status||'packed', 'dispatched', 'dispatched', `Courier: tracking ${tracking}`+(calc?.total!=null&&Math.abs(calc.total-chargeAmount)>0.004?`. Charge changed from the expected ${util().formatCurrency(calc.total)} to ${util().formatCurrency(chargeAmount)}`:''));\n    }\n    if(chargeAmount>0){\n      await db().insert('transactions',{\n        date:new Date().toISOString().split('T')[0],\n        type:'expense',category:'Courier charges',\n        description:`Courier charge: ${tracking}`,\n        amount:chargeAmount,reference:tracking\n      });\n    }\n    ui().closeModal();\n    ui().toast(`Dispatched via courier. Tracking: ${tracking}`+(chargeAmount>0?` | Charge: ${util().formatCurrency(chargeAmount)}`:''),'success');\n    window.SM.EMAIL.send(job.order_id, 'dispatched');\n    window.SM.SHOPIFY?.sync('fulfil',[job.order_id]);   // website orders: Fulfilled in Shopify, with this tracking\n    refreshTabBadges();\n    loadUnassigned();\n  }\n\n  async function assignOwnTruck(jobId,orderId){\n    ui().openModal('Add to own truck queue',`\n      <p style=\"font-size:13px;color:var(--ims-text-sec);margin-bottom:12px\">This order will be added to your own truck delivery queue for route planning.</p>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Planned delivery date</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-owntruck-date\" value=\"${new Date().toISOString().split('T')[0]}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Notes</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-owntruck-notes\" placeholder=\"e.g. Call before delivery\"></div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.confirmOwnTruck('${util().jsArg(jobId)}','${util().jsArg(orderId||'')}')\"><i class=\"ti ti-check\"></i> Add to queue</button>\n    `,'sm');\n  }\n\n  async function confirmOwnTruck(jobId,orderId){\n    const date=document.getElementById('ims-owntruck-date')?.value;\n    const notes=document.getElementById('ims-owntruck-notes')?.value?.trim();\n    await db().update('logistics_jobs',jobId,{job_type:'own_truck',status:'scheduled',notes:notes||null});\n    if(orderId){\n      // Deliberately does NOT mark the order dispatched here \u2014 this only\n      // moves it to the Own Truck Queue. It becomes genuinely dispatched\n      // once a real manifest is created from that queue, the same point\n      // every other delivery path marks an order dispatched.\n      const { data: ord } = await db().select('orders',{select:'status',eq:{id:orderId},maybeSingle:true,noCompanyFilter:true});\n      await logActivity(orderId, ord?.status||'packed', ord?.status||'packed', 'queued_own_truck', 'Queued for own-truck delivery \u2014 awaiting manifest');\n    }\n    ui().closeModal();\n    ui().toast('Order moved to Own Truck Queue \u2014 awaiting manifest','success');\n    loadUnassigned();\n  }\n\n  // \u2500\u2500\u2500 OWN TRUCK QUEUE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Orders marked \"We deliver\" land here (logistics_jobs.status =\n  // 'scheduled', job_type = 'own_truck') instead of remaining visible in\n  // Unassigned Jobs or Tracking \u2014 they are not yet dispatched, and stay\n  // off both screens until a real manifest is actually created for them.\n  // Sends queued orders back to Unassigned jobs, where the delivery\n  // decision can be changed (for example to a courier or collection).\n  // One order (jobId), or every order ticked in the queue.\n  async function backToUnassigned(jobId){\n    const ids=jobId?[jobId]:[...document.querySelectorAll('.ims-otq-check:checked')].map(cb=>cb.value);\n    if(!ids.length){ui().toast('Please select at least one order','warning');return;}\n    ui().confirm(`Send ${ids.length===1?'this order':ids.length+' orders'} back to Unassigned jobs? You can then choose another way to send ${ids.length===1?'it':'them'}, for example a courier.`, async()=>{\n      const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n      // Only orders still waiting in the queue (not already on a manifest).\n      const {data:moved,error}=await client.from('logistics_jobs')\n        .update({status:'unassigned',job_type:'delivery'})\n        .in('id',ids).eq('status','scheduled').eq('job_type','own_truck').eq('is_return_pickup',false).is('manifest_id',null).select('id,order_id');   // return pick-ups stay on the van\n      if(error){ui().toast('Failed: '+error.message,'error');return;}\n      for(const j of (moved||[])) if(j.order_id) await logActivity(j.order_id,'','','back_to_unassigned','Moved from the Own Truck Queue back to Unassigned jobs');\n      ui().toast(`${(moved||[]).length} order(s) back in Unassigned jobs`,'success');\n      loadOwnTruckQueue();\n    },'Back to Unassigned',false);\n  }\n\n  async function loadOwnTruckQueue(){\n    const content = document.getElementById('ims-log-content');\n    if(!content) return;\n    content.innerHTML = `<div class=\"ims__loading\"><i class=\"ti ti-loader-2 ims__spin\"></i></div>`;\n\n    const { data: jobs } = await db().select('logistics_jobs', {\n      select: 'id,job_type,notes,created_at,is_return_pickup,orders(id,order_number,customer_name,postcode,address,total_value)',\n      eq: { status: 'scheduled', job_type: 'own_truck' },\n      order: { col: 'created_at', asc: true }\n    });\n    const items = jobs || [];\n\n    if(!items.length){\n      content.innerHTML = `<div class=\"ims__empty\"><i class=\"ti ti-truck\"></i><p>No orders queued for own-truck delivery</p><p style=\"font-size:12px;color:var(--ims-text-muted);margin-top:6px\">Orders marked \"We deliver\" from Unassigned Jobs appear here, waiting to be placed on a manifest</p></div>`;\n      return;\n    }\n\n    content.innerHTML = `\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:12px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>These orders are marked for your own fleet but are not yet dispatched \u2014 they stay here, and stay off Tracking, until a real manifest is created for them.</span>\n      </div>\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:10px\">\n        <strong style=\"font-size:13px\">${items.length} order${items.length===1?'':'s'} queued</strong>\n        <div class=\"ims__btn-group\">\n          <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.backToUnassigned()\" title=\"Send the selected orders back to Unassigned jobs, to choose another way (for example a courier)\"><i class=\"ti ti-arrow-back-up\"></i> Back to Unassigned</button>\n          <button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.planRouteFromQueue()\"><i class=\"ti ti-route\"></i> Create manifest from selected</button>\n        </div>\n      </div>\n      <table class=\"ims__table\">\n        <thead><tr>\n          <th><input type=\"checkbox\" id=\"ims-otq-all\" onchange=\"document.querySelectorAll('.ims-otq-check').forEach(c=>c.checked=this.checked)\"></th>\n          <th>Order #</th><th>Customer</th><th>Postcode</th><th>Value</th><th>Notes</th><th>Queued</th><th></th>\n        </tr></thead>\n        <tbody>\n          ${items.map(j => `<tr>\n            <td><input type=\"checkbox\" class=\"ims-otq-check\" value=\"${j.id}\"></td>\n            <td><span class=\"ims__link\" onclick=\"window.IMS_ORDERS?.openOrder('${util().jsArg(j.orders?.id||'')}')\">${util().sanitize(j.orders?.order_number||'\u2014')}</span>${j.is_return_pickup?' <span class=\"ims__pill ims__pill--warning\" style=\"font-size:10px\">Return pick-up</span>':''}</td>\n            <td>${util().sanitize(j.orders?.customer_name||'\u2014')}</td>\n            <td>${util().sanitize(j.orders?.postcode||'\u2014')}</td>\n            <td>${util().formatCurrency(j.orders?.total_value)}</td>\n            <td style=\"font-size:12px;color:var(--ims-text-muted)\">${util().sanitize(j.notes||'\u2014')}</td>\n            <td style=\"font-size:11px;color:var(--ims-text-muted)\">${util().formatDate(j.created_at)}</td>\n            <td>${j.is_return_pickup\n              ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.cancelPickup('${util().jsArg(j.id)}')\" title=\"Cancel this van pick-up\"><i class=\"ti ti-x\"></i></button>`\n              : `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.backToUnassigned('${util().jsArg(j.id)}')\" title=\"Back to Unassigned jobs, to choose another way\"><i class=\"ti ti-arrow-back-up\"></i></button>`}</td>\n          </tr>`).join('')}\n        </tbody>\n      </table>\n    `;\n  }\n\n  // Mirrors planRoute() exactly (same modal, same fields, same footer\n  // calling the existing createManifest() unchanged) \u2014 only the source\n  // of eligible jobs differs: the Own Truck Queue instead of Unassigned\n  // Jobs. createManifest() itself needed no changes at all, since it\n  // never assumes anything about a job's prior status, it just processes\n  // whatever was checked.\n  async function planRouteFromQueue(){\n    const checked=[...document.querySelectorAll('.ims-otq-check:checked')].map(cb=>cb.value);\n    if(!checked.length){ui().toast('Please select at least one order','warning');return;}\n    const {data:jobs}=await db().select('logistics_jobs',{\n      select:'id,job_type,is_return_pickup,orders(id,order_number,customer_name,postcode,address,total_value)',\n      eq:{status:'scheduled',job_type:'own_truck'},order:{col:'created_at'}\n    });\n    const available=(jobs||[]).filter(j=>checked.includes(j.id));\n    if(!available.length){ui().toast('Selected orders are no longer available','warning');loadOwnTruckQueue();return;}\n    const {data:drivers}=await db().select('drivers',{eq:{is_active:true}});\n    const {data:vehicles}=await db().select('vehicles',{eq:{is_active:true}});\n    const {data:routes}=await db().select('routes',{eq:{is_active:true}});\n    const driverOpts=(drivers||[]).map(d=>`<option value=\"${d.id}\">${util().sanitize(d.name)}</option>`).join('');\n    const vehicleOpts=(vehicles||[]).map(v=>`<option value=\"${v.id}\">${util().sanitize(v.registration)} \u2014 ${util().sanitize(v.make_model||v.vehicle_type||'')}</option>`).join('');\n    const routeOpts=(routes||[]).map(r=>`<option value=\"${r.id}\">${util().sanitize(r.name)}</option>`).join('');\n    ui().openModal('Plan delivery route',`\n      <div class=\"ims__form-grid\" style=\"margin-bottom:14px\">\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Driver</label><select class=\"ims__select\" id=\"ims-rt-driver\"><option value=\"\">Select driver</option>${driverOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Vehicle</label><select class=\"ims__select\" id=\"ims-rt-vehicle\"><option value=\"\">Select vehicle</option>${vehicleOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Route</label><select class=\"ims__select\" id=\"ims-rt-route\"><option value=\"\">None</option>${routeOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Dispatch date</label><input class=\"ims__input\" type=\"date\" id=\"ims-rt-date\" value=\"${new Date().toISOString().split('T')[0]}\"></div>\n      </div>\n      <strong style=\"font-size:13px;display:block;margin-bottom:8px\">Select orders for this route</strong>\n      <div style=\"max-height:300px;overflow-y:auto\">\n        <table class=\"ims__table\">\n          <thead><tr><th><input type=\"checkbox\" id=\"ims-rt-all\" onchange=\"document.querySelectorAll('.ims-rt-check').forEach(c=>c.checked=this.checked)\"></th><th>Order #</th><th>Customer</th><th>Postcode</th><th>Type</th></tr></thead>\n          <tbody>${available.map(j=>`<tr>\n            <td><input type=\"checkbox\" class=\"ims-rt-check\" value=\"${j.id}\" checked></td>\n            <td>${util().sanitize(j.orders?.order_number||'\u2014')}</td>\n            <td>${util().sanitize(j.orders?.customer_name||'\u2014')}</td>\n            <td>${util().sanitize(j.orders?.postcode||'\u2014')}</td>\n            <td><span class=\"ims__pill ims__pill--neutral\">Own truck</span></td>\n          </tr>`).join('')}\n          </tbody>\n        </table>\n      </div>\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-top:12px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Loading order is automatically reversed from delivery sequence (LIFO). Last delivery loaded first into truck.</span>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.createManifest()\"><i class=\"ti ti-check\"></i> Create manifest</button>\n    `,'xl');\n  }\n\n  async function markSelfCollection(jobId,orderId){\n    const slot=prompt('Collection slot (optional, e.g. 2026-05-25 14:00):','');\n    await db().update('logistics_jobs',jobId,{\n      job_type:'self_collection',status:'unassigned',\n      collection_slot:slot?new Date(slot).toISOString():null\n    });\n    if(orderId){\n      const { data: ord } = await db().select('orders',{select:'status',eq:{id:orderId},maybeSingle:true,noCompanyFilter:true});\n      await db().update('orders',orderId,{status:'dispatched',dispatched_at:new Date().toISOString()});\n      await logActivity(orderId, ord?.status||'packed', 'dispatched', 'dispatched', 'Marked for customer self-collection');\n      window.SM.SHOPIFY?.sync('fulfil',[orderId]);\n    }\n    ui().toast('Marked for customer self-collection','success');\n    loadUnassigned();\n  }\n\n  async function cancelSelfCollection(jobId,orderId){\n    ui().confirm('Move this order back to unassigned deliveries? The order status will revert to Packed.',async()=>{\n      await db().update('logistics_jobs',jobId,{job_type:'delivery',status:'unassigned',collection_slot:null});\n      if(orderId){\n        const { data: ord } = await db().select('orders',{select:'status',eq:{id:orderId},maybeSingle:true,noCompanyFilter:true});\n        if(ord?.status === 'dispatched'){\n          await db().update('orders',orderId,{status:'packed',dispatched_at:null});\n          await logActivity(orderId, 'dispatched', 'packed', 'status_update', 'Self-collection undone \u2014 moved back to deliveries queue');\n          window.SM.SHOPIFY?.sync('unfulfil',[orderId]);\n        }\n      }\n      ui().toast('Order moved back to deliveries queue','success');\n      loadUnassigned();\n    },'Undo self-collection',false);\n  }\n\n  async function markCollected(jobId,orderId){\n    await db().update('logistics_jobs',jobId,{status:'collected'});\n    if(orderId){\n      const { data: ord } = await db().select('orders',{\n        select:'status,order_type,customer_id,total_value,order_number,payment_status',\n        eq:{id:orderId},maybeSingle:true,noCompanyFilter:true\n      });\n      await db().update('orders',orderId,{status:'delivered',delivered_at:new Date().toISOString()});\n      await logActivity(orderId, ord?.status||'dispatched', 'delivered', 'delivered', 'Customer self-collected');\n      await deductStockOnDelivery(orderId, ord?.order_number||'');\n\n      if(ord?.order_type === 'wholesale' && ord?.customer_id){\n        const { data: existing } = await db().select('accounts_receivable',{\n          eq:{ order_id: orderId }, maybeSingle:true, noCompanyFilter:true\n        });\n        if(!existing){\n          const { data: cust } = await db().select('customers',{select:'credit_terms',eq:{id:ord.customer_id},maybeSingle:true,noCompanyFilter:true});\n          const dueDate = util().resolveReceivableDueDate(ord.payment_status, cust?.credit_terms);\n          if(dueDate){\n            await db().insert('accounts_receivable',{\n              order_id:    orderId,\n              customer_id: ord.customer_id,\n              amount:      ord.total_value || 0,\n              paid_amount: 0,\n              status:      'unpaid',\n              invoice_ref: ord.order_number,\n              due_date:    dueDate\n            });\n            ui().toast('Order marked as collected \u2014 receivable created in Accounts','success',5000);\n          } else {\n            ui().toast('Order marked as collected and delivered','success');\n          }\n        } else {\n          ui().toast('Order marked as collected and delivered','success');\n        }\n      } else {\n        ui().toast('Order marked as collected and delivered','success');\n      }\n    } else {\n      ui().toast('Order marked as collected and delivered','success');\n    }\n    loadUnassigned();\n  }\n\n  // \u2500\u2500\u2500 SELF-COLLECTION CONFIRMATION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // markCollected() above previously ran silently with no confirmation\n  // step at all \u2014 this adds a proper modal asking who actually\n  // collected the order before processing it, matching the equivalent\n  // dropship collection flow.\n  function showSelfCollectionModal(jobId, orderId, orderNumber){\n    const now = new Date();\n    const dateStr = now.toISOString().split('T')[0];\n    const timeStr = now.toTimeString().slice(0,5);\n    ui().openModal(`Confirm collection: ${orderNumber}`,`\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:16px\">\n        <i class=\"ti ti-home\"></i>\n        <span>Confirm the customer (or their representative) has collected this order. This will mark the order as delivered.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label ims__label--req\">Collected by</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-sc-by\" placeholder=\"e.g. John Smith (customer) or driver name\">\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label\">Vehicle registration</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-sc-vehicle\" placeholder=\"e.g. AB12 CDE\" style=\"text-transform:uppercase\">\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Collection date</label>\n          <input class=\"ims__input\" type=\"date\" id=\"ims-sc-date\" value=\"${dateStr}\">\n        </div>\n        <div class=\"ims__form-group\">\n          <label class=\"ims__label ims__label--req\">Collection time</label>\n          <input class=\"ims__input\" type=\"time\" id=\"ims-sc-time\" value=\"${timeStr}\">\n        </div>\n        <div class=\"ims__form-group ims__form-group--full\">\n          <label class=\"ims__label\">Notes</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-sc-notes\" placeholder=\"e.g. ID checked, signed for goods\">\n        </div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--success\" onclick=\"window.IMS_LOGISTICS.confirmMarkCollected('${util().jsArg(jobId)}','${util().jsArg(orderId)}','${util().jsArg(orderNumber)}')\">\n        <i class=\"ti ti-circle-check\"></i> Confirm collected\n      </button>\n    `,'sm');\n    setTimeout(()=>document.getElementById('ims-sc-by')?.focus(),150);\n  }\n\n  async function confirmMarkCollected(jobId, orderId, orderNumber){\n    const collectedBy = document.getElementById('ims-sc-by')?.value?.trim();\n    const vehicle = document.getElementById('ims-sc-vehicle')?.value?.trim().toUpperCase();\n    const dateVal = document.getElementById('ims-sc-date')?.value;\n    const timeVal = document.getElementById('ims-sc-time')?.value || '00:00';\n    const notes = document.getElementById('ims-sc-notes')?.value?.trim();\n\n    if(!collectedBy){ ui().toast('Please enter who collected the order','error'); return; }\n    if(!dateVal){ ui().toast('Please enter the collection date','error'); return; }\n\n    if(orderId && await _isAlreadyDelivered(orderId)){\n      ui().toast(`Order is already marked delivered \u2014 no duplicate actions taken.`,'warning',5000);\n      ui().closeModal();\n      loadUnassigned();\n      return;\n    }\n\n    const collectedAt = new Date(`${dateVal}T${timeVal}:00`).toISOString();\n\n    await db().update('logistics_jobs',jobId,{status:'collected'});\n    if(orderId){\n      const { data: ord } = await db().select('orders',{\n        select:'status,order_type,customer_id,total_value,order_number,payment_status',\n        eq:{id:orderId},maybeSingle:true,noCompanyFilter:true\n      });\n      await db().update('orders',orderId,{\n        status:'delivered',\n        delivered_at:new Date().toISOString(),\n        collected_by:collectedBy,\n        collection_vehicle:vehicle||null,\n        collected_at:collectedAt,\n        collection_notes:notes||null\n      });\n      await logActivity(orderId, ord?.status||'dispatched', 'delivered', 'delivered', `Customer self-collected \u2014 collected by ${collectedBy}`);\n      await deductStockOnDelivery(orderId, ord?.order_number||orderNumber||'');\n\n      if(ord?.order_type === 'wholesale' && ord?.customer_id){\n        const { data: existing } = await db().select('accounts_receivable',{\n          eq:{ order_id: orderId }, maybeSingle:true, noCompanyFilter:true\n        });\n        if(!existing){\n          const { data: cust } = await db().select('customers',{select:'credit_terms',eq:{id:ord.customer_id},maybeSingle:true,noCompanyFilter:true});\n          const dueDate = util().resolveReceivableDueDate(ord.payment_status, cust?.credit_terms);\n          if(dueDate){\n            await db().insert('accounts_receivable',{\n              order_id:    orderId,\n              customer_id: ord.customer_id,\n              amount:      ord.total_value || 0,\n              paid_amount: 0,\n              status:      'unpaid',\n              invoice_ref: ord.order_number,\n              due_date:    dueDate\n            });\n          }\n        }\n      }\n    }\n    ui().closeModal();\n    ui().toast(`Order collected by ${collectedBy}`,'success',5000);\n    loadUnassigned();\n  }\n  async function cancelUnassignedOrder(jobId,orderId,orderNumber){\n    ui().confirm(`Cancel order <strong>${util().sanitize(orderNumber)}</strong>?<br><br>Stock reservations will be released and it will be removed from Logistics.`, async () => {\n      const { data: ord } = await db().select('orders', {\n        select: 'status,warehouse_id,fulfillment_type,order_items(product_id,product_name,quantity)', eq: { id: orderId }, maybeSingle: true, noCompanyFilter: true\n      });\n      // Dropship orders hold the partner's allocation, not normal\n      // reservations, and may carry partner charges. They are cancelled or\n      // deleted from the Dropship screen, which handles both.\n      if (ord?.fulfillment_type === 'dropship') {\n        ui().toast(`${orderNumber} is a dropship order. Cancel or delete it from the Dropship screen, so the partner's allocation and charges are handled.`, 'warning', 8000);\n        return;\n      }\n      if (!['confirmed','picking','packed'].includes(ord?.status)) {\n        ui().toast('This order can no longer be cancelled from here', 'error');\n        return;\n      }\n      const items = ord?.order_items || [];\n      const whId = ord?.warehouse_id;\n      // Release each line's reservation one at a time, in the order's own\n      // warehouse. (All at once, two lines of the same product both read\n      // the same figure and one release was lost; and with no warehouse\n      // set, it used to guess one.)\n      const problems = [];\n      if (!whId && items.some(i => i.product_id)) {\n        problems.push('the order has no warehouse set');\n      } else {\n        for (const item of items) {\n          if (!item.product_id) continue;\n          const { data: sl } = await db().select('stock_levels', { eq: { product_id: item.product_id, warehouse_id: whId }, maybeSingle: true, noCompanyFilter: true });\n          if (!sl) { problems.push(item.product_name || item.product_id); continue; }\n          const { error } = await db().update('stock_levels', sl.id, { reserved_qty: Math.max(0, (sl.reserved_qty||0) - (item.quantity||0)) });\n          if (error) problems.push(item.product_name || item.product_id);\n        }\n      }\n      await db().remove('logistics_jobs', jobId);\n      await db().update('orders', orderId, { status: 'cancelled' });\n      await logActivity(orderId, ord?.status||'', 'cancelled', 'cancelled', 'Cancelled from Logistics (unassigned job)');\n      window.SM.SHOPIFY?.sync('cancel',[orderId]);   // website orders: cancelled and restocked in Shopify (no refund)\n      if (problems.length) {\n        ui().toast(`${orderNumber} cancelled, but stock reservations could not be released for: ${problems.join(', ')}. Please check stock levels.`, 'warning', 10000);\n      } else {\n        ui().toast('Order cancelled: stock released', 'success');\n      }\n      loadUnassigned();\n    }, 'Cancel order', true);\n  }\n\n  async function bulkAssignCourier(){\n    const checked=[...document.querySelectorAll('.ims-job-check:checked')].map(cb=>cb.value);\n    if(!checked.length){ui().toast('Please select at least one order','warning');return;}\n    const {data:couriers}=await db().select('couriers',{eq:{is_active:true},order:{col:'name'}});\n    const courierOpts=(couriers||[]).map(c=>`<option value=\"${c.id}\">${util().sanitize(c.name)}</option>`).join('');\n    ui().openModal(`Assign ${checked.length} order(s) to courier`,`\n      <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Courier</label><select class=\"ims__select\" id=\"ims-bulk-courier\"><option value=\"\">Select courier</option>${courierOpts}</select></div>\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-top:12px\"><i class=\"ti ti-info-circle\"></i><span>Tracking numbers will need to be entered individually for each shipment after bulk assignment.</span></div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.confirmBulkAssign(${JSON.stringify(checked).replace(/\"/g,'&quot;')})\"><i class=\"ti ti-check\"></i> Assign</button>\n    `,'sm');\n  }\n\n  async function confirmBulkAssign(jobIds){\n    const courierId=document.getElementById('ims-bulk-courier')?.value;\n    if(!courierId){ui().toast('Please select a courier','error');return;}\n    const bulkOrderIds=[];\n    await Promise.all(jobIds.map(async jobId=>{\n      const {data:job}=await db().select('logistics_jobs',{eq:{id:jobId},maybeSingle:true,noCompanyFilter:true});\n      await db().update('logistics_jobs',jobId,{status:'assigned_courier',assigned_courier_id:courierId});\n      if(job?.order_id){\n        bulkOrderIds.push(job.order_id);\n        const { data: ord } = await db().select('orders',{select:'status',eq:{id:job.order_id},maybeSingle:true,noCompanyFilter:true});\n        await db().update('orders',job.order_id,{status:'dispatched',dispatched_at:new Date().toISOString()});\n        await logActivity(job.order_id, ord?.status||'packed', 'dispatched', 'dispatched', 'Bulk courier assignment');\n      }\n    }));\n    ui().closeModal();\n    ui().toast(`${jobIds.length} jobs assigned to courier`,'success');\n    window.SM.SHOPIFY?.sync('fulfil',bulkOrderIds);   // website orders: Fulfilled in Shopify (tracking follows when added)\n    loadUnassigned();\n  }\n\n  // \u2500\u2500\u2500 ROUTE PLANNING \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Delivery workflow, one way: Unassigned jobs (where the delivery\n  // decision is made: we deliver, courier or collection) > \"We deliver\" >\n  // Own Truck Queue > manifest. Every way of building or changing a\n  // manifest takes orders only from the Own Truck Queue, and orders taken\n  // off a manifest go back to the queue. \"Back to Unassigned\" in the queue\n  // is the way to change the decision (for example to use a courier).\n  async function planRoute(){\n    // Anything ticked in the Own Truck Queue starts ticked here.\n    const checked=[...document.querySelectorAll('.ims-otq-check:checked')].map(cb=>cb.value);\n    const {data:jobs}=await db().select('logistics_jobs',{\n      select:'id,job_type,is_return_pickup,orders(id,order_number,customer_name,postcode,address,total_value)',\n      eq:{status:'scheduled',job_type:'own_truck'},order:{col:'created_at'}\n    });\n    const available=jobs||[];\n    if(!available.length){ui().toast('Nothing in the Own Truck Queue yet. Use \"We deliver\" on Unassigned jobs first.','warning',7000);return;}\n    const {data:drivers}=await db().select('drivers',{eq:{is_active:true}});\n    const {data:vehicles}=await db().select('vehicles',{eq:{is_active:true}});\n    const {data:routes}=await db().select('routes',{eq:{is_active:true}});\n    const driverOpts=(drivers||[]).map(d=>`<option value=\"${d.id}\">${util().sanitize(d.name)}</option>`).join('');\n    const vehicleOpts=(vehicles||[]).map(v=>`<option value=\"${v.id}\">${util().sanitize(v.registration)} \u2014 ${util().sanitize(v.make_model||v.vehicle_type||'')}</option>`).join('');\n    const routeOpts=(routes||[]).map(r=>`<option value=\"${r.id}\">${util().sanitize(r.name)}</option>`).join('');\n    const selectedIds=new Set(checked);\n    ui().openModal('Plan delivery route',`\n      <div class=\"ims__form-grid\" style=\"margin-bottom:14px\">\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Driver</label><select class=\"ims__select\" id=\"ims-rt-driver\"><option value=\"\">Select driver</option>${driverOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Vehicle</label><select class=\"ims__select\" id=\"ims-rt-vehicle\"><option value=\"\">Select vehicle</option>${vehicleOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Route</label><select class=\"ims__select\" id=\"ims-rt-route\"><option value=\"\">None</option>${routeOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Dispatch date</label><input class=\"ims__input\" type=\"date\" id=\"ims-rt-date\" value=\"${new Date().toISOString().split('T')[0]}\"></div>\n      </div>\n      <strong style=\"font-size:13px;display:block;margin-bottom:8px\">Select orders for this route</strong>\n      <div style=\"max-height:300px;overflow-y:auto\">\n        <table class=\"ims__table\">\n          <thead><tr><th><input type=\"checkbox\" id=\"ims-rt-all\" onchange=\"document.querySelectorAll('.ims-rt-check').forEach(c=>c.checked=this.checked)\"></th><th>Order #</th><th>Customer</th><th>Postcode</th><th>Type</th></tr></thead>\n          <tbody>${available.map(j=>`<tr>\n            <td><input type=\"checkbox\" class=\"ims-rt-check\" value=\"${j.id}\" ${selectedIds.has(j.id)?'checked':''}></td>\n            <td>${util().sanitize(j.orders?.order_number||'\u2014')}</td>\n            <td>${util().sanitize(j.orders?.customer_name||'\u2014')}</td>\n            <td>${util().sanitize(j.orders?.postcode||'\u2014')}</td>\n            <td><span class=\"ims__pill ims__pill--${j.job_type==='delivery'?'info':'neutral'}\">${j.job_type==='delivery'?'Delivery':'Collection'}</span></td>\n          </tr>`).join('')}\n          </tbody>\n        </table>\n      </div>\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-top:12px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Loading order is automatically reversed from delivery sequence (LIFO). Last delivery loaded first into truck.</span>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.createManifest()\"><i class=\"ti ti-check\"></i> Create manifest</button>\n    `,'xl');\n  }\n\n  async function createManifest(){\n    const selected=[...document.querySelectorAll('.ims-rt-check:checked')].map(cb=>cb.value);\n    if(!selected.length){ui().toast('Please select at least one order','error');return;}\n    const g=id=>document.getElementById(id)?.value?.trim()||'';\n    const driverId=g('ims-rt-driver')||null;\n    const vehicleId=g('ims-rt-vehicle')||null;\n    const routeId=g('ims-rt-route')||null;\n    const dispatchDate=g('ims-rt-date');\n\n    // Only orders in the Own Truck Queue can go on a manifest. Checked\n    // before the manifest is created, so it is never made for nothing.\n    const {data:queued}=await db().select('logistics_jobs',{\n      select:'id', in:{id:selected}, eq:{status:'scheduled',job_type:'own_truck'}, noCompanyFilter:true\n    });\n    const eligible=(queued||[]).map(j=>j.id);\n    if(!eligible.length){ui().toast('The selected orders are no longer in the Own Truck Queue. Nothing was created.','warning',7000);loadOwnTruckQueue();return;}\n    if(eligible.length<selected.length) ui().toast(`${selected.length-eligible.length} selected order(s) are no longer in the Own Truck Queue and were left out.`,'warning',7000);\n\n    const {data:lastMF}=await db().select('manifests',{select:'manifest_number',order:{col:'created_at',asc:false},limit:1});\n    const manifestNumber=util().generateRef('MF',lastMF?.[0]?.manifest_number);\n\n    const {data:manifest,error}=await db().insert('manifests',{\n      manifest_number:manifestNumber,driver_id:driverId,vehicle_id:vehicleId,route_id:routeId,\n      status:'dispatched',dispatched_at:new Date(dispatchDate||Date.now()).toISOString()\n    });\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n\n    const {data:jobs}=await db().select('logistics_jobs',{\n      select:'id,job_type,order_id,orders(postcode,order_number,order_type,customer_id,total_value)',\n      in:{id:eligible},noCompanyFilter:true\n    });\n    const sorted=(jobs||[]).sort((a,b)=>(a.orders?.postcode||'').localeCompare(b.orders?.postcode||''));\n    const loadOrder=sorted.length;\n\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const mfDeliveryOrderIds=[];   // delivery orders on this manifest (not return pick-ups)\n    await Promise.all(sorted.map(async(job,i)=>{\n      const loadSeq=loadOrder-i;\n      await client.from('manifest_items').insert({\n        manifest_id:manifest.id,logistics_job_id:job.id,\n        order_id:null,load_order:loadSeq,delivery_status:'pending'\n      });\n      await db().update('logistics_jobs',job.id,{manifest_id:manifest.id,status:'assigned_truck'});\n      const {data:fullJob}=await db().select('logistics_jobs',{eq:{id:job.id},maybeSingle:true,noCompanyFilter:true});\n      if(fullJob?.is_return_pickup){\n        // A return pick-up: the order stays \"Return requested\" until the\n        // driver collects it (no dispatch, no receivable).\n        if(fullJob.order_id) await logActivity(fullJob.order_id,'','','return_pickup_planned',`Van pick-up on manifest ${manifestNumber}`);\n        return;\n      }\n      if(fullJob?.order_id){\n        mfDeliveryOrderIds.push(fullJob.order_id);\n        const { data: ord } = await db().select('orders',{select:'status',eq:{id:fullJob.order_id},maybeSingle:true,noCompanyFilter:true});\n        await db().update('orders',fullJob.order_id,{status:'dispatched',dispatched_at:new Date().toISOString()});\n        await logActivity(fullJob.order_id, ord?.status||'packed', 'dispatched', 'dispatched', `Manifest: ${manifestNumber}`);\n      }\n\n      // Provisional receivable - raised the moment this wholesale order\n      // goes out on the manifest, not once it's confirmed delivered.\n      // updateDelivery() flips it from 'provisional' to 'unpaid' (due)\n      // when this specific stop is later marked delivered/collected.\n      if(job.orders?.order_type==='wholesale' && job.orders?.customer_id && job.order_id){\n        const {data:existingAR}=await db().select('accounts_receivable',{\n          eq:{order_id:job.order_id},maybeSingle:true,noCompanyFilter:true\n        });\n        if(!existingAR){\n          await db().insert('accounts_receivable',{\n            order_id:job.order_id,\n            manifest_id:manifest.id,\n            customer_id:job.orders.customer_id,\n            amount:job.orders.total_value||0,\n            paid_amount:0,\n            status:'provisional',\n            invoice_ref:job.orders.order_number\n          });\n        }\n      }\n    }));\n\n    ui().closeModal();\n    ui().toast(`Manifest ${manifestNumber} created with ${selected.length} stops`,'success');\n    window.SM.SHOPIFY?.sync('fulfil',mfDeliveryOrderIds);   // website orders: Fulfilled in Shopify (own van, no tracking)\n\n    if(driverId){\n      const {data:manifestOrders}=await client.from('manifest_items')\n        .select('logistics_jobs(order_id,is_return_pickup)')\n        .eq('manifest_id',manifest.id);\n      const orderIds=(manifestOrders||[]).filter(mi=>!mi.logistics_jobs?.is_return_pickup).map(mi=>mi.logistics_jobs?.order_id).filter(Boolean);   // no COD on return pick-ups\n      const cod=await _chargeCodToDriver(client,driverId,orderIds);\n      if(cod.total>0){\n        ui().toast(`COD debit of ${util().formatCurrency(cod.total)} applied to ${cod.driverName}'s account`,'info',4000);\n      }\n    }\n\n    setTimeout(()=>{\n      ui().confirm(`Print loading sheet and manifest for ${manifestNumber}?`,()=>printManifest(manifest.id),'Print manifest');\n    },500);\n\n    const logTabs=document.getElementById('ims-log-tabs');\n    logTabs?.querySelectorAll('.ims__tab').forEach(t=>t.classList.remove('ims__tab--active'));\n    logTabs?.querySelector('[data-tab=\"manifests\"]')?.classList.add('ims__tab--active');\n    loadManifests();\n  }\n\n  // \u2500\u2500\u2500 SHIPMENTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function loadShipments(){\n    const content=document.getElementById('ims-log-content');\n    if(!content)return;\n    const {data:shipments}=await db().select('shipments',{\n      select:'*, orders(order_number,customer_name,postcode,delivered_at,status), couriers(name,tracking_url_base,requires_postcode,postcode_param,tracking_form_only)',\n      eq:{is_return_collection:false},   // delivery analytics: return collections are shown on the order instead\n      order:{col:'created_at',asc:false},limit:1000\n    });\n    window._shipmentsAll=shipments||[];\n    content.innerHTML = buildShipmentsFilterBar(window._shipmentsAll)+\n      '<div id=\"ims-shipments-stats-wrap\">'+buildShipmentsStats(window._shipmentsAll)+'</div>'+\n      '<div id=\"ims-shipments-table-wrap\">'+buildShipmentsTable(window._shipmentsAll)+'</div>';\n  }\n\n  // Computes calendar days between dispatch and actual delivery for a\n  // single shipment. Returns null when not yet delivered or when either\n  // date is missing \u2014 callers must handle null (shown as '\u2014').\n  function _shipDaysToDeliver(s){\n    // Classify by orders.status, not shipments.status \u2014 shipments.status\n    // is constrained (see shipments_status_check) to a coarser set with\n    // no distinct 'lost' state, so orders.status is authoritative here.\n    if(s.orders?.status!=='delivered'||!s.dispatched_at||!s.orders?.delivered_at) return null;\n    const days=Math.round((new Date(s.orders.delivered_at)-new Date(s.dispatched_at))/(1000*60*60*24));\n    return Math.max(0,days);\n  }\n\n  function buildShipmentsFilterBar(items){\n    const couriers=[...new Set(items.map(s=>s.couriers?.name).filter(Boolean))].sort();\n    const statuses=[...new Set(items.map(s=>s.orders?.status).filter(Boolean))].sort();\n    return `\n      <div class=\"ims__filters\" style=\"margin-bottom:14px\">\n        <select class=\"ims__select\" id=\"ims-ship-filter-status\">\n          <option value=\"\">All statuses</option>\n          ${statuses.map(s=>`<option value=\"${s}\">${util().sanitize(s.replace(/_/g,' '))}</option>`).join('')}\n        </select>\n        <select class=\"ims__select\" id=\"ims-ship-filter-courier\">\n          <option value=\"\">All couriers</option>\n          ${couriers.map(c=>`<option value=\"${util().sanitize(c)}\">${util().sanitize(c)}</option>`).join('')}\n        </select>\n        <input class=\"ims__input\" type=\"date\" id=\"ims-ship-filter-from\" title=\"Dispatched from\">\n        <input class=\"ims__input\" type=\"date\" id=\"ims-ship-filter-to\" title=\"Dispatched to\">\n        <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.filterShipments()\"><i class=\"ti ti-filter\"></i> Apply</button>\n        <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"document.getElementById('ims-ship-filter-status').value='';document.getElementById('ims-ship-filter-courier').value='';document.getElementById('ims-ship-filter-from').value='';document.getElementById('ims-ship-filter-to').value='';window.IMS_LOGISTICS.filterShipments()\">Clear</button>\n      </div>`;\n  }\n\n  function buildShipmentsStats(items){\n    const delivered=items.filter(s=>s.orders?.status==='delivered'&&_shipDaysToDeliver(s)!==null);\n    const overallAvg=delivered.length\n      ? (delivered.reduce((sum,s)=>sum+_shipDaysToDeliver(s),0)/delivered.length).toFixed(1)\n      : '\u2014';\n\n    const byCourier={};\n    items.forEach(s=>{\n      const name=s.couriers?.name||'Unassigned';\n      if(!byCourier[name]) byCourier[name]={total:0,delivered:0,failed:0,lost:0,dispatched:0,daysSum:0,daysCount:0};\n      const c=byCourier[name];\n      c.total++;\n      const orderStatus=s.orders?.status;\n      if(orderStatus==='delivered') c.delivered++;\n      else if(orderStatus==='failed_delivery') c.failed++;\n      else if(orderStatus==='lost') c.lost++;\n      else c.dispatched++;\n      const days=_shipDaysToDeliver(s);\n      if(days!==null){ c.daysSum+=days; c.daysCount++; }\n    });\n\n    const courierRows=Object.entries(byCourier)\n      .sort((a,b)=>b[1].total-a[1].total)\n      .map(([name,c])=>`\n        <tr>\n          <td>${util().sanitize(name)}</td>\n          <td style=\"text-align:center\">${c.total}</td>\n          <td style=\"text-align:center;color:var(--ims-success)\">${c.delivered}</td>\n          <td style=\"text-align:center;color:var(--ims-warning)\">${c.failed}</td>\n          <td style=\"text-align:center;color:var(--ims-danger)\">${c.lost}</td>\n          <td style=\"text-align:center;font-weight:600\">${c.daysCount?(c.daysSum/c.daysCount).toFixed(1)+'d':'\u2014'}</td>\n        </tr>`).join('');\n\n    return `\n      <div style=\"display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:14px\">\n        <div class=\"ims__stat\" style=\"padding:12px\">\n          <div class=\"ims__stat-label\">Total shipments (filtered view)</div>\n          <div class=\"ims__stat-value\" style=\"font-size:22px\">${items.length}</div>\n        </div>\n        <div class=\"ims__stat\" style=\"padding:12px\">\n          <div class=\"ims__stat-label\">Delivered</div>\n          <div class=\"ims__stat-value ims__stat-value--success\" style=\"font-size:22px\">${delivered.length}</div>\n        </div>\n        <div class=\"ims__stat\" style=\"padding:12px\">\n          <div class=\"ims__stat-label\">Avg days to deliver</div>\n          <div class=\"ims__stat-value\" style=\"font-size:22px\">${overallAvg}${overallAvg!=='\u2014'?'d':''}</div>\n        </div>\n      </div>\n      <div class=\"ims__card\" style=\"margin-bottom:14px\">\n        <div style=\"padding:12px 14px;font-weight:600;font-size:13px;border-bottom:1px solid var(--ims-border)\"><i class=\"ti ti-chart-bar\" style=\"color:var(--ims-accent)\"></i> Courier performance</div>\n        <div class=\"ims__table-wrap\">\n          <table class=\"ims__table\">\n            <thead><tr><th>Courier</th><th style=\"text-align:center\">Total</th><th style=\"text-align:center\">Delivered</th><th style=\"text-align:center\">Failed</th><th style=\"text-align:center\">Lost</th><th style=\"text-align:center\">Avg days to deliver</th></tr></thead>\n            <tbody>${courierRows||'<tr><td colspan=\"6\" class=\"ims__table-empty\">No data</td></tr>'}</tbody>\n          </table>\n        </div>\n      </div>`;\n  }\n\n  function buildShipmentsTable(items){\n    return `\n      <div class=\"ims__card\">\n        <div class=\"ims__table-wrap\">\n          <table class=\"ims__table\">\n            <thead><tr><th>Order #</th><th>Customer</th><th>Mode</th><th>Courier</th><th>Tracking #</th><th>Charge</th><th>Status</th><th>Dispatched</th><th>Days to deliver</th></tr></thead>\n            <tbody>${items.map(s=>{\n              const trackUrl=util().buildTrackingUrl(s.couriers,s.tracking_number,s.orders?.postcode);\n              const days=_shipDaysToDeliver(s);\n              return `<tr>\n                <td>${s.orders?.order_number\n                  ? `<span class=\"ims__link\" onclick=\"window.IMS_ORDERS?.openOrder('${util().jsArg(s.order_id)}')\">${util().sanitize(s.orders.order_number)}</span>`\n                  : '\u2014'}</td>\n                <td>${util().sanitize(s.orders?.customer_name||'\u2014')}</td>\n                <td><span class=\"ims__pill ims__pill--${s.ship_mode==='courier'?'info':'neutral'}\">${s.ship_mode==='courier'?'Courier':'Own truck'}</span></td>\n                <td>${util().sanitize(s.couriers?.name||'\u2014')}</td>\n                <td>${trackUrl?`<a href=\"${trackUrl}\" target=\"_blank\" class=\"ims__link\">${util().sanitize(s.tracking_number||'\u2014')}</a>`:util().sanitize(s.tracking_number||'\u2014')}</td>\n                <td>${s.charge_amount?util().formatCurrency(s.charge_amount):'\u2014'}</td>\n                <td>${util().pill(s.orders?.status||s.status)}</td>\n                <td>${s.dispatched_at?util().formatDate(s.dispatched_at):'\u2014'}</td>\n                <td style=\"text-align:center\">${days!==null?days+'d':'\u2014'}</td>\n              </tr>`;\n            }).join('')||'<tr><td colspan=\"9\" class=\"ims__table-empty\">No shipments match this filter</td></tr>'}\n            </tbody>\n          </table>\n        </div>\n      </div>`;\n  }\n\n  function filterShipments(){\n    const status  = document.getElementById('ims-ship-filter-status')?.value||'';\n    const courier = document.getElementById('ims-ship-filter-courier')?.value||'';\n    const from    = document.getElementById('ims-ship-filter-from')?.value||'';\n    const to      = document.getElementById('ims-ship-filter-to')?.value||'';\n\n    let filtered = window._shipmentsAll||[];\n    if(status)  filtered = filtered.filter(s=>s.orders?.status===status);\n    if(courier) filtered = filtered.filter(s=>s.couriers?.name===courier);\n    if(from)    filtered = filtered.filter(s=>s.dispatched_at && s.dispatched_at.split('T')[0]>=from);\n    if(to)      filtered = filtered.filter(s=>s.dispatched_at && s.dispatched_at.split('T')[0]<=to);\n\n    const statsWrap = document.getElementById('ims-shipments-stats-wrap');\n    if(statsWrap) statsWrap.innerHTML = buildShipmentsStats(filtered);\n    const tableWrap = document.getElementById('ims-shipments-table-wrap');\n    if(tableWrap) tableWrap.innerHTML = buildShipmentsTable(filtered);\n  }\n\n  // \u2500\u2500\u2500 MANIFESTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // The list is loaded once, then filtered on screen as you type, the same\n  // way the Tracking search works. Each manifest is read with the order\n  // numbers and customers on it, so a search for an order finds the van run\n  // it went on. What is typed is kept in _mfSearch, so a refresh (after an\n  // action, or a live update) keeps the search instead of emptying it.\n  let _mfSearch='';\n  let _mfItems=[];\n  // Which tab to open when Logistics is opened from elsewhere (the top\n  // search bar, or the Courier setup button). Empty means Tracking, as before.\n  let _goTo=null;\n\n  async function loadManifests(){\n    const content=document.getElementById('ims-log-content');\n    if(!content)return;\n    const {data:manifests}=await db().select('manifests',{\n      select:'*, drivers(name,phone), vehicles(registration,make_model), routes(name), manifest_items(logistics_jobs(orders(order_number,external_ref,customer_name,end_customer_name)))',\n      order:{col:'created_at',asc:false}\n    });\n    _mfItems=manifests||[];\n    content.innerHTML=`\n      <div class=\"ims__filters\" style=\"margin-bottom:14px\">\n        <div class=\"ims__search-wrap\" style=\"max-width:320px\">\n          <i class=\"ti ti-search\"></i>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-mf-search\" placeholder=\"Manifest #, order, customer, driver, van...\" autocomplete=\"off\" value=\"${util().sanitize(_mfSearch)}\" oninput=\"window.IMS_LOGISTICS.filterManifests(this.value)\">\n        </div>\n        <span id=\"ims-mf-count\" style=\"font-size:12px;color:var(--ims-text-muted);align-self:center\"></span>\n      </div>\n      <div class=\"ims__card\">\n        <div class=\"ims__table-wrap\">\n          <table class=\"ims__table\">\n            <thead><tr><th>Manifest #</th><th>Driver</th><th>Vehicle</th><th>Route</th><th>Status</th><th>Dispatched</th><th>Van</th><th>Actions</th></tr></thead>\n            <tbody id=\"ims-mf-body\"></tbody>\n          </table>\n        </div>\n      </div>`;\n    filterManifests(_mfSearch);\n  }\n\n  // The orders on a manifest (deliveries and return pick-ups).\n  function _mfOrders(m){\n    return (m.manifest_items||[]).map(i=>i.logistics_jobs?.orders).filter(Boolean);\n  }\n\n  // Lower case, and the same text with spaces taken out, so \"AB21XYZ\"\n  // finds the van \"AB21 XYZ\".\n  function _mfTextMatch(value, term){\n    const v=String(value||'').toLowerCase();\n    if(!v) return false;\n    const t=term.toLowerCase().replace(/^#/,'');\n    if(!t) return false;\n    return v.includes(t) || v.replace(/\\s+/g,'').includes(t.replace(/\\s+/g,''));\n  }\n\n  // A manifest number typed any way: \"MF-00082\", \"mf82\", \"MF 82\" or \"82\".\n  function _mfNumberMatch(manifestNumber, term){\n    const typed=term.trim().toLowerCase().match(/^(?:mf)?[\\s-]*0*(\\d+)$/);\n    if(!typed) return false;\n    const own=String(manifestNumber||'').match(/(\\d+)\\s*$/);\n    return !!own && Number(own[1])===Number(typed[1]);\n  }\n\n  // The first order on this manifest that matches the search, if any:\n  // shown under the manifest number so you can see why it was found.\n  function _mfMatchedOrder(m, term){\n    return _mfOrders(m).find(o=>_mfTextMatch(o.order_number,term)||_mfTextMatch(o.external_ref,term)||_mfTextMatch(o.customer_name,term)||_mfTextMatch(o.end_customer_name,term))||null;\n  }\n\n  function _mfMatches(m, term){\n    if(_mfNumberMatch(m.manifest_number,term)) return true;\n    if([m.manifest_number,m.drivers?.name,m.vehicles?.registration,m.vehicles?.make_model,m.routes?.name].some(v=>_mfTextMatch(v,term))) return true;\n    return !!_mfMatchedOrder(m,term);\n  }\n\n  function filterManifests(value){\n    if(value!==undefined&&value!==null) _mfSearch=String(value);\n    const body=document.getElementById('ims-mf-body');\n    if(!body) return;\n    const term=_mfSearch.trim();\n    // The manifest whose number was typed comes first (\"82\" also finds\n    // MF-00182 and MF-00820); the rest stay newest first.\n    const list=term\n      ? _mfItems.filter(m=>_mfMatches(m,term)).sort((a,b)=>(_mfNumberMatch(b.manifest_number,term)?1:0)-(_mfNumberMatch(a.manifest_number,term)?1:0))\n      : _mfItems;\n    const isAdmin=window.SM.AUTH.isAdmin();\n    body.innerHTML=list.map(m=>{\n      const hit=term&&!_mfNumberMatch(m.manifest_number,term)&&!_mfTextMatch(m.manifest_number,term)?_mfMatchedOrder(m,term):null;\n      const hitName=hit?(hit.customer_name||hit.end_customer_name||''):'';\n      return `<tr>\n              <td><span class=\"ims__link\" onclick=\"window.IMS_LOGISTICS.openManifest('${util().jsArg(m.id)}')\">${util().sanitize(m.manifest_number)}</span>${hit?`<div style=\"font-size:11px;color:var(--ims-text-muted);margin-top:2px\">${util().sanitize(hit.order_number||'')}${hitName?` &middot; ${util().sanitize(hitName)}`:''}</div>`:''}</td>\n              <td>${util().sanitize(m.drivers?.name||'\u2014')}</td>\n              <td>${util().sanitize(m.vehicles?.registration||'\u2014')}</td>\n              <td>${util().sanitize(m.routes?.name||'\u2014')}</td>\n              <td>${util().pill(m.status)}</td>\n              <td>${m.dispatched_at?util().formatDate(m.dispatched_at):'-'}</td>\n              <td>${m.departed_at\n                ? `<span class=\"ims__pill ims__pill--neutral\" title=\"Its orders can no longer be amended\">Departed ${util().formatDate(m.departed_at)}</span>`\n                : `<button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.markVanDeparted('${util().jsArg(m.id)}','${util().jsArg(m.manifest_number)}')\" title=\"Press when the van leaves: the manifest and its orders are then locked\"><i class=\"ti ti-truck-delivery\"></i> Van departed</button>`}</td>\n              <td><div class=\"ims__btn-group\">\n                <button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openManifest('${util().jsArg(m.id)}')\" title=\"View\"><i class=\"ti ti-eye\"></i></button>\n                ${m.departed_at?'':`<button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.openEditManifest('${util().jsArg(m.id)}')\" title=\"Edit\"><i class=\"ti ti-pencil\"></i></button>`}\n                <button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.printManifest('${util().jsArg(m.id)}')\" title=\"Print\"><i class=\"ti ti-printer\"></i></button>\n                ${isAdmin?`<button class=\"ims__btn ims__btn--danger ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.deleteManifest('${util().jsArg(m.id)}','${util().jsArg(m.manifest_number)}')\" title=\"Delete manifest\"><i class=\"ti ti-trash\"></i></button>`:''}\n              </div></td>\n            </tr>`;\n    }).join('')||`<tr><td colspan=\"8\" class=\"ims__table-empty\">${term?'No manifests match your search':'No manifests yet'}</td></tr>`;\n    const count=document.getElementById('ims-mf-count');\n    if(count) count.textContent=term?`Showing ${list.length} of ${_mfItems.length}`:'';\n  }\n\n  // Opened from the search bar at the top of the screen: go to Logistics,\n  // straight to the Manifests tab, and open this manifest. The tab to show\n  // is handed to the 'ims:panel' handler below (showPanel announces the\n  // screen straight away), so the Tracking tab is never loaded in between\n  // and can never finish late and draw over the manifest list.\n  function goToManifest(id){\n    _mfSearch='';\n    _goTo={tab:'manifests',manifestId:id};\n    window.SM.UI.showPanel('logistics');\n    _goTo=null;\n  }\n\n  // \"Van departed\": pressed when the van leaves. Until then the manifest\n  // and every order on it can still be changed (Amend order in Orders);\n  // after it, both are locked. Also set automatically when the first stop\n  // outcome is recorded (see checkManifestCompletion).\n  async function markVanDeparted(manifestId, manifestNumber){\n    ui().confirm(`Mark the van for <strong>${util().sanitize(manifestNumber)}</strong> as departed? The manifest and its orders can then no longer be changed.`, async ()=>{\n      const {data:mf}=await db().select('manifests',{select:'departed_at',eq:{id:manifestId},maybeSingle:true,noCompanyFilter:true});\n      if(mf?.departed_at){ ui().toast(`${manifestNumber} was already marked as departed`,'info'); loadManifests(); return; }\n      const {error}=await db().update('manifests',manifestId,{departed_at:new Date().toISOString(),departed_by:window.SM.AUTH.user?.id||null});\n      if(error){ ui().toast('Failed: '+error.message,'error'); return; }\n      ui().toast(`${manifestNumber}: van departed. The manifest and its orders are now locked.`,'success');\n      loadManifests();\n    }, 'Van departed', false);\n  }\n\n  async function _manifestDeparted(manifestId){\n    const {data:mf}=await db().select('manifests',{select:'departed_at,manifest_number',eq:{id:manifestId},maybeSingle:true,noCompanyFilter:true});\n    if(mf?.departed_at){ ui().toast(`${mf.manifest_number||'This manifest'}: the van has departed, so it can no longer be changed.`,'warning',7000); return true; }\n    return false;\n  }\n\n  async function openEditManifest(manifestId){\n    if(await _manifestDeparted(manifestId)) return;\n    const { data: manifest } = await db().select('manifests', {\n      select: '*', eq: { id: manifestId }, maybeSingle: true,\n    });\n    if(!manifest){ ui().toast('Manifest not found', 'error'); return; }\n\n    const { data: items } = await db().select('manifest_items', {\n      select: 'id,load_order,delivery_status,logistics_jobs(id,order_id,orders(order_number,customer_name,postcode))',\n      eq: { manifest_id: manifestId }, order: { col: 'load_order', asc: false }, noCompanyFilter: true,\n    });\n\n    const { data: drivers } = await db().select('drivers', { eq: { is_active: true } });\n    const { data: vehicles } = await db().select('vehicles', { eq: { is_active: true } });\n    const { data: routes } = await db().select('routes', { eq: { is_active: true } });\n    const driverOpts = (drivers||[]).map(d=>`<option value=\"${d.id}\" ${d.id===manifest.driver_id?'selected':''}>${util().sanitize(d.name)}</option>`).join('');\n    const vehicleOpts = (vehicles||[]).map(v=>`<option value=\"${v.id}\" ${v.id===manifest.vehicle_id?'selected':''}>${util().sanitize(v.registration)} \u2014 ${util().sanitize(v.make_model||v.vehicle_type||'')}</option>`).join('');\n    const routeOpts = (routes||[]).map(r=>`<option value=\"${r.id}\" ${r.id===manifest.route_id?'selected':''}>${util().sanitize(r.name)}</option>`).join('');\n\n    // Stops can be added only from the Own Truck Queue.\n    const { data: unassignedJobs } = await db().select('logistics_jobs', {\n      select: 'id,job_type,orders(id,order_number,customer_name,postcode)',\n      eq: { status: 'scheduled', job_type: 'own_truck' }, order: { col: 'created_at' },\n    });\n\n    const dispatchDateVal = manifest.dispatched_at ? new Date(manifest.dispatched_at).toISOString().split('T')[0] : '';\n\n    ui().openModal(`Edit manifest \u2014 ${util().sanitize(manifest.manifest_number)}`, `\n      <div class=\"ims__form-grid\" style=\"margin-bottom:14px\">\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Driver</label><select class=\"ims__select\" id=\"ims-em-driver\"><option value=\"\">Select driver</option>${driverOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Vehicle</label><select class=\"ims__select\" id=\"ims-em-vehicle\"><option value=\"\">Select vehicle</option>${vehicleOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Route</label><select class=\"ims__select\" id=\"ims-em-route\"><option value=\"\">None</option>${routeOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Dispatch date</label><input class=\"ims__input\" type=\"date\" id=\"ims-em-date\" value=\"${dispatchDateVal}\"></div>\n      </div>\n\n      <strong style=\"font-size:13px;display:block;margin-bottom:8px\">Current stops (${(items||[]).length})</strong>\n      <div style=\"max-height:200px;overflow-y:auto;margin-bottom:14px\">\n        <table class=\"ims__table\">\n          <thead><tr><th>Order #</th><th>Customer</th><th>Postcode</th><th>Status</th><th></th></tr></thead>\n          <tbody>\n            ${(items||[]).length ? (items||[]).map(mi => `\n              <tr>\n                <td>${util().sanitize(mi.logistics_jobs?.orders?.order_number||'\u2014')}</td>\n                <td>${util().sanitize(mi.logistics_jobs?.orders?.customer_name||'\u2014')}</td>\n                <td>${util().sanitize(mi.logistics_jobs?.orders?.postcode||'\u2014')}</td>\n                <td>${util().pill(mi.delivery_status)}</td>\n                <td>${mi.delivery_status==='pending' ? `<button class=\"ims__btn ims__btn--danger ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.removeManifestStop('${util().jsArg(mi.id)}','${util().jsArg(manifestId)}')\" title=\"Remove this stop\"><i class=\"ti ti-x\"></i></button>` : `<span style=\"font-size:11px;color:var(--ims-text-sec)\">Already recorded</span>`}</td>\n              </tr>\n            `).join('') : '<tr><td colspan=\"5\" style=\"text-align:center;color:var(--ims-text-sec)\">No stops</td></tr>'}\n          </tbody>\n        </table>\n      </div>\n\n      <strong style=\"font-size:13px;display:block;margin-bottom:8px\">Add a stop</strong>\n      <div style=\"max-height:180px;overflow-y:auto;margin-bottom:14px\">\n        ${(unassignedJobs||[]).length ? `\n        <table class=\"ims__table\">\n          <thead><tr><th></th><th>Order #</th><th>Customer</th><th>Postcode</th><th>Type</th></tr></thead>\n          <tbody>\n            ${(unassignedJobs||[]).map(j => `<tr>\n              <td><input type=\"checkbox\" class=\"ims-em-add-check\" value=\"${j.id}\"></td>\n              <td>${util().sanitize(j.orders?.order_number||'\u2014')}</td>\n              <td>${util().sanitize(j.orders?.customer_name||'\u2014')}</td>\n              <td>${util().sanitize(j.orders?.postcode||'\u2014')}</td>\n              <td><span class=\"ims__pill ims__pill--${j.job_type==='delivery'?'info':'neutral'}\">${j.job_type==='delivery'?'Delivery':'Collection'}</span></td>\n            </tr>`).join('')}\n          </tbody>\n        </table>` : '<div style=\"font-size:13px;color:var(--ims-text-sec)\">No orders in the Own Truck Queue to add. Use \"We deliver\" on Unassigned jobs first.</div>'}\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveManifestEdit('${util().jsArg(manifestId)}')\"><i class=\"ti ti-device-floppy\"></i> Save changes</button>\n    `, 'xl');\n  }\n\n  async function removeManifestStop(itemId, manifestId){\n    if(await _manifestDeparted(manifestId)) return;\n    const { data: item } = await db().select('manifest_items', {\n      select: 'id,logistics_job_id,delivery_status', eq: { id: itemId }, maybeSingle: true, noCompanyFilter: true,\n    });\n    if(!item){ return; }\n    if(item.delivery_status !== 'pending'){\n      ui().toast('This stop already has a recorded outcome and cannot be removed', 'error');\n      return;\n    }\n    ui().confirm('Remove this stop from the manifest? The order goes back to the Own Truck Queue and its status reverts to Packed. (To send it another way, use \"Back to Unassigned\" in the queue.)', async () => {\n      const { data: job } = await db().select('logistics_jobs', {\n        select: 'order_id,is_return_pickup', eq: { id: item.logistics_job_id }, maybeSingle: true, noCompanyFilter: true,\n      });\n      await db().remove('manifest_items', itemId);\n      await db().update('logistics_jobs', item.logistics_job_id, { manifest_id: null, status: 'scheduled', job_type: 'own_truck' });   // back to the Own Truck Queue\n      if(job?.order_id&&job.is_return_pickup){\n        await logActivity(job.order_id, '', '', 'return_pickup_unplanned', 'Van pick-up removed from the manifest (back in the queue)');\n      } else if(job?.order_id){\n        await db().update('orders', job.order_id, { status: 'packed', dispatched_at: null });\n        await logActivity(job.order_id, 'dispatched', 'packed', 'removed_from_manifest', 'Removed from manifest via edit');\n        window.SM.SHOPIFY?.sync('unfulfil',[job.order_id]);\n      }\n      ui().toast('Stop removed: the order is back in the Own Truck Queue', 'success');\n      openEditManifest(manifestId);\n    }, 'Remove stop', true);\n  }\n\n  // Charges COD orders on a manifest to its driver. Used when a manifest is\n  // created, and when orders are added to it by editing (before Oct 2026,\n  // orders added by editing were never charged, so the driver's COD balance\n  // came up short). Charges the driver unless the order's COD is still\n  // outstanding: a failed delivery (or bank transfer / not collected)\n  // reverses the charge, so the order is charged again when it goes out\n  // once more. Returns the total charged and the driver's name.\n  async function _chargeCodToDriver(client,driverId,orderIds){\n    const res={total:0,driverName:'driver'};\n    if(!driverId||!orderIds.length) return res;\n    const {data:codOrders}=await client.from('orders')\n      .select('id,order_number,customer_name,total_value,payment_status')\n      .in('id',orderIds)\n      .eq('payment_status','cod');\n    if(!(codOrders||[]).length) return res;\n    const {data:driverData}=await client.from('drivers').select('name').eq('id',driverId).maybeSingle();\n    res.driverName=driverData?.name||'driver';\n    for(const order of(codOrders||[])){\n      const {data:codRows}=await client.from('cod_transactions')\n        .select('type,amount').eq('order_id',order.id);\n      const outstanding=(codRows||[]).reduce((t,x)=>t+(x.type==='debit'?(Number(x.amount)||0):x.type==='reversal'?-(Number(x.amount)||0):0),0);\n      if(!(outstanding>0.005)){\n        await client.from('cod_transactions').insert({\n          company_id:window.SM.AUTH.company?.id,\n          driver_id:driverId,order_id:order.id,type:'debit',\n          amount:order.total_value||0,\n          notes:`COD order ${order.order_number} \u2014 ${order.customer_name||''}`,\n          created_by:window.SM.AUTH.user?.id\n        });\n        const {data:acc}=await client.from('driver_cod_accounts').select('id,balance').eq('driver_id',driverId).maybeSingle();\n        if(acc){\n          await client.from('driver_cod_accounts').update({balance:(acc.balance||0)+(order.total_value||0)}).eq('id',acc.id);\n        } else {\n          await client.from('driver_cod_accounts').insert({\n            company_id:window.SM.AUTH.company?.id,driver_id:driverId,balance:order.total_value||0\n          });\n        }\n        res.total+=order.total_value||0;\n      }\n    }\n    return res;\n  }\n\n  async function saveManifestEdit(manifestId){\n    if(await _manifestDeparted(manifestId)) return;\n    const g = id => document.getElementById(id)?.value?.trim() || null;\n    const driverId = g('ims-em-driver');\n    const vehicleId = g('ims-em-vehicle');\n    const routeId = g('ims-em-route');\n    const dispatchDate = g('ims-em-date');\n\n    const { error } = await db().update('manifests', manifestId, {\n      driver_id: driverId, vehicle_id: vehicleId, route_id: routeId,\n      dispatched_at: dispatchDate ? new Date(dispatchDate).toISOString() : null,\n    });\n    if(error){ ui().toast('Failed to save: ' + error.message, 'error'); return; }\n\n    const toAdd = [...document.querySelectorAll('.ims-em-add-check:checked')].map(cb => cb.value);\n    const notAdded = [];\n    const addedOrderIds = [];   // delivery orders added (not return pick-ups): COD is charged on these\n    let codCharge = { total: 0, driverName: 'driver' };\n    if(toAdd.length){\n      const { data: existingItems } = await db().select('manifest_items', {\n        select: 'load_order', eq: { manifest_id: manifestId }, order: { col: 'load_order', asc: false }, limit: 1, noCompanyFilter: true,\n      });\n      let nextLoadOrder = (existingItems?.[0]?.load_order || 0) + 1;\n\n      const { data: jobs } = await db().select('logistics_jobs', {\n        select: 'id,order_id,is_return_pickup,orders(order_type,customer_id,total_value,order_number,status)',\n        in: { id: toAdd }, eq: { status: 'scheduled', job_type: 'own_truck' }, noCompanyFilter: true,   // queue orders only\n      });\n\n      // The stop is written with the plain client, as createManifest does:\n      // manifest_items has no company_id column, and db().insert adds one to\n      // every row, so the database refused every stop added here and the\n      // refusal was never checked. The order was still marked dispatched and\n      // left the queue, while not being on the manifest (found Oct 2026).\n      // Now, if a stop cannot be saved, nothing else happens to that order:\n      // it stays in the Own Truck Queue and is named in the message.\n      const miClient = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n      for(const job of (jobs || [])){\n        const { error: miErr } = await miClient.from('manifest_items').insert({\n          manifest_id: manifestId, logistics_job_id: job.id,\n          order_id: null, load_order: nextLoadOrder, delivery_status: 'pending',\n        });\n        if(miErr){\n          console.warn('[saveManifestEdit] stop not added:', miErr.message);\n          notAdded.push(job.orders?.order_number || 'one order');\n          continue;\n        }\n        nextLoadOrder++;\n        await db().update('logistics_jobs', job.id, { manifest_id: manifestId, status: 'assigned_truck' });\n        if(job.is_return_pickup){ if(job.order_id) await logActivity(job.order_id, '', '', 'return_pickup_planned', 'Van pick-up added to a manifest'); continue; }\n        if(job.order_id){\n          await db().update('orders', job.order_id, { status: 'dispatched', dispatched_at: new Date().toISOString() });\n          await logActivity(job.order_id, job.orders?.status || 'packed', 'dispatched', 'dispatched', 'Added to manifest via edit');\n          addedOrderIds.push(job.order_id);\n        }\n        if(job.orders?.order_type === 'wholesale' && job.orders?.customer_id && job.order_id){\n          const { data: existingAR } = await db().select('accounts_receivable', {\n            eq: { order_id: job.order_id }, maybeSingle: true, noCompanyFilter: true,\n          });\n          if(!existingAR){\n            await db().insert('accounts_receivable', {\n              order_id: job.order_id, manifest_id: manifestId, customer_id: job.orders.customer_id,\n              amount: job.orders.total_value || 0, paid_amount: 0, status: 'provisional', invoice_ref: job.orders.order_number,\n            });\n          }\n        }\n      }\n      // COD orders added here are charged to the manifest's driver, as when\n      // the manifest is created.\n      if(driverId && addedOrderIds.length) codCharge = await _chargeCodToDriver(miClient, driverId, addedOrderIds);\n      window.SM.SHOPIFY?.sync('fulfil', addedOrderIds);\n    }\n\n    if(codCharge.total > 0){\n      ui().toast(`COD debit of ${util().formatCurrency(codCharge.total)} applied to ${codCharge.driverName}'s account`, 'info', 5000);\n    }\n    if(notAdded.length){\n      ui().toast(`Manifest updated, but ${notAdded.join(', ')} could not be added. ${notAdded.length === 1 ? 'It stays' : 'They stay'} in the Own Truck Queue: try again.`, 'warning', 12000);\n    } else {\n      ui().toast('Manifest updated', 'success');\n    }\n    ui().closeModal();\n    loadManifests();\n  }\n\n  async function openManifest(id){\n    _openManifestId=id;\n    const {data:m}=await db().select('manifests',{\n      select:'*, drivers(name,phone), vehicles(registration,make_model), routes(name), manifest_items(id,load_order,delivery_status,delivered_at,recipient_name,failure_reason,pod_photo_path,pod_signature_path,pod_at,pod_removed_at,cod_method,cod_amount,recorded_via,recorded_at,gps_lat,gps_lng,gps_accuracy_m,gps_at,logistics_jobs(order_id,job_type,is_return_pickup,orders(order_number,customer_name,address,postcode,amended_at,order_items(id,product_name,quantity,service_id,service_status))))',\n      eq:{id},maybeSingle:true,noCompanyFilter:true\n    });\n    if(!m)return;\n    const items=(m.manifest_items||[]).sort((a,b)=>a.load_order-b.load_order);\n    // Who created the manifest and who marked the van as departed.\n    const whoIds=[m.created_by,m.departed_by].filter(Boolean);\n    const whoMap={};\n    if(whoIds.length){\n      const {data:us}=await db().select('users',{select:'id,name',in:{id:whoIds},noCompanyFilter:true});\n      (us||[]).forEach(u=>{ whoMap[u.id]=u.name; });\n    }\n    ui().openModal(`Manifest: ${m.manifest_number}`,`\n      <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px\">\n        <div><span class=\"ims__label\">Driver</span><div>${util().sanitize(m.drivers?.name||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Phone</span><div>${util().sanitize(m.drivers?.phone||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Vehicle</span><div>${util().sanitize(m.vehicles?.registration||'\u2014')} ${m.vehicles?.make_model?'\u2014 '+m.vehicles.make_model:''}</div></div>\n        <div><span class=\"ims__label\">Route</span><div>${util().sanitize(m.routes?.name||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Dispatched</span><div>${m.dispatched_at?util().formatDateTime(m.dispatched_at):'\u2014'}</div></div>\n        <div><span class=\"ims__label\">Status</span><div>${util().pill(m.status)}</div></div>\n        <div><span class=\"ims__label\">Created by</span><div>${util().sanitize(whoMap[m.created_by]||'-')}<div style=\"font-size:11px;color:var(--ims-text-muted)\">${m.created_at?util().formatDateTime(m.created_at):''}</div></div></div>\n        <div><span class=\"ims__label\">Van departed</span><div>${m.departed_at?`${util().sanitize(whoMap[m.departed_by]||'-')}<div style=\"font-size:11px;color:var(--ims-text-muted)\">${util().formatDateTime(m.departed_at)}</div>`:'Not yet'}</div></div>\n      </div>\n      <hr class=\"ims__divider\">\n      <strong style=\"font-size:13px\">Delivery stops \u2014 Loading order (${items.length} stops)</strong>\n      <div class=\"ims__table-wrap\" style=\"margin-top:8px\">\n        <table class=\"ims__table\">\n          <thead><tr><th>Load #</th><th>Order #</th><th>Customer</th><th>Address</th><th>Postcode</th><th>Type</th><th>Status</th><th>Update</th></tr></thead>\n          <tbody>${items.map(item=>`<tr>\n            <td style=\"font-weight:700\">${item.load_order}</td>\n            <td><span class=\"ims__link\" onclick=\"window.IMS_ORDERS?.openOrder('${util().jsArg(item.logistics_jobs?.order_id||'')}')\">${util().sanitize(item.logistics_jobs?.orders?.order_number||'-')}</span>${item.logistics_jobs?.orders?.amended_at?' <span class=\"ims__pill ims__pill--warning\" style=\"font-size:10px\">Amended</span>':''}</td>\n            <td>${util().sanitize(item.logistics_jobs?.orders?.customer_name||'\u2014')}</td>\n            <td style=\"font-size:12px\">${util().sanitize(item.logistics_jobs?.orders?.address||'\u2014')}</td>\n            <td>${util().sanitize(item.logistics_jobs?.orders?.postcode||'\u2014')}</td>\n            <td>${item.logistics_jobs?.is_return_pickup?'<span class=\"ims__pill ims__pill--warning\">Return pick-up</span>':`<span class=\"ims__pill ims__pill--${item.logistics_jobs?.job_type==='delivery'?'info':'neutral'}\">${item.logistics_jobs?.job_type||'\u2014'}</span>`}</td>\n            <td>${util().pill(item.delivery_status)}</td>\n            <td>${['delivered','failed','partial','collected'].includes(item.delivery_status)\n              ? `<span style=\"font-size:11px;color:var(--ims-text-muted)\"><i class=\"ti ti-lock\" style=\"font-size:11px\"></i> Recorded</span>`\n              : `<select class=\"ims__select\" style=\"font-size:11px;padding:3px 6px\" onchange=\"window.IMS_LOGISTICS.updateDelivery('${util().jsArg(item.id)}','${util().jsArg(item.logistics_jobs?.order_id||'')}',this.value)\">\n              <option value=\"\">Update...</option>\n              ${item.logistics_jobs?.is_return_pickup\n                ? `<option value=\"collected\">Collected</option><option value=\"failed\">Not collected</option>`\n                : `<option value=\"out_for_delivery\">Out for delivery</option>\n              <option value=\"delivered\">Delivered</option>\n              <option value=\"failed\">Failed</option>\n              <option value=\"partial\">Partial</option>\n              <option value=\"collected\">Collected</option>`}\n            </select>`}</td>\n          </tr>${(()=>{ const tasks=(item.logistics_jobs?.orders?.order_items||[]).filter(t=>t.service_id); if(!tasks.length) return '';\n            return `<tr><td></td><td colspan=\"7\" style=\"padding-top:0;border-top:none\"><div style=\"display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:12px\"><strong>Tasks:</strong>${tasks.map(t=>`<span style=\"display:inline-flex;gap:4px;align-items:center;padding:2px 6px;border:1px solid var(--ims-border);border-radius:var(--ims-radius)\">${util().sanitize(t.product_name)}${t.quantity>1?` x${t.quantity}`:''}\n              ${t.service_status==='done'?'<span class=\"ims__pill ims__pill--success\" style=\"font-size:10px\">Done</span>':t.service_status==='not_done'?'<span class=\"ims__pill ims__pill--danger\" style=\"font-size:10px\">Not done</span>':\n              `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" style=\"padding:1px 6px\" onclick=\"window.IMS_LOGISTICS.setServiceStatus('${util().jsArg(t.id)}','done','${util().jsArg(item.logistics_jobs?.order_id||'')}','${util().jsArg(t.product_name)}','${util().jsArg(m.id)}')\">Done</button><button class=\"ims__btn ims__btn--ghost ims__btn--sm\" style=\"padding:1px 6px;color:var(--ims-danger)\" onclick=\"window.IMS_LOGISTICS.setServiceStatus('${util().jsArg(t.id)}','not_done','${util().jsArg(item.logistics_jobs?.order_id||'')}','${util().jsArg(t.product_name)}','${util().jsArg(m.id)}')\">Not done</button>`}</span>`).join('')}</div></td></tr>`; })()}${_podRow(item)}`).join('')||'<tr><td colspan=\"8\" class=\"ims__table-empty\">No items</td></tr>'}\n          </tbody>\n        </table>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_LOGISTICS.printManifest('${util().jsArg(m.id)}')\"><i class=\"ti ti-printer\"></i> Print</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal()\">Close</button>\n    `,'xl');\n    _fillPodImages(document.getElementById('ims-modal-body'));\n    _fillGpsDistances(document.getElementById('ims-modal-body'));\n  }\n\n  // \u2500\u2500\u2500 COURIER COLLECTION OF RETURNS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // A collection shipment for a requested return: courier, date, the\n  // courier's references, and the charge (from the courier's rate card\n  // where it has one, editable), recorded as a courier expense like a\n  // delivery. Statuses: booked = pending, collected = in_transit, back at\n  // the warehouse = returned. The order: Return requested -> (collected)\n  // Return in transit -> Return received, as for any return. Delivery\n  // screens (Tracking, claims, Mark delivered...) never see collections.\n  async function _openCollection(orderId){\n    const {data}=await _rcDb().from('shipments').select('id,courier_id,tracking_number,courier_order_ref,collection_date,charge_amount,status,couriers(name,cs_email,tracking_url_base,requires_postcode,postcode_param,tracking_form_only)')\n      .eq('order_id',orderId).eq('is_return_collection',true).neq('status','returned').order('created_at',{ascending:false}).limit(1).maybeSingle();\n    return data||null;\n  }\n  async function bookCourierCollection(orderId,orderNumber,existingId){\n    const c=_rcDb();\n    const {data:o}=await c.from('orders').select('id,order_number,status,customer_name,end_customer_name,address,end_address,postcode,end_postcode,phone,end_customer_phone').eq('id',orderId).maybeSingle();\n    if(!o){ ui().toast('Order not found','error'); return; }\n    let cur=null;\n    if(existingId){ ({data:cur}=await c.from('shipments').select('*').eq('id',existingId).maybeSingle()); }\n    else {\n      if(o.status!=='return_requested'){ ui().toast('A courier collection can only be booked for an order whose return is requested','warning',7000); return; }\n      if(await _openCollection(orderId)){ ui().toast(`A courier collection for ${o.order_number} is already booked`,'info',6000); return; }\n    }\n    const {data:couriers}=await db().select('couriers',{eq:{is_active:true},order:{col:'name'}});\n    const tomorrow=new Date(Date.now()+86400000).toISOString().split('T')[0];\n    const v=k=>util().sanitize(cur?.[k]??'');\n    ui().openModal(`${cur?'Edit':'Book'} courier collection: ${util().sanitize(o.order_number)}`,`\n      <div style=\"font-size:13px;margin-bottom:10px\">Collect from <strong>${util().sanitize(o.end_customer_name||o.customer_name||'-')}</strong>, ${util().sanitize(o.end_address||o.address||'')} <strong>${util().sanitize(o.end_postcode||o.postcode||'')}</strong></div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Courier</label><select class=\"ims__select\" id=\"ims-col-courier\" ${cur?'disabled':''} onchange=\"window.IMS_LOGISTICS.collectionPrice('${util().jsArg(orderId)}')\"><option value=\"\">Choose courier</option>${(couriers||[]).map(x=>`<option value=\"${x.id}\" ${cur?.courier_id===x.id?'selected':''}>${util().sanitize(x.name)}</option>`).join('')}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Collection date</label><input class=\"ims__input\" type=\"date\" id=\"ims-col-date\" value=\"${v('collection_date')||tomorrow}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Courier order no.</label><input class=\"ims__input\" id=\"ims-col-ref\" value=\"${v('courier_order_ref')}\" placeholder=\"e.g. VDI242546\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Tracking no.</label><input class=\"ims__input\" id=\"ims-col-track\" value=\"${v('tracking_number')}\" placeholder=\"If the courier gives one\"></div>\n        ${cur?'':`<div class=\"ims__form-group\"><label class=\"ims__label\">Charge (\u00A3, before VAT)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-col-charge\"><span class=\"ims__input-hint\" id=\"ims-col-charge-hint\">Choose the courier to work it out from its rate card</span></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label style=\"display:flex;gap:6px;align-items:center;font-size:13px\"><input type=\"checkbox\" id=\"ims-col-email\" checked> Email the courier to request the collection (you can check the email before it goes)</label></div>`}\n      </div>`,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveCourierCollection('${util().jsArg(orderId)}','${util().jsArg(existingId||'')}',this)\"><i class=\"ti ti-check\"></i> ${cur?'Save changes':'Book collection'}</button>`,'lg');\n  }\n  // The charge, from the courier's rate card (collections are priced like\n  // deliveries); left blank if the courier has no rate card.\n  async function collectionPrice(orderId){\n    const courierId=document.getElementById('ims-col-courier')?.value, hint=document.getElementById('ims-col-charge-hint'), box=document.getElementById('ims-col-charge');\n    if(!courierId||!box) return;\n    const {data:o}=await _rcDb().from('orders').select('postcode,end_postcode').eq('id',orderId).maybeSingle();\n    const date=document.getElementById('ims-col-date')?.value||undefined;\n    let calc=null; try{ calc=await calcExpectedForShipment({courierId,orderId,postcode:o?.end_postcode||o?.postcode||'',date}); }catch(e){ calc=null; }\n    // Saved in the same shape as \"Assign to courier\", so the courier invoice\n    // check compares a collection line like any other shipment.\n    box.dataset.breakdown=calc&&calc.method==='type_zone'?JSON.stringify({method:'type_zone',zone:calc.zone?.name||null,outward:calc.outward,rate:calc.rateLine,extras:(calc.extras||[]).filter(e=>e.on).map(e=>({name:e.name,qty:e.qty,amount:e.amount})),floor:calc.floor,floor_amount:calc.floorAmt,base:calc.base,fuel_pct:calc.fuelPct,fuel:calc.fuel,total:calc.total,flags:calc.flags,collection:true}):'';\n    if(calc&&calc.total!=null&&calc.rateLine){ box.value=Number(calc.total).toFixed(2); if(hint) hint.textContent=`From the rate card: ${calc.rateLine.type}${calc.zone?', '+calc.zone.name:''} (incl. fuel). You can change it.`; }\n    else { box.value=''; if(hint) hint.textContent='No rate card price for this courier: enter the charge if you know it.'; }\n  }\n  async function saveCourierCollection(orderId,existingId,btn){\n    const g=id=>document.getElementById(id)?.value?.trim()||'';\n    const date=g('ims-col-date'); if(!date){ ui().toast('Please choose the collection date','error'); return; }\n    const c=_rcDb();\n    if(existingId){\n      const {error}=await c.from('shipments').update({collection_date:date,dispatched_at:`${date}T12:00:00.000Z`,courier_order_ref:g('ims-col-ref')||null,tracking_number:g('ims-col-track')||null}).eq('id',existingId).eq('is_return_collection',true);\n      if(error){ ui().toast('Not saved: '+error.message,'error',8000); return; }\n      await logActivity(orderId,'','','return_collection_updated',`Courier collection updated: ${date}`);\n      ui().closeModal(); ui().toast('Collection updated','success'); window.IMS_ORDERS?.openOrder?.(orderId); return;\n    }\n    const courierId=g('ims-col-courier'); if(!courierId){ ui().toast('Please choose the courier','error'); return; }\n    const charge=Math.round((parseFloat(g('ims-col-charge'))||0)*100)/100;\n    if(btn) btn.disabled=true;\n    const {data:o}=await c.from('orders').select('id,order_number,status,customer_name,end_customer_name,address,end_address,postcode,end_postcode,phone,end_customer_phone,order_items(product_name,quantity,service_id)').eq('id',orderId).maybeSingle();\n    if(!o||o.status!=='return_requested'){ if(btn) btn.disabled=false; ui().toast('This return is no longer waiting for collection','warning'); return; }\n    const {data:cr}=await c.from('couriers').select('name,cs_email').eq('id',courierId).maybeSingle();\n    const ref=g('ims-col-ref')||null, track=g('ims-col-track')||null;\n    let breakdown=null; try{ const bd=document.getElementById('ims-col-charge')?.dataset.breakdown; breakdown=bd?JSON.parse(bd):null; }catch(e){}\n    const {error}=await db().insert('shipments',{order_id:orderId,courier_id:courierId,tracking_number:track,courier_order_ref:ref,ship_mode:'courier',status:'pending',\n      is_return_collection:true,collection_date:date,dispatched_at:`${date}T12:00:00.000Z`,charge_amount:charge,expected_charge:charge||null,charge_breakdown:breakdown});\n    if(error){ if(btn) btn.disabled=false; ui().toast('Not booked: '+error.message,'error',8000); return; }\n    if(charge>0) await db().insert('transactions',{date:new Date().toISOString().split('T')[0],type:'expense',category:'Courier charges',description:`Return collection: ${cr?.name||'courier'} (${o.order_number})`,amount:charge,reference:track||ref||o.order_number});\n    await db().update('orders',orderId,{return_method:'courier_collection'});\n    await c.from('order_tracking_events').insert({company_id:window.SM.AUTH.company?.id,order_id:orderId,tracking_status:'Return collection booked',notes:`${cr?.name||'Courier'} on ${util().formatDate(date)}`,user_name:window.SM.AUTH.user?.name||'User',user_id:window.SM.AUTH.user?.id||null});\n    await logActivity(orderId,'','','return_collection_booked',`Courier collection booked: ${cr?.name||''} on ${date}${charge?` (\u00A3${charge.toFixed(2)})`:''}`);\n    const wantEmail=document.getElementById('ims-col-email')?.checked;\n    ui().closeModal(); ui().toast(`Collection booked with ${cr?.name||'the courier'} for ${util().formatDate(date)}`,'success');\n    if(wantEmail) setTimeout(()=>openCollectionEmail(o,cr,date,ref),300);\n    else window.IMS_ORDERS?.openOrder?.(orderId);\n  }\n  // A ready-made email asking the courier to collect (checked before sending).\n  function openCollectionEmail(o,cr,date,ref){\n    const name=o.end_customer_name||o.customer_name||'', addr=o.end_address||o.address||'', pc=o.end_postcode||o.postcode||'', phone=o.end_customer_phone||o.phone||'';\n    const items=(o.order_items||[]).filter(i=>!i.service_id).map(i=>`  ${i.quantity} x ${i.product_name}`).join('\\n');\n    const company=window.SM.AUTH.company?.name||'';\n    const body=`Dear ${cr?.name||'Courier'} Team,\\n\\nPlease arrange a collection for the return below, to come back to our warehouse.\\n\\nOrder reference:  ${o.order_number}${ref?`\\nYour reference:   ${ref}`:''}\\nCollection date:  ${util().formatDate(date)}\\n\\nCollect from:\\n  ${name}\\n  ${addr}\\n  ${pc}${phone?`\\n  Phone: ${phone}`:''}\\n\\nItems:\\n${items||'  (see order)'}\\n\\nPlease confirm the collection and send us your reference and any tracking number.\\n\\nKind regards,\\n${company}`;\n    ui().openModal(`Email ${util().sanitize(cr?.name||'the courier')}: collection ${util().sanitize(o.order_number)}`,`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Send to</label><input class=\"ims__input\" type=\"email\" id=\"ims-rn-email\" value=\"${util().sanitize(cr?.cs_email||'')}\" placeholder=\"Courier customer-service email\">\n          ${cr?.cs_email?'':`<span class=\"ims__input-hint\" style=\"color:var(--ims-warning)\">${util().sanitize(cr?.name||'This courier')} has no customer-services email yet: add it in Logistics &rarr; Couriers, and it will fill in by itself next time.</span>`}</div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Subject</label><input class=\"ims__input\" id=\"ims-rn-subject\" value=\"${util().sanitize(`Collection request - ${o.order_number}${ref?' - '+ref:''}`)}\"></div>\n      </div>\n      <div class=\"ims__form-group\"><label class=\"ims__label\">Email (edit as needed before sending)</label><textarea class=\"ims__textarea\" id=\"ims-rn-body\" rows=\"15\" style=\"font-family:monospace;font-size:12px\">${util().sanitize(body)}</textarea></div>`,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal();window.IMS_ORDERS?.openOrder?.('${util().jsArg(o.id)}')\">Skip email</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.sendCollectionEmail('${util().jsArg(o.id)}','${util().jsArg(o.order_number)}')\"><i class=\"ti ti-send\"></i> Send to courier</button>`,'lg');\n  }\n  async function sendCollectionEmail(orderId,orderNumber){\n    const to=document.getElementById('ims-rn-email')?.value?.trim()||'';\n    if(!to){ ui().toast('Please enter the courier email','error'); return; }\n    const result=await sendCourierEmail({to,subject:document.getElementById('ims-rn-subject')?.value||'',body:document.getElementById('ims-rn-body')?.value||'',\n      cc:window.SM.AUTH.company?.email||'salesmdflondon@gmail.com',orderId,emailType:'courier_collection_request',logNote:`Collection request sent to courier for ${orderNumber}`});\n    if(!result.sent) return;\n    await _rcDb().from('order_tracking_events').insert({company_id:window.SM.AUTH.company?.id,order_id:orderId,tracking_status:'Collection request sent to courier',notes:`Emailed to ${to}`,user_name:window.SM.AUTH.user?.name||'User',user_id:window.SM.AUTH.user?.id||null});\n    ui().closeModal(); ui().toast(`Collection request sent to ${to}`,'success',5000); window.IMS_ORDERS?.openOrder?.(orderId);\n  }\n  // The courier has collected it: the goods are on their way back.\n  async function markCollectionCollected(shipmentId,orderId){\n    const c=_rcDb();\n    const {error}=await c.from('shipments').update({status:'in_transit'}).eq('id',shipmentId).eq('is_return_collection',true).eq('status','pending');\n    if(error){ ui().toast('Not saved: '+error.message,'error'); return; }\n    const {data:o}=await c.from('orders').select('status').eq('id',orderId).maybeSingle();\n    if(o?.status==='return_requested') await db().update('orders',orderId,{status:'return_in_transit'});\n    await c.from('order_tracking_events').insert({company_id:window.SM.AUTH.company?.id,order_id:orderId,tracking_status:'Return collected by courier',notes:null,user_name:window.SM.AUTH.user?.name||'User',user_id:window.SM.AUTH.user?.id||null});\n    await logActivity(orderId,o?.status||'return_requested','return_in_transit','return_collected','Collected by the courier: on its way back');\n    ui().toast('Marked collected: the return is on its way back','success'); window.IMS_ORDERS?.openOrder?.(orderId);\n  }\n  // Cancel a booking not yet collected: removed, and its charge reversed.\n  async function cancelCourierCollection(shipmentId,orderId){\n    ui().confirm('Cancel this courier collection? Its charge is reversed, and the return stays requested.',async()=>{\n      const c=_rcDb();\n      const {data:sh}=await c.from('shipments').select('id,status,charge_amount,tracking_number,courier_order_ref,is_return_collection,couriers(name),orders(order_number)').eq('id',shipmentId).maybeSingle();\n      if(!sh||!sh.is_return_collection||sh.status!=='pending'){ ui().toast('Only a collection not yet collected can be cancelled','warning'); return; }\n      const {error}=await c.from('shipments').delete().eq('id',shipmentId);\n      if(error){ ui().toast('Not cancelled: '+error.message,'error'); return; }\n      if(Number(sh.charge_amount)>0) await db().insert('transactions',{date:new Date().toISOString().split('T')[0],type:'expense',category:'Courier charges',description:`Return collection cancelled: ${sh.couriers?.name||'courier'} (${sh.orders?.order_number||''})`,amount:-Number(sh.charge_amount),reference:sh.tracking_number||sh.courier_order_ref||sh.orders?.order_number||null});\n      await logActivity(orderId,'','','return_collection_cancelled','Courier collection cancelled');\n      ui().toast('Collection cancelled','success'); window.IMS_ORDERS?.openOrder?.(orderId);\n    },'Cancel collection',true);\n  }\n  // On the order: the return collection, if any, with its actions.\n  async function renderReturnCollection(orderId,elId,orderStatus){\n    const el=document.getElementById(elId); if(!el) return;\n    const sh=await _openCollection(orderId);\n    if(!sh){ el.innerHTML=''; return; }\n    const st=sh.status==='pending'?'Booked':sh.status==='in_transit'?'Collected: on its way back':sh.status;\n    const link=sh.tracking_number&&sh.couriers?util().buildTrackingUrl?.(sh.couriers,sh.tracking_number,''):null;\n    el.innerHTML=`<hr class=\"ims__divider\"><strong style=\"font-size:13px\">Return collection</strong>\n      <div style=\"display:flex;flex-wrap:wrap;gap:8px;align-items:center;font-size:12px;margin-top:8px\">\n        <span class=\"ims__pill ims__pill--${sh.status==='pending'?'warning':'info'}\">${util().sanitize(st)}</span>\n        <span><strong>${util().sanitize(sh.couriers?.name||'Courier')}</strong> &middot; ${util().formatDate(sh.collection_date)}${sh.courier_order_ref?` &middot; ref ${util().sanitize(sh.courier_order_ref)}`:''}${sh.tracking_number?` &middot; ${link?`<a class=\"ims__link\" href=\"${link}\" target=\"_blank\" rel=\"noopener\">${util().sanitize(sh.tracking_number)}</a>`:util().sanitize(sh.tracking_number)}`:''}${Number(sh.charge_amount)>0?` &middot; ${util().formatCurrency(sh.charge_amount)}`:''}</span>\n        ${sh.status==='pending'?`<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.markCollectionCollected('${util().jsArg(sh.id)}','${util().jsArg(orderId)}')\"><i class=\"ti ti-check\"></i> Mark collected</button>\n        <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.bookCourierCollection('${util().jsArg(orderId)}','','${util().jsArg(sh.id)}')\"><i class=\"ti ti-edit\"></i> Edit</button>\n        <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" style=\"color:var(--ims-danger)\" onclick=\"window.IMS_LOGISTICS.cancelCourierCollection('${util().jsArg(sh.id)}','${util().jsArg(orderId)}')\"><i class=\"ti ti-x\"></i> Cancel</button>`:''}\n      </div>`;\n  }\n\n  // \u2500\u2500\u2500 RETURN PICK-UPS (office) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // A van job that COLLECTS a return. It waits in the Own Truck Queue,\n  // goes onto manifests like a delivery, and never changes stock, COD or\n  // the order's status until the driver collects it (then \"Return in\n  // transit\"; the warehouse uses \"Return received\").\n  async function arrangeVanPickup(orderId,orderNumber){\n    const c=_rcDb();\n    const {data:o}=await c.from('orders').select('id,status').eq('id',orderId).maybeSingle();\n    if(!o||o.status!=='return_requested'){ ui().toast('A van pick-up can only be arranged for an order whose return is requested','warning',6000); return false; }\n    const {data:open}=await c.from('logistics_jobs').select('id,status,manifest_id').eq('order_id',orderId).eq('is_return_pickup',true);\n    const live=[];\n    for(const j of (open||[])){\n      if(j.status==='scheduled'&&!j.manifest_id){ live.push(j); continue; }\n      if(j.manifest_id){ const {data:mi}=await c.from('manifest_items').select('delivery_status').eq('logistics_job_id',j.id).maybeSingle(); if(mi&&!['collected','failed','delivered','partial'].includes(mi.delivery_status)) live.push(j); }\n    }\n    if(live.length){ ui().toast(`A van pick-up for ${orderNumber||'this order'} is already arranged`,'info',6000); return false; }\n    const {error}=await db().insert('logistics_jobs',{order_id:orderId,job_type:'own_truck',status:'scheduled',is_return_pickup:true});\n    if(error){ ui().toast('Not arranged: '+error.message,'error',8000); return false; }\n    await db().update('orders',orderId,{return_method:'own_van_pickup'});\n    await logActivity(orderId,'','','return_pickup_arranged','Van pick-up arranged: in the Own Truck Queue');\n    ui().toast(`Van pick-up for ${orderNumber||'the order'} added to the Own Truck Queue`,'success');\n    return true;\n  }\n  async function cancelPickup(jobId){\n    ui().confirm('Cancel this van pick-up? The return stays requested; you can arrange another way.',async()=>{\n      const c=_rcDb();\n      const {data:j}=await c.from('logistics_jobs').select('id,order_id,status,manifest_id,is_return_pickup').eq('id',jobId).maybeSingle();\n      if(!j||!j.is_return_pickup||j.manifest_id||j.status!=='scheduled'){ ui().toast('Only a pick-up still waiting in the queue can be cancelled','warning'); return; }\n      const {error}=await c.from('logistics_jobs').delete().eq('id',jobId);\n      if(error){ ui().toast('Not cancelled: '+error.message,'error'); return; }\n      if(j.order_id) await logActivity(j.order_id,'','','return_pickup_cancelled','Van pick-up cancelled');\n      ui().toast('Van pick-up cancelled','success'); loadOwnTruckQueue();\n    },'Cancel pick-up',true);\n  }\n\n  // \u2500\u2500\u2500 LIVE UPDATES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // While Logistics is open, the database tells this screen when a stop or\n  // an order changes (Supabase Realtime, within the same company rules), so\n  // an open manifest, Tracking and the manifest list refresh by themselves\n  // as drivers record stops. If the live connection drops, the screen\n  // checks every 60 seconds until it is back. Several changes close\n  // together refresh once, and never while you are typing on the screen.\n  let _openManifestId=null;\n  const _live={client:null,channel:null,ok:false,poll:null,timer:null};\n  function _liveStart(){\n    if(_live.channel) return;\n    try{\n      _live.client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n      _live.channel=_live.client.channel('sm-logistics-live')\n        .on('postgres_changes',{event:'*',schema:'public',table:'manifest_items'},()=>_liveChanged())\n        .on('postgres_changes',{event:'*',schema:'public',table:'orders'},()=>_liveChanged())\n        .subscribe(status=>{\n          _live.ok=status==='SUBSCRIBED';\n          if(_live.ok) _livePollStop(); else if(['CHANNEL_ERROR','TIMED_OUT','CLOSED'].includes(status)) _livePollStart();\n        });\n      setTimeout(()=>{ if(!_live.ok) _livePollStart(); },10000);\n    }catch(e){ _livePollStart(); }\n  }\n  function _livePollStart(){ if(!_live.poll) _live.poll=setInterval(()=>_liveChanged(),60000); }\n  function _livePollStop(){ if(_live.poll){ clearInterval(_live.poll); _live.poll=null; } }\n  function _liveChanged(){ clearTimeout(_live.timer); _live.timer=setTimeout(_liveRefresh,1500); }\n  function _manifestOnScreen(){\n    const open=document.getElementById('ims-modal-overlay')?.classList.contains('ims__modal-overlay--open');\n    return !!(_openManifestId&&open&&/^Manifest: /.test(document.getElementById('ims-modal-title')?.textContent||''));\n  }\n  function _typingOnScreen(){\n    const a=document.activeElement;\n    return !!(a&&/^(INPUT|SELECT|TEXTAREA)$/.test(a.tagName)&&a.closest('#ims-modal,#ims-log-content'));\n  }\n  async function _liveRefresh(){\n    if(_typingOnScreen()){ _live.timer=setTimeout(_liveRefresh,5000); return; }\n    if(_manifestOnScreen()){ await openManifest(_openManifestId); return; }\n    if(document.getElementById('ims-modal-overlay')?.classList.contains('ims__modal-overlay--open')) return;   // another window is open: leave it\n    if(window.SM?.UI?.activePanel!=='logistics') return;\n    const tab=document.querySelector('#ims-log-tabs .ims__tab--active')?.dataset.tab;\n    if(tab==='tracking') await loadTracking();\n    else if(tab==='manifests') await loadManifests();\n  }\n\n  // \u2500\u2500\u2500 GPS: how far the stop was recorded from its delivery postcode \u2500\u2500\n  // The postcode's location comes from postcodes.io (free, UK only; only\n  // the postcode is sent, never any customer details), looked up in one\n  // request and remembered for this session. Over 1 km is flagged: useful\n  // for \"it never arrived\" disputes.\n  const _pcCache={};\n  function _km(a,b,c,d){ const R=6371,r=x=>x*Math.PI/180; const h=Math.sin(r(c-a)/2)**2+Math.cos(r(a))*Math.cos(r(c))*Math.sin(r(d-b)/2)**2; return 2*R*Math.asin(Math.sqrt(h)); }\n  async function _fillGpsDistances(scope){\n    const spans=[...((scope||document).querySelectorAll('span[data-gps-check]'))].filter(x=>!x.dataset.done);\n    if(!spans.length) return;\n    const norm=pc=>String(pc||'').toUpperCase().replace(/\\s+/g,'');\n    const want=[...new Set(spans.map(x=>norm(x.dataset.postcode)).filter(pc=>pc&&!(pc in _pcCache)))];\n    if(want.length){\n      try{\n        const res=await fetch('https://api.postcodes.io/postcodes',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({postcodes:want.slice(0,100)})});\n        const out=await res.json();\n        (out?.result||[]).forEach(r=>{ _pcCache[norm(r.query)]=r.result?{lat:r.result.latitude,lng:r.result.longitude}:null; });\n      }catch(e){ /* no lookup: the location link still works, just without the distance */ }\n    }\n    spans.forEach(x=>{\n      x.dataset.done='1';\n      const pc=_pcCache[norm(x.dataset.postcode)]; if(!pc) return;\n      const km=_km(Number(x.dataset.lat),Number(x.dataset.lng),pc.lat,pc.lng), acc=Number(x.dataset.acc)||0;\n      const approx=acc>500?' (approximate location)':'';\n      x.innerHTML=km>1\n        ?`<span style=\"color:var(--ims-warning);font-weight:600\">&#9888; ${km.toFixed(1)} km from the delivery postcode${approx}</span>`\n        :`<span style=\"color:var(--ims-text-muted)\">at the delivery postcode (${km<0.1?'under 0.1':km.toFixed(1)} km)${approx}</span>`;\n    });\n  }\n\n  // \u2500\u2500\u2500 PROOF OF DELIVERY (office view) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // What the driver (or office) recorded at each stop: who received it,\n  // when, from where, the failure reason, how COD was paid, and the photo\n  // and signature. Images load through private links valid for 10 minutes\n  // (the storage is never public) and enlarge on click.\n  const COD_LABEL={cash:'cash collected',bank_transfer:'paid by bank transfer',not_collected:'NOT collected'};\n  function _podDetails(item,postcode){\n    const bits=[];\n    if(item.recipient_name) bits.push(`Received by <strong>${util().sanitize(item.recipient_name)}</strong>`);\n    if(item.failure_reason) bits.push(`<span style=\"color:var(--ims-danger)\">Failed: ${util().sanitize(item.failure_reason)}</span>`);\n    const when=item.pod_at||item.recorded_at||item.delivered_at;\n    if(when) bits.push(util().formatDateTime?util().formatDateTime(when):util().formatDate(when));\n    if(item.recorded_via) bits.push(item.recorded_via==='driver_app'?'driver app':'office');\n    if(item.cod_method) bits.push(`COD ${COD_LABEL[item.cod_method]||item.cod_method}${item.cod_method==='cash'?` ${util().formatCurrency(item.cod_amount||0)}`:''}`);\n    if(item.gps_lat!=null&&item.gps_lng!=null){\n      const acc=item.gps_accuracy_m!=null?` &plusmn;${item.gps_accuracy_m} m`:'';\n      bits.push(`<a class=\"ims__link\" href=\"https://www.google.com/maps/search/?api=1&query=${Number(item.gps_lat)},${Number(item.gps_lng)}\" target=\"_blank\" rel=\"noopener\" title=\"Where the phone was when the stop was recorded\">&#128205; Location${acc}</a>`\n        +(postcode?` <span data-gps-check data-lat=\"${Number(item.gps_lat)}\" data-lng=\"${Number(item.gps_lng)}\" data-acc=\"${Number(item.gps_accuracy_m)||0}\" data-postcode=\"${util().sanitize(postcode)}\"></span>`:''));\n    }\n    if(item.pod_removed_at) bits.push(`<span style=\"color:var(--ims-text-muted)\">Proof removed after ${window.SM.AUTH.company?.pod_retention_months||12} months (retention policy)</span>`);\n    const thumbs=[item.pod_photo_path?_podThumb(item.pod_photo_path,'Photo'):'',item.pod_signature_path?_podThumb(item.pod_signature_path,'Signature'):''].join('');\n    return {bits,thumbs};\n  }\n  function _podRow(item){\n    if(!['delivered','failed','partial','collected'].includes(item.delivery_status)) return '';\n    const {bits,thumbs}=_podDetails(item,item.logistics_jobs?.orders?.postcode||'');\n    if(!bits.length&&!thumbs) return '';\n    return `<tr><td></td><td colspan=\"7\" style=\"padding-top:0;border-top:none\"><div style=\"display:flex;flex-wrap:wrap;gap:8px;align-items:center;font-size:12px\"><strong>Proof:</strong>${thumbs}<span>${bits.join(' &middot; ')}</span></div></td></tr>`;\n  }\n  function _podThumb(path,label){\n    return `<img data-pod-path=\"${util().sanitize(path)}\" alt=\"${label}\" title=\"${label}: click to enlarge\" style=\"width:56px;height:42px;object-fit:cover;border-radius:6px;border:1px solid var(--ims-border);background:#f3f4f6;cursor:zoom-in\" onclick=\"window.IMS_LOGISTICS.podOpen(this)\">`;\n  }\n  async function _fillPodImages(scope){\n    const imgs=[...((scope||document).querySelectorAll('img[data-pod-path]'))].filter(i=>!i.getAttribute('src'));\n    if(!imgs.length) return;\n    const paths=[...new Set(imgs.map(i=>i.dataset.podPath))];\n    const {data,error}=await _rcDb().storage.from('pod').createSignedUrls(paths,600);\n    const map={}; (data||[]).forEach(x=>{ if(x&&x.signedUrl&&!x.error) map[x.path]=x.signedUrl; });\n    imgs.forEach(i=>{ const u=map[i.dataset.podPath]; if(u) i.setAttribute('src',u); else { i.alt=`${i.alt} (not available${error?': '+error.message:''})`; i.style.cursor='default'; } });\n  }\n  function podOpen(img){\n    const src=img?.getAttribute('src'); if(!src) return;\n    document.getElementById('ims-pod-lightbox')?.remove();\n    const ov=document.createElement('div'); ov.id='ims-pod-lightbox';\n    ov.style.cssText='position:fixed;inset:0;z-index:100000;background:rgba(0,0,0,.82);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;cursor:zoom-out';\n    ov.innerHTML=`<img src=\"${src}\" alt=\"${util().sanitize(img.alt||'')}\" style=\"max-width:96vw;max-height:84vh;object-fit:contain;background:#fff;border-radius:8px\">\n      <div style=\"margin-top:10px;display:flex;gap:10px\"><a href=\"${src}\" target=\"_blank\" rel=\"noopener\" style=\"color:#fff;font-size:13px\" onclick=\"event.stopPropagation()\">Open in a new tab</a><span style=\"color:#cbd5e1;font-size:13px\">Click anywhere to close</span></div>`;\n    ov.addEventListener('click',()=>ov.remove());\n    document.body.appendChild(ov);\n  }\n  // The proof for one order (used by the order view).\n  async function renderOrderPod(orderId,elId){\n    const el=document.getElementById(elId); if(!el||!orderId) return;\n    const c=_rcDb();\n    const {data:jobs}=await c.from('logistics_jobs').select('id').eq('order_id',orderId);\n    const ids=(jobs||[]).map(j=>j.id); if(!ids.length) return;\n    const {data:items}=await c.from('manifest_items').select('id,manifest_id,delivery_status,delivered_at,recipient_name,failure_reason,pod_photo_path,pod_signature_path,pod_at,pod_removed_at,cod_method,cod_amount,recorded_via,recorded_at,gps_lat,gps_lng,gps_accuracy_m,gps_at').in('logistics_job_id',ids);\n    const rec=(items||[]).filter(i=>['delivered','failed','partial','collected'].includes(i.delivery_status));\n    if(!rec.length) return;\n    const {data:mans}=await c.from('manifests').select('id,manifest_number').in('id',[...new Set(rec.map(i=>i.manifest_id))]);\n    const {data:ordPc}=await c.from('orders').select('postcode').eq('id',orderId).maybeSingle();\n    el.innerHTML=`<hr class=\"ims__divider\"><strong style=\"font-size:13px\">Proof of delivery</strong>\n      ${rec.map(i=>{ const {bits,thumbs}=_podDetails(i,ordPc?.postcode||''); const mn=(mans||[]).find(m=>m.id===i.manifest_id)?.manifest_number||'';\n        return `<div style=\"display:flex;flex-wrap:wrap;gap:8px;align-items:center;font-size:12px;margin-top:8px\">${util().pill(i.delivery_status)}${mn?`<span style=\"color:var(--ims-text-muted)\">${util().sanitize(mn)}</span>`:''}${thumbs}<span>${bits.join(' &middot; ')}</span></div>`; }).join('')}`;\n    _fillPodImages(el);\n    _fillGpsDistances(el);\n  }\n\n  // Stop outcomes and tasks are recorded by the server (driver-api), with\n  // exactly the same rules for the office and the driver app: order\n  // delivered, stock out, commission, receivable, activity, completion, the\n  // customer's email. (This button used to skip the commission and the\n  // email, and a failed stop recorded no reason.)\n  async function _deliveryApi(action, body){\n    try{\n      const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n      const {data:got}=await client.auth.getSession();\n      const token=got?.session?.access_token;\n      if(!token) return {error:'Your session has ended. Please sign in again.'};\n      const r=await fetch(`${window.IMS_SUPABASE_URL}/functions/v1/driver-api`,{method:'POST',\n        headers:{'Content-Type':'application/json','Authorization':`Bearer ${token}`,'apikey':window.IMS_SUPABASE_ANON_KEY},\n        body:JSON.stringify({action,...body})});\n      const out=await r.json().catch(()=>({}));\n      if(!r.ok||out.error) return {error:out.error||(r.status===404?'The delivery service (driver-api) is not set up in Supabase yet.':`Error ${r.status}`)};\n      return out;\n    }catch(e){ return {error:'StockMaestro could not reach the delivery service. Check the connection and try again.'}; }\n  }\n  const FAIL_REASONS=['No one home','Access issues','Wrong address','Customer refused delivery','Damaged in transit','Other'];\n  async function updateDelivery(itemId,orderId,status){\n    if(!status)return;\n    if(status==='failed'){\n      ui().openModal('Failed delivery',`\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Reason</label>\n          <select class=\"ims__select\" id=\"ims-stopfail-reason\" onchange=\"document.getElementById('ims-stopfail-other-wrap').style.display=this.value==='Other'?'':'none'\">\n            <option value=\"\">Select reason...</option>${FAIL_REASONS.map(r=>`<option value=\"${r}\">${r}</option>`).join('')}\n          </select></div>\n        <div class=\"ims__form-group\" id=\"ims-stopfail-other-wrap\" style=\"display:none\"><label class=\"ims__label ims__label--req\">Reason</label><input class=\"ims__input\" id=\"ims-stopfail-other\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Notes</label><input class=\"ims__input\" id=\"ims-stopfail-notes\" placeholder=\"Optional\"></div>\n        <div style=\"font-size:12px;color:var(--ims-text-muted)\">The order goes to Failed delivery in Tracking, where you choose to re-attempt or return it.</div>`,\n        `<button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n         <button class=\"ims__btn ims__btn--danger\" onclick=\"window.IMS_LOGISTICS.confirmStopFailed('${util().jsArg(itemId)}',this)\"><i class=\"ti ti-x\"></i> Record failed delivery</button>`,'sm');\n      return;\n    }\n    await _recordStop(itemId,status,{});\n  }\n  async function confirmStopFailed(itemId,btn){\n    const sel=document.getElementById('ims-stopfail-reason')?.value||'';\n    const other=document.getElementById('ims-stopfail-other')?.value?.trim()||'';\n    const reason=sel==='Other'?other:sel;\n    if(!reason){ ui().toast('Please give the reason','error'); return; }\n    if(btn) btn.disabled=true;\n    await _recordStop(itemId,'failed',{reason,notes:document.getElementById('ims-stopfail-notes')?.value?.trim()||null});\n  }\n  async function _recordStop(itemId,status,extra){\n    const r=await _deliveryApi('stop_outcome',{manifest_item_id:itemId,status,...extra});\n    if(r.error){ ui().toast(r.error,'error',8000); return; }\n    ui().closeModal();\n    if(r.already) ui().toast('Stop already recorded: no duplicate actions taken','warning',5000);\n    else if(r.already_delivered) ui().toast('Stop marked: order was already delivered, no duplicate actions taken','warning',5000);\n    else ui().toast(`Stop marked as ${status.replace(/_/g,' ')}`,'success');\n    if((r.stock_problems||[]).length) ui().toast(`Delivered, but stock could not be updated for: ${r.stock_problems.join(', ')}. Please check stock levels.`,'warning',10000);\n    if((r.open_tasks||[]).length) ui().toast(`Please confirm the tasks for this stop (done / not done): ${r.open_tasks.join(', ')}`,'warning',10000);\n    if(r.manifest_id) await openManifest(r.manifest_id);\n  }\n\n  async function deleteManifest(id,manifestNumber){\n    if(!window.SM.AUTH.isAdmin()){ui().toast('Admin access required','error');return;}\n    // Once the van has departed, its orders are physically on it.\n    if(await _manifestDeparted(id)) return;\n    ui().confirm(\n      `Delete manifest <strong>${util().sanitize(manifestNumber)}</strong>?<br><br>Its orders go back to the Own Truck Queue and revert to Packed. This cannot be undone.`,\n      async()=>{\n        if(await _manifestDeparted(id)) return;\n        const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n        // The orders were marked Dispatched when added: put them back to\n        // Packed (they used to stay Dispatched), and their jobs back in the\n        // Own Truck Queue (they used to go back to Unassigned).\n        const {data:jobs}=await client.from('logistics_jobs').select('id,order_id,is_return_pickup').eq('manifest_id',id);\n        const backToPacked=[];\n        for(const j of (jobs||[])){\n          if(j.is_return_pickup){ if(j.order_id) await logActivity(j.order_id,'','','return_pickup_unplanned',`Manifest ${manifestNumber} deleted: van pick-up back in the queue`); continue; }\n          if(j.order_id){\n            await db().update('orders',j.order_id,{status:'packed',dispatched_at:null});\n            await logActivity(j.order_id,'dispatched','packed','removed_from_manifest',`Manifest ${manifestNumber} deleted`);\n            backToPacked.push(j.order_id);\n          }\n        }\n        window.SM.SHOPIFY?.sync('unfulfil',backToPacked);\n        await client.from('logistics_jobs').update({status:'scheduled',job_type:'own_truck',manifest_id:null}).eq('manifest_id',id);\n        await client.from('manifest_items').delete().eq('manifest_id',id);\n        await db().remove('manifests',id);\n        ui().toast(`Manifest ${manifestNumber} deleted: its orders are back in the Own Truck Queue`,'success');\n        loadManifests();\n      },\n      'Delete manifest', true\n    );\n  }\n\n  // \u2500\u2500\u2500 PRINT MANIFEST \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function printManifest(id){\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:m}=await db().select('manifests',{\n      select:'*, drivers(name,phone), vehicles(registration,make_model), manifest_items(load_order,delivery_status,logistics_jobs(job_type,order_id,is_return_pickup,orders(order_number,customer_name,address,postcode,total_value,payment_status,amended_at,order_items(product_id,product_name,sku,quantity,service_id))))',\n      eq:{id},maybeSingle:true,noCompanyFilter:true\n    });\n    if(!m)return;\n    const now=new Date().toLocaleDateString('en-GB');\n    const items=(m.manifest_items||[]).sort((a,b)=>a.load_order-b.load_order);\n    const deliveryItems=[...items].sort((a,b)=>b.load_order-a.load_order);\n    const stopBoxMap={};\n    for(const item of items){\n      const orderId=item.logistics_jobs?.order_id;\n      if(!orderId)continue;\n      const stopItems=item.logistics_jobs?.orders?.order_items||[];\n      if(stopItems.length)stopBoxMap[orderId]=await util().getOrderBoxSummary(stopItems);\n    }\n    const allOrderItems=[];\n    items.forEach(item=>{(item.logistics_jobs?.orders?.order_items||[]).forEach(oi=>allOrderItems.push(oi));});\n    const boxSummary=await util().getOrderBoxSummary(allOrderItems);\n    const hasBox=boxSummary.hasData;\n    const driverName=m.drivers?.name||'\u2014';\n    const dispatchDate=m.dispatched_at?util().formatDate(m.dispatched_at):now;\n    const manifestRef=`${driverName} \u2014 ${dispatchDate}`;\n    const codItems=items.filter(i=>i.logistics_jobs?.orders?.payment_status==='cod');\n    const codTotal=codItems.reduce((s,i)=>s+(i.logistics_jobs?.orders?.total_value||0),0);\n    const buildHeader=(title)=>window.PRINT.header({\n      title,docRef:m.manifest_number||'\u2014',\n      rightLabel:'Driver / Vehicle',rightName:driverName,\n      rightLines:[`Tel: ${util().sanitize(m.drivers?.phone||'\u2014')}`,`Vehicle: ${util().sanitize(m.vehicles?.registration||'\u2014')} ${util().sanitize(m.vehicles?.make_model||'')}`,``,`<strong>Date:</strong> ${dispatchDate}`,`<strong>Total stops:</strong> ${items.length}`,`<strong>Printed:</strong> ${now}`]\n    });\n    const loadColWidths=['5%','5%','9%','11%','26%','6%','7%','8%','23%'];\n    const loadColumns=[{label:'Load #'},{label:'Stop #'},{label:'Order #'},{label:'SKU'},{label:'Product'},{label:'Qty',align:'r'},{label:'Boxes',align:'r'},{label:'Weight',align:'r'},{label:'Checked \u2713',align:'ctr'}];\n    const loadTotalsRow=hasBox?['<td colspan=\"6\"><strong>Grand totals</strong></td>',`<td class=\"r\"><strong>${boxSummary.totalBoxes}</strong></td>`,`<td class=\"r\"><strong>${boxSummary.totalWeightKg}kg</strong></td>`,'<td></td>']:['<td colspan=\"6\"><strong>Grand totals</strong></td>','<td></td>','<td></td>','<td></td>'];\n    const delivColWidths=['5%','10%','20%','22%','10%','11%','11%','11%'];\n    const delivColumns=[{label:'Stop'},{label:'Order #'},{label:'Customer'},{label:'Address'},{label:'Postcode'},{label:'Amount due',align:'r'},{label:'Delivered',align:'ctr'},{label:'Signature',align:'ctr'}];\n    const delivRows=deliveryItems.map((item,i)=>{\n      const order=item.logistics_jobs?.orders;\n      const pickup=!!item.logistics_jobs?.is_return_pickup;\n      const isCOD=!pickup&&order?.payment_status==='cod';\n      const codBadge=pickup?window.PRINT.badge('COLLECT (return)','warn'):isCOD?window.PRINT.badge('COD','dark'):order?.payment_status==='unpaid'?window.PRINT.badge('ACCOUNT','warn'):window.PRINT.badge('PAID','neutral');\n      const amountCell=isCOD?`\u00A3${(order?.total_value||0).toFixed(2)}`:`<span style=\"color:#888\">\u2014</span>`;\n      return `<tr class=\"${isCOD?'highlightrow':''}\"><td class=\"ln\">${i+1}</td><td>${util().sanitize(order?.order_number||'\u2014')}</td><td>${util().sanitize(order?.customer_name||'\u2014')} ${codBadge}</td><td class=\"sm\">${util().sanitize(order?.address||'\u2014')}${(order?.order_items||[]).some(x=>x.service_id)?`<div><strong>Tasks:</strong> ${(order.order_items||[]).filter(x=>x.service_id).map(x=>util().sanitize(x.product_name)+(x.quantity>1?` x${x.quantity}`:'')).join('; ')}</div>`:''}</td><td class=\"pc\">${util().sanitize(order?.postcode||'\u2014')}</td><td class=\"r\" style=\"font-weight:${isCOD?'bold':'normal'}\">${amountCell}</td><td class=\"ctr\">${window.PRINT.signatureBox()}</td><td class=\"ctr\">${window.PRINT.signatureBox(70)}</td></tr>`;\n    });\n    const LOAD_ROWS_PER_PAGE=24,DELIV_ROWS_PER_PAGE=22;\n    const loadGroups=items.map(item=>{\n      const ordId=item.logistics_jobs?.order_id||'';\n      const sb=stopBoxMap[ordId];\n      const stopNum=items.length-item.load_order+1;\n      const orderNum=util().sanitize(item.logistics_jobs?.orders?.order_number||'-')+(item.logistics_jobs?.orders?.amended_at?' (amended)':'');\n      const rows=[];\n      if(sb&&sb.hasData&&sb.lines&&sb.lines.length){\n        sb.lines.forEach((line,li)=>{\n          rows.push(`<tr><td class=\"ln\">${li===0?item.load_order:''}</td><td>${li===0?stopNum:''}</td><td>${li===0?orderNum:''}</td><td>${util().sanitize(line.sku||'\u2014')}</td><td>${util().sanitize(line.productName||'\u2014')}</td><td class=\"r\">${line.quantity}</td><td class=\"r\">${line.lineBoxes||'\u2014'}</td><td class=\"r\">${line.lineWeightKg?line.lineWeightKg+'kg':'\u2014'}</td><td class=\"ctr\">${li===0?window.PRINT.signatureBox():''}</td></tr>`);\n        });\n        rows.push(`<tr class=\"subtotal\"><td colspan=\"5\"><strong>Stop ${stopNum} subtotal</strong></td><td></td><td class=\"r\"><strong>${sb.totalBoxes}</strong></td><td class=\"r\"><strong>${sb.totalWeightKg}kg</strong></td><td></td></tr>`);\n        return{rows,rowCount:sb.lines.length+1};\n      } else {\n        rows.push(`<tr><td class=\"ln\">${item.load_order}</td><td>${stopNum}</td><td>${orderNum}</td><td colspan=\"5\" style=\"color:#888\">No box data recorded</td><td class=\"ctr\">${window.PRINT.signatureBox()}</td></tr>`);\n        return{rows,rowCount:1};\n      }\n    });\n    const loadPages=window.PRINT.paginateGrouped(loadGroups,LOAD_ROWS_PER_PAGE);\n    const delivPages=window.PRINT.paginate(delivRows,DELIV_ROWS_PER_PAGE);\n    const totalPages=loadPages.length+delivPages.length;\n    const allPages=[];let pageNum=0;\n    loadPages.forEach((pageRows,pi)=>{\n      pageNum++;\n      const isLast=pi===loadPages.length-1;\n      allPages.push(`${buildHeader('Loading Sheet')}<div class=\"st\">Loading sheet \u2014 load in this order (load #1 goes deepest into truck) <span class=\"pg\">Page ${pageNum} of ${totalPages}</span></div><hr class=\"rule\">${window.PRINT.table({colWidths:loadColWidths,columns:loadColumns,rows:pageRows,rowsArePrebuilt:true,totalsRow:isLast?loadTotalsRow:null})}<hr class=\"rule-dbl\">${window.PRINT.pageFooter(['StockMaestro \u00A9 2026 ABSA Digital',m.manifest_number,manifestRef],pageNum,totalPages)}`);\n    });\n    delivPages.forEach((pageRows,pi)=>{\n      pageNum++;\n      const isFirst=pi===0;\n      allPages.push(`${buildHeader('Delivery Manifest')}<div class=\"st\">Delivery sheet \u2014 stops in delivery order <span class=\"pg\">Page ${pageNum} of ${totalPages}</span></div>${isFirst&&codTotal>0?window.PRINT.summaryBox(`COD collection required: ${codItems.length} stop(s) \u2014 total to collect: \u00A3${codTotal.toFixed(2)}`):''}<hr class=\"rule\">${window.PRINT.table({colWidths:delivColWidths,columns:delivColumns,rows:pageRows,rowsArePrebuilt:true})}<hr class=\"rule-dbl\">${window.PRINT.pageFooter(['StockMaestro \u00A9 2026 ABSA Digital',m.manifest_number,manifestRef],pageNum,totalPages)}`);\n    });\n    window.PRINT.renderDocument(allPages,`Manifest ${m.manifest_number} \u2014 ${manifestRef}`);\n  }\n\n  // \u2500\u2500\u2500 COURIERS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function loadCouriers(){\n    const content=document.getElementById('ims-log-content');\n    if(!content)return;\n    const {data:couriers}=await db().select('couriers',{order:{col:'name'}});\n    const items=couriers||[];\n    content.innerHTML=`\n      <div style=\"display:flex;justify-content:flex-end;margin-bottom:14px\">\n        <button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.showCourierForm()\"><i class=\"ti ti-plus\"></i> Add courier</button>\n      </div>\n      <div style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px\">\n        ${items.map(c=>`<div class=\"ims__card\">\n          <div class=\"ims__card-header\">\n            <div class=\"ims__card-title\"><i class=\"ti ti-truck\"></i>${util().sanitize(c.name)}</div>\n            <span class=\"ims__pill ims__pill--${c.is_active?'success':'neutral'}\">${c.is_active?'Active':'Inactive'}</span>\n          </div>\n          <div style=\"font-size:12px;color:var(--ims-text-sec);margin-bottom:8px\">\n            ${c.tracking_url_base?`<div><i class=\"ti ti-link\"></i> ${util().sanitize(c.tracking_url_base.slice(0,45))}...</div>`:'<div style=\"color:var(--ims-warning)\">No tracking URL</div>'}\n            ${c.requires_postcode?'<div style=\"color:var(--ims-accent)\"><i class=\"ti ti-map-pin\"></i> Requires postcode</div>':''}\n            ${c.cs_email?`<div><i class=\"ti ti-mail\"></i> CS: ${util().sanitize(c.cs_email)}</div>`:''}\n            ${c.claims_email?`<div><i class=\"ti ti-file-alert\"></i> Claims: ${util().sanitize(c.claims_email)}</div>`:''}\n            <div><i class=\"ti ti-calculator\"></i> DIM factor: ${c.dim_factor||5000}</div>\n          </div>\n          <div class=\"ims__btn-group\">\n            <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.showCourierForm('${util().jsArg(c.id)}')\"><i class=\"ti ti-edit\"></i> Edit</button>\n            <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.manageCourierRates('${util().jsArg(c.id)}','${util().jsArg(c.name)}')\"><i class=\"ti ti-currency-pound\"></i> Rates</button>\n          </div>\n        </div>`).join('')||'<div class=\"ims__coming-soon\"><i class=\"ti ti-truck\"></i><h3>No couriers yet</h3><p>Add courier companies to enable tracking and follow-ups.</p></div>'}\n      </div>`;\n  }\n\n  async function showCourierForm(existingId=null){\n    let c=null;\n    if(existingId){const {data}=await db().select('couriers',{eq:{id:existingId},maybeSingle:true,noCompanyFilter:true});c=data;}\n    ui().openModal(existingId?`Edit: ${c?.name}`:'Add courier',`\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>${existingId?'Edit courier details below.':'Step 1 of 2 \u2014 Enter courier details. After saving, you will be taken directly to <strong>set up freight rate bands and surcharges</strong>.'}</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label ims__label--req\">Courier name</label><input class=\"ims__input\" type=\"text\" id=\"ims-cur-name\" value=\"${util().sanitize(c?.name||'')}\" placeholder=\"e.g. DHL, Evri, XDP\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Tracking URL base</label><input class=\"ims__input\" type=\"text\" id=\"ims-cur-url\" value=\"${util().sanitize(c?.tracking_url_base||'')}\" placeholder=\"e.g. https://www.dhl.com/track?id=\"><span class=\"ims__input-hint\">Enter URL up to where tracking number begins.</span></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Requires postcode?</label><select class=\"ims__select\" id=\"ims-cur-postcode\"><option value=\"false\" ${!c?.requires_postcode?'selected':''}>No</option><option value=\"true\" ${c?.requires_postcode?'selected':''}>Yes</option></select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Postcode URL parameter</label><input class=\"ims__input\" type=\"text\" id=\"ims-cur-pc-param\" value=\"${util().sanitize(c?.postcode_param||'')}\" placeholder=\"e.g. &postcode=\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Tracking page type</label><select class=\"ims__select\" id=\"ims-cur-formonly\"><option value=\"false\" ${!c?.tracking_form_only?'selected':''}>Direct link - tracking number goes in the URL</option><option value=\"true\" ${c?.tracking_form_only?'selected':''}>Form only - staff paste details into the courier's page</option></select><span class=\"ims__input-hint\">Choose \"Form only\" when the courier's result page uses a generated token that cannot be linked to directly (e.g. V1 Distribution). The tracking button then copies the tracking number and opens their form.</span></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">DIM factor</label><input class=\"ims__input\" type=\"number\" id=\"ims-cur-dim\" value=\"${c?.dim_factor||5000}\"><span class=\"ims__input-hint\">L\u00D7W\u00D7H \u00F7 DIM factor = volumetric weight</span></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Customer services email</label><input class=\"ims__input\" type=\"email\" id=\"ims-cur-cs\" value=\"${util().sanitize(c?.cs_email||'')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Claims email</label><input class=\"ims__input\" type=\"email\" id=\"ims-cur-claims\" value=\"${util().sanitize(c?.claims_email||'')}\"></div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveCourier('${util().jsArg(existingId||'')}')\"><i class=\"ti ti-check\"></i> ${existingId?'Save changes':'Save & set up rates'}</button>\n    `,'lg');\n  }\n\n  async function saveCourier(existingId){\n    const g=id=>document.getElementById(id)?.value?.trim()||'';\n    const name=g('ims-cur-name');\n    if(!name){ui().toast('Courier name is required','error');return;}\n    const data={name,tracking_url_base:g('ims-cur-url')||null,requires_postcode:g('ims-cur-postcode')==='true',postcode_param:g('ims-cur-pc-param')||null,tracking_form_only:g('ims-cur-formonly')==='true',dim_factor:parseFloat(g('ims-cur-dim'))||5000,cs_email:g('ims-cur-cs')||null,claims_email:g('ims-cur-claims')||null,auto_track_failures:0};\n    let savedId=existingId;\n    if(existingId){\n      const {error}=await db().update('couriers',existingId,data);\n      if(error){ui().toast('Failed: '+error.message,'error');return;}\n      ui().closeModal();ui().toast('Courier updated','success');loadCouriers();\n    } else {\n      const {data:newCourier,error}=await db().insert('couriers',data);\n      if(error){ui().toast('Failed: '+error.message,'error');return;}\n      savedId=newCourier.id;\n      ui().closeModal();\n      ui().toast('Courier saved \u2014 now set up freight rates','success');\n      setTimeout(()=>manageCourierRates(savedId,name),400);\n    }\n  }\n\n  async function _manageWeightRates(courierId,courierName){\n    const {data:bands}=await db().select('courier_rate_bands',{eq:{courier_id:courierId},order:{col:'weight_from'},noCompanyFilter:true});\n    const {data:surcharges}=await db().select('courier_surcharges',{eq:{courier_id:courierId},noCompanyFilter:true});\n    const items=bands||[];\n    const surchargeItems=surcharges||[];\n    ui().openModal(`Rates: ${courierName}`,`\n      ${window.SM.AUTH.isAdmin()?`<div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:12px\"><i class=\"ti ti-info-circle\"></i><span>This courier is priced by weight. If it prices by product type and zone instead (like V1), <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.rcCreateCard('${util().jsArg(courierId)}','${util().jsArg(courierName)}')\">Set up a rate card</button></span></div>`:''}\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:10px\">\n        <strong style=\"font-size:13px\">Weight bands</strong>\n        <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.addRateBand('${util().jsArg(courierId)}')\"><i class=\"ti ti-plus\"></i> Add band</button>\n      </div>\n      <div class=\"ims__table-wrap\" style=\"margin-bottom:16px\">\n        <table class=\"ims__table\">\n          <thead><tr><th>From (kg)</th><th>To (kg)</th><th>Base rate (\u00A3)</th><th>Per kg over (\u00A3)</th><th></th></tr></thead>\n          <tbody id=\"ims-rate-bands\">${items.map(b=>`<tr><td>${b.weight_from}</td><td>${b.weight_to||'\u221E'}</td><td>\u00A3${(b.base_rate||0).toFixed(2)}</td><td>${b.per_kg_over?'\u00A3'+b.per_kg_over.toFixed(2):'\u2014'}</td><td><button class=\"ims__btn ims__btn--danger ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.deleteRateBand('${util().jsArg(b.id)}','${util().jsArg(courierId)}','${util().jsArg(courierName)}')\"><i class=\"ti ti-trash\"></i></button></td></tr>`).join('')||'<tr><td colspan=\"5\" class=\"ims__table-empty\">No rate bands configured</td></tr>'}\n          </tbody>\n        </table>\n      </div>\n      <strong style=\"font-size:13px\">Surcharges</strong>\n      <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px\">\n        ${['fuel','remote_area','residential','saturday','peak_season','oversize','insurance'].map(type=>{\n          const s=surchargeItems.find(x=>x.surcharge_type===type);\n          const labels={fuel:'Fuel surcharge',remote_area:'Remote area',residential:'Residential',saturday:'Saturday delivery',peak_season:'Peak season',oversize:'Oversize',insurance:'Insurance/cover'};\n          return `<div style=\"display:flex;align-items:center;justify-content:space-between;padding:8px;background:var(--ims-surface2);border-radius:var(--ims-radius);border:1px solid var(--ims-border)\"><div><div style=\"font-size:12px;font-weight:500\">${labels[type]}</div><div style=\"font-size:11px;color:var(--ims-text-muted)\">${s?util().formatCurrency(s.value)+' '+(s.value_type==='percent'?'%':'flat'):'Not set'}</div></div><div style=\"display:flex;gap:4px;align-items:center\">${s?`<span class=\"ims__pill ims__pill--${s.is_active?'success':'neutral'}\">${s.is_active?'On':'Off'}</span>`:''}<button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.editSurcharge('${util().jsArg(courierId)}','${util().jsArg(type)}','${util().jsArg(courierName)}')\"><i class=\"ti ti-edit\"></i></button></div></div>`;\n        }).join('')}\n      </div>\n    `,`<button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal()\">Close</button>`,'lg');\n  }\n\n  // \u2500\u2500\u2500 SERVICES PRICE LIST \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Services sold to customers (assembly, old furniture removal...): your\n  // customer price, per order or per item, and an optional own-van cost\n  // (e.g. a tip fee). A courier's cost for the same service lives in its\n  // rate card (Extras), linked to the service. Everyone can view; only an\n  // Admin can change.\n  async function loadServices(){\n    const content=document.getElementById('ims-log-content'); if(!content) return;\n    const {data:svcs,error}=await _rcDb().from('services').select('*').eq('company_id',window.SM.AUTH.company?.id).order('sort_order',{ascending:true});\n    if(error){ content.innerHTML=`<div class=\"ims__alert ims__alert--warning\"><i class=\"ti ti-alert-triangle\"></i><span>Services could not be loaded (${util().sanitize(error.message)}).</span></div>`; return; }\n    const adm=_rcAdmin(), dis=adm?'':'disabled';\n    content.innerHTML=`\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;gap:10px;flex-wrap:wrap\">\n        <div style=\"font-size:12px;color:var(--ims-text-muted);max-width:640px\">Your prices for services sold to customers. Prices follow each order's VAT setting. The courier's cost for the same service is in its rate card (Extras), linked to the service.${adm?'':' <strong>View only: only an Admin can change prices.</strong>'}</div>\n        <span id=\"ims-svc-saved\" style=\"font-size:11px;color:var(--ims-text-muted)\"></span>\n      </div>\n      <div class=\"ims__table-wrap\"><table class=\"ims__table\">\n        <thead><tr><th>Service</th><th style=\"width:130px\">Customer price (\u00A3)</th><th style=\"width:140px\">Charged per</th><th style=\"width:150px\">Own-van cost (\u00A3)</th><th style=\"width:90px\">Active</th></tr></thead>\n        <tbody>${(svcs||[]).map(v=>`<tr>\n          <td><input class=\"ims__input ims__input--sm\" value=\"${util().sanitize(v.name)}\" ${dis} onchange=\"window.IMS_LOGISTICS.saveService('${v.id}','name',this.value)\"></td>\n          <td><input class=\"ims__input ims__input--sm\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${v.customer_price??0}\" ${dis} onchange=\"window.IMS_LOGISTICS.saveService('${v.id}','customer_price',this.value)\"></td>\n          <td><select class=\"ims__select\" style=\"font-size:12px\" ${dis} onchange=\"window.IMS_LOGISTICS.saveService('${v.id}','per',this.value)\"><option value=\"order\" ${v.per==='order'?'selected':''}>Per order</option><option value=\"item\" ${v.per==='item'?'selected':''}>Per item</option></select></td>\n          <td><input class=\"ims__input ims__input--sm\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${v.own_van_cost??''}\" placeholder=\"none\" ${dis} onchange=\"window.IMS_LOGISTICS.saveService('${v.id}','own_van_cost',this.value)\"></td>\n          <td><input type=\"checkbox\" ${v.is_active?'checked':''} ${dis} onchange=\"window.IMS_LOGISTICS.saveService('${v.id}','is_active',this.checked)\"></td>\n        </tr>`).join('')||'<tr><td colspan=\"5\" class=\"ims__table-empty\">No services yet</td></tr>'}</tbody>\n      </table></div>\n      ${adm?`<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" style=\"margin-top:8px\" onclick=\"window.IMS_LOGISTICS.addService()\"><i class=\"ti ti-plus\"></i> Add service</button>`:''}`;\n  }\n  async function saveService(id, field, value){\n    if(!_rcAdmin()) return;\n    let v=value;\n    if(field==='customer_price') v=_rcNum(value)??0;\n    if(field==='own_van_cost') v=_rcNum(value);\n    if(field==='name'){ v=String(value||'').trim(); if(!v){ ui().toast('A service needs a name','warning'); return; } }\n    const {error}=await _rcDb().from('services').update({[field]:v}).eq('id',id);\n    if(error){ ui().toast('Not saved: '+error.message,'error',8000); return; }\n    const el=document.getElementById('ims-svc-saved'); if(el) el.textContent='Saved '+new Date().toLocaleTimeString().slice(0,5);\n  }\n  async function addService(){\n    if(!_rcAdmin()) return;\n    const db_=_rcDb(), co=window.SM.AUTH.company?.id;\n    const {data:ex}=await db_.from('services').select('id').eq('company_id',co);\n    const {error}=await db_.from('services').insert({company_id:co,name:'New service',customer_price:0,per:'order',sort_order:(ex||[]).length});\n    if(error){ ui().toast('Not saved: '+error.message,'error',8000); return; }\n    loadServices();\n  }\n\n  // Driver tasks on a manifest stop: each service on the order, confirmed\n  // done or not done. Not done flags the order (refund is a separate step,\n  // from the order itself; nothing is refunded automatically).\n  async function setServiceStatus(itemId, status, orderId, serviceName, manifestId){\n    const r=await _deliveryApi('task',{order_item_id:itemId,status});\n    if(r.error){ ui().toast(r.error,'error',8000); return; }\n    if(status==='not_done') ui().toast(`${serviceName} marked NOT done. If the customer paid for it, refund it from the order.`,'warning',9000);\n    else ui().toast(`${serviceName}: done.${r.own_van_cost>0?` Own-van cost ${util().formatCurrency(r.own_van_cost)} recorded.`:''}`,'success',r.own_van_cost>0?7000:4000);\n    if(manifestId) openManifest(manifestId);\n  }\n\n\n  // \u2500\u2500\u2500 COURIER RATE CARDS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // For couriers that price by product type and zone (e.g. V1). Set once\n  // per courier: zones (with postcodes), product types (with an optional\n  // weight limit) and which product is which type. Per dated version\n  // (\"valid from\"): the prices grid, extras (our cost), floor charges, fuel\n  // %, VAT and collections settings, so older deliveries are always\n  // checked against the rates in force at the time. Couriers without a\n  // rate card keep the weight-band screen. Everyone can view; only an\n  // Admin can change (the database enforces this too).\n  const RC_HIGHLANDS = ['AB31','AB32','AB33','AB34','AB35','AB36','AB37','AB38','AB44','AB45','AB46','AB47','AB48','AB49','AB50','AB51','AB52','AB53','AB54','AB55','AB56','FK17','FK18','FK19','FK20','FK21','G83','IV1','IV2','IV3','IV4','IV5','IV6','IV7','IV8','IV9','IV10','IV11','IV12','IV13','IV14','IV15','IV16','IV17','IV18','IV19','IV20','IV21','IV22','IV23','IV24','IV25','IV26','IV27','IV28','IV30','IV31','IV32','IV36','IV40','IV52','IV53','IV54','IV63','KW1','KW2','KW3','KW4','KW5','KW6','KW7','KW8','KW9','KW10','KW11','KW12','KW13','KW14','PA21','PA22','PA23','PA24','PA25','PA26','PA27','PA28','PA29','PA30','PA31','PA32','PA33','PA34','PA35','PA36','PA37','PA38','PA39','PA40','PH17','PH18','PH19','PH20','PH21','PH22','PH23','PH24','PH25','PH26','PH30','PH31','PH32','PH33','PH34','PH35','PH36','PH37','PH38','PH39','PH40','PH41','PH49','PH50'];\n  const RC_NOT_DELIVERED = ['BT','IM','JE','GY','HS','ZE','KW15','KW16','KW17','IV41','IV42','IV43','IV44','IV45','IV46','IV47','IV48','IV49','IV50','IV51','IV55','IV56','PA20','PA41','PA42','PA43','PA44','PA45','PA46','PA47','PA48','PA49','PA60','PA61','PA62','PA63','PA64','PA65','PA66','PA67','PA68','PA69','PA70','PA71','PA72','PA73','PA74','PA75','PA76','PA77','PA78','KA27','KA28','PH42','PH43','PH44','PO30','PO31','PO32','PO33','PO34','PO35','PO36','PO37','PO38','PO39','PO40','PO41','TR21','TR22','TR23','TR24','TR25'];\n  let _rc = null;\n  const _rcDb = () => window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n  const _rcAdmin = () => window.SM.AUTH.isAdmin();\n  const _rcPc = v => String(v || '').toUpperCase().replace(/\\s+/g, '');\n  const _rcValidPrefix = p => /^[A-Z]{1,2}(\\d{1,2}[A-Z]?)?$/.test(p);\n  const _rcToday = () => new Date().toISOString().split('T')[0];\n  const _rcNum = v => (v === '' || v === null || v === undefined || isNaN(parseFloat(v))) ? null : Math.round(parseFloat(v) * 100) / 100;\n  const _rcSortPc = (a, b) => { const m = x => x.match(/^([A-Z]+)(\\d*)(.*)$/) || [x, x, '', '']; const A = m(a), B = m(b); return A[1].localeCompare(B[1]) || (parseInt(A[2] || 0) - parseInt(B[2] || 0)) || A[3].localeCompare(B[3]); };\n  function _rcSaved(err) {\n    if (err) { ui().toast('Not saved: ' + (err.message || err), 'error', 8000); return false; }\n    const el = document.getElementById('ims-rc-saved'); if (el) el.textContent = 'Saved ' + new Date().toLocaleTimeString().slice(0, 5);\n    return true;\n  }\n\n  async function manageCourierRates(courierId, courierName) {\n    const { data: cards } = await _rcDb().from('courier_rate_cards').select('id,pricing_method').eq('courier_id', courierId);\n    if (!(cards || []).some(c => c.pricing_method === 'type_zone')) return _manageWeightRates(courierId, courierName);\n    _rc = { courierId, courierName, companyId: window.SM.AUTH.company?.id, tab: 'prices', cardId: null, prodSearch: '', prodMissing: false };\n    await _rcLoad();\n    _rcOpen();\n  }\n\n  // Switch a weight-priced courier to a rate card: standard zones pre-filled.\n  async function rcCreateCard(courierId, courierName) {\n    if (!_rcAdmin()) { ui().toast('Only an Admin can change courier rates', 'error'); return; }\n    ui().confirm(`Set up a rate card for <strong>${util().sanitize(courierName)}</strong>, priced by product type and zone? Zones start pre-filled (Mainland, Highlands and remote, Not delivered); you then add product types and prices. Its weight bands stay saved.`, async () => {\n      const db_ = _rcDb(), co = window.SM.AUTH.company?.id;\n      const z = async (name, kind, sort) => (await db_.from('courier_zones').insert({ company_id: co, courier_id: courierId, name, kind, sort_order: sort }).select('id').single()).data?.id;\n      const { data: hasZones } = await db_.from('courier_zones').select('id').eq('courier_id', courierId).limit(1);\n      if (!(hasZones || []).length) {\n        await z('Mainland', 'default', 0);\n        const hi = await z('Highlands and remote', 'zone', 1), no = await z('Not delivered', 'not_served', 2);\n        const rows = [...RC_HIGHLANDS.map(p => ({ prefix: p, zone_id: hi })), ...RC_NOT_DELIVERED.map(p => ({ prefix: p, zone_id: no }))]\n          .map(r => ({ ...r, company_id: co, courier_id: courierId }));\n        const { error } = await db_.from('courier_zone_postcodes').insert(rows);\n        if (error) { ui().toast('Zones could not be set up: ' + error.message, 'error', 8000); return; }\n      }\n      const { error } = await db_.from('courier_rate_cards').insert({ company_id: co, courier_id: courierId, pricing_method: 'type_zone', valid_from: _rcToday() });\n      if (error) { ui().toast('The rate card could not be created: ' + error.message, 'error', 8000); return; }\n      ui().toast(`${courierName}: rate card created`, 'success');\n      manageCourierRates(courierId, courierName);\n    }, 'Set up rate card', false);\n  }\n\n  async function _rcLoad() {\n    const db_ = _rcDb(), id = _rc.courierId;\n    const [cards, zones, pcs, types] = await Promise.all([\n      db_.from('courier_rate_cards').select('*').eq('courier_id', id).eq('pricing_method', 'type_zone').order('valid_from', { ascending: false }),\n      db_.from('courier_zones').select('*').eq('courier_id', id).order('sort_order', { ascending: true }),\n      db_.from('courier_zone_postcodes').select('id,zone_id,prefix').eq('courier_id', id),\n      db_.from('courier_product_types').select('*').eq('courier_id', id).order('sort_order', { ascending: true })\n    ]);\n    _rc.cards = cards.data || []; _rc.zones = zones.data || []; _rc.pcs = pcs.data || []; _rc.types = types.data || [];\n    const inForce = _rc.cards.find(c => String(c.valid_from) <= _rcToday()) || _rc.cards[_rc.cards.length - 1];\n    if (!_rc.cardId || !_rc.cards.some(c => c.id === _rc.cardId)) _rc.cardId = inForce?.id || null;\n    _rc.inForceId = inForce?.id || null;\n    const [rates, extras] = await Promise.all([\n      db_.from('courier_card_rates').select('*').eq('card_id', _rc.cardId),\n      db_.from('courier_card_extras').select('*').eq('card_id', _rc.cardId).order('sort_order', { ascending: true })\n    ]);\n    _rc.rates = rates.data || []; _rc.extras = extras.data || [];\n    const { data: svcs } = await db_.from('services').select('id,name').eq('company_id', _rc.companyId).order('sort_order', { ascending: true });\n    _rc.services = svcs || [];\n  }\n\n  function _rcCard() { return _rc.cards.find(c => c.id === _rc.cardId) || {}; }\n  function _rcDis() { return _rcAdmin() ? '' : 'disabled'; }\n\n  function _rcOpen() {\n    const tabs = [['prices', 'Prices'], ['zones', 'Zones'], ['products', 'Products'], ['extras', 'Extras'], ['settings', 'Settings']];\n    ui().openModal(`Rate card: ${_rc.courierName}`, `\n      <div style=\"display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;margin-bottom:10px\">\n        <div style=\"display:flex;gap:8px;align-items:center;flex-wrap:wrap\">\n          <label class=\"ims__label\" style=\"margin:0\">Rates</label>\n          <select class=\"ims__select\" style=\"width:auto\" onchange=\"window.IMS_LOGISTICS.rcSelectCard(this.value)\">\n            ${_rc.cards.map(c => `<option value=\"${c.id}\" ${c.id === _rc.cardId ? 'selected' : ''}>valid from ${util().formatDate(c.valid_from)}${c.id === _rc.inForceId ? ' (in force)' : String(c.valid_from) > _rcToday() ? ' (future)' : ' (older)'}</option>`).join('')}\n          </select>\n          ${_rcAdmin() ? `<input class=\"ims__input\" type=\"date\" id=\"ims-rc-newdate\" style=\"width:auto\"><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.rcNewVersion()\" title=\"Copy these rates into a new version from the chosen date (e.g. when the courier sends a new price list)\"><i class=\"ti ti-copy\"></i> New rates from date</button>` : ''}\n        </div>\n        <span id=\"ims-rc-saved\" style=\"font-size:11px;color:var(--ims-text-muted)\">${_rcAdmin() ? 'Changes save as you go' : 'View only: only an Admin can change rates'}</span>\n      </div>\n      <div class=\"ims__tabs\" id=\"ims-rc-tabs\" style=\"margin-bottom:12px\">\n        ${tabs.map(([k, l]) => `<button class=\"ims__tab ${k === _rc.tab ? 'ims__tab--active' : ''}\" data-tab=\"${k}\" onclick=\"window.IMS_LOGISTICS.rcTab('${k}')\">${l}</button>`).join('')}\n      </div>\n      <div id=\"ims-rc-body\"></div>\n    `, `<button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal()\">Close</button>`, 'xl');\n    _rcRenderTab();\n  }\n\n  function rcTab(tab) {\n    _rc.tab = tab;\n    document.querySelectorAll('#ims-rc-tabs .ims__tab').forEach(b => b.classList.toggle('ims__tab--active', b.dataset.tab === tab));\n    _rcRenderTab();\n  }\n  async function rcSelectCard(cardId) { _rc.cardId = cardId; await _rcLoad(); _rcOpen(); }\n\n  function _rcRenderTab() {\n    const body = document.getElementById('ims-rc-body'); if (!body) return;\n    if (_rc.tab === 'prices') body.innerHTML = _rcPricesHtml();\n    else if (_rc.tab === 'zones') body.innerHTML = _rcZonesHtml();\n    else if (_rc.tab === 'extras') body.innerHTML = _rcExtrasHtml();\n    else if (_rc.tab === 'settings') body.innerHTML = _rcSettingsHtml();\n    else if (_rc.tab === 'products') { body.innerHTML = '<div class=\"ims__loading\"><i class=\"ti ti-loader-2 ims__spin\"></i></div>'; _rcProducts(); }\n  }\n\n  // \u2500\u2500 Prices (types x zones) \u2500\u2500\n  function _rcPricesHtml() {\n    const zones = _rc.zones.filter(z => z.kind !== 'not_served'); const dis = _rcDis(); const card = _rcCard();\n    const price = (t, z) => _rc.rates.find(r => r.type_id === t && r.zone_id === z)?.price;\n    return `\n      <div style=\"font-size:12px;color:var(--ims-text-muted);margin-bottom:8px\">Prices ${card.prices_exclude_vat ? '<strong>exclude VAT</strong>' : 'include VAT'}; fuel ${card.fuel_pct || 0}% is added on top. A blank price means \"no price set yet\".</div>\n      <div class=\"ims__table-wrap\"><table class=\"ims__table\">\n        <thead><tr><th>Product type</th><th style=\"width:90px\">Up to kg</th>${zones.map(z => `<th style=\"width:120px\">${util().sanitize(z.name)} (\u00A3)</th>`).join('')}<th></th></tr></thead>\n        <tbody>${_rc.types.map(t => `<tr>\n          <td><input class=\"ims__input ims__input--sm\" value=\"${util().sanitize(t.name)}\" ${dis} onchange=\"window.IMS_LOGISTICS.rcSaveType('${t.id}','name',this.value)\"></td>\n          <td><input class=\"ims__input ims__input--sm\" type=\"number\" min=\"0\" step=\"1\" value=\"${t.max_weight_kg ?? ''}\" placeholder=\"-\" ${dis} onchange=\"window.IMS_LOGISTICS.rcSaveType('${t.id}','max_weight_kg',this.value)\"></td>\n          ${zones.map(z => `<td><input class=\"ims__input ims__input--sm\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${price(t.id, z.id) ?? ''}\" placeholder=\"not set\" ${dis} onchange=\"window.IMS_LOGISTICS.rcSavePrice('${t.id}','${z.id}',this.value)\"></td>`).join('')}\n          <td>${_rcAdmin() ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm ims__btn--icon\" title=\"Delete this type\" onclick=\"window.IMS_LOGISTICS.rcDeleteType('${t.id}','${util().jsArg(t.name)}')\"><i class=\"ti ti-trash\"></i></button>` : ''}</td>\n        </tr>`).join('') || `<tr><td colspan=\"${zones.length + 3}\" class=\"ims__table-empty\">No product types yet</td></tr>`}</tbody>\n      </table></div>\n      ${_rcAdmin() ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" style=\"margin-top:8px\" onclick=\"window.IMS_LOGISTICS.rcAddType()\"><i class=\"ti ti-plus\"></i> Add product type</button>` : ''}`;\n  }\n  async function rcSaveType(typeId, field, value) {\n    if (!_rcAdmin()) return;\n    const v = field === 'max_weight_kg' ? _rcNum(value) : String(value || '').trim();\n    if (field === 'name' && !v) { ui().toast('A product type needs a name', 'warning'); return; }\n    const { error } = await _rcDb().from('courier_product_types').update({ [field]: v }).eq('id', typeId);\n    if (_rcSaved(error)) { const t = _rc.types.find(x => x.id === typeId); if (t) t[field] = v; }\n  }\n  async function rcSavePrice(typeId, zoneId, value) {\n    if (!_rcAdmin()) return;\n    const price = _rcNum(value); const db_ = _rcDb();\n    const ex = _rc.rates.find(r => r.type_id === typeId && r.zone_id === zoneId);\n    const res = ex ? await db_.from('courier_card_rates').update({ price }).eq('id', ex.id).select('*')\n                   : await db_.from('courier_card_rates').insert({ company_id: _rc.companyId, card_id: _rc.cardId, type_id: typeId, zone_id: zoneId, price }).select('*');\n    if (_rcSaved(res.error)) { if (ex) ex.price = price; else if (res.data?.[0]) _rc.rates.push(res.data[0]); }\n  }\n  async function rcAddType() {\n    if (!_rcAdmin()) return;\n    const { data, error } = await _rcDb().from('courier_product_types').insert({ company_id: _rc.companyId, courier_id: _rc.courierId, name: 'New product type', sort_order: _rc.types.length }).select('*');\n    if (_rcSaved(error) && data?.[0]) { _rc.types.push(data[0]); _rcRenderTab(); }\n  }\n  function rcDeleteType(typeId, name) {\n    if (!_rcAdmin()) return;\n    ui().confirm(`Delete the product type <strong>${util().sanitize(name)}</strong>? Its prices (in every version) and its product links are removed too.`, async () => {\n      const { error } = await _rcDb().from('courier_product_types').delete().eq('id', typeId);\n      if (_rcSaved(error)) { await _rcLoad(); _rcOpen(); }\n    }, 'Delete', true);\n  }\n\n  // \u2500\u2500 Zones \u2500\u2500\n  function _rcZonesHtml() {\n    const dis = _rcDis();\n    return `\n      <div style=\"font-size:12px;color:var(--ims-text-muted);margin-bottom:10px\">A postcode matches its most specific entry: a district (PH19) beats an area (PH). Anything not listed falls in the default zone. Adding a postcode that is in another zone moves it.</div>\n      ${_rc.zones.map(z => {\n        const list = _rc.pcs.filter(p => p.zone_id === z.id).map(p => p.prefix).sort(_rcSortPc);\n        return `<div class=\"ims__card\" style=\"margin-bottom:10px\">\n          <div style=\"display:flex;gap:8px;align-items:center;justify-content:space-between;margin-bottom:6px\">\n            <div style=\"display:flex;gap:8px;align-items:center\">\n              <input class=\"ims__input ims__input--sm\" style=\"width:220px;font-weight:600\" value=\"${util().sanitize(z.name)}\" ${dis} onchange=\"window.IMS_LOGISTICS.rcRenameZone('${z.id}',this.value)\">\n              <span class=\"ims__pill ims__pill--${z.kind === 'not_served' ? 'danger' : z.kind === 'default' ? 'success' : 'info'}\" style=\"font-size:10px\">${z.kind === 'default' ? 'Default: everything else' : z.kind === 'not_served' ? 'Not delivered' : list.length + ' postcodes'}</span>\n            </div>\n            ${_rcAdmin() && z.kind !== 'default' ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm ims__btn--icon\" title=\"Delete zone\" onclick=\"window.IMS_LOGISTICS.rcDeleteZone('${z.id}','${util().jsArg(z.name)}')\"><i class=\"ti ti-trash\"></i></button>` : ''}\n          </div>\n          ${z.kind === 'default' ? '<div style=\"font-size:12px;color:var(--ims-text-muted)\">Every postcode not listed in another zone.</div>' : `\n          <div style=\"display:flex;flex-wrap:wrap;gap:4px;max-height:140px;overflow:auto;margin-bottom:6px\">\n            ${list.map(p => `<span class=\"ims__pill ims__pill--neutral\" style=\"font-size:11px\">${p}${_rcAdmin() ? ` <a href=\"javascript:void(0)\" style=\"text-decoration:none;color:inherit\" title=\"Remove\" onclick=\"window.IMS_LOGISTICS.rcRemovePostcode('${util().jsArg(p)}')\">&times;</a>` : ''}</span>`).join('') || '<span style=\"font-size:12px;color:var(--ims-text-muted)\">No postcodes yet</span>'}\n          </div>\n          ${_rcAdmin() ? `<div style=\"display:flex;gap:6px\"><input class=\"ims__input ims__input--sm\" id=\"ims-rc-add-${z.id}\" placeholder=\"Add postcodes, e.g. IV1, PH19, HS\" style=\"max-width:320px\"><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.rcAddPostcodes('${z.id}')\">Add</button></div>` : ''}`}\n        </div>`;\n      }).join('')}\n      ${_rcAdmin() ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.rcAddZone()\"><i class=\"ti ti-plus\"></i> Add zone</button>` : ''}`;\n  }\n  async function rcRenameZone(zoneId, name) {\n    if (!_rcAdmin()) return; name = String(name || '').trim(); if (!name) { ui().toast('A zone needs a name', 'warning'); return; }\n    const { error } = await _rcDb().from('courier_zones').update({ name }).eq('id', zoneId);\n    if (_rcSaved(error)) { const z = _rc.zones.find(x => x.id === zoneId); if (z) z.name = name; }\n  }\n  async function rcAddPostcodes(zoneId) {\n    if (!_rcAdmin()) return;\n    const input = document.getElementById('ims-rc-add-' + zoneId);\n    const wanted = [...new Set(String(input?.value || '').split(/[\\s,;]+/).map(_rcPc).filter(Boolean))];\n    if (!wanted.length) return;\n    const bad = wanted.filter(p => !_rcValidPrefix(p));\n    if (bad.length) { ui().toast(`Not a postcode area or district: ${bad.join(', ')}. Use the first part only, e.g. IV1 or PH19.`, 'error', 8000); return; }\n    const db_ = _rcDb(); let moved = 0, added = 0;\n    for (const p of wanted) {\n      const ex = _rc.pcs.find(x => x.prefix === p);\n      if (ex && ex.zone_id === zoneId) continue;\n      const res = ex ? await db_.from('courier_zone_postcodes').update({ zone_id: zoneId }).eq('id', ex.id)\n                     : await db_.from('courier_zone_postcodes').insert({ company_id: _rc.companyId, courier_id: _rc.courierId, zone_id: zoneId, prefix: p });\n      if (!_rcSaved(res.error)) break;\n      ex ? moved++ : added++;\n    }\n    if (moved) ui().toast(`${moved} postcode(s) moved here from another zone`, 'info');\n    await _rcLoad(); _rcRenderTab();\n  }\n  async function rcRemovePostcode(prefix) {\n    if (!_rcAdmin()) return;\n    const ex = _rc.pcs.find(x => x.prefix === prefix); if (!ex) return;\n    const { error } = await _rcDb().from('courier_zone_postcodes').delete().eq('id', ex.id);\n    if (_rcSaved(error)) { _rc.pcs = _rc.pcs.filter(x => x.id !== ex.id); _rcRenderTab(); }\n  }\n  async function rcAddZone() {\n    if (!_rcAdmin()) return;\n    const { error } = await _rcDb().from('courier_zones').insert({ company_id: _rc.companyId, courier_id: _rc.courierId, name: 'New zone', kind: 'zone', sort_order: _rc.zones.length });\n    if (_rcSaved(error)) { await _rcLoad(); _rcRenderTab(); }\n  }\n  function rcDeleteZone(zoneId, name) {\n    if (!_rcAdmin()) return;\n    ui().confirm(`Delete the zone <strong>${util().sanitize(name)}</strong>? Its postcodes fall back to the default zone, and its prices (in every version) are removed.`, async () => {\n      const { error } = await _rcDb().from('courier_zones').delete().eq('id', zoneId);\n      if (_rcSaved(error)) { await _rcLoad(); _rcOpen(); }\n    }, 'Delete', true);\n  }\n\n  // \u2500\u2500 Products: which product is which type \u2500\u2500\n  async function _rcProducts() {\n    const db_ = _rcDb();\n    const [prods, boxes, map] = await Promise.all([\n      db_.from('products').select('id,name,sku').eq('company_id', _rc.companyId).order('name', { ascending: true }),\n      db_.from('product_boxes').select('product_id,weight_kg'),\n      db_.from('courier_product_map').select('id,product_id,type_id').eq('courier_id', _rc.courierId)\n    ]);\n    const weight = {}; (boxes.data || []).forEach(b => { weight[b.product_id] = (weight[b.product_id] || 0) + (Number(b.weight_kg) || 0); });\n    _rc.products = (prods.data || []).map(p => ({ ...p, kg: weight[p.id] ? Math.round(weight[p.id] * 100) / 100 : null }));\n    _rc.map = map.data || [];\n    _rcProductsRender();\n  }\n  // The smallest weight band that fits the product's box weight.\n  function _rcSuggest(kg) {\n    if (!kg) return null;\n    return _rc.types.filter(t => t.max_weight_kg != null).sort((a, b) => a.max_weight_kg - b.max_weight_kg).find(t => kg <= t.max_weight_kg) || null;\n  }\n  function _rcProductsRender() {\n    const body = document.getElementById('ims-rc-body'); if (!body || _rc.tab !== 'products') return;\n    const typeOf = pid => _rc.map.find(m => m.product_id === pid)?.type_id || '';\n    const q = _rc.prodSearch.toLowerCase();\n    const list = _rc.products.filter(p => (!q || `${p.name} ${p.sku}`.toLowerCase().includes(q)) && (!_rc.prodMissing || !typeOf(p.id)));\n    const shown = list.slice(0, 300);\n    const missing = _rc.products.filter(p => !typeOf(p.id)).length;\n    const sugg = _rc.products.filter(p => !typeOf(p.id) && _rcSuggest(p.kg)).length;\n    const opts = sel => `<option value=\"\">- none -</option>` + _rc.types.map(t => `<option value=\"${t.id}\" ${t.id === sel ? 'selected' : ''}>${util().sanitize(t.name)}</option>`).join('');\n    const dis = _rcDis();\n    body.innerHTML = `\n      <div style=\"display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:8px\">\n        <input class=\"ims__input ims__input--sm\" style=\"max-width:220px\" placeholder=\"Search name or SKU\" value=\"${util().sanitize(_rc.prodSearch)}\" oninput=\"window.IMS_LOGISTICS.rcProdFilter(this.value,null)\">\n        <label style=\"font-size:12px;display:flex;gap:4px;align-items:center\"><input type=\"checkbox\" ${_rc.prodMissing ? 'checked' : ''} onchange=\"window.IMS_LOGISTICS.rcProdFilter(null,this.checked)\"> Only without a type (${missing})</label>\n        <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.rcExportProducts()\"><i class=\"ti ti-download\"></i> Export to Excel</button>\n        ${_rcAdmin() ? `<label class=\"ims__btn ims__btn--ghost ims__btn--sm\" style=\"cursor:pointer\"><i class=\"ti ti-upload\"></i> Import<input type=\"file\" accept=\".csv\" style=\"display:none\" onchange=\"window.IMS_LOGISTICS.rcImportProducts(this)\"></label>` : ''}\n      </div>\n      ${_rcAdmin() ? `<div style=\"display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:8px\">\n        <span style=\"font-size:12px\">Selected:</span><select class=\"ims__select\" id=\"ims-rc-bulk\" style=\"width:auto;font-size:12px\">${opts('')}</select>\n        <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.rcBulkSet()\">Set selected</button>\n        ${sugg ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.rcApplySuggestions()\" title=\"Products without a type, using their box weight\">Use all weight suggestions (${sugg})</button>` : ''}\n      </div>` : ''}\n      <div class=\"ims__table-wrap\" style=\"max-height:55vh;overflow:auto\"><table class=\"ims__table\">\n        <thead><tr>${_rcAdmin() ? '<th style=\"width:28px\"><input type=\"checkbox\" onchange=\"document.querySelectorAll(\\'.ims-rc-pick\\').forEach(c=>c.checked=this.checked)\"></th>' : ''}<th>Product</th><th>SKU</th><th>Weight</th><th>${util().sanitize(_rc.courierName)} type</th></tr></thead>\n        <tbody>${shown.map(p => { const cur = typeOf(p.id), sg = !cur ? _rcSuggest(p.kg) : null; return `<tr>\n          ${_rcAdmin() ? `<td><input type=\"checkbox\" class=\"ims-rc-pick\" value=\"${p.id}\"></td>` : ''}\n          <td>${util().sanitize(p.name || '-')}</td><td style=\"font-size:12px\">${util().sanitize(p.sku || '-')}</td>\n          <td style=\"font-size:12px\">${p.kg != null ? p.kg + ' kg' : '-'}</td>\n          <td><select class=\"ims__select\" style=\"font-size:12px;width:auto;max-width:260px\" ${dis} onchange=\"window.IMS_LOGISTICS.rcSetType('${p.id}',this.value)\">${opts(cur)}</select>\n            ${sg && _rcAdmin() ? ` <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.rcSetType('${p.id}','${sg.id}')\" title=\"From its box weight\">Suggested: ${util().sanitize(sg.name)}</button>` : ''}</td>\n        </tr>`; }).join('') || '<tr><td colspan=\"5\" class=\"ims__table-empty\">No products match</td></tr>'}</tbody>\n      </table></div>\n      ${list.length > shown.length ? `<div style=\"font-size:12px;color:var(--ims-text-muted);margin-top:6px\">Showing ${shown.length} of ${list.length}: search to narrow down.</div>` : ''}`;\n  }\n  function rcProdFilter(search, missing) {\n    if (search !== null) _rc.prodSearch = search;\n    if (missing !== null) _rc.prodMissing = missing;\n    _rcProductsRender();\n    if (search !== null) { const el = document.querySelector('#ims-rc-body input[placeholder=\"Search name or SKU\"]'); if (el) { el.focus(); el.setSelectionRange(el.value.length, el.value.length); } }\n  }\n  async function _rcSetMany(pairs) {   // [[productId, typeId or ''], ...]\n    const db_ = _rcDb(); let done = 0;\n    for (const [pid, tid] of pairs) {\n      const ex = _rc.map.find(m => m.product_id === pid);\n      let res;\n      if (!tid) { if (!ex) continue; res = await db_.from('courier_product_map').delete().eq('id', ex.id); if (!res.error) _rc.map = _rc.map.filter(m => m.id !== ex.id); }\n      else if (ex) { if (ex.type_id === tid) continue; res = await db_.from('courier_product_map').update({ type_id: tid }).eq('id', ex.id); if (!res.error) ex.type_id = tid; }\n      else { res = await db_.from('courier_product_map').insert({ company_id: _rc.companyId, courier_id: _rc.courierId, product_id: pid, type_id: tid }).select('id,product_id,type_id'); if (!res.error && res.data?.[0]) _rc.map.push(res.data[0]); }\n      if (!_rcSaved(res.error)) break;\n      done++;\n    }\n    return done;\n  }\n  async function rcSetType(productId, typeId) { if (!_rcAdmin()) return; await _rcSetMany([[productId, typeId]]); _rcProductsRender(); }\n  async function rcBulkSet() {\n    if (!_rcAdmin()) return;\n    const tid = document.getElementById('ims-rc-bulk')?.value || '';\n    const ids = [...document.querySelectorAll('.ims-rc-pick:checked')].map(c => c.value);\n    if (!ids.length) { ui().toast('Tick the products to change first', 'warning'); return; }\n    const n = await _rcSetMany(ids.map(id => [id, tid]));\n    ui().toast(`${n} product(s) updated`, 'success'); _rcProductsRender();\n  }\n  async function rcApplySuggestions() {\n    if (!_rcAdmin()) return;\n    const pairs = _rc.products.filter(p => !_rc.map.some(m => m.product_id === p.id)).map(p => [p.id, _rcSuggest(p.kg)?.id]).filter(x => x[1]);\n    const n = await _rcSetMany(pairs);\n    ui().toast(`${n} product(s) set from their box weight`, 'success'); _rcProductsRender();\n  }\n  function rcExportProducts() {\n    const typeName = pid => { const m = _rc.map.find(x => x.product_id === pid); return m ? (_rc.types.find(t => t.id === m.type_id)?.name || '') : ''; };\n    const rows = _rc.products.map(p => [p.sku || '', p.name || '', p.kg ?? '', typeName(p.id), typeName(p.id) ? '' : (_rcSuggest(p.kg)?.name || '')]);\n    util().exportCSV(['SKU', 'Product', 'Weight kg', `${_rc.courierName} type`, 'Suggested type'], rows, `${_rc.courierName.replace(/[^A-Za-z0-9]+/g, '_')}_product_types.csv`);\n  }\n  async function rcImportProducts(input) {\n    if (!_rcAdmin()) return;\n    const file = input?.files?.[0]; if (!file) return;\n    const text = await file.text(); input.value = '';\n    const { headers, rows } = util().parseCSV(text);\n    const col = re => headers.findIndex(h => re.test(String(h).trim()));\n    const iSku = col(/^sku$/i), iName = col(/^product$/i), iType = col(/type$/i) >= 0 ? headers.findIndex(h => /type$/i.test(h) && !/^suggested/i.test(h)) : -1;\n    if (iType < 0 || (iSku < 0 && iName < 0)) { ui().toast('The file needs a \"SKU\" (or \"Product\") column and a type column. Use \"Export to Excel\" to get the right layout.', 'error', 9000); return; }\n    const byType = {}; _rc.types.forEach(t => { byType[t.name.trim().toLowerCase()] = t.id; });\n    const pairs = [], unknownType = new Set(), unknownProd = [];\n    for (const r of rows) {\n      const sku = iSku >= 0 ? String(r[iSku] || '').trim() : '', name = iName >= 0 ? String(r[iName] || '').trim() : '';\n      const tname = String(r[iType] || '').trim();\n      const prod = (sku && _rc.products.find(p => (p.sku || '').trim().toLowerCase() === sku.toLowerCase())) || (!sku && name && _rc.products.find(p => (p.name || '').trim().toLowerCase() === name.toLowerCase()));\n      if (!prod) { if (sku || name) unknownProd.push(sku || name); continue; }\n      if (!tname) continue;   // left blank: unchanged\n      const tid = byType[tname.toLowerCase()];\n      if (!tid) { unknownType.add(tname); continue; }\n      pairs.push([prod.id, tid]);\n    }\n    const n = await _rcSetMany(pairs);\n    const notes = [];\n    if (unknownType.size) notes.push(`types not on this rate card: ${[...unknownType].slice(0, 5).join(', ')}`);\n    if (unknownProd.length) notes.push(`${unknownProd.length} row(s) with an unknown SKU/product`);\n    ui().toast(`${n} product(s) updated from the file.${notes.length ? ' Skipped: ' + notes.join('; ') + '.' : ''}`, notes.length ? 'warning' : 'success', notes.length ? 12000 : 5000);\n    _rcProductsRender();\n  }\n\n  // \u2500\u2500 Extras (our cost) \u2500\u2500\n  function _rcExtrasHtml() {\n    const dis = _rcDis();\n    return `\n      <div style=\"font-size:12px;color:var(--ims-text-muted);margin-bottom:8px\">What the courier charges <strong>us</strong> for extra services (your customer prices come later, in the Services list).</div>\n      <div class=\"ims__table-wrap\"><table class=\"ims__table\">\n        <thead><tr><th>Extra service</th><th style=\"width:130px\">Our cost (\u00A3)</th><th style=\"width:150px\">Charged per</th><th style=\"width:220px\">This is our service</th><th></th></tr></thead>\n        <tbody>${_rc.extras.map(e => `<tr>\n          <td><input class=\"ims__input ims__input--sm\" value=\"${util().sanitize(e.name)}\" ${dis} onchange=\"window.IMS_LOGISTICS.rcSaveExtra('${e.id}','name',this.value)\"></td>\n          <td><input class=\"ims__input ims__input--sm\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${e.price ?? ''}\" ${dis} onchange=\"window.IMS_LOGISTICS.rcSaveExtra('${e.id}','price',this.value)\"></td>\n          <td><select class=\"ims__select\" style=\"font-size:12px\" ${dis} onchange=\"window.IMS_LOGISTICS.rcSaveExtra('${e.id}','per',this.value)\"><option value=\"order\" ${e.per === 'order' ? 'selected' : ''}>Per order</option><option value=\"item\" ${e.per === 'item' ? 'selected' : ''}>Per item</option></select></td>\n          <td><select class=\"ims__select\" style=\"font-size:12px\" ${dis} onchange=\"window.IMS_LOGISTICS.rcSaveExtra('${e.id}','service_id',this.value)\"><option value=\"\">- not linked -</option>${(_rc.services || []).map(v => `<option value=\"${v.id}\" ${v.id === e.service_id ? 'selected' : ''}>${util().sanitize(v.name)}</option>`).join('')}</select></td>\n          <td>${_rcAdmin() ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm ims__btn--icon\" title=\"Delete\" onclick=\"window.IMS_LOGISTICS.rcDeleteExtra('${e.id}','${util().jsArg(e.name)}')\"><i class=\"ti ti-trash\"></i></button>` : ''}</td>\n        </tr>`).join('') || '<tr><td colspan=\"5\" class=\"ims__table-empty\">No extras yet</td></tr>'}</tbody>\n      </table></div>\n      ${_rcAdmin() ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" style=\"margin-top:8px\" onclick=\"window.IMS_LOGISTICS.rcAddExtra()\"><i class=\"ti ti-plus\"></i> Add extra</button>` : ''}`;\n  }\n  async function rcSaveExtra(id, field, value) {\n    if (!_rcAdmin()) return;\n    const v = field === 'price' ? (_rcNum(value) ?? 0) : field === 'service_id' ? (value || null) : String(value || '').trim();\n    if (field === 'name' && !v) { ui().toast('An extra needs a name', 'warning'); return; }\n    const { error } = await _rcDb().from('courier_card_extras').update({ [field]: v }).eq('id', id);\n    if (_rcSaved(error)) { const e = _rc.extras.find(x => x.id === id); if (e) e[field] = v; }\n  }\n  async function rcAddExtra() {\n    if (!_rcAdmin()) return;\n    const { data, error } = await _rcDb().from('courier_card_extras').insert({ company_id: _rc.companyId, card_id: _rc.cardId, name: 'New extra', price: 0, per: 'order', sort_order: _rc.extras.length }).select('*');\n    if (_rcSaved(error) && data?.[0]) { _rc.extras.push(data[0]); _rcRenderTab(); }\n  }\n  function rcDeleteExtra(id, name) {\n    if (!_rcAdmin()) return;\n    ui().confirm(`Delete the extra <strong>${util().sanitize(name)}</strong> from this version of the rates?`, async () => {\n      const { error } = await _rcDb().from('courier_card_extras').delete().eq('id', id);\n      if (_rcSaved(error)) { _rc.extras = _rc.extras.filter(x => x.id !== id); _rcRenderTab(); }\n    }, 'Delete', true);\n  }\n\n  // \u2500\u2500 Settings \u2500\u2500\n  function _rcSettingsHtml() {\n    const c = _rcCard(), dis = _rcDis();\n    const f = (field, label, input) => `<div class=\"ims__form-group\"><label class=\"ims__label\">${label}</label>${input}</div>`;\n    const ch = field => `onchange=\"window.IMS_LOGISTICS.rcSaveCard('${field}',this.type==='checkbox'?this.checked:this.value)\"`;\n    return `\n      <div class=\"ims__form-grid\">\n        ${f('valid_from', 'Valid from', `<input class=\"ims__input\" type=\"date\" value=\"${c.valid_from || ''}\" ${dis} ${ch('valid_from')}>`)}\n        ${f('fuel_pct', 'Fuel surcharge (%)', `<input class=\"ims__input\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${c.fuel_pct ?? 0}\" ${dis} ${ch('fuel_pct')}>`)}\n        ${f('floor_first', 'Room of choice: up to the first floor (\u00A3)', `<input class=\"ims__input\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${c.floor_first ?? 0}\" ${dis} ${ch('floor_first')}>`)}\n        ${f('floor_extra', 'Each floor above that (\u00A3)', `<input class=\"ims__input\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${c.floor_extra ?? 0}\" ${dis} ${ch('floor_extra')}>`)}\n        <div class=\"ims__form-group\"><label style=\"display:flex;gap:6px;align-items:center;font-size:13px\"><input type=\"checkbox\" ${c.prices_exclude_vat ? 'checked' : ''} ${dis} ${ch('prices_exclude_vat')}> Prices exclude VAT</label></div>\n        <div class=\"ims__form-group\"><label style=\"display:flex;gap:6px;align-items:center;font-size:13px\"><input type=\"checkbox\" ${c.collections_same ? 'checked' : ''} ${dis} ${ch('collections_same')}> Collections cost the same as deliveries</label></div>\n        ${f('notes', 'Notes', `<textarea class=\"ims__textarea\" rows=\"2\" ${dis} ${ch('notes')}>${util().sanitize(c.notes || '')}</textarea>`)}\n      </div>\n      ${_rcAdmin() && _rc.cards.length > 1 ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" style=\"color:var(--ims-danger)\" onclick=\"window.IMS_LOGISTICS.rcDeleteVersion()\"><i class=\"ti ti-trash\"></i> Delete this version</button>` : ''}`;\n  }\n  async function rcSaveCard(field, value) {\n    if (!_rcAdmin()) return;\n    let v = value;\n    if (['fuel_pct', 'floor_first', 'floor_extra'].includes(field)) v = _rcNum(value) ?? 0;\n    if (field === 'valid_from') {\n      if (!v) { ui().toast('Please choose a date', 'warning'); return; }\n      if (_rc.cards.some(c => c.id !== _rc.cardId && String(c.valid_from) === v)) { ui().toast('Another version already starts on that date', 'error'); _rcRenderTab(); return; }\n    }\n    const { error } = await _rcDb().from('courier_rate_cards').update({ [field]: v }).eq('id', _rc.cardId);\n    if (_rcSaved(error)) { const c = _rcCard(); c[field] = v; if (field === 'valid_from') { await _rcLoad(); _rcOpen(); } }\n  }\n  async function rcNewVersion() {\n    if (!_rcAdmin()) return;\n    const date = document.getElementById('ims-rc-newdate')?.value;\n    if (!date) { ui().toast('Choose the date the new rates start', 'warning'); return; }\n    if (_rc.cards.some(c => String(c.valid_from) === date)) { ui().toast('A version already starts on that date', 'error'); return; }\n    const db_ = _rcDb(), src = _rcCard();\n    const { id, created_at, valid_from, ...fields } = src;\n    const { data: nc, error } = await db_.from('courier_rate_cards').insert({ ...fields, valid_from: date }).select('*');\n    if (!_rcSaved(error) || !nc?.[0]) return;\n    const newId = nc[0].id;\n    const rates = _rc.rates.map(r => ({ company_id: r.company_id, card_id: newId, type_id: r.type_id, zone_id: r.zone_id, price: r.price }));\n    const extras = _rc.extras.map(e => ({ company_id: e.company_id, card_id: newId, name: e.name, price: e.price, per: e.per, sort_order: e.sort_order, service_id: e.service_id || null }));\n    if (rates.length) { const r = await db_.from('courier_card_rates').insert(rates); if (!_rcSaved(r.error)) return; }\n    if (extras.length) { const r = await db_.from('courier_card_extras').insert(extras); if (!_rcSaved(r.error)) return; }\n    ui().toast(`New rates from ${util().formatDate(date)}: copied from the current version. Change what is different.`, 'success', 7000);\n    _rc.cardId = newId; await _rcLoad(); _rcOpen();\n  }\n  function rcDeleteVersion() {\n    if (!_rcAdmin() || _rc.cards.length < 2) return;\n    const c = _rcCard();\n    ui().confirm(`Delete the rates valid from <strong>${util().formatDate(c.valid_from)}</strong>, with its prices and extras? Deliveries in that period will be checked against the previous version.`, async () => {\n      const { error } = await _rcDb().from('courier_rate_cards').delete().eq('id', _rc.cardId);\n      if (_rcSaved(error)) { _rc.cardId = null; await _rcLoad(); _rcOpen(); }\n    }, 'Delete', true);\n  }\n\n  async function addRateBand(courierId){\n    const from=prompt('Weight from (kg):','0');\n    const to=prompt('Weight to (kg, leave blank for \u221E):','');\n    const rate=prompt('Base rate (\u00A3):','0');\n    const perKg=prompt('Per kg over band (\u00A3, optional):','');\n    if(from===null||rate===null)return;\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    await client.from('courier_rate_bands').insert({courier_id:courierId,weight_from:parseFloat(from)||0,weight_to:to?parseFloat(to):null,base_rate:parseFloat(rate)||0,per_kg_over:perKg?parseFloat(perKg):0,sort_order:0});\n    ui().toast('Rate band added','success');\n    const {data:c}=await db().select('couriers',{eq:{id:courierId},maybeSingle:true,noCompanyFilter:true});\n    if(c) manageCourierRates(courierId,c.name);\n  }\n\n  async function deleteRateBand(bandId,courierId,courierName){\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    await client.from('courier_rate_bands').delete().eq('id',bandId);\n    ui().toast('Rate band deleted','success');\n    manageCourierRates(courierId,courierName);\n  }\n\n  async function editSurcharge(courierId,type,courierName){\n    const value=prompt(`${type} \u2014 value (e.g. 8.5 for 8.5%):`, '');\n    const valueType=prompt('Type: percent or flat?','flat');\n    if(value===null)return;\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:existing}=await client.from('courier_surcharges').select('id').eq('courier_id',courierId).eq('surcharge_type',type).maybeSingle();\n    if(existing){\n      await client.from('courier_surcharges').update({value:parseFloat(value)||0,value_type:valueType||'flat',is_active:true}).eq('id',existing.id);\n    } else {\n      await client.from('courier_surcharges').insert({courier_id:courierId,surcharge_type:type,value:parseFloat(value)||0,value_type:valueType||'flat',is_active:true});\n    }\n    ui().toast('Surcharge updated','success');\n    manageCourierRates(courierId,courierName);\n  }\n\n  // \u2500\u2500\u2500 ROUTES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function loadRoutes(){\n    const content=document.getElementById('ims-log-content');\n    if(!content)return;\n    const {data:routes}=await db().select('routes',{order:{col:'name'}});\n    const items=routes||[];\n    content.innerHTML=`\n      <div style=\"display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:14px;gap:12px\">\n        <div class=\"ims__alert ims__alert--info\" style=\"margin:0;flex:1\"><i class=\"ti ti-info-circle\"></i><span><strong>Routes are named templates</strong> \u2014 e.g. \"North London Run\". Driver and truck are assigned when you create a manifest from <strong>Unassigned jobs \u2192 Plan route</strong>.</span></div>\n        <button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.showRouteForm()\"><i class=\"ti ti-plus\"></i> Add route</button>\n      </div>\n      <div class=\"ims__card\"><div class=\"ims__table-wrap\"><table class=\"ims__table\">\n        <thead><tr><th>Route name</th><th>Zone</th><th>Stops</th><th>Status</th><th></th></tr></thead>\n        <tbody>${items.map(r=>`<tr><td><strong>${util().sanitize(r.name)}</strong></td><td>${util().sanitize(r.zone||'\u2014')}</td><td>${Array.isArray(r.stops)?r.stops.length:0} stops</td><td><span class=\"ims__pill ims__pill--${r.is_active?'success':'neutral'}\">${r.is_active?'Active':'Inactive'}</span></td><td><button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_LOGISTICS.showRouteForm('${util().jsArg(r.id)}')\"><i class=\"ti ti-edit\"></i></button></td></tr>`).join('')||'<tr><td colspan=\"5\" class=\"ims__table-empty\">No routes configured</td></tr>'}\n        </tbody>\n      </table></div></div>`;\n  }\n\n  async function showRouteForm(existingId=null){\n    let r=null;\n    if(existingId){const {data}=await db().select('routes',{eq:{id:existingId},maybeSingle:true,noCompanyFilter:true});r=data;}\n    ui().openModal(existingId?`Edit: ${r?.name}`:'Add route',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Route name</label><input class=\"ims__input\" type=\"text\" id=\"ims-rt-name\" value=\"${util().sanitize(r?.name||'')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Zone / Hub</label><input class=\"ims__input\" type=\"text\" id=\"ims-rt-zone\" value=\"${util().sanitize(r?.zone||'')}\" placeholder=\"e.g. North London\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Stops (one per line)</label><textarea class=\"ims__textarea\" id=\"ims-rt-stops\" rows=\"4\" placeholder=\"Enter delivery zones or stops\">${Array.isArray(r?.stops)?r.stops.join('\\n'):''}</textarea></div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveRoute('${util().jsArg(existingId||'')}')\"><i class=\"ti ti-check\"></i> Save route</button>\n    `,'sm');\n  }\n\n  async function saveRoute(existingId){\n    const name=document.getElementById('ims-rt-name')?.value?.trim();\n    const zone=document.getElementById('ims-rt-zone')?.value?.trim();\n    const stopsRaw=document.getElementById('ims-rt-stops')?.value||'';\n    const stops=stopsRaw.split('\\n').map(s=>s.trim()).filter(Boolean);\n    if(!name){ui().toast('Route name is required','error');return;}\n    const data={name,zone:zone||null,stops};\n    const {error}=existingId?await db().update('routes',existingId,data):await db().insert('routes',data);\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n    ui().closeModal();ui().toast(`Route ${existingId?'updated':'added'}`,'success');loadRoutes();\n  }\n\n  // \u2500\u2500\u2500 FLEET \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function loadFleet(){\n    const content=document.getElementById('ims-log-content');\n    if(!content)return;\n    const [{data:vehicles},{data:drivers}]=await Promise.all([\n      db().select('vehicles',{order:{col:'registration'}}),\n      db().select('drivers',{order:{col:'name'}})\n    ]);\n    content.innerHTML=`\n      <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:14px\">\n        <div class=\"ims__card\">\n          <div class=\"ims__card-header\"><div class=\"ims__card-title\"><i class=\"ti ti-car\"></i>Vehicles</div><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.showVehicleForm()\"><i class=\"ti ti-plus\"></i> Add</button></div>\n          <table class=\"ims__table\"><thead><tr><th>Reg</th><th>Type</th><th>Capacity</th><th>MOT due</th><th></th></tr></thead>\n          <tbody>${[...(vehicles||[])].sort((a,b)=>(b.is_active!==false)-(a.is_active!==false)).map(v=>{ const off=v.is_active===false; return `<tr style=\"${off?'opacity:.55':''}\"><td><strong>${util().sanitize(v.registration)}</strong>${off?' <span class=\"ims__pill ims__pill--neutral\" style=\"font-size:10px\">Inactive</span>':''}</td><td>${util().sanitize(v.make_model||v.vehicle_type||'-')}</td><td>${v.capacity_units?v.capacity_units+' units':'-'}</td><td style=\"color:${v.mot_due&&new Date(v.mot_due)<new Date()?'var(--ims-danger)':''}\">${v.mot_due?util().formatDate(v.mot_due):'-'}</td>\n            <td style=\"white-space:nowrap\"><div class=\"ims__btn-group\">${_fleetButtons('vehicle',v.id,v.registration,off)}</div></td></tr>`; }).join('')||'<tr><td colspan=\"5\" class=\"ims__table-empty\">No vehicles</td></tr>'}\n          </tbody></table>\n        </div>\n        <div class=\"ims__card\">\n          <div class=\"ims__card-header\"><div class=\"ims__card-title\"><i class=\"ti ti-id-badge\"></i>Drivers</div><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.showDriverForm()\"><i class=\"ti ti-plus\"></i> Add</button></div>\n          <table class=\"ims__table\"><thead><tr><th>Name</th><th>Phone</th><th>Licence expiry</th><th>COD balance</th><th></th></tr></thead>\n          <tbody>${[...(drivers||[])].sort((a,b)=>(b.is_active!==false)-(a.is_active!==false)).map(d=>`<tr style=\"${d.is_active===false?'opacity:.55':''}\"><td><strong>${util().sanitize(d.name)}</strong>${d.is_active===false?' <span class=\"ims__pill ims__pill--neutral\" style=\"font-size:10px\">Inactive</span>':''}</td><td>${util().sanitize(d.phone||'\u2014')}</td><td style=\"color:${d.licence_expiry&&new Date(d.licence_expiry)<new Date()?'var(--ims-danger)':''}\">${d.licence_expiry?util().formatDate(d.licence_expiry):'\u2014'}</td><td><span id=\"ims-cod-bal-${d.id}\" style=\"font-weight:600;color:var(--ims-text-muted)\">Loading...</span></td><td><div class=\"ims__btn-group\"><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.openCODAccount('${util().jsArg(d.id)}','${util().jsArg(d.name)}')\"><i class=\"ti ti-wallet\"></i> COD account</button>${_fleetButtons('driver',d.id,d.name,d.is_active===false)}</div></td></tr>`).join('')||'<tr><td colspan=\"5\" class=\"ims__table-empty\">No drivers</td></tr>'}\n          </tbody></table>\n        </div>\n      </div>`;\n    loadAllCODBalances(drivers||[]);\n  }\n\n  async function loadAllCODBalances(drivers){\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    for(const d of drivers){\n      const {data:acc}=await client.from('driver_cod_accounts').select('balance').eq('driver_id',d.id).maybeSingle();\n      const el=document.getElementById(`ims-cod-bal-${d.id}`);\n      if(el){\n        const bal=acc?.balance||0;\n        el.textContent=bal===0?'\u00A30.00 \u2014 clear':util().formatCurrency(Math.abs(bal));\n        el.style.color=bal>0?'var(--ims-danger)':bal<0?'var(--ims-success)':'var(--ims-text-muted)';\n        el.title=bal>0?'Driver owes company':bal<0?'Company owes driver':'Account clear';\n      }\n    }\n  }\n\n  async function openCODAccount(driverId,driverName){\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    let {data:acc}=await client.from('driver_cod_accounts').select('*').eq('driver_id',driverId).maybeSingle();\n    if(!acc){\n      const {data:newAcc}=await client.from('driver_cod_accounts').insert({company_id:window.SM.AUTH.company?.id,driver_id:driverId,balance:0}).select().maybeSingle();\n      acc=newAcc;\n    }\n    const {data:txns}=await client.from('cod_transactions').select('*,orders(order_number,customer_name,total_value)').eq('driver_id',driverId).order('created_at',{ascending:false}).limit(50);\n    const balance=acc?.balance||0;\n    const cu=await _codCashUp(driverId);\n    const txnRows=(txns||[]).map(t=>`<tr><td style=\"font-size:11px\">${util().formatDate(t.created_at)}</td><td>${util().sanitize(t.orders?.order_number||'\u2014')}</td><td>${util().sanitize(t.orders?.customer_name||'\u2014')}</td><td><span class=\"ims__pill ims__pill--${t.type==='debit'?'warning':t.type==='credit'?'success':'neutral'}\">${t.type}</span></td><td style=\"text-align:right;font-weight:600;color:${t.type==='debit'?'var(--ims-danger)':'var(--ims-success)'}\">${t.type==='debit'?'+':'-'}${util().formatCurrency(Math.abs(t.amount))}</td><td style=\"font-size:11px\">${util().sanitize(t.notes||'\u2014')}</td></tr>`).join('');\n    ui().openModal(`COD Account: ${driverName}`,`\n      <div style=\"display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:16px\">\n        <div class=\"ims__stat\" style=\"padding:12px\"><div class=\"ims__stat-label\">Current balance</div><div class=\"ims__stat-value ims__stat-value--${balance>0?'danger':balance<0?'success':''}\" style=\"font-size:22px\">${balance===0?'\u00A30.00 \u2014 Clear':util().formatCurrency(Math.abs(balance))}</div><div style=\"font-size:11px;color:var(--ims-text-muted);margin-top:4px\">${balance>0?'Driver owes this amount to company':balance<0?'Company owes driver':'Account is clear'}</div></div>\n        <div class=\"ims__stat\" style=\"padding:12px\"><div class=\"ims__stat-label\">Total debits (COD taken)</div><div class=\"ims__stat-value\" style=\"font-size:18px\">${util().formatCurrency((txns||[]).filter(t=>t.type==='debit').reduce((s,t)=>s+(t.amount||0),0))}</div></div>\n        <div class=\"ims__stat\" style=\"padding:12px\"><div class=\"ims__stat-label\">Total credits (paid in)</div><div class=\"ims__stat-value ims__stat-value--success\" style=\"font-size:18px\">${util().formatCurrency((txns||[]).filter(t=>t.type==='credit').reduce((s,t)=>s+(t.amount||0),0))}</div></div>\n      </div>\n      ${balance>0?`<div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:14px\"><i class=\"ti ti-alert-triangle\"></i><span><strong>${driverName}</strong> owes <strong>${util().formatCurrency(balance)}</strong> to the company.</span></div>`:''}\n      ${_codCashUpHtml(cu,driverId,driverName)}\n      <strong style=\"font-size:13px\">Transaction history</strong>\n      <div class=\"ims__table-wrap\" style=\"max-height:320px;overflow-y:auto;margin-top:8px\">\n        <table class=\"ims__table\"><thead><tr><th>Date</th><th>Order #</th><th>Customer</th><th>Type</th><th style=\"text-align:right\">Amount</th><th>Notes</th></tr></thead>\n        <tbody>${txnRows||'<tr><td colspan=\"6\" class=\"ims__table-empty\">No transactions yet</td></tr>'}</tbody>\n        </table>\n      </div>\n    `,`\n      <div class=\"ims__btn-group\">\n        <button class=\"ims__btn ims__btn--success\" onclick=\"window.IMS_LOGISTICS.recordCODPayment('${util().jsArg(driverId)}','${util().jsArg(driverName)}',${cu.cashTotal>0?cu.cashTotal:0})\"><i class=\"ti ti-cash\"></i> Record payment</button>\n        <button class=\"ims__btn ims__btn--secondary\" onclick=\"window.IMS_LOGISTICS.reconcileCODAccount('${util().jsArg(driverId)}','${util().jsArg(driverName)}')\"><i class=\"ti ti-file-check\"></i> Reconcile</button>\n        <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Close</button>\n      </div>\n    `,'xl');\n  }\n\n  // \u2500\u2500\u2500 COD CASH-UP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Per driver, from his COD charges less reversals, order by order:\n  //   cash to hand in  = delivered orders whose COD is still outstanding\n  //   still on the van = not yet delivered\n  //   bank transfers to confirm (the driver recorded \"paid by bank transfer\")\n  //   COD not collected (to chase)\n  async function _codCashUp(driverId){\n    const c=_rcDb();\n    const {data:rows}=await c.from('cod_transactions').select('id,type,amount,order_id,notes,confirmed_at,created_at,orders(order_number,customer_name,status,payment_status)').eq('driver_id',driverId).not('order_id','is',null);\n    const per={};\n    (rows||[]).forEach(t=>{ const p=per[t.order_id]=per[t.order_id]||{order_id:t.order_id,o:t.orders||{},net:0,first:t.created_at};\n      if(t.type==='debit') p.net+=Number(t.amount)||0; else if(t.type==='reversal') p.net-=Number(t.amount)||0;\n      if(t.created_at<p.first) p.first=t.created_at; });\n    const list=Object.values(per).filter(p=>p.net>0.005&&p.o.payment_status!=='paid');\n    const cash=list.filter(p=>p.o.status==='delivered'), van=list.filter(p=>p.o.status!=='delivered');\n    const bank=(rows||[]).filter(t=>t.type==='reversal'&&/^Paid by bank transfer/.test(t.notes||'')&&!t.confirmed_at);\n    const notColl=(rows||[]).filter(t=>t.type==='reversal'&&/^COD not collected/.test(t.notes||'')&&t.orders?.payment_status!=='paid');\n    const sum=a=>Math.round(a.reduce((s,p)=>s+p.net,0)*100)/100;\n    return {cash,van,bank,notColl,cashTotal:sum(cash),vanTotal:sum(van)};\n  }\n  function _codCashUpHtml(cu,driverId,driverName){\n    const fm=n=>util().formatCurrency(n);\n    const tbl=(head,rows)=>`<div class=\"ims__table-wrap\" style=\"margin:6px 0 14px\"><table class=\"ims__table\"><thead><tr>${head.map(h=>`<th>${h}</th>`).join('')}</tr></thead><tbody>${rows}</tbody></table></div>`;\n    return `\n      <strong style=\"font-size:13px\">Cash to hand in: ${fm(cu.cashTotal)}</strong> <span style=\"font-size:12px;color:var(--ims-text-muted)\">(delivered COD orders not yet paid in)</span>\n      ${cu.cash.length?tbl(['Order #','Customer','Amount'],cu.cash.map(p=>`<tr><td>${util().sanitize(p.o.order_number||'-')}</td><td>${util().sanitize(p.o.customer_name||'-')}</td><td>${fm(p.net)}</td></tr>`).join('')):'<div style=\"font-size:12px;color:var(--ims-text-muted);margin:4px 0 14px\">Nothing to hand in.</div>'}\n      ${cu.van.length?`<strong style=\"font-size:13px\">Still on the van: ${fm(cu.vanTotal)}</strong> <span style=\"font-size:12px;color:var(--ims-text-muted)\">(COD orders not delivered yet)</span>\n      ${tbl(['Order #','Customer','Amount'],cu.van.map(p=>`<tr><td>${util().sanitize(p.o.order_number||'-')}</td><td>${util().sanitize(p.o.customer_name||'-')}</td><td>${fm(p.net)}</td></tr>`).join(''))}`:''}\n      ${cu.bank.length?`<strong style=\"font-size:13px\">Bank transfers to confirm (${cu.bank.length})</strong> <span style=\"font-size:12px;color:var(--ims-text-muted)\">(the customer told the driver they paid by bank transfer)</span>\n      ${tbl(['Order #','Customer','Amount',''],cu.bank.map(t=>`<tr><td>${util().sanitize(t.orders?.order_number||'-')}</td><td>${util().sanitize(t.orders?.customer_name||'-')}</td><td>${fm(t.amount)}</td>\n        <td><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_LOGISTICS.confirmBankTransfer('${util().jsArg(t.id)}','${util().jsArg(driverId)}','${util().jsArg(driverName)}')\"><i class=\"ti ti-check\"></i> Confirm received</button></td></tr>`).join(''))}`:''}\n      ${cu.notColl.length?`<strong style=\"font-size:13px;color:var(--ims-danger)\">COD not collected (${cu.notColl.length})</strong> <span style=\"font-size:12px;color:var(--ims-text-muted)\">(delivered, but the customer did not pay: to chase)</span>\n      ${tbl(['Order #','Customer','Amount'],cu.notColl.map(t=>`<tr><td>${util().sanitize(t.orders?.order_number||'-')}</td><td>${util().sanitize(t.orders?.customer_name||'-')}</td><td>${fm(t.amount)}</td></tr>`).join(''))}`:''}`;\n  }\n  // The money arrived in the bank: the order is paid, recorded as COD\n  // income, and the item leaves the \"to confirm\" list.\n  async function confirmBankTransfer(txId,driverId,driverName){\n    const c=_rcDb();\n    const {data:t}=await c.from('cod_transactions').select('id,order_id,amount,confirmed_at,orders(order_number,payment_status)').eq('id',txId).maybeSingle();\n    if(!t||t.confirmed_at){ ui().toast('Already confirmed','info'); return openCODAccount(driverId,driverName); }\n    const {error}=await c.from('cod_transactions').update({confirmed_at:new Date().toISOString(),confirmed_by:window.SM.AUTH.user?.id||null}).eq('id',txId).is('confirmed_at',null);\n    if(error){ ui().toast('Not saved: '+error.message,'error',8000); return; }\n    if(t.order_id){\n      await c.from('orders').update({payment_status:'paid'}).eq('id',t.order_id);\n      await c.from('accounts_receivable').delete().eq('order_id',t.order_id);\n      await db().insert('transactions',{date:new Date().toISOString().split('T')[0],type:'income',category:'COD collection',description:`COD paid by bank transfer: ${t.orders?.order_number||''}`,amount:Number(t.amount)||0,reference:t.orders?.order_number||null});\n      await logActivity(t.order_id,t.orders?.payment_status||'cod','paid','cod_bank_transfer_confirmed',`Bank transfer of ${util().formatCurrency(t.amount)} received`);\n    }\n    ui().toast(`Bank transfer for ${t.orders?.order_number||'the order'} confirmed: order paid`,'success');\n    openCODAccount(driverId,driverName);\n  }\n\n  async function recordCODPayment(driverId,driverName,currentBalance){\n    ui().openModal(`Record payment: ${driverName}`,`\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\"><i class=\"ti ti-info-circle\"></i><span>Record cash handed over by the driver. It is applied to his delivered COD orders that are still outstanding, oldest first.</span></div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Amount received (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-cod-amount\" value=\"${currentBalance>0?currentBalance.toFixed(2):''}\"><span class=\"ims__input-hint\">Current balance owed: ${util().formatCurrency(currentBalance)}</span></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Date received</label><input class=\"ims__input\" type=\"date\" id=\"ims-cod-date\" value=\"${new Date().toISOString().split('T')[0]}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Received by</label><input class=\"ims__input\" type=\"text\" id=\"ims-cod-received-by\" value=\"${window.SM.AUTH.user?.name||''}\" placeholder=\"Supervisor name\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Notes</label><input class=\"ims__input\" type=\"text\" id=\"ims-cod-notes\" placeholder=\"e.g. End of route payment\"></div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--success\" onclick=\"window.IMS_LOGISTICS.confirmCODPayment('${util().jsArg(driverId)}','${util().jsArg(driverName)}')\"><i class=\"ti ti-check\"></i> Confirm payment received</button>\n    `,'sm');\n  }\n\n  async function confirmCODPayment(driverId,driverName){\n    const amount=parseFloat(document.getElementById('ims-cod-amount')?.value)||0;\n    const notes=document.getElementById('ims-cod-notes')?.value?.trim()||'';\n    const receivedBy=document.getElementById('ims-cod-received-by')?.value?.trim()||'';\n    if(!amount||amount<=0){ui().toast('Please enter a valid amount','error');return;}\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    await client.from('cod_transactions').insert({company_id:window.SM.AUTH.company?.id,driver_id:driverId,order_id:null,type:'credit',amount,notes:`Payment received${receivedBy?' by '+receivedBy:''}.${notes?' '+notes:''}`,created_by:window.SM.AUTH.user?.id});\n    const {data:acc}=await client.from('driver_cod_accounts').select('balance').eq('driver_id',driverId).maybeSingle();\n    const newBalance=Math.max(0,(acc?.balance||0)-amount);\n    await client.from('driver_cod_accounts').update({balance:newBalance}).eq('driver_id',driverId);\n    await db().insert('transactions',{date:new Date().toISOString().split('T')[0],type:'income',category:'COD collection',description:`COD payment received from driver ${driverName}`,amount,reference:`COD-${driverName}`});\n\n    // Close out the specific orders this payment covers \u2014 oldest unsettled\n    // COD debit first \u2014 so their payment_status actually flips to 'paid'\n    // instead of staying 'cod' forever even after the cash has been banked.\n    // Any of those that also carry a wholesale accounts_receivable get that\n    // cleared too, so Accounts doesn't keep chasing an order already paid\n    // for in cash at the door.\n    // Only orders actually DELIVERED whose COD is still outstanding (charges\n    // less reversals): a failed delivery, a bank transfer or COD not\n    // collected reverses the charge, and such orders must never be marked\n    // paid by cash handed in.\n    const {data:debits}=await client.from('cod_transactions')\n      .select('order_id,amount,orders(payment_status,status)')\n      .eq('driver_id',driverId).eq('type','debit').not('order_id','is',null)\n      .order('created_at',{ascending:true});\n    const {data:revs}=await client.from('cod_transactions').select('order_id,amount').eq('driver_id',driverId).eq('type','reversal').not('order_id','is',null);\n    const reversed={}; (revs||[]).forEach(r=>{ reversed[r.order_id]=(reversed[r.order_id]||0)+(Number(r.amount)||0); });\n    let remaining=amount;\n    for(const d of (debits||[])){\n      if(remaining<=0)break;\n      if(!d.order_id||d.orders?.payment_status==='paid')continue;\n      if(d.orders?.status!=='delivered')continue;                                  // cash not collected yet\n      if((Number(d.amount)||0)-(reversed[d.order_id]||0)<=0.005)continue;          // reversed: nothing outstanding\n      await client.from('orders').update({payment_status:'paid'}).eq('id',d.order_id);\n      await client.from('accounts_receivable').delete().eq('order_id',d.order_id);\n      remaining-=(d.amount||0);\n    }\n\n    ui().closeModal();\n    ui().toast(`\u00A3${amount.toFixed(2)} recorded \u2014 driver account updated`,'success',4000);\n    loadFleet();\n  }\n\n  async function reconcileCODAccount(driverId,driverName){\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:acc}=await client.from('driver_cod_accounts').select('balance').eq('driver_id',driverId).maybeSingle();\n    const balance=acc?.balance||0;\n    if(balance===0){ui().toast('Account is already clear \u2014 nothing to reconcile','info');return;}\n    ui().confirm(`Mark ${driverName}'s COD account as reconciled?<br><br>Current balance: <strong>${util().formatCurrency(balance)}</strong><br><br>This will zero the balance, record a reconciliation entry, and record the shortfall as a write-off expense in Accounts \u2192 Transactions.`,async()=>{\n      await client.from('cod_transactions').insert({company_id:window.SM.AUTH.company?.id,driver_id:driverId,type:'reversal',amount:balance,notes:'Manual reconciliation \u2014 balance zeroed',created_by:window.SM.AUTH.user?.id});\n      await client.from('driver_cod_accounts').update({balance:0,last_reconciled_at:new Date().toISOString()}).eq('driver_id',driverId);\n      // The zeroed balance is money the company is writing off, not money\n      // that appeared from nowhere \u2014 record it so it doesn't just vanish\n      // from the books with no trace, the same gap a rejected courier\n      // claim used to have before that was fixed.\n      await db().insert('transactions',{date:new Date().toISOString().split('T')[0],type:'expense',category:'Write-off \u2014 COD reconciliation',description:`COD balance written off \u2014 ${driverName}`,amount:balance,reference:`COD-${driverName}`});\n      ui().toast('Account reconciled \u2014 balance zeroed and write-off recorded','success');\n      loadFleet();\n    },'Reconcile',false);\n  }\n\n  async function showVehicleForm(id=null){\n    const v=id?((await db().select('vehicles',{eq:{id},maybeSingle:true})).data||{}):{};\n    const val=k=>util().sanitize(v[k]??'');\n    ui().openModal(id?`Edit vehicle: ${util().sanitize(v.registration||'')}`:'Add vehicle',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Registration</label><input class=\"ims__input\" type=\"text\" id=\"ims-veh-reg\" placeholder=\"e.g. AB21 XYZ\" value=\"${val('registration')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Make &amp; model</label><input class=\"ims__input\" type=\"text\" id=\"ims-veh-model\" placeholder=\"e.g. Ford Transit\" value=\"${val('make_model')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Vehicle type</label><select class=\"ims__select\" id=\"ims-veh-type\"><option value=\"van\">Van</option><option value=\"truck\">Truck</option><option value=\"car\">Car</option></select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Capacity (units)</label><input class=\"ims__input\" type=\"number\" id=\"ims-veh-cap\" value=\"${val('capacity_units')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">MOT due</label><input class=\"ims__input\" type=\"date\" id=\"ims-veh-mot\" value=\"${val('mot_due')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Service due</label><input class=\"ims__input\" type=\"date\" id=\"ims-veh-service\" value=\"${val('service_due')}\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Notes</label><textarea class=\"ims__textarea\" id=\"ims-veh-notes\" rows=\"2\">${val('notes')}</textarea></div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveVehicle('${util().jsArg(id||'')}')\"><i class=\"ti ti-check\"></i> Save</button>\n    `,'sm');\n    if(v.vehicle_type){ const t=document.getElementById('ims-veh-type'); if(t) t.value=v.vehicle_type; }\n  }\n\n  async function saveVehicle(existingId=''){\n    const g=id=>document.getElementById(id)?.value?.trim()||'';\n    const reg=g('ims-veh-reg');\n    if(!reg){ui().toast('Registration is required','error');return;}\n    const row={registration:reg,make_model:g('ims-veh-model')||null,vehicle_type:g('ims-veh-type')||'van',capacity_units:parseInt(g('ims-veh-cap'))||null,mot_due:g('ims-veh-mot')||null,service_due:g('ims-veh-service')||null,notes:g('ims-veh-notes')||null};\n    if(existingId){\n      const {error}=await db().update('vehicles',existingId,row);\n      if(error){ui().toast('Failed: '+error.message,'error');return;}\n      ui().closeModal();ui().toast('Vehicle updated','success');loadFleet();return;\n    }\n    const {error}=await db().insert('vehicles',{registration:reg,make_model:g('ims-veh-model')||null,vehicle_type:g('ims-veh-type')||'van',capacity_units:parseInt(g('ims-veh-cap'))||null,mot_due:g('ims-veh-mot')||null,service_due:g('ims-veh-service')||null,notes:g('ims-veh-notes')||null});\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n    ui().closeModal();ui().toast('Vehicle added','success');loadFleet();\n  }\n\n  async function showDriverForm(id=null){\n    const d=id?((await db().select('drivers',{eq:{id},maybeSingle:true})).data||{}):{};\n    const val=k=>util().sanitize(d[k]??'');\n    ui().openModal(id?`Edit driver: ${util().sanitize(d.name||'')}`:'Add driver',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Driver name</label><input class=\"ims__input\" type=\"text\" id=\"ims-drv-name\" value=\"${val('name')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Phone</label><input class=\"ims__input\" type=\"tel\" id=\"ims-drv-phone\" value=\"${val('phone')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Email</label><input class=\"ims__input\" type=\"email\" id=\"ims-drv-email\" value=\"${val('email')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Licence number</label><input class=\"ims__input\" type=\"text\" id=\"ims-drv-licence\" value=\"${val('licence_number')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Licence expiry</label><input class=\"ims__input\" type=\"date\" id=\"ims-drv-expiry\" value=\"${val('licence_expiry')}\"></div>\n      </div>\n    `,`\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_LOGISTICS.saveDriver('${util().jsArg(id||'')}')\"><i class=\"ti ti-check\"></i> Save</button>\n    `,'sm');\n  }\n\n  async function saveDriver(existingId=''){\n    const g=id=>document.getElementById(id)?.value?.trim()||'';\n    const name=g('ims-drv-name');\n    if(!name){ui().toast('Driver name is required','error');return;}\n    if(existingId){\n      const {error}=await db().update('drivers',existingId,{name,phone:g('ims-drv-phone')||null,email:g('ims-drv-email')||null,licence_number:g('ims-drv-licence')||null,licence_expiry:g('ims-drv-expiry')||null});\n      if(error){ui().toast('Failed: '+error.message,'error');return;}\n      ui().closeModal();ui().toast('Driver updated','success');loadFleet();return;\n    }\n    const {error}=await db().insert('drivers',{name,phone:g('ims-drv-phone')||null,email:g('ims-drv-email')||null,licence_number:g('ims-drv-licence')||null,licence_expiry:g('ims-drv-expiry')||null});\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n    ui().closeModal();ui().toast('Driver added','success');loadFleet();\n  }\n\n  // \u2500\u2500\u2500 FLEET: edit, delete, deactivate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Edit: anyone with Logistics access. Delete and deactivate: Admins only\n  // (the database enforces this too). A driver or vehicle with history\n  // (manifests, COD, a driver login) cannot be deleted; it can be\n  // deactivated instead: hidden from new manifests and the driver-login\n  // list, history kept, and a linked driver login can no longer use the\n  // driver app.\n  function _fleetButtons(kind,id,label,off){\n    const edit=`<button class=\"ims__btn ims__btn--ghost ims__btn--sm ims__btn--icon\" title=\"Edit\" onclick=\"window.IMS_LOGISTICS.${kind==='driver'?'showDriverForm':'showVehicleForm'}('${util().jsArg(id)}')\"><i class=\"ti ti-edit\"></i></button>`;\n    if(!window.SM.AUTH.isAdmin()) return edit;\n    const toggle=off\n      ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" title=\"Reactivate\" onclick=\"window.IMS_LOGISTICS.setFleetActive('${kind}','${util().jsArg(id)}','${util().jsArg(label)}',true)\">Reactivate</button>`\n      : `<button class=\"ims__btn ims__btn--ghost ims__btn--sm ims__btn--icon\" title=\"Deactivate\" onclick=\"window.IMS_LOGISTICS.setFleetActive('${kind}','${util().jsArg(id)}','${util().jsArg(label)}',false)\"><i class=\"ti ti-player-pause\"></i></button>`;\n    const del=`<button class=\"ims__btn ims__btn--ghost ims__btn--sm ims__btn--icon\" title=\"Delete\" style=\"color:var(--ims-danger)\" onclick=\"window.IMS_LOGISTICS.deleteFleet('${kind}','${util().jsArg(id)}','${util().jsArg(label)}')\"><i class=\"ti ti-trash\"></i></button>`;\n    return edit+toggle+del;\n  }\n  async function _fleetUsage(kind,id){\n    const c=_rcDb(), used=[];\n    const count=async(q)=>{ const {count:n}=await q; return n||0; };\n    if(kind==='driver'){\n      const m=await count(c.from('manifests').select('id',{count:'exact',head:true}).eq('driver_id',id)); if(m) used.push(`${m} manifest${m===1?'':'s'}`);\n      const t=await count(c.from('cod_transactions').select('id',{count:'exact',head:true}).eq('driver_id',id)); if(t) used.push(`${t} COD transaction${t===1?'':'s'}`);\n      const {data:acc}=await c.from('driver_cod_accounts').select('id,balance').eq('driver_id',id).maybeSingle();\n      if(acc&&Number(acc.balance)) used.push(`a COD balance of ${util().formatCurrency(Math.abs(Number(acc.balance)))}`);\n      const {data:logins}=await c.from('users').select('name').eq('driver_id',id).eq('is_active',true);   // active logins only\n      if((logins||[]).length) used.push(`the driver login${logins.length===1?'':'s'} ${logins.map(u=>u.name).join(', ')}`);\n      return {used,emptyAccount:acc&&!Number(acc.balance)&&!t?acc.id:null};\n    }\n    const m=await count(c.from('manifests').select('id',{count:'exact',head:true}).eq('vehicle_id',id)); if(m) used.push(`${m} manifest${m===1?'':'s'}`);\n    return {used,emptyAccount:null};\n  }\n  async function deleteFleet(kind,id,label){\n    if(!window.SM.AUTH.isAdmin()){ ui().toast('Only an Admin can delete a '+kind,'error'); return; }\n    const {used,emptyAccount}=await _fleetUsage(kind,id);\n    const what=kind==='driver'?'driver':'vehicle';\n    if(used.length){\n      ui().confirm(`<strong>${util().sanitize(label)}</strong> cannot be deleted: this ${what} has ${util().sanitize(used.join(', '))}. Deleting would break that history.<br><br>Deactivate instead? It will be hidden from new manifests${kind==='driver'?' and the driver-login list, and a linked driver login can no longer use the driver app':''}. All history is kept, and you can reactivate it at any time.`,\n        ()=>setFleetActive(kind,id,label,false,true),'Deactivate instead',false);\n      return;\n    }\n    ui().confirm(`Delete the ${what} <strong>${util().sanitize(label)}</strong>? This cannot be undone.`,async()=>{\n      if(emptyAccount) await _rcDb().from('driver_cod_accounts').delete().eq('id',emptyAccount);   // an empty COD account, never used\n      const {error}=await db().remove(kind==='driver'?'drivers':'vehicles',id);\n      if(error){ ui().toast('Not deleted: '+error.message,'error',8000); return; }\n      ui().toast(`${kind==='driver'?'Driver':'Vehicle'} deleted`,'success'); loadFleet();\n    },'Delete',true);\n  }\n  async function setFleetActive(kind,id,label,active,confirmed=false){\n    if(!window.SM.AUTH.isAdmin()){ ui().toast('Only an Admin can do this','error'); return; }\n    const go=async()=>{\n      const {error}=await db().update(kind==='driver'?'drivers':'vehicles',id,{is_active:active});\n      if(error){ ui().toast('Not saved: '+error.message,'error',8000); return; }\n      ui().toast(`${util().sanitize(label)} ${active?'reactivated':'deactivated'}`,'success'); loadFleet();\n    };\n    if(active||confirmed) return go();\n    ui().confirm(`Deactivate <strong>${util().sanitize(label)}</strong>? It will be hidden from new manifests${kind==='driver'?' and the driver-login list, and a linked driver login can no longer use the driver app':''}. All history is kept.`,go,'Deactivate',false);\n  }\n\n  // \u2500\u2500\u2500 PICKING LIST \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  async function printPicklist(){\n    const checked=[...document.querySelectorAll('.ims-job-check:checked')];\n    if(!checked.length){ui().toast('Select at least one order to print picklist','warning');return;}\n    const orderIds=checked.map(cb=>cb.dataset.orderId).filter(Boolean);\n    if(!orderIds.length){ui().toast('No valid orders selected','warning');return;}\n    printPicklistForOrders(orderIds);\n  }\n\n  async function printPicklistForOrders(orderIds){\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const now=new Date().toLocaleDateString('en-GB');\n    const {data:orders}=await client.from('orders').select('id,order_number,customer_name,postcode,address').in('id',orderIds);\n    const {data:items}=await client.from('order_items').select('order_id,product_id,product_name,sku,quantity,products(name,sku,bin_location,warehouse_location)').in('order_id',orderIds);\n    const productIds=[...new Set((items||[]).map(i=>i.product_id).filter(Boolean))];\n    const locationMap={};\n    if(productIds.length){\n      const {data:stock}=await client.from('stock_levels').select('product_id,bin_location,warehouses(name)').in('product_id',productIds);\n      (stock||[]).forEach(s=>{locationMap[s.product_id]=s;});\n    }\n    const allItems=(items||[]).map(i=>({product_id:i.product_id,quantity:i.quantity,product_name:i.product_name,sku:i.sku}));\n    const pickBoxSummary=await util().getOrderBoxSummary(allItems);\n    const skuMap={};\n    (items||[]).forEach(item=>{\n      const key=item.sku||item.product_name;\n      if(!skuMap[key]){\n        const boxLine=pickBoxSummary.lines.find(l=>l.productId===item.product_id);\n        skuMap[key]={sku:item.sku||'\u2014',name:item.product_name||'\u2014',bin:locationMap[item.product_id]?.bin_location||'\u2014',warehouse:locationMap[item.product_id]?.warehouses?.name||'\u2014',totalQty:0,totalBoxes:0,totalWeightKg:0,orders:[],boxLine};\n      }\n      skuMap[key].totalQty+=item.quantity||0;\n      const orderRef=(orders||[]).find(o=>o.id===item.order_id);\n      skuMap[key].orders.push({orderNumber:orderRef?.order_number||'\u2014',customer:orderRef?.customer_name||'\u2014',qty:item.quantity||0});\n    });\n    Object.values(skuMap).forEach(row=>{if(row.boxLine&&row.boxLine.lineBoxes){row.totalBoxes=row.boxLine.lineBoxes;row.totalWeightKg=row.boxLine.lineWeightKg;}});\n    const sorted=Object.values(skuMap).sort((a,b)=>(a.bin||'zzz').localeCompare(b.bin||'zzz'));\n    const hasBoxData=pickBoxSummary.hasData;\n    const totalBoxesAll=sorted.reduce((s,p)=>s+(p.totalBoxes||0),0);\n    const totalWeightAll=sorted.reduce((s,p)=>s+(p.totalWeightKg||0),0);\n    const totalUnitsAll=sorted.reduce((s,p)=>s+p.totalQty,0);\n    const pickColWidths=hasBoxData?['10%','16%','26%','10%','8%','8%','12%','10%']:['10%','16%','30%','12%','22%','10%'];\n    const pickColumns=hasBoxData?[{label:'Bin'},{label:'SKU'},{label:'Product'},{label:'Units',align:'r'},{label:'Boxes',align:'r'},{label:'Weight',align:'r'},{label:'Warehouse'},{label:'Checked \u2713',align:'ctr'}]:[{label:'Bin'},{label:'SKU'},{label:'Product'},{label:'Units',align:'r'},{label:'Warehouse'},{label:'Checked \u2713',align:'ctr'}];\n    const pickRows=sorted.map(p=>{const base=[util().sanitize(p.bin),util().sanitize(p.sku),util().sanitize(p.name),String(p.totalQty)];const boxCols=hasBoxData?[p.totalBoxes||'\u2014',p.totalWeightKg?p.totalWeightKg+'kg':'\u2014']:[];return[...base,...boxCols,util().sanitize(p.warehouse),window.PRINT.signatureBox()];});\n    const pickTotalsRow=hasBoxData?['<td colspan=\"3\"><strong>Total</strong></td>',`<td class=\"r\"><strong>${totalUnitsAll} units</strong></td>`,`<td class=\"r\"><strong>${totalBoxesAll} boxes</strong></td>`,`<td class=\"r\"><strong>${totalWeightAll.toFixed(1)}kg</strong></td>`,'<td colspan=\"2\"></td>']:['<td colspan=\"3\"><strong>Total</strong></td>',`<td class=\"r\"><strong>${totalUnitsAll} units</strong></td>`,'<td colspan=\"2\"></td>'];\n    const pickTableHtml=window.PRINT.table({colWidths:pickColWidths,columns:pickColumns,rows:pickRows,totalsRow:pickTotalsRow});\n    const orderRows=(orders||[]).map(o=>[util().sanitize(o.order_number),util().sanitize(o.customer_name||'\u2014'),util().sanitize(o.postcode||'\u2014'),util().sanitize(o.address||'\u2014')]);\n    const orderTableHtml=window.PRINT.table({colWidths:['15%','30%','15%','40%'],columns:[{label:'Order #'},{label:'Customer'},{label:'Postcode'},{label:'Address'}],rows:orderRows});\n    const headerHtml=window.PRINT.header({title:'Pick List',docRef:`${orderIds.length} order(s) \u2014 Printed: ${now}`,rightLabel:'Picker sign-off',rightLines:[`Date: ${now}`,'Time started: ____________','Time completed: _________']});\n    const summaryHtml=hasBoxData?window.PRINT.summaryBox(`Total boxes to pick: ${pickBoxSummary.totalBoxes} &nbsp;|&nbsp; Total weight: ${pickBoxSummary.totalWeightKg} kg`):'';\n    const page=`${headerHtml}${summaryHtml}<div class=\"st\">Consolidated pick list \u2014 sorted by bin location</div><hr class=\"rule\">${pickTableHtml}<hr class=\"rule-dbl\"><div class=\"st\" style=\"margin-top:12px\">Order reference \u2014 what goes where</div><hr class=\"rule\">${orderTableHtml}<hr class=\"rule-dbl\">${window.PRINT.pageFooter(['StockMaestro \u00A9 2026 ABSA Digital','Pick List'],1,1)}`;\n    window.PRINT.renderDocument([page],`Pick List \u2014 ${orderIds.length} orders`);\n  }\n\n  // \u2500\u2500\u2500 EVENTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  // \u2500\u2500\u2500 COURIER FOLLOW-UP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function _markTab(tab){\n    document.querySelectorAll('#ims-log-tabs .ims__tab').forEach(t=>t.classList.toggle('ims__tab--active',t.dataset.tab===tab));\n  }\n  window.addEventListener('ims:panel',e=>{\n    if(e.detail.panel!=='logistics') return;\n    initTabs();\n    const go=_goTo; _goTo=null;\n    const tab=go?.tab||'tracking';\n    // The highlighted tab always matches the list shown. Before, coming back\n    // to Logistics showed Tracking while the last tab used stayed highlighted.\n    _markTab(tab);\n    if(go?.manifestId){ refreshTabBadges(); loadManifests().then(()=>openManifest(go.manifestId)); }\n    else if(tab==='tracking') loadTracking();\n    else loadTab(tab);\n    _liveStart();\n  });\n  window.addEventListener('ims:ready',()=>{\n    document.getElementById('ims-courier-setup-btn')?.addEventListener('click',()=>{\n      _goTo={tab:'couriers'};\n      window.SM.UI.showPanel('logistics');\n      _goTo=null;\n    });\n    document.getElementById('ims-manifest-btn')?.addEventListener('click',planRoute);\n  });\n\n  window.IMS_LOGISTICS={ bookCourierCollection, collectionPrice, saveCourierCollection, sendCollectionEmail, markCollectionCollected, cancelCourierCollection, renderReturnCollection, arrangeVanPickup, cancelPickup, _liveRefresh, podOpen, renderOrderPod, confirmBankTransfer, confirmStopFailed, deleteFleet, setFleetActive,\n    markVanDeparted, backToUnassigned, saveService, addService, setServiceStatus,\n    refreshCourierCharge, toggleChargeExtra, chargeEdited, moveChargePostcode, calcExpectedForShipment,\n    rcCreateCard, rcTab, rcSelectCard, rcSaveType, rcSavePrice, rcAddType, rcDeleteType, rcRenameZone, rcAddPostcodes,\n    rcRemovePostcode, rcAddZone, rcDeleteZone, rcProdFilter, rcSetType, rcBulkSet, rcApplySuggestions, rcExportProducts,\n    rcImportProducts, rcSaveExtra, rcAddExtra, rcDeleteExtra, rcSaveCard, rcNewVersion, rcDeleteVersion,\n    load:loadTracking, loadTab,\n    loadTracking, buildTrackingTable, buildFilterBar, filterTracking, toggleSwatchFilter,\n    refreshTabBadges,\n    openTrackingUpdate, saveTrackingEvent, openTrackingHistory,\n    openEditTracking, saveTrackingNumber,\n    openCourierFollowUp, saveFollowUp,\n    markAsLost, confirmMarkAsLost,\n    openRaiseClaim, saveClaim, syncClaimAmount, syncClaimType,\n    openClaimFollowUp, saveClaimFollowUp,\n    loadLostOrders, addLostOrderNote, saveLostOrderNote,\n    openCourierClaimRef, saveCourierClaimRef,\n    openSettleClaim, confirmSettleClaim,\n    openRejectClaim, confirmRejectClaim,\n    openParcelFound, confirmParcelFound, restockFoundParcel, smartRestock,\n    viewClosedClaims, openCloseNoClaim, confirmCloseNoClaim, writeOffOrderStock,\n    confirmDelivered, confirmDeliveredSave, openFailedDelivery, confirmFailed,\n    requestReAttempt, confirmReAttempt,\n    requestReturn, confirmReturn, openReturnNotify, sendReturnNotify,\n    markReturnReceived, confirmReturnReceived,\n    openActivityLog, logActivity, deductStockOnDelivery,\n    loadUnassigned, loadShipments, filterShipments, loadManifests, filterManifests, goToManifest, loadRoutes, loadFleet, loadCouriers,\n    toggleAll, assignJobCourier, confirmCourierAssignment, assignOwnTruck, confirmOwnTruck,\n    reassignToOwnTruck, confirmReassignToOwnTruck,\n    loadOwnTruckQueue, planRouteFromQueue,\n    markSelfCollection, markCollected, showSelfCollectionModal, confirmMarkCollected, cancelSelfCollection,\n    bulkAssignCourier, confirmBulkAssign, planRoute, createManifest, openManifest, updateDelivery,\n    openEditManifest, removeManifestStop, saveManifestEdit,\n    printManifest, deleteManifest,\n    showCourierForm, saveCourier, manageCourierRates, addRateBand, deleteRateBand, editSurcharge,\n    showRouteForm, saveRoute, showVehicleForm, saveVehicle, showDriverForm, saveDriver,\n    loadAllCODBalances, openCODAccount, recordCODPayment, confirmCODPayment, reconcileCODAccount,\n    printPicklist, printPicklistForOrders, cancelUnassignedOrder,\n    _failChoice: null\n  };\n})();"],
  "mappings": "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",
  "names": ["oldStatus", "error", "m"]
}
