Skip to main content
NYC school years run July through June. 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 setup Caption: Add screenshot showing Super Admin Year setup (dashboard ?view=bulk-create) with rollover controls, archive toggle, deadlines, and pinned question-bank version.

Year settings

Collection schoolyearsettings, 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 (archived stays as-is)
  • 409 if that next year already has settings
After setup, use Copy last year into this year when you are ready to duplicate school plans.

Reopen unfinished last-year plans

Rollover archives the source year. If some principals still need to finish:
  1. One school: Submissions → Make live on that row. The year stays archived; only that plan is editable (allowEditsWhenArchived).
  2. 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:
Response:
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 from sourceYear into targetYear, then archives sourceYear.
Returns created, skipped (already exists), errors, and archivedYear.
All formData[*].data answers, school name, principal, owner assignment. Completions are preserved when a step has answers.
Status (new plan is draft), comments, review fields, sharedWithEmails, attestation, locks.
If last year’s counselingPlan.data was empty, the copy is empty too. That is expected.