40227-vm/frontend/docs/campus-attendance-integration.md

90 lines
5.3 KiB
Markdown

# Campus Attendance Frontend Integration
## Purpose
Campus attendance config and daily aggregate summaries follow the frontend three-layer architecture.
```text
View -> Business Logic -> API/Data Access -> Backend
```
## Files
View layer:
- `frontend/src/components/frameworks/CampusAttendance.tsx`
- `frontend/src/components/campus-attendance/AttendanceSummaryCard.tsx`
- `frontend/src/components/campus-attendance/CampusAttendanceEntryForm.tsx`
- `frontend/src/components/campus-attendance/CampusAttendanceHeader.tsx`
- `frontend/src/components/campus-attendance/CampusAttendanceLinkConfig.tsx`
- `frontend/src/components/campus-attendance/CampusAttendanceStatus.tsx`
- `frontend/src/components/campus-attendance/IndividualCampusAttendanceView.tsx`
- `frontend/src/components/campus-attendance/SuperintendentAttendanceView.tsx`
- `frontend/src/components/campus-attendance/styles.ts`
- `frontend/src/components/campus-attendance/types.ts`
Business logic layer:
- `frontend/src/business/campus-attendance/hooks.ts`
- `frontend/src/business/campus-attendance/mappers.ts`
- `frontend/src/business/campus-attendance/printReport.ts`
- `frontend/src/business/campus-attendance/selectors.ts`
- `frontend/src/business/campus-attendance/types.ts`
API/data access layer:
- `frontend/src/shared/api/campusAttendance.ts`
- `frontend/src/shared/api/staffAttendance.ts` (staff summary and office/staff attendance entry)
- `frontend/src/shared/types/campusAttendance.ts`
- `frontend/src/shared/constants/campusAttendance.ts`
## Behavior
- Attendance links load from `GET /api/campus_attendance/configs`.
- Attendance links save through `PUT /api/campus_attendance/configs/:campusKey`.
- Daily campus summaries load from `GET /api/campus_attendance/summaries`.
- Daily campus summaries save through `PUT /api/campus_attendance/summaries/:campusKey/:date`.
- The page derives its mode from the effective scope, not from the signed-in role label:
- campus/class effective scope shows campus-only attendance.
- school effective scope aggregates all scoped campus summaries and school staff attendance.
- organization effective scope aggregates all scoped school/campus summaries plus organization staff attendance.
- Users with `FILL_ATTENDANCE` can enter daily student attendance from organization, school,
campus, or class effective scope. Campus/class scope can render Present/Late/Absent controls
per student when a roster is available and derives the aggregate campus summary from those rows.
Late students count as present and increment the tardy count. When no roster is available, the
form falls back to manual aggregate totals.
- Class effective scope resolves the class's parent campus for the campus attendance summary, but
loads the student roster with `users?classId=...` so the classroom form shows only students in
that classroom.
- Organization/school screens render a student attendance rollup table for every scoped child
campus. Each row is prefilled from the campus summary for the selected date; campuses without
child data show empty inputs. Saving writes valid edited rows back to
`campus_attendance_summaries` per campus. Organization and school totals are computed from those
campus rows plus staff attendance reports.
- Aggregate cards follow the tenant hierarchy: organization scope shows school cards, and school
scope shows campus cards. Clicking a child card opens
`/attendance/details/:level/:tenantId`. The details page shows separate tables for that child
scope's student attendance summaries and staff attendance records.
- Organization and school screens also expose office staff attendance entry as a batch table.
Organization office attendance targets organization-owned users without school/campus
assignment. School office attendance targets school-owned users without campus assignment.
Each staff row has Present/Late/Absent controls, and saving writes one record per user through
`PUT /api/staff_attendance/records/:userId/:date`. These records feed the staff attendance
summary.
- Campus screens expose the same staff attendance table for campus-bound and class-scoped staff
inside the campus.
- Staff summary loads from `GET /api/staff_attendance/summary?startDate=today&endDate=today` only when the user has `READ_STAFF_ATTENDANCE_REPORTS`.
- Aggregate views render only campus cards represented by scoped attendance/config rows, because the campus catalog endpoint is not the source of scoped reporting data.
- The backend calculates the attendance percentage.
- `CampusAttendance.tsx` is a thin composition wrapper.
- CampusAttendance uses typed business hooks/selectors for access, form state, today, weekly, campus, overall summary calculations, and print report generation.
- Print report generation escapes dynamic strings before writing report HTML.
- Blocked print popups return an explicit print result and show a visible attendance status error.
## Verification
- `frontend/src/business/campus-attendance/selectors.test.ts` covers attendance calculations, scope titles, and combined student/staff summary selectors.
- `frontend/src/business/campus-attendance/printReport.test.ts` covers printable report generation.
- `frontend/src/business/campus-attendance/printReport.test.ts` covers blocked-popup handling for attendance report printing.
- `frontend/src/business/campus-attendance/mappers.test.ts` covers API DTO mapping.