Skip to content

v4.48.0 - #863

Merged
rzueger merged 2 commits into
masterfrom
develop
Aug 24, 2026
Merged

v4.48.0#863
rzueger merged 2 commits into
masterfrom
develop

Conversation

@rzueger

@rzueger rzueger commented Aug 24, 2026

Copy link
Copy Markdown
Member

No description provided.

claude added 2 commits August 24, 2026 18:38
The invoice recipient report was PDF only, so the figures could not
be filtered, corrected or re-summed without retyping them. A format
dropdown in the export form now offers Excel alongside the PDF.

The workbook mirrors the PDF layout with one worksheet per recipient,
but writes amounts as real numbers and every totals row as a SUM
formula. Each formula also carries its computed result as a cached
value: tools that do not evaluate formulas, such as pandas reading
via openpyxl, otherwise see those cells as empty. Recipient names are
user-controlled, so worksheet names are sanitised against exceljs's
rules: forbidden characters, the 31-char cap, case-insensitive
collisions, the reserved name "History", and edge quotes exceljs
rejects. Non-finite amounts are written as empty cells rather than
NaN, which Excel would otherwise report as a corrupt workbook.

Data loading and recipient grouping move to InvoicesReportData, which
both report formats extend, so the two always show the same rows in
the same order. InvoicesReport.spec.ts is unchanged and covers the
refactor.

Generation failures now propagate instead of being swallowed: the
saga clears the in-progress flag in a finally block (fixing the same
gap in the pre-existing PDF path), so a failed report cannot leave
the form stuck disabled with nothing shown.

exceljs is reached through a dynamic import kept in its own module,
so its ~1MB bundle lands in a separate chunk that is only fetched
when a report is generated, and is excluded from the service worker's
precache manifest so it isn't downloaded on install either.

InvoicesExcelReport.ts is at 100% statement/branch/function/line
coverage; the wiring in InvoicesReportData.collect(), the saga's
format branching, and the format parameter's round trip through the
container and form are each covered directly rather than simulated.
The export page section was labelled "Rechnungsberichte herunterladen
(PDF)" / "Download invoice reports (PDF)", which became inaccurate
once the report form gained an Excel option alongside PDF.
@rzueger
rzueger merged commit 7e3f402 into master Aug 24, 2026
4 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants