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('')}
${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 += `| Recipient | Gift 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} |
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(); });