Release Notes — March 7, 2026
This release delivers a comprehensive overhaul of the Reports & Analytics module: Excel and XML export formats, report history retention, stat card redesign, PDF layout improvements, and multiple UX fixes.
Reports & Analytics — Major Update
Excel Export (PRO+)
Reports can now be exported to Excel (.xlsx) using a professionally formatted two-sheet workbook.
Workbook structure:
- Summary sheet — report metadata, key metrics, filter context
- Data sheet — dynamic columns (billable, revenue if applicable), styled table with frozen header, auto-filter, alternating row colors
Available from:
- Reports page → Export menu → Download Excel
- Saved report → Report Preview → Excel button
- Scheduled reports → format selection → Excel
Tier: PRO+ (FREE tier sees a PRO chip — Excel not available)
XML Export (ENTERPRISE)
Time tracking data can now be exported as structured XML documents.
XML document structure:
<?xml version="1.0" encoding="UTF-8"?>
<report>
<meta>...</meta>
<filters>...</filters>
<metrics>...</metrics>
<dataPoints>
<entry>...</entry>
</dataPoints>
</report>
Tier: ENTERPRISE only (FREE/PRO see an ENTERPRISE chip)
JSON File Export (ENTERPRISE)
In addition to the existing inline JSON API response, reports can now be downloaded as a standalone JSON file (.json) with Content-Disposition: attachment.
Tier: ENTERPRISE only
Report History Retention
Saved reports are now filtered based on subscription tier:
| Tier | Visible history |
|---|---|
| FREE | Last 30 days |
| PRO | Last 365 days |
| ENTERPRISE | Unlimited |
An info banner on the Reports page notifies FREE and PRO users of their history window, with an upgrade prompt for FREE users.
A nightly cleanup job (runs at 02:00) automatically removes reports older than the tier limit to keep the database clean.
Group By: User (PRO+)
A new "By User" grouping option is now available on the Reports page. It replaces the old reportType (summary / detailed / export) selector, which was redundant.
The User grouping option is disabled with a PRO chip for FREE users.
All 5 locales (EN / HU / DE / FR / ES) include the new translation key.
Stats Cards & Quick Insights — Visibility Fix
The 4 stat cards (Total Hours, Total Entries, Active Projects, Avg. per Day) and the Quick Insights section were not appearing when the Reports page loaded.
Root cause: currentUnit?.id was missing from the useEffect dependency array. On mount, currentUnit was null, causing the report generation to short-circuit before the workspace loaded.
Fixed in: AdvancedReports.tsx and BasicReports.tsx
Report Preview — Redesigned Layout
The Report Preview page now matches the main Reports page layout:
- 4 stat cards — Total Hours / Total Entries / Active Projects / Avg. per Day
- Quick Insights — Top 3 projects · Most Active Day · Peak Hours · Avg. Entry Duration
- Followed by: Report Info → Chart → Data Table
Both statistics and insights are computed with useMemo for performance.
PDF Export — Redesigned Layout
The PDF output now matches the frontend report layout:
addMetrics() — rewritten:
- 4 colored stat cards with left-side accent bar
- Compact sizing:
boxH = 52(was 72),fontSize = 18(was 22), tight spacing
addQuickInsights() — new section:
- Top 3 projects + Most Active Day + Peak Hours + Avg. Entry Duration
- Absolute X/Y positioning per element — eliminates text overflow bugs
- Label truncation at 17 characters
Chart fix:
- Reports saved with
chartType = 'table'previously produced no chart in the PDF - Now falls back to
barchart; chart is skipped only when there is no data
Save as Report — Correct Chart Type
When saving an ad-hoc report as a custom report, the chartConfig.type field now correctly reflects the currently active view:
- Chart view active → saves as
BAR - Table view active → saves as
TABLE
Previously, TABLE was always hardcoded regardless of the view.
Stat Card — Compact Layout
The stat cards in both the Reports page and Report Preview page are now more compact:
| Property | Before | After |
|---|---|---|
| Card padding | default (16 px) | py: 1.5 |
| Icon box | 48 × 48 | 40 × 40 |
| Number variant | h4 | h5 |
| Line height | default | 1.2 (number + labels) |
"Run Now" Notification — Moved to Top-Right
The "Report executed and sent to N recipient(s)" toast previously appeared at the bottom-center of the screen (inconsistent with all other notifications).
It now uses the global notification utility and appears in the top-right corner, consistent with all other in-app notifications.
Security & Tier Enforcement
Scheduled Reports — Backend Gate
The createReport and updateReport endpoints now enforce the tier check for schedule.enabled at the API level:
- FREE users cannot enable scheduling via the API (previously only blocked in the UI)
- Returns
403 TIER_RESTRICTIONwithtierRequired: 'pro'
PRO customReports Capability Fix
customReports was incorrectly set to false in the PRO tier configuration in stripe.config.ts. This has been corrected to true (PRO: max 5 custom reports, ENTERPRISE: unlimited).
Dependencies
| Package | Change |
|---|---|
exceljs | Added (Excel generation) |
Files Changed
| File | Change |
|---|---|
cadensa-backend/src/controllers/report.controller.ts | Excel / JSON / XML download endpoints; scheduled reports tier gate; report history cutoff filter |
cadensa-backend/src/services/report/excel.service.ts | New — Excel generation with exceljs |
cadensa-backend/src/services/report/xml.service.ts | New — XML generation |
cadensa-backend/src/services/report/pdf.service.ts | addMetrics() rewrite; addQuickInsights() new; addChartPlaceholder() table→bar fallback |
cadensa-backend/src/services/report/schedule.service.ts | Excel format branch; nightly history cleanup cron |
cadensa-backend/src/config/stripe.config.ts | PRO customReports: false → true fix |
cadensa-frontend/src/pages/reports/components/AdvancedReports.tsx | currentUnit?.id dep fix; history banner; groupBy: user; stat card compact; viewMode-based chart type; notification.* for Run Now |
cadensa-frontend/src/pages/reports/components/BasicReports.tsx | currentUnit?.id dep fix |
cadensa-frontend/src/pages/reports/ReportPreview.tsx | Redesigned layout: stat cards + Quick Insights; PDF/Excel/XML/JSON buttons |
cadensa-frontend/src/services/report.service.ts | downloadReportExcel, downloadReportJSON, downloadAdHocReportJSON, downloadReportXML, downloadAdHocReportXML |
cadensa-frontend/src/locales/{en,hu,de,fr,es}/reports.json | xml, xmlFailed, jsonRequiresEnterprise, xmlRequiresEnterprise, groupBy_user keys |