{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/ims-accounts.js?bust=20260709"],
  "sourcesContent": ["// StockMaestro Accounts Module v3.0 \u2014 Build 3\n(function(){\n  'use strict';\n  const db=()=>window.SM.DB, ui=()=>window.SM.UI, util=()=>window.SM.UTIL;\n\n  function initTabs(){\n    const tabs=document.getElementById('ims-acc-tabs');\n    if(!tabs)return;\n    // Set the click handlers up once only. This ran on every visit to\n    // Accounts, adding another set each time, so after a few visits one\n    // click loaded the same tab several times over.\n    if(tabs.dataset.bound)return;\n    tabs.dataset.bound='1';\n    // The Courier invoices tab is added here, so ims-system.liquid needs no change.\n    if(!tabs.querySelector('[data-tab=\"courier\"]')){\n      const t=document.createElement('div'); t.className='ims__tab'; t.dataset.tab='courier'; t.textContent='Courier invoices';\n      const after=tabs.querySelector('[data-tab=\"claims\"]');\n      if(after) after.insertAdjacentElement('afterend',t); else tabs.appendChild(t);\n    }\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    switch(tab){\n      case 'overview':      loadOverview();     break;\n      case 'invoices':      loadInvoices();     break;\n      case 'notes':         loadNotes();        break;\n      case 'payables':      loadPayables();     break;\n      case 'receivables':   loadReceivables();  break;\n      case 'transactions':  loadTransactions(); break;\n      case 'claims':        loadClaims();       break;\n      case 'vat':           loadVAT();          break;\n      case 'courier':       loadCourierInvoices(); break;\n    }\n  }\n\n  // \u2500\u2500\u2500 COURIER INVOICE CHECK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 courier's invoice is entered from its PDF (deliveries, fuel, VAT,\n  // total), and its lines imported from the courier's Excel or CSV export.\n  // Each line is matched to our shipment (courier order no., tracking no.,\n  // or postcode + name + date) and compared with the charge StockMaestro\n  // expected (before fuel). Fuel is checked once, on the total. Disputed\n  // lines export as a sheet to send to the courier.\n  const _ciDb = () => window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n  const _ci2 = n => Math.round((Number(n) || 0) * 100) / 100;\n  const _ciPc = v => String(v || '').toUpperCase().replace(/\\s+/g, '');\n  const _ciToday = () => new Date().toISOString().split('T')[0];\n  const _ciAddDays = (d, n) => { const x = new Date(d + 'T12:00:00Z'); x.setUTCDate(x.getUTCDate() + n); return x.toISOString().split('T')[0]; };\n  const CI_RESULT = {\n    correct: ['success', 'Correct'], over: ['danger', 'Overcharged'], under: ['warning', 'Undercharged'],\n    likely: ['info', 'Likely match: confirm'], not_ours: ['neutral', 'Not ours?'], duplicate: ['danger', 'Billed twice'],\n    not_checked: ['warning', 'Not checked']\n  };\n  let _ciImport = null;\n\n  async function loadCourierInvoices() {\n    const content = document.getElementById('ims-acc-content'); if (!content) return;\n    const db_ = _ciDb();\n    const [{ data: invs, error }, { data: lines }, { data: pays }] = await Promise.all([\n      db_.from('courier_invoices').select('*, couriers(name)').eq('company_id', window.SM.AUTH.company?.id).order('invoice_date', { ascending: false }),\n      db_.from('courier_invoice_lines').select('invoice_id,result').eq('company_id', window.SM.AUTH.company?.id),\n      db_.from('courier_invoice_payments').select('invoice_id,amount').eq('company_id', window.SM.AUTH.company?.id)\n    ]);\n    const balOf = i => _ci2((Number(i.total) || 0) - (pays || []).filter(p => p.invoice_id === i.id).reduce((t, p) => t + (Number(p.amount) || 0), 0));\n    if (error) { content.innerHTML = `<div class=\"ims__alert ims__alert--warning\"><i class=\"ti ti-alert-triangle\"></i><span>Courier invoices could not be loaded (${util().sanitize(error.message)}).</span></div>`; return; }\n    const tally = {}; (lines || []).forEach(l => { const t = tally[l.invoice_id] = tally[l.invoice_id] || {}; t[l.result || 'none'] = (t[l.result || 'none'] || 0) + 1; });\n    content.innerHTML = `\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;gap:8px;flex-wrap:wrap\">\n        <div style=\"font-size:12px;color:var(--ims-text-muted)\">Check each courier invoice against what StockMaestro expected, before paying it.</div>\n        <button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.newCourierInvoice()\"><i class=\"ti ti-plus\"></i> New courier invoice</button>\n      </div>\n      <div class=\"ims__table-wrap\"><table class=\"ims__table\">\n        <thead><tr><th>Courier</th><th>Invoice</th><th>Date</th><th>Period</th><th>Total</th><th>Balance</th><th>Check</th><th>Status</th><th></th></tr></thead>\n        <tbody>${(invs || []).map(i => { const t = tally[i.id] || {}; const n = Object.values(t).reduce((a, b) => a + b, 0);\n          const issues = (t.over || 0) + (t.duplicate || 0) + (t.not_ours || 0) + (t.likely || 0) + (t.not_checked || 0);\n          return `<tr>\n          <td>${util().sanitize(i.couriers?.name || '-')}</td><td>${util().sanitize(i.invoice_number)}</td>\n          <td>${i.invoice_date ? util().formatDate(i.invoice_date) : '-'}</td>\n          <td style=\"font-size:12px\">${i.period_from ? util().formatDate(i.period_from) : '-'} to ${i.period_to ? util().formatDate(i.period_to) : '-'}</td>\n          <td>${util().formatCurrency(i.total)}</td>\n          <td>${i.status === 'approved' ? util().formatCurrency(balOf(i)) : '-'}</td>\n          <td style=\"font-size:12px\">${!n ? '<span style=\"color:var(--ims-text-muted)\">No lines yet</span>' : issues ? `<span style=\"color:var(--ims-danger)\">${issues} to look at</span> of ${n}` : `<span style=\"color:var(--ims-success)\">All ${n} correct</span>`}</td>\n          <td>${(() => { if (i.status === 'cancelled') return `<span class=\"ims__pill ims__pill--neutral\">Cancelled${i.replaced_by ? `: replaced by ${util().sanitize(i.replaced_by)}` : ''}</span>`;\n            if (i.status !== 'approved') return `<span class=\"ims__pill ims__pill--${i.status === 'disputed' ? 'danger' : 'info'}\">${i.status === 'checking' ? 'Checking' : 'Disputed'}</span>`;\n            const b = balOf(i); return b <= 0.005 ? '<span class=\"ims__pill ims__pill--success\">Paid</span>' : b < (Number(i.total) || 0) - 0.005 ? '<span class=\"ims__pill ims__pill--warning\">Approved, part paid</span>' : '<span class=\"ims__pill ims__pill--success\">Approved</span>'; })()}</td>\n          <td><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.openCourierInvoice('${util().jsArg(i.id)}')\">Open</button></td>\n        </tr>`; }).join('') || '<tr><td colspan=\"9\" class=\"ims__table-empty\">No courier invoices yet</td></tr>'}</tbody>\n      </table></div>`;\n  }\n\n  // The fuel % on the courier's rate card in force on a date (0 if none).\n  async function _ciCardFuel(courierId, date) {\n    const { data } = await _ciDb().from('courier_rate_cards').select('fuel_pct,valid_from').eq('courier_id', courierId).order('valid_from', { ascending: false });\n    const c = (data || []).find(x => String(x.valid_from) <= (date || _ciToday()));\n    return c ? Number(c.fuel_pct) || 0 : null;\n  }\n\n  async function newCourierInvoice() {\n    const { data: couriers } = await db().select('couriers', { eq: { is_active: true }, order: { col: 'name' } });\n    const g = id => `onchange=\"window.IMS_ACCOUNTS.ciFormCalc('${id}')\" oninput=\"window.IMS_ACCOUNTS.ciFormCalc('${id}')\"`;\n    ui().openModal('New courier invoice', `\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-ci-courier\" onchange=\"window.IMS_ACCOUNTS.ciFormFuel()\"><option value=\"\">Select courier</option>${(couriers || []).map(c => `<option value=\"${c.id}\">${util().sanitize(c.name)}</option>`).join('')}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Invoice number</label><input class=\"ims__input\" id=\"ims-ci-number\" placeholder=\"e.g. 10579\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Invoice date</label><input class=\"ims__input\" type=\"date\" id=\"ims-ci-date\" value=\"${_ciToday()}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Period</label><div style=\"display:flex;gap:6px\"><input class=\"ims__input\" type=\"date\" id=\"ims-ci-from\" onchange=\"window.IMS_ACCOUNTS.ciFormFuel()\"><input class=\"ims__input\" type=\"date\" id=\"ims-ci-to\" onchange=\"window.IMS_ACCOUNTS.ciFormFuel()\"></div></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Deliveries (\u00A3, before fuel and VAT)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-net\" ${g('net')}></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Fuel % on the invoice</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-fuelpct\" ${g('pct')}><span class=\"ims__input-hint\" id=\"ims-ci-fuelhint\"></span></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Fuel (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-fuel\" ${g('fuel')}></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">VAT (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-vat\" ${g('vat')}></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Total (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-total\" ${g('total')}></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Invoice PDF (optional)</label><input type=\"file\" id=\"ims-ci-pdf\" accept=\".pdf,.jpg,.jpeg,.png\"></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_ACCOUNTS.saveCourierInvoice(this)\"><i class=\"ti ti-check\"></i> Save and continue</button>`, 'lg');\n  }\n  // Pre-fill the fuel % from the rate card (the invoice's own % can be typed over it).\n  async function ciFormFuel() {\n    const courierId = document.getElementById('ims-ci-courier')?.value; if (!courierId) return;\n    const date = document.getElementById('ims-ci-to')?.value || document.getElementById('ims-ci-date')?.value;\n    const pct = await _ciCardFuel(courierId, date);\n    const hint = document.getElementById('ims-ci-fuelhint'), el = document.getElementById('ims-ci-fuelpct');\n    if (hint) hint.textContent = pct === null ? 'No rate card for this courier' : `Rate card: ${pct}%. Type the % the invoice shows.`;\n    if (el && el.value === '' && pct !== null) { el.value = pct; ciFormCalc('pct'); }\n  }\n  // Keep fuel, VAT and total in step while typing (each can still be typed over).\n  function ciFormCalc(changed) {\n    const v = id => parseFloat(document.getElementById(id)?.value) || 0, set = (id, n) => { const el = document.getElementById(id); if (el) el.value = _ci2(n).toFixed(2); };\n    if (changed === 'net' || changed === 'pct') set('ims-ci-fuel', v('ims-ci-net') * v('ims-ci-fuelpct') / 100);\n    if (['net', 'pct', 'fuel'].includes(changed)) set('ims-ci-vat', (v('ims-ci-net') + v('ims-ci-fuel')) * 0.2);\n    if (changed !== 'total') set('ims-ci-total', v('ims-ci-net') + v('ims-ci-fuel') + v('ims-ci-vat'));\n  }\n  async function saveCourierInvoice(btn) {\n    const val = id => document.getElementById(id)?.value?.trim() || '';\n    const num = id => _ci2(parseFloat(val(id)) || 0);\n    const courierId = val('ims-ci-courier'), number = val('ims-ci-number');\n    if (!courierId || !number) { ui().toast('Please choose the courier and enter the invoice number', 'error'); return; }\n    if (!(num('ims-ci-net') > 0)) { ui().toast('Please enter the deliveries amount from the invoice', 'error'); return; }\n    if (btn) { btn.disabled = true; }\n    const db_ = _ciDb(), co = window.SM.AUTH.company?.id;\n    const { data: inv, error } = await db_.from('courier_invoices').insert({\n      company_id: co, courier_id: courierId, invoice_number: number, invoice_date: val('ims-ci-date') || null,\n      period_from: val('ims-ci-from') || null, period_to: val('ims-ci-to') || null,\n      deliveries_net: num('ims-ci-net'), fuel_pct: num('ims-ci-fuelpct'), fuel_amount: num('ims-ci-fuel'),\n      vat_amount: num('ims-ci-vat'), total: num('ims-ci-total'),\n      created_by: window.SM.AUTH.user?.id || null, created_by_name: window.SM.AUTH.user?.name || null\n    }).select('*').single();\n    if (error) {\n      if (btn) btn.disabled = false;\n      ui().toast(/duplicate|unique/i.test(error.message) ? `Invoice ${number} for this courier has already been entered` : `Not saved: ${error.message}`, 'error', 8000);\n      return;\n    }\n    const file = document.getElementById('ims-ci-pdf')?.files?.[0];\n    if (file) {\n      if (file.size > 10 * 1024 * 1024) ui().toast('The PDF is over 10 MB, so it was not attached. The invoice is saved.', 'warning', 8000);\n      else {\n        const path = `${co}/${inv.id}/${Date.now()}_${file.name.replace(/[^A-Za-z0-9._-]+/g, '_').slice(-80)}`;\n        const { error: upErr } = await db_.storage.from('courier-invoices').upload(path, file, { contentType: file.type || undefined });\n        if (upErr) ui().toast(`The invoice is saved, but the PDF could not be attached (${upErr.message})`, 'warning', 8000);\n        else await db_.from('courier_invoices').update({ pdf_path: path }).eq('id', inv.id);\n      }\n    }\n    ui().toast(`Invoice ${number} saved. Now import its lines.`, 'success');\n    openCourierInvoice(inv.id);\n  }\n\n  // \u2500\u2500 Reading the courier's export (Excel or CSV) \u2500\u2500\n  function _ciLoadXlsx() {\n    if (window.XLSX) return Promise.resolve(window.XLSX);\n    return new Promise((resolve, reject) => {\n      const sc = document.createElement('script');\n      sc.src = 'https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js';\n      sc.onload = () => resolve(window.XLSX);\n      sc.onerror = () => reject(new Error('The Excel reader could not be loaded. Save the file as CSV and import that instead.'));\n      document.head.appendChild(sc);\n    });\n  }\n  async function _ciReadTable(file) {\n    const ext = (file.name.split('.').pop() || '').toLowerCase();\n    if (ext === 'csv') { const { headers, rows } = util().parseCSV(await file.text()); return { headers: headers.map(h => String(h).trim()), rows }; }\n    if (!['xlsx', 'xls'].includes(ext)) throw new Error('Please choose the courier\\'s Excel (.xlsx) or CSV file');\n    const X = await _ciLoadXlsx();\n    const wb = X.read(await file.arrayBuffer(), { type: 'array', cellDates: true });\n    const arr = X.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], { header: 1, raw: true, defval: '' });\n    return { headers: (arr[0] || []).map(h => String(h).trim()), rows: arr.slice(1).filter(r => r.some(c => String(c).trim() !== '')) };\n  }\n  function _ciDate(v) {\n    if (v instanceof Date && !isNaN(v)) return new Date(v.getTime() + 12 * 3600e3).toISOString().split('T')[0];\n    if (typeof v === 'number' && v > 20000 && v < 80000) return new Date(Math.round((v - 25569) * 86400e3) + 12 * 3600e3).toISOString().split('T')[0];\n    const t = String(v || '').trim(); let m;\n    if ((m = t.match(/^(\\d{1,2})[\\/.-](\\d{1,2})[\\/.-](\\d{2,4})/))) { const y = m[3].length === 2 ? '20' + m[3] : m[3]; return `${y}-${m[2].padStart(2, '0')}-${m[1].padStart(2, '0')}`; }\n    if ((m = t.match(/^(\\d{4})-(\\d{2})-(\\d{2})/))) return `${m[1]}-${m[2]}-${m[3]}`;\n    return null;\n  }\n  // Each field tries its patterns in order of preference, so a column like\n  // V1's \"Cost From\" (which holds \"Internal\") is never taken for the charge\n  // when a \"Value\" column exists.\n  const CI_FIELDS = [\n    ['order', 'Courier order no.', [/^order\\.?$/i, /^order\\s*(no|number|ref|id)\\.?$/i, /^(consignment|job|booking)(\\s*(no|number|ref))?\\.?$/i]],\n    ['tracking', 'Tracking no.', [/^tracking(\\s*(no|number|id|ref))?\\.?$/i, /track/i]],\n    ['name', 'Customer name', [/^customer\\s*name$/i, /^(customer|consignee|recipient|name)$/i, /(customer|consignee|recipient)/i]],\n    ['postcode', 'Postcode', [/^post\\s*code$/i, /post\\s*code|zip/i]],\n    ['date', 'Date', [/^run\\s*date$/i, /^deliver(y|ed)\\s*date$/i, /^date$/i, /date/i]],\n    ['qty', 'Quantity', [/^(qty|quantity)$/i, /^(items|pieces|parcels)$/i]],\n    ['weight', 'Weight', [/^weight(\\s*\\(?kg\\)?)?$/i, /weight|kg/i]],\n    ['charge', 'Charge (before fuel)', [/^value$/i, /^charge$/i, /^(amount|net|net\\s*amount)$/i, /^price$/i, /^(cost|total\\s*cost)$/i]]\n  ];\n\n  async function _ciLocked(invoiceId) {\n    const { data } = await _ciDb().from('courier_invoices').select('status').eq('id', invoiceId).maybeSingle();\n    if (data?.status === 'approved') { ui().toast('This invoice is approved, so its lines are locked. Undo the approval first.', 'warning', 7000); return true; }\n    if (data?.status === 'cancelled') { ui().toast('This invoice is cancelled, so its lines are locked. Reinstate it first.', 'warning', 7000); return true; }\n    return false;\n  }\n  async function importInvoiceLines(invoiceId, input) {\n    const file = input?.files?.[0]; if (!file) return; input.value = '';\n    if (await _ciLocked(invoiceId)) return;\n    let table;\n    try { table = await _ciReadTable(file); } catch (e) { ui().toast(e.message, 'error', 9000); return; }\n    if (!table.headers.length || !table.rows.length) { ui().toast('No lines found in that file', 'error'); return; }\n    const { data: inv } = await _ciDb().from('courier_invoices').select('courier_id').eq('id', invoiceId).single();\n    const { data: cr } = await _ciDb().from('couriers').select('invoice_columns').eq('id', inv.courier_id).maybeSingle();\n    const saved = cr?.invoice_columns || {};\n    const guess = {};\n    CI_FIELDS.forEach(([k, , patterns]) => {\n      const s = saved[k] ? table.headers.indexOf(saved[k]) : -1;\n      if (s >= 0) { guess[k] = s; return; }\n      guess[k] = -1;\n      for (const re of patterns) {\n        const i = table.headers.findIndex((h, idx) => re.test(h) && !Object.values(guess).includes(idx));\n        if (i >= 0) { guess[k] = i; break; }\n      }\n    });\n    _ciImport = { invoiceId, courierId: inv.courier_id, fileName: file.name, ...table };\n    const opt = sel => `<option value=\"-1\">- not in the file -</option>` + table.headers.map((h, i) => `<option value=\"${i}\" ${i === sel ? 'selected' : ''}>${util().sanitize(h || `Column ${i + 1}`)}</option>`).join('');\n    ui().openModal(`Import lines: ${util().sanitize(file.name)}`, `\n      <div style=\"font-size:12px;color:var(--ims-text-muted);margin-bottom:10px\">${table.rows.length} lines found. Check which column holds what (remembered for this courier next time). Postcode and charge are needed; the courier order no. gives the most exact matching.</div>\n      <div class=\"ims__form-grid\">\n        ${CI_FIELDS.map(([k, label]) => `<div class=\"ims__form-group\"><label class=\"ims__label ${['postcode', 'charge'].includes(k) ? 'ims__label--req' : ''}\">${label}</label><select class=\"ims__select\" id=\"ims-ci-col-${k}\">${opt(guess[k])}</select></div>`).join('')}\n      </div>`, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_ACCOUNTS.openCourierInvoice('${util().jsArg(invoiceId)}')\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_ACCOUNTS.confirmImportLines(this)\"><i class=\"ti ti-check\"></i> Import and check</button>`, 'lg');\n  }\n  async function confirmImportLines(btn) {\n    const im = _ciImport; if (!im) return;\n    const col = {}; CI_FIELDS.forEach(([k]) => { col[k] = parseInt(document.getElementById('ims-ci-col-' + k)?.value ?? '-1', 10); });\n    if (col.postcode < 0 || col.charge < 0) { ui().toast('Please choose the postcode and charge columns', 'error'); return; }\n    if (btn) btn.disabled = true;\n    const cell = (r, k) => col[k] >= 0 ? r[col[k]] : '';\n    const num = v => { const n = parseFloat(String(v ?? '').replace(/[\u00A3,\\s]/g, '')); return isNaN(n) ? null : n; };\n    const co = window.SM.AUTH.company?.id;\n    const rows = im.rows.map((r, i) => ({\n      company_id: co, invoice_id: im.invoiceId, line_no: i + 1,\n      courier_order_ref: String(cell(r, 'order') || '').trim() || null, tracking: String(cell(r, 'tracking') || '').trim() || null,\n      customer_name: String(cell(r, 'name') || '').trim() || null, postcode: String(cell(r, 'postcode') || '').trim().toUpperCase() || null,\n      run_date: col.date >= 0 ? _ciDate(cell(r, 'date')) : null, quantity: num(cell(r, 'qty')), weight: num(cell(r, 'weight')),\n      charge: _ci2(num(cell(r, 'charge')) || 0)\n    })).filter(l => l.postcode || l.courier_order_ref || l.charge);\n    const db_ = _ciDb();\n    await db_.from('courier_invoice_lines').delete().eq('invoice_id', im.invoiceId);\n    const { error } = await db_.from('courier_invoice_lines').insert(rows);\n    if (error) { if (btn) btn.disabled = false; ui().toast('The lines could not be saved: ' + error.message, 'error', 9000); return; }\n    const mapNames = {}; CI_FIELDS.forEach(([k]) => { if (col[k] >= 0) mapNames[k] = im.headers[col[k]]; });\n    await db_.from('couriers').update({ invoice_columns: mapNames }).eq('id', im.courierId);\n    await db_.from('courier_invoices').update({ lines_file_name: im.fileName }).eq('id', im.invoiceId);\n    _ciImport = null;\n    await runCourierCheck(im.invoiceId);\n    openCourierInvoice(im.invoiceId);\n  }\n\n  // \u2500\u2500 The check \u2500\u2500\n  function _ciNameMatch(a, b) {\n    const tok = s => String(s || '').toLowerCase().replace(/[^a-z\\s]/g, ' ').split(/\\s+/).filter(w => w.length >= 3);\n    const A = tok(a), B = tok(b);\n    return A.length && B.length && A.some(w => B.includes(w));\n  }\n  // What a delivery should have cost (before fuel). Saved with the shipment\n  // since automatic charges were added; for older deliveries it is worked\n  // out now from the rate card in force on the dispatch date (same rules as\n  // \"Assign to courier\"). If it cannot be worked out, the line is \"Not\n  // checked\" with the reason, never compared against a charge of 0 that\n  // was never calculated.\n  const _ciBlocking = /has no type|No price set|No zone found|No weight entered|for this courier/;\n  async function _ciExpected(sh, courierId) {\n    const bd = sh?.charge_breakdown;\n    if (bd && bd.method === 'type_zone' && bd.base != null) return { value: _ci2(bd.base), how: `${bd.rate?.type || 'rate'}${bd.zone ? ', ' + bd.zone : ''}${(bd.extras || []).length ? ', extras ' + bd.extras.map(e => e.name).join(' + ') : ''}${bd.floor ? ', floor ' + bd.floor : ''} (before fuel)` };\n    if (sh?.expected_charge != null) return { value: _ci2(sh.expected_charge), how: 'weight bands' };\n    const calcFn = window.IMS_LOGISTICS?.calcExpectedForShipment;\n    if (calcFn) {\n      const calc = await calcFn({ courierId, orderId: sh.order_id, postcode: sh.orders?.postcode || '', date: String(sh.dispatched_at || '').split('T')[0] || undefined, weightKg: sh.weight_actual });\n      if (calc) {\n        const blocking = (calc.flags || []).filter(x => _ciBlocking.test(x));\n        if (blocking.length || !calc.rateLine || calc.rateLine.price == null) return { notChecked: true, why: (blocking.length ? blocking : ['no price could be worked out']).join('; ') };\n        return { value: _ci2(calc.base), how: `${calc.rateLine.type}${calc.zone ? ', ' + calc.zone.name : ''}${calc.extras.some(e => e.on) ? ', extras ' + calc.extras.filter(e => e.on).map(e => e.name).join(' + ') : ''} (before fuel; worked out now from the rate card, older shipment)` };\n      }\n    }\n    if (!(Number(sh?.charge_amount) > 0)) return { notChecked: true, why: 'no charge was worked out for this delivery when it was sent' };\n    return { value: _ci2(sh.charge_amount), how: 'the charge recorded at dispatch (older shipment)' };\n  }\n  async function runCourierCheck(invoiceId) {\n    const db_ = _ciDb();\n    const { data: inv } = await db_.from('courier_invoices').select('*').eq('id', invoiceId).single();\n    if (inv?.status === 'approved' || inv?.status === 'cancelled') return;   // locked\n    const { data: lines } = await db_.from('courier_invoice_lines').select('*').eq('invoice_id', invoiceId).order('line_no', { ascending: true });\n    const from = inv.period_from || _ciAddDays(inv.invoice_date || _ciToday(), -31), to = inv.period_to || inv.invoice_date || _ciToday();\n    const refs = [...new Set((lines || []).map(l => l.courier_order_ref).filter(Boolean))];\n    const sel = 'id,order_id,tracking_number,courier_order_ref,charge_amount,expected_charge,charge_breakdown,dispatched_at,weight_actual,orders(order_number,customer_name,postcode)';\n    const [{ data: byDate }, { data: byRef }, { data: otherLines }] = await Promise.all([\n      db_.from('shipments').select(sel).eq('courier_id', inv.courier_id).gte('dispatched_at', _ciAddDays(from, -14) + 'T00:00:00').lte('dispatched_at', _ciAddDays(to, 3) + 'T23:59:59'),\n      refs.length ? db_.from('shipments').select(sel).eq('courier_id', inv.courier_id).in('courier_order_ref', refs) : { data: [] },\n      db_.from('courier_invoice_lines').select('invoice_id,courier_order_ref,shipment_id').eq('company_id', inv.company_id).neq('invoice_id', invoiceId)\n    ]);\n    // Shipments linked by hand or confirmed are always loaded, whatever\n    // their date (they may fall outside the date window searched above).\n    const linkedIds = [...new Set((lines || []).filter(l => l.shipment_id && l.confirmed).map(l => l.shipment_id))];\n    const { data: byLink } = linkedIds.length ? await db_.from('shipments').select(sel).in('id', linkedIds) : { data: [] };\n    const ships = {}; [...(byDate || []), ...(byRef || []), ...(byLink || [])].forEach(x => { ships[x.id] = x; });\n    const shipList = Object.values(ships);\n    // A cancelled invoice (replaced by a corrected one) is history only: its\n    // lines never make the replacement look \"billed twice\".\n    const { data: otherInvs } = await db_.from('courier_invoices').select('id,invoice_number,status').eq('courier_id', inv.courier_id);\n    const sameCourier = new Set((otherInvs || []).filter(i => i.status !== 'cancelled').map(i => i.id));\n    const earlier = (otherLines || []).filter(l => sameCourier.has(l.invoice_id));\n    const invNo = id => (otherInvs || []).find(i => i.id === id)?.invoice_number || 'another invoice';\n    const used = new Set(), seenRef = new Set(), updates = [], learn = [];\n    for (const l of (lines || [])) {\n      let sh = null, matchType = null, conf = 'none';\n      if (l.confirmed && l.shipment_id && ships[l.shipment_id]) { sh = ships[l.shipment_id]; matchType = l.match_type || 'manual'; conf = 'exact'; }\n      if (!sh && l.courier_order_ref) { sh = shipList.find(x => x.courier_order_ref && x.courier_order_ref.toUpperCase() === l.courier_order_ref.toUpperCase() && !used.has(x.id)); if (sh) { matchType = 'order_no'; conf = 'exact'; } }\n      if (!sh && l.tracking) { sh = shipList.find(x => x.tracking_number && x.tracking_number.toUpperCase() === l.tracking.toUpperCase() && !used.has(x.id)); if (sh) { matchType = 'tracking'; conf = 'exact'; } }\n      if (!sh && l.postcode) {\n        const pc = _ciPc(l.postcode);\n        const cands = shipList.filter(x => !used.has(x.id) && _ciPc(x.orders?.postcode) === pc).filter(x => {\n          if (!l.run_date) return true;\n          const d = String(x.dispatched_at || '').split('T')[0];\n          return d && l.run_date >= _ciAddDays(d, -1) && l.run_date <= _ciAddDays(d, 10);\n        });\n        const named = cands.filter(x => _ciNameMatch(l.customer_name, x.orders?.customer_name));\n        const pickNearest = arr => arr.sort((a, b) => Math.abs(new Date(a.dispatched_at) - new Date(l.run_date || a.dispatched_at)) - Math.abs(new Date(b.dispatched_at) - new Date(l.run_date || b.dispatched_at)))[0];\n        if (named.length) { sh = pickNearest(named); matchType = 'smart'; conf = 'sure'; }\n        else if (cands.length) { sh = pickNearest(cands); matchType = 'smart'; conf = 'likely'; }\n      }\n      let result, expected = null, difference = null, reason = null;\n      const dupHere = l.courier_order_ref && seenRef.has(l.courier_order_ref.toUpperCase());\n      const dupEarlier = earlier.find(e => (l.courier_order_ref && e.courier_order_ref && e.courier_order_ref.toUpperCase() === l.courier_order_ref.toUpperCase()) || (sh && e.shipment_id === sh.id));\n      if (l.courier_order_ref) seenRef.add(l.courier_order_ref.toUpperCase());\n      if (sh) used.add(sh.id);\n      if (dupHere || dupEarlier) {\n        result = 'duplicate'; reason = dupHere ? 'This courier order no. appears more than once on this invoice' : `Already billed on invoice ${invNo(dupEarlier.invoice_id)}`;\n      } else if (!sh) {\n        result = 'not_ours'; reason = 'No shipment of ours matches this line';\n      } else {\n        const ex = await _ciExpected(sh, inv.courier_id);\n        const who = `${sh.orders?.order_number || ''}`;\n        if (!ex.notChecked) { expected = ex.value; difference = _ci2(l.charge - expected); }\n        if (conf === 'likely' && !l.confirmed) { result = 'likely'; reason = `Same postcode and date as ${who}, but the name differs (${sh.orders?.customer_name || '-'}): confirm it is the same delivery`; }\n        else if (ex.notChecked) { result = 'not_checked'; reason = `${who}: could not work out the expected charge (${ex.why})`; }\n        else if (Math.abs(difference) <= 0.05) { result = 'correct'; reason = `${who}: ${ex.how}`; }\n        else if (difference > 0) { result = 'over'; reason = `${who}: billed ${util().formatCurrency(l.charge)}, expected ${util().formatCurrency(expected)} (${ex.how})`; }\n        else { result = 'under'; reason = `${who}: billed ${util().formatCurrency(l.charge)}, expected ${util().formatCurrency(expected)} (${ex.how})`; }\n        // Learn the courier's order no. for exact matching next time.\n        if (l.courier_order_ref && !sh.courier_order_ref && (conf !== 'likely' || l.confirmed)) learn.push([sh.id, l.courier_order_ref]);\n      }\n      updates.push({ id: l.id, shipment_id: sh?.id || null, match_type: matchType, confidence: conf, result, expected, difference, reason });\n    }\n    for (let i = 0; i < updates.length; i += 10) {\n      await Promise.all(updates.slice(i, i + 10).map(u => { const { id, ...f } = u; return db_.from('courier_invoice_lines').update(f).eq('id', id); }));\n    }\n    for (const [sid, ref] of learn) await db_.from('shipments').update({ courier_order_ref: ref }).eq('id', sid);\n  }\n\n  async function openCourierInvoice(invoiceId) {\n    const db_ = _ciDb();\n    const { data: inv } = await db_.from('courier_invoices').select('*, couriers(name)').eq('id', invoiceId).single();\n    if (!inv) { ui().toast('Invoice not found', 'error'); return; }\n    const { data: lines } = await db_.from('courier_invoice_lines').select('*').eq('invoice_id', invoiceId).order('line_no', { ascending: true });\n    const L = lines || [];\n    const linesTotal = _ci2(L.reduce((t, l) => t + (Number(l.charge) || 0), 0));\n    const cardFuel = await _ciCardFuel(inv.courier_id, inv.period_to || inv.invoice_date);\n    const fuelBase = L.length ? linesTotal : Number(inv.deliveries_net) || 0;\n    const expFuel = cardFuel === null ? null : _ci2(fuelBase * cardFuel / 100);\n    const fuelDiff = expFuel === null ? null : _ci2((Number(inv.fuel_amount) || 0) - expFuel);\n    // Our shipments in the period not on any invoice of this courier.\n    let notBilled = [];\n    if (inv.period_from && inv.period_to) {\n      const { data: ps } = await db_.from('shipments').select('id,dispatched_at,expected_charge,charge_amount,orders(order_number,customer_name,postcode)')\n        .eq('courier_id', inv.courier_id).gte('dispatched_at', inv.period_from + 'T00:00:00').lte('dispatched_at', inv.period_to + 'T23:59:59');\n      const { data: billed } = await db_.from('courier_invoice_lines').select('shipment_id,invoice_id').eq('company_id', inv.company_id).not('shipment_id', 'is', null);\n      const { data: cancelledInvs } = await db_.from('courier_invoices').select('id').eq('company_id', inv.company_id).eq('status', 'cancelled');\n      const cx = new Set((cancelledInvs || []).map(x => x.id));\n      const b = new Set((billed || []).filter(x => !cx.has(x.invoice_id)).map(x => x.shipment_id));\n      notBilled = (ps || []).filter(x => !b.has(x.id));\n    }\n    const { data: paysR } = await db_.from('courier_invoice_payments').select('*').eq('invoice_id', invoiceId).order('paid_on', { ascending: true });\n    const pays = paysR || [];\n    const locked = inv.status === 'approved', cancelled = inv.status === 'cancelled', frozen = locked || cancelled, adm = window.SM.AUTH.isAdmin();\n    const paidTot = _ci2(pays.filter(x => x.kind === 'payment').reduce((t, x) => t + (Number(x.amount) || 0), 0));\n    const creditTot = _ci2(pays.filter(x => x.kind === 'credit').reduce((t, x) => t + (Number(x.amount) || 0), 0));\n    const due = _ci2((Number(inv.total) || 0) - paidTot - creditTot);\n    const count = k => L.filter(l => l.result === k).length;\n    const overTotal = _ci2(L.filter(l => l.result === 'over').reduce((t, l) => t + (l.difference || 0), 0));\n    const fm = n => util().formatCurrency(n);\n    const okPill = good => `<span class=\"ims__pill ims__pill--${good ? 'success' : 'danger'}\" style=\"font-size:10px\">${good ? 'Matches' : 'Check'}</span>`;\n    const lineRow = l => {\n      const [cls, label] = CI_RESULT[l.result] || ['neutral', l.result || '-'];\n      return `<tr>\n        <td>${l.line_no}</td><td style=\"font-size:12px\">${util().sanitize(l.courier_order_ref || l.tracking || '-')}</td>\n        <td style=\"font-size:12px\">${util().sanitize(l.customer_name || '-')}<div style=\"color:var(--ims-text-muted)\">${util().sanitize(l.postcode || '')}${l.run_date ? ' &middot; ' + util().formatDate(l.run_date) : ''}</div></td>\n        <td>${fm(l.charge)}</td><td>${l.expected != null ? fm(l.expected) : '-'}</td>\n        <td style=\"color:${(l.difference || 0) > 0.05 ? 'var(--ims-danger)' : (l.difference || 0) < -0.05 ? 'var(--ims-warning)' : ''}\">${l.difference != null ? fm(l.difference) : '-'}</td>\n        <td><span class=\"ims__pill ims__pill--${cls}\" style=\"font-size:10px\">${label}</span><div style=\"font-size:11px;color:var(--ims-text-muted);max-width:340px\">${util().sanitize(l.reason || '')}</div></td>\n        <td style=\"white-space:nowrap\">${frozen ? '' : l.result === 'likely' ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.confirmInvoiceLine('${util().jsArg(l.id)}','${util().jsArg(invoiceId)}')\">Confirm</button>` : ''}\n          ${!frozen && (l.result === 'not_ours' || l.result === 'likely') ? `<input class=\"ims__input ims__input--sm\" style=\"width:110px\" placeholder=\"Order no.\" id=\"ims-ci-link-${l.id}\"><button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.linkInvoiceLine('${util().jsArg(l.id)}','${util().jsArg(invoiceId)}')\">Link</button>` : ''}\n          ${!frozen && l.shipment_id && l.confirmed ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" title=\"Undo this match\" onclick=\"window.IMS_ACCOUNTS.unlinkInvoiceLine('${util().jsArg(l.id)}','${util().jsArg(invoiceId)}')\"><i class=\"ti ti-unlink\"></i></button>` : ''}</td>\n      </tr>`;\n    };\n    ui().openModal(`${util().sanitize(inv.couriers?.name || 'Courier')} invoice ${util().sanitize(inv.invoice_number)}`, `\n      <div style=\"display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px;margin-bottom:12px\">\n        <div class=\"ims__card\" style=\"padding:10px\"><div class=\"ims__label\">Deliveries</div><div style=\"font-weight:700\">${fm(inv.deliveries_net)}</div>\n          <div style=\"font-size:12px\">Lines add up to ${fm(linesTotal)} ${L.length ? okPill(Math.abs(linesTotal - inv.deliveries_net) <= 0.05) : ''}</div></div>\n        <div class=\"ims__card\" style=\"padding:10px\"><div class=\"ims__label\">Fuel</div><div style=\"font-weight:700\">${fm(inv.fuel_amount)} <span style=\"font-weight:400;font-size:12px\">(${inv.fuel_pct}%)</span></div>\n          <div style=\"font-size:12px\">${cardFuel === null ? 'No rate card to compare' : `Rate card ${cardFuel}%: expected ${fm(expFuel)} ${okPill(Math.abs(fuelDiff) <= 0.05)}${Math.abs(fuelDiff) > 0.05 ? `<div style=\"color:var(--ims-danger)\">${fm(fuelDiff)} ${fuelDiff > 0 ? 'over' : 'under'}</div>` : ''}`}</div></div>\n        <div class=\"ims__card\" style=\"padding:10px\"><div class=\"ims__label\">VAT / Total</div><div style=\"font-weight:700\">${fm(inv.vat_amount)} / ${fm(inv.total)}</div>\n          <div style=\"font-size:12px\">${inv.period_from ? util().formatDate(inv.period_from) : '-'} to ${inv.period_to ? util().formatDate(inv.period_to) : '-'}</div></div>\n        <div class=\"ims__card\" style=\"padding:10px\"><div class=\"ims__label\">Check</div>\n          <div style=\"font-size:12px\">${L.length ? `${count('correct')} correct &middot; <span style=\"color:var(--ims-danger)\">${count('over')} over (${fm(overTotal)})</span> &middot; ${count('under')} under &middot; ${count('likely')} to confirm &middot; ${count('not_ours')} not ours &middot; ${count('duplicate')} billed twice${count('not_checked') ? ` &middot; <span style=\"color:var(--ims-warning)\">${count('not_checked')} not checked</span>` : ''}` : 'No lines imported yet'}</div></div>\n      </div>\n      ${locked ? `<div class=\"ims__alert ims__alert--success\" style=\"margin-bottom:10px\"><i class=\"ti ti-circle-check\"></i><span>Approved by ${util().sanitize(inv.approved_by_name || '-')} on ${inv.approved_at ? util().formatDate(String(inv.approved_at).split('T')[0]) : '-'}. Courier costs for this invoice now equal ${fm((Number(inv.deliveries_net) || 0) + (Number(inv.fuel_amount) || 0))} (before VAT): ${fm(inv.recorded_at_dispatch || 0)} was already recorded at dispatch, and approval ${(inv.adjustment_amount || 0) < 0 ? 'took off' : 'added'} ${fm(Math.abs(inv.adjustment_amount || 0))}, with VAT of ${fm(inv.vat_amount)}. The lines are locked.</span></div>` : ''}\n      ${cancelled ? `<div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:10px\"><i class=\"ti ti-ban\"></i><span>Cancelled by ${util().sanitize(inv.cancelled_by_name || '-')} on ${inv.cancelled_at ? util().formatDate(String(inv.cancelled_at).split('T')[0]) : '-'}${inv.replaced_by ? `, replaced by invoice <strong>${util().sanitize(inv.replaced_by)}</strong>` : ''}${inv.cancel_reason ? ` (${util().sanitize(inv.cancel_reason)})` : ''}. Kept for history: it is left out of the checks, Payables and totals.</span></div>` : ''}\n      <div style=\"display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:10px\">\n        ${cancelled ? (adm ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.reinstateCourierInvoice('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-arrow-back-up\"></i> Reinstate</button>` : '') : locked ? (adm && !pays.length ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.undoCourierApproval('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-arrow-back-up\"></i> Undo approval</button>` : '') : `\n        ${adm && L.length ? `<button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.approveCourierInvoice('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-check\"></i> Approve</button>` : ''}\n        <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.editCourierInvoice('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-edit\"></i> Edit details</button>\n        ${adm ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" style=\"color:var(--ims-danger)\" onclick=\"window.IMS_ACCOUNTS.cancelCourierInvoice('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-ban\"></i> Cancel: replaced</button>` : ''}\n        <label class=\"ims__btn ims__btn--secondary ims__btn--sm\" style=\"cursor:pointer\"><i class=\"ti ti-upload\"></i> ${L.length ? 'Re-import lines' : 'Import lines (Excel or CSV)'}<input type=\"file\" accept=\".xlsx,.xls,.csv\" style=\"display:none\" onchange=\"window.IMS_ACCOUNTS.importInvoiceLines('${util().jsArg(invoiceId)}',this)\"></label>\n        ${L.length ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.recheckCourierInvoice('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-refresh\"></i> Check again</button>\n        <button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.exportDisputeSheet('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-download\"></i> Dispute sheet</button>` : ''}\n        ${inv.pdf_path ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.viewCourierInvoicePdf('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-file-text\"></i> View PDF</button>` : ''}\n        ${inv.status === 'checking' ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.setCourierInvoiceStatus('${util().jsArg(invoiceId)}','disputed')\"><i class=\"ti ti-flag\"></i> Mark as disputed</button>` : inv.status === 'disputed' ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.setCourierInvoiceStatus('${util().jsArg(invoiceId)}','checking')\">Back to checking</button>` : ''}`}\n        ${inv.lines_file_name ? `<span style=\"font-size:11px;color:var(--ims-text-muted)\">Lines from ${util().sanitize(inv.lines_file_name)}</span>` : ''}\n      </div>\n      ${L.length ? `<div class=\"ims__table-wrap\" style=\"max-height:48vh;overflow:auto\"><table class=\"ims__table\">\n        <thead><tr><th>#</th><th>Courier ref</th><th>Customer</th><th>Billed</th><th>Expected</th><th>Difference</th><th>Result</th><th></th></tr></thead>\n        <tbody>${L.map(lineRow).join('')}</tbody></table></div>` : ''}\n      ${locked ? `<div style=\"margin-top:14px;border-top:1px solid var(--ims-border);padding-top:10px\">\n        <div style=\"display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px\"><strong style=\"font-size:13px\">Payments and credits</strong>\n          <span style=\"font-size:13px\">Total ${fm(inv.total)} &middot; paid ${fm(paidTot)}${creditTot ? ` &middot; credits ${fm(creditTot)}` : ''} &middot; <strong style=\"color:${due > 0.005 ? 'var(--ims-danger)' : 'var(--ims-success)'}\">${due > 0.005 ? 'balance due ' + fm(due) : 'paid in full'}</strong></span></div>\n        ${pays.length ? `<table class=\"ims__table\" style=\"margin-top:6px\"><tbody>${pays.map(x => `<tr><td>${util().formatDate(x.paid_on)}</td><td>${x.kind === 'credit' ? '<span class=\"ims__pill ims__pill--info\" style=\"font-size:10px\">Credit</span>' : 'Payment'}</td><td>${fm(x.amount)}${x.kind === 'credit' ? ` <span style=\"font-size:11px;color:var(--ims-text-muted)\">(${fm(x.net_amount)} + VAT ${fm(x.vat_amount)})</span>` : ''}</td><td style=\"font-size:12px\">${util().sanitize([x.method, x.reference].filter(Boolean).join(' \u00B7 ') || '-')}</td><td style=\"font-size:12px;color:var(--ims-text-muted)\">${util().sanitize(x.created_by_name || '')}</td><td>${adm ? `<button class=\"ims__btn ims__btn--ghost ims__btn--sm ims__btn--icon\" title=\"Remove\" onclick=\"window.IMS_ACCOUNTS.removeCourierPayment('${util().jsArg(x.id)}','${util().jsArg(invoiceId)}')\"><i class=\"ti ti-trash\"></i></button>` : ''}</td></tr>`).join('')}</tbody></table>` : ''}\n        ${adm ? `<div style=\"display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:8px;font-size:12px\">\n          <strong>Payment:</strong><input class=\"ims__input ims__input--sm\" type=\"date\" id=\"ims-cip-date\" value=\"${_ciToday()}\" style=\"width:auto\">\n          <input class=\"ims__input ims__input--sm\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-cip-amount\" value=\"${due > 0 ? due.toFixed(2) : ''}\" style=\"width:100px\">\n          <select class=\"ims__select\" id=\"ims-cip-method\" style=\"width:auto;font-size:12px\"><option>Bank transfer</option><option>Card</option><option>Cash</option><option>Other</option></select>\n          <input class=\"ims__input ims__input--sm\" id=\"ims-cip-ref\" placeholder=\"Reference\" style=\"width:120px\">\n          <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.recordCourierPayment('${util().jsArg(invoiceId)}')\">Record payment</button>\n        </div>\n        <div style=\"display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:6px;font-size:12px\">\n          <strong>Credit from the courier:</strong><input class=\"ims__input ims__input--sm\" type=\"date\" id=\"ims-cic-date\" value=\"${_ciToday()}\" style=\"width:auto\">\n          <input class=\"ims__input ims__input--sm\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-cic-net\" placeholder=\"Net (\u00A3)\" style=\"width:90px\" oninput=\"document.getElementById('ims-cic-vat').value=((parseFloat(this.value)||0)*0.2).toFixed(2)\">\n          <input class=\"ims__input ims__input--sm\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-cic-vat\" placeholder=\"VAT (\u00A3)\" style=\"width:90px\">\n          <input class=\"ims__input ims__input--sm\" id=\"ims-cic-ref\" placeholder=\"Credit note no.\" style=\"width:120px\">\n          <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.recordCourierCredit('${util().jsArg(invoiceId)}')\">Record credit</button>\n        </div>` : ''}\n      </div>` : ''}\n      ${notBilled.length ? `<div style=\"margin-top:12px\"><strong style=\"font-size:13px\">Not yet billed</strong> <span style=\"font-size:12px;color:var(--ims-text-muted)\">(our shipments in this period that are not on any invoice from this courier yet)</span>\n        <div style=\"font-size:12px;margin-top:4px\">${notBilled.map(x => `${util().sanitize(x.orders?.order_number || '-')} (${util().sanitize(x.orders?.postcode || '')}, ${util().formatDate(String(x.dispatched_at).split('T')[0])})`).join(' &middot; ')}</div></div>` : ''}\n    `, `<button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal();window.IMS_ACCOUNTS.loadCourierInvoicesIfOpen()\">Close</button>`, 'xl');\n  }\n  function loadCourierInvoicesIfOpen() { if (document.querySelector('#ims-acc-tabs [data-tab=\"courier\"].ims__tab--active')) loadCourierInvoices(); }\n  async function recheckCourierInvoice(invoiceId) { if (await _ciLocked(invoiceId)) return; await runCourierCheck(invoiceId); openCourierInvoice(invoiceId); ui().toast('Checked again', 'success'); }\n  async function confirmInvoiceLine(lineId, invoiceId) {\n    if (await _ciLocked(invoiceId)) return;\n    const { error } = await _ciDb().from('courier_invoice_lines').update({ confirmed: true }).eq('id', lineId);\n    if (error) { ui().toast('Not saved: ' + error.message, 'error'); return; }\n    await runCourierCheck(invoiceId); openCourierInvoice(invoiceId);\n  }\n  async function unlinkInvoiceLine(lineId, invoiceId) {\n    if (await _ciLocked(invoiceId)) return;\n    await _ciDb().from('courier_invoice_lines').update({ confirmed: false, shipment_id: null, match_type: null }).eq('id', lineId);\n    await runCourierCheck(invoiceId); openCourierInvoice(invoiceId);\n  }\n  // Link a line to one of our orders by hand (its courier shipment).\n  async function linkInvoiceLine(lineId, invoiceId) {\n    if (await _ciLocked(invoiceId)) return;\n    const ord = (document.getElementById('ims-ci-link-' + lineId)?.value || '').trim().toUpperCase();\n    if (!ord) { ui().toast('Type the order number to link', 'warning'); return; }\n    const db_ = _ciDb();\n    const { data: inv } = await db_.from('courier_invoices').select('courier_id').eq('id', invoiceId).single();\n    const { data: o } = await db_.from('orders').select('id').eq('order_number', ord).maybeSingle();\n    if (!o) { ui().toast(`Order ${ord} not found`, 'error'); return; }\n    const { data: sh } = await db_.from('shipments').select('id').eq('order_id', o.id).eq('courier_id', inv.courier_id).limit(1);\n    if (!(sh || []).length) { ui().toast(`${ord} has no shipment with this courier`, 'error', 7000); return; }\n    await db_.from('courier_invoice_lines').update({ shipment_id: sh[0].id, confirmed: true, match_type: 'manual' }).eq('id', lineId);\n    await runCourierCheck(invoiceId); openCourierInvoice(invoiceId);\n  }\n  // \u2500\u2500 Approval: Accounts' courier costs become exactly the invoice \u2500\u2500\n  // At dispatch, each delivery's charge was recorded as a \"Courier charges\"\n  // expense (older V1 deliveries at \u00A30). Approval records ONE adjustment:\n  // (deliveries + fuel) minus what is already recorded for the deliveries\n  // on this invoice, carrying the invoice's VAT, so costs equal the invoice\n  // and nothing is counted twice. A delivery already counted on another\n  // approved invoice is not counted again.\n  async function _ciApprovalFigures(invoiceId) {\n    const db_ = _ciDb();\n    const { data: inv } = await db_.from('courier_invoices').select('*, couriers(name)').eq('id', invoiceId).single();\n    const { data: lines } = await db_.from('courier_invoice_lines').select('shipment_id,result').eq('invoice_id', invoiceId);\n    // Each delivery on this invoice counts once (even if billed on two\n    // lines); a delivery already counted on another APPROVED invoice is\n    // not counted again.\n    const ids = [...new Set((lines || []).filter(l => l.shipment_id).map(l => l.shipment_id))];\n    let counted = new Set();\n    if (ids.length) {\n      const { data: others } = await db_.from('courier_invoice_lines').select('shipment_id,invoice_id').in('shipment_id', ids).neq('invoice_id', invoiceId);\n      const otherInv = [...new Set((others || []).map(o => o.invoice_id))];\n      if (otherInv.length) {\n        const { data: appr } = await db_.from('courier_invoices').select('id').in('id', otherInv).eq('status', 'approved');\n        const ok = new Set((appr || []).map(a => a.id));\n        counted = new Set((others || []).filter(o => ok.has(o.invoice_id)).map(o => o.shipment_id));\n      }\n    }\n    const use = ids.filter(id => !counted.has(id));\n    const { data: ships } = use.length ? await db_.from('shipments').select('id,charge_amount').in('id', use) : { data: [] };\n    const recorded = _ci2((ships || []).reduce((t, x) => t + (Number(x.charge_amount) || 0), 0));\n    const invoiceNet = _ci2((Number(inv.deliveries_net) || 0) + (Number(inv.fuel_amount) || 0));\n    const count = k => (lines || []).filter(l => l.result === k).length;\n    return { inv, recorded, invoiceNet, adjustment: _ci2(invoiceNet - recorded), deliveries: use.length,\n             open: { over: count('over'), likely: count('likely'), not_checked: count('not_checked'), not_ours: count('not_ours'), duplicate: count('duplicate') } };\n  }\n  async function approveCourierInvoice(invoiceId) {\n    if (!window.SM.AUTH.isAdmin()) { ui().toast('Only an Admin can approve a courier invoice', 'error'); return; }\n    const fg = await _ciApprovalFigures(invoiceId), fm = n => util().formatCurrency(n);\n    const o = fg.open, openTxt = [o.over && `${o.over} overcharged`, o.duplicate && `${o.duplicate} billed twice`, o.not_ours && `${o.not_ours} not ours?`, o.likely && `${o.likely} to confirm`, o.not_checked && `${o.not_checked} not checked`].filter(Boolean).join(', ');\n    ui().openModal(`Approve invoice ${util().sanitize(fg.inv.invoice_number)}`, `\n      ${openTxt ? `<div class=\"ims__alert ims__alert--warning\"><i class=\"ti ti-alert-triangle\"></i><span>Still open on this invoice: ${openTxt}. Approve only what you agree to pay; a credit from the courier can be recorded later.</span></div>` : ''}\n      <table class=\"ims__table\" style=\"margin-top:8px\"><tbody>\n        <tr><td>Invoice: deliveries + fuel (before VAT)</td><td style=\"text-align:right\">${fm(fg.invoiceNet)}</td></tr>\n        <tr><td>Already recorded at dispatch (${fg.deliveries} deliveries on this invoice)</td><td style=\"text-align:right\">${fm(fg.recorded)}</td></tr>\n        <tr style=\"font-weight:700\"><td>Approval will ${fg.adjustment < 0 ? 'take off' : 'add'} (Courier charges)</td><td style=\"text-align:right\">${fm(Math.abs(fg.adjustment))}</td></tr>\n        <tr><td>VAT on the invoice (reclaimable)</td><td style=\"text-align:right\">${fm(fg.inv.vat_amount)}</td></tr>\n      </tbody></table>\n      <div style=\"font-size:12px;color:var(--ims-text-muted);margin-top:8px\">Afterwards the invoice's lines are locked, and payments can be recorded. You can undo the approval until a payment or credit is recorded.</div>`,\n      `<button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_ACCOUNTS.openCourierInvoice('${util().jsArg(invoiceId)}')\">Cancel</button>\n       <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_ACCOUNTS.confirmApproveCourierInvoice('${util().jsArg(invoiceId)}',this)\"><i class=\"ti ti-check\"></i> Approve and record</button>`, 'lg');\n  }\n  async function confirmApproveCourierInvoice(invoiceId, btn) {\n    if (!window.SM.AUTH.isAdmin()) return;\n    if (btn) btn.disabled = true;\n    const fg = await _ciApprovalFigures(invoiceId);   // worked out again, so nothing is stale\n    if (fg.inv.status === 'approved') { ui().toast('This invoice is already approved', 'info'); openCourierInvoice(invoiceId); return; }\n    const db_ = _ciDb(), name = fg.inv.couriers?.name || 'Courier';\n    const { data: tx, error: txErr } = await db_.from('transactions').insert({\n      company_id: fg.inv.company_id, date: fg.inv.invoice_date || _ciToday(), type: 'expense', category: 'Courier charges',\n      description: `Courier charges: ${name} invoice ${fg.inv.invoice_number} (invoice ${util().formatCurrency(fg.invoiceNet)} less ${util().formatCurrency(fg.recorded)} recorded at dispatch)`,\n      amount: fg.adjustment, vat_amount: _ci2(fg.inv.vat_amount), reference: `CI-${fg.inv.invoice_number}`\n    }).select('id').single();\n    if (txErr) { if (btn) btn.disabled = false; ui().toast('Not approved: the Accounts entry could not be recorded (' + txErr.message + ')', 'error', 9000); return; }\n    const { error } = await db_.from('courier_invoices').update({\n      status: 'approved', approved_at: new Date().toISOString(), approved_by: window.SM.AUTH.user?.id || null, approved_by_name: window.SM.AUTH.user?.name || null,\n      recorded_at_dispatch: fg.recorded, adjustment_amount: fg.adjustment, adjustment_tx_id: tx.id\n    }).eq('id', invoiceId);\n    if (error) {\n      await db_.from('transactions').delete().eq('id', tx.id);   // keep Accounts and the invoice in step\n      if (btn) btn.disabled = false; ui().toast('Not approved: ' + error.message, 'error', 9000); return;\n    }\n    ui().toast(`Invoice ${fg.inv.invoice_number} approved: courier costs now match the invoice`, 'success', 7000);\n    openCourierInvoice(invoiceId);\n  }\n  async function undoCourierApproval(invoiceId) {\n    if (!window.SM.AUTH.isAdmin()) return;\n    const db_ = _ciDb();\n    const { data: pays } = await db_.from('courier_invoice_payments').select('id').eq('invoice_id', invoiceId).limit(1);\n    if ((pays || []).length) { ui().toast('Remove its payments and credits first', 'warning', 7000); return; }\n    ui().confirm('Undo the approval? Its Accounts entry is removed, and the lines can be checked and changed again.', async () => {\n      const { data: inv } = await db_.from('courier_invoices').select('adjustment_tx_id').eq('id', invoiceId).single();\n      const { error } = await db_.from('courier_invoices').update({ status: 'checking', approved_at: null, approved_by: null, approved_by_name: null, recorded_at_dispatch: null, adjustment_amount: null, adjustment_tx_id: null }).eq('id', invoiceId);\n      if (error) { ui().toast('Not undone: ' + error.message, 'error', 8000); return; }\n      if (inv?.adjustment_tx_id) await db_.from('transactions').delete().eq('id', inv.adjustment_tx_id);\n      ui().toast('Approval undone', 'success'); openCourierInvoice(invoiceId);\n    }, 'Undo approval', true);\n  }\n  // A payment adds no expense: the cost is already in Accounts.\n  async function recordCourierPayment(invoiceId) {\n    if (!window.SM.AUTH.isAdmin()) return;\n    const amount = _ci2(parseFloat(document.getElementById('ims-cip-amount')?.value) || 0);\n    if (!(amount > 0)) { ui().toast('Enter the amount paid', 'warning'); return; }\n    const { data: inv } = await _ciDb().from('courier_invoices').select('company_id,status').eq('id', invoiceId).single();\n    if (inv?.status !== 'approved') { ui().toast('Approve the invoice before recording payments', 'warning'); return; }\n    const { error } = await _ciDb().from('courier_invoice_payments').insert({\n      company_id: inv.company_id, invoice_id: invoiceId, kind: 'payment', paid_on: document.getElementById('ims-cip-date')?.value || _ciToday(), amount,\n      method: document.getElementById('ims-cip-method')?.value || null, reference: document.getElementById('ims-cip-ref')?.value?.trim() || null,\n      created_by: window.SM.AUTH.user?.id || null, created_by_name: window.SM.AUTH.user?.name || null });\n    if (error) { ui().toast('Not saved: ' + error.message, 'error', 8000); return; }\n    ui().toast(`Payment of ${util().formatCurrency(amount)} recorded`, 'success'); openCourierInvoice(invoiceId);\n  }\n  // A credit from the courier reduces the courier cost (and its VAT) and\n  // the balance due.\n  async function recordCourierCredit(invoiceId) {\n    if (!window.SM.AUTH.isAdmin()) return;\n    const net = _ci2(parseFloat(document.getElementById('ims-cic-net')?.value) || 0), vat = _ci2(parseFloat(document.getElementById('ims-cic-vat')?.value) || 0);\n    if (!(net > 0)) { ui().toast('Enter the credit amount (before VAT)', 'warning'); return; }\n    const db_ = _ciDb();\n    const { data: inv } = await db_.from('courier_invoices').select('company_id,status,invoice_number,couriers(name)').eq('id', invoiceId).single();\n    if (inv?.status !== 'approved') { ui().toast('Approve the invoice before recording credits', 'warning'); return; }\n    const ref = document.getElementById('ims-cic-ref')?.value?.trim() || null, date = document.getElementById('ims-cic-date')?.value || _ciToday();\n    const { data: tx, error: txErr } = await db_.from('transactions').insert({\n      company_id: inv.company_id, date, type: 'expense', category: 'Courier charges',\n      description: `Credit from ${inv.couriers?.name || 'courier'} on invoice ${inv.invoice_number}${ref ? ' (' + ref + ')' : ''}`,\n      amount: -net, vat_amount: -vat, reference: `CI-${inv.invoice_number}`\n    }).select('id').single();\n    if (txErr) { ui().toast('Not saved: ' + txErr.message, 'error', 8000); return; }\n    const { error } = await db_.from('courier_invoice_payments').insert({\n      company_id: inv.company_id, invoice_id: invoiceId, kind: 'credit', paid_on: date, amount: _ci2(net + vat), net_amount: net, vat_amount: vat,\n      reference: ref, tx_id: tx.id, created_by: window.SM.AUTH.user?.id || null, created_by_name: window.SM.AUTH.user?.name || null });\n    if (error) { await db_.from('transactions').delete().eq('id', tx.id); ui().toast('Not saved: ' + error.message, 'error', 8000); return; }\n    ui().toast(`Credit of ${util().formatCurrency(net + vat)} recorded`, 'success'); openCourierInvoice(invoiceId);\n  }\n  function removeCourierPayment(paymentId, invoiceId) {\n    if (!window.SM.AUTH.isAdmin()) return;\n    ui().confirm('Remove this payment or credit? (A credit\\'s Accounts entry is removed too.)', async () => {\n      const db_ = _ciDb();\n      const { data: x } = await db_.from('courier_invoice_payments').select('tx_id').eq('id', paymentId).single();\n      const { error } = await db_.from('courier_invoice_payments').delete().eq('id', paymentId);\n      if (error) { ui().toast('Not removed: ' + error.message, 'error'); return; }\n      if (x?.tx_id) await db_.from('transactions').delete().eq('id', x.tx_id);\n      ui().toast('Removed', 'success'); openCourierInvoice(invoiceId);\n    }, 'Remove', true);\n  }\n\n  // \u2500\u2500 Edit details (before approval) \u2500\u2500\n  async function editCourierInvoice(invoiceId) {\n    const { data: inv } = await _ciDb().from('courier_invoices').select('*, couriers(name)').eq('id', invoiceId).single();\n    if (!inv || ['approved', 'cancelled'].includes(inv.status)) { ui().toast('Only an invoice that is not approved or cancelled can be edited', 'warning'); return; }\n    const v = x => x === null || x === undefined ? '' : x;\n    const g = id => `onchange=\"window.IMS_ACCOUNTS.ciFormCalc('${id}')\" oninput=\"window.IMS_ACCOUNTS.ciFormCalc('${id}')\"`;\n    ui().openModal(`Edit invoice ${util().sanitize(inv.invoice_number)}: ${util().sanitize(inv.couriers?.name || '')}`, `\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Invoice number</label><input class=\"ims__input\" id=\"ims-ci-number\" value=\"${util().sanitize(inv.invoice_number)}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Invoice date</label><input class=\"ims__input\" type=\"date\" id=\"ims-ci-date\" value=\"${v(inv.invoice_date)}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Period</label><div style=\"display:flex;gap:6px\"><input class=\"ims__input\" type=\"date\" id=\"ims-ci-from\" value=\"${v(inv.period_from)}\"><input class=\"ims__input\" type=\"date\" id=\"ims-ci-to\" value=\"${v(inv.period_to)}\"></div></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Deliveries (\u00A3, before fuel and VAT)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-net\" value=\"${v(inv.deliveries_net)}\" ${g('net')}></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Fuel % on the invoice</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-fuelpct\" value=\"${v(inv.fuel_pct)}\" ${g('pct')}></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Fuel (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-fuel\" value=\"${v(inv.fuel_amount)}\" ${g('fuel')}></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">VAT (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-vat\" value=\"${v(inv.vat_amount)}\" ${g('vat')}></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Total (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-ci-total\" value=\"${v(inv.total)}\" ${g('total')}></div>\n      </div>`, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_ACCOUNTS.openCourierInvoice('${util().jsArg(invoiceId)}')\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_ACCOUNTS.saveCourierInvoiceEdit('${util().jsArg(invoiceId)}',this)\"><i class=\"ti ti-check\"></i> Save changes</button>`, 'lg');\n  }\n  async function saveCourierInvoiceEdit(invoiceId, btn) {\n    const val = id => document.getElementById(id)?.value?.trim() || '';\n    const num = id => _ci2(parseFloat(val(id)) || 0);\n    if (!val('ims-ci-number')) { ui().toast('Please enter the invoice number', 'error'); return; }\n    if (!(num('ims-ci-net') > 0)) { ui().toast('Please enter the deliveries amount', 'error'); return; }\n    if (btn) btn.disabled = true;\n    const { error } = await _ciDb().from('courier_invoices').update({\n      invoice_number: val('ims-ci-number'), invoice_date: val('ims-ci-date') || null, period_from: val('ims-ci-from') || null, period_to: val('ims-ci-to') || null,\n      deliveries_net: num('ims-ci-net'), fuel_pct: num('ims-ci-fuelpct'), fuel_amount: num('ims-ci-fuel'), vat_amount: num('ims-ci-vat'), total: num('ims-ci-total')\n    }).eq('id', invoiceId).neq('status', 'approved');\n    if (error) { if (btn) btn.disabled = false; ui().toast(/duplicate|unique/i.test(error.message) ? 'Another invoice from this courier already has that number' : 'Not saved: ' + error.message, 'error', 8000); return; }\n    ui().toast('Invoice details saved', 'success');\n    await runCourierCheck(invoiceId);\n    openCourierInvoice(invoiceId);\n  }\n  // \u2500\u2500 Cancel: replaced by a corrected invoice (Admin, before approval) \u2500\u2500\n  async function cancelCourierInvoice(invoiceId) {\n    if (!window.SM.AUTH.isAdmin()) { ui().toast('Only an Admin can cancel a courier invoice', 'error'); return; }\n    const { data: inv } = await _ciDb().from('courier_invoices').select('invoice_number,status').eq('id', invoiceId).single();\n    if (inv?.status === 'approved') { ui().toast('Undo the approval first', 'warning'); return; }\n    ui().openModal(`Cancel invoice ${util().sanitize(inv?.invoice_number || '')}`, `\n      <div style=\"font-size:13px;margin-bottom:10px\">Use this when the courier has cancelled this invoice and issued a corrected one. It is kept for history, but left out of the checks (so the corrected invoice's lines are not flagged \"billed twice\"), Payables and totals.</div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Replaced by invoice no.</label><input class=\"ims__input\" id=\"ims-ci-replaced\" placeholder=\"e.g. 10612\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Reason</label><input class=\"ims__input\" id=\"ims-ci-cancelwhy\" placeholder=\"e.g. Corrected after our query\"></div>\n      </div>`, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_ACCOUNTS.openCourierInvoice('${util().jsArg(invoiceId)}')\">Back</button>\n      <button class=\"ims__btn ims__btn--danger\" onclick=\"window.IMS_ACCOUNTS.confirmCancelCourierInvoice('${util().jsArg(invoiceId)}')\"><i class=\"ti ti-ban\"></i> Cancel invoice</button>`, 'sm');\n  }\n  async function confirmCancelCourierInvoice(invoiceId) {\n    if (!window.SM.AUTH.isAdmin()) return;\n    const { error } = await _ciDb().from('courier_invoices').update({\n      status: 'cancelled', replaced_by: document.getElementById('ims-ci-replaced')?.value?.trim() || null,\n      cancel_reason: document.getElementById('ims-ci-cancelwhy')?.value?.trim() || null,\n      cancelled_at: new Date().toISOString(), cancelled_by_name: window.SM.AUTH.user?.name || null\n    }).eq('id', invoiceId).neq('status', 'approved');\n    if (error) { ui().toast('Not cancelled: ' + error.message, 'error', 8000); return; }\n    ui().toast('Invoice cancelled. Enter the corrected invoice with \"New courier invoice\".', 'success', 8000);\n    openCourierInvoice(invoiceId);\n  }\n  async function reinstateCourierInvoice(invoiceId) {\n    if (!window.SM.AUTH.isAdmin()) return;\n    ui().confirm('Reinstate this invoice? It goes back to being checked, and counts again in the checks.', async () => {\n      const { error } = await _ciDb().from('courier_invoices').update({ status: 'checking', replaced_by: null, cancel_reason: null, cancelled_at: null, cancelled_by_name: null }).eq('id', invoiceId);\n      if (error) { ui().toast('Not reinstated: ' + error.message, 'error', 8000); return; }\n      await runCourierCheck(invoiceId);\n      ui().toast('Invoice reinstated', 'success'); openCourierInvoice(invoiceId);\n    }, 'Reinstate', false);\n  }\n\n  async function setCourierInvoiceStatus(invoiceId, status) {\n    const { error } = await _ciDb().from('courier_invoices').update({ status }).eq('id', invoiceId);\n    if (error) { ui().toast('Not saved: ' + error.message, 'error'); return; }\n    openCourierInvoice(invoiceId);\n  }\n  async function viewCourierInvoicePdf(invoiceId) {\n    const tab = window.open('', '_blank');\n    const db_ = _ciDb();\n    const { data: inv } = await db_.from('courier_invoices').select('pdf_path').eq('id', invoiceId).single();\n    const { data: s, error } = inv?.pdf_path ? await db_.storage.from('courier-invoices').createSignedUrl(inv.pdf_path, 300) : { data: null, error: { message: 'no PDF attached' } };\n    if (error || !s?.signedUrl) { tab?.close(); ui().toast('The PDF could not be opened (' + (error?.message || 'no link') + ')', 'error'); return; }\n    if (tab) tab.location.href = s.signedUrl; else ui().toast('Your browser blocked the new tab. Please allow pop-ups for this site.', 'warning', 8000);\n  }\n  // Everything to query with the courier, ready to email.\n  async function exportDisputeSheet(invoiceId) {\n    const db_ = _ciDb();\n    const { data: inv } = await db_.from('courier_invoices').select('*, couriers(name)').eq('id', invoiceId).single();\n    const { data: lines } = await db_.from('courier_invoice_lines').select('*').eq('invoice_id', invoiceId).order('line_no', { ascending: true });\n    const issue = { over: 'Overcharged', under: 'Undercharged', not_ours: 'Not our delivery?', duplicate: 'Billed twice', likely: 'Please confirm details' };\n    const rows = (lines || []).filter(l => issue[l.result]).map(l => [l.courier_order_ref || l.tracking || '', l.customer_name || '', l.postcode || '', l.run_date || '',\n      _ci2(l.charge).toFixed(2), l.expected != null ? _ci2(l.expected).toFixed(2) : '', l.difference != null ? _ci2(l.difference).toFixed(2) : '', issue[l.result], l.reason || '']);\n    const linesTotal = _ci2((lines || []).reduce((t, l) => t + (Number(l.charge) || 0), 0));\n    const cardFuel = await _ciCardFuel(inv.courier_id, inv.period_to || inv.invoice_date);\n    if (cardFuel !== null && Math.abs((Number(inv.fuel_pct) || 0) - cardFuel) > 0.001) {\n      const exp = _ci2(linesTotal * cardFuel / 100);\n      rows.push(['Fuel surcharge', '', '', '', _ci2(inv.fuel_amount).toFixed(2), exp.toFixed(2), _ci2(inv.fuel_amount - exp).toFixed(2), 'Fuel % differs', `Invoice ${inv.fuel_pct}%, agreed rate card ${cardFuel}%`]);\n    }\n    if (!rows.length) { ui().toast('Nothing to dispute on this invoice', 'success'); return; }\n    util().exportCSV(['Courier ref', 'Customer', 'Postcode', 'Date', 'Billed (\u00A3)', 'Our expected (\u00A3)', 'Difference (\u00A3)', 'Issue', 'Details'], rows,\n      `${String(inv.couriers?.name || 'courier').replace(/[^A-Za-z0-9]+/g, '_')}_invoice_${String(inv.invoice_number).replace(/[^A-Za-z0-9]+/g, '_')}_queries.csv`);\n  }\n\n  // \u2500\u2500\u2500 OVERVIEW (P&L) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 loadOverview(){\n    const content=document.getElementById('ims-acc-content');\n    if(!content)return;\n    // This spinner carries a unique id. When the figures arrive, the\n    // Overview only draws if its own spinner is still showing: if another\n    // tab has replaced it meanwhile (for example Lost Orders' \"View closed\n    // claims\" opening Claims), it steps aside; otherwise it always draws,\n    // so the spinner can never be left stuck.\n    const loadingId=`ims-acc-ov-loading-${Date.now()}-${Math.random().toString(36).slice(2,7)}`;\n    content.innerHTML=`<div class=\"ims__loading\" id=\"${loadingId}\"><i class=\"ti ti-loader-2 ims__spin\"></i></div>`;\n    const now=new Date();\n    const mStart=new Date(now.getFullYear(),now.getMonth(),1).toISOString().split('T')[0];\n    const mEnd=new Date(now.getFullYear(),now.getMonth()+1,0).toISOString().split('T')[0];\n    const yStart=`${now.getFullYear()}-01-01`;\n    const yEnd=`${now.getFullYear()}-12-31`;\n    const [{data:txMonth},{data:txYear},{data:payables},{data:receivables},{data:claims},{data:invStats}]=await Promise.all([\n      db().select('transactions',{gte:{date:mStart},lte:{date:mEnd}}),\n      db().select('transactions',{gte:{date:yStart},lte:{date:yEnd}}),\n      db().select('accounts_payable',{neq:{status:'paid'}}),\n      db().select('accounts_receivable',{neq:{status:'paid'}}),\n      db().select('claims',{in:{status:['raised','acknowledged','escalated_14','overdue_30']}}),\n      db().select('invoices',{in:{status:['draft','sent','overdue']},eq:{invoice_type:'sales'}})\n    ]);\n    const calc=(txs,type,category=null)=>(txs||[]).filter(t=>t.type===type&&(!category||t.category===category)).reduce((s,t)=>s+(t.amount||0),0);\n    const mRevenue=calc(txMonth,'income');\n    const mCOGS=calc(txMonth,'expense','Cost of goods sold');\n    const mExpenses=(txMonth||[]).filter(t=>t.type==='expense'&&t.category!=='Cost of goods sold').reduce((s,t)=>s+(t.amount||0),0);\n    const mGrossProfit=mRevenue-mCOGS;\n    const mNetProfit=mGrossProfit-mExpenses;\n    const yRevenue=calc(txYear,'income');\n    const yCOGS=calc(txYear,'expense','Cost of goods sold');\n    const yExpenses=(txYear||[]).filter(t=>t.type==='expense'&&t.category!=='Cost of goods sold').reduce((s,t)=>s+(t.amount||0),0);\n    const yGrossProfit=yRevenue-yCOGS;\n    const yNetProfit=yGrossProfit-yExpenses;\n    const totalPayables=(payables||[]).reduce((s,p)=>s+((p.amount||0)-(p.paid_amount||0)),0);\n    const totalReceivables=(receivables||[]).filter(r=>r.status!=='provisional').reduce((s,r)=>s+((r.amount||0)-(r.paid_amount||0)),0);\n    const openInvoices=(invStats||[]);\n    const invoiceTotal=openInvoices.reduce((s,i)=>s+(i.gross_amount||0),0);\n    const overdueInvoices=openInvoices.filter(i=>i.status==='overdue').length;\n    if(!document.getElementById(loadingId))return;\n    content.innerHTML=`\n      <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:16px\">\n        <div class=\"ims__card\">\n          <div class=\"ims__card-header\"><div class=\"ims__card-title\"><i class=\"ti ti-chart-bar\"></i>This month \u2014 P&amp;L</div></div>\n          <table class=\"ims__table\"><tbody>\n            <tr><td>Sales revenue</td><td style=\"text-align:right;font-weight:600;color:var(--ims-success)\">${util().formatCurrency(mRevenue)}</td></tr>\n            <tr><td style=\"padding-left:20px;color:var(--ims-text-sec)\">Less: Cost of goods sold</td><td style=\"text-align:right;color:var(--ims-text-sec)\">(${util().formatCurrency(mCOGS)})</td></tr>\n            <tr style=\"border-top:2px solid var(--ims-border)\"><td><strong>Gross profit</strong></td><td style=\"text-align:right;font-weight:700;color:${mGrossProfit>=0?'var(--ims-success)':'var(--ims-danger)'}\">${util().formatCurrency(mGrossProfit)}</td></tr>\n            <tr><td style=\"padding-left:20px;color:var(--ims-text-sec)\">Less: Operating expenses</td><td style=\"text-align:right;color:var(--ims-text-sec)\">(${util().formatCurrency(mExpenses)})</td></tr>\n            <tr style=\"border-top:2px solid var(--ims-border);font-size:15px\"><td><strong>Net profit</strong></td><td style=\"text-align:right;font-weight:700;color:${mNetProfit>=0?'var(--ims-success)':'var(--ims-danger)'}\">${util().formatCurrency(mNetProfit)}</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-chart-bar\"></i>This year \u2014 P&amp;L</div></div>\n          <table class=\"ims__table\"><tbody>\n            <tr><td>Sales revenue</td><td style=\"text-align:right;font-weight:600;color:var(--ims-success)\">${util().formatCurrency(yRevenue)}</td></tr>\n            <tr><td style=\"padding-left:20px;color:var(--ims-text-sec)\">Less: Cost of goods sold</td><td style=\"text-align:right;color:var(--ims-text-sec)\">(${util().formatCurrency(yCOGS)})</td></tr>\n            <tr style=\"border-top:2px solid var(--ims-border)\"><td><strong>Gross profit</strong></td><td style=\"text-align:right;font-weight:700;color:${yGrossProfit>=0?'var(--ims-success)':'var(--ims-danger)'}\">${util().formatCurrency(yGrossProfit)}</td></tr>\n            <tr><td style=\"padding-left:20px;color:var(--ims-text-sec)\">Less: Operating expenses</td><td style=\"text-align:right;color:var(--ims-text-sec)\">(${util().formatCurrency(yExpenses)})</td></tr>\n            <tr style=\"border-top:2px solid var(--ims-border);font-size:15px\"><td><strong>Net profit</strong></td><td style=\"text-align:right;font-weight:700;color:${yNetProfit>=0?'var(--ims-success)':'var(--ims-danger)'}\">${util().formatCurrency(yNetProfit)}</td></tr>\n          </tbody></table>\n        </div>\n      </div>\n      <div style=\"display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin-bottom:16px\">\n        <div class=\"ims__stat\" style=\"cursor:pointer\" onclick=\"window.IMS_ACCOUNTS.switchTab('invoices')\">\n          <div class=\"ims__stat-label\">Open invoices</div>\n          <div class=\"ims__stat-value ims__stat-value--accent\" style=\"font-size:18px\">${util().formatCurrency(invoiceTotal)}</div>\n          ${overdueInvoices>0?`<div class=\"ims__stat-sub\" style=\"color:var(--ims-danger)\">${overdueInvoices} overdue</div>`:''}\n        </div>\n        <div class=\"ims__stat\" style=\"cursor:pointer\" onclick=\"window.IMS_ACCOUNTS.switchTab('payables')\"><div class=\"ims__stat-label\">Payables outstanding</div><div class=\"ims__stat-value ims__stat-value--${totalPayables>0?'warning':''}\" style=\"font-size:18px\">${util().formatCurrency(totalPayables)}</div></div>\n        <div class=\"ims__stat\" style=\"cursor:pointer\" onclick=\"window.IMS_ACCOUNTS.switchTab('receivables')\"><div class=\"ims__stat-label\">Receivables outstanding</div><div class=\"ims__stat-value ims__stat-value--${totalReceivables>0?'accent':''}\" style=\"font-size:18px\">${util().formatCurrency(totalReceivables)}</div></div>\n        <div class=\"ims__stat\" style=\"cursor:pointer\" onclick=\"window.IMS_ACCOUNTS.switchTab('claims')\"><div class=\"ims__stat-label\">Open claims</div><div class=\"ims__stat-value ims__stat-value--${(claims||[]).length>0?'warning':''}\" style=\"font-size:18px\">${(claims||[]).length}</div></div>\n        <div class=\"ims__stat\"><div class=\"ims__stat-label\">Expense categories</div><div class=\"ims__stat-value\" style=\"font-size:14px\">${[...new Set((txMonth||[]).filter(t=>t.type==='expense').map(t=>t.category))].length}</div></div>\n      </div>\n      ${mExpenses>0?`\n        <div class=\"ims__card\">\n          <div class=\"ims__card-header\"><div class=\"ims__card-title\"><i class=\"ti ti-chart-pie\"></i>This month \u2014 expenses by category</div></div>\n          <div class=\"ims__table-wrap\"><table class=\"ims__table\">\n            <thead><tr><th>Category</th><th style=\"text-align:right\">Amount</th><th style=\"text-align:right\">% of total</th></tr></thead>\n            <tbody>${Object.entries((txMonth||[]).filter(t=>t.type==='expense').reduce((acc,t)=>{acc[t.category]=(acc[t.category]||0)+(t.amount||0);return acc;},{})).sort((a,b)=>b[1]-a[1]).map(([cat,amt])=>`\n              <tr><td>${util().sanitize(cat)}</td><td style=\"text-align:right\">${util().formatCurrency(amt)}</td><td style=\"text-align:right\">${mExpenses>0?((amt/mExpenses)*100).toFixed(1)+'%':'\u2014'}</td></tr>`).join('')}\n            </tbody>\n          </table></div>\n        </div>` : ''}`;\n  }\n\n  function switchTab(tab){\n    const tabs=document.getElementById('ims-acc-tabs');\n    tabs?.querySelectorAll('.ims__tab').forEach(t=>{t.classList.toggle('ims__tab--active',t.dataset.tab===tab);});\n    loadTab(tab);\n  }\n\n  // \u2500\u2500\u2500 ADD TRANSACTION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 showNewTransaction(){\n    const categories={\n      income:['Sales revenue','Other income'],\n      expense:['Salaries & wages','Rent & property','Fuel & vehicle','Utilities','Courier charges','Import duties & freight','Marketing & advertising','Insurance','Equipment & maintenance','Cost of goods sold','Miscellaneous']\n    };\n    ui().openModal('Add transaction',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Date</label><input class=\"ims__input\" type=\"date\" id=\"ims-tx-date\" value=\"${new Date().toISOString().split('T')[0]}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Type</label>\n          <select class=\"ims__select\" id=\"ims-tx-type\" onchange=\"window.IMS_ACCOUNTS.onTxTypeChange()\"><option value=\"income\">Income</option><option value=\"expense\">Expense</option></select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Category</label>\n          <select class=\"ims__select\" id=\"ims-tx-category\">${categories.income.map(c=>`<option value=\"${c}\">${c}</option>`).join('')}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Amount (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-tx-amount\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">VAT amount (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-tx-vat\" placeholder=\"0.00\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Reference</label><input class=\"ims__input\" type=\"text\" id=\"ims-tx-ref\" placeholder=\"Invoice #, PO #, receipt...\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Description</label><textarea class=\"ims__textarea\" id=\"ims-tx-desc\" rows=\"2\"></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_ACCOUNTS.saveTransaction()\"><i class=\"ti ti-check\"></i> Save</button>\n    `,'sm');\n  }\n\n  function onTxTypeChange(){\n    const type=document.getElementById('ims-tx-type')?.value;\n    const catSel=document.getElementById('ims-tx-category');\n    if(!catSel)return;\n    const cats={income:['Sales revenue','Other income'],expense:['Salaries & wages','Rent & property','Fuel & vehicle','Utilities','Courier charges','Import duties & freight','Marketing & advertising','Insurance','Equipment & maintenance','Cost of goods sold','Miscellaneous']};\n    catSel.innerHTML=(cats[type]||cats.income).map(c=>`<option value=\"${c}\">${c}</option>`).join('');\n  }\n\n  async function saveTransaction(){\n    const g=id=>document.getElementById(id)?.value?.trim()||'';\n    const date=g('ims-tx-date'),type=g('ims-tx-type'),category=g('ims-tx-category'),amount=parseFloat(g('ims-tx-amount'));\n    if(!date){ui().toast('Date is required','error');return;}\n    if(!category){ui().toast('Category is required','error');return;}\n    if(isNaN(amount)||amount<=0){ui().toast('Please enter a valid amount','error');return;}\n    const {error}=await db().insert('transactions',{date,type,category,amount,vat_amount:parseFloat(g('ims-tx-vat'))||0,reference:g('ims-tx-ref')||null,description:g('ims-tx-desc')||null,user_id:window.SM.AUTH.user?.id});\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n    // Refresh whichever tab is open (it used to always load the Overview,\n    // even when saving from another tab).\n    ui().closeModal();ui().toast('Transaction saved','success');loadTab(document.querySelector('#ims-acc-tabs .ims__tab--active')?.dataset.tab||'overview');\n  }\n\n  // \u2500\u2500\u2500 INVOICES 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\u2500\n  async function loadInvoices(){\n    const content=document.getElementById('ims-acc-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 client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:invoices}=await client.from('invoices')\n      .select('*')\n      .eq('company_id',window.SM.AUTH.company?.id)\n      .eq('invoice_type','sales')\n      .order('created_at',{ascending:false})\n      .limit(100);\n\n    const items=invoices||[];\n    window._allInvoices=items;\n    const totalDraft=items.filter(i=>i.status==='draft').reduce((s,i)=>s+(i.gross_amount||0),0);\n    const totalSent=items.filter(i=>i.status==='sent').reduce((s,i)=>s+(i.gross_amount||0),0);\n    const totalOverdue=items.filter(i=>i.status==='overdue').reduce((s,i)=>s+(i.gross_amount||0),0);\n    const totalPartial=items.filter(i=>i.status==='partially_paid').reduce((s,i)=>s+((i.gross_amount||0)-(i.paid_amount||0)),0);\n    const totalPaid=items.filter(i=>i.status==='paid').reduce((s,i)=>s+(i.gross_amount||0),0);\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=\"display:flex;gap:10px;flex-wrap:wrap\">\n          <div class=\"ims__stat\" style=\"padding:8px 14px;min-width:100px\"><div class=\"ims__stat-label\">Draft</div><div class=\"ims__stat-value\" style=\"font-size:15px\">${util().formatCurrency(totalDraft)}</div></div>\n          <div class=\"ims__stat\" style=\"padding:8px 14px;min-width:100px\"><div class=\"ims__stat-label\">Sent / awaiting</div><div class=\"ims__stat-value ims__stat-value--accent\" style=\"font-size:15px\">${util().formatCurrency(totalSent)}</div></div>\n          <div class=\"ims__stat\" style=\"padding:8px 14px;min-width:100px\"><div class=\"ims__stat-label\">Overdue</div><div class=\"ims__stat-value ims__stat-value--danger\" style=\"font-size:15px\">${util().formatCurrency(totalOverdue)}</div></div>\n          <div class=\"ims__stat\" style=\"padding:8px 14px;min-width:100px\"><div class=\"ims__stat-label\">Partially paid</div><div class=\"ims__stat-value ims__stat-value--warning\" style=\"font-size:15px\">${util().formatCurrency(totalPartial)}</div></div>\n          <div class=\"ims__stat\" style=\"padding:8px 14px;min-width:100px\"><div class=\"ims__stat-label\">Paid</div><div class=\"ims__stat-value ims__stat-value--success\" style=\"font-size:15px\">${util().formatCurrency(totalPaid)}</div></div>\n        </div>\n        <div class=\"ims__btn-group\">\n          <button class=\"ims__btn ims__btn--secondary\" onclick=\"window.IMS_ACCOUNTS.showExport()\"><i class=\"ti ti-download\"></i> Export</button>\n          <button class=\"ims__btn ims__btn--secondary\" onclick=\"window.IMS_ACCOUNTS.showGenerateFromOrder()\"><i class=\"ti ti-file-plus\"></i> From order</button>\n          <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_ACCOUNTS.showNewInvoice()\"><i class=\"ti ti-plus\"></i> New invoice</button>\n        </div>\n      </div>\n      <div class=\"ims__filters\" style=\"margin-bottom:14px;display:flex;gap:8px;flex-wrap:wrap\">\n        <div class=\"ims__search-wrap\" style=\"max-width:320px\"><i class=\"ti ti-search\"></i><input class=\"ims__input\" type=\"text\" id=\"ims-inv-search\" placeholder=\"Search invoice # or customer...\" oninput=\"window.IMS_ACCOUNTS.filterInvoices()\"></div>\n        <select class=\"ims__select\" id=\"ims-inv-status-filter\" onchange=\"window.IMS_ACCOUNTS.filterInvoices()\" style=\"width:auto\">\n          <option value=\"\">All statuses</option>\n          <option value=\"draft\">Draft</option>\n          <option value=\"sent\">Sent</option>\n          <option value=\"overdue\">Overdue</option>\n          <option value=\"partially_paid\">Partially paid</option>\n          <option value=\"paid\">Paid</option>\n        </select>\n      </div>\n      <div class=\"ims__card\">\n        <div class=\"ims__table-wrap\">\n          <table class=\"ims__table\">\n            <thead><tr><th>Invoice #</th><th>Customer</th><th>Date</th><th>Due date</th><th>Net</th><th>VAT</th><th>Gross</th><th>Status</th><th></th></tr></thead>\n            <tbody id=\"ims-inv-tbody\">${renderInvoiceRows(items)}</tbody>\n          </table>\n        </div>\n      </div>`;\n  }\n\n  function renderInvoiceRows(items){\n    return (items||[]).map(inv=>`<tr>\n              <td><span class=\"ims__link\" onclick=\"window.IMS_ACCOUNTS.openInvoice('${util().jsArg(inv.id)}')\">${util().sanitize(inv.invoice_number)}</span></td>\n              <td>${util().sanitize(inv.customer_name||'\u2014')}</td>\n              <td style=\"font-size:11px\">${util().formatDate(inv.invoice_date)}</td>\n              <td style=\"font-size:11px;color:${inv.status==='overdue'?'var(--ims-danger)':''}\">${util().formatDate(inv.due_date)}</td>\n              <td>${util().formatCurrency(inv.net_amount)}</td>\n              <td style=\"font-size:11px\">${util().formatCurrency(inv.vat_amount)}</td>\n              <td style=\"font-weight:600\">${util().formatCurrency(inv.gross_amount)}</td>\n              <td>${util().pill(inv.status)}</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_ACCOUNTS.openInvoice('${util().jsArg(inv.id)}')\" title=\"View\"><i class=\"ti ti-eye\"></i></button>\n                <button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_ACCOUNTS.printInvoice('${util().jsArg(inv.id)}')\" title=\"Print\"><i class=\"ti ti-printer\"></i></button>\n                ${inv.status==='draft'?`<button class=\"ims__btn ims__btn--info ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_ACCOUNTS.markInvoiceSent('${util().jsArg(inv.id)}')\" title=\"Mark sent\"><i class=\"ti ti-send\"></i></button>`:''}\n                ${['sent','overdue','partially_paid'].includes(inv.status)?`<button class=\"ims__btn ims__btn--success ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_ACCOUNTS.markInvoicePaid('${util().jsArg(inv.id)}',${(inv.gross_amount||0)-(inv.paid_amount||0)})\" title=\"${inv.status==='partially_paid'?'Record remaining payment':'Mark paid'}\"><i class=\"ti ti-currency-pound\"></i></button>`:''}\n                ${['sent','overdue','paid','partially_paid'].includes(inv.status)?`<button class=\"ims__btn ims__btn--warning ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_ACCOUNTS.showNewNote('${util().jsArg(inv.id)}','${util().jsArg(inv.invoice_number)}')\" title=\"Issue credit/debit note\"><i class=\"ti ti-file-minus\"></i></button>`:''}\n                ${window.SM.AUTH.isSuperAdmin()?`<button class=\"ims__btn ims__btn--danger ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_ACCOUNTS.deleteInvoice('${util().jsArg(inv.id)}','${util().jsArg(inv.invoice_number)}')\" title=\"Delete invoice (Super Admin only)\"><i class=\"ti ti-trash\"></i></button>`:''}\n              </div></td>\n            </tr>`).join('')||'<tr><td colspan=\"9\" class=\"ims__table-empty\">No invoices found</td></tr>';\n  }\n\n  // A typed search queries the FULL invoice table server-side, not just\n  // the 100 most recent loaded by default \u2014 an older invoice for a\n  // long-standing customer must never silently be invisible here.\n  async function filterInvoices(){\n    const search=document.getElementById('ims-inv-search')?.value?.trim()||'';\n    const statusF=document.getElementById('ims-inv-status-filter')?.value||'';\n    const tbody=document.getElementById('ims-inv-tbody');\n    if(!tbody)return;\n\n    let items;\n    if(search){\n      tbody.innerHTML=`<tr><td colspan=\"9\" class=\"ims__table-empty\"><i class=\"ti ti-loader-2 ims__spin\"></i></td></tr>`;\n      const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n      const [{data:byNum},{data:byCust}]=await Promise.all([\n        client.from('invoices').select('*').eq('company_id',window.SM.AUTH.company?.id).eq('invoice_type','sales').ilike('invoice_number',`%${search}%`).order('created_at',{ascending:false}),\n        client.from('invoices').select('*').eq('company_id',window.SM.AUTH.company?.id).eq('invoice_type','sales').ilike('customer_name',`%${search}%`).order('created_at',{ascending:false})\n      ]);\n      items=[...(byNum||[]),...(byCust||[])].filter((inv,i,arr)=>arr.findIndex(x=>x.id===inv.id)===i);\n    } else {\n      items=window._allInvoices||[];\n    }\n    if(statusF) items=items.filter(i=>i.status===statusF);\n    tbody.innerHTML=renderInvoiceRows(items);\n  }\n\n  async function showNewInvoice(){\n    const company=window.SM.AUTH.company;\n    const vatRate=company?.default_vat_rate||20;\n    const payDays=company?.default_payment_days||14;\n    const today=new Date().toISOString().split('T')[0];\n    const due=new Date(Date.now()+payDays*86400000).toISOString().split('T')[0];\n    const prefix=company?.invoice_prefix||'INV';\n\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:lastInv}=await client.from('invoices').select('invoice_number').eq('company_id',company?.id).eq('invoice_type','sales').order('created_at',{ascending:false}).limit(1).maybeSingle();\n    const nextNum=util().generateRef(prefix,lastInv?.invoice_number);\n\n    const {data:codes}=await client.from('account_codes').select('id,display_name,xero_code,sage50_code').eq('company_id',company?.id).eq('is_income',true).order('sort_order');\n    const codeOpts=(codes||[]).map(c=>`<option value=\"${c.id}\">${util().sanitize(c.display_name)}</option>`).join('');\n\n    ui().openModal('New sales invoice',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Invoice number</label><input class=\"ims__input\" type=\"text\" id=\"ims-inv-num\" value=\"${nextNum}\" readonly style=\"background:var(--ims-surface2)\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Customer name</label><input class=\"ims__input\" type=\"text\" id=\"ims-inv-cust\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Customer email</label><input class=\"ims__input\" type=\"email\" id=\"ims-inv-email\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Customer VAT number</label><input class=\"ims__input\" type=\"text\" id=\"ims-inv-cvat\" placeholder=\"GB123456789\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Customer address</label><textarea class=\"ims__textarea\" id=\"ims-inv-addr\" rows=\"2\"></textarea></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Invoice date</label><input class=\"ims__input\" type=\"date\" id=\"ims-inv-date\" value=\"${today}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Due date</label><input class=\"ims__input\" type=\"date\" id=\"ims-inv-due\" value=\"${due}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">VAT rate (%)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" id=\"ims-inv-vatrate\" value=\"${vatRate}\" oninput=\"window.IMS_ACCOUNTS.recalcInvoice()\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Account code</label><select class=\"ims__select\" id=\"ims-inv-code\">${codeOpts}</select></div>\n      </div>\n      <hr class=\"ims__divider\">\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:8px\">\n        <strong style=\"font-size:13px\">Line items</strong>\n        <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.addInvoiceLine()\"><i class=\"ti ti-plus\"></i> Add line</button>\n      </div>\n      <div id=\"ims-inv-lines\"></div>\n      <hr class=\"ims__divider\">\n      <div style=\"display:flex;justify-content:flex-end;gap:20px;font-size:13px\">\n        <div style=\"text-align:right\">\n          <div>Net: <strong id=\"ims-inv-net\">\u00A30.00</strong></div>\n          <div>VAT (<span id=\"ims-inv-vatpct\">${vatRate}</span>%): <strong id=\"ims-inv-vat\">\u00A30.00</strong></div>\n          <div style=\"font-size:16px;margin-top:4px\">Total: <strong id=\"ims-inv-gross\">\u00A30.00</strong></div>\n        </div>\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-top:12px\"><label class=\"ims__label\">Notes / payment terms</label><textarea class=\"ims__textarea\" id=\"ims-inv-notes\" rows=\"2\">${util().sanitize(company?.invoice_terms||'')}</textarea></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\" onclick=\"window.IMS_ACCOUNTS.saveInvoice('draft')\"><i class=\"ti ti-device-floppy\"></i> Save draft</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_ACCOUNTS.saveInvoice('sent')\"><i class=\"ti ti-send\"></i> Save &amp; mark sent</button>\n    `,'xl');\n\n    // Start with one line\n    _invLines=[{description:'',quantity:1,unit_price:0}];\n    renderInvoiceLines();\n  }\n\n  let _invLines=[];\n\n  function addInvoiceLine(){\n    _invLines.push({description:'',quantity:1,unit_price:0});\n    renderInvoiceLines();\n  }\n\n  function renderInvoiceLines(){\n    const container=document.getElementById('ims-inv-lines');\n    if(!container)return;\n    container.innerHTML=_invLines.map((line,i)=>`\n      <div style=\"display:grid;grid-template-columns:3fr 80px 120px auto;gap:8px;align-items:center;margin-bottom:8px\">\n        <input class=\"ims__input\" type=\"text\" placeholder=\"Description\" value=\"${util().sanitize(line.description)}\"\n          oninput=\"window.IMS_ACCOUNTS.updateInvLine(${i},'description',this.value)\">\n        <input class=\"ims__input\" type=\"number\" min=\"0.001\" step=\"0.001\" placeholder=\"Qty\" value=\"${line.quantity}\"\n          oninput=\"window.IMS_ACCOUNTS.updateInvLine(${i},'quantity',+this.value||1);window.IMS_ACCOUNTS.recalcInvoice()\">\n        <input class=\"ims__input\" type=\"number\" min=\"0\" step=\"0.01\" placeholder=\"Unit price (\u00A3 ex VAT)\" value=\"${line.unit_price}\"\n          oninput=\"window.IMS_ACCOUNTS.updateInvLine(${i},'unit_price',+this.value||0);window.IMS_ACCOUNTS.recalcInvoice()\">\n        <button class=\"ims__btn ims__btn--danger ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_ACCOUNTS.removeInvLine(${i})\"><i class=\"ti ti-trash\"></i></button>\n      </div>`).join('');\n    recalcInvoice();\n  }\n\n  function updateInvLine(i,field,val){if(_invLines[i])_invLines[i][field]=val;}\n\n  function removeInvLine(i){\n    _invLines.splice(i,1);\n    renderInvoiceLines();\n  }\n\n  function recalcInvoice(){\n    const vatRate=parseFloat(document.getElementById('ims-inv-vatrate')?.value)||20;\n    const net=_invLines.reduce((s,l)=>s+((l.quantity||1)*(l.unit_price||0)),0);\n    const vat=util().netToVat(net,vatRate);\n    const gross=util().netToGross(net,vatRate);\n    const fmt=v=>`\u00A3${v.toFixed(2)}`;\n    const set=(id,v)=>{const el=document.getElementById(id);if(el)el.textContent=v;};\n    set('ims-inv-net',fmt(net));\n    set('ims-inv-vat',fmt(vat));\n    set('ims-inv-gross',fmt(gross));\n    set('ims-inv-vatpct',vatRate);\n  }\n\n  async function saveInvoice(status){\n    const g=id=>document.getElementById(id)?.value?.trim()||'';\n    const custName=g('ims-inv-cust');\n    if(!custName){ui().toast('Customer name is required','error');return;}\n    if(!_invLines.length||_invLines.every(l=>!l.description)){ui().toast('Add at least one line item','error');return;}\n    const vatRate=parseFloat(g('ims-inv-vatrate'))||20;\n    const net=parseFloat(_invLines.reduce((s,l)=>s+((l.quantity||1)*(l.unit_price||0)),0).toFixed(2));\n    const vatAmt=util().netToVat(net,vatRate);\n    const gross=util().netToGross(net,vatRate);\n    const company=window.SM.AUTH.company;\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:lastInv}=await client.from('invoices').select('invoice_number').eq('company_id',company?.id).eq('invoice_type','sales').order('created_at',{ascending:false}).limit(1).maybeSingle();\n    const invNum=g('ims-inv-num')||util().generateRef(company?.invoice_prefix||'INV',lastInv?.invoice_number);\n    const {data:inv,error}=await client.from('invoices').insert({\n      company_id:company?.id,invoice_number:invNum,invoice_type:'sales',\n      customer_name:custName,customer_email:g('ims-inv-email')||null,\n      customer_address:g('ims-inv-addr')||null,customer_vat_number:g('ims-inv-cvat')||null,\n      invoice_date:g('ims-inv-date')||new Date().toISOString().split('T')[0],\n      due_date:g('ims-inv-due'),\n      net_amount:net,vat_rate:vatRate,vat_amount:vatAmt,gross_amount:gross,\n      currency:'GBP',status,\n      sent_at:status==='sent'?new Date().toISOString():null,\n      notes:g('ims-inv-notes')||null,\n      created_by:window.SM.AUTH.user?.id\n    }).select().single();\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n    const codeId=document.getElementById('ims-inv-code')?.value||null;\n    await Promise.all(_invLines.filter(l=>l.description).map((l,i)=>{\n      const lNet=parseFloat(((l.quantity||1)*(l.unit_price||0)).toFixed(2));\n      const lVat=util().netToVat(lNet,vatRate);\n      const lGross=util().netToGross(lNet,vatRate);\n      return client.from('invoice_lines').insert({\n        invoice_id:inv.id,account_code_id:codeId||null,\n        description:l.description,quantity:l.quantity||1,\n        unit_price:l.unit_price||0,net_amount:lNet,\n        vat_rate:vatRate,vat_amount:lVat,gross_amount:lGross,sort_order:i\n      });\n    }));\n    ui().closeModal();\n    ui().toast(`Invoice ${invNum} ${status==='draft'?'saved as draft':'created and marked sent'}`,'success');\n    loadInvoices();\n  }\n\n  async function showGenerateFromOrder(){\n    // Fetch delivered orders that don't yet have an invoice\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:orders}=await client.from('orders')\n      .select('id,order_number,customer_name,total_value,delivered_at,order_type,vat_treatment')\n      .eq('company_id',window.SM.AUTH.company?.id)\n      .eq('status','delivered')\n      .neq('fulfillment_type','dropship')\n      .order('delivered_at',{ascending:false})\n      .limit(50);\n\n    // Filter out ones already invoiced\n    const {data:existingInv}=await client.from('invoices').select('order_id').eq('company_id',window.SM.AUTH.company?.id).not('order_id','is',null);\n    const invoicedOrderIds=new Set((existingInv||[]).map(i=>i.order_id));\n    const uninvoiced=(orders||[]).filter(o=>!invoicedOrderIds.has(o.id));\n    window._gfiUninvoiced=uninvoiced;\n\n    ui().openModal('Generate invoice from order',`\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Search a delivered order to generate a VAT invoice. The order total is pre-filled but you can adjust before saving.</span>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label ims__label--req\">Search order</label>\n        <div style=\"position:relative\">\n          <div class=\"ims__search-wrap\"><i class=\"ti ti-search\"></i><input class=\"ims__input\" type=\"text\" id=\"ims-gfi-search\" placeholder=\"Order # or customer name...\" autocomplete=\"off\" oninput=\"window.IMS_ACCOUNTS.filterGFIOrders()\" onfocus=\"window.IMS_ACCOUNTS.filterGFIOrders()\" onblur=\"setTimeout(()=>{const d=document.getElementById('ims-gfi-dropdown');if(d)d.style.display='none';},200)\"></div>\n          <div id=\"ims-gfi-dropdown\" style=\"display:none;position:absolute;top:100%;left:0;z-index:20;background:var(--ims-surface);border:1px solid var(--ims-border);border-radius:var(--ims-radius);max-height:220px;overflow-y:auto;width:100%;margin-top:2px\"></div>\n        </div>\n        <select id=\"ims-gfi-order\" style=\"display:none\" onchange=\"window.IMS_ACCOUNTS.onGFIOrderChange()\">\n          <option value=\"\">Select a delivered order...</option>\n          ${uninvoiced.map(o=>`<option value=\"${o.id}\" data-value=\"${o.total_value}\" data-name=\"${util().sanitize(o.customer_name||'')}\" data-vat=\"${o.vat_treatment||'inclusive'}\">${util().sanitize(o.order_number)} \u2014 ${util().sanitize(o.customer_name||'\u2014')} \u2014 ${util().formatCurrency(o.total_value)}${o.vat_treatment==='exclusive'?' (ex. VAT)':''}</option>`).join('')}\n        </select>\n      </div>\n      <div id=\"ims-gfi-preview\" style=\"margin-top:12px\"></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\" id=\"ims-gfi-btn\" style=\"display:none\" onclick=\"window.IMS_ACCOUNTS.generateInvoiceFromOrder()\"><i class=\"ti ti-file-plus\"></i> Generate invoice</button>\n    `,'lg');\n  }\n\n  // The default (empty search) view shows the 50 most recently delivered\n  // uninvoiced orders \u2014 but a typed search queries the FULL orders table\n  // server-side instead of just filtering those 50. An older delivered\n  // order that was never invoiced (e.g. it sat for a while before 50+ more\n  // recent deliveries pushed it out of that window) must never silently\n  // be unfindable here \u2014 same class of gap already fixed for the Invoices\n  // tab search and elsewhere in this app.\n  async function filterGFIOrders(){\n    const q=(document.getElementById('ims-gfi-search')?.value||'').trim();\n    const dropdown=document.getElementById('ims-gfi-dropdown');\n    if(!dropdown)return;\n\n    let matches;\n    if(q){\n      const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n      const companyId=window.SM.AUTH.company?.id;\n      const [{data:byNum},{data:byCust},{data:existingInv}]=await Promise.all([\n        client.from('orders').select('id,order_number,customer_name,total_value,vat_treatment')\n          .eq('company_id',companyId).eq('status','delivered').neq('fulfillment_type','dropship')\n          .ilike('order_number',`%${q}%`).order('delivered_at',{ascending:false}).limit(30),\n        client.from('orders').select('id,order_number,customer_name,total_value,vat_treatment')\n          .eq('company_id',companyId).eq('status','delivered').neq('fulfillment_type','dropship')\n          .ilike('customer_name',`%${q}%`).order('delivered_at',{ascending:false}).limit(30),\n        client.from('invoices').select('order_id').eq('company_id',companyId).not('order_id','is',null)\n      ]);\n      const invoicedIds=new Set((existingInv||[]).map(i=>i.order_id));\n      const combined=[...(byNum||[]),...(byCust||[])].filter((o,i,arr)=>arr.findIndex(x=>x.id===o.id)===i);\n      matches=combined.filter(o=>!invoicedIds.has(o.id));\n    } else {\n      matches=window._gfiUninvoiced||[];\n    }\n\n    dropdown.innerHTML=matches.length?matches.slice(0,30).map(o=>`\n      <div class=\"ims__ac-item\" onmousedown=\"window.IMS_ACCOUNTS.selectGFIOrder('${util().jsArg(o.id)}',${o.total_value||0},'${util().jsArg(o.customer_name||'')}','${util().jsArg(o.vat_treatment||'inclusive')}','${util().jsArg(o.order_number)}')\">\n        <strong>${util().sanitize(o.order_number)}</strong>\n        <span style=\"font-size:11px;color:var(--ims-text-muted);margin-left:6px\">${util().sanitize(o.customer_name||'\u2014')} \u2014 ${util().formatCurrency(o.total_value)}${o.vat_treatment==='exclusive'?' (ex. VAT)':''}</span>\n      </div>`).join(''):`<div class=\"ims__ac-item\" style=\"cursor:default;color:var(--ims-text-muted)\">No matching orders</div>`;\n    dropdown.style.display='block';\n  }\n\n  function selectGFIOrder(orderId,totalValue,custName,vatTreatment,orderNumber){\n    const sel=document.getElementById('ims-gfi-order');\n    const searchInput=document.getElementById('ims-gfi-search');\n    const dropdown=document.getElementById('ims-gfi-dropdown');\n    if(!sel)return;\n    // The chosen order may not be one of the 50 pre-populated <option>s \u2014\n    // it could have come from the server-side search above, covering the\n    // full order history. Inject or update a matching option so\n    // onGFIOrderChange/generateInvoiceFromOrder (both of which read from\n    // this select's value/dataset) keep working completely unchanged\n    // regardless of where the order came from.\n    let opt=sel.querySelector(`option[value=\"${orderId}\"]`);\n    if(!opt){\n      opt=document.createElement('option');\n      opt.value=orderId;\n      sel.appendChild(opt);\n    }\n    opt.dataset.value=totalValue;\n    opt.dataset.name=custName;\n    opt.dataset.vat=vatTreatment;\n    const label=`${orderNumber} \u2014 ${custName||'\u2014'} \u2014 ${util().formatCurrency(parseFloat(totalValue)||0)}${vatTreatment==='exclusive'?' (ex. VAT)':''}`;\n    opt.textContent=label;\n    sel.value=orderId;\n    if(searchInput) searchInput.value=label;\n    if(dropdown) dropdown.style.display='none';\n    onGFIOrderChange();\n  }\n\n  function onGFIOrderChange(){\n    const sel=document.getElementById('ims-gfi-order');\n    const opt=sel?.options[sel?.selectedIndex];\n    const preview=document.getElementById('ims-gfi-preview');\n    const btn=document.getElementById('ims-gfi-btn');\n    if(!sel?.value||!preview){if(btn)btn.style.display='none';return;}\n    const orderValue=parseFloat(opt?.dataset?.value||0);\n    const vatTreatment=opt?.dataset?.vat||'inclusive';\n    const vatRate=window.SM.AUTH.company?.default_vat_rate||20;\n    let net, vat, gross;\n    if(vatTreatment==='exclusive'){\n      net=orderValue;\n      vat=util().netToVat(net,vatRate);\n      gross=net+vat;\n    } else {\n      gross=orderValue;\n      net=util().grossToNet(gross,vatRate);\n      vat=util().netToVat(net,vatRate);\n    }\n    preview.innerHTML=`\n      <table class=\"ims__table\">\n        <tbody>\n          <tr><td>Customer</td><td style=\"font-weight:600\">${util().sanitize(opt?.dataset?.name||'\u2014')}</td></tr>\n          <tr><td>Order price entered as</td><td>${vatTreatment==='exclusive'?'<span style=\"color:var(--ims-accent);font-weight:600\">Exclusive of VAT</span>':'<span style=\"color:var(--ims-text-muted)\">Inclusive of VAT</span>'}</td></tr>\n          <tr><td>Net (ex VAT)</td><td>${util().formatCurrency(net)}</td></tr>\n          <tr><td>VAT (${vatRate}%)</td><td>${util().formatCurrency(vat)}</td></tr>\n          <tr><td style=\"font-weight:600\">Gross total</td><td style=\"font-weight:700\">${util().formatCurrency(gross)}</td></tr>\n        </tbody>\n      </table>`;\n    if(btn)btn.style.display='';\n  }\n\n  async function generateInvoiceFromOrder(){\n    const sel=document.getElementById('ims-gfi-order');\n    const orderId=sel?.value;\n    if(!orderId){ui().toast('Please select an order','error');return;}\n    const opt=sel.options[sel.selectedIndex];\n    const orderValue=parseFloat(opt?.dataset?.value||0);\n    const vatTreatment=opt?.dataset?.vat||'inclusive';\n    const custName=opt?.dataset?.name||'';\n    const company=window.SM.AUTH.company;\n    const vatRate=company?.default_vat_rate||20;\n    let net, vat, gross;\n    if(vatTreatment==='exclusive'){\n      net=orderValue;\n      vat=util().netToVat(net,vatRate);\n      gross=net+vat;\n    } else {\n      gross=orderValue;\n      net=util().grossToNet(gross,vatRate);\n      vat=util().netToVat(net,vatRate);\n    }\n    const payDays=company?.default_payment_days||14;\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n\n    // Fetch order details\n    const {data:order}=await client.from('orders').select('*,order_items(product_name,sku,quantity,unit_price,total_price)').eq('id',orderId).maybeSingle();\n    const {data:lastInv}=await client.from('invoices').select('invoice_number').eq('company_id',company?.id).eq('invoice_type','sales').order('created_at',{ascending:false}).limit(1).maybeSingle();\n    const invNum=util().generateRef(company?.invoice_prefix||'INV',lastInv?.invoice_number);\n    const today=new Date().toISOString().split('T')[0];\n    const due=new Date(Date.now()+payDays*86400000).toISOString().split('T')[0];\n\n    const {data:inv,error}=await client.from('invoices').insert({\n      company_id:company?.id,invoice_number:invNum,invoice_type:'sales',\n      order_id:orderId,customer_name:custName,\n      customer_address:order?.address||null,customer_postcode:order?.postcode||null,\n      customer_email:order?.email||null,\n      invoice_date:today,due_date:due,\n      net_amount:net,vat_rate:vatRate,vat_amount:vat,gross_amount:gross,\n      currency:'GBP',status:'draft',\n      notes:null,\n      created_by:window.SM.AUTH.user?.id\n    }).select().single();\n\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n\n    // Generate lines from order items\n    const items=order?.order_items||[];\n    if(items.length){\n      await Promise.all(items.map((item,i)=>{\n        const lineValue=parseFloat((item.total_price||item.unit_price||0).toFixed(2));\n        let lNet,lVat,lGross;\n        if(vatTreatment==='exclusive'){\n          lNet=lineValue;\n          lVat=util().netToVat(lNet,vatRate);\n          lGross=lNet+lVat;\n        } else {\n          lGross=lineValue;\n          lNet=util().grossToNet(lGross,vatRate);\n          lVat=util().netToVat(lNet,vatRate);\n        }\n        return client.from('invoice_lines').insert({\n          invoice_id:inv.id,\n          description:`${item.product_name||'\u2014'}${item.sku?' ('+item.sku+')':''}`,\n          quantity:item.quantity||1,unit_price:item.unit_price||0,\n          net_amount:lNet,vat_rate:vatRate,vat_amount:lVat,gross_amount:lGross,sort_order:i\n        });\n      }));\n    } else {\n      // Single line for whole order\n      await client.from('invoice_lines').insert({\n        invoice_id:inv.id,description:'Goods supplied',\n        quantity:1,unit_price:net,\n        net_amount:net,vat_rate:vatRate,vat_amount:vat,gross_amount:gross,sort_order:0\n      });\n    }\n\n    ui().closeModal();\n    ui().toast(`Invoice ${invNum} generated from order`,'success');\n    loadInvoices();\n  }\n\n  async function openInvoice(id){\n    // Switched from a bare, freshly-created raw client to the shared,\n    // already-authenticated db() wrapper. This query embeds\n    // invoice_lines(*) \u2014 now that invoice_lines correctly has RLS\n    // enabled, a raw client with no reliably-attached session can\n    // silently fail this query entirely (returning nothing, no error\n    // ever surfaced by this function), which is exactly what was\n    // happening \u2014 not something specific to migrated data.\n    // Two relationships now exist between invoices and orders:\n    // invoices.order_id -> orders.id (this one, used for \"generate from\n    // a single order\") and orders.invoice_id -> invoices.id (added in\n    // the dropship migration, since one invoice can span many orders).\n    // PostgREST can no longer auto-detect which to embed, so the\n    // specific constraint name disambiguates it explicitly.\n    const {data:inv,error}=await db().select('invoices',{\n      select:'*,invoice_lines(*),orders!invoices_order_id_fkey(order_number)',\n      eq:{id},maybeSingle:true,noCompanyFilter:true\n    });\n    if(error){ ui().toast('Failed to load invoice: '+error.message,'error',6000); console.error('[openInvoice]',error); return; }\n    if(!inv){ ui().toast('Invoice not found','error'); return; }\n    const lines=(inv.invoice_lines||[]).sort((a,b)=>a.sort_order-b.sort_order);\n    ui().openModal(`Invoice: ${inv.invoice_number}`,`\n      <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px\">\n        <div><span class=\"ims__label\">Customer</span><div style=\"font-weight:600\">${util().sanitize(inv.customer_name||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Status</span><div>${util().pill(inv.status)}</div></div>\n        <div><span class=\"ims__label\">Invoice date</span><div>${util().formatDate(inv.invoice_date)}</div></div>\n        <div><span class=\"ims__label\">Due date</span><div style=\"color:${inv.status==='overdue'?'var(--ims-danger)':''}\">${util().formatDate(inv.due_date)}</div></div>\n        ${inv.orders?.order_number?`<div><span class=\"ims__label\">Linked order</span><div>${util().sanitize(inv.orders.order_number)}</div></div>`:''}\n        ${inv.customer_address?`<div style=\"grid-column:1/-1\"><span class=\"ims__label\">Address</span><div>${util().sanitize(inv.customer_address)}</div></div>`:''}\n        ${inv.customer_vat_number?`<div><span class=\"ims__label\">Customer VAT</span><div>${util().sanitize(inv.customer_vat_number)}</div></div>`:''}\n        ${inv.paid_at?`<div><span class=\"ims__label\">Paid</span><div style=\"color:var(--ims-success)\">${util().formatDate(inv.paid_at)}</div></div>`:''}\n      </div>\n      <hr class=\"ims__divider\">\n      <div class=\"ims__table-wrap\">\n        <table class=\"ims__table\">\n          <thead><tr><th>Description</th><th style=\"text-align:right\">Qty</th><th style=\"text-align:right\">Unit price</th><th style=\"text-align:right\">Net</th><th style=\"text-align:right\">VAT</th><th style=\"text-align:right\">Gross</th></tr></thead>\n          <tbody>\n            ${lines.map(l=>`<tr>\n              <td>${util().sanitize(l.description)}</td>\n              <td style=\"text-align:right\">${l.quantity}</td>\n              <td style=\"text-align:right\">${util().formatCurrency(l.unit_price)}</td>\n              <td style=\"text-align:right\">${util().formatCurrency(l.net_amount)}</td>\n              <td style=\"text-align:right;font-size:11px\">${util().formatCurrency(l.vat_amount)}</td>\n              <td style=\"text-align:right;font-weight:600\">${util().formatCurrency(l.gross_amount)}</td>\n            </tr>`).join('')}\n            <tr style=\"border-top:2px solid var(--ims-border)\">\n              <td colspan=\"3\" style=\"text-align:right;font-weight:600\">Totals</td>\n              <td style=\"text-align:right;font-weight:600\">${util().formatCurrency(inv.net_amount)}</td>\n              <td style=\"text-align:right;font-size:11px\">${util().formatCurrency(inv.vat_amount)}</td>\n              <td style=\"text-align:right;font-weight:700;font-size:15px\">${util().formatCurrency(inv.gross_amount)}</td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n      ${inv.notes?`<div style=\"margin-top:12px;font-size:12px;color:var(--ims-text-sec)\">${util().sanitize(inv.notes)}</div>`:''}\n    `,`\n      <div class=\"ims__btn-group\">\n        <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_ACCOUNTS.printInvoice('${util().jsArg(inv.id)}')\"><i class=\"ti ti-printer\"></i> Print</button>\n        ${inv.status==='draft'?`<button class=\"ims__btn ims__btn--info\" onclick=\"window.IMS_ACCOUNTS.markInvoiceSent('${util().jsArg(inv.id)}')\"><i class=\"ti ti-send\"></i> Mark sent</button>`:''}\n        ${['sent','overdue'].includes(inv.status)?`<button class=\"ims__btn ims__btn--success\" onclick=\"window.IMS_ACCOUNTS.markInvoicePaid('${util().jsArg(inv.id)}',${inv.gross_amount})\"><i class=\"ti ti-currency-pound\"></i> Mark paid</button>`:''}\n        ${['sent','overdue','paid'].includes(inv.status)?`<button class=\"ims__btn ims__btn--warning\" onclick=\"window.IMS_ACCOUNTS.showNewNote('${util().jsArg(inv.id)}','${util().jsArg(inv.invoice_number)}')\"><i class=\"ti ti-file-minus\"></i> Issue note</button>`:''}\n        ${window.SM.AUTH.isSuperAdmin()?`<button class=\"ims__btn ims__btn--danger\" onclick=\"window.SM.UI.closeModal();window.IMS_ACCOUNTS.deleteInvoice('${util().jsArg(inv.id)}','${util().jsArg(inv.invoice_number)}')\"><i class=\"ti ti-trash\"></i> Delete invoice</button>`:''}\n        <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Close</button>\n      </div>\n    `,'lg');\n  }\n\n  async function markInvoiceSent(id){\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    await client.from('invoices').update({status:'sent',sent_at:new Date().toISOString()}).eq('id',id);\n    ui().toast('Invoice marked as sent','success');\n    ui().closeModal();\n    loadInvoices();\n  }\n\n  async function markInvoicePaid(id,amount){\n    ui().openModal('Mark invoice as paid',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Payment date</label><input class=\"ims__input\" type=\"date\" id=\"ims-invpay-date\" value=\"${new Date().toISOString().split('T')[0]}\"></div>\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\" id=\"ims-invpay-amount\" value=\"${amount.toFixed(2)}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Payment method</label>\n          <select class=\"ims__select\" id=\"ims-invpay-method\">\n            <option value=\"bank_transfer\">Bank transfer</option><option value=\"card\">Card</option><option value=\"cash\">Cash</option><option value=\"cheque\">Cheque</option>\n          </select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Reference</label><input class=\"ims__input\" type=\"text\" id=\"ims-invpay-ref\"></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_ACCOUNTS.confirmInvoicePaid('${util().jsArg(id)}',${amount})\"><i class=\"ti ti-check\"></i> Confirm payment</button>\n    `,'sm');\n  }\n\n async function confirmInvoicePaid(id,totalAmount){\n    const paidAmt=parseFloat(document.getElementById('ims-invpay-amount')?.value)||0;\n    const method=document.getElementById('ims-invpay-method')?.value;\n    const ref=document.getElementById('ims-invpay-ref')?.value?.trim();\n    const dateVal=document.getElementById('ims-invpay-date')?.value;\n    if(!paidAmt){ui().toast('Enter amount received','error');return;}\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    // Fetch existing paid_amount first \u2014 this may be a second (or later)\n    // instalment against an already partially_paid invoice, so the new\n    // amount must accumulate onto what's already been recorded rather\n    // than overwrite it, or the first instalment silently disappears.\n    const {data:inv}=await client.from('invoices').select('invoice_number,customer_name,gross_amount,paid_amount,vat_amount').eq('id',id).maybeSingle();\n    const cumulativePaid=(inv?.paid_amount||0)+paidAmt;\n    const gross=inv?.gross_amount||totalAmount;\n    const isPartial=cumulativePaid<gross;\n    await client.from('invoices').update({\n      status:isPartial?'partially_paid':'paid',\n      paid_amount:cumulativePaid,paid_at:new Date().toISOString(),\n      payment_method:method,payment_ref:ref||null\n    }).eq('id',id);\n    // Record in transactions \u2014 always just the new instalment, not the cumulative total\n    await db().insert('transactions',{\n      date:dateVal,type:'income',category:'Sales revenue',\n      description:`Payment received \u2014 ${inv?.invoice_number||'invoice'} \u2014 ${inv?.customer_name||''}`,\n      amount:paidAmt,vat_amount:isPartial?0:inv?.vat_amount||0,\n      reference:ref||inv?.invoice_number\n    });\n    ui().closeModal();\n    ui().toast(`Payment of ${util().formatCurrency(paidAmt)} recorded${isPartial?' \u2014 partial, balance remaining':''}`, 'success');\n    loadInvoices();\n  } \n\n  async function printInvoice(id){\n    // Same fix as openInvoice() \u2014 bare raw client swapped for the\n    // authenticated db() wrapper, since this identical query embeds\n    // invoice_lines(*), which now correctly has RLS enabled.\n    const {data:inv,error}=await db().select('invoices',{\n      select:'*,invoice_lines(*),orders!invoices_order_id_fkey(order_number)',\n      eq:{id},maybeSingle:true,noCompanyFilter:true\n    });\n    if(error){ ui().toast('Failed to load invoice: '+error.message,'error',6000); console.error('[printInvoice]',error); return; }\n    if(!inv){ ui().toast('Invoice not found','error'); return; }\n    const company=window.SM.AUTH.company;\n    const lines=(inv.invoice_lines||[]).sort((a,b)=>a.sort_order-b.sort_order);\n\n    window.PRINT.invoice({\n      company:{\n        name:company?.name, address:company?.address, postcode:company?.postcode,\n        country:company?.country, vat_number:company?.vat_number,\n        bank_name:company?.bank_name, bank_account:company?.bank_account, bank_sort_code:company?.bank_sort_code\n      },\n      invoiceNumber:inv.invoice_number,\n      invoiceDate:util().formatDate(inv.invoice_date),\n      orderNo:inv.orders?.order_number||'',\n      accountRef:inv.account_ref||'',\n      customer:{\n        name:inv.customer_name, address:inv.customer_address, postcode:inv.customer_postcode,\n        vatNumber:inv.customer_vat_number, eoriNo:inv.eori_no\n      },\n      lines:lines.map(l=>({\n        productCode:l.product_code, description:l.description, quantity:l.quantity,\n        hsTariffCode:l.hs_tariff_code, countryOfOrigin:l.country_of_origin,\n        unitWeightKg:l.unit_weight_kg, unitPrice:l.unit_price, netAmount:l.net_amount\n      })),\n      netTotal:inv.net_amount,\n      carriageAmount:inv.carriage_amount||0,\n      vatAmount:inv.vat_amount,\n      grossTotal:inv.gross_amount,\n      totalPackages:inv.total_packages,\n      totalNetWeightKg:lines.reduce((s,l)=>s+((l.unit_weight_kg||0)*(l.quantity||0)),0),\n      incoterms:inv.incoterms\n    });\n  }\n\n  // \u2500\u2500\u2500 DELETE INVOICE (Super Admin only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Restricted to super_admin specifically (not the broader isAdmin()\n  // check) since this permanently removes financial documents. If the\n  // invoice was generated from a single order (order_id set \u2014 never\n  // true for dropship invoices, which span multiple orders), any\n  // accounts_receivable row tied to that same order is removed too,\n  // since accounts_receivable has no direct invoice_id link at all \u2014\n  // it only ever references orders.order_id.\n  async function deleteInvoice(id, invoiceNumber){\n    if(!window.SM.AUTH.isSuperAdmin()){ui().toast('Only Super Admin can delete invoices','error');return;}\n    ui().confirm(\n      `Permanently delete invoice <strong>${util().sanitize(invoiceNumber)}</strong>?<br><br>This cannot be undone. If this invoice was generated from an order and has a matching receivable record, that will be removed too.`,\n      async()=>{\n        const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n\n        const {data:inv}=await client.from('invoices').select('id,order_id').eq('id',id).maybeSingle();\n\n        // Clear any orders pointing at this invoice first, to avoid the\n        // orders_invoice_id_fkey foreign key blocking the delete below.\n        await client.from('orders').update({invoice_id:null}).eq('invoice_id',id);\n\n        // Remove the matching receivable, if this invoice traces back\n        // to a single order (accounts_receivable has no invoice_id of\n        // its own \u2014 order_id is the only real link available).\n        if(inv?.order_id){\n          await client.from('accounts_receivable').delete().eq('order_id',inv.order_id);\n        }\n\n        await client.from('invoice_lines').delete().eq('invoice_id',id);\n        const {error}=await client.from('invoices').delete().eq('id',id);\n\n        if(error){ui().toast('Failed to delete invoice: '+error.message,'error',6000);return;}\n        ui().toast(`Invoice ${invoiceNumber} deleted`,'success');\n        // Refresh both invoice views \u2014 Accounts' own list and Dropship's\n        // (since the migration, both read the same shared invoices\n        // table). Deleting via the eye-icon modal is often triggered\n        // while the Dropship panel is the one actually visible on\n        // screen, so only refreshing Accounts' hidden view left the\n        // deleted row appearing to still be there until a full manual\n        // page reload. Each is called defensively \u2014 harmless if that\n        // panel isn't currently mounted.\n        setTimeout(()=>{\n          if(document.getElementById('ims-acc-content')) loadInvoices();\n          if(window.IMS_DROPSHIP?.loadInvoices) window.IMS_DROPSHIP.loadInvoices();\n        },150);\n      },\n      'Delete invoice', true\n    );\n  }\n\n  // \u2500\u2500\u2500 CREDIT & DEBIT NOTES 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\n  async function loadNotes(){\n    const content=document.getElementById('ims-acc-content');\n    if(!content)return;\n    content.innerHTML=`<div class=\"ims__loading\"><i class=\"ti ti-loader-2 ims__spin\"></i></div>`;\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:notes}=await client.from('invoices')\n      .select('*')\n      .eq('company_id',window.SM.AUTH.company?.id)\n      .in('invoice_type',['credit_note','debit_note'])\n      .order('created_at',{ascending:false});\n    const items=notes||[];\n    content.innerHTML=`\n      <div style=\"display:flex;justify-content:flex-end;margin-bottom:14px\">\n        <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_ACCOUNTS.showNewNote()\"><i class=\"ti ti-plus\"></i> New credit / debit note</button>\n      </div>\n      <div class=\"ims__card\">\n        <div class=\"ims__table-wrap\">\n          <table class=\"ims__table\">\n            <thead><tr><th>Note #</th><th>Type</th><th>Customer</th><th>Linked invoice</th><th>Reason</th><th>Net</th><th>VAT</th><th>Gross</th><th>Date</th><th></th></tr></thead>\n            <tbody>${items.map(n=>`<tr>\n              <td><span class=\"ims__link\" onclick=\"window.IMS_ACCOUNTS.printInvoice('${util().jsArg(n.id)}')\">${util().sanitize(n.invoice_number)}</span></td>\n              <td>${util().pill(n.invoice_type==='credit_note'?'sent':'info')}<span style=\"font-size:11px;margin-left:4px\">${n.invoice_type==='credit_note'?'Credit':'Debit'}</span></td>\n              <td>${util().sanitize(n.customer_name||'\u2014')}</td>\n              <td style=\"font-size:11px\">${util().sanitize(n.linked_invoice_id?'Linked':'Standalone')}</td>\n              <td style=\"font-size:11px;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap\" title=\"${util().sanitize(n.reason||'')}\">${util().sanitize(n.reason||'\u2014')}</td>\n              <td>${util().formatCurrency(n.net_amount)}</td>\n              <td style=\"font-size:11px\">${util().formatCurrency(n.vat_amount)}</td>\n              <td style=\"font-weight:600;color:${n.invoice_type==='credit_note'?'var(--ims-danger)':'var(--ims-warning)'}\">${n.invoice_type==='credit_note'?'\u2212':'+'} ${util().formatCurrency(n.gross_amount)}</td>\n              <td style=\"font-size:11px\">${util().formatDate(n.created_at)}</td>\n              <td><button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_ACCOUNTS.printInvoice('${util().jsArg(n.id)}')\" title=\"Print\"><i class=\"ti ti-printer\"></i></button></td>\n            </tr>`).join('')||'<tr><td colspan=\"10\" class=\"ims__table-empty\">No credit or debit notes yet</td></tr>'}\n            </tbody>\n          </table>\n        </div>\n      </div>`;\n  }\n\n  async function showNewNote(linkedInvoiceId=null,linkedInvoiceNum=null){\n    const company=window.SM.AUTH.company;\n    const vatRate=company?.default_vat_rate||20;\n    const today=new Date().toISOString().split('T')[0];\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n\n    // Get last CN and DN numbers\n    const [{data:lastCN},{data:lastDN}]=await Promise.all([\n      client.from('invoices').select('invoice_number').eq('company_id',company?.id).eq('invoice_type','credit_note').order('created_at',{ascending:false}).limit(1).maybeSingle(),\n      client.from('invoices').select('invoice_number').eq('company_id',company?.id).eq('invoice_type','debit_note').order('created_at',{ascending:false}).limit(1).maybeSingle()\n    ]);\n    const nextCN=util().generateRef(company?.credit_note_prefix||'CN',lastCN?.invoice_number);\n    const nextDN=util().generateRef(company?.debit_note_prefix||'DN',lastDN?.invoice_number);\n\n    ui().openModal('New credit / debit note',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Note type</label>\n          <select class=\"ims__select\" id=\"ims-note-type\" onchange=\"window.IMS_ACCOUNTS.onNoteTypeChange('${util().jsArg(nextCN)}','${util().jsArg(nextDN)}')\">\n            <option value=\"credit_note\">Credit note (CN) \u2014 reduces what customer owes</option>\n            <option value=\"debit_note\">Debit note (DN) \u2014 increases what customer owes</option>\n          </select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Reference number</label><input class=\"ims__input\" type=\"text\" id=\"ims-note-num\" value=\"${nextCN}\" readonly style=\"background:var(--ims-surface2)\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Customer name</label><input class=\"ims__input\" type=\"text\" id=\"ims-note-cust\" value=\"${linkedInvoiceNum?'':''}\" placeholder=\"Customer or business name\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Date</label><input class=\"ims__input\" type=\"date\" id=\"ims-note-date\" value=\"${today}\"></div>\n        ${linkedInvoiceId?`<div class=\"ims__form-group ims__form-group--full\"><div class=\"ims__alert ims__alert--info\" style=\"margin:0\"><i class=\"ti ti-link\"></i><span>Linked to invoice <strong>${linkedInvoiceNum}</strong></span></div></div>`:''}\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label ims__label--req\">Reason</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-note-reason\" placeholder=\"e.g. Damaged goods \u2014 partial refund agreed, pricing error, goodwill gesture, short delivery...\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Net amount (\u00A3 ex VAT)</label>\n          <input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-note-net\" oninput=\"window.IMS_ACCOUNTS.recalcNote()\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">VAT rate (%)</label>\n          <input class=\"ims__input\" type=\"number\" step=\"0.01\" id=\"ims-note-vatrate\" value=\"${vatRate}\" oninput=\"window.IMS_ACCOUNTS.recalcNote()\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">VAT amount</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-note-vat\" readonly style=\"background:var(--ims-surface2)\" placeholder=\"Auto-calculated\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Gross total</label>\n          <input class=\"ims__input\" type=\"text\" id=\"ims-note-gross\" readonly style=\"background:var(--ims-surface2);font-weight:600\" placeholder=\"Auto-calculated\"></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_ACCOUNTS.saveNote('${util().jsArg(linkedInvoiceId||'')}')\"><i class=\"ti ti-check\"></i> Create note</button>\n    `,'lg');\n  }\n\n  function onNoteTypeChange(nextCN,nextDN){\n    const type=document.getElementById('ims-note-type')?.value;\n    const numEl=document.getElementById('ims-note-num');\n    if(numEl)numEl.value=type==='credit_note'?nextCN:nextDN;\n  }\n\n  function recalcNote(){\n    const net=parseFloat(document.getElementById('ims-note-net')?.value)||0;\n    const vatRate=parseFloat(document.getElementById('ims-note-vatrate')?.value)||20;\n    const vat=util().netToVat(net,vatRate);\n    const gross=util().netToGross(net,vatRate);\n    const vatEl=document.getElementById('ims-note-vat');\n    const grossEl=document.getElementById('ims-note-gross');\n    if(vatEl)vatEl.value=`\u00A3${vat.toFixed(2)}`;\n    if(grossEl)grossEl.value=`\u00A3${gross.toFixed(2)}`;\n  }\n\n  async function saveNote(linkedInvoiceId){\n    const g=id=>document.getElementById(id)?.value?.trim()||'';\n    const type=g('ims-note-type');\n    const custName=g('ims-note-cust');\n    const reason=g('ims-note-reason');\n    const net=parseFloat(g('ims-note-net'))||0;\n    const vatRate=parseFloat(g('ims-note-vatrate'))||20;\n    if(!custName){ui().toast('Customer name is required','error');return;}\n    if(!reason){ui().toast('Reason is required','error');return;}\n    if(!net||net<=0){ui().toast('Enter a valid amount','error');return;}\n    const vat=util().netToVat(net,vatRate);\n    const gross=util().netToGross(net,vatRate);\n    const company=window.SM.AUTH.company;\n    const noteNum=g('ims-note-num');\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:note,error}=await client.from('invoices').insert({\n      company_id:company?.id,invoice_number:noteNum,invoice_type:type,\n      linked_invoice_id:linkedInvoiceId||null,\n      customer_name:custName,\n      invoice_date:g('ims-note-date')||new Date().toISOString().split('T')[0],\n      due_date:g('ims-note-date')||new Date().toISOString().split('T')[0],\n      net_amount:net,vat_rate:vatRate,vat_amount:vat,gross_amount:gross,\n      currency:'GBP',status:'sent',reason,\n      created_by:window.SM.AUTH.user?.id\n    }).select().single();\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n    // Single line\n    await client.from('invoice_lines').insert({\n      invoice_id:note.id,description:reason,quantity:1,unit_price:net,\n      net_amount:net,vat_rate:vatRate,vat_amount:vat,gross_amount:gross,sort_order:0\n    });\n    // Record transaction\n    // A credit note reduces sales (a negative income amount, no VAT of its\n    // own: its VAT is on the credit note document), as in Xero and Sage. A\n    // debit note is extra sales, as before.\n    const isCN=type==='credit_note';\n    await db().insert('transactions',{\n      date:g('ims-note-date')||new Date().toISOString().split('T')[0],\n      type:'income',\n      category:isCN?'Sales returns and refunds':'Sales revenue',\n      amount:isCN?-gross:gross,vat_amount:isCN?0:vat,\n      description:`${isCN?'Credit':'Debit'} note ${noteNum}: ${reason}`,\n      reference:noteNum\n    });\n    ui().closeModal();\n    ui().toast(`${type==='credit_note'?'Credit':'Debit'} note ${noteNum} created`,'success');\n    loadNotes();\n  }\n\n  // \u2500\u2500\u2500 ORDER REVERSAL HELPER (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\n  // Called by Orders and Dropship when refunding/returning an order that\n  // may already have a generated sales invoice against it (orders.invoice_id).\n  // If there's no invoice yet, nothing has been charged \u2014 nothing to do.\n  // If there is, this issues a credit note against the same customer using\n  // the exact same numbering sequence and table structure as the manual\n  // \"New credit/debit note\" flow above, so it shows up correctly in\n  // Accounts \u2192 Credit/Debit notes, VAT reports, and the accounting export.\n  // grossAmount is the portion of the invoice this specific order accounts\n  // for \u2014 important for dropship, where one fortnightly invoice can bundle\n  // several orders together, so the credit must not assume the whole\n  // invoice belongs to just this one order.\n  // Returns the credit note's invoice_number, or null if no invoice existed.\n  async function reverseOrderInvoice(orderId, grossAmount, dateVal, reasonText){\n    const { data: ord } = await db().select('orders', {\n      select:'invoice_id,order_number', eq:{id:orderId}, maybeSingle:true, noCompanyFilter:true\n    });\n    if(!ord?.invoice_id) return null;\n\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const { data: origInv } = await client.from('invoices').select('*').eq('id',ord.invoice_id).maybeSingle();\n    if(!origInv) return null;\n\n    const company=window.SM.AUTH.company;\n    const {data:lastCN}=await client.from('invoices').select('invoice_number').eq('company_id',company?.id).eq('invoice_type','credit_note').order('created_at',{ascending:false}).limit(1).maybeSingle();\n    const noteNum=util().generateRef(company?.credit_note_prefix||'CN',lastCN?.invoice_number);\n\n    const vatRate=origInv.vat_rate!=null?origInv.vat_rate:(company?.default_vat_rate||20);\n    const gross=grossAmount||0;\n    const net=parseFloat((gross/(1+vatRate/100)).toFixed(2));\n    const vat=parseFloat((gross-net).toFixed(2));\n\n    const {data:note}=await client.from('invoices').insert({\n      company_id:company?.id,invoice_number:noteNum,invoice_type:'credit_note',\n      linked_invoice_id:origInv.id,\n      customer_name:origInv.customer_name,customer_address:origInv.customer_address||null,\n      customer_postcode:origInv.customer_postcode||null,customer_email:origInv.customer_email||null,\n      customer_vat_number:origInv.customer_vat_number||null,\n      invoice_date:dateVal,due_date:dateVal,\n      net_amount:net,vat_rate:vatRate,vat_amount:vat,gross_amount:gross,\n      currency:'GBP',status:'sent',reason:reasonText,\n      created_by:window.SM.AUTH.user?.id\n    }).select().single();\n    if(!note) return null;   // no credit note: the caller records the refund itself\n    await client.from('invoice_lines').insert({\n      invoice_id:note.id,description:reasonText,quantity:1,unit_price:net,\n      net_amount:net,vat_rate:vatRate,vat_amount:vat,gross_amount:gross,sort_order:0\n    });\n    // Refunds follow standard practice (as in Xero and Sage): the credit\n    // note DOCUMENT reverses the sale and carries the VAT (it reduces VAT due\n    // on sales); the money returned is ONE entry, recorded as a reduction of\n    // sales (\"Sales returns and refunds\", a negative income amount), with no\n    // VAT of its own. Before, the credit note was booked as an expense with\n    // VAT, so its VAT was also counted as reclaimable purchase VAT, and the\n    // refund added a second expense on top.\n    await db().insert('transactions',{\n      date:dateVal,type:'income',category:'Sales returns and refunds',\n      amount:-gross,vat_amount:0,\n      description:`Refund, credit note ${noteNum}: ${ord.order_number||''}, ${reasonText}`,\n      reference:noteNum\n    });\n    return noteNum;\n  }\n\n  // \u2500\u2500\u2500 EXPORT TO ACCOUNTING SOFTWARE \u2500\u2500\u2500\u2500\u2500\u2500\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 showExport(){\n    const now=new Date();\n    const mStart=new Date(now.getFullYear(),now.getMonth(),1).toISOString().split('T')[0];\n    const today=now.toISOString().split('T')[0];\n\n    ui().openModal('Export to accounting software',`\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-info-circle\"></i>\n        <span>Export invoices, credit/debit notes, and transactions in your accounting software's import format. Import the CSV directly into Xero or Sage.</span>\n      </div>\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Date from</label><input class=\"ims__input\" type=\"date\" id=\"ims-exp-from\" value=\"${mStart}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Date to</label><input class=\"ims__input\" type=\"date\" id=\"ims-exp-to\" value=\"${today}\"></div>\n      </div>\n      <div class=\"ims__form-group\" style=\"margin-bottom:12px\">\n        <label class=\"ims__label\">Include documents</label>\n        <div style=\"display:flex;flex-direction:column;gap:6px;margin-top:4px\">\n          <label style=\"display:flex;align-items:center;gap:8px;font-size:13px\"><input type=\"checkbox\" id=\"ims-exp-inv\" checked> Sales invoices (INV-)</label>\n          <label style=\"display:flex;align-items:center;gap:8px;font-size:13px\"><input type=\"checkbox\" id=\"ims-exp-cn\" checked> Credit notes (CN-)</label>\n          <label style=\"display:flex;align-items:center;gap:8px;font-size:13px\"><input type=\"checkbox\" id=\"ims-exp-dn\" checked> Debit notes (DN-)</label>\n          <label style=\"display:flex;align-items:center;gap:8px;font-size:13px\"><input type=\"checkbox\" id=\"ims-exp-tx\"> Transactions (bank feed)</label>\n        </div>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label ims__label--req\">Format</label>\n        <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:4px\">\n          <label style=\"display:flex;align-items:center;gap:8px;padding:10px 12px;border:1.5px solid var(--ims-border);border-radius:var(--ims-radius);cursor:pointer;font-size:13px\">\n            <input type=\"radio\" name=\"ims-exp-fmt\" value=\"xero\" checked>\n            <span><strong>Xero</strong><br><span style=\"font-size:11px;color:var(--ims-text-muted)\">Xero invoice import CSV</span></span>\n          </label>\n          <label style=\"display:flex;align-items:center;gap:8px;padding:10px 12px;border:1.5px solid var(--ims-border);border-radius:var(--ims-radius);cursor:pointer;font-size:13px\">\n            <input type=\"radio\" name=\"ims-exp-fmt\" value=\"sage50\">\n            <span><strong>Sage 50</strong><br><span style=\"font-size:11px;color:var(--ims-text-muted)\">Sage 50 audit trail</span></span>\n          </label>\n          <label style=\"display:flex;align-items:center;gap:8px;padding:10px 12px;border:1.5px solid var(--ims-border);border-radius:var(--ims-radius);cursor:pointer;font-size:13px\">\n            <input type=\"radio\" name=\"ims-exp-fmt\" value=\"sage_cloud\">\n            <span><strong>Sage Accounting</strong><br><span style=\"font-size:11px;color:var(--ims-text-muted)\">Sage Business Cloud</span></span>\n          </label>\n          <label style=\"display:flex;align-items:center;gap:8px;padding:10px 12px;border:1.5px solid var(--ims-border);border-radius:var(--ims-radius);cursor:pointer;font-size:13px\">\n            <input type=\"radio\" name=\"ims-exp-fmt\" value=\"generic\">\n            <span><strong>Generic CSV</strong><br><span style=\"font-size:11px;color:var(--ims-text-muted)\">For manual import / accountant</span></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--primary\" onclick=\"window.IMS_ACCOUNTS.runExport()\"><i class=\"ti ti-download\"></i> Export CSV</button>\n    `,'lg');\n  }\n\n  async function runExport(){\n    const from=document.getElementById('ims-exp-from')?.value;\n    const to=document.getElementById('ims-exp-to')?.value;\n    const fmt=document.querySelector('input[name=\"ims-exp-fmt\"]:checked')?.value||'generic';\n    const inclInv=document.getElementById('ims-exp-inv')?.checked;\n    const inclCN=document.getElementById('ims-exp-cn')?.checked;\n    const inclDN=document.getElementById('ims-exp-dn')?.checked;\n    const inclTx=document.getElementById('ims-exp-tx')?.checked;\n\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n\n    // Build invoice type filter\n    const types=[];\n    if(inclInv)types.push('sales');\n    if(inclCN)types.push('credit_note');\n    if(inclDN)types.push('debit_note');\n\n    let invoices=[];\n    if(types.length){\n      const {data}=await client.from('invoices')\n        .select('*,invoice_lines(*,account_codes(xero_code,sage50_code,sage_cloud_code,display_name))')\n        .eq('company_id',window.SM.AUTH.company?.id)\n        .in('invoice_type',types)\n        .gte('invoice_date',from)\n        .lte('invoice_date',to)\n        .order('invoice_date');\n      invoices=data||[];\n    }\n\n    let transactions=[];\n    if(inclTx){\n      const {data}=await db().select('transactions',{gte:{date:from},lte:{date:to},order:{col:'date',asc:true}});\n      transactions=data||[];\n    }\n\n    if(!invoices.length&&!transactions.length){\n      ui().toast('No data found for the selected period','warning');\n      return;\n    }\n\n    const filename=`${fmt}_export_${from}_to_${to}`;\n\n    switch(fmt){\n      case 'xero':        exportXero(invoices,transactions,filename);       break;\n      case 'sage50':      exportSage50(invoices,transactions,filename);     break;\n      case 'sage_cloud':  exportSageCloud(invoices,transactions,filename);  break;\n      default:            exportGeneric(invoices,transactions,filename);    break;\n    }\n\n    // Mark as exported\n    if(invoices.length){\n      const ids=invoices.map(i=>i.id);\n      for(let i=0;i<ids.length;i+=50){\n        await client.from('invoices').update({\n          [`exported_${fmt==='sage50'?'sage50':fmt==='sage_cloud'?'sage_cloud':'xero'}`]:true,\n          exported_at:new Date().toISOString()\n        }).in('id',ids.slice(i,i+50));\n      }\n    }\n\n    ui().closeModal();\n    ui().toast(`Exported ${invoices.length} invoice(s)${transactions.length?' and '+transactions.length+' transaction(s)':''} as ${fmt.toUpperCase()} CSV`,'success');\n  }\n\n  // Money in or out for an export row. Refunds are recorded as negative\n  // income, so direction comes from the sign as well as the type, and the\n  // exported amount is always positive (Sage will not accept a negative\n  // receipt).\n  const _txIn=t=>(t.type==='income')===((t.amount||0)>=0);\n  const _txAmt=t=>Math.abs(t.amount||0);\n\n  function exportXero(invoices,transactions,filename){\n    // Xero Sales Invoice / Credit Note import format\n    const headers=['*ContactName','EmailAddress','*InvoiceNumber','*InvoiceDate','*DueDate','*Description','*Quantity','*UnitAmount','*AccountCode','*TaxType','TaxAmount','CurrencyCode','Reference','InvoiceType'];\n    const rows=[];\n    invoices.forEach(inv=>{\n      const lines=(inv.invoice_lines||[]);\n      const isCredit=inv.invoice_type==='credit_note';\n      const invType=isCredit?'ACCRECCREDIT':'ACCRECINV';\n      const taxType=inv.vat_rate===0?'EXEMPTEXPENSES':'OUTPUT2';\n      lines.forEach(line=>{\n        const code=line.account_codes?.xero_code||'200';\n        rows.push([\n          inv.customer_name||'',\n          inv.customer_email||'',\n          inv.invoice_number,\n          inv.invoice_date,\n          inv.due_date,\n          line.description||'',\n          isCredit?-(line.quantity||1):(line.quantity||1),\n          (line.unit_price||0).toFixed(2),\n          code,\n          taxType,\n          (line.vat_amount||0).toFixed(2),\n          inv.currency||'GBP',\n          inv.notes||'',\n          invType\n        ]);\n      });\n    });\n    if(transactions.length){\n      // Xero bank statement import (separate sheet concept \u2014 appended here)\n      transactions.forEach(t=>{\n        rows.push([\n          t.description||t.category||'',\n          '',t.reference||'','','',\n          t.description||'',\n          _txIn(t)?1:-1,\n          _txAmt(t).toFixed(2),\n          '','','',\n          'GBP',t.reference||'',''\n        ]);\n      });\n    }\n    util().exportCSV(headers,rows,filename);\n  }\n\n  function exportSage50(invoices,transactions,filename){\n    // Sage 50 audit trail import format\n    const headers=['Type','Account Reference','Nominal Code','Date','Ref','Details','Net Amount','Tax Code','Tax Amount','Exchange Rate'];\n    const rows=[];\n    invoices.forEach(inv=>{\n      const lines=inv.invoice_lines||[];\n      const typeCode=inv.invoice_type==='sales'?'SI':inv.invoice_type==='credit_note'?'SC':'SI';\n      lines.forEach(line=>{\n        const nominal=line.account_codes?.sage50_code||'4000';\n        const net=inv.invoice_type==='credit_note'?-(line.net_amount||0):(line.net_amount||0);\n        const vat=inv.invoice_type==='credit_note'?-(line.vat_amount||0):(line.vat_amount||0);\n        rows.push([\n          typeCode,\n          inv.customer_name||'',\n          nominal,\n          formatSageDate(inv.invoice_date),\n          inv.invoice_number,\n          line.description||'',\n          net.toFixed(2),\n          inv.vat_rate===0?'T0':'T1',\n          vat.toFixed(2),\n          '1.00'\n        ]);\n      });\n    });\n    transactions.forEach(t=>{\n      rows.push([\n        _txIn(t)?'BR':'BP',\n        '',\n        '',\n        formatSageDate(t.date),\n        t.reference||'',\n        t.description||t.category||'',\n        _txAmt(t).toFixed(2),\n        t.vat_amount?'T1':'T0',\n        (t.vat_amount||0).toFixed(2),\n        '1.00'\n      ]);\n    });\n    util().exportCSV(headers,rows,filename);\n  }\n\n  function exportSageCloud(invoices,transactions,filename){\n    // Sage Business Cloud Accounting import format\n    const headers=['ContactName','InvoiceDate','DueDate','InvoiceNumber','Reference','Description','Quantity','UnitPrice','AccountCode','TaxRate','Currency'];\n    const rows=[];\n    invoices.forEach(inv=>{\n      const lines=inv.invoice_lines||[];\n      lines.forEach(line=>{\n        const code=line.account_codes?.sage_cloud_code||'4000';\n        rows.push([\n          inv.customer_name||'',\n          inv.invoice_date,\n          inv.due_date,\n          inv.invoice_number,\n          inv.notes||'',\n          line.description||'',\n          inv.invoice_type==='credit_note'?-(line.quantity||1):(line.quantity||1),\n          (line.unit_price||0).toFixed(2),\n          code,\n          inv.vat_rate===0?'Zero Rated':'Standard 20%',\n          inv.currency||'GBP'\n        ]);\n      });\n    });\n    transactions.forEach(t=>{\n      rows.push([\n        t.description||'',t.date,t.date,t.reference||'',t.reference||'',\n        t.description||t.category||'',\n        _txIn(t)?1:-1,\n        _txAmt(t).toFixed(2),\n        '','Standard 20%','GBP'\n      ]);\n    });\n    util().exportCSV(headers,rows,filename);\n  }\n\n  function exportGeneric(invoices,transactions,filename){\n    // Generic format \u2014 all fields, no software-specific constraints\n    const headers=['Document type','Document number','Customer','Email','Invoice date','Due date','Description','Qty','Unit price (ex VAT)','Net amount','VAT rate %','VAT amount','Gross amount','Account code (Xero)','Account code (Sage 50)','Reason/notes','Currency','Status'];\n    const rows=[];\n    invoices.forEach(inv=>{\n      const lines=inv.invoice_lines||[];\n      lines.forEach(line=>{\n        rows.push([\n          inv.invoice_type==='sales'?'Sales Invoice':inv.invoice_type==='credit_note'?'Credit Note':'Debit Note',\n          inv.invoice_number,inv.customer_name||'',inv.customer_email||'',\n          inv.invoice_date,inv.due_date,line.description||'',\n          line.quantity||1,(line.unit_price||0).toFixed(2),\n          (line.net_amount||0).toFixed(2),inv.vat_rate||20,\n          (line.vat_amount||0).toFixed(2),(line.gross_amount||0).toFixed(2),\n          line.account_codes?.xero_code||'',line.account_codes?.sage50_code||'',\n          inv.reason||inv.notes||'',inv.currency||'GBP',inv.status||''\n        ]);\n      });\n    });\n    transactions.forEach(t=>{\n      rows.push([\n        _txIn(t)?'Income':'Expense',\n        t.reference||'','','',t.date,t.date,\n        t.description||t.category||'',1,\n        _txAmt(t).toFixed(2),_txAmt(t).toFixed(2),\n        t.vat_amount?20:0,Math.abs(t.vat_amount||0).toFixed(2),\n        (_txAmt(t)+Math.abs(t.vat_amount||0)).toFixed(2),\n        '','',t.category||'','GBP',''\n      ]);\n    });\n    util().exportCSV(headers,rows,filename);\n  }\n\n  function formatSageDate(dateStr){\n    if(!dateStr)return '';\n    try{\n      const d=new Date(dateStr);\n      return `${String(d.getDate()).padStart(2,'0')}/${String(d.getMonth()+1).padStart(2,'0')}/${d.getFullYear()}`;\n    }catch(e){return dateStr;}\n  }\n\n  // \u2500\u2500\u2500 PAYABLES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 loadPayables(){\n    const content=document.getElementById('ims-acc-content');\n    if(!content)return;\n    const {data:payables}=await db().select('accounts_payable',{\n      select:'*, suppliers(name), purchase_orders(po_number)',\n      order:{col:'created_at',asc:false}\n    });\n    const items=payables||[];\n    const aging={a:0,b:0,c:0,d:0};\n    items.filter(p=>p.status!=='paid').forEach(p=>{\n      if(!p.due_date)return;\n      const daysOverdue=util().daysSince(p.due_date);\n      if(daysOverdue<=0)return;\n      const outstanding=(p.amount||0)-(p.paid_amount||0);\n      if(daysOverdue<=30)aging.a+=outstanding;\n      else if(daysOverdue<=60)aging.b+=outstanding;\n      else if(daysOverdue<=90)aging.c+=outstanding;\n      else aging.d+=outstanding;\n    });\n    content.innerHTML=`\n      <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:14px\">\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">0\u201330 days</div><div class=\"ims__stat-value\" style=\"font-size:16px\">${util().formatCurrency(aging.a)}</div></div>\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">31\u201360 days</div><div class=\"ims__stat-value ims__stat-value--${aging.b>0?'warning':''}\" style=\"font-size:16px\">${util().formatCurrency(aging.b)}</div></div>\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">61\u201390 days</div><div class=\"ims__stat-value ims__stat-value--${aging.c>0?'danger':''}\" style=\"font-size:16px\">${util().formatCurrency(aging.c)}</div></div>\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">90+ days</div><div class=\"ims__stat-value ims__stat-value--${aging.d>0?'danger':''}\" style=\"font-size:16px\">${util().formatCurrency(aging.d)}</div></div>\n      </div>\n      <div class=\"ims__card\"><div class=\"ims__table-wrap\">\n        <table class=\"ims__table\">\n          <thead><tr><th>Supplier</th><th>Ref</th><th>PO</th><th>Amount</th><th>Paid</th><th>Outstanding</th><th>Age</th><th>Status</th><th></th></tr></thead>\n          <tbody>${items.map(p=>{\n            const outstanding=(p.amount||0)-(p.paid_amount||0);\n            const hasDue=!!p.due_date;\n            const daysOverdue=hasDue?util().daysSince(p.due_date):null;\n            const notYetDue=hasDue&&daysOverdue<=0;\n            const ageCell=!hasDue?'\u2014':notYetDue?('Due '+util().formatDate(p.due_date)):daysOverdue+'d';\n            return `<tr>\n              <td>${util().sanitize(p.suppliers?.name||'\u2014')}</td><td>${util().sanitize(p.invoice_ref||'\u2014')}</td><td>${util().sanitize(p.purchase_orders?.po_number||'\u2014')}</td>\n              <td>${util().formatCurrency(p.amount)}</td><td>${util().formatCurrency(p.paid_amount)}</td>\n              <td style=\"font-weight:600;color:${outstanding>0?'var(--ims-warning)':''}\">${util().formatCurrency(outstanding)}</td>\n              <td style=\"color:${notYetDue||!hasDue?'var(--ims-text-muted)':daysOverdue>60?'var(--ims-danger)':daysOverdue>30?'var(--ims-warning)':''}\">${ageCell}</td>\n              <td>${util().pill(p.status)}</td>\n              <td>${p.status!=='paid'?`<button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.recordPayment('payable','${util().jsArg(p.id)}',${outstanding})\"><i class=\"ti ti-currency-pound\"></i> Pay</button>`:''}</td>\n            </tr>`;\n          }).join('')||'<tr><td colspan=\"9\" class=\"ims__table-empty\">No payables</td></tr>'}\n          </tbody>\n        </table>\n      </div></div><div id=\"ims-pay-courier\"></div>`;\n    _courierDueSection();\n  }\n  // Approved courier invoices with a balance to pay (paid from Accounts >\n  // Courier invoices; the cost is already in Accounts, so paying adds no\n  // expense).\n  async function _courierDueSection(){\n    const el=document.getElementById('ims-pay-courier'); if(!el) return;\n    const db_=_ciDb(), co=window.SM.AUTH.company?.id;\n    const [{data:invs},{data:pays}]=await Promise.all([\n      db_.from('courier_invoices').select('id,invoice_number,invoice_date,total,courier_id,couriers(name)').eq('company_id',co).eq('status','approved'),\n      db_.from('courier_invoice_payments').select('invoice_id,amount').eq('company_id',co)]);\n    const due=(invs||[]).map(i=>({...i,bal:_ci2((Number(i.total)||0)-(pays||[]).filter(p=>p.invoice_id===i.id).reduce((t,p)=>t+(Number(p.amount)||0),0))})).filter(i=>i.bal>0.005);\n    if(!due.length){ el.innerHTML=''; return; }\n    el.innerHTML=`<div class=\"ims__card\" style=\"margin-top:12px\"><div class=\"ims__card-header\"><span class=\"ims__card-title\">Courier invoices due</span><span style=\"font-size:12px;color:var(--ims-text-muted)\">${util().formatCurrency(due.reduce((t,i)=>t+i.bal,0))} to pay</span></div>\n      <div class=\"ims__table-wrap\"><table class=\"ims__table\"><thead><tr><th>Courier</th><th>Invoice</th><th>Date</th><th>Total</th><th>Balance due</th><th></th></tr></thead>\n      <tbody>${due.map(i=>`<tr><td>${util().sanitize(i.couriers?.name||'-')}</td><td>${util().sanitize(i.invoice_number)}</td><td>${i.invoice_date?util().formatDate(i.invoice_date):'-'}</td><td>${util().formatCurrency(i.total)}</td><td style=\"font-weight:600\">${util().formatCurrency(i.bal)}</td>\n        <td><button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.openCourierInvoice('${util().jsArg(i.id)}')\">Open</button></td></tr>`).join('')}</tbody></table></div></div>`;\n  }\n\n  // \u2500\u2500\u2500 RECEIVABLES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 loadReceivables(){\n    const content=document.getElementById('ims-acc-content');\n    if(!content)return;\n    const {data:receivables}=await db().select('accounts_receivable',{\n      select:'*, customers(business_name), orders(order_number), manifests(manifest_number)',\n      order:{col:'created_at',asc:false}\n    });\n    const items=receivables||[];\n    const aging={a:0,b:0,c:0,d:0};\n    items.filter(r=>!['paid','provisional'].includes(r.status)).forEach(r=>{\n      if(!r.due_date)return;\n      const daysOverdue=util().daysSince(r.due_date);\n      if(daysOverdue<=0)return;\n      const outstanding=(r.amount||0)-(r.paid_amount||0);\n      if(daysOverdue<=30)aging.a+=outstanding;\n      else if(daysOverdue<=60)aging.b+=outstanding;\n      else if(daysOverdue<=90)aging.c+=outstanding;\n      else aging.d+=outstanding;\n    });\n    content.innerHTML=`\n      <div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:14px\">\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">0\u201330 days</div><div class=\"ims__stat-value\" style=\"font-size:16px\">${util().formatCurrency(aging.a)}</div></div>\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">31\u201360 days</div><div class=\"ims__stat-value ims__stat-value--${aging.b>0?'warning':''}\" style=\"font-size:16px\">${util().formatCurrency(aging.b)}</div></div>\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">61\u201390 days</div><div class=\"ims__stat-value ims__stat-value--${aging.c>0?'danger':''}\" style=\"font-size:16px\">${util().formatCurrency(aging.c)}</div></div>\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">90+ days</div><div class=\"ims__stat-value ims__stat-value--${aging.d>0?'danger':''}\" style=\"font-size:16px\">${util().formatCurrency(aging.d)}</div></div>\n      </div>\n      <div class=\"ims__card\"><div class=\"ims__table-wrap\">\n        <table class=\"ims__table\">\n          <thead><tr><th>Customer</th><th>Ref</th><th>Order</th><th>Manifest</th><th>Amount</th><th>Paid</th><th>Outstanding</th><th>Age</th><th>Status</th><th></th></tr></thead>\n          <tbody>${items.map(r=>{\n            const outstanding=(r.amount||0)-(r.paid_amount||0);\n            const hasDue=!!r.due_date;\n            const daysOverdue=hasDue?util().daysSince(r.due_date):null;\n            const notYetDue=hasDue&&daysOverdue<=0;\n            const ageCell=r.status==='provisional'?'\u2014':!hasDue?'\u2014':notYetDue?('Due '+util().formatDate(r.due_date)):daysOverdue+'d';\n            return `<tr>\n              <td>${util().sanitize(r.customers?.business_name||r.customer_name||'\u2014')}</td><td>${util().sanitize(r.invoice_ref||'\u2014')}</td>\n              <td>${r.order_id?`<span class=\"ims__link\" onclick=\"window.IMS_ORDERS?.openOrder('${util().jsArg(r.order_id)}')\">${util().sanitize(r.orders?.order_number||'\u2014')}</span>`:'\u2014'}</td>\n              <td>${r.manifest_id?`<span class=\"ims__link\" onclick=\"window.IMS_LOGISTICS.openManifest('${util().jsArg(r.manifest_id)}')\">${util().sanitize(r.manifests?.manifest_number||'\u2014')}</span>`:'\u2014'}</td>\n              <td>${util().formatCurrency(r.amount)}</td><td>${util().formatCurrency(r.paid_amount)}</td>\n              <td style=\"font-weight:600;color:${outstanding>0?'var(--ims-accent)':''}\">${util().formatCurrency(outstanding)}</td>\n              <td style=\"color:${r.status==='provisional'||notYetDue||!hasDue?'var(--ims-text-muted)':daysOverdue>60?'var(--ims-danger)':daysOverdue>30?'var(--ims-warning)':''}\">${ageCell}</td>\n              <td>${r.status==='provisional'\n                ?`<span class=\"ims__pill ims__pill--neutral\" style=\"font-size:10px\" title=\"Order is out on a manifest but not yet confirmed delivered \u2014 not due yet\">In transit</span>`\n                :util().pill(r.status)}</td>\n              <td>${r.status!=='paid'&&r.status!=='provisional'?`<button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.recordPayment('receivable','${util().jsArg(r.id)}',${outstanding})\"><i class=\"ti ti-currency-pound\"></i> Receive</button>`:r.status==='provisional'?`<span style=\"font-size:11px;color:var(--ims-text-muted)\">Awaiting delivery</span>`:''}</td>\n            </tr>`;\n                    }).join('')||'<tr><td colspan=\"9\" class=\"ims__table-empty\">No receivables</td></tr>'}\n          </tbody>\n        </table>\n      </div></div>`;\n    ui().updateBadge('ims-badge-accounts',\n      items.filter(r=>!['paid','provisional'].includes(r.status)).length\n    );\n  }\n\n  async function recordPayment(type,id,outstanding){\n    ui().openModal('Record payment',`\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Payment date</label><input class=\"ims__input\" type=\"date\" id=\"ims-pay-date\" value=\"${new Date().toISOString().split('T')[0]}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Amount (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" id=\"ims-pay-amount\" value=\"${outstanding.toFixed(2)}\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Notes</label><input class=\"ims__input\" type=\"text\" id=\"ims-pay-notes\" placeholder=\"Payment reference, bank transfer...\"></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_ACCOUNTS.confirmPayment('${util().jsArg(type)}','${util().jsArg(id)}',${outstanding})\"><i class=\"ti ti-check\"></i> Confirm</button>\n    `,'sm');\n  }\n\n  async function confirmPayment(type,id,outstanding){\n    const amount=parseFloat(document.getElementById('ims-pay-amount')?.value)||0;\n    if(amount<=0){ui().toast('Please enter a valid amount','error');return;}\n    const dateVal=document.getElementById('ims-pay-date')?.value||new Date().toISOString().split('T')[0];\n    const table=type==='payable'?'accounts_payable':'accounts_receivable';\n    const {data:record}=await db().select(table,{eq:{id},maybeSingle:true,noCompanyFilter:true});\n    if(!record){ui().toast('Record not found','error');return;}\n    const newPaid=(record.paid_amount||0)+amount;\n    const newStatus=newPaid>=(record.amount||0)?'paid':'partial';\n    await db().update(table,id,{paid_amount:newPaid,status:newStatus,paid_at:newStatus==='paid'?new Date().toISOString():null});\n\n    // Close the loop back to the order itself. Wholesale orders auto-create\n    // a receivable on delivery and have no \"Mark paid\" button of their own,\n    // so Receivables is the single place their payment is recorded. Without\n    // this, orders.payment_status stayed 'unpaid' forever and the dashboard\n    // kept counting them with no way to ever clear them.\n    if(type==='receivable' && record.order_id){\n      await db().update('orders', record.order_id, {\n        payment_status: newStatus==='paid' ? 'paid' : 'partial',\n        payment_received_at: new Date(`${dateVal}T00:00:00`).toISOString()\n      });\n    }\n\n    // Use the date the user actually entered, not today's date.\n    await db().insert('transactions',{date:dateVal,type:type==='payable'?'expense':'income',category:type==='payable'?'Supplier payment':'Customer payment',amount,description:document.getElementById('ims-pay-notes')?.value||null,user_id:window.SM.AUTH.user?.id});\n    ui().closeModal();ui().toast(`Payment of ${util().formatCurrency(amount)} recorded`,'success');\n    type==='payable'?loadPayables():loadReceivables();\n  }\n\n  // \u2500\u2500\u2500 TRANSACTIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 loadTransactions(){\n    const content=document.getElementById('ims-acc-content');\n    if(!content)return;\n    const {data:txs}=await db().select('transactions',{order:{col:'date',asc:false},limit:100});\n    const items=txs||[];\n    content.innerHTML=`\n      <div class=\"ims__filters\" style=\"margin-bottom:14px\">\n        <div class=\"ims__search-wrap\" style=\"max-width:300px\"><i class=\"ti ti-search\"></i><input class=\"ims__input\" type=\"text\" id=\"ims-tx-search\" placeholder=\"Search...\" oninput=\"window.IMS_ACCOUNTS.filterTransactions()\"></div>\n        <select class=\"ims__select\" id=\"ims-tx-type-filter\" onchange=\"window.IMS_ACCOUNTS.filterTransactions()\">\n          <option value=\"\">All types</option><option value=\"income\">Income</option><option value=\"expense\">Expense</option>\n        </select>\n      </div>\n      <div class=\"ims__card\"><div class=\"ims__table-wrap\">\n        <table class=\"ims__table\">\n          <thead><tr><th>Date</th><th>Type</th><th>Category</th><th>Description</th><th>Amount</th><th>VAT</th><th>Ref</th></tr></thead>\n          <tbody id=\"ims-tx-tbody\">${renderTxRows(items)}</tbody>\n        </table>\n      </div></div>`;\n    window._allTransactions=items;\n  }\n\n  function renderTxRows(items){\n    return items.map(t=>`<tr>\n      <td>${util().formatDate(t.date)}</td>\n      <td><span class=\"ims__pill ims__pill--${t.type==='income'?'success':'warning'}\">${t.type}</span></td>\n      <td>${util().sanitize(t.category||'\u2014')}</td>\n      <td style=\"font-size:12px\">${util().sanitize(t.description||'\u2014')}</td>\n      <td style=\"font-weight:600;color:${_txIn(t)?'var(--ims-success)':'var(--ims-danger)'}\">${_txIn(t)?'':'-'}${util().formatCurrency(_txAmt(t))}</td>\n      <td>${t.vat_amount?util().formatCurrency(t.vat_amount):'\u2014'}</td>\n      <td style=\"font-size:12px\">${util().sanitize(t.reference||'\u2014')}</td>\n    </tr>`).join('')||'<tr><td colspan=\"7\" class=\"ims__table-empty\">No transactions</td></tr>';\n  }\n\n  function filterTransactions(){\n    const search=document.getElementById('ims-tx-search')?.value?.toLowerCase()||'';\n    const typeF=document.getElementById('ims-tx-type-filter')?.value||'';\n    const filtered=(window._allTransactions||[]).filter(t=>\n      (!typeF||t.type===typeF)&&\n      (!search||(t.category||'').toLowerCase().includes(search)||(t.description||'').toLowerCase().includes(search)||(t.reference||'').toLowerCase().includes(search))\n    );\n    const tbody=document.getElementById('ims-tx-tbody');\n    if(tbody)tbody.innerHTML=renderTxRows(filtered);\n  }\n\n  // \u2500\u2500\u2500 CLAIMS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  // This tab is the full claims history: every claim, open and closed.\n  // Finished cases leave Logistics > Lost Orders and are found here.\n  //\n  // There is ONE claim system. Settle and Reject here open the same forms\n  // as Lost Orders and run the same code (window.IMS_LOGISTICS), so income\n  // or write-off, stock and the double-click guard are always handled the\n  // same way. Before, this tab had its own Settle and Reject that used\n  // different columns, a different income category, and no stock handling.\n  //\n  // Claims have two sets of columns from two older versions. The Lost\n  // Orders set is the official one (claim_ref, amount_claimed,\n  // amount_settled); the older set (claim_reference, items_value,\n  // settled_amount) is only read as a fallback for older rows.\n  const CLAIM_CLOSED = ['settled', 'rejected', 'recovered', 'written_off'];\n  const CLAIM_LABELS = {\n    raised:'Raised', acknowledged:'Acknowledged', escalated_14:'Escalated', overdue_30:'Overdue',\n    settled:'Settled', rejected:'Rejected', recovered:'Parcel found', written_off:'Written off'\n  };\n  const CLAIM_PILLS = {\n    raised:'warning', acknowledged:'info', escalated_14:'danger', overdue_30:'danger',\n    settled:'success', rejected:'danger', recovered:'success', written_off:'neutral'\n  };\n  const _claimRef     = c => c.claim_ref || c.claim_reference || null;\n  const _claimValue   = c => parseFloat(c.amount_claimed ?? c.items_value) || 0;\n  const _claimSettled = c => c.amount_settled ?? c.settled_amount ?? null;\n  const _claimClosed  = c => c.settled_at || c.rejected_at || null;\n  let _claimsCache = [];\n\n  async function loadClaims(){\n    const content=document.getElementById('ims-acc-content');\n    if(!content)return;\n    const {data:claims}=await db().select('claims',{\n      select:'*, orders(order_number,customer_name), couriers(name)',\n      order:{col:'raised_at',asc:false}\n    });\n    _claimsCache=claims||[];\n    content.innerHTML=`\n      <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;gap:12px;flex-wrap:wrap\">\n        <div class=\"ims__alert ims__alert--info\" style=\"margin:0;flex:1;min-width:260px\"><i class=\"ti ti-info-circle\"></i><span>Every claim, open and closed. Open claims are worked on in <strong>Logistics &gt; Lost Orders</strong>; finished ones stay here as history. Settle and Reject here do exactly the same as in Lost Orders.</span></div>\n        <select class=\"ims__select\" id=\"ims-claims-filter\" style=\"max-width:170px\" onchange=\"window.IMS_ACCOUNTS.renderClaims()\">\n          <option value=\"\">All claims</option>\n          <option value=\"open\">Open only</option>\n          <option value=\"closed\">Closed only</option>\n        </select>\n        <button class=\"ims__btn ims__btn--primary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.showNewClaim()\"><i class=\"ti ti-plus\"></i> New claim</button>\n      </div>\n      <div class=\"ims__card\"><div class=\"ims__table-wrap\"><table class=\"ims__table\">\n        <thead><tr><th>Ref</th><th>Order</th><th>Courier</th><th>Claim value</th><th>Raised</th><th>Days open</th><th>Status</th><th>Settled</th><th>Closed</th><th></th></tr></thead>\n        <tbody id=\"ims-claims-tbody\"></tbody>\n      </table></div></div>`;\n    renderClaims();\n  }\n\n  function renderClaims(){\n    const tbody=document.getElementById('ims-claims-tbody');\n    if(!tbody)return;\n    const filter=document.getElementById('ims-claims-filter')?.value||'';\n    let items=_claimsCache;\n    if(filter==='open')   items=items.filter(c=>!CLAIM_CLOSED.includes(c.status));\n    if(filter==='closed') items=items.filter(c=>CLAIM_CLOSED.includes(c.status));\n    tbody.innerHTML=items.map(c=>{\n      const isClosed=CLAIM_CLOSED.includes(c.status);\n      const closedAt=_claimClosed(c);\n      // Days open counts to the day it closed, not to today, once closed.\n      const days=util().daysSince(c.raised_at) - (isClosed && closedAt ? util().daysSince(closedAt) : 0);\n      const urgent=!isClosed && ['escalated_14','overdue_30'].includes(c.status);\n      const ref=c.status==='written_off' && !_claimRef(c) ? '<span style=\"color:var(--ims-text-muted)\">No claim</span>' : util().sanitize(_claimRef(c)||c.id.slice(0,8));\n      const settled=_claimSettled(c);\n      const pill=`<span class=\"ims__pill ims__pill--${CLAIM_PILLS[c.status]||'neutral'}\">${util().sanitize(CLAIM_LABELS[c.status]||c.status)}</span>`;\n      const outcome=(c.status==='rejected'||c.status==='written_off') && c.rejection_reason\n        ? `<div style=\"font-size:10px;color:var(--ims-text-muted);margin-top:2px\">${util().sanitize(c.rejection_reason)}</div>` : '';\n      const actions=isClosed ? '' : `<div class=\"ims__btn-group\">\n          <button class=\"ims__btn ims__btn--success ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.settleClaim('${util().jsArg(c.id)}')\"><i class=\"ti ti-check\"></i> Settle</button>\n          <button class=\"ims__btn ims__btn--danger ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.rejectClaim('${util().jsArg(c.id)}')\"><i class=\"ti ti-x\"></i> Reject</button>\n        </div>`;\n      return `<tr class=\"${urgent?'ims__row--delayed':''}\">\n        <td>${ref}</td>\n        <td>${util().sanitize(c.orders?.order_number||'-')}</td>\n        <td>${util().sanitize(c.couriers?.name||'-')}</td>\n        <td>${util().formatCurrency(_claimValue(c))}</td>\n        <td>${util().formatDate(c.raised_at)}</td>\n        <td style=\"color:${!isClosed&&days>30?'var(--ims-danger)':!isClosed&&days>14?'var(--ims-warning)':''};font-weight:600\">${Math.max(0,days)}d</td>\n        <td>${pill}${outcome}</td>\n        <td>${settled!=null?util().formatCurrency(settled):'-'}</td>\n        <td>${closedAt?util().formatDate(closedAt):'-'}</td>\n        <td>${actions}</td>\n      </tr>`;\n    }).join('')||`<tr><td colspan=\"10\" class=\"ims__table-empty\">No ${filter==='open'?'open ':filter==='closed'?'closed ':''}claims</td></tr>`;\n  }\n\n  // Opens the Lost Orders form for this claim, then points its confirm\n  // button at the same Lost Orders action followed by a refresh of this\n  // list (the Lost Orders action itself only refreshes Lost Orders).\n  function _useLostOrdersForm(claim, openFn, confirmSelector, confirmFn){\n    const L=window.IMS_LOGISTICS;\n    if(!L?.[openFn]||!L?.[confirmFn]){ ui().toast('Please open Logistics once, then try again','warning'); return; }\n    const orderId=claim.order_id||'';\n    const orderNumber=claim.orders?.order_number||'';\n    const ref=_claimRef(claim)||claim.id.slice(0,8);\n    L[openFn](orderId, orderNumber, claim.id, ref, _claimValue(claim));\n    const btn=document.querySelector(`#ims-modal-footer ${confirmSelector}`);\n    if(btn){\n      btn.onclick=async()=>{\n        btn.disabled=true;\n        await L[confirmFn](orderId, orderNumber, claim.id, ref, _claimValue(claim));\n        // Clear this claim's 14 and 30 day alerts once it is closed (the\n        // old Accounts Settle did this; kept so no stale alerts remain).\n        const {data:after}=await db().select('claims',{select:'status',eq:{id:claim.id},maybeSingle:true,noCompanyFilter:true});\n        if(CLAIM_CLOSED.includes(after?.status)){\n          const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n          await client.from('notifications').update({is_read:true}).eq('reference_id',claim.id);\n        }\n        loadClaims();\n      };\n    }\n  }\n\n  async function settleClaim(claimId){\n    const claim=_claimsCache.find(c=>c.id===claimId);\n    if(!claim){ ui().toast('Claim not found, please refresh','error'); return; }\n    _useLostOrdersForm(claim,'openSettleClaim','[onclick*=\"confirmSettleClaim\"]','confirmSettleClaim');\n  }\n\n  async function rejectClaim(claimId){\n    const claim=_claimsCache.find(c=>c.id===claimId);\n    if(!claim){ ui().toast('Claim not found, please refresh','error'); return; }\n    _useLostOrdersForm(claim,'openRejectClaim','[onclick*=\"confirmRejectClaim\"]','confirmRejectClaim');\n  }\n\n  async function showNewClaim(){\n    const {data:couriers}=await db().select('couriers',{eq:{is_active:true},order:{col:'name'}});\n    const {data:orders}=await db().select('orders',{select:'id,order_number,customer_name',in:{status:['dispatched','lost']},order:{col:'created_at',asc:false},limit:50});\n    const courierOpts=(couriers||[]).map(c=>`<option value=\"${c.id}\">${util().sanitize(c.name)}</option>`).join('');\n    const orderOpts=(orders||[]).map(o=>`<option value=\"${o.id}\">${util().sanitize(o.order_number)}: ${util().sanitize(o.customer_name||'')}</option>`).join('');\n    ui().openModal('Record a new claim',`\n      <div class=\"ims__alert ims__alert--info\" style=\"margin-bottom:12px\"><i class=\"ti ti-info-circle\"></i><span>This records a claim already raised with the courier. It does not email them. To raise and email a claim for a lost order, use <strong>Raise claim</strong> in Logistics &gt; Lost Orders.</span></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-nc-courier\"><option value=\"\">Select courier</option>${courierOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Linked order (optional)</label><select class=\"ims__select\" id=\"ims-nc-order\"><option value=\"\">No linked order</option>${orderOpts}</select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Claim value (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-nc-value\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Courier's claim reference (optional)</label><input class=\"ims__input\" type=\"text\" id=\"ims-nc-ref\"></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label ims__label--req\">Description</label><textarea class=\"ims__textarea\" id=\"ims-nc-desc\" rows=\"3\"></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--danger\" onclick=\"window.IMS_ACCOUNTS.saveNewClaim()\"><i class=\"ti ti-file-alert\"></i> Record claim</button>\n    `,'sm');\n  }\n\n  async function saveNewClaim(){\n    const courierId=document.getElementById('ims-nc-courier')?.value;\n    const orderId=document.getElementById('ims-nc-order')?.value;\n    const value=parseFloat(document.getElementById('ims-nc-value')?.value)||0;\n    const courierRef=document.getElementById('ims-nc-ref')?.value?.trim();\n    const desc=document.getElementById('ims-nc-desc')?.value?.trim();\n    if(!courierId){ui().toast('Please select a courier','error');return;}\n    if(value<=0){ui().toast('Please enter a claim value','error');return;}\n    if(!desc){ui().toast('Please enter a description','error');return;}\n    // Give it our own CLM number, the same way Lost Orders does, and fill\n    // both column sets, so it appears in Lost Orders and every report.\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const {data:lastClaim}=await client.from('claims').select('claim_ref').not('claim_ref','is',null).order('claim_ref',{ascending:false}).limit(1).maybeSingle();\n    const claimRef=util().generateRef('CLM',lastClaim?.claim_ref);\n    const {error}=await db().insert('claims',{\n      courier_id:courierId, order_id:orderId||null,\n      claim_ref:claimRef, claim_reference:claimRef, courier_claim_ref:courierRef||null,\n      claim_type:'lost', amount_claimed:value, items_value:value,\n      description:desc, status:'raised', raised_at:new Date().toISOString()\n    });\n    if(error){ui().toast('Failed: '+error.message,'error');return;}\n    ui().closeModal();ui().toast(`Claim ${claimRef} recorded for ${util().formatCurrency(value)}`,'success');loadClaims();\n  }\n\n  // \u2500\u2500\u2500 VAT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 loadVAT(){\n    const content=document.getElementById('ims-acc-content');\n    if(!content)return;\n    const now=new Date();\n    const qStart=new Date(now.getFullYear(),Math.floor(now.getMonth()/3)*3,1).toISOString().split('T')[0];\n    const qEnd=new Date(now.getFullYear(),Math.floor(now.getMonth()/3)*3+3,0).toISOString().split('T')[0];\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n\n    const [{data:txs},{data:invLines}]=await Promise.all([\n      db().select('transactions',{gte:{date:qStart},lte:{date:qEnd}}),\n      client.from('invoice_lines').select('vat_amount,vat_rate,invoices(invoice_type,invoice_date,company_id)')\n        .eq('invoices.company_id',window.SM.AUTH.company?.id)\n        .gte('invoices.invoice_date',qStart)\n        .lte('invoices.invoice_date',qEnd)\n    ]);\n\n    const txItems=txs||[];\n    const txOutputVAT=txItems.filter(t=>t.type==='income').reduce((s,t)=>s+(t.vat_amount||0),0);\n    // Credit notes booked before this change were recorded as expenses\n    // (\"Credit note issued\") with VAT. Their VAT is already taken off sales\n    // VAT through the credit note document (cnVAT below), so it is not\n    // purchase VAT and is left out here, so it is not counted twice.\n    const txInputVAT=txItems.filter(t=>t.type==='expense'&&t.category!=='Credit note issued').reduce((s,t)=>s+(t.vat_amount||0),0);\n\n    // Also include VAT from formal invoices\n    const invOutputVAT=(invLines||[]).filter(l=>l.invoices?.invoice_type==='sales').reduce((s,l)=>s+(l.vat_amount||0),0);\n    const cnVAT=(invLines||[]).filter(l=>l.invoices?.invoice_type==='credit_note').reduce((s,l)=>s+(l.vat_amount||0),0);\n\n    const outputVAT=Math.max(txOutputVAT,invOutputVAT)-cnVAT;\n    const inputVAT=txInputVAT;\n    const netVAT=outputVAT-inputVAT;\n\n    content.innerHTML=`\n      <div class=\"ims__alert ims__alert--info\"><i class=\"ti ti-info-circle\"></i>\n        <span>VAT quarter: <strong>${util().formatDate(qStart)} \u2014 ${util().formatDate(qEnd)}</strong>. Figures include both manual transactions and formal invoices.</span>\n      </div>\n      <div style=\"display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px\">\n        <div class=\"ims__stat\"><div class=\"ims__stat-label\">Output VAT (sales)</div><div class=\"ims__stat-value ims__stat-value--success\">${util().formatCurrency(outputVAT)}</div></div>\n        <div class=\"ims__stat\"><div class=\"ims__stat-label\">Input VAT (purchases)</div><div class=\"ims__stat-value ims__stat-value--warning\">${util().formatCurrency(inputVAT)}</div></div>\n        <div class=\"ims__stat\"><div class=\"ims__stat-label\">Net VAT liability</div><div class=\"ims__stat-value ims__stat-value--${netVAT>0?'danger':'success'}\">${util().formatCurrency(Math.abs(netVAT))}</div><div class=\"ims__stat-sub\">${netVAT>0?'Due to HMRC':'Refund owed'}</div></div>\n      </div>\n      <div class=\"ims__card\">\n        <div class=\"ims__card-header\"><div class=\"ims__card-title\">VAT return \u2014 MTD boxes</div>\n          <button class=\"ims__btn ims__btn--secondary ims__btn--sm\" onclick=\"window.IMS_ACCOUNTS.exportVATCSV('${util().jsArg(qStart)}','${util().jsArg(qEnd)}',${outputVAT},${inputVAT},${netVAT})\"><i class=\"ti ti-download\"></i> Export VAT summary</button>\n        </div>\n        <table class=\"ims__table\"><tbody>\n          <tr><td>Box 1: VAT due on sales</td><td style=\"text-align:right;font-weight:600\">${util().formatCurrency(outputVAT)}</td></tr>\n          <tr><td>Box 2: VAT due on acquisitions (EU)</td><td style=\"text-align:right\">\u00A30.00</td></tr>\n          <tr><td>Box 3: Total VAT due (Box 1 + Box 2)</td><td style=\"text-align:right;font-weight:600\">${util().formatCurrency(outputVAT)}</td></tr>\n          <tr><td>Box 4: VAT reclaimed on purchases</td><td style=\"text-align:right;font-weight:600\">${util().formatCurrency(inputVAT)}</td></tr>\n          <tr style=\"border-top:2px solid var(--ims-border)\"><td><strong>Box 5: Net VAT to pay/reclaim</strong></td><td style=\"text-align:right;font-weight:700;font-size:15px;color:${netVAT>0?'var(--ims-danger)':'var(--ims-success)'}\">${util().formatCurrency(Math.abs(netVAT))} ${netVAT>0?'(payable)':'(refund)'}</td></tr>\n          <tr style=\"border-top:1px solid var(--ims-border)\"><td style=\"color:var(--ims-text-muted)\">Box 6: Total value of sales (ex VAT)</td><td style=\"text-align:right;color:var(--ims-text-muted)\">${util().formatCurrency(txItems.filter(t=>t.type==='income').reduce((s,t)=>s+(t.amount||0),0))}</td></tr>\n          <tr><td style=\"color:var(--ims-text-muted)\">Box 7: Total value of purchases (ex VAT)</td><td style=\"text-align:right;color:var(--ims-text-muted)\">${util().formatCurrency(txItems.filter(t=>t.type==='expense').reduce((s,t)=>s+(t.amount||0),0))}</td></tr>\n        </tbody></table>\n      </div>`;\n  }\n\n  function exportVATCSV(from,to,outputVAT,inputVAT,netVAT){\n    util().exportCSV(\n      ['Box','Description','Amount (\u00A3)'],\n      [\n        ['Box 1','VAT due on sales',outputVAT.toFixed(2)],\n        ['Box 2','VAT due on acquisitions (EU)','0.00'],\n        ['Box 3','Total VAT due',outputVAT.toFixed(2)],\n        ['Box 4','VAT reclaimed on purchases',inputVAT.toFixed(2)],\n        ['Box 5','Net VAT to pay/reclaim',Math.abs(netVAT).toFixed(2)],\n        ['','netVAT>0 = payable, netVAT<0 = refund',''],\n        ['Period from',from,''],\n        ['Period to',to,'']\n      ],\n      `vat_return_${from}_to_${to}`\n    );\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    // Runs whenever Accounts opens, independent of which tab is shown first\n  // \u2014 loadReceivables() also refreshes this badge with fully up-to-date\n  // numbers once someone actually views that tab, this just makes sure\n  // it's already correct the moment the module opens at all.\n  async function updateAccountsBadge(){\n    const { data } = await db().select('accounts_receivable', { select: 'id,status' });\n    const count = (data||[]).filter(r=>!['paid','provisional'].includes(r.status)).length;\n    ui().updateBadge('ims-badge-accounts', count);\n  }\n\n  // Every screen change is announced twice: once directly, and again when\n  // the web address changes to #accounts (ims-core.js). The second one can\n  // arrive after another screen has already switched Accounts to a tab\n  // (for example Lost Orders' \"View closed claims\" opening Claims), and it\n  // used to flip Accounts back to Overview. So Accounts only sets itself up\n  // when it is newly opened, and ignores a repeat while it is already open.\n  let _lastPanel = null;\n  window.addEventListener('ims:panel',e=>{\n    const panel = e.detail.panel;\n    // Open on Overview, and mark it as the selected tab: leaving Accounts on\n    // another tab used to keep that tab highlighted over the Overview.\n    if(panel==='accounts' && _lastPanel!=='accounts'){initTabs();switchTab('overview');updateAccountsBadge();}\n    _lastPanel = panel;\n  });\n  window.addEventListener('ims:ready',()=>{\n    document.getElementById('ims-acc-new-btn')?.addEventListener('click',showNewTransaction);\n  });\n\n  window.IMS_ACCOUNTS={\n    loadCourierInvoices, loadCourierInvoicesIfOpen, newCourierInvoice, ciFormFuel, ciFormCalc, saveCourierInvoice,\n    importInvoiceLines, confirmImportLines, runCourierCheck, openCourierInvoice, recheckCourierInvoice,\n    confirmInvoiceLine, unlinkInvoiceLine, linkInvoiceLine, setCourierInvoiceStatus, viewCourierInvoicePdf, exportDisputeSheet,\n    approveCourierInvoice, confirmApproveCourierInvoice, undoCourierApproval, recordCourierPayment, recordCourierCredit, removeCourierPayment,\n    editCourierInvoice, saveCourierInvoiceEdit, cancelCourierInvoice, confirmCancelCourierInvoice, reinstateCourierInvoice,\n    load:loadOverview,loadTab,switchTab,\n    loadOverview,loadInvoices,filterInvoices,loadNotes,loadPayables,loadReceivables,loadTransactions,loadClaims,loadVAT,\n    showNewTransaction,onTxTypeChange,saveTransaction,\n    showNewInvoice,showGenerateFromOrder,filterGFIOrders,selectGFIOrder,onGFIOrderChange,generateInvoiceFromOrder,\n    addInvoiceLine,updateInvLine,removeInvLine,recalcInvoice,saveInvoice,\n    openInvoice,markInvoiceSent,markInvoicePaid,confirmInvoicePaid,printInvoice,deleteInvoice,\n    showNewNote,onNoteTypeChange,recalcNote,saveNote,reverseOrderInvoice,\n    showExport,runExport,\n    recordPayment,confirmPayment,settleClaim,rejectClaim,showNewClaim,saveNewClaim,renderClaims,\n    exportVATCSV,filterTransactions\n  };\n})();"],
  "mappings": "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",
  "names": []
}
