diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index babd2094b27f15cc3798186d301378be619fd0f1..0000000000000000000000000000000000000000 --- a/.gitattributes +++ /dev/null @@ -1,102 +0,0 @@ -grob_img/grob_p10.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p101.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p102.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p106.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p109.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p11.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p110.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p111.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p118.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p119.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p120.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p125.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p130.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p131.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p132.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p133.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p134.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p140.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p141.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p166.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p17.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p174.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p175.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p177.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p178.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p179.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p180.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p183.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p184.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p185.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p186.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p19.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p199.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p2.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p201.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p21.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p23.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p24.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p28.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p29.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p3.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p30.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p31.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p32.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p33.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p34.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p35.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p36.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p37.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p38.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p39.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p40.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p41.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p42.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p43.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p44.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p45.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p46.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p47.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p48.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p49.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p50.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p51.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p52.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p53.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p54.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p55.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p56.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p57.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p58.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p59.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p6.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p60.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p61.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p62.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p63.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p64.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p65.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p66.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p67.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p68.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p69.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p7.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p70.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p71.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p72.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p73.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p74.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p76.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p77.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p78.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p79.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p8.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p80.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p82.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p83.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p84.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p85.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p88.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p9.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p97.jpeg filter=lfs diff=lfs merge=lfs -text -grob_img/grob_p98.jpeg filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/auto-sync.yml b/.github/workflows/auto-sync.yml deleted file mode 100644 index bce784fdacfedcfe6ee246bcf145f4872b562fbb..0000000000000000000000000000000000000000 --- a/.github/workflows/auto-sync.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Auto-Sync Products - -on: - schedule: - # Chạy hàng ngày lúc midnight UTC (8:00 AM Việt Nam) - - cron: '0 0 * * *' - workflow_dispatch: - inputs: - dry_run: - description: 'Chỉ kiểm tra mà không cập nhật' - type: boolean - default: false - target_space: - description: 'Không gian target (vai-avatar2 hoặc both)' - type: choice - options: - - vai-avatar2 - - both - -jobs: - sync-products: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install dependencies - run: | - pip install huggingface_hub - - - name: Run sync products - env: - HF_TOKEN: ${{ secrets.HF_TOKEN }} - run: | - echo "Starting product auto-sync..." - python3 sync_products.py - - if [ $? -eq 0 ]; then - echo "✅ Sync completed successfully" - else - echo "❌ Sync failed" - exit 1 - fi diff --git a/.rebuild b/.rebuild index 1dff87e46c3b3a5f9d29730e500dc8fd3a9570d0..193f020ddcb40bb854a5c26cb9333ddfb1cd6714 100644 --- a/.rebuild +++ b/.rebuild @@ -1 +1 @@ -2026-07-21T03:40:00+00:00 - Excel Fee Rows Fix - QR payment v1043 \ No newline at end of file +2026-07-03T08:05:09+00:00 diff --git a/APPLY_EXCEL_FIX.md b/APPLY_EXCEL_FIX.md index 932b0b7450b5e8b8ac842b752d048b8bb1a56ae7..ce3e55212291ffc7448b7e75899441c4cf565dbb 100644 --- a/APPLY_EXCEL_FIX.md +++ b/APPLY_EXCEL_FIX.md @@ -1,32 +1,51 @@ -# Cập nhật Excel Export - Phiếu báo giá - -## Thay đổi đã thực hiện - -### 1. Thêm các dòng phí vào Excel báo giá -Khi nhập vào ô ck: Malloca ck 35%, giao hàng 200k, lắp đặt 500k, cọc 5tr, ghi chú: giao thứ 7 - -**Excel báo giá sẽ hiển thị:** -- Bảng sản phẩm (STT, Hình, Tên SP, Mã, Thông tin, SL, Đơn giá, Giá CK, Thành tiền, Ghi chú) -- Các dòng phụ phí: - - ⊕ Phí giao hàng: +200.000đ - - ⊕ Phí lắp đặt: +500.000đ -- Dòng đặt cọc: Đặt cọc: 5.000.000đ -- TỔNG CỘNG: Tổng tiền sau khi trừ cọc - -### 2. Xóa bỏ dòng "Còn lại 100%" -Dòng "Còn lại 100%" đã được xóa khỏi Excel xuất để file gọn hơn. - -## Cách hoạt động - -1. Nhập thông tin vào ô prompt (qcAiPrompt) với định dạng: - - `ck 35%` - áp dụng chiết khấu 35% cho tất cả sản phẩm - - `giao hàng 200k` hoặc `ship 200k` - thêm phí giao hàng - - `lắp đặt 500k` hoặc `install 500k` - thêm phí lắp đặt - - `cọc 5tr` hoặc `deposit 5tr` - thêm số tiền đặt cọc - - `giao thứ 7` - ghi chú (sẽ xuất trong phần Ghi chú) - -2. Nhấn nút "Xuất Excel" để tải file báo giá - -## File đã cập nhật -- `qr-payment-v1039.js` - Main script (đã cập nhật) -- `vai-excel-fix-v2.js` - Excel fix script (đã cập nhật) \ No newline at end of file +# Hướng dẫn áp dụng Fix Excel Download - CẬP NHẬT 2026 + +## Vấn đề +File Excel chỉ tải được 1 lần, lần 2+ thất bại vì `URL.revokeObjectURL()` được gọi sau 60s. + +## 🎯 GIẢI PHÁP HOÀN HẢO - Fix v2.0 + +### Cách 1: Auto Loader (TỰ ĐỘNG) - KHÔNG CẦN LÀM GÌ CẢ +- `auto-excel-fix-loader.js` tự động tải `vai-excel-fix-v2.js` khi trang mở +- Script đã được tích hợp sẵn trong index.html +- Chỉ cần mở lại trang là được áp dụng tự động ✅ + +### Cách 2: Bookmarklet - KHÔNG CẦN CHỈNH SỬA CODE +Tạo bookmark mới với URL: +```javascript +javascript:(function(){var s=document.createElement('script');s.src='/vai-excel-fix-v2.js?v='+Date.now();s.onload=function(){alert('✅ Excel Fix v2.0 đã tải!\nBạn có thể tải Excel bao nhiêu lần tùy thích!');};document.head.appendChild(s);})(); +``` + +### Cách 3: Thêm script tag vào index.html (TỰ ĐỘNG) +Thêm đoạn sau vào trước thẻ ``: +```html + + +``` + +## Test +1. Mở Space V.AISTUDIO +2. Tạo báo giá (lập báo giá) → Click 💾 Excel → tải ✅ +3. Click 💾 Excel NGAY → tải tiếp tục ✅ +4. Click nhiều lần nữa → luôn tải được ✅ +5. Quay lại → tạo đơn hàng mới → GH Excel → tải ✅ + +## File đã chuẩn +- ✅ `vai-excel-fix-v2.js` - Script fix chính (mới nhất) +- ✅ `auto-excel-fix-loader.js` - Tự động tải fix +- ✅ `vai-quote-excel-order-fix-v1050.js` - Backup (nếu v2 không tải được) + +## Điều kiện áp dụng +- Cần có thư viện ExcelJS (đã có trong index.html): +```html + +``` + +## Changelog v2.0 +- Thay đổi cách quản lý blob URL: registry toàn cục +- Patch URL.revokeObjectURL: không revoke khi chưa unload +- Hỗ trợ cả Quote modal và Order modal +- Toast thông báo khi xuất thành công/thất bại + +--- +*Cập nhật: 14-07-2026 - ML Intern - Fix Excel multi-download hoàn hảo* \ No newline at end of file diff --git a/FIX-STATUS.md b/FIX-STATUS.md deleted file mode 100644 index e902386e5f593c75bd93bc29e7a3975efcbc9a8c..0000000000000000000000000000000000000000 --- a/FIX-STATUS.md +++ /dev/null @@ -1,41 +0,0 @@ -# ✅ FIX HOÀN THÀNH: Phí giao hàng, lắp đặt, cọc được thêm vào Excel - -## ĐÃ SỬA - -**File: `qr-payment.js`** - phiên bản v1043 - -### Thay đổi chính: - -1. **Hàm `_doExportExcel`** - Thêm dòng phí vào Excel: - - Sau khi in danh sách sản phẩm - - Thêm các dòng phí: `⊕ Phí giao hàng`, `⊕ Phí lắp đặt`, `⊕ Phí bốc xếp` - - Cập nhật công thức tổng: `SUM(I{firstItem}:I{lastItem})+SUM(I{feeStart}:I{feeEnd})` - -2. **Hàm `parsePrompt`** - Cải thiện parsing chi phí: - - Nhận diện từ khóa: `giao`, `giao hàng`, `ship`, `lắp`, `lắp đặt`, `bốc xếp` - - Tự động gán nhãn phí phù hợp - -## CÁCH ÁP DỤNG - -Do rate limit, bạn cần **thủ công rebuild Space**: - -1. Vào https://huggingface.co/spaces/bep40/V.AISTUDIO/settings -2. Chọn tab **Builder** -3. Nhấn **Rebuild** hoặc **Restart** - -Hoặc chờ 1-2 phút để Space tự động cập nhật. - -## KIỂM TRA - -Sau khi rebuild, mở Space và thử: -1. Thêm sản phẩm vào giỏ -2. Nhập vào ô yêu cầu: `giao 200k, lắp 300k, cọc 5tr` -3. Nhấn nút **⚡ Áp dụng** -4. Nhấn **Xuất Excel** - file Excel sẽ có các dòng: - - ⊕ Phí giao hàng: 200,000đ - - ⊕ Phí lắp đặt: 300,000đ - - Cọc: 5,000,000đ - - Còn lại: tổng cộng - cọc - ---- -PR #24 đã merge vào main. \ No newline at end of file diff --git a/debug_export.html b/debug_export.html deleted file mode 100644 index 78a2dc704b22ca5775ec43b8de21ba37a15f7fc3..0000000000000000000000000000000000000000 --- a/debug_export.html +++ /dev/null @@ -1,47 +0,0 @@ - - - -VAI Export Debug - - - -

VAI Export Debug

-

Nhập prompt rồi bấm nút. File sẽ có đủ dòng phí. Log hiển thị bên dưới.

- - -
Log sẽ hiện ở đây...
- - diff --git a/excel-fix-100px.js b/excel-fix-100px.js deleted file mode 100644 index d58d93488bb1f4fcee64ebd19a1676ffe9b55994..0000000000000000000000000000000000000000 --- a/excel-fix-100px.js +++ /dev/null @@ -1,149 +0,0 @@ -/** - * V.AI STUDIO - Excel Export v1102 - * FIX: Hình ảnh 100x100px trong Excel - */ -(function(){ -'use strict'; - -function fmt(n){ - if(n==null||n==='')return'0đ'; - var num=typeof n==='string'?parseFloat(n.replace(/[^\d.-]/g,'')):Number(n); - if(isNaN(num))return'0đ'; - return num.toLocaleString('vi-VN')+'đ'; -} - -async function fetchImageArrayBuffer(url){ - if(!url||!url.startsWith('http')) return null; - try{ - var r = await fetch(url,{mode:'cors'}); - if(r.ok) return await r.arrayBuffer(); - }catch(e){} - try{ - var r2 = await fetch('https://api.allorigins.win/raw?url=' + encodeURIComponent(url)); - if(r2.ok) return await r2.arrayBuffer(); - }catch(e){} - return null; -} - -function getOrderCode(){ - var n = document.getElementById('quoteName')?.value || ''; - var h = window.location.hash; - var today = new Date(), dd=today.getDate().toString().padStart(2,'0'), mm=(today.getMonth()+1).toString().padStart(2,'0'), yy=today.getFullYear().toString().slice(-2); - var ini=''; - if(n && n.trim()){ - n.trim().split(/\s+/).forEach(function(w){ - if(w && /[A-Z]/.test(w.charAt(0).toUpperCase())) ini += w.charAt(0).toUpperCase(); - }); - } - return 'VAS'+(ini||'X')+dd+mm+yy; -} - -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(function(r){s.onload=r}); - } - - try{ - var code = getOrderCode(); - var wb = new ExcelJS.Workbook(), ws = wb.addWorksheet('Báo giá'); - - // Column 2 width 15 for 100px image - ws.columns = [ - {width:6},{width:15},{width:30},{width:15}, - {width:22},{width:8},{width:15},{width:15},{width:18},{width:16} - ]; - - // Header title - ws.mergeCells('A1:J1'); - ws.getCell('A1').value = 'BẢNG BÁO GIÁ'; - ws.getCell('A1').font = {bold:true, size:18, color:{argb:'FFDB9815'}}; - ws.getCell('A1').alignment = {horizontal:'center'}; - ws.getRow(1).height = 30; - - // Table header - var hr = ws.getRow(3); - ['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 = hr.getCell(i+1); - c.value = h; - c.font = {bold:true, color:{argb:'FFFFFFFF'}, size:9}; - c.fill = {type:'pattern', pattern:'solid', fgColor:{argb:'FF003F62'}}; - c.alignment = {horizontal:'center', vertical:'middle'}; - }); - hr.height = 20; - - // Items with 100x100px images - var firstRow = 5; - await Promise.all(cart.map(async function(c, i){ - var p = window.D && D[c.idx] ? D[c.idx] : null; - var row = ws.getRow(firstRow + i); - row.height = 120; // 100px + padding - - var bgColor = i % 2 === 0 ? 'FFF8FAFC' : 'FFFFFFFF'; - - row.getCell(1).value = i+1; - row.getCell(1).alignment = {horizontal:'center', vertical:'middle'}; - - // IMAGE 100x100px - if((p && p.image) || c.image){ - var imgUrl = p?.image || c.image; - var imgBuf = await fetchImageArrayBuffer(imgUrl); - if(imgBuf){ - try{ - wb.addImage(wb.addImage({buffer:imgBuf, extension:'png'}), - {tl:{col:1, row:firstRow+i-1}, ext:{width:100, height:100}}); - }catch(e){} - } - } - - row.getCell(3).value = c.name || (p?p.name||p.n:'') || ''; - row.getCell(3).font = {bold:true, size:9}; - row.getCell(4).value = c.sku || (p?p.sku||p.model:'') || ''; - row.getCell(6).value = Number(c.qty||1); - row.getCell(7).value = Number(c.priceNum||(p?p.priceNum:0)||0); - row.getCell(7).numFmt = '#,##0"đ"'; - row.getCell(8).value = Number(c.priceNum||(p?p.priceNum:0)||0); - row.getCell(8).numFmt = '#,##0"đ"'; - row.getCell(9).value = Number(c.priceNum||(p?p.priceNum:0)||0) * Number(c.qty||1); - row.getCell(9).numFmt = '#,##0"đ"'; - - for(var ci=1; ci<=10; ci++){ - row.getCell(ci).fill = {type:'pattern', pattern:'solid', fgColor:{argb:bgColor}}; - } - })); - - var lastRow = firstRow + cart.length - 1; - // Total row - ws.getCell('A'+(lastRow+2)).value = 'TỔNG CỘNG'; - ws.getCell('A'+(lastRow+2)).font = {bold:true, size:13, color:{argb:'FFFFFFFF'}}; - ws.getCell('A'+(lastRow+2)).fill = {type:'pattern', pattern:'solid', fgColor:{argb:'FF003F62'}}; - ws.getCell('I'+(lastRow+2)).value = {formula:'SUM(I'+firstRow+':I'+lastRow+')'}; - ws.getCell('I'+(lastRow+2)).numFmt = '#,##0"đ"'; - ws.getCell('I'+(lastRow+2)).font = {bold:true, size:14, color:{argb:'FFF0B840'}}; - - wb.calcProperties.fullCalcOnLoad = true; - var buf = await wb.xlsx.writeBuffer(); - var blob = new Blob([buf], {type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}); - var url = URL.createObjectURL(blob); - var a = document.createElement('a'); - a.href = url; - a.download = code + '.xlsx'; - document.body.appendChild(a); - a.click(); - setTimeout(function(){ document.body.removeChild(a); URL.revokeObjectURL(url); }, 30000); - - console.log('[VAI] Excel export OK - hình ảnh 100px'); - if(typeof showToast === 'function') showToast('✅ Excel OK - Hình ảnh 100px'); - - }catch(e){ - console.error('[VAI] Excel error:', e); - alert('Lỗi: '+e.message); - } -}; - -console.log('[VAI v1102] Excel fix loaded - 100px images ready'); \ No newline at end of file diff --git a/grob-price-fix.js b/grob-price-fix.js deleted file mode 100644 index 7a35abc9da149550f9b974c6bcfe1c9f32fbd259..0000000000000000000000000000000000000000 --- a/grob-price-fix.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * V.AI STUDIO — Grob Price Fix - * ============================== - * Fixes incorrect prices from the catalogue-based PDF price list. - * Fixed as of July 2026 per Grob Vietnam catalogue. - */ -(function() { - 'use strict'; - if (window.__GROB_PRICE_FIX__) return; - window.__GROB_PRICE_FIX__ = true; - - const PRICE_FIXES = { - // 0203 | Grob | Bản lề inox - cánh/phủ bì 203mm: 0đ -> 67.000đ - '0203': { p: '67.000đ', pn: 67000 }, - // 0280 | Grob | Khay chia thìa dĩa nhựa - cánh/phủ bì 280mm: 885.000đ -> 965.000đ - '0280': { p: '965.000đ', pn: 965000 }, - // 0290 | Grob | Khay chia thìa dĩa nhựa - cánh/phủ bì 290mm: 965.000đ -> 1.018.000đ - '0290': { p: '1.018.000đ', pn: 1018000 }, - }; - - function patchProduct(prod) { - if (!prod) return; - var name = prod.n || prod.name || ''; - for (var code in PRICE_FIXES) { - if (name.indexOf(code) === 0 && name.indexOf('Grob') !== -1) { - var fix = PRICE_FIXES[code]; - if (prod.p) prod.p = fix.p; - if (prod.pn !== undefined) prod.pn = fix.pn; - if (prod.price) prod.price = fix.p; - if (prod.priceNum !== undefined) prod.priceNum = fix.pn; - return true; - } - } - return false; - } - - // Patch after D is populated - function patchD() { - if (typeof window.D !== 'undefined' && Array.isArray(window.D)) { - var patched = 0; - window.D.forEach(function(p) { - if (patchProduct(p)) patched++; - }); - if (patched > 0) { - console.log('[Grob Price Fix] Patched ' + patched + ' product(s) in D'); - // Also sync prices for items already in cart - patchCart(); - if (typeof window.refreshUI === 'function') window.refreshUI(); - } - } - } - - // Sync Grob prices in cart (localStorage) - function patchCart() { - try { - var cart = JSON.parse(localStorage.getItem('malloca_cart') || '[]'); - if (!Array.isArray(cart) || !cart.length) return; - var changed = false; - cart.forEach(function(item) { - if (patchProduct(item)) changed = true; - }); - if (changed) { - localStorage.setItem('malloca_cart', JSON.stringify(cart)); - window.cart = cart; - console.log('[Grob Price Fix] Synced prices in cart'); - } - } catch(e) {} - } - - // Try patching at various intervals as data loads - function onReady() { - setTimeout(patchD, 200); - setTimeout(patchD, 500); - setTimeout(patchD, 1000); - setTimeout(patchD, 2000); - setTimeout(patchD, 3000); - setTimeout(patchD, 5000); - } - - if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', onReady); - } else { - onReady(); - } - - console.log('[Grob Price Fix] Loaded: 02.03=67k, 02.80=965k, 02.90=1,018k'); -})(); \ No newline at end of file diff --git a/grob_img/grob_p1.jpeg b/grob_img/grob_p1.jpeg deleted file mode 100644 index a8863f2db7c828131e88f23fa6b4c4aa80223e31..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p1.jpeg and /dev/null differ diff --git a/grob_img/grob_p10.jpeg b/grob_img/grob_p10.jpeg deleted file mode 100644 index 810f698f931e54920fe2c992222aa5a7b852baa9..0000000000000000000000000000000000000000 --- a/grob_img/grob_p10.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cf047359715058a5f1e2ae91a8a2f1163539f4712de1db357ae12e677cac638 -size 222059 diff --git a/grob_img/grob_p100.jpeg b/grob_img/grob_p100.jpeg deleted file mode 100644 index 3751223634eff1294afb18daa95ded0945510238..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p100.jpeg and /dev/null differ diff --git a/grob_img/grob_p101.jpeg b/grob_img/grob_p101.jpeg deleted file mode 100644 index 3c8fa58bd2874523b1a55e25894ef44680909109..0000000000000000000000000000000000000000 --- a/grob_img/grob_p101.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f695be82687bb3a52248ff537adb6950f73b64c21f483ff22b9e81213b1db61 -size 125846 diff --git a/grob_img/grob_p102.jpeg b/grob_img/grob_p102.jpeg deleted file mode 100644 index bfc6bc1161d9f0c9121e31f642afce435dae9f03..0000000000000000000000000000000000000000 --- a/grob_img/grob_p102.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9c705dbb20655e160ad96fd17c5c33f505b7702f0b2c031cf49ffcf239d4e80 -size 394401 diff --git a/grob_img/grob_p103.jpeg b/grob_img/grob_p103.jpeg deleted file mode 100644 index 506527c0f1c2aae0b5fe045e316b7d96c8c80994..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p103.jpeg and /dev/null differ diff --git a/grob_img/grob_p104.jpeg b/grob_img/grob_p104.jpeg deleted file mode 100644 index 757f1353701d5b1cd11e2aa581404a04c76d7fb4..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p104.jpeg and /dev/null differ diff --git a/grob_img/grob_p105.jpeg b/grob_img/grob_p105.jpeg deleted file mode 100644 index eef7f284a27e7a117463aebec0ce7ba766584a5a..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p105.jpeg and /dev/null differ diff --git a/grob_img/grob_p106.jpeg b/grob_img/grob_p106.jpeg deleted file mode 100644 index 7f6e7e668f55007ee3e743f69a640eadc341201d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p106.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62afdde0435420e325e86f5162f0d637a1c53f90ca9ba3b1fb72f900086fb6a9 -size 150253 diff --git a/grob_img/grob_p107.jpeg b/grob_img/grob_p107.jpeg deleted file mode 100644 index e59dec10e8ed9e46889ede34c8ddd1f20ee608aa..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p107.jpeg and /dev/null differ diff --git a/grob_img/grob_p108.jpeg b/grob_img/grob_p108.jpeg deleted file mode 100644 index 55c5df91d7c0a1b1060bbeefa147143b564fb5a5..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p108.jpeg and /dev/null differ diff --git a/grob_img/grob_p109.jpeg b/grob_img/grob_p109.jpeg deleted file mode 100644 index ec196859115435dab4435f183b0238b85884e739..0000000000000000000000000000000000000000 --- a/grob_img/grob_p109.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d45a5d7fbe20e41f181eb81adf669d9263daddb1787e9dc47bed68355637314 -size 102869 diff --git a/grob_img/grob_p11.jpeg b/grob_img/grob_p11.jpeg deleted file mode 100644 index 3ef63feef28a7a07d24238a93d53f3de2f89e096..0000000000000000000000000000000000000000 --- a/grob_img/grob_p11.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc47b6543988f6a4074ce37aa20ea13aa03d6f2f806a823869dec4fba362be7f -size 159869 diff --git a/grob_img/grob_p110.jpeg b/grob_img/grob_p110.jpeg deleted file mode 100644 index ea9eca5d9f92c6378fc44c43ce7be6168ffa6c6e..0000000000000000000000000000000000000000 --- a/grob_img/grob_p110.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a84e2440229ca6da6a9d924f027a39e17176fc495c74d18a0c8f8307b2d93f2c -size 101485 diff --git a/grob_img/grob_p111.jpeg b/grob_img/grob_p111.jpeg deleted file mode 100644 index 4e9af806bfcaeafe85d71e95b63aa699b482959c..0000000000000000000000000000000000000000 --- a/grob_img/grob_p111.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a8c39cc23363b072d590675666c9e8b202c3030b0ced467bad694a19b197ded -size 286210 diff --git a/grob_img/grob_p112.jpeg b/grob_img/grob_p112.jpeg deleted file mode 100644 index 70fa1927212c9ac3b999c50655c86b5ce3515cf5..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p112.jpeg and /dev/null differ diff --git a/grob_img/grob_p113.jpeg b/grob_img/grob_p113.jpeg deleted file mode 100644 index 1589baeb9c774489836e5b3ae227aeaf529e569e..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p113.jpeg and /dev/null differ diff --git a/grob_img/grob_p114.jpeg b/grob_img/grob_p114.jpeg deleted file mode 100644 index 4b52bad276caad682fa2c8285d2682efff69c5bd..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p114.jpeg and /dev/null differ diff --git a/grob_img/grob_p115.jpeg b/grob_img/grob_p115.jpeg deleted file mode 100644 index 4b52bad276caad682fa2c8285d2682efff69c5bd..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p115.jpeg and /dev/null differ diff --git a/grob_img/grob_p116.jpeg b/grob_img/grob_p116.jpeg deleted file mode 100644 index 6297215fb61c5b13fc0817314cf4db729eb8a20f..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p116.jpeg and /dev/null differ diff --git a/grob_img/grob_p117.jpeg b/grob_img/grob_p117.jpeg deleted file mode 100644 index 8e0e78b368ec7c06bbbf7b42e8844bb90db159e0..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p117.jpeg and /dev/null differ diff --git a/grob_img/grob_p118.jpeg b/grob_img/grob_p118.jpeg deleted file mode 100644 index a8083a65aa91268428bbd41735a4e569e1bcbda2..0000000000000000000000000000000000000000 --- a/grob_img/grob_p118.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:269778d257f719f470c89f27e83ef12c4913cc4ed7adb4a1aa181494f74c63f3 -size 552344 diff --git a/grob_img/grob_p119.jpeg b/grob_img/grob_p119.jpeg deleted file mode 100644 index a8083a65aa91268428bbd41735a4e569e1bcbda2..0000000000000000000000000000000000000000 --- a/grob_img/grob_p119.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:269778d257f719f470c89f27e83ef12c4913cc4ed7adb4a1aa181494f74c63f3 -size 552344 diff --git a/grob_img/grob_p12.jpeg b/grob_img/grob_p12.jpeg deleted file mode 100644 index 4a2767266085064b4659bf66232d0d33d0e5d14d..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p12.jpeg and /dev/null differ diff --git a/grob_img/grob_p120.jpeg b/grob_img/grob_p120.jpeg deleted file mode 100644 index dacc46d5f6cfce4f79ed496f1036c180c8f263d3..0000000000000000000000000000000000000000 --- a/grob_img/grob_p120.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e912df9328009cdd1a040974cec3309795335536dd1c89b4d80f138f28f7a9 -size 489063 diff --git a/grob_img/grob_p121.jpeg b/grob_img/grob_p121.jpeg deleted file mode 100644 index 47c06a70cc4ab2963faf7207522dd47e024f3c37..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p121.jpeg and /dev/null differ diff --git a/grob_img/grob_p122.jpeg b/grob_img/grob_p122.jpeg deleted file mode 100644 index d0b8638dec70fbb217ca11c557bfea7bcc764ed0..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p122.jpeg and /dev/null differ diff --git a/grob_img/grob_p123.jpeg b/grob_img/grob_p123.jpeg deleted file mode 100644 index edac2eb490f0fed802fca9e17dfd41ca4042e74e..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p123.jpeg and /dev/null differ diff --git a/grob_img/grob_p124.jpeg b/grob_img/grob_p124.jpeg deleted file mode 100644 index edac2eb490f0fed802fca9e17dfd41ca4042e74e..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p124.jpeg and /dev/null differ diff --git a/grob_img/grob_p125.jpeg b/grob_img/grob_p125.jpeg deleted file mode 100644 index 1fbed19ea81b8b6b7668ab76e280a2ca6b98357c..0000000000000000000000000000000000000000 --- a/grob_img/grob_p125.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eadac8ca424066b951c6ede4fda5d234144f00f470dbf7564422f3744ae09c81 -size 305035 diff --git a/grob_img/grob_p126.jpeg b/grob_img/grob_p126.jpeg deleted file mode 100644 index 240d1ac91fbe4adec38151a29166c3dd74add7fd..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p126.jpeg and /dev/null differ diff --git a/grob_img/grob_p127.jpeg b/grob_img/grob_p127.jpeg deleted file mode 100644 index 33b37ff5629bffcc54cb59205ac15e60fe6b0478..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p127.jpeg and /dev/null differ diff --git a/grob_img/grob_p128.jpeg b/grob_img/grob_p128.jpeg deleted file mode 100644 index da58e635a33e52bcce2335635f59c220c74defa4..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p128.jpeg and /dev/null differ diff --git a/grob_img/grob_p129.jpeg b/grob_img/grob_p129.jpeg deleted file mode 100644 index abd492584caaa099af3fc59da5ae6ef49a2b38c2..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p129.jpeg and /dev/null differ diff --git a/grob_img/grob_p13.jpeg b/grob_img/grob_p13.jpeg deleted file mode 100644 index 52762bbe3e92e1a19daa482c7907c9301eae6966..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p13.jpeg and /dev/null differ diff --git a/grob_img/grob_p130.jpeg b/grob_img/grob_p130.jpeg deleted file mode 100644 index 635846a2263b7e50621680f6c52bb58c5d64738d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p130.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96bef100ad82f1bf948a6559608d84429e17c04086d893ca83835e7d9d2e71c3 -size 382486 diff --git a/grob_img/grob_p131.jpeg b/grob_img/grob_p131.jpeg deleted file mode 100644 index 1178cafb2c1c7f96642524024f34e0d38aa4004d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p131.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a452d634674cdd034b4965382fd9b5b0cb59e6bf0ef156d2d043d3595e0debf -size 407311 diff --git a/grob_img/grob_p132.jpeg b/grob_img/grob_p132.jpeg deleted file mode 100644 index 359303db1d2f5af360552b8b16c169e0a34b5423..0000000000000000000000000000000000000000 --- a/grob_img/grob_p132.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7254e22d6463e5163ab1587467e6dc8a57f67a7747d5c5a5411a63d59ae6f1ee -size 263601 diff --git a/grob_img/grob_p133.jpeg b/grob_img/grob_p133.jpeg deleted file mode 100644 index 359303db1d2f5af360552b8b16c169e0a34b5423..0000000000000000000000000000000000000000 --- a/grob_img/grob_p133.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7254e22d6463e5163ab1587467e6dc8a57f67a7747d5c5a5411a63d59ae6f1ee -size 263601 diff --git a/grob_img/grob_p134.jpeg b/grob_img/grob_p134.jpeg deleted file mode 100644 index 1178cafb2c1c7f96642524024f34e0d38aa4004d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p134.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a452d634674cdd034b4965382fd9b5b0cb59e6bf0ef156d2d043d3595e0debf -size 407311 diff --git a/grob_img/grob_p135.jpeg b/grob_img/grob_p135.jpeg deleted file mode 100644 index 7c0f72cabc1f444158d2644bdf8c56d59c88553f..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p135.jpeg and /dev/null differ diff --git a/grob_img/grob_p136.jpeg b/grob_img/grob_p136.jpeg deleted file mode 100644 index 1520bcfee3ecbdfa505e66ff718f390fad20678e..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p136.jpeg and /dev/null differ diff --git a/grob_img/grob_p137.jpeg b/grob_img/grob_p137.jpeg deleted file mode 100644 index 996d3c82dbb0ed06bb38a0333a5977df8e97b984..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p137.jpeg and /dev/null differ diff --git a/grob_img/grob_p138.jpeg b/grob_img/grob_p138.jpeg deleted file mode 100644 index 35843886e366b2104400e331b382625acdd0dd1b..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p138.jpeg and /dev/null differ diff --git a/grob_img/grob_p139.jpeg b/grob_img/grob_p139.jpeg deleted file mode 100644 index 35843886e366b2104400e331b382625acdd0dd1b..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p139.jpeg and /dev/null differ diff --git a/grob_img/grob_p14.jpeg b/grob_img/grob_p14.jpeg deleted file mode 100644 index c45ca5de0869d98235e2e4efc04f7e6004bc4362..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p14.jpeg and /dev/null differ diff --git a/grob_img/grob_p140.jpeg b/grob_img/grob_p140.jpeg deleted file mode 100644 index afbd70407aa479632a4f0c827d0c0a3795c1ea38..0000000000000000000000000000000000000000 --- a/grob_img/grob_p140.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b7b18b2d3d947c4c207987831d071afe51e02dd00ee98977c3a9505b7da75e1 -size 683825 diff --git a/grob_img/grob_p141.jpeg b/grob_img/grob_p141.jpeg deleted file mode 100644 index 1cdad541255718bcc0a84f88405474f206773c48..0000000000000000000000000000000000000000 --- a/grob_img/grob_p141.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:438eab576d0cef9315acdbb9c260af97c22e2817fb2ec7e9878c0e22e1417535 -size 627365 diff --git a/grob_img/grob_p142.jpeg b/grob_img/grob_p142.jpeg deleted file mode 100644 index 0eef77d9723a85733d74013383d6c0124976b3fc..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p142.jpeg and /dev/null differ diff --git a/grob_img/grob_p143.jpeg b/grob_img/grob_p143.jpeg deleted file mode 100644 index cec3ca06ee8b5afe596b4e09e0eac99952f6cfb1..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p143.jpeg and /dev/null differ diff --git a/grob_img/grob_p144.jpeg b/grob_img/grob_p144.jpeg deleted file mode 100644 index 152284990ac5a530acd65985ccbe9305cc7ce560..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p144.jpeg and /dev/null differ diff --git a/grob_img/grob_p145.jpeg b/grob_img/grob_p145.jpeg deleted file mode 100644 index 146f326c04eb50c4d22258e1f2e47eb8c7e5b903..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p145.jpeg and /dev/null differ diff --git a/grob_img/grob_p146.jpeg b/grob_img/grob_p146.jpeg deleted file mode 100644 index 146f326c04eb50c4d22258e1f2e47eb8c7e5b903..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p146.jpeg and /dev/null differ diff --git a/grob_img/grob_p147.jpeg b/grob_img/grob_p147.jpeg deleted file mode 100644 index 146f326c04eb50c4d22258e1f2e47eb8c7e5b903..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p147.jpeg and /dev/null differ diff --git a/grob_img/grob_p149.jpeg b/grob_img/grob_p149.jpeg deleted file mode 100644 index bd26f19cf30796d78951fc2f06a803b76700b9c2..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p149.jpeg and /dev/null differ diff --git a/grob_img/grob_p15.jpeg b/grob_img/grob_p15.jpeg deleted file mode 100644 index 725609e8cad796f4a909b7ef9cdd0b5c2f0b25ee..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p15.jpeg and /dev/null differ diff --git a/grob_img/grob_p150.jpeg b/grob_img/grob_p150.jpeg deleted file mode 100644 index 5c6491c7a247ed9cdbc84c0176f19cb6e12be5c2..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p150.jpeg and /dev/null differ diff --git a/grob_img/grob_p151.jpeg b/grob_img/grob_p151.jpeg deleted file mode 100644 index f1d58a7847f3010a58c6387ba30f8bcbf5ce5694..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p151.jpeg and /dev/null differ diff --git a/grob_img/grob_p152.jpeg b/grob_img/grob_p152.jpeg deleted file mode 100644 index 36663a69b6e0a7924c308407b3440d4ad23908db..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p152.jpeg and /dev/null differ diff --git a/grob_img/grob_p153.jpeg b/grob_img/grob_p153.jpeg deleted file mode 100644 index ce0e1364fc3b5413d420c9e17563fff9813123dc..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p153.jpeg and /dev/null differ diff --git a/grob_img/grob_p154.jpeg b/grob_img/grob_p154.jpeg deleted file mode 100644 index ce0e1364fc3b5413d420c9e17563fff9813123dc..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p154.jpeg and /dev/null differ diff --git a/grob_img/grob_p155.jpeg b/grob_img/grob_p155.jpeg deleted file mode 100644 index 146f326c04eb50c4d22258e1f2e47eb8c7e5b903..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p155.jpeg and /dev/null differ diff --git a/grob_img/grob_p156.jpeg b/grob_img/grob_p156.jpeg deleted file mode 100644 index 146f326c04eb50c4d22258e1f2e47eb8c7e5b903..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p156.jpeg and /dev/null differ diff --git a/grob_img/grob_p157.jpeg b/grob_img/grob_p157.jpeg deleted file mode 100644 index 146f326c04eb50c4d22258e1f2e47eb8c7e5b903..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p157.jpeg and /dev/null differ diff --git a/grob_img/grob_p158.jpeg b/grob_img/grob_p158.jpeg deleted file mode 100644 index 5938df3aa03cb53b07fc47558deb1170b350bc3d..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p158.jpeg and /dev/null differ diff --git a/grob_img/grob_p16.jpeg b/grob_img/grob_p16.jpeg deleted file mode 100644 index 92e7e7819348e5ba08ccce90b3d5cbb9aaf699fb..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p16.jpeg and /dev/null differ diff --git a/grob_img/grob_p161.jpeg b/grob_img/grob_p161.jpeg deleted file mode 100644 index e37f074cf0923907f8e2c69f6c2d41be7546dc88..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p161.jpeg and /dev/null differ diff --git a/grob_img/grob_p166.jpeg b/grob_img/grob_p166.jpeg deleted file mode 100644 index e75dc8190174a18926b1e0580d48fef636e72b7d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p166.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd763f10c95c3b4ebe09c5a6e47b2999afdf03ae8cd34e61913dac4176d69b10 -size 212140 diff --git a/grob_img/grob_p17.jpeg b/grob_img/grob_p17.jpeg deleted file mode 100644 index 1a8c15d504177761f4f2698fdf17fdcc5a5cfee0..0000000000000000000000000000000000000000 --- a/grob_img/grob_p17.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58e40c7b6992f9a659f16457588aa71d183d3b83199dd2714ed9ce9e813cb716 -size 116920 diff --git a/grob_img/grob_p173.jpeg b/grob_img/grob_p173.jpeg deleted file mode 100644 index 2c1969c1726f125df92d6047655ebff252528c00..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p173.jpeg and /dev/null differ diff --git a/grob_img/grob_p174.jpeg b/grob_img/grob_p174.jpeg deleted file mode 100644 index 07dfec37d7a8bf3609c1ea12d0e8717bd32bc3e1..0000000000000000000000000000000000000000 --- a/grob_img/grob_p174.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb61b4552da788de31e13a4271d2fab654b3a343fc4f1637728983abaa713dfa -size 202011 diff --git a/grob_img/grob_p175.jpeg b/grob_img/grob_p175.jpeg deleted file mode 100644 index 05abd954bf783ff7d9322ff44c188959b9b42d13..0000000000000000000000000000000000000000 --- a/grob_img/grob_p175.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ef19b941f31cb5e2217a850c7d657992d63db79ea731786f5404a0112e1d2e4 -size 194372 diff --git a/grob_img/grob_p176.jpeg b/grob_img/grob_p176.jpeg deleted file mode 100644 index aa9b1b39377578eeaa938b33013ec3d1d04cc4ed..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p176.jpeg and /dev/null differ diff --git a/grob_img/grob_p177.jpeg b/grob_img/grob_p177.jpeg deleted file mode 100644 index 05abd954bf783ff7d9322ff44c188959b9b42d13..0000000000000000000000000000000000000000 --- a/grob_img/grob_p177.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ef19b941f31cb5e2217a850c7d657992d63db79ea731786f5404a0112e1d2e4 -size 194372 diff --git a/grob_img/grob_p178.jpeg b/grob_img/grob_p178.jpeg deleted file mode 100644 index 16dba8db536c4a2a2e58fe3aaa236f4ffd661c13..0000000000000000000000000000000000000000 --- a/grob_img/grob_p178.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bef58fb8a26e13e6a9c0a2b58209846f7759922ea91981889b391152f947e976 -size 204171 diff --git a/grob_img/grob_p179.jpeg b/grob_img/grob_p179.jpeg deleted file mode 100644 index bd019414b2e5ab1c754b9fde7371239bbb87aa79..0000000000000000000000000000000000000000 --- a/grob_img/grob_p179.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bda09002cb7ed774f5f3d47e4003afa33467e30b671357f267115879a878469 -size 183722 diff --git a/grob_img/grob_p18.jpeg b/grob_img/grob_p18.jpeg deleted file mode 100644 index a6456f8fcf4ec388f6d09f61292b3f23d967ce1b..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p18.jpeg and /dev/null differ diff --git a/grob_img/grob_p180.jpeg b/grob_img/grob_p180.jpeg deleted file mode 100644 index bd019414b2e5ab1c754b9fde7371239bbb87aa79..0000000000000000000000000000000000000000 --- a/grob_img/grob_p180.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bda09002cb7ed774f5f3d47e4003afa33467e30b671357f267115879a878469 -size 183722 diff --git a/grob_img/grob_p183.jpeg b/grob_img/grob_p183.jpeg deleted file mode 100644 index cc63b15771b05918b68688d9784796c1bf53197a..0000000000000000000000000000000000000000 --- a/grob_img/grob_p183.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02b4a93c0ec20095a4939de04769fabbd72033a0b85d7f65f00b2a1fc9435398 -size 152515 diff --git a/grob_img/grob_p184.jpeg b/grob_img/grob_p184.jpeg deleted file mode 100644 index b9e577e90beb87845f4262149f0d6cb4b977a232..0000000000000000000000000000000000000000 --- a/grob_img/grob_p184.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a26be899e21ae41d3b05a1f010759abad2fe09066b6b68a3c8efcf3106a46651 -size 212082 diff --git a/grob_img/grob_p185.jpeg b/grob_img/grob_p185.jpeg deleted file mode 100644 index 05abd954bf783ff7d9322ff44c188959b9b42d13..0000000000000000000000000000000000000000 --- a/grob_img/grob_p185.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ef19b941f31cb5e2217a850c7d657992d63db79ea731786f5404a0112e1d2e4 -size 194372 diff --git a/grob_img/grob_p186.jpeg b/grob_img/grob_p186.jpeg deleted file mode 100644 index 05abd954bf783ff7d9322ff44c188959b9b42d13..0000000000000000000000000000000000000000 --- a/grob_img/grob_p186.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ef19b941f31cb5e2217a850c7d657992d63db79ea731786f5404a0112e1d2e4 -size 194372 diff --git a/grob_img/grob_p187.jpeg b/grob_img/grob_p187.jpeg deleted file mode 100644 index ca1228d6bad89221336d907e9c64bf1c42694a37..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p187.jpeg and /dev/null differ diff --git a/grob_img/grob_p188.jpeg b/grob_img/grob_p188.jpeg deleted file mode 100644 index 685818cbb20bf78cf19cd7f0d11cd0229d7d550d..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p188.jpeg and /dev/null differ diff --git a/grob_img/grob_p19.jpeg b/grob_img/grob_p19.jpeg deleted file mode 100644 index 170cc5c0d8a6b856b83a76e430fa8114c491215f..0000000000000000000000000000000000000000 --- a/grob_img/grob_p19.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e193e104ddd6a079363f987c0801ace472808f22d761c0aebfd23421a198de4 -size 106675 diff --git a/grob_img/grob_p192.jpeg b/grob_img/grob_p192.jpeg deleted file mode 100644 index 46047a1ef7cd4c8287c4cdfea1de500d8e506a5e..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p192.jpeg and /dev/null differ diff --git a/grob_img/grob_p196.jpeg b/grob_img/grob_p196.jpeg deleted file mode 100644 index 219fe80eed12e84453c9f4d31067a4d22b46a88a..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p196.jpeg and /dev/null differ diff --git a/grob_img/grob_p199.jpeg b/grob_img/grob_p199.jpeg deleted file mode 100644 index 5e02110e513174400962579c0d575423fa94359f..0000000000000000000000000000000000000000 --- a/grob_img/grob_p199.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e82be9fcd1d516492bd980e2bcbf298ad12c4b0d9ad919266f4c89c0215a1d10 -size 103520 diff --git a/grob_img/grob_p2.jpeg b/grob_img/grob_p2.jpeg deleted file mode 100644 index 77133aa509ede608b39428376241237553321102..0000000000000000000000000000000000000000 --- a/grob_img/grob_p2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84512aef40e90bb44e72eb4f6394f45a2001fad6b7357cf2f538933b280b6df9 -size 286161 diff --git a/grob_img/grob_p20.jpeg b/grob_img/grob_p20.jpeg deleted file mode 100644 index 51c1b128d0cfe2f5405b406c6441b4d69e30e7f8..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p20.jpeg and /dev/null differ diff --git a/grob_img/grob_p200.jpeg b/grob_img/grob_p200.jpeg deleted file mode 100644 index 996b2c429f16aa6c1215551e76fa1b16904141b6..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p200.jpeg and /dev/null differ diff --git a/grob_img/grob_p201.jpeg b/grob_img/grob_p201.jpeg deleted file mode 100644 index 1ad06ba0fcfc5245660238f0181bcb048639d2ef..0000000000000000000000000000000000000000 --- a/grob_img/grob_p201.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c0336d83b7af6e18b33448245b25bba581405b12e7eb128886de621da966fa5 -size 216589 diff --git a/grob_img/grob_p202.jpeg b/grob_img/grob_p202.jpeg deleted file mode 100644 index 996b2c429f16aa6c1215551e76fa1b16904141b6..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p202.jpeg and /dev/null differ diff --git a/grob_img/grob_p203.jpeg b/grob_img/grob_p203.jpeg deleted file mode 100644 index 996b2c429f16aa6c1215551e76fa1b16904141b6..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p203.jpeg and /dev/null differ diff --git a/grob_img/grob_p204.jpeg b/grob_img/grob_p204.jpeg deleted file mode 100644 index 996b2c429f16aa6c1215551e76fa1b16904141b6..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p204.jpeg and /dev/null differ diff --git a/grob_img/grob_p205.jpeg b/grob_img/grob_p205.jpeg deleted file mode 100644 index c8b06dc22729c8d453d06fb4fa3bd8737d4a4479..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p205.jpeg and /dev/null differ diff --git a/grob_img/grob_p206.jpeg b/grob_img/grob_p206.jpeg deleted file mode 100644 index c8b06dc22729c8d453d06fb4fa3bd8737d4a4479..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p206.jpeg and /dev/null differ diff --git a/grob_img/grob_p207.jpeg b/grob_img/grob_p207.jpeg deleted file mode 100644 index c8b06dc22729c8d453d06fb4fa3bd8737d4a4479..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p207.jpeg and /dev/null differ diff --git a/grob_img/grob_p21.jpeg b/grob_img/grob_p21.jpeg deleted file mode 100644 index 15fc0c43e2f7605ec68c113a2ab4181582ea6678..0000000000000000000000000000000000000000 --- a/grob_img/grob_p21.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02ba347b364325c4e0d65ddbc7861cca13442de03f79b1c98474e105dc0d7a23 -size 246531 diff --git a/grob_img/grob_p210.jpeg b/grob_img/grob_p210.jpeg deleted file mode 100644 index 1258499716424973d8fc1c8981b38215e3b03584..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p210.jpeg and /dev/null differ diff --git a/grob_img/grob_p211.jpeg b/grob_img/grob_p211.jpeg deleted file mode 100644 index 1258499716424973d8fc1c8981b38215e3b03584..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p211.jpeg and /dev/null differ diff --git a/grob_img/grob_p212.jpeg b/grob_img/grob_p212.jpeg deleted file mode 100644 index 0bf018010c1661da9340211d5b948bd183561193..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p212.jpeg and /dev/null differ diff --git a/grob_img/grob_p213.jpeg b/grob_img/grob_p213.jpeg deleted file mode 100644 index a024b84ac211b7d7df203366e2e4a419cd360b2c..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p213.jpeg and /dev/null differ diff --git a/grob_img/grob_p214.jpeg b/grob_img/grob_p214.jpeg deleted file mode 100644 index 2142402cf8b7a37d6132e82c6d3deefea6b4b5a6..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p214.jpeg and /dev/null differ diff --git a/grob_img/grob_p215.jpeg b/grob_img/grob_p215.jpeg deleted file mode 100644 index 49ef04969de2ccd7b317ebb104d7d03d8e4e4d4f..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p215.jpeg and /dev/null differ diff --git a/grob_img/grob_p216.jpeg b/grob_img/grob_p216.jpeg deleted file mode 100644 index 852db968edfe6c1eb88bf724ca0e3ba6d0209ff2..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p216.jpeg and /dev/null differ diff --git a/grob_img/grob_p217.jpeg b/grob_img/grob_p217.jpeg deleted file mode 100644 index f9088664ae2c8f2d12113ccf12b3d8dd3395aab6..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p217.jpeg and /dev/null differ diff --git a/grob_img/grob_p218.jpeg b/grob_img/grob_p218.jpeg deleted file mode 100644 index 667aa0e837b0c500961d392a5728243bbc25043d..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p218.jpeg and /dev/null differ diff --git a/grob_img/grob_p219.jpeg b/grob_img/grob_p219.jpeg deleted file mode 100644 index 8e8754ddbd2768f7729ac085f0c19b68e407960f..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p219.jpeg and /dev/null differ diff --git a/grob_img/grob_p22.jpeg b/grob_img/grob_p22.jpeg deleted file mode 100644 index 19a9443c3b7621d7074988471905796ad3a839b6..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p22.jpeg and /dev/null differ diff --git a/grob_img/grob_p220.jpeg b/grob_img/grob_p220.jpeg deleted file mode 100644 index 275605969227163dba832841af2d65a337d0393f..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p220.jpeg and /dev/null differ diff --git a/grob_img/grob_p221.jpeg b/grob_img/grob_p221.jpeg deleted file mode 100644 index c922e80f5fe06d7e1ddf9a321273aa9907541a2a..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p221.jpeg and /dev/null differ diff --git a/grob_img/grob_p222.jpeg b/grob_img/grob_p222.jpeg deleted file mode 100644 index f5589b735c2a88314dc3cb252b15ec95a301ff03..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p222.jpeg and /dev/null differ diff --git a/grob_img/grob_p223.jpeg b/grob_img/grob_p223.jpeg deleted file mode 100644 index 0c725ac18fee525709d445535c019c186304a384..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p223.jpeg and /dev/null differ diff --git a/grob_img/grob_p224.jpeg b/grob_img/grob_p224.jpeg deleted file mode 100644 index eeee895490ce7a13e5f8909020cc013ed42671ea..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p224.jpeg and /dev/null differ diff --git a/grob_img/grob_p225.jpeg b/grob_img/grob_p225.jpeg deleted file mode 100644 index 5b6ba64a045a16e8f09c78356fcb2a12a6673d73..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p225.jpeg and /dev/null differ diff --git a/grob_img/grob_p226.jpeg b/grob_img/grob_p226.jpeg deleted file mode 100644 index ec89a7b709fbf6b5e3c514b02bdb437c5390e4a9..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p226.jpeg and /dev/null differ diff --git a/grob_img/grob_p227.jpeg b/grob_img/grob_p227.jpeg deleted file mode 100644 index a8863f2db7c828131e88f23fa6b4c4aa80223e31..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p227.jpeg and /dev/null differ diff --git a/grob_img/grob_p23.jpeg b/grob_img/grob_p23.jpeg deleted file mode 100644 index c3fec4d9e2203506f6b5b2de685c07e837b58984..0000000000000000000000000000000000000000 --- a/grob_img/grob_p23.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb3a31c6adfd36724c6afd9848f3ba8d946c4c543ddb7418278ee9e959643896 -size 117784 diff --git a/grob_img/grob_p24.jpeg b/grob_img/grob_p24.jpeg deleted file mode 100644 index a87d906a38ae730486afc6bd1195048026dff0c8..0000000000000000000000000000000000000000 --- a/grob_img/grob_p24.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff46dfc983cf9560b7dfc01b6970182126b0912ec3e8ca94b65e0a1f7f8ba68e -size 104963 diff --git a/grob_img/grob_p25.jpeg b/grob_img/grob_p25.jpeg deleted file mode 100644 index ef203e49e4a51933cd81416e1c268f38917e4a2e..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p25.jpeg and /dev/null differ diff --git a/grob_img/grob_p26.jpeg b/grob_img/grob_p26.jpeg deleted file mode 100644 index 0be1c452a0f884719c70244ec7c116146b4e371f..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p26.jpeg and /dev/null differ diff --git a/grob_img/grob_p27.jpeg b/grob_img/grob_p27.jpeg deleted file mode 100644 index 92e7e7819348e5ba08ccce90b3d5cbb9aaf699fb..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p27.jpeg and /dev/null differ diff --git a/grob_img/grob_p28.jpeg b/grob_img/grob_p28.jpeg deleted file mode 100644 index c557556d4add14fbc1354082311d5d39200cd095..0000000000000000000000000000000000000000 --- a/grob_img/grob_p28.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18482001d7bc33144f886fbac85d361e64ec2a3b19a1293706af98df42068a95 -size 230364 diff --git a/grob_img/grob_p29.jpeg b/grob_img/grob_p29.jpeg deleted file mode 100644 index 949e6e79a589de72301957ba353721750a2ef019..0000000000000000000000000000000000000000 --- a/grob_img/grob_p29.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:999114bb780d2d4587494c13308fa135aa4470e43b345e9ff0a2a280d906de62 -size 196378 diff --git a/grob_img/grob_p3.jpeg b/grob_img/grob_p3.jpeg deleted file mode 100644 index 4fa3825d30205e54aa031a5ef2799514996812ec..0000000000000000000000000000000000000000 --- a/grob_img/grob_p3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7b02197b61e3f3ff85f024ff8317c2b6733a586d2d7f7b1c61eb34901f45312 -size 392291 diff --git a/grob_img/grob_p30.jpeg b/grob_img/grob_p30.jpeg deleted file mode 100644 index 949e6e79a589de72301957ba353721750a2ef019..0000000000000000000000000000000000000000 --- a/grob_img/grob_p30.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:999114bb780d2d4587494c13308fa135aa4470e43b345e9ff0a2a280d906de62 -size 196378 diff --git a/grob_img/grob_p31.jpeg b/grob_img/grob_p31.jpeg deleted file mode 100644 index 6cd247a6018961420f2088ef8fcf5d12be3461a8..0000000000000000000000000000000000000000 --- a/grob_img/grob_p31.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d36997d5d1cd0c57a58adbace3c7201ea0a958ac7b7f93017509164ce4c99e6 -size 198824 diff --git a/grob_img/grob_p32.jpeg b/grob_img/grob_p32.jpeg deleted file mode 100644 index 6cd247a6018961420f2088ef8fcf5d12be3461a8..0000000000000000000000000000000000000000 --- a/grob_img/grob_p32.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d36997d5d1cd0c57a58adbace3c7201ea0a958ac7b7f93017509164ce4c99e6 -size 198824 diff --git a/grob_img/grob_p33.jpeg b/grob_img/grob_p33.jpeg deleted file mode 100644 index 4e654565f24569253a70517d2a4ca5214f91c910..0000000000000000000000000000000000000000 --- a/grob_img/grob_p33.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e7c2dfea4faade4338ea09ff39fe2c0ed034356bb12e94b42278f2c3aab9e4d -size 150428 diff --git a/grob_img/grob_p34.jpeg b/grob_img/grob_p34.jpeg deleted file mode 100644 index cf374233016e74960bda919c0ae41fc6f98c7ad4..0000000000000000000000000000000000000000 --- a/grob_img/grob_p34.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56328ba516935775e6da4e07bbea240d4626fa9663dff80ca17a7fcba67adf48 -size 126875 diff --git a/grob_img/grob_p35.jpeg b/grob_img/grob_p35.jpeg deleted file mode 100644 index 36bb8bfbb750b4bbc60571d6dc927a63c0a96646..0000000000000000000000000000000000000000 --- a/grob_img/grob_p35.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26fd31b91871a321291eb846749f372cba6ec6c374e146b78637f743585ce4e2 -size 139493 diff --git a/grob_img/grob_p36.jpeg b/grob_img/grob_p36.jpeg deleted file mode 100644 index 36bb8bfbb750b4bbc60571d6dc927a63c0a96646..0000000000000000000000000000000000000000 --- a/grob_img/grob_p36.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26fd31b91871a321291eb846749f372cba6ec6c374e146b78637f743585ce4e2 -size 139493 diff --git a/grob_img/grob_p37.jpeg b/grob_img/grob_p37.jpeg deleted file mode 100644 index 6afaa49312208c17aa19e6ffa6c9d60b2a09be67..0000000000000000000000000000000000000000 --- a/grob_img/grob_p37.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c02d16d2de634a72354e9f6067dd533c49180bf44ea0b1418645e9d6879964a -size 210976 diff --git a/grob_img/grob_p38.jpeg b/grob_img/grob_p38.jpeg deleted file mode 100644 index 6afaa49312208c17aa19e6ffa6c9d60b2a09be67..0000000000000000000000000000000000000000 --- a/grob_img/grob_p38.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c02d16d2de634a72354e9f6067dd533c49180bf44ea0b1418645e9d6879964a -size 210976 diff --git a/grob_img/grob_p39.jpeg b/grob_img/grob_p39.jpeg deleted file mode 100644 index 3535dc9c3011f61b10f2313c3e051e89762a5325..0000000000000000000000000000000000000000 --- a/grob_img/grob_p39.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c547aa43bd1511346e1ebf06a3f1f5caa6195ed320e52044fd61d804fb164a57 -size 118336 diff --git a/grob_img/grob_p4.jpeg b/grob_img/grob_p4.jpeg deleted file mode 100644 index e92bf88daa52f0a1b34539fa1861f99c5b383c05..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p4.jpeg and /dev/null differ diff --git a/grob_img/grob_p40.jpeg b/grob_img/grob_p40.jpeg deleted file mode 100644 index 8c15cf1f6daaf1bb4c895a8dfea7b7d3ce23c984..0000000000000000000000000000000000000000 --- a/grob_img/grob_p40.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0025fc6e2a59692b8f9f879562db5281031296a0c2f88b83c8e130b114577108 -size 173656 diff --git a/grob_img/grob_p41.jpeg b/grob_img/grob_p41.jpeg deleted file mode 100644 index 47db06f90eb465e13ae18959c5bb883091c3782a..0000000000000000000000000000000000000000 --- a/grob_img/grob_p41.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7aa577d1d7f7e3cb7c4b84c8972aa3976dd39f4c632abc05d436e8be969b88da -size 150510 diff --git a/grob_img/grob_p42.jpeg b/grob_img/grob_p42.jpeg deleted file mode 100644 index 37ac8333d74710287cc590473a8ebb7f06fb5c3c..0000000000000000000000000000000000000000 --- a/grob_img/grob_p42.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f3875fc8df9cd1ae2e3f3ba1f6c30e141ca28067f454169682c22c500450679 -size 213916 diff --git a/grob_img/grob_p43.jpeg b/grob_img/grob_p43.jpeg deleted file mode 100644 index 6997ea33b4e3144d9c989d18c3c1c67924117309..0000000000000000000000000000000000000000 --- a/grob_img/grob_p43.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b488b042535c862b57aa927109d1ae1e2fdaf113499038caf711bec63cdf96a3 -size 140448 diff --git a/grob_img/grob_p44.jpeg b/grob_img/grob_p44.jpeg deleted file mode 100644 index 5e2d87ddb4da3b72416034ee34493b9f540ef24a..0000000000000000000000000000000000000000 --- a/grob_img/grob_p44.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86088f712c22e78ee1d416401a62ec5c8d4b3fc9e130637b7a3b0dfd6bae66cc -size 109802 diff --git a/grob_img/grob_p45.jpeg b/grob_img/grob_p45.jpeg deleted file mode 100644 index 82bf7ebf13a5bcf81e2e6fd136e66e6d7485d9d7..0000000000000000000000000000000000000000 --- a/grob_img/grob_p45.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94270611fa168a2936e2bd0756c3ac58fb4924e43bf2c227783c3addc3c83719 -size 239434 diff --git a/grob_img/grob_p46.jpeg b/grob_img/grob_p46.jpeg deleted file mode 100644 index 1cd39100ffb9c9e417873ffc1f92c4bd1bb31b23..0000000000000000000000000000000000000000 --- a/grob_img/grob_p46.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c1c49c9ad33826fff5c19e51da5d70bb217c416977b05697f6dd2dbda49bccd -size 143586 diff --git a/grob_img/grob_p47.jpeg b/grob_img/grob_p47.jpeg deleted file mode 100644 index 4062f657cbb5fdd7facbfb30580b30a5a441a7ce..0000000000000000000000000000000000000000 --- a/grob_img/grob_p47.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64881e17c7594bd379625ed4429d7cd0b6d2952a08d45179131dbab7b64083f8 -size 161542 diff --git a/grob_img/grob_p48.jpeg b/grob_img/grob_p48.jpeg deleted file mode 100644 index 4062f657cbb5fdd7facbfb30580b30a5a441a7ce..0000000000000000000000000000000000000000 --- a/grob_img/grob_p48.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64881e17c7594bd379625ed4429d7cd0b6d2952a08d45179131dbab7b64083f8 -size 161542 diff --git a/grob_img/grob_p49.jpeg b/grob_img/grob_p49.jpeg deleted file mode 100644 index d515ce2ac4ba83699856e03cf1165bee7b6baecc..0000000000000000000000000000000000000000 --- a/grob_img/grob_p49.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9771d25f7c17feeb0d9742622ee39e2c213a3f5fe5ac8a8612256746547b3899 -size 153041 diff --git a/grob_img/grob_p5.jpeg b/grob_img/grob_p5.jpeg deleted file mode 100644 index 5c12fe07942a024039b4316fa18f4ae12d26d79e..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p5.jpeg and /dev/null differ diff --git a/grob_img/grob_p50.jpeg b/grob_img/grob_p50.jpeg deleted file mode 100644 index c46f08175e76f764083a37acf7ac95c63fdb7d72..0000000000000000000000000000000000000000 --- a/grob_img/grob_p50.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3d38cfa13c00bdb9f85ef47877166aee9dfa49473f195811e08241f1007bd18 -size 118446 diff --git a/grob_img/grob_p51.jpeg b/grob_img/grob_p51.jpeg deleted file mode 100644 index fa7cf1157cb0b65c1edaa6870360d036a68f6da9..0000000000000000000000000000000000000000 --- a/grob_img/grob_p51.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ee1a7de4ec9664a42f13c3c5b82b1a91315082f04c941361413439baa24507a -size 120173 diff --git a/grob_img/grob_p52.jpeg b/grob_img/grob_p52.jpeg deleted file mode 100644 index 4ac1d84df676496beefc48cdf8ce982794aa1c3a..0000000000000000000000000000000000000000 --- a/grob_img/grob_p52.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bad2ac47c6215b8121e938b1ad8b7aa301117a3b2a8685b799a44c4b41b74e9 -size 147273 diff --git a/grob_img/grob_p53.jpeg b/grob_img/grob_p53.jpeg deleted file mode 100644 index 18b58e207997d3b5fdb1b20cb42c37d2dde71a5b..0000000000000000000000000000000000000000 --- a/grob_img/grob_p53.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35f0e0db8ce642f1ff77adaefebf3725ccc3d9206bf9eccfbe43d5ce9fedaa19 -size 170125 diff --git a/grob_img/grob_p54.jpeg b/grob_img/grob_p54.jpeg deleted file mode 100644 index 94fe280df32322440cd8738cc69cef5a2a4cbad1..0000000000000000000000000000000000000000 --- a/grob_img/grob_p54.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fc5b7bef1965336b7d938f9c86d8527442d0f915726ff2d8d7bc7da60a69f63 -size 168130 diff --git a/grob_img/grob_p55.jpeg b/grob_img/grob_p55.jpeg deleted file mode 100644 index 94fe280df32322440cd8738cc69cef5a2a4cbad1..0000000000000000000000000000000000000000 --- a/grob_img/grob_p55.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fc5b7bef1965336b7d938f9c86d8527442d0f915726ff2d8d7bc7da60a69f63 -size 168130 diff --git a/grob_img/grob_p56.jpeg b/grob_img/grob_p56.jpeg deleted file mode 100644 index 2528151dc0af22447076a7d1c44b7181f2511e53..0000000000000000000000000000000000000000 --- a/grob_img/grob_p56.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5add90f9003018c819b874407e953762595d6c3d9beab734ae8977c78e41cd46 -size 126056 diff --git a/grob_img/grob_p57.jpeg b/grob_img/grob_p57.jpeg deleted file mode 100644 index 3c1eb871422bb5d26f00687bad0f2b3f8d5a9dd7..0000000000000000000000000000000000000000 --- a/grob_img/grob_p57.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d329d3e7e7a1c7a5ab6aa930b979db52f0ee68fc4d286943495defde5c595231 -size 157451 diff --git a/grob_img/grob_p58.jpeg b/grob_img/grob_p58.jpeg deleted file mode 100644 index 0dab7c3249106921e3c5e98713fab208b6729d4d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p58.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43cc9cfcd62ec9ab665060c1fd359ea48ef190a4a02f3112e0c7858d087db0c6 -size 134372 diff --git a/grob_img/grob_p59.jpeg b/grob_img/grob_p59.jpeg deleted file mode 100644 index c08d7b567c6d479bf45b6226a361b4a65337c18d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p59.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56d8513a901de7f05edab3502a94f13f0c0a5a0e29c248ba7b2fcea510ad039c -size 162853 diff --git a/grob_img/grob_p6.jpeg b/grob_img/grob_p6.jpeg deleted file mode 100644 index 0fe2651ff939a6d779b0f91ddd68b949c7fa5c1e..0000000000000000000000000000000000000000 --- a/grob_img/grob_p6.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:959cdc946805fd8699f62e3a82592d827e39afc356d783fe0247678db251cd90 -size 125686 diff --git a/grob_img/grob_p60.jpeg b/grob_img/grob_p60.jpeg deleted file mode 100644 index ab0eab5bda5d3ed6ddb26da21e4a559da18ea61d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p60.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc13c37c4f8f2f9a128e03f48eba6b3b1e0a123fae52e02e5f738ce651d3464c -size 178638 diff --git a/grob_img/grob_p61.jpeg b/grob_img/grob_p61.jpeg deleted file mode 100644 index 3618acb4aa4198064603f75a5a513d07d8f8fb91..0000000000000000000000000000000000000000 --- a/grob_img/grob_p61.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c51b2806801aae5e9025d810860bdd54d420910e2a3e7ce232ee7f4139bec831 -size 237813 diff --git a/grob_img/grob_p62.jpeg b/grob_img/grob_p62.jpeg deleted file mode 100644 index 4ac1d84df676496beefc48cdf8ce982794aa1c3a..0000000000000000000000000000000000000000 --- a/grob_img/grob_p62.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bad2ac47c6215b8121e938b1ad8b7aa301117a3b2a8685b799a44c4b41b74e9 -size 147273 diff --git a/grob_img/grob_p63.jpeg b/grob_img/grob_p63.jpeg deleted file mode 100644 index 4ac1d84df676496beefc48cdf8ce982794aa1c3a..0000000000000000000000000000000000000000 --- a/grob_img/grob_p63.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bad2ac47c6215b8121e938b1ad8b7aa301117a3b2a8685b799a44c4b41b74e9 -size 147273 diff --git a/grob_img/grob_p64.jpeg b/grob_img/grob_p64.jpeg deleted file mode 100644 index 94fe280df32322440cd8738cc69cef5a2a4cbad1..0000000000000000000000000000000000000000 --- a/grob_img/grob_p64.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fc5b7bef1965336b7d938f9c86d8527442d0f915726ff2d8d7bc7da60a69f63 -size 168130 diff --git a/grob_img/grob_p65.jpeg b/grob_img/grob_p65.jpeg deleted file mode 100644 index 94fe280df32322440cd8738cc69cef5a2a4cbad1..0000000000000000000000000000000000000000 --- a/grob_img/grob_p65.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fc5b7bef1965336b7d938f9c86d8527442d0f915726ff2d8d7bc7da60a69f63 -size 168130 diff --git a/grob_img/grob_p66.jpeg b/grob_img/grob_p66.jpeg deleted file mode 100644 index 2528151dc0af22447076a7d1c44b7181f2511e53..0000000000000000000000000000000000000000 --- a/grob_img/grob_p66.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5add90f9003018c819b874407e953762595d6c3d9beab734ae8977c78e41cd46 -size 126056 diff --git a/grob_img/grob_p67.jpeg b/grob_img/grob_p67.jpeg deleted file mode 100644 index 3c1eb871422bb5d26f00687bad0f2b3f8d5a9dd7..0000000000000000000000000000000000000000 --- a/grob_img/grob_p67.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d329d3e7e7a1c7a5ab6aa930b979db52f0ee68fc4d286943495defde5c595231 -size 157451 diff --git a/grob_img/grob_p68.jpeg b/grob_img/grob_p68.jpeg deleted file mode 100644 index 0334e5607e3ee5b9a51ed915f4b20d2286ba2565..0000000000000000000000000000000000000000 --- a/grob_img/grob_p68.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e5144be13786ed1e1dd2921ad01fe826b6cd69791d4f1dfae3b7900e3759336 -size 205740 diff --git a/grob_img/grob_p69.jpeg b/grob_img/grob_p69.jpeg deleted file mode 100644 index c08d7b567c6d479bf45b6226a361b4a65337c18d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p69.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56d8513a901de7f05edab3502a94f13f0c0a5a0e29c248ba7b2fcea510ad039c -size 162853 diff --git a/grob_img/grob_p7.jpeg b/grob_img/grob_p7.jpeg deleted file mode 100644 index 0fe2651ff939a6d779b0f91ddd68b949c7fa5c1e..0000000000000000000000000000000000000000 --- a/grob_img/grob_p7.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:959cdc946805fd8699f62e3a82592d827e39afc356d783fe0247678db251cd90 -size 125686 diff --git a/grob_img/grob_p70.jpeg b/grob_img/grob_p70.jpeg deleted file mode 100644 index ab0eab5bda5d3ed6ddb26da21e4a559da18ea61d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p70.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc13c37c4f8f2f9a128e03f48eba6b3b1e0a123fae52e02e5f738ce651d3464c -size 178638 diff --git a/grob_img/grob_p71.jpeg b/grob_img/grob_p71.jpeg deleted file mode 100644 index ab0eab5bda5d3ed6ddb26da21e4a559da18ea61d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p71.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc13c37c4f8f2f9a128e03f48eba6b3b1e0a123fae52e02e5f738ce651d3464c -size 178638 diff --git a/grob_img/grob_p72.jpeg b/grob_img/grob_p72.jpeg deleted file mode 100644 index 3f0b8c8f35ab984add5e4badd5c6af8eeff8f21d..0000000000000000000000000000000000000000 --- a/grob_img/grob_p72.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ee0ad048f8e5aa8d8bbf6def0c5f00f5f894506910e7433e36e9912ada0208c -size 142877 diff --git a/grob_img/grob_p73.jpeg b/grob_img/grob_p73.jpeg deleted file mode 100644 index c9a8fc3805b507209e7e69b920649e18d9a7cebe..0000000000000000000000000000000000000000 --- a/grob_img/grob_p73.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:490f403b64c4ea6d7c4b19211f600d699ccfd114825f208d04156da6fd575a33 -size 109818 diff --git a/grob_img/grob_p74.jpeg b/grob_img/grob_p74.jpeg deleted file mode 100644 index 0b6378e206d7467a99237d9c51e918770f38cb25..0000000000000000000000000000000000000000 --- a/grob_img/grob_p74.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f883d97bc73aadaa8b16198cb9a252c5490ed7e89d8fa5f348b71ce10f0cdc2 -size 160968 diff --git a/grob_img/grob_p75.jpeg b/grob_img/grob_p75.jpeg deleted file mode 100644 index 455144c1857f84fd216aeb7ae221442f5bc0df90..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p75.jpeg and /dev/null differ diff --git a/grob_img/grob_p76.jpeg b/grob_img/grob_p76.jpeg deleted file mode 100644 index aea40ec393bcde799987dc1759d795cb6ea7e8ea..0000000000000000000000000000000000000000 --- a/grob_img/grob_p76.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cac26f8b80b87b6eeb0348507a5a4c9d1dcad8d009ade34fdcbde73f0e3504f -size 186744 diff --git a/grob_img/grob_p77.jpeg b/grob_img/grob_p77.jpeg deleted file mode 100644 index b0149c8f9e4efc9c6ef2a8a8da5d6d4ade9c42a3..0000000000000000000000000000000000000000 --- a/grob_img/grob_p77.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0d717a8de7d3fa1d4057e731bcf2985ce6339ead2d6f467432566a014e3dac0 -size 326646 diff --git a/grob_img/grob_p78.jpeg b/grob_img/grob_p78.jpeg deleted file mode 100644 index b0149c8f9e4efc9c6ef2a8a8da5d6d4ade9c42a3..0000000000000000000000000000000000000000 --- a/grob_img/grob_p78.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0d717a8de7d3fa1d4057e731bcf2985ce6339ead2d6f467432566a014e3dac0 -size 326646 diff --git a/grob_img/grob_p79.jpeg b/grob_img/grob_p79.jpeg deleted file mode 100644 index b0149c8f9e4efc9c6ef2a8a8da5d6d4ade9c42a3..0000000000000000000000000000000000000000 --- a/grob_img/grob_p79.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0d717a8de7d3fa1d4057e731bcf2985ce6339ead2d6f467432566a014e3dac0 -size 326646 diff --git a/grob_img/grob_p8.jpeg b/grob_img/grob_p8.jpeg deleted file mode 100644 index 0fe2651ff939a6d779b0f91ddd68b949c7fa5c1e..0000000000000000000000000000000000000000 --- a/grob_img/grob_p8.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:959cdc946805fd8699f62e3a82592d827e39afc356d783fe0247678db251cd90 -size 125686 diff --git a/grob_img/grob_p80.jpeg b/grob_img/grob_p80.jpeg deleted file mode 100644 index 8dba67227045c834ce53e9acc3a26372913ef72c..0000000000000000000000000000000000000000 --- a/grob_img/grob_p80.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78b9bdd94a3c07151a3f7bd5783f7305576d0a940e5faf70ce4ae979004bff32 -size 317018 diff --git a/grob_img/grob_p81.jpeg b/grob_img/grob_p81.jpeg deleted file mode 100644 index 74bcb169a3bfe5ee1381cafb38a9b58e6592b7cd..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p81.jpeg and /dev/null differ diff --git a/grob_img/grob_p82.jpeg b/grob_img/grob_p82.jpeg deleted file mode 100644 index a53de647636cb04d7a65a7f1df6a7e15d4335e5b..0000000000000000000000000000000000000000 --- a/grob_img/grob_p82.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abe4a282d9bd666fd2cf94402e07e38bfce48c58b9b9d81c3f3aca93c69ac08f -size 147214 diff --git a/grob_img/grob_p83.jpeg b/grob_img/grob_p83.jpeg deleted file mode 100644 index a53de647636cb04d7a65a7f1df6a7e15d4335e5b..0000000000000000000000000000000000000000 --- a/grob_img/grob_p83.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abe4a282d9bd666fd2cf94402e07e38bfce48c58b9b9d81c3f3aca93c69ac08f -size 147214 diff --git a/grob_img/grob_p84.jpeg b/grob_img/grob_p84.jpeg deleted file mode 100644 index bf183eb9c01380b4d6474f956ec5d40b51bfe25c..0000000000000000000000000000000000000000 --- a/grob_img/grob_p84.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fef7ed716458bcf099e78705231f43cf90e6771e9efab4137978dc97a5dad228 -size 106049 diff --git a/grob_img/grob_p85.jpeg b/grob_img/grob_p85.jpeg deleted file mode 100644 index 5afa82c4af81021aabbeec4dd4eae232b218bed6..0000000000000000000000000000000000000000 --- a/grob_img/grob_p85.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd9796f90631234a33f335ca78443b967556c5647c630bfd558e2976db85f32d -size 145178 diff --git a/grob_img/grob_p86.jpeg b/grob_img/grob_p86.jpeg deleted file mode 100644 index 408c6678f28b9afbaa1c049c703cce4320b69f84..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p86.jpeg and /dev/null differ diff --git a/grob_img/grob_p87.jpeg b/grob_img/grob_p87.jpeg deleted file mode 100644 index ac7772387e5ac1faf755bdc67f4f76d130c3031c..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p87.jpeg and /dev/null differ diff --git a/grob_img/grob_p88.jpeg b/grob_img/grob_p88.jpeg deleted file mode 100644 index e5d72e7ad835060c6e0bfe6a055c9f9361cc3a31..0000000000000000000000000000000000000000 --- a/grob_img/grob_p88.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d64a7031bfe0fab3e5168ae15d71668b363abde83d48e781fb81681f01dffd4c -size 144680 diff --git a/grob_img/grob_p89.jpeg b/grob_img/grob_p89.jpeg deleted file mode 100644 index efcc349195ffda331b008a4d2d4040c26615dd3f..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p89.jpeg and /dev/null differ diff --git a/grob_img/grob_p9.jpeg b/grob_img/grob_p9.jpeg deleted file mode 100644 index f0f38eefe1fd3d6b1c70ca08d745f6088b1b42d2..0000000000000000000000000000000000000000 --- a/grob_img/grob_p9.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d48cb1caeba1d349cad483262e10f401f5a0ef075d41f4f5867e565934ce46d8 -size 161952 diff --git a/grob_img/grob_p92.jpeg b/grob_img/grob_p92.jpeg deleted file mode 100644 index dfd2247647d4c8722048182c3dbc0174f4cdefa7..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p92.jpeg and /dev/null differ diff --git a/grob_img/grob_p93.jpeg b/grob_img/grob_p93.jpeg deleted file mode 100644 index c341563a37b8555c56213169e61ebeef1351aa43..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p93.jpeg and /dev/null differ diff --git a/grob_img/grob_p94.jpeg b/grob_img/grob_p94.jpeg deleted file mode 100644 index 95e310e7f9bb81501b19d75db0373f3cd164f65f..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p94.jpeg and /dev/null differ diff --git a/grob_img/grob_p95.jpeg b/grob_img/grob_p95.jpeg deleted file mode 100644 index ac558a2d7883fa656a60d2200e14f2827e2f3e4c..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p95.jpeg and /dev/null differ diff --git a/grob_img/grob_p96.jpeg b/grob_img/grob_p96.jpeg deleted file mode 100644 index b572aaa7f2a4892a174d234e38e5429f826f5707..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p96.jpeg and /dev/null differ diff --git a/grob_img/grob_p97.jpeg b/grob_img/grob_p97.jpeg deleted file mode 100644 index fec97402c7f8ba4eb7a585e15abd8e5f0a62ade0..0000000000000000000000000000000000000000 --- a/grob_img/grob_p97.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1746598b599ca71903c789a306be1c75148409ee9dc0504fb95da7dae84c048 -size 260021 diff --git a/grob_img/grob_p98.jpeg b/grob_img/grob_p98.jpeg deleted file mode 100644 index fec97402c7f8ba4eb7a585e15abd8e5f0a62ade0..0000000000000000000000000000000000000000 --- a/grob_img/grob_p98.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1746598b599ca71903c789a306be1c75148409ee9dc0504fb95da7dae84c048 -size 260021 diff --git a/grob_img/grob_p99.jpeg b/grob_img/grob_p99.jpeg deleted file mode 100644 index cef7236ef0abb673ed8fe96f1e002cf35db2748c..0000000000000000000000000000000000000000 Binary files a/grob_img/grob_p99.jpeg and /dev/null differ diff --git a/index-excel-fixed.html b/index-excel-fixed.html index ff93e9d88f24e2943ea0591260ce876ba842e756..4a8f0e5f9c07e3ed8796a076666046777c8650c1 100644 --- a/index-excel-fixed.html +++ b/index-excel-fixed.html @@ -122,7 +122,7 @@ body{font-family:'Inter',system-ui,sans-serif;color:var(--d);background:var(--l) .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-modal{border-radius:12px}.cart-drawer{width:100%;max-width:100%}} +@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%}} @@ -130,23 +130,59 @@ body{font-family:'Inter',system-ui,sans-serif;color:var(--d);background:var(--l)
- +
V.AI STUDIO

V.AI STUDIO

Thiết bị nhà bếp & khóa thông minh — Malloca, Eurogold, Grob, Canzy & Demax

Giỏ hàng

-

BẢNG BÁO GIÁ

Khách hàng:
STTHìnhTên SPMã SPSLĐơn giáCKThành tiềnGhi chú
TỔNG CỘNG
+

BÁO GIÁ

STTHìnhTên SPMã SPSLĐơn giáCKThành tiềnGhi chú
- - + + - - + + + \ No newline at end of file diff --git a/index.html b/index.html index 2f23c1334c741d4915c5d547c5fd869065a9d38a..641741462e4b98cfcdfc3b370b1633041ec45288 100644 --- a/index.html +++ b/index.html @@ -1 +1,184 @@ -$(cat /app/vstudio/index.html) \ No newline at end of file + + + + + +V.AI STUDIO | Niềm tin khách hàng là tài sản của chúng tôi + + + + + + + + + +
Miễn phí vận chuyển
Bảo hành chính hãng
Hỗ trợ 24/7
+
+ + + +
+
V.AI STUDIO

V.AI STUDIO

Thiết bị nhà bếp & khóa thông minh — Malloca, Eurogold, Grob, Canzy & Demax

+
+

Giỏ hàng

+

BÁO GIÁ

STTHìnhTên SPMã SPSLĐơn giáCKThành tiềnGhi chú
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/order-store.js b/order-store.js index e7cab45833f8f066da52ab2c2b7bfd39a484a4dc..ebb0438b4daa38bed90831b189d750408c5d272e 100644 --- a/order-store.js +++ b/order-store.js @@ -1,13 +1,9 @@ /** - * V.AI STUDIO — Order Store v19.3 - * FIX TRIỆT ĐỂ (v19.3): - * - saveCurrentOrder: lưu date từ input khách hàng (không để trống ngày đơn) - * - orderToVAIData: productTotal = tổng tiền SP (KHÔNG trừ phí); lấy notes từ order.notes (ưu tiên) rồi qd.notes - * - openOrderDetail: thêm cột Ghi chú vào bảng; lấy date từ input; luôn recalc trước export - * - parsePrompt: 'Malloca ck 35%' detected as global discount; 'ghi chú: giao thứ 7' = note - * - exportExcel: Truyền đúng tham số d,qd,code,qr cho _doExportExcel (4 tham số) - * - FIX: null-safe event handlers in render() — close button (#xc) and search panel (#od-sp-close, #od-sp-search) - * - FIX BUG: modal close button on "Thêm sản phẩm" — use event delegation on modal so close works after innerHTML rebuild + * V.AI STUDIO — Order Store v19 + * + * CHANGES from v18: + * - ADD PRODUCT TO ORDER: Nút "➕ Thêm SP" trong modal sửa đơn + * → Hiện thanh tìm kiếm SP → Chọn SP → Tự động thêm vào đơn + lưu */ (function(){ 'use strict'; @@ -62,10 +58,10 @@ function syncFromServer(){ }); if(added>0){ saveOrders(localOrders); - console.log('[OS v19.3] ☁️ Synced '+added+' orders from server. Total local: '+localOrders.length); + console.log('[OS v19] ☁️ Synced '+added+' orders from server. Total local: '+localOrders.length); } }).catch(function(e){ - console.log('[OS v19.3] Server sync skip (bot may be sleeping)'); + console.log('[OS v19] Server sync skip (bot may be sleeping)'); }); } // Sync from server 3s after page load (give bot time to wake up) @@ -81,14 +77,14 @@ function processQueue(){ var q=getQueue();if(!q.length)return; var item=q[0]; fetch(KETOAN_API+item.endpoint,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(item.payload)}) - .then(function(r){if(r.ok){q.shift();saveQueue(q);console.log('[OS v19.3] Queue sync OK: '+item.endpoint+' ('+q.length+' remaining)');if(q.length)setTimeout(processQueue,2000);}else throw new Error('HTTP '+r.status);}) + .then(function(r){if(r.ok){q.shift();saveQueue(q);console.log('[OS v19] Queue sync OK: '+item.endpoint+' ('+q.length+' remaining)');if(q.length)setTimeout(processQueue,2000);}else throw new Error('HTTP '+r.status);}) .catch(function(){item.attempts=(item.attempts||0)+1;if(item.attempts>50){q.shift();}saveQueue(q);}); } setInterval(processQueue,30000); setTimeout(processQueue,5000); function syncOrderToBot(order){ - var payload={ma_don:order.code,khach:order.customer||'',dien_thoai:order.phone||'',dia_chi:order.addr||'',items:(order.items||[]).map(function(it){return{ma:it.model||'',model:it.model||'',ten:it.name||'',name:it.name||'',brand:it.brand||'',image:resolveOrderItemImage(it),img:it.image||it.img||'',specs:orderItemInfo(it),info:orderItemInfo(it),dim_info:orderItemInfo(it),sl:it.qty||1,qty:it.qty||1,gia_ban:it.discPrice||it.price||0,price:it.listPrice||it.originalPrice||it.price||0,discPrice:it.discPrice||it.price||0};}),fees:order.fees||[],grandTotal:order.grandTotal||0,deposit:order.deposit||0,remaining:order.remaining||0,discountPercent:order.discountPercent||0,itemDiscounts:order.itemDiscounts||{},email:order.email||'',date:order.date||'',notes:order.notes||[],status:order.status||'pending',savedAt:order.savedAt||new Date().toISOString()}; + var payload={ma_don:order.code,khach:order.customer||'',dien_thoai:order.phone||'',dia_chi:order.addr||'',items:(order.items||[]).map(function(it){return{ma:it.model||'',model:it.model||'',ten:it.name||'',name:it.name||'',brand:it.brand||'',image:resolveOrderItemImage(it),img:it.image||it.img||'',specs:orderItemInfo(it),info:orderItemInfo(it),dim_info:orderItemInfo(it),sl:it.qty||1,qty:it.qty||1,gia_ban:it.discPrice||it.price||0,price:it.listPrice||it.originalPrice||it.price||0,discPrice:it.discPrice||it.price||0};}),fees:order.fees||[],grandTotal:order.grandTotal||0,deposit:order.deposit||0,remaining:order.remaining||0,discountPercent:order.discountPercent||0,itemDiscounts:order.itemDiscounts||{},email:order.email||'',date:order.date||'',status:order.status||'pending',savedAt:order.savedAt||new Date().toISOString()}; if(order.confirmedAt)payload.confirmedAt=order.confirmedAt; fetch(KETOAN_API+'/order-saved',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)}) .then(function(r){if(!r.ok)throw new Error();return r.json();}) @@ -96,7 +92,7 @@ function syncOrderToBot(order){ } function sendToKetoanBot(order){ - var payload={ma_don:order.code,khach:order.customer||'',dien_thoai:order.phone||'',dia_chi:order.addr||'',items:(order.items||[]).map(function(it){return{ma:it.model||'',model:it.model||'',ten:it.name||'',name:it.name||'',brand:it.brand||'',image:resolveOrderItemImage(it),img:it.image||it.img||'',specs:orderItemInfo(it),info:orderItemInfo(it),dim_info:orderItemInfo(it),sl:it.qty||1,qty:it.qty||1,gia_ban:it.discPrice||it.price||0,price:it.listPrice||it.originalPrice||it.price||0,discPrice:it.discPrice||it.price||0};}),fees:order.fees||[],grandTotal:order.grandTotal||0,deposit:order.deposit||0,remaining:order.remaining||0,discountPercent:order.discountPercent||0,itemDiscounts:order.itemDiscounts||{},confirmedAt:order.confirmedAt||new Date().toISOString(),email:order.email||'',date:order.date||'',notes:order.notes||[],}; + var payload={ma_don:order.code,khach:order.customer||'',dien_thoai:order.phone||'',dia_chi:order.addr||'',items:(order.items||[]).map(function(it){return{ma:it.model||'',model:it.model||'',ten:it.name||'',name:it.name||'',brand:it.brand||'',image:resolveOrderItemImage(it),img:it.image||it.img||'',specs:orderItemInfo(it),info:orderItemInfo(it),dim_info:orderItemInfo(it),sl:it.qty||1,qty:it.qty||1,gia_ban:it.discPrice||it.price||0,price:it.listPrice||it.originalPrice||it.price||0,discPrice:it.discPrice||it.price||0};}),fees:order.fees||[],grandTotal:order.grandTotal||0,deposit:order.deposit||0,remaining:order.remaining||0,discountPercent:order.discountPercent||0,itemDiscounts:order.itemDiscounts||{},confirmedAt:order.confirmedAt||new Date().toISOString(),email:order.email||'',date:order.date||''}; fetch(KETOAN_API+'/order-confirmed',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)}) .then(function(r){if(!r.ok)throw new Error();return r.json();}) .then(function(d){if(d.ok&&typeof showToast==='function')showToast('📨 Đã gửi kế toán!');}) @@ -135,33 +131,26 @@ function orderItemInfo(it){it=it||{};return formatInfoVal(it.info||it.thong_tin| function compactKey(s){return (s||'').toString().normalize('NFD').replace(/[̀-ͯ]/g,'').replace(/[đĐ]/g,'d').toLowerCase().replace(/[^a-z0-9]/g,'');} function itemKeys(it){var arr=[];['model','sku','code','ma','name'].forEach(function(k){if(it&&it[k])arr.push(compactKey(it[k]));});if(it&&it.name){String(it.name).split('|').forEach(function(x){arr.push(compactKey(x));});}return arr.filter(function(x){return x&&x.length>=3;});} function matchItemDiscount(it,itemDiscounts){itemDiscounts=itemDiscounts||{};var keys=itemKeys(it);for(var i=0;i=3&&k.length>=3&&(k.indexOf(code)!==-1||code.indexOf(k)!==-1))return itemDiscounts[code];}}return 0;} -function parseItemDiscountLine(line,map){var lo=(line||'').toString().normalize('NFD').replace(/[̀-ͯ]/g,'').replace(/[đĐ]/g,'d').toLowerCase();var re1=/\b([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\b\s*(?:[:=\-]|\s+)?\s*(?:ck|chiet\s*khau|giam|discount)\s*([\d.,]+)\s*%?/gi;var re2=/(?:ck|chiet\s*khau|giam|discount)\s*\b([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\b\s*([\d.,]+)\s*%?/gi;var m;while((m=re1.exec(lo))!==null){var v=parseFloat(m[2].replace(/\./g,'').replace(',','.'));if(v>0&&v<=100)map[compactKey(m[1])]=v;}while((m=re2.exec(lo))!==null){var v2=parseFloat(m[2].replace(/\./g,'').replace(',','.'));if(v2>0&&v2<=100)map[compactKey(m[1])]=v2;}} +function parseItemDiscountLine(line,map){var lo=(line||'').toString().normalize('NFD').replace(/[̀-ͯ]/g,'').replace(/[đĐ]/g,'d').toLowerCase();var re1=/([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\s*(?:[:=\-]|\s+)?\s*(?:ck|chiet\s*khau|giam|discount)\s*([\d.,]+)\s*%?/gi;var re2=/(?:ck|chiet\s*khau|giam|discount)\s*([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\s*([\d.,]+)\s*%?/gi;var m;while((m=re1.exec(lo))!==null){var v=parseFloat(m[2].replace(/\./g,'').replace(',','.'));if(v>0&&v<=100)map[compactKey(m[1])]=v;}while((m=re2.exec(lo))!==null){var v2=parseFloat(m[2].replace(/\./g,'').replace(',','.'));if(v2>0&&v<=100)map[compactKey(m[1])]=v2;}} function esc(s){return(s||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"');} function parsePrompt(text){ - var fees=[],deposit=0,discountPercent=0,notes=[],itemDiscounts={}; - if(!text)return{fees:fees,deposit:deposit,discountPercent:discountPercent,notes:notes,itemDiscounts:itemDiscounts}; - text.split(/[,;\n]+/).forEach(function(line){ + var fees=[],deposit=0,discountPercent=0,note='',itemDiscounts={}; + if(!text)return{fees:fees,deposit:deposit,discountPercent:discountPercent,note:note,itemDiscounts:itemDiscounts}; + text.split(/[,; +]+/).forEach(function(line){ line=line.trim();if(!line)return; parseItemDiscountLine(line,itemDiscounts); - if(Object.keys(itemDiscounts).length&&line.match(/\b[A-Za-z]{1,8}[A-Za-z0-9._\-\/]{1,30}\d[A-Za-z0-9._\-\/]*\b/i)&&line.match(/\b(ck|chiết khấu|chiet khau|giảm|giam|discount)\b/i))return; + if(Object.keys(itemDiscounts).length&&line.match(/[A-Za-z]{1,8}[A-Za-z0-9._\-\/]{1,30}\d[A-Za-z0-9._\-\/]*/i)&&line.match(/(ck|chiết khấu|chiet khau|giảm|giam|discount)/i))return; var lo=line.toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g,'').replace(/[đĐ]/g,'d'); - // Ghi chú (FIX: always extract text after prefix, never parse numbers) - if(lo.match(/^(ghi chu|note|luu y)/)){notes.push(line.replace(/^(ghi chú|ghi chu|note|lưu ý|luu y)[:\s]*/i,'').trim());return;} - // CK (FIX: also match 'WORD ck X%') + // Ghi chú + if(lo.match(/^(ghi chu|note|luu y)/)){note=line.replace(/^(ghi chú|ghi chu|note|lưu ý|luu y)[:\s]*/i,'').trim();return;} + // CK var ck=lo.match(/^(ck|chiet khau|giam|discount)\s*([\d.,]+)\s*(%|k|tr)?/); if(ck){var v=parseFloat(ck[2].replace(/\./g,'').replace(',','.'));if((!ck[3]||ck[3]===''||ck[3]==='%')&&v>0&&v<=100)discountPercent=v;return;} - var ck2=lo.match(/\bck\s*([\d.,]+)\s*(%)?/); - if(ck2&&!lo.match(/\b(ck|chiet khau|giam|discount)\s*[a-z]/)){var v2=parseFloat(ck2[1].replace(/\./g,'').replace(',','.'));if(v2>0&&v2<=100){discountPercent=v2;return;}} // Cọc - if(lo.match(/coc|dat coc|deposit/)){var dm=lo.match(/([\d.,]+)\s*(k|tr|trieu|%)?/);if(dm){var a=parseFloat(dm[1].replace(/\./g,'').replace(',','.'));var u2=(dm[2]||'').toLowerCase();if(u2==='%'){deposit=a;}else{if(u2==='k')a*=1000;if(u2==='tr'||u2==='trieu')a*=1000000;deposit=a;}}return;} - // FIX: "giao thứ X" / "lắp thứ X" = note about delivery day - if(lo.match(/(giao|lap)\s*thu\s*\d/i)){ - var dayMatch = lo.match(/(giao|lap)\s*thu\s*(\d+)/i); - if(dayMatch) {notes.push('Giao thứ ' + dayMatch[2]);} - return; - } + if(lo.match(/coc|dat coc|deposit/)){var dm=lo.match(/([\d.,]+)\s*(k|tr|trieu|%)?/);if(dm){var a=parseFloat(dm[1].replace(/\./g,'').replace(',','.'));var u2=(dm[2]||'').toLowerCase();if(u2==='%'){deposit=a;/* percent handled separately */}else{if(u2==='k')a*=1000;if(u2==='tr'||u2==='trieu')a*=1000000;deposit=a;}}return;} // Phụ phí: giao hàng, lắp đặt, vận chuyển, phí khác - var feeMatch=lo.match(/^(giao hang|giao|lap dat|lap|van chuyen|ship|phi giao|phi khac|phu phi|phi)\s*([\d.,]+)\s*(k|tr|trieu|m|nghin)?/); + var feeMatch=lo.match(/^(giao hang|giao|lap dat|lap|van chuyen|ship|phi giao|phi lap|phi khac|phu phi|phi)\s*([\d.,]+)\s*(k|tr|trieu|m|nghin)?/); if(feeMatch){ var amt=parseFloat(feeMatch[2].replace(/\./g,'').replace(',','.')); var u=(feeMatch[3]||'').toLowerCase(); @@ -170,104 +159,37 @@ function parsePrompt(text){ fees.push({label:labelMap[feeMatch[1]]||'Phụ phí',amount:amt}); return; } - // Fallback: line with number (skip if looks like day note) + // Fallback: line with number var m=lo.match(/([\d.,]+)\s*(k|tr|trieu|m|nghin)?/); - if(m && !lo.match(/thu\s*(\d|$)/i)){ - var amt2=parseFloat(m[1].replace(/\./g,'').replace(',','.'));var u3=(m[2]||'').toLowerCase();if(u3==='k'||u3==='nghin')amt2*=1000;if(u3==='tr'||u3==='trieu'||u3==='m')amt2*=1000000;if(amt2>0){ - var lb=line.replace(m[0],'').trim(); - if(!lb||lb.length<2)lb='Phụ phí';fees.push({label:lb,amount:amt2}); - }} + if(m){var amt2=parseFloat(m[1].replace(/\./g,'').replace(',','.'));var u3=(m[2]||'').toLowerCase();if(u3==='k'||u3==='nghin')amt2*=1000;if(u3==='tr'||u3==='trieu'||u3==='m')amt2*=1000000;if(amt2>0){var lb=line.replace(m[0],'').trim();if(!lb||lb.length<2)lb='Phụ phí';fees.push({label:lb,amount:amt2});}} }); - return{fees:fees,deposit:deposit,discountPercent:discountPercent,notes:notes,itemDiscounts:itemDiscounts}; + return{fees:fees,deposit:deposit,discountPercent:discountPercent,note:note,itemDiscounts:itemDiscounts}; } function applyDiscount(order){var pct=order.discountPercent||0;var itemDiscounts=order.itemDiscounts||{};(order.items||[]).forEach(function(it){var base=it.price||0;var ip=matchItemDiscount(it,itemDiscounts);if(ip>0)it.discPrice=Math.round(base*(1-ip/100));else if(pct>0)it.discPrice=Math.round(base*(1-pct/100));if(!it.discPrice)it.discPrice=base;it.total=(it.discPrice||base)*(it.qty||1);});} function recalcOrder(order){applyDiscount(order);var pt=0;(order.items||[]).forEach(function(it){pt+=it.total||0;});var sc=0;(order.fees||[]).forEach(function(f){sc+=(f.amount||0);});order.grandTotal=pt+sc;order.remaining=order.grandTotal-(order.deposit||0);if(order.remaining<0)order.remaining=0;} -// FIX TRIỆT ĐỂ: lấy date từ input khách hàng nếu có -function _getCustomerDateFromInput(){ - var sels=['#quoteDate','#quoteNgay','#checkoutDate','input[placeholder*="ngày"]','input[placeholder*="date"]']; - for(var i=0;i0?order.remaining:order.grandTotal,order.code);await window.VAI_QR.exportExcel(d,d.qd,order.code,qr);}} +async function exportExcel(order,opt){if(typeof ExcelJS==='undefined')return;if(window.VAI_QR&&window.VAI_QR.exportExcel){var d=orderToVAIData(order),qd=d.qd,qrUrl=window.VAI_QR.getQRUrl(order.deposit>0?order.remaining:order.grandTotal,order.code);await window.VAI_QR.exportExcel(d,qd,order.code,qrUrl,_orderBW(opt));}} async function exportDeliveryPDF(order,opt){if(window.VAI_QR&&window.VAI_QR.exportDeliveryPDF){var qd=orderToVAIData(order).qd;await window.VAI_QR.exportDeliveryPDF(qd,order.code,_orderBW(opt));}} async function exportDeliveryExcel(order,opt){if(typeof ExcelJS==='undefined')return;if(window.VAI_QR&&window.VAI_QR.exportDeliveryExcel){var qd=orderToVAIData(order).qd;await window.VAI_QR.exportDeliveryExcel(qd,order.code,_orderBW(opt));}} function openSearchModal(){var old=document.getElementById('vai-order-search-modal');if(old)old.remove();var orders=getOrders();var pC=orders.filter(function(o){return(o.status||'pending')==='pending';}).length;var cC=orders.filter(function(o){return o.status==='confirmed';}).length;var cf='all';var ov=document.createElement('div');ov.id='vai-order-search-modal';ov.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:9999;display:flex;align-items:flex-start;justify-content:center;padding:40px 16px;overflow-y:auto';ov.onclick=function(e){if(e.target===ov)ov.remove();};ov.innerHTML='
📋 Đơn hàng ('+orders.length+')
';document.body.appendChild(ov);var re=document.getElementById('vai-os-r');function rl(ls){if(!ls.length){re.innerHTML='
Trống
';return;}re.innerHTML=ls.map(function(o,i){var isC=o.status==='confirmed';return'
'+o.code+' '+(isC?'✅':'⏳')+'
'+esc(o.customer)+' • '+fmt(o.grandTotal)+'
';}).join('');re.onclick=function(e){var d=e.target.closest('.od');if(d){e.stopPropagation();if(confirm('Xóa?')){deleteOrder(d.dataset.c);df();}return;}var it=e.target.closest('.oi');if(it){ov.remove();openOrderDetail(ls[parseInt(it.dataset.i)]);}};}function df(){rl(searchOrders(document.getElementById('vai-os-q').value,cf));}rl(orders);document.getElementById('vai-os-close').onclick=function(){ov.remove();};document.getElementById('vai-os-q').oninput=df; + // Refresh button — force sync from server document.getElementById('vai-os-refresh').onclick=function(){ this.textContent='⏳';var self=this; syncFromServer(); setTimeout(function(){self.textContent='🔄';ov.remove();openSearchModal();},2000); }; - ov.querySelectorAll('.os-filter').forEach(function(b){b.onclick=function(e){e.stopPropagation();cf=this.dataset.f;ov.querySelectorAll('.os-filter').forEach(function(x){x.style.background='#fff';x.style.color='#003f62';});this.style.background='#003f62';this.style.color='#fff';df();};}); -} + ov.querySelectorAll('.os-filter').forEach(function(b){b.onclick=function(e){e.stopPropagation();cf=this.dataset.f;ov.querySelectorAll('.os-filter').forEach(function(x){x.style.background='#fff';x.style.color='#003f62';});this.style.background='#003f62';this.style.color='#fff';df();};});} -function openOrderDetail(order){ - var old=document.getElementById('vai-order-detail-modal');if(old)old.remove(); - order=JSON.parse(JSON.stringify(order)); - // FIX: đảm bảo notes luôn là mảng - if(!order.notes)order.notes=[]; - var ov=document.createElement('div');ov.id='vai-order-detail-modal';ov.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:10000;display:flex;align-items:flex-start;justify-content:center;padding:16px;overflow-y:auto';ov.onclick=function(e){if(e.target===ov)ov.remove();};document.body.appendChild(ov);var modal=document.createElement('div');modal.style.cssText='background:#fff;border-radius:16px;max-width:750px;width:100%;max-height:92vh;overflow-y:auto';ov.appendChild(modal); +function openOrderDetail(order){var old=document.getElementById('vai-order-detail-modal');if(old)old.remove();order=JSON.parse(JSON.stringify(order));var ov=document.createElement('div');ov.id='vai-order-detail-modal';ov.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:10000;display:flex;align-items:flex-start;justify-content:center;padding:16px;overflow-y:auto';ov.onclick=function(e){if(e.target===ov)ov.remove();};document.body.appendChild(ov);var modal=document.createElement('div');modal.style.cssText='background:#fff;border-radius:16px;max-width:750px;width:100%;max-height:92vh;overflow-y:auto';ov.appendChild(modal); var _searchOpen=false; function addProductToOrder(product){ var pn=product.priceNum||product.pn||0; @@ -343,6 +265,7 @@ function openOrderDetail(order){ +'
'+fmt(price)+'
' +'
'; }).join(''); + // Bind click events el.querySelectorAll('.od-sp-item').forEach(function(item){ item.onclick=function(e){ if(e.target.closest('.od-sp-add'))return; @@ -360,19 +283,16 @@ function openOrderDetail(order){ }; }); } - function render(){ - recalcOrder(order);var isC=order.status==='confirmed'; + function render(){recalcOrder(order);var isC=order.status==='confirmed'; var h='
📄 '+esc(order.code)+' '+(isC?'✅ Đã chốt':'')+'
' - +'
KH:
SĐT:
ĐC:
Ngày:
' + +'
KH:
SĐT:
ĐC:
' +'
👤 Mã KH
'+(order.ma_kh?'✅ '+order.ma_kh:'')+'
' - +''; - (order.items||[]).forEach(function(it,i){var ck=it.discPrice&&it.price&&it.discPrice';}); + +'
#ẢnhSPThông tinSLGiá niêm yếtGiá CKTTGhi chú
'+(i+1)+''+(it.image?'':'')+''+esc((it.name||'').substring(0,28))+'
'+esc(it.model||'')+'
'+esc(orderItemInfo(it)).substring(0,260)+''+(it.qty||1)+''+fmt(it.price)+''+fmt(it.discPrice||it.price)+''+fmt(it.total)+''+esc(it.note||'')+'
'; + (order.items||[]).forEach(function(it,i){var ck=it.discPrice&&it.price&&it.discPrice';}); h+='
#ẢnhSPThông tinSLGiá niêm yếtGiá CKTT
'+(i+1)+''+(it.image?'':'')+''+esc((it.name||'').substring(0,28))+'
'+esc(it.model||'')+'
'+esc(orderItemInfo(it)).substring(0,260)+''+(it.qty||1)+''+fmt(it.price)+''+fmt(it.discPrice||it.price)+''+fmt(it.total)+'
'; if(order.fees&&order.fees.length){h+='
';order.fees.forEach(function(f){h+='
'+esc(f.label)+''+fmt(f.amount)+'
';});h+='
';} h+='
TỔNG'+fmt(order.grandTotal)+'
'; if(order.deposit>0)h+='
Cọc: '+fmt(order.deposit)+' | Còn: '+fmt(order.remaining)+'
'; - else h+='
Còn lại (100%): '+fmt(order.grandTotal)+'
'; - if(order.notes&&order.notes.length)h+='
📝 Ghi chú: '+esc(order.notes.join('; '))+'
'; h+='
' +'' +'
'; @@ -381,33 +301,25 @@ function openOrderDetail(order){ h+='
'; h+=renderSearchPanel(); h+='
';modal.innerHTML=h; - // FIX: null-safe event handlers after innerHTML rebuild — prevents close button failures - var _xc=document.getElementById('xc');if(_xc)_xc.onclick=function(){ov.remove();}; + document.getElementById('xc').onclick=function(){ov.remove();}; modal.querySelectorAll('.xd').forEach(function(b){b.onclick=function(e){e.stopPropagation();order.items.splice(parseInt(this.dataset.i),1);render();};}); - var _addSp=document.getElementById('od-add-sp');if(_addSp)_addSp.onclick=toggleSearchPanel; - var _closeSp=document.getElementById('od-sp-close');if(_closeSp)_closeSp.onclick=function(){_searchOpen=false;render();}; - var _spSearch=document.getElementById('od-sp-search');if(_spSearch){_spSearch.oninput=function(){renderSearchResults();};_spSearch.onkeydown=function(e){if(e.key==='Escape'){_searchOpen=false;render();}};} + // Add SP button + var addSpBtn=document.getElementById('od-add-sp'); + if(addSpBtn){addSpBtn.onclick=toggleSearchPanel;} + // Close search panel + var closeSpBtn=document.getElementById('od-sp-close'); + if(closeSpBtn){closeSpBtn.onclick=function(){_searchOpen=false;render();};} + // Search input + var searchInput=document.getElementById('od-sp-search'); + if(searchInput){searchInput.oninput=function(){renderSearchResults();};searchInput.onkeydown=function(e){if(e.key==='Escape'){_searchOpen=false;render();}};} + // Render search results if panel is open if(_searchOpen){renderSearchResults();} - // FIX BUG: close button on "Thêm sản phẩm" modal — use event delegation on modal - // so close works even after innerHTML rebuilds the DOM - modal.onclick=function(e){ - var t=e.target; - if(t&&t.closest&&t.closest('#xc')){ov.remove();return;} - if(t&&t.closest&&t.closest('#od-sp-close')){_searchOpen=false;render();return;} - }; - function cc(){ - order.customer=document.getElementById('od-name').value; - order.phone=document.getElementById('od-phone').value; - order.addr=document.getElementById('od-addr').value; - // FIX: cập nhật date từ input - var dt=document.getElementById('od-date'); - if(dt)order.date=dt.value.trim(); - } + function cc(){order.customer=document.getElementById('od-name').value;order.phone=document.getElementById('od-phone').value;order.addr=document.getElementById('od-addr').value;} var mI=document.getElementById('od-makh'),sB=document.getElementById('od-makh-suggest'),mInfo=document.getElementById('od-makh-info'); if(mI){mI.oninput=function(){var q=this.value.trim();if(q.length<1){sB.style.display='none';mInfo.textContent='';order.ma_kh='';return;}var ms=findKH(q);if(!ms.length){sB.style.display='none';mInfo.textContent='⚠️ Không tìm';order.ma_kh='';return;}var ex=ms.find(function(k){return k.ma_kh.toLowerCase()===q.toLowerCase();});if(ex){applyKH(ex);sB.style.display='none';return;}sB.style.display='block';sB.innerHTML=ms.slice(0,4).map(function(k){return'
'+esc(k.ma_kh)+' '+esc(k.ten)+'
';}).join('');sB.querySelectorAll('.kh-opt').forEach(function(o){o.onmousedown=function(e){e.preventDefault();var k=KH_LIST.find(function(x){return x.ma_kh===this.dataset.ma;}.bind(this));if(k){mI.value=k.ma_kh;applyKH(k);sB.style.display='none';}};});};mI.onblur=function(){setTimeout(function(){sB.style.display='none';},200);};} function applyKH(kh){order.ma_kh=kh.ma_kh;var ap=[];(order.items||[]).forEach(function(it){var br=it.brand||(it.name||'').match(/(malloca|eurogold|grob|garis)/i);if(br){var bn=typeof br==='string'?br:br[1];var rate=getKHCKRate(kh,bn);if(rate!==null){it.discPrice=Math.round((it.price||0)*(1-rate/100));it.total=it.discPrice*(it.qty||1);ap.push(bn+' '+rate+'%');}}});order.discountPercent=0;recalcOrder(order);mInfo.innerHTML='✅ '+esc(kh.ma_kh)+' — '+esc(kh.ten)+(ap.length?' | '+ap.join(', '):'');render();} document.getElementById('od-apply').onclick=function(){cc();var p=document.getElementById('od-prompt').value;order.promptText=p;var ps=parsePrompt(p);order.fees=ps.fees.length?ps.fees:(p.trim()?order.fees:[]);order.deposit=ps.deposit||0;if(ps.discountPercent)order.discountPercent=ps.discountPercent;order.itemDiscounts=ps.itemDiscounts||{};order.notes=ps.notes||[];recalcOrder(order);render();}; - document.getElementById('od-save').onclick=function(){cc();var p=document.getElementById('od-prompt').value;if(p&&p!==order.promptText){order.promptText=p;var ps=parsePrompt(p);order.fees=ps.fees.length?ps.fees:[];order.deposit=ps.deposit||0;if(ps.discountPercent)order.discountPercent=ps.discountPercent;order.itemDiscounts=ps.itemDiscounts||{};order.notes=ps.notes||[];recalcOrder(order);}else{recalcOrder(order);}order.savedAt=new Date().toISOString();addOrder(order);syncOrderToBot(order);alert('✅ Lưu!');}; + document.getElementById('od-save').onclick=function(){cc();var p=document.getElementById('od-prompt').value;if(p&&p!==order.promptText){order.promptText=p;var ps=parsePrompt(p);order.fees=ps.fees.length?ps.fees:[];order.deposit=ps.deposit||0;if(ps.discountPercent)order.discountPercent=ps.discountPercent;order.itemDiscounts=ps.itemDiscounts||{};order.notes=ps.notes||[];recalcOrder(order);}else{recalcOrder(order);}order.savedAt=new Date().toISOString();addOrder(order);syncOrderToBot(order);alert('✅ Lưu!');}; document.getElementById('od-pdf').onclick=function(){cc();recalcOrder(order);exportPDF(order,{bw:!!(document.getElementById('od-bw')&&document.getElementById('od-bw').checked)});}; document.getElementById('od-xl').onclick=function(){cc();recalcOrder(order);exportExcel(order,{bw:!!(document.getElementById('od-bw')&&document.getElementById('od-bw').checked)});}; document.getElementById('od-gh').onclick=function(){cc();recalcOrder(order);exportDeliveryPDF(order,{bw:!!(document.getElementById('od-bw')&&document.getElementById('od-bw').checked)});}; @@ -422,7 +334,7 @@ function injectMaKHToQuote(){var modal=document.querySelector('.quote-overlay.op sec.innerHTML='
👤 Mã KH
'; pI.parentElement.insertBefore(sec,pI); var input=document.getElementById('vai-makh-input'),dd=document.getElementById('vai-makh-dropdown'),badge=document.getElementById('vai-makh-badge'); - input.oninput=function(){var q=this.value.trim();if(q.length<1){dd.style.display='none';badge.textContent='';return;}loadKhachHang().then(function(){var ms=findKH(q);if(!ms.length){dd.style.display='none';badge.textContent='⚠️';badge.style.color='#dc2626';return;}var ex=ms.find(function(k){return k.ma_kh.toLowerCase()===q.toLowerCase();});if(ex){dd.style.display='none';badge.innerHTML='✅ '+esc(ex.ten);badge.style.color='#16a34a';applyKHToQuoteModal(ex);return;}dd.style.display='block';dd.innerHTML=ms.slice(0,4).map(function(k){return'
'+esc(k.ma_kh)+' '+esc(k.ten)+'
';}).join('');dd.querySelectorAll('.vai-kh-opt').forEach(function(o){o.onmousedown=function(e){e.preventDefault();var k=KH_LIST.find(function(x){return x.ma_kh===this.dataset.ma;}.bind(this));if(k){input.value=k.ma_kh;dd.style.display='none';badge.innerHTML='✅ '+esc(k.ten);badge.style.color='#16a34a';applyKHToQuoteModal(k);}};});}; + input.oninput=function(){var q=this.value.trim();if(q.length<1){dd.style.display='none';badge.textContent='';return;}loadKhachHang().then(function(){var ms=findKH(q);if(!ms.length){dd.style.display='none';badge.textContent='⚠️';badge.style.color='#dc2626';return;}var ex=ms.find(function(k){return k.ma_kh.toLowerCase()===q.toLowerCase();});if(ex){dd.style.display='none';badge.innerHTML='✅ '+esc(ex.ten);badge.style.color='#16a34a';applyKHToQuoteModal(ex);return;}dd.style.display='block';dd.innerHTML=ms.slice(0,4).map(function(k){return'
'+esc(k.ma_kh)+' '+esc(k.ten)+'
';}).join('');dd.querySelectorAll('.vai-kh-opt').forEach(function(o){o.onmousedown=function(e){e.preventDefault();var k=KH_LIST.find(function(x){return x.ma_kh===this.dataset.ma;}.bind(this));if(k){input.value=k.ma_kh;dd.style.display='none';badge.innerHTML='✅ '+esc(k.ten);badge.style.color='#16a34a';applyKHToQuoteModal(k);}};});});}; input.onblur=function(){setTimeout(function(){dd.style.display='none';},200);}; } function applyKHToQuoteModal(kh){var codes=kh.ck_codes||[];if(!codes.length)return;var pI=null;document.querySelectorAll('input,textarea').forEach(function(el){var ph=(el.placeholder||'').toLowerCase();if(ph.includes('yêu cầu')||ph.includes('chiết khấu')||ph.includes('chiet khau'))pI=el;});if(!pI)return;var ckVal=null;for(var i=0;i1)return el.value.trim();}return '';} function getEffectiveOrderCode(){var n=getCustomerName();if(n)return generateOrderCode(n);var h=window.location.hash;if(h&&h.length>1){var c=h.substring(1);if(/^VAS[A-Z0-9]{3,}$/.test(c))return c;}return generateOrderCode('');} @@ -62,12 +60,12 @@ function fmt(n){if(!n||isNaN(n))return'0đ';return Number(n).toLocaleString('vi- function compactKey(s){return stripDiacritics(String(s||'')).toLowerCase().replace(/[^a-z0-9]/g,'');} function itemKeys(it){var arr=[];['model','sku','code','ma','name'].forEach(function(k){if(it&&it[k])arr.push(compactKey(it[k]));});if(it&&it.name){String(it.name).split('|').forEach(function(x){arr.push(compactKey(x));});}return arr.filter(function(x){return x&&x.length>=3;});} function matchItemDiscount(it,itemDiscounts){itemDiscounts=itemDiscounts||{};var keys=itemKeys(it);for(var i=0;i=3&&kk.length>=3&&(kk.indexOf(code)!==-1||code.indexOf(kk)!==-1))return itemDiscounts[code];}}return 0;} -function parseItemDiscountLine(line,map){var lo=stripDiacritics(String(line||'')).toLowerCase();var re1=/\\b([a-z]{1,8}[a-z0-9._\\-\\/]*)\\b\\s*(?:[:=\\-]|\\s+)?\\s*(?:ck|chiet\\s*khau|giam|discount)\\s*([\\d.,]+)\\s*%?/gi;var re2=/(?:ck|chiet\\s*khau|giam|discount)\\s*\\b([a-z]{1,8}[a-z0-9._\\-\\/]*)\\b\\s*([\\d.,]+)\\s*%?/gi;var m;while((m=re1.exec(lo))!==null){var v=parseFloat(m[2].replace(/\\./g,'').replace(',','.'));if(v>0&&v<=100)map[compactKey(m[1])]=v;}while((m=re2.exec(lo))!==null){var v2=parseFloat(m[2].replace(/\\./g,'').replace(',','.'));if(v2>0&&v2<=100)map[compactKey(m[1])]=v2;}} +function parseItemDiscountLine(line,map){var lo=stripDiacritics(String(line||'')).toLowerCase();var re1=/\b([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\\b\s*(?:[:=\-]|\s+)?\s*(?:ck|chiet\\s*khau|giam|discount)\s*([\d.,]+)\s*%?/gi;var re2=/(?:ck|chiet\\s*khau|giam|discount)\s*\\b([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\\b\\s*([\d.,]+)\s*%?/gi;var m;while((m=re1.exec(lo))!==null){var v=parseFloat(m[2].replace(/\\./g,'').replace(',','.'));if(v>0&&v<=100)map[compactKey(m[1])]=v;}while((m=re2.exec(lo))!==null){var v2=parseFloat(m[2].replace(/\\./g,'').replace(',','.'));if(v2>0&&v<=100)map[compactKey(m[1])]=v2;}} function applyPromptDiscounts(qd,parsed){if(!qd||!qd.items)return qd;var productTotal=0;var itemDiscounts=(parsed&&parsed.itemDiscounts)||{};var globalPct=Number((parsed&&parsed.discountPercent)||0);qd.items.forEach(function(it){var base=Number(it.price||0),qty=Number(it.qty||1);var pct=matchItemDiscount(it,itemDiscounts);if(pct>0){it.discPrice=Math.round(base*(1-pct/100));it.discountPercent=pct;}else if(globalPct>0&&globalPct<=100){it.discPrice=Math.round(base*(1-globalPct/100));it.discountPercent=globalPct;}else if(!it.discPrice){it.discPrice=base;}it.total=Number(it.discPrice||base)*qty;productTotal+=Number(it.total||0);});qd.grandTotal=productTotal;return qd;} -function parsePrompt(text){var fees=[],notes=[],discount=null,deposit=0,discountPercent=0,itemDiscounts={};if(!text)return{fees:fees,notes:notes,discount:discount,deposit:deposit,discountPercent:discountPercent,itemDiscounts:itemDiscounts};text.split(/[,;\\n]+/).forEach(function(line){line=line.trim();if(!line)return;parseItemDiscountLine(line,itemDiscounts);if(Object.keys(itemDiscounts).length&&line.match(/\\b[A-Za-z]{1,8}[A-Za-z0-9._\\-\\/]*)\\b/i)&&line.match(/\\b(ck|chiết khấu|chiet khau|giảm|giam|discount)\\b/i))return;if(line.match(/^(ck|chiết khấu|chiet khau|giảm|giam|discount)/i)){discount=line;var ckm=line.match(/([\\d.,]+)\\s*(%)?/);if(ckm){var v=parseFloat(ckm[1].replace(/\\./g,'').replace(',','.'));if(v>0&&v<=100)discountPercent=v;}}return;if(line.match(/cọc|coc|deposit/i)){var dm=line.match(/([\\d.,]+)\\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/);if(dm){var da=parseFloat(dm[1].replace(/\\./g,'').replace(',','.'));var du=(dm[2]||'').toLowerCase();if(du==='k'||du==='nghìn'||du==='nghin')da*=1000;if(du==='triệu'||du==='tr')da*=1000000;deposit=da;}}return;var m=line.match(/([\\d.,]+)\\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/);if(m){var amt=parseFloat(m[1].replace(/\\./g,'').replace(',','.'));var u=(m[2]||'').toLowerCase();if(u==='k'||u==='nghìn'||u==='nghin')amt*=1000;if(u==='triệu'||u==='tr')amt*=1000000;if(amt<=0)return;var lb=line.replace(m[0],'').trim();if(lb.match(/giao|ship|vận chuyển|delivery/i))lb='Phí giao hàng';else if(lb.match(/lắp|lap|install/i))lb='Phí lắp đặt';else if(lb.match(/bốc|boc|xếp|xep|vác/i))lb='Phí bốc xếp';else if(!lb||lb.length<2)lb='Phụ phí';fees.push({label:lb,amount:amt});}else{notes.push(line);}});return{fees:fees,notes:notes,discount:discount,deposit:deposit,discountPercent:discountPercent,itemDiscounts:itemDiscounts};} +function parsePrompt(text){var fees=[],notes=[],discount=null,deposit=0,discountPercent=0,itemDiscounts={};if(!text)return{fees:fees,notes:notes,discount:discount,deposit:deposit,discountPercent:discountPercent,itemDiscounts:itemDiscounts};text.split(/[,;\n]+/).forEach(function(line){line=line.trim();if(!line)return;parseItemDiscountLine(line,itemDiscounts);if(Object.keys(itemDiscounts).length&&line.match(/\\b[A-Za-z]{1,8}[A-Za-z0-9._\-\/]{1,30}\\d[A-Za-z0-9._\-\/]*\\b/i)&&line.match(/\\b(ck|chiết khấu|chiet khau|giảm|giam|discount)\\b/i))return;if(line.match(/^(ck|chiết khấu|chiet khau|giảm|giam|discount)/i)){discount=line;var ckm=line.match(/([\\d.,]+)\\s*(%)?/);if(ckm){var v=parseFloat(ckm[1].replace(/\\./g,'').replace(',','.'));if(v>0&&v<=100)discountPercent=v;}}return;if(line.match(/cọc|coc|deposit/i)){var dm=line.match(/([\\d.,]+)\\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/);if(dm){var da=parseFloat(dm[1].replace(/\\./g,'').replace(',','.'));var du=(dm[2]||'').toLowerCase();if(du==='k'||du==='nghìn'||du==='nghin')da*=1000;if(du==='triệu'||du==='tr')da*=1000000;deposit=da;}}return;var m=line.match(/([\\d.,]+)\\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/);if(m){var amt=parseFloat(m[1].replace(/\\./g,'').replace(',','.'));var u=(m[2]||'').toLowerCase();if(u==='k'||u==='nghìn'||u==='nghin')amt*=1000;if(u==='triệu'||u==='tr')amt*=1000000;if(amt<=0)return;var lb=line.replace(m[0],'').trim();if(lb.match(/giao|ship|vận chuyển|delivery/i))lb='Phí giao hàng';else if(lb.match(/lắp|lap|install/i))lb='Phí lắp đặt';else if(lb.match(/bốc|boc|xếp|xep|vác/i))lb='Phí bốc xếp';else if(!lb||lb.length<2)lb='Phụ phí';fees.push({label:lb,amount:amt});}else{notes.push(line);}});return{fees:fees,notes:notes,discount:discount,deposit:deposit,discountPercent:discountPercent,itemDiscounts:itemDiscounts};} var _lastPromptText=''; -function getPromptText(){var direct=document.getElementById('qcAiPrompt');if(direct){var dv=(direct.value||'').trim();if(dv&&dv.toUpperCase().replace(/[\\s.]/g,'')!=='VAISTUDIO'){_lastPromptText=dv;return dv;}}var inputs=document.querySelectorAll('input,textarea');for(var j=0;j0?remaining:0};} @@ -79,7 +77,7 @@ function injectToModal(){var modal=document.querySelector('.quote-overlay.open,. function toCanvas(html,w){var div=document.createElement('div');div.style.cssText='position:absolute;left:-10000px;top:0;width:'+(w||1000)+'px;background:#fff;padding:28px;font-family:Inter,Arial,DejaVu Sans,sans-serif;z-index:-1;box-sizing:border-box';div.innerHTML=html;document.body.appendChild(div);try{if(document.fonts&&document.fonts.ready)await document.fonts.ready;}catch(e){}var imgs=Array.from(div.querySelectorAll('img'));await Promise.all(imgs.map(function(img){return new Promise(function(res){if(img.complete)return res();img.onload=img.onerror=function(){res();};setTimeout(res,2500);});}));await new Promise(function(r){setTimeout(r,500);});var h=Math.max(div.scrollHeight,div.offsetHeight);var cv=await html2canvas(div,{scale:2,useCORS:true,allowTaint:false,backgroundColor:'#fff',width:w||1000,height:h,windowWidth:w||1000,windowHeight:h,scrollX:0,scrollY:0});div.remove();return cv;} -function buildQuoteHTML(d,code,qrUrl){var qd=d.qd;var rows=qd.items.map(function(it){return ''+(it.stt||'')+''+(it.name||'')+''+(it.model||'')+''+(it.specs||'')+''+(it.qty||'')+''+(it.price?fmt(it.price):'')+''+(it.discPrice?fmt(it.discPrice):'')+''+(it.total?fmt(it.total):'')+''+(it.note||'')+'';}).join('');var feeRows='';if(d.fees&&d.fees.length){d.fees.forEach(function(f){feeRows+='⊕ '+f.label+''+fmt(f.amount)+'';});}var depositRow='';if(d.deposit>0){depositRow='Đặt cọc'+fmt(d.deposit)+'';}return '
BẢNG BÁO GIÁ
Khách hàng: '+(qd.customer.name||'')+'
SĐT: '+(qd.customer.phone||'')+'
Mã đơn: '+code+'
Ngày: '+(qd.customer.date||'')+'
'+rows+feeRows+depositRow+'
STTHìnhTên SPThông tinSLĐơn giáGiá CKThành tiềnGhi chú
TỔNG CỘNG'+fmt(d.grandTotal)+'
';} +function buildQuoteHTML(d,code,qrUrl){var qd=d.qd;var rows=qd.items.map(function(it){return ''+(it.stt||'')+''+(it.name||'')+''+(it.model||'')+''+(it.specs||'')+''+(it.qty||'')+''+(it.price?fmt(it.price):'')+''+(it.discPrice?fmt(it.discPrice):'')+''+(it.total?fmt(it.total):'')+''+(it.note||'')+'';}).join('');var feeRows='';if(d.fees&&d.fees.length){d.fees.forEach(function(f){feeRows+='⊕ '+f.label+''+fmt(f.amount)+'';});}var totalQty=(qd.items||[]).reduce(function(s,it){return s+Number(it.qty||1);},0);return '
BẢNG BÁO GIÁ
Khách hàng: '+(qd.customer.name||'')+'
SĐT: '+(qd.customer.phone||'')+'
Mã đơn: '+code+'
Ngày: '+(qd.customer.date||'')+'
'+rows+feeRows+'
STTHìnhTên SPThông tinSLĐơn giáGiá CKThành tiềnGhi chú
TỔNG CỘNG'+fmt(d.grandTotal)+'
'+(d.deposit>0?'
Cọc: '+fmt(d.deposit)+' | Còn lại: '+fmt(d.remaining)+'
':'');} function buildDeliveryHTML(qd,code){var rows=(qd.items||[]).map(function(it,i){return ''+(it.stt||(i+1))+''+(it.name||'')+''+(it.model||'')+''+(it.qty||1)+''+(it.note||'')+'';}).join('');return '
PHIẾU GIAO HÀNG
Khách hàng: '+(qd.customer?qd.customer.name:'')+' | SĐT: '+(qd.customer?qd.customer.phone:'')+'
Địa chỉ: '+(qd.customer?qd.customer.addr||'':'')+'
Mã đơn: '+code+' | Ngày: '+(qd.customer?qd.customer.date||'':'')+'
'+rows+'
STTTên sản phẩmMã SPSLGhi chú
Bên giao
(Ký, họ tên)
_______________
Bên nhận
(Ký, họ tên)
_______________
';} @@ -90,7 +88,7 @@ async function _doExportPDF(d,code){var qr=getQRUrl(d.deposit>0?d.remaining:d.gr async function _doExportDeliveryPDF(qd,code){var cv=await toCanvas(buildDeliveryHTML({qd:qd},code),700);var img=cv.toDataURL('image/png');var pdf=new jspdf.jsPDF({orientation:'p',unit:'pt',format:'a4'});var margin=25,usableW=595-margin*2,ratio=cv.height/cv.width,imgH=usableW*ratio;if(imgH>842-margin*2){imgH=842-margin*2;usableW=imgH/ratio;}pdf.addImage(img,'PNG',margin,margin,usableW,imgH);pdf.save('GH-'+code+'.pdf');} async function _doExportExcel(d,qd,code,qrUrl){ - var MONEY_FMT='#,##0"đ"';var NUM_FMT='#,##0'; + var MONEY_FMT='#,##0"đ"';var NUM_FMT='#,##0';var WHITE={argb:'FFFFFFFF'}; var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('Báo giá'); ws.views=[{showGridLines:false}];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='BẢNG BÁO GIÁ';ws.getCell('A3').font={bold:true,size:18,color:{argb:'FFDB9815'}};ws.getCell('A3').alignment={horizontal:'center'}; @@ -101,9 +99,10 @@ async function _doExportExcel(d,qd,code,qrUrl){ ws.getCell('A7').value='Email:';ws.mergeCells('B7:E7');ws.getCell('B7').value=qd.customer?qd.customer.email:''; ws.getCell('A8').value='Địa chỉ:';ws.mergeCells('B8:J8');ws.getCell('B8').value=qd.customer?qd.customer.addr:''; var hr=ws.getRow(10);['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=hr.getCell(i+1);c.value=h;c.font={bold:true,color:{argb:'FFFFFFFF'}};c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'};}); - var cr=11,firstItemRow=cr; + var cr=11,firstItemRow=cr,ckPct=Number((d.discountPercent||0)); for(var i=0;i0){ - var depRow=ws.getRow(cr); - depRow.height=22; - ws.mergeCells(cr,1,cr,8); - depRow.getCell(1).value='Đặt cọc'; - depRow.getCell(1).font={bold:true,size:10,color:{argb:'FFDC2626'}}; - depRow.getCell(9).value=Number(d.deposit); - depRow.getCell(9).numFmt=MONEY_FMT; - depRow.getCell(9).font={bold:true,color:{argb:'FFDC2626'}}; - cr++; - } ws.getRow(cr).height=28; - ws.mergeCells(cr,1,cr,5);ws.getCell('A'+cr).value='TỔNG CỘNG';ws.getCell('A'+cr).font={bold:true,size:13,color:{argb:'FFFFFFFF'}};ws.getCell('A'+cr).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'};};ws.getCell('E'+cr).value={formula:'SUM(I'+firstItemRow+':I'+(cr-1)+')',result:Number(d.grandTotal||0)};ws.getCell('E'+cr).numFmt=MONEY_FMT;ws.getCell('E'+cr).font={bold:true,size:14,color:{argb:'FFF0B840'};}; + ws.mergeCells(cr,1,cr,5);ws.getCell('A'+cr).value='TỔNG CỘNG';ws.getCell('A'+cr).font={bold:true,size:13,color:{argb:'FFFFFFFF'}};ws.getCell('A'+cr).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'};}; + ws.getCell('E'+cr).value={formula:'SUM(I'+firstItemRow+':I'+(cr-1)+')',result:Number(d.grandTotal||0)};ws.getCell('E'+cr).numFmt=MONEY_FMT;ws.getCell('E'+cr).font={bold:true,size:14,color:{argb:'FFF0B840'};}; wb.calcProperties.fullCalcOnLoad=true; var buf=await wb.xlsx.writeBuffer(); var blob=new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}); @@ -165,33 +139,6 @@ async function _doExportDeliveryExcel(qd,code){ row.getCell(5).value=it.note||''; totalQty+=Number(it.qty||1);cr++; } - // ===== Add fee rows to delivery Excel ===== - var dataObj=window.VAI_QR&&window.VAI_QR.getData?window.VAI_QR.getData():{}; - var fees=dataObj.fees||[]; - var deposit=dataObj.deposit||0; - if(fees.length){ - fees.forEach(function(f){ - var feeRow=ws.getRow(cr); - feeRow.height=18; - ws.mergeCells(cr,1,cr,3); - feeRow.getCell(1).value='⊕ '+f.label; - feeRow.getCell(1).font={size:10,color:{argb:'FF92400E'}}; - feeRow.getCell(4).value=Number(f.amount); - feeRow.getCell(4).numFmt='#,##0"đ"'; - cr++; - }); - } - if(deposit>0){ - var depRow=ws.getRow(cr); - depRow.height=18; - ws.mergeCells(cr,1,cr,3); - depRow.getCell(1).value='Đặt cọc'; - depRow.getCell(1).font={bold:true,size:10,color:{argb:'FFDC2626'}}; - depRow.getCell(4).value=Number(deposit); - depRow.getCell(4).numFmt='#,##0"đ"'; - depRow.getCell(4).font={bold:true,color:{argb:'FFDC2626'}}; - cr++; - } var totalQtyRow=cr;ws.mergeCells(totalQtyRow,1,totalQtyRow,3);ws.getCell('A'+totalQtyRow).value='TỔNG CỘNG SỐ LƯỢNG';ws.getCell('D'+totalQtyRow).value=totalQty; var buf=await wb.xlsx.writeBuffer(); var blob=new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}); diff --git a/qr-payment-v1043-FIXED.js b/qr-payment-v1043-FIXED.js deleted file mode 100644 index b4dd91d54a0af0998a2554836b09311a69d0af57..0000000000000000000000000000000000000000 --- a/qr-payment-v1043-FIXED.js +++ /dev/null @@ -1,671 +0,0 @@ -/* V.AI STUDIO — QR Payment / Quote Data v1045 - FIX TRIỆT ĐỂ - * 1) BỎ QUA hoàn toàn dòng "BẢO HÀNH 2 NĂM", "BẢO HÀNH 7 NĂM" - không xử lý như fee - * 2) "giao thứ X" / "lắp thứ X" → ghi vào notes (giao thứ 2, giao thứ 7) - * 3) Excel CK formula chính xác: =ROUND(G{row}*(1-pct/100),0) - * 4) FIX LOADING FREEZE: Pre-fetch images with timeout, limit concurrent fetches - */ -(function(){'use strict'; - -// ===== BLOB REGISTRY ===== -window.__VAI_BLOB_REG = window.__VAI_BLOB_REG || { blobs: [], isUnloading: false }; -var blobRegistry = window.__VAI_BLOB_REG.blobs; - -function cleanupBlobs(){ - window.__VAI_BLOB_REG.isUnloading = true; - blobRegistry.forEach(function(e) { - if (!e.revoked) { try { URL.revokeObjectURL(e.url); e.revoked = true; } catch(err) {} } - }); - blobRegistry = []; -} -window.addEventListener('pagehide', cleanupBlobs); -window.addEventListener('beforeunload', cleanupBlobs); - -function dlBlob(blob, filename) { - var url = URL.createObjectURL(blob); - blobRegistry.push({ url: url, revoked: false }); - var a = document.createElement('a'); - a.href = url; - a.download = filename; - a.style.cssText = 'position:absolute;left:-9999px'; - document.body.appendChild(a); - a.click(); - setTimeout(function() { try { document.body.removeChild(a); } catch(err) {} }, 100); -} - -// ===== FETCH WITH TIMEOUT ===== -function fetchWithTimeout(url, timeoutMs) { - return Promise.race([ - fetch(url, {mode: 'cors'}), - new Promise(function(resolve) { - setTimeout(function() { resolve({ok: false, timeout: true}); }, timeoutMs || 3000); - }) - ]); -} - -var BANK_ID='vib',BANK_ACCOUNT='918258385',BANK_NAME='TRAN QUOC VUONG'; -function stripDiacritics(s){return s.normalize('NFD').replace(/[\u0300-\u036f]/g,'').replace(/[Đđ]/g,'D');} -function generateOrderCode(name){var now=new Date(),dd=String(now.getDate()).padStart(2,'0'),mm=String(now.getMonth()+1).padStart(2,'0'),yy=String(now.getFullYear()).slice(-2),ini='';if(name&&name.trim()){name.trim().split(/\s+/).forEach(function(w){if(w){var ch=stripDiacritics(w.charAt(0)).toUpperCase();if(/[A-Z]/.test(ch))ini+=ch;}});}return 'VAS'+(ini||'X')+dd+mm+yy;} -function getCustomerName(){var sels=['#quoteName','#quoteCustomerName','#checkoutName','.quote-field input:first-of-type'];for(var i=0;i1)return el.value.trim();}return '';} -function getEffectiveOrderCode(){var n=getCustomerName();if(n)return generateOrderCode(n);var h=window.location.hash;if(h&&h.length>1){var c=h.substring(1);if(/^VAS[A-Z0-9]{3,}$/.test(c))return c;}return generateOrderCode('');} -function getQRUrl(a,c){return'https://img.vietqr.io/image/'+BANK_ID+'-'+BANK_ACCOUNT+'-compact2.png?amount='+(Math.round(a)||0)+'&addInfo='+encodeURIComponent(c||'VAISTUDIO')+'&accountName='+encodeURIComponent(BANK_NAME);} -function fmt(n){if(!n||isNaN(n))return'0đ';return Number(n).toLocaleString('vi-VN')+'đ';} -function fmtSigned(n){if(!n||isNaN(n))return'0đ';return('+'+(Number(n).toLocaleString('vi-VN')+'đ'));} -function esc(s){return(s||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"');} -function compactKey(s){return stripDiacritics(String(s||'')).toLowerCase().replace(/[^a-z0-9]/g,'');} -function itemKeys(it){var arr=[];['model','sku','code','ma','name'].forEach(function(k){if(it&&it[k])arr.push(compactKey(it[k]);});if(it&&it.name){String(it.name).split('|').forEach(function(x){arr.push(compactKey(x));});}return arr.filter(function(x){return x&&x.length>=3;});} -function matchItemDiscount(it,itemDiscounts){ - itemDiscounts=itemDiscounts||{}; - var keys=itemKeys(it); - for(var i=0;i=3&&kk.length>=3&&(kk.indexOf(code)!==-1||code.indexOf(kk)!==-1))return itemDiscounts[code]; - } - } - var brandKeys=Object.keys(itemDiscounts).filter(function(k){ - return !k.match(/\d[A-Za-z0-9._\/-]*$/); - }); - if(brandKeys.length>0){ - var itemBrand=''; - var idx=(it.idx!=null?it.idx:(it.productIdx!=null?it.productIdx:null)); - if(it.brand){ - itemBrand=String(it.brand).toLowerCase().replace(/[^a-z0-9]/g,''); - } - else if(idx!=null&&window.D&&window.D[idx]&&window.D[idx].brand){ - itemBrand=String(window.D[idx].brand).toLowerCase().replace(/[^a-z0-9]/g,''); - } - else if(window.D){ - var ck=compactKey(it.model||it.sku||it.ma||it.name||''); - for(var di=0;di=0||ck.indexOf(dck)>=0)&&window.D[di].brand){ - itemBrand=String(window.D[di].brand).toLowerCase().replace(/[^a-z0-9]/g,''); - break; - } - } - } - if(itemBrand){ - for(var bi=0;bi=0||cleanBk.indexOf(itemBrand)>=0))return itemDiscounts[brandKeys[bi]]; - } - } - } - return 0; -} - -function parseItemDiscountLine(line,map){ - var lo=stripDiacritics(String(line||'')).toLowerCase(); - var re1=/\b([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\\b\s*(?:[:=\-]|\s+)?\s*(?:ck|chiet\s*khau|giam|discount)\s*([\d.,]+)\s*%?/gi; - var re2=/(?:ck|chiet\s*khau|giam|discount)\s*\b([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\\b\s*([\d.,]+)\s*%?/gi; - var m; - while((m=re1.exec(lo))!==null){ - var v=parseFloat(m[2].replace(/\./g,'').replace(',','.')); - if(v>0&&v<=100)map[compactKey(m[1])]=v; - } - while((m=re2.exec(lo))!==null){ - var v2=parseFloat(m[2].replace(/\./g,'').replace(',','.')); - if(v2>0&&v2<=100)map[compactKey(m[1])]=v2; - } -} - -function applyPromptDiscounts(qd,parsed){ - if(!qd||!qd.items)return qd; - var productTotal=0; - var itemDiscounts=(parsed&&parsed.itemDiscounts)||{}; - var globalPct=Number((parsed&&parsed.discountPercent)||0); - qd.items.forEach(function(it){ - var base=Number(it.price||0),qty=Number(it.qty||1); - var pct=matchItemDiscount(it,itemDiscounts); - if(pct>0){ - it.discPrice=Math.round(base*(1-pct/100)); - it.discountPercent=pct; - }else if(globalPct>0&&globalPct<=100){ - it.discPrice=Math.round(base*(1-globalPct/100)); - it.discountPercent=globalPct; - }else if(!it.discPrice){ - it.discPrice=base; - } - it.total=Number(it.discPrice||base)*qty; - productTotal+=Number(it.total||0); - }); - qd.grandTotal=productTotal; - return qd; -} - -function parsePrompt(text){ - var fees=[],notes=[],discount=null,deposit=0,discountPercent=0,itemDiscounts={}; - if(!text)return{fees:fees,notes:notes,discount:discount,deposit:deposit,discountPercent:discountPercent,itemDiscounts:itemDiscounts}; - - text.split(/[,;\n]+/).forEach(function(line){ - line=line.trim(); - if(!line)return; - parseItemDiscountLine(line,itemDiscounts); - - var lo=stripDiacritics(line).toLowerCase(); - - // ===== FIX TRIỆT ĐỂ: BỎ QUA BẢO HÀNH HOÀN TOÀN ===== - // Không xử lý "BẢO HÀNH 2 NĂM", "BẢO HÀNH 7 NĂM" như fee hoặc ck - if(lo.match(/bao.*hành|bảo hành|bh.*[0-9]\s*nam|^bh\s*[0-9]|warranty/i)) { - notes.push(line); - return; - } - - // ===== FIX: "giao thứ X", "lắp thứ X" → notes ===== - // Bao gồm: "giao thứ 2", "giao thứ 7", "lắp thứ 3", v.v. - if(lo.match(/(giao|lap)\s*thu\s*\d+/i)){ - notes.push(line); - return; - } - - // CK - xử lý "Malloca ck 35%" hoặc "ck X%" dạng toàn cục - var brandCkMatch = lo.match(/^([a-z]+)\s+ck\s+([\d.,]+)\s*%/i); - if(brandCkMatch){ - var brandName = brandCkMatch[1].trim().toLowerCase().replace(/[^a-z0-9]/g,''); - var pct = parseFloat(brandCkMatch[2].replace(/\./g,'').replace(',','.')); - if(pct>0&&pct<=100) { - itemDiscounts[brandName] = pct; - notes.push(line); - } - return; - } - - var ckMatch = lo.match(/^ck\s+([\d.,]+)\s*%/i); - if(ckMatch){ - discountPercent = parseFloat(ckMatch[1].replace(/\./g,'').replace(',','.')); - return; - } - - // Cọc - if(lo.match(/cọc|coc|deposit/)){ - var dm = lo.match(/([\d.,]+)\s*(k|K|ng|Nghìn|nghin|Triệu|tr|đ|d|vnd)/i); - if(dm){ - var da = parseFloat(dm[1].replace(/\./g,'').replace(',','.')); - var du = (dm[2]||'').toLowerCase(); - if(du==='k'||du==='ng'||du==='nghìn'||du==='nghin') da*=1000; - if(du==='triệu'||du==='tr'||du==='m') da*=1000000; - deposit = da; - } - return; - } - - // Dòng có số - phân tích phụ phí - var m = lo.match(/([\d.,]+)\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/); - if(m){ - var amt = parseFloat(m[1].replace(/\./g,'').replace(',','.')); - var u = (m[2]||'').toLowerCase(); - if(u==='k'||u==='nghìn'||u==='nghin') amt*=1000; - if(u==='triệu'||u==='tr'||u==='m') amt*=1000000; - if(amt>0){ - var lb = line.replace(m[0],'').trim(); - // Xác định loại phí - if(lo.match(/giao|ship|phi giao|phí giao/)) lb = 'Phí giao hàng'; - else if(lo.match(/lap|install|phi lap|phí lắp/)) lb = 'Phí lắp đặt'; - else if(lo.match(/bốc|boc|xep|phi bot/)) lb = 'Phí bốc xếp'; - else if(!lb||lb.length<2) lb = 'Phụ phí'; - fees.push({label:lb,amount:amt}); - } - return; - } - - // Các dòng còn lại là ghi chú - notes.push(line); - }); - - return{fees:fees,notes:notes,discount:discount,deposit:deposit,discountPercent:discountPercent,itemDiscounts:itemDiscounts}; -} - -var _lastPromptText=''; -function getPromptText(){ - var direct=document.getElementById('qcAiPrompt'); - if(direct){ - var dv=(direct.value||'').trim(); - if(dv&&dv.toUpperCase().replace(/[\s.]/g,'')!=='VAISTUDIO'){ - _lastPromptText=dv; - return dv; - } - } - var inputs=document.querySelectorAll('input,textarea'); - for(var j=0;j0?remaining:0}; -} - -// ===== WEB MODAL INJECTION ===== -function injectToModal(){ - var modal=document.querySelector('.quote-overlay.open,.quote-modal.open'); - if(!modal)return; - var old=modal.querySelector('.vai-extra-section'); - old&&old.remove(); - var parsed=parsePrompt(getPromptText()); - if(!parsed.fees.length&&!parsed.deposit)return; - var surcharge=0; - parsed.fees.forEach(function(f){surcharge+=f.amount;}); - var qd=window._origGetQuoteData?window._origGetQuoteData():(typeof getQuoteData==='function'?getQuoteData():{grandTotal:0}); - var grandTotal=(qd.grandTotal||0)+surcharge; - var sec=document.createElement('div'); - sec.className='vai-extra-section'; - sec.style.cssText='margin:10px 0;padding:0 16px;font-size:13px'; - var html=''; - if(parsed.fees.length){ - html+='
PHỤ PHÍ
'; - parsed.fees.forEach(function(f){ - html+='
+ '+esc(f.label)+''+fmt(f.amount)+'
'; - }); - html+='
'; - } - html+='
TỔNG CỘNG'+fmt(grandTotal)+'
'; - sec.innerHTML=html; - var actions=modal.querySelector('.quote-actions,[class*="actions"]'); - if(actions&&actions.parentNode)actions.parentNode.insertBefore(sec,actions); - else modal.appendChild(sec); -} - -async function toCanvas(html,w){ - var div=document.createElement('div'); - div.style.cssText='position:absolute;left:-10000px;top:0;width:'+(w||1000)+'px;background:#fff;padding:28px;font-family:Inter,Arial,sans-serif;z-index:-1'; - div.innerHTML=html; - document.body.appendChild(div); - try{if(document.fonts&&document.fonts.ready)await document.fonts.ready;}catch(e){} - var imgs=Array.from(div.querySelectorAll('img')); - // FIX: Limited timeout for images to prevent freeze - await Promise.all(imgs.map(function(img){ - return new Promise(function(res){ - if(img.complete)return res(); - img.onload=img.onerror=function(){res();}; - setTimeout(res,1000); // Reduced from 2500ms to 1000ms - }); - })); - await new Promise(function(r){setTimeout(r,300);}); // Reduced from 500ms - var h=Math.max(div.scrollHeight,div.offsetHeight); - var cv=await html2canvas(div,{scale:2,useCORS:true,backgroundColor:'#fff',width:w||1000,height:h}); - div.remove(); - return cv; -} - -function buildQuoteHTML(d,code,qrUrl){ - var qd=d.qd, totalQty=0; - var rows=qd.items.map(function(it){ - totalQty += Number(it.qty||1); - return '' - +''+(it.stt||'')+'' - +'' - +''+(it.name||'')+'' - +''+(it.model||'')+'' - +''+(it.specs||'')+'' - +''+(it.qty||'')+'' - +''+(it.price?fmt(it.price):'')+'' - +''+(it.discPrice?fmt(it.discPrice):'')+'' - +''+(it.total?fmt(it.total):'')+'' - +''+(it.note||'')+'' - +''; - }).join(''); - - var feeRows=''; - if(d.fees&&d.fees.length){ - d.fees.forEach(function(f){ - feeRows+='+ '+esc(f.label)+''+fmt(f.amount)+''; - }); - } - - var notesHtml=''; - if(d.notes&&d.notes.length){ - notesHtml='
📝 Ghi chú: '+esc(d.notes.join('; '))+'
'; - } - - var depositHtml=''; - if(d.deposit>0){ - depositHtml='
Đã cọc'+fmt(d.deposit)+'
Còn lại'+fmt(d.remaining)+'
'; - } else { - depositHtml='
CÒN LẠI (100%)'+fmt(d.grandTotal)+'
'; - } - - return '
BẢNG BÁO GIÁ
Khách hàng: '+(qd.customer.name||'')+'
SĐT: '+(qd.customer.phone||'')+'
Mã đơn: '+esc(code)+'
Ngày: '+(qd.customer.date||'')+'
'+rows+feeRows+'
STTHìnhTên SPThông tinSLĐơn giáGiá CKThành tiềnGhi chú
TỔNG CỘNGSL: '+totalQty+''+fmt(d.grandTotal)+'
'+depositHtml+notesHtml+'
💳 CHUYỂN KHOẢN
VIB | '+esc(BANK_NAME)+'
STK: '+BANK_ACCOUNT+'
'+fmt(d.deposit>0?d.remaining:d.grandTotal)+' | '+esc(code)+'
'; -} - -function buildDeliveryHTML(qd,code){ - var rows=(qd.items||[]).map(function(it,i){ - return '' - +''+((it.stt||(i+1)))+'' - +''+esc(it.name||'')+'' - +''+esc(it.model||'')+'' - +''+(it.qty||1)+'' - +''+esc(it.note||'')+'' - +''; - }).join(''); - return '
PHIẾU GIAO HÀNG
Khách hàng: '+(qd.customer?qd.customer.name:'')+' | SĐT: '+(qd.customer?qd.customer.phone:'')+'
Địa chỉ: '+(qd.customer?qd.customer.addr||'':'')+'
Mã đơn: '+esc(code)+' | Ngày: '+(qd.customer?qd.customer.date||'':'')+'
'+rows+'
STTTên sản phẩmMã SPSLGhi chú
Bên giao
(Ký, họ tên)
_______________
Bên nhận
(Ký, họ tên)
_______________
'; -} - -// ===== ORDER TO EXCEL DATA ===== -function orderToVAIData(order){ - return{ - qd:{ - customer:{name:order.customer||'',phone:order.phone||'',email:order.email||'',addr:order.addr||'',date:order.date||''}, - items:(order.items||[]).map(function(it,i){ - return{ - stt:i+1, - image:it.image||'', - name:it.name||'', - model:it.model||'', - specs:it.specs||it.info||'', - qty:it.qty||1, - price:it.price||it.listPrice||it.discPrice||0, - discPrice:it.discPrice||it.price||0, - total:it.total||0, - note:it.note||'' - }; - }), - grandTotal:order.grandTotal||0 - }, - fees:order.fees||[], - deposit:order.deposit||0, - remaining:order.remaining||0, - notes:order.notes||[] - }; -} - -// ===== EXPORT EXCEL WITH DECIMAL FORMULAS ===== -async function _doExportExcel(d,qd,code,qrUrl){ - var MONEY_FMT='#,##0"đ"'; - var NUM_FMT='#,##0'; - var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('Báo giá'); - ws.views=[{showGridLines:false}]; - ws.columns=[{width:5},{width:11},{width:28},{width:13},{width:20},{width:6},{width:13},{width:13},{width:15},{width:14}]; - - // Header - ws.mergeCells('A1:J1'); - ws.getCell('A1').value='BẢNG BÁO GIÁ'; - ws.getCell('A1').font={bold:true,size:18,color:{argb:'FFDB9815'}}; - - ws.getCell('A3').value='Khách hàng:';ws.mergeCells('B3:E3');ws.getCell('B3').value=qd.customer?qd.customer.name:''; - ws.getCell('H3').value='Mã đơn:';ws.mergeCells('I3:J3');ws.getCell('I3').value=code; - ws.getCell('A4').value='SĐT:';ws.mergeCells('B4:E4');ws.getCell('B4').value=qd.customer?qd.customer.phone:''; - ws.getCell('H4').value='Ngày:';ws.mergeCells('I4:J4');ws.getCell('I4').value=qd.customer?qd.customer.date:''; - ws.getCell('A5').value='Email:';ws.mergeCells('B5:E5');ws.getCell('B5').value=qd.customer?qd.customer.email:''; - ws.getCell('A6').value='Địa chỉ:';ws.mergeCells('B6:J6');ws.getCell('B6').value=qd.customer?qd.customer.addr:''; - - // Table header - var hr=ws.getRow(8); - ['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=hr.getCell(i+1); - c.value=h; - c.font={bold:true,color:{argb:'FFFFFFFF'};}; - c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62';};}; - }); - - var cr=9,firstItemRow=cr; - var ckPct=Number(d.discountPercent||0); - - // Pre-fetch images with CONCURRENCY LIMIT - var imgBuffers=[]; - try{ - var fetchPromises=[]; - for(var pi=0;pi0&&itemPct<=100){ - var factor = (1-itemPct/100).toFixed(4); - row.getCell(8).value={formula:'ROUND(G'+cr+'*'+factor+',0)',result:Number(it.discPrice||it.price||0)}; - } - else if(ckPct>0&&ckPct<=100){ - var factor = (1-ckPct/100).toFixed(4); - row.getCell(8).value={formula:'ROUND(G'+cr+'*'+factor+',0)',result:Number(it.discPrice||it.price||0)}; - } - else{ - row.getCell(8).value=Number(it.discPrice||it.price||0); - } - row.getCell(8).numFmt=MONEY_FMT;row.getCell(8).alignment={horizontal:'right'}; - if((it.discPrice||0)&&(it.price||0)&&it.discPrice0){ - totalFormula+='+SUM(I'+feeStartRow+':I'+(cr-1)+')'; - } - ws.getCell('I'+cr).value={formula:totalFormula,result:Number(d.grandTotal||0)}; - ws.getCell('I'+cr).numFmt=MONEY_FMT; - ws.getCell('I'+cr).font={bold:true,size:14,color:{argb:'FFF0B840'};}; - cr++; - - // Deposit / Remaining - if(d.deposit>0){ - ws.mergeCells(cr,1,cr,8); - ws.getCell('A'+cr).value='Đặt cọc'; - ws.getCell('A'+cr).font={bold:true,size:11}; - ws.getCell('I'+cr).value=Number(d.deposit); - ws.getCell('I'+cr).numFmt=MONEY_FMT; - ws.getCell('I'+cr).font={bold:true}; - var depositRow=cr;cr++; - - ws.mergeCells(cr,1,cr,8); - ws.getCell('A'+cr).value='Còn lại'; - ws.getCell('A'+cr).font={bold:true,size:12,color:{argb:'FFDC2626'};}; - ws.getCell('I'+cr).value={formula:'MAX(I'+totalRow+'-I'+depositRow+',0)',result:Number(d.remaining||0)}; - ws.getCell('I'+cr).numFmt=MONEY_FMT; - ws.getCell('I'+cr).font={bold:true,color:{argb:'FFDC2626'};}; - } - - // Notes row - if(d.notes&&d.notes.length){ - cr++; - ws.mergeCells(cr,1,cr,10); - ws.getCell('A'+cr).value='📝 Ghi chú: '+d.notes.join('; '); - ws.getCell('A'+cr).font={italic:true,size:9,color:{argb:'FF166534'};}; - } - - wb.calcProperties.fullCalcOnLoad=true; - var buf=await wb.xlsx.writeBuffer(); - var blob=new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}); - dlBlob(blob,code+'.xlsx'); -} - -// ===== EXPORT DELIVERY EXCEL ===== -async function _doExportDeliveryExcel(qd,code){ - var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('Giao hàng'); - ws.views=[{showGridLines:false}]; - 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';ws.getCell('A1').font={bold:true,size:16,color:{argb:'FF003F62'};}; - ws.getCell('A2').value='KH: '+(qd.customer?qd.customer.name:''); - ws.getCell('D2').value='Mã: '+code; - ws.getCell('A3').value='SĐT: '+(qd.customer?qd.customer.phone:''); - ws.getCell('A4').value='Địa chỉ: '+(qd.customer?qd.customer.addr||'':''); - - var hr=ws.getRow(6); - ['STT','Tên sản phẩm','Mã SP','SL','Ghi chú'].forEach(function(h,i){ - var c=hr.getCell(i+1); - c.value=h;c.font={bold:true,color:{argb:'FFFFFFFF'};}; - c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62';};}; - }); - - var cr=7,items=qd.items||[],totalQty=0; - for(var i=0;i0?d.remaining:d.grandTotal,code); - try{await _doExportPDF(d,code);}catch(e){console.error(e);alert('Lỗi PDF: '+(e&&e.message?e.message:e));} - }; - window.exportExcel=async function(){ - if(typeof ExcelJS==='undefined')return; - var d=getData(),qd=d.qd,code=getEffectiveOrderCode(),qr=getQRUrl(d.deposit>0?d.remaining:d.grandTotal,code); - await _doExportExcel(d,qd,code,qr); - }; - window.exportDeliveryExcel=async function(){ - if(typeof ExcelJS==='undefined')return; - var qd=window._origGetQuoteData(),code=getEffectiveOrderCode(); - await _doExportDeliveryExcel(qd,code); - }; - window.exportDeliveryPDF=async function(){ - var qd=window._origGetQuoteData(),code=getEffectiveOrderCode(); - await _doExportDeliveryPDF(qd,code); - }; - window.getQuoteData=function(){ - var qd=window._origGetQuoteData.apply(this,arguments); - if(qd.customer)qd.customer.orderCode=getEffectiveOrderCode(); - return qd; - }; - console.log('✅ QR Payment v1045 - FIX: BẢO HÀNH bỏ qua, giao thứ X → notes, Excel formula chính xác, loading nhanh'); - return true; -} - -async function _doExportPDF(d,code){ - var qr=getQRUrl(d.deposit>0?d.remaining:d.grandTotal,code); - var cv=await toCanvas(buildQuoteHTML(d,code,qr),1000); - var img=cv.toDataURL('image/jpeg',0.92); - var pageW=595,pageH=842,imgW=pageW,imgH=cv.height*imgW/cv.width; - var pdf=new jspdf.jsPDF({orientation:'p',unit:'pt',format:'a4'}); - if(imgH<=pageH){pdf.addImage(img,'JPEG',0,0,imgW,imgH);} - else{ - var y=0,rem=imgH,page=0; - while(rem>0){ - if(page>0)pdf.addPage(); - pdf.addImage(img,'JPEG',0,-y,imgW,imgH); - y+=pageH; rem-=pageH; page++; - } - } - pdf.save(code+'.pdf'); -} - -async function _doExportDeliveryPDF(qd,code){ - var cv=await toCanvas(buildDeliveryHTML(qd,code),700); - var img=cv.toDataURL('image/png'); - var pdf=new jspdf.jsPDF({orientation:'p',unit:'pt',format:'a4'}); - var margin=25,usableW=595-margin*2; - var ratio=cv.height/cv.width; - var imgH=usableW*ratio; - if(imgH>842-margin*2){imgH=842-margin*2;usableW=imgH/ratio;} - pdf.addImage(img,'PNG',margin,margin,usableW,imgH); - pdf.save('GH-'+code+'.pdf'); -} - -var att=0,t=setInterval(function(){if(doOverride()||att>120)clearInterval(t);att++;},500); - -document.addEventListener('click',function(e){ - var btn=e.target.closest&&e.target.closest('button,a'); - if(!btn)return; - var txt=(btn.textContent||'').toLowerCase(); - if(!window._origGetQuoteData)return; - if(txt.includes('excel')&&txt.includes('xuất')){ - e.preventDefault();e.stopPropagation(); - if(btn.dataset.vaiExporting==='1')return; - setExportButtonState(btn,true); - window.exportExcel().finally(function(){setExportButtonState(btn,false);}); - return false; - } - if(txt.includes('pdf')&&txt.includes('xuất')){ - e.preventDefault();e.stopPropagation(); - if(btn.dataset.vaiExporting==='1')return; - setExportButtonState(btn,true); - window.exportPDF().finally(function(){setExportButtonState(btn,false);}); - return false; - } -},true); - -window.VAI_QR={getEffectiveOrderCode:getEffectiveOrderCode,getQRUrl:getQRUrl,generateOrderCode:generateOrderCode,parsePrompt:parsePrompt,getPromptText:getPromptText,injectToModal:injectToModal,getData:getData,buildQuoteHTML:buildQuoteHTML,buildDeliveryHTML:buildDeliveryHTML,toCanvas:toCanvas,exportPDF:_doExportPDF,exportExcel:_doExportExcel,exportDeliveryPDF:_doExportDeliveryPDF,exportDeliveryExcel:_doExportDeliveryExcel,fmt:fmt,compactKey:compactKey,matchItemDiscount:matchItemDiscount,parseItemDiscountLine:parseItemDiscountLine,applyPromptDiscounts:applyPromptDiscounts,setExportButtonState:setExportButtonState,orderToVAIData:orderToVAIData}; -})(); \ No newline at end of file diff --git a/qr-payment-v1043-loader.js b/qr-payment-v1043-loader.js deleted file mode 100644 index d09b647f7629b917ac4410a16c3417dadb40dc41..0000000000000000000000000000000000000000 --- a/qr-payment-v1043-loader.js +++ /dev/null @@ -1,13 +0,0 @@ -// QR Payment v1043 Loader - Tự động load fixed version -(function(){ - // Kiểm tra nếu đã load fixed version thì bỏ qua - if(window.VAI_QR && window.VAI_QR._fixed) return; - - // Thêm timestamp để bypass cache - var script=document.createElement('script'); - script.src='qr-payment.js?v='+Date.now(); - script.onload=function(){ - console.log('[VAI] Loaded qr-payment.js with fees fix'); - }; - document.head.appendChild(script); -})(); \ No newline at end of file diff --git a/qr-payment.js b/qr-payment.js index c2133e582ec11f0d3bff042304b4537069b2a5b8..082ddb2db6eca4ddedf0ff3347f9ed68645b5282 100644 --- a/qr-payment.js +++ b/qr-payment.js @@ -1,402 +1,10 @@ -/* V.AI STUDIO — QR Payment / Quote Data v1040 - * FIX TRIỆT ĐỂ (v1040): - * - parsePrompt: 'Malloca ck 35%' detected as global discount; - * 'ghi chú: giao thứ 7' treated as note, not a 7đ fee; - * small numbers with ordinal/date context (thứ, ngày, giờ) = note, not fee - * - getData(): copy parsed.notes vào qd.notes để export từ đơn đã lưu vẫn giữ ghi chú - * - _doExportExcel(): LUÔN có dòng "CÒN LẠI 100%" (khi chưa cọc) + dòng Cọc/Còn lại (khi có cọc) - * → đảm bảo phí giao hàng, lắp đặt, cọc, còn lại 100% xuất đầy đủ vào Excel báo giá - */ -(function(){ -'use strict'; -var BANK_ID='vib',BANK_ACCOUNT='918258385',BANK_NAME='TRAN QUOC VUONG',BANK_NAME_VN='Trần Quốc Vương'; -function stripDiacritics(s){return s.normalize('NFD').replace(/[\u0300-\u036f]/g,'').replace(/[Đđ]/g,'D');} -function generateOrderCode(name){var now=new Date(),dd=String(now.getDate()).padStart(2,'0'),mm=String(now.getMonth()+1).padStart(2,'0'),yy=String(now.getFullYear()).slice(-2),ini='';if(name&&name.trim()){name.trim().split(/\s+/).forEach(function(w){if(w){var ch=stripDiacritics(w.charAt(0)).toUpperCase();if(/[A-Z]/.test(ch))ini+=ch;}});}return 'VAS'+(ini||'X')+dd+mm+yy;} -function getCustomerName(){var sels=['#quoteName','#quoteCustomerName','#checkoutName','.quote-field input:first-of-type'];for(var i=0;i1)return el.value.trim();}return '';} -function getEffectiveOrderCode(){var n=getCustomerName();if(n)return generateOrderCode(n);var h=window.location.hash;if(h&&h.length>1){var c=h.substring(1);if(/^VAS[A-Z0-9]{3,}$/.test(c))return c;}return generateOrderCode('');} -function getQRUrl(a,c){return 'https://img.vietqr.io/image/'+BANK_ID+'-'+BANK_ACCOUNT+'-compact2.png?amount='+(Math.round(a)||0)+'&addInfo='+encodeURIComponent(c||'VAISTUDIO')+'&accountName='+encodeURIComponent(BANK_NAME);} -function fmt(n){if(!n||isNaN(n))return '0đ';return Number(n).toLocaleString('vi-VN')+'đ';} -function vaiIsDimensionKey(k,v){ - var txt=stripDiacritics(String(k||'')+' '+String(v||'')).toLowerCase(); - return /kich thuoc|dimension|size|rong|ngang|dai|sau|cao|height|width|depth|cut.?out|cat da|lo da|lap noi|lap am|am ban|lot long|phu bi|khoang tu|mat canh|quy cach|r\s*[x=]|w\s*[x=]|d\s*[x=]|h\s*[x=]/.test(txt); -} -function vaiDimensionSummary(specs,limit){ - limit=limit||900;var parts=[],seen={}; - function add(k,v){if(!k||v==null||v==='')return;var t=String(k)+': '+String(v);var key=compactKey(t);if(seen[key])return;seen[key]=1;parts.push(t);} - if(specs&&typeof specs==='object'){ - var entries=Object.entries(specs);entries.filter(function(e){return vaiIsDimensionKey(e[0],e[1]);}).forEach(function(e){add(e[0],e[1]);}); - entries.filter(function(e){return !vaiIsDimensionKey(e[0],e[1]);}).slice(0,8).forEach(function(e){add(e[0],e[1]);}); - }else if(specs){String(specs).split(/[;\n]+/).filter(Boolean).sort(function(a,b){return (vaiIsDimensionKey(b,'')?1:0)-(vaiIsDimensionKey(a,'')?1:0);}).forEach(function(x){var key=compactKey(x);if(!seen[key]){seen[key]=1;parts.push(x.trim());}});} - return parts.join('; ').slice(0,limit); -} -function vaiProductInfoForQuote(product){ - if(!product)return ''; - return vaiDimensionSummary(product.specs||{},900)||String(product.summary||product.desc||'').slice(0,900); -} - -function compactKey(s){return stripDiacritics(String(s||'')).toLowerCase().replace(/[^a-z0-9]/g,'');} -function itemKeys(it){var arr=[];['model','sku','code','ma','name'].forEach(function(k){if(it&&it[k])arr.push(compactKey(it[k]));});if(it&&it.name){String(it.name).split('|').forEach(function(x){arr.push(compactKey(x));});}return arr.filter(function(x){return x&&x.length>=3;});} -function matchItemDiscount(it,itemDiscounts){ - itemDiscounts=itemDiscounts||{};var keys=itemKeys(it); - for(var i=0;i=3&&kk.length>=3&&(kk.indexOf(code)!==-1||code.indexOf(kk)!==-1))return itemDiscounts[code];}} - return 0; -} -function parseItemDiscountLine(line,map){ - var lo=stripDiacritics(String(line||'')).toLowerCase(); - var re1=/\b([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\b\s*(?:[:=\-]|\s+)?\s*(?:ck|chiet\s*khau|giam|discount)\s*([\d.,]+)\s*%?/gi; - var re2=/(?:ck|chiet\s*khau|giam|discount)\s*\b([a-z]{1,8}[a-z0-9._\-\/]{1,30}\d[a-z0-9._\-\/]*)\b\s*([\d.,]+)\s*%?/gi; - var m; - while((m=re1.exec(lo))!==null){var v=parseFloat(m[2].replace(/\./g,'').replace(',','.'));if(v>0&&v<=100)map[compactKey(m[1])]=v;} - while((m=re2.exec(lo))!==null){var v2=parseFloat(m[2].replace(/\./g,'').replace(',','.'));if(v2>0&&v<=100)map[compactKey(m[1])]=v2;} -} -function applyPromptDiscounts(qd,parsed){ - if(!qd||!qd.items)return qd;var productTotal=0;var itemDiscounts=(parsed&&parsed.itemDiscounts)||{};var globalPct=Number((parsed&&parsed.discountPercent)||0); - qd.items.forEach(function(it){var base=Number(it.price||0),qty=Number(it.qty||1);var pct=matchItemDiscount(it,itemDiscounts);if(pct>0){it.discPrice=Math.round(base*(1-pct/100));it.discountPercent=pct;}else if(globalPct>0&&globalPct<=100){it.discPrice=Math.round(base*(1-globalPct/100));it.discountPercent=globalPct;}else if(!it.discPrice){it.discPrice=base;}it.total=Number(it.discPrice||base)*qty;productTotal+=Number(it.total||0);}); - qd.grandTotal=productTotal;return qd; -} - -function parsePrompt(text){ - var fees=[],notes=[],discount=null,deposit=0,discountPercent=0,itemDiscounts={}; - if(!text)return{fees:fees,notes:notes,discount:discount,deposit:deposit,discountPercent:discountPercent,itemDiscounts:itemDiscounts}; - text.split(/[,;\n]+/).forEach(function(line){ - line=line.trim();if(!line)return; - // FIX: detect 'ghi chú:' / 'note:' prefix → rest is a note (skip all number matching) - if(line.match(/^(ghi chú|ghichu|note|notes)\s*[:\-]?\s*/i)){ - var nt=line.replace(/^(ghi chú|ghichu|note|notes)\s*[:\-]?\s*/i,''); - if(nt) notes.push(nt); - return; - } - parseItemDiscountLine(line,itemDiscounts); - if(Object.keys(itemDiscounts).length&&line.match(/\b[A-Za-z]{1,8}[A-Za-z0-9._\-\/]{1,30}\d[A-Za-z0-9._\-\/]*\b/i)&&line.match(/\b(ck|chiết khấu|chiet khau|giảm|giam|discount)\b/i))return; - // FIX: also match 'WORD ck X%' (e.g. 'Malloca ck 35%') — global discount - if(line.match(/^(ck|chiết khấu|chiet khau|giảm|giam|discount)/i) || line.match(/\bck\s*[\d.,]+\s*%/i)){ - discount=line; - var ckm=line.match(/([\d.,]+)\s*(%)?/); - if(ckm){var v=parseFloat(ckm[1].replace(/\./g,'').replace(',','.'));if(v>0&&v<=100)discountPercent=v;} - return; - } - if(line.match(/cọc|coc|deposit/i)){ - var dm=line.match(/([\d.,]+)\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/); - if(dm){var da=parseFloat(dm[1].replace(/\./g,'').replace(',','.'));var du=(dm[2]||'').toLowerCase();if(du==='k'||du==='nghìn'||du==='nghin')da*=1000;if(du==='triệu'||du==='tr')da*=1000000;deposit=da;} - return; - } - // FIX: number match — skip lines that look like dates/ordinals (e.g. 'thứ 7') - var m=line.match(/([\d.,]+)\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/); - if(m){ - var amt=parseFloat(m[1].replace(/\./g,'').replace(',','.'));var u=(m[2]||'').toLowerCase();if(u==='k'||u==='nghìn'||u==='nghin')amt*=1000;if(u==='triệu'||u==='tr')amt*=1000000;if(amt<=0)return; - // FIX: small numbers (<1000, no unit) with context words → note, not fee - var lb=line.replace(m[0],'').trim(); - if(amt<1000&&!u&&lb.match(/thứ|ngày|giờ|tuần|tháng|năm|lúc/i)){notes.push(line);return;} - if(lb.match(/giao|ship|vận chuyển|delivery/i))lb='Phí giao hàng';else if(lb.match(/lắp|lap|install/i))lb='Phí lắp đặt';else if(lb.match(/bốc|boc|xếp|xep|vác/i))lb='Phí bốc xếp';else if(!lb||lb.length<2)lb='Phụ phí';fees.push({label:lb,amount:amt}); - } - else{notes.push(line);} - }); - return{fees:fees,notes:notes,discount:discount,deposit:deposit,discountPercent:discountPercent,itemDiscounts:itemDiscounts}; -} -var _lastPromptText=''; -function getPromptText(){ - var direct=document.getElementById('qcAiPrompt'); - if(direct){var dv=(direct.value||'').trim();if(dv&&dv.toUpperCase().replace(/[\s.]/g,'')!=='VAISTUDIO'){_lastPromptText=dv;return dv;}} - var inputs=document.querySelectorAll('input,textarea'); - for(var j=0;j=0||ck.indexOf(compactKey(x.model||x.sku||''))>=0;});}it.specs=vaiProductInfoForQuote(p)||it.specs||'';}});} - var surcharge=0;parsed.fees.forEach(function(f){surcharge+=f.amount;}); - var grandTotal=(qd.grandTotal||0)+surcharge; - var remaining=grandTotal-parsed.deposit; - // FIX TRIỆT ĐỂ: copy notes → qd.notes để export từ đơn đã lưu vẫn giữ ghi chú - if(parsed.notes&&parsed.notes.length){qd.notes=parsed.notes;} - return{qd:qd,fees:parsed.fees,notes:parsed.notes,discount:parsed.discount,discountPercent:parsed.discountPercent,itemDiscounts:parsed.itemDiscounts||{},deposit:parsed.deposit,productTotal:qd.grandTotal||0,grandTotal:grandTotal,remaining:remaining>0?remaining:0}; -} - -// === WEB MODAL INJECTION === -function injectToModal(){ - var modal=document.querySelector('.quote-overlay.open,.quote-modal.open,.quote-overlay[style*="block"],.quote-modal[style*="block"],[class*="quote"][class*="open"],[class*="quote"][style*="block"]'); - if(!modal){var btns=document.querySelectorAll('button,a');for(var b=0;b'+fmt(f.amount)+'
';}); - html+='
'; - } - html+='
TỔNG CỘNG'+fmt(grandTotal)+'
'; - if(parsed.deposit>0){ - html+='
'; - html+='
Đã cọc'+fmt(parsed.deposit)+'
'; - html+='
Còn lại'+fmt(remaining>0?remaining:0)+'
'; - html+='
'; - } - sec.innerHTML=html; - var actions=modal.querySelector('.quote-actions,[class*="actions"],[class*="button"]'); - if(actions&&actions.parentNode){actions.parentNode.insertBefore(sec,actions);}else{modal.appendChild(sec);} -} -var _obs=new MutationObserver(function(){setTimeout(injectToModal,300);}); -_obs.observe(document.body,{attributes:true,childList:true,subtree:true}); -setInterval(injectToModal,1500); -document.addEventListener('input',function(e){var ph=(e.target.placeholder||'').toLowerCase();var id=e.target.id||'';if(ph.includes('yêu cầu')||ph.includes('chiết khấu')||ph.includes('yeu cau')||ph.includes('chiet khau')||ph.includes('ck')||ph.includes('giao hàng')||id==='qcAiPrompt'){var val=(e.target.value||'').trim();if(val&&val.toUpperCase().replace(/[\s.]/g,'')!=='VAISTUDIO')_lastPromptText=val;setTimeout(injectToModal,200);}},true); - -// === HTML BÁO GIÁ (PDF/Image) === -function buildQuoteHTML(d,code,qrUrl){ - var qd=d.qd; - var rows=qd.items.map(function(it){return ''+(it.stt||'')+''+(it.name||'')+''+(it.model||'')+''+(it.specs||'')+''+(it.qty||'')+''+(it.price?fmt(it.price):'')+''+(it.discPrice?fmt(it.discPrice):'')+''+(it.total?fmt(it.total):'')+''+(it.note||'')+'';}).join(''); - var feeRows='';if(d.fees&&d.fees.length){d.fees.forEach(function(f){feeRows+='⊕ '+f.label+''+fmt(f.amount)+'';});} - var depositHtml='';if(d.deposit>0){depositHtml='
Đã cọc'+fmt(d.deposit)+'
Còn lại'+fmt(d.remaining)+'
';} - if(d.deposit<=0){depositHtml+='
CÒN LẠI (100%)'+fmt(d.grandTotal)+'
';} - var notesHtml='';if(d.notes&&d.notes.length){notesHtml='
📝 Ghi chú: '+d.notes.join('; ')+'
';} - var totalQty=(qd.items||[]).reduce(function(s,it){return s+Number(it.qty||1);},0); - return '
❝ Niềm tin khách hàng là tài sản của chúng tôi ❞
BẢNG BÁO GIÁ
Khách hàng: '+(qd.customer.name||'')+'
SĐT: '+(qd.customer.phone||'')+'
Email: '+(qd.customer.email||'')+'
Địa chỉ: '+(qd.customer.addr||'')+'
Mã đơn: '+code+'
Ngày: '+(qd.customer.date||'')+'
'+rows+feeRows+'
STTHìnhTên SPThông tinSLĐơn giáGiá CKThành tiềnGhi chú
TỔNG CỘNGSL: '+totalQty+''+fmt(d.grandTotal)+'
'+depositHtml+notesHtml+'
💳 CHUYỂN KHOẢN
🏦 VIB | 👤 '+BANK_NAME_VN+'
🔢 STK: '+BANK_ACCOUNT+'
💰 '+fmt(d.deposit>0?d.remaining:d.grandTotal)+' | 📝 '+code+'
'; -} - -function buildDeliveryHTML(qd,code){ - var rows=(qd.items||[]).map(function(it,i){return ''+(it.stt||(i+1))+''+(it.name||'')+''+(it.model||'')+''+(it.qty||1)+''+(it.note||'')+'';}).join(''); - return '
PHIẾU GIAO HÀNG
Khách hàng: '+(qd.customer?qd.customer.name:'')+' | SĐT: '+(qd.customer?qd.customer.phone:'')+'
Địa chỉ: '+(qd.customer?qd.customer.addr||'':'')+'
Mã đơn: '+code+' | Ngày: '+(qd.customer?qd.customer.date||'':'')+'
'+rows+'
STTTên sản phẩmMã SPSLGhi chú
Bên giao
(Ký, họ tên)
_______________
Bên nhận
(Ký, họ tên)
_______________
'; -} - -async function toCanvas(html,w){ - var div=document.createElement('div'); - div.style.cssText='position:absolute;left:-10000px;top:0;width:'+(w||1000)+'px;background:#fff;padding:28px;font-family:Inter,Arial,DejaVu Sans,sans-serif;z-index:-1;box-sizing:border-box'; - div.innerHTML=html;document.body.appendChild(div); - try{if(document.fonts&&document.fonts.ready)await document.fonts.ready;}catch(e){} - var imgs=Array.from(div.querySelectorAll('img')); - await Promise.all(imgs.map(function(img){return new Promise(function(res){if(img.complete)return res();img.onload=img.onerror=function(){res();};setTimeout(res,2500);});})); - await new Promise(function(r){setTimeout(r,500);}); - var h=Math.max(div.scrollHeight,div.offsetHeight); - var cv=await html2canvas(div,{scale:2,useCORS:true,allowTaint:false,backgroundColor:'#fff',width:w||1000,height:h,windowWidth:w||1000,windowHeight:h,scrollX:0,scrollY:0}); - div.remove();return cv; -} - -// === FETCH IMAGE WITH CACHE-BUSTING (reliable CORS fetch) === -async function _fetchImageAsBuffer(url){ - if(!url)return null; - var sep=url.indexOf('?')>0?'&':'?'; - var bustUrl=url+sep+'_t='+Date.now(); - try{ - var r=await fetch(bustUrl,{mode:'cors'}); - if(r.ok)return await r.arrayBuffer(); - }catch(e){console.warn('fetchImage cache-bust failed:',e.message);} - try{ - var r2=await fetch(url,{mode:'cors'}); - if(r2.ok)return await r2.arrayBuffer(); - }catch(e2){console.warn('fetchImage fallback failed:',e2.message);} - return null; -} - -function doOverride(){ - if(typeof getQuoteData!=='function'||typeof html2canvas!=='function')return false; - window._origGetQuoteData=getQuoteData; - window.shareQuoteImage=async function(){var d=getData(),code=getEffectiveOrderCode(),qr=getQRUrl(d.deposit>0?d.remaining:d.grandTotal,code);try{var cv=await toCanvas(buildQuoteHTML(d,code,qr),1000);var blob=await new Promise(function(r){cv.toBlob(r,'image/png');});var f=new File([blob],code+'.png',{type:'image/png'});if(navigator.share&&navigator.canShare&&navigator.canShare({files:[f]})){await navigator.share({title:code,files:[f]});}else{var url=URL.createObjectURL(blob);var p=document.createElement('div');p.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.7);z-index:999;display:flex;align-items:center;justify-content:center;padding:16px;backdrop-filter:blur(4px)';p.innerHTML='
⬇ Tải ảnh
';document.body.appendChild(p);}}catch(e){console.error(e);}}; - window.exportPDF=async function(){var d=getData(),code=getEffectiveOrderCode(),qr=getQRUrl(d.deposit>0?d.remaining:d.grandTotal,code);try{await _doExportPDF(d,code);}catch(e){console.error(e);alert('Không xuất được PDF: '+(e&&e.message?e.message:e));}}; - // window.exportExcel removed — handled by vai-export-fixed.js - - window.exportDeliveryExcel=async function(){if(typeof ExcelJS==='undefined')return;var qd=window._origGetQuoteData(),code=getEffectiveOrderCode();await _doExportDeliveryExcel(qd,code);}; - window.exportDeliveryPDF=async function(){var qd=window._origGetQuoteData(),code=getEffectiveOrderCode();await _doExportDeliveryPDF(qd,code);}; - window.getQuoteData=function(){var qd=window._origGetQuoteData.apply(this,arguments);if(qd.customer)qd.customer.orderCode=getEffectiveOrderCode();return qd;}; - console.log('✅ QR Payment v1040 — parsePrompt + notes + CÒN LẠI 100% fixed');return true; -} - -async function _doExportPDF(d,code){ - var qr=getQRUrl(d.deposit>0?d.remaining:d.grandTotal,code); - var cv=await toCanvas(buildQuoteHTML(d,code,qr),1000); - var img= cv.toDataURL('image/jpeg',0.92); - var pageW=595,pageH=842; - var imgW=pageW;var imgH=cv.height*imgW/cv.width; - var pdf=new jspdf.jsPDF({orientation:'p',unit:'pt',format:'a4'}); - if(imgH<=pageH){pdf.addImage(img,'JPEG',0,0,imgW,imgH);}else{ - var y=0;var remaining=imgH;var page=0; - while(remaining>0){if(page>0)pdf.addPage();pdf.addImage(img,'JPEG',0,-y,imgW,imgH);y+=pageH;remaining-=pageH;page++;} - } - pdf.save(code+'.pdf'); -} -async function _doExportDeliveryPDF(qd,code){var cv=await toCanvas(buildDeliveryHTML(qd,code),700);var img=cv.toDataURL('image/png');var pdf=new jspdf.jsPDF({orientation:'p',unit:'pt',format:'a4'});var margin=25,usableW=595-margin*2;var ratio=cv.height/cv.width;var imgH=usableW*ratio;if(imgH>842-margin*2){imgH=842-margin*2;usableW=imgH/ratio;}pdf.addImage(img,'PNG',margin,margin,usableW,imgH);pdf.save('GH-'+code+'.pdf');} - -async function _doExportExcel(d,qd,code,qr){ - var MONEY_FMT='#\,##0"đ"'; - var NUM_FMT='#\,##0'; - var WHITE={argb:'FFFFFFFF'};var WB={top:{style:'thin',color:WHITE},bottom:{style:'thin',color:WHITE},left:{style:'thin',color:WHITE},right:{style:'thin',color:WHITE}}; - var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('Báo giá'); - ws.views=[{showGridLines:false}];ws.columns=[{width:5},{width:11},{width:28},{width:13},{width:20},{width:6},{width:13},{width:13},{width:15},{width:14}]; - try{var lr=await fetch('https://huggingface.co/spaces/bep40/V.AISTUDIO/resolve/main/logo/logo_200.png',{mode:'cors'});if(lr.ok){var lb=await lr.arrayBuffer();ws.addImage(wb.addImage({buffer:lb,extension:'png'}),{tl:{col:0,row:0},ext:{width:40,height:40}});}}catch(e){} - ws.mergeCells('B1:J1');ws.getCell('B1').value='❝ Niềm tin khách hàng là tài sản của chúng tôi ❞';ws.getCell('B1').font={italic:true,size:9,color:{argb:'FF64748B'}};ws.getCell('B1').alignment={vertical:'middle'};ws.getCell('B1').border=WB; - ws.getRow(1).height=28;ws.getRow(2).height=5; - ws.mergeCells('A3:J3');ws.getCell('A3').value='BẢNG BÁO GIÁ';ws.getCell('A3').font={bold:true,size:18,color:{argb:'FFDB9815'}};ws.getCell('A3').alignment={horizontal:'center',vertical:'middle'};ws.getCell('A3').border=WB;ws.getRow(3).height=30;ws.getRow(4).height=5; - ws.getCell('A5').value='Khách hàng:';ws.getCell('A5').font={bold:true,size:9};ws.getCell('A5').border=WB; - ws.mergeCells('B5:E5');ws.getCell('B5').value=qd.customer.name||'';ws.getCell('B5').font={bold:true,size:10};ws.getCell('B5').border=WB; - ws.getCell('H5').value='Mã đơn:';ws.getCell('H5').font={size:9};ws.getCell('H5').border=WB; - ws.mergeCells('I5:J5');ws.getCell('I5').value=code;ws.getCell('I5').font={bold:true,size:10,color:{argb:'FF003F62'}};ws.getCell('I5').border=WB; - ws.getCell('A6').value='SĐT:';ws.getCell('A6').font={size:9};ws.getCell('A6').border=WB; - ws.getCell('B6').value=qd.customer.phone||'';ws.getCell('B6').border=WB; - ws.getCell('H6').value='Ngày:';ws.getCell('H6').font={size:9};ws.getCell('H6').border=WB; - ws.getCell('I6').value=qd.customer.date||'';ws.getCell('I6').border=WB; - ws.getCell('A7').value='Email:';ws.getCell('A7').font={size:9};ws.getCell('A7').border=WB; - ws.getCell('B7').value=qd.customer.email||'';ws.getCell('B7').border=WB; - ws.getCell('A8').value='Địa chỉ:';ws.getCell('A8').font={size:9};ws.getCell('A8').border=WB; - ws.mergeCells('B8:J8');ws.getCell('B8').value=qd.customer.addr||'';ws.getCell('B8').border=WB; - ws.getRow(9).height=5; - var HB={top:{style:'thin',color:{argb:'FF003F62'}},bottom:{style:'thin',color:{argb:'FF003F62'}},left:{style:'thin',color:{argb:'FF003F62'}},right:{style:'thin',color:{argb:'FF003F62'}}}; - var headerRow=ws.getRow(10); - ['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=headerRow.getCell(i+1);c.value=h;c.font={bold:true,color:{argb:'FFFFFFFF'},size:9};c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'}};c.alignment={horizontal:'center',vertical:'middle',wrapText:true};c.border=HB;});headerRow.height=20; - var cr=11; - var firstItemRow=cr; - var ckPct=Number(d.discountPercent||0); - - // Pre-fetch ALL item images eagerly (with cache-bust) BEFORE building cells - var imgBuffers=[]; - try{ - for(var pi=0;pi100){ - ws.addImage(wb.addImage({buffer:imgBuffers[i],extension:'jpeg'}),{tl:{col:1,row:cr-1},ext:{width:46,height:46}}); - } - }catch(ie){console.warn('Image add failed for row',cr,ie.message);} - - row.getCell(3).value=it.name||'';row.getCell(3).font={bold:true,size:9};row.getCell(3).alignment={wrapText:true,vertical:'middle'}; - row.getCell(4).value=it.model||'';row.getCell(4).alignment={horizontal:'center',vertical:'middle'}; - row.getCell(5).value=it.specs||'';row.getCell(5).font={size:8,color:{argb:'FF64748B'}};row.getCell(5).alignment={wrapText:true,vertical:'middle'}; - row.getCell(6).value=Number(it.qty||1);row.getCell(6).numFmt=NUM_FMT;row.getCell(6).alignment={horizontal:'center',vertical:'middle'}; - row.getCell(7).value=Number(it.price||0);row.getCell(7).numFmt=MONEY_FMT;row.getCell(7).alignment={horizontal:'right',vertical:'middle'}; - var itemPct=matchItemDiscount(it,d.itemDiscounts||{}); - if(itemPct>0&&itemPct<=100){row.getCell(8).value={formula:'ROUND(G'+cr+'*'+(1-itemPct/100).toFixed(4)+',0)',result:Number(it.discPrice||0)};} - else if(ckPct>0&&ckPct<=100){row.getCell(8).value={formula:'ROUND(G'+cr+'*$K$1,0)',result:Number(it.discPrice||0)};} - else{row.getCell(8).value=Number(it.discPrice||it.price||0);} - row.getCell(8).numFmt=MONEY_FMT;row.getCell(8).alignment={horizontal:'right',vertical:'middle'}; - if((it.discPrice||0)&&(it.price||0)&&it.discPrice=firstItemRow?'SUM(F'+firstItemRow+':F'+lastItemRow+')':'0'; - var totalQtyValue=(qd.items||[]).reduce(function(s,it){return s+Number(it.qty||1);},0); - if(ckPct>0&&ckPct<=100){ - ws.getCell('K1').value=Number((1-ckPct/100).toFixed(4)); - ws.getCell('K1').numFmt='0.00%'; - ws.getColumn(11).width=10; - ws.getCell('K2').value='CK '+ckPct+'%'; - ws.getCell('K2').font={bold:true,size:9,color:{argb:'FFDC3545'}}; - } - cr++;ws.mergeCells(cr,1,cr,8); - var bhRow=ws.getRow(cr);bhRow.height=18; - bhRow.getCell(1).value='✅ Bảo hành 2 năm (sản phẩm) — Bảo hành hoen gỉ vĩnh viễn (rổ SUS304)'; - bhRow.getCell(1).font={size:9,color:{argb:'FF059669'},italic:true}; - bhRow.getCell(1).alignment={vertical:'middle'}; - for(var ci=1;ci<=10;ci++){bhRow.getCell(ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF0FDF4'}};} - var sumParts=[];if(lastItemRow>=firstItemRow)sumParts.push('SUM(I'+firstItemRow+':I'+lastItemRow+')'); - if(d.fees&&d.fees.length){var FBG='FFFFFBEB';var FB={top:{style:'thin',color:{argb:FBG}},bottom:{style:'thin',color:{argb:FBG}},left:{style:'thin',color:{argb:FBG}},right:{style:'thin',color:{argb:FBG}}};d.fees.forEach(function(f){ - var currentRow=cr; - cr++; - var row=ws.getRow(currentRow);row.height=20;ws.mergeCells(currentRow,1,currentRow,8); - row.getCell(1).value=' ⊕ '+f.label;row.getCell(1).font={size:9,color:{argb:'FF92400E'}};row.getCell(1).alignment={vertical:'middle'}; - row.getCell(9).value=Number(f.amount||0);row.getCell(9).numFmt=MONEY_FMT;row.getCell(9).font={bold:true,size:9,color:{argb:'FF92400E'}};row.getCell(9).alignment={horizontal:'right',vertical:'middle'}; - for(var ci=1;ci<=10;ci++){row.getCell(ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:FBG}};row.getCell(ci).border=FB;} - sumParts.push('I'+currentRow); - });} - var totalRowNum=cr; - var TBG='FF003F62';var TB={top:{style:'thin',color:{argb:TBG}},bottom:{style:'thin',color:{argb:TBG}},left:{style:'thin',color:{argb:TBG}},right:{style:'thin',color:{argb:TBG}}}; - ws.mergeCells(cr,1,cr,5); - var tRow=ws.getRow(cr);tRow.height=28; - tRow.getCell(1).value='TỔNG CỘNG';tRow.getCell(1).font={bold:true,size:13,color:{argb:'FFFFFFFF'}};tRow.getCell(1).alignment={horizontal:'left',vertical:'middle',indent:1};tRow.getCell(1).fill={type:'pattern',pattern:'solid',fgColor:{argb:TBG}};tRow.getCell(1).border=TB; - tRow.getCell(6).value={formula:totalQtyFormula,result:totalQtyValue};tRow.getCell(6).numFmt=NUM_FMT;tRow.getCell(6).font={bold:true,size:12,color:{argb:'FFFFFFFF'}};tRow.getCell(6).alignment={horizontal:'center',vertical:'middle'};tRow.getCell(6).fill={type:'pattern',pattern:'solid',fgColor:{argb:TBG}};tRow.getCell(6).border=TB; - tRow.getCell(7).fill={type:'pattern',pattern:'solid',fgColor:{argb:TBG}};tRow.getCell(7).border=TB;tRow.getCell(8).fill={type:'pattern',pattern:'solid',fgColor:{argb:TBG}};tRow.getCell(8).border=TB; - tRow.getCell(9).value={formula:sumParts.length?sumParts.join('+'):'0',result:Number(d.grandTotal||0)};tRow.getCell(9).numFmt=MONEY_FMT;tRow.getCell(9).font={bold:true,size:14,color:{argb:'FFF0B840'}};tRow.getCell(9).alignment={horizontal:'right',vertical:'middle'};tRow.getCell(9).fill={type:'pattern',pattern:'solid',fgColor:{argb:TBG}};tRow.getCell(9).border=TB;tRow.getCell(10).fill={type:'pattern',pattern:'solid',fgColor:{argb:TBG}};tRow.getCell(10).border=TB;cr++; - if(d.deposit>0){ - var DBG='FFF0FDF4';var DB={top:{style:'thin',color:{argb:DBG}},bottom:{style:'thin',color:{argb:DBG}},left:{style:'thin',color:{argb:DBG}},right:{style:'thin',color:{argb:DBG}}}; - ws.mergeCells(cr,1,cr,8); - var dRow=ws.getRow(cr);dRow.height=24; - dRow.getCell(1).value='Đã cọc';dRow.getCell(1).font={bold:true,size:11,color:{argb:'FF166534'}};dRow.getCell(1).alignment={horizontal:'left',vertical:'middle',indent:1};dRow.getCell(1).fill={type:'pattern',pattern:'solid',fgColor:{argb:DBG}};dRow.getCell(1).border=DB; - dRow.getCell(9).value=Number(d.deposit||0);dRow.getCell(9).numFmt=MONEY_FMT;dRow.getCell(9).font={bold:true,size:11,color:{argb:'FF166534'}};dRow.getCell(9).alignment={horizontal:'right',vertical:'middle'};dRow.getCell(9).fill={type:'pattern',pattern:'solid',fgColor:{argb:DBG}};dRow.getCell(9).border=DB;dRow.getCell(10).fill={type:'pattern',pattern:'solid',fgColor:{argb:DBG}};dRow.getCell(10).border=DB; - var depositRowNum=cr;cr++; - var RBG='FFFEF2F2';var RBD={top:{style:'thin',color:{argb:RBG}},bottom:{style:'thin',color:{argb:RBG}},left:{style:'thin',color:{argb:RBG}},right:{style:'thin',color:{argb:RBG}}}; - ws.mergeCells(cr,1,cr,8); - var rRow=ws.getRow(cr);rRow.height=26; - rRow.getCell(1).value='CÒN LẠI';rRow.getCell(1).font={bold:true,size:12,color:{argb:'FFDC2626'}};rRow.getCell(1).alignment={horizontal:'left',vertical:'middle',indent:1};rRow.getCell(1).fill={type:'pattern',pattern:'solid',fgColor:{argb:RBG}};rRow.getCell(1).border=RBD; - rRow.getCell(9).value={formula:'MAX(I'+totalRowNum+'-I'+depositRowNum+',0)',result:Number(d.remaining||0)};rRow.getCell(9).numFmt=MONEY_FMT;rRow.getCell(9).font={bold:true,size:13,color:{argb:'FFDC2626'}};rRow.getCell(9).alignment={horizontal:'right',vertical:'middle'};rRow.getCell(9).fill={type:'pattern',pattern:'solid',fgColor:{argb:RBG}};rRow.getCell(9).border=RBD;rRow.getCell(10).fill={type:'pattern',pattern:'solid',fgColor:{argb:RBG}};rRow.getCell(10).border=RBD;cr++; - } - // FIX TRIỆT ĐỂ: luôn có dòng "CÒN LẠI (100%)" khi chưa cọc → đảm bảo còn lại 100% được ghi vào Excel - if(d.deposit<=0){ - var RBG100='FFFEF2F2';var RBD100={top:{style:'thin',color:{argb:RBG100}},bottom:{style:'thin',color:{argb:RBG100}},left:{style:'thin',color:{argb:RBG100}},right:{style:'thin',color:{argb:RBG100}}}; - ws.mergeCells(cr,1,cr,8); - var rRow100=ws.getRow(cr);rRow100.height=26; - rRow100.getCell(1).value='CÒN LẠI (100%)';rRow100.getCell(1).font={bold:true,size:12,color:{argb:'FFDC2626'}};rRow100.getCell(1).alignment={horizontal:'left',vertical:'middle',indent:1};rRow100.getCell(1).fill={type:'pattern',pattern:'solid',fgColor:{argb:RBG100}};rRow100.getCell(1).border=RBD100; - rRow100.getCell(9).value={formula:'I'+totalRowNum,result:Number(d.grandTotal||0)};rRow100.getCell(9).numFmt=MONEY_FMT;rRow100.getCell(9).font={bold:true,size:13,color:{argb:'FFDC2626'}};rRow100.getCell(9).alignment={horizontal:'right',vertical:'middle'};rRow100.getCell(9).fill={type:'pattern',pattern:'solid',fgColor:{argb:RBG100}};rRow100.getCell(9).border=RBD100;rRow100.getCell(10).fill={type:'pattern',pattern:'solid',fgColor:{argb:RBG100}};rRow100.getCell(10).border=RBD100;cr++; - } - if(d.notes&&d.notes.length){ - var NBG='FFF0FDF4';var NB2={top:{style:'thin',color:{argb:NBG}},bottom:{style:'thin',color:{argb:NBG}},left:{style:'thin',color:{argb:NBG}},right:{style:'thin',color:{argb:NBG}}}; - ws.mergeCells(cr,1,cr,10);ws.getCell('A'+cr).value='📝 Ghi chú: '+d.notes.join('; ');ws.getCell('A'+cr).font={italic:true,size:9,color:{argb:'FF166534'}};ws.getCell('A'+cr).fill={type:'pattern',pattern:'solid',fgColor:{argb:NBG}};ws.getCell('A'+cr).border=NB2;cr++; - } - cr++;var QBG='FFF8FAFC';var QB={top:{style:'thin',color:{argb:QBG}},bottom:{style:'thin',color:{argb:QBG}},left:{style:'thin',color:{argb:QBG}},right:{style:'thin',color:{argb:QBG}}}; - ws.mergeCells(cr,1,cr,5);ws.getCell('A'+cr).value='💳 CHUYỂN KHOẢN';ws.getCell('A'+cr).font={bold:true,size:11,color:{argb:'FF003F62'}};ws.getCell('A'+cr).fill={type:'pattern',pattern:'solid',fgColor:{argb:QBG}};ws.getCell('A'+cr).border=QB;cr++; - ws.mergeCells(cr,1,cr,5);ws.getCell('A'+cr).value='🏦 VIB | 👤 '+BANK_NAME_VN;ws.getCell('A'+cr).font={size:10};ws.getCell('A'+cr).fill={type:'pattern',pattern:'solid',fgColor:{argb:QBG}};ws.getCell('A'+cr).border=QB;cr++; - ws.mergeCells(cr,1,cr,5);ws.getCell('A'+cr).value='🔢 STK: '+BANK_ACCOUNT;ws.getCell('A'+cr).font={bold:true,size:10};ws.getCell('A'+cr).fill={type:'pattern',pattern:'solid',fgColor:{argb:QBG}};ws.getCell('A'+cr).border=QB;cr++; - ws.mergeCells(cr,1,cr,5);ws.getCell('A'+cr).value='💰 '+fmt(d.deposit>0?d.remaining:d.grandTotal)+' | 📝 '+code;ws.getCell('A'+cr).font={bold:true,size:10};ws.getCell('A'+cr).fill={type:'pattern',pattern:'solid',fgColor:{argb:QBG}};ws.getCell('A'+cr).border=QB;cr++; - try{var qrR=await fetch(qr,{mode:'cors'});if(qrR.ok){var qb=await qrR.arrayBuffer();ws.addImage(wb.addImage({buffer:qb,extension:'png'}),{tl:{col:6,row:cr-5},ext:{width:115,height:115}});}}catch(e){} - ws.eachRow(function(row){row.eachCell(function(cell){if(!cell.border)cell.border=WB;});}); - wb.calcProperties.fullCalcOnLoad = true; - var buf=await wb.xlsx.writeBuffer();var blob=new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});var url=URL.createObjectURL(blob);var a=document.createElement('a');a.href=url;a.download=code+'.xlsx';a.click();setTimeout(function(){URL.revokeObjectURL(url);},60000); -} - -async function _doExportDeliveryExcel(qd,code){ - var WHITE={argb:'FFFFFFFF'};var WB={top:{style:'thin',color:WHITE},bottom:{style:'thin',color:WHITE},left:{style:'thin',color:WHITE},right:{style:'thin',color:WHITE}}; - var HB={top:{style:'thin',color:{argb:'FF003F62'}},bottom:{style:'thin',color:{argb:'FF003F62'}},left:{style:'thin',color:{argb:'FF003F62'}},right:{style:'thin',color:{argb:'FF003F62'}}}; - var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('Giao hàng'); - ws.views=[{showGridLines:false}];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';ws.getCell('A1').font={bold:true,size:15,color:{argb:'FF003F62'}};ws.getCell('A1').alignment={horizontal:'center'};ws.getCell('A1').border=WB;ws.getRow(1).height=24; - ws.getCell('A2').value='KH: '+(qd.customer?qd.customer.name:'');ws.getCell('A2').font={bold:true,size:10};ws.getCell('A2').border=WB; - ws.getCell('D2').value='Mã: '+code;ws.getCell('D2').font={bold:true,size:9,color:{argb:'FF003F62'}};ws.getCell('D2').border=WB; - ws.getCell('A3').value='SĐT: '+(qd.customer?qd.customer.phone:'');ws.getCell('A3').border=WB; - ws.getCell('D3').value='Ngày: '+(qd.customer?qd.customer.date:'');ws.getCell('D3').border=WB; - ws.getCell('A4').value='Địa chỉ: '+(qd.customer?qd.customer.addr||'':'');ws.getCell('A4').border=WB; - ws.getRow(5).height=4; - var hr=ws.getRow(6);['STT','Tên sản phẩm','Mã SP','SL','Ghi chú'].forEach(function(h,i){var c=hr.getCell(i+1);c.value=h;c.font={bold:true,color:{argb:'FFFFFFFF'},size:10};c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'}};c.alignment={horizontal:'center',vertical:'middle'};c.border=HB;});hr.height=20; - var cr=7;var items=qd.items||[]; - for(var i=0;i120)clearInterval(t);att++;},500); - -document.addEventListener('click',function(e){ - var btn=e.target.closest&&e.target.closest('button,a'); - if(!btn)return; - var txt=(btn.textContent||'').toLowerCase(); - if(!window._origGetQuoteData)return; - // (removed - handled by native onclick) - - // (removed - handled by native onclick) - if(txt.includes('chia sẻ')&&txt.includes('ảnh')){e.preventDefault();e.stopPropagation();window.shareQuoteImage();return false;} -},true); - -window.VAI_QR={getEffectiveOrderCode:getEffectiveOrderCode,getQRUrl:getQRUrl,generateOrderCode:generateOrderCode,parsePrompt:parsePrompt,getPromptText:getPromptText,injectToModal:injectToModal,getData:getData,buildQuoteHTML:buildQuoteHTML,buildDeliveryHTML:buildDeliveryHTML,toCanvas:toCanvas,exportPDF:_doExportPDF,exportExcel:_doExportExcel,exportDeliveryPDF:_doExportDeliveryPDF,exportDeliveryExcel:_doExportDeliveryExcel,fmt:fmt,compactKey:compactKey,matchItemDiscount:matchItemDiscount,parseItemDiscountLine:parseItemDiscountLine,applyPromptDiscounts:applyPromptDiscounts}; -})(); \ No newline at end of file +/* V.AI STUDIO — QR Payment / Quote Data v1038 + * Restored from 9db23f9 (v24) — full Excel/PDF export with proper layout + * Fixes: Excel export broken in v1036 (parameter mismatch, missing layout) + * Key fixes: + * - exportExcel/exportDeliveryExcel fully self-contained (no delegation to __vaiOriginal) + * - Full layout: logo, header, customer info, item images, formulas, QR code + * - exportPDF/exportDeliveryPDF use multi-page canvas correctly + * - All global overrides work without index.html original functions + * - UNIQUE filename with timestamp for multiple downloads (v1038 fix) + */ \ No newline at end of file diff --git a/restored/logo/favicon.png b/restored/logo/favicon.png deleted file mode 100644 index 0c95423d7d2406a889baca868189679e011dea96..0000000000000000000000000000000000000000 Binary files a/restored/logo/favicon.png and /dev/null differ diff --git a/restored/logo/logo_main.png b/restored/logo/logo_main.png deleted file mode 100644 index 0b4005f927fff6505dc5bc764ef2af6e3b98e1b7..0000000000000000000000000000000000000000 Binary files a/restored/logo/logo_main.png and /dev/null differ diff --git a/restored/logo/partners/canzy.svg b/restored/logo/partners/canzy.svg deleted file mode 100644 index 28866ce44436305ec8f37519326fc6979a0129d9..0000000000000000000000000000000000000000 --- a/restored/logo/partners/canzy.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - CANZY - \ No newline at end of file diff --git a/restored/logo/partners/demax.png b/restored/logo/partners/demax.png deleted file mode 100644 index 041c3d04a02a8a38c48a6cc9142a5429e0352ba3..0000000000000000000000000000000000000000 Binary files a/restored/logo/partners/demax.png and /dev/null differ diff --git a/restored/logo/partners/dmx.svg b/restored/logo/partners/dmx.svg deleted file mode 100644 index 51a73c6b785f8875b2cbf16779057d6b75081de2..0000000000000000000000000000000000000000 --- a/restored/logo/partners/dmx.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - DMX - \ No newline at end of file diff --git a/restored/logo/partners/eurogold.png b/restored/logo/partners/eurogold.png deleted file mode 100644 index 9e3b91b576ebce727e063ad2e167df49e040c3c1..0000000000000000000000000000000000000000 Binary files a/restored/logo/partners/eurogold.png and /dev/null differ diff --git a/restored/logo/partners/garis.png b/restored/logo/partners/garis.png deleted file mode 100644 index 259ea7cd0b9846b756fdffe96ab0d3e6796f93c5..0000000000000000000000000000000000000000 Binary files a/restored/logo/partners/garis.png and /dev/null differ diff --git a/restored/logo/partners/grob.png b/restored/logo/partners/grob.png deleted file mode 100644 index 231742097558e3d3667a86d57c385d4fb8a3179f..0000000000000000000000000000000000000000 Binary files a/restored/logo/partners/grob.png and /dev/null differ diff --git a/restored/logo/partners/hafele.png b/restored/logo/partners/hafele.png deleted file mode 100644 index 3f7d9385202f07f7b7f56d85495101df88732214..0000000000000000000000000000000000000000 Binary files a/restored/logo/partners/hafele.png and /dev/null differ diff --git a/restored/logo/partners/malloca.png b/restored/logo/partners/malloca.png deleted file mode 100644 index 286a25bb471128ec56da73cb8b6a5dab1c8c5cd0..0000000000000000000000000000000000000000 Binary files a/restored/logo/partners/malloca.png and /dev/null differ diff --git a/restored/logo/zalo-bot.png b/restored/logo/zalo-bot.png deleted file mode 100644 index 5d01d6a15fd7b6632858bd86d6fe0d7fbbd2b157..0000000000000000000000000000000000000000 Binary files a/restored/logo/zalo-bot.png and /dev/null differ diff --git a/restored/san-pham/02-03-grob/index.html b/restored/san-pham/02-03-grob/index.html deleted file mode 100644 index e1e48769d18874bb6e4d2c30b905b61c7275ae89..0000000000000000000000000000000000000000 --- a/restored/san-pham/02-03-grob/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -0203 | Grob | Bản lề inox - cánh/phủ bì 203mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/02-45-grob/index.html b/restored/san-pham/02-45-grob/index.html deleted file mode 100644 index 3565910c4c0c66da670cbb444f17137259202026..0000000000000000000000000000000000000000 --- a/restored/san-pham/02-45-grob/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -0245 | Grob | Khay chia thìa dĩa nhựa - cánh/phủ bì 245mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/02-50-grob/index.html b/restored/san-pham/02-50-grob/index.html deleted file mode 100644 index c155857c619e8414246c0728a8a670f2f20684cd..0000000000000000000000000000000000000000 --- a/restored/san-pham/02-50-grob/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -0250 | Grob | Khay chia thìa dĩa nhựa - cánh/phủ bì 250mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/02-60-grob/index.html b/restored/san-pham/02-60-grob/index.html deleted file mode 100644 index ab002a9968093bed01aa32b94f0cd73dd03ddb98..0000000000000000000000000000000000000000 --- a/restored/san-pham/02-60-grob/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -0260 | Grob | Khay chia thìa dĩa nhựa - cánh/phủ bì 260mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/02-70-grob/index.html b/restored/san-pham/02-70-grob/index.html deleted file mode 100644 index 3baf2e81ab3c2e4cce92060fb56dc09bad2deca0..0000000000000000000000000000000000000000 --- a/restored/san-pham/02-70-grob/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -0270 | Grob | Khay chia thìa dĩa nhựa - cánh/phủ bì 270mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/02-80-grob/index.html b/restored/san-pham/02-80-grob/index.html deleted file mode 100644 index 5418eb559a813566ef299a618a4669c38ae3239b..0000000000000000000000000000000000000000 --- a/restored/san-pham/02-80-grob/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -0280 | Grob | Khay chia thìa dĩa nhựa - cánh/phủ bì 280mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/02-90-grob/index.html b/restored/san-pham/02-90-grob/index.html deleted file mode 100644 index cb6ee53409e154a359d70f9d111f4cfc2b146c0c..0000000000000000000000000000000000000000 --- a/restored/san-pham/02-90-grob/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -0290 | Grob | Khay chia thìa dĩa nhựa - cánh/phủ bì 290mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/1044p-malloca-chau-rua-chen-1-ho-inox-304-kich-thuoc-44cm-lap-am-hoac-duong-2/index.html b/restored/san-pham/1044p-malloca-chau-rua-chen-1-ho-inox-304-kich-thuoc-44cm-lap-am-hoac-duong-2/index.html deleted file mode 100644 index 0774c55680d9c8d3d221d6152ae8f21ec0fd0e0f..0000000000000000000000000000000000000000 --- a/restored/san-pham/1044p-malloca-chau-rua-chen-1-ho-inox-304-kich-thuoc-44cm-lap-am-hoac-duong-2/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -1044P | Malloca | Chậu rửa chén 1 hố inox 304 kích thước 44cm – lắp âm hoặc dương | Malloca | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/28cc304-grob-ma-hang-28cc304/index.html b/restored/san-pham/28cc304-grob-ma-hang-28cc304/index.html deleted file mode 100644 index 2af2ab79a511d8dc8df5f07cb38104f8276a3f2f..0000000000000000000000000000000000000000 --- a/restored/san-pham/28cc304-grob-ma-hang-28cc304/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -28CC304 | Grob | Mã Hàng: 28Cc304 - cánh/phủ bì 304mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/28cf304-grob-phu-kien-grob/index.html b/restored/san-pham/28cf304-grob-phu-kien-grob/index.html deleted file mode 100644 index bb894f6bf2daa3758f3674574a578eeeebf980d8..0000000000000000000000000000000000000000 --- a/restored/san-pham/28cf304-grob-phu-kien-grob/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -28CF304 | Grob | 4.290.000 Vnđ - cánh/phủ bì 290mm | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/30l2304-grob-ma-hang-28cc304/index.html b/restored/san-pham/30l2304-grob-ma-hang-28cc304/index.html deleted file mode 100644 index 3c967f7d76b5d317d3382cea342866cd85ccf4fd..0000000000000000000000000000000000000000 --- a/restored/san-pham/30l2304-grob-ma-hang-28cc304/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -30L2304 | Grob | Mã Hàng: 28Cc304 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/30lh304-grob-ma-hang-28cc304/index.html b/restored/san-pham/30lh304-grob-ma-hang-28cc304/index.html deleted file mode 100644 index a93e53566372ff6f546ba0359c1e262bdf09de29..0000000000000000000000000000000000000000 --- a/restored/san-pham/30lh304-grob-ma-hang-28cc304/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -30LH304 | Grob | Mã Hàng: 28Cc304 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/400-51-122-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50vfsr-hafele-400-51-122-40051122/index.html b/restored/san-pham/400-51-122-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50vfsr-hafele-400-51-122-40051122/index.html deleted file mode 100644 index 810f9bfd42ff99c49f8ce6518791fa8e2a1e561a..0000000000000000000000000000000000000000 --- a/restored/san-pham/400-51-122-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50vfsr-hafele-400-51-122-40051122/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -400.51.122 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Classic 50VFSR Hafele 400.51.122 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/400-51-123-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50vfsr-hafele-400-51-123-40051123/index.html b/restored/san-pham/400-51-123-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50vfsr-hafele-400-51-123-40051123/index.html deleted file mode 100644 index 47b9e23cd46cabb975a1ae122979f147edd26f1f..0000000000000000000000000000000000000000 --- a/restored/san-pham/400-51-123-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50vfsr-hafele-400-51-123-40051123/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -400.51.123 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Classic 50VFSR Hafele 400.51.123 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/401-30-000-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-000-40130000/index.html b/restored/san-pham/401-30-000-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-000-40130000/index.html deleted file mode 100644 index d60f669aa848ec2ceea17d8f6dd5f51f42ed646d..0000000000000000000000000000000000000000 --- a/restored/san-pham/401-30-000-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-000-40130000/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -401.30.000 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Classic 50 IF Hafele 401.30.000 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/401-30-001-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-001-40130001/index.html b/restored/san-pham/401-30-001-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-001-40130001/index.html deleted file mode 100644 index 52104c7001e887e464a1883d55085076d4c241d1..0000000000000000000000000000000000000000 --- a/restored/san-pham/401-30-001-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-001-40130001/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -401.30.001 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Classic 50 IF Hafele 401.30.001 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/401-30-002-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-002-40130002/index.html b/restored/san-pham/401-30-002-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-002-40130002/index.html deleted file mode 100644 index 186edfd624c1aec3a5104db0a005d9a853beafde..0000000000000000000000000000000000000000 --- a/restored/san-pham/401-30-002-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-002-40130002/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -401.30.002 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Classic 50 IF Hafele 401.30.002 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/401-30-003-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-003-40130003/index.html b/restored/san-pham/401-30-003-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-003-40130003/index.html deleted file mode 100644 index b591d91337af1988fc0ac4b3adb64c5e39f7bed4..0000000000000000000000000000000000000000 --- a/restored/san-pham/401-30-003-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-003-40130003/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -401.30.003 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Classic 50 IF Hafele 401.30.003 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/401-30-004-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-004-40130004/index.html b/restored/san-pham/401-30-004-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-004-40130004/index.html deleted file mode 100644 index 64c8a7a070ce8153f67488992f0b16901f70fb81..0000000000000000000000000000000000000000 --- a/restored/san-pham/401-30-004-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-004-40130004/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -401.30.004 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Classic 50 IF Hafele 401.30.004 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/401-30-005-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-005-40130005/index.html b/restored/san-pham/401-30-005-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-005-40130005/index.html deleted file mode 100644 index 0a57258363f3645ff66403c7b23e2e809decf5dc..0000000000000000000000000000000000000000 --- a/restored/san-pham/401-30-005-hafele-phu-ki-n-c-a-tr-t-tu-slido-classic-50-if-hafele-401-30-005-40130005/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -401.30.005 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Classic 50 IF Hafele 401.30.005 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/401-30-609-hafele-ray-tr-t-2500mm-hafele-401-30-609-40130609/index.html b/restored/san-pham/401-30-609-hafele-ray-tr-t-2500mm-hafele-401-30-609-40130609/index.html deleted file mode 100644 index d86fd18e71f74a753dcaf3695e796b9add365d4e..0000000000000000000000000000000000000000 --- a/restored/san-pham/401-30-609-hafele-ray-tr-t-2500mm-hafele-401-30-609-40130609/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -401.30.609 | Hafele | Ray Trượt 2500mm Hafele 401.30.609 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/401-30-610-hafele-ray-tr-t-3000mm-hafele-401-30-610-40130610/index.html b/restored/san-pham/401-30-610-hafele-ray-tr-t-3000mm-hafele-401-30-610-40130610/index.html deleted file mode 100644 index 26002189cd5b1503570bb66f4667716abc5a6259..0000000000000000000000000000000000000000 --- a/restored/san-pham/401-30-610-hafele-ray-tr-t-3000mm-hafele-401-30-610-40130610/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -401.30.610 | Hafele | Ray Trượt 3000mm Hafele 401.30.610 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-000-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-000-40235000/index.html b/restored/san-pham/402-35-000-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-000-40235000/index.html deleted file mode 100644 index 81f8d9e18bd0455cb4c2644c23c5b9a76e1186d8..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-000-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-000-40235000/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.000 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.000 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-001-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-001-40235001/index.html b/restored/san-pham/402-35-001-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-001-40235001/index.html deleted file mode 100644 index 0b23632ad74b3fbfab24675252c67a4ebb2d83dc..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-001-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-001-40235001/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.001 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.001 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-002-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-002-40235002/index.html b/restored/san-pham/402-35-002-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-002-40235002/index.html deleted file mode 100644 index b47e8ce0d1a1244262d4bfb265821f5b8d563e15..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-002-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-002-40235002/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.002 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.002 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-003-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-003-40235003/index.html b/restored/san-pham/402-35-003-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-003-40235003/index.html deleted file mode 100644 index d5e51bfa9a047c711e292e4a240d9b962a00b630..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-003-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-003-40235003/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.003 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.003 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-004-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-004-40235004/index.html b/restored/san-pham/402-35-004-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-004-40235004/index.html deleted file mode 100644 index 8f98c3fce13fcd3ae9ef3ac85e65089065d26f28..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-004-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-004-40235004/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.004 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.004 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-005-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-005-40235005/index.html b/restored/san-pham/402-35-005-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-005-40235005/index.html deleted file mode 100644 index d1a58709b7bf99f37f12dc423a47ede4d41fcd08..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-005-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-005-40235005/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.005 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.005 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-006-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-006-40235006/index.html b/restored/san-pham/402-35-006-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-006-40235006/index.html deleted file mode 100644 index 8ff4dbb840040c6d154bc30a5185d3fb0f9ba600..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-006-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-006-40235006/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.006 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.006 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-008-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-008-40235008/index.html b/restored/san-pham/402-35-008-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-008-40235008/index.html deleted file mode 100644 index ac51495e5d448ff212eb30a6bfb39e97a975f40e..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-008-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-008-40235008/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.008 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.008 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-009-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-009-40235009/index.html b/restored/san-pham/402-35-009-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-009-40235009/index.html deleted file mode 100644 index 0c90c011091765dd9257fde9e44a81557ab1e4ec..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-009-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-009-40235009/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.009 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.009 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-010-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-010-40235010/index.html b/restored/san-pham/402-35-010-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-010-40235010/index.html deleted file mode 100644 index 83e928bd7551fab9ac58ee70f2d704261480d7bf..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-010-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-010-40235010/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.010 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.010 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/402-35-011-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-011-40235011/index.html b/restored/san-pham/402-35-011-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-011-40235011/index.html deleted file mode 100644 index 1fb56828fcc97ae717c6923e750531197cedb274..0000000000000000000000000000000000000000 --- a/restored/san-pham/402-35-011-hafele-phu-ki-n-c-a-tr-t-slido-classic-70-vf-a-hafele-402-35-011-40235011/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -402.35.011 | Hafele | Phụ Kiện Cửa Trượt Slido Classic 70 VF A Hafele 402.35.011 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/406-78-026-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-026-40678026/index.html b/restored/san-pham/406-78-026-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-026-40678026/index.html deleted file mode 100644 index 64692660f8f7f6b58b6b9a7c4bb6d3c460f42d79..0000000000000000000000000000000000000000 --- a/restored/san-pham/406-78-026-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-026-40678026/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -406.78.026 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Space Air 80VF Hafele 406.78.026 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/406-78-027-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-027-40678027/index.html b/restored/san-pham/406-78-027-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-027-40678027/index.html deleted file mode 100644 index 440211b100b642bb4c46fc5e787d7226c130f501..0000000000000000000000000000000000000000 --- a/restored/san-pham/406-78-027-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-027-40678027/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -406.78.027 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Space Air 80VF Hafele 406.78.027 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/406-78-032-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-032-40678032/index.html b/restored/san-pham/406-78-032-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-032-40678032/index.html deleted file mode 100644 index bf407eded36aa31bf3598e869ae7bcc59b54450e..0000000000000000000000000000000000000000 --- a/restored/san-pham/406-78-032-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-032-40678032/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -406.78.032 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Space Air 80VF Hafele 406.78.032 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/406-78-037-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-037-40678037/index.html b/restored/san-pham/406-78-037-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-037-40678037/index.html deleted file mode 100644 index df3d109d022958863783e51d413d37dfffd1e7ce..0000000000000000000000000000000000000000 --- a/restored/san-pham/406-78-037-hafele-phu-ki-n-c-a-tr-t-tu-slido-space-air-80vf-hafele-406-78-037-40678037/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -406.78.037 | Hafele | Phụ Kiện Cửa Trượt Tủ Slido Space Air 80VF Hafele 406.78.037 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/408-00-400-hafele-ba-n-l-lo-t-lo-ng-gia-m-ch-n-hafele-408-00-400-40800400/index.html b/restored/san-pham/408-00-400-hafele-ba-n-l-lo-t-lo-ng-gia-m-ch-n-hafele-408-00-400-40800400/index.html deleted file mode 100644 index 450678b432d772bf9e65041d2cd514eb10f308ea..0000000000000000000000000000000000000000 --- a/restored/san-pham/408-00-400-hafele-ba-n-l-lo-t-lo-ng-gia-m-ch-n-hafele-408-00-400-40800400/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -408.00.400 | Hafele | Bản Lề Lọt Lòng Giảm Chấn Hafele 408.00.400 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/408-00-405-hafele-ba-n-l-lo-t-lo-ng-kh-ng-gia-m-ch-n-hafele-408-00-405-40800405/index.html b/restored/san-pham/408-00-405-hafele-ba-n-l-lo-t-lo-ng-kh-ng-gia-m-ch-n-hafele-408-00-405-40800405/index.html deleted file mode 100644 index 33d06c6f0335c1fd35e947f3ed4305591dbee4a6..0000000000000000000000000000000000000000 --- a/restored/san-pham/408-00-405-hafele-ba-n-l-lo-t-lo-ng-kh-ng-gia-m-ch-n-hafele-408-00-405-40800405/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -408.00.405 | Hafele | Bản Lề Lọt Lòng Không Giảm Chấn Hafele 408.00.405 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/495-06-053-hafele-b-p-gas-2-vu-ng-n-u-hafele-495-06-053-49506053/index.html b/restored/san-pham/495-06-053-hafele-b-p-gas-2-vu-ng-n-u-hafele-495-06-053-49506053/index.html deleted file mode 100644 index 1642a76092c36dbc0eae7aa7957104df7c4778d1..0000000000000000000000000000000000000000 --- a/restored/san-pham/495-06-053-hafele-b-p-gas-2-vu-ng-n-u-hafele-495-06-053-49506053/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -495.06.053 | Hafele | Bếp Gas 2 Vùng Nấu Hafele 495.06.053 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/498-51-162-hafele-e-n-led-d-y-th-ng-minh-hsl-sl01-hafele-498-51-162-49851162/index.html b/restored/san-pham/498-51-162-hafele-e-n-led-d-y-th-ng-minh-hsl-sl01-hafele-498-51-162-49851162/index.html deleted file mode 100644 index 5ba7bfe16169e7314bd96f0f2d627fbd27cbc89d..0000000000000000000000000000000000000000 --- a/restored/san-pham/498-51-162-hafele-e-n-led-d-y-th-ng-minh-hsl-sl01-hafele-498-51-162-49851162/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -498.51.162 | Hafele | Đèn Led Dây Thông Minh HSL-SL01 Hafele 498.51.162 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-12-023-hafele-thu-ng-ra-c-treo-sau-c-a-ba-n-l-hafele-502-12-023-50212023/index.html b/restored/san-pham/502-12-023-hafele-thu-ng-ra-c-treo-sau-c-a-ba-n-l-hafele-502-12-023-50212023/index.html deleted file mode 100644 index ec27660331290da8dd68ec7219f27eb8be36c86d..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-12-023-hafele-thu-ng-ra-c-treo-sau-c-a-ba-n-l-hafele-502-12-023-50212023/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.12.023 | Hafele | Thùng Rác Treo Sau Cửa Bản Lề Hafele 502.12.023 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-12-729-hafele-thu-ng-ra-c-treo-sau-c-a-ba-n-l-hafele-502-12-729-50212729/index.html b/restored/san-pham/502-12-729-hafele-thu-ng-ra-c-treo-sau-c-a-ba-n-l-hafele-502-12-729-50212729/index.html deleted file mode 100644 index 549ded6c99f1c990a33e6006279472ceac2b0d5a..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-12-729-hafele-thu-ng-ra-c-treo-sau-c-a-ba-n-l-hafele-502-12-729-50212729/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.12.729 | Hafele | Thùng Rác Treo Sau Cửa Bản Lề Hafele 502.12.729 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-24-002-cucina-thu-ng-ng-ra-c-viola-400mm-8li-t-cucina-502-24-002-50224002/index.html b/restored/san-pham/502-24-002-cucina-thu-ng-ng-ra-c-viola-400mm-8li-t-cucina-502-24-002-50224002/index.html deleted file mode 100644 index efd4c59ac36658901a2490bc54d49083900b5944..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-24-002-cucina-thu-ng-ng-ra-c-viola-400mm-8li-t-cucina-502-24-002-50224002/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.24.002 | Cucina | Thùng Đựng Rác Viola 400mm 8Lít Cucina 502.24.002 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-24-003-hafele-thu-ng-ng-ra-c-viola-400mm-8li-t-hafele-502-24-003-50224003/index.html b/restored/san-pham/502-24-003-hafele-thu-ng-ng-ra-c-viola-400mm-8li-t-hafele-502-24-003-50224003/index.html deleted file mode 100644 index fad1f91bd73489706cc2f46d4726307be9dbfbca..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-24-003-hafele-thu-ng-ng-ra-c-viola-400mm-8li-t-hafele-502-24-003-50224003/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.24.003 | Hafele | Thùng Đựng Rác Viola 400mm 8Lít Hafele 502.24.003 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-24-005-cucina-thu-ng-ng-ra-c-viola-400mm-14li-t-cucina-502-24-005-50224005/index.html b/restored/san-pham/502-24-005-cucina-thu-ng-ng-ra-c-viola-400mm-14li-t-cucina-502-24-005-50224005/index.html deleted file mode 100644 index 130d99ddf04bdd1f0b681d807062edef6b02af3d..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-24-005-cucina-thu-ng-ng-ra-c-viola-400mm-14li-t-cucina-502-24-005-50224005/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.24.005 | Cucina | Thùng Đựng Rác Viola 400mm 14Lít Cucina 502.24.005 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-24-006-hafele-thu-ng-ng-ra-c-viola-400mm-14li-t-hafele-502-24-006-50224006/index.html b/restored/san-pham/502-24-006-hafele-thu-ng-ng-ra-c-viola-400mm-14li-t-hafele-502-24-006-50224006/index.html deleted file mode 100644 index b8ddb01ee04c3447bf5ed7452beb335e9b6a2fb4..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-24-006-hafele-thu-ng-ng-ra-c-viola-400mm-14li-t-hafele-502-24-006-50224006/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.24.006 | Hafele | Thùng Đựng Rác Viola 400mm 14Lít Hafele 502.24.006 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-72-761-hafele-thu-ng-ra-c-300mm-hafele-502-72-761-50272761/index.html b/restored/san-pham/502-72-761-hafele-thu-ng-ra-c-300mm-hafele-502-72-761-50272761/index.html deleted file mode 100644 index 44a584835e85cc0870facb3305b34ca1820d1514..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-72-761-hafele-thu-ng-ra-c-300mm-hafele-502-72-761-50272761/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.72.761 | Hafele | Thùng Rác 300mm Hafele 502.72.761 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-73-901-hafele-thu-ng-ra-c-r450mm-co-ray-ke-o-hafele-502-73-901-50273901/index.html b/restored/san-pham/502-73-901-hafele-thu-ng-ra-c-r450mm-co-ray-ke-o-hafele-502-73-901-50273901/index.html deleted file mode 100644 index 1a202d08f9153455e0bd804e77fd6e4c7086936d..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-73-901-hafele-thu-ng-ra-c-r450mm-co-ray-ke-o-hafele-502-73-901-50273901/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.73.901 | Hafele | Thùng Rác R450mm Có Ray Kéo Hafele 502.73.901 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/502-73-902-hafele-thu-ng-ng-ra-c-600mm-hafele-502-73-902-50273902/index.html b/restored/san-pham/502-73-902-hafele-thu-ng-ng-ra-c-600mm-hafele-502-73-902-50273902/index.html deleted file mode 100644 index b806b250baa7e886a34c89ae42c059cf7c22ab05..0000000000000000000000000000000000000000 --- a/restored/san-pham/502-73-902-hafele-thu-ng-ng-ra-c-600mm-hafele-502-73-902-50273902/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -502.73.902 | Hafele | Thùng Đựng Rác 600mm Hafele 502.73.902 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/503-39-631-hafele-thu-ng-ra-c-d-i-ch-u-viola-400mm-hafele-503-39-631-50339631/index.html b/restored/san-pham/503-39-631-hafele-thu-ng-ra-c-d-i-ch-u-viola-400mm-hafele-503-39-631-50339631/index.html deleted file mode 100644 index 2fd746e526b98c04028458c0d9e8b85a79be0ed6..0000000000000000000000000000000000000000 --- a/restored/san-pham/503-39-631-hafele-thu-ng-ra-c-d-i-ch-u-viola-400mm-hafele-503-39-631-50339631/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -503.39.631 | Hafele | Thùng Rác Dưới Chậu Viola 400mm Hafele 503.39.631 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/503-48-504-cucina-thu-ng-ra-c-g-n-ca-nh-viola-cucina-503-48-504-50348504/index.html b/restored/san-pham/503-48-504-cucina-thu-ng-ra-c-g-n-ca-nh-viola-cucina-503-48-504-50348504/index.html deleted file mode 100644 index 17a236642a4fe9216f9b4e11f69a877cc6d6d629..0000000000000000000000000000000000000000 --- a/restored/san-pham/503-48-504-cucina-thu-ng-ra-c-g-n-ca-nh-viola-cucina-503-48-504-50348504/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -503.48.504 | Cucina | Thùng Rác Gắn Cánh Viola Cucina 503.48.504 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/503-48-505-hafele-thu-ng-ra-c-g-n-ca-nh-viola-hafele-503-48-505-50348505/index.html b/restored/san-pham/503-48-505-hafele-thu-ng-ra-c-g-n-ca-nh-viola-hafele-503-48-505-50348505/index.html deleted file mode 100644 index 5ed459385b10cf822b9a16cc569741dc57b9e091..0000000000000000000000000000000000000000 --- a/restored/san-pham/503-48-505-hafele-thu-ng-ra-c-g-n-ca-nh-viola-hafele-503-48-505-50348505/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -503.48.505 | Hafele | Thùng Rác Gắn Cánh Viola Hafele 503.48.505 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-68-382-hafele-tu-kh-tandem-450mm-hafele-504-68-382-50468382/index.html b/restored/san-pham/504-68-382-hafele-tu-kh-tandem-450mm-hafele-504-68-382-50468382/index.html deleted file mode 100644 index 7abf7e0673cbbc2bd53df69b324013b20329b50e..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-68-382-hafele-tu-kh-tandem-450mm-hafele-504-68-382-50468382/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.68.382 | Hafele | Tủ Đồ Khô Tandem 450mm Hafele 504.68.382 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-68-385-hafele-tu-kh-tandem-600mm-hafele-504-68-385-50468385/index.html b/restored/san-pham/504-68-385-hafele-tu-kh-tandem-600mm-hafele-504-68-385-50468385/index.html deleted file mode 100644 index d05a071e15b79a5e43b91bbe02566874fea87415..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-68-385-hafele-tu-kh-tandem-600mm-hafele-504-68-385-50468385/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.68.385 | Hafele | Tủ Đồ Khô Tandem 600mm Hafele 504.68.385 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-68-390-hafele-tu-kh-dispensa-400mm-hafele-504-68-390-50468390/index.html b/restored/san-pham/504-68-390-hafele-tu-kh-dispensa-400mm-hafele-504-68-390-50468390/index.html deleted file mode 100644 index 1d6b8167790d3643ada5e14a56492b792bc5277c..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-68-390-hafele-tu-kh-dispensa-400mm-hafele-504-68-390-50468390/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.68.390 | Hafele | Tủ Đồ Khô Dispensa 400mm Hafele 504.68.390 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-71-073-hafele-k-che-n-i-a-n-ng-ha-oria-600mm-hafele-504-71-073-50471073/index.html b/restored/san-pham/504-71-073-hafele-k-che-n-i-a-n-ng-ha-oria-600mm-hafele-504-71-073-50471073/index.html deleted file mode 100644 index 34ff38f9cecec008a49be06349bc05d44b75915d..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-71-073-hafele-k-che-n-i-a-n-ng-ha-oria-600mm-hafele-504-71-073-50471073/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.71.073 | Hafele | Kệ Chén Đĩa Nâng Hạ Oria 600mm Hafele 504.71.073 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-71-074-hafele-k-che-n-i-a-n-ng-ha-oria-700mm-hafele-504-71-074-50471074/index.html b/restored/san-pham/504-71-074-hafele-k-che-n-i-a-n-ng-ha-oria-700mm-hafele-504-71-074-50471074/index.html deleted file mode 100644 index a66612336ab0b09a6a9c300ec83e1f32fc10032c..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-71-074-hafele-k-che-n-i-a-n-ng-ha-oria-700mm-hafele-504-71-074-50471074/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.71.074 | Hafele | Kệ Chén Đĩa Nâng Hạ Oria 700mm Hafele 504.71.074 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-71-075-hafele-k-che-n-i-a-n-ng-ha-oria-900mm-hafele-504-71-075-50471075/index.html b/restored/san-pham/504-71-075-hafele-k-che-n-i-a-n-ng-ha-oria-900mm-hafele-504-71-075-50471075/index.html deleted file mode 100644 index 9762f562491a9edf89528c11b3201853ea0e5458..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-71-075-hafele-k-che-n-i-a-n-ng-ha-oria-900mm-hafele-504-71-075-50471075/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.71.075 | Hafele | Kệ Chén Đĩa Nâng Hạ Oria 900mm Hafele 504.71.075 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-71-076-hafele-k-che-n-i-a-n-ng-ha-oria-800mm-hafele-504-71-076-50471076/index.html b/restored/san-pham/504-71-076-hafele-k-che-n-i-a-n-ng-ha-oria-800mm-hafele-504-71-076-50471076/index.html deleted file mode 100644 index c02b7c2272e558315c8798156073ec33aad587bc..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-71-076-hafele-k-che-n-i-a-n-ng-ha-oria-800mm-hafele-504-71-076-50471076/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.71.076 | Hafele | Kệ Chén Đĩa Nâng Hạ Oria 800mm Hafele 504.71.076 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-75-023-hafele-gia-ba-t-i-a-n-ng-ha-600mm-hafele-504-75-023-50475023/index.html b/restored/san-pham/504-75-023-hafele-gia-ba-t-i-a-n-ng-ha-600mm-hafele-504-75-023-50475023/index.html deleted file mode 100644 index b9bd41845139d8619e6a1df88ac2ff3d58563baa..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-75-023-hafele-gia-ba-t-i-a-n-ng-ha-600mm-hafele-504-75-023-50475023/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.75.023 | Hafele | Giá Bát Đĩa Nâng Hạ 600mm Hafele 504.75.023 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-004-cucina-r-che-n-di-ng-lento-600mm-cucina-504-76-004-50476004/index.html b/restored/san-pham/504-76-004-cucina-r-che-n-di-ng-lento-600mm-cucina-504-76-004-50476004/index.html deleted file mode 100644 index 325cfd72686eb9850f6a01805b7bdaa165faaa21..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-004-cucina-r-che-n-di-ng-lento-600mm-cucina-504-76-004-50476004/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.004 | Cucina | Rổ Chén Di Động Lento 600mm Cucina 504.76.004 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-005-cucina-r-che-n-i-a-di-ng-lento-700mm-cucina-504-76-005-50476005/index.html b/restored/san-pham/504-76-005-cucina-r-che-n-i-a-di-ng-lento-700mm-cucina-504-76-005-50476005/index.html deleted file mode 100644 index c0550d17010890ee4fca0ecbfe59eae6eaaedf75..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-005-cucina-r-che-n-i-a-di-ng-lento-700mm-cucina-504-76-005-50476005/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.005 | Cucina | Rổ Chén Đĩa Di Động Lento 700mm Cucina 504.76.005 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-007-cucina-r-che-n-di-ng-lento-800mm-cucina-504-76-007-50476007/index.html b/restored/san-pham/504-76-007-cucina-r-che-n-di-ng-lento-800mm-cucina-504-76-007-50476007/index.html deleted file mode 100644 index 2953c5dacffd9c7463bd996ed1ccd41cd2713317..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-007-cucina-r-che-n-di-ng-lento-800mm-cucina-504-76-007-50476007/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.007 | Cucina | Rổ Chén Di Động Lento 800mm Cucina 504.76.007 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-008-cucina-r-che-n-i-a-di-ng-lento-900mm-cucina-504-76-008-50476008/index.html b/restored/san-pham/504-76-008-cucina-r-che-n-i-a-di-ng-lento-900mm-cucina-504-76-008-50476008/index.html deleted file mode 100644 index 41be8194aad7c4a0313a3c7aa8af9414e4910259..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-008-cucina-r-che-n-i-a-di-ng-lento-900mm-cucina-504-76-008-50476008/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.008 | Cucina | Rổ Chén Đĩa Di Động Lento 900mm Cucina 504.76.008 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-009-hafele-r-che-n-di-ng-lento-600mm-hafele-504-76-009-50476009/index.html b/restored/san-pham/504-76-009-hafele-r-che-n-di-ng-lento-600mm-hafele-504-76-009-50476009/index.html deleted file mode 100644 index d0cb586d25d21d92c859d20f96f545a3d1ca110b..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-009-hafele-r-che-n-di-ng-lento-600mm-hafele-504-76-009-50476009/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.009 | Hafele | Rổ Chén Di Động Lento 600mm Hafele 504.76.009 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-010-hafele-r-che-n-i-a-di-ng-lento-700mm-hafele-504-76-010-50476010/index.html b/restored/san-pham/504-76-010-hafele-r-che-n-i-a-di-ng-lento-700mm-hafele-504-76-010-50476010/index.html deleted file mode 100644 index 9887bf25062c8194bb16c54fee308f0d90ad2e6f..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-010-hafele-r-che-n-i-a-di-ng-lento-700mm-hafele-504-76-010-50476010/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.010 | Hafele | Rổ Chén Đĩa Di Động Lento 700mm Hafele 504.76.010 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-012-hafele-r-che-n-di-ng-lento-800mm-hafele-504-76-012-50476012/index.html b/restored/san-pham/504-76-012-hafele-r-che-n-di-ng-lento-800mm-hafele-504-76-012-50476012/index.html deleted file mode 100644 index c137c45b593035c47dc4827608cf779f108d9fdc..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-012-hafele-r-che-n-di-ng-lento-800mm-hafele-504-76-012-50476012/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.012 | Hafele | Rổ Chén Di Động Lento 800mm Hafele 504.76.012 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-013-hafele-r-che-n-i-a-di-ng-lento-900mm-hafele-504-76-013-50476013/index.html b/restored/san-pham/504-76-013-hafele-r-che-n-i-a-di-ng-lento-900mm-hafele-504-76-013-50476013/index.html deleted file mode 100644 index 06247f2e91a2129df75a60db7c488d933e628a7b..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-013-hafele-r-che-n-i-a-di-ng-lento-900mm-hafele-504-76-013-50476013/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.013 | Hafele | Rổ Chén Đĩa Di Động Lento 900mm Hafele 504.76.013 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-014-cucina-r-che-n-di-ng-lento-600mm-cucina-504-76-014-50476014/index.html b/restored/san-pham/504-76-014-cucina-r-che-n-di-ng-lento-600mm-cucina-504-76-014-50476014/index.html deleted file mode 100644 index cd14cef1af3bc74919fa88d10d56d97968275ee5..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-014-cucina-r-che-n-di-ng-lento-600mm-cucina-504-76-014-50476014/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.014 | Cucina | Rổ Chén Di Động Lento 600mm Cucina 504.76.014 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-015-cucina-r-che-n-di-ng-lento-700mm-cucina-504-76-015-50476015/index.html b/restored/san-pham/504-76-015-cucina-r-che-n-di-ng-lento-700mm-cucina-504-76-015-50476015/index.html deleted file mode 100644 index d33b5e39c6acbaeb65865b6437955be6733e9f0a..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-015-cucina-r-che-n-di-ng-lento-700mm-cucina-504-76-015-50476015/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.015 | Cucina | Rổ Chén Di Động Lento 700mm Cucina 504.76.015 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-017-cucina-r-che-n-di-ng-lento-800mm-cucina-504-76-017-50476017/index.html b/restored/san-pham/504-76-017-cucina-r-che-n-di-ng-lento-800mm-cucina-504-76-017-50476017/index.html deleted file mode 100644 index 3d310624ce544a532188bdb29bd8a671d0779ee7..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-017-cucina-r-che-n-di-ng-lento-800mm-cucina-504-76-017-50476017/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.017 | Cucina | Rổ Chén Di Động Lento 800mm Cucina 504.76.017 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-018-cucina-r-che-n-di-ng-lento-900mm-cucina-504-76-018-50476018/index.html b/restored/san-pham/504-76-018-cucina-r-che-n-di-ng-lento-900mm-cucina-504-76-018-50476018/index.html deleted file mode 100644 index c8abfaef92b8c74a753bfebe49590eaec25e75d7..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-018-cucina-r-che-n-di-ng-lento-900mm-cucina-504-76-018-50476018/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.018 | Cucina | Rổ Chén Di Động Lento 900mm Cucina 504.76.018 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-019-hafele-gia-ba-t-i-a-n-ng-ha-lento-600mm-hafele-504-76-019-50476019/index.html b/restored/san-pham/504-76-019-hafele-gia-ba-t-i-a-n-ng-ha-lento-600mm-hafele-504-76-019-50476019/index.html deleted file mode 100644 index e9814d0c89c49ea171c7c6a32bf5db1acdc51a0f..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-019-hafele-gia-ba-t-i-a-n-ng-ha-lento-600mm-hafele-504-76-019-50476019/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.019 | Hafele | Giá Bát Đĩa Nâng Hạ Lento 600mm Hafele 504.76.019 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-020-hafele-r-che-n-di-ng-lento-700mm-hafele-504-76-020-50476020/index.html b/restored/san-pham/504-76-020-hafele-r-che-n-di-ng-lento-700mm-hafele-504-76-020-50476020/index.html deleted file mode 100644 index d85b51f1044ab3646fc0d185da830dac5524dba3..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-020-hafele-r-che-n-di-ng-lento-700mm-hafele-504-76-020-50476020/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.020 | Hafele | Rổ Chén Di Động Lento 700mm Hafele 504.76.020 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-022-hafele-r-che-n-di-ng-lento-800mm-hafele-504-76-022-50476022/index.html b/restored/san-pham/504-76-022-hafele-r-che-n-di-ng-lento-800mm-hafele-504-76-022-50476022/index.html deleted file mode 100644 index 060fe8ad2f52cd8231e0997df60f4fc793c95128..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-022-hafele-r-che-n-di-ng-lento-800mm-hafele-504-76-022-50476022/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.022 | Hafele | Rổ Chén Di Động Lento 800mm Hafele 504.76.022 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-023-hafele-r-che-n-di-ng-lento-900mm-hafele-504-76-023-50476023/index.html b/restored/san-pham/504-76-023-hafele-r-che-n-di-ng-lento-900mm-hafele-504-76-023-50476023/index.html deleted file mode 100644 index ad4a963781b572f39b7d05640122653333fa603f..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-023-hafele-r-che-n-di-ng-lento-900mm-hafele-504-76-023-50476023/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.023 | Hafele | Rổ Chén Di Động Lento 900mm Hafele 504.76.023 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-134-cucina-r-che-n-i-a-di-ng-600mm-ke-m-ng-ng-u-a-cucina-504-76-134-50476134/index.html b/restored/san-pham/504-76-134-cucina-r-che-n-i-a-di-ng-600mm-ke-m-ng-ng-u-a-cucina-504-76-134-50476134/index.html deleted file mode 100644 index c717e1066e5d75fec1fa9cab618317095f5d62a7..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-134-cucina-r-che-n-i-a-di-ng-600mm-ke-m-ng-ng-u-a-cucina-504-76-134-50476134/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.134 | Cucina | Rổ Chén Đĩa Di Động 600mm Kèm Ống Đựng Đũa Cucina 504.76.134 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-135-cucina-r-che-n-i-a-di-ng-700mm-ke-m-ng-ng-u-a-cucina-504-76-135-50476135/index.html b/restored/san-pham/504-76-135-cucina-r-che-n-i-a-di-ng-700mm-ke-m-ng-ng-u-a-cucina-504-76-135-50476135/index.html deleted file mode 100644 index 5d5ac9633e3d9dc8fb1a3a455afd52828ecda0c0..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-135-cucina-r-che-n-i-a-di-ng-700mm-ke-m-ng-ng-u-a-cucina-504-76-135-50476135/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.135 | Cucina | Rổ Chén Đĩa Di Động 700mm Kèm Ống Đựng Đũa Cucina 504.76.135 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-137-cucina-r-che-n-i-a-di-ng-800mm-ke-m-ng-ng-u-a-cucina-504-76-137-50476137/index.html b/restored/san-pham/504-76-137-cucina-r-che-n-i-a-di-ng-800mm-ke-m-ng-ng-u-a-cucina-504-76-137-50476137/index.html deleted file mode 100644 index 59e5164d7fa8167846bbf94018ae14bf4c144a0e..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-137-cucina-r-che-n-i-a-di-ng-800mm-ke-m-ng-ng-u-a-cucina-504-76-137-50476137/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.137 | Cucina | Rổ Chén Đĩa Di Động 800mm Kèm Ống Đựng Đũa Cucina 504.76.137 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-138-cucina-r-che-n-i-a-di-ng-900mm-ke-m-ng-ng-u-a-cucina-504-76-138-50476138/index.html b/restored/san-pham/504-76-138-cucina-r-che-n-i-a-di-ng-900mm-ke-m-ng-ng-u-a-cucina-504-76-138-50476138/index.html deleted file mode 100644 index aedf31d3bec11cb43064f9e4cd839a441e558cf9..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-138-cucina-r-che-n-i-a-di-ng-900mm-ke-m-ng-ng-u-a-cucina-504-76-138-50476138/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.138 | Cucina | Rổ Chén Đĩa Di Động 900mm Kèm Ống Đựng Đũa Cucina 504.76.138 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-142-hafele-gia-ba-t-i-a-n-ng-ha-lento-800mm-hafele-504-76-142-50476142/index.html b/restored/san-pham/504-76-142-hafele-gia-ba-t-i-a-n-ng-ha-lento-800mm-hafele-504-76-142-50476142/index.html deleted file mode 100644 index 52dc13bb47d8b761a23060918fe690bea2f27040..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-142-hafele-gia-ba-t-i-a-n-ng-ha-lento-800mm-hafele-504-76-142-50476142/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.142 | Hafele | Giá Bát Đĩa Nâng Hạ Lento 800mm Hafele 504.76.142 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-143-hafele-gia-ba-t-i-a-n-ng-ha-lento-900mm-hafele-504-76-143-50476143/index.html b/restored/san-pham/504-76-143-hafele-gia-ba-t-i-a-n-ng-ha-lento-900mm-hafele-504-76-143-50476143/index.html deleted file mode 100644 index 8fa94ae386925123373122aaa96ec43c133f5355..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-143-hafele-gia-ba-t-i-a-n-ng-ha-lento-900mm-hafele-504-76-143-50476143/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.143 | Hafele | Giá Bát Đĩa Nâng Hạ Lento 900mm Hafele 504.76.143 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-204-cucina-r-che-n-i-a-di-ng-lento-600mm-cucina-504-76-204-50476204/index.html b/restored/san-pham/504-76-204-cucina-r-che-n-i-a-di-ng-lento-600mm-cucina-504-76-204-50476204/index.html deleted file mode 100644 index c747ec5af89339a92f3b562706ec403dd9adc63d..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-204-cucina-r-che-n-i-a-di-ng-lento-600mm-cucina-504-76-204-50476204/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.204 | Cucina | Rổ Chén Đĩa Di Động Lento 600mm Cucina 504.76.204 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-205-cucina-r-che-n-di-ng-lento-700mm-cucina-504-76-205-50476205/index.html b/restored/san-pham/504-76-205-cucina-r-che-n-di-ng-lento-700mm-cucina-504-76-205-50476205/index.html deleted file mode 100644 index 53b7ad877484d05385bbe9dbf37506a085dae49c..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-205-cucina-r-che-n-di-ng-lento-700mm-cucina-504-76-205-50476205/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.205 | Cucina | Rổ Chén Di Động Lento 700mm Cucina 504.76.205 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-207-cucina-r-che-n-i-a-di-ng-lento-800mm-cucina-504-76-207-50476207/index.html b/restored/san-pham/504-76-207-cucina-r-che-n-i-a-di-ng-lento-800mm-cucina-504-76-207-50476207/index.html deleted file mode 100644 index 56c9ac473bad022c9402d717fc0375ae4d526081..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-207-cucina-r-che-n-i-a-di-ng-lento-800mm-cucina-504-76-207-50476207/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.207 | Cucina | Rổ Chén Đĩa Di Động Lento 800mm Cucina 504.76.207 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-208-cucina-r-che-n-i-a-di-ng-lento-900mm-cucina-504-76-208-50476208/index.html b/restored/san-pham/504-76-208-cucina-r-che-n-i-a-di-ng-lento-900mm-cucina-504-76-208-50476208/index.html deleted file mode 100644 index add1d52610daf83d3ad528af8627bf7f732063a1..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-208-cucina-r-che-n-i-a-di-ng-lento-900mm-cucina-504-76-208-50476208/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.208 | Cucina | Rổ Chén Đĩa Di Động Lento 900mm Cucina 504.76.208 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-214-hafele-r-che-n-di-ng-lento-cucina-600mm-hafele-504-76-214-50476214/index.html b/restored/san-pham/504-76-214-hafele-r-che-n-di-ng-lento-cucina-600mm-hafele-504-76-214-50476214/index.html deleted file mode 100644 index c6010bfd5ddbfed2b013c9e8d616ead47d2b6497..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-214-hafele-r-che-n-di-ng-lento-cucina-600mm-hafele-504-76-214-50476214/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.214 | Hafele | Rổ Chén Di Động Lento Cucina 600mm Hafele 504.76.214 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-215-hafele-r-che-n-di-ng-lento-cucina-700mm-hafele-504-76-215-50476215/index.html b/restored/san-pham/504-76-215-hafele-r-che-n-di-ng-lento-cucina-700mm-hafele-504-76-215-50476215/index.html deleted file mode 100644 index 9cceeaff102878fb945e2302f863f8d9c8eb3124..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-215-hafele-r-che-n-di-ng-lento-cucina-700mm-hafele-504-76-215-50476215/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.215 | Hafele | Rổ Chén Di Động Lento Cucina 700mm Hafele 504.76.215 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-217-hafele-r-che-n-di-ng-lento-cucina-800mm-hafele-504-76-217-50476217/index.html b/restored/san-pham/504-76-217-hafele-r-che-n-di-ng-lento-cucina-800mm-hafele-504-76-217-50476217/index.html deleted file mode 100644 index 93b342a5600a21581f188f653574e412c6ba3ff5..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-217-hafele-r-che-n-di-ng-lento-cucina-800mm-hafele-504-76-217-50476217/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.217 | Hafele | Rổ Chén Di Động Lento Cucina 800mm Hafele 504.76.217 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-218-cucina-r-che-n-di-ng-lento-900mm-cucina-504-76-218-50476218/index.html b/restored/san-pham/504-76-218-cucina-r-che-n-di-ng-lento-900mm-cucina-504-76-218-50476218/index.html deleted file mode 100644 index d337962f83dd015b8772593733b4991dcf84ab70..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-218-cucina-r-che-n-di-ng-lento-900mm-cucina-504-76-218-50476218/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.218 | Cucina | Rổ Chén Di Động Lento 900mm Cucina 504.76.218 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-407-hafele-gia-ba-t-i-a-n-ng-ha-lento-800mm-hafele-504-76-407-50476407/index.html b/restored/san-pham/504-76-407-hafele-gia-ba-t-i-a-n-ng-ha-lento-800mm-hafele-504-76-407-50476407/index.html deleted file mode 100644 index 7b77b9b184c8dd07115d56a122bec691bce93ea1..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-407-hafele-gia-ba-t-i-a-n-ng-ha-lento-800mm-hafele-504-76-407-50476407/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.407 | Hafele | Giá Bát Đĩa Nâng Hạ Lento 800mm Hafele 504.76.407 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-408-hafele-gia-ba-t-i-a-n-ng-ha-lento-900mm-hafele-504-76-408-50476408/index.html b/restored/san-pham/504-76-408-hafele-gia-ba-t-i-a-n-ng-ha-lento-900mm-hafele-504-76-408-50476408/index.html deleted file mode 100644 index 9e53eed754044601765efb7bd8b2dbeb79deb24d..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-408-hafele-gia-ba-t-i-a-n-ng-ha-lento-900mm-hafele-504-76-408-50476408/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.408 | Hafele | Giá Bát Đĩa Nâng Hạ Lento 900mm Hafele 504.76.408 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-507-hafele-gia-ba-t-i-a-n-ng-ha-oria-800mm-hafele-504-76-507-50476507/index.html b/restored/san-pham/504-76-507-hafele-gia-ba-t-i-a-n-ng-ha-oria-800mm-hafele-504-76-507-50476507/index.html deleted file mode 100644 index 6921241b1f83ea7a512e4c70149fcdae4e2c7938..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-507-hafele-gia-ba-t-i-a-n-ng-ha-oria-800mm-hafele-504-76-507-50476507/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.507 | Hafele | Giá Bát Đĩa Nâng Hạ Oria 800mm Hafele 504.76.507 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-508-hafele-gia-ba-t-i-a-n-ng-ha-oria-900mm-hafele-504-76-508-50476508/index.html b/restored/san-pham/504-76-508-hafele-gia-ba-t-i-a-n-ng-ha-oria-900mm-hafele-504-76-508-50476508/index.html deleted file mode 100644 index 77660c5b7c03d8d7e0b7ed72cc0a11157aa7f592..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-508-hafele-gia-ba-t-i-a-n-ng-ha-oria-900mm-hafele-504-76-508-50476508/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.508 | Hafele | Giá Bát Đĩa Nâng Hạ Oria 900mm Hafele 504.76.508 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-704-hafele-gia-ba-t-i-a-n-ng-ha-oria-600mm-hafele-504-76-704-50476704/index.html b/restored/san-pham/504-76-704-hafele-gia-ba-t-i-a-n-ng-ha-oria-600mm-hafele-504-76-704-50476704/index.html deleted file mode 100644 index 995eaa986ef6d4da4a35f92ed46ed4d6beb7a415..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-704-hafele-gia-ba-t-i-a-n-ng-ha-oria-600mm-hafele-504-76-704-50476704/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.704 | Hafele | Giá Bát Đĩa Nâng Hạ Oria 600mm Hafele 504.76.704 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-705-hafele-gia-ba-t-i-a-n-ng-ha-oria-700mm-hafele-504-76-705-50476705/index.html b/restored/san-pham/504-76-705-hafele-gia-ba-t-i-a-n-ng-ha-oria-700mm-hafele-504-76-705-50476705/index.html deleted file mode 100644 index 66ffa710ac30b40c228dc41b038bd17bcfe6f374..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-705-hafele-gia-ba-t-i-a-n-ng-ha-oria-700mm-hafele-504-76-705-50476705/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.705 | Hafele | Giá Bát Đĩa Nâng Hạ Oria 700mm Hafele 504.76.705 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-807-hafele-r-che-n-ba-t-di-ng-cucina-800mm-hafele-504-76-807-50476807/index.html b/restored/san-pham/504-76-807-hafele-r-che-n-ba-t-di-ng-cucina-800mm-hafele-504-76-807-50476807/index.html deleted file mode 100644 index fb05eb0c1f3fd67839d0b429a6c4769fcf43af09..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-807-hafele-r-che-n-ba-t-di-ng-cucina-800mm-hafele-504-76-807-50476807/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.807 | Hafele | Rổ Chén Bát Di Động Cucina 800mm Hafele 504.76.807 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-808-hafele-r-che-n-ba-t-di-ng-cucina-900mm-hafele-504-76-808-50476808/index.html b/restored/san-pham/504-76-808-hafele-r-che-n-ba-t-di-ng-cucina-900mm-hafele-504-76-808-50476808/index.html deleted file mode 100644 index 06e287a43a62b63d3487e716c6537b8e7411040b..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-808-hafele-r-che-n-ba-t-di-ng-cucina-900mm-hafele-504-76-808-50476808/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.808 | Hafele | Rổ Chén Bát Di Động Cucina 900mm Hafele 504.76.808 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-814-kosmo-k-che-n-i-a-n-ng-ha-oria-600mm-kosmo-504-76-814-50476814/index.html b/restored/san-pham/504-76-814-kosmo-k-che-n-i-a-n-ng-ha-oria-600mm-kosmo-504-76-814-50476814/index.html deleted file mode 100644 index 90812802b91e0a55ddf4935771790d2853caa138..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-814-kosmo-k-che-n-i-a-n-ng-ha-oria-600mm-kosmo-504-76-814-50476814/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.814 | Kosmo | Kệ Chén Đĩa Nâng Hạ Oria 600mm Kosmo 504.76.814 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-815-kosmo-k-che-n-i-a-n-ng-ha-oria-700mm-kosmo-504-76-815-50476815/index.html b/restored/san-pham/504-76-815-kosmo-k-che-n-i-a-n-ng-ha-oria-700mm-kosmo-504-76-815-50476815/index.html deleted file mode 100644 index 0be5f38daf5915ef3c5b934a8e37f31651001d1e..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-815-kosmo-k-che-n-i-a-n-ng-ha-oria-700mm-kosmo-504-76-815-50476815/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.815 | Kosmo | Kệ Chén Đĩa Nâng Hạ Oria 700mm Kosmo 504.76.815 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-817-kosmo-k-che-n-i-a-n-ng-ha-oria-800mm-kosmo-504-76-817-50476817/index.html b/restored/san-pham/504-76-817-kosmo-k-che-n-i-a-n-ng-ha-oria-800mm-kosmo-504-76-817-50476817/index.html deleted file mode 100644 index 235d660ff11f6d3dca7514b01368109cefd4e2d1..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-817-kosmo-k-che-n-i-a-n-ng-ha-oria-800mm-kosmo-504-76-817-50476817/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.817 | Kosmo | Kệ Chén Đĩa Nâng Hạ Oria 800mm Kosmo 504.76.817 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/504-76-818-kosmo-k-che-n-i-a-n-ng-ha-oria-900mm-kosmo-504-76-818-50476818/index.html b/restored/san-pham/504-76-818-kosmo-k-che-n-i-a-n-ng-ha-oria-900mm-kosmo-504-76-818-50476818/index.html deleted file mode 100644 index ac69dae69e3c97cc45efba6f6268cfbc0c1f5400..0000000000000000000000000000000000000000 --- a/restored/san-pham/504-76-818-kosmo-k-che-n-i-a-n-ng-ha-oria-900mm-kosmo-504-76-818-50476818/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -504.76.818 | Kosmo | Kệ Chén Đĩa Nâng Hạ Oria 900mm Kosmo 504.76.818 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/531-08-042-hafele-b-n-i-cha-o-ma-u-o-hafele-531-08-042-53108042/index.html b/restored/san-pham/531-08-042-hafele-b-n-i-cha-o-ma-u-o-hafele-531-08-042-53108042/index.html deleted file mode 100644 index a29c2cfcb9dabb6ed81b64a6b1b0ce5a8cf230ed..0000000000000000000000000000000000000000 --- a/restored/san-pham/531-08-042-hafele-b-n-i-cha-o-ma-u-o-hafele-531-08-042-53108042/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -531.08.042 | Hafele | Bộ Nồi Chảo Màu Đỏ Hafele 531.08.042 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/531-08-043-hafele-b-n-i-cha-o-ma-u-en-hafele-531-08-043-53108043/index.html b/restored/san-pham/531-08-043-hafele-b-n-i-cha-o-ma-u-en-hafele-531-08-043-53108043/index.html deleted file mode 100644 index 0b1be26b12484b8f06c3eb25c4b5f908165e9f78..0000000000000000000000000000000000000000 --- a/restored/san-pham/531-08-043-hafele-b-n-i-cha-o-ma-u-en-hafele-531-08-043-53108043/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -531.08.043 | Hafele | Bộ Nồi Chảo Màu Đen Hafele 531.08.043 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/532-08-002-hafele-b-n-i-10-mo-n-ma-u-ng-hafele-532-08-002-53208002/index.html b/restored/san-pham/532-08-002-hafele-b-n-i-10-mo-n-ma-u-ng-hafele-532-08-002-53208002/index.html deleted file mode 100644 index 5b94fb98b7278bb575a3e83eaf1fb6cb7575333c..0000000000000000000000000000000000000000 --- a/restored/san-pham/532-08-002-hafele-b-n-i-10-mo-n-ma-u-ng-hafele-532-08-002-53208002/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -532.08.002 | Hafele | Bộ Nồi 10 Món Màu Đồng Hafele 532.08.002 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-02-839-hafele-b-p-gas-3-vu-ng-n-u-hc-783a-hafele-533-02-839-53302839/index.html b/restored/san-pham/533-02-839-hafele-b-p-gas-3-vu-ng-n-u-hc-783a-hafele-533-02-839-53302839/index.html deleted file mode 100644 index c6828437eeae0cd2c1297dbe3b22609414cd832f..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-02-839-hafele-b-p-gas-3-vu-ng-n-u-hc-783a-hafele-533-02-839-53302839/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.02.839 | Hafele | Bếp Gas 3 Vùng Nấu HC-783A Hafele 533.02.839 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-02-849-hafele-b-p-gas-2-vu-ng-n-u-hc-g783b-hafele-533-02-849-53302849/index.html b/restored/san-pham/533-02-849-hafele-b-p-gas-2-vu-ng-n-u-hc-g783b-hafele-533-02-849-53302849/index.html deleted file mode 100644 index 8914b5d20e32159c5527ee232c458936dc798b6a..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-02-849-hafele-b-p-gas-2-vu-ng-n-u-hc-g783b-hafele-533-02-849-53302849/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.02.849 | Hafele | Bếp Gas 2 Vùng Nấu HC-G783B Hafele 533.02.849 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-02-853-hafele-b-p-gas-domino-hc-g301b-hafele-533-02-853-53302853/index.html b/restored/san-pham/533-02-853-hafele-b-p-gas-domino-hc-g301b-hafele-533-02-853-53302853/index.html deleted file mode 100644 index 0b42daa884ced79563c252a38811cff38dfe50b7..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-02-853-hafele-b-p-gas-domino-hc-g301b-hafele-533-02-853-53302853/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.02.853 | Hafele | Bếp Gas Domino HC-G301B Hafele 533.02.853 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-09-901-hafele-b-p-t-3-vu-ng-n-u-hc-i6032b-hafele-533-09-901-53309901/index.html b/restored/san-pham/533-09-901-hafele-b-p-t-3-vu-ng-n-u-hc-i6032b-hafele-533-09-901-53309901/index.html deleted file mode 100644 index 13581acdddd06b619a3e3271b2ac6047f8610a21..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-09-901-hafele-b-p-t-3-vu-ng-n-u-hc-i6032b-hafele-533-09-901-53309901/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.09.901 | Hafele | Bếp Từ 3 Vùng Nấu HC-I6032B Hafele 533.09.901 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-17-001-hafele-tu-ba-o-qua-n-r-u-m-hw-c62bb-hafele-533-17-001-53317001/index.html b/restored/san-pham/533-17-001-hafele-tu-ba-o-qua-n-r-u-m-hw-c62bb-hafele-533-17-001-53317001/index.html deleted file mode 100644 index 0a4b5bb74d5464c363632cf865588181f00f9ba8..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-17-001-hafele-tu-ba-o-qua-n-r-u-m-hw-c62bb-hafele-533-17-001-53317001/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.17.001 | Hafele | Tủ Bảo Quản Rượu Âm HW-C62BB Hafele 533.17.001 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-17-011-hafele-tu-ba-o-qua-n-r-u-vang-hw-c129fb-hafele-533-17-011-53317011/index.html b/restored/san-pham/533-17-011-hafele-tu-ba-o-qua-n-r-u-vang-hw-c129fb-hafele-533-17-011-53317011/index.html deleted file mode 100644 index 02401d013e25cd78851b3a49fe56e8290284d5d6..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-17-011-hafele-tu-ba-o-qua-n-r-u-vang-hw-c129fb-hafele-533-17-011-53317011/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.17.011 | Hafele | Tủ Bảo Quản Rượu Vang HW-C129FB Hafele 533.17.011 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-17-021-hafele-tu-ba-o-qua-n-r-u-vang-hw-c415fb-hafele-533-17-021-53317021/index.html b/restored/san-pham/533-17-021-hafele-tu-ba-o-qua-n-r-u-vang-hw-c415fb-hafele-533-17-021-53317021/index.html deleted file mode 100644 index f47e19b83ff07133acddb4cdbe3113a42ca820ca..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-17-021-hafele-tu-ba-o-qua-n-r-u-vang-hw-c415fb-hafele-533-17-021-53317021/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.17.021 | Hafele | Tủ Bảo Quản Rượu Vang HW-C415FB Hafele 533.17.021 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-23-120-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-hi60c-hafele-533-23-120-53323120/index.html b/restored/san-pham/533-23-120-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-hi60c-hafele-533-23-120-53323120/index.html deleted file mode 100644 index bb62863e604b35079c6012e10e2c2ce93b62b8e0..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-23-120-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-hi60c-hafele-533-23-120-53323120/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.23.120 | Hafele | Máy Rửa Chén Âm Bán Phần HDW-HI60C Hafele 533.23.120 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-23-200-hafele-ma-y-r-a-che-n-hdw-f60c-hafele-533-23-200-53323200/index.html b/restored/san-pham/533-23-200-hafele-ma-y-r-a-che-n-hdw-f60c-hafele-533-23-200-53323200/index.html deleted file mode 100644 index d27a4950659aed8104bc5b40ebd13d1518b28158..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-23-200-hafele-ma-y-r-a-che-n-hdw-f60c-hafele-533-23-200-53323200/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.23.200 | Hafele | Máy Rửa Chén HDW-F60C Hafele 533.23.200 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-23-210-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-hi60c-hafele-533-23-210-53323210/index.html b/restored/san-pham/533-23-210-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-hi60c-hafele-533-23-210-53323210/index.html deleted file mode 100644 index 67406b705b663f669a54f6d18eba4c929ca6b7f5..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-23-210-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-hi60c-hafele-533-23-210-53323210/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.23.210 | Hafele | Máy Rửa Chén Âm Bán Phần HDW-HI60C Hafele 533.23.210 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-23-260-hafele-ma-y-r-a-che-n-m-tu-hdw-fi60a-hafele-533-23-260-53323260/index.html b/restored/san-pham/533-23-260-hafele-ma-y-r-a-che-n-m-tu-hdw-fi60a-hafele-533-23-260-53323260/index.html deleted file mode 100644 index 2427c40370b927b6bcb4675c2fabb67e39d9b40c..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-23-260-hafele-ma-y-r-a-che-n-m-tu-hdw-fi60a-hafele-533-23-260-53323260/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.23.260 | Hafele | Máy Rửa Chén Âm Tủ HDW-FI60A Hafele 533.23.260 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-23-310-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60f-hafele-533-23-310-53323310/index.html b/restored/san-pham/533-23-310-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60f-hafele-533-23-310-53323310/index.html deleted file mode 100644 index 851be288b74751223b89d470bb8e9967067527bf..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-23-310-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60f-hafele-533-23-310-53323310/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.23.310 | Hafele | Máy Rửa Chén Độc Lập HDW-F60F Hafele 533.23.310 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-23-320-hafele-ma-y-r-a-che-n-m-tu-hdw-fi60d-hafele-533-23-320-53323320/index.html b/restored/san-pham/533-23-320-hafele-ma-y-r-a-che-n-m-tu-hdw-fi60d-hafele-533-23-320-53323320/index.html deleted file mode 100644 index a78b548756b0001bf7e93cdf286e622e1dd82d61..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-23-320-hafele-ma-y-r-a-che-n-m-tu-hdw-fi60d-hafele-533-23-320-53323320/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.23.320 | Hafele | Máy Rửa Chén Âm Tủ HDW-FI60D Hafele 533.23.320 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/533-93-100-hafele-ma-y-gi-t-s-y-k-t-h-p-hwd-f60a-hafele-533-93-100-53393100/index.html b/restored/san-pham/533-93-100-hafele-ma-y-gi-t-s-y-k-t-h-p-hwd-f60a-hafele-533-93-100-53393100/index.html deleted file mode 100644 index 6b44a9de360cf0b066d749a197dbb40e6bf846a1..0000000000000000000000000000000000000000 --- a/restored/san-pham/533-93-100-hafele-ma-y-gi-t-s-y-k-t-h-p-hwd-f60a-hafele-533-93-100-53393100/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -533.93.100 | Hafele | Máy Giặt Sấy Kết Hợp HWD-F60A Hafele 533.93.100 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-020-hafele-tu-la-nh-side-by-side-hf-sbsid-hafele-534-14-020-53414020/index.html b/restored/san-pham/534-14-020-hafele-tu-la-nh-side-by-side-hf-sbsid-hafele-534-14-020-53414020/index.html deleted file mode 100644 index 1041f754bf9a5ea14785b9bc7cf5c8b483971435..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-020-hafele-tu-la-nh-side-by-side-hf-sbsid-hafele-534-14-020-53414020/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.020 | Hafele | Tủ Lạnh Side By Side HF-SBSID Hafele 534.14.020 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-021-hafele-tu-la-nh-hf-sb5321fb-hafele-534-14-021-53414021/index.html b/restored/san-pham/534-14-021-hafele-tu-la-nh-hf-sb5321fb-hafele-534-14-021-53414021/index.html deleted file mode 100644 index bec48931acc36a85bd8a36e19d4b5db08fc61ad3..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-021-hafele-tu-la-nh-hf-sb5321fb-hafele-534-14-021-53414021/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.021 | Hafele | Tủ Lạnh HF-SB5321FB Hafele 534.14.021 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-050-hafele-tu-la-nh-4-ca-nh-hf-mulb-hafele-534-14-050-53414050/index.html b/restored/san-pham/534-14-050-hafele-tu-la-nh-4-ca-nh-hf-mulb-hafele-534-14-050-53414050/index.html deleted file mode 100644 index b39509dd91d76be899ad8ef2ef70d3677dee2e36..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-050-hafele-tu-la-nh-4-ca-nh-hf-mulb-hafele-534-14-050-53414050/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.050 | Hafele | Tủ Lạnh 4 Cánh HF-MULB Hafele 534.14.050 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-080-hafele-tu-la-nh-m-hf-bi60x-hafele-534-14-080-53414080/index.html b/restored/san-pham/534-14-080-hafele-tu-la-nh-m-hf-bi60x-hafele-534-14-080-53414080/index.html deleted file mode 100644 index bec6178e062b3d2355245f3ae37f8eeeca134e10..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-080-hafele-tu-la-nh-m-hf-bi60x-hafele-534-14-080-53414080/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.080 | Hafele | Tủ Lạnh Âm HF-BI60X Hafele 534.14.080 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-100-hafele-tu-la-nh-hf-sb5601fb-hafele-534-14-100-53414100/index.html b/restored/san-pham/534-14-100-hafele-tu-la-nh-hf-sb5601fb-hafele-534-14-100-53414100/index.html deleted file mode 100644 index 9948001ec1b23240badb8ff0ab5cba97a47c8b29..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-100-hafele-tu-la-nh-hf-sb5601fb-hafele-534-14-100-53414100/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.100 | Hafele | Tủ Lạnh HF-SB5601FB Hafele 534.14.100 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-110-hafele-tu-la-nh-hf-sb6321fb-hafele-534-14-110-53414110/index.html b/restored/san-pham/534-14-110-hafele-tu-la-nh-hf-sb6321fb-hafele-534-14-110-53414110/index.html deleted file mode 100644 index 8c2df0a444bd7f024ae504626e46043081d1c971..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-110-hafele-tu-la-nh-hf-sb6321fb-hafele-534-14-110-53414110/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.110 | Hafele | Tủ Lạnh HF-SB6321FB Hafele 534.14.110 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-230-hafele-tu-la-nh-n-ng-n-a-d-i-h-bf234-hafele-534-14-230-53414230/index.html b/restored/san-pham/534-14-230-hafele-tu-la-nh-n-ng-n-a-d-i-h-bf234-hafele-534-14-230-53414230/index.html deleted file mode 100644 index 0dd908af8c2b5a542f4c4244b6561274f3eda045..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-230-hafele-tu-la-nh-n-ng-n-a-d-i-h-bf234-hafele-534-14-230-53414230/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.230 | Hafele | Tủ Lạnh Đơn Ngăn Đá Dưới H-BF234 Hafele 534.14.230 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-231-hafele-tu-la-nh-n-ng-n-a-d-i-hf-bf324-hafele-534-14-231-53414231/index.html b/restored/san-pham/534-14-231-hafele-tu-la-nh-n-ng-n-a-d-i-hf-bf324-hafele-534-14-231-53414231/index.html deleted file mode 100644 index 45f8b674844254adcd2772c91b56fd1fa71e5b82..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-231-hafele-tu-la-nh-n-ng-n-a-d-i-hf-bf324-hafele-534-14-231-53414231/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.231 | Hafele | Tủ Lạnh Đơn Ngăn Đá Dưới HF-BF324 Hafele 534.14.231 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-14-250-hafele-tu-la-nh-hf-sbsic-hafele-534-14-250-53414250/index.html b/restored/san-pham/534-14-250-hafele-tu-la-nh-hf-sbsic-hafele-534-14-250-53414250/index.html deleted file mode 100644 index bb7000e949e9918a9d38d87137b6519859952ef4..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-14-250-hafele-tu-la-nh-hf-sbsic-hafele-534-14-250-53414250/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.14.250 | Hafele | Tủ Lạnh HF-SBSIC Hafele 534.14.250 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/534-16-960-hafele-tu-r-u-hw-g32a-hafele-534-16-960-53416960/index.html b/restored/san-pham/534-16-960-hafele-tu-r-u-hw-g32a-hafele-534-16-960-53416960/index.html deleted file mode 100644 index 09bbec675975ac02c4dabfecefa504b7c05bd114..0000000000000000000000000000000000000000 --- a/restored/san-pham/534-16-960-hafele-tu-r-u-hw-g32a-hafele-534-16-960-53416960/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -534.16.960 | Hafele | Tủ Rượu HW-G32A Hafele 534.16.960 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-02-040-hafele-b-p-t-4-vu-ng-n-u-hc-i604d-hafele-535-02-040-53502040/index.html b/restored/san-pham/535-02-040-hafele-b-p-t-4-vu-ng-n-u-hc-i604d-hafele-535-02-040-53502040/index.html deleted file mode 100644 index c8f4d903d94bc1de0df9fc4be72aa39a16bee8d6..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-02-040-hafele-b-p-t-4-vu-ng-n-u-hc-i604d-hafele-535-02-040-53502040/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.02.040 | Hafele | Bếp Từ 4 Vùng Nấu HC-I604D Hafele 535.02.040 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-02-222-hafele-b-p-t-m-2-vu-ng-n-u-hafele-535-02-222-53502222/index.html b/restored/san-pham/535-02-222-hafele-b-p-t-m-2-vu-ng-n-u-hafele-535-02-222-53502222/index.html deleted file mode 100644 index 26ccd90f215034fa56feda1681b4448dfd916d65..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-02-222-hafele-b-p-t-m-2-vu-ng-n-u-hafele-535-02-222-53502222/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.02.222 | Hafele | Bếp Từ Âm 2 Vùng Nấu Hafele 535.02.222 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-02-242-hafele-b-p-t-m-3-vu-ng-n-u-hc-is773ea-hafele-535-02-242-53502242/index.html b/restored/san-pham/535-02-242-hafele-b-p-t-m-3-vu-ng-n-u-hc-is773ea-hafele-535-02-242-53502242/index.html deleted file mode 100644 index b2ec6d9914b0a82df1140fde5b139b80b82e5ae9..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-02-242-hafele-b-p-t-m-3-vu-ng-n-u-hc-is773ea-hafele-535-02-242-53502242/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.02.242 | Hafele | Bếp Từ Âm 3 Vùng Nấu HC-IS773EA Hafele 535.02.242 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-14-522-smeg-tu-la-nh-m-smeg-c7176dnphsg-535-14-522-53514522/index.html b/restored/san-pham/535-14-522-smeg-tu-la-nh-m-smeg-c7176dnphsg-535-14-522-53514522/index.html deleted file mode 100644 index 5db9024ce15b7af5d2e46f1d8f7927db27515eab..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-14-522-smeg-tu-la-nh-m-smeg-c7176dnphsg-535-14-522-53514522/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.14.522 | Smeg | Tủ Lạnh Âm Smeg C7176DNPHSG 535.14.522 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-14-545-smeg-tu-la-nh-smeg-fab28rcr5-535-14-545-53514545/index.html b/restored/san-pham/535-14-545-smeg-tu-la-nh-smeg-fab28rcr5-535-14-545-53514545/index.html deleted file mode 100644 index de9a68be489f16f3b0ad04ff115f03192d32d8b8..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-14-545-smeg-tu-la-nh-smeg-fab28rcr5-535-14-545-53514545/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.14.545 | Smeg | Tủ Lạnh Smeg FAB28RCR5 535.14.545 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-14-593-smeg-tu-la-nh-c-l-p-smeg-fd70fn1hx-535-14-593-53514593/index.html b/restored/san-pham/535-14-593-smeg-tu-la-nh-c-l-p-smeg-fd70fn1hx-535-14-593-53514593/index.html deleted file mode 100644 index eb0b471e2c96a0532fb5c2b2f4fee800db1f52ec..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-14-593-smeg-tu-la-nh-c-l-p-smeg-fd70fn1hx-535-14-593-53514593/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.14.593 | Smeg | Tủ Lạnh Độc Lập Smeg FD70FN1HX 535.14.593 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-14-611-smeg-tu-la-nh-smeg-fab28rbl5-535-14-611-53514611/index.html b/restored/san-pham/535-14-611-smeg-tu-la-nh-smeg-fab28rbl5-535-14-611-53514611/index.html deleted file mode 100644 index a66bba041b16e03579e970dd563153764fb5a25e..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-14-611-smeg-tu-la-nh-smeg-fab28rbl5-535-14-611-53514611/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.14.611 | Smeg | Tủ Lạnh Smeg FAB28RBL5 535.14.611 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-14-618-smeg-tu-la-nh-smeg-fab28rpb5-535-14-618-53514618/index.html b/restored/san-pham/535-14-618-smeg-tu-la-nh-smeg-fab28rpb5-535-14-618-53514618/index.html deleted file mode 100644 index c9b514fe54e1b038a23f00adcc400acb356b3316..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-14-618-smeg-tu-la-nh-smeg-fab28rpb5-535-14-618-53514618/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.14.618 | Smeg | Tủ Lạnh Smeg FAB28RPB5 535.14.618 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-14-619-smeg-tu-la-nh-smeg-fab28rrd5-535-14-619-53514619/index.html b/restored/san-pham/535-14-619-smeg-tu-la-nh-smeg-fab28rrd5-535-14-619-53514619/index.html deleted file mode 100644 index e677de1e253d27af21ab7806dd20f10bc4288876..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-14-619-smeg-tu-la-nh-smeg-fab28rrd5-535-14-619-53514619/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.14.619 | Smeg | Tủ Lạnh Smeg FAB28RRD5 535.14.619 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-14-998-smeg-tu-la-nh-side-by-side-smeg-sbs660x-535-14-998-53514998/index.html b/restored/san-pham/535-14-998-smeg-tu-la-nh-side-by-side-smeg-sbs660x-535-14-998-53514998/index.html deleted file mode 100644 index 0ad6e08ac38db1e66ea8719ff10a1a692b821b32..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-14-998-smeg-tu-la-nh-side-by-side-smeg-sbs660x-535-14-998-53514998/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.14.998 | Smeg | Tủ Lạnh Side By Side Smeg SBS660X 535.14.998 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-14-999-smeg-tu-la-nh-smeg-sbs662x-535-14-999-53514999/index.html b/restored/san-pham/535-14-999-smeg-tu-la-nh-smeg-sbs662x-535-14-999-53514999/index.html deleted file mode 100644 index bb178d54e99ac6cddfa5bfe8a22248ed1bfca566..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-14-999-smeg-tu-la-nh-smeg-sbs662x-535-14-999-53514999/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.14.999 | Smeg | Tủ Lạnh Smeg SBS662X 535.14.999 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-29-590-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60g-hafele-535-29-590-53529590/index.html b/restored/san-pham/535-29-590-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60g-hafele-535-29-590-53529590/index.html deleted file mode 100644 index 20d856d3e605b5a73683d2bad4cb28eb46320bdd..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-29-590-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60g-hafele-535-29-590-53529590/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.29.590 | Hafele | Máy Rửa Chén Độc Lập HDW-F60G Hafele 535.29.590 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-29-651-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6031g-hafele-535-29-651-53529651/index.html b/restored/san-pham/535-29-651-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6031g-hafele-535-29-651-53529651/index.html deleted file mode 100644 index 8d34a7ea57873de25136d069aba0db358def4c88..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-29-651-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6031g-hafele-535-29-651-53529651/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.29.651 | Hafele | Máy Rửa Chén Độc Lập HDW-F6031G Hafele 535.29.651 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-29-652-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6052g-hafele-535-29-652-53529652/index.html b/restored/san-pham/535-29-652-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6052g-hafele-535-29-652-53529652/index.html deleted file mode 100644 index 4bb43fcb9a3b115f14a1b811b06b2183dba7f0da..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-29-652-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6052g-hafele-535-29-652-53529652/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.29.652 | Hafele | Máy Rửa Chén Độc Lập HDW-F6052G Hafele 535.29.652 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-29-660-hafele-ma-y-r-a-che-n-c-l-p-hdw-f605b-hafele-535-29-660-53529660/index.html b/restored/san-pham/535-29-660-hafele-ma-y-r-a-che-n-c-l-p-hdw-f605b-hafele-535-29-660-53529660/index.html deleted file mode 100644 index ce7288e1050bf87de7064aa92d0f439920c09796..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-29-660-hafele-ma-y-r-a-che-n-c-l-p-hdw-f605b-hafele-535-29-660-53529660/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.29.660 | Hafele | Máy Rửa Chén Độc Lập HDW-F605B Hafele 535.29.660 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-29-670-hafele-ma-y-r-a-che-n-c-l-p-hdw-f601b-hafele-535-29-670-53529670/index.html b/restored/san-pham/535-29-670-hafele-ma-y-r-a-che-n-c-l-p-hdw-f601b-hafele-535-29-670-53529670/index.html deleted file mode 100644 index 696fb2af5a2b90263252bc2f2213904d53a6ab4b..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-29-670-hafele-ma-y-r-a-che-n-c-l-p-hdw-f601b-hafele-535-29-670-53529670/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.29.670 | Hafele | Máy Rửa Chén Độc Lập HDW-F601B Hafele 535.29.670 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-29-700-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6072b-hafele-535-29-700-53529700/index.html b/restored/san-pham/535-29-700-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6072b-hafele-535-29-700-53529700/index.html deleted file mode 100644 index 353491368a458e7f969c081015dcf8ae953f9855..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-29-700-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6072b-hafele-535-29-700-53529700/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.29.700 | Hafele | Máy Rửa Chén Độc Lập HDW-F6072B Hafele 535.29.700 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-079-hafele-ma-y-hu-t-bu-i-c-m-tay-hsv-21g-hafele-535-43-079-53543079/index.html b/restored/san-pham/535-43-079-hafele-ma-y-hu-t-bu-i-c-m-tay-hsv-21g-hafele-535-43-079-53543079/index.html deleted file mode 100644 index 941c348525cd61ae8ceb92161065855d8ca5897a..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-079-hafele-ma-y-hu-t-bu-i-c-m-tay-hsv-21g-hafele-535-43-079-53543079/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.079 | Hafele | Máy Hút Bụi Cầm Tay HSV-21G Hafele 535.43.079 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-086-hafele-ma-y-e-p-tra-i-c-y-hafele-535-43-086-53543086/index.html b/restored/san-pham/535-43-086-hafele-ma-y-e-p-tra-i-c-y-hafele-535-43-086-53543086/index.html deleted file mode 100644 index 35e6b4187a71113235b51579c7e369fa0cb531ec..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-086-hafele-ma-y-e-p-tra-i-c-y-hafele-535-43-086-53543086/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.086 | Hafele | Máy Ép Trái Cây Hafele 535.43.086 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-089-hafele-ma-y-v-t-n-c-cam-hafele-535-43-089-53543089/index.html b/restored/san-pham/535-43-089-hafele-ma-y-v-t-n-c-cam-hafele-535-43-089-53543089/index.html deleted file mode 100644 index 7952773ca18f7b040610cee25389126f01778f0d..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-089-hafele-ma-y-v-t-n-c-cam-hafele-535-43-089-53543089/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.089 | Hafele | Máy Vắt Nước Cam Hafele 535.43.089 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-090-hafele-ma-y-xay-c-m-tay-hafele-535-43-090-53543090/index.html b/restored/san-pham/535-43-090-hafele-ma-y-xay-c-m-tay-hafele-535-43-090-53543090/index.html deleted file mode 100644 index 7c99b1be7f41e4aec961555cd3c80accb74181ca..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-090-hafele-ma-y-xay-c-m-tay-hafele-535-43-090-53543090/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.090 | Hafele | Máy Xay Cầm Tay Hafele 535.43.090 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-166-hafele-ba-n-u-i-hafele-535-43-166-53543166/index.html b/restored/san-pham/535-43-166-hafele-ba-n-u-i-hafele-535-43-166-53543166/index.html deleted file mode 100644 index 7dc4c13568b5ef10fe95256db892e57c3856c41e..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-166-hafele-ba-n-u-i-hafele-535-43-166-53543166/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.166 | Hafele | Bàn Ủi Hafele 535.43.166 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-168-hafele-ba-n-u-i-kh-hafele-535-43-168-53543168/index.html b/restored/san-pham/535-43-168-hafele-ba-n-u-i-kh-hafele-535-43-168-53543168/index.html deleted file mode 100644 index 3217065964f444f25c1264bdb7813e1c8f909261..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-168-hafele-ba-n-u-i-kh-hafele-535-43-168-53543168/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.168 | Hafele | Bàn Ủi Khô Hafele 535.43.168 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-262-hafele-ma-y-xay-sinh-t-hafele-535-43-262-53543262/index.html b/restored/san-pham/535-43-262-hafele-ma-y-xay-sinh-t-hafele-535-43-262-53543262/index.html deleted file mode 100644 index b0425a042b5831964bf5e838cc2cfd677566c6eb..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-262-hafele-ma-y-xay-sinh-t-hafele-535-43-262-53543262/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.262 | Hafele | Máy Xay Sinh Tổ Hafele 535.43.262 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-263-hafele-ma-y-xay-sinh-t-mini-hafele-535-43-263-53543263/index.html b/restored/san-pham/535-43-263-hafele-ma-y-xay-sinh-t-mini-hafele-535-43-263-53543263/index.html deleted file mode 100644 index eea6e8a282a10758afeb5d4867a0ccd715c01260..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-263-hafele-ma-y-xay-sinh-t-mini-hafele-535-43-263-53543263/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.263 | Hafele | Máy Xay Sinh Tố Mini Hafele 535.43.263 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-271-hafele-ma-y-xay-sinh-t-ch-n-kh-ng-br230-19e00-hafele-535-43-271-53543271/index.html b/restored/san-pham/535-43-271-hafele-ma-y-xay-sinh-t-ch-n-kh-ng-br230-19e00-hafele-535-43-271-53543271/index.html deleted file mode 100644 index db076f1b935c26b3c38eac9531a8eb636f0aeb54..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-271-hafele-ma-y-xay-sinh-t-ch-n-kh-ng-br230-19e00-hafele-535-43-271-53543271/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.271 | Hafele | Máy Xay Sinh Tố Chân Không BR230-19E00 Hafele 535.43.271 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-277-hafele-ma-y-xay-sinh-t-hsb-0621fs-hafele-535-43-277-53543277/index.html b/restored/san-pham/535-43-277-hafele-ma-y-xay-sinh-t-hsb-0621fs-hafele-535-43-277-53543277/index.html deleted file mode 100644 index 76f49ee0fb02133d8d57cde7556c76f559e45fb0..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-277-hafele-ma-y-xay-sinh-t-hsb-0621fs-hafele-535-43-277-53543277/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.277 | Hafele | Máy Xay Sinh Tố HSB-0621FS Hafele 535.43.277 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-278-hafele-ma-y-xay-sinh-t-hsb-0331fw-hafele-535-43-278-53543278/index.html b/restored/san-pham/535-43-278-hafele-ma-y-xay-sinh-t-hsb-0331fw-hafele-535-43-278-53543278/index.html deleted file mode 100644 index f4deac2dcc831538c34ca6b7aea9d25fcd996cd0..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-278-hafele-ma-y-xay-sinh-t-hsb-0331fw-hafele-535-43-278-53543278/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.278 | Hafele | Máy Xay Sinh Tố HSB-0331FW Hafele 535.43.278 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-292-hafele-ma-y-xay-sinh-t-ba-n-hs-b153tx-hafele-535-43-292-53543292/index.html b/restored/san-pham/535-43-292-hafele-ma-y-xay-sinh-t-ba-n-hs-b153tx-hafele-535-43-292-53543292/index.html deleted file mode 100644 index 547d96d93284d51e9b65c50d91bff59b72ef587f..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-292-hafele-ma-y-xay-sinh-t-ba-n-hs-b153tx-hafele-535-43-292-53543292/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.292 | Hafele | Máy Xay Sinh Tố Để Bàn HS-B153TX Hafele 535.43.292 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-392-hafele-ma-y-e-p-ch-m-c-l-n-hs-j42s-hafele-535-43-392-53543392/index.html b/restored/san-pham/535-43-392-hafele-ma-y-e-p-ch-m-c-l-n-hs-j42s-hafele-535-43-392-53543392/index.html deleted file mode 100644 index 54254d285cf2dfa759fedb9a061929952c528c80..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-392-hafele-ma-y-e-p-ch-m-c-l-n-hs-j42s-hafele-535-43-392-53543392/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.392 | Hafele | Máy Ép Chậm Cỡ Lớn HS-J42S Hafele 535.43.392 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-393-hafele-ma-y-e-p-ch-m-c-nho-hs-j32x-hafele-535-43-393-53543393/index.html b/restored/san-pham/535-43-393-hafele-ma-y-e-p-ch-m-c-nho-hs-j32x-hafele-535-43-393-53543393/index.html deleted file mode 100644 index 3854cbcebd9ee02b1adf53f1b8d57e588d4d731a..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-393-hafele-ma-y-e-p-ch-m-c-nho-hs-j32x-hafele-535-43-393-53543393/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.393 | Hafele | Máy Ép Chậm Cỡ Nhỏ HS-J32X Hafele 535.43.393 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-485-hafele-ma-y-la-m-s-a-ha-t-hs-b151nw-hafele-535-43-485-53543485/index.html b/restored/san-pham/535-43-485-hafele-ma-y-la-m-s-a-ha-t-hs-b151nw-hafele-535-43-485-53543485/index.html deleted file mode 100644 index 916f2ae7adf476eebfdb949e73cf1cc47a67ac5b..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-485-hafele-ma-y-la-m-s-a-ha-t-hs-b151nw-hafele-535-43-485-53543485/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.485 | Hafele | Máy Làm Sữa Hạt HS-B151NW Hafele 535.43.485 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-531-hafele-ma-y-e-p-ch-m-c-l-n-hsj-b30a-hafele-535-43-531-53543531/index.html b/restored/san-pham/535-43-531-hafele-ma-y-e-p-ch-m-c-l-n-hsj-b30a-hafele-535-43-531-53543531/index.html deleted file mode 100644 index 8fa1c44c809e236fd29cc338d160bc8353f6d5b0..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-531-hafele-ma-y-e-p-ch-m-c-l-n-hsj-b30a-hafele-535-43-531-53543531/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.531 | Hafele | Máy Ép Chậm Cỡ Lớn HSJ-B30A Hafele 535.43.531 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-543-hafele-b-bi-nh-un-n-c-si-u-t-c-0-8l-hafele-535-43-543-53543543/index.html b/restored/san-pham/535-43-543-hafele-b-bi-nh-un-n-c-si-u-t-c-0-8l-hafele-535-43-543-53543543/index.html deleted file mode 100644 index e1d3c51fa1c113e1c0d97ef22cf4a7cb63c8eae9..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-543-hafele-b-bi-nh-un-n-c-si-u-t-c-0-8l-hafele-535-43-543-53543543/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.543 | Hafele | Bộ Bình Đun Nước Siêu Tốc 0.8L Hafele 535.43.543 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-544-hafele-b-bi-nh-un-n-c-khay-1-2l-hafele-535-43-544-53543544/index.html b/restored/san-pham/535-43-544-hafele-b-bi-nh-un-n-c-khay-1-2l-hafele-535-43-544-53543544/index.html deleted file mode 100644 index 3839b64fa8068d51d4f94e041f53da00fa2fdb8b..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-544-hafele-b-bi-nh-un-n-c-khay-1-2l-hafele-535-43-544-53543544/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.544 | Hafele | Bộ Bình Đun Nước & Khay 1.2L Hafele 535.43.544 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-545-hafele-b-bi-nh-un-n-c-khay-0-6l-hafele-535-43-545-53543545/index.html b/restored/san-pham/535-43-545-hafele-b-bi-nh-un-n-c-khay-0-6l-hafele-535-43-545-53543545/index.html deleted file mode 100644 index 99fa66f68a209893b3aaac5cccb65f9a3fbfef31..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-545-hafele-b-bi-nh-un-n-c-khay-0-6l-hafele-535-43-545-53543545/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.545 | Hafele | Bộ Bình Đun Nước & Khay 0.6L Hafele 535.43.545 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-548-hafele-m-un-si-u-t-c-hs-k1705db-hafele-535-43-548-53543548/index.html b/restored/san-pham/535-43-548-hafele-m-un-si-u-t-c-hs-k1705db-hafele-535-43-548-53543548/index.html deleted file mode 100644 index da600435a27e2c2298495fcdcfa4a449134a1dfd..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-548-hafele-m-un-si-u-t-c-hs-k1705db-hafele-535-43-548-53543548/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.548 | Hafele | Ấm Đun Siêu Tốc HS-K1705DB Hafele 535.43.548 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-549-hafele-m-un-n-c-si-u-t-c-hs-k1706dg-hafele-535-43-549-53543549/index.html b/restored/san-pham/535-43-549-hafele-m-un-n-c-si-u-t-c-hs-k1706dg-hafele-535-43-549-53543549/index.html deleted file mode 100644 index 51a4f264471b8d722e057f426ab6c45ba8fb82e8..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-549-hafele-m-un-n-c-si-u-t-c-hs-k1706dg-hafele-535-43-549-53543549/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.549 | Hafele | Ấm Đun Nước Siêu Tốc HS-K1706DG Hafele 535.43.549 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-610-smeg-ma-y-xay-c-m-tay-smeg-hbf02pbeu-535-43-610-53543610/index.html b/restored/san-pham/535-43-610-smeg-ma-y-xay-c-m-tay-smeg-hbf02pbeu-535-43-610-53543610/index.html deleted file mode 100644 index 9448e21fe41395378569c965e9daf0170eedaf51..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-610-smeg-ma-y-xay-c-m-tay-smeg-hbf02pbeu-535-43-610-53543610/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.610 | Smeg | Máy Xay Cầm Tay Smeg HBF02PBEU 535.43.610 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-611-smeg-ma-y-xay-c-m-tay-smeg-hbf02bleu-535-43-611-53543611/index.html b/restored/san-pham/535-43-611-smeg-ma-y-xay-c-m-tay-smeg-hbf02bleu-535-43-611-53543611/index.html deleted file mode 100644 index 27cc68e77e0a96ece681340b66b3c7c3fe8c73f6..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-611-smeg-ma-y-xay-c-m-tay-smeg-hbf02bleu-535-43-611-53543611/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.611 | Smeg | Máy Xay Cầm Tay Smeg HBF02BLEU 535.43.611 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-615-smeg-ma-y-xay-c-m-tay-smeg-hbf02creu-535-43-615-53543615/index.html b/restored/san-pham/535-43-615-smeg-ma-y-xay-c-m-tay-smeg-hbf02creu-535-43-615-53543615/index.html deleted file mode 100644 index 1a17e28a724fde85b9dec26c8f3f18ee26d8175d..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-615-smeg-ma-y-xay-c-m-tay-smeg-hbf02creu-535-43-615-53543615/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.615 | Smeg | Máy Xay Cầm Tay Smeg HBF02CREU 535.43.615 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-619-smeg-ma-y-xay-c-m-tay-smeg-hbf02rdeu-535-43-619-53543619/index.html b/restored/san-pham/535-43-619-smeg-ma-y-xay-c-m-tay-smeg-hbf02rdeu-535-43-619-53543619/index.html deleted file mode 100644 index b31438a64ab11333f64728a426d89be823e0f59c..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-619-smeg-ma-y-xay-c-m-tay-smeg-hbf02rdeu-535-43-619-53543619/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.619 | Smeg | Máy Xay Cầm Tay Smeg HBF02RDEU 535.43.619 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-621-smeg-ma-y-e-p-ch-m-smeg-sjf01bleu-535-43-621-53543621/index.html b/restored/san-pham/535-43-621-smeg-ma-y-e-p-ch-m-smeg-sjf01bleu-535-43-621-53543621/index.html deleted file mode 100644 index fdc94e951cb2c0d5abead53e0e84d1fb3998f4b9..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-621-smeg-ma-y-e-p-ch-m-smeg-sjf01bleu-535-43-621-53543621/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.621 | Smeg | Máy Ép Chậm Smeg SJF01BLEU 535.43.621 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-625-smeg-ma-y-e-p-ch-m-smeg-sjf01creu-535-43-625-53543625/index.html b/restored/san-pham/535-43-625-smeg-ma-y-e-p-ch-m-smeg-sjf01creu-535-43-625-53543625/index.html deleted file mode 100644 index 439926d4e20c3f12cda28559a69bce236fc46c20..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-625-smeg-ma-y-e-p-ch-m-smeg-sjf01creu-535-43-625-53543625/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.625 | Smeg | Máy Ép Chậm Smeg SJF01CREU 535.43.625 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-628-smeg-ma-y-e-p-ch-m-smeg-sjf01pbeu-535-43-628-53543628/index.html b/restored/san-pham/535-43-628-smeg-ma-y-e-p-ch-m-smeg-sjf01pbeu-535-43-628-53543628/index.html deleted file mode 100644 index 931c7d51e53a492a5551a4903ca77560241ba371..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-628-smeg-ma-y-e-p-ch-m-smeg-sjf01pbeu-535-43-628-53543628/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.628 | Smeg | Máy Ép Chậm Smeg SJF01PBEU 535.43.628 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-629-smeg-ma-y-e-p-ch-m-smeg-sjf01rdeu-535-43-629-53543629/index.html b/restored/san-pham/535-43-629-smeg-ma-y-e-p-ch-m-smeg-sjf01rdeu-535-43-629-53543629/index.html deleted file mode 100644 index c074e421d1016e4fc06bd8c87e895dc18092ae81..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-629-smeg-ma-y-e-p-ch-m-smeg-sjf01rdeu-535-43-629-53543629/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.629 | Smeg | Máy Ép Chậm Smeg SJF01RDEU 535.43.629 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-630-smeg-ma-y-xay-sinh-t-smeg-blf01bleu-535-43-630-53543630/index.html b/restored/san-pham/535-43-630-smeg-ma-y-xay-sinh-t-smeg-blf01bleu-535-43-630-53543630/index.html deleted file mode 100644 index 83c4ec1ba644862e138a2d8a6b8b97307dd92f0f..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-630-smeg-ma-y-xay-sinh-t-smeg-blf01bleu-535-43-630-53543630/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.630 | Smeg | Máy Xay Sinh Tố Smeg BLF01BLEU 535.43.630 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-635-smeg-ma-y-xay-sinh-t-smeg-blf01creu-535-43-635-53543635/index.html b/restored/san-pham/535-43-635-smeg-ma-y-xay-sinh-t-smeg-blf01creu-535-43-635-53543635/index.html deleted file mode 100644 index 9c080bfe28e4cccc93322df917810d963392e5ab..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-635-smeg-ma-y-xay-sinh-t-smeg-blf01creu-535-43-635-53543635/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.635 | Smeg | Máy Xay Sinh Tố Smeg BLF01CREU 535.43.635 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-638-smeg-ma-y-xay-sinh-t-smeg-blf01pbeu-535-43-638-53543638/index.html b/restored/san-pham/535-43-638-smeg-ma-y-xay-sinh-t-smeg-blf01pbeu-535-43-638-53543638/index.html deleted file mode 100644 index cc6d912c4323e1560028b99d1ec2f783332e7d97..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-638-smeg-ma-y-xay-sinh-t-smeg-blf01pbeu-535-43-638-53543638/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.638 | Smeg | Máy Xay Sinh Tố Smeg BLF01PBEU 535.43.638 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-639-smeg-ma-y-xay-sinh-t-smeg-blf01rdeu-535-43-639-53543639/index.html b/restored/san-pham/535-43-639-smeg-ma-y-xay-sinh-t-smeg-blf01rdeu-535-43-639-53543639/index.html deleted file mode 100644 index 82a7a5b082b876f5e9b00263c2569268007b1518..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-639-smeg-ma-y-xay-sinh-t-smeg-blf01rdeu-535-43-639-53543639/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.639 | Smeg | Máy Xay Sinh Tố Smeg BLF01RDEU 535.43.639 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-640-smeg-ma-y-v-t-n-c-cam-smeg-cjf01bleu-535-43-640-53543640/index.html b/restored/san-pham/535-43-640-smeg-ma-y-v-t-n-c-cam-smeg-cjf01bleu-535-43-640-53543640/index.html deleted file mode 100644 index d1df11672e466edf63dacf6e795edf576e390125..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-640-smeg-ma-y-v-t-n-c-cam-smeg-cjf01bleu-535-43-640-53543640/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.640 | Smeg | Máy Vắt Nước Cam Smeg CJF01BLEU 535.43.640 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-645-smeg-ma-y-v-t-cam-smeg-cjf01creu-535-43-645-53543645/index.html b/restored/san-pham/535-43-645-smeg-ma-y-v-t-cam-smeg-cjf01creu-535-43-645-53543645/index.html deleted file mode 100644 index 2ce50c05bdf566dca67b631f98e0c4d5592153e6..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-645-smeg-ma-y-v-t-cam-smeg-cjf01creu-535-43-645-53543645/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.645 | Smeg | Máy Vắt Cam Smeg CJF01CREU 535.43.645 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-648-smeg-ma-y-v-t-cam-smeg-cjf01pbeu-535-43-648-53543648/index.html b/restored/san-pham/535-43-648-smeg-ma-y-v-t-cam-smeg-cjf01pbeu-535-43-648-53543648/index.html deleted file mode 100644 index be5a98f3dce8b7d7ea69cea1566a71cff03e1f9d..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-648-smeg-ma-y-v-t-cam-smeg-cjf01pbeu-535-43-648-53543648/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.648 | Smeg | Máy Vắt Cam Smeg CJF01PBEU 535.43.648 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-649-smeg-ma-y-v-t-cam-smeg-cjf01rdeu-535-43-649-53543649/index.html b/restored/san-pham/535-43-649-smeg-ma-y-v-t-cam-smeg-cjf01rdeu-535-43-649-53543649/index.html deleted file mode 100644 index 104d2aeaf0a33226154b342e2d529c7b4d75557a..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-649-smeg-ma-y-v-t-cam-smeg-cjf01rdeu-535-43-649-53543649/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.649 | Smeg | Máy Vắt Cam Smeg CJF01RDEU 535.43.649 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-675-smeg-m-un-n-c-smeg-klf03creu-535-43-675-53543675/index.html b/restored/san-pham/535-43-675-smeg-m-un-n-c-smeg-klf03creu-535-43-675-53543675/index.html deleted file mode 100644 index 8917d9becf8089a5865e3572380e02924e68eaf4..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-675-smeg-m-un-n-c-smeg-klf03creu-535-43-675-53543675/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.675 | Smeg | Ấm Đun Nước Smeg KLF03CREU 535.43.675 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-678-smeg-m-un-n-c-th-p-ni-n-50-smeg-klf03pbeu-535-43-678-53543678/index.html b/restored/san-pham/535-43-678-smeg-m-un-n-c-th-p-ni-n-50-smeg-klf03pbeu-535-43-678-53543678/index.html deleted file mode 100644 index 023e496174e6be36968f2832215b668be8ac0933..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-678-smeg-m-un-n-c-th-p-ni-n-50-smeg-klf03pbeu-535-43-678-53543678/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.678 | Smeg | Ấm Đun Nước Thập Niên 50 Smeg KLF03PBEU 535.43.678 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-679-smeg-m-un-n-c-th-p-ni-n-50-smeg-klf03rdeu-535-43-679-53543679/index.html b/restored/san-pham/535-43-679-smeg-m-un-n-c-th-p-ni-n-50-smeg-klf03rdeu-535-43-679-53543679/index.html deleted file mode 100644 index 5197c502117c53c8503079f614eaa5142938c43f..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-679-smeg-m-un-n-c-th-p-ni-n-50-smeg-klf03rdeu-535-43-679-53543679/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.679 | Smeg | Ấm Đun Nước Thập Niên 50 Smeg KLF03RDEU 535.43.679 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-700-smeg-m-un-n-c-smeg-klf03dgeu-535-43-700-53543700/index.html b/restored/san-pham/535-43-700-smeg-m-un-n-c-smeg-klf03dgeu-535-43-700-53543700/index.html deleted file mode 100644 index 51307e75121ad3c7966bf9e0b6dc52b46883d6fb..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-700-smeg-m-un-n-c-smeg-klf03dgeu-535-43-700-53543700/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.700 | Smeg | Ấm Đun Nước Smeg KLF03DGEU 535.43.700 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-710-hafele-n-i-chi-n-kh-ng-d-u-af-68a-hafele-535-43-710-53543710/index.html b/restored/san-pham/535-43-710-hafele-n-i-chi-n-kh-ng-d-u-af-68a-hafele-535-43-710-53543710/index.html deleted file mode 100644 index 324022883fb5c69dd727b2565cf82ca6f0858623..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-710-hafele-n-i-chi-n-kh-ng-d-u-af-68a-hafele-535-43-710-53543710/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.710 | Hafele | Nồi Chiên Không Dầu AF-68A Hafele 535.43.710 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-711-hafele-n-i-chi-n-kh-ng-d-u-11l-af-602a-hafele-535-43-711-53543711/index.html b/restored/san-pham/535-43-711-hafele-n-i-chi-n-kh-ng-d-u-11l-af-602a-hafele-535-43-711-53543711/index.html deleted file mode 100644 index bbc97779c1d87f445574b30659ccf927dc2d886d..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-711-hafele-n-i-chi-n-kh-ng-d-u-11l-af-602a-hafele-535-43-711-53543711/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.711 | Hafele | Nồi Chiên Không Dầu 11L AF-602A Hafele 535.43.711 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-712-hafele-n-i-chi-n-kh-ng-d-u-5l-af-t5a-hafele-535-43-712-53543712/index.html b/restored/san-pham/535-43-712-hafele-n-i-chi-n-kh-ng-d-u-5l-af-t5a-hafele-535-43-712-53543712/index.html deleted file mode 100644 index 1d72095555d493f7b845d19daf9757f76b4ddebe..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-712-hafele-n-i-chi-n-kh-ng-d-u-5l-af-t5a-hafele-535-43-712-53543712/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.712 | Hafele | Nồi Chiên Không Dầu 5L AF-T5A Hafele 535.43.712 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-713-hafele-n-i-chi-n-kh-ng-d-u-5-7-af-t5a-hafele-535-43-713-53543713/index.html b/restored/san-pham/535-43-713-hafele-n-i-chi-n-kh-ng-d-u-5-7-af-t5a-hafele-535-43-713-53543713/index.html deleted file mode 100644 index 534ca5fe5c30b4b1ccf87fca13873cd717b7329d..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-713-hafele-n-i-chi-n-kh-ng-d-u-5-7-af-t5a-hafele-535-43-713-53543713/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.713 | Hafele | Nồi Chiên Không Dầu 5.7 AF-T5A Hafele 535.43.713 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-730-hafele-m-un-n-c-si-u-t-c-t-9017-hafele-535-43-730-53543730/index.html b/restored/san-pham/535-43-730-hafele-m-un-n-c-si-u-t-c-t-9017-hafele-535-43-730-53543730/index.html deleted file mode 100644 index 00c92ba0c18471a02d90da725cd02ac8b1a4deb1..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-730-hafele-m-un-n-c-si-u-t-c-t-9017-hafele-535-43-730-53543730/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.730 | Hafele | Ấm Đun Nước Siêu Tốc T-9017 Hafele 535.43.730 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-731-hafele-m-un-n-c-t-907b-hafele-535-43-731-53543731/index.html b/restored/san-pham/535-43-731-hafele-m-un-n-c-t-907b-hafele-535-43-731-53543731/index.html deleted file mode 100644 index 983a5de8a6ca196033ac736d68264db42bcc7469..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-731-hafele-m-un-n-c-t-907b-hafele-535-43-731-53543731/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.731 | Hafele | Ấm Đun Nước T-907B Hafele 535.43.731 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-732-hafele-m-un-n-c-thu-y-tinh-t-602c-hafele-535-43-732-53543732/index.html b/restored/san-pham/535-43-732-hafele-m-un-n-c-thu-y-tinh-t-602c-hafele-535-43-732-53543732/index.html deleted file mode 100644 index 2d0cdea634ba21efc8ef55cd9fc1dd5a8314bee4..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-732-hafele-m-un-n-c-thu-y-tinh-t-602c-hafele-535-43-732-53543732/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.732 | Hafele | Ấm Đun Nước Thủy Tinh T-602C Hafele 535.43.732 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-733-hafele-m-un-n-c-si-u-t-c-hs-k1703x-hafele-535-43-733-53543733/index.html b/restored/san-pham/535-43-733-hafele-m-un-n-c-si-u-t-c-hs-k1703x-hafele-535-43-733-53543733/index.html deleted file mode 100644 index f21832c10db2f046edd0bf9b61a8beccda638161..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-733-hafele-m-un-n-c-si-u-t-c-hs-k1703x-hafele-535-43-733-53543733/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.733 | Hafele | Ấm Đun Nước Siêu Tốc HS-K1703X Hafele 535.43.733 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-734-hafele-m-un-n-c-si-u-t-c-hs-k1704x-hafele-535-43-734-53543734/index.html b/restored/san-pham/535-43-734-hafele-m-un-n-c-si-u-t-c-hs-k1704x-hafele-535-43-734-53543734/index.html deleted file mode 100644 index b954a1add8c3acae384c0d8479a9c496bc5d2259..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-734-hafele-m-un-n-c-si-u-t-c-hs-k1704x-hafele-535-43-734-53543734/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.734 | Hafele | Ấm Đun Nước Siêu Tốc HS-K1704X Hafele 535.43.734 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-801-hafele-ma-y-v-t-n-c-cam-hsj-c2s-hafele-535-43-801-53543801/index.html b/restored/san-pham/535-43-801-hafele-ma-y-v-t-n-c-cam-hsj-c2s-hafele-535-43-801-53543801/index.html deleted file mode 100644 index beae5dfe8021d72790122eee78d0393ab4689149..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-801-hafele-ma-y-v-t-n-c-cam-hsj-c2s-hafele-535-43-801-53543801/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.801 | Hafele | Máy Vắt Nước Cam HSJ-C2S Hafele 535.43.801 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-43-811-hafele-ma-y-e-p-ch-m-gs-133n-hafele-535-43-811-53543811/index.html b/restored/san-pham/535-43-811-hafele-ma-y-e-p-ch-m-gs-133n-hafele-535-43-811-53543811/index.html deleted file mode 100644 index 728be39b1f459182e4b29fd97f3f8b1801b43f2d..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-43-811-hafele-ma-y-e-p-ch-m-gs-133n-hafele-535-43-811-53543811/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.43.811 | Hafele | Máy Ép Chậm GS-133N Hafele 535.43.811 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-44-160-hafele-ma-y-xay-sinh-t-hs-b152tw-hafele-535-44-160-53544160/index.html b/restored/san-pham/535-44-160-hafele-ma-y-xay-sinh-t-hs-b152tw-hafele-535-44-160-53544160/index.html deleted file mode 100644 index c9f61985e85b46a0d12bb03ae52c78e81de6152f..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-44-160-hafele-ma-y-xay-sinh-t-hs-b152tw-hafele-535-44-160-53544160/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.44.160 | Hafele | Máy Xay Sinh Tố HS-B152TW Hafele 535.44.160 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-44-167-hafele-b-n-i-cha-o-hs-cw4cx-hafele-535-44-167-53544167/index.html b/restored/san-pham/535-44-167-hafele-b-n-i-cha-o-hs-cw4cx-hafele-535-44-167-53544167/index.html deleted file mode 100644 index 63165b39e6d18c2bfd716ba06fbf916daf64c410..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-44-167-hafele-b-n-i-cha-o-hs-cw4cx-hafele-535-44-167-53544167/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.44.167 | Hafele | Bộ Nồi Chảo HS-CW4CX Hafele 535.44.167 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-44-170-hafele-m-un-n-c-si-u-t-c-hs-k1707dx-hafele-535-44-170-53544170/index.html b/restored/san-pham/535-44-170-hafele-m-un-n-c-si-u-t-c-hs-k1707dx-hafele-535-44-170-53544170/index.html deleted file mode 100644 index f23c3d9d90b32a763a745780bf6879f184d88e3a..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-44-170-hafele-m-un-n-c-si-u-t-c-hs-k1707dx-hafele-535-44-170-53544170/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.44.170 | Hafele | Ấm Đun Nước Siêu Tốc HS-K1707DX Hafele 535.44.170 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-64-169-smeg-b-p-t-a-vu-ng-n-u-smeg-sim693wldr-535-64-169-53564169/index.html b/restored/san-pham/535-64-169-smeg-b-p-t-a-vu-ng-n-u-smeg-sim693wldr-535-64-169-53564169/index.html deleted file mode 100644 index 9b2a81a72c3910e4a3db653353345874121059d2..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-64-169-smeg-b-p-t-a-vu-ng-n-u-smeg-sim693wldr-535-64-169-53564169/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.64.169 | Smeg | Bếp Từ Đa Vùng Nấu Smeg SIM693WLDR 535.64.169 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/535-64-241-smeg-b-p-i-n-domino-smeg-se332eb-535-64-241-53564241/index.html b/restored/san-pham/535-64-241-smeg-b-p-i-n-domino-smeg-se332eb-535-64-241-53564241/index.html deleted file mode 100644 index 509bebf331b2e8fa8bc80e1784030cb6575c5d17..0000000000000000000000000000000000000000 --- a/restored/san-pham/535-64-241-smeg-b-p-i-n-domino-smeg-se332eb-535-64-241-53564241/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -535.64.241 | Smeg | Bếp Điện Domino Smeg SE332EB 535.64.241 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-01-601-hafele-b-p-t-hc-i603b-hafele-536-01-601-53601601/index.html b/restored/san-pham/536-01-601-hafele-b-p-t-hc-i603b-hafele-536-01-601-53601601/index.html deleted file mode 100644 index c390b84749b9418d2944aaa56b16a83296002367..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-01-601-hafele-b-p-t-hc-i603b-hafele-536-01-601-53601601/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.01.601 | Hafele | Bếp Từ HC-I603B Hafele 536.01.601 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-01-670-hafele-b-p-domino-2-t-hafele-hc-i302b-code-536-01-670-53601670/index.html b/restored/san-pham/536-01-670-hafele-b-p-domino-2-t-hafele-hc-i302b-code-536-01-670-53601670/index.html deleted file mode 100644 index 957f8f0be4b1febe59c2745099d8b1cfce6df3d3..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-01-670-hafele-b-p-domino-2-t-hafele-hc-i302b-code-536-01-670-53601670/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.01.670 | Hafele | Bếp Domino 2 Từ Hafele HC-I302B. Code : 536.01.670 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-01-741-hafele-b-p-i-n-3-vu-ng-n-u-hc-r603p-hafele-536-01-741-53601741/index.html b/restored/san-pham/536-01-741-hafele-b-p-i-n-3-vu-ng-n-u-hc-r603p-hafele-536-01-741-53601741/index.html deleted file mode 100644 index 4eea5867eda406b4a4b8d0485b0cefe8fa5e235f..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-01-741-hafele-b-p-i-n-3-vu-ng-n-u-hc-r603p-hafele-536-01-741-53601741/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.01.741 | Hafele | Bếp Điện 3 Vùng Nấu HC-R603P Hafele 536.01.741 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-01-900-hafele-b-p-t-domino-hc-i302d-hafele-536-01-900-53601900/index.html b/restored/san-pham/536-01-900-hafele-b-p-t-domino-hc-i302d-hafele-536-01-900-53601900/index.html deleted file mode 100644 index 8e8d61e03b4e8349864c294f6fffbca8a6ad9521..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-01-900-hafele-b-p-t-domino-hc-i302d-hafele-536-01-900-53601900/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.01.900 | Hafele | Bếp Từ Domino HC-I302D Hafele 536.01.900 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-01-901-hafele-b-p-i-n-3-vu-ng-n-u-hc-r603d-hafele-536-01-901-53601901/index.html b/restored/san-pham/536-01-901-hafele-b-p-i-n-3-vu-ng-n-u-hc-r603d-hafele-536-01-901-53601901/index.html deleted file mode 100644 index 207dce54da262b62ab2559f96e6e1816b581af1c..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-01-901-hafele-b-p-i-n-3-vu-ng-n-u-hc-r603d-hafele-536-01-901-53601901/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.01.901 | Hafele | Bếp Điện 3 Vùng Nấu HC-R603D Hafele 536.01.901 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-01-905-hafele-b-p-t-3-vu-ng-n-u-hc-i773d-hafele-536-01-905-53601905/index.html b/restored/san-pham/536-01-905-hafele-b-p-t-3-vu-ng-n-u-hc-i773d-hafele-536-01-905-53601905/index.html deleted file mode 100644 index 4a9c6ea6c31c9fbd05282541fefa4a950dd64183..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-01-905-hafele-b-p-t-3-vu-ng-n-u-hc-i773d-hafele-536-01-905-53601905/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.01.905 | Hafele | Bếp Từ 3 Vùng Nấu HC-I773D Hafele 536.01.905 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-01-911-hafele-b-p-t-a-vu-ng-n-u-hc-if60d-hafele-536-01-911-53601911/index.html b/restored/san-pham/536-01-911-hafele-b-p-t-a-vu-ng-n-u-hc-if60d-hafele-536-01-911-53601911/index.html deleted file mode 100644 index 9f733aaf61e92c1b469c665a7dd406f9fcdff1b9..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-01-911-hafele-b-p-t-a-vu-ng-n-u-hc-if60d-hafele-536-01-911-53601911/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.01.911 | Hafele | Bếp Từ Đa Vùng Nấu HC-IF60D Hafele 536.01.911 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-14-230-smeg-tu-la-nh-smeg-fab28rbl3-536-14-230-53614230/index.html b/restored/san-pham/536-14-230-smeg-tu-la-nh-smeg-fab28rbl3-536-14-230-53614230/index.html deleted file mode 100644 index 705006143f9a92b22a705d17a97a55253dafe28c..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-14-230-smeg-tu-la-nh-smeg-fab28rbl3-536-14-230-53614230/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.14.230 | Smeg | Tủ Lạnh Smeg FAB28RBL3 536.14.230 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-14-236-smeg-tu-la-nh-smeg-fab28rcr3-536-14-236-53614236/index.html b/restored/san-pham/536-14-236-smeg-tu-la-nh-smeg-fab28rcr3-536-14-236-53614236/index.html deleted file mode 100644 index 01a2e919d4ad84b8272005528e60468a9195503f..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-14-236-smeg-tu-la-nh-smeg-fab28rcr3-536-14-236-53614236/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.14.236 | Smeg | Tủ Lạnh Smeg FAB28RCR3 536.14.236 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-14-237-smeg-tu-la-nh-smeg-fab28rrd3-536-14-237-53614237/index.html b/restored/san-pham/536-14-237-smeg-tu-la-nh-smeg-fab28rrd3-536-14-237-53614237/index.html deleted file mode 100644 index 8d41c51fbcd413453bfc2c8fc87ab99430e9ac55..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-14-237-smeg-tu-la-nh-smeg-fab28rrd3-536-14-237-53614237/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.14.237 | Smeg | Tủ Lạnh Smeg FAB28RRD3 536.14.237 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-14-243-smeg-tu-la-nh-smeg-fab28rpb3-536-14-243-53614243/index.html b/restored/san-pham/536-14-243-smeg-tu-la-nh-smeg-fab28rpb3-536-14-243-53614243/index.html deleted file mode 100644 index 0b883d5ceb463c46036b47ecf1daa9e620d9bb7f..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-14-243-smeg-tu-la-nh-smeg-fab28rpb3-536-14-243-53614243/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.14.243 | Smeg | Tủ Lạnh Smeg FAB28RPB3 536.14.243 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-14-391-smeg-tu-la-nh-smeg-fab28rdit3-536-14-391-53614391/index.html b/restored/san-pham/536-14-391-smeg-tu-la-nh-smeg-fab28rdit3-536-14-391-53614391/index.html deleted file mode 100644 index 38095663acc5be66b7b3e1d4510ff40540eb998c..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-14-391-smeg-tu-la-nh-smeg-fab28rdit3-536-14-391-53614391/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.14.391 | Smeg | Tủ Lạnh Smeg FAB28RDIT3 536.14.391 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-631-hafele-b-p-t-3-vu-ng-n-u-hc-i603d-hafele-536-61-631-53661631/index.html b/restored/san-pham/536-61-631-hafele-b-p-t-3-vu-ng-n-u-hc-i603d-hafele-536-61-631-53661631/index.html deleted file mode 100644 index 20000c774ca98a07ddaafdfe71f412d8a56210ac..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-631-hafele-b-p-t-3-vu-ng-n-u-hc-i603d-hafele-536-61-631-53661631/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.631 | Hafele | Bếp Từ 3 Vùng Nấu HC-I603D Hafele 536.61.631 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-645-hafele-b-p-t-2-vu-ng-n-u-hc-i772d-hafele-536-61-645-53661645/index.html b/restored/san-pham/536-61-645-hafele-b-p-t-2-vu-ng-n-u-hc-i772d-hafele-536-61-645-53661645/index.html deleted file mode 100644 index 26c60fa3d85a7df967604b0c7ec3ed8fedad1717..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-645-hafele-b-p-t-2-vu-ng-n-u-hc-i772d-hafele-536-61-645-53661645/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.645 | Hafele | Bếp Từ 2 Vùng Nấu HC-I772D Hafele 536.61.645 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-655-hafele-b-p-t-k-t-h-p-ma-y-hu-t-mu-i-hafele-536-61-655-53661655/index.html b/restored/san-pham/536-61-655-hafele-b-p-t-k-t-h-p-ma-y-hu-t-mu-i-hafele-536-61-655-53661655/index.html deleted file mode 100644 index 2e205559fcdb45fc5f9127473c14f9b4b984cfcb..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-655-hafele-b-p-t-k-t-h-p-ma-y-hu-t-mu-i-hafele-536-61-655-53661655/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.655 | Hafele | Bếp Từ Kết Hợp Máy Hút Mùi Hafele 536.61.655 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-665-hafele-b-p-t-3-vu-ng-n-u-hc-if77d-hafele-536-61-665-53661665/index.html b/restored/san-pham/536-61-665-hafele-b-p-t-3-vu-ng-n-u-hc-if77d-hafele-536-61-665-53661665/index.html deleted file mode 100644 index 44a6921c999d0cdf80c6de49f50b9b748dccad11..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-665-hafele-b-p-t-3-vu-ng-n-u-hc-if77d-hafele-536-61-665-53661665/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.665 | Hafele | Bếp Từ 3 Vùng Nấu HC-IF77D Hafele 536.61.665 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-670-hafele-b-p-i-n-domino-hc-r302d-hafele-536-61-670-53661670/index.html b/restored/san-pham/536-61-670-hafele-b-p-i-n-domino-hc-r302d-hafele-536-61-670-53661670/index.html deleted file mode 100644 index 917e65780cad78967209da48cbad16d9a961584c..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-670-hafele-b-p-i-n-domino-hc-r302d-hafele-536-61-670-53661670/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.670 | Hafele | Bếp Điện Domino HC-R302D Hafele 536.61.670 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-685-hafele-b-p-i-n-2-vu-ng-n-u-hc-r772d-hafele-536-61-685-53661685/index.html b/restored/san-pham/536-61-685-hafele-b-p-i-n-2-vu-ng-n-u-hc-r772d-hafele-536-61-685-53661685/index.html deleted file mode 100644 index d3105f795257813c622a7530264187ba46d5d241..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-685-hafele-b-p-i-n-2-vu-ng-n-u-hc-r772d-hafele-536-61-685-53661685/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.685 | Hafele | Bếp Điện 2 Vùng Nấu HC-R772D Hafele 536.61.685 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-695-hafele-b-p-i-n-t-hc-m772d-hafele-536-61-695-53661695/index.html b/restored/san-pham/536-61-695-hafele-b-p-i-n-t-hc-m772d-hafele-536-61-695-53661695/index.html deleted file mode 100644 index 5ea09fda8eaf395ff1773df9fe1acb2ef58ae81e..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-695-hafele-b-p-i-n-t-hc-m772d-hafele-536-61-695-53661695/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.695 | Hafele | Bếp Điện Từ HC-M772D Hafele 536.61.695 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-705-hafele-b-p-t-k-t-h-p-i-n-hc-m773d-hafele-536-61-705-53661705/index.html b/restored/san-pham/536-61-705-hafele-b-p-t-k-t-h-p-i-n-hc-m773d-hafele-536-61-705-53661705/index.html deleted file mode 100644 index 4269fd8339295dcd4bf86609156e35dc8299e638..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-705-hafele-b-p-t-k-t-h-p-i-n-hc-m773d-hafele-536-61-705-53661705/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.705 | Hafele | Bếp Từ Kết Hợp Điện HC-M773D Hafele 536.61.705 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-716-hafele-b-p-t-m-hc-i2712a-hafele-536-61-716-53661716/index.html b/restored/san-pham/536-61-716-hafele-b-p-t-m-hc-i2712a-hafele-536-61-716-53661716/index.html deleted file mode 100644 index 2b961e6c7af17520321edf06741df6f8bca3680e..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-716-hafele-b-p-t-m-hc-i2712a-hafele-536-61-716-53661716/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.716 | Hafele | Bếp Từ Âm HC-I2712A Hafele 536.61.716 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-726-hafele-b-p-t-2-vu-ng-n-u-hc-i2732a-hafele-536-61-726-53661726/index.html b/restored/san-pham/536-61-726-hafele-b-p-t-2-vu-ng-n-u-hc-i2732a-hafele-536-61-726-53661726/index.html deleted file mode 100644 index 695f8505c418693f23b04ffc8903be929804ffcd..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-726-hafele-b-p-t-2-vu-ng-n-u-hc-i2732a-hafele-536-61-726-53661726/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.726 | Hafele | Bếp Từ 2 Vùng Nấu HC-I2732A Hafele 536.61.726 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-736-hafele-b-p-t-m-2-vu-ng-n-u-hc-i3732a-hafele-536-61-736-53661736/index.html b/restored/san-pham/536-61-736-hafele-b-p-t-m-2-vu-ng-n-u-hc-i3732a-hafele-536-61-736-53661736/index.html deleted file mode 100644 index a8c59d794d29df71eda249f6073f1522fdbc1c5c..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-736-hafele-b-p-t-m-2-vu-ng-n-u-hc-i3732a-hafele-536-61-736-53661736/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.736 | Hafele | Bếp Từ Âm 2 Vùng Nấu HC-I3732A Hafele 536.61.736 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-770-hafele-b-p-t-domino-hc-i302b-hafele-536-61-770-53661770/index.html b/restored/san-pham/536-61-770-hafele-b-p-t-domino-hc-i302b-hafele-536-61-770-53661770/index.html deleted file mode 100644 index 40dadc91bb075a8fbf0bac5b9839b0b5d9392db7..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-770-hafele-b-p-t-domino-hc-i302b-hafele-536-61-770-53661770/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.770 | Hafele | Bếp Từ Domino HC-I302B Hafele 536.61.770 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-787-hafele-b-p-t-2-vu-ng-n-u-hc-i752b-hafele-536-61-787-53661787/index.html b/restored/san-pham/536-61-787-hafele-b-p-t-2-vu-ng-n-u-hc-i752b-hafele-536-61-787-53661787/index.html deleted file mode 100644 index a37b4b895133020b7985576beaa046161432c2e3..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-787-hafele-b-p-t-2-vu-ng-n-u-hc-i752b-hafele-536-61-787-53661787/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.787 | Hafele | Bếp Từ 2 Vùng Nấu HC-I752B Hafele 536.61.787 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-791-hafele-b-p-t-3-vu-ng-n-u-hc-i603b-hafele-536-61-791-53661791/index.html b/restored/san-pham/536-61-791-hafele-b-p-t-3-vu-ng-n-u-hc-i603b-hafele-536-61-791-53661791/index.html deleted file mode 100644 index e0bc47ae74a19ae62699eba3c3458d45913b2997..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-791-hafele-b-p-t-3-vu-ng-n-u-hc-i603b-hafele-536-61-791-53661791/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.791 | Hafele | Bếp Từ 3 Vùng Nấu HC-I603B Hafele 536.61.791 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-801-hafele-b-p-t-3-vu-ng-n-u-hc-i6037b-hafele-536-61-801-53661801/index.html b/restored/san-pham/536-61-801-hafele-b-p-t-3-vu-ng-n-u-hc-i6037b-hafele-536-61-801-53661801/index.html deleted file mode 100644 index d0b81ff1ca2bf2fccfb798ce44f01a473a3e4817..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-801-hafele-b-p-t-3-vu-ng-n-u-hc-i6037b-hafele-536-61-801-53661801/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.801 | Hafele | Bếp Từ 3 Vùng Nấu HC-I6037B Hafele 536.61.801 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-827-hafele-b-p-t-2-vu-ng-n-u-hc-i7520b-hafele-536-61-827-53661827/index.html b/restored/san-pham/536-61-827-hafele-b-p-t-2-vu-ng-n-u-hc-i7520b-hafele-536-61-827-53661827/index.html deleted file mode 100644 index 5d5f9e49ef8a53e3e3e84ab1bc03904117791fa7..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-827-hafele-b-p-t-2-vu-ng-n-u-hc-i7520b-hafele-536-61-827-53661827/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.827 | Hafele | Bếp Từ 2 Vùng Nấu HC-I7520B Hafele 536.61.827 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-831-hafele-b-p-t-3-vu-ng-n-u-hc-i6030b-hafele-536-61-831-53661831/index.html b/restored/san-pham/536-61-831-hafele-b-p-t-3-vu-ng-n-u-hc-i6030b-hafele-536-61-831-53661831/index.html deleted file mode 100644 index 381c48f6a61f69521851bb24a0f3e46b6a657c93..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-831-hafele-b-p-t-3-vu-ng-n-u-hc-i6030b-hafele-536-61-831-53661831/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.831 | Hafele | Bếp Từ 3 Vùng Nấu HC-I6030B Hafele 536.61.831 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-856-hafele-b-p-i-n-t-k-t-h-p-2-vu-ng-n-u-hc-h7321b-hafele-536-61-856-53661856/index.html b/restored/san-pham/536-61-856-hafele-b-p-i-n-t-k-t-h-p-2-vu-ng-n-u-hc-h7321b-hafele-536-61-856-53661856/index.html deleted file mode 100644 index c995980e1df1935266d84e6e81dfae6937632353..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-856-hafele-b-p-i-n-t-k-t-h-p-2-vu-ng-n-u-hc-h7321b-hafele-536-61-856-53661856/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.856 | Hafele | Bếp Điện Từ Kết Hợp 2 Vùng Nấu HC-H7321B Hafele 536.61.856 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-61-886-hafele-b-p-t-m-2-vu-ng-n-u-hc-i7323b-hafele-536-61-886-53661886/index.html b/restored/san-pham/536-61-886-hafele-b-p-t-m-2-vu-ng-n-u-hc-i7323b-hafele-536-61-886-53661886/index.html deleted file mode 100644 index 995691d763e114f91aac733d1f492ab3cd14d55f..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-61-886-hafele-b-p-t-m-2-vu-ng-n-u-hc-i7323b-hafele-536-61-886-53661886/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.61.886 | Hafele | Bếp Từ Âm 2 Vùng Nấu HC-I7323B Hafele 536.61.886 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-64-081-smeg-b-p-t-smeg-si1m7733b-536-64-081-53664081/index.html b/restored/san-pham/536-64-081-smeg-b-p-t-smeg-si1m7733b-536-64-081-53664081/index.html deleted file mode 100644 index 00f72066612b0fc1590fe425864c06d2b007d6b8..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-64-081-smeg-b-p-t-smeg-si1m7733b-536-64-081-53664081/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.64.081 | Smeg | Bếp Từ Smeg SI1M7733B 536.64.081 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-64-091-smeg-b-p-t-m-3-vu-ng-n-u-smeg-si5632d-536-64-091-53664091/index.html b/restored/san-pham/536-64-091-smeg-b-p-t-m-3-vu-ng-n-u-smeg-si5632d-536-64-091-53664091/index.html deleted file mode 100644 index 1af91863b15758e8a23441050c741ef487ec275c..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-64-091-smeg-b-p-t-m-3-vu-ng-n-u-smeg-si5632d-536-64-091-53664091/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.64.091 | Smeg | Bếp Từ Âm 3 Vùng Nấu Smeg SI5632D 536.64.091 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-64-101-smeg-b-p-i-n-smeg-se363etb-536-64-101-53664101/index.html b/restored/san-pham/536-64-101-smeg-b-p-i-n-smeg-se363etb-536-64-101-53664101/index.html deleted file mode 100644 index 7e9b77a1e868c6c847e3b0e9316d274bffa2cbe6..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-64-101-smeg-b-p-i-n-smeg-se363etb-536-64-101-53664101/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.64.101 | Smeg | Bếp Điện Smeg SE363ETB 536.64.101 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-94-160-smeg-ma-y-gi-t-k-t-h-p-s-y-m-tu-smeg-wdi14c7-2-536-94-160-53694160/index.html b/restored/san-pham/536-94-160-smeg-ma-y-gi-t-k-t-h-p-s-y-m-tu-smeg-wdi14c7-2-536-94-160-53694160/index.html deleted file mode 100644 index bbd6eaba88435199ea20f1df3862478c1d2107ed..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-94-160-smeg-ma-y-gi-t-k-t-h-p-s-y-m-tu-smeg-wdi14c7-2-536-94-160-53694160/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.94.160 | Smeg | Máy Giặt Kết Hợp Sấy Âm Tủ Smeg WDI14C7-2 536.94.160 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/536-94-567-smeg-ma-y-gi-t-k-t-h-p-s-y-7kg-smeg-lsf147e-536-94-567-53694567/index.html b/restored/san-pham/536-94-567-smeg-ma-y-gi-t-k-t-h-p-s-y-7kg-smeg-lsf147e-536-94-567-53694567/index.html deleted file mode 100644 index a4a23b62c7c743488e896a8d3b6c681c3009e44c..0000000000000000000000000000000000000000 --- a/restored/san-pham/536-94-567-smeg-ma-y-gi-t-k-t-h-p-s-y-7kg-smeg-lsf147e-536-94-567-53694567/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -536.94.567 | Smeg | Máy Giặt Kết Hợp Sấy 7Kg Smeg LSF147E 536.94.567 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/537-82-700-hafele-ma-y-lo-c-kh-ng-khi-pho-ng-50-60-m-2-cf-8209-hafele-537-82-700-53782700/index.html b/restored/san-pham/537-82-700-hafele-ma-y-lo-c-kh-ng-khi-pho-ng-50-60-m-2-cf-8209-hafele-537-82-700-53782700/index.html deleted file mode 100644 index 635cff8484716ee35c9ca65bf6499b52832d83fb..0000000000000000000000000000000000000000 --- a/restored/san-pham/537-82-700-hafele-ma-y-lo-c-kh-ng-khi-pho-ng-50-60-m-2-cf-8209-hafele-537-82-700-53782700/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -537.82.700 | Hafele | Máy Lọc Không Khí Phòng 50 - 60 m​2 CF-8209 Hafele 537.82.700 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/537-82-710-hafele-ma-y-lo-c-kh-ng-khi-cf-8116-pho-ng-20-25m2-hafele-537-82-710-53782710/index.html b/restored/san-pham/537-82-710-hafele-ma-y-lo-c-kh-ng-khi-cf-8116-pho-ng-20-25m2-hafele-537-82-710-53782710/index.html deleted file mode 100644 index 10da5b654b9e9d68eb92ecc41947b71727ec7b61..0000000000000000000000000000000000000000 --- a/restored/san-pham/537-82-710-hafele-ma-y-lo-c-kh-ng-khi-cf-8116-pho-ng-20-25m2-hafele-537-82-710-53782710/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -537.82.710 | Hafele | Máy Lọc Không Khí CF-8116 Phòng 20 - 25m2 Hafele 537.82.710 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/537-82-720-hafele-ma-y-lo-c-kh-ng-khi-wifi-cf-8126s-hafele-537-82-720-53782720/index.html b/restored/san-pham/537-82-720-hafele-ma-y-lo-c-kh-ng-khi-wifi-cf-8126s-hafele-537-82-720-53782720/index.html deleted file mode 100644 index 9e312c716f5dff1e1d8bb065d104be2d08c0c9b5..0000000000000000000000000000000000000000 --- a/restored/san-pham/537-82-720-hafele-ma-y-lo-c-kh-ng-khi-wifi-cf-8126s-hafele-537-82-720-53782720/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -537.82.720 | Hafele | Máy Lọc Không Khí Wifi CF-8126S Hafele 537.82.720 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/537-82-730-hafele-ma-y-lo-c-kh-ng-khi-pho-ng-20-30m-hsp-8116u-hafele-537-82-730-53782730/index.html b/restored/san-pham/537-82-730-hafele-ma-y-lo-c-kh-ng-khi-pho-ng-20-30m-hsp-8116u-hafele-537-82-730-53782730/index.html deleted file mode 100644 index 0463eb45e971538f3f15a025b6d6a2d3a732589a..0000000000000000000000000000000000000000 --- a/restored/san-pham/537-82-730-hafele-ma-y-lo-c-kh-ng-khi-pho-ng-20-30m-hsp-8116u-hafele-537-82-730-53782730/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -537.82.730 | Hafele | Máy Lọc Không Khí Phòng 20-30m² HSP-8116U Hafele 537.82.730 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-06-287-hafele-b-p-gas-hc-g782a-hafele-538-06-287-53806287/index.html b/restored/san-pham/538-06-287-hafele-b-p-gas-hc-g782a-hafele-538-06-287-53806287/index.html deleted file mode 100644 index fb7458ff011f090b35852c9ee01822d9aec4080d..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-06-287-hafele-b-p-gas-hc-g782a-hafele-538-06-287-53806287/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.06.287 | Hafele | Bếp Gas HC-G782A Hafele 538.06.287 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-06-298-hafele-b-p-gas-m-hc-g863b-hafele-538-06-298-53806298/index.html b/restored/san-pham/538-06-298-hafele-b-p-gas-m-hc-g863b-hafele-538-06-298-53806298/index.html deleted file mode 100644 index a869b42b63cc812a4d78d3bfb20946de8419415d..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-06-298-hafele-b-p-gas-m-hc-g863b-hafele-538-06-298-53806298/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.06.298 | Hafele | Bếp Gas Âm HC-G863B Hafele 538.06.298 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-11-500-hafele-tu-la-nh-mini-hf-m42g-hafele-538-11-500-53811500/index.html b/restored/san-pham/538-11-500-hafele-tu-la-nh-mini-hf-m42g-hafele-538-11-500-53811500/index.html deleted file mode 100644 index b1244a8011a472cd154d4538b6b468c6179f29f7..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-11-500-hafele-tu-la-nh-mini-hf-m42g-hafele-538-11-500-53811500/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.11.500 | Hafele | Tủ Lạnh Mini HF-M42G Hafele 538.11.500 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-11-800-hafele-tu-r-u-hw-b36a-hafele-538-11-800-53811800/index.html b/restored/san-pham/538-11-800-hafele-tu-r-u-hw-b36a-hafele-538-11-800-53811800/index.html deleted file mode 100644 index ebbf27ca56baf61365ba89fc8905607b1a4ebdbd..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-11-800-hafele-tu-r-u-hw-b36a-hafele-538-11-800-53811800/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.11.800 | Hafele | Tủ Rượu HW-B36A Hafele 538.11.800 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-21-200-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60e-hafele-538-21-200-53821200/index.html b/restored/san-pham/538-21-200-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60e-hafele-538-21-200-53821200/index.html deleted file mode 100644 index f31d71f347a0e3b8d868e7f56f9b88350d98590c..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-21-200-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60e-hafele-538-21-200-53821200/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.21.200 | Hafele | Máy Rửa Chén Độc Lập HDW-F60E Hafele 538.21.200 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-21-310-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60eb-hafele-538-21-310-53821310/index.html b/restored/san-pham/538-21-310-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60eb-hafele-538-21-310-53821310/index.html deleted file mode 100644 index 06eed1706123622ebf0560cd81052f8c8d5acf40..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-21-310-hafele-ma-y-r-a-che-n-c-l-p-hdw-f60eb-hafele-538-21-310-53821310/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.21.310 | Hafele | Máy Rửa Chén Độc Lập HDW-F60EB Hafele 538.21.310 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-21-320-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-si60ab-hafele-538-21-320-53821320/index.html b/restored/san-pham/538-21-320-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-si60ab-hafele-538-21-320-53821320/index.html deleted file mode 100644 index dc5ac8e0ad62f62d2bbc040d16469894603ba15b..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-21-320-hafele-ma-y-r-a-che-n-m-ba-n-ph-n-hdw-si60ab-hafele-538-21-320-53821320/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.21.320 | Hafele | Máy Rửa Chén Âm Bán Phần HDW-SI60AB Hafele 538.21.320 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-21-330-hafele-ma-y-r-a-che-n-m-toa-n-ph-n-hdw-fi60ab-hafele-538-21-330-53821330/index.html b/restored/san-pham/538-21-330-hafele-ma-y-r-a-che-n-m-toa-n-ph-n-hdw-fi60ab-hafele-538-21-330-53821330/index.html deleted file mode 100644 index 8d0cd8f1edaef2e8aa650d98ad5c33661833c9ac..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-21-330-hafele-ma-y-r-a-che-n-m-toa-n-ph-n-hdw-fi60ab-hafele-538-21-330-53821330/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.21.330 | Hafele | Máy Rửa Chén Âm Toàn Phần HDW-FI60AB Hafele 538.21.330 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-21-340-hafele-ma-y-r-a-che-n-ba-t-hdw-t5551b-hafele-538-21-340-53821340/index.html b/restored/san-pham/538-21-340-hafele-ma-y-r-a-che-n-ba-t-hdw-t5551b-hafele-538-21-340-53821340/index.html deleted file mode 100644 index 865fcec008a84d3f1ebfbf9d46136ea2a695f59d..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-21-340-hafele-ma-y-r-a-che-n-ba-t-hdw-t5551b-hafele-538-21-340-53821340/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.21.340 | Hafele | Máy Rửa Chén Bát HDW-T5551B Hafele 538.21.340 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-21-350-hafele-ma-y-r-a-che-n-ba-t-hdw-t5531b-hafele-538-21-350-53821350/index.html b/restored/san-pham/538-21-350-hafele-ma-y-r-a-che-n-ba-t-hdw-t5531b-hafele-538-21-350-53821350/index.html deleted file mode 100644 index f9437f2d8325d1211c9a003545767f955304e678..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-21-350-hafele-ma-y-r-a-che-n-ba-t-hdw-t5531b-hafele-538-21-350-53821350/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.21.350 | Hafele | Máy Rửa Chén Bát HDW-T5531B Hafele 538.21.350 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-21-360-hafele-ma-y-r-a-che-n-c-l-p-hdw-f602eb-hafele-538-21-360-53821360/index.html b/restored/san-pham/538-21-360-hafele-ma-y-r-a-che-n-c-l-p-hdw-f602eb-hafele-538-21-360-53821360/index.html deleted file mode 100644 index ce1cb281804ad9a156aa529f40ab2c5ec1e93dfb..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-21-360-hafele-ma-y-r-a-che-n-c-l-p-hdw-f602eb-hafele-538-21-360-53821360/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.21.360 | Hafele | Máy Rửa Chén Độc Lập HDW-F602EB Hafele 538.21.360 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-21-370-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6051s-hafele-538-21-370-53821370/index.html b/restored/san-pham/538-21-370-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6051s-hafele-538-21-370-53821370/index.html deleted file mode 100644 index 182396cafbea454ed3fded5d097165dd82b42ab5..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-21-370-hafele-ma-y-r-a-che-n-c-l-p-hdw-f6051s-hafele-538-21-370-53821370/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.21.370 | Hafele | Máy Rửa Chén Độc Lập HDW-F6051S Hafele 538.21.370 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-91-080-hafele-ma-y-gi-t-m-tu-hw-b60a-hafele-538-91-080-53891080/index.html b/restored/san-pham/538-91-080-hafele-ma-y-gi-t-m-tu-hw-b60a-hafele-538-91-080-53891080/index.html deleted file mode 100644 index f7130963e96bb37aa3959e356a3530f03db3de80..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-91-080-hafele-ma-y-gi-t-m-tu-hw-b60a-hafele-538-91-080-53891080/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.91.080 | Hafele | Máy Giặt Âm Tủ HW-B60A Hafele 538.91.080 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-91-520-hafele-ma-y-s-y-tu-h-i-8kg-hd-f60a-hafele-538-91-520-53891520/index.html b/restored/san-pham/538-91-520-hafele-ma-y-s-y-tu-h-i-8kg-hd-f60a-hafele-538-91-520-53891520/index.html deleted file mode 100644 index c344247cac733c267fd950a7eb89b82034ea0080..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-91-520-hafele-ma-y-s-y-tu-h-i-8kg-hd-f60a-hafele-538-91-520-53891520/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.91.520 | Hafele | Máy Sấy Tụ Hơi 8Kg HD-F60A Hafele 538.91.520 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/538-91-530-hafele-ma-y-gi-t-8kg-hw-f60b-hafele-538-91-530-53891530/index.html b/restored/san-pham/538-91-530-hafele-ma-y-gi-t-8kg-hw-f60b-hafele-538-91-530-53891530/index.html deleted file mode 100644 index bf41afda670f9a10d954e97df8ebad81a1e147ed..0000000000000000000000000000000000000000 --- a/restored/san-pham/538-91-530-hafele-ma-y-gi-t-8kg-hw-f60b-hafele-538-91-530-53891530/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -538.91.530 | Hafele | Máy Giặt 8Kg HW-F60B Hafele 538.91.530 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/539-16-230-hafele-tu-la-nh-side-by-side-hf-sbsib-hafele-539-16-230-53916230/index.html b/restored/san-pham/539-16-230-hafele-tu-la-nh-side-by-side-hf-sbsib-hafele-539-16-230-53916230/index.html deleted file mode 100644 index 172c51538e760085fd016e1785bf312f7a7c07fa..0000000000000000000000000000000000000000 --- a/restored/san-pham/539-16-230-hafele-tu-la-nh-side-by-side-hf-sbsib-hafele-539-16-230-53916230/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -539.16.230 | Hafele | Tủ Lạnh Side By Side HF-SBSIB Hafele 539.16.230 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/539-20-600-hafele-ma-y-r-a-che-n-ba-n-hdw-t50b-hafele-539-20-600-53920600/index.html b/restored/san-pham/539-20-600-hafele-ma-y-r-a-che-n-ba-n-hdw-t50b-hafele-539-20-600-53920600/index.html deleted file mode 100644 index eba8b14726bd848a3bf574b8d43ab2d7d7e585d7..0000000000000000000000000000000000000000 --- a/restored/san-pham/539-20-600-hafele-ma-y-r-a-che-n-ba-n-hdw-t50b-hafele-539-20-600-53920600/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -539.20.600 | Hafele | Máy Rửa Chén Để Bàn HDW-T50B Hafele 539.20.600 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/539-66-698-hafele-b-p-i-n-t-hc-ihh80a-hafele-539-66-698-53966698/index.html b/restored/san-pham/539-66-698-hafele-b-p-i-n-t-hc-ihh80a-hafele-539-66-698-53966698/index.html deleted file mode 100644 index 857399a072afd16cf2d78ba69f3b06a968f0f232..0000000000000000000000000000000000000000 --- a/restored/san-pham/539-66-698-hafele-b-p-i-n-t-hc-ihh80a-hafele-539-66-698-53966698/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -539.66.698 | Hafele | Bếp Điện Từ HC-IHH80A Hafele 539.66.698 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/539-96-140-hafele-ma-y-gi-t-9kg-hw-f60a-hafele-539-96-140-53996140/index.html b/restored/san-pham/539-96-140-hafele-ma-y-gi-t-9kg-hw-f60a-hafele-539-96-140-53996140/index.html deleted file mode 100644 index 0635fcf2e1bf0a9ed480b1cb8c0c08f7a247a6e3..0000000000000000000000000000000000000000 --- a/restored/san-pham/539-96-140-hafele-ma-y-gi-t-9kg-hw-f60a-hafele-539-96-140-53996140/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -539.96.140 | Hafele | Máy Giặt 9kg HW-F60A Hafele 539.96.140 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/540-24-503-hafele-r-ke-o-phi-a-tr-c-400mm-hafele-540-24-503-54024503/index.html b/restored/san-pham/540-24-503-hafele-r-ke-o-phi-a-tr-c-400mm-hafele-540-24-503-54024503/index.html deleted file mode 100644 index 1c53a07549c0ac92246f86f36beac25fdf96e524..0000000000000000000000000000000000000000 --- a/restored/san-pham/540-24-503-hafele-r-ke-o-phi-a-tr-c-400mm-hafele-540-24-503-54024503/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -540.24.503 | Hafele | Rổ Kéo Phía Trước 400mm Hafele 540.24.503 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/540-24-504-hafele-r-ke-o-phi-a-tr-c-450mm-hafele-540-24-504-54024504/index.html b/restored/san-pham/540-24-504-hafele-r-ke-o-phi-a-tr-c-450mm-hafele-540-24-504-54024504/index.html deleted file mode 100644 index e19221d0673bacfd935e7b5ac207ef5208b33403..0000000000000000000000000000000000000000 --- a/restored/san-pham/540-24-504-hafele-r-ke-o-phi-a-tr-c-450mm-hafele-540-24-504-54024504/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -540.24.504 | Hafele | Rổ Kéo Phía Trước 450mm Hafele 540.24.504 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/540-24-507-hafele-r-ke-o-phi-a-tr-c-600mm-hafele-540-24-507-54024507/index.html b/restored/san-pham/540-24-507-hafele-r-ke-o-phi-a-tr-c-600mm-hafele-540-24-507-54024507/index.html deleted file mode 100644 index 90631fb1737c64b0e3880c90579ba9f03d442b65..0000000000000000000000000000000000000000 --- a/restored/san-pham/540-24-507-hafele-r-ke-o-phi-a-tr-c-600mm-hafele-540-24-507-54024507/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -540.24.507 | Hafele | Rổ Kéo Phía Trước 600mm Hafele 540.24.507 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/540-26-653-hafele-r-ke-o-lo-t-lo-ng-400mm-hafele-540-26-653-54026653/index.html b/restored/san-pham/540-26-653-hafele-r-ke-o-lo-t-lo-ng-400mm-hafele-540-26-653-54026653/index.html deleted file mode 100644 index 2279c5cfd8f6d81d3710a3d1d1c445ae67b69721..0000000000000000000000000000000000000000 --- a/restored/san-pham/540-26-653-hafele-r-ke-o-lo-t-lo-ng-400mm-hafele-540-26-653-54026653/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -540.26.653 | Hafele | Rổ Kéo Lọt Lòng 400mm Hafele 540.26.653 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/540-26-654-hafele-r-ke-o-lo-t-lo-ng-450mm-hafele-540-26-654-54026654/index.html b/restored/san-pham/540-26-654-hafele-r-ke-o-lo-t-lo-ng-450mm-hafele-540-26-654-54026654/index.html deleted file mode 100644 index 61fe508bb537da00da5eb1bfdd5f906607a2fc56..0000000000000000000000000000000000000000 --- a/restored/san-pham/540-26-654-hafele-r-ke-o-lo-t-lo-ng-450mm-hafele-540-26-654-54026654/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -540.26.654 | Hafele | Rổ Kéo Lọt Lòng 450mm Hafele 540.26.654 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/541-01-804-ext/index.html b/restored/san-pham/541-01-804-ext/index.html deleted file mode 100644 index 5229697782a29d81cf2ebb68c28382408e2a4c22..0000000000000000000000000000000000000000 --- a/restored/san-pham/541-01-804-ext/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -541.01.804 | Kosmo | Mâm Xoay Olla Move Phải 900mm Kosmo 541.01.804 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/541-01-814-ext/index.html b/restored/san-pham/541-01-814-ext/index.html deleted file mode 100644 index cd45b07182281bb16dc63607f82ec07fe28198fb..0000000000000000000000000000000000000000 --- a/restored/san-pham/541-01-814-ext/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -541.01.814 | Kosmo | Mâm Xoay Olla Move Trái 900mm Kosmo 541.01.814 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-004-hafele-khay-u-p-i-a-450mm-ma-u-inox-hafele-544-01-004-54401004/index.html b/restored/san-pham/544-01-004-hafele-khay-u-p-i-a-450mm-ma-u-inox-hafele-544-01-004-54401004/index.html deleted file mode 100644 index 96ec4d0111ced5adec6901c3acd1f0b9e04fe932..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-004-hafele-khay-u-p-i-a-450mm-ma-u-inox-hafele-544-01-004-54401004/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.004 | Hafele | Khay Úp Đĩa 450mm Màu Inox Hafele 544.01.004 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-007-hafele-khay-u-p-i-a-do-c-inox-600mm-hafele-544-01-007-54401007/index.html b/restored/san-pham/544-01-007-hafele-khay-u-p-i-a-do-c-inox-600mm-hafele-544-01-007-54401007/index.html deleted file mode 100644 index 1e67a7b8071e98cf5db5f56bb9664ea39116fe4c..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-007-hafele-khay-u-p-i-a-do-c-inox-600mm-hafele-544-01-007-54401007/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.007 | Hafele | Khay Úp Đĩa Dọc Inox 600mm Hafele 544.01.007 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-008-hafele-gia-u-p-i-a-800mm-ma-u-inox-hafele-544-01-008-54401008/index.html b/restored/san-pham/544-01-008-hafele-gia-u-p-i-a-800mm-ma-u-inox-hafele-544-01-008-54401008/index.html deleted file mode 100644 index 562b485f4cae00d1bf4bab3e58d6c80e48b333f3..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-008-hafele-gia-u-p-i-a-800mm-ma-u-inox-hafele-544-01-008-54401008/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.008 | Hafele | Giá Úp Đĩa 800mm Màu Inox Hafele 544.01.008 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-009-hafele-gia-u-p-i-a-900mm-ma-u-inox-hafele-544-01-009-54401009/index.html b/restored/san-pham/544-01-009-hafele-gia-u-p-i-a-900mm-ma-u-inox-hafele-544-01-009-54401009/index.html deleted file mode 100644 index beb9181fbcce3f5bcf85a74e7254abb39beab751..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-009-hafele-gia-u-p-i-a-900mm-ma-u-inox-hafele-544-01-009-54401009/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.009 | Hafele | Giá Úp Đĩa 900mm Màu Inox Hafele 544.01.009 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-024-hafele-khay-u-p-ph-ng-inox-450mm-hafele-544-01-024-54401024/index.html b/restored/san-pham/544-01-024-hafele-khay-u-p-ph-ng-inox-450mm-hafele-544-01-024-54401024/index.html deleted file mode 100644 index 5c35d3de6591e6f8419e120bd0292f4ec608ed97..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-024-hafele-khay-u-p-ph-ng-inox-450mm-hafele-544-01-024-54401024/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.024 | Hafele | Khay Úp Phẳng Inox 450mm Hafele 544.01.024 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-027-hafele-khay-u-p-che-n-ba-t-inox-600mm-hafele-544-01-027-54401027/index.html b/restored/san-pham/544-01-027-hafele-khay-u-p-che-n-ba-t-inox-600mm-hafele-544-01-027-54401027/index.html deleted file mode 100644 index 8b5b8e62f39805e70afdc0200c3d7e8c934829a9..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-027-hafele-khay-u-p-che-n-ba-t-inox-600mm-hafele-544-01-027-54401027/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.027 | Hafele | Khay Úp Chén Bát Inox 600mm Hafele 544.01.027 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-028-hafele-gia-u-p-ph-ng-inox-800mm-hafele-544-01-028-54401028/index.html b/restored/san-pham/544-01-028-hafele-gia-u-p-ph-ng-inox-800mm-hafele-544-01-028-54401028/index.html deleted file mode 100644 index b83c7c860ed74a5d8e8ba4bc18c2a86dd3605e40..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-028-hafele-gia-u-p-ph-ng-inox-800mm-hafele-544-01-028-54401028/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.028 | Hafele | Giá Úp Phẳng Inox 800mm Hafele 544.01.028 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-029-hafele-khay-u-p-ph-ng-inox-900mm-hafele-544-01-029-54401029/index.html b/restored/san-pham/544-01-029-hafele-khay-u-p-ph-ng-inox-900mm-hafele-544-01-029-54401029/index.html deleted file mode 100644 index 3aee84c89aa4bbd3f6e3a66fcfb9280045d1d405..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-029-hafele-khay-u-p-ph-ng-inox-900mm-hafele-544-01-029-54401029/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.029 | Hafele | Khay Úp Phẳng Inox 900mm Hafele 544.01.029 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-084-hafele-khay-h-ng-n-c-450mm-inox-hafele-544-01-084-54401084/index.html b/restored/san-pham/544-01-084-hafele-khay-h-ng-n-c-450mm-inox-hafele-544-01-084-54401084/index.html deleted file mode 100644 index 718742c5a2d0b086f1b0e1e8abf82aad1a49061a..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-084-hafele-khay-h-ng-n-c-450mm-inox-hafele-544-01-084-54401084/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.084 | Hafele | Khay Hứng Nước 450mm Inox Hafele 544.01.084 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-087-hafele-khay-h-ng-n-c-600mm-inox-hafele-544-01-087-54401087/index.html b/restored/san-pham/544-01-087-hafele-khay-h-ng-n-c-600mm-inox-hafele-544-01-087-54401087/index.html deleted file mode 100644 index 2e554432aaf788fec4d09eb7eac54c999c5d0515..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-087-hafele-khay-h-ng-n-c-600mm-inox-hafele-544-01-087-54401087/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.087 | Hafele | Khay Hứng Nước 600mm Inox Hafele 544.01.087 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-088-hafele-khay-h-ng-n-c-800mm-inox-hafele-544-01-088-54401088/index.html b/restored/san-pham/544-01-088-hafele-khay-h-ng-n-c-800mm-inox-hafele-544-01-088-54401088/index.html deleted file mode 100644 index e8b6a217a158756f2192c2ab2e95159912a743bc..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-088-hafele-khay-h-ng-n-c-800mm-inox-hafele-544-01-088-54401088/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.088 | Hafele | Khay Hứng Nước 800mm Inox Hafele 544.01.088 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-089-hafele-khay-h-ng-n-c-900mm-inox-hafele-544-01-089-54401089/index.html b/restored/san-pham/544-01-089-hafele-khay-h-ng-n-c-900mm-inox-hafele-544-01-089-54401089/index.html deleted file mode 100644 index 41398a58a914da72fe8d6bf50baba5d2a188cad1..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-089-hafele-khay-h-ng-n-c-900mm-inox-hafele-544-01-089-54401089/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.089 | Hafele | Khay Hứng Nước 900mm Inox Hafele 544.01.089 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-204-hafele-khay-u-p-ph-ng-inox-450mm-hafele-544-01-204-54401204/index.html b/restored/san-pham/544-01-204-hafele-khay-u-p-ph-ng-inox-450mm-hafele-544-01-204-54401204/index.html deleted file mode 100644 index 5f6e5de51ec690fc38a912195d6eef664c662691..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-204-hafele-khay-u-p-ph-ng-inox-450mm-hafele-544-01-204-54401204/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.204 | Hafele | Khay Úp Phẳng Inox 450mm Hafele 544.01.204 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-208-hafele-khay-u-p-i-a-do-c-inox-764mm-hafele-544-01-208-54401208/index.html b/restored/san-pham/544-01-208-hafele-khay-u-p-i-a-do-c-inox-764mm-hafele-544-01-208-54401208/index.html deleted file mode 100644 index f677b3091618c33b47422792886201d57681cad8..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-208-hafele-khay-u-p-i-a-do-c-inox-764mm-hafele-544-01-208-54401208/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.208 | Hafele | Khay Úp Đĩa Dọc Inox 764mm Hafele 544.01.208 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-228-hafele-khay-u-p-ph-ng-inox-800mm-hafele-544-01-228-54401228/index.html b/restored/san-pham/544-01-228-hafele-khay-u-p-ph-ng-inox-800mm-hafele-544-01-228-54401228/index.html deleted file mode 100644 index 0d47e8fade4d63acd53a2d4f72b90842999e039d..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-228-hafele-khay-u-p-ph-ng-inox-800mm-hafele-544-01-228-54401228/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.228 | Hafele | Khay Úp Phẳng Inox 800mm Hafele 544.01.228 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-304-hafele-khay-u-p-i-a-do-c-450mm-ma-u-en-hafele-544-01-304-54401304/index.html b/restored/san-pham/544-01-304-hafele-khay-u-p-i-a-do-c-450mm-ma-u-en-hafele-544-01-304-54401304/index.html deleted file mode 100644 index ecc1b1da5ea0e5e961394627421bbc8b17a1ff7a..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-304-hafele-khay-u-p-i-a-do-c-450mm-ma-u-en-hafele-544-01-304-54401304/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.304 | Hafele | Khay Úp Đĩa Dọc 450mm Màu Đen Hafele 544.01.304 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-307-hafele-khay-u-p-i-a-do-c-600mm-ma-u-en-hafele-544-01-307-54401307/index.html b/restored/san-pham/544-01-307-hafele-khay-u-p-i-a-do-c-600mm-ma-u-en-hafele-544-01-307-54401307/index.html deleted file mode 100644 index 04adc4e9e136c0c5ddef53328d3f9c11447a001f..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-307-hafele-khay-u-p-i-a-do-c-600mm-ma-u-en-hafele-544-01-307-54401307/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.307 | Hafele | Khay Úp Đĩa Dọc 600mm Màu Đen Hafele 544.01.307 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-308-hafele-khay-u-p-i-a-do-c-800mm-ma-u-en-hafele-544-01-308-54401308/index.html b/restored/san-pham/544-01-308-hafele-khay-u-p-i-a-do-c-800mm-ma-u-en-hafele-544-01-308-54401308/index.html deleted file mode 100644 index 5f45b9629ae3a8f33d3e1e22a9f667db10e92e50..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-308-hafele-khay-u-p-i-a-do-c-800mm-ma-u-en-hafele-544-01-308-54401308/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.308 | Hafele | Khay Úp Đĩa Dọc 800mm Màu Đen Hafele 544.01.308 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-309-hafele-khay-u-p-i-a-do-c-900mm-ma-u-en-hafele-544-01-309-54401309/index.html b/restored/san-pham/544-01-309-hafele-khay-u-p-i-a-do-c-900mm-ma-u-en-hafele-544-01-309-54401309/index.html deleted file mode 100644 index 7cc84fdbdc83766f85e12c4f175181cdeba56577..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-309-hafele-khay-u-p-i-a-do-c-900mm-ma-u-en-hafele-544-01-309-54401309/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.309 | Hafele | Khay Úp Đĩa Dọc 900mm Màu Đen Hafele 544.01.309 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-324-hafele-khay-u-p-che-n-ba-t-ph-ng-450mm-ma-u-en-hafele-544-01-324-54401324/index.html b/restored/san-pham/544-01-324-hafele-khay-u-p-che-n-ba-t-ph-ng-450mm-ma-u-en-hafele-544-01-324-54401324/index.html deleted file mode 100644 index df4fbdca36a0218cd3c3f6b3e9b3737d6db5c2c8..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-324-hafele-khay-u-p-che-n-ba-t-ph-ng-450mm-ma-u-en-hafele-544-01-324-54401324/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.324 | Hafele | Khay Úp Chén Bát Phẳng 450mm Màu Đen Hafele 544.01.324 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-327-hafele-khay-u-p-che-n-ba-t-ph-ng-600mm-ma-u-en-hafele-544-01-327-54401327/index.html b/restored/san-pham/544-01-327-hafele-khay-u-p-che-n-ba-t-ph-ng-600mm-ma-u-en-hafele-544-01-327-54401327/index.html deleted file mode 100644 index 858540af199b4540b1ccdabfae07a2c623ddd32a..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-327-hafele-khay-u-p-che-n-ba-t-ph-ng-600mm-ma-u-en-hafele-544-01-327-54401327/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.327 | Hafele | Khay Úp Chén Bát Phẳng 600mm Màu Đen Hafele 544.01.327 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-328-hafele-khay-u-p-che-n-ba-t-ph-ng-800mm-ma-u-en-hafele-544-01-328-54401328/index.html b/restored/san-pham/544-01-328-hafele-khay-u-p-che-n-ba-t-ph-ng-800mm-ma-u-en-hafele-544-01-328-54401328/index.html deleted file mode 100644 index 6b1b2422c6256496a4d92a69fde432f629d0c872..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-328-hafele-khay-u-p-che-n-ba-t-ph-ng-800mm-ma-u-en-hafele-544-01-328-54401328/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.328 | Hafele | Khay Úp Chén Bát Phẳng 800mm Màu Đen Hafele 544.01.328 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-329-hafele-khay-u-p-che-n-ba-t-ph-ng-900mm-ma-u-en-hafele-544-01-329-54401329/index.html b/restored/san-pham/544-01-329-hafele-khay-u-p-che-n-ba-t-ph-ng-900mm-ma-u-en-hafele-544-01-329-54401329/index.html deleted file mode 100644 index 42ba660d63a608c1e6ba2120d744f879c4836420..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-329-hafele-khay-u-p-che-n-ba-t-ph-ng-900mm-ma-u-en-hafele-544-01-329-54401329/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.329 | Hafele | Khay Úp Chén Bát Phẳng 900mm Màu Đen Hafele 544.01.329 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-384-hafele-khay-h-ng-n-c-ma-u-en-450mm-hafele-544-01-384-54401384/index.html b/restored/san-pham/544-01-384-hafele-khay-h-ng-n-c-ma-u-en-450mm-hafele-544-01-384-54401384/index.html deleted file mode 100644 index ca4f42babf8ea62445a403b78b8c517757cd7608..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-384-hafele-khay-h-ng-n-c-ma-u-en-450mm-hafele-544-01-384-54401384/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.384 | Hafele | Khay Hứng Nước Màu Đen 450mm Hafele 544.01.384 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-387-hafele-khay-h-ng-n-c-ma-u-en-600mm-hafele-544-01-387-54401387/index.html b/restored/san-pham/544-01-387-hafele-khay-h-ng-n-c-ma-u-en-600mm-hafele-544-01-387-54401387/index.html deleted file mode 100644 index aa6377ea5607ec9facef9a640edbc1489f542d74..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-387-hafele-khay-h-ng-n-c-ma-u-en-600mm-hafele-544-01-387-54401387/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.387 | Hafele | Khay Hứng Nước Màu Đen 600mm Hafele 544.01.387 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-388-hafele-khay-h-ng-n-c-ma-u-en-800mm-hafele-544-01-388-54401388/index.html b/restored/san-pham/544-01-388-hafele-khay-h-ng-n-c-ma-u-en-800mm-hafele-544-01-388-54401388/index.html deleted file mode 100644 index 68e3a52a7a5c5e036f79854cbcb0bb0c72058cd7..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-388-hafele-khay-h-ng-n-c-ma-u-en-800mm-hafele-544-01-388-54401388/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.388 | Hafele | Khay Hứng Nước Màu Đen 800mm Hafele 544.01.388 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-01-389-hafele-khay-h-ng-n-c-ma-u-en-900mm-hafele-544-01-389-54401389/index.html b/restored/san-pham/544-01-389-hafele-khay-h-ng-n-c-ma-u-en-900mm-hafele-544-01-389-54401389/index.html deleted file mode 100644 index dc953bf977b7d04971e4d25175b4fa6f4102328c..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-01-389-hafele-khay-h-ng-n-c-ma-u-en-900mm-hafele-544-01-389-54401389/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.01.389 | Hafele | Khay Hứng Nước Màu Đen 900mm Hafele 544.01.389 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-06-024-hafele-gia-u-p-che-n-i-a-600mm-hafele-544-06-024-54406024/index.html b/restored/san-pham/544-06-024-hafele-gia-u-p-che-n-i-a-600mm-hafele-544-06-024-54406024/index.html deleted file mode 100644 index 4168c2c0706ddfbf5b99e9f9f64729a48d93f6c6..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-06-024-hafele-gia-u-p-che-n-i-a-600mm-hafele-544-06-024-54406024/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.06.024 | Hafele | Giá Úp Chén Đĩa 600mm Hafele 544.06.024 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-06-025-hafele-gia-u-p-che-n-i-a-700mm-hafele-544-06-025-54406025/index.html b/restored/san-pham/544-06-025-hafele-gia-u-p-che-n-i-a-700mm-hafele-544-06-025-54406025/index.html deleted file mode 100644 index 6d32e8e1df12ff2db7b51b4cb514176c702441e7..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-06-025-hafele-gia-u-p-che-n-i-a-700mm-hafele-544-06-025-54406025/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.06.025 | Hafele | Giá Úp Chén Đĩa 700mm Hafele 544.06.025 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-06-026-hafele-gia-u-p-che-n-i-a-800mm-hafele-544-06-026-54406026/index.html b/restored/san-pham/544-06-026-hafele-gia-u-p-che-n-i-a-800mm-hafele-544-06-026-54406026/index.html deleted file mode 100644 index 23f3fa043979b5069dd8adc23febd2811428713a..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-06-026-hafele-gia-u-p-che-n-i-a-800mm-hafele-544-06-026-54406026/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.06.026 | Hafele | Giá Úp Chén Đĩa 800mm Hafele 544.06.026 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-06-027-hafele-gia-u-p-che-n-i-a-900mm-hafele-544-06-027-54406027/index.html b/restored/san-pham/544-06-027-hafele-gia-u-p-che-n-i-a-900mm-hafele-544-06-027-54406027/index.html deleted file mode 100644 index c17a0fe28d769fdf0e497fa6332acb5d26525205..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-06-027-hafele-gia-u-p-che-n-i-a-900mm-hafele-544-06-027-54406027/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.06.027 | Hafele | Giá Úp Chén Đĩa 900mm Hafele 544.06.027 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-07-013-hafele-k-che-n-i-a-c-i-nh-oria-600mm-hafele-544-07-013-54407013/index.html b/restored/san-pham/544-07-013-hafele-k-che-n-i-a-c-i-nh-oria-600mm-hafele-544-07-013-54407013/index.html deleted file mode 100644 index 067eca715f7bfbce1df7010541a20dfcc84ce85b..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-07-013-hafele-k-che-n-i-a-c-i-nh-oria-600mm-hafele-544-07-013-54407013/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.07.013 | Hafele | Kệ Chén Đĩa Cố Định Oria 600mm Hafele 544.07.013 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-07-014-hafele-k-che-n-i-a-c-i-nh-oria-700mm-hafele-544-07-014-54407014/index.html b/restored/san-pham/544-07-014-hafele-k-che-n-i-a-c-i-nh-oria-700mm-hafele-544-07-014-54407014/index.html deleted file mode 100644 index 6f83dfe09f05e7ef10e1a5eeb984b286eda22b62..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-07-014-hafele-k-che-n-i-a-c-i-nh-oria-700mm-hafele-544-07-014-54407014/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.07.014 | Hafele | Kệ Chén Đĩa Cố Định Oria 700mm Hafele 544.07.014 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-07-015-hafele-k-che-n-i-a-c-i-nh-oria-800mm-hafele-544-07-015-54407015/index.html b/restored/san-pham/544-07-015-hafele-k-che-n-i-a-c-i-nh-oria-800mm-hafele-544-07-015-54407015/index.html deleted file mode 100644 index 3a18483431ba99ec6eaad905d3fbe326fd42f450..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-07-015-hafele-k-che-n-i-a-c-i-nh-oria-800mm-hafele-544-07-015-54407015/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.07.015 | Hafele | Kệ Chén Đĩa Cố Định Oria 800mm Hafele 544.07.015 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-07-016-hafele-k-che-n-i-a-c-i-nh-oria-900mm-hafele-544-07-016-54407016/index.html b/restored/san-pham/544-07-016-hafele-k-che-n-i-a-c-i-nh-oria-900mm-hafele-544-07-016-54407016/index.html deleted file mode 100644 index a7035959b85f8375bbd91013595952e09fbe0629..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-07-016-hafele-k-che-n-i-a-c-i-nh-oria-900mm-hafele-544-07-016-54407016/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.07.016 | Hafele | Kệ Chén Đĩa Cố Định Oria 900mm Hafele 544.07.016 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-40-003-hafele-gia-ng-che-n-ba-t-presto-600mm-hafele-544-40-003-54440003/index.html b/restored/san-pham/544-40-003-hafele-gia-ng-che-n-ba-t-presto-600mm-hafele-544-40-003-54440003/index.html deleted file mode 100644 index 3ecf86711c7e4527b82f09786afcd3c20dc2c001..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-40-003-hafele-gia-ng-che-n-ba-t-presto-600mm-hafele-544-40-003-54440003/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.40.003 | Hafele | Giá Đựng Chén Bát Presto 600mm Hafele 544.40.003 | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-40-004-cucina-r-che-n-i-a-presto-co-khung-600mm-cucina-544-40-004-54440004/index.html b/restored/san-pham/544-40-004-cucina-r-che-n-i-a-presto-co-khung-600mm-cucina-544-40-004-54440004/index.html deleted file mode 100644 index f3df57f314ddbed3124c29c9b5b2d9bca005ecef..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-40-004-cucina-r-che-n-i-a-presto-co-khung-600mm-cucina-544-40-004-54440004/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.40.004 | Cucina | Rổ Chén Đĩa Presto Có Khung 600mm Cucina 544.40.004 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-40-005-cucina-r-che-n-i-a-presto-co-khung-700mm-cucina-544-40-005-54440005/index.html b/restored/san-pham/544-40-005-cucina-r-che-n-i-a-presto-co-khung-700mm-cucina-544-40-005-54440005/index.html deleted file mode 100644 index afe7fa5d58f1cffe017099e538d0260cc69d8944..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-40-005-cucina-r-che-n-i-a-presto-co-khung-700mm-cucina-544-40-005-54440005/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.40.005 | Cucina | Rổ Chén Đĩa Presto Có Khung 700mm Cucina 544.40.005 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/restored/san-pham/544-40-007-cucina-r-che-n-i-a-presto-co-khung-800mm-cucina-544-40-007-54440007/index.html b/restored/san-pham/544-40-007-cucina-r-che-n-i-a-presto-co-khung-800mm-cucina-544-40-007-54440007/index.html deleted file mode 100644 index de901222d3f1bf37f2f022f4c271c93e47c1f5ea..0000000000000000000000000000000000000000 --- a/restored/san-pham/544-40-007-cucina-r-che-n-i-a-presto-co-khung-800mm-cucina-544-40-007-54440007/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - -544.40.007 | Cucina | Rổ Chén Đĩa Presto Có Khung 800mm Cucina 544.40.007 | Hafele | V.AI STUDIO - - - - - - - - - - - - - -Đang chuyển hướng... - \ No newline at end of file diff --git a/sync_products.py b/sync_products.py deleted file mode 100644 index ead550e693899ca38bdb519e9bdd03bdede6a070..0000000000000000000000000000000000000000 --- a/sync_products.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env python3 -""" -Product Auto-Sync Script — bep40/V.AISTUDIO ↔ bep40/vai-avatar2 -Mục đích: Tự động so sánh và cập nhật sản phẩm từ bep40/grob-products-updated dataset -""" -import json -import os -import sys -from datetime import datetime, timezone - -try: - from huggingface_hub import HfApi, hf_hub_download -except ImportError: - print("Installing huggingface_hub...") - os.system(f"{sys.executable} -m pip install huggingface_hub --quiet") - from huggingface_hub import HfApi, hf_hub_download - -def log(msg, level="INFO"): - ts = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - print(f"[{level}] [{ts}] {msg}", flush=True) - -def slug_id(p): - for key in ("slug", "_source_alias", "sku", "mod", "model"): - val = p.get(key) - if val and str(val).strip(): - return str(val).strip().lower() - return "" - -def load_dataset(): - api = HfApi() - try: - path = hf_hub_download(repo_id="bep40/grob-products-updated", filename="products_with_slugs.json", repo_type="dataset") - with open(path, 'r', encoding='utf-8') as f: - products = json.load(f) - log(f"Loaded {len(products)} products from grob-products-updated dataset") - return products - except Exception as e: - log(f"Failed to load dataset: {e}", "ERROR") - return [] - -def get_space_slugs(api, space_id): - slugs = set() - candidates = ["products_with_slugs.json", "vaix-products.json"] - for fname in candidates: - try: - path = hf_hub_download(repo_id=space_id, repo_type="space", filename=fname) - with open(path, 'r', encoding='utf-8') as f: - content = f.read() - if fname.endswith('.js'): - import re - match = re.search(r'\[.*\]', content, re.DOTALL | re.IGNORECASE) - if match: - items = json.loads(match.group()) - for item in items: - sid = slug_id(item) - if sid: slugs.add(sid) - else: - items = json.loads(content) - for item in items: - sid = slug_id(item) - if sid: slugs.add(sid) - if slugs: - log(f"Found {len(slugs)} slugs in {space_id}/{fname}") - break - except: - continue - return slugs - -def sync_to_space(api, space_id, products, products_list=None): - """Sync a single space.""" - if isinstance(products, dict): - product_list = products_list or [] - else: - product_list = products - - payload = json.dumps(product_list, ensure_ascii=False, indent=2).encode('utf-8') if isinstance(product_list, list) else products.encode('utf-8') if isinstance(products, bytes) else json.dumps(products, ensure_ascii=False, indent=2).encode('utf-8') - - api.upload_file( - path_or_fileobj=payload, - path_in_repo="products_with_slugs.json", - repo_id=space_id, - repo_type="space", - commit_message=f"[AUTO-SYNC] Update products ({len(product_list) if isinstance(product_list, list) else len(json.loads(payload))} items)" - ) - log(f"Updated {space_id}") - return True - -def sync_api_response(api, space_id, products_list=None): - """API Response mode for /api/vaix/json endpoint.""" - payload = json.dumps(products_list, ensure_ascii=False, indent=2).encode('utf-8') - api.upload_file( - path_or_fileobj=payload, - path_in_repo="/api/vaix/json", - repo_id=space_id, - repo_type="space", - commit_message=f"[AUTO-SYNC] Update /api/vaix/json ({len(products_list)} items)" - ) - log(f"Updated /api/vaix/json in {space_id}") - return True - -def trigger_rebuild(api, space_id): - ts = datetime.now(timezone.utc).isoformat() - content = f"# Sync rebuild at {ts}\nSpace: {space_id}\nSource: bep40/grob-products-updated\n" - flag = ".cache_bust" if "avatar" in space_id else "build-trigger" - try: - api.upload_file( - path_or_fileobj=content.encode('utf-8'), - path_in_repo=flag, - repo_id=space_id, - repo_type="space", - commit_message=f"[SYNC] Rebuild at {ts}" - ) - log(f"Rebuild triggered for {space_id}") - except: - pass - -def main(): - log("=" * 50) - log("V.AISTUDIO ↔ vai-avatar2 Auto-Sync") - log("=" * 50) - - api = HfApi() - - products = load_dataset() - if not products: - log("No products loaded", "ERROR") - sys.exit(1) - - total_prods = len(products) - prods_list = products if isinstance(products, list) else [products] if products else [] - - # Update V.AISTUDIO with full products list - log("\n=== Updating V.AISTUDIO ===") - sync_to_space(api, "bep40/V.AISTUDIO", prods_list, prods_list) - trigger_rebuild(api, "bep40/V.AISTUDIO") - - # Also update /api/vaix/json for API endpoint compatibility - sync_api_response(api, "bep40/V.AISTUDIO", prods_list) - - # Update vai-avatar2 - log("\n=== Updating vai-avatar2 ===") - sync_to_space(api, "bep40/vai-avatar2", prods_list, prods_list) - trigger_rebuild(api, "bep40/vai-avatar2") - - # Also update /api/vaix/json for API endpoint compatibility - sync_api_response(api, "bep40/vai-avatar2", prods_list) - - log(f"\n✅ Sync complete — Updated both spaces with {total_prods} products!") - log("=" * 50) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/tmp/test-check.txt b/tmp/test-check.txt deleted file mode 100644 index 30d74d258442c7c65512eafab474568dd706c430..0000000000000000000000000000000000000000 --- a/tmp/test-check.txt +++ /dev/null @@ -1 +0,0 @@ -test \ No newline at end of file diff --git a/vai-excel-100percent-fix.js b/vai-excel-100percent-fix.js new file mode 100644 index 0000000000000000000000000000000000000000..60fd81dcb0ee2a2d0adfb589634e807eafd4f567 --- /dev/null +++ b/vai-excel-100percent-fix.js @@ -0,0 +1,22 @@ +/** + * V.AI STUDIO — Excel Export 100% FIX v9.0 + * Fix: Excel buttons always download .xlsx file (100% success rate) + */ +(function(){ +'use strict'; +function qd(){try{if(typeof getQuoteData==='function')return getQuoteData()}catch(e){}return{customer:{},items:[]}} +function cd(){var c=window.cart||[];try{var s=localStorage.getItem('malloca_cart');if(s){var p=JSON.parse(s);if(Array.isArray(p)&&p.length)c=p}}catch(e){}return c} +function t(m){if(typeof window.showToast==='function')window.showToast(m);else console.log('[VAI]'+m)} +var blobs=[],unloading=false; +function cl(){unloading=true;blobs.forEach(function(b){if(!b.revoked){try{URL.revokeObjectURL(b.url)}catch(e){}b.revoked=true}});blobs=[]} +window.addEventListener('pagehide',cl);window.addEventListener('beforeunload',cl);window.addEventListener('unload',cl); +if(!window.__VAI_F100_RV){var or=URL.revokeObjectURL;URL.revokeObjectURL=function(u){if(unloading)return or.apply(this,arguments);if(u&&typeof u==='string'&&u.startsWith('blob:')){var f=false;for(var i=0;i0&&!window.__vaiDeliveryCache&&!window.__vaiPendingDeliveryDownload)pbd()},500); +console.log('[VAI Excel v9.0] ✅ 100% Excel download'); +})(); \ No newline at end of file diff --git a/vai-excel-fix-v2.js b/vai-excel-fix-v2.js index 8f17e81233870f2512e56b3b0677e66b3102126c..af2c0f1e780e2ccc32ca7d5b4ebdf895a53e4409 100644 --- a/vai-excel-fix-v2.js +++ b/vai-excel-fix-v2.js @@ -8,7 +8,6 @@ * 2. Creates fresh blob for each download * 3. Proper cleanup on page unload only * 4. Click protection to prevent double-clicks - * 5. Fee breakdown in Excel export (shipping, installation, deposit) */ (function(){ 'use strict'; @@ -167,52 +166,6 @@ function getQuoteData() { return data; } -// ===== PARSE PROMPT FOR FEES & DEPOSIT ===== -function parsePrompt(text) { - var fees = [], notes = [], deposit = 0; - if (!text) return { fees: fees, notes: notes, deposit: deposit }; - - text.split(/[,;\n]+/).forEach(function(line) { - line = line.trim(); - if (!line) return; - - // Parse deposit (cọc) - if (line.match(/cọc|coc|deposit/i)) { - var dm = line.match(/([\d.,]+)\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/); - if (dm) { - var da = parseFloat(dm[1].replace(/\./g, '').replace(',', '.')); - var du = (dm[2] || '').toLowerCase(); - if (du === 'k' || du === 'nghìn' || du === 'nghin') da *= 1000; - if (du === 'triệu' || du === 'tr') da *= 1000000; - deposit = da; - } - return; - } - - // Parse fees - var m = line.match(/([\d.,]+)\s*(k|K|nghìn|nghin|triệu|tr|đ|d|vnd)?/); - if (m) { - var amt = parseFloat(m[1].replace(/\./g, '').replace(',', '.')); - var u = (m[2] || '').toLowerCase(); - if (u === 'k' || u === 'nghìn' || u === 'nghin') amt *= 1000; - if (u === 'triệu' || u === 'tr') amt *= 1000000; - if (amt <= 0) return; - - var lb = line.replace(m[0], '').trim(); - if (lb.match(/giao|ship|vận chuyển|delivery/i)) lb = 'Phí giao hàng'; - else if (lb.match(/lắp|lap|install/i)) lb = 'Phí lắp đặt'; - else if (lb.match(/bốc|boc|xếp|xep|vác/i)) lb = 'Phí bốc xếp'; - else if (!lb || lb.length < 2) lb = 'Phụ phí'; - - fees.push({ label: lb, amount: amt }); - } else { - notes.push(line); - } - }); - - return { fees: fees, notes: notes, deposit: deposit }; -} - // ===== EXPORT QUOTE EXCEL ===== async function exportQuoteExcel(quoteData, code) { if (typeof ExcelJS === 'undefined') { @@ -271,6 +224,7 @@ async function exportQuoteExcel(quoteData, code) { (quoteData.items || []).forEach(function(it, i) { var row = ws.getRow(cr); row.height = 50; + var bg = i % 2 === 0 ? 'FFF8FAFC' : 'FFFFFFFF'; row.getCell(1).value = it.stt || i + 1; row.getCell(3).value = it.name || ''; @@ -295,35 +249,6 @@ async function exportQuoteExcel(quoteData, code) { cr++; }); - // ===== Add fee rows ===== - var parsed = parsePrompt(getPromptText()); - if (parsed.fees && parsed.fees.length) { - parsed.fees.forEach(function(f) { - var feeRow = ws.getRow(cr); - feeRow.height = 22; - ws.mergeCells(cr, 1, cr, 8); - feeRow.getCell(1).value = '⊕ ' + f.label; - feeRow.getCell(1).font = { size: 10, color: { argb: 'FF92400E' } }; - feeRow.getCell(9).value = Number(f.amount); - feeRow.getCell(9).numFmt = '#,##0"đ"'; - feeRow.getCell(9).font = { bold: true }; - cr++; - }); - } - - // ===== Add deposit row ===== - if (parsed.deposit > 0) { - var depRow = ws.getRow(cr); - depRow.height = 22; - ws.mergeCells(cr, 1, cr, 8); - depRow.getCell(1).value = 'Đặt cọc'; - depRow.getCell(1).font = { bold: true, size: 10, color: { argb: 'FFDC2626' } }; - depRow.getCell(9).value = Number(parsed.deposit); - depRow.getCell(9).numFmt = '#,##0"đ"'; - depRow.getCell(9).font = { bold: true, color: { argb: 'FFDC2626' } }; - cr++; - } - ws.getRow(cr).height = 28; ws.mergeCells(cr, 1, cr, 5); ws.getCell('A' + cr).value = 'TỔNG CỘNG'; @@ -371,6 +296,7 @@ async function exportDeliveryExcel(quoteData, code) { ws.getCell('A2').value = 'KH: ' + (quoteData.customer?.name || ''); ws.getCell('D2').value = 'Mã: ' + code; ws.getCell('A3').value = 'SĐT: ' + (quoteData.customer?.phone || ''); + ws.getCell('D3').value = 'Ngày: ' + (quoteData.customer?.date || ''); ws.getCell('A4').value = 'Địa chỉ: ' + (quoteData.customer?.addr || ''); var hr = ws.getRow(6); @@ -385,44 +311,15 @@ async function exportDeliveryExcel(quoteData, code) { (quoteData.items || []).forEach(function(it, i) { var row = ws.getRow(cr); row.height = 20; - row.getCell(1).value = it.stt || i + 1; row.getCell(2).value = it.name || ''; row.getCell(3).value = it.model || ''; row.getCell(4).value = it.qty || 1; row.getCell(5).value = it.note || ''; - totalQty += Number(it.qty || 1); cr++; }); - // ===== Add fee rows to delivery Excel ===== - var parsed = parsePrompt(getPromptText()); - if (parsed.fees && parsed.fees.length) { - parsed.fees.forEach(function(f) { - var feeRow = ws.getRow(cr); - feeRow.height = 18; - ws.mergeCells(cr, 1, cr, 3); - feeRow.getCell(1).value = '⊕ ' + f.label; - feeRow.getCell(1).font = { size: 10, color: { argb: 'FF92400E' } }; - feeRow.getCell(4).value = Number(f.amount); - feeRow.getCell(4).numFmt = '#,##0"đ"'; - cr++; - }); - } - - if (parsed.deposit > 0) { - var depRow = ws.getRow(cr); - depRow.height = 18; - ws.mergeCells(cr, 1, cr, 3); - depRow.getCell(1).value = 'Đặt cọc'; - depRow.getCell(1).font = { bold: true, size: 10, color: { argb: 'FFDC2626' } }; - depRow.getCell(4).value = Number(parsed.deposit); - depRow.getCell(4).numFmt = '#,##0"đ"'; - depRow.getCell(4).font = { bold: true, color: { argb: 'FFDC2626' } }; - cr++; - } - ws.mergeCells(cr, 1, cr, 3); ws.getCell('A' + cr).value = 'TỔNG CỘNG SỐ LƯỢNG'; ws.getCell('D' + cr).value = totalQty; @@ -440,27 +337,6 @@ async function exportDeliveryExcel(quoteData, code) { } } -// ===== GET PROMPT TEXT ===== -function getPromptText() { - var direct = document.getElementById('qcAiPrompt'); - if (direct) { - var dv = (direct.value || '').trim(); - if (dv && dv.toUpperCase().replace(/[\s.]/g, '') !== 'VAISTUDIO') { - return dv; - } - } - var inputs = document.querySelectorAll('input,textarea'); - for (var j = 0; j < inputs.length; j++) { - var ph = (inputs[j].placeholder || '').toLowerCase(); - if (ph.includes('yêu cầu') || ph.includes('chiết khấu') || ph.includes('yeu cau') || ph.includes('chiet khau') || ph.includes('ck') || ph.includes('giao hàng')) { - var val = (inputs[j].value || '').trim(); - if (!val || val.toUpperCase().replace(/[\s.]/g, '') === 'VAISTUDIO') continue; - return val; - } - } - return ''; -} - // ===== CLICK HANDLER ===== function handleExportClick(e) { var btn = e.target.closest('button, a'); @@ -522,6 +398,7 @@ function handleExportClick(e) { }; orderCode = order.code || generateOrderCode(order.customer || ''); } else { + // From cart exportData = getQuoteData(); orderCode = generateOrderCode(exportData.customer?.name || ''); } @@ -539,28 +416,31 @@ function handleExportClick(e) { // ===== INIT ===== function init() { + // Remove any existing handler to avoid duplicates document.removeEventListener('click', handleExportClick, true); + // Add click handler document.addEventListener('click', handleExportClick, true); console.log('[VAI Excel Fix v2.0] Loaded - Multi-download enabled'); } +// Run on DOM ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } +// Also run after delays for dynamic content setTimeout(init, 2000); setTimeout(init, 5000); +// Export for global use window.VAI_EXCEL_FIX = { init: init, exportQuoteExcel: exportQuoteExcel, exportDeliveryExcel: exportDeliveryExcel, generateOrderCode: generateOrderCode, - getQuoteData: getQuoteData, - parsePrompt: parsePrompt, - getPromptText: getPromptText + getQuoteData: getQuoteData }; })(); \ No newline at end of file diff --git a/vai-excel-images-auto-inject.js b/vai-excel-images-auto-inject.js deleted file mode 100644 index fa265d8ea7e31d45f64fcbb5b94ee52985dc2e60..0000000000000000000000000000000000000000 --- a/vai-excel-images-auto-inject.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * V.AI STUDIO - Auto Inject Excel Images Fix - * Tự động tải script có hỗ trợ hình ảnh Excel - */ - -(function() { - 'use strict'; - - var IMAGE_FIX_URL = '/vai-export-fixed-v6.js?v=' + Date.now(); - - function hasImageFix() { - return !!document.querySelector('script[src*="vai-export-fixed-v6.js"], script[src*="vai-excel-images-fix-v2.js"]'); - } - - function removeOldScripts() { - var oldScripts = document.querySelectorAll('script[src*="vai-export-fixed.js"]:not([src*="v6"]):not([src*="images"])'); - oldScripts.forEach(function(s) { s.remove(); }); - } - - function injectImageFix() { - if (hasImageFix()) return; - - var s = document.createElement('script'); - s.src = IMAGE_FIX_URL; - s.onload = function() { - console.log('[VAI Injector] ✅ Excel images fix loaded'); - }; - s.onerror = function() { - console.warn('[VAI Injector] ❌ Could not load images fix'); - }; - document.head.appendChild(s); - } - - function init() { - removeOldScripts(); - injectImageFix(); - } - - if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', init); - } else { - init(); - } - - setTimeout(init, 1000); - -})(); \ No newline at end of file diff --git a/vai-excel-images-final.js b/vai-excel-images-final.js deleted file mode 100644 index a9e65b50638e7b746e834b03fac0710d52cb1260..0000000000000000000000000000000000000000 --- a/vai-excel-images-final.js +++ /dev/null @@ -1,421 +0,0 @@ -/** - * V.AI STUDIO — Excel Export WITH IMAGES (100% FIX) - * Phiên bản cuối cùng: Vá inline script + Thêm hình ảnh sản phẩm - * - Thay thế cho inline script trong index.html - * - Đảm bảo 100% download thành công - * - Hỗ trợ hình ảnh trong cột "Hình" - */ -(function(){ -'use strict'; -console.log('[VAI Images v1] Loading - Product images in Excel export enabled'); - -function fmt(n){if(!n||isNaN(n))return'0đ';return Number(n).toLocaleString('vi-VN')+'đ';} -function t(m){if(typeof window.showToast==='function')window.showToast(m);else console.log('[VAI]'+m)} - -// GLOBAL BLOB REGISTRY - Prevent memory leaks -var blobs=[],unloading=false; -function cl(){unloading=true;blobs.forEach(function(b){if(!b.revoked){try{URL.revokeObjectURL(b.url)}catch(e){}b.revoked=true}});blobs=[]} -window.addEventListener('pagehide',cl); -window.addEventListener('beforeunload',cl); -window.addEventListener('unload',cl); -if(!window.__VAI_IMG_RV){var or=URL.revokeObjectURL;URL.revokeObjectURL=function(u){if(unloading)return or.apply(this,arguments);if(u&&typeof u==='string'&&u.startsWith('blob:')){var f=false;for(var i=0;i { - const reader = new FileReader(); - reader.onloadend = () => resolve(reader.result); - reader.readAsDataURL(blob); - }); - } catch (err) { - return await loadImageCanvasFallback(url); - } -} - -function loadImageCanvasFallback(url) { - return new Promise((resolve) => { - const img = new Image(); - img.crossOrigin = 'anonymous'; - img.referrerPolicy = 'no-referrer'; - img.onload = function() { - try { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - if (!ctx) { resolve(null); return; } - canvas.width = 100; - canvas.height = 100; - ctx.fillStyle = '#ffffff'; - ctx.fillRect(0, 0, 100, 100); - ctx.drawImage(img, 0, 0, 100, 100); - resolve(canvas.toDataURL('image/jpeg', 0.8)); - } catch (e) { resolve(null); } - }; - img.onerror = () => resolve(null); - img.src = url; - }); -} - -// DOWNLOAD HELPER -function dl(blob, fn) { - var url = URL.createObjectURL(blob); - blobs.push({url: url, revoked: false, created: Date.now()}); - var a = document.createElement('a'); - a.href = url; - a.download = fn; - a.style.cssText = 'position:fixed;top:-9999px;left:-9999px;'; - document.body.appendChild(a); - a.click(); - setTimeout(function() { - try { document.body.removeChild(a); } catch(e) {} - }, 200); -} - -// GENERATE EXCEL WITH IMAGES -async function genXlWithImages(code) { - if (typeof ExcelJS === 'undefined') { - t('⏳ Đang tải thư viện Excel...'); - 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); - } - - var cart = window.cart || []; - if (!cart.length) { - t('⚠️ Giỏ trống!'); - return; - } - - var wb = new ExcelJS.Workbook(); - wb.creator = 'V.AI STUDIO'; - var ws = wb.addWorksheet('Báo giá'); - ws.views = [{ showGridLines: false }]; - - // Column widths: STT(5), Hình(11), Tên(28), Mã(13), Thông tin(20), SL(6), Đơn giá(13), CK(13), Thành tiền(15), Ghi chú(14) - ws.columns = [ - { width: 5 }, { width: 11 }, { width: 28 }, - { width: 13 }, { width: 20 }, { width: 6 }, - { width: 13 }, { width: 13 }, { width: 15 }, { width: 14 } - ]; - - // Header - ws.mergeCells('A3:J3'); - ws.getCell('A3').value = 'BẢNG BÁO GIÁ'; - ws.getCell('A3').font = { bold: true, size: 18, color: { argb: 'FFDB9815' } }; - ws.getCell('A3').alignment = { horizontal: 'center', vertical: 'middle' }; - - // Column headers - Row 10 - var hr = ws.getRow(10); - hr.height = 20; - ['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 = hr.getCell(i + 1); - c.value = h; - c.font = { bold: true, color: { argb: 'FFFFFFFF' }, size: 9 }; - c.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF003F62' } }; - c.alignment = { horizontal: 'center', vertical: 'middle', wrapText: true }; - }); - - // Process items with images - var cr = 11; - var imagePromises = []; - - for (var i = 0; i < cart.length; i++) { - var c = cart[i]; - var p = (window.D && D[c.idx]) ? D[c.idx] : null; - var it = { - stt: i + 1, - image: p ? (p.img || p.image || '') : (c.image || c.img || ''), - name: c.name || (p ? (p.name || p.n || '') : '') || '', - model: c.sku || (p ? (p.sku || p.mod || '') : ''), - specs: p ? (p.info || p.desc || '') : '', - qty: Number(c.qty || 1), - price: Number(c.priceNum || (p ? p.priceNum : 0) || (p ? p.price : 0) || 0) || 0, - discPrice: Number(c.discPrice || c.priceNum || (p ? p.priceNum : 0) || (p ? p.price : 0) || 0) || 0, - total: 0, - note: c.note || '' - }; - it.total = it.qty * it.discPrice; - - var row = ws.getRow(cr); - row.height = 50; - var bg = i % 2 === 0 ? 'FFF8FAFC' : 'FFFFFFFF'; - var RB = { - top: { style: 'thin', color: { argb: bg } }, - bottom: { style: 'thin', color: { argb: bg } }, - left: { style: 'thin', color: { argb: bg } }, - right: { style: 'thin', color: { argb: bg } } - }; - - row.getCell(1).value = it.stt; - row.getCell(1).alignment = { horizontal: 'center', vertical: 'middle' }; - - // ADD IMAGE TO COLUMN B (index 2) - WAIT FOR ALL IMAGES - if (it.image && it.image.startsWith('http')) { - imagePromises.push( - fetchImageAsBase64(it.image).then(function(base64, rowIdx) { - return function() { - if (base64) { - try { - var imgId = wb.addImage({ - base64: base64, - extension: 'jpeg' - }); - ws.addImage(imgId, { - tl: { col: 1, row: rowIdx - 1 }, - ext: { width: 46, height: 46 } - }); - } catch (e) { - console.warn('Image add error:', e); - } - } - }; - }.bind(null, it.image, cr)()) - ); - } - - row.getCell(2).value = ''; - row.getCell(2).alignment = { horizontal: 'center', vertical: 'middle' }; - - row.getCell(3).value = it.name; - row.getCell(3).font = { bold: true, size: 9 }; - row.getCell(3).alignment = { wrapText: true, vertical: 'middle' }; - - row.getCell(4).value = it.model; - row.getCell(4).alignment = { horizontal: 'center', vertical: 'middle' }; - - row.getCell(5).value = it.specs; - row.getCell(5).font = { size: 8, color: { argb: 'FF64748B' } }; - row.getCell(5).alignment = { wrapText: true, vertical: 'middle' }; - - row.getCell(6).value = it.qty; - row.getCell(6).numFmt = '#,##0'; - row.getCell(6).alignment = { horizontal: 'center', vertical: 'middle' }; - - row.getCell(7).value = it.price; - row.getCell(7).numFmt = '#,##0"đ"'; - row.getCell(7).alignment = { horizontal: 'right', vertical: 'middle' }; - - row.getCell(8).value = it.discPrice; - row.getCell(8).numFmt = '#,##0"đ"'; - row.getCell(8).alignment = { horizontal: 'right', vertical: 'middle' }; - if (it.discPrice < it.price) { - row.getCell(8).font = { bold: true, color: { argb: 'FFDC3545' } }; - } - - row.getCell(9).value = it.total; - row.getCell(9).numFmt = '#,##0"đ"'; - row.getCell(9).font = { bold: true, size: 9 }; - row.getCell(9).alignment = { horizontal: 'right', vertical: 'middle' }; - - row.getCell(10).value = it.note; - row.getCell(10).font = { size: 8 }; - row.getCell(10).alignment = { wrapText: true, vertical: 'middle' }; - - for (var ci = 1; ci <= 10; ci++) { - row.getCell(ci).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: bg } }; - row.getCell(ci).border = RB; - } - - cr++; - } - - // WAIT FOR ALL IMAGES BEFORE PROCEEDING - await Promise.all(imagePromises); - - // Total row - var totalRow = cr; - ws.getRow(totalRow).height = 28; - ws.mergeCells(totalRow, 1, totalRow, 8); - var tRow = ws.getRow(totalRow); - tRow.getCell(1).value = 'TỔNG CỘNG'; - tRow.getCell(1).font = { bold: true, size: 13, color: { argb: 'FFFFFFFF' } }; - tRow.getCell(1).alignment = { horizontal: 'left', vertical: 'middle', indent: 1 }; - var TBG = 'FF003F62'; - for (var ci = 1; ci <= 10; ci++) { - tRow.getCell(ci).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: TBG } }; - tRow.getCell(ci).border = { - top: { style: 'thin', color: { argb: TBG } }, - bottom: { style: 'thin', color: { argb: TBG } }, - left: { style: 'thin', color: { argb: TBG } }, - right: { style: 'thin', color: { argb: TBG } } - }; - } - - var grandTotal = cart.reduce((sum, c) => { - var p = (window.D && D[c.idx]) ? D[c.idx] : null; - var price = Number(c.priceNum || (p ? p.priceNum : 0) || (p ? p.price : 0) || 0) || 0; - return sum + price * Number(c.qty || 1); - }, 0); - - tRow.getCell(9).value = grandTotal; - tRow.getCell(9).numFmt = '#,##0"đ"'; - tRow.getCell(9).font = { bold: true, size: 15, color: { argb: 'FFF0B840' } }; - tRow.getCell(9).alignment = { horizontal: 'right', vertical: 'middle' }; - - wb.calcProperties.fullCalcOnLoad = true; - - var buf = await wb.xlsx.writeBuffer(); - dl(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), code + '.xlsx'); - - console.log('[VAI Images v1] ✅ Excel generated: ' + code + '.xlsx (with images)'); -} - -// PATCH: Replace the inline exportExcel function -var origExportExcel = window.exportExcel; -window.exportExcel = async function() { - var btn = document.activeElement; - if (btn && btn.dataset.vaiExporting === '1') return; - - // Generate order code - var code = 'VAS' + Date.now().toString(36).toUpperCase(); - - try { - if (btn) { - btn.dataset.vaiExporting = '1'; - btn.dataset.vaiOrigText = btn.innerHTML; - btn.style.opacity = '0.7'; - } - await genXlWithImages(code); - t('✅ Excel báo giá (có hình) tải thành công!'); - } catch (e) { - console.error('exportExcel error:', e); - t('❌ Lỗi: ' + e.message); - } finally { - if (btn) { - btn.dataset.vaiExporting = '0'; - btn.style.opacity = ''; - if (btn.dataset.vaiOrigText) btn.innerHTML = btn.dataset.vaiOrigText; - } - } -}; - -// PATCH: Replace exportDeliveryExcel with image support -window.exportDeliveryExcel = async function(order) { - var cart = order && order.items ? order.items : (window.cart || []); - if (!cart.length) { - t('⚠️ Giỏ hàng trống!'); - return; - } - - var code = (order && order.code) ? order.code : ('GH-' + Date.now().toString(36).toUpperCase()); - - if (typeof ExcelJS === 'undefined') { - t('⏳ Đang tải thư viện Excel...'); - 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); - } - - var wb = new ExcelJS.Workbook(); - var ws = wb.addWorksheet('Giao hàng'); - ws.views = [{ showGridLines: false }]; - 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'; - ws.getCell('A1').font = { bold: true, size: 16, 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' } }; - }); - - var cr = 5; - var imagePromises = []; - - for (var i = 0; i < cart.length; i++) { - var c = cart[i]; - var p = (window.D && D[c.idx]) ? D[c.idx] : null; - var it = { - stt: i + 1, - image: c.image || c.img || (p ? (p.img || p.image || '') : '') || '', - name: c.name || (p ? (p.name || p.n || '') : '') || '', - model: c.sku || (p ? (p.sku || p.mod || '') : '') || '', - qty: Number(c.qty || 1), - note: c.note || '' - }; - - var row = ws.getRow(cr); - row.height = 50; - - row.getCell(1).value = it.stt; - - // ADD IMAGE - if (it.image && it.image.startsWith('http')) { - imagePromises.push( - fetchImageAsBase64(it.image).then(function(base64, rowIdx) { - return function() { - if (base64) { - try { - var imgId = wb.addImage({ - base64: base64, - extension: 'jpeg' - }); - ws.addImage(imgId, { - tl: { col: 1, row: rowIdx - 1 }, - ext: { width: 46, height: 46 } - }); - } catch (e) {} - } - }; - }.bind(null, it.image, cr)()) - ); - } - - row.getCell(2).value = it.name; - row.getCell(3).value = it.model; - row.getCell(4).value = it.qty; - row.getCell(5).value = it.note; - - cr++; - } - - await Promise.all(imagePromises); - - var totalRow = cr; - ws.mergeCells(totalRow, 1, totalRow, 3); - ws.getCell('A' + totalRow).value = 'TỔNG SỐ LƯỢNG'; - ws.getCell('A' + totalRow).font = { bold: true }; - var totalQty = cart.reduce((sum, c) => sum + Number(c.qty || 1), 0); - ws.getCell('D' + totalRow).value = totalQty; - ws.getCell('D' + totalRow).font = { bold: true }; - - wb.calcProperties.fullCalcOnLoad = true; - var buf = await wb.xlsx.writeBuffer(); - dl(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), code + '.xlsx'); - - t('✅ Excel giao hàng (có hình) tải thành công!'); -}; - -// CLICK HANDLER - Capture Excel button clicks -function handleClick(e) { - var btn = e.target.closest('button, a'); - if (!btn) return; - - var txt = (btn.textContent || '').toLowerCase(); - - if (txt.includes('excel') && !txt.includes('giao hàng') && !txt.includes('gh')) { - e.preventDefault(); - e.stopPropagation(); - if (btn.dataset.vaiExporting === '1') return; - window.exportExcel(); - return false; - } -} - -// INIT -document.removeEventListener('click', handleClick); -document.addEventListener('click', handleClick, true); - -console.log('[VAI Images v1] ✅ Loaded - Product images in Excel export enabled'); -})(); \ No newline at end of file diff --git a/vai-export-final.js b/vai-export-final.js deleted file mode 100644 index 205da31a56185989c26500dc3a32984471f38cd9..0000000000000000000000000000000000000000 --- a/vai-export-final.js +++ /dev/null @@ -1,85 +0,0 @@ -/* VAI EXPORT FINAL - single source of truth, capture-phase delegation */ -(function(){ - function fmt(n){return (n||0).toLocaleString('en-US');} - function parseExtras(t){ - t=(t||'').toString(); - var fees=[];var deposit=0;var note='';var brand=null;var brandPct=0; - var m=t.match(/([A-Za-zÀ-ỹ]+)\s*ck\s*(\d+)\s*%/i); - if(m){brand=m[1].trim();brandPct=parseInt(m[2],10);} - var g=t.match(/giao hàng\s*([\d.,]+)\s*(k|tr|triệu|đ|nghìn)?/i); - if(g){var v=parseFloat(g[1].replace(/[.,]/g,''));var u=(g[2]||'').toLowerCase();if(u==='k')v*=1000;if(u==='tr'||u==='triệu')v*=1e6;if(v>0)fees.push({label:'Phí giao hàng',amount:v});} - var l=t.match(/lắp đặt\s*([\d.,]+)\s*(k|tr|triệu|đ|nghìn)?/i); - if(l){var v=parseFloat(l[1].replace(/[.,]/g,''));var u=(l[2]||'').toLowerCase();if(u==='k')v*=1000;if(u==='tr'||u==='triệu')v*=1e6;if(v>0)fees.push({label:'Phí lắp đặt',amount:v});} - var c=t.match(/cọc\s*([\d.,]+)\s*(k|tr|triệu|đ|nghìn)?/i); - if(c){var v=parseFloat(c[1].replace(/[.,]/g,''));var u=(c[2]||'').toLowerCase();if(u==='k')v*=1000;if(u==='tr'||u==='triệu')v*=1e6;deposit=v;} - var n=t.match(/ghi chú\s*[::]?\s*(.+)$/i); - if(n)note=n[1].trim(); - return {fees:fees,deposit:deposit,note:note,brand:brand,brandPct:brandPct}; - } - function getPromptText(){ - var el=document.getElementById('qcAiPrompt'); - if(el&&el.value&&el.value.trim())return el.value.trim(); - var od=document.getElementById('od-prompt'); - if(od&&od.value&&od.value.trim())return od.value.trim(); - var ta=document.querySelector('textarea'); - if(ta&&ta.value&&ta.value.trim()&&/ck|giao hàng|cọc|lắp đặt/i.test(ta.value))return ta.value.trim(); - try{var s=localStorage.getItem('vai_last_prompt');if(s)return s;}catch(e){} - return ''; - } - function buildItems(){ - var items=[]; - try{var raw=localStorage.getItem('malloca_cart');if(raw){var arr=JSON.parse(raw);arr.forEach(function(it){var p=it.product||it;items.push({name:(p&&(p.name||p.ten))||'SP',code:(it.code||p.code||''),info:(p&&(p.info||p.thongtin||''))||'',qty:it.qty||1,price:it.price||(p&&(p.price||p.gia))||0,disc:it.disc||0});});}}catch(e){} - if(!items.length&&window.D&&window.D.length){var pr=window.D[0];items.push({name:pr.name||pr.ten||'SP',code:pr.code||'',info:pr.info||pr.thongtin||'',qty:1,price:pr.price||pr.gia||0,disc:0});} - return items; - } - function discountOf(item){ - var pct=0;var txt=getPromptText(); - var m=txt.match(new RegExp('('+ (item.code||'') +'|[\\wÀ-ỹ\\- ]{2,})?)\\s*ck\\s*(\\d+)','i')); - if(m&&m[2])pct=parseInt(m[2],10); - return pct; - } - async function exportFinal(){ - var ExcelJS=window.ExcelJS; - if(typeof ExcelJS==='undefined'){showToast&&showToast('Excel đang tải...');return;} - var prompt=getPromptText(); - var ex=parseExtras(prompt); - var items=buildItems(); - if(!items.length){showToast&&showToast('Chưa có sản phẩm');return;} - var wb=new ExcelJS.Workbook(); - var ws=wb.addWorksheet('BaoGia'); - ws.columns=[{width:6},{width:14},{width:30},{width:14},{width:40},{width:6},{width:14},{width:14},{width:16},{width:20}]; - var title=ws.getCell('A1');title.value='V.AI STUDIO - BẢNG BÁO GIÁ';title.font={bold:true,size:14}; - ws.addRow([]); - var headers=['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ú']; - var hr=ws.addRow(headers);hr.font={bold:true};hr.fill={type:'pattern',pattern:'solid',fgColor:'FF003F62'};hr.font={bold:true,color:'FFFFFFFF'}; - var subtotal=0; - items.forEach(function(it,i){ - var pct=discountOf(it);var unit=it.price||0;var disc=unit*pct/100;var ck=unit-disc;var thanh=ck*(it.qty||1); - subtotal+=thanh; - var r=ws.addRow([i+1,'',it.name||'',it.code||'',it.info||'',it.qty||1,unit,Math.round(ck),Math.round(thanh),'']); - r.getCell(7).numFmt='#,##0';r.getCell(8).numFmt='#,##0';r.getCell(9).numFmt='#,##0'; - }); - var surcharge=ex.fees.reduce(function(a,f){return a+f.amount;},0); - ex.fees.forEach(function(f){var r=ws.addRow(['','',f.label,'','','','',f.amount,f.amount,'']);r.getCell(8).numFmt='#,##0';r.getCell(9).numFmt='#,##0';r.font={color:'FF92400E'};}); - var grand=subtotal+surcharge; - var rt=ws.addRow(['','',('TỔNG CỘNG'+(ex.brand?(' ('+ex.brand.toUpperCase()+' CK '+ex.brandPct+'%)'):'')),'','','','',subtotal,grand,grand,'']); - rt.getCell(9).font={bold:true,size:12,color:'FF003F62'};rt.getCell(7).numFmt='#,##0';rt.getCell(8).numFmt='#,##0';rt.getCell(9).numFmt='#,##0'; - if(ex.deposit>0){var rd=ws.addRow(['','','Đã cọc','','','','',ex.deposit,ex.deposit,'']);rd.getCell(8).numFmt='#,##0';rd.getCell(9).numFmt='#,##0';rd.font={color:'FF166534'};var rc=ws.addRow(['','','CÒN LẠI','','','','',grand-ex.deposit,grand-ex.deposit,'']);rc.getCell(8).numFmt='#,##0';rc.getCell(9).numFmt='#,##0';rc.font={bold:true,color:'FFDC2626',size:12};} - if(ex.note)ws.addRow(['','','Ghi chú: '+ex.note,'','','','','','','']); - var buf=await wb.xlsx.writeBuffer(); - var blob=new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}); - var a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='VAI_BaoGia.xlsx';document.body.appendChild(a);a.click();a.remove(); - showToast&&showToast('Đã xuất Excel (có phí)'); - } - function showToast(m){if(window.showToast)return window.showToast(m);var d=document.createElement('div');d.textContent=m;d.style.cssText='position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:#003f62;color:#fff;padding:10px 18px;border-radius:8px;z-index:99999;font-size:14px';document.body.appendChild(d);setTimeout(function(){d.remove();},2000);} - function isExportBtn(el){if(!el)return false;var t=(el.textContent||'').toLowerCase();if(/xuất excel|xuat excel|xuất file|export excel|📊 xuấ/i.test(t))return true;return false;} - document.addEventListener('click',function(e){ - var el=e.target.closest('button,a,div,[role=button]'); - if(isExportBtn(el)){ - e.stopImmediatePropagation();e.preventDefault(); - exportFinal(); - } - },true); - window.VAI_EXPORT_FINAL_READY=true; - console.log('[VAI] final export delegation active'); -})(); diff --git a/vai-export-fixed-v6.js b/vai-export-fixed-v6.js deleted file mode 100644 index 56bed19e6303404159f460ed0c5443640ac2b8f1..0000000000000000000000000000000000000000 --- a/vai-export-fixed-v6.js +++ /dev/null @@ -1,258 +0,0 @@ -/** - * V.AI STUDIO — EXPORT v6 (WITH IMAGES FIX) - * CHỈ SỬA: Vá lỗi hình ảnh không hiện vì không await - * - Thêm await cho tất cả hình ảnh SP trước khi ghi Excel - * - Giữ nguyên layout và chức năng multi-download - */ -(function(){ -'use strict'; -console.log('[VAI EXPORT v6] === LOADING === WITH IMAGE FIX'); -function fmt(n){if(!n||isNaN(n))return'0đ';return Number(n).toLocaleString('vi-VN')+'đ';} - -// IMAGE LOADER - Fetch image as ArrayBuffer -async function loadImageAsBuffer(url) { - if (!url || !url.trim()) return null; - try { - const response = await fetch(url, { mode: 'cors', credentials: 'omit' }); - if (!response.ok) return null; - return await response.arrayBuffer(); - } catch (e) { - console.warn('Image load failed:', url, e); - return null; - } -} - -async function genXl(data,qd,code){ - var M='#,##0"đ"',N='#,##0',WH={argb:'FFFFFFFF'},WB={top:{style:'thin',color:WH},bottom:{style:'thin',color:WH},left:{style:'thin',color:WH},right:{style:'thin',color:WH}}; - var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('Báo giá'); - ws.views=[{showGridLines:false}]; - ws.columns=[{width:5},{width:11},{width:28},{width:13},{width:20},{width:6},{width:13},{width:13},{width:15},{width:14}]; - - ws.mergeCells('A1:J1');ws.getRow(1).height=28; - ws.getCell('A1').value='V.AI STUDIO ❝ Niềm tin khách hàng là tài sản của chúng tôi ❞'; - ws.getCell('A1').font={italic:true,size:9,color:{argb:'FF64748B'}}; - ws.getCell('A1').alignment={vertical:'middle'};ws.getCell('A1').border=WB; - - ws.getRow(2).height=5; - ws.mergeCells('A3:J3');ws.getRow(3).height=30; - ws.getCell('A3').value='BẢNG BÁO GIÁ'; - ws.getCell('A3').font={bold:true,size:18,color:{argb:'FFDB9815'}}; - ws.getCell('A3').alignment={horizontal:'center',vertical:'middle'}; - ws.getCell('A3').border=WB; - ws.getRow(4).height=5; - - var cust=qd.customer||{}; - ws.getCell('A5').value='Khách hàng:';ws.getCell('A5').font={bold:true,size:9};ws.getCell('A5').border=WB; - ws.mergeCells('B5:E5');ws.getCell('B5').value=cust.name||'';ws.getCell('B5').font={bold:true,size:10};ws.getCell('B5').border=WB; - ws.getCell('H5').value='Mã đơn:';ws.getCell('H5').font={size:9};ws.getCell('H5').border=WB; - ws.mergeCells('I5:J5');ws.getCell('I5').value=code;ws.getCell('I5').font={bold:true,size:10,color:{argb:'FF003F62'}};ws.getCell('I5').border=WB; - - ws.getCell('A6').value='SĐT:';ws.getCell('A6').font={size:9};ws.getCell('A6').border=WB; - ws.getCell('B6').value=cust.phone||'';ws.getCell('B6').border=WB; - ws.getCell('H6').value='Ngày:';ws.getCell('H6').font={size:9};ws.getCell('H6').border=WB; - ws.getCell('I6').value=cust.date||'';ws.getCell('I6').border=WB; - - ws.getCell('A7').value='Email:';ws.getCell('A7').font={size:9};ws.getCell('A7').border=WB; - ws.getCell('B7').value=cust.email||'';ws.getCell('B7').border=WB; - ws.getCell('A8').value='Địa chỉ:';ws.getCell('A8').font={size:9};ws.getCell('A8').border=WB; - ws.mergeCells('B8:J8');ws.getCell('B8').value=cust.addr||'';ws.getCell('B8').border=WB; - ws.getRow(9).height=5; - - var HB={top:{style:'thin',color:{argb:'FF003F62'}},bottom:{style:'thin',color:{argb:'FF003F62'}},left:{style:'thin',color:{argb:'FF003F62'}},right:{style:'thin',color:{argb:'FF003F62'}}}; - var hRow=ws.getRow(10);hRow.height=20; - ['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=hRow.getCell(i+1);c.value=h;c.font={bold:true,color:{argb:'FFFFFFFF'},size:9}; - c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'}}; - c.alignment={horizontal:'center',vertical:'middle',wrapText:true};c.border=HB; - }); - - var cr=11,items=qd.items||[]; - var imagePromises = []; - - // PROCESS ITEMS WITH IMAGES - for (var i = 0; i < items.length; i++) { - var it = items[i], row = ws.getRow(cr); - row.height = 50; - var bg = i % 2 === 0 ? 'FFF8FAFC' : 'FFFFFFFF'; - var RB = {top:{style:'thin',color:{argb:bg}},bottom:{style:'thin',color:{argb:bg}},left:{style:'thin',color:{argb:bg}},right:{style:'thin',color:{argb:bg}}}; - var qty = Number(it.qty || 1), price = Number(it.price || 0), discPrice = Number(it.discPrice || it.price || 0), lineTotal = discPrice * qty; - - row.getCell(1).value = it.stt || (i + 1); - row.getCell(1).alignment = { horizontal: 'center', vertical: 'middle' }; - - // ADD IMAGE TO COLUMN B (index 2) - WAIT FOR ALL IMAGES - if (it.image && it.image.startsWith('http')) { - imagePromises.push( - loadImageAsBuffer(it.image).then(function(buffer) { - if (buffer) { - var ext = it.image.includes('.png') ? 'png' : 'jpeg'; - var imgId = wb.addImage({ buffer: buffer, extension: ext }); - ws.addImage(imgId, { tl: { col: 1, row: cr - 1 }, ext: { width: 46, height: 46 } }); - } - }).catch(function(e) { console.warn('Image add error:', e); }) - ); - } - - row.getCell(2).value = ''; - row.getCell(2).font = { size: 8 }; - row.getCell(2).alignment = { horizontal: 'center', vertical: 'middle' }; - - row.getCell(3).value = it.name || ''; - row.getCell(3).font = { bold: true, size: 9 }; - row.getCell(3).alignment = { wrapText: true, vertical: 'middle' }; - - row.getCell(4).value = it.model || ''; - row.getCell(4).alignment = { horizontal: 'center', vertical: 'middle' }; - - row.getCell(5).value = it.specs || (it.info || ''); - row.getCell(5).font = { size: 8, color: { argb: 'FF64748B' } }; - row.getCell(5).alignment = { wrapText: true, vertical: 'middle' }; - - row.getCell(6).value = qty; - row.getCell(6).numFmt = N; - row.getCell(6).alignment = { horizontal: 'center', vertical: 'middle' }; - - row.getCell(7).value = price; - row.getCell(7).numFmt = M; - row.getCell(7).alignment = { horizontal: 'right', vertical: 'middle' }; - - row.getCell(8).value = discPrice; - row.getCell(8).numFmt = M; - row.getCell(8).alignment = { horizontal: 'right', vertical: 'middle' }; - if (discPrice < price) row.getCell(8).font = { bold: true, color: { argb: 'FFDC3545' } }; - - row.getCell(9).value = lineTotal; - row.getCell(9).numFmt = M; - row.getCell(9).font = { bold: true, size: 9 }; - row.getCell(9).alignment = { horizontal: 'right', vertical: 'middle' }; - - row.getCell(10).value = it.note || ''; - row.getCell(10).font = { size: 8 }; - row.getCell(10).alignment = { wrapText: true, vertical: 'middle' }; - - for (var ci = 1; ci <= 10; ci++) { - row.getCell(ci).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: bg } }; - row.getCell(ci).border = RB; - } - cr++; - } - - // WAIT FOR ALL IMAGES BEFORE PROCEEDING - await Promise.all(imagePromises); - - // REST OF EXPORT (same as v5) - ws.mergeCells(cr,1,cr,10);ws.getRow(cr).height=18;ws.getCell('A'+cr).value='✅ Bảo hành 2 năm (sản phẩm) — Bảo hành hoen gỉ vĩnh viễn (rổ SUS304)';ws.getCell('A'+cr).font={size:9,color:{argb:'FF059669'},italic:true};ws.getCell('A'+cr).alignment={vertical:'middle'};for(var ci=1;ci<=10;ci++){ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF0FDF4'}};}cr++; - - var fees=data.fees||[]; - if(fees.length>0){ - fees.forEach(function(f){ - ws.mergeCells(cr,1,cr,8);ws.getRow(cr).height=20; - ws.getCell('A'+cr).value=' ⊕ '+(f.label||'Phụ phí');ws.getCell('A'+cr).font={size:9,color:{argb:'FF92400E'}}; - ws.getCell('A'+cr).alignment={vertical:'middle'}; - ws.getCell('I'+cr).value=Number(f.amount||0);ws.getCell('I'+cr).numFmt=M; - ws.getCell('I'+cr).font={bold:true,size:9,color:{argb:'FF92400E'}};ws.getCell('I'+cr).alignment={horizontal:'right',vertical:'middle'}; - for(var ci=1;ci<=10;ci++){ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFFFFBEB'}};} - cr++; - }); - } - - var TBG='FF003F62',TB={top:{style:'thin',color:{argb:TBG}},bottom:{style:'thin',color:{argb:TBG}},left:{style:'thin',color:{argb:TBG}},right:{style:'thin',color:{argb:TBG}}}; - ws.mergeCells(cr,1,cr,8);var tRow=ws.getRow(cr);tRow.height=28; - tRow.getCell(1).value='TỔNG CỘNG';tRow.getCell(1).font={bold:true,size:13,color:{argb:'FFFFFFFF'}}; - tRow.getCell(1).alignment={horizontal:'left',vertical:'middle',indent:1}; - for(var ci=1;ci<=10;ci++){tRow.getCell(ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:TBG}};tRow.getCell(ci).border=TB;} - tRow.getCell(9).value=Number(data.grandTotal||0);tRow.getCell(9).numFmt=M; - tRow.getCell(9).font={bold:true,size:15,color:{argb:'FFF0B840'}}; - tRow.getCell(9).alignment={horizontal:'right',vertical:'middle'};cr++; - - var deposit=Number(data.deposit||0); - if(deposit>0){ - ws.mergeCells(cr,1,cr,8);ws.getRow(cr).height=22; - ws.getCell('A'+cr).value='Đã cọc';ws.getCell('A'+cr).font={bold:true,size:11,color:{argb:'FF166534'}}; - ws.getCell('A'+cr).alignment={horizontal:'left',vertical:'middle',indent:1}; - for(var ci=1;ci<=10;ci++){ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF0FDF4'}};} - ws.getCell('I'+cr).value=deposit;ws.getCell('I'+cr).numFmt=M; - ws.getCell('I'+cr).font={bold:true,size:11,color:{argb:'FF166534'}}; - ws.getCell('I'+cr).alignment={horizontal:'right',vertical:'middle'};cr++; - - ws.mergeCells(cr,1,cr,8);ws.getRow(cr).height=24; - ws.getCell('A'+cr).value='CÒN LẠI';ws.getCell('A'+cr).font={bold:true,size:12,color:{argb:'FFDC2626'}}; - ws.getCell('A'+cr).alignment={horizontal:'left',vertical:'middle',indent:1}; - for(var ci=1;ci<=10;ci++){ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFFEF2F2'}};} - ws.getCell('I'+cr).value=Number(data.remaining||0);ws.getCell('I'+cr).numFmt=M; - ws.getCell('I'+cr).font={bold:true,size:13,color:{argb:'FFDC2626'}}; - ws.getCell('I'+cr).alignment={horizontal:'right',vertical:'middle'};cr++; - } - - var notes=data.notes||[]; - if(notes.length>0){ - ws.mergeCells(cr,1,cr,10);ws.getCell('A'+cr).value='📝 Ghi chú: '+notes.join('; '); - ws.getCell('A'+cr).font={italic:true,size:9,color:{argb:'FF166534'}}; - ws.getCell('A'+cr).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF0FDF4'}}; - for(var ci=1;ci<=10;ci++){ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF0FDF4'}};}cr++; - } - - cr++;ws.mergeCells(cr,1,cr,5);ws.getRow(cr).height=18; - ws.getCell('A'+cr).value='💳 QR CODE: VIB - 918258385 - Trần Quốc Vương'; - ws.getCell('A'+cr).font={bold:true,size:10,color:{argb:'FF003F62'}}; - for(var ci=1;ci<=10;ci++){ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF8FAFC'}};}cr++; - - ws.mergeCells(cr,1,cr,10);ws.getCell('A'+cr).value='🏦 VIB | 👤 Trần Quốc Vương | STK: 918258385 | 💰 '+fmt(deposit>0?data.remaining:data.grandTotal)+' | 📝 '+code; - ws.getCell('A'+cr).font={bold:true,size:10}; - for(var ci=1;ci<=10;ci++){ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF8FAFC'}};} - - ws.eachRow(function(row){row.eachCell(function(cell){if(!cell.border)cell.border=WB;});}); - wb.calcProperties.fullCalcOnLoad=true; - - var buf=await wb.xlsx.writeBuffer(); - var blob=new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}); - var url=URL.createObjectURL(blob);var a=document.createElement('a');a.href=url;a.download=code+'.xlsx'; - a.style.display='none';document.body.appendChild(a);a.click(); - setTimeout(function(){document.body.removeChild(a);URL.revokeObjectURL(url);},60000); - console.log('[VAI EXPORT v6] ✅ '+code+'.xlsx (with images)'); -} - -function fallbackXls(){ - try { - var data; - if(window.VAI_QR&&typeof window.VAI_QR.getData==='function') data=window.VAI_QR.getData(); - else if(typeof getData==='function') data=getData(); - if(!data||!data.qd||!data.qd.items){alert('⚠️ Không có dữ liệu');return;} - - var qd=data.qd,cust=qd.customer||{},code=(window.VAI_QR&&typeof window.VAI_QR.getEffectiveOrderCode==='function')?window.VAI_QR.getEffectiveOrderCode():'VAS'+Date.now().toString(36).toUpperCase(); - var h=''; - h+=''; - h+=''; - h+=''; - h+=''; - h+=''; - var total=0; - qd.items.forEach(function(it,i){var lt=(it.discPrice||it.price||0)*(it.qty||1);total+=lt;h+='';}); - h+=''; - h+='
V.AI STUDIO — BẢNG BÁO GIÁ
KH: '+(cust.name||'')+'Mã: '+code+'
SĐT: '+(cust.phone||'')+' | Email: '+(cust.email||'')+' | ĐC: '+(cust.addr||'')+'
STTTên SPMã SPSLĐơn giáGiá CKThành tiền
'+(i+1)+''+(it.name||'')+''+(it.model||'')+''+(it.qty||1)+''+(it.price||0)+''+(it.discPrice||it.price||0)+''+(lt)+'
TỔNG CỘNG'+fmt(total)+'
'; - var blob=new Blob([h],{type:'application/vnd.ms-excel'}); - var url=URL.createObjectURL(blob);var a=document.createElement('a');a.href=url;a.download=code+'.xls'; - document.body.appendChild(a);a.click(); - setTimeout(function(){document.body.removeChild(a);URL.revokeObjectURL(url);},60000); - } catch(e) { console.error('Fallback error:', e); } -} - -setInterval(function(){ - if(typeof ExcelJS!=='undefined'&&window.VAI_QR){ - window.exportExcel=async function(){ - console.log('[VAI EXPORT v6] exportExcel'); - try { - var data=window.VAI_QR&&typeof window.VAI_QR.getData==='function'?window.VAI_QR.getData():typeof getData==='function'?getData():null; - if(!data||!data.qd||!data.qd.items||!data.qd.items.length){ - if(typeof getQuoteData==='function'){var qd2=getQuoteData();data={qd:qd2,fees:[],notes:[],deposit:0,discountPercent:0,itemDiscounts:{},grandTotal:qd2.grandTotal||0};} - } - if(!data||!data.qd||!data.qd.items||!data.qd.items.length){console.error('No data');return;} - var qd=data.qd,code=(window.VAI_QR&&typeof window.VAI_QR.getEffectiveOrderCode==='function')?window.VAI_QR.getEffectiveOrderCode():'VAS'+Date.now().toString(36).toUpperCase(); - await genXl(data,qd,code); - } catch(e) { console.error('Export error:', e); fallbackXls(); } - }; - window._doExportExcel=window.exportExcel;window.VAI_QR.exportExcel=window.exportExcel; - } -},200); - -console.log('[VAI EXPORT v6] ✅ Loaded WITH IMAGE FIX');})(); \ No newline at end of file diff --git a/vai-export-fixed.js b/vai-export-fixed.js deleted file mode 100644 index 9a6f994369acf41cfcf1a8365528cbeec11fff04..0000000000000000000000000000000000000000 --- a/vai-export-fixed.js +++ /dev/null @@ -1,172 +0,0 @@ -/** - * V.AI STUDIO — EXPORT v6.0 DEFINITIVE (100% images guaranteed) - * ====================================================== - * https://huggingface.co/spaces/bep40/V.AISTUDIO - * - * FIX TRIỆT ĐỂ: - * - Tự fetch ảnh bằng CORS + AllOrigins proxy fallback (vượt bizweb.dktcdn.net, eurogold.vn) - * - Chuyển ArrayBuffer → base64 → addImage trực tiếp vào Excel workbook - * - KHÔNG dùng DOM canvas, KHÔNG phụ thuộc .qt-img, KHÔNG CORS taint - * - KHÔNG race condition — genXl tự xử lý hết - * ====================================================== - */ -(function(){'use strict';console.log('[VAI EXPORT v6] === LOADING ==='); - -// ===== IMAGE FETCH ENGINE ===== -function fetchImg(url) { - if(!url||typeof url!=='string'||!url.startsWith('http')) return Promise.resolve(null); - return fetch(url,{mode:'cors',credentials:'omit'}) - .then(function(r){if(!r.ok)throw new Error('HTTP '+r.status);return r.arrayBuffer();}) - .catch(function(){ - return fetch('https://api.allorigins.win/raw?url='+encodeURIComponent(url)) - .then(function(pr){return pr.ok?pr.arrayBuffer():null;}) - .catch(function(){return null;}); - }); -} -function bufToB64(buf,url){ - if(!buf||buf.byteLength<50)return null; - var ext=(url||'').match(/\.png/i)?'png':'jpeg',b='',u=new Uint8Array(buf); - for(var i=0;i=2){for(var i=0;i=0||code.indexOf(pc)>=0)){var im=p.image||p.i||'';if(im)return im;}}} - if(nm&&nm.length>=5){for(var j=0;j=0||nm.indexOf(pn)>=0)){var im2=p2.image||p2.i||'';if(im2)return im2;}}} - return''; -} - -// ===== BUILD EXCEL ===== -async function genXl(data,qd,code){ - var M='#,##0"đ"',N='#,##0',WH={argb:'FFFFFFFF'},WB={top:{style:'thin',color:WH},bottom:{style:'thin',color:WH},left:{style:'thin',color:WH},right:{style:'thin',color:WH}}; - var wb=new ExcelJS.Workbook(),ws=wb.addWorksheet('Báo giá');ws.views=[{showGridLines:false}];ws.columns=[{width:5},{width:11},{width:28},{width:13},{width:20},{width:6},{width:13},{width:13},{width:15},{width:14}]; - - ws.mergeCells('A1:J1');ws.getRow(1).height=28;ws.getCell('A1').value='V.AI STUDIO ❝ Niềm tin khách hàng là tài sản của chúng tôi ❞';ws.getCell('A1').font={italic:true,size:9,color:{argb:'FF64748B'}};ws.getCell('A1').alignment={vertical:'middle'};ws.getCell('A1').border=WB; - ws.getRow(2).height=5;ws.mergeCells('A3:J3');ws.getRow(3).height=30;ws.getCell('A3').value='BẢNG BÁO GIÁ';ws.getCell('A3').font={bold:true,size:18,color:{argb:'FFDB9815'}};ws.getCell('A3').alignment={horizontal:'center',vertical:'middle'};ws.getCell('A3').border=WB;ws.getRow(4).height=5; - - var cust=qd.customer||{}; - ws.getCell('A5').value='Khách hàng:';ws.getCell('A5').font={bold:true,size:9};ws.getCell('A5').border=WB;ws.mergeCells('B5:E5');ws.getCell('B5').value=cust.name||'';ws.getCell('B5').font={bold:true,size:10};ws.getCell('B5').border=WB;ws.getCell('H5').value='Mã đơn:';ws.getCell('H5').font={size:9};ws.getCell('H5').border=WB;ws.mergeCells('I5:J5');ws.getCell('I5').value=code;ws.getCell('I5').font={bold:true,size:10,color:{argb:'FF003F62'}};ws.getCell('I5').border=WB; - ws.getCell('A6').value='SĐT:';ws.getCell('A6').font={size:9};ws.getCell('A6').border=WB;ws.getCell('B6').value=cust.phone||'';ws.getCell('B6').border=WB;ws.getCell('H6').value='Ngày:';ws.getCell('H6').font={size:9};ws.getCell('H6').border=WB;ws.getCell('I6').value=cust.date||'';ws.getCell('I6').border=WB; - ws.getCell('A7').value='Email:';ws.getCell('A7').font={size:9};ws.getCell('A7').border=WB;ws.getCell('B7').value=cust.email||'';ws.getCell('B7').border=WB;ws.getCell('A8').value='Địa chỉ:';ws.getCell('A8').font={size:9};ws.getCell('A8').border=WB;ws.mergeCells('B8:J8');ws.getCell('B8').value=cust.addr||'';ws.getCell('B8').border=WB;ws.getRow(9).height=5; - - // HEADER row - var HB={top:{style:'thin',color:{argb:'FF003F62'}},bottom:{style:'thin',color:{argb:'FF003F62'}},left:{style:'thin',color:{argb:'FF003F62'}},right:{style:'thin',color:{argb:'FF003F62'}}}; - var hRow=ws.getRow(10);hRow.height=20; - ['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=hRow.getCell(i+1);c.value=h;c.font={bold:true,color:{argb:'FFFFFFFF'},size:9};c.fill={type:'pattern',pattern:'solid',fgColor:{argb:'FF003F62'}};c.alignment={horizontal:'center',vertical:'middle',wrapText:true};c.border=HB; - }); - - // PRELOAD images BEFORE building rows - var items=qd.items||[]; - var imgUrls=items.map(getImgUrl); - console.log('[VAI EXPORT v6] Fetching',imgUrls.filter(Boolean).length,'images for',items.length,'items...'); - var imgResults=await Promise.all(imgUrls.map(function(url){ - if(!url)return Promise.resolve(null); - return fetchImg(url).then(function(buf){return bufToB64(buf,url);}); - })); - console.log('[VAI EXPORT v6] Loaded',imgResults.filter(Boolean).length,'images'); - - // BUILD rows với ảnh trực tiếp - var cr=11; - items.forEach(function(it,i){ - var row=ws.getRow(cr);row.height=50; - var bg=i%2===0?'FFF8FAFC':'FFFFFFFF'; - var RB={top:{style:'thin',color:{argb:bg}},bottom:{style:'thin',color:{argb:bg}},left:{style:'thin',color:{argb:bg}},right:{style:'thin',color:{argb:bg}}}; - var qty=Number(it.qty||1),price=Number(it.price||0),discPrice=Number(it.discPrice||it.price||0),lineTotal=discPrice*qty; - - row.getCell(1).value=it.stt||(i+1);row.getCell(1).alignment={horizontal:'center',vertical:'middle'}; - - // ===== INJECT ẢNH TRỰC TIẾP VÀO EXCEL ===== - var ri=imgResults[i]; - if(ri&&ri.base64){ - try{ - var imgId=wb.addImage({base64:ri.base64,extension:ri.ext||'jpeg'}); - ws.addImage(imgId,{tl:{col:1,row:cr-1},ext:{width:46,height:46}}); - }catch(ie){console.warn('[VAI EXPORT v6] img add error:',ie);} - } - - row.getCell(2).value='';row.getCell(2).font={size:8};row.getCell(2).alignment={horizontal:'center',vertical:'middle'}; - row.getCell(3).value=it.name||'';row.getCell(3).font={bold:true,size:9};row.getCell(3).alignment={wrapText:true,vertical:'middle'}; - row.getCell(4).value=it.model||'';row.getCell(4).alignment={horizontal:'center',vertical:'middle'}; - row.getCell(5).value=it.specs||(it.info||'');row.getCell(5).font={size:8,color:{argb:'FF64748B'}};row.getCell(5).alignment={wrapText:true,vertical:'middle'}; - row.getCell(6).value=qty;row.getCell(6).numFmt=N;row.getCell(6).alignment={horizontal:'center',vertical:'middle'}; - row.getCell(7).value=price;row.getCell(7).numFmt=M;row.getCell(7).alignment={horizontal:'right',vertical:'middle'}; - row.getCell(8).value=discPrice;row.getCell(8).numFmt=M;row.getCell(8).alignment={horizontal:'right',vertical:'middle'};if(discPrice0){fees.forEach(function(f){ws.mergeCells(cr,1,cr,8);ws.getRow(cr).height=20;ws.getCell('A'+cr).value=' ⊕ '+(f.label||'Phụ phí');ws.getCell('A'+cr).font={size:9,color:{argb:'FF92400E'}};ws.getCell('A'+cr).alignment={vertical:'middle'};ws.getCell('I'+cr).value=Number(f.amount||0);ws.getCell('I'+cr).numFmt=M;ws.getCell('I'+cr).font={bold:true,size:9,color:{argb:'FF92400E'}};ws.getCell('I'+cr).alignment={horizontal:'right',vertical:'middle'};for(var ci=1;ci<=10;ci++)ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFFFFBEB'}};cr++;});} - - // TOTAL - var TBG='FF003F62',TB={top:{style:'thin',color:{argb:TBG}},bottom:{style:'thin',color:{argb:TBG}},left:{style:'thin',color:{argb:TBG}},right:{style:'thin',color:{argb:TBG}}};ws.mergeCells(cr,1,cr,8);var tRow=ws.getRow(cr);tRow.height=28;tRow.getCell(1).value='TỔNG CỘNG';tRow.getCell(1).font={bold:true,size:13,color:{argb:'FFFFFFFF'}};tRow.getCell(1).alignment={horizontal:'left',vertical:'middle',indent:1};for(var ci=1;ci<=10;ci++){tRow.getCell(ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:TBG}};tRow.getCell(ci).border=TB;} - tRow.getCell(9).value=Number(data.grandTotal||0);tRow.getCell(9).numFmt=M;tRow.getCell(9).font={bold:true,size:15,color:{argb:'FFF0B840'}};tRow.getCell(9).alignment={horizontal:'right',vertical:'middle'};cr++; - - // DEPOSIT - var deposit=Number(data.deposit||0); - if(deposit>0){ws.mergeCells(cr,1,cr,8);ws.getRow(cr).height=22;ws.getCell('A'+cr).value='Đặt cọc';ws.getCell('A'+cr).font={bold:true,size:11,color:{argb:'FF166534'}};ws.getCell('A'+cr).alignment={horizontal:'left',vertical:'middle',indent:1};for(var ci=1;ci<=10;ci++)ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF0FDF4'}};ws.getCell('I'+cr).value=deposit;ws.getCell('I'+cr).numFmt=M;ws.getCell('I'+cr).font={bold:true,size:11,color:{argb:'FF166534'}};ws.getCell('I'+cr).alignment={horizontal:'right',vertical:'middle'};cr++; - ws.mergeCells(cr,1,cr,8);ws.getRow(cr).height=24;ws.getCell('A'+cr).value='Còn lại';ws.getCell('A'+cr).font={bold:true,size:12,color:{argb:'FFDC2626'}};ws.getCell('A'+cr).alignment={horizontal:'left',vertical:'middle',indent:1};for(var ci=1;ci<=10;ci++)ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFFEF2F2'}};ws.getCell('I'+cr).value=Number(data.remaining||0);ws.getCell('I'+cr).numFmt=M;ws.getCell('I'+cr).font={bold:true,size:13,color:{argb:'FFDC2626'}};ws.getCell('I'+cr).alignment={horizontal:'right',vertical:'middle'};cr++; -}else{ws.mergeCells(cr,1,cr,8);ws.getRow(cr).height=24;ws.getCell('A'+cr).value='Còn lại (100%)';ws.getCell('A'+cr).font={bold:true,size:12,color:{argb:'FFDC2626'}};ws.getCell('A'+cr).alignment={horizontal:'left',vertical:'middle',indent:1};for(var ci=1;ci<=10;ci++)ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFFEF2F2'}};ws.getCell('I'+cr).value=Number(data.grandTotal||0);ws.getCell('I'+cr).numFmt=M;ws.getCell('I'+cr).font={bold:true,size:13,color:{argb:'FFDC2626'}};ws.getCell('I'+cr).alignment={horizontal:'right',vertical:'middle'};cr++;} - - // NOTES - var notes=data.notes||[];if(notes.length>0){ws.mergeCells(cr,1,cr,10);ws.getCell('A'+cr).value='📝 Ghi chú: '+notes.join('; ');ws.getCell('A'+cr).font={italic:true,size:9,color:{argb:'FF166534'}};for(var ci=1;ci<=10;ci++)ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF0FDF4'}};cr++;} - - // BANK INFO - cr++;ws.mergeCells(cr,1,cr,5);ws.getRow(cr).height=18;ws.getCell('A'+cr).value='💳 QR CODE: VIB - 918258385 - Trần Quốc Vương';ws.getCell('A'+cr).font={bold:true,size:10,color:{argb:'FF003F62'}};for(var ci=1;ci<=10;ci++)ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF8FAFC'}};cr++; - ws.mergeCells(cr,1,cr,10);ws.getCell('A'+cr).value='🏦 VIB | 👤 Trần Quốc Vương | STK: 918258385 | 💰 '+((deposit>0?data.remaining:data.grandTotal)||0).toLocaleString('vi-VN')+'đ | 📝 '+code;ws.getCell('A'+cr).font={bold:true,size:10};for(var ci=1;ci<=10;ci++)ws.getCell(cr,ci).fill={type:'pattern',pattern:'solid',fgColor:{argb:'FFF8FAFC'}}; - - // Final borders - ws.eachRow(function(row){row.eachCell(function(cell){if(!cell.border)cell.border=WB;});}); - wb.calcProperties.fullCalcOnLoad=true; - - var buf=await wb.xlsx.writeBuffer();var blob=new Blob([buf],{type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});var url=URL.createObjectURL(blob);var a=document.createElement('a');a.href=url;a.download=code+'.xlsx';a.style.display='none';document.body.appendChild(a);a.click();setTimeout(function(){document.body.removeChild(a);URL.revokeObjectURL(url);},60000); - console.log('[VAI EXPORT v6] ✅ '+code+'.xlsx'); -} - -// ===== FALLBACK HTML (khi ExcelJS lỗi) ===== -function fallbackXls(){try{var data;if(window.VAI_QR&&typeof window.VAI_QR.getData==='function')data=window.VAI_QR.getData();else if(typeof getData==='function')data=getData();if(!data||!data.qd||!data.qd.items){alert('⚠️ Không có dữ liệu');return;} - var qd=data.qd,cust=qd.customer||{},code=(window.VAI_QR&&typeof window.VAI_QR.getEffectiveOrderCode==='function')?window.VAI_QR.getEffectiveOrderCode():'VAS'+Date.now().toString(36).toUpperCase(); - function fmt(n){if(!n||isNaN(n))return'0đ';return Number(n).toLocaleString('vi-VN')+'đ';} - var h=''; - h+='';h+='';h+='';h+=''; - var total=0;qd.items.forEach(function(it,i){var lt=(it.discPrice||it.price||0)*(it.qty||1);total+=lt;var bg=i%2===0?'#f8fafc':'#fff';var ckS=(it.discPrice&&it.price&&it.discPrice';});(data.fees||[]).forEach(function(f){h+='';}); - var gt=data.grandTotal||total;h+=''; - if(data.deposit>0){var rem=gt-data.deposit;h+='';h+='';} - h+='';h+='
V.AI STUDIO — BẢNG BÁO GIÁ
KH: '+(cust.name||'')+'Mã: '+code+'Ngày: '+(cust.date||'')+'
SĐT: '+(cust.phone||'')+' | Email: '+(cust.email||'')+' | ĐC: '+(cust.addr||'')+'
STTTên SPMã SPSLĐơn giáGiá CKThành tiền
'+(i+1)+''+(it.name||'')+''+(it.model||'')+''+(it.qty||1)+''+fmt(it.price||0)+''+fmt(it.discPrice||it.price||0)+''+fmt(lt)+'
⊕ '+f.label+''+fmt(f.amount)+'
TỔNG CỘNG'+fmt(gt)+'
Đã cọc'+fmt(data.deposit)+'
CÒN LẠI'+fmt(rem>0?rem:0)+'
✅ Bảo hành 2 năm (sản phẩm) — Bảo hành hoen gỉ vĩnh viễn (rổ SUS304)
💳 VIB | Trần Quốc Vương | STK: 918258385 | Số tiền: '+fmt(data.deposit>0?gt-data.deposit:gt)+' | ND: '+code+'
'; - var blob=new Blob([h],{type:'application/vnd.ms-excel'});var url=URL.createObjectURL(blob);var a=document.createElement('a');a.href=url;a.download=code+'.xls';a.style.display='none';document.body.appendChild(a);a.click();setTimeout(function(){document.body.removeChild(a);URL.revokeObjectURL(url);},60000);console.log('[VAI EXPORT v6] ✅ Fallback '+code+'.xls');}catch(e){console.error('[VAI EXPORT v6] Fallback error:',e);alert('❌ Lỗi xuất Excel: '+(e.message||e));}} - -// ===== SET EXPORT ===== -setInterval(function(){ - if(typeof ExcelJS!=='undefined'&&window.VAI_QR){ - window.exportExcel=async function(data,qd,code,qrUrl,bw){ - console.log('[VAI EXPORT v6] exportExcel'); - try{ - // Use passed data or try to get it - if(!data || !data.qd || !data.qd.items || !data.qd.items.length){ - if(window.VAI_QR&&typeof window.VAI_QR.getData==='function')data=window.VAI_QR.getData(); - else if(typeof getData==='function')data=getData(); - if(!data||!data.qd){ - if(typeof getQuoteData==='function'){var qd2=getQuoteData();data={qd:qd2,fees:[],notes:[],deposit:0,discountPercent:0,itemDiscounts:{},grandTotal:qd2.grandTotal||0,remaining:qd2.grandTotal||0,productTotal:qd2.grandTotal||0};} - } - } - if(!data||!data.qd||!data.qd.items||!data.qd.items.length){console.error('[VAI EXPORT v6] No data');return;} - var qd=data.qd,code=code||(window.VAI_QR&&typeof window.VAI_QR.getEffectiveOrderCode==='function')?window.VAI_QR.getEffectiveOrderCode():(qd.customer&&qd.customer.orderCode)||'VAS'+Date.now().toString(36).toUpperCase(); - try{await genXl(data,qd,code);}catch(e){console.error('[VAI EXPORT v6] genXl error:',e);fallbackXls();} - }catch(e){console.error('[VAI EXPORT v6] Error:',e);fallbackXls();} - }; - window._doExportExcel=window.exportExcel; - window.VAI_QR.exportExcel=window.exportExcel; - } -},200); -console.log('[VAI EXPORT v6] ✅ Loaded');})(); diff --git a/vai-excel-images-fix-v2.js b/vai-quote-excel-order-fix-v1050.js similarity index 60% rename from vai-excel-images-fix-v2.js rename to vai-quote-excel-order-fix-v1050.js index 0833cfec45ffcd45cddb580a84c67b97af50daa1..c1ea17b4eb85019d304e8c030f5a9e3a15bc34dd 100644 --- a/vai-excel-images-fix-v2.js +++ b/vai-quote-excel-order-fix-v1050.js @@ -1,14 +1,14 @@ /** - * V.AI STUDIO - Excel Export WITH Product Images - * Phiên bản hoàn chỉnh - Thay thế cho vai-quote-excel-order-fix-v1050.js + * V.AI STUDIO - Quote Excel/Order Excel Multi-Download Fix v1050 + * ========================================================== + * FIX TRIỆT ĐỐI: Excel tải được nhiều lần từ cả 2 modal * - * TÍNH NĂNG: - * ✅ Xuất Excel có hình ảnh sản phẩm (cột "Hình") - * ✅ Download nhiều lần không lỗi (dựa trên fix v1050) - * ✅ Hỗ trợ cả Quote và Order modal - * ✅ Toast thông báo + * TÍCH HỢP: + * - Blob URL registry toàn cục để tránh revoke sớm + * - Monkey-patch URL.revokeObjectURL + * - Click protection (chống bấm nhiều lần) + * - Hỗ trỡ export từ cả quotation modal và order modal */ - (function() { 'use strict'; @@ -18,8 +18,10 @@ registry: [], isUnloading: false }; + var globalRegistry = window.__VAI_BLOB_REGISTRY; + // Cleanup on page unload function cleanupAllBlobs() { globalRegistry.isUnloading = true; globalRegistry.blobs.forEach(function(blob) { @@ -38,6 +40,7 @@ window.addEventListener('beforeunload', cleanupAllBlobs); window.addEventListener('unload', cleanupAllBlobs); + // Patch URL.revokeObjectURL - QUAN TRỌNG NHẤT! if (!window.__VAI_REVOKE_PATCHED) { var originalRevoke = URL.revokeObjectURL; URL.revokeObjectURL = function(url) { @@ -48,15 +51,19 @@ if (!found) { globalRegistry.registry.push({ url: url, revoked: false, created: Date.now() }); } - return undefined; + return undefined; // KHÔNG revoke }; window.__VAI_REVOKE_PATCHED = true; } - // ========== HELPER FUNCTIONS ========== + // ========== UTILITY FUNCTIONS ========== function stripDiacritics(s) { - if (!s) return ''; - return s.normalize('NFD').replace(/[\u0300-\u36f]/g, '').replace(/[Đđ]/g, 'D'); + return s.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[Đđ]/g, 'D'); + } + + function fmt(n) { + if (!n || isNaN(n)) return '0đ'; + return Number(n).toLocaleString('vi-VN') + 'đ'; } function generateOrderCode(name) { @@ -76,46 +83,6 @@ return 'VAS' + (ini || 'X') + dd + mm + yy; } - // ========== FETCH IMAGE AS BASE64 ========== - async function fetchImageAsBase64(url) { - if (!url || !url.trim()) return null; - try { - const response = await fetch(url, { mode: 'cors', credentials: 'omit' }); - if (!response.ok) return null; - const blob = await response.blob(); - return new Promise((resolve) => { - const reader = new FileReader(); - reader.onloadend = () => resolve(reader.result); - reader.readAsDataURL(blob); - }); - } catch (err) { - return await loadImageCanvasFallback(url); - } - } - - function loadImageCanvasFallback(url) { - return new Promise((resolve) => { - const img = new Image(); - img.crossOrigin = 'anonymous'; - img.referrerPolicy = 'no-referrer'; - img.onload = function() { - try { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - if (!ctx) { resolve(null); return; } - canvas.width = 80; - canvas.height = 80; - ctx.fillStyle = '#ffffff'; - ctx.fillRect(0, 0, 80, 80); - ctx.drawImage(img, 0, 0, 80, 80); - resolve(canvas.toDataURL('image/jpeg', 0.7)); - } catch (e) { resolve(null); } - }; - img.onerror = () => resolve(null); - img.src = url; - }); - } - // ========== CLICK PROTECTION ========== function setExportButtonState(btn, exporting) { if (!btn) return; @@ -123,31 +90,49 @@ btn.disabled = true; btn.dataset.vaiExporting = '1'; btn.dataset.vaiOrigText = btn.innerHTML; - btn.style.opacity = '0.7'; - btn.innerHTML = '⏳ Đang xuất...'; + btn.innerHTML = '⏳ Đang xuất...'; } else { btn.disabled = false; btn.dataset.vaiExporting = '0'; - btn.style.opacity = ''; - if (btn.dataset.vaiOrigText) btn.innerHTML = btn.dataset.vaiOrigText; + if (btn.dataset.vaiOrigText) { + btn.innerHTML = btn.dataset.vaiOrigText; + } } } - // ========== GET DATA FROM CART ========== + // ========== CREATE DOWNLOAD LINK ========== + function createDownloadLink(blob, filename) { + var url = URL.createObjectURL(blob); + globalRegistry.blobs.push({ url: url, revoked: false }); + + var a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + + setTimeout(function() { + try { document.body.removeChild(a); } catch(e) {} + }, 100); + + return url; + } + + // ========== GET DATA FROM CART/MODAL ========== function getQuoteData() { - var items = []; - var total = 0; + var qd = { customer: {}, items: [], grandTotal: 0 }; + // Try cart first if (window.cart && window.cart.length > 0) { + var items = []; + var total = 0; window.cart.forEach(function(item, idx) { var p = (window.D && window.D[item.idx]) ? window.D[item.idx] : null; var price = item.priceNum || item.price || (p ? p.price : 0) || 0; var qty = item.qty || 1; - var img = p ? (p.img || p.image || '') : (item.image || ''); - items.push({ stt: idx + 1, - image: img, + image: p ? p.img : '', name: p ? (p.name || p.n || '') : (item.name || ''), model: p ? (p.sku || p.mod || '') : (item.sku || item.model || ''), specs: p ? (p.info || p.desc || '') : '', @@ -159,23 +144,24 @@ }); total += qty * price; }); + qd = { + customer: { + name: getCustomerName(), + phone: getPhone(), + email: getEmail(), + addr: getAddress(), + date: new Date().toLocaleDateString('vi-VN') + }, + items: items, + grandTotal: total + }; } - return { - customer: { - name: getCustomerName(), - phone: getPhone(), - email: getEmail(), - addr: getAddress(), - date: new Date().toLocaleDateString('vi-VN') - }, - items: items, - grandTotal: total - }; + return qd; } function getCustomerName() { - var selectors = ['#quoteName', '#quoteCustomerName', '#checkoutName']; + var selectors = ['#quoteName', '#quoteCustomerName', '#checkoutName', '.quote-field input:first-of-type']; for (var i = 0; i < selectors.length; i++) { var el = document.querySelector(selectors[i]); if (el && el.value && el.value.trim().length > 1) return el.value.trim(); @@ -198,23 +184,7 @@ return el ? el.value : ''; } - // ========== DOWNLOAD HELPER ========== - function downloadBlob(blob, filename) { - var url = URL.createObjectURL(blob); - globalRegistry.blobs.push({ url: url, revoked: false }); - - var a = document.createElement('a'); - a.href = url; - a.download = filename; - document.body.appendChild(a); - a.click(); - - setTimeout(function() { - try { document.body.removeChild(a); } catch(e) {} - }, 100); - } - - // ========== EXPORT EXCEL WITH IMAGES ========== + // ========== EXCEL EXPORT FUNCTIONS ========== async function exportQuoteExcel(qd, code) { if (typeof ExcelJS === 'undefined') { if (typeof showToast === 'function') showToast('⚠️ Chưa có thư viện ExcelJS'); @@ -230,13 +200,11 @@ { width: 13 }, { width: 13 }, { width: 15 }, { width: 14 } ]; - // Header ws.mergeCells('A3:J3'); ws.getCell('A3').value = 'BẢNG BÁO GIÁ'; ws.getCell('A3').font = { bold: true, size: 18, color: { argb: 'FFDB9815' } }; ws.getCell('A3').alignment = { horizontal: 'center' }; - // Customer info ws.getCell('A5').value = 'Khách hàng:'; ws.mergeCells('B5:E5'); ws.getCell('B5').value = qd.customer?.name || ''; @@ -256,46 +224,20 @@ ws.mergeCells('B8:J8'); ws.getCell('B8').value = qd.customer?.addr || ''; - // Column headers var hr = ws.getRow(10); ['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 = 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' }; }); - // Add product rows with images - var cr = 11; - var imagePromises = []; - + var cr = 11, firstItemRow = cr; for (var i = 0; i < (qd.items || []).length; i++) { - var it = qd.items[i], row = ws.getRow(cr + i); + var it = qd.items[i], row = ws.getRow(cr); row.height = 50; row.getCell(1).value = it.stt || i + 1; - row.getCell(1).alignment = { horizontal: 'center' }; - - // ADD IMAGE TO COLUMN B (index 2) - if (it.image) { - imagePromises.push( - fetchImageAsBase64(it.image).then(function(base64, rowNum) { - return function() { - if (base64) { - ws.addImage({ - source: base64, - range: { - tl: { col: 1, row: cr}, // top-left: cột B, hàng hiện tại - br: { col: 2, row: cr + 1 } // bottom-right: ô tiếp theo - } - }); - } - }; - }.bind(null, it.image)()) - ); - } - row.getCell(3).value = it.name || ''; row.getCell(3).font = { bold: true, size: 9 }; row.getCell(4).value = it.model || ''; @@ -303,7 +245,6 @@ row.getCell(5).font = { size: 8, color: { argb: 'FF64748B' } }; row.getCell(6).value = Number(it.qty || 1); row.getCell(6).numFmt = '#,##0'; - row.getCell(6).alignment = { horizontal: 'center' }; row.getCell(7).value = Number(it.price || 0); row.getCell(7).numFmt = '#,##0"đ"'; row.getCell(8).value = Number(it.discPrice || it.price || 0); @@ -312,30 +253,26 @@ row.getCell(9).numFmt = '#,##0"đ"'; row.getCell(9).font = { bold: true }; row.getCell(10).value = it.note || ''; - row.getCell(10).alignment = { wrapText: true }; + + cr++; } - // Wait for all images to load - await Promise.all(imagePromises); - - // Total row - var totalRowNum = cr + (qd.items || []).length; - ws.getRow(totalRowNum).height = 28; - ws.mergeCells(totalRowNum, 1, totalRowNum, 5); - ws.getCell('A' + totalRowNum).value = 'TỔNG CỘNG'; - ws.getCell('A' + totalRowNum).font = { bold: true, size: 13, color: { argb: 'FFFFFFFF' } }; - ws.getCell('A' + totalRowNum).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF003F62' } }; - ws.getCell('E' + totalRowNum).value = Number(qd.grandTotal || 0); - ws.getCell('E' + totalRowNum).numFmt = '#,##0"đ"'; - ws.getCell('E' + totalRowNum).font = { bold: true, size: 14, color: { argb: 'FFF0B840' } }; + ws.getRow(cr).height = 28; + ws.mergeCells(cr, 1, cr, 5); + ws.getCell('A' + cr).value = 'TỔNG CỘNG'; + ws.getCell('A' + cr).font = { bold: true, size: 13, color: { argb: 'FFFFFFFF' } }; + ws.getCell('A' + cr).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF003F62' } }; + ws.getCell('E' + cr).value = Number(qd.grandTotal || 0); + ws.getCell('E' + cr).numFmt = '#,##0"đ"'; + ws.getCell('E' + cr).font = { bold: true, size: 14, color: { argb: 'FFF0B840' } }; wb.calcProperties.fullCalcOnLoad = true; var buf = await wb.xlsx.writeBuffer(); - downloadBlob(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), code + '.xlsx'); + var blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + createDownloadLink(blob, code + '.xlsx'); } - // ========== EXPORT DELIVERY EXCEL ========== async function exportDeliveryExcel(qd, code) { if (typeof ExcelJS === 'undefined') { if (typeof showToast === 'function') showToast('⚠️ Chưa có thư viện ExcelJS'); @@ -369,113 +306,133 @@ }); var cr = 7, totalQty = 0; - var imagePromises = []; - for (var i = 0; i < (qd.items || []).length; i++) { - var it = qd.items[i], row = ws.getRow(cr + i); - row.height = 50; + var it = qd.items[i], row = ws.getRow(cr); + row.height = 20; row.getCell(1).value = it.stt || i + 1; row.getCell(2).value = it.name || ''; row.getCell(3).value = it.model || ''; row.getCell(4).value = it.qty || 1; - totalQty += Number(it.qty || 1); row.getCell(5).value = it.note || ''; - // ADD IMAGE (column 2 = B) - if (it.image) { - imagePromises.push( - fetchImageAsBase64(it.image).then(function(base64) { - if (base64) { - ws.addImage({ - source: base64, - range: { - tl: { col: 1, row: cr}, - br: { col: 2, row: cr + 1 } - } - }); - } - }) - ); - } + totalQty += Number(it.qty || 1); + cr++; } - await Promise.all(imagePromises); - - var totalRowNum = cr + (qd.items || []).length; - ws.mergeCells(totalRowNum, 1, totalRowNum, 3); - ws.getCell('A' + totalRowNum).value = 'TỔNG SỐ LƯỢNG'; - ws.getCell('A' + totalRowNum).font = { bold: true }; - ws.getCell('D' + totalRowNum).value = totalQty; - ws.getCell('D' + totalRowNum).font = { bold: true }; - - wb.calcProperties.fullCalcOnLoad = true; + var totalQtyRow = cr; + ws.mergeCells(totalQtyRow, 1, totalQtyRow, 3); + ws.getCell('A' + totalQtyRow).value = 'TỔNG CỘNG SỐ LƯỢNG'; + ws.getCell('D' + totalQtyRow).value = totalQty; var buf = await wb.xlsx.writeBuffer(); - downloadBlob(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), 'GH-' + code + '.xlsx'); + var blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + createDownloadLink(blob, 'GH-' + code + '.xlsx'); } // ========== PATCH EXPORT FUNCTIONS ========== function patchExportFunctions() { - var origExportExcel = window.exportExcel; - window.exportExcel = async function() { + // Patch exportExcel (Quote modal) + if (typeof window.exportExcel === 'function') { + var origExportExcel = window.exportExcel; + window.exportExcel = async function() { + var btn = document.activeElement; + if (btn && btn.dataset.vaiExporting === '1') return; + if (btn) setExportButtonState(btn, true); + + try { + var qd = getQuoteData(); + var code = generateOrderCode(qd.customer?.name || ''); + await exportQuoteExcel(qd, code); + if (typeof showToast === 'function') showToast('✅ Excel báo giá tải thành công!'); + } catch (e) { + console.error('exportExcel error:', e); + if (typeof showToast === 'function') showToast('❌ Lỗi: ' + e.message); + } finally { + if (btn) setTimeout(function() { setExportButtonState(btn, false); }, 500); + } + }; + } + + // Patch exportDeliveryExcel (GH Excel - both modals) + var origExportDeliveryExcel = window.exportDeliveryExcel; + window.exportDeliveryExcel = async function(order, opt) { var btn = document.activeElement; if (btn && btn.dataset.vaiExporting === '1') return; if (btn) setExportButtonState(btn, true); try { - var qd = getQuoteData(); - var code = generateOrderCode(qd.customer?.name || ''); - await exportQuoteExcel(qd, code); - if (typeof showToast === 'function') showToast('✅ Excel báo giá (có hình) tải thành công!'); + var qd; + if (order && order.items) { + // From order modal + qd = { + customer: { + name: order.customer || '', + phone: order.phone || '', + email: order.email || '', + addr: order.addr || '', + date: order.date || '' + }, + items: (order.items || []).map(function(it, i) { + return { + stt: i + 1, + name: it.name || '', + model: it.model || '', + qty: it.qty || 1, + price: it.price || 0, + discPrice: it.discPrice || it.price || 0, + total: it.total || 0, + note: it.note || '', + specs: it.specs || '' + }; + }), + grandTotal: order.grandTotal || 0 + }; + } else { + // From cart + qd = getQuoteData(); + } + + var code = (order && order.code) ? order.code : generateOrderCode(qd.customer?.name || ''); + await exportDeliveryExcel(qd, code); + if (typeof showToast === 'function') showToast('✅ Excel giao hàng tải thành công! Tải lại được.'); } catch (e) { - console.error('exportExcel error:', e); + console.error('exportDeliveryExcel error:', e); if (typeof showToast === 'function') showToast('❌ Lỗi: ' + e.message); } finally { if (btn) setTimeout(function() { setExportButtonState(btn, false); }, 500); } }; - var origExportDeliveryExcel = window.exportDeliveryExcel; - window.exportDeliveryExcel = async function(order, opt) { + // Patch exportPDF + var origExportPDF = window.exportPDF; + window.exportPDF = async function() { var btn = document.activeElement; if (btn && btn.dataset.vaiExporting === '1') return; if (btn) setExportButtonState(btn, true); try { - var qd = order && order.items ? { - customer: { - name: order.customer || '', - phone: order.phone || '', - email: order.email || '', - addr: order.addr || '', - date: order.date || '' - }, - items: (order.items || []).map(function(it, i) { - return { - stt: i + 1, - image: it.image || it.img || '', - name: it.name || '', - model: it.model || '', - qty: it.qty || 1, - price: it.price || 0, - discPrice: it.discPrice || it.price || 0, - total: it.total || 0, - note: it.note || '', - specs: it.specs || '' - }; - }), - grandTotal: order.grandTotal || 0 - } : getQuoteData(); - - var code = (order && order.code) ? order.code : generateOrderCode(qd.customer?.name || ''); - await exportDeliveryExcel(qd, code); - if (typeof showToast === 'function') showToast('✅ Excel giao hàng (có hình) tải thành công!'); + if (origExportPDF) origExportPDF.call(this); } catch (e) { - console.error('exportDeliveryExcel error:', e); - if (typeof showToast === 'function') showToast('❌ Lỗi: ' + e.message); + console.error('exportPDF error:', e); } finally { - if (btn) setTimeout(function() { setExportButtonState(btn, false); }, 500); + setTimeout(function() { if (btn) setExportButtonState(btn, false); }, 500); + } + }; + + // Patch exportDeliveryPDF + var origExportDeliveryPDF = window.exportDeliveryPDF; + window.exportDeliveryPDF = async function() { + var btn = document.activeElement; + if (btn && btn.dataset.vaiExporting === '1') return; + if (btn) setExportButtonState(btn, true); + + try { + if (origExportDeliveryPDF) origExportDeliveryPDF.call(this); + } catch (e) { + console.error('exportDeliveryPDF error:', e); + } finally { + setTimeout(function() { if (btn) setExportButtonState(btn, false); }, 500); } }; } @@ -487,6 +444,7 @@ var txt = (btn.textContent || '').toLowerCase(); + // Quote Excel if (txt.includes('excel') && !txt.includes('giao hàng') && !txt.includes('gh')) { e.preventDefault(); e.stopPropagation(); @@ -496,6 +454,7 @@ return false; } + // Delivery Excel if ((txt.includes('gh') || txt.includes('giao')) && txt.includes('excel')) { e.preventDefault(); e.stopPropagation(); @@ -509,9 +468,11 @@ // ========== INIT ========== function init() { patchExportFunctions(); + document.removeEventListener('click', handleClickProtection); document.addEventListener('click', handleClickProtection, true); - console.log('[VAI Excel Images v2] Loaded'); + + console.log('[VAI Fix v1050] Loaded - Multi-download Excel enabled'); } if (document.readyState === 'loading') { @@ -523,4 +484,13 @@ setTimeout(init, 2000); setTimeout(init, 5000); + // Global export + window.VAI_FIX = { + init: init, + getQuoteData: getQuoteData, + exportQuoteExcel: exportQuoteExcel, + exportDeliveryExcel: exportDeliveryExcel, + setExportButtonState: setExportButtonState + }; + })(); \ No newline at end of file