From 4d3672a4f060e39f2f8463ba2e93b216469d3b76 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 7 Aug 2026 04:15:21 +0000 Subject: [PATCH] Modified by www.SourceFiles.app --- src/lib/reports.ts | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/lib/reports.ts diff --git a/src/lib/reports.ts b/src/lib/reports.ts new file mode 100644 index 0000000..d55cffe --- /dev/null +++ b/src/lib/reports.ts @@ -0,0 +1,66 @@ +// Shared helpers for the printable documents: report cards, progress reports, +// and tuition invoices. +import { todayISO } from "@/lib/plans"; + +export const SCHOOL_NAME = "Bayside Academy"; + +export const money = (cents: number) => + `${cents < 0 ? "-" : ""}$${(Math.abs(cents) / 100).toFixed(2)}`; + +export type AttendanceRow = { status: string; date: string }; + +export type AttendanceCounts = { + present: number; + late: number; + absent: number; + excused: number; + recorded: number; + /** Share of recorded days the student actually attended (present or late). */ + attendedPct: number | null; +}; + +export function summarizeAttendance( + rows: AttendanceRow[], + from: string, + to: string, +): AttendanceCounts { + const inRange = rows.filter((r) => r.date >= from && r.date <= to); + const count = (s: string) => inRange.filter((r) => r.status === s).length; + const present = count("present"); + const late = count("late"); + const absent = count("absent"); + const excused = count("excused"); + const recorded = inRange.length; + return { + present, + late, + absent, + excused, + recorded, + attendedPct: recorded === 0 ? null : ((present + late) / recorded) * 100, + }; +} + +// School year runs Aug 1 → Jul 31, so a report pulled in e.g. February still +// covers the year that began the previous August. +export function schoolYearRange(today = new Date()): { from: string; to: string } { + const startYear = today.getMonth() >= 7 ? today.getFullYear() : today.getFullYear() - 1; + return { from: `${startYear}-08-01`, to: `${startYear + 1}-07-31` }; +} + +export function monthToDateRange(today = new Date()): { from: string; to: string } { + const y = today.getFullYear(); + const m = String(today.getMonth() + 1).padStart(2, "0"); + return { from: `${y}-${m}-01`, to: todayISO() }; +} + +export const REPORT_TYPES = [ + { value: "report_card", label: "Report card" }, + { value: "progress", label: "Academic progress report" }, + { value: "iep", label: "504 / IEP progress report" }, +] as const; + +export type ReportType = (typeof REPORT_TYPES)[number]["value"]; + +export const reportTitle = (t: ReportType) => + REPORT_TYPES.find((r) => r.value === t)?.label ?? "Report";