diff --git a/index.html b/index.html index 527d86e..eaa5dcd 100644 --- a/index.html +++ b/index.html @@ -557,14 +557,17 @@ async function generatePDF() { let pg, y; const receiptRefs = []; // { pageIdx, x, y, receiptKey } + let justBroke = false; function addPage(isFirst) { pg = doc.addPage([pageW, pageH]); pages.push(pg); y = pageH - M.top; + justBroke = true; if (!isFirst) drawContHeader(); } function needSpace(h) { + justBroke = false; if (y - h < M.bottom) { addPage(false); } } @@ -606,9 +609,9 @@ async function generatePDF() { const col2 = W * 0.5; const col3 = W * 0.8; - pg.drawText('Staff', {x:M.left, y, size:szSm, font:fontBold, color:gray}); - pg.drawText('Period', {x:M.left+col2, y, size:szSm, font:fontBold, color:gray}); - pg.drawText('Currency', {x:M.left+col3, y, size:szSm, font:fontBold, color:gray}); + pg.drawText('Staff', {x:M.left, y, size:szSm-1, font:fontBold, color:gray}); + pg.drawText('Period', {x:M.left+col2, y, size:szSm-1, font:fontBold, color:gray}); + pg.drawText('Currency', {x:M.left+col3, y, size:szSm-1, font:fontBold, color:gray}); y -= lh; pg.drawText(state.staff, {x:M.left, y, size:sz, font:fontBody, color:black}); pg.drawText(`${formatDate(state.periodFrom)} to ${formatDate(state.periodTo)}`, {x:M.left+col2, y, size:sz, font:fontBody, color:black}); @@ -632,8 +635,13 @@ async function generatePDF() { y -= lh + 4; // Lines - item.lines.forEach(ln => { - needSpace(lh * 5); + item.lines.forEach((ln, li) => { + needSpace(lh * 7); + if (li > 0 && !justBroke) { + y -= 4; + pg.drawLine({start:{x:M.left,y}, end:{x:M.left+W,y}, thickness:0.3, color:lineCol}); + y -= 8; + } const c1=0, c2=W*0.18, c3=W*0.6, c4=W*0.78; const r2v=0, r2r=W*0.6, r2a=W*0.78; @@ -648,7 +656,8 @@ async function generatePDF() { pg.drawText(truncate(ln.vendor, fontBody, sz, (c3-c2)-8), {x:M.left+c2, y, size:sz, font:fontBody, color:black}); pg.drawText(ln.currency, {x:M.left+c3, y, size:sz, font:fontBody, color:black}); const fxStr = ln.currency === baseCur ? '–' : parseFloat(ln.fxRate).toFixed(5); - pg.drawText(fxStr, {x:M.left+c4, y, size:sz, font:fontMono, color:black}); + const fxW = fontBody.widthOfTextAtSize(fxStr, sz); + pg.drawText(fxStr, {x:M.left+W-fxW, y, size:sz, font:fontBody, color:black}); y -= lh + 2; // Row 2 labels @@ -660,8 +669,8 @@ async function generatePDF() { pg.drawText(truncate(ln.description, fontBody, sz, (r2r-r2v)-8), {x:M.left+r2v, y, size:sz, font:fontBody, color:black}); pg.drawText(ln.hasReceipt ? 'Yes' : 'No', {x:M.left+r2r, y, size:sz, font:fontBody, color:black}); const amtStr = `${ln.currency} ${fmtAmt(ln.amount)}`; - const amtW = fontMono.widthOfTextAtSize(amtStr, sz); - pg.drawText(amtStr, {x:M.left+W-amtW, y, size:sz, font:fontMono, color:black}); + const amtW = fontBody.widthOfTextAtSize(amtStr, sz); + pg.drawText(amtStr, {x:M.left+W-amtW, y, size:sz, font:fontBody, color:black}); y -= lh + 2; // Row 3 labels @@ -683,7 +692,7 @@ async function generatePDF() { }); } else if (!ln.hasReceipt) { needSpace(lh * 2); - pg.drawText('Explanation:', {x:M.left, y, size:szSm, font:fontBold, color:gray}); + pg.drawText('Explanation:', {x:M.left, y, size:szSm-1, font:fontBold, color:gray}); y -= lh; const explLines = wrapText(ln.noReceiptExplanation || '–', fontBody, sz, W); explLines.forEach(line => { @@ -692,22 +701,14 @@ async function generatePDF() { y -= lh; }); } - y -= 4; - // Light divider between lines - pg.drawLine({start:{x:M.left,y}, end:{x:M.left+W,y}, thickness:0.3, color:lineCol}); - y -= 8; + y -= 6; }); - // Item divider - pg.drawLine({start:{x:M.left,y}, end:{x:M.left+W,y}, thickness:1, color:accent}); - y -= lh; }); // Grand total needSpace(lh * 2); - pg.drawLine({start:{x:M.left,y}, end:{x:M.left+W,y}, thickness:1.5, color:accent}); - y -= 4; - pg.drawLine({start:{x:M.left,y}, end:{x:M.left+W,y}, thickness:1.5, color:accent}); + pg.drawLine({start:{x:M.left,y}, end:{x:M.left+W,y}, thickness:3, color:accent}); y -= lh; const gtStr = `Total reimbursement claim: ${baseCur} ${fmtAmt(state._grandTotal)}`; const gtW = fontBold.widthOfTextAtSize(gtStr, sz + 2); @@ -778,8 +779,8 @@ async function generatePDF() { pages.forEach((p, i) => { const fy = M.bottom - 30; p.drawLine({start:{x:M.left, y:fy+18}, end:{x:M.left+W, y:fy+18}, thickness:0.5, color:lineCol}); - const footLeft = CFG.footer || 'Reimbursement form'; - p.drawText(footLeft, {x:M.left, y:fy, size:szSm-1, font:fontBody, color:gray}); + p.drawText('Reimbursement form', {x:M.left, y:fy, size:szSm-1, font:fontBody, color:gray}); + p.drawText(state.staff, {x:M.left, y:fy-lh+2, size:szSm-1, font:fontBody, color:gray}); const pgStr = `Page ${i+1}/${totalPages}`; const pgW2 = fontBody.widthOfTextAtSize(pgStr, szSm-1); p.drawText(pgStr, {x:M.left+W-pgW2, y:fy, size:szSm-1, font:fontBody, color:gray});