{
  "version": 3,
  "sources": ["/cdn/shop/t/4/assets/ims-customers.js?bust=20260618"],
  "sourcesContent": ["(function () {\n  'use strict';\n  const db = () => window.SM.DB;\n  const ui = () => window.SM.UI;\n  const util = () => window.SM.UTIL;\n\n  // \u2500\u2500\u2500 PERMISSIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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  // Adding customers (the form and CSV import): Super Admin and Admin, or\n  // anyone a Super Admin has granted \"Can add new customers\" (see\n  // window.SM.AUTH.canAddCustomers). The database enforces the same rule.\n  // Credit terms and credit limit: Admin and Super Admin only, both when\n  // adding and when editing. A customer added by anyone else starts on\n  // \"Advance payment\" with no credit, until an Admin sets terms.\n  const canAdd    = () => !!window.SM.AUTH.canAddCustomers?.();\n  const canCredit = () => window.SM.AUTH.isAdmin();\n  const NO_CREDIT_TERMS = 'Advance payment';\n\n  // Shows or hides \"+ New customer\" and \"Import\" for whoever is signed in.\n  // Runs every time the Customers screen opens, so it is always right for\n  // the current person (it used to be set once, and never shown again).\n  function applyButtonAccess() {\n    const show = canAdd();\n    ['ims-cust-new-btn', 'ims-cust-import-btn'].forEach(id => {\n      const el = document.getElementById(id);\n      if (el) el.style.display = show ? '' : 'none';\n    });\n  }\n\n  async function load() {\n    applyButtonAccess();\n    const tbody = document.getElementById('ims-cust-tbody');\n    if (!tbody) return;\n    tbody.innerHTML = `<tr><td colspan=\"8\" class=\"ims__table-empty\"><i class=\"ti ti-loader-2 ims__spin\"></i></td></tr>`;\n\n    const search = document.getElementById('ims-cust-search')?.value?.trim() || '';\n    const { data: customers, error } = await db().select('customers', { order: { col: 'business_name' } });\n    if (error) { ui().toast('Failed to load customers', 'error'); return; }\n    let items = customers || [];\n\n    // Deactivated customers are hidden unless \"Show inactive\" is ticked.\n    // The switch is added next to the search box the first time.\n    const searchEl = document.getElementById('ims-cust-search');\n    if (searchEl && !document.getElementById('ims-cust-show-inactive')) {\n      const lbl = document.createElement('label');\n      lbl.style.cssText = 'display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ims-text-muted);cursor:pointer;margin-left:10px;white-space:nowrap';\n      lbl.innerHTML = '<input type=\"checkbox\" id=\"ims-cust-show-inactive\"> Show inactive';\n      searchEl.insertAdjacentElement('afterend', lbl);\n      lbl.querySelector('input').addEventListener('change', () => load());\n    }\n    const showInactive = !!document.getElementById('ims-cust-show-inactive')?.checked;\n    if (!showInactive) items = items.filter(c => c.is_active !== false);\n\n    if (search) { \n      const s = search.toLowerCase();\n      items = items.filter(c =>\n        c.business_name?.toLowerCase().includes(s) ||\n        c.contact_name?.toLowerCase().includes(s) ||\n        c.postcode?.toLowerCase().includes(s) ||\n        c.email?.toLowerCase().includes(s)\n      );\n    }\n\n    if (!items.length) {\n      tbody.innerHTML = '<tr><td colspan=\"8\" class=\"ims__table-empty\">No customers found</td></tr>';\n      return;\n    }\n\n    // Get order counts and balances\n    const { data: orderCounts } = await db().select('orders', {\n      select: 'customer_id',\n      in: { customer_id: items.map(c => c.id) }\n    });\n    const countMap = {};\n    (orderCounts||[]).forEach(o => { if (o.customer_id) countMap[o.customer_id] = (countMap[o.customer_id]||0)+1; });\n\n    const { data: receivables } = await db().select('accounts_receivable', {\n      select: 'customer_id,amount,paid_amount',\n      in: { customer_id: items.map(c => c.id) },\n      neq: { status: 'paid' }\n    });\n    const balanceMap = {};\n    (receivables||[]).forEach(r => {\n      if (r.customer_id) balanceMap[r.customer_id] = (balanceMap[r.customer_id]||0) + ((r.amount||0)-(r.paid_amount||0));\n    });\n\n    tbody.innerHTML = items.map(c => `\n      <tr>\n        <td><span class=\"ims__link\" onclick=\"window.IMS_CUSTOMERS.openCustomer('${util().jsArg(c.id)}')\">${util().sanitize(c.business_name||'-')}</span>${c.is_active===false?' <span class=\"ims__pill ims__pill--neutral\" style=\"font-size:10px\">Inactive</span>':''}</td>\n        <td>${util().sanitize(c.contact_name||'\u2014')}</td>\n        <td>${util().sanitize(c.postcode||'\u2014')}</td>\n        <td>${util().sanitize(c.phone||'\u2014')}</td>\n        <td>${c.credit_limit ? util().formatCurrency(c.credit_limit) : '\u2014'}</td>\n        <td style=\"font-weight:600;color:${(balanceMap[c.id]||0)>0?'var(--ims-warning)':''}\">${balanceMap[c.id] ? util().formatCurrency(balanceMap[c.id]) : '\u00A30.00'}</td>\n        <td>${countMap[c.id]||0}</td>\n        <td>\n          <div class=\"ims__btn-group\">\n            <button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_CUSTOMERS.openCustomer('${util().jsArg(c.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_CUSTOMERS.showForm('${util().jsArg(c.id)}')\" title=\"Edit\"><i class=\"ti ti-edit\"></i></button>\n            ${canCredit() ? `<button class=\"ims__btn ims__btn--secondary ims__btn--sm ims__btn--icon\" onclick=\"window.IMS_CUSTOMERS.showMergeCustomer('${util().jsArg(c.id)}','${util().jsArg(c.business_name||'')}')\" title=\"Merge duplicate into another record\"><i class=\"ti ti-git-merge\"></i></button>` : ''}\n          </div>\n        </td>\n      </tr>`).join('');\n  }\n\n  async function openCustomer(id) {\n    const { data: c } = await db().select('customers', { eq: { id }, maybeSingle: true, noCompanyFilter: true });\n    if (!c) return;\n\n    // Fetch ALL matching orders (no limit) for accurate totals \u2014 the\n    // \"Recent orders\" table below only displays the first 10 of these.\n    // Previously this modal's \"Total orders\" / \"Total spend\" stats were\n    // computed from the same 10-row fetch used for the table, so they\n    // silently undercounted for any customer with more than 10 orders.\n    const { data: allOrders } = await db().select('orders', {\n      select: 'id,order_number,total_value,status,created_at',\n      eq: { customer_id: id }, order: { col: 'created_at', asc: false }\n    });\n    const orders = allOrders || [];\n    const recentOrders = orders.slice(0, 10);\n\n    const totalSpend  = orders.reduce((s, o) => s + (o.total_value||0), 0);\n    const lastOrder   = orders?.[0];\n\n    ui().openModal(`Customer: ${c.business_name}`, `\n      <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px\">\n        <div><span class=\"ims__label\">Business name</span><div style=\"font-weight:600\">${util().sanitize(c.business_name)}</div></div>\n        <div><span class=\"ims__label\">Contact person</span><div>${util().sanitize(c.contact_name||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Phone</span><div>${util().sanitize(c.phone||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Email</span><div>${util().sanitize(c.email||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Postcode</span><div>${util().sanitize(c.postcode||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">VAT number</span><div>${util().sanitize(c.vat_number||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Credit terms</span><div>${util().sanitize(c.credit_terms||'\u2014')}</div></div>\n        <div><span class=\"ims__label\">Credit limit</span><div style=\"font-weight:600\">${c.credit_limit ? util().formatCurrency(c.credit_limit) : 'No limit set'}</div></div>\n        <div style=\"grid-column:1/-1\"><span class=\"ims__label\">Address</span><div>${util().sanitize(c.address||'\u2014')}</div></div>\n        ${c.notes ? `<div style=\"grid-column:1/-1\"><span class=\"ims__label\">Notes</span><div>${util().sanitize(c.notes)}</div></div>` : ''}\n      </div>\n      <hr class=\"ims__divider\">\n      <div style=\"display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px\">\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Total orders</div><div class=\"ims__stat-value\" style=\"font-size:18px\">${orders.length}</div></div>\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Total spend</div><div class=\"ims__stat-value\" style=\"font-size:18px\">${util().formatCurrency(totalSpend)}</div></div>\n        <div class=\"ims__stat\" style=\"padding:10px\"><div class=\"ims__stat-label\">Last order</div><div class=\"ims__stat-value\" style=\"font-size:14px\">${lastOrder ? util().formatDate(lastOrder.created_at) : 'Never'}</div></div>\n      </div>\n      <div style=\"display:flex;justify-content:space-between;align-items:center\">\n        <strong style=\"font-size:13px\">Recent orders</strong>\n        ${orders.length>10?`<span class=\"ims__link\" style=\"font-size:12px\" onclick=\"window.IMS_CUSTOMERS.viewCustomerOrderHistory('${util().jsArg(c.business_name)}')\">Showing 10 of ${orders.length} \u2014 view all</span>`:''}\n      </div>\n      <div class=\"ims__table-wrap\" style=\"margin-top:8px\">\n        <table class=\"ims__table\">\n          <thead><tr><th>Order #</th><th>Value</th><th>Date</th><th>Status</th></tr></thead>\n          <tbody>${recentOrders.map(o => `\n            <tr>\n              <td><span class=\"ims__link\" onclick=\"window.SM.UI.showPanel('orders')\">${util().sanitize(o.order_number)}</span></td>\n              <td>${util().formatCurrency(o.total_value)}</td>\n              <td>${util().formatDate(o.created_at)}</td>\n              <td>${util().pill(o.status)}</td>\n            </tr>`).join('') || '<tr><td colspan=\"4\" class=\"ims__table-empty\">No orders yet</td></tr>'}\n          </tbody>\n        </table>\n      </div>\n    `, `\n      ${canCredit() ? `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_CUSTOMERS.deleteCustomer('${util().jsArg(c.id)}','${util().jsArg(c.business_name)}')\"><i class=\"ti ti-trash\"></i> Delete</button>\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_CUSTOMERS.setCustomerActive('${util().jsArg(c.id)}','${util().jsArg(c.business_name)}',${c.is_active===false?'true':'false'})\"><i class=\"ti ti-${c.is_active===false?'player-play':'player-pause'}\"></i> ${c.is_active===false?'Reactivate':'Deactivate'}</button>\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_CUSTOMERS.showMergeCustomer('${util().jsArg(c.id)}','${util().jsArg(c.business_name)}')\"><i class=\"ti ti-git-merge\"></i> Merge duplicate</button>` : ''}\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.IMS_CUSTOMERS.showForm('${util().jsArg(c.id)}')\"><i class=\"ti ti-edit\"></i> Edit</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.SM.UI.closeModal()\">Close</button>\n    `, 'lg');\n  }\n\n  // Opens the full Order History screen pre-filtered to this customer's\n  // exact business name, with the date range cleared (History defaults to\n  // \"this month\", which would hide older orders like a just-merged one).\n  async function viewCustomerOrderHistory(businessName){\n    ui().closeModal();\n    await window.IMS_ORDERS.showHistory();\n    setTimeout(()=>{\n      const searchEl=document.getElementById('ims-hist-search');\n      const fromEl=document.getElementById('ims-hist-from');\n      if(searchEl)searchEl.value=businessName;\n      if(fromEl)fromEl.value='';\n      window.IMS_ORDERS.loadHistory();\n    },250);\n  }\n\n  // \u2500\u2500\u2500 MERGE / DELETE DUPLICATE CUSTOMER \u2500\u2500\u2500\u2500\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  // Deleting a customer record outright would either fail (orders,\n  // receivables, and deal_customers all reference customer_id as a real\n  // foreign key) or silently orphan that history. This moves everything\n  // from the duplicate onto the correct surviving record first, then\n  // deletes the now-empty duplicate. order_items, logistics_jobs, claims,\n  // invoices etc. all reference orders.id (or are plain text snapshots),\n  // never customers.id directly, so they follow automatically with no\n  // extra work once orders.customer_id is repointed.\n  async function showMergeCustomer(duplicateId, duplicateName){\n    // Merging permanently removes the duplicate record, so it is Admin\n    // only, like Delete (the database refuses deletes from anyone else).\n    if (!canCredit()) { ui().toast('Only an Admin can merge customers', 'error'); return; }\n    const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n    const [{data:allCustomers},{data:orders},{data:receivables}]=await Promise.all([\n      client.from('customers').select('id,business_name').eq('company_id',window.SM.AUTH.company?.id).neq('id',duplicateId).order('business_name'),\n      client.from('orders').select('id').eq('customer_id',duplicateId),\n      client.from('accounts_receivable').select('id').eq('customer_id',duplicateId)\n    ]);\n    const orderCount=(orders||[]).length;\n    const recCount=(receivables||[]).length;\n\n    ui().openModal(`Merge duplicate \u2014 ${util().sanitize(duplicateName)}`,`\n      <div class=\"ims__alert ims__alert--warning\" style=\"margin-bottom:14px\">\n        <i class=\"ti ti-alert-triangle\"></i>\n        <span>This moves <strong>${orderCount} order${orderCount!==1?'s':''}</strong> and <strong>${recCount} receivable${recCount!==1?'s':''}</strong> from <strong>${util().sanitize(duplicateName)}</strong> onto the customer you select below, then permanently deletes ${util().sanitize(duplicateName)}. This cannot be undone.</span>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label ims__label--req\">Merge into (the record to keep)</label>\n        <select class=\"ims__select\" id=\"ims-merge-target\">\n          <option value=\"\">Select the correct customer record...</option>\n          ${(allCustomers||[]).map(c=>`<option value=\"${c.id}\">${util().sanitize(c.business_name)}</option>`).join('')}\n        </select>\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_CUSTOMERS.confirmMergeCustomer('${util().jsArg(duplicateId)}','${util().jsArg(duplicateName)}')\"><i class=\"ti ti-git-merge\"></i> Merge &amp; delete duplicate</button>\n    `,'sm');\n  }\n\n  async function confirmMergeCustomer(duplicateId, duplicateName){\n    if (!canCredit()) { ui().toast('Only an Admin can merge customers', 'error'); return; }\n    const targetSelect=document.getElementById('ims-merge-target');\n    const targetId=targetSelect?.value;\n    const targetName=targetSelect?.options[targetSelect.selectedIndex]?.text||'';\n    if(!targetId){ ui().toast('Please select which customer record to keep','error'); return; }\n    if(targetId===duplicateId){ ui().toast('Cannot merge a customer into itself','error'); return; }\n\n    ui().confirm(`Merge <strong>${util().sanitize(duplicateName)}</strong> into <strong>${util().sanitize(targetName)}</strong> and permanently delete ${util().sanitize(duplicateName)}?<br><br>This cannot be undone.`, async()=>{\n      const client=window.supabase.createClient(window.IMS_SUPABASE_URL,window.IMS_SUPABASE_ANON_KEY);\n\n      // Re-point the real history first. orders.customer_name is a\n      // snapshotted text field, separate from the customer_id foreign\n      // key \u2014 it must be updated too, or merged orders keep showing the\n      // old duplicate's name in search results, manifests, and anywhere\n      // else that displays orders.customer_name directly instead of\n      // joining through customers.business_name.\n      await client.from('orders').update({customer_id:targetId, customer_name:targetName}).eq('customer_id',duplicateId);\n      await client.from('accounts_receivable').update({customer_id:targetId}).eq('customer_id',duplicateId);\n\n      // order_postcode_history is a separate name-cache used to suggest\n      // customers on the new-order postcode autocomplete \u2014 it has no FK\n      // to customers at all, just a snapshotted customer_name, unique per\n      // (postcode, name). Left alone, the duplicate's old spelling would\n      // keep surfacing as a stale suggestion forever even after the real\n      // customer record is gone. Safe to just delete \u2014 it's a pure\n      // convenience cache, not a financial or order record; new orders at\n      // this postcode will repopulate it correctly.\n      await client.from('order_postcode_history').delete().eq('customer_name',duplicateName);\n\n      // deal_customers is a (deal_id, customer_id) pairing \u2014 if the target\n      // is already linked to the same deal, moving the duplicate's row\n      // would create a conflicting duplicate pairing, so those get\n      // dropped instead of moved; everything else transfers normally.\n      const {data:dupDeals}=await client.from('deal_customers').select('id,deal_id').eq('customer_id',duplicateId);\n      const {data:targetDeals}=await client.from('deal_customers').select('deal_id').eq('customer_id',targetId);\n      const targetDealIds=new Set((targetDeals||[]).map(d=>d.deal_id));\n      for(const dc of (dupDeals||[])){\n        if(targetDealIds.has(dc.deal_id)){\n          await client.from('deal_customers').delete().eq('id',dc.id);\n        } else {\n          await client.from('deal_customers').update({customer_id:targetId}).eq('id',dc.id);\n        }\n      }\n\n      const {error}=await client.from('customers').delete().eq('id',duplicateId);\n      if(error){\n        ui().toast('History moved, but the duplicate record itself could not be deleted: '+error.message,'error',8000);\n      } else {\n        ui().toast(`Merged \u2014 ${duplicateName} deleted, history moved to ${targetName}`,'success',6000);\n      }\n      ui().closeModal();\n      load();\n    },'Merge & delete',true);\n  }\n\n  async function showForm(existingId = null) {\n    let c = null;\n    if (existingId) {\n      const { data } = await db().select('customers', { eq: { id: existingId }, maybeSingle: true, noCompanyFilter: true });\n      c = data;\n    }\n    if (!existingId && !canAdd()) { ui().toast('Only an Admin can add new customers', 'error'); return; }\n    const creditLocked = !canCredit();\n    const creditHint = creditLocked\n      ? `<span class=\"ims__input-hint\">${existingId ? 'Only an Admin can change this.' : 'Set by an Admin. New customers start with no credit.'}</span>` : '';\n    ui().openModal(existingId ? `Edit: ${c?.business_name}` : 'Add wholesale customer', `\n      <div class=\"ims__form-grid\">\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label ims__label--req\">Business name</label><input class=\"ims__input\" type=\"text\" id=\"ims-nc-bname\" value=\"${util().sanitize(c?.business_name||'')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Contact person</label><input class=\"ims__input\" type=\"text\" id=\"ims-nc-contact\" value=\"${util().sanitize(c?.contact_name||'')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Postcode</label><input class=\"ims__input\" type=\"text\" id=\"ims-nc-postcode\" value=\"${util().sanitize(c?.postcode||'')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Phone</label><input class=\"ims__input\" type=\"tel\" id=\"ims-nc-phone\" value=\"${util().sanitize(c?.phone||'')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Email</label><input class=\"ims__input\" type=\"email\" id=\"ims-nc-email\" value=\"${util().sanitize(c?.email||'')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">VAT number</label><input class=\"ims__input\" type=\"text\" id=\"ims-nc-vat\" value=\"${util().sanitize(c?.vat_number||'')}\"></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Credit terms</label>\n          <select class=\"ims__select\" id=\"ims-nc-terms\" ${creditLocked?'disabled':''}>\n            ${['Advance payment','Cash on delivery','7 days net','14 days net','30 days net','60 days net'].map(t=>`<option ${(c?.credit_terms||(creditLocked?NO_CREDIT_TERMS:''))===t?'selected':''}>${t}</option>`).join('')}\n          </select>${creditHint}</div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Credit limit (\u00A3)</label><input class=\"ims__input\" type=\"number\" step=\"0.01\" id=\"ims-nc-limit\" value=\"${c?.credit_limit||''}\" placeholder=\"0 = no limit\" ${creditLocked?'disabled':''}>${creditHint}</div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Customer type</label>\n          <select class=\"ims__select\" id=\"ims-nc-type\">\n            <option value=\"wholesale\" ${(c?.customer_type||'wholesale')==='wholesale'?'selected':''}>Wholesale</option>\n            <option value=\"retailer\" ${c?.customer_type==='retailer'?'selected':''}>Retailer</option>\n            <option value=\"trade\" ${c?.customer_type==='trade'?'selected':''}>Trade</option>\n          </select></div>\n        <div class=\"ims__form-group\"><label class=\"ims__label ims__label--req\">Delivery arrangement</label>\n          <select class=\"ims__select\" id=\"ims-nc-delivery\">\n            <option value=\"mdf_delivers\" ${(c?.delivery_arrangement||'mdf_delivers')==='mdf_delivers'?'selected':''}>MDF London delivers to their address</option>\n            <option value=\"customer_collects\" ${c?.delivery_arrangement==='customer_collects'?'selected':''}>Customer collects from our warehouse</option>\n          </select></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label ims__label--req\">Delivery address</label><textarea class=\"ims__textarea\" id=\"ims-nc-address\" rows=\"2\">${util().sanitize(c?.address||'')}</textarea></div>\n        <div class=\"ims__form-group ims__form-group--full\"><label class=\"ims__label\">Notes</label><textarea class=\"ims__textarea\" id=\"ims-nc-notes\" rows=\"2\">${util().sanitize(c?.notes||'')}</textarea></div>\n        <hr class=\"ims__divider\">\n        <div style=\"font-size:13px;font-weight:600;color:var(--ims-text);margin-bottom:10px\">Pricing & discount</div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Pricing basis</label>\n          <select class=\"ims__select\" id=\"ims-nc-pricing-basis\">\n            <option value=\"wholesale\" ${(c?.pricing_basis||'wholesale')==='wholesale'?'selected':''}>Wholesale price</option>\n            <option value=\"rrp\" ${c?.pricing_basis==='rrp'?'selected':''}>RRP</option>\n            <option value=\"custom\" ${c?.pricing_basis==='custom'?'selected':''}>Custom per product</option>\n          </select>\n          <span class=\"ims__input-hint\">Which base price to use for this customer's orders</span>\n        </div>\n        <div class=\"ims__form-group\"><label class=\"ims__label\">Standing discount type</label>\n          <select class=\"ims__select\" id=\"ims-nc-discount-type\" onchange=\"window.IMS_CUSTOMERS.onDiscountTypeChange()\">\n            <option value=\"\" ${!c?.discount_type?'selected':''}>No standing discount</option>\n            <option value=\"percentage\" ${c?.discount_type==='percentage'?'selected':''}>Percentage off (%)</option>\n            <option value=\"fixed_amount\" ${c?.discount_type==='fixed_amount'?'selected':''}>Fixed amount off (\u00A3)</option>\n          </select>\n        </div>\n        <div class=\"ims__form-group\" id=\"ims-nc-discount-value-group\" style=\"${c?.discount_type?'':'display:none'}\">\n          <label class=\"ims__label\">Discount value</label>\n          <input class=\"ims__input\" type=\"number\" step=\"0.01\" min=\"0\" id=\"ims-nc-discount-value\"\n            value=\"${c?.discount_value||''}\"\n            placeholder=\"${c?.discount_type==='percentage'?'e.g. 20 for 20% off':'e.g. 50 for \u00A350 off'}\">\n          <span class=\"ims__input-hint\">Applied automatically on every order for this customer</span>\n        </div>\n      </div>\n    `, `\n      <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Cancel</button>\n      <button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_CUSTOMERS.save('${util().jsArg(existingId||'')}')\"><i class=\"ti ti-check\"></i> ${existingId?'Save changes':'Add customer'}</button>\n    `, 'lg');\n  }\n\n  function onDiscountTypeChange(){\n    const type=document.getElementById('ims-nc-discount-type')?.value;\n    const group=document.getElementById('ims-nc-discount-value-group');\n    const input=document.getElementById('ims-nc-discount-value');\n    if(group) group.style.display=type?'':'none';\n    if(input) input.placeholder=type==='percentage'?'e.g. 20 for 20% off':'e.g. 50 for \u00A350 off';\n  }\n\n  async function save(existingId) {\n    const g = id => document.getElementById(id)?.value?.trim() || '';\n    const bname = g('ims-nc-bname'), postcode = g('ims-nc-postcode').toUpperCase(), address = g('ims-nc-address');\n    if (!bname)    { ui().toast('Business name is required', 'error'); return; }\n    if (!postcode) { ui().toast('Postcode is required', 'error'); return; }\n    if (!address)  { ui().toast('Address is required', 'error'); return; }\n\n    // Checked again here, not just by hiding buttons and fields.\n    if (!existingId && !canAdd()) { ui().toast('Only an Admin can add new customers', 'error'); return; }\n\n    const discountType = g('ims-nc-discount-type') || null;\n    const data = {\n      business_name: bname, contact_name: g('ims-nc-contact'),\n      postcode, address, phone: g('ims-nc-phone'), email: g('ims-nc-email'),\n      vat_number: g('ims-nc-vat'),\n      customer_type: g('ims-nc-type') || 'wholesale',\n      delivery_arrangement: g('ims-nc-delivery') || 'mdf_delivers',\n      pricing_basis: g('ims-nc-pricing-basis') || 'wholesale',\n      discount_type: discountType,\n      discount_value: discountType ? (parseFloat(g('ims-nc-discount-value')) || 0) : null,\n      notes: g('ims-nc-notes') || null\n    };\n    // Credit terms and limit: taken from the form only for Admins. When\n    // anyone else edits, they are left exactly as they were; when anyone\n    // else adds, the customer starts with no credit.\n    if (canCredit()) {\n      data.credit_terms = g('ims-nc-terms');\n      data.credit_limit = parseFloat(g('ims-nc-limit')) || 0;\n    } else if (!existingId) {\n      data.credit_terms = NO_CREDIT_TERMS;\n      data.credit_limit = 0;\n    }\n\n    const { error } = existingId\n      ? await db().update('customers', existingId, data)\n      : await db().insert('customers', data);\n\n    if (error) { ui().toast('Failed: ' + error.message, 'error'); return; }\n    ui().closeModal();\n    ui().toast(`Customer ${existingId?'updated':'added'}`, 'success');\n    load();\n  }\n\n  // \u2500\u2500\u2500 IMPORT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 showImport() {\n    if (!canAdd()) { ui().toast('Only an Admin can import customers', 'error'); return; }\n    ui().openModal('Import customers', `\n      <div class=\"ims__alert ims__alert--info\"><i class=\"ti ti-info-circle\"></i>\n        <span>Download the template, fill it in and upload to bulk import customers.</span>\n      </div>\n      <div class=\"ims__btn-group\" style=\"margin-bottom:16px\">\n        <button class=\"ims__btn ims__btn--secondary\" onclick=\"window.IMS_CUSTOMERS.downloadTemplate()\"><i class=\"ti ti-download\"></i> Download template</button>\n      </div>\n      <div class=\"ims__form-group\">\n        <label class=\"ims__label\">Select CSV file</label>\n        <input type=\"file\" accept=\".csv\" id=\"ims-cust-import-file\" class=\"ims__input\" onchange=\"window.IMS_CUSTOMERS.previewImport(this)\">\n      </div>\n      <div id=\"ims-cust-import-preview\"></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-cust-commit-btn\" style=\"display:none\" onclick=\"window.IMS_CUSTOMERS.commitImport()\"><i class=\"ti ti-check\"></i> Import customers</button>\n    `, 'lg');\n  }\n\n  function downloadTemplate() {\n    util().exportCSV(\n      ['Business Name','Contact Name','Email','Phone','Postcode','Address','VAT Number','Credit Terms','Credit Limit','Customer Type (Wholesale/Retailer/Trade/Dropship)','Delivery Arrangement (MDF Delivers/Customer Collects)','Notes'],\n      [['Acme Furniture Ltd','John Smith','john@acme.com','07700900000','SW1A 1AA','1 Example St London','GB123456789','30 days net','5000','Wholesale','MDF Delivers','']],\n      'customers_template'\n    );\n  }\n\n  let _custImportRows = [];\n\n  // Normalizes free-text CSV values into the exact customer_type /\n  // delivery_arrangement values the manual Add/Edit Customer form uses\n  // (id=\"ims-nc-type\" / id=\"ims-nc-delivery\", confirmed at lines 138-149\n  // of this file), defaulting to the same values that form itself\n  // defaults to when left untouched ('wholesale' / 'mdf_delivers').\n  function _custTypeFromCsv(raw){\n    const map = { wholesale:'wholesale', retailer:'retailer', retail:'retailer', trade:'trade', dropship:'dropship' };\n    return map[(raw||'').trim().toLowerCase()] || 'wholesale';\n  }\n  function _deliveryArrangementFromCsv(raw){\n    const map = {\n      'mdf delivers':'mdf_delivers', mdf:'mdf_delivers', 'we deliver':'mdf_delivers',\n      'customer collects':'customer_collects', collects:'customer_collects', 'self collect':'customer_collects'\n    };\n    return map[(raw||'').trim().toLowerCase()] || 'mdf_delivers';\n  }\n\n  async function previewImport(input) {\n    const file = input.files?.[0];\n    if (!file) return;\n    const text = await file.text();\n    const { headers, rows } = util().parseCSV(text);\n    const preview  = document.getElementById('ims-cust-import-preview');\n    const commitBtn= document.getElementById('ims-cust-commit-btn');\n\n    _custImportRows = rows.map(row => {\n      const get = col => { const i = headers.indexOf(col); return i>=0 ? row[i]||'' : ''; };\n      return {\n        business_name: get('Business Name'),\n        contact_name:  get('Contact Name'),\n        email:         get('Email'),\n        phone:         get('Phone'),\n        postcode:      get('Postcode').toUpperCase(),\n        address:       get('Address'),\n        vat_number:    get('VAT Number'),\n        credit_terms:  get('Credit Terms') || 'Advance payment',\n        credit_limit:  parseFloat(get('Credit Limit')) || 0,\n        customer_type: _custTypeFromCsv(get('Customer Type (Wholesale/Retailer/Trade/Dropship)') || get('Customer Type')),\n        delivery_arrangement: _deliveryArrangementFromCsv(get('Delivery Arrangement (MDF Delivers/Customer Collects)') || get('Delivery Arrangement')),\n        notes:         get('Notes'),\n        valid:         !!(get('Business Name') && get('Postcode'))\n      };\n    });\n\n    const valid = _custImportRows.filter(r => r.valid).length;\n    const typeLabel = t => ({wholesale:'Wholesale',retailer:'Retailer',trade:'Trade',dropship:'Dropship'}[t]||t);\n    const deliveryLabel = d => d==='customer_collects' ? 'Customer collects' : 'MDF delivers';\n    if (preview) preview.innerHTML = `\n      <div class=\"ims__alert ims__alert--success\" style=\"margin-top:12px\"><i class=\"ti ti-check\"></i>\n        <span>Found <strong>${_custImportRows.length} rows</strong> \u2014 ${valid} valid</span>\n      </div>\n      <div class=\"ims__table-wrap\" style=\"max-height:200px;overflow-y:auto;margin-top:8px\">\n        <table class=\"ims__table\">\n          <thead><tr><th>Business name</th><th>Postcode</th><th>Phone</th><th>Type</th><th>Delivery</th><th>Valid</th></tr></thead>\n          <tbody>${_custImportRows.slice(0,10).map(r=>`\n            <tr>\n              <td>${util().sanitize(r.business_name)}</td><td>${util().sanitize(r.postcode)}</td>\n              <td>${util().sanitize(r.phone)}</td>\n              <td style=\"font-size:11px\">${typeLabel(r.customer_type)}</td>\n              <td style=\"font-size:11px\">${deliveryLabel(r.delivery_arrangement)}</td>\n              <td>${r.valid?'<span class=\"ims__pill ims__pill--success\">\u2713</span>':'<span class=\"ims__pill ims__pill--danger\">\u2717</span>'}</td>\n            </tr>`).join('')}\n          </tbody>\n        </table>\n      </div>`;\n    if (commitBtn) commitBtn.style.display = valid>0 ? 'inline-flex' : 'none';\n  }\n\n  async function commitImport() {\n    if (!canAdd()) { ui().toast('Only an Admin can import customers', 'error'); return; }\n    // Credit terms and limits in the file are used only when an Admin\n    // imports; otherwise every imported customer starts with no credit.\n    if (!canCredit()) {\n      _custImportRows.forEach(r => { r.credit_terms = NO_CREDIT_TERMS; r.credit_limit = 0; });\n    }\n    const valid = _custImportRows.filter(r => r.valid);\n    let created = 0;\n    for (const row of valid) {\n      // Built explicitly rather than spreading `row` directly \u2014 the\n      // parsed row also carries a `valid` boolean used only for the\n      // preview table above, which is not a real column on `customers`.\n      const payload = {\n        business_name: row.business_name,\n        contact_name:  row.contact_name || null,\n        email:         row.email || null,\n        phone:         row.phone || null,\n        postcode:      row.postcode,\n        address:       row.address || null,\n        vat_number:    row.vat_number || null,\n        credit_terms:  row.credit_terms,\n        credit_limit:  row.credit_limit,\n        customer_type: row.customer_type,\n        delivery_arrangement: row.delivery_arrangement,\n        notes:         row.notes || null\n      };\n      const { error } = await db().insert('customers', payload);\n      if (!error) created++;\n    }\n    ui().closeModal();\n    ui().toast(`${created} customers imported`, 'success');\n    _custImportRows = [];\n    load();\n  }\n\n  window.addEventListener('ims:panel', e => { if (e.detail.panel === 'customers') load(); });\n  window.addEventListener('ims:ready', () => {\n    // This runs after every sign-in, so the click handlers are attached\n    // only once (they used to pile up), and the buttons' visibility is set\n    // for whoever is signed in now (see applyButtonAccess).\n    const newBtn = document.getElementById('ims-cust-new-btn');\n    if (newBtn && !newBtn.dataset.bound) { newBtn.dataset.bound = '1'; newBtn.addEventListener('click', () => showForm()); }\n    const impBtn = document.getElementById('ims-cust-import-btn');\n    if (impBtn && !impBtn.dataset.bound) { impBtn.dataset.bound = '1'; impBtn.addEventListener('click', showImport); }\n    const s = document.getElementById('ims-cust-search');\n    if (s && !s.dataset.bound) { s.dataset.bound = '1'; s.addEventListener('input', util().debounce(load, 350)); }\n    applyButtonAccess();\n  });\n\n  // \u2500\u2500\u2500 DEACTIVATE / REACTIVATE / DELETE (Admin only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Deactivated customers keep all their history (orders, invoices,\n  // receivables, statements) but cannot be picked for new work: the new\n  // order postcode search, phone matching, the order-edit customer search,\n  // CSV import matching and the Deals customer picker all skip them.\n  async function setCustomerActive(id, name, makeActive) {\n    if (!canCredit()) { ui().toast('Only an Admin can deactivate or reactivate a customer', 'error'); return; }\n    ui().confirm(makeActive\n      ? `Reactivate <strong>${util().sanitize(name)}</strong>? They can be picked for new orders and deals again.`\n      : `Deactivate <strong>${util().sanitize(name)}</strong>? All their history is kept, but they will no longer be offered for new orders or deals. You can reactivate them at any time.`,\n      async () => {\n        const { error } = await db().update('customers', id, { is_active: !!makeActive });\n        if (error) { ui().toast('Failed: ' + error.message, 'error', 8000); return; }\n        ui().closeModal();\n        ui().toast(`${name} ${makeActive ? 'reactivated' : 'deactivated'}`, 'success');\n        load();\n      }, makeActive ? 'Reactivate' : 'Deactivate', !makeActive);\n  }\n\n  // Delete is only for a customer with no history at all (for example one\n  // added by mistake). Anyone with orders, receivables or invoices can be\n  // deactivated instead, which keeps their records intact.\n  async function deleteCustomer(id, name) {\n    if (!canCredit()) { ui().toast('Only an Admin can delete a customer', 'error'); return; }\n    const client = window.supabase.createClient(window.IMS_SUPABASE_URL, window.IMS_SUPABASE_ANON_KEY);\n    const { data: cust } = await db().select('customers', { select: 'business_name,is_active', eq: { id }, maybeSingle: true, noCompanyFilter: true });\n    const [{ data: ords }, { data: recs }, { data: invs }] = await Promise.all([\n      client.from('orders').select('id').eq('customer_id', id).limit(1),\n      client.from('accounts_receivable').select('id').eq('customer_id', id).limit(1),\n      client.from('invoices').select('id').eq('customer_name', cust?.business_name || name).limit(1)\n    ]);\n    const history = [];\n    if (ords?.length) history.push('orders');\n    if (recs?.length) history.push('receivables');\n    if (invs?.length) history.push('invoices');\n    if (history.length) {\n      ui().openModal('Cannot delete this customer', `\n        <div class=\"ims__alert ims__alert--warning\"><i class=\"ti ti-alert-triangle\"></i>\n          <span><strong>${util().sanitize(name)}</strong> has history (${history.join(', ')}). Deleting them would break those records, so it is not allowed.${cust?.is_active !== false ? ' You can <strong>deactivate</strong> them instead: their history is kept, and they are no longer offered for new orders or deals.' : ''}</span>\n        </div>\n      `, `\n        <button class=\"ims__btn ims__btn--ghost\" onclick=\"window.SM.UI.closeModal()\">Close</button>\n        ${cust?.is_active !== false ? `<button class=\"ims__btn ims__btn--primary\" onclick=\"window.IMS_CUSTOMERS.setCustomerActive('${util().jsArg(id)}','${util().jsArg(name)}',false)\"><i class=\"ti ti-player-pause\"></i> Deactivate instead</button>` : ''}\n      `, 'sm');\n      return;\n    }\n    ui().confirm(`Permanently delete <strong>${util().sanitize(name)}</strong>? They have no orders, receivables or invoices. This cannot be undone.`, async () => {\n      await client.from('deal_customers').delete().eq('customer_id', id);\n      const { data: gone, error } = await client.from('customers').delete().eq('id', id).select('id');\n      if (error) { ui().toast('Failed: ' + error.message, 'error', 8000); return; }\n      if (!gone?.length) { ui().toast(`${name} could not be deleted. Only an Admin can delete customers.`, 'error', 8000); return; }\n      ui().closeModal();\n      ui().toast(`${name} deleted`, 'success');\n      load();\n    }, 'Delete customer', true);\n  }\n\n  window.IMS_CUSTOMERS = { setCustomerActive, deleteCustomer, load, openCustomer, showForm, save, onDiscountTypeChange, showImport, downloadTemplate, previewImport, commitImport, showMergeCustomer, confirmMergeCustomer, viewCustomerOrderHistory };\n})();\n"],
  "mappings": "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",
  "names": []
}
