Radon chart out of sync after inspector reassignment

Objective

  • Keep the radon equipment chart (/tools/radon) accurate when radon-related calendar events are moved to a different inspector or corrected after the fact.
  • Align chart totals per inspector with the underlying radon events (and with the calendar radon overlay where both are used).
  • Reduce manual rework (e.g. resetting many events) when inspector assignment or historical baselines drift.

Background

  • Operations reported that the radon chart does not reflect events moved from one inspector row to another on the calendar; after correcting ~15 events manually, aggregate counts still did not match the event list—suggesting a disconnect between chart math and stored events.
  • The chart is not directly editable: cell values are computed from (1) yesterday’s ending counts per inspector (RadonEnds), plus (2) radon events in the date window (event.radon.number, including equipment-derived radon), bucketed by current event._inspectorId.
  • Calendar save (ChangedEventIndicatorPATCH event/:id) should persist a new _inspectorId, but the radon chart page does not auto-refresh after calendar saves (only after Equipment Transfer on the radon page).
  • Radon data (/tools/radon/data) lists the same events grouped by job/inspection, not by inspector row—so it is normal for it to look different from the chart even when data is correct.
  • Job-level inspector changes with “reassign events” only move incomplete future events (endtime > now in attik-backend/src/routes/inspection.ts); past radon pickups stay on the original inspector until moved on the calendar.
  • Until a fix ships, teams can correct totals via Settings → Radon ending numbers, Equipment Transfer, and calendar drag + save + chart refresh (see internal ops note in team channel).
  • Original report: Slack message

Scope

Backend

  • Chart data is built in attik-backend/src/routes/radon.ts (GET /radon/radon-chart-data): loads legacy radon events and equipment-derived radon via findRadonEquipmentEventsForDateRange / mergeLegacyAndEquipmentRadonEvents in attik-backend/src/util/functions/radon/radonEquipmentBridge.ts, seeds each inspector from RadonEnds, then buckets by strict data._inspectorId === insp._id.toString() and dayjs time slots.
  • Ending-number CRUD lives on the same router (GET/PATCH /radon/ends/:id); nightly rollup uses updateRadonEndsFromYesterday in radon.ts.
  • Event updates use attik-backend/src/routes/event.ts (PATCH /event/:id); _inspectorId on attik-backend/src/models/eventSchema.ts is a string.
  • Calendar API radon overlay uses attik-backend/src/routes/calendar.ts with enrichCalendarEventsWithEquipmentRadon and synthetic radonEnds for future dates.
  • Decision needed: Normalize inspector matching and time-slot generation (chart uses strict equality and server dayjs() for slots while dateCheck uses company TZDayjs for the query window).

Frontend

  • Radon chart UI: attik-frontend/src/app/tools/radon/RadonChartBase.tsx (fetches radon/radon-chart-data), RadonContext.tsx (refreshChart / setRefreshChart), read-only cells in RadonCell.tsx.
  • Equipment Transfer (creates transfer events, refreshes chart): attik-frontend/src/app/tools/radon/CalibrationModel.tsx, opened from CornerMenuWrapper.tsx (?calibration=new).
  • Ending number edits (baseline per inspector/date): attik-frontend/src/app/tools/settings/radon/EndEditting.tsxPATCH radon/ends/:id, embedded in RadonSettingsForm.tsx at /settings/radon.
  • Event audit / transfer cleanup: attik-frontend/src/app/tools/radon/data/page.tsx, EventGroup.tsx (delete some transfer rows).
  • Calendar reassignment: attik-frontend/src/components/calendar/handleChangeEventFn.tsx, EnhancedDragHandler.tsx, replaceEventsWithChangedEvents.ts, save via ChangedEventIndicator.tsx; radon row counts in CalendarRowGrid.tsx use cal._inspectorId.includes(employeeId) (looser than chart ===).
  • Decision needed: Refresh chart after calendar event save; ensure calendar PATCH always sends _inspectorId as a string (drag handlers can produce a single-element array).

Out of scope (unless expanded)

  • Client portal, mobile.
  • Replacing the cumulative chart model with direct cell editing (product change).

Acceptance criteria

  1. After moving a radon event to another inspector on the calendar and saving, the event appears on the correct inspector row on /tools/radon without requiring a full browser cache clear (refresh or automatic re-fetch is acceptable).
  2. Chart totals for a test inspector match the sum of that inspector’s radon events (plus configured transfers/ends) for the same window used by /tools/radon/data.
  3. Inspector matching and time buckets behave consistently in company timezone.
  4. Documented ops path remains valid until release (ending numbers + equipment transfer + calendar reassignment).

References

  • Slack — original report
  • attik-backend/src/routes/radon.ts
  • attik-backend/src/util/functions/radon/radonEquipmentBridge.ts
  • attik-backend/src/routes/event.ts
  • attik-frontend/src/app/tools/radon/RadonChartBase.tsx
  • attik-frontend/src/components/calendar/CalendarRowGrid.tsx
  • attik-frontend/src/components/calendar/ChangedEventIndicator.tsx
  • attik-frontend/src/app/tools/settings/radon/EndEditting.tsx

Please authenticate to join the conversation.

Upvoters
Status

Planned

Board
🏠

Main App

Date

1 day ago

Author

Linear

Subscribe to post

Get notified by email when there are changes.