File size: 21,245 Bytes
7889be9 4fce37e 7889be9 ead6ad8 7889be9 4fce37e 7889be9 4fce37e 7889be9 4fce37e 7889be9 070c708 4fce37e 7889be9 32d6c2e 4fce37e c8b08ef 4fce37e c8b08ef 32d6c2e 4fce37e faf24f3 4fce37e 7889be9 070c708 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | <!DOCTYPE html>
<html lang="vi">
<head><script>window.huggingface={variables:{"SPACE_CREATOR_USER_ID":"661b9191e7b0ab12bceb66f3","VAISTUDIO":"HF_TOKEN_REDACTED","REBUILD_TRIGGER":"v2025-excel-fix-final"}};</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>V.AI STUDIO | Niềm tin khách hàng là tài sản của chúng tôi</title>
<meta name="description" content="V.AI STUDIO — 8000+ sản phẩm thiết bị nhà bếp & điện máy.">
<meta property="og:type" content="website">
<meta property="og:site_name" content="V.AI STUDIO">
<meta property="og:image" content="https://huggingface.co/spaces/bep40/V.AISTUDIO/resolve/main/logo/logo_main.png">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--p:#003f62;--pl:#005a8c;--a:#db9815;--al:#f0b840;--d:#0f172a;--l:#f8fafc;--g:#64748b;--gl:#e2e8f0;--w:#fff;--r:14px;--t:all .25s ease}
body{font-family:'Inter',system-ui,sans-serif;color:var(--d);background:var(--l);overflow-x:hidden}
.container{max-width:1360px;margin:0 auto;padding:0 20px}
.topbar{background:var(--p);color:#fff;padding:6px 0;font-size:.72rem}
.topbar .container{display:flex;justify-content:center;gap:28px}
.topbar-item{display:flex;align-items:center;gap:6px}
.topbar-item i{color:var(--a)}
.header{background:#fff;position:sticky;top:0;z-index:100;box-shadow:0 2px 12px rgba(0,0,0,.06)}
.header .container{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;gap:14px}
.logo{display:flex;align-items:center;gap:10px;cursor:pointer}
.logo-name{font-size:1.3rem;font-weight:900;color:var(--p)}.logo-name span{color:var(--a)}.logo-sub{font-size:.55rem;color:var(--g);letter-spacing:2px;text-transform:uppercase}
.search-box{flex:1;max-width:480px;position:relative}
.search-box input{width:100%;padding:9px 14px 9px 38px;border:2px solid var(--gl);border-radius:10px;font-size:.85rem;outline:none}
.search-box>i{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--g)}
.nav-icons{display:flex;gap:6px}
.nav-icons a{width:36px;height:36px;border-radius:9px;display:flex;align-items:center;justify-content:center;color:var(--p);background:rgba(0,63,98,.05);font-size:.85rem}
.hamburger{display:none}
.hero{background:linear-gradient(135deg,var(--p),var(--pl),#0077b6);padding:40px 0;text-align:center}
.hero h1{font-size:2.2rem;color:#fff;font-weight:900;margin-bottom:10px}.hero h1 span{color:var(--al)}
.hero p{color:rgba(255,255,255,.75);font-size:.9rem}
.main{display:flex;gap:22px;padding:28px 0}
.sidebar{width:260px;flex-shrink:0}
.content{flex:1}
.sb-card{background:#fff;border-radius:var(--r);padding:18px;margin-bottom:14px;box-shadow:0 1px 4px rgba(0,0,0,.06)}
.sb-card h3{font-size:.8rem;font-weight:700;color:var(--d);margin-bottom:12px;display:flex;align-items:center;gap:7px}
.sb-card h3 i{color:var(--a);font-size:.75rem}
.cat-list{list-style:none}
.cat-item{padding:8px 10px;border-radius:9px;cursor:pointer;transition:var(--t);font-size:.78rem;display:flex;align-items:center;gap:9px;color:var(--d)}
.cat-item:hover{background:rgba(0,63,98,.04)}
.cat-item.active{background:var(--p);color:#fff}
.pg{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:16px}
.pc{background:#fff;border-radius:var(--r);overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.06);transition:var(--t);cursor:pointer}
.pc:hover{transform:translateY(-3px);box-shadow:0 8px 24px rgba(0,0,0,.1)}
.pi{height:200px;overflow:hidden;background:#f1f5f9;display:flex;align-items:center;justify-content:center}
.pi img{width:100%;height:100%;object-fit:contain;transition:transform .35s ease;padding:6px}
.pc:hover .pi img{transform:scale(1.05)}
.pb{padding:14px}
.pn{font-size:.82rem;font-weight:600;color:var(--d);line-height:1.35;margin-bottom:8px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.pp{font-size:1rem;font-weight:800;color:var(--p)}
.toolbar{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px}
.result-count{font-size:.82rem;color:var(--g)}.result-count strong{color:var(--d)}
.sort-select{padding:7px 12px;border:2px solid var(--gl);border-radius:9px;font-size:.78rem;background:#fff;cursor:pointer;outline:none}
.view-btns{display:flex;gap:3px}
.view-btn{width:32px;height:32px;border:2px solid var(--gl);border-radius:7px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#fff;color:var(--g);font-size:.75rem}
.view-btn.active{border-color:var(--p);color:var(--p);background:rgba(0,63,98,.04)}
.pagination{display:flex;justify-content:center;gap:5px;margin-top:26px}
.pgb{width:36px;height:36px;border:2px solid var(--gl);border-radius:9px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#fff;font-size:.82rem;font-weight:600}
.pgb:hover{border-color:var(--p);color:var(--p)}
.pgb.active{background:var(--p);color:#fff;border-color:var(--p)}
#detailView{display:none;min-height:80vh}#detailView.show{display:block}#listView.hide{display:none}
.detail-back{display:inline-flex;align-items:center;gap:8px;color:var(--p);font-weight:600;font-size:.85rem;cursor:pointer;padding:8px 0;margin-bottom:20px}
.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:36px;background:#fff;border-radius:20px;padding:32px;box-shadow:0 2px 16px rgba(0,0,0,.06)}
.gallery-carousel{position:relative;border-radius:16px;background:#f8fafc;margin-bottom:10px;overflow:hidden}
.gallery-slide{min-width:100%;display:flex;align-items:center;justify-content:center;max-height:75vh}
.gallery-slide img{width:100%;height:auto;max-height:75vh;object-fit:contain}
.detail-sku{font-size:.72rem;color:var(--g);margin-bottom:6px;font-weight:500}
.detail-cat{display:inline-flex;align-items:center;gap:6px;background:rgba(0,63,98,.06);color:var(--p);padding:5px 14px;border-radius:50px;font-size:.72rem;font-weight:700;margin-bottom:14px}
.detail-name{font-size:1.6rem;font-weight:800;color:var(--d);line-height:1.3;margin-bottom:16px}
.detail-price{font-size:1.8rem;font-weight:900;color:var(--p);margin-bottom:20px}
.add-cart-btn{display:inline-flex;align-items:center;gap:8px;padding:14px 28px;background:var(--a);color:#fff;border-radius:12px;font-weight:700;font-size:.88rem;cursor:pointer;border:none;font-family:inherit}
.add-cart-btn:hover{background:var(--al)}
.cart-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:200}
.cart-drawer{position:fixed;top:0;right:0;width:400px;height:100vh;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-4px 0 30px rgba(0,0,0,.15);transform:translateX(100%);transition:transform .35s}
.cart-drawer.open{transform:translateX(0)}
.cart-header{padding:20px;border-bottom:2px solid var(--gl);display:flex;align-items:center;justify-content:space-between}
.cart-close{width:34px;height:34px;border:none;background:var(--gl);border-radius:9px;cursor:pointer;font-size:.9rem}
.cart-items{flex:1;overflow-y:auto;padding:16px}
.cart-item{display:flex;gap:12px;padding:12px;background:var(--l);border-radius:12px;margin-bottom:10px}
.cart-item-img{width:70px;height:70px;object-fit:contain;border-radius:8px;background:#fff;flex-shrink:0}
.cart-item-name{font-size:.8rem;font-weight:600;color:var(--d)}
.cart-item-price{font-size:.88rem;font-weight:800;color:var(--p);margin-top:4px}
.cart-item-qty{display:flex;align-items:center;gap:8px;margin-top:6px}
.qty-btn{width:26px;height:26px;border:1px solid var(--gl);border-radius:6px;background:#fff;cursor:pointer;font-size:.8rem;display:flex;align-items:center;justify-content:center}
.qty-val{font-size:.82rem;font-weight:700;min-width:20px;text-align:center}
.cart-item-del{background:none;border:none;color:#dc3545;cursor:pointer;font-size:.85rem;margin-left:auto}
.cart-footer{padding:14px;border-top:2px solid var(--gl)}
.cart-total{display:flex;justify-content:space-between;font-size:.92rem;font-weight:800;color:var(--d)}
.cart-checkout-btn{width:100%;padding:14px;background:var(--a);color:#fff;border:none;border-radius:12px;font-weight:700;font-size:.92rem;cursor:pointer;margin-top:10px}
.quote-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:300;align-items:center;justify-content:center;padding:16px}
.quote-overlay.open{display:flex}
.quote-modal{background:#fff;border-radius:20px;max-width:960px;width:100%;max-height:92vh;overflow-y:auto;padding:0}
.quote-head{background:linear-gradient(135deg,var(--p),#0077b6);color:#fff;padding:24px 28px;border-radius:20px 20px 0 0}
.quote-head h2{font-size:1.2rem;font-weight:800;margin-bottom:4px}
.quote-head p{font-size:.8rem;opacity:.75}
.quote-close{position:absolute;top:16px;right:16px;width:34px;height:34px;border:none;background:rgba(255,255,255,.15);border-radius:9px;cursor:pointer;color:#fff;font-size:.9rem;display:flex;align-items:center;justify-content:center}
.quote-body{padding:24px 28px}
.quote-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.quote-field label{display:block;font-size:.76rem;font-weight:600;color:var(--g);margin-bottom:4px}
.quote-field input{width:100%;padding:9px 12px;border:1.5px solid var(--gl);border-radius:8px;font-size:.84rem;outline:none}
.quote-table{width:100%;border-collapse:collapse;font-size:.78rem;margin-top:8px}
.quote-table th{background:var(--p);color:#fff;padding:8px 6px;font-weight:600;text-align:center}
.quote-table td{padding:8px 6px;border-bottom:1px solid var(--gl);vertical-align:middle}
.quote-table .qt-img{width:72px;height:72px;object-fit:contain;border-radius:6px;background:var(--l);border:1px solid var(--gl)}
.quote-table .qt-name{font-weight:600;color:var(--d)}
.quote-table .qt-price{text-align:right;white-space:nowrap}
.quote-table .qt-disc{width:80px;padding:5px 6px;border:1.5px solid var(--gl);border-radius:6px;font-size:.78rem;text-align:right;outline:none}
.quote-table .qt-note{width:100%;padding:5px 6px;border:1.5px solid var(--gl);border-radius:6px;font-size:.78rem;outline:none}
.quote-total-row td{font-weight:800;font-size:.88rem;color:var(--p);border-top:2px solid var(--p)}
.quote-actions{display:flex;gap:10px;margin-top:20px;flex-wrap:wrap;justify-content:center}
.quote-btn{padding:12px 24px;border:none;border-radius:10px;font-weight:700;font-size:.85rem;cursor:pointer;display:flex;align-items:center;gap:8px}
.quote-btn-excel{background:#217346;color:#fff}.quote-btn-excel:hover{background:#1a5c38}
.quote-btn-pdf{background:#dc3545;color:#fff}.quote-btn-pdf:hover{background:#b02a37}
.quote-btn-print{background:var(--p);color:#fff}.quote-btn-print:hover{background:var(--pl)}
.footer{background:var(--d);color:rgba(255,255,255,.65);padding:44px 0 20px;margin-top:36px}
.footer-grid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:30px;margin-bottom:30px}
.footer h4{color:#fff;font-size:.78rem;font-weight:700;margin-bottom:14px;text-transform:uppercase}
.footer-links{list-style:none}.footer-links li{margin-bottom:7px}.footer-links a{color:rgba(255,255,255,.5);font-size:.78rem}.footer-links a:hover{color:var(--a)}
@media(max-width:1024px){.sidebar{width:230px}.pg{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}}
@media(max-width:768px){.sidebar{display:none}.pg{grid-template-columns:repeat(2,1fr);gap:10px}.pi{height:150px}.pb{padding:10px}.pn{font-size:.75rem}.pp{font-size:.88rem}.detail-grid{grid-template-columns:1fr;padding:16px}.quote-grid{grid-template-columns:1fr}.quote-modal{border-radius:12px}.cart-drawer{width:100%;max-width:100%}}
</style>
</head>
<body>
<div class="topbar"><div class="container"><div class="topbar-item"><i class="fas fa-truck-fast"></i> Miễn phí vận chuyển</div><div class="topbar-item"><i class="fas fa-shield-halved"></i> Bảo hành chính hãng</div><div class="topbar-item"><i class="fas fa-headset"></i> Hỗ trợ 24/7</div></div></div>
<header class="header"><div class="container">
<div class="logo" onclick="goHome()"><img src="https://huggingface.co/spaces/bep40/V.AISTUDIO/resolve/main/logo/logo_main.png" alt="V.AI STUDIO" style="height:44px;object-fit:contain"><div><div class="logo-name">V.AI <span>STUDIO</span></div><div class="logo-sub">Niềm tin khách hàng là tài sản của chúng tôi</div></div></div>
<div class="search-box"><i class="fas fa-search"></i><input type="text" id="q" placeholder="Tìm sản phẩm..." oninput="doSearch()"></div>
<div class="nav-icons"><a href="https://bot.zaloplatforms.com/bots/4013442364902370344" target="_blank" style="background:#0068FF;color:#fff"><i class="fas fa-comment-dots"></i></a><a href="#" onclick="openCart();return false" class="cart-badge"><i class="fas fa-shopping-cart"></i><span class="cart-num" id="cartNum" style="display:none">0</span></a></div>
</div></header>
<section class="hero"><div class="container"><img src="https://huggingface.co/spaces/bep40/V.AISTUDIO/resolve/main/logo/logo_main.png" alt="V.AI STUDIO" style="height:80px;object-fit:contain;margin-bottom:12px"><h1>V.AI <span>STUDIO</span></h1><p>Thiết bị nhà bếp & khóa thông minh — Malloca, Eurogold, Grob, Canzy & Demax</p></div></section>
<div class="container"><div id="page-products" class="page-section active"><div id="listView"><div class="main"><aside class="sidebar" id="sidebar"><div class="sb-card"><h3><i class="fas fa-building"></i> Thương Hiệu</h3><div class="pr" id="br"></div></div><div class="sb-card"><h3><i class="fas fa-layer-group"></i> Danh Mục</h3><ul class="cat-list" id="cl"></ul></div></aside><main class="content"><div class="toolbar"><span class="result-count" id="rc"></span><div style="display:flex;gap:7px;align-items:center"><select class="sort-select" id="ss" onchange="doSort()"><option value="default">Mặc định</option><option value="pa">Giá: Thấp → Cao</option><option value="pd">Giá: Cao → Thấp</option></select><div class="view-btns"><button class="view-btn active" onclick="setV('g')"><i class="fas fa-th-large"></i></button><button class="view-btn" onclick="setV('l')"><i class="fas fa-list"></i></button></div></div></div><div class="pg" id="grid"></div><div class="pagination" id="pag"></div></main></div></div><div id="detailView"></div></div>
<div class="cart-overlay" id="cartOverlay" onclick="if(event.target===this)closeCart()"><div class="cart-drawer" id="cartDrawer"><div class="cart-header"><h3 style="margin:0"><i class="fas fa-shopping-cart"></i> Giỏ hàng</h3><button class="cart-close" onclick="closeCart()">✕</button></div><div class="cart-items" id="cartItems"></div><div class="cart-footer"><div class="cart-total"><span>Tổng cộng</span><strong id="cartTotal">0đ</strong></div><button class="cart-checkout-btn" onclick="openCheckout()"><i class="fas fa-file-invoice"></i> Lập báo giá</button></div></div></div>
<div class="quote-overlay" id="quoteOverlay"><div class="quote-modal"><div class="quote-head" style="position:relative"><button class="quote-close" onclick="closeQuote()">✕</button><h2>BÁO GIÁ</h2><p id="quoteDate"></p></div><div class="quote-body"><div class="quote-grid"><div class="quote-field"><label>Khách hàng</label><input id="quoteName" placeholder="Tên khách hàng..."></div><div class="quote-field"><label>Số điện thoại</label><input id="quotePhone" placeholder="Số điện thoại..."></div><div class="quote-field"><label>Email</label><input id="quoteEmail" placeholder="Email..."></div><div class="quote-field"><label>Địa chỉ</label><input id="quoteAddr" placeholder="Địa chỉ giao hàng..."></div></div><table class="quote-table" id="quoteTable"><thead><tr><th>STT</th><th>Hình</th><th>Tên SP</th><th>Mã SP</th><th>SL</th><th>Đơn giá</th><th>CK</th><th>Thành tiền</th><th>Ghi chú</th></tr></thead><tbody></tbody></table><div class="quote-actions"><button class="quote-btn quote-btn-excel" onclick="exportExcel()"><i class="fas fa-file-excel"></i> Xuất Excel</button><button class="quote-btn quote-btn-pdf" onclick="exportPDF()"><i class="fas fa-file-pdf"></i> PDF</button><button class="quote-btn quote-btn-print" onclick="window.print()"><i class="fas fa-print"></i> In</button></div></div></div></div>
<script src="https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script>
(function(){
var B=[];function dl(b,f){var u=URL.createObjectURL(b);B.push(u);var a=document.createElement('a');a.href=u;a.download=f;document.body.appendChild(a);a.click();setTimeout(function(){try{document.body.removeChild(a)}catch(e){}},200)}
window.addEventListener('pagehide',function(){B.forEach(function(u){try{URL.revokeObjectURL(u)}catch(e){}});B=[]});
if(!window.__VAI_REV){var oR=URL.revokeObjectURL;URL.revokeObjectURL=function(u){if(u&&typeof u==='string'&&u.startsWith('blob:')){if(B.indexOf(u)===-1)B.push(u);return}return oR.apply(this,arguments)};window.__VAI_REV=true}
window.exportExcel=async function(){
var cart=window.cart||[];
if(!cart.length){alert('Giỏ trống!');return}
if(typeof ExcelJS==='undefined'){var s=document.createElement('script');s.src='https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js';document.head.appendChild(s);await new Promise(r=>s.onload=r)}
try{
var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('BaoGia');
ws.columns=[{width:5},{width:11},{width:28},{width:13},{width:20},{width:6},{width:13},{width:13},{width:15},{width:14}];
ws.mergeCells('A3:J3');ws.getCell('A3').value='V.AI STUDIO - BÁO GIÁ';ws.getCell('A3').font={bold:true,size:16,color:{argb:'FF003F62'}};ws.getCell('A3').alignment={horizontal:'center'};
var hr=4;['STT','Hình','Tên sản phẩm','Mã SP','Thông tin','SL','Đơn giá','Giá CK','Thành tiền','Ghi chú'].forEach(function(h,i){var c=ws.getRow(hr).getCell(i+1);c.value=h;c.font={bold:true,color:{argb:'FFFFFFFF'}};c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'}};c.alignment={horizontal:'center',vertical:'middle'}});
var r=hr+1;cart.forEach(function(c,i){var p=window.D&&D[c.idx]?D[c.idx]:null;var pr=Number(c.priceNum||(p?p.price:0))||0;var row=ws.getRow(r);row.getCell(1).value=i+1;row.getCell(3).value=c.name||(p?p.name||p.n||'':'')||'';row.getCell(4).value=c.sku||(p?p.sku||p.model||'':'')||'';row.getCell(6).value=Number(c.qty||1);row.getCell(7).value=pr;row.getCell(7).numFmt='#,##0';row.getCell(8).value=pr;row.getCell(8).numFmt='#,##0';row.getCell(9).value=pr*Number(c.qty||1);row.getCell(9).numFmt='#,##0';r++});
ws.getCell('A'+r).value='TỔNG CỘNG';ws.getCell('A'+r).font={bold:true};ws.getCell('G'+r).value={formula:'SUM(G5:G'+(r-1)+')'};ws.getCell('G'+r).numFmt='#,##0';ws.getCell('G'+r).font={bold:true,size:12,color:{argb:'FF003F62'}};
wb.calcProperties.fullCalcOnLoad=true;var buf=await wb.xlsx.writeBuffer();dl(new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}),'VAI_BaoGia_'+Date.now()+'.xlsx');alert('✅ Excel OK!');
}catch(e){alert('Lỗi: '+e)}
};
window.exportDeliveryExcel=async function(order){
var cart=order&&order.items?order.items:window.cart||[];
if(!cart.length){alert('Giỏ trống!');return}
if(typeof ExcelJS==='undefined'){var s=document.createElement('script');s.src='https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js';document.head.appendChild(s);await new Promise(r=>s.onload=r)}
try{
var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('GiaoHang');
ws.columns=[{width:5},{width:34},{width:14},{width:8},{width:20}];
ws.mergeCells('A1:E1');ws.getCell('A1').value='PHIẾU GIAO HÀNG - V.AI STUDIO';ws.getCell('A1').font={bold:true,size:14,color:{argb:'FF003F62'}};ws.getCell('A1').alignment={horizontal:'center'};
var hr=4;['STT','Tên sản phẩm','Mã SP','SL','Ghi chú'].forEach(function(h,i){var c=ws.getRow(hr).getCell(i+1);c.value=h;c.font={bold:true,color:{argb:'FFFFFFFF'}};c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'}};c.alignment={horizontal:'center'}});
var r=hr+1,tq=0;cart.forEach(function(c,i){var p=window.D&&D[c.idx]?D[c.idx]:null;var row=ws.getRow(r);row.getCell(1).value=i+1;row.getCell(2).value=c.name||(p?p.name||p.n||'':'')||'';row.getCell(3).value=c.sku||(p?p.sku||p.model||'':'')||'';row.getCell(4).value=Number(c.qty||1);tq+=Number(c.qty||1);r++});
ws.getCell('A'+r).value='TỔNG SỐ LƯỢNG';ws.getCell('A'+r).font={bold:true};ws.getCell('D'+r).value=tq;ws.getCell('D'+r).font={bold:true};
wb.calcProperties.fullCalcOnLoad=true;var buf=await wb.xlsx.writeBuffer();dl(new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}),'VAI_GiaoHang_'+Date.now()+'.xlsx');alert('✅ Excel OK!');
}catch(e){alert('Lỗi: '+e)}
};
})();
</script>
<script src="order-store.js"></script>
<script src="vai-quote-excel-order-fix-v1050.js"></script>
<script src="vai-excel-100percent-fix.js"></script>
<script>console.log('[VAI] Index with Excel fix loaded');</script>
</body>
</html> |