invtool

InvoicePro β€” Indian GST Invoice Generator
New Tax Invoice
INV
Business & Client
Items & Services
Tax & Charges
Payment & UPI
Design
Your Business Details
Client / Bill To Details
IGST (Interstate)
Invoice Details
Live Preview
'); printWin.document.close(); }function printInvoice(){downloadPDF();}/* ============================================================ SAVE TO HISTORY ============================================================ */ function saveToHistory(){ var t=calcTotals(); var invNum=gv('inv-num'); if(!invNum){alert('Invoice number daalna zaroori hai!');return;} var existing=historyData.findIndex(function(h){return h.num===invNum;}); var record={ id:existing>=0?historyData[existing].id:Date.now(), num:invNum,type:docType, client:gv('cl-name')||'Unknown Client',clientGST:gv('cl-gst'), date:gv('inv-date'),due:gv('due-date'), amount:t.total,gst:t.totalGST,status:gv('pay-status')||'unpaid', items:items.map(function(i){return Object.assign({},i);}), notes:gv('inv-notes'),paidOn:gv('pay-status')==='paid'?gv('inv-date'):null, history:existing>=0?historyData[existing].history:[{d:gv('inv-date'),t:'Invoice created'}] }; if(existing>=0)historyData[existing]=record; else historyData.unshift(record); alert('Invoice "'+ invNum+'" save ho gaya! History mein dekh sakte hain.'); }function saveDraft(){ sc('pay-status-draft',true); sv('pay-status','draft'); saveToHistory(); }/* ============================================================ CLEAR FORM ============================================================ */ function clearForm(){ if(!confirm('Sab kuch clear kar dein?'))return; ['biz-name','biz-gst','biz-pan','biz-phone','biz-email','biz-addr', 'cl-name','cl-gst','cl-phone','cl-email','cl-addr', 'inv-notes','inv-terms','bank-name','bank-acc','bank-ifsc','bank-holder', 'upi-id','upi-name','advance-amt'].forEach(function(id){sv(id,'');}); sv('advance-amt','0'); items=[]; initDates(); renderItems(); updatePreview(); }/* ============================================================ HISTORY PAGE ============================================================ */ function renderHistStats(){ var total=historyData.reduce(function(a,i){return a+i.amount;},0); var paid=historyData.filter(function(i){return i.status==='paid';}).reduce(function(a,i){return a+i.amount;},0); var pending=historyData.filter(function(i){return i.status==='unpaid'||i.status==='partial';}).reduce(function(a,i){return a+i.amount;},0); var overdueCnt=historyData.filter(function(i){return i.status==='overdue';}).length; var box=gel('hist-stats'); if(!box)return; box.innerHTML= '
Total Invoiced
β‚Ή'+total.toLocaleString('en-IN')+'
'+historyData.length+' invoices
'+ '
Amount Collected
β‚Ή'+paid.toLocaleString('en-IN')+'
'+historyData.filter(function(i){return i.status==='paid';}).length+' paid
'+ '
Pending Collection
β‚Ή'+pending.toLocaleString('en-IN')+'
'+historyData.filter(function(i){return i.status==='unpaid'||i.status==='partial';}).length+' pending
'+ '
Overdue Invoices
'+overdueCnt+'
Immediate action
';/* populate months */ var months={}; historyData.forEach(function(inv){if(inv.date)months[inv.date.substring(0,7)]=1;}); var sel=gel('hist-month'); if(sel){ sel.innerHTML=''; Object.keys(months).sort().reverse().forEach(function(m){ var d=new Date(m+'-01'); var label=d.toLocaleDateString('en-IN',{month:'long',year:'numeric'}); sel.innerHTML+=''; }); } }var histFiltered=[]; function setHistFilter(s,el){ histStatusFilter=s; document.querySelectorAll('.fpill').forEach(function(p){p.classList.remove('active');}); el.classList.add('active'); histPage=1; renderHistory(); }function renderHistory(){ var q=(gv('hist-search')||'').toLowerCase(); var month=gv('hist-month')||''; var sort=gv('hist-sort')||'date-desc'; histFiltered=historyData.filter(function(inv){ if(histStatusFilter!=='all'&&inv.status!==histStatusFilter)return false; if(month&&(!inv.date||!inv.date.startsWith(month)))return false; if(q&&!(inv.num.toLowerCase().includes(q)||inv.client.toLowerCase().includes(q)||(inv.amount+'').includes(q)))return false; return true; }); histFiltered.sort(function(a,b){ if(sort==='date-desc')return (b.date||'').localeCompare(a.date||''); if(sort==='date-asc')return (a.date||'').localeCompare(b.date||''); if(sort==='amount-desc')return b.amount-a.amount; if(sort==='amount-asc')return a.amount-b.amount; if(sort==='client')return a.client.localeCompare(b.client); return 0; }); var start=(histPage-1)*HIST_PER_PAGE,end=start+HIST_PER_PAGE; var visible=histFiltered.slice(start,end); var tbody=gel('hist-tbody'); var empty=gel('hist-empty'); if(!tbody)return; if(visible.length===0){ tbody.innerHTML=''; if(empty)empty.style.display='block'; } else { if(empty)empty.style.display='none'; tbody.innerHTML=visible.map(function(inv){ var over=isOverdue(inv); return ''+ ''+ ''+escHtml(inv.num)+''+ ''+escHtml(inv.client)+''+ ''+fmtDate(inv.date)+''+ ''+fmtDate(inv.due)+(over&&inv.status!=='paid'?' ⚠':'')+''+ 'β‚Ή'+inv.amount.toLocaleString('en-IN')+''+ 'β‚Ή'+inv.gst.toLocaleString('en-IN')+''+ ''+inv.status.charAt(0).toUpperCase()+inv.status.slice(1)+''+ ''+ ''+ ''+ ''+ ''+ ''; }).join(''); } renderHistPagination(); }function histSortBy(field){ if(histSortField===field)histSortDir=histSortDir==='asc'?'desc':'asc'; else{histSortField=field;histSortDir='asc';} var sortMap={num:'date-desc',client:'client',date:histSortDir==='desc'?'date-desc':'date-asc',due:histSortDir==='desc'?'date-desc':'date-asc',amount:histSortDir==='desc'?'amount-desc':'amount-asc',status:'date-desc'}; sv('hist-sort',sortMap[field]||'date-desc'); renderHistory(); }function renderHistPagination(){ var total=histFiltered.length; var pages=Math.ceil(total/HIST_PER_PAGE); var start=(histPage-1)*HIST_PER_PAGE+1; var end=Math.min(histPage*HIST_PER_PAGE,total); var box=gel('hist-pagination'); if(!box)return; var html=''+( total>0?(start+'–'+end+' of '+total):'0 results')+'
'; html+=''; for(var i=1;i<=pages;i++){ if(pages<=7||i===1||i===pages||Math.abs(i-histPage)<=1) html+=''; else if(Math.abs(i-histPage)===2)html+='…'; } html+='
'; box.innerHTML=html; }function goHistPage(p){ var pages=Math.ceil(histFiltered.length/HIST_PER_PAGE); if(p<1||p>pages)return; histPage=p; renderHistory(); }/* BULK */ function toggleRowSel(id,cb){ if(cb.checked)selectedRows.add(id);else selectedRows.delete(id); updateBulkBar(); } function toggleSelAll(cb){ var visible=histFiltered.slice((histPage-1)*HIST_PER_PAGE,histPage*HIST_PER_PAGE); visible.forEach(function(inv){if(cb.checked)selectedRows.add(inv.id);else selectedRows.delete(inv.id);}); renderHistory();updateBulkBar(); } function updateBulkBar(){ var bar=gel('bulk-bar'); if(selectedRows.size>0){bar.classList.add('show');gel('bulk-text').textContent=selectedRows.size+' selected';} else bar.classList.remove('show'); } function clearBulk(){selectedRows.clear();var sa=gel('sel-all');if(sa)sa.checked=false;renderHistory();updateBulkBar();} function bulkMarkPaid(){ selectedRows.forEach(function(id){var inv=historyData.find(function(i){return i.id===id;});if(inv)inv.status='paid';}); clearBulk();renderHistStats();renderHistory(); } function bulkDelete(){ if(!confirm(selectedRows.size+' invoices permanently delete karein?'))return; historyData=historyData.filter(function(i){return !selectedRows.has(i.id);}); clearBulk();renderHistStats();renderHistory(); }/* DETAIL DRAWER */ function toggleDrawer(id,e){ if(e&&e.target.tagName==='INPUT')return; if(openDrawerId===id){closeDrawer();return;} showDrawer(id); } function closeDrawer(){ openDrawerId=null; var d=gel('detail-drawer');if(d){d.classList.remove('open');d.innerHTML='';} } function showDrawer(id){ var inv=historyData.find(function(i){return i.id===id;}); if(!inv)return; openDrawerId=id; var over=isOverdue(inv); var d=gel('detail-drawer'); if(!d)return; var itemsHTML=inv.items.map(function(it){ return ''+ ''+escHtml(it.desc||'β€”')+''+ ''+it.qty+' '+(it.unit||'')+''+ 'β‚Ή'+parseFloat(it.rate||0).toFixed(2)+''+ ''+(it.gst||18)+'%'+ 'β‚Ή'+parseFloat(it.total||0).toFixed(2)+''+ ''; }).join(''); var tlHTML=(inv.history||[]).map(function(h){ return '
'+fmtDate(h.d)+'
'+escHtml(h.t)+'
'; }).join(''); d.innerHTML= '
'+ '
'+ '
'+escHtml(inv.num)+' β€” '+escHtml(inv.client)+'
'+ '
'+ ''+inv.status.charAt(0).toUpperCase()+inv.status.slice(1)+''+ (over&&inv.status!=='paid'?'Overdue':'')+ ''+DOC_LABELS[inv.type||'invoice']+''+ '
'+ '
'+ '
'+ ''+ ''+ ''+ '
'+ '
'+ '
'+ '
'+fmtDate(inv.date)+'
'+ '
'+fmtDate(inv.due)+'
'+ '
'+escHtml(inv.clientGST||'β€”')+'
'+ '
β‚Ή'+inv.gst.toLocaleString('en-IN')+'
'+ (inv.paidOn?'
'+fmtDate(inv.paidOn)+'
':'
')+ (inv.notes?'
'+escHtml(inv.notes)+'
':'')+''+ '
'+ '
Line Items
'+ '
'+ ''+ ''+ ''+ ''+ ''+itemsHTML+''+ ''+ ''+ ''+ ''+ '
DescriptionQtyRateGSTTotal
Grand Totalβ‚Ή'+inv.amount.toLocaleString('en-IN')+'
'+ '
'+ '
'+ '
'+ '
Activity Timeline
'+ '
'+tlHTML+'
'+ '
'+ '
'; d.classList.add('open'); d.scrollIntoView({behavior:'smooth',block:'start'}); }function editInvoice(id){ var inv=historyData.find(function(i){return i.id===id;}); if(!inv)return; switchPage('generator',inv.type||'invoice'); sv('inv-num',inv.num);sv('cl-name',inv.client);sv('cl-gst',inv.clientGST||''); sv('inv-date',inv.date);sv('due-date',inv.due);sv('inv-notes',inv.notes||''); sv('pay-status',inv.status); items=inv.items.map(function(it){return Object.assign({},it,{id:Date.now()+Math.random()});}); renderItems();updatePreview(); alert('Invoice loaded! Edit karke "Save Invoice" dabayein.'); }function deleteInvoice(id,e){ if(e)e.stopPropagation(); var inv=historyData.find(function(i){return i.id===id;}); if(!inv)return; if(!confirm('"'+inv.num+'" permanently delete karein?'))return; historyData=historyData.filter(function(i){return i.id!==id;}); if(openDrawerId===id)closeDrawer(); renderHistStats();renderHistory(); }function downloadHistPDF(id){ var inv=historyData.find(function(i){return i.id===id;}); if(!inv){alert('Invoice not found');return;} editInvoice(id); setTimeout(function(){downloadPDF();},500); }function exportHistoryCSV(){ var headers=['Invoice #','Type','Client','Client GSTIN','Date','Due Date','Amount','GST','Status']; var rows=histFiltered.map(function(inv){ return [inv.num,inv.type,inv.client,inv.clientGST||'',inv.date,inv.due,inv.amount,inv.gst,inv.status]; }); var csv=[headers].concat(rows).map(function(r){return r.map(function(c){return '"'+(c||'')+'"';}).join(',');}).join('\n'); var blob=new Blob([csv],{type:'text/csv;charset=utf-8;'}); var a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='invoices_export.csv';a.click(); }/* ============================================================ INIT ============================================================ */ function initDates(){ var today=new Date(); var fmt=function(d){return d.toISOString().split('T')[0];}; sv('inv-date',fmt(today)); var due=new Date(today);due.setDate(due.getDate()+30); sv('due-date',fmt(due)); }function init(){ initDates(); sv('inv-num','INV-2024-001'); sv('biz-name','Sharma Digital Agency'); sv('biz-gst','08AAACS0472N1Z1'); sv('biz-phone','+91 98765 43210'); sv('biz-email','hello@sharma.in'); sv('biz-addr','123, MG Road\nJaipur, Rajasthan β€” 302001'); sv('biz-state','Rajasthan'); sv('cl-name','Ramesh Kumar & Co.'); sv('cl-gst','07BBBCS1234M1Z5'); sv('cl-addr','456, Civil Lines\nNew Delhi β€” 110001'); sv('cl-state','Delhi'); sv('bank-name','State Bank of India'); sv('bank-ifsc','SBIN0001234'); sv('bank-holder','Sharma Digital Agency'); sv('upi-id','sharma@okicici'); sv('upi-name','Sharma Digital Agency'); sv('biz-avatar','SD'); sv_text('biz-display-name','Sharma Digital Agency'); detectGSTType(); addItem('Web Design & Development','998311',1,'Nos',25000,0,18); addItem('SEO Optimization','998315',3,'Month',5000,10,18); addItem('Content Writing','998399',5,'Nos',2000,0,18); updatePreview(); }window.addEventListener('DOMContentLoaded', init);
Scroll to Top