The Report Studio framework, and nine reports built on it

Featurekamo-shared-library
Ya
2 Septemba 2026, 03:10 UTC
Mwandishi
Kamo
Ahadi ya
4307ec4

A report is now a Java class here and nothing anywhere else. ReportDefinition describes what a report is, what it may be asked, which columns it has and how each should be read; the frontend renders whatever that declares, so adding a report needs no endpoint, no page and no TypeScript. The pieces that carry the weight: - ReportCapability is why the frontend can be generic. A report that declares only FAVORITE and SCHEDULE gets no filter builder, no column manager and no grouping panel — ManagementOverviewReport exists partly as the canary for that. - ReportFormat is a descriptor, never a rendered string, so a currency in the table, the chart tooltip, the CSV and the PDF cannot disagree. - ReportSecurityScope comes from each report's OWN domain rights, never from a reporting right. A sales report widens on VIEW_ALL_LEADS exactly as the lead grid does, so reporting can never become a way around the security model. - ReportQuerySupport puts the scope predicate first, rejects an unknown column key instead of dropping it, and left-joins every association — an implicit join is an INNER one, and the rows with nothing on the other side are the ones somebody is looking for. - ReportAggregator keeps a null group as its own group, so subtotals still add up to the grand total. - Dates resolve in the MEMBER's timezone and are half open. At 03:30 UTC on 1 September a member in Los Angeles is still in August. Every report class carries @Component AND @ConditionalOnProperty. That is not decoration: every service scans com.kamo but declares its own explicit @EnableJpaRepositories list, so a bare @Component needing an EntityManager is constructed in all of them and CrashLoops the ones that cannot satisfy it. The property is set only in SecurityService, and ReportBeansAreConditionalTest fails the build if a report forgets it. Reports is an app (ServiceType id 32) with five rights (295-299). VIEW_REPORTS is the module door and grants no data by itself. The names VIEW_REPORTS and EXPORT_REPORTS existed at ids 1 and 2 until 2026-08-14, when they were removed along with the stub pages behind them; rights persist as getId(), so no grant made before then can resolve to these. PhiModule.REPORTING is PERMITTED — the engine reads in-cluster and stores no copy. Exporting and scheduling do leave the boundary and are governed by their own rights and by EMAIL.

Mabadiliko yote

Je, unaona nini kuhusu usafiri?

Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.

Kuwa Huru MileleMtazamo wa bei