Simply Phoolish Closing Stock
Not saved
Total bundles
0
Total pieces
0
Editing stock for
Stock entry
Past entries
Bundles
0
Pieces
0
Value ₹
0
Editing wastage for
Wastage entry
Past wastage
${stems}/bdl
${dispBdl>0?`${dispBdl.toLocaleString('en-IN')} bdl`:''} ${dispPcs>0?`${dispPcs.toLocaleString('en-IN')} pcs`:''} ${isW&&fv>0?`${fmtMoney(fv)}`:''}
`; if(isOpen){ const body=document.createElement('div');body.className='variants-body'; mv.forEach(v=>{ const bk=fn+'||'+v+'||b',pk=fn+'||'+v+'||p',prk=fn+'||'+v+'||pr'; const bv=parseFloat(draft[bk])||0,pv=parseInt(draft[pk])||0,prv=parseFloat(draft[prk])||0; const vv=isW?calcVal(fn,v,draft):0; const hasBP=bv>0||pv>0; const fc=isW?'fw':'fs'; const bc=isW?'qbtn w':'qbtn'; const qc=isW?'qinput':'qinput'; const block=document.createElement('div');block.className='variant-block'; block.innerHTML=`
${v} ${hasBP?(bv>0?bv+' bdl':'—')+' / '+(pv>0?pv+' pcs':'—'):''} ${vv>0?`${fmtMoney(vv)}`:''}
Bundles
Pieces
${isW?`
Price / Bundle
Wastage value
${vv>0?fmtMoney(vv):'—'}
`:''}`; body.appendChild(block); }); card.appendChild(body); } el.appendChild(card); }); if(!el.innerHTML)el.innerHTML='
No results
'; if(isW){document.getElementById('wTotalB').textContent=tB.toLocaleString('en-IN');document.getElementById('wTotalP').textContent=tP.toLocaleString('en-IN');document.getElementById('wTotalV').textContent=Math.round(tV).toLocaleString('en-IN');} else{document.getElementById('sTotalB').textContent=tB.toLocaleString('en-IN');document.getElementById('sTotalP').textContent=tP.toLocaleString('en-IN');} el.querySelectorAll('.flower-head').forEach(h=>h.onclick=()=>{const fn=h.dataset.fn,m=h.dataset.m;openF[m].has(fn)?openF[m].delete(fn):openF[m].add(fn);buildList(m);}); el.querySelectorAll('.qinput').forEach(inp=>inp.oninput=()=>{ const v=Math.max(0,parseInt(inp.value)||0),m=inp.dataset.m,fc=m==='wastage'?'fw':'fs'; drafts[m][inp.dataset.k]=v||'';inp.classList.toggle(fc,v>0);updateSyncBadge(false); if(m==='wastage')buildList('wastage');else updateStockStats(); }); el.querySelectorAll('.qbtn').forEach(btn=>btn.onclick=()=>{ const k=btn.dataset.k,m=btn.dataset.m,inp=el.querySelector(`.qinput[data-k="${k}"]`); let v=parseInt(inp.value)||0;btn.dataset.a==='inc'?v++:v=Math.max(0,v-1); inp.value=v||'';drafts[m][k]=v||'';const fc=m==='wastage'?'fw':'fs';inp.classList.toggle(fc,v>0); updateSyncBadge(false);if(m==='wastage')buildList('wastage');else updateStockStats(); }); el.querySelectorAll('.pinput').forEach(inp=>inp.oninput=()=>{ const v=Math.max(0,parseFloat(inp.value)||0);drafts.wastage[inp.dataset.k]=v||'';inp.classList.toggle('fw',v>0); updateSyncBadge(false);buildList('wastage'); }); } function updateStockStats(){ let tb=0,tp=0;flowers.forEach(([fn,vs])=>vs.forEach(v=>{tb+=parseInt(drafts.stock[fn+'||'+v+'||b'])||0;tp+=parseInt(drafts.stock[fn+'||'+v+'||p'])||0;})); document.getElementById('sTotalB').textContent=tb.toLocaleString('en-IN');document.getElementById('sTotalP').textContent=tp.toLocaleString('en-IN'); } function showToast(id,msg,type='ok'){ const t=document.getElementById(id);t.textContent=msg;t.className='toast '+type+(mode==='wastage'&&type==='ok'?' wm':'');t.style.display='block';setTimeout(()=>t.style.display='none',3000); } async function saveAndSync(m){ const draft=drafts[m]; try{localStorage.setItem('sp_'+m+'_'+activeKey,JSON.stringify(draft));}catch{} const btn=document.getElementById(m==='stock'?'saveBtnS':'saveBtnW'); btn.disabled=true;btn.textContent='Syncing...'; showToast(m==='stock'?'toastS':'toastW','Syncing to Google Sheets...','syncing'); // Build rows array — only entries with data const rows=[]; flowers.forEach(([fn,variants,stems])=>{ variants.forEach(v=>{ const b=parseInt(draft[fn+'||'+v+'||b'])||0; const p=parseInt(draft[fn+'||'+v+'||p'])||0; const pr=parseFloat(draft[fn+'||'+v+'||pr'])||0; if(b>0||p>0||pr>0){ const val=m==='wastage'?calcVal(fn,v,draft):0; rows.push({flower:fn,colour:v,bundles:b,pieces:p,price:pr,value:Math.round(val)}); } }); }); if(rows.length===0){ btn.disabled=false;btn.innerHTML=' Save & sync to Google Sheets'; showToast(m==='stock'?'toastS':'toastW','No entries to sync yet'); return; } try{ const resp=await fetch(SHEET_URL,{method:'POST',body:JSON.stringify({mode:m,date:activeKey,rows}),headers:{'Content-Type':'text/plain'}}); const result=await resp.json(); if(result.status==='ok'){ updateSyncBadge(true); showToast(m==='stock'?'toastS':'toastW',`✓ Synced ${rows.length} entries to Google Sheets`); buildList(m); }else throw new Error(result.message||'Unknown error'); }catch(err){ showToast(m==='stock'?'toastS':'toastW','⚠ Saved locally. Sync failed: '+err.message,'err'); } btn.disabled=false;btn.innerHTML=' Save & sync to Google Sheets'; } document.getElementById('saveBtnS').onclick=()=>saveAndSync('stock'); document.getElementById('saveBtnW').onclick=()=>saveAndSync('wastage'); function buildWA(m){ const draft=drafts[m],isW=m==='wastage'; let lines=[`*Simply Phoolish — ${isW?'Wastage':'Closing Stock'}*`,`_${fmtKey(activeKey)}_`,'']; let gb=0,gp=0,gv=0; flowers.forEach(([fn,variants])=>{ let fl=[],fb=0,fp=0,fv=0; variants.forEach(v=>{ const b=parseInt(draft[fn+'||'+v+'||b'])||0,p=parseInt(draft[fn+'||'+v+'||p'])||0; if(b>0||p>0){const vv=isW?calcVal(fn,v,draft):0;fl.push(' • '+v+': '+(b>0?b+' bdl':'—')+' / '+(p>0?p+' pcs':'—')+(vv>0?' → '+fmtMoney(vv):''));fb+=b;fp+=p;fv+=vv;} }); if(fb>0||fp>0){lines.push('*'+fn+'* '+fb+' bdl / '+fp+' pcs'+(fv>0?' — '+fmtMoney(fv):''));fl.forEach(l=>lines.push(l));gb+=fb;gp+=fp;gv+=fv;} }); if(!gb&&!gp)return null; lines.push('');lines.push(`*Grand Total: ${gb.toLocaleString('en-IN')} bundles / ${gp.toLocaleString('en-IN')} pieces*`); if(isW&&gv>0)lines.push(`*Total wastage value: ${fmtMoney(gv)}*`); return lines.join('\n'); } document.getElementById('waBtnS').onclick=()=>{const msg=buildWA('stock');if(!msg){showToast('toastS','No entries yet');return;}window.open('https://wa.me/?text='+encodeURIComponent(msg),'_blank');}; document.getElementById('waBtnW').onclick=()=>{const msg=buildWA('wastage');if(!msg){showToast('toastW','No entries yet');return;}window.open('https://wa.me/?text='+encodeURIComponent(msg),'_blank');}; ['S','W'].forEach(s=>{ const m=s==='S'?'stock':'wastage'; document.getElementById('ht'+s).onclick=()=>{ const b=document.getElementById('hb'+s),btn=document.getElementById('ht'+s); if(b.style.display==='none'){b.style.display='block';btn.textContent='Hide history';renderHist(m);} else{b.style.display='none';btn.textContent='Show history';} }; }); function renderHist(m){ const isW=m==='wastage',body=document.getElementById(isW?'hbW':'hbS'); body.innerHTML=''; const keys=[]; for(let i=0;i{ const ds=k.replace('sp_'+m+'_',''); let data={};try{data=JSON.parse(localStorage.getItem(k)||'{}');}catch{} let tb=0,tp=0,tv=0; flowers.forEach(([fn,vs])=>vs.forEach(v=>{tb+=parseInt(data[fn+'||'+v+'||b'])||0;tp+=parseInt(data[fn+'||'+v+'||p'])||0;if(isW)tv+=calcVal(fn,v,data);})); if(!tb&&!tp)return;count++; const item=document.createElement('div');item.className='hist-item'; item.innerHTML=`
${fmtKey(ds)}${ds===activeKey?' ●':''}
Tap to load & edit
${tb.toLocaleString('en-IN')} bdl
${tp.toLocaleString('en-IN')} pcs
${isW&&tv>0?`
${fmtMoney(tv)}
`:''}
`; item.onclick=()=>loadDate(ds);card.appendChild(item); }); if(!count)card.innerHTML='
No past entries yet
'; body.appendChild(card); } loadDate(todayKey);