-- Expand student intake to match Bayside Academy's paper forms: -- Student Information Form + Authorized Persons Pick-Up Form. -- ── Extra columns on students ──────────────────────────────────────────────── ALTER TABLE public.students ADD COLUMN IF NOT EXISTS gender TEXT, ADD COLUMN IF NOT EXISTS grade_level TEXT, ADD COLUMN IF NOT EXISTS preferred_start_date DATE, -- health (allergies TEXT already exists) ADD COLUMN IF NOT EXISTS chronic_conditions TEXT, ADD COLUMN IF NOT EXISTS primary_physician TEXT, ADD COLUMN IF NOT EXISTS physician_phone TEXT, -- academic ADD COLUMN IF NOT EXISTS home_ed_eval_due DATE, ADD COLUMN IF NOT EXISTS previous_schools TEXT, ADD COLUMN IF NOT EXISTS special_needs TEXT, ADD COLUMN IF NOT EXISTS portfolio_keeper TEXT, -- 'parent' | 'bayside' ADD COLUMN IF NOT EXISTS disciplinary_history TEXT, ADD COLUMN IF NOT EXISTS custody_agreement TEXT, -- explanation; blank = none -- independent dismissal ADD COLUMN IF NOT EXISTS dismissal_methods TEXT[] NOT NULL DEFAULT '{}', ADD COLUMN IF NOT EXISTS dismissal_other TEXT, ADD COLUMN IF NOT EXISTS backup_transport_plan TEXT, -- additional ADD COLUMN IF NOT EXISTS interests TEXT, ADD COLUMN IF NOT EXISTS other_info TEXT, -- agreement ADD COLUMN IF NOT EXISTS agreement_signed_by TEXT, ADD COLUMN IF NOT EXISTS agreement_signed_date DATE; -- ── Primary / secondary guardians ──────────────────────────────────────────── CREATE TABLE IF NOT EXISTS public.student_guardians ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), student_id UUID NOT NULL REFERENCES public.students(id) ON DELETE CASCADE, is_primary BOOLEAN NOT NULL DEFAULT TRUE, full_name TEXT NOT NULL, relationship TEXT, phone TEXT, address TEXT, city TEXT, state TEXT, zip TEXT, email TEXT, employer TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_student_guardians_student ON public.student_guardians(student_id); ALTER TABLE public.student_guardians ENABLE ROW LEVEL SECURITY; CREATE POLICY "guardians read" ON public.student_guardians FOR SELECT TO authenticated USING ( public.current_user_has_role('admin') OR public.is_parent_of(student_id) OR public.teaches_student(student_id) ); CREATE POLICY "guardians write parent or admin" ON public.student_guardians FOR ALL TO authenticated USING (public.current_user_has_role('admin') OR public.is_parent_of(student_id)) WITH CHECK (public.current_user_has_role('admin') OR public.is_parent_of(student_id)); -- ── Curriculum platform logins (repeatable) ────────────────────────────────── CREATE TABLE IF NOT EXISTS public.student_curriculum_logins ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), student_id UUID NOT NULL REFERENCES public.students(id) ON DELETE CASCADE, website TEXT, student_login TEXT, student_password TEXT, parent_account TEXT, parent_password TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_curriculum_logins_student ON public.student_curriculum_logins(student_id); ALTER TABLE public.student_curriculum_logins ENABLE ROW LEVEL SECURITY; CREATE POLICY "curriculum read" ON public.student_curriculum_logins FOR SELECT TO authenticated USING ( public.current_user_has_role('admin') OR public.is_parent_of(student_id) OR public.teaches_student(student_id) ); CREATE POLICY "curriculum write parent or admin" ON public.student_curriculum_logins FOR ALL TO authenticated USING (public.current_user_has_role('admin') OR public.is_parent_of(student_id)) WITH CHECK (public.current_user_has_role('admin') OR public.is_parent_of(student_id)); -- ── Authorized pickups: also hold emergency contacts + notes ───────────────── ALTER TABLE public.authorized_pickups ADD COLUMN IF NOT EXISTS alt_phone TEXT, ADD COLUMN IF NOT EXISTS notes TEXT, ADD COLUMN IF NOT EXISTS kind TEXT NOT NULL DEFAULT 'pickup', -- 'pickup' | 'emergency' ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0;