Refund Policy Generator

Refund Policy Generator

Refund Policy Generator

Review the legally-formatted refund policy generated from your configuration parameters below. The policy is ready for publication.

The following items are exempt from refunds:

    ${data.exclusions.map((e, i) => `
  • ${rpg_escapeHTML(e.item)}
  • `).join('') || '
  • No items are explicitly excluded from this policy.
  • '}

4. Shipping Costs for Returns

${shippingClause}

Original shipping costs are generally non-refundable unless the return is due to a verifiable error by ${rpg_escapeHTML(company)}.

5. Refund Processing

Once your return is received and inspected, we will send you an email to notify you of the approval or rejection of your refund. If approved, your refund will be processed, and a credit will automatically be applied to your original method of payment within 7-10 business days.

`; } function rpg_renderDashboard(targetDiv = rpg_dashboardOutput, isPDF = false) { if (!targetDiv) return; const policyHTML = rpg_generatePolicyText(rpg_data); targetDiv.innerHTML = policyHTML; } function rpg_renderPdfClone() { rpg_pdfRenderClone.innerHTML = `
${rpg_generatePolicyText(rpg_data)}
`; } /** * Generates and downloads a PDF of the policy */ async function rpg_downloadPDF() { if (!rpg_data.companyName) { alert("Please enter a company name before downloading."); return; } if (typeof jspdf === 'undefined' || typeof html2canvas === 'undefined') { alert("Error: PDF libraries failed to load."); return; } rpg_renderPdfClone(); const { jsPDF } = window.jspdf; try { // Target the clone div const contentDiv = rpg_pdfRenderClone.querySelector('.pdf-content'); if (!contentDiv) return; const canvas = await html2canvas(contentDiv, { scale: 1.5, useCORS: true, windowWidth: contentDiv.scrollWidth, windowHeight: contentDiv.scrollHeight }); const imgData = canvas.toDataURL('image/png'); const imgProps = { width: canvas.width, height: canvas.height }; const pdf = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const margin = 40; const contentWidth = pdfWidth - (margin * 2); const contentHeight = (contentWidth * imgProps.height) / imgProps.width; let heightLeft = contentHeight; let position = 0; pdf.addImage(imgData, 'PNG', margin, position + margin, contentWidth, contentHeight); heightLeft -= (pdfHeight - margin * 2); while (heightLeft > 0) { position -= (pdfHeight - margin * 2); pdf.addPage(); pdf.addImage(imgData, 'PNG', margin, position + margin, contentWidth, contentHeight); heightLeft -= (pdfHeight - margin * 2); } const safeName = (rpg_data.companyName || 'refund_policy').replace(/[^a-z0-9]/gi, '_').toLowerCase(); pdf.save(`${safeName}_Refund_Policy.pdf`); } catch (error) { console.error("PDF generation failed:", error); alert("An error occurred while generating the PDF."); } } // --- EVENT LISTENERS --- // Tab link clicks rpg_tabLinks.forEach((link, index) => { link.addEventListener('click', () => rpg_switchTab(index)); }); // Next/Prev button clicks if (rpg_prevButton) { rpg_prevButton.addEventListener('click', () => { if (rpg_currentTab > 0) rpg_switchTab(rpg_currentTab - 1); }); } if (rpg_nextButton) { rpg_nextButton.addEventListener('click', () => { if (rpg_currentTab === rpg_tabLinks.length - 1) { rpg_updateDataFromConfig(); rpg_switchTab(0); } else { if (rpg_currentTab < rpg_tabLinks.length - 1) rpg_switchTab(rpg_currentTab + 1); } }); } // PDF download if (rpg_downloadPdfButton) { rpg_downloadPdfButton.addEventListener('click', rpg_downloadPDF); } // --- Config Tab Listeners --- if (rpg_addExclusionButton) { rpg_addExclusionButton.addEventListener('click', () => { rpg_exclusionsContainer.appendChild(rpg_createExclusionInput()); }); } if (rpg_configTab) { // Handle remove rpg_configTab.addEventListener('click', (e) => { const removeButton = e.target.closest('.rpg-remove-item'); if (removeButton) { removeButton.closest('.flex[data-id]').remove(); } }); } // --- INITIALIZATION --- rpg_renderConfig(); rpg_renderDashboard(); // Set initial tab state rpg_tabPanes.forEach((pane, index) => { pane.classList.toggle('hidden', index !== 0); pane.classList.toggle('rpg-active', index === 0); }); rpg_tabLinks.forEach((link, index) => { TAB_CLASSES.active.forEach(cls => link.classList.remove(cls)); TAB_CLASSES.inactive.forEach(cls => link.classList.remove(cls)); if (index === 0) { TAB_CLASSES.active.forEach(cls => link.classList.add(cls)); } else { TAB_CLASSES.inactive.forEach(cls => link.classList.add(cls)); } }); });
Scroll to Top