Modified by www.SourceFiles.app
This commit is contained in:
@@ -1,66 +0,0 @@
|
|||||||
// 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";
|
|
||||||
Reference in New Issue
Block a user