Chưa kết nối --:--
⚡ Kết nối Google Sheets
Dán URL sau khi deploy Apps Script để tự động lưu kết quả:
Cấu hình dữ liệu / Data setup
Tỷ lệ hao phí công đoạn
IDCông đoạnEnglish% thực tếBật
Danh mục giấy
Mã giấyGSMLoại dùngGhi chúXóa
Sau khi bấm Lưu cấu hình, dữ liệu sẽ ghi vào sheet Process_ConfigPaper_Collection. Các dropdown và tỷ lệ hao phí sẽ cập nhật lại theo dữ liệu mới.
Thông Số Sản Phẩm
Mặt trên
— g/m²
Sóng
— g/m²
Mặt dưới
— g/m²
Sóng 2
— g/m²
Mặt dưới
— g/m²
Công Đoạn Sản Xuất Hao phí: 11.00%
Thông Số Phụ

* Khổ giấy thực tế dùng tính khối lượng giấy. Có thể khác với khổ tính toán lý thuyết.

Ghi Chú
Kích Thước Tấm Phôi
Dài tấm — dọc máy
mm
Rộng tấm — ngang máy
mm
Diện tích 1 tấm phôi
Số part / khổ giấy
Khổ tính toán — lý thuyết
— – — – —
Sản Lượng & Tổ Chức Sản Xuất
Tổng tỷ lệ hao phí
Sản lượng sản xuất thực tế
Số tờ phôi cần chạy sóng
Khối Lượng Giấy Khổ TT: 1300mm
Vật tư phụ
Keo dán tai (kg)
Hồ máy sóng — thể tích (lít)
Hồ tinh bột — bột khô (kg)

* Keo: 70g/m² × (flap × H × 0.75). Hồ: 0.18L/m² × tờ phôi. Bột khô: nồng độ 24%.

Tài khoản đăng ký mới sẽ được ghi vào data user, các tài khoản mặc định là user để admin phân quyền lại.
PTS
KẾT QUẢ TÍNH GIÁ — V2.5

Thông số tính giá

Nhập trực tiếp — giá bán tự cập nhật ngay.

Đơn giá nguyên vật liệu

GiấyGSMVND/kgVND/m²
Sửa đơn giá giấy và vật tư phụ, sau đó bấm Lưu giá để cập nhật sheet Material_cost / Cost_Config.

Thông tin sản phẩm

Kết quả tính giá

'); w.document.close(); setTimeout(function(){w.focus();w.print();},250); }; // ══════════════════════════════════════ // FIX 2: CSV EXPORT/IMPORT // ══════════════════════════════════════ function sc(line){var r=[],c='',q=false;for(var i=0;i=3){var c=(cols[1]||'').trim().toUpperCase(),g=parseInt(cols[2]||0);if(c&&g>0)papers.push({c:c,g:g,type:(cols[3]||'').trim(),note:(cols[4]||'').trim()});} else if(s==='PAPERPRICE'&&cols.length>=4){var code=(cols[1]||'').trim().toUpperCase(),gsm=parseFloat(cols[2]||0),kg=parseFloat(cols[3]||0);if(code&&kg>0)paperPrices[code]={gsm:gsm,kgPrice:kg,priceM2:Math.round(gsm/1000*kg*100)/100};} else if(s==='AUX'&&cols.length>=3){var key=(cols[1]||'').trim().toUpperCase(),val=parseFloat(cols[2]||0);if(key&&!isNaN(val))auxData[key]=val;} else if(s==='PROCESS'&&cols.length>=5){var pct=parseFloat(cols[4]||0);if(!isNaN(pct))procs.push({id:(cols[1]||'').trim(),key:(cols[1]||'').trim(),lbl:(cols[2]||'').trim(),lblEn:(cols[3]||'').trim(),w:pct/100,enabled:(cols[5]||'1').trim()!=='0'});} }); console.log('[PTS CSV] Parsed — papers:'+papers.length+' prices:'+Object.keys(paperPrices).length+' aux:'+Object.keys(auxData).length+' procs:'+procs.length); var results=[]; // PAPER → PG + dropdown if(papers.length){ window.PG=papers.slice(); if(typeof window.PG_DEFAULTS!=='undefined') window.PG_DEFAULTS=papers.slice(); // Fill bảng Setup var tbody=document.querySelector('#setupPaperTable tbody'); if(tbody&&typeof paperSetupRowHtml==='function'){tbody.innerHTML='';papers.forEach(function(p){tbody.insertAdjacentHTML('beforeend',paperSetupRowHtml(p));});} // Populate dropdown trực tiếp — không cần gọi hàm (tránh CORS file://) var selIds=['topLiner','medium1','liner1','medium2','liner2']; var opts=''+papers.map(function(p){return'';}).join(''); selIds.forEach(function(id){ var sel=document.getElementById(id); if(!sel)return; var cur=sel.value; sel.innerHTML=opts; if(cur) sel.value=cur; }); if(typeof updGsm==='function') updGsm(); console.log('[PTS CSV] Dropdown populated directly, '+papers.length+' options'); results.push(papers.length+' giấy'); } // PAPERPRICE → PAPER object + lưu localStorage if(Object.keys(paperPrices).length){ if(!window.PAPER) window.PAPER={}; Object.keys(paperPrices).forEach(function(code){window.PAPER[code]=paperPrices[code];}); console.log('[PTS CSV] PAPER set:'+Object.keys(window.PAPER).length+' codes'); // Lưu vào PTS_UMAT_ var email=(window.currentUser&&window.currentUser.email)||localStorage.getItem('pts_user_email')||localStorage.getItem('pts_current_user')||''; if(email){ var matKey='PTS_UMAT_'+email.toLowerCase().trim(); try{ var sv=JSON.parse(localStorage.getItem(matKey)||'{}'); sv.paper=Object.assign({},window.PAPER); sv.updatedAt=Date.now(); localStorage.setItem(matKey,JSON.stringify(sv)); console.log('[PTS CSV] PAPER saved → '+matKey); }catch(ex){console.warn('[PTS CSV] PAPER save error:',ex.message);} } else { console.warn('[PTS CSV] No email found — PAPER not persisted. Login first!'); } // Rebuild editor nếu modal đang mở setTimeout(function(){ if(typeof buildMaterialEditor==='function'){buildMaterialEditor();console.log('[PTS CSV] buildMaterialEditor called');} if(typeof saveUserMaterial==='function') saveUserMaterial(); },300); results.push(Object.keys(paperPrices).length+' giá giấy'); } // AUX → window.AUX + lưu localStorage if(Object.keys(auxData).length){ if(!window.AUX) window.AUX={}; Object.keys(auxData).forEach(function(k){window.AUX[k]=auxData[k];}); console.log('[PTS CSV] AUX:',JSON.stringify(window.AUX)); var email=(window.currentUser&&window.currentUser.email)||localStorage.getItem('pts_user_email')||localStorage.getItem('pts_current_user')||''; if(email){ var matKey='PTS_UMAT_'+email.toLowerCase().trim(); try{ var sv=JSON.parse(localStorage.getItem(matKey)||'{}'); sv.aux=Object.assign({},window.AUX); sv.updatedAt=Date.now(); localStorage.setItem(matKey,JSON.stringify(sv)); console.log('[PTS CSV] AUX saved → '+matKey); }catch(ex){console.warn('[PTS CSV] AUX save error:',ex.message);} } setTimeout(function(){ if(typeof buildMaterialEditor==='function') buildMaterialEditor(); if(typeof saveUserMaterial==='function') saveUserMaterial(); // Force update input fields nếu modal đang mở document.querySelectorAll('[data-aux]').forEach(function(inp){ var k=inp.dataset.aux; if(k&&window.AUX&&window.AUX[k]!=null) inp.value=window.AUX[k]; }); },400); results.push(Object.keys(auxData).length+' vật tư phụ'); } // PROCESS if(procs.length){ if(typeof window.PROCS!=='undefined') window.PROCS=procs.slice(); procs.forEach(function(p){ var cb=document.getElementById(p.id); if(cb){cb.checked=p.enabled;var pctEl=cb.closest&&cb.closest('.pi')?cb.closest('.pi').querySelector('.ppct'):null;if(pctEl)pctEl.textContent=Math.round(p.w*10000)/100+'%';} }); if(typeof calc==='function') calc(); results.push(procs.length+' công đoạn'); } // Lưu PG+process vào config chung try{ var sv=JSON.parse(localStorage.getItem('PTS_BOX_LOCAL_NG_PAPER_CONFIG_V2')||'{}'); if(papers.length){sv.papers=papers;sv.paperGrades=papers;} if(procs.length) sv.processes=procs; sv.savedAt=new Date().toISOString(); localStorage.setItem('PTS_BOX_LOCAL_NG_PAPER_CONFIG_V2',JSON.stringify(sv)); }catch(ex){} var msg='✅ Nhập: '+results.join(', '); console.log('[PTS CSV]',msg); if(typeof toast==='function') toast(msg,'success'); else alert(msg); }catch(err){ if(typeof toast==='function') toast('❌ Lỗi: '+err.message,'error'); console.error('[PTS CSV] Error:',err); } fileInput.value=''; }; reader.readAsText(file,'UTF-8'); }; })();