bep40 commited on
Commit
db44996
·
verified ·
1 Parent(s): 3581335

Revert index.html to bb80fef31b

Browse files
Files changed (1) hide show
  1. index.html +23 -47
index.html CHANGED
@@ -372,9 +372,7 @@ textarea.form-input{height:120px;resize:vertical}
372
  .chat-close:hover{background:rgba(255,255,255,.4)}
373
  .chat-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:10px;background:#f8fafc}
374
  .chat-msg{max-width:88%;padding:11px 15px;border-radius:16px;font-size:.84rem;line-height:1.55;word-wrap:break-word}
375
- .chat-msg.bot{background:#fff;color:var(--d);align-self:flex-start;border:1px solid var(--gl);border-bottom-left-radius:4px;max-width:100%;overflow-x:auto;overflow-y:hidden}
376
- .chat-msg.bot table{font-size:.7rem}
377
- .chat-msg.bot td,.chat-msg.bot th{padding:4px 3px!important}
378
  .chat-msg.user{background:var(--p);color:#fff;align-self:flex-end;border-bottom-right-radius:4px}
379
  .chat-msg a{color:var(--a);font-weight:600;text-decoration:underline}
380
  .chat-msg.bot a{color:var(--p)}
@@ -1682,36 +1680,6 @@ scores.sort((a,b)=>b.score-a.score);
1682
  return scores.slice(0,4).map(s=>s.p);
1683
  }
1684
 
1685
-
1686
- // === SKU Detection Helpers for chatbox ===
1687
- function _detectSKUs(text){
1688
- if(typeof D==='undefined'||!D.length)return[];
1689
- // Extract potential SKU-like tokens (alphanumeric 3+ chars)
1690
- let tokens=text.split(/[,;\s]+/).map(t=>t.trim().toLowerCase().replace(/[.\-_ \/]/g,'')).filter(t=>t.length>=3&&/[a-z]/.test(t)&&/\d/.test(t));
1691
- // Also check for known model patterns
1692
- let extra=text.match(/[A-Za-z]{1,4}[\-_ ]?\d{2,}[A-Za-z]*/g)||[];
1693
- extra.forEach(e=>{let n=e.toLowerCase().replace(/[.\-_ \/]/g,'');if(tokens.indexOf(n)===-1)tokens.push(n);});
1694
- return tokens;
1695
- }
1696
- function _findProductsBySKU(text){
1697
- if(typeof D==='undefined'||!D.length)return[];
1698
- let tokens=_detectSKUs(text);
1699
- if(!tokens.length)return[];
1700
- let found=[];let seen={};
1701
- tokens.forEach(code=>{
1702
- for(let i=0;i<D.length;i++){
1703
- let p=D[i];if(!p||seen[p.slug])continue;
1704
- let pSku=((p.sku||'')+(p.model||p.mod||'')).toLowerCase().replace(/[.\-_ \/]/g,'');
1705
- if(pSku&&(pSku.indexOf(code)!==-1||code.indexOf(pSku)!==-1)){
1706
- seen[p.slug]=true;
1707
- found.push({name:p.name||'',price:p.priceNum||p.pn||0,priceStr:p.price||p.p||'LH',image:p.image||p.img||p.i||'',sku:p.sku||p.model||p.mod||'',brand:p.brand||'',qty:1});
1708
- break;
1709
- }
1710
- }
1711
- });
1712
- return found;
1713
- }
1714
-
1715
  async function sendChat(){
1716
  if(chatBusy)return;
1717
  let input=document.getElementById('chatInput');
@@ -1726,21 +1694,29 @@ appendMsg('user',msg.replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\n/g,'<b
1726
 
1727
  // Handle cart/quote/checkout commands
1728
  let msgLower=nVN(msg);
1729
- if(msgLower.match(/bao gia|lap bao gia|len bao gia|xuat bao gia|in bao gia/)||_detectSKUs(msg).length>0){
1730
- // Detect SKU codes from message
1731
- let foundProducts=_findProductsBySKU(msg);
1732
- if(foundProducts.length>0){
1733
- let total=foundProducts.reduce((s,c)=>s+c.price*c.qty,0);
1734
- let rows=foundProducts.map((c,i)=>'<tr style="border-bottom:1px solid #e2e8f0"><td style="padding:5px 3px;text-align:center;font-size:.7rem">'+(i+1)+'</td><td style="padding:5px 3px">'+(c.image?'<img src="'+c.image+'" style="width:32px;height:32px;object-fit:contain;border-radius:3px" referrerpolicy="no-referrer" onerror="this.style.display=\'none\'">':'')+'</td><td style="padding:5px 3px;font-size:.72rem;font-weight:600;max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+c.name.substring(0,35)+'<br><span style="font-size:.6rem;color:#94a3b8">'+c.sku+'</span></td><td style="padding:5px 3px;text-align:center;font-size:.7rem">'+c.qty+'</td><td style="padding:5px 3px;text-align:right;font-size:.72rem;font-weight:700;white-space:nowrap">'+c.priceStr+'</td></tr>').join('');
1735
- let quoteHtml='<div style="background:var(--l,#f8fafc);border-radius:10px;padding:10px;margin-top:6px;max-width:100%;overflow:hidden"><div style="font-weight:800;font-size:.82rem;color:var(--p,#003f62);margin-bottom:6px">📋 BÁO GIÁ</div><div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;border:1px solid var(--gl,#e2e8f0);border-radius:6px;overflow:hidden"><thead><tr style="background:var(--p,#003f62);color:#fff"><th style="padding:4px;font-size:.62rem">#</th><th style="padding:4px;font-size:.62rem">Ảnh</th><th style="padding:4px;font-size:.62rem;text-align:left">Sản phẩm</th><th style="padding:4px;font-size:.62rem">SL</th><th style="padding:4px;font-size:.62rem;text-align:right">Đơn giá</th></tr></thead><tbody>'+rows+'</tbody><tfoot><tr style="background:rgba(0,63,98,.05)"><td colspan="4" style="padding:7px;font-weight:800;font-size:.75rem;text-align:right">TỔNG:</td><td style="padding:7px;font-weight:900;font-size:.82rem;color:var(--p,#003f62);text-align:right;white-space:nowrap">'+total.toLocaleString('vi-VN')+'đ</td></tr></tfoot></table></div><div style="display:flex;gap:4px;margin-top:8px;flex-wrap:wrap"><button onclick="if(window.VAI_ORDERS&&window.VAI_ORDERS.save)window.VAI_ORDERS.save()" style="padding:5px 9px;background:#7c3aed;color:#fff;border:none;border-radius:6px;font-size:.68rem;font-weight:700;cursor:pointer">💾 Lưu</button><button onclick="if(typeof shareQuoteImage==='function')shareQuoteImage()" style="padding:5px 9px;background:#25D366;color:#fff;border:none;border-radius:6px;font-size:.68rem;font-weight:700;cursor:pointer">📤 Chia sẻ</button><button onclick="if(typeof openQuotation==='function'){openQuotation();if(typeof closeChat==='function')closeChat();}" style="padding:5px 9px;background:var(--p,#003f62);color:#fff;border:none;border-radius:6px;font-size:.68rem;font-weight:700;cursor:pointer">📋 Lập phiếu</button></div></div>';
1736
- appendMsg('bot','Dạ em báo giá ngay ạ! 📋'+quoteHtml);
1737
- chatBusy=false;return;
1738
- }
1739
- // If "báo giá" explicitly but no SKU found → ask
1740
- if(msgLower.match(/bao gia/)){
1741
- appendMsg('bot','Anh/chị cho em mã SP cần báo giá nhé! 😊<br>VD: <b>MDI702</b> hoặc <b>MDI702, MC9086HS</b>');
1742
- chatBusy=false;return;
1743
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1744
  }
1745
 
1746
  if(msgLower.match(/thanh toan|chuyen khoan|qr|quyet toan/)){
 
372
  .chat-close:hover{background:rgba(255,255,255,.4)}
373
  .chat-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:10px;background:#f8fafc}
374
  .chat-msg{max-width:88%;padding:11px 15px;border-radius:16px;font-size:.84rem;line-height:1.55;word-wrap:break-word}
375
+ .chat-msg.bot{background:#fff;color:var(--d);align-self:flex-start;border:1px solid var(--gl);border-bottom-left-radius:4px}
 
 
376
  .chat-msg.user{background:var(--p);color:#fff;align-self:flex-end;border-bottom-right-radius:4px}
377
  .chat-msg a{color:var(--a);font-weight:600;text-decoration:underline}
378
  .chat-msg.bot a{color:var(--p)}
 
1680
  return scores.slice(0,4).map(s=>s.p);
1681
  }
1682
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1683
  async function sendChat(){
1684
  if(chatBusy)return;
1685
  let input=document.getElementById('chatInput');
 
1694
 
1695
  // Handle cart/quote/checkout commands
1696
  let msgLower=nVN(msg);
1697
+ if(msgLower.match(/bao gia|lap bao gia|len bao gia|xuat bao gia|in bao gia/)){
1698
+ if(cart.length===0){
1699
+ appendMsg('bot','Giỏ hàng đang trống. Anh/chị hãy chọn sản phẩm trước rồi em lên báo giá nhé! 😊<br><br>Anh/chị cần tìm sản phẩm gì ạ?');
1700
+ chatBusy=false;return;
 
 
 
 
 
 
 
 
 
 
1701
  }
1702
+ let total=cart.reduce((s,c)=>s+c.priceNum*c.qty,0);
1703
+ let rows=cart.map((c,i)=>`<tr><td style="padding:8px;font-size:.78rem">${i+1}</td><td style="padding:8px;font-size:.78rem">${c.name}</td><td style="padding:8px;text-align:center;font-size:.78rem">${c.qty}</td><td style="padding:8px;text-align:right;font-size:.78rem;white-space:nowrap">${c.priceNum?c.priceNum.toLocaleString('vi-VN')+'đ':'Liên hệ'}</td><td style="padding:8px;text-align:right;font-size:.78rem;font-weight:700;white-space:nowrap">${(c.priceNum*c.qty).toLocaleString('vi-VN')}đ</td></tr>`).join('');
1704
+ let quoteHtml=`<div style="background:var(--l);border-radius:12px;padding:14px;margin-top:8px">
1705
+ <div style="font-weight:800;font-size:.9rem;color:var(--p);margin-bottom:10px">📋 BẢNG BÁO GIÁ</div>
1706
+ <table style="width:100%;border-collapse:collapse;border:1px solid var(--gl);border-radius:8px;overflow:hidden">
1707
+ <thead><tr style="background:var(--p);color:#fff"><th style="padding:8px;font-size:.72rem;text-align:left">STT</th><th style="padding:8px;font-size:.72rem;text-align:left">Sản phẩm</th><th style="padding:8px;font-size:.72rem;text-align:center">SL</th><th style="padding:8px;font-size:.72rem;text-align:right">Đơn giá</th><th style="padding:8px;font-size:.72rem;text-align:right">Thành tiền</th></tr></thead>
1708
+ <tbody>${rows}</tbody>
1709
+ <tfoot><tr style="background:rgba(0,63,98,.05)"><td colspan="4" style="padding:10px;font-weight:800;font-size:.85rem;text-align:right">TỔNG CỘNG:</td><td style="padding:10px;font-weight:900;font-size:.95rem;color:var(--p);text-align:right;white-space:nowrap">${total.toLocaleString('vi-VN')}đ</td></tr></tfoot>
1710
+ </table>
1711
+ <div style="display:flex;gap:8px;margin-top:10px;flex-wrap:wrap">
1712
+ <button onclick="viewQuoteInline(this)" style="padding:8px 14px;background:#fff;color:var(--p);border:2px solid var(--p);border-radius:8px;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit;display:flex;align-items:center;gap:6px"><i class="fas fa-eye"></i> Xem chi tiết</button>
1713
+ <button onclick="openQuotation()" style="padding:8px 14px;background:var(--p);color:#fff;border:none;border-radius:8px;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit;display:flex;align-items:center;gap:6px"><i class="fas fa-file-pdf"></i> PDF</button>
1714
+ <button onclick="exportQuoteExcel()" style="padding:8px 14px;background:#217346;color:#fff;border:none;border-radius:8px;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit;display:flex;align-items:center;gap:6px"><i class="fas fa-file-excel"></i> Excel</button>
1715
+ <button onclick="openCheckout()" style="padding:8px 14px;background:var(--a);color:#fff;border:none;border-radius:8px;font-size:.78rem;font-weight:600;cursor:pointer;font-family:inherit;display:flex;align-items:center;gap:6px"><i class="fas fa-qrcode"></i> Thanh toán</button>
1716
+ </div>
1717
+ </div>`;
1718
+ appendMsg('bot','Dạ, em lên bảng báo giá cho anh/chị ngay ạ! 📋'+quoteHtml);
1719
+ chatBusy=false;return;
1720
  }
1721
 
1722
  if(msgLower.match(/thanh toan|chuyen khoan|qr|quyet toan/)){