fix(pdf): Überweisungs-QR-Code überdeckt keine Positionen und Summen mehr
Reichen Positionen oder Summen auf der letzten Seite in den Bereich des QR-Codes, wird er auf einer eigenen Folgeseite gedruckt. Die MCP-Vorschau meldet das und schlägt einen früheren Seitenumbruch vor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -49,24 +49,25 @@ export function analyzeOutgoingDocumentLayout(layout: InvoicePdfLayout, maxConte
|
||||
if (last?.mode === "title" && page.page < layout.pageCount) {
|
||||
warnings.push({ type: "orphanTitle", page: page.page, message: `Überschrift ${last.pos || last.index + 1} steht allein am Seitenende.`, insertPagebreakBeforeIndex: last.index })
|
||||
}
|
||||
if (!page.rows.length && page.page > 1 && !blocks.some((block) => block.page === page.page)) {
|
||||
if (!page.rows.length && page.page > 1 && page.page !== layout.paymentQr?.page && !blocks.some((block) => block.page === page.page)) {
|
||||
warnings.push({ type: "emptyPage", page: page.page, message: "Die Seite ist leer, vermutlich durch doppelte oder abschließende Seitenumbrüche." })
|
||||
}
|
||||
}
|
||||
|
||||
// The payment QR code is drawn at a fixed spot on the last page, right next to the amount column.
|
||||
// The renderer moves the payment QR code to an extra page when the amounts reach its spot.
|
||||
const qr = layout.paymentQr
|
||||
if (qr) {
|
||||
const covered = layout.rows.find((row) => row.page === qr.page && row.mode !== "pagebreak" && row.bottomMm > qr.topMm)
|
||||
const totalsCovered = layout.totals?.page === qr.page && layout.totals.bottomMm > qr.topMm
|
||||
if (covered || totalsCovered) {
|
||||
warnings.push({
|
||||
type: "paymentQrOverlap",
|
||||
page: qr.page,
|
||||
message: `Der Überweisungs-QR-Code (ab ${round(qr.topMm)} mm, rechts) überdeckt ${covered ? `Position ${covered.pos || covered.index + 1}` : "den Summenblock"}. Positionen und Summen auf der letzten Seite müssen oberhalb enden.`,
|
||||
insertPagebreakBeforeIndex: covered && covered.index > 0 ? covered.index : layout.rows.length,
|
||||
})
|
||||
}
|
||||
const qrAlone = qr && !blocks.some((block) => block.page === qr.page)
|
||||
if (qr && qrAlone) {
|
||||
const previous = pages[qr.page - 2]
|
||||
const reaching = previous?.rows.find((row) => row.bottomMm > qr.topMm)
|
||||
let before = reaching ? previous.rows.indexOf(reaching) : -1
|
||||
while (before > 0 && previous.rows[before - 1].mode === "title") before -= 1
|
||||
warnings.push({
|
||||
type: "paymentQrOwnPage",
|
||||
page: qr.page,
|
||||
message: `Der Überweisungs-QR-Code steht allein auf Seite ${qr.page}, weil Positionen oder Summen auf Seite ${qr.page - 1} tiefer als ${round(qr.topMm)} mm reichen. Ein früherer Seitenumbruch hält ihn bei den Summen.`,
|
||||
insertPagebreakBeforeIndex: before > 0 ? previous.rows[before].index : layout.rows.length,
|
||||
})
|
||||
}
|
||||
|
||||
for (const [name, block] of [["Summenblock", layout.totals], ["Schlusstext", layout.endText]] as const) {
|
||||
|
||||
Reference in New Issue
Block a user