Smart Tiered Rewards System Generator

Smart Tiered Rewards System Generator

Define reward tiers and instantly check customer eligibility.

Check Customer Tier

Customer's Qualified Tier

Enter a value and click "Check Rewards" to see the result.

No qualifying tier found.

`; return; } resultsContainer.innerHTML = `

With ${points} points, the customer qualifies for:

${tier.name} Tier

Rewards:

    ${tier.rewards.split('\n').map(r => `
  • ${r}
  • `).join('')}
`; }; // --- CORE LOGIC --- const findTier = (points) => { const sortedTiers = [...rewardTiers].sort((a, b) => b.minPoints - a.minPoints); return sortedTiers.find(tier => points >= tier.minPoints) || null; }; const handleCheckTier = () => { const points = parseInt(document.getElementById('customer-points').value) || 0; renderTierResult(points); }; // --- UI & EVENT HANDLERS --- const switchTab = (tabId) => { currentTab = tabId; Object.values(tabPanes).forEach(pane => pane.classList.add('hidden')); tabPanes[tabId].classList.remove('hidden'); Object.values(tabButtons).forEach(btn => btn.classList.replace('tab-active', 'tab-inactive')); tabButtons[tabId].classList.replace('tab-inactive', 'tab-active'); updateNavButtons(); }; const navigateTabs = (direction) => { const currentIndex = tabs.indexOf(currentTab); const newIndex = direction === 'next' ? currentIndex + 1 : currentIndex - 1; if (newIndex >= 0 && newIndex < tabs.length) switchTab(tabs[newIndex]); }; const updateNavButtons = () => { const currentIndex = tabs.indexOf(currentTab); prevBtn.disabled = currentIndex === 0; nextBtn.disabled = currentIndex === tabs.length - 1; prevBtn.classList.toggle('opacity-50', prevBtn.disabled); nextBtn.classList.toggle('opacity-50', nextBtn.disabled); }; const handlePdfDownload = () => { const pdfRenderContainer = document.getElementById('pdf-render-content'); const sortedTiers = [...rewardTiers].sort((a, b) => a.minPoints - b.minPoints); let pdfHtml = `

Customer Rewards Program

${sortedTiers.map(tier => `

${tier.name} Tier

Requirement: ${tier.minPoints.toLocaleString()} points

Rewards:

    ${tier.rewards.split('\n').map(r => `
  • ${r}
  • `).join('')}
`).join('')}
`; pdfRenderContainer.innerHTML = pdfHtml; html2canvas(pdfRenderContainer, { scale: 2 }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(), margin = 40; const contentWidth = pdfWidth - margin * 2; const pdfHeight = (canvas.height * contentWidth) / canvas.width; pdf.addImage(imgData, 'PNG', margin, margin, contentWidth, pdfHeight); pdf.save('Rewards-Program.pdf'); }); }; // --- EVENT LISTENERS --- window.switchTab = switchTab; window.navigateTabs = navigateTabs; checkTierBtn.addEventListener('click', handleCheckTier); downloadPdfBtn.addEventListener('click', handlePdfDownload); addTierBtn.addEventListener('click', () => { rewardTiers.push({ id: nextId++, name: 'New Tier', minPoints: 0, rewards: '' }); renderConfigTiers(); }); configContainer.addEventListener('input', e => { if (!e.target.classList.contains('config-input')) return; const id = parseInt(e.target.closest('[data-id]').dataset.id); const prop = e.target.dataset.prop; const item = rewardTiers.find(t => t.id === id); if (item) item[prop] = e.target.type === 'number' ? parseInt(e.target.value) || 0 : e.target.value; }); configContainer.addEventListener('click', e => { if (!e.target.classList.contains('remove-tier-btn')) return; const idToRemove = parseInt(e.target.closest('[data-id]').dataset.id); rewardTiers = rewardTiers.filter(t => t.id !== idToRemove); renderConfigTiers(); }); // --- INITIALIZATION --- renderConfigTiers(); updateNavButtons(); switchTab('dashboard'); });
Scroll to Top