VINALIFE ERP CO BAO GIA v2

AD
admin 30/5/2026

Tổng quan

Báo cáo nhanh đơn hàng, sản xuất, công nợ và tồn kho.

Doanh số đơn hàng

Đang sản xuất

0 Hạng mục

Công nợ phải thu

Cảnh báo tồn kho

0 Vật tư

Cơ cấu loại sản phẩm đang chạy

Tỉ lệ in100%
Sách & Ấn phẩm
Nhãn & Decal
Túi Giấy / Hộp Giấy
Khác

Đơn hàng gần đây

Khách hàngNgày giaoThành Tiền
Trợ lý VINALIFE ERP
AI ERP và tin nhắn nội bộ công ty
Trợ lý VINALIFE ERPHỏi nhanh về đơn hàng, công nợ, tồn kho, sản xuất và báo giá.
🏢 Nội bộ VINALIFE
Trao đổi công việc nội bộ công ty.
'; var frame = document.getElementById('vnl-customer-debt-print-frame'); if(!frame){ frame = document.createElement('iframe'); frame.id = 'vnl-customer-debt-print-frame'; frame.style.position = 'fixed'; frame.style.right = '0'; frame.style.bottom = '0'; frame.style.width = '0'; frame.style.height = '0'; frame.style.border = '0'; document.body.appendChild(frame); } var win = frame.contentWindow || frame; var docFrame = frame.contentDocument || win.document; docFrame.open(); docFrame.write(html); docFrame.close(); setTimeout(function(){ try{ win.focus(); win.print(); }catch(err){ alert('Không mở được cửa sổ in. Vui lòng thử lại.'); } }, 250); } function exportStatement(){ var doc = document.getElementById('customer-debt-statement-doc'); if(!doc) return alert('Chưa có bảng kê để xuất.'); var html = ''+doc.innerHTML+' '; var blob = new Blob(['\ufeff', html], {type:'application/vnd.ms-excel;charset=utf-8;'}); var a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'bang-ke-chi-tiet-cong-no-khach-hang.xls'; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(function(){ URL.revokeObjectURL(a.href); }, 1000); } var oldRenderDebt = window.renderDebt; window.renderDebt = function(){ var tbody = document.getElementById('customer-debt-table'); if(!tbody){ if(typeof oldRenderDebt==='function') return oldRenderDebt(); return; } var keyword = (document.getElementById('customer-debt-search')?.value || '').toLowerCase().trim(); var filter = document.getElementById('customer-debt-filter')?.value || 'ALL'; var from = document.getElementById('customer-debt-from')?.value || ''; var to = document.getElementById('customer-debt-to')?.value || ''; var rows = (state.customers||[]).map(function(c){ var detail = statementRows(c.id, from, to); var s = summary(detail); var debt = Math.max(0, s.debt - s.paid); return {c:c,total:s.debt,paid:s.paid,debt:debt}; }).filter(function(row){ var c=row.c, text=String((c.id||'')+' '+(c.name||'')+' '+(c.tax||'')+' '+(c.phone||'')+' '+(c.email||'')).toLowerCase(); if(keyword && text.indexOf(keyword)<0) return false; if(filter==='DEBT' && row.debt<=0) return false; if(filter==='PAID' && row.debt>0) return false; return true; }); tbody.innerHTML = rows.length ? rows.map(function(r){return ''+esc(r.c.name)+''+fmt(r.total)+''+fmt(r.paid)+''+(r.debt>0?fmt(r.debt):'Hết nợ ✓')+'';}).join('') : 'Không tìm thấy khách hàng phù hợp.'; }; window.vnlOpenCustomerStatementFor = function(cid){ openStatement(); var sel=document.getElementById('statement-customer'); if(sel){ sel.value=cid||'ALL'; buildStatement(); } }; document.addEventListener('click', function(e){ if(e.target.closest('#btn-open-customer-debt-statement')) openStatement(); if(e.target.closest('#close-customer-debt-statement-modal')) closeStatement(); if(e.target.closest('#btn-build-customer-debt-statement')) buildStatement(); if(e.target.closest('#btn-print-customer-debt-statement')) printStatement(); if(e.target.closest('#btn-export-customer-debt-statement')) exportStatement(); }, true); document.addEventListener('input', function(e){ if(e.target && (e.target.id==='customer-debt-from' || e.target.id==='customer-debt-to')) window.renderDebt(); }, true); document.addEventListener('change', function(e){ if(e.target && (e.target.id==='customer-debt-from' || e.target.id==='customer-debt-to')) window.renderDebt(); }, true); })(); `; var w=window.open('','_blank'); w.document.open(); w.document.write(html); w.document.close(); } window.renderCashflow=function(){ ensureData(); var tbody=document.getElementById('cashflow-table'); if(!tbody) return; var q=(document.getElementById('cashflow-search')?.value||'').toLowerCase().trim(); var typ=document.getElementById('cashflow-type-filter')?.value||'ALL'; var from=document.getElementById('cashflow-from')?.value||''; var to=document.getElementById('cashflow-to')?.value||''; var rows=allReceipts().concat(allExpenses()).filter(x=>{ if(typ!=='ALL' && x.type!==typ) return false; if(from||to){ if(!dateInRange(x.date,from,to)) return false; } var text=((x.id||'')+' '+(x.partnerName||'')+' '+(x.content||'')).toLowerCase(); return !q || text.includes(q); }).sort((a,b)=>String(b.date).localeCompare(String(a.date))); var income=rows.filter(x=>x.type==='thu').reduce((s,x)=>s+(Number(x.amount)||0),0); var expense=rows.filter(x=>x.type==='chi').reduce((s,x)=>s+(Number(x.amount)||0),0); ['cashflow-total-income','cashflow-total-expense','cashflow-balance'].forEach((id,idx)=>{var el=document.getElementById(id); if(el) el.textContent=fmt(idx===0?income:idx===1?expense:income-expense);}); tbody.innerHTML=rows.length?rows.map(x=>`${esc(formatVNDateOnly(x.date)||'')}${esc(x.id||'')}${x.type==='thu'?'Thu':'Chi'}${esc(x.partnerName||'')}${esc(x.content||'')}${esc(x.method||'Tiền mặt')}${esc(x.note||'')}${fmt(x.amount)}${x.source==='cashflow'||x.source==='manual'?``:'Tự động'}`).join(''):'Chưa có phiếu thu/chi phù hợp.'; var badge=document.getElementById('badge-cashflow'); if(badge) badge.textContent=rows.length; }; window.vnlEditCashflow=function(id){ var x=(state.cashflows||[]).find(a=>a.id===id); if(x) openCash(x.type,id); }; window.vnlDeleteCashflow=deleteCash; window.vnlPrintCashflow=printCash; var oldRenderDashboard=window.renderDashboard; window.renderDashboard=function(){ installDashboard(); ensureData(); var r=currentRange(); var orders=activeOrders().filter(o=>!r.from&&!r.to?true:dateInRange(o.date||o.createdAt,r.from,r.to)); var revenue=orders.filter(orderDone).reduce((s,o)=>s+orderTotalSafe(o),0); var income=allReceipts().filter(x=>!r.from&&!r.to?true:dateInRange(x.date,r.from,r.to)).reduce((s,x)=>s+(Number(x.amount)||0),0); var expense=allExpenses().filter(x=>!r.from&&!r.to?true:dateInRange(x.date,r.from,r.to)).reduce((s,x)=>s+(Number(x.amount)||0),0); var allOrderValue=orders.reduce((s,o)=>s+orderTotalSafe(o),0); var debt=Math.max(0, allOrderValue-income); var sDebt=(state.suppliers||[]).reduce((s,x)=>s+Math.max(0,(Number(x.total||x.totalBuy)||0)-(Number(x.paid)||0)),0); var inv=(state.materials||[]).reduce((s,m)=>s+(Number(m.stock)||0)*(Number(m.price||m.unitPrice)||0),0); var active=orders.filter(o=>!orderDone(o)).length; [['kpi-revenue',revenue],['kpi-income',income],['kpi-expense',expense],['kpi-profit',revenue-expense],['kpi-debt',debt],['kpi-supplier-debt',sDebt],['kpi-inventory-value',inv]].forEach(a=>{var el=document.getElementById(a[0]); if(el) el.textContent=fmt(a[1]);}); var ea=document.getElementById('kpi-active'); if(ea) ea.textContent=active+' đơn'; var low=(state.materials||[]).filter(m=>Number(m.stock||0)<=Number(m.warn||0)).length; var bl=document.getElementById('badge-low-stock'); if(bl) bl.textContent=low; var bo=document.getElementById('badge-orders'); if(bo) bo.textContent=activeOrders().length; var bq=document.getElementById('badge-quotes'); if(bq) bq.textContent=(state.quotations||[]).filter(q=>q.status!=='cancelled'&&!q.deleted).length; var bc=document.getElementById('badge-cashflow'); if(bc) bc.textContent=allReceipts().length+allExpenses().length; var tbody=document.getElementById('dashboard-orders'); if(tbody) tbody.innerHTML=orders.length?orders.slice(-10).reverse().map(o=>`${esc(o.id||'')}${esc(getNameById(state.customers,o.customerId))}${esc(o.delivery||'')}${fmt(orderTotalSafe(o))}`).join(''):'Không có đơn hàng trong thời gian đã chọn.'; var chart=document.getElementById('dashboard-cash-chart'); if(chart){var max=Math.max(income,expense,1); chart.innerHTML=`
Thu${fmt(income)}
Chi${fmt(expense)}
`;} var sum=document.getElementById('dashboard-report-summary'); if(sum) sum.innerHTML=`
Doanh thu

Tính theo đơn hàng đã hoàn thành trong kỳ.

Thu - Chi

Phiếu thu/chi thủ công và phiếu tự sinh từ công nợ.

Công nợ KH

Tổng đơn hàng trong kỳ trừ tổng thu.

Còn nợ NCC

Tổng mua NCC trừ số đã trả.

`; }; var oldRenderAll=window.renderAll; window.renderAll=function(){ installDashboard(); installCashflow(); if(typeof oldRenderAll==='function') oldRenderAll.apply(this,arguments); try{window.renderDashboard();}catch(e){} try{window.renderCashflow();}catch(e){} }; document.addEventListener('click',function(e){ if(e.target.closest('#btn-add-income')) openCash('thu'); if(e.target.closest('#btn-add-expense')) openCash('chi'); if(e.target.closest('#close-cashflow-modal')||e.target.closest('#cancel-cashflow')) closeCash(); if(e.target.closest('#save-cashflow')) saveCash(); if(e.target.closest('#btn-dashboard-refresh')) window.renderDashboard(); },true); document.addEventListener('input',function(e){ var id=e.target&&e.target.id||''; if(id.indexOf('cashflow-')===0) window.renderCashflow(); },true); document.addEventListener('change',function(e){ var id=e.target&&e.target.id||''; if(id==='dashboard-range'){ var custom=e.target.value==='CUSTOM'; document.getElementById('dashboard-from')?.classList.toggle('hidden',!custom); document.getElementById('dashboard-to')?.classList.toggle('hidden',!custom); window.renderDashboard(); } if(id==='dashboard-from'||id==='dashboard-to') window.renderDashboard(); if(id.indexOf('cashflow-')===0) window.renderCashflow(); },true); installDashboard(); installCashflow(); setTimeout(function(){try{renderAll();}catch(e){try{window.renderDashboard();window.renderCashflow();}catch(_){}}},300); })();