The attendance summary called a path that does not exist

FixSecurityService
Shipped
August 12, 2026 at 5:43 PM UTC
Author
Kamo
Commit
7ac577d

summarize() asked TimecardService for **************** That is the name of the SecurityService MAPPING, not of any downstream route. TimecardService has no such path, TimecardServiceClient hands a 404 back as a ResponseEntity instead of throwing, and read() nulled any non-2xx without a word in the log. So awaitingApproval sat at 0 forever, the approval queue rendered "Every timecard is clear.", and timecardState was never set on any member, which made the matrix's 'open' state unreachable. A dead call rendered as good news. Even the correct manager-queue relay would be wrong here: it answers "timecards submitted to ME" and an HR report needs the org's total. Now reads the org-wide close-readiness relay, verified against TimecardService's own **************** GET **************** -> { periodStart, periodEnd, total, ready, blocking: [ { memberId, state } ] } currentPeriod is computed first and reused for both the DTO and the query. No period means no call and no invented approvals. awaitingApproval counts the SUBMITTED subset; OPEN blocks a close but is still the member's own to finish. Reading it under MANAGE_TIMECARDS is not a widened gate: this calls the downstream relay, and what is exposed is a count and a per-member state for an org whose full roster and every open exception the same caller already receives from the same endpoint. No finalize action is reachable here. Two things underneath it: - Per-member blockingExceptions came from the roster's `openExceptions`, which RosterService fills with resolved.unresolved().size() — unresolved punch INTERVALS, nothing to do with isBlocking. The matrix painted members red for exceptions that block nothing and contradicted the pillar beside it. It now comes from the same rows and the same getIsBlocking() filter as the org-level figure, so the per-member counts sum to it. - read() logs at WARN with the status and the path on every degradation. The 404 that broke this feature was completely invisible, and that must not recur.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing