Skip to main content

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:

TierVisible history
FREELast 30 days
PROLast 365 days
ENTERPRISEUnlimited

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 bar chart; 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:

PropertyBeforeAfter
Card paddingdefault (16 px)py: 1.5
Icon box48 × 4840 × 40
Number varianth4h5
Line heightdefault1.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_RESTRICTION with tierRequired: '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

PackageChange
exceljsAdded (Excel generation)

Files Changed

FileChange
cadensa-backend/src/controllers/report.controller.tsExcel / JSON / XML download endpoints; scheduled reports tier gate; report history cutoff filter
cadensa-backend/src/services/report/excel.service.tsNew — Excel generation with exceljs
cadensa-backend/src/services/report/xml.service.tsNew — XML generation
cadensa-backend/src/services/report/pdf.service.tsaddMetrics() rewrite; addQuickInsights() new; addChartPlaceholder() table→bar fallback
cadensa-backend/src/services/report/schedule.service.tsExcel format branch; nightly history cleanup cron
cadensa-backend/src/config/stripe.config.tsPRO customReports: false → true fix
cadensa-frontend/src/pages/reports/components/AdvancedReports.tsxcurrentUnit?.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.tsxcurrentUnit?.id dep fix
cadensa-frontend/src/pages/reports/ReportPreview.tsxRedesigned layout: stat cards + Quick Insights; PDF/Excel/XML/JSON buttons
cadensa-frontend/src/services/report.service.tsdownloadReportExcel, downloadReportJSON, downloadAdHocReportJSON, downloadReportXML, downloadAdHocReportXML
cadensa-frontend/src/locales/{en,hu,de,fr,es}/reports.jsonxml, xmlFailed, jsonRequiresEnterprise, xmlRequiresEnterprise, groupBy_user keys