export const templates = { invoice: { name: "Invoice", description: "Professional invoice with line items, taxes, and payment details", fields: [ { name: "invoiceNumber", type: "string", required: true, description: "Invoice number" }, { name: "date", type: "string", required: true, description: "Invoice date (YYYY-MM-DD)" }, { name: "dueDate", type: "string", required: false, description: "Due date" }, { name: "from", type: "object", required: true, description: "Sender: {name, address?, email?, phone?, vatId?}" }, { name: "to", type: "object", required: true, description: "Recipient: {name, address?, email?, vatId?}" }, { name: "items", type: "array", required: true, description: "Line items: [{description, quantity, unitPrice, taxRate?}]" }, { name: "currency", type: "string", required: false, description: "Currency symbol (default: €)" }, { name: "notes", type: "string", required: false, description: "Additional notes" }, { name: "paymentDetails", type: "string", required: false, description: "Bank/payment info" }, ], render: renderInvoice, }, receipt: { name: "Receipt", description: "Simple receipt for payments received", fields: [ { name: "receiptNumber", type: "string", required: true, description: "Receipt number" }, { name: "date", type: "string", required: true, description: "Date" }, { name: "from", type: "object", required: true, description: "Business: {name, address?}" }, { name: "to", type: "object", required: false, description: "Customer: {name, email?}" }, { name: "items", type: "array", required: true, description: "Items: [{description, amount}]" }, { name: "currency", type: "string", required: false, description: "Currency symbol" }, { name: "paymentMethod", type: "string", required: false, description: "Payment method" }, ], render: renderReceipt, }, }; function esc(s) { return String(s || "") .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } function renderInvoice(d) { const cur = esc(d.currency || "€"); const items = d.items || []; let subtotal = 0; let totalTax = 0; const rows = items .map((item) => { const qty = Number(item.quantity) || 1; const price = Number(item.unitPrice) || 0; const taxRate = Number(item.taxRate) || 0; const lineTotal = qty * price; const lineTax = lineTotal * (taxRate / 100); subtotal += lineTotal; totalTax += lineTax; return ` ${esc(item.description)} ${qty} ${cur}${price.toFixed(2)} ${taxRate}% ${cur}${lineTotal.toFixed(2)} `; }) .join(""); const total = subtotal + totalTax; const from = d.from || {}; const to = d.to || {}; return `

INVOICE

#${esc(d.invoiceNumber)}
Date: ${esc(d.date)}
${d.dueDate ? `
Due: ${esc(d.dueDate)}
` : ""}

From

${esc(from.name)}

${from.address ? `

${esc(from.address).replace(/\n/g, "
")}

` : ""} ${from.email ? `

${esc(from.email)}

` : ""} ${from.vatId ? `

VAT: ${esc(from.vatId)}

` : ""}

To

${esc(to.name)}

${to.address ? `

${esc(to.address).replace(/\n/g, "
")}

` : ""} ${to.email ? `

${esc(to.email)}

` : ""} ${to.vatId ? `

VAT: ${esc(to.vatId)}

` : ""}
${rows}
DescriptionQtyPriceTaxTotal
Subtotal: ${cur}${subtotal.toFixed(2)}
Tax: ${cur}${totalTax.toFixed(2)}
Total: ${cur}${total.toFixed(2)}
${d.paymentDetails ? `` : ""} ${d.notes ? `` : ""} `; } function renderReceipt(d) { const cur = esc(d.currency || "€"); const items = d.items || []; let total = 0; const rows = items .map((item) => { const amount = Number(item.amount) || 0; total += amount; return `${esc(item.description)}${cur}${amount.toFixed(2)}`; }) .join(""); const from = d.from || {}; const to = d.to || {}; return `

${esc(from.name)}

${from.address ? `
${esc(from.address)}
` : ""}
Receipt #${esc(d.receiptNumber)}
Date: ${esc(d.date)}
${to?.name ? `
Customer: ${esc(to.name)}
` : ""}
${rows}

TOTAL${cur}${total.toFixed(2)}
${d.paymentMethod ? `
Paid via: ${esc(d.paymentMethod)}
` : ""}
Thank you!
`; } export function renderTemplate(id, data) { const template = templates[id]; if (!template) throw new Error(`Template '${id}' not found`); return template.render(data); }