interface InvoiceEmailTemplateProps { invoice: { invoiceNumber: string; issueDate: Date; dueDate: Date; status: string; totalAmount: number; taxRate: number; currency?: string | null; client: { name: string; email: string | null; }; business?: { name: string; nickname?: string | null; email?: string | null; phone?: string | null; addressLine1?: string | null; addressLine2?: string | null; city?: string | null; state?: string | null; postalCode?: string | null; country?: string | null; } | null; items: Array<{ date: Date; description: string; hours: number; rate: number; amount: number; }>; }; customContent?: string; customMessage?: string; userName?: string; userEmail?: string; baseUrl?: string; } export function generateInvoiceEmailTemplate({ invoice, customContent, customMessage, userName, userEmail, baseUrl: _baseUrl = "https://beenvoice.app", }: InvoiceEmailTemplateProps): { html: string; text: string } { const formatDate = (date: Date) => { return new Intl.DateTimeFormat("en-US", { year: "numeric", month: "long", day: "numeric", }).format(new Date(date)); }; const formatCurrency = (amount: number) => { return new Intl.NumberFormat("en-US", { style: "currency", currency: invoice.currency ?? "USD", }).format(amount); }; const getTimeOfDayGreeting = () => { const hour = new Date().getHours(); if (hour < 12) return "Good morning"; if (hour < 17) return "Good afternoon"; return "Good evening"; }; const subtotal = invoice.items.reduce((sum, item) => sum + item.amount, 0); const taxAmount = subtotal * (invoice.taxRate / 100); const total = subtotal + taxAmount; const businessAddress = invoice.business ? [ invoice.business.addressLine1, invoice.business.addressLine2, invoice.business.city && invoice.business.state ? `${invoice.business.city}, ${invoice.business.state} ${invoice.business.postalCode ?? ""}`.trim() : (invoice.business.city ?? invoice.business.state), invoice.business.country !== "United States" ? invoice.business.country : null, ] .filter(Boolean) .join("
") : ""; const html = ` Invoice ${invoice.invoiceNumber}
Invoice ${invoice.invoiceNumber}
From ${invoice.business?.name ?? "Your Business"}
${getTimeOfDayGreeting()},

I hope this email finds you well. Please find attached invoice #${invoice.invoiceNumber} for the services provided. The invoice details are summarized below for your reference.

${customMessage ? `
${customMessage}
` : ""}
${customContent ? `
${customContent}
` : ""}
#${invoice.invoiceNumber}
Issue Date: ${formatDate(invoice.issueDate)}
Due Date: ${formatDate(invoice.dueDate)}
Client ${invoice.client.name}
Subtotal ${formatCurrency(subtotal)}
${ invoice.taxRate > 0 ? `
Tax (${invoice.taxRate}%) ${formatCurrency(taxAmount)}
` : "" }
Total ${formatCurrency(total)}
PDF invoice attached: invoice-${invoice.invoiceNumber}.pdf
If you have any questions about this invoice, please don't hesitate to reach out. Thank you for your business!
${ !customContent ? `
${userName ?? invoice.business?.name ?? "Best regards"}
${userEmail ? `
${userEmail}
` : ""}
` : "" }
`; // Generate plain text version const text = ` ${getTimeOfDayGreeting()}, I hope this email finds you well. Please find attached invoice #${invoice.invoiceNumber} for the services provided.${ customMessage ? `\n\n${customMessage .replace(/<[^>]*>/g, "") .replace(/\s+/g, " ") .trim()}` : "" }${ customContent ? `\n\n${customContent .replace(/<[^>]*>/g, "") .replace(/\s+/g, " ") .trim()}` : "" } INVOICE DETAILS ═══════════════ Invoice Number: #${invoice.invoiceNumber} Issue Date: ${formatDate(invoice.issueDate)} Due Date: ${formatDate(invoice.dueDate)} Client: ${invoice.client.name} AMOUNT BREAKDOWN ═══════════════ Subtotal: ${formatCurrency(subtotal)}${ invoice.taxRate > 0 ? `\nTax (${invoice.taxRate}%): ${formatCurrency(taxAmount)}` : "" } Total: ${formatCurrency(total)} ATTACHMENT ═══════════════ PDF invoice attached: invoice-${invoice.invoiceNumber}.pdf If you have any questions about this invoice, please don't hesitate to reach out. Thank you for your business! ${userName ?? invoice.business?.name ?? "Best regards"}${ userEmail ? `\n${userEmail}` : "" } --- ${ invoice.business ? `${invoice.business.name}${invoice.business.email ? `\n${invoice.business.email}` : ""}${ invoice.business.phone ? `\n${invoice.business.phone}` : "" }${businessAddress ? `\n${businessAddress.replace(/
/g, "\n")}` : ""}` : "Professional invoicing for modern businesses" } `.trim(); return { html, text }; }