currentSchoolYear() uses date.getMonth() >= 6 (June = 5 in JS, so July = 6).
On 19 August 2026 the current year is 2026-2027; previous is 2025-2026.
Year settings
Collectionschoolyearsettings, unique schoolYear:
GET /api/school-year?schoolYear=2026-2027 (any authenticated user) also returns planCounts (total, unfinished, liveOverrides) and cycle (latest year, next year, default July–June term, settings that would carry over).
PUT /api/school-year (Super Admin) body includes schoolYear, archived, questionBankVersion, deadlines, districtGoals. Set archived: false to make the whole year live again.
Set up the next year
Super Admin, Year setup (/dashboard?view=bulk-create). Detects the latest year in schoolyearsettings and school plans, then creates the next cycle without copying plans.
fromYear is optional. If omitted, the API uses the latest year already stored.
Creates a SchoolYearSettings document for 2027-2028:
- Term dates default to July 1, 2027 – June 30, 2028
- Carries over pinned question-bank version, district goals, and section due dates shifted +1 year
- Leaves historical plans and the source year unchanged (
archivedstays as-is) 409if that next year already has settings
Reopen unfinished last-year plans
Rollover archives the source year. If some principals still need to finish:- One school: Submissions → Make live on that row. The year stays archived; only that plan is editable (
allowEditsWhenArchived). - Whole year: System → Reopen an archived year, or Year setup → Make this year live.
POST /api/admin/forms/live { "formId": "...", "live": true } (Super Admin).
The form status strip shows “Year archived · this plan is live so it can be finished” when an override is on.
Duplicate one school
Principals and Super Admins:409 if that school already has a plan for the target year unless { "force": true }.
District rollover
Super Admin only. Copies the latest plan per school fromsourceYear into targetYear, then archives sourceYear.
created, skipped (already exists), errors, and archivedYear.
What is copied
What is copied
All
formData[*].data answers, school name, principal, owner assignment. Completions are preserved when a step has answers.What is not copied
What is not copied
Status (new plan is
draft), comments, review fields, sharedWithEmails, attestation, locks.Empty counseling
Empty counseling
If last year’s
counselingPlan.data was empty, the copy is empty too. That is expected.