Email N8n invoice

by Paweł Niemczyk

JavaScript

// function buildInvoiceReport(data) {
//   const style = `
//     <style>
//       table{font-family:Arial,sans-serif;border-collapse:collapse;width:100%;margin-bottom:16px}
//       th,td{padding:4px 8px;border:1px solid #ddd;text-align:left}
//       th{background:#f7f7f7}
//       .ok{color:green;font-weight:bold}
//       .fail{color:red;font-weight:bold}
//     </style>`;

//   /* ---------- summary ---------- */
//   const elementsArr = [];
//   if (data.count.pdfs  > 0) elementsArr.push(`${data.count.pdfs} PDF${data.count.pdfs>1?'s':''}`);
//   if (data.count.images> 0) elementsArr.push(`${data.count.images} image${data.count.images>1?'s':''}`);

//   const totalsByCurrency = {};
//   let allOrigOk = true, allJsonOk = true;

//   data.items.forEach(it => {
//     const inv = it.source?.invoice || {};
//     const cur = inv.currency;
//     const tot = Number(inv.total) || 0;
//     if (cur) totalsByCurrency[cur] = (totalsByCurrency[cur]||0)+tot;
//     if (it.original_file_uploaded_successfully === false) allOrigOk = false;
//     if (it.invoice_json_uploaded_successfully   === false) allJsonOk = false;
//   });

//   let statusSummary, statusClass;
//   if (allOrigOk && allJsonOk) {
//     statusSummary = '✔ all uploaded'; statusClass='ok';
//   } else if (!allOrigOk && allJsonOk) {
//     statusSummary = '✖ some originals failed'; statusClass='fail';
//   } else if (allOrigOk && !allJsonOk) {
//     statusSummary = '✖ some JSONs failed'; statusClass='fail';
//   } else {
//     statusSummary = '✖ some originals & JSONs failed'; statusClass='fail';
//   }

//   const totalsRows = Object.entries(totalsByCurrency)
//     .map(([c,a])=>`<tr><th>Total</th><td>${a.toFixed(2)} ${c}</td></tr>`).join('');

//   const summaryTable = `
//     <table>
//       ${totalsRows}
//       <tr><th>Status</th><td class="${statusClass}">${statusSummary}</td></tr>
//       <tr><th>S3</th><td>Bucket: ${data.drop.bucket}<br>Path:...