Holiday Shopping Budget Planner

Holiday Budget Setup

Recipients & Gift List

Add New Recipient & Gift Plan

Your Recipient Gift Plans

No recipients added yet.

Overall Budget: $0.00 | Total Budgeted for Gifts: $0.00 | Status: Awaiting setup...

Track Purchases

Purchase Log for Selected Recipient:

  • No purchases logged or no recipient selected.

Budget Overview & Summary

Overall Figures

Overall Holiday Budget: N/A

Total Budgeted for Gifts: N/A

Total Actually Spent: N/A

Remaining Budget / Overspend: N/A

Recipient Breakdown

No recipient data to summarize yet.

Difference: $${diff.toFixed(2)} ${diff >=0 ? '(Under)' : '(Over)'}

Gift Status: ${purchaseStatusSummary}

    ${r.purchases.map(p => `
  • ${p.giftName} ($${p.amount.toFixed(2)}) - ${p.status}
  • `).join('')}
`; holidayRecipientSummaryContainer.appendChild(div); }); } } // --- PDF Download --- if (holidayDownloadPdfBtn) holidayDownloadPdfBtn.addEventListener('click', () => { const pdfPrintEl = document.getElementById('holidayPdfPrintArea'); if (!pdfPrintEl) return; let pdfHtml = `

${holidayData.occasion || 'Holiday Shopping Plan'}

`; if (holidayData.userName) pdfHtml += `

For: ${holidayData.userName}

`; pdfHtml += `

Report Date: ${new Date().toLocaleDateString()}

`; pdfHtml += `

Overall Budget Summary

`; const overallBudget = holidayData.overallBudget; const totalBudgetedForGifts = holidayData.recipients.reduce((sum, r) => sum + r.budget, 0); let totalActualSpent = 0; holidayData.recipients.forEach(r => { totalActualSpent += r.purchases.reduce((sum, p) => sum + p.amount, 0); }); const remainingOrOverspend = overallBudget - totalActualSpent; pdfHtml += `

Overall Holiday Budget: $${overallBudget.toFixed(2)}

`; pdfHtml += `

Total Budgeted for Gifts: $${totalBudgetedForGifts.toFixed(2)}

`; pdfHtml += `

Total Actually Spent: $${totalActualSpent.toFixed(2)}

`; pdfHtml += `

Remaining / Overspend: $${remainingOrOverspend.toFixed(2)} ${remainingOrOverspend >= 0 ? '(Remaining)' : '(Overspent)'}

`; pdfHtml += `

Recipient Gift & Spending Details

`; if (holidayData.recipients.length > 0) { pdfHtml += ``; holidayData.recipients.forEach(r => { const spentOnRecipient = r.purchases.reduce((sum, p) => sum + p.amount, 0); const diff = r.budget - spentOnRecipient; let purchasesDetails = r.purchases.map(p => `${p.giftName} ($${p.amount.toFixed(2)}) - ${p.status}`).join('
'); if (!purchasesDetails) purchasesDetails = "No purchases logged."; pdfHtml += ``; }); pdfHtml += `
RecipientGift Idea(s)Budgeted ($)Actual Spent ($)Difference ($)Purchases & Status
${r.name} ${r.giftIdeas.replace(/\n/g, '
') || 'N/A'}
${r.budget.toFixed(2)} ${spentOnRecipient.toFixed(2)} ${diff.toFixed(2)} ${diff >=0 ? '' : '(Over)'} ${purchasesDetails}
`; } else { pdfHtml += `

No recipients planned.

`; } pdfPrintEl.innerHTML = pdfHtml; window.print(); pdfPrintEl.innerHTML = ''; }); // --- Initialization --- function setDefaultHolidayDates() { const today = new Date().toISOString().split('T')[0]; if (holidayPurchaseDateInput) holidayPurchaseDateInput.value = today; } updateHolidayTabDisplay(); setDefaultHolidayDates(); renderHolidayRecipients(); renderHolidaySummaryTab(); });
Scroll to Top