From 8274244a2e65ce0dcd2b57d9fffd94b95492e534 Mon Sep 17 00:00:00 2001 From: harrisonk0 Date: Sun, 22 Mar 2026 20:50:47 +0000 Subject: [PATCH 1/4] Add branded session PDF export --- ARCHITECTURE.md | 3 + components/DashboardPage.tsx | 41 +- components/SessionReportModal.tsx | 162 ++++ components/reports/SessionReportDocument.tsx | 815 +++++++++++++++++++ docs/06-data-and-services.md | 3 +- docs/user-guide.md | 8 +- package-lock.json | 563 ++++++++++++- package.json | 1 + services/reporting/sessionReport.test.ts | 138 ++++ services/reporting/sessionReport.ts | 242 ++++++ types/reporting.ts | 95 +++ 11 files changed, 2058 insertions(+), 13 deletions(-) create mode 100644 components/SessionReportModal.tsx create mode 100644 components/reports/SessionReportDocument.tsx create mode 100644 services/reporting/sessionReport.test.ts create mode 100644 services/reporting/sessionReport.ts create mode 100644 types/reporting.ts diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index f868841..ddf93a4 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -47,6 +47,7 @@ flowchart LR - `App.tsx` orchestrates auth state, active section, view switching, and modal/toast state. - `components/*` implements pages and shared UI. +- `components/reports/*` contains the branded session PDF document used by the dashboard export flow. - Navigation is app-state driven rather than router-driven. ### 2. Hook Layer @@ -65,6 +66,7 @@ flowchart LR - `profiles` for app roles and user metadata - `members` for member records - `marks` for per-member attendance and scores +- `services/reporting/sessionReport.ts` derives PDF-ready session reporting aggregates from loaded section data. - `services/settings.ts` handles section-level settings, updating the seeded `company` and `junior` rows in place. ## State Model @@ -77,6 +79,7 @@ Sources of truth: - React component and hook state for loaded records and view state The app does not maintain an offline cache or a separate backend API. +The branded session PDF generator also runs fully client-side in the browser. ## Security Model diff --git a/components/DashboardPage.tsx b/components/DashboardPage.tsx index 5511dc3..8abb37a 100644 --- a/components/DashboardPage.tsx +++ b/components/DashboardPage.tsx @@ -5,11 +5,13 @@ * providing a high-level overview for reporting and comparison. */ -import React, { useMemo } from 'react'; +import React, { Suspense, useMemo } from 'react'; import { Boy, Squad, Section, JuniorSquad, Mark } from '../types'; -import { StarIcon, ChartBarIcon } from './Icons'; +import { StarIcon, ChartBarIcon, ClipboardDocumentListIcon } from './Icons'; import BarChart from './BarChart'; +const SessionReportModal = React.lazy(() => import('./SessionReportModal')); + interface DashboardPageProps { boys: Boy[]; @@ -38,6 +40,7 @@ const SQUAD_CHART_COLORS: Record = { } const DashboardPage: React.FC = ({ boys, activeSection }) => { + const [isReportModalOpen, setIsReportModalOpen] = React.useState(false); const isCompany = activeSection === 'company'; const SQUAD_COLORS = isCompany ? COMPANY_SQUAD_COLORS : JUNIOR_SQUAD_COLORS; @@ -165,7 +168,26 @@ const DashboardPage: React.FC = ({ boys, activeSection }) => return (
-

Dashboard

+
+
+

Dashboard

+

+ Review session performance across marks and attendance, then export a single master BB report for the active section. +

+
+ +
{/* Visualizations Grid */}
@@ -274,8 +296,19 @@ const DashboardPage: React.FC = ({ boys, activeSection }) =>
+ + {isReportModalOpen && ( + + setIsReportModalOpen(false)} + /> + + )} ); }; -export default DashboardPage; \ No newline at end of file +export default DashboardPage; diff --git a/components/SessionReportModal.tsx b/components/SessionReportModal.tsx new file mode 100644 index 0000000..deb0bf1 --- /dev/null +++ b/components/SessionReportModal.tsx @@ -0,0 +1,162 @@ +import React, { useMemo, useState } from 'react'; +import { PDFDownloadLink } from '@react-pdf/renderer'; + +import Modal from './Modal'; +import SessionReportDocument from './reports/SessionReportDocument'; +import { buildSessionReportData, getSectionDateRange } from '../services/reporting/sessionReport'; +import type { Boy, Section } from '../types'; + +interface SessionReportModalProps { + boys: Boy[]; + activeSection: Section; + isOpen: boolean; + onClose: () => void; +} + +const formatDate = (value: string) => + new Date(`${value}T00:00:00`).toLocaleDateString(undefined, { + day: 'numeric', + month: 'short', + year: 'numeric', + }); + +const SessionReportModal: React.FC = ({ + boys, + activeSection, + isOpen, + onClose, +}) => { + const sectionRange = useMemo(() => getSectionDateRange(boys), [boys]); + const [startDate, setStartDate] = useState(sectionRange?.startDate ?? ''); + const [endDate, setEndDate] = useState(sectionRange?.endDate ?? ''); + + React.useEffect(() => { + setStartDate(sectionRange?.startDate ?? ''); + setEndDate(sectionRange?.endDate ?? ''); + }, [sectionRange, isOpen]); + + const hasValidRange = Boolean(startDate && endDate && startDate <= endDate); + const report = useMemo(() => { + if (!hasValidRange) { + return null; + } + + return buildSessionReportData({ + boys, + section: activeSection, + range: { startDate, endDate }, + }); + }, [activeSection, boys, endDate, hasValidRange, startDate]); + + const hasDataForRange = Boolean(report && report.headlineStats.meetingCount > 0); + const sectionLabel = activeSection === 'company' ? 'Company Section' : 'Junior Section'; + const filename = `${activeSection}-session-report-${startDate || 'start'}-to-${endDate || 'end'}.pdf`; + + return ( + + {!sectionRange ? ( +
+

+ There are no recorded marks in this section yet, so there is nothing to export. +

+
+ ) : ( +
+
+

Single Master Report

+

+ This export produces one branded end-of-session PDF for the active section using the current BB logo + and photography already used in the app. The document includes the section summary, attendance and marks + trends, squad breakdowns, and a page for every member in the selected date range. +

+
+ +
+ + +
+ + {hasValidRange ? ( + hasDataForRange && report ? ( +
+
+
+

Section

+

{sectionLabel}

+
+
+

Meetings

+

{report.headlineStats.meetingCount}

+
+
+

Attendance

+

{report.headlineStats.attendanceRate}%

+
+
+

Pages

+

{4 + report.members.length}

+
+
+

+ {`Report range: ${formatDate(startDate)} to ${formatDate(endDate)}. This will export ${report.members.length} member detail pages in addition to the summary pages.`} +

+
+ ) : ( +
+ There are no recorded marks inside that range. Pick dates that include at least one saved meeting. +
+ ) + ) : ( +
+ Choose a valid date range where the start date is on or before the end date. +
+ )} + +
+ + + {hasDataForRange && report ? ( + } + fileName={filename} + className="inline-flex items-center rounded-md bg-company-blue px-4 py-2 text-sm font-medium text-white hover:brightness-95 focus:outline-none focus:ring-2 focus:ring-company-blue focus:ring-offset-2" + > + {({ loading }) => (loading ? 'Preparing PDF...' : 'Download Master PDF')} + + ) : ( + PDF download becomes available once the range is valid. + )} +
+
+ )} +
+ ); +}; + +export default SessionReportModal; diff --git a/components/reports/SessionReportDocument.tsx b/components/reports/SessionReportDocument.tsx new file mode 100644 index 0000000..ad93343 --- /dev/null +++ b/components/reports/SessionReportDocument.tsx @@ -0,0 +1,815 @@ +import React from 'react'; +import { + Document, + Image, + Page, + StyleSheet, + Text, + View, +} from '@react-pdf/renderer'; + +import type { MemberSessionSummary, SessionReportData, SquadSessionSummary } from '../../types/reporting'; + +const BB_LOGO_URL = 'https://i.postimg.cc/FHrS3pzD/full-colour-boxed-logo.png'; +const BB_BACKGROUND_URL = 'https://i.postimg.cc/MKD36t18/mixed-activities.jpg'; +const COMPANY_LOGO_URL = 'https://i.postimg.cc/0j44DjdY/company-boxed-colour.png'; +const JUNIOR_LOGO_URL = 'https://i.postimg.cc/W1qvWLdp/juniors-boxed-colour.png'; + +const styles = StyleSheet.create({ + page: { + backgroundColor: '#f8fafc', + color: '#0f172a', + fontSize: 10, + paddingTop: 32, + paddingBottom: 36, + paddingHorizontal: 32, + fontFamily: 'Helvetica', + }, + coverPage: { + position: 'relative', + padding: 0, + backgroundColor: '#0f172a', + }, + coverBackground: { + position: 'absolute', + top: 0, + left: 0, + width: '100%', + height: '100%', + }, + coverOverlay: { + position: 'absolute', + top: 0, + left: 0, + width: '100%', + height: '100%', + backgroundColor: 'rgba(15, 23, 42, 0.74)', + }, + coverContent: { + position: 'relative', + zIndex: 1, + height: '100%', + paddingTop: 48, + paddingBottom: 48, + paddingHorizontal: 42, + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', + }, + coverTop: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'flex-start', + }, + coverMainLogo: { + width: 120, + height: 120, + objectFit: 'contain', + }, + coverSectionLogo: { + width: 100, + height: 100, + objectFit: 'contain', + }, + coverEyebrow: { + color: '#cbd5e1', + fontSize: 12, + letterSpacing: 1.5, + textTransform: 'uppercase', + marginBottom: 14, + }, + coverTitle: { + color: '#ffffff', + fontSize: 28, + lineHeight: 1.2, + fontWeight: 700, + marginBottom: 10, + }, + coverSubtitle: { + color: '#e2e8f0', + fontSize: 13, + lineHeight: 1.5, + maxWidth: 380, + }, + coverStatGrid: { + display: 'flex', + flexDirection: 'row', + flexWrap: 'wrap', + gap: 12, + marginTop: 24, + }, + coverStatCard: { + width: '48%', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + border: '1 solid rgba(255, 255, 255, 0.14)', + borderRadius: 12, + padding: 14, + }, + coverStatLabel: { + color: '#cbd5e1', + fontSize: 10, + textTransform: 'uppercase', + letterSpacing: 1, + marginBottom: 6, + }, + coverStatValue: { + color: '#ffffff', + fontSize: 22, + fontWeight: 700, + }, + coverFooter: { + color: '#cbd5e1', + fontSize: 10, + lineHeight: 1.5, + }, + header: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 18, + paddingBottom: 10, + borderBottom: '1 solid #cbd5e1', + }, + headerBrand: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + gap: 12, + }, + headerLogo: { + width: 48, + height: 48, + objectFit: 'contain', + }, + sectionLogo: { + width: 44, + height: 44, + objectFit: 'contain', + }, + headerTitle: { + fontSize: 18, + fontWeight: 700, + color: '#0f172a', + }, + headerMeta: { + fontSize: 9, + color: '#475569', + lineHeight: 1.4, + textAlign: 'right', + }, + sectionTitle: { + fontSize: 16, + fontWeight: 700, + marginBottom: 12, + color: '#0f172a', + }, + sectionCopy: { + fontSize: 10, + color: '#334155', + lineHeight: 1.5, + marginBottom: 16, + }, + statGrid: { + display: 'flex', + flexDirection: 'row', + flexWrap: 'wrap', + gap: 12, + marginBottom: 18, + }, + statCard: { + width: '31%', + backgroundColor: '#ffffff', + border: '1 solid #e2e8f0', + borderRadius: 10, + padding: 12, + }, + statCardLabel: { + color: '#64748b', + fontSize: 9, + textTransform: 'uppercase', + letterSpacing: 0.8, + marginBottom: 6, + }, + statCardValue: { + color: '#0f172a', + fontSize: 18, + fontWeight: 700, + }, + statCardHint: { + color: '#475569', + fontSize: 9, + marginTop: 4, + }, + twoColumn: { + display: 'flex', + flexDirection: 'row', + gap: 16, + alignItems: 'flex-start', + }, + column: { + flexGrow: 1, + flexBasis: 0, + }, + card: { + backgroundColor: '#ffffff', + border: '1 solid #e2e8f0', + borderRadius: 10, + padding: 14, + marginBottom: 14, + }, + cardTitle: { + fontSize: 12, + fontWeight: 700, + color: '#0f172a', + marginBottom: 10, + }, + keyRow: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + borderBottom: '1 solid #f1f5f9', + paddingVertical: 5, + }, + keyLabel: { + fontSize: 9, + color: '#475569', + }, + keyValue: { + fontSize: 9, + color: '#0f172a', + fontWeight: 700, + }, + rankRow: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingVertical: 6, + borderBottom: '1 solid #f1f5f9', + }, + rankLabel: { + fontSize: 10, + color: '#0f172a', + fontWeight: 700, + }, + rankMeta: { + fontSize: 9, + color: '#64748b', + marginTop: 2, + }, + rankValue: { + fontSize: 12, + color: '#0f172a', + fontWeight: 700, + }, + chartBlock: { + marginBottom: 14, + }, + chartLabelRow: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: 4, + }, + chartLabel: { + fontSize: 9, + color: '#334155', + }, + chartValue: { + fontSize: 9, + color: '#0f172a', + fontWeight: 700, + }, + chartTrack: { + width: '100%', + height: 11, + borderRadius: 999, + backgroundColor: '#e2e8f0', + }, + chartFill: { + height: 11, + borderRadius: 999, + }, + table: { + width: '100%', + border: '1 solid #e2e8f0', + borderRadius: 8, + overflow: 'hidden', + marginBottom: 12, + }, + tableHead: { + backgroundColor: '#e2e8f0', + }, + tableRow: { + display: 'flex', + flexDirection: 'row', + borderBottom: '1 solid #e2e8f0', + }, + tableRowAlt: { + backgroundColor: '#f8fafc', + }, + tableCell: { + paddingVertical: 7, + paddingHorizontal: 8, + fontSize: 8.5, + color: '#0f172a', + }, + tableHeadCell: { + fontSize: 8, + fontWeight: 700, + color: '#334155', + textTransform: 'uppercase', + letterSpacing: 0.6, + }, + footer: { + position: 'absolute', + bottom: 16, + left: 32, + right: 32, + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + fontSize: 8, + color: '#64748b', + }, + note: { + marginTop: 8, + fontSize: 8.5, + color: '#64748b', + lineHeight: 1.45, + }, +}); + +const formatDate = (value: string) => + new Date(`${value}T00:00:00`).toLocaleDateString(undefined, { + day: 'numeric', + month: 'short', + year: 'numeric', + }); + +const formatMonth = (value: string) => + new Date(`${value}-01T00:00:00`).toLocaleDateString(undefined, { + month: 'long', + year: 'numeric', + }); + +const formatGeneratedAt = (value: string) => + new Date(value).toLocaleString(undefined, { + day: 'numeric', + month: 'short', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + }); + +const formatNumber = (value: number) => + Number.isInteger(value) ? value.toString() : value.toFixed(2); + +const getAccent = (section: SessionReportData['section']) => + section === 'company' + ? { primary: '#222943', secondary: '#9fb4ff', soft: '#dbe4ff', sectionLogo: COMPANY_LOGO_URL } + : { primary: '#284e8b', secondary: '#8ec6ff', soft: '#d8e9ff', sectionLogo: JUNIOR_LOGO_URL }; + +const renderHorizontalBars = ( + items: { label: string; value: number; helper?: string }[], + accentColor: string, + maxValue: number, +) => ( + + {items.map((item) => { + const width = maxValue > 0 ? `${Math.max((item.value / maxValue) * 100, 4)}%` : '0%'; + return ( + + + {item.label} + {item.helper ?? formatNumber(item.value)} + + + + + + ); + })} + +); + +const renderPageHeader = (report: SessionReportData, title: string) => { + const accent = getAccent(report.section); + + return ( + + + + + + {title} + {report.sectionLabel} + + + + {`Session: ${formatDate(report.range.startDate)} to ${formatDate(report.range.endDate)}\nGenerated: ${formatGeneratedAt(report.generatedAt)}`} + + + ); +}; + +const renderPageFooter = (report: SessionReportData) => ( + + {`BB Manager session report • ${report.sectionLabel}`} + `Page ${pageNumber} of ${totalPages}`} /> + +); + +const renderMemberTable = (members: MemberSessionSummary[], section: SessionReportData['section']) => ( + + + Member + Squad + Year + Attend + Absent + Rate + Total + {section === 'junior' && ( + Uniform + )} + {section === 'junior' && ( + Behav. + )} + + {members.map((member, index) => ( + + {member.name} + {String(member.squad)} + {String(member.year)} + {member.attendanceCount} + {member.absenceCount} + {`${formatNumber(member.attendanceRate)}%`} + {formatNumber(member.totalMarks)} + {section === 'junior' && ( + {formatNumber(member.uniformTotal ?? 0)} + )} + {section === 'junior' && ( + {formatNumber(member.behaviourTotal ?? 0)} + )} + + ))} + +); + +const renderSquadCard = (squad: SquadSessionSummary) => ( + + {`Squad ${squad.squad}`} + + Members + {squad.memberCount} + + + Attendance + {`${formatNumber(squad.attendanceRate)}%`} + + + Total marks + {formatNumber(squad.totalMarks)} + + + Average mark when present + {formatNumber(squad.averageScoreWhenPresent)} + + + Leading member + + {squad.topMember ? `${squad.topMember.name} (${formatNumber(squad.topMember.totalMarks)})` : 'N/A'} + + + +); + +export interface SessionReportDocumentProps { + report: SessionReportData; +} + +const SessionReportDocument: React.FC = ({ report }) => { + const accent = getAccent(report.section); + const topMeetingMark = Math.max(...report.meetings.map((meeting) => meeting.totalMarks), 0); + const topMonthMark = Math.max(...report.months.map((month) => month.totalMarks), 0); + + return ( + + + + + + + + + + + + BB Manager Master Session Report + {report.sectionLabel} + + {`A complete session summary covering attendance, marks, squad performance, and member-level detail from ${formatDate(report.range.startDate)} to ${formatDate(report.range.endDate)}.`} + + + + + Members + {report.headlineStats.memberCount} + + + Meetings + {report.headlineStats.meetingCount} + + + Attendance + {`${formatNumber(report.headlineStats.attendanceRate)}%`} + + + Total Marks + {formatNumber(report.headlineStats.totalMarks)} + + + + + {`Generated ${formatGeneratedAt(report.generatedAt)}\nThis master PDF is based on the recorded marks and attendance already stored in BB Manager for the selected section and date range.`} + + + + + + {renderPageHeader(report, 'Executive Summary')} + Session Snapshot + + This page condenses the full session into the numbers most useful to officers at the end of a BB session: + membership size, how consistently members attended, how many marks were awarded, and which members led the section overall. + + + + + Total attendance records + {report.headlineStats.attendanceCount} + {`${report.headlineStats.absenceCount} absences recorded`} + + + Average mark when present + {formatNumber(report.headlineStats.averageMarksWhenPresent)} + Across all attended meetings + + + Reporting range + + {`${formatDate(report.range.startDate)}\n${formatDate(report.range.endDate)}`} + + + + + + + + Top Members + {report.topMembers.map((member, index) => ( + + + {`${index + 1}. ${member.name}`} + {`Squad ${member.squad} • Attendance ${formatNumber(member.attendanceRate)}% • Avg ${formatNumber(member.averageScoreWhenPresent)}`} + + {formatNumber(member.totalMarks)} + + ))} + + + + + + Squad Snapshot + {report.squads.map((squad) => ( + + {`Squad ${squad.squad}`} + + {`${formatNumber(squad.totalMarks)} marks • ${formatNumber(squad.attendanceRate)}%`} + + + ))} + + + + Reporting Notes + + Attendance percentages are calculated from recorded marks in the selected range. Present nights use the saved score; + absence rows are counted when a member was explicitly marked absent. + + + + + {renderPageFooter(report)} + + + + {renderPageHeader(report, 'Attendance And Marks Trends')} + + + + + Meeting Attendance Rate + {renderHorizontalBars( + report.meetings.map((meeting) => ({ + label: formatDate(meeting.date), + value: meeting.attendanceRate, + helper: `${formatNumber(meeting.attendanceRate)}%`, + })), + accent.primary, + 100, + )} + + + + + Meeting Marks Awarded + {renderHorizontalBars( + report.meetings.map((meeting) => ({ + label: formatDate(meeting.date), + value: meeting.totalMarks, + helper: formatNumber(meeting.totalMarks), + })), + accent.secondary, + topMeetingMark, + )} + + + + + + Monthly Session Pattern + {renderHorizontalBars( + report.months.map((month) => ({ + label: formatMonth(month.month), + value: month.totalMarks, + helper: `${formatNumber(month.totalMarks)} marks • ${formatNumber(month.attendanceRate)}%`, + })), + accent.primary, + topMonthMark, + )} + + + + + Meeting + Present + Absent + Attend Rate + Marks + + {report.meetings.map((meeting, index) => ( + + {formatDate(meeting.date)} + {meeting.attendanceCount} + {meeting.absenceCount} + {`${formatNumber(meeting.attendanceRate)}%`} + {formatNumber(meeting.totalMarks)} + + ))} + + {renderPageFooter(report)} + + + + {renderPageHeader(report, 'Squad Breakdown')} + + + Squad-level comparison helps show which groups carried the session in marks, which groups were most reliable for attendance, + and where section leadership might want to focus at the start of the next session. + + + + {report.squads.filter((_, index) => index % 2 === 0).map(renderSquadCard)} + {report.squads.filter((_, index) => index % 2 === 1).map(renderSquadCard)} + + + {renderMemberTable(report.members, report.section)} + {renderPageFooter(report)} + + + {report.members.map((member) => ( + + {renderPageHeader(report, `${member.name} Session Detail`)} + + + + Squad / Year + {`S${member.squad} / ${member.year}`} + {member.isSquadLeader ? 'Squad leader' : 'Member'} + + + Attendance + {`${formatNumber(member.attendanceRate)}%`} + {`${member.attendanceCount} present, ${member.absenceCount} absent`} + + + Total Marks + {formatNumber(member.totalMarks)} + {`Avg ${formatNumber(member.averageScoreWhenPresent)} when present`} + + + + + + + Member Summary + + Best night + + {member.bestNightDate ? `${formatNumber(member.bestNightScore)} on ${formatDate(member.bestNightDate)}` : 'N/A'} + + + + Last attended + {member.lastAttendedDate ? formatDate(member.lastAttendedDate) : 'N/A'} + + {report.section === 'junior' && ( + + Uniform total + {formatNumber(member.uniformTotal ?? 0)} + + )} + {report.section === 'junior' && ( + + Behaviour total + {formatNumber(member.behaviourTotal ?? 0)} + + )} + {report.section === 'company' && ( + + Recorded meetings + {member.meetings.length} + + )} + + + + + + Night-By-Night Marks + {renderHorizontalBars( + member.meetings.map((meeting) => ({ + label: formatDate(meeting.date), + value: meeting.attended ? meeting.score : 0, + helper: meeting.attended ? formatNumber(meeting.score) : 'Absent', + })), + accent.primary, + Math.max(...member.meetings.map((meeting) => meeting.score), 10), + )} + + + + + + + Date + Status + Score + {report.section === 'junior' && ( + Uniform + )} + {report.section === 'junior' && ( + Behaviour + )} + + {member.meetings.map((meeting, index) => ( + + {formatDate(meeting.date)} + {meeting.attended ? 'Present' : 'Absent'} + + {meeting.attended ? formatNumber(meeting.score) : '0'} + + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.uniformScore ?? 0) : '-'} + + )} + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.behaviourScore ?? 0) : '-'} + + )} + + ))} + + {renderPageFooter(report)} + + ))} + + ); +}; + +export default SessionReportDocument; diff --git a/docs/06-data-and-services.md b/docs/06-data-and-services.md index 20da0bf..c9193c8 100644 --- a/docs/06-data-and-services.md +++ b/docs/06-data-and-services.md @@ -7,6 +7,7 @@ This document describes how the app talks to Supabase. - `services/supabaseClient.ts`: shared Supabase client - `services/supabaseAuth.ts`: sign-in, sign-out, password update, auth subscription - `services/db.ts`: members, marks, profiles, and role-guardrail helpers +- `services/reporting/sessionReport.ts`: pure session-report aggregation for dashboard PDF export - `services/settings.ts`: section settings for the seeded `company` and `junior` rows ## Live Table Mapping @@ -30,4 +31,4 @@ The current app talks to these tables: - The UI-facing `Boy` model is assembled from `members` and `marks`. - Role information is loaded from `profiles`, not from a separate `user_roles` table. - Section settings are updated in place; missing `settings` rows are a bootstrap problem, not a normal runtime case. -- The active UI is limited to member management, marks entry, dashboard reporting, and section settings. +- The active UI is limited to member management, marks entry, dashboard reporting, session PDF export, and section settings. diff --git a/docs/user-guide.md b/docs/user-guide.md index d85a60d..e811927 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -24,7 +24,7 @@ flowchart LR | `Select a Section` | Choose either the Company or Junior section. | | `Home` | View, add, edit, and delete members in the active section. | | `Weekly Marks` | Record attendance and marks for the selected meeting date. | -| `Dashboard` | Review summary charts and attendance trends. | +| `Dashboard` | Review summary charts, attendance trends, and generate the master end-of-session PDF. | | `Section Settings` | Update section-level configuration such as the weekly meeting day. | | `Account Settings` | Change your personal password. | @@ -34,7 +34,7 @@ flowchart LR 2. Choose the section you are responsible for. 3. Use `Home` to manage the member roster. 4. Use `Weekly Marks` for weekly attendance and scoring. -5. Use `Dashboard` when you want a quick summary of section performance. +5. Use `Dashboard` when you want a quick summary of section performance or need the session PDF. ## Member Management @@ -52,6 +52,9 @@ flowchart LR ## Dashboard - Use the dashboard for a quick performance summary. +- Use `Generate Master PDF` to export one branded end-of-session report for the active section. +- Choose the session date range before downloading the report. +- The PDF includes section summary pages plus a detail page for each member with recorded marks in the selected range. - It is reporting only. It does not change roster data. ## Settings @@ -62,5 +65,4 @@ flowchart LR ## Support Notes - Accounts are provisioned manually by an administrator. -- If you need a PDF, render or print this Markdown file to PDF from your browser or editor. - Keep this guide with the branch or release bundle you hand to new users. diff --git a/package-lock.json b/package-lock.json index f19f422..18aea1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "boys'-brigade-manager", "version": "0.0.0", "dependencies": { + "@react-pdf/renderer": "^4.3.2", "@supabase/supabase-js": "^2.48.0", "react": "^19.2.0", "react-dom": "^19.2.0" @@ -272,6 +273,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -990,6 +1000,180 @@ "node": ">=18" } }, + "node_modules/@react-pdf/fns": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-pdf/fns/-/fns-3.1.2.tgz", + "integrity": "sha512-qTKGUf0iAMGg2+OsUcp9ffKnKi41RukM/zYIWMDJ4hRVYSr89Q7e3wSDW/Koqx3ea3Uy/z3h2y3wPX6Bdfxk6g==", + "license": "MIT" + }, + "node_modules/@react-pdf/font": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@react-pdf/font/-/font-4.0.4.tgz", + "integrity": "sha512-8YtgGtL511txIEc9AjiilpZ7yjid8uCd8OGUl6jaL3LIHnrToUupSN4IzsMQpVTCMYiDLFnDNQzpZsOYtRS/Pg==", + "license": "MIT", + "dependencies": { + "@react-pdf/pdfkit": "^4.1.0", + "@react-pdf/types": "^2.9.2", + "fontkit": "^2.0.2", + "is-url": "^1.2.4" + } + }, + "node_modules/@react-pdf/image": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@react-pdf/image/-/image-3.0.4.tgz", + "integrity": "sha512-z0ogVQE0bKqgXQ5smgzIU857rLV7bMgVdrYsu3UfXDDLSzI7QPvzf6MFTFllX6Dx2rcsF13E01dqKPtJEM799g==", + "license": "MIT", + "dependencies": { + "@react-pdf/png-js": "^3.0.0", + "jay-peg": "^1.1.1" + } + }, + "node_modules/@react-pdf/layout": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@react-pdf/layout/-/layout-4.4.2.tgz", + "integrity": "sha512-gNu2oh8MiGR+NJZYTJ4c4q0nWCESBI6rKFiodVhE7OeVAjtzZzd6l65wsN7HXdWJqOZD3ttD97iE+tf5SOd/Yg==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.2", + "@react-pdf/image": "^3.0.4", + "@react-pdf/primitives": "^4.1.1", + "@react-pdf/stylesheet": "^6.1.2", + "@react-pdf/textkit": "^6.1.0", + "@react-pdf/types": "^2.9.2", + "emoji-regex-xs": "^1.0.0", + "queue": "^6.0.1", + "yoga-layout": "^3.2.1" + } + }, + "node_modules/@react-pdf/pdfkit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@react-pdf/pdfkit/-/pdfkit-4.1.0.tgz", + "integrity": "sha512-Wm/IOAv0h/U5Ra94c/PltFJGcpTUd/fwVMVeFD6X9tTTPCttIwg0teRG1Lqq617J8K4W7jpL/B0HTH0mjp3QpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@react-pdf/png-js": "^3.0.0", + "browserify-zlib": "^0.2.0", + "crypto-js": "^4.2.0", + "fontkit": "^2.0.2", + "jay-peg": "^1.1.1", + "linebreak": "^1.1.0", + "vite-compatible-readable-stream": "^3.6.1" + } + }, + "node_modules/@react-pdf/png-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-pdf/png-js/-/png-js-3.0.0.tgz", + "integrity": "sha512-eSJnEItZ37WPt6Qv5pncQDxLJRK15eaRwPT+gZoujP548CodenOVp49GST8XJvKMFt9YqIBzGBV/j9AgrOQzVA==", + "license": "MIT", + "dependencies": { + "browserify-zlib": "^0.2.0" + } + }, + "node_modules/@react-pdf/primitives": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@react-pdf/primitives/-/primitives-4.1.1.tgz", + "integrity": "sha512-IuhxYls1luJb7NUWy6q5avb1XrNaVj9bTNI40U9qGRuS6n7Hje/8H8Qi99Z9UKFV74bBP3DOf3L1wV2qZVgVrQ==", + "license": "MIT" + }, + "node_modules/@react-pdf/reconciler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@react-pdf/reconciler/-/reconciler-2.0.0.tgz", + "integrity": "sha512-7zaPRujpbHSmCpIrZ+b9HSTJHthcVZzX0Wx7RzvQGsGBUbHP4p6s5itXrAIOuQuPvDepoHGNOvf6xUuMVvdoyw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "scheduler": "0.25.0-rc-603e6108-20241029" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-pdf/reconciler/node_modules/scheduler": { + "version": "0.25.0-rc-603e6108-20241029", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0-rc-603e6108-20241029.tgz", + "integrity": "sha512-pFwF6H1XrSdYYNLfOcGlM28/j8CGLu8IvdrxqhjWULe2bPcKiKW4CV+OWqR/9fT52mywx65l7ysNkjLKBda7eA==", + "license": "MIT" + }, + "node_modules/@react-pdf/render": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@react-pdf/render/-/render-4.3.2.tgz", + "integrity": "sha512-el5KYM1sH/PKcO4tRCIm8/AIEmhtraaONbwCrBhFdehoGv6JtgnXiMxHGAvZbI5kEg051GbyP+XIU6f6YbOu6Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@react-pdf/fns": "3.1.2", + "@react-pdf/primitives": "^4.1.1", + "@react-pdf/textkit": "^6.1.0", + "@react-pdf/types": "^2.9.2", + "abs-svg-path": "^0.1.1", + "color-string": "^1.9.1", + "normalize-svg-path": "^1.1.0", + "parse-svg-path": "^0.1.2", + "svg-arc-to-cubic-bezier": "^3.2.0" + } + }, + "node_modules/@react-pdf/renderer": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@react-pdf/renderer/-/renderer-4.3.2.tgz", + "integrity": "sha512-EhPkj35gO9rXIyyx29W3j3axemvVY5RigMmlK4/6Ku0pXB8z9PEE/sz4ZBOShu2uot6V4xiCR3aG+t9IjJJlBQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@react-pdf/fns": "3.1.2", + "@react-pdf/font": "^4.0.4", + "@react-pdf/layout": "^4.4.2", + "@react-pdf/pdfkit": "^4.1.0", + "@react-pdf/primitives": "^4.1.1", + "@react-pdf/reconciler": "^2.0.0", + "@react-pdf/render": "^4.3.2", + "@react-pdf/types": "^2.9.2", + "events": "^3.3.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "queue": "^6.0.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-pdf/stylesheet": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@react-pdf/stylesheet/-/stylesheet-6.1.2.tgz", + "integrity": "sha512-E3ftGRYUQGKiN3JOgtGsLDo0hGekA6dmkmi/MYACytmPTKxQRBSO3126MebmCq+t1rgU9uRlREIEawJ+8nzSbw==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.2", + "@react-pdf/types": "^2.9.2", + "color-string": "^1.9.1", + "hsl-to-hex": "^1.0.0", + "media-engine": "^1.0.3", + "postcss-value-parser": "^4.1.0" + } + }, + "node_modules/@react-pdf/textkit": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@react-pdf/textkit/-/textkit-6.1.0.tgz", + "integrity": "sha512-sFlzDC9CDFrJsnL3B/+NHrk9+Advqk7iJZIStiYQDdskbow8GF/AGYrpIk+vWSnh35YxaGbHkqXq53XOxnyrjQ==", + "license": "MIT", + "dependencies": { + "@react-pdf/fns": "3.1.2", + "bidi-js": "^1.0.2", + "hyphen": "^1.6.4", + "unicode-properties": "^1.4.1" + } + }, + "node_modules/@react-pdf/types": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@react-pdf/types/-/types-2.9.2.tgz", + "integrity": "sha512-dufvpKId9OajLLbgn9q7VLUmyo1Jf+iyGk2ZHmCL8nIDtL8N1Ejh9TH7+pXXrR0tdie1nmnEb5Bz9U7g4hI4/g==", + "license": "MIT", + "dependencies": { + "@react-pdf/font": "^4.0.4", + "@react-pdf/primitives": "^4.1.1", + "@react-pdf/stylesheet": "^6.1.2" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.47", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz", @@ -1473,6 +1657,15 @@ "node": ">=20.0.0" } }, + "node_modules/@swc/helpers": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", + "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1732,6 +1925,12 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", + "license": "MIT" + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1873,6 +2072,26 @@ "dev": true, "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/baseline-browser-mapping": { "version": "2.8.28", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz", @@ -1883,6 +2102,15 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1919,6 +2147,24 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, "node_modules/browserslist": { "version": "4.28.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", @@ -2032,6 +2278,15 @@ "node": ">= 6" } }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2049,9 +2304,18 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -2084,6 +2348,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2115,6 +2385,12 @@ } } }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -2150,6 +2426,12 @@ "dev": true, "license": "MIT" }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "license": "MIT" + }, "node_modules/es-module-lexer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", @@ -2219,6 +2501,15 @@ "@types/estree": "^1.0.0" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", @@ -2229,6 +2520,12 @@ "node": ">=12.0.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -2300,6 +2597,23 @@ "node": ">=8" } }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" + } + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -2424,6 +2738,21 @@ "node": ">= 0.4" } }, + "node_modules/hsl-to-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-to-hex/-/hsl-to-hex-1.0.0.tgz", + "integrity": "sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==", + "license": "MIT", + "dependencies": { + "hsl-to-rgb-for-reals": "^1.1.0" + } + }, + "node_modules/hsl-to-rgb-for-reals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hsl-to-rgb-for-reals/-/hsl-to-rgb-for-reals-1.1.1.tgz", + "integrity": "sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==", + "license": "ISC" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2431,6 +2760,12 @@ "dev": true, "license": "MIT" }, + "node_modules/hyphen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/hyphen/-/hyphen-1.14.1.tgz", + "integrity": "sha512-kvL8xYl5QMTh+LwohVN72ciOxC0OEV79IPdJSTwEXok9y9QHebXGdFgrED4sWfiax/ODx++CAMk3hMy4XPJPOw==", + "license": "ISC" + }, "node_modules/iceberg-js": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", @@ -2440,6 +2775,18 @@ "node": ">=20.0.0" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2512,6 +2859,12 @@ "node": ">=0.12.0" } }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2574,6 +2927,15 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jay-peg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jay-peg/-/jay-peg-1.1.1.tgz", + "integrity": "sha512-D62KEuBxz/ip2gQKOEhk/mx14o7eiFRaU+VNNSP4MOiIkwb/D6B3G1Mfas7C/Fit8EsSV2/IWjZElx/Gs6A4ww==", + "license": "MIT", + "dependencies": { + "restructure": "^3.0.0" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -2588,7 +2950,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/jsesc": { @@ -2630,6 +2991,25 @@ "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -2637,6 +3017,18 @@ "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2698,6 +3090,12 @@ "node": ">=10" } }, + "node_modules/media-engine": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/media-engine/-/media-engine-1.0.3.tgz", + "integrity": "sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==", + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2826,11 +3224,19 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "license": "MIT", + "dependencies": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2864,6 +3270,18 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", + "license": "MIT" + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3159,9 +3577,28 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, "license": "MIT" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3204,6 +3641,12 @@ "react": "^19.2.0" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", @@ -3250,6 +3693,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -3271,6 +3723,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "license": "MIT" + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -3351,6 +3809,26 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -3410,6 +3888,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3434,6 +3921,15 @@ "dev": true, "license": "MIT" }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -3541,6 +4037,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", + "license": "ISC" + }, "node_modules/tailwindcss": { "version": "3.4.18", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", @@ -3602,6 +4104,12 @@ "node": ">=0.8" } }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -3692,6 +4200,32 @@ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", @@ -3727,7 +4261,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, "node_modules/vite": { @@ -3805,6 +4338,20 @@ } } }, + "node_modules/vite-compatible-readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/vite-compatible-readable-stream/-/vite-compatible-readable-stream-3.6.1.tgz", + "integrity": "sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/vitest": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", @@ -3966,6 +4513,12 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "license": "MIT" } } } diff --git a/package.json b/package.json index 084015d..9c9736b 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "dependencies": { + "@react-pdf/renderer": "^4.3.2", "@supabase/supabase-js": "^2.48.0", "react": "^19.2.0", "react-dom": "^19.2.0" diff --git a/services/reporting/sessionReport.test.ts b/services/reporting/sessionReport.test.ts new file mode 100644 index 0000000..affc88b --- /dev/null +++ b/services/reporting/sessionReport.test.ts @@ -0,0 +1,138 @@ +import { describe, expect, it } from 'vitest'; + +import { buildSessionReportData, getSectionDateRange } from './sessionReport'; +import type { Boy } from '../../types'; + +const companyBoys: Boy[] = [ + { + id: 'member-1', + name: 'Aaron', + squad: 1, + year: 12, + isSquadLeader: true, + marks: [ + { date: '2026-01-09', score: 8 }, + { date: '2026-01-16', score: -1 }, + { date: '2026-02-06', score: 9.5 }, + ], + }, + { + id: 'member-2', + name: 'Ben', + squad: 1, + year: 11, + isSquadLeader: false, + marks: [ + { date: '2026-01-09', score: 7 }, + { date: '2026-01-16', score: 6 }, + { date: '2026-02-06', score: 7.5 }, + ], + }, + { + id: 'member-3', + name: 'Callum', + squad: 2, + year: 10, + isSquadLeader: false, + marks: [ + { date: '2026-01-09', score: -1 }, + { date: '2026-01-16', score: 8 }, + ], + }, +]; + +describe('sessionReport', () => { + it('derives the section date range from all member marks', () => { + expect(getSectionDateRange(companyBoys)).toEqual({ + startDate: '2026-01-09', + endDate: '2026-02-06', + }); + }); + + it('builds section, squad, meeting, and top-member summaries', () => { + const report = buildSessionReportData({ + boys: companyBoys, + section: 'company', + range: { + startDate: '2026-01-01', + endDate: '2026-02-28', + }, + now: new Date('2026-03-22T10:00:00Z'), + }); + + expect(report.headlineStats).toEqual({ + memberCount: 3, + meetingCount: 3, + attendanceCount: 6, + absenceCount: 2, + attendanceRate: 75, + totalMarks: 46, + averageMarksWhenPresent: 7.67, + }); + expect(report.topMembers[0]).toMatchObject({ + name: 'Ben', + totalMarks: 20.5, + }); + expect(report.squads).toHaveLength(2); + expect(report.squads[0]).toMatchObject({ + squad: '1', + memberCount: 2, + attendanceRate: 83.33, + totalMarks: 38, + }); + expect(report.meetings[1]).toEqual({ + date: '2026-01-16', + attendanceCount: 2, + absenceCount: 1, + attendanceRate: 66.67, + totalMarks: 14, + averageMarksWhenPresent: 7, + }); + expect(report.months).toEqual([ + { + month: '2026-01', + attendanceCount: 4, + absenceCount: 2, + attendanceRate: 66.67, + totalMarks: 29, + }, + { + month: '2026-02', + attendanceCount: 2, + absenceCount: 0, + attendanceRate: 100, + totalMarks: 17, + }, + ]); + }); + + it('keeps junior uniform and behaviour totals in member summaries', () => { + const report = buildSessionReportData({ + boys: [ + { + id: 'junior-1', + name: 'Daniel', + squad: 3, + year: 'P7', + isSquadLeader: false, + marks: [ + { date: '2026-03-01', score: 8, uniformScore: 5, behaviourScore: 3 }, + { date: '2026-03-08', score: 7, uniformScore: 4, behaviourScore: 3 }, + ], + }, + ], + section: 'junior', + range: { + startDate: '2026-03-01', + endDate: '2026-03-31', + }, + }); + + expect(report.members[0]).toMatchObject({ + totalMarks: 15, + uniformTotal: 9, + behaviourTotal: 6, + attendanceRate: 100, + }); + }); +}); diff --git a/services/reporting/sessionReport.ts b/services/reporting/sessionReport.ts new file mode 100644 index 0000000..3a99b70 --- /dev/null +++ b/services/reporting/sessionReport.ts @@ -0,0 +1,242 @@ +import type { Boy, Mark, Section } from '../../types'; +import type { + BuildSessionReportInput, + MeetingSummary, + MemberMeetingRecord, + MemberSessionSummary, + MonthlySummary, + ReportDateRange, + SessionHeadlineStats, + SessionReportData, + SquadSessionSummary, +} from '../../types/reporting'; + +const SECTION_LABELS: Record = { + company: 'Company Section', + junior: 'Junior Section', +}; + +const round = (value: number) => Math.round(value * 100) / 100; + +const isMarkWithinRange = (mark: Mark, range: ReportDateRange) => + mark.date >= range.startDate && mark.date <= range.endDate; + +const sortByDateAsc = (items: T[]) => + [...items].sort((left, right) => left.date.localeCompare(right.date)); + +const sortMembersForReport = (members: MemberSessionSummary[]) => + [...members].sort((left, right) => { + if (right.totalMarks !== left.totalMarks) { + return right.totalMarks - left.totalMarks; + } + + if (right.attendanceRate !== left.attendanceRate) { + return right.attendanceRate - left.attendanceRate; + } + + return left.name.localeCompare(right.name); + }); + +const buildMemberMeetingRecords = (marks: Mark[]): MemberMeetingRecord[] => + sortByDateAsc(marks).map((mark) => ({ + date: mark.date, + attended: mark.score >= 0, + score: mark.score >= 0 ? mark.score : 0, + uniformScore: mark.score >= 0 ? mark.uniformScore : undefined, + behaviourScore: mark.score >= 0 ? mark.behaviourScore : undefined, + })); + +const buildMemberSummary = (boy: Boy, section: Section, range: ReportDateRange): MemberSessionSummary => { + const sessionMarks = sortByDateAsc(boy.marks.filter((mark) => isMarkWithinRange(mark, range))); + const meetings = buildMemberMeetingRecords(sessionMarks); + const presentMarks = sessionMarks.filter((mark) => mark.score >= 0); + const absentMarks = sessionMarks.filter((mark) => mark.score < 0); + const totalMarks = round(presentMarks.reduce((sum, mark) => sum + mark.score, 0)); + const attendanceCount = presentMarks.length; + const absenceCount = absentMarks.length; + const attendanceRate = sessionMarks.length > 0 ? round((attendanceCount / sessionMarks.length) * 100) : 0; + const averageScoreWhenPresent = attendanceCount > 0 ? round(totalMarks / attendanceCount) : 0; + const bestNight = [...presentMarks].sort((left, right) => right.score - left.score || left.date.localeCompare(right.date))[0]; + const uniformTotal = section === 'junior' + ? round(presentMarks.reduce((sum, mark) => sum + (mark.uniformScore ?? 0), 0)) + : undefined; + const behaviourTotal = section === 'junior' + ? round(presentMarks.reduce((sum, mark) => sum + (mark.behaviourScore ?? 0), 0)) + : undefined; + + return { + id: boy.id ?? boy.name, + name: boy.name, + squad: boy.squad, + year: boy.year, + isSquadLeader: boy.isSquadLeader ?? false, + attendanceCount, + absenceCount, + attendanceRate, + totalMarks, + averageScoreWhenPresent, + bestNightScore: bestNight?.score ?? 0, + bestNightDate: bestNight?.date, + lastAttendedDate: presentMarks.at(-1)?.date, + uniformTotal, + behaviourTotal, + meetings, + }; +}; + +const buildHeadlineStats = (members: MemberSessionSummary[], meetingDates: string[]): SessionHeadlineStats => { + const attendanceCount = members.reduce((sum, member) => sum + member.attendanceCount, 0); + const absenceCount = members.reduce((sum, member) => sum + member.absenceCount, 0); + const totalMarks = round(members.reduce((sum, member) => sum + member.totalMarks, 0)); + const totalRecords = attendanceCount + absenceCount; + + return { + memberCount: members.length, + meetingCount: meetingDates.length, + attendanceCount, + absenceCount, + attendanceRate: totalRecords > 0 ? round((attendanceCount / totalRecords) * 100) : 0, + totalMarks, + averageMarksWhenPresent: attendanceCount > 0 ? round(totalMarks / attendanceCount) : 0, + }; +}; + +const buildMeetingSummaries = (members: MemberSessionSummary[], meetingDates: string[]): MeetingSummary[] => + meetingDates.map((date) => { + const records = members + .map((member) => member.meetings.find((meeting) => meeting.date === date)) + .filter((meeting): meeting is MemberMeetingRecord => !!meeting); + const attendanceCount = records.filter((record) => record.attended).length; + const absenceCount = records.length - attendanceCount; + const totalMarks = round(records.reduce((sum, record) => sum + (record.attended ? record.score : 0), 0)); + + return { + date, + attendanceCount, + absenceCount, + attendanceRate: records.length > 0 ? round((attendanceCount / records.length) * 100) : 0, + totalMarks, + averageMarksWhenPresent: attendanceCount > 0 ? round(totalMarks / attendanceCount) : 0, + }; + }); + +const buildMonthlySummaries = (meetings: MeetingSummary[]): MonthlySummary[] => { + const months = new Map(); + + meetings.forEach((meeting) => { + const month = meeting.date.slice(0, 7); + const current = months.get(month) ?? { + month, + attendanceCount: 0, + absenceCount: 0, + attendanceRate: 0, + totalMarks: 0, + }; + + current.attendanceCount += meeting.attendanceCount; + current.absenceCount += meeting.absenceCount; + current.totalMarks = round(current.totalMarks + meeting.totalMarks); + months.set(month, current); + }); + + return [...months.values()] + .map((month) => { + const totalRecords = month.attendanceCount + month.absenceCount; + return { + ...month, + attendanceRate: totalRecords > 0 ? round((month.attendanceCount / totalRecords) * 100) : 0, + }; + }) + .sort((left, right) => left.month.localeCompare(right.month)); +}; + +const buildSquadSummaries = (members: MemberSessionSummary[]): SquadSessionSummary[] => { + const grouped = new Map(); + + members.forEach((member) => { + const key = String(member.squad); + const current = grouped.get(key) ?? []; + current.push(member); + grouped.set(key, current); + }); + + return [...grouped.entries()] + .sort((left, right) => Number(left[0]) - Number(right[0])) + .map(([squad, squadMembers]) => { + const attendanceCount = squadMembers.reduce((sum, member) => sum + member.attendanceCount, 0); + const absenceCount = squadMembers.reduce((sum, member) => sum + member.absenceCount, 0); + const totalMarks = round(squadMembers.reduce((sum, member) => sum + member.totalMarks, 0)); + const topMember = sortMembersForReport(squadMembers)[0]; + const totalRecords = attendanceCount + absenceCount; + + return { + squad, + memberCount: squadMembers.length, + attendanceCount, + absenceCount, + attendanceRate: totalRecords > 0 ? round((attendanceCount / totalRecords) * 100) : 0, + totalMarks, + averageScoreWhenPresent: attendanceCount > 0 ? round(totalMarks / attendanceCount) : 0, + topMember: topMember + ? { + id: topMember.id, + name: topMember.name, + totalMarks: topMember.totalMarks, + attendanceRate: topMember.attendanceRate, + } + : undefined, + members: sortMembersForReport(squadMembers), + }; + }); +}; + +export const getSectionDateRange = (boys: Boy[]): ReportDateRange | null => { + const dates = boys.flatMap((boy) => boy.marks.map((mark) => mark.date)).sort(); + + if (dates.length === 0) { + return null; + } + + return { + startDate: dates[0], + endDate: dates[dates.length - 1], + }; +}; + +export const buildSessionReportData = ({ + boys, + section, + range, + now = new Date(), +}: BuildSessionReportInput): SessionReportData => { + const members = sortMembersForReport(boys.map((boy) => buildMemberSummary(boy, section, range))); + const meetingDates = Array.from( + new Set( + members.flatMap((member) => member.meetings.map((meeting) => meeting.date)), + ), + ).sort((left, right) => left.localeCompare(right)); + const meetings = buildMeetingSummaries(members, meetingDates); + const months = buildMonthlySummaries(meetings); + const squads = buildSquadSummaries(members); + + return { + section, + sectionLabel: SECTION_LABELS[section], + generatedAt: now.toISOString(), + range, + meetingDates, + headlineStats: buildHeadlineStats(members, meetingDates), + topMembers: members.slice(0, 5).map((member) => ({ + id: member.id, + name: member.name, + squad: member.squad, + totalMarks: member.totalMarks, + attendanceRate: member.attendanceRate, + averageScoreWhenPresent: member.averageScoreWhenPresent, + })), + members, + squads, + meetings, + months, + }; +}; diff --git a/types/reporting.ts b/types/reporting.ts new file mode 100644 index 0000000..125870b --- /dev/null +++ b/types/reporting.ts @@ -0,0 +1,95 @@ +import type { Boy, Mark, Section } from '../types'; + +export interface ReportDateRange { + startDate: string; + endDate: string; +} + +export interface MemberMeetingRecord { + date: string; + attended: boolean; + score: number; + uniformScore?: number; + behaviourScore?: number; +} + +export interface MemberSessionSummary { + id: string; + name: string; + squad: Boy['squad']; + year: Boy['year']; + isSquadLeader: boolean; + attendanceCount: number; + absenceCount: number; + attendanceRate: number; + totalMarks: number; + averageScoreWhenPresent: number; + bestNightScore: number; + bestNightDate?: string; + lastAttendedDate?: string; + uniformTotal?: number; + behaviourTotal?: number; + meetings: MemberMeetingRecord[]; +} + +export interface SquadSessionSummary { + squad: string; + memberCount: number; + attendanceCount: number; + absenceCount: number; + attendanceRate: number; + totalMarks: number; + averageScoreWhenPresent: number; + topMember?: Pick; + members: MemberSessionSummary[]; +} + +export interface MeetingSummary { + date: string; + attendanceCount: number; + absenceCount: number; + attendanceRate: number; + totalMarks: number; + averageMarksWhenPresent: number; +} + +export interface MonthlySummary { + month: string; + attendanceCount: number; + absenceCount: number; + attendanceRate: number; + totalMarks: number; +} + +export interface SessionHeadlineStats { + memberCount: number; + meetingCount: number; + attendanceCount: number; + absenceCount: number; + attendanceRate: number; + totalMarks: number; + averageMarksWhenPresent: number; +} + +export interface SessionReportData { + section: Section; + sectionLabel: string; + generatedAt: string; + range: ReportDateRange; + meetingDates: string[]; + headlineStats: SessionHeadlineStats; + topMembers: Pick[]; + members: MemberSessionSummary[]; + squads: SquadSessionSummary[]; + meetings: MeetingSummary[]; + months: MonthlySummary[]; +} + +export interface BuildSessionReportInput { + boys: Boy[]; + section: Section; + range: ReportDateRange; + now?: Date; +} + +export type SessionMark = Mark; From ef32cc995f19817aa63865f68c9af8d408806e7c Mon Sep 17 00:00:00 2001 From: harrisonk0 Date: Sun, 22 Mar 2026 21:06:20 +0000 Subject: [PATCH 2/4] Polish session PDF layout --- components/reports/SessionReportDocument.tsx | 321 +++++++++++-------- 1 file changed, 192 insertions(+), 129 deletions(-) diff --git a/components/reports/SessionReportDocument.tsx b/components/reports/SessionReportDocument.tsx index ad93343..21a39f8 100644 --- a/components/reports/SessionReportDocument.tsx +++ b/components/reports/SessionReportDocument.tsx @@ -20,47 +20,44 @@ const styles = StyleSheet.create({ backgroundColor: '#f8fafc', color: '#0f172a', fontSize: 10, - paddingTop: 32, + paddingTop: 84, paddingBottom: 36, paddingHorizontal: 32, fontFamily: 'Helvetica', }, coverPage: { - position: 'relative', - padding: 0, - backgroundColor: '#0f172a', - }, - coverBackground: { - position: 'absolute', - top: 0, - left: 0, - width: '100%', - height: '100%', - }, - coverOverlay: { - position: 'absolute', - top: 0, - left: 0, - width: '100%', - height: '100%', - backgroundColor: 'rgba(15, 23, 42, 0.74)', - }, - coverContent: { - position: 'relative', - zIndex: 1, - height: '100%', paddingTop: 48, paddingBottom: 48, paddingHorizontal: 42, - display: 'flex', + backgroundColor: '#10182e', + color: '#ffffff', + fontFamily: 'Helvetica', + }, + coverContent: { + height: '100%', flexDirection: 'column', justifyContent: 'space-between', }, coverTop: { - display: 'flex', flexDirection: 'row', justifyContent: 'space-between', alignItems: 'flex-start', + marginBottom: 34, + }, + coverBrandColumn: { + width: '58%', + }, + coverPhotoCard: { + width: '34%', + backgroundColor: '#18233f', + borderRadius: 18, + overflow: 'hidden', + border: '1 solid #314469', + }, + coverPhoto: { + width: '100%', + height: 228, + objectFit: 'cover', }, coverMainLogo: { width: 120, @@ -73,7 +70,7 @@ const styles = StyleSheet.create({ objectFit: 'contain', }, coverEyebrow: { - color: '#cbd5e1', + color: '#9fb4ff', fontSize: 12, letterSpacing: 1.5, textTransform: 'uppercase', @@ -87,27 +84,28 @@ const styles = StyleSheet.create({ marginBottom: 10, }, coverSubtitle: { - color: '#e2e8f0', + color: '#dbe7ff', fontSize: 13, lineHeight: 1.5, maxWidth: 380, }, coverStatGrid: { - display: 'flex', flexDirection: 'row', flexWrap: 'wrap', - gap: 12, marginTop: 24, + marginBottom: 28, }, coverStatCard: { width: '48%', - backgroundColor: 'rgba(255, 255, 255, 0.1)', - border: '1 solid rgba(255, 255, 255, 0.14)', + backgroundColor: '#162441', + border: '1 solid #395485', borderRadius: 12, padding: 14, + marginRight: '2%', + marginBottom: 12, }, coverStatLabel: { - color: '#cbd5e1', + color: '#9fb4ff', fontSize: 10, textTransform: 'uppercase', letterSpacing: 1, @@ -119,24 +117,34 @@ const styles = StyleSheet.create({ fontWeight: 700, }, coverFooter: { - color: '#cbd5e1', + color: '#c8d7f6', fontSize: 10, lineHeight: 1.5, }, + coverDivider: { + width: 68, + height: 4, + borderRadius: 999, + backgroundColor: '#9fb4ff', + marginTop: 22, + marginBottom: 24, + }, header: { - display: 'flex', flexDirection: 'row', justifyContent: 'space-between', - alignItems: 'center', + alignItems: 'flex-start', marginBottom: 18, paddingBottom: 10, borderBottom: '1 solid #cbd5e1', }, headerBrand: { - display: 'flex', flexDirection: 'row', alignItems: 'center', - gap: 12, + width: '66%', + }, + headerTextBlock: { + marginLeft: 12, + paddingRight: 10, }, headerLogo: { width: 48, @@ -149,7 +157,8 @@ const styles = StyleSheet.create({ objectFit: 'contain', }, headerTitle: { - fontSize: 18, + fontSize: 16, + lineHeight: 1.25, fontWeight: 700, color: '#0f172a', }, @@ -158,6 +167,7 @@ const styles = StyleSheet.create({ color: '#475569', lineHeight: 1.4, textAlign: 'right', + width: '30%', }, sectionTitle: { fontSize: 16, @@ -172,10 +182,8 @@ const styles = StyleSheet.create({ marginBottom: 16, }, statGrid: { - display: 'flex', flexDirection: 'row', flexWrap: 'wrap', - gap: 12, marginBottom: 18, }, statCard: { @@ -184,6 +192,7 @@ const styles = StyleSheet.create({ border: '1 solid #e2e8f0', borderRadius: 10, padding: 12, + marginRight: '2.33%', }, statCardLabel: { color: '#64748b', @@ -203,14 +212,14 @@ const styles = StyleSheet.create({ marginTop: 4, }, twoColumn: { - display: 'flex', flexDirection: 'row', - gap: 16, alignItems: 'flex-start', + justifyContent: 'space-between', }, column: { flexGrow: 1, flexBasis: 0, + width: '48.5%', }, card: { backgroundColor: '#ffffff', @@ -219,6 +228,9 @@ const styles = StyleSheet.create({ padding: 14, marginBottom: 14, }, + memberTableSection: { + marginTop: 6, + }, cardTitle: { fontSize: 12, fontWeight: 700, @@ -340,6 +352,17 @@ const styles = StyleSheet.create({ color: '#64748b', lineHeight: 1.45, }, + memberMetricsRow: { + flexDirection: 'row', + justifyContent: 'space-between', + }, + memberMetricsCard: { + width: '31%', + backgroundColor: '#ffffff', + border: '1 solid #e2e8f0', + borderRadius: 10, + padding: 12, + }, }); const formatDate = (value: string) => @@ -372,6 +395,16 @@ const getAccent = (section: SessionReportData['section']) => ? { primary: '#222943', secondary: '#9fb4ff', soft: '#dbe4ff', sectionLogo: COMPANY_LOGO_URL } : { primary: '#284e8b', secondary: '#8ec6ff', soft: '#d8e9ff', sectionLogo: JUNIOR_LOGO_URL }; +const chunk = (items: T[], size: number) => { + const chunks: T[][] = []; + + for (let index = 0; index < items.length; index += size) { + chunks.push(items.slice(index, index + size)); + } + + return chunks; +}; + const renderHorizontalBars = ( items: { label: string; value: number; helper?: string }[], accentColor: string, @@ -399,11 +432,11 @@ const renderPageHeader = (report: SessionReportData, title: string) => { const accent = getAccent(report.section); return ( - + - + {title} {report.sectionLabel} @@ -487,6 +520,27 @@ const renderSquadCard = (squad: SquadSessionSummary) => ( ); +const renderMeetingLedgerTable = (meetings: SessionReportData['meetings']) => ( + + + Meeting + Present + Absent + Attend Rate + Marks + + {meetings.map((meeting, index) => ( + + {formatDate(meeting.date)} + {meeting.attendanceCount} + {meeting.absenceCount} + {`${formatNumber(meeting.attendanceRate)}%`} + {formatNumber(meeting.totalMarks)} + + ))} + +); + export interface SessionReportDocumentProps { report: SessionReportData; } @@ -495,6 +549,7 @@ const SessionReportDocument: React.FC = ({ report }) const accent = getAccent(report.section); const topMeetingMark = Math.max(...report.meetings.map((meeting) => meeting.totalMarks), 0); const topMonthMark = Math.max(...report.months.map((month) => month.totalMarks), 0); + const meetingChunks: SessionReportData['meetings'][] = chunk(report.meetings, 18); return ( = ({ report }) language="en-GB" > - - - - - - - BB Manager Master Session Report - {report.sectionLabel} - - {`A complete session summary covering attendance, marks, squad performance, and member-level detail from ${formatDate(report.range.startDate)} to ${formatDate(report.range.endDate)}.`} - - - - - Members - {report.headlineStats.memberCount} - - - Meetings - {report.headlineStats.meetingCount} + + + + BB Manager Master Session Report + {report.sectionLabel} + + {`A complete session summary covering attendance, marks, squad performance, and member-level detail from ${formatDate(report.range.startDate)} to ${formatDate(report.range.endDate)}.`} + + + + - - Attendance - {`${formatNumber(report.headlineStats.attendanceRate)}%`} + + - - Total Marks - {formatNumber(report.headlineStats.totalMarks)} + + + + + Members + {report.headlineStats.memberCount} + + + Meetings + {report.headlineStats.meetingCount} + + + Attendance + {`${formatNumber(report.headlineStats.attendanceRate)}%`} + + + Total Marks + {formatNumber(report.headlineStats.totalMarks)} + @@ -662,27 +723,20 @@ const SessionReportDocument: React.FC = ({ report }) )} - - - Meeting - Present - Absent - Attend Rate - Marks - - {report.meetings.map((meeting, index) => ( - - {formatDate(meeting.date)} - {meeting.attendanceCount} - {meeting.absenceCount} - {`${formatNumber(meeting.attendanceRate)}%`} - {formatNumber(meeting.totalMarks)} - - ))} - {renderPageFooter(report)} + {meetingChunks.map((meetingChunk, index) => ( + + {renderPageHeader(report, index === 0 ? 'Meeting Ledger' : 'Meeting Ledger Continued')} + + Meeting-by-meeting attendance and marks for the selected session range. + + {renderMeetingLedgerTable(meetingChunk)} + {renderPageFooter(report)} + + ))} + {renderPageHeader(report, 'Squad Breakdown')} @@ -704,18 +758,18 @@ const SessionReportDocument: React.FC = ({ report }) {renderPageHeader(report, `${member.name} Session Detail`)} - - + + Squad / Year {`S${member.squad} / ${member.year}`} {member.isSquadLeader ? 'Squad leader' : 'Member'} - + Attendance {`${formatNumber(member.attendanceRate)}%`} {`${member.attendanceCount} present, ${member.absenceCount} absent`} - + Total Marks {formatNumber(member.totalMarks)} {`Avg ${formatNumber(member.averageScoreWhenPresent)} when present`} @@ -759,51 +813,60 @@ const SessionReportDocument: React.FC = ({ report }) - Night-By-Night Marks - {renderHorizontalBars( - member.meetings.map((meeting) => ({ - label: formatDate(meeting.date), - value: meeting.attended ? meeting.score : 0, - helper: meeting.attended ? formatNumber(meeting.score) : 'Absent', - })), - accent.primary, - Math.max(...member.meetings.map((meeting) => meeting.score), 10), - )} + Session Performance + + Attendance record + {`${member.attendanceCount} / ${member.meetings.length}`} + + + Best score + {formatNumber(member.bestNightScore)} + + + Attendance rate + {`${formatNumber(member.attendanceRate)}%`} + + + Average when present + {formatNumber(member.averageScoreWhenPresent)} + - - - Date - Status - Score - {report.section === 'junior' && ( - Uniform - )} - {report.section === 'junior' && ( - Behaviour - )} - - {member.meetings.map((meeting, index) => ( - - {formatDate(meeting.date)} - {meeting.attended ? 'Present' : 'Absent'} - - {meeting.attended ? formatNumber(meeting.score) : '0'} - + + + + Date + Status + Score {report.section === 'junior' && ( - - {meeting.attended ? formatNumber(meeting.uniformScore ?? 0) : '-'} - + Uniform )} {report.section === 'junior' && ( - - {meeting.attended ? formatNumber(meeting.behaviourScore ?? 0) : '-'} - + Behaviour )} - ))} + {member.meetings.map((meeting, index) => ( + + {formatDate(meeting.date)} + {meeting.attended ? 'Present' : 'Absent'} + + {meeting.attended ? formatNumber(meeting.score) : '-'} + + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.uniformScore ?? 0) : '-'} + + )} + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.behaviourScore ?? 0) : '-'} + + )} + + ))} + {renderPageFooter(report)} From 2635be5f5e9b4951596a0a802db637f03691e13b Mon Sep 17 00:00:00 2001 From: harrisonk0 Date: Sun, 22 Mar 2026 21:14:54 +0000 Subject: [PATCH 3/4] Address PDF review feedback --- assets/branding/bb-background.jpg | Bin 0 -> 65442 bytes assets/branding/bb-logo.png | Bin 0 -> 69405 bytes assets/branding/company-logo.png | Bin 0 -> 34070 bytes assets/branding/junior-logo.png | Bin 0 -> 55503 bytes components/SessionReportModal.tsx | 19 ++- components/reports/SessionReportDocument.tsx | 122 ++++++++++++++----- docs/user-guide.md | 6 +- services/reporting/sessionReport.test.ts | 16 +++ 8 files changed, 126 insertions(+), 37 deletions(-) create mode 100644 assets/branding/bb-background.jpg create mode 100644 assets/branding/bb-logo.png create mode 100644 assets/branding/company-logo.png create mode 100644 assets/branding/junior-logo.png diff --git a/assets/branding/bb-background.jpg b/assets/branding/bb-background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a59dd4bd310fec849b96863445e5c6672b46d5fa GIT binary patch literal 65442 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

w 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 literal 0 HcmV?d00001 diff --git a/assets/branding/bb-logo.png b/assets/branding/bb-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c10599c94dd38e0388c4cce1de56a8c6be00c9 GIT binary patch literal 69405 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

4s#nfvyeIQ%b1;_*ixMO(WQ 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

|NadJH$_DR*5%N!f|+V1x8RD9oig}z3> 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 = ({ const sectionRange = useMemo(() => getSectionDateRange(boys), [boys]); const [startDate, setStartDate] = useState(sectionRange?.startDate ?? ''); const [endDate, setEndDate] = useState(sectionRange?.endDate ?? ''); + const inputBrandClasses = + activeSection === 'company' + ? 'focus:border-company-blue focus:ring-company-blue' + : 'focus:border-junior-blue focus:ring-junior-blue'; + const buttonBrandClasses = + activeSection === 'company' + ? 'bg-company-blue focus:ring-company-blue' + : 'bg-junior-blue focus:ring-junior-blue'; React.useEffect(() => { setStartDate(sectionRange?.startDate ?? ''); @@ -51,6 +59,9 @@ const SessionReportModal: React.FC = ({ const hasDataForRange = Boolean(report && report.headlineStats.meetingCount > 0); const sectionLabel = activeSection === 'company' ? 'Company Section' : 'Junior Section'; const filename = `${activeSection}-session-report-${startDate || 'start'}-to-${endDate || 'end'}.pdf`; + const estimatedPageCount = report + ? 1 + 1 + 1 + Math.max(1, Math.ceil(report.meetings.length / 18)) + 1 + Math.max(1, Math.ceil(report.members.length / (activeSection === 'junior' ? 14 : 16))) + report.members.reduce((sum, member) => sum + 1 + Math.ceil(Math.max(member.meetings.length - 14, 0) / 22), 0) + : 0; return ( @@ -80,7 +91,7 @@ const SessionReportModal: React.FC = ({ min={sectionRange.startDate} max={sectionRange.endDate} onChange={(event) => setStartDate(event.target.value)} - className="w-full rounded-md border border-slate-300 px-3 py-2 text-slate-900 shadow-sm focus:border-company-blue focus:outline-none focus:ring-2 focus:ring-company-blue" + className={`w-full rounded-md border border-slate-300 px-3 py-2 text-slate-900 shadow-sm focus:outline-none focus:ring-2 ${inputBrandClasses}`} /> @@ -114,7 +125,7 @@ const SessionReportModal: React.FC = ({

@@ -145,7 +156,7 @@ const SessionReportModal: React.FC = ({ } fileName={filename} - className="inline-flex items-center rounded-md bg-company-blue px-4 py-2 text-sm font-medium text-white hover:brightness-95 focus:outline-none focus:ring-2 focus:ring-company-blue focus:ring-offset-2" + className={`inline-flex items-center rounded-md px-4 py-2 text-sm font-medium text-white hover:brightness-95 focus:outline-none focus:ring-2 focus:ring-offset-2 ${buttonBrandClasses}`} > {({ loading }) => (loading ? 'Preparing PDF...' : 'Download Master PDF')} diff --git a/components/reports/SessionReportDocument.tsx b/components/reports/SessionReportDocument.tsx index 21a39f8..1290971 100644 --- a/components/reports/SessionReportDocument.tsx +++ b/components/reports/SessionReportDocument.tsx @@ -8,12 +8,16 @@ import { View, } from '@react-pdf/renderer'; -import type { MemberSessionSummary, SessionReportData, SquadSessionSummary } from '../../types/reporting'; +import type { MemberMeetingRecord, MemberSessionSummary, SessionReportData, SquadSessionSummary } from '../../types/reporting'; +import bbLogo from '../../assets/branding/bb-logo.png'; +import bbBackground from '../../assets/branding/bb-background.jpg'; +import companyLogo from '../../assets/branding/company-logo.png'; +import juniorLogo from '../../assets/branding/junior-logo.png'; -const BB_LOGO_URL = 'https://i.postimg.cc/FHrS3pzD/full-colour-boxed-logo.png'; -const BB_BACKGROUND_URL = 'https://i.postimg.cc/MKD36t18/mixed-activities.jpg'; -const COMPANY_LOGO_URL = 'https://i.postimg.cc/0j44DjdY/company-boxed-colour.png'; -const JUNIOR_LOGO_URL = 'https://i.postimg.cc/W1qvWLdp/juniors-boxed-colour.png'; +const BB_LOGO_URL = bbLogo; +const BB_BACKGROUND_URL = bbBackground; +const COMPANY_LOGO_URL = companyLogo; +const JUNIOR_LOGO_URL = juniorLogo; const styles = StyleSheet.create({ page: { @@ -458,34 +462,34 @@ const renderPageFooter = (report: SessionReportData) => ( const renderMemberTable = (members: MemberSessionSummary[], section: SessionReportData['section']) => ( - Member - Squad - Year - Attend - Absent - Rate + Member + Squad + Year + Attend + Absent + Rate Total {section === 'junior' && ( - Uniform + Uniform )} {section === 'junior' && ( - Behav. + Behav. )} {members.map((member, index) => ( - {member.name} - {String(member.squad)} - {String(member.year)} - {member.attendanceCount} - {member.absenceCount} - {`${formatNumber(member.attendanceRate)}%`} + {member.name} + {String(member.squad)} + {String(member.year)} + {member.attendanceCount} + {member.absenceCount} + {`${formatNumber(member.attendanceRate)}%`} {formatNumber(member.totalMarks)} {section === 'junior' && ( - {formatNumber(member.uniformTotal ?? 0)} + {formatNumber(member.uniformTotal ?? 0)} )} {section === 'junior' && ( - {formatNumber(member.behaviourTotal ?? 0)} + {formatNumber(member.behaviourTotal ?? 0)} )} ))} @@ -550,6 +554,10 @@ const SessionReportDocument: React.FC = ({ report }) const topMeetingMark = Math.max(...report.meetings.map((meeting) => meeting.totalMarks), 0); const topMonthMark = Math.max(...report.months.map((month) => month.totalMarks), 0); const meetingChunks: SessionReportData['meetings'][] = chunk(report.meetings, 18); + const squadMemberChunks: MemberSessionSummary[][] = chunk( + report.members, + report.section === 'junior' ? 14 : 16, + ); return ( = ({ report }) membership size, how consistently members attended, how many marks were awarded, and which members led the section overall. - + Total attendance records {report.headlineStats.attendanceCount} @@ -635,7 +643,7 @@ const SessionReportDocument: React.FC = ({ report }) - + Top Members @@ -679,7 +687,7 @@ const SessionReportDocument: React.FC = ({ report }) {renderPageHeader(report, 'Attendance And Marks Trends')} - + Meeting Attendance Rate @@ -710,7 +718,7 @@ const SessionReportDocument: React.FC = ({ report }) - + Monthly Session Pattern {renderHorizontalBars( report.months.map((month) => ({ @@ -745,20 +753,30 @@ const SessionReportDocument: React.FC = ({ report }) and where section leadership might want to focus at the start of the next session. - + {report.squads.filter((_, index) => index % 2 === 0).map(renderSquadCard)} {report.squads.filter((_, index) => index % 2 === 1).map(renderSquadCard)} - {renderMemberTable(report.members, report.section)} {renderPageFooter(report)} + {squadMemberChunks.map((memberChunk, index) => ( + + {renderPageHeader(report, index === 0 ? 'Section Member Ledger' : 'Section Member Ledger Continued')} + + Full member-level attendance and marks summary for the selected session range. + + {renderMemberTable(memberChunk, report.section)} + {renderPageFooter(report)} + + ))} + {report.members.map((member) => ( {renderPageHeader(report, `${member.name} Session Detail`)} - + Squad / Year {`S${member.squad} / ${member.year}`} @@ -776,7 +794,7 @@ const SessionReportDocument: React.FC = ({ report }) - + Member Summary @@ -847,7 +865,7 @@ const SessionReportDocument: React.FC = ({ report }) Behaviour )} - {member.meetings.map((meeting, index) => ( + {member.meetings.slice(0, 14).map((meeting, index) => ( {formatDate(meeting.date)} {meeting.attended ? 'Present' : 'Absent'} @@ -871,6 +889,50 @@ const SessionReportDocument: React.FC = ({ report }) {renderPageFooter(report)} ))} + + {report.members.flatMap((member) => + chunk(member.meetings.slice(14), 22).map((meetingChunk, index) => ( + + {renderPageHeader(report, `${member.name} Session Detail Continued`)} + + Continued meeting-by-meeting record for this member. + + + + Date + Status + Score + {report.section === 'junior' && ( + Uniform + )} + {report.section === 'junior' && ( + Behaviour + )} + + {meetingChunk.map((meeting, meetingIndex) => ( + + {formatDate(meeting.date)} + {meeting.attended ? 'Present' : 'Absent'} + + {meeting.attended ? formatNumber(meeting.score) : '-'} + + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.uniformScore ?? 0) : '-'} + + )} + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.behaviourScore ?? 0) : '-'} + + )} + + ))} + + {renderPageFooter(report)} + + )), + )} ); }; diff --git a/docs/user-guide.md b/docs/user-guide.md index e811927..52b6070 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -32,9 +32,9 @@ flowchart LR 1. Sign in with your Supabase account. 2. Choose the section you are responsible for. -3. Use `Home` to manage the member roster. -4. Use `Weekly Marks` for weekly attendance and scoring. -5. Use `Dashboard` when you want a quick summary of section performance or need the session PDF. +3. Manage the member roster from `Home`. +4. Record weekly attendance and scoring in `Weekly Marks`. +5. View section performance or download the session PDF from `Dashboard`. ## Member Management diff --git a/services/reporting/sessionReport.test.ts b/services/reporting/sessionReport.test.ts index affc88b..9d5cb9d 100644 --- a/services/reporting/sessionReport.test.ts +++ b/services/reporting/sessionReport.test.ts @@ -49,6 +49,22 @@ describe('sessionReport', () => { }); }); + it('returns null when there are no marks to report', () => { + expect(getSectionDateRange([])).toBeNull(); + expect( + getSectionDateRange([ + { + id: 'member-empty', + name: 'No Marks', + squad: 1, + year: 10, + isSquadLeader: false, + marks: [], + }, + ]), + ).toBeNull(); + }); + it('builds section, squad, meeting, and top-member summaries', () => { const report = buildSessionReportData({ boys: companyBoys, From 1ceac674dca76fd9728f6da7b3b594482a467d49 Mon Sep 17 00:00:00 2001 From: harrisonk0 Date: Sun, 22 Mar 2026 21:20:47 +0000 Subject: [PATCH 4/4] Keep member continuation pages inline --- components/reports/SessionReportDocument.tsx | 277 ++++++++++--------- 1 file changed, 139 insertions(+), 138 deletions(-) diff --git a/components/reports/SessionReportDocument.tsx b/components/reports/SessionReportDocument.tsx index 1290971..a3baa53 100644 --- a/components/reports/SessionReportDocument.tsx +++ b/components/reports/SessionReportDocument.tsx @@ -772,167 +772,168 @@ const SessionReportDocument: React.FC = ({ report }) ))} - {report.members.map((member) => ( - - {renderPageHeader(report, `${member.name} Session Detail`)} - - - - Squad / Year - {`S${member.squad} / ${member.year}`} - {member.isSquadLeader ? 'Squad leader' : 'Member'} - - - Attendance - {`${formatNumber(member.attendanceRate)}%`} - {`${member.attendanceCount} present, ${member.absenceCount} absent`} - - - Total Marks - {formatNumber(member.totalMarks)} - {`Avg ${formatNumber(member.averageScoreWhenPresent)} when present`} + {report.members.flatMap((member) => { + const continuationChunks = chunk(member.meetings.slice(14), 22); + + return [ + + {renderPageHeader(report, `${member.name} Session Detail`)} + + + + Squad / Year + {`S${member.squad} / ${member.year}`} + {member.isSquadLeader ? 'Squad leader' : 'Member'} + + + Attendance + {`${formatNumber(member.attendanceRate)}%`} + {`${member.attendanceCount} present, ${member.absenceCount} absent`} + + + Total Marks + {formatNumber(member.totalMarks)} + {`Avg ${formatNumber(member.averageScoreWhenPresent)} when present`} + - - - - - Member Summary - - Best night - - {member.bestNightDate ? `${formatNumber(member.bestNightScore)} on ${formatDate(member.bestNightDate)}` : 'N/A'} - - - - Last attended - {member.lastAttendedDate ? formatDate(member.lastAttendedDate) : 'N/A'} + + + + Member Summary + + Best night + + {member.bestNightDate ? `${formatNumber(member.bestNightScore)} on ${formatDate(member.bestNightDate)}` : 'N/A'} + + + + Last attended + {member.lastAttendedDate ? formatDate(member.lastAttendedDate) : 'N/A'} + + {report.section === 'junior' && ( + + Uniform total + {formatNumber(member.uniformTotal ?? 0)} + + )} + {report.section === 'junior' && ( + + Behaviour total + {formatNumber(member.behaviourTotal ?? 0)} + + )} + {report.section === 'company' && ( + + Recorded meetings + {member.meetings.length} + + )} - {report.section === 'junior' && ( + + + + + Session Performance - Uniform total - {formatNumber(member.uniformTotal ?? 0)} + Attendance record + {`${member.attendanceCount} / ${member.meetings.length}`} - )} - {report.section === 'junior' && ( - - Behaviour total - {formatNumber(member.behaviourTotal ?? 0)} + + Best score + {formatNumber(member.bestNightScore)} + + + Attendance rate + {`${formatNumber(member.attendanceRate)}%`} - )} - {report.section === 'company' && ( - Recorded meetings - {member.meetings.length} + Average when present + {formatNumber(member.averageScoreWhenPresent)} - )} - - - - - - Session Performance - - Attendance record - {`${member.attendanceCount} / ${member.meetings.length}`} - - - Best score - {formatNumber(member.bestNightScore)} - - - Attendance rate - {`${formatNumber(member.attendanceRate)}%`} - - - Average when present - {formatNumber(member.averageScoreWhenPresent)} - - - - - Date - Status - Score - {report.section === 'junior' && ( - Uniform - )} - {report.section === 'junior' && ( - Behaviour - )} - - {member.meetings.slice(0, 14).map((meeting, index) => ( - - {formatDate(meeting.date)} - {meeting.attended ? 'Present' : 'Absent'} - - {meeting.attended ? formatNumber(meeting.score) : '-'} - + + + + Date + Status + Score {report.section === 'junior' && ( - - {meeting.attended ? formatNumber(meeting.uniformScore ?? 0) : '-'} - + Uniform )} {report.section === 'junior' && ( - - {meeting.attended ? formatNumber(meeting.behaviourScore ?? 0) : '-'} - + Behaviour )} - ))} - - - {renderPageFooter(report)} - - ))} - - {report.members.flatMap((member) => - chunk(member.meetings.slice(14), 22).map((meetingChunk, index) => ( - - {renderPageHeader(report, `${member.name} Session Detail Continued`)} - - Continued meeting-by-meeting record for this member. - - - - Date - Status - Score - {report.section === 'junior' && ( - Uniform - )} - {report.section === 'junior' && ( - Behaviour - )} + {member.meetings.slice(0, 14).map((meeting, index) => ( + + {formatDate(meeting.date)} + {meeting.attended ? 'Present' : 'Absent'} + + {meeting.attended ? formatNumber(meeting.score) : '-'} + + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.uniformScore ?? 0) : '-'} + + )} + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.behaviourScore ?? 0) : '-'} + + )} + + ))} - {meetingChunk.map((meeting, meetingIndex) => ( - - {formatDate(meeting.date)} - {meeting.attended ? 'Present' : 'Absent'} - - {meeting.attended ? formatNumber(meeting.score) : '-'} - + + {renderPageFooter(report)} + , + ...continuationChunks.map((meetingChunk, index) => ( + + {renderPageHeader(report, `${member.name} Session Detail Continued`)} + + Continued meeting-by-meeting record for this member. + + + + Date + Status + Score {report.section === 'junior' && ( - - {meeting.attended ? formatNumber(meeting.uniformScore ?? 0) : '-'} - + Uniform )} {report.section === 'junior' && ( - - {meeting.attended ? formatNumber(meeting.behaviourScore ?? 0) : '-'} - + Behaviour )} - ))} - - {renderPageFooter(report)} - - )), - )} + {meetingChunk.map((meeting, meetingIndex) => ( + + {formatDate(meeting.date)} + {meeting.attended ? 'Present' : 'Absent'} + + {meeting.attended ? formatNumber(meeting.score) : '-'} + + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.uniformScore ?? 0) : '-'} + + )} + {report.section === 'junior' && ( + + {meeting.attended ? formatNumber(meeting.behaviourScore ?? 0) : '-'} + + )} + + ))} + + {renderPageFooter(report)} + + )), + ]; + })} ); };