Skip to content

SIS Database ER Diagrams (core + records + studentfinance + lms + payments) ​

Superseded — historical revision only

This is revision 8 (2026-09-22), kept for history. Despite its file name it is not revision 7: it was generated by docs/generate_erd.py and stops at migration 263, and the database is now at 298.

Use the current ER diagram instead (revision 9), or read it as one page.

Generated 2026-09-22 from the live PostgreSQL database (revision 8).

Schemas: core (71 entities + 41 lookup_*), records (128 entities + 69 lookup_*), studentfinance (38 entities + 6 lookup_*), lms (24 entities + 0 lookup_*), payments (4 entities + 0 lookup_*) — 265 entities drawn across 22 sections.

Generated, not hand-written. Revisions 3–6 were maintained by hand and drifted from the schema they described; revision 6 contained two entity blocks with no header at all, so core.departments and core.colleges_schools were referenced by relationships that pointed at nothing and never rendered. Revision 7 fixed that by emitting from information_schema, but its generator was never committed, so it could not be re-run. Revision 8 is produced by docs/generate_erd.py, which is committed — every attribute, type and relationship below is what the database actually holds.

Conventions:

  • Entity names carry their schema with a double underscore: core__campuses, records__course_sections. Mermaid has no schema-qualified names.
  • lookup_* tables are referenced by foreign key but not drawn — 161 such references exist, and drawing them would bury the structure. Since migration 083 each lookup table's primary key is named after the table minus its lookup_ prefix (lookup_program_status.program_status_id).
  • Attribute types carry length and precision from the live schema. Numeric precision is written numeric(p_s) with an underscore, not numeric(p,s). That looks like a typo and is not: the Mermaid version in use when revision 6 set the convention rejected a comma inside an attribute-type token. Mermaid 11 permits one, but the underscore is kept so revisions 6 through 8 read alike. Unbounded numeric columns are shown without precision, and array columns as int[], text[], varchar[] — brackets the grammar has always allowed.
  • Each attribute carries at most one marker, in the order PK > FK > UK. A column that is both a foreign key and uniquely constrained shows FK.
  • UK marks single-column UNIQUE constraints only. A unique index with no constraint behind it is not marked — core.campuses.colleague_location_code is one such column.
  • The four audit columns (created_at, created_by, updated_at, updated_by) are present on nearly every table and are omitted from the diagrams.
  • A section draws only the relationships whose two ends both live in it. Edges that leave a section are listed in the two summaries at the end rather than drawn, so an entity block is never the whole story about what points at it. Revision 7 followed this rule without stating it and without listing the edges it dropped.
  • The admissions and financialaid schemas are not diagrammed. Both are retired — admissions moved to a separate system in August 2026 and financial aid is deliberately unreachable — but the schemas and their rows survive, and foreign keys still point into them from the schemas drawn here.

Revision 8 changes (migrations 168–263):

  • The lms schema is diagrammed for the first time — 24 entities in three new sections (§18 connector definitions, §19 instances and mappings, §20 shells and sync). Migration 199 created it and 202 dropped the seven legacy records.lms_* tables revision 7 drew in its §11, so that section is now §11 Records - Course Materials and holds only what its name says. An LMS type is data, not code: connector definitions live in connector_operations / operation_versions as versioned JSONB.
  • payments is diagrammed for the first time — §21, four entities behind the ACI online payment flow (migration 153).
  • 33 entities added net, 8 removed. Revision 7 drew 232; this draws 265.
  • A cross-section summary now exists. A section only ever drew edges wholly inside itself, which silently hid every same-schema foreign key that crossed a section boundary — 157 of them. They are tabulated at the end instead of being lost.
  • 177 — hold types came from Colleague: hold_type_roles arrived and lookup_hold_type / lookup_hold_reason went, replaced by severity, enforcement_level and student_visible columns on hold_types.
  • 181, 185, 186, 246, 256 — cohorts unified onto records.cohorts. student_cohorts and lookup_cohort_type in; student_cohort_groups and lookup_cohort_group out. Lockstep cohorts then added cohort_advisors and cohort_majors, and the membership key widened to include the academic level (NULLS NOT DISTINCT), because a federal cohort sits one per level.
  • 238, 240 — records.institutions and transfer_course_equivalencies: a real sending institution and a saved equivalency library, with lookup_institution_type classifying four-year status at the type level.
  • 203, 232, 243, 244 — the transcript got stricter: grade_releases gates faculty grades, cancelled and dropped enrollments come off the official record without being deleted, and student_noncredit_completions counts Colleague's non-credit work toward requirements.
  • 236, 253 — requirement structure is now declared, not derived: group_role, min_child_groups and credits_source on requirement_groups, and bulletin_id on the major/minor block junctions so a student is held to the requirement sets their own catalog declares.
  • 221 — seats_reserved on course_sections is a second counter beside the occupancy trigger's, not a widening of it: a plan reserves a seat without occupying it.
  • 171, 178, 182, 194, 195 — core.state_provinces, photo_sync_runs, and identifier type configuration (country_mode, state_mode, input_mask, validation_regex, allow_multiple) with issuing country and state on person_identifiers.
  • 081, 212 — the audit trail gained ferpa_change_log (§3b).
  • 183, 217–224 — workflow_instance_step_assignees, and registration grew an approval lifecycle: transactions, step history, prerequisite and capacity overrides.
  • 188 — academic_level_grading_systems: grading resolves section → course → academic-level default.
  • 259, 260 — an approval step can carry a form of its own: workflow_steps.form_template_id and workflow_instance_steps.form_response_id (unique), so an approver answers questions rather than only deciding. The GRID field type those forms use is a grid_config_json column on admissions.form_fields, which is not drawn here — admissions is out of scope for this diagram.
  • 261, 262 — student_term_enrollments.colleague_sttr_status keeps Colleague's declared term status verbatim, mirroring what 243 did for section enrollments. lookup_section_enrollment_status is gone: it sat beside lookup_enrollment_status carrying the same ids with opposite meanings, and the dashboard view that joined it published WITHDRAWN for 44,015 completed enrollments.
  • 263 — course_sections.instructional_method_id → lookup_instructional_method: the pedagogy Colleague declares (lecture, lab, practicum — 26 values), stored beside the modalityinstruction_mode_id derives from it. Storing the declared method is what lets the derivation be re-audited without going back to ODS.

1. Core - Organization ​

mermaid
erDiagram
    core__buildings {
        int building_id PK
        varchar(20) building_code UK
        varchar(200) name
        varchar(500) address
        bool is_active
        int campus_id FK
    }
    core__campuses {
        int campus_id PK
        varchar(20) campus_code UK
        varchar(200) campus_name
        bool is_online
        bool is_open_to_all
        varchar(200) address_line1
        varchar(200) address_line2
        varchar(100) city
        varchar(50) state
        varchar(20) postal_code
        int country_id FK
        varchar(50) phone
        int sort_order
        bool is_active
        varchar(10) colleague_location_code
    }
    core__clubs_organizations {
        int org_id PK
        varchar(20) org_code UK
        varchar(200) name
        text description
        int org_type_id FK
        uuid advisor_person_id FK
        bool is_active
    }
    core__colleges_schools {
        int college_id PK
        varchar(20) college_code UK
        varchar(200) name
        bool is_active
        int org_unit_id FK
    }
    core__countries {
        int country_id PK
        varchar(2) iso_code UK
        varchar(3) iso_code_3
        varchar(100) country_name
        bool visa_required
        int sort_order
        bool is_active
    }
    core__department_college_mapping {
        int mapping_id PK
        int department_id FK
        int college_id FK
        bool is_primary
    }
    core__departments {
        int department_id PK
        varchar(20) department_code UK
        varchar(200) name
        text description
        int parent_department_id FK
        bool is_active
        varchar(50) gl_credit_hour_billing
        varchar(50) gl_section_fee_billing
        varchar(50) gl_lab_fee_billing
        int org_unit_id FK
    }
    core__org_units {
        int unit_id PK
        varchar(30) unit_code
        varchar(200) name
        text description
        int unit_type_id FK
        int parent_unit_id FK
        int sort_order
        bool is_active
    }
    core__room_features {
        int room_feature_id PK
        int room_id FK
        int feature_id FK
    }
    core__rooms {
        int room_id PK
        int building_id FK
        varchar(20) room_number
        int capacity
        int room_type_id FK
        bool is_active
    }
    core__state_provinces {
        int state_province_id PK
        int country_id FK
        varchar(6) code
        varchar(100) name
        int sort_order
        bool is_active
    }
    core__student_organization_membership {
        int membership_id PK
        int student_id FK
        int org_id FK
        int role_id FK
        date start_date
        date end_date
        bool is_active
    }
    core__unit_administrators {
        int admin_id PK
        uuid person_id FK
        bool is_active
        date effective_date
        date end_date
        int org_unit_id FK
        int admin_level_id FK
    }
    core__unit_course_codes {
        int unit_course_code_id PK
        varchar(20) course_code_prefix UK
        int department_id FK
        int college_id FK
    }
    core__campuses ||--o{ core__buildings : "campus_id"
    core__countries ||--o{ core__campuses : "country_id"
    core__org_units ||--o{ core__colleges_schools : "org_unit_id"
    core__colleges_schools ||--o{ core__department_college_mapping : "college_id"
    core__departments ||--o{ core__department_college_mapping : "department_id"
    core__org_units ||--o{ core__departments : "org_unit_id"
    core__departments ||--o{ core__departments : "parent"
    core__org_units ||--o{ core__org_units : "parent"
    core__rooms ||--o{ core__room_features : "room_id"
    core__buildings ||--o{ core__rooms : "building_id"
    core__countries ||--o{ core__state_provinces : "country_id"
    core__clubs_organizations ||--o{ core__student_organization_membership : "org_id"
    core__org_units ||--o{ core__unit_administrators : "org_unit_id"
    core__colleges_schools ||--o{ core__unit_course_codes : "college_id"
    core__departments ||--o{ core__unit_course_codes : "department_id"

2. Core - People & Identity ​

mermaid
erDiagram
    core__people {
        uuid person_id PK
        varchar(255) primary_email
        date date_of_birth
        int gender_id FK
        varchar(3) nationality_country_code
        varchar(3) citizenship_country_code
        bool is_active
        int religion_id FK
        int ethnicity_id FK
        int country_of_birth_id FK
        int citizenship_country_id FK
        varchar(50) person_id_number
        date deceased_date
        int marital_status_id FK
        int veteran_status_id FK
        int primary_language_id FK
        bool ferpa_opt_out
        uuid merged_into_person_id FK
        varchar(32) legacy_person_id
    }
    core__person_activities {
        int activity_id PK
        uuid person_id FK
        int activity_type_id FK
        varchar(200) name
        varchar(200) organization
        varchar(200) position_title
        date start_date
        date end_date
        bool is_current
        numeric hours_per_week
        int weeks_per_year
        varchar(50) participation_grades
        varchar(1000) description
        varchar(1000) accomplishments
        bool continue_in_college
        int sort_order
        bool is_active
    }
    core__person_addresses {
        int legacy_address_id
        uuid person_id FK
        int address_type_id FK
        varchar(255) address_line_1
        varchar(255) address_line_2
        varchar(255) address_line_3
        varchar(100) city
        varchar(100) state_province
        varchar(20) postal_code
        varchar(3) country_code
        date effective_date
        date end_date
        bool is_current
        bool is_primary
        uuid person_address_id PK
        varchar(32) legacy_id
    }
    core__person_emails {
        int legacy_email_id
        uuid person_id FK
        int email_type_id FK
        varchar(255) email_address
        date effective_date
        date end_date
        bool is_current
        bool is_primary
        uuid person_email_id PK
        varchar(32) legacy_id
    }
    core__person_essays {
        int legacy_essay_id
        uuid person_id FK
        int application_id FK
        int essay_type_id FK
        varchar(2000) prompt
        text content
        int word_count
        int version_number
        bool is_current_version
        varchar(20) status
        timestamp submitted_at
        uuid person_essay_id PK
        varchar(32) legacy_id
    }
    core__person_family_members {
        int legacy_family_member_id
        uuid person_id FK
        int relationship_id FK
        varchar(100) first_name
        varchar(100) last_name
        bool is_living
        bool is_deceased
        varchar(254) email
        varchar(30) phone
        int education_level_id FK
        varchar(200) college_name
        int college_graduation_year
        varchar(200) occupation
        varchar(200) employer
        int age
        bool is_alumni
        int alumni_graduation_year
        int sort_order
        uuid person_family_member_id PK
        varchar(32) legacy_id
    }
    core__person_honors {
        int honor_id PK
        uuid person_id FK
        varchar(200) honor_name
        varchar(200) organization
        date date_received
        varchar(20) grade_level
        int recognition_level_id FK
        varchar(1000) description
        int sort_order
        bool is_active
    }
    core__person_identifiers {
        int legacy_identifier_id
        uuid person_id FK
        int identifier_type_id FK
        varchar(100) identifier_value
        varchar(200) issuing_authority
        date issue_date
        date expiry_date
        uuid person_identifier_id PK
        varchar(32) legacy_id
        bytea identifier_value_encrypted
        bytea identifier_search_hash
        int issuing_country_id FK
        int issuing_state_province_id FK
    }
    core__person_merge_log {
        int merge_log_id PK
        uuid primary_person_id FK
        uuid secondary_person_id FK
        int merged_by_user_id FK
        int tables_updated
        text notes
        timestamptz merged_at
    }
    core__person_name_display_config {
        int config_id PK
        varchar(50) config_code UK
        varchar(200) format_pattern
        varchar(500) description
    }
    core__person_names {
        int person_name_id PK
        uuid person_id FK
        int name_type_id FK
        varchar(100) first_name
        varchar(100) middle_name
        varchar(100) last_name
        varchar(20) suffix
        date effective_date
        date end_date
        bool is_current
        bool is_searchable
    }
    core__person_phones {
        int legacy_phone_id
        uuid person_id FK
        int phone_type_id FK
        varchar(5) country_code
        varchar(20) phone_number
        varchar(10) extension
        date effective_date
        date end_date
        bool is_current
        bool is_primary
        uuid person_phone_id PK
        varchar(32) legacy_id
    }
    core__person_photos {
        int photo_id PK
        uuid person_id FK
        int status_id FK
        varchar(255) original_filename
        varchar(255) stored_filename
        int file_size_bytes
        varchar(50) mime_type
        int width
        int height
        int uploaded_by_user_id FK
        timestamp uploaded_at
        int reviewed_by_user_id FK
        timestamp reviewed_at
        text rejection_reason
        bool is_current
        int origin_id FK
        bigint source_size_bytes
        timestamp source_mtime
        timestamp submitted_at
        int submitted_by_user_id FK
        timestamp superseded_at
    }
    core__person_races {
        int person_race_id PK
        uuid person_id FK
        int race_id FK
    }
    core__person_recommendations {
        int legacy_recommendation_id
        uuid person_id FK
        int application_id FK
        varchar(200) recommender_name
        varchar(254) recommender_email
        varchar(30) recommender_phone
        varchar(200) recommender_title
        varchar(200) recommender_organization
        int relationship_id FK
        int years_known
        int status_id FK
        date requested_date
        date reminder_sent_date
        date received_date
        bool waive_right_to_view
        varchar(500) file_path
        varchar(255) file_name
        varchar(1000) notes
        uuid person_recommendation_id PK
        varchar(32) legacy_id
    }
    core__person_relationships {
        int person_relationship_id PK
        uuid person_id_1 FK
        uuid person_id_2 FK
        int relation_type_id FK
        bool is_primary_participant
        bool is_primary_relationship
        varchar(20) source_id
        date start_date
        date end_date
        int status_id FK
        varchar(20) source_added_by
        timestamptz source_added_at
        varchar(20) source_changed_by
        timestamptz source_changed_at
    }
    core__person_test_scores {
        int legacy_test_score_id
        uuid person_id FK
        int test_type_id FK
        numeric score
        text subscore_json
        date test_date
        bool is_official
        bool is_self_reported
        date score_report_date
        uuid person_test_score_id PK
        varchar(32) legacy_id
    }
    core__person_visa_status {
        int legacy_visa_status_id
        uuid person_id FK
        int visa_type_id FK
        date visa_expiry_date
        varchar(20) sevis_id
        bool is_current
        date effective_date
        varchar(500) notes
        uuid person_visa_status_id PK
        varchar(32) legacy_id
    }
    core__photo_sync_runs {
        int photo_sync_run_id PK
        varchar(500) source
        varchar(20) status
        varchar(20) trigger_source
        bool dry_run
        int files_seen
        int files_matched
        int photos_created
        int photos_updated
        int photos_removed
        int files_unmatched
        int files_failed
        text error_message
        timestamp started_at
        timestamp completed_at
        int triggered_by FK
        int photos_superseded
    }
    core__people ||--o{ core__people : "parent"
    core__people ||--o{ core__person_activities : "person_id"
    core__people ||--o{ core__person_addresses : "person_id"
    core__people ||--o{ core__person_emails : "person_id"
    core__people ||--o{ core__person_essays : "person_id"
    core__people ||--o{ core__person_family_members : "person_id"
    core__people ||--o{ core__person_honors : "person_id"
    core__people ||--o{ core__person_identifiers : "person_id"
    core__people ||--o{ core__person_merge_log : "primary_person_id"
    core__people ||--o{ core__person_merge_log : "secondary_person_id"
    core__people ||--o{ core__person_names : "person_id"
    core__people ||--o{ core__person_phones : "person_id"
    core__people ||--o{ core__person_photos : "person_id"
    core__people ||--o{ core__person_races : "person_id"
    core__people ||--o{ core__person_recommendations : "person_id"
    core__people ||--o{ core__person_relationships : "person_id_1"
    core__people ||--o{ core__person_relationships : "person_id_2"
    core__people ||--o{ core__person_test_scores : "person_id"
    core__people ||--o{ core__person_visa_status : "person_id"

3. Core - Auth & Authorization ​

mermaid
erDiagram
    core__application_access_tokens {
        int token_id PK
        varchar(64) token UK
        uuid person_id FK
        int application_id FK
        varchar(20) token_type
        timestamp expires_at
        timestamp used_at
        bool is_revoked
    }
    core__auth_users {
        varchar(128) password
        int auth_user_id PK
        varchar(254) email UK
        uuid person_id FK
        bool is_student
        bool is_faculty
        bool is_advisor
        bool is_admissions_staff
        bool is_registrar
        bool is_staff
        bool is_active
        bool is_superuser
        timestamptz date_joined
        timestamptz last_login
        timestamptz last_activity
    }
    core__dashboard_tiles {
        int tile_id PK
        varchar(50) tile_code UK
        varchar(100) name
        varchar(500) description
        varchar(100) component_name
        varchar(50) icon
        int default_width
        int required_permission_node_id FK
        bool is_active
    }
    core__institution_domains {
        int domain_id PK
        varchar(100) domain_name UK
        bool is_primary
        bool is_protected
        varchar(200) description
        bool is_active
    }
    core__permission_nodes {
        int node_id PK
        varchar(100) node_code UK
        varchar(100) name
        varchar(500) description
        varchar(20) node_type
        int parent_node_id FK
        varchar(200) route_path
        varchar(50) icon
        int sort_order
        bool is_menu_item
        bool is_active
    }
    core__role_default_tiles {
        int role_tile_id PK
        int role_id FK
        int tile_id FK
        int sort_order
        bool is_required
    }
    core__role_menu_shortcuts {
        int role_menu_shortcut_id PK
        int role_id FK
        int node_id FK
        int sort_order
    }
    core__role_permissions {
        int role_permission_id PK
        int role_id FK
        int node_id FK
        varchar(10) access_level
        bool includes_children
        varchar(20) scope
    }
    core__roles {
        int role_id PK
        varchar(50) role_code UK
        varchar(100) name
        varchar(500) description
        varchar(20) role_type
        bool is_active
        int priority
        bool grants_superuser
    }
    core__sso_identity_providers {
        int sso_identity_provider_id PK
        varchar(100) display_name
        varchar(50) slug
        text metadata_url
        text metadata_xml
        timestamp metadata_fetched_at
        bool is_active
        int sort_order
    }
    core__user_active_role {
        int user_id PK
        int active_role_id FK
        timestamp switched_at
        int active_admin_id FK
    }
    core__user_dashboard_preferences {
        int preference_id PK
        int user_id FK
        int role_id FK
        int tile_id FK
        bool is_visible
        int sort_order
        int grid_x
        int grid_y
        int width
    }
    core__user_filter_presets {
        int user_filter_preset_id PK
        int user_id FK
        varchar(100) page_key
        varchar(100) name
        jsonb filters
    }
    core__user_impersonation_sessions {
        int session_id PK
        int admin_user_id FK
        int impersonated_user_id FK
        timestamp started_at
        timestamp ended_at
        varchar(500) reason
        bool is_active
        varchar(64) auth_session_hash
    }
    core__user_roles {
        int legacy_user_role_id
        int user_id FK
        int role_id FK
        bool is_manual_override
        date effective_date
        date expiration_date
        int assigned_by_id FK
        uuid user_role_id PK
        varchar(32) legacy_id
    }
    core__user_shortcuts {
        int user_shortcut_id PK
        int user_id FK
        varchar(200) label
        varchar(500) route_path
        varchar(50) icon
        int sort_order
    }
    core__permission_nodes ||--o{ core__dashboard_tiles : "required_permission_node_id"
    core__permission_nodes ||--o{ core__permission_nodes : "parent"
    core__roles ||--o{ core__role_default_tiles : "role_id"
    core__dashboard_tiles ||--o{ core__role_default_tiles : "tile_id"
    core__permission_nodes ||--o{ core__role_menu_shortcuts : "node_id"
    core__roles ||--o{ core__role_menu_shortcuts : "role_id"
    core__permission_nodes ||--o{ core__role_permissions : "node_id"
    core__roles ||--o{ core__role_permissions : "role_id"
    core__roles ||--o{ core__user_active_role : "active_role_id"
    core__auth_users ||--o{ core__user_active_role : "user_id"
    core__roles ||--o{ core__user_dashboard_preferences : "role_id"
    core__dashboard_tiles ||--o{ core__user_dashboard_preferences : "tile_id"
    core__auth_users ||--o{ core__user_dashboard_preferences : "user_id"
    core__auth_users ||--o{ core__user_filter_presets : "user_id"
    core__auth_users ||--o{ core__user_impersonation_sessions : "admin_user_id"
    core__auth_users ||--o{ core__user_impersonation_sessions : "impersonated_user_id"
    core__auth_users ||--o{ core__user_roles : "assigned_by_id"
    core__roles ||--o{ core__user_roles : "role_id"
    core__auth_users ||--o{ core__user_roles : "user_id"
    core__auth_users ||--o{ core__user_shortcuts : "user_id"

3b. Core - Audit Trail (migration 081) ​

mermaid
erDiagram
    core__audit_log {
        int audit_id PK
        varchar(100) table_name
        varchar(200) record_id
        varchar(20) action
        jsonb old_values
        jsonb new_values
        uuid changed_by_person_id FK
        timestamp changed_at
        varchar(50) ip_address
        text user_agent
        uuid impersonated_person_id
        varchar(40) actor_source
    }
    core__audit_schema_defaults {
        varchar(63) schema_name PK
        bool default_enabled
    }
    core__audit_system_config {
        bool audit_system_config_id PK
        bool master_enabled
        bool default_enable_new_tables
    }
    core__audit_table_config {
        varchar(63) schema_name PK
        varchar(63) table_name PK
        bool is_enabled
    }
    core__audit_trail_deletion_log {
        bigint deletion_id PK
        varchar(20) log_source
        bigint original_log_id
        varchar(150) table_name
        varchar(200) record_id
        varchar(20) action
        timestamp original_changed_at
        uuid deleted_by_person_id
        timestamp deleted_at
    }
    core__data_change_history {
        int change_id PK
        varchar(100) table_name
        varchar(100) record_id
        varchar(100) field_name
        text old_value
        text new_value
        uuid changed_by_person_id FK
        timestamp changed_at
        text change_reason
    }
    core__ferpa_change_log {
        bigint ferpa_change_log_id PK
        uuid person_id FK
        bool old_value
        bool new_value
        text reason
        uuid changed_by_person_id
        uuid impersonated_person_id
        timestamp changed_at
    }
    core__identifier_access_log {
        bigint identifier_access_log_id PK
        uuid person_identifier_id FK
        uuid target_person_id FK
        int viewer_user_id FK
        uuid viewer_person_id
        varchar(10) tier
        timestamp accessed_at
        varchar(45) ip_address
        text user_agent
        int identifier_type_id FK
        varchar(10) purpose
    }
    core__permission_audit_log {
        int audit_id PK
        varchar(50) entity_type
        int entity_id
        varchar(20) action
        int changed_by_user_id FK
        timestamp changed_at
        varchar(100) field_name
        text old_value
        text new_value
        text additional_context
        varchar(45) ip_address
        varchar(500) user_agent
    }
    core__person_name_audit_log {
        int audit_id PK
        int person_name_id FK
        uuid person_id FK
        varchar(20) action
        int changed_by_user_id FK
        timestamp changed_at
        varchar(50) name_type_code
        varchar(100) first_name
        varchar(100) middle_name
        varchar(100) last_name
        varchar(20) suffix
        varchar(100) field_name
        text old_value
        text new_value
        varchar(500) change_reason
        varchar(45) ip_address
        varchar(500) user_agent
    }

4. Core - Proxy Access ​

mermaid
erDiagram
    core__proxy_access_audit_log {
        int audit_id PK
        varchar(30) action
        text action_details
        varchar(45) ip_address
        varchar(500) user_agent
        int performed_by_user_id FK
        uuid proxy_person_id FK
        int student_id FK
        int proxy_access_id FK
    }
    core__proxy_access_permissions {
        int proxy_access_permission_id PK
        int proxy_access_id FK
        int permission_type_id FK
    }
    core__proxy_invitation_permissions {
        int proxy_invitation_permission_id PK
        int invitation_id FK
        int permission_type_id FK
    }
    core__proxy_invitations {
        int invitation_id PK
        varchar(254) invitee_email
        varchar(30) invitee_phone
        varchar(100) invitee_first_name
        varchar(100) invitee_last_name
        timestamptz expires_at
        varchar(64) email_token UK
        timestamptz email_token_expires_at
        varchar(20) status
        uuid proxy_person_id FK
        int relationship_type_id FK
        int student_id FK
    }
    core__student_proxy_access {
        int proxy_access_id PK
        timestamptz granted_at
        timestamptz expires_at
        timestamptz revoked_at
        bool is_active
        uuid proxy_person_id FK
        int relationship_type_id FK
        int revoked_by_user_id FK
        int student_id FK
    }
    core__student_proxy_access ||--o{ core__proxy_access_audit_log : "proxy_access_id"
    core__student_proxy_access ||--o{ core__proxy_access_permissions : "proxy_access_id"
    core__proxy_invitations ||--o{ core__proxy_invitation_permissions : "invitation_id"

5. Records - Academic Calendar ​

mermaid
erDiagram
    records__academic_term_slots {
        int term_slot_id PK
        varchar(100) slot_name
        varchar(20) slot_code UK
        int sort_order
        bool is_active
    }
    records__academic_terms {
        int term_id PK
        int academic_year_id FK
        varchar(20) term_code UK
        varchar(100) term_name
        int term_type_id FK
        date start_date
        date end_date
        date census_date
        date add_deadline
        date drop_deadline
        date withdrawal_deadline
        date grades_due_date
        bool is_current
        date first_billing_date
        bool is_offered_at_all_campuses
        date registration_open_date
        timestamp midterm_grade_start_date
        timestamp midterm_grade_end_date
        int term_slot_id FK
        int credit_system_id FK
        date housing_start_date
        date housing_end_date
        date meal_start_date
        date meal_end_date
    }
    records__academic_years {
        int academic_year_id PK
        varchar(20) year_code UK
        date start_date
        date end_date
        bool is_current
    }
    records__bulletin_academic_years {
        int bulletin_year_id PK
        int bulletin_id FK
        int academic_year_id FK
    }
    records__bulletins {
        int bulletin_id PK
        varchar(20) bulletin_code UK
        varchar(200) title
        text description
        int bulletin_type_id FK
        int status_id FK
        date effective_date
        date end_date
        bool is_current
    }
    records__course_offering_terms {
        int course_id PK
        int term_slot_id PK
    }
    records__credit_system_conversions {
        int conversion_id PK
        int from_system_id FK
        int to_system_id FK
        numeric(8_4) conversion_factor
        bool is_active
    }
    records__sub_terms {
        int sub_term_id PK
        int term_id FK
        varchar(20) sub_term_code UK
        varchar(100) name
        date start_date
        date end_date
    }
    records__term_campus_offerings {
        int offering_id PK
        int term_id FK
        int campus_id FK
        date registration_open_date
        date registration_close_date
        bool is_active
    }
    records__academic_years ||--o{ records__academic_terms : "academic_year_id"
    records__academic_term_slots ||--o{ records__academic_terms : "term_slot_id"
    records__academic_years ||--o{ records__bulletin_academic_years : "academic_year_id"
    records__bulletins ||--o{ records__bulletin_academic_years : "bulletin_id"
    records__academic_term_slots ||--o{ records__course_offering_terms : "term_slot_id"
    records__academic_terms ||--o{ records__sub_terms : "term_id"
    records__academic_terms ||--o{ records__term_campus_offerings : "term_id"

6. Records - Courses & Sections ​

mermaid
erDiagram
    records__academic_level_grading_systems {
        int academic_level_grading_system_id PK
        int academic_level_id FK
        int grading_system_id FK
        bool is_default
    }
    records__class_schedules {
        int class_schedule_id PK
        int class_id FK
        int schedule_type_id FK
        int template_id FK
        smallint day_of_week
        time_without_time_zone start_time
        time_without_time_zone end_time
        date effective_date
        date end_date
        int room_id FK
        varchar(500) notes
    }
    records__class_sections {
        int class_section_id PK
        int class_id FK
        int section_id FK
    }
    records__classes {
        int class_id PK
        varchar(50) class_code UK
        int term_id FK
        int status_id FK
    }
    records__course_attributes {
        int course_attribute_id PK
        int course_id FK
        int attribute_type_id FK
        date effective_date
        date end_date
        varchar(500) attribute_value
    }
    records__course_bulletin_periods {
        int course_bulletin_period_id PK
        int course_bulletin_id FK
        int term_period_id FK
    }
    records__course_bulletins {
        int course_bulletin_id PK
        int course_id FK
        int bulletin_id FK
        int teaching_frequency_id FK
        varchar(500) notes
        bool is_active
    }
    records__course_equivalents {
        int equivalence_id PK
        int course_id FK
        int equivalent_course_id FK
        date effective_date
        date end_date
        int equivalence_type_id FK
    }
    records__course_pattern_exclusions {
        int exclusion_id PK
        int pattern_id FK
        int course_id FK
    }
    records__course_patterns {
        int pattern_id PK
        varchar(50) pattern_code UK
        varchar(200) name
        text description
        int bulletin_id FK
        varchar(50) pattern_type
        varchar(20) course_prefix
        int level_min
        int level_max
        int department_id FK
        int attribute_id FK
        varchar(500) regex_pattern
        text exclude_courses
        bool is_active
    }
    records__course_requisites {
        int requisite_id PK
        int course_id FK
        int requisite_type_id FK
        int requisite_course_id FK
        varchar(200) requisite_pattern
        int min_grade_id FK
        bool can_be_concurrent
        int requisite_group
    }
    records__course_sections {
        int section_id PK
        int course_id FK
        int term_id FK
        varchar(20) section_code
        int sub_term_id FK
        int instruction_mode_id FK
        int max_enrollment
        int current_enrollment
        int waitlist_capacity
        int current_waitlist
        int section_status_id FK
        int grading_system_id FK
        bool is_cross_listed
        int campus_id FK
        varchar(100) section_descriptor
        date enrollment_deadline_override
        int class_id FK
        int seats_blocked_in_process
        numeric(10_2) section_fee
        numeric(4_2) billing_credits
        int fee_type_id FK
        numeric(10_2) section_lab_fee
        int delivery_mode_id FK
        int seats_planned
        numeric(4_2) credit_hours_min
        numeric(4_2) credit_hours_max
        varchar(1) billing_method
        int seats_reserved
        int instructional_method_id FK
    }
    records__course_substitutions {
        int substitution_id PK
        int original_course_id FK
        int substitute_course_id FK
        date effective_date
        date end_date
        uuid approved_by_person_id FK
        date approval_date
        text notes
        varchar(20) scope
        int bulletin_id FK
        int major_id FK
        int requirement_block_id FK
        bool is_active
    }
    records__courses {
        int course_id PK
        varchar(20) course_code
        varchar(200) title
        text description
        numeric(4_2) credit_hours_min
        numeric(4_2) credit_hours_max
        numeric(4_2) contact_hours
        bool is_variable_credit
        bool is_repeatable
        int max_repeats
        int grading_system_id FK
        int status_id FK
        date effective_date
        date end_date
        bool allows_section_descriptor
        int course_level_id FK
        numeric(10_2) lab_fee
        varchar(20) year_pattern
        varchar(20) source_id UK
        int credit_system_id FK
        int academic_level_id FK
        varchar(20) prereq_acad_reqmt_id
        int prereq_block_id FK
    }
    records__grading_system_grades {
        int grade_id PK
        int grading_system_id FK
        varchar(5) letter_grade
        varchar(50) display_name
        numeric(4_2) numeric_equivalent
        bool is_passing
        bool is_included_in_gpa
        int sort_order
        bool is_temporary
        bool is_active
    }
    records__grading_systems {
        int grading_system_id PK
        varchar(20) system_code UK
        varchar(100) name
        text description
        bool is_active
    }
    records__schedule_template_entries {
        int template_entry_id PK
        int template_id FK
        smallint day_of_week
        time_without_time_zone start_time
        time_without_time_zone end_time
    }
    records__schedule_templates {
        int template_id PK
        varchar(50) template_code UK
        varchar(100) template_name
        varchar(500) description
        int total_minutes_per_week
        bool is_active
        int sort_order
    }
    records__section_instructors {
        int section_instructor_id PK
        int section_id FK
        int teacher_id FK
        int instructor_role_id FK
        numeric(5_2) responsibility_percentage
        bool can_enter_grades
    }
    records__section_schedules {
        int schedule_id PK
        int section_id FK
        smallint day_of_week
        time_without_time_zone start_time
        time_without_time_zone end_time
        int room_id FK
        int schedule_type_id FK
        date effective_date
        date end_date
    }
    records__grading_systems ||--o{ records__academic_level_grading_systems : "grading_system_id"
    records__classes ||--o{ records__class_schedules : "class_id"
    records__schedule_templates ||--o{ records__class_schedules : "template_id"
    records__classes ||--o{ records__class_sections : "class_id"
    records__course_sections ||--o{ records__class_sections : "section_id"
    records__courses ||--o{ records__course_attributes : "course_id"
    records__course_bulletins ||--o{ records__course_bulletin_periods : "course_bulletin_id"
    records__courses ||--o{ records__course_bulletins : "course_id"
    records__courses ||--o{ records__course_equivalents : "course_id"
    records__courses ||--o{ records__course_equivalents : "equivalent_course_id"
    records__courses ||--o{ records__course_pattern_exclusions : "course_id"
    records__course_patterns ||--o{ records__course_pattern_exclusions : "pattern_id"
    records__courses ||--o{ records__course_requisites : "course_id"
    records__courses ||--o{ records__course_requisites : "requisite_course_id"
    records__classes ||--o{ records__course_sections : "class_id"
    records__courses ||--o{ records__course_sections : "course_id"
    records__grading_systems ||--o{ records__course_sections : "grading_system_id"
    records__courses ||--o{ records__course_substitutions : "original_course_id"
    records__courses ||--o{ records__course_substitutions : "substitute_course_id"
    records__grading_systems ||--o{ records__courses : "grading_system_id"
    records__grading_systems ||--o{ records__grading_system_grades : "grading_system_id"
    records__schedule_templates ||--o{ records__schedule_template_entries : "template_id"
    records__course_sections ||--o{ records__section_instructors : "section_id"
    records__course_sections ||--o{ records__section_schedules : "section_id"

7. Records - Programs & Requirements ​

mermaid
erDiagram
    records__academic_policy_rules {
        int policy_rule_id PK
        varchar(60) rule_code
        varchar(10) scope_kind
        varchar(10) value_type
        int bulletin_id FK
        int degree_level_id FK
        numeric(8_3) threshold_value
        numeric(4_2) min_grade_points
        int min_grade_id FK
        varchar(200) name
        text description
        bool allow_program_override
        varchar(10) severity
        bool is_active
        int sort_order
    }
    records__class_standing_thresholds {
        int threshold_id PK
        int standing_id FK
        numeric(5_2) min_credits
        numeric(5_2) max_credits
        int sort_order
        bool is_active
    }
    records__degree_approved_minors {
        int degree_minor_id PK
        int degree_id FK
        int minor_block_id FK
    }
    records__degree_blocks {
        int degree_block_id PK
        int degree_id FK
        int block_id FK
        bool is_required
        int sort_order
    }
    records__degree_default_advisors {
        int degree_advisor_id PK
        int degree_id FK
        int advisor_id FK
        int advisor_role_id FK
        bool is_primary
        int sort_order
        date effective_date
        date end_date
    }
    records__degree_level_grading_systems {
        int mapping_id PK
        int degree_level_id FK
        int grading_system_id FK
        bool is_default
    }
    records__degrees {
        int degree_id PK
        varchar(20) degree_code UK
        varchar(200) name
        text description
        int bulletin_id FK
        int degree_level_id FK
        int department_id FK
        int college_id FK
        numeric(5_2) total_credits_required
        numeric(5_2) total_credits_max
        numeric(4_3) min_gpa_required
        numeric(5_2) residency_credits_required
        varchar(50) minor_requirement_type
        numeric(5_2) max_double_count_pct
        int status_id FK
        date effective_date
        date end_date
        int credit_system_id FK
    }
    records__emphasis_areas {
        int emphasis_id PK
        int major_id FK
        varchar(20) emphasis_code
        varchar(200) name
        text description
        numeric(5_2) total_credits_required
        int status_id FK
        date effective_date
        date end_date
        int sort_order
        bool is_active
        int credit_system_id FK
    }
    records__emphasis_blocks {
        int emphasis_block_id PK
        int emphasis_id FK
        int block_id FK
        bool is_required
        int sort_order
    }
    records__major_blocks {
        int major_block_id PK
        int major_id FK
        int block_id FK
        bool is_required
        int sort_order
        int bulletin_id FK
    }
    records__major_campus_offerings {
        int major_campus_id PK
        int major_id FK
        int campus_id FK
        date effective_date
        date end_date
    }
    records__major_default_advisors {
        int major_advisor_id PK
        int major_id FK
        int advisor_id FK
        int advisor_role_id FK
        bool is_primary
        int sort_order
        date effective_date
        date end_date
    }
    records__majors {
        int major_id PK
        varchar(20) major_code
        varchar(200) name
        text description
        int degree_id FK
        int department_id FK
        int bulletin_id FK
        numeric(5_2) total_credits_required
        numeric(5_2) min_upper_division_credits
        numeric(3_2) min_gpa_required
        int status_id FK
        date effective_date
        date end_date
        bool is_offered_at_all_campuses
        varchar(7) cip_code
        bool requires_emphasis
        int credit_system_id FK
    }
    records__minor_blocks {
        int minor_block_id PK
        int minor_id FK
        int block_id FK
        bool is_required
        int sort_order
        int bulletin_id FK
    }
    records__minor_campus_offerings {
        int minor_campus_id PK
        int minor_id FK
        int campus_id FK
        date effective_date
        date end_date
    }
    records__minor_default_advisors {
        int minor_advisor_id PK
        int minor_id FK
        int advisor_id FK
        int advisor_role_id FK
        int sort_order
        date effective_date
        date end_date
    }
    records__minors {
        int minor_id PK
        varchar(20) minor_code
        varchar(200) name
        text description
        int department_id FK
        int bulletin_id FK
        numeric(5_2) total_credits_required
        numeric(3_2) min_gpa_required
        int status_id FK
        date effective_date
        date end_date
        bool is_offered_at_all_campuses
        varchar(7) cip_code
        int credit_system_id FK
    }
    records__requirement_blocks {
        int block_id PK
        int parent_block_id FK
        int block_type_id FK
        varchar(200) name
        text description
        numeric(5_2) min_credits
        numeric(5_2) max_credits
        int min_courses
        int max_courses
        int sort_order
        varchar(50) block_code
        int bulletin_id FK
        int department_id FK
        int college_id FK
        numeric(4_3) min_gpa
        int min_grade_id FK
        bool allow_double_count_within_degree
        numeric(5_2) max_double_count_pct
        varchar(10) logic_operator
        bool is_active
        numeric(5_2) min_upper_division_credits
        numeric(5_2) min_institution_credits
        numeric(6_2) sequence_due_at_credits
        bool sequence_exempt
        int min_child_groups
        varchar(24) credits_source
        text source_spec
    }
    records__requirement_group_rules {
        int rule_id PK
        int block_id FK
        varchar(200) rule_name
        varchar(500) rule_description
        text logic_expression
        int sort_order
    }
    records__requirement_groups {
        int group_id PK
        int block_id FK
        varchar(50) group_code
        varchar(200) name
        text description
        int min_courses
        int max_courses
        numeric(5_2) min_credits
        numeric(5_2) max_credits
        numeric(4_3) min_gpa
        int min_grade_id FK
        varchar(10) logic_operator
        int sort_order
        numeric(5_2) min_institution_credits
        varchar(16) group_role
        varchar(32) group_role_source
        numeric(5_2) derived_credits
        text source_spec
    }
    records__requirement_item_activities {
        int item_activity_id PK
        int item_id FK
        varchar(200) activity_name
        text activity_description
    }
    records__requirement_item_courses {
        int item_course_id PK
        int item_id FK
        int course_id FK
        bool is_preferred
        int sort_order
    }
    records__requirement_items {
        int item_id PK
        int block_id FK
        int requirement_type_id FK
        int course_id FK
        varchar(200) course_pattern
        int activity_type_id FK
        numeric(5_2) min_credits
        int min_count
        int min_grade_id FK
        bool is_required
        int sort_order
        int group_id FK
        int course_pattern_id FK
        int non_course_type_id FK
        text non_course_description
        int completion_role_id FK
        numeric(5_2) max_credits
        int max_count
        numeric(4_3) min_gpa
        text notes
        varchar(100) source_code
    }
    records__sequence_policies {
        int sequence_policy_id PK
        int bulletin_id FK
        varchar(200) name
        int level_min
        int level_max
        numeric(6_2) due_at_credits
        int due_at_standing_id FK
        numeric(6_2) warn_within_credits
        varchar(10) severity
        bool is_active
        int sort_order
    }
    records__degrees ||--o{ records__degree_approved_minors : "degree_id"
    records__requirement_blocks ||--o{ records__degree_approved_minors : "minor_block_id"
    records__requirement_blocks ||--o{ records__degree_blocks : "block_id"
    records__degrees ||--o{ records__degree_blocks : "degree_id"
    records__degrees ||--o{ records__degree_default_advisors : "degree_id"
    records__majors ||--o{ records__emphasis_areas : "major_id"
    records__requirement_blocks ||--o{ records__emphasis_blocks : "block_id"
    records__emphasis_areas ||--o{ records__emphasis_blocks : "emphasis_id"
    records__requirement_blocks ||--o{ records__major_blocks : "block_id"
    records__majors ||--o{ records__major_blocks : "major_id"
    records__majors ||--o{ records__major_campus_offerings : "major_id"
    records__majors ||--o{ records__major_default_advisors : "major_id"
    records__degrees ||--o{ records__majors : "degree_id"
    records__requirement_blocks ||--o{ records__minor_blocks : "block_id"
    records__minors ||--o{ records__minor_blocks : "minor_id"
    records__minors ||--o{ records__minor_campus_offerings : "minor_id"
    records__minors ||--o{ records__minor_default_advisors : "minor_id"
    records__requirement_blocks ||--o{ records__requirement_blocks : "parent"
    records__requirement_blocks ||--o{ records__requirement_group_rules : "block_id"
    records__requirement_blocks ||--o{ records__requirement_groups : "block_id"
    records__requirement_items ||--o{ records__requirement_item_activities : "item_id"
    records__requirement_items ||--o{ records__requirement_item_courses : "item_id"
    records__requirement_blocks ||--o{ records__requirement_items : "block_id"
    records__requirement_groups ||--o{ records__requirement_items : "group_id"

8. Records - Roles & Student Data ​

mermaid
erDiagram
    core__legacy_academic_credits {
        int legacy_credit_id PK
        uuid person_id FK
        varchar(20) colleague_id
        varchar(10) credit_type
        varchar(20) term_code
        varchar(20) subject
        varchar(20) course_number
        varchar(200) course_title
        numeric(8_2) credits
        numeric(8_2) credits_attempted
        numeric(8_2) credits_completed
        varchar(20) final_grade
        varchar(20) verified_grade
        varchar(10) current_status
        varchar(10) academic_level
        timestamp migrated_at
    }
    records__advisors {
        int advisor_id PK
        uuid person_id FK
        int advisor_type_id FK
        int department_id FK
        int max_advisee_count
        bool is_active
    }
    records__applicants {
        int applicant_id PK
        uuid person_id FK
        int application_term_id FK
        int application_status_id FK
        int intended_major_id FK
    }
    records__cohort_advisors {
        int cohort_advisor_id PK
        int cohort_id FK
        int advisor_id FK
        date start_date
        date end_date
        bool is_active
    }
    records__cohort_majors {
        int cohort_major_id PK
        int cohort_id FK
        int major_id FK
    }
    records__cohorts {
        int cohort_id PK
        varchar(50) cohort_code UK
        varchar(200) name
        int start_term_id FK
        int expected_graduation_term_id FK
        bool is_active
        int major_id FK
        text description
        int academic_year_id FK
        int max_students
        int cohort_type_id FK
        date start_date
        date end_date
        varchar(20) source
        timestamp ods_synced_at
        int campus_id FK
        bool auto_sync_membership
    }
    records__hold_type_roles {
        int hold_type_role_id PK
        int hold_type_id FK
        varchar(50) role_code
        bool can_place
        bool can_clear
    }
    records__hold_types {
        int hold_type_id PK
        varchar(50) hold_type_code UK
        varchar(200) name
        varchar(1000) description
        varchar(20) category
        text auto_create_query
        text auto_clear_query
        varchar(255) auto_clear_script
        text resolution_instructions
        varchar(200) contact_office
        varchar(255) contact_email
        varchar(50) contact_phone
        bool is_active
        int sort_order
        bool prevents_transcript
        bool prevents_graduation
        varchar(20) enforcement_level
        smallint default_severity
        bool student_visible
    }
    records__section_waitlists {
        int waitlist_id PK
        int student_id FK
        int section_id FK
        int position
        timestamp added_at
        timestamp notified_at
        timestamp notification_expires_at
        int status_id FK
        timestamp removed_at
        varchar(500) removal_reason
    }
    records__student_academic_levels {
        int student_academic_level_id PK
        int student_id FK
        int academic_level_id FK
        numeric(4_3) cumulative_gpa
        numeric(6_2) credits_attempted
        numeric(6_2) credits_earned
        timestamp gpa_last_calculated
        varchar(32) colleague_sal_id
        varchar(10) colleague_class_code
        int colleague_class_standing_id FK
        int computed_class_standing_id FK
        varchar(10) catalog_year
        varchar(10) admit_status_code
        varchar(10) enroll_status_code
        date level_start_date
        date level_end_date
        varchar(20) start_term_code
        bool is_currently_registered
        timestamp ods_synced_at
    }
    records__student_academic_status_history {
        int history_id PK
        int student_id FK
        int status_id FK
        date effective_date
        text comments
        int major_id FK
    }
    records__student_activities {
        int activity_id PK
        int student_id FK
        int activity_type_id FK
        varchar(200) activity_name
        text description
        date start_date
        date end_date
        numeric(6_2) hours_completed
    }
    records__student_admission_status_history {
        int history_id PK
        int student_id FK
        int status_id FK
        date effective_date
        text comments
    }
    records__student_advisors {
        int student_advisor_id PK
        int student_id FK
        int advisor_id FK
        bool is_primary
        date effective_date
        date end_date
        int advisor_role_id FK
        date start_date
        bool is_active
    }
    records__student_awards {
        int award_id PK
        int student_id FK
        int award_type_id FK
        varchar(200) award_name
        text description
        int term_id FK
        date award_date
    }
    records__student_campus_assignments {
        int assignment_id PK
        int student_id FK
        int campus_id FK
        bool is_primary
        date start_date
        date end_date
    }
    records__student_cohorts {
        int student_cohort_id PK
        int student_id FK
        int cohort_id FK
        date start_date
        date end_date
        int academic_level_id FK
        int ods_pos
        varchar(20) source
        timestamp ods_synced_at
        bool locally_modified
    }
    records__student_emphases {
        int student_emphasis_id PK
        int student_major_id FK
        int emphasis_id FK
        int status_id FK
        date start_date
        date end_date
    }
    records__student_holds {
        int legacy_student_hold_id
        int student_id FK
        int hold_type_id FK
        int term_id FK
        text reason
        date expiration_date
        uuid created_by_person_id FK
        varchar(100) created_by_system
        uuid cleared_by_person_id FK
        varchar(100) cleared_by_system
        timestamp cleared_at
        text clear_reason
        bool is_active
        uuid student_hold_id PK
        varchar(32) legacy_id
        smallint severity
        text custom_message
        uuid impersonator_person_id FK
    }
    records__student_list_members {
        int member_id PK
        int list_id FK
        int student_id FK
        int added_by_id FK
        timestamp added_at
        text notes
    }
    records__student_list_shares {
        int share_id PK
        int list_id FK
        int shared_with_id FK
        int shared_by_id FK
        varchar(20) permission
    }
    records__student_lists {
        int list_id PK
        varchar(200) list_name
        text description
        varchar(20) list_type
        jsonb filter_criteria
        int owner_id FK
        bool is_system
        bool is_public
        bool is_active
    }
    records__student_majors {
        int student_major_id PK
        int student_id FK
        int major_id FK
        bool is_primary
        int status_id FK
        date start_date
        date end_date
        int bulletin_id FK
    }
    records__student_minors {
        int student_minor_id PK
        int student_id FK
        int minor_id FK
        int status_id FK
        date start_date
        date end_date
        int bulletin_id FK
    }
    records__student_types {
        int student_type_assignment_id PK
        int student_id FK
        int student_type_id FK
        date start_date
        date end_date
        int ods_pos
        varchar(20) source
        timestamp ods_synced_at
    }
    records__students {
        int student_id PK
        uuid person_id FK
        varchar(20) student_number UK
        date enrollment_date
        int initial_term_id FK
        int student_status_id FK
        date expected_graduation_date
        int primary_campus_id FK
        bool restrict_to_campus
        int housing_status_id FK
        int class_standing_id FK
        numeric(4_3) cumulative_gpa
        numeric(6_2) credits_earned
        numeric(6_2) credits_attempted
        timestamp gpa_last_calculated
        timestamp standing_last_calculated
        int ipeds_residency_id FK
        int ipeds_student_type_id FK
        bool pell_recipient
        numeric(10_2) efc_amount
        bool first_gen_flag
    }
    records__teacher_credentials {
        int credential_id PK
        int teacher_id FK
        int credential_type_id FK
        varchar(200) credential_name
        varchar(200) issuing_institution
        date date_earned
        date expiry_date
    }
    records__teachers {
        int teacher_id PK
        uuid person_id FK
        varchar(20) employee_id
        date hire_date
        int status_id FK
        int department_id FK
    }
    records__advisors ||--o{ records__cohort_advisors : "advisor_id"
    records__cohorts ||--o{ records__cohort_advisors : "cohort_id"
    records__cohorts ||--o{ records__cohort_majors : "cohort_id"
    records__hold_types ||--o{ records__hold_type_roles : "hold_type_id"
    records__students ||--o{ records__section_waitlists : "student_id"
    records__students ||--o{ records__student_academic_levels : "student_id"
    records__students ||--o{ records__student_academic_status_history : "student_id"
    records__students ||--o{ records__student_activities : "student_id"
    records__students ||--o{ records__student_admission_status_history : "student_id"
    records__advisors ||--o{ records__student_advisors : "advisor_id"
    records__students ||--o{ records__student_advisors : "student_id"
    records__students ||--o{ records__student_awards : "student_id"
    records__students ||--o{ records__student_campus_assignments : "student_id"
    records__cohorts ||--o{ records__student_cohorts : "cohort_id"
    records__students ||--o{ records__student_cohorts : "student_id"
    records__student_majors ||--o{ records__student_emphases : "student_major_id"
    records__hold_types ||--o{ records__student_holds : "hold_type_id"
    records__students ||--o{ records__student_holds : "student_id"
    records__student_lists ||--o{ records__student_list_members : "list_id"
    records__students ||--o{ records__student_list_members : "student_id"
    records__student_lists ||--o{ records__student_list_shares : "list_id"
    records__students ||--o{ records__student_majors : "student_id"
    records__students ||--o{ records__student_minors : "student_id"
    records__students ||--o{ records__student_types : "student_id"
    records__teachers ||--o{ records__teacher_credentials : "teacher_id"

9. Records - Registration & Enrollment ​

mermaid
erDiagram
    records__enrollment_status_history {
        int history_id PK
        int enrollment_id
        varchar(20) enrollment_type
        int old_status_id FK
        int new_status_id FK
        uuid changed_by_person_id FK
        timestamp changed_at
        text reason
        uuid enrollment_uuid FK
    }
    records__grade_change_log {
        bigint change_id PK
        uuid enrollment_id
        int legacy_enrollment_id
        int student_id
        int section_id
        varchar(10) grade_kind
        int old_grade_id
        varchar(5) old_grade_code
        int new_grade_id
        varchar(5) new_grade_code
        uuid actor_person_id
        varchar(40) actor_source
        text reason
        timestamp changed_at
    }
    records__grade_releases {
        bigint grade_release_id PK
        int section_id FK
        varchar(10) grade_kind
        timestamp released_through
        text notes
    }
    records__hold_evaluation_log {
        int log_id PK
        int hold_type_id FK
        varchar(20) evaluation_type
        timestamp started_at
        timestamp completed_at
        int students_evaluated
        int holds_created
        int holds_cleared
        text errors
        varchar(50) triggered_by
    }
    records__planned_courses {
        int plan_id PK
        int student_id FK
        int section_id FK
        int requirement_item_id FK
        int requirement_block_id FK
        int status_id FK
        uuid planned_by_person_id FK
        int planned_by_role_id FK
        timestamp planned_at
        bool seat_blocked
        timestamp seat_blocked_at
        bool prereq_satisfied
        text prereq_notes
        bool coreq_acknowledged
        text coreq_notes
        bool schedule_conflict_overridden
        varchar(1000) override_reason
        int registration_transaction_id FK
        timestamp registered_at
        timestamp expires_at
        timestamp expired_at
        varchar(500) expiration_reason
        varchar(1000) notes
        bool sequence_overridden
        varchar(1000) sequence_override_reason
        uuid sequence_override_by FK
        timestamp sequence_override_at
        uuid impersonator_person_id FK
        timestamp cancelled_at
        varchar(1000) cancel_reason
        bool capacity_overridden
        varchar(1000) capacity_override_reason
        uuid capacity_override_by FK
        timestamp capacity_override_at
        bool prereq_overridden
        varchar(1000) prereq_override_reason
        uuid prereq_override_by FK
        timestamp prereq_override_at
    }
    records__probation_alert_log {
        int probation_alert_log_id PK
        int student_id FK
        int major_id FK
        int probation_count
        timestamp alert_sent_at
        text recipients
    }
    records__registration_transactions {
        int transaction_id PK
        int student_id FK
        int term_id FK
        int campus_id FK
        int transaction_type_id FK
        int current_step_id FK
        int status_id FK
        uuid initiated_by_person_id FK
        int initiator_role_id FK
        bool has_overrides
        varchar(1000) override_reason
        timestamp submitted_at
        timestamp completed_at
        timestamp cancelled_at
        bool override_prereqs
        bool override_deadline
        bool override_credit_limit
        bool override_campus
        bool override_sequence
    }
    records__registration_workflow_steps {
        int step_id PK
        int workflow_id FK
        varchar(50) step_code
        varchar(200) name
        varchar(1000) description
        int step_type_id FK
        bool can_initiate
        bool can_complete
        bool can_cancel
        bool blocks_seats
        bool requires_validation
        varchar(500) allowed_roles
        int sort_order
    }
    records__registration_workflows {
        int workflow_id PK
        varchar(50) workflow_code
        varchar(200) name
        varchar(1000) description
        bool is_active
        bool is_default
        date effective_date
        date end_date
    }
    records__student_section_enrollments {
        int legacy_enrollment_id
        int student_id FK
        int section_id FK
        int enrollment_status_id FK
        date registration_date
        date drop_date
        int grade_id FK
        date grade_date
        numeric(5_2) credits_attempted
        numeric(5_2) credits_earned
        bool is_audit
        bool is_pass_fail
        text notes
        bool is_independent_study
        bool is_credit_by_exam
        bool is_pla
        int credit_source_id FK
        int transaction_item_id FK
        int midterm_grade_id FK
        date midterm_grade_date
        bool is_attending
        date last_attendance_date
        text attendance_notes
        uuid student_section_enrollment_id PK
        bool is_remedial
        int colleague_stc_id
        varchar(32) legacy_id
        int academic_level_id FK
        varchar(4) colleague_stc_status
    }
    records__student_term_enrollments {
        int enrollment_id PK
        int student_id FK
        int term_id FK
        int enrollment_status_id FK
        date enrollment_date
        date withdrawal_date
        numeric(5_2) credits_attempted
        numeric(5_2) credits_earned
        numeric(4_3) term_gpa
        numeric(4_3) cumulative_gpa
        int enrollment_intensity_id FK
        int academic_level_id FK
        varchar(4) colleague_sttr_status
    }
    records__transaction_enrollment_items {
        int item_id PK
        int transaction_id FK
        int section_id FK
        int action_type_id FK
        int existing_enrollment_id
        numeric credits_selected
        bool is_audit
        bool is_pass_fail
        bool is_independent_study
        bool is_credit_by_exam
        bool is_pla
        int item_status_id FK
        int validation_status_id FK
        text validation_messages
        bool seat_blocked
        timestamp seat_blocked_at
        timestamp processed_at
    }
    records__transaction_payment_history {
        uuid transaction_payment_history_id PK
        int payment_id
        numeric(10_2) payment_amount
        timestamp paid_at
        varchar(100) payment_reference
        int payment_method_id FK
        text notes
        int recorded_by FK
        timestamp recorded_at
        jsonb metadata
        uuid payment_uuid FK
        varchar(32) legacy_id
    }
    records__transaction_step_history {
        int history_id PK
        int transaction_id FK
        int from_step_id FK
        int to_step_id FK
        uuid transitioned_by_person_id FK
        varchar(20) transition_type
        varchar(1000) notes
        timestamp transitioned_at
    }
    records__student_section_enrollments ||--o{ records__enrollment_status_history : "enrollment_uuid"
    records__registration_transactions ||--o{ records__planned_courses : "registration_transaction_id"
    records__registration_workflow_steps ||--o{ records__registration_transactions : "current_step_id"
    records__registration_workflows ||--o{ records__registration_workflow_steps : "workflow_id"
    records__transaction_enrollment_items ||--o{ records__student_section_enrollments : "transaction_item_id"
    records__registration_transactions ||--o{ records__transaction_enrollment_items : "transaction_id"
    records__registration_workflow_steps ||--o{ records__transaction_step_history : "from_step_id"
    records__registration_workflow_steps ||--o{ records__transaction_step_history : "to_step_id"
    records__registration_transactions ||--o{ records__transaction_step_history : "transaction_id"

10. Records - Degree Audit & Graduation ​

mermaid
erDiagram
    records__graduation_application_status_history {
        int history_id PK
        int application_id FK
        varchar(20) old_status
        varchar(20) new_status
        uuid changed_by
        text change_reason
        timestamp changed_at
    }
    records__graduation_applications {
        int application_id PK
        int student_id FK
        int degree_id FK
        int expected_graduation_term_id FK
        date applied_date
        uuid reviewed_by FK
        timestamp reviewed_date
        varchar(20) status
        text notes
        int graduation_date_id FK
        text denial_reason
        bool plan_complete_at_application
        jsonb audit_snapshot_json
    }
    records__graduation_dates {
        int graduation_date_id PK
        varchar(200) date_name
        date graduation_date
        int term_id FK
        date application_deadline
        bool is_active
        text notes
    }
    records__graduation_records {
        int graduation_record_id PK
        int student_id FK
        int degree_id FK
        int graduation_date_id FK
        date graduation_date
        int graduation_type_id FK
        varchar(300) title
        text title_html
        int honors_id FK
        int application_id FK
        uuid confirmed_by
        timestamp confirmed_date
        int major_id FK
        bool with_honors
    }
    records__institutions {
        int institution_id PK
        varchar(200) institution_name
        int institution_type_id FK
        varchar(20) ceeb_code
        varchar(32) colleague_inst_id
        varchar(20) source
        int attendance_count
        varchar(200) address_line1
        varchar(200) address_line2
        varchar(100) city
        int state_province_id FK
        varchar(20) postal_code
        int country_id FK
        varchar(30) phone
        varchar(200) email
        int default_credit_system_id FK
        text notes
        bool is_active
    }
    records__requirement_waivers {
        int waiver_id PK
        int student_id FK
        int block_id FK
        int item_id FK
        text reason
        date approved_date
        date expiry_date
        int substitute_course_id FK
        varchar(20) waiver_type
        bool is_active
        int approved_by_id FK
    }
    records__student_course_substitutions {
        int student_sub_id PK
        int student_id FK
        int block_id FK
        int original_course_id FK
        int substitute_course_id FK
        uuid final_approved_by_person_id FK
        date final_approval_date
        text notes
        varchar(30) status
        text reason
        int requested_by_user_id FK
        timestamp requested_at
        int advisor_user_id FK
        varchar(20) advisor_action
        text advisor_notes
        timestamp advisor_action_at
        int registrar_user_id FK
        varchar(20) registrar_action
        text registrar_notes
        timestamp registrar_action_at
        bool is_active
    }
    records__student_degree_progress {
        int progress_id PK
        int student_id FK
        int degree_id FK
        numeric(5_2) total_credits_required
        numeric(5_2) total_credits_completed
        numeric(4_3) overall_gpa
        timestamp last_audit_date
        numeric(5_2) completion_percentage
        int status_id FK
    }
    records__student_noncredit_completions {
        int student_noncredit_completion_id PK
        int student_id FK
        int course_id FK
        varchar(2) credit_type
        varchar(20) term_code
        int colleague_stc_id
        bool is_active
    }
    records__student_requirement_fulfillment {
        int fulfillment_id PK
        int progress_id FK
        int block_id FK
        bool is_satisfied
        numeric(5_2) credits_applied
        int courses_applied
    }
    records__transfer_course_equivalencies {
        int transfer_course_equivalency_id PK
        int institution_id FK
        varchar(20) source_course_code
        varchar(200) source_course_title
        numeric(8_4) source_credits
        int source_credit_system_id FK
        int equivalent_course_id FK
        numeric(5_2) credits_awarded
        varchar(5) min_grade
        int sort_order
        bool is_active
        varchar(20) source
        varchar(32) colleague_equiv_id
        text notes
    }
    records__transfer_credits {
        int legacy_transfer_credit_id
        int student_id FK
        varchar(200) source_institution_name
        varchar(20) source_institution_code
        varchar(20) source_course_code
        varchar(200) source_course_title
        numeric(5_2) credits_transferred
        varchar(5) grade_received
        int equivalent_course_id FK
        int transfer_term_id FK
        uuid evaluated_by_person_id FK
        date evaluated_date
        int status_id FK
        int credit_type_id FK
        bool is_four_year_institution
        uuid transfer_credit_id PK
        text rationale
        int source_credit_system_id FK
        numeric(8_4) source_credits
        int colleague_stc_id
        varchar(32) legacy_id
        bool is_active
        timestamp voided_at
        uuid voided_by FK
        int source_institution_id FK
    }
    records__graduation_applications ||--o{ records__graduation_application_status_history : "application_id"
    records__graduation_dates ||--o{ records__graduation_applications : "graduation_date_id"
    records__graduation_applications ||--o{ records__graduation_records : "application_id"
    records__graduation_dates ||--o{ records__graduation_records : "graduation_date_id"
    records__student_degree_progress ||--o{ records__student_requirement_fulfillment : "progress_id"
    records__institutions ||--o{ records__transfer_course_equivalencies : "institution_id"
    records__institutions ||--o{ records__transfer_credits : "source_institution_id"

11. Records - Course Materials ​

mermaid
erDiagram
    records__course_material_assignments {
        int course_material_id PK
        int course_id FK
        int material_id FK
        int requirement_id FK
        varchar(50) alternative_group
        varchar(20) usage_scope
        bool retained_across_terms
        bool inclusive_access_enrolled
        bool inclusive_access_opt_out
        date inclusive_access_deadline
        numeric(10_2) inclusive_access_charge
        text inclusive_access_instructions
        text faculty_notes
        text bookstore_notes
        text admin_notes
        int adoption_status_id FK
        timestamp adoption_submitted_at
        varchar(100) adoption_submitted_by
        int sort_order
    }
    records__material_formats {
        int format_id PK
        int material_id FK
        int format_type_id FK
        bool is_preferred
        numeric(10_2) price_new
        numeric(10_2) price_used
        numeric(10_2) price_rental
        numeric(10_2) price_digital
        numeric(10_2) price_inclusive_access
        varchar(2000) bookstore_url
        varchar(2000) publisher_url
        varchar(2000) oer_url
        int sort_order
    }
    records__material_platforms {
        int platform_id PK
        int material_id FK
        varchar(300) platform_name
        varchar(2000) platform_url
        bool access_code_required
        bool included_with_purchase
        bool available_standalone
        numeric(10_2) standalone_price
        varchar(100) access_duration
        bool is_one_time_use
        int sort_order
    }
    records__materials {
        int material_id PK
        int material_type_id FK
        varchar(500) title
        varchar(500) subtitle
        varchar(100) edition
        varchar(50) volume
        varchar(1000) authors
        varchar(1000) editors
        varchar(17) isbn_13
        varchar(13) isbn_10
        varchar(300) publisher
        int publication_year
        varchar(50) language
        bool used_copies_acceptable
        bool older_editions_acceptable
        text older_edition_note
        bool international_editions_acceptable
        bool is_oer
        bool is_zero_cost
        int oer_license_id FK
        varchar(2000) oer_source_url
        bool oer_offline_download
        text description
        text where_to_obtain
        numeric(10_2) estimated_cost
        varchar(200) model_version
        bool accessible_format_available
        text accessibility_notes
        varchar(500) accessibility_contact
        bool is_active
    }
    records__section_material_assignments {
        int section_material_id PK
        int section_id FK
        int material_id FK
        int source_course_material_id FK
        int requirement_id FK
        varchar(50) alternative_group
        varchar(20) usage_scope
        bool retained_across_terms
        bool inclusive_access_enrolled
        bool inclusive_access_opt_out
        date inclusive_access_deadline
        numeric(10_2) inclusive_access_charge
        text inclusive_access_instructions
        text faculty_notes
        text bookstore_notes
        text admin_notes
        int adoption_status_id FK
        timestamp adoption_submitted_at
        varchar(100) adoption_submitted_by
        int sort_order
    }
    records__materials ||--o{ records__course_material_assignments : "material_id"
    records__materials ||--o{ records__material_formats : "material_id"
    records__materials ||--o{ records__material_platforms : "material_id"
    records__materials ||--o{ records__section_material_assignments : "material_id"
    records__course_material_assignments ||--o{ records__section_material_assignments : "source_course_material_id"

12. Records - Workflows (Generic) ​

mermaid
erDiagram
    records__workflow_automation_rules {
        int rule_id PK
        varchar(100) rule_code UK
        varchar(200) name
        varchar(1000) description
        int rule_type_id FK
        text rule_expression
        bool is_active
    }
    records__workflow_definitions {
        int workflow_definition_id PK
        varchar(50) workflow_code UK
        varchar(200) name
        text description
        varchar(50) entity_type
        bool is_active
        int form_template_id FK
    }
    records__workflow_initiator_roles {
        int workflow_initiator_role_id PK
        int workflow_definition_id FK
        varchar(50) role_code
        bool can_start_for_others
    }
    records__workflow_instance_parallel_tracking {
        int workflow_instance_parallel_tracking_id PK
        int workflow_instance_id FK
        int parallel_step_id FK
        bool is_completed
        timestamp completed_at
    }
    records__workflow_instance_step_assignees {
        int workflow_instance_step_assignee_id PK
        int workflow_instance_step_id FK
        uuid person_id FK
        varchar(50) resolved_via
        int org_unit_id FK
    }
    records__workflow_instance_steps {
        int workflow_instance_step_id PK
        int workflow_instance_id FK
        int workflow_step_id FK
        timestamp entered_at
        timestamp exited_at
        uuid entered_by_person_id FK
        text notes
        varchar(20) outcome
        uuid completed_by_person_id FK
        uuid assigned_to_person_id FK
        uuid impersonator_person_id FK
        int form_response_id FK
    }
    records__workflow_instances {
        int workflow_instance_id PK
        int workflow_definition_id FK
        int entity_id
        int current_workflow_step_id FK
        varchar(20) status
        timestamp started_at
        timestamp completed_at
        uuid initiated_by_person_id FK
        int form_response_id FK
        uuid subject_person_id FK
        uuid impersonator_person_id FK
    }
    records__workflow_step_permissions {
        int workflow_step_permission_id PK
        int workflow_step_id FK
        varchar(50) role_code
        bool can_view
        bool can_edit
        bool can_transition
    }
    records__workflow_step_transitions {
        int transition_id PK
        int from_step_id FK
        int to_step_id FK
        varchar(50) transition_code
        varchar(200) name
        varchar(500) allowed_roles
        bool requires_approval
        bool is_automatic
        varchar(100) automation_rule_code
    }
    records__workflow_steps {
        int workflow_step_id PK
        int workflow_definition_id FK
        varchar(50) step_code
        varchar(200) name
        text description
        varchar(20) step_type
        int sort_order
        bool is_initial
        bool is_final
        text instructions
        varchar(50) assignee_rule
        int form_template_id FK
    }
    records__workflow_transitions {
        int workflow_transition_id PK
        int workflow_definition_id FK
        int from_step_id FK
        int to_step_id FK
        varchar(200) transition_name
        text condition_expression
    }
    records__workflow_definitions ||--o{ records__workflow_initiator_roles : "workflow_definition_id"
    records__workflow_steps ||--o{ records__workflow_instance_parallel_tracking : "parallel_step_id"
    records__workflow_instances ||--o{ records__workflow_instance_parallel_tracking : "workflow_instance_id"
    records__workflow_instance_steps ||--o{ records__workflow_instance_step_assignees : "workflow_instance_step_id"
    records__workflow_instances ||--o{ records__workflow_instance_steps : "workflow_instance_id"
    records__workflow_steps ||--o{ records__workflow_instance_steps : "workflow_step_id"
    records__workflow_steps ||--o{ records__workflow_instances : "current_workflow_step_id"
    records__workflow_definitions ||--o{ records__workflow_instances : "workflow_definition_id"
    records__workflow_steps ||--o{ records__workflow_step_permissions : "workflow_step_id"
    records__workflow_steps ||--o{ records__workflow_step_transitions : "from_step_id"
    records__workflow_steps ||--o{ records__workflow_step_transitions : "to_step_id"
    records__workflow_definitions ||--o{ records__workflow_steps : "workflow_definition_id"
    records__workflow_steps ||--o{ records__workflow_transitions : "from_step_id"
    records__workflow_steps ||--o{ records__workflow_transitions : "to_step_id"
    records__workflow_definitions ||--o{ records__workflow_transitions : "workflow_definition_id"

13. Records - Test Scores ​

mermaid
erDiagram
    records__applicant_test_score_sections {
        int score_section_id PK
        int score_id FK
        int section_id FK
        numeric(6_2) score
        int percentile
    }
    records__applicant_test_scores {
        int score_id PK
        uuid person_id FK
        int application_id FK
        int test_type_id FK
        numeric(6_2) composite_score
        date test_date
        timestamp score_reported_at
        timestamp self_reported_at
        bool is_self_reported
        bool is_official
        int verification_status_id FK
        int verified_by FK
        timestamp verified_at
        text verification_notes
        timestamp official_score_received_at
        varchar(100) score_send_confirmation
        int document_id FK
        text notes
    }
    records__institution_test_score_policies {
        int policy_id PK
        int test_type_id FK
        varchar(30) score_selection_method
        bool allow_superscoring
        varchar(30) superscore_method
        text notes
        bool is_active
    }
    records__person_superscore_records {
        int superscore_id PK
        uuid person_id FK
        int test_type_id FK
        numeric(6_2) superscore
        timestamp calculated_at
        int[] source_score_ids
    }
    records__standardized_test_sections {
        int section_id PK
        int test_type_id FK
        varchar(30) code
        varchar(100) name
        numeric(6_2) min_score
        numeric(6_2) max_score
        bool is_required
        int sort_order
    }
    records__standardized_test_types {
        int test_type_id PK
        varchar(20) code UK
        varchar(100) name
        text description
        numeric(6_2) min_score
        numeric(6_2) max_score
        numeric(4_2) score_increment
        int validity_months
        bool is_active
        int sort_order
    }
    records__applicant_test_scores ||--o{ records__applicant_test_score_sections : "score_id"
    records__standardized_test_sections ||--o{ records__applicant_test_score_sections : "section_id"
    records__standardized_test_types ||--o{ records__applicant_test_scores : "test_type_id"
    records__standardized_test_types ||--o{ records__institution_test_score_policies : "test_type_id"
    records__standardized_test_types ||--o{ records__person_superscore_records : "test_type_id"
    records__standardized_test_types ||--o{ records__standardized_test_sections : "test_type_id"

14. Student Finance - Catalog & Rates ​

mermaid
erDiagram
    studentfinance__ar_code_mappings {
        int ar_code_mapping_id PK
        varchar(10) ar_code UK
        varchar(20) category
        int fee_type_id FK
        varchar(200) description
        bool is_active
    }
    studentfinance__billing_bands {
        int band_id PK
        int billing_method_id FK
        varchar(100) band_name
        numeric min_credits
        bool min_inclusive
        numeric max_credits
        bool max_inclusive
        varchar(20) rate_type
        numeric flat_amount
        numeric per_credit_rate
        numeric credits_included_in_flat
        int currency_id FK
        int sort_order
        date effective_date
        date end_date
        varchar(10) band_kind
        numeric(5_2) credit_margin
        varchar(10) excess_rounding
    }
    studentfinance__billing_method_configs {
        int config_id PK
        int billing_method_id FK
        int term_id FK
        int degree_level_id FK
        int student_type_id FK
        int campus_id FK
        int priority
        date effective_date
        date end_date
        jsonb selector
        int cohort_id FK
    }
    studentfinance__billing_methods {
        int billing_method_id PK
        varchar(30) method_code UK
        varchar(200) name
        varchar(500) description
        varchar(20) method_type
        bool is_active
    }
    studentfinance__billing_settings {
        int setting_id PK
        varchar(50) setting_key UK
        varchar(500) setting_value
        varchar(200) description
    }
    studentfinance__billing_student_type_rules {
        int billing_student_type_rule_id PK
        varchar(200) name
        text description
        int student_type_id FK
        jsonb selector
        int priority
        date effective_date
        date end_date
        bool is_active
    }
    studentfinance__billing_transaction_items {
        int item_id PK
        int billing_transaction_id
        int enrollment_id
        int section_id FK
        numeric billing_credits
        numeric tuition_amount
        numeric section_fee_amount
        int fee_type_id FK
        numeric refund_amount
        date refund_date
        numeric refund_percentage
        uuid billing_transaction_uuid FK
    }
    studentfinance__course_fees {
        int course_fee_id PK
        int course_id FK
        int fee_type_id FK
        varchar(200) fee_name
        varchar(20) calculation_type
        numeric(10_2) amount
        int currency_id FK
        int campus_id FK
        int term_id FK
        date effective_date
        date end_date
        bool is_active
        text notes
        varchar(20) source
        timestamp ods_synced_at
        varchar(10) source_ar_code
    }
    studentfinance__credit_rate_schedules {
        int rate_schedule_id PK
        int billing_method_id FK
        numeric rate_per_credit
        int currency_id FK
        numeric min_credits
        numeric max_credits
        date effective_date
        date end_date
    }
    studentfinance__fee_schedules {
        int fee_schedule_id PK
        int fee_type_id FK
        int term_id FK
        numeric(10_2) amount
        bool per_credit_hour
        date effective_date
        date end_date
    }
    studentfinance__fee_types {
        int fee_type_id PK
        varchar(20) fee_code UK
        varchar(200) name
        text description
        bool is_tuition
        bool is_refundable
        varchar(50) gl_account_code
        bool is_active
    }
    studentfinance__payment_plan_fees {
        int fee_id PK
        int plan_id FK
        int fee_type_id FK
        numeric flat_fee
        numeric percentage_fee
        bool is_upfront
        bool spread_across_payments
        int currency_id FK
        date effective_date
        date end_date
    }
    studentfinance__program_fees {
        int program_fee_id PK
        int major_id FK
        varchar(50) major_code_pattern
        int campus_id FK
        int fee_type_id FK
        varchar(200) fee_name
        varchar(20) calculation_type
        numeric(10_2) amount
        int currency_id FK
        int degree_level_id FK
        int student_type_id FK
        int term_id FK
        bool primary_major_only
        int priority
        date effective_date
        date end_date
        bool is_active
        text notes
    }
    studentfinance__refund_schedule_entries {
        int entry_id PK
        int refund_schedule_id FK
        varchar(100) entry_name
        int start_day
        int end_day
        numeric refund_percentage
        bool applies_to_tuition
        bool applies_to_fees
        int sort_order
    }
    studentfinance__refund_schedules {
        int refund_schedule_id PK
        int term_id FK
        varchar(200) name
        varchar(500) description
        bool is_active
    }
    studentfinance__section_fee_overrides {
        int section_fee_override_id PK
        int section_id FK
        int fee_type_id FK
        varchar(200) fee_name
        varchar(20) calculation_type
        numeric(10_2) amount
        int currency_id FK
        bool replaces_course_fee
        date effective_date
        date end_date
        bool is_active
        text notes
        varchar(20) source
        timestamp ods_synced_at
        varchar(10) source_ar_code
    }
    studentfinance__term_fee_bands {
        int band_id PK
        int term_fee_id FK
        varchar(100) band_name
        numeric min_credits
        bool min_inclusive
        numeric max_credits
        bool max_inclusive
        numeric amount
        int sort_order
    }
    studentfinance__term_fee_categories {
        int category_id PK
        int term_fee_id FK
        int degree_level_id FK
        int student_type_id FK
        int campus_id FK
        int student_list_id FK
        numeric amount
        int priority
        date effective_date
        date end_date
    }
    studentfinance__term_fee_category_bands {
        int category_band_id PK
        int category_id FK
        varchar(100) band_name
        numeric min_credits
        bool min_inclusive
        numeric max_credits
        bool max_inclusive
        numeric amount
        int sort_order
    }
    studentfinance__term_fees {
        int term_fee_id PK
        int term_id FK
        int fee_type_id FK
        varchar(200) fee_name
        varchar(500) description
        varchar(20) calculation_type
        bool is_universal
        numeric flat_amount
        int currency_id FK
        int sort_order
        bool is_active
        date effective_date
        date end_date
        jsonb eligibility
    }
    studentfinance__upfront_payment_discounts {
        int discount_id PK
        int term_id FK
        varchar(20) discount_type
        numeric discount_amount
        numeric discount_percentage
        int currency_id FK
        date effective_date
        date end_date
    }
    studentfinance__fee_types ||--o{ studentfinance__ar_code_mappings : "fee_type_id"
    studentfinance__billing_methods ||--o{ studentfinance__billing_bands : "billing_method_id"
    studentfinance__billing_methods ||--o{ studentfinance__billing_method_configs : "billing_method_id"
    studentfinance__fee_types ||--o{ studentfinance__billing_transaction_items : "fee_type_id"
    studentfinance__fee_types ||--o{ studentfinance__course_fees : "fee_type_id"
    studentfinance__billing_methods ||--o{ studentfinance__credit_rate_schedules : "billing_method_id"
    studentfinance__fee_types ||--o{ studentfinance__fee_schedules : "fee_type_id"
    studentfinance__fee_types ||--o{ studentfinance__payment_plan_fees : "fee_type_id"
    studentfinance__fee_types ||--o{ studentfinance__program_fees : "fee_type_id"
    studentfinance__refund_schedules ||--o{ studentfinance__refund_schedule_entries : "refund_schedule_id"
    studentfinance__fee_types ||--o{ studentfinance__section_fee_overrides : "fee_type_id"
    studentfinance__term_fees ||--o{ studentfinance__term_fee_bands : "term_fee_id"
    studentfinance__term_fees ||--o{ studentfinance__term_fee_categories : "term_fee_id"
    studentfinance__term_fee_categories ||--o{ studentfinance__term_fee_category_bands : "category_id"
    studentfinance__fee_types ||--o{ studentfinance__term_fees : "fee_type_id"

15. Student Finance - Student Charges & Payments ​

mermaid
erDiagram
    studentfinance__colleague_ar_charges {
        bigint colleague_ar_charge_id PK
        int student_id FK
        int term_id FK
        varchar(12) ar_invoice_item_id UK
        varchar(12) invoice_no
        varchar(20) person_id
        varchar(20) term_code
        varchar(10) ar_code
        text description
        varchar(200) course_description
        varchar(20) student_course_sec
        numeric(12_2) charge_amount
        numeric(12_2) credit_amount
        numeric(12_2) net_amount
        date invoice_date
        timestamp imported_at
    }
    studentfinance__payment_allocations {
        int allocation_id PK
        int payment_id
        int charge_id
        numeric(10_2) amount
        date allocation_date
        uuid charge_uuid FK
        uuid payment_uuid FK
    }
    studentfinance__payment_plan_eligibility {
        int eligibility_id PK
        int plan_id FK
        int student_list_id FK
        int degree_level_id FK
        int student_type_id FK
        int campus_id FK
        int major_id FK
        numeric min_credits
        int priority
        bool is_default_plan
        date effective_date
        date end_date
    }
    studentfinance__payment_plan_schedules {
        int schedule_id PK
        int plan_term_id FK
        int payment_number
        date due_date
        numeric percentage_of_total
    }
    studentfinance__payment_plan_terms {
        int plan_term_id PK
        int plan_id FK
        int term_id FK
        date enrollment_deadline
        date first_payment_date
        bool is_active
    }
    studentfinance__payment_plans {
        int plan_id PK
        varchar(30) plan_code UK
        varchar(200) name
        varchar(500) description
        int number_of_payments
        varchar(20) payment_frequency
        bool is_active
    }
    studentfinance__student_account_balance {
        int balance_id PK
        int student_id FK
        int term_id FK
        numeric(10_2) total_charges
        numeric(10_2) total_payments
        numeric(10_2) current_balance
        timestamp last_updated
    }
    studentfinance__student_billing_transactions {
        int legacy_billing_transaction_id
        int student_id FK
        int term_id FK
        int billing_method_id FK
        date billing_date
        numeric total_tuition
        numeric total_fees
        numeric total_billed
        numeric total_credits_billed
        int currency_id FK
        int status_id FK
        uuid student_billing_transaction_id PK
        varchar(32) legacy_id
    }
    studentfinance__student_charges {
        int legacy_charge_id
        int student_id FK
        int term_id FK
        int fee_type_id FK
        numeric(10_2) amount
        text description
        date charge_date
        date due_date
        int status_id FK
        uuid student_charge_id PK
        varchar(32) legacy_id
    }
    studentfinance__student_class_waivers {
        int student_class_waiver_id PK
        int student_id FK
        int term_id FK
        int section_id FK
        varchar(50) reason
        text notes
        bool is_active
    }
    studentfinance__student_payment_plan_enrollments {
        int enrollment_id PK
        int student_id FK
        int plan_term_id FK
        int billing_transaction_id
        numeric total_amount
        numeric plan_fee_amount
        date enrolled_date
        int status_id FK
        uuid billing_transaction_uuid FK
    }
    studentfinance__student_payment_plan_schedule {
        int schedule_item_id PK
        int plan_enrollment_id FK
        int payment_number
        date due_date
        numeric amount_due
        numeric amount_paid
        int status_id FK
        date paid_date
    }
    studentfinance__student_payments {
        int legacy_payment_id
        int student_id FK
        numeric(10_2) amount
        date payment_date
        int payment_method_id FK
        varchar(100) reference_number
        int status_id FK
        uuid student_payment_id PK
        varchar(32) legacy_id
    }
    studentfinance__student_charges ||--o{ studentfinance__payment_allocations : "charge_uuid"
    studentfinance__student_payments ||--o{ studentfinance__payment_allocations : "payment_uuid"
    studentfinance__payment_plans ||--o{ studentfinance__payment_plan_eligibility : "plan_id"
    studentfinance__payment_plan_terms ||--o{ studentfinance__payment_plan_schedules : "plan_term_id"
    studentfinance__payment_plans ||--o{ studentfinance__payment_plan_terms : "plan_id"
    studentfinance__student_billing_transactions ||--o{ studentfinance__student_payment_plan_enrollments : "billing_transaction_uuid"
    studentfinance__payment_plan_terms ||--o{ studentfinance__student_payment_plan_enrollments : "plan_term_id"
    studentfinance__student_payment_plan_enrollments ||--o{ studentfinance__student_payment_plan_schedule : "plan_enrollment_id"

16. Student Finance - Plans & Elections ​

mermaid
erDiagram
    studentfinance__housing_plans {
        int housing_plan_id PK
        int campus_id FK
        varchar(50) plan_code
        varchar(200) name
        text description
        int fee_type_id FK
        numeric(10_2) amount
        int currency_id FK
        int term_id FK
        bool is_prorated
        varchar(20) proration_basis
        int sort_order
        bool is_active
        date effective_date
        date end_date
    }
    studentfinance__meal_plans {
        int meal_plan_id PK
        int campus_id FK
        varchar(50) plan_code
        varchar(200) name
        text description
        int fee_type_id FK
        numeric(10_2) amount
        int currency_id FK
        int term_id FK
        int meals_per_week
        numeric(10_2) flex_dollars
        bool is_prorated
        varchar(20) proration_basis
        int sort_order
        bool is_active
        date effective_date
        date end_date
    }
    studentfinance__student_housing_assignments {
        uuid student_housing_assignment_id PK
        int student_id FK
        int term_id FK
        int housing_plan_id FK
        int status_id FK
        date start_date
        date end_date
        uuid replaces_assignment_id FK
        bool is_current
        text notes
    }
    studentfinance__student_meal_plan_elections {
        uuid student_meal_plan_election_id PK
        int student_id FK
        int term_id FK
        int meal_plan_id FK
        int status_id FK
        date start_date
        date end_date
        uuid replaces_election_id FK
        bool is_current
        text notes
    }
    studentfinance__housing_plans ||--o{ studentfinance__student_housing_assignments : "housing_plan_id"
    studentfinance__student_housing_assignments ||--o{ studentfinance__student_housing_assignments : "parent"
    studentfinance__meal_plans ||--o{ studentfinance__student_meal_plan_elections : "meal_plan_id"
    studentfinance__student_meal_plan_elections ||--o{ studentfinance__student_meal_plan_elections : "parent"

17. Core - System & Reference ​

mermaid
erDiagram
    core__email_templates {
        int template_id PK
        varchar(100) template_code UK
        varchar(200) name
        varchar(500) subject
        text body_html
        text description
        text available_variables
        bool is_active
    }
    core__migration_watermarks {
        text step_name PK
        timestamp last_source_max
        timestamptz last_run_at
        text last_run_mode
        text notes
    }
    core__schema_migrations {
        text filename PK
        text checksum
        timestamptz started_at
        timestamptz applied_at
        text applied_by
        text git_commit
    }
    core__sys_currencies {
        int currency_id PK
        varchar(3) iso_code UK
        varchar(100) name
        varchar(5) symbol
        int decimal_places
        bool is_active
    }
    core__sys_institution_settings {
        int setting_id PK
        varchar(100) setting_key UK
        text setting_value
        varchar(50) setting_type
        varchar(500) description
    }
    core__ui_translations {
        int translation_id PK
        varchar(10) language_code
        varchar(200) translation_key
        text translation_value
    }

18. LMS - Connector Definitions ​

mermaid
erDiagram
    lms__connector_operations {
        int operation_id PK
        int connector_type_id FK
        varchar(60) operation_code
        text description
        bool is_active
    }
    lms__connector_types {
        int connector_type_id PK
        varchar(50) code UK
        varchar(200) name
        text description
        varchar(40) auth_strategy_code
        varchar(30) pagination_style
        numeric(6_2) default_rate_limit_rps
        int default_rate_burst
        bool is_active
    }
    lms__operation_versions {
        int version_id PK
        int operation_id FK
        int instance_id FK
        int version_no
        jsonb definition
        timestamptz effective_at
        text notes
    }
    lms__connector_types ||--o{ lms__connector_operations : "connector_type_id"
    lms__connector_operations ||--o{ lms__operation_versions : "operation_id"

19. LMS - Instances, Credentials & Mappings ​

mermaid
erDiagram
    lms__assignment_rules {
        int rule_id PK
        int instance_id FK
        int org_unit_id FK
        int campus_id FK
        int priority
        bool is_active
    }
    lms__instance_access_tokens {
        int instance_id PK
        bytea token_ciphertext
        varchar(40) enc_key_id
        timestamptz expires_at
        timestamptz obtained_at
    }
    lms__instance_credentials {
        int credential_id PK
        int instance_id FK
        varchar(20) purpose
        varchar(500) client_id
        bytea secret_ciphertext
        varchar(40) enc_key_id
        varchar(2000) token_url
        varchar(1000) scopes
        int rotated_from_credential_id FK
        timestamptz activated_at
        timestamptz retired_at
        bool is_active
    }
    lms__instance_org_unit_mappings {
        int instance_org_unit_mapping_id PK
        int instance_id FK
        int org_unit_id FK
        varchar(200) lms_account_id
    }
    lms__instance_role_mappings {
        int instance_role_mapping_id PK
        int instance_id FK
        varchar(12) role_key
        varchar(200) lms_role
    }
    lms__instance_term_mappings {
        int instance_term_mapping_id PK
        int instance_id FK
        int term_id FK
        varchar(200) lms_term_id
    }
    lms__instances {
        int instance_id PK
        int connector_type_id FK
        varchar(50) code UK
        varchar(200) name
        varchar(2000) base_url
        bool is_sandbox
        bool is_active
        bool dry_run
        bool grade_passback_enabled
        varchar(20) match_strategy
        varchar(20) drop_behavior
        numeric(6_2) rate_limit_rps
        int rate_burst
        varchar(500) shell_name_template
        varchar(500) shell_code_template
        jsonb settings
        bool create_missing_users
    }
    lms__sync_policy {
        int policy_id PK
        varchar(20) provisioning_mode
        varchar(20) provision_trigger
        int provision_days_before
        varchar(20) enrollment_sync_trigger
        int enrollment_days_before
        varchar(20) conclude_policy
        int conclude_days_after
        varchar(12) drift_missing_enrollment
        varchar(12) drift_extra_enrollment
        varchar(12) drift_missing_shell
    }
    lms__instances ||--o{ lms__assignment_rules : "instance_id"
    lms__instances ||--o{ lms__instance_access_tokens : "instance_id"
    lms__instances ||--o{ lms__instance_credentials : "instance_id"
    lms__instance_credentials ||--o{ lms__instance_credentials : "parent"
    lms__instances ||--o{ lms__instance_org_unit_mappings : "instance_id"
    lms__instances ||--o{ lms__instance_role_mappings : "instance_id"
    lms__instances ||--o{ lms__instance_term_mappings : "instance_id"

20. LMS - Shells, Enrollments & Sync ​

mermaid
erDiagram
    lms__course_shells {
        int shell_id PK
        int instance_id FK
        int term_id FK
        varchar(200) lms_course_id
        varchar(20) status_code
        bool is_adopted
        timestamptz enrollment_sync_started_at
        varchar(500) name_snapshot
        varchar(200) code_snapshot
        varchar(200) sis_course_id
    }
    lms__drift_findings {
        bigint finding_id PK
        int instance_id FK
        int shell_id FK
        int section_id
        varchar(40) finding_code
        uuid subject_person_id
        jsonb details
        timestamptz detected_at
        timestamptz resolved_at
        varchar(20) resolution_code
        varchar(100) resolved_by
    }
    lms__enrollment_links {
        bigint link_id PK
        int shell_id FK
        uuid person_id FK
        varchar(12) role_key
        uuid source_enrollment_id FK
        varchar(200) lms_enrollment_id
        varchar(12) state_code
        timestamptz last_synced_at
    }
    lms__export_files {
        bigint export_file_id PK
        bigint export_run_id FK
        varchar(20) dataset
        varchar(200) filename
        int row_count
        bigint byte_size
        char sha256
        varchar(1000) storage_path
    }
    lms__export_runs {
        bigint export_run_id PK
        int instance_id FK
        varchar(8) mode
        int[] term_ids
        varchar[] datasets
        varchar(16) status
        jsonb row_counts
        varchar(200) lms_import_id
        varchar(100) requested_by
        timestamptz started_at
        timestamptz finished_at
    }
    lms__export_watermarks {
        int instance_id PK
        varchar(20) dataset PK
        timestamptz last_source_max
    }
    lms__integration_log {
        bigint log_id PK
        bigint job_id
        int instance_id
        varchar(60) operation_code
        varchar(8) http_method
        text url
        int status_code
        varchar(30) error_class
        bool is_dry_run
        jsonb request_headers
        text request_body
        text response_body
        int duration_ms
        timestamptz attempted_at
    }
    lms__passback_watermarks {
        int instance_id PK
        bigint last_log_id
    }
    lms__section_overrides {
        int section_id PK
        int instance_id FK
        bool provisioning_exempt
        text notes
    }
    lms__shell_sections {
        int shell_section_id PK
        int shell_id FK
        int section_id FK
        bool is_primary
        timestamptz added_at
        timestamptz removed_at
    }
    lms__sync_jobs {
        bigint job_id PK
        varchar(40) kind
        int instance_id FK
        int shell_id FK
        int section_id
        uuid subject_person_id
        uuid enrollment_id
        bigint export_run_id
        varchar(200) dedupe_key
        jsonb payload
        varchar(12) status
        smallint priority
        timestamptz run_after
        int attempts
        int max_attempts
        varchar(100) locked_by
        timestamptz locked_at
        text last_error
        varchar(30) last_error_class
        timestamptz finished_at
    }
    lms__sync_runs {
        bigint run_id PK
        varchar(30) run_kind
        timestamptz started_at
        timestamptz finished_at
        varchar(12) status
        jsonb stats
        text error
    }
    lms__user_mappings {
        int mapping_id PK
        int instance_id FK
        uuid person_id FK
        varchar(200) lms_user_id
        varchar(20) matched_by
    }
    lms__course_shells ||--o{ lms__drift_findings : "shell_id"
    lms__course_shells ||--o{ lms__enrollment_links : "shell_id"
    lms__export_runs ||--o{ lms__export_files : "export_run_id"
    lms__course_shells ||--o{ lms__shell_sections : "shell_id"
    lms__course_shells ||--o{ lms__sync_jobs : "shell_id"

21. Payments - Online Payment Sessions ​

mermaid
erDiagram
    payments__payment_session {
        bigint payment_session_id PK
        uuid session_token UK
        int payment_type_id FK
        varchar(20) ods_person_id
        text[] matched_on
        inet client_ip
        varchar(20) status
        timestamptz expires_at
    }
    payments__payment_transaction {
        bigint payment_transaction_id PK
        uuid uid UK
        bigint payment_session_id FK
        int payment_type_id FK
        varchar(20) ods_person_id
        numeric(9_2) amount
        varchar(20) status
        varchar(10) aci_result_code
        varchar(100) aci_result_text
        varchar(100) aci_confirmation
        varchar(20) account_type
        varchar(5) card_last_four
        numeric(9_2) posted_amount
        numeric(9_2) transaction_fee
        numeric(9_2) total_charge
        bool amount_mismatch
        timestamptz aci_transaction_at
        timestamptz postback_received_at
        inet postback_source_ip
        text raw_postback
        varchar(20) colleague_post_status
        timestamptz colleague_posted_at
        varchar(100) colleague_reference
    }
    payments__payment_type {
        int payment_type_id PK
        varchar(50) code UK
        varchar(200) display_name
        text description
        varchar(100) aci_product_id
        bool requires_student_verification
        bool is_active
        int sort_order
    }
    payments__verification_attempt {
        bigint verification_attempt_id PK
        inet client_ip
        varchar(20) attempted_student_id
        bool succeeded
    }
    payments__payment_type ||--o{ payments__payment_session : "payment_type_id"
    payments__payment_session ||--o{ payments__payment_transaction : "payment_session_id"
    payments__payment_type ||--o{ payments__payment_transaction : "payment_type_id"

Cross-Section Relationship Summary ​

Foreign keys inside one schema whose two ends were placed in different sections. These are not drawn above — a section shows only the edges wholly inside it — so this table is where the other 137 live.

ParentChild columnParent section
core__peoplecore.application_access_tokens.person_id2. Core - People & Identity
core__peoplecore.audit_log.changed_by_person_id2. Core - People & Identity
core__peoplecore.auth_users.person_id2. Core - People & Identity
core__peoplecore.clubs_organizations.advisor_person_id2. Core - People & Identity
core__peoplecore.data_change_history.changed_by_person_id2. Core - People & Identity
core__peoplecore.email_templates.created_by2. Core - People & Identity
core__peoplecore.email_templates.updated_by2. Core - People & Identity
core__peoplecore.ferpa_change_log.person_id2. Core - People & Identity
core__person_identifierscore.identifier_access_log.person_identifier_id2. Core - People & Identity
core__peoplecore.identifier_access_log.target_person_id2. Core - People & Identity
core__auth_userscore.identifier_access_log.viewer_user_id3. Core - Auth & Authorization
core__peoplecore.legacy_academic_credits.person_id2. Core - People & Identity
core__countriescore.people.citizenship_country_id1. Core - Organization
core__countriescore.people.country_of_birth_id1. Core - Organization
core__auth_userscore.permission_audit_log.changed_by_user_id3. Core - Auth & Authorization
core__countriescore.person_identifiers.issuing_country_id1. Core - Organization
core__state_provincescore.person_identifiers.issuing_state_province_id1. Core - Organization
core__auth_userscore.person_merge_log.merged_by_user_id3. Core - Auth & Authorization
core__auth_userscore.person_name_audit_log.changed_by_user_id3. Core - Auth & Authorization
core__peoplecore.person_name_audit_log.person_id2. Core - People & Identity
core__person_namescore.person_name_audit_log.person_name_id2. Core - People & Identity
core__auth_userscore.person_photos.reviewed_by_user_id3. Core - Auth & Authorization
core__auth_userscore.person_photos.submitted_by_user_id3. Core - Auth & Authorization
core__auth_userscore.person_photos.uploaded_by_user_id3. Core - Auth & Authorization
core__auth_userscore.photo_sync_runs.triggered_by3. Core - Auth & Authorization
core__auth_userscore.proxy_access_audit_log.performed_by_user_id3. Core - Auth & Authorization
core__peoplecore.proxy_access_audit_log.proxy_person_id2. Core - People & Identity
core__peoplecore.proxy_invitations.proxy_person_id2. Core - People & Identity
core__peoplecore.student_proxy_access.proxy_person_id2. Core - People & Identity
core__auth_userscore.student_proxy_access.revoked_by_user_id3. Core - Auth & Authorization
core__peoplecore.unit_administrators.person_id2. Core - People & Identity
core__unit_administratorscore.user_active_role.active_admin_id1. Core - Organization
lms__instanceslms.course_shells.instance_id19. LMS - Instances, Credentials & Mappings
lms__instanceslms.drift_findings.instance_id19. LMS - Instances, Credentials & Mappings
lms__instanceslms.export_runs.instance_id19. LMS - Instances, Credentials & Mappings
lms__instanceslms.export_watermarks.instance_id19. LMS - Instances, Credentials & Mappings
lms__connector_typeslms.instances.connector_type_id18. LMS - Connector Definitions
lms__instanceslms.operation_versions.instance_id19. LMS - Instances, Credentials & Mappings
lms__instanceslms.passback_watermarks.instance_id19. LMS - Instances, Credentials & Mappings
lms__instanceslms.section_overrides.instance_id19. LMS - Instances, Credentials & Mappings
lms__instanceslms.sync_jobs.instance_id19. LMS - Instances, Credentials & Mappings
lms__instanceslms.user_mappings.instance_id19. LMS - Instances, Credentials & Mappings
records__bulletinsrecords.academic_policy_rules.bulletin_id5. Records - Academic Calendar
records__grading_system_gradesrecords.academic_policy_rules.min_grade_id6. Records - Courses & Sections
records__academic_termsrecords.applicants.application_term_id5. Records - Academic Calendar
records__majorsrecords.applicants.intended_major_id7. Records - Programs & Requirements
records__academic_termsrecords.classes.term_id5. Records - Academic Calendar
records__majorsrecords.cohort_majors.major_id7. Records - Programs & Requirements
records__academic_yearsrecords.cohorts.academic_year_id5. Records - Academic Calendar
records__academic_termsrecords.cohorts.expected_graduation_term_id5. Records - Academic Calendar
records__majorsrecords.cohorts.major_id7. Records - Programs & Requirements
records__academic_termsrecords.cohorts.start_term_id5. Records - Academic Calendar
records__bulletinsrecords.course_bulletins.bulletin_id5. Records - Academic Calendar
records__coursesrecords.course_material_assignments.course_id6. Records - Courses & Sections
records__coursesrecords.course_offering_terms.course_id6. Records - Courses & Sections
records__bulletinsrecords.course_patterns.bulletin_id5. Records - Academic Calendar
records__sub_termsrecords.course_sections.sub_term_id5. Records - Academic Calendar
records__academic_termsrecords.course_sections.term_id5. Records - Academic Calendar
records__bulletinsrecords.course_substitutions.bulletin_id5. Records - Academic Calendar
records__majorsrecords.course_substitutions.major_id7. Records - Programs & Requirements
records__requirement_blocksrecords.course_substitutions.requirement_block_id7. Records - Programs & Requirements
records__requirement_blocksrecords.courses.prereq_block_id7. Records - Programs & Requirements
records__advisorsrecords.degree_default_advisors.advisor_id8. Records - Roles & Student Data
records__grading_systemsrecords.degree_level_grading_systems.grading_system_id6. Records - Courses & Sections
records__bulletinsrecords.degrees.bulletin_id5. Records - Academic Calendar
records__course_sectionsrecords.grade_releases.section_id6. Records - Courses & Sections
records__degreesrecords.graduation_applications.degree_id7. Records - Programs & Requirements
records__academic_termsrecords.graduation_applications.expected_graduation_term_id5. Records - Academic Calendar
records__studentsrecords.graduation_applications.student_id8. Records - Roles & Student Data
records__academic_termsrecords.graduation_dates.term_id5. Records - Academic Calendar
records__degreesrecords.graduation_records.degree_id7. Records - Programs & Requirements
records__majorsrecords.graduation_records.major_id7. Records - Programs & Requirements
records__studentsrecords.graduation_records.student_id8. Records - Roles & Student Data
records__hold_typesrecords.hold_evaluation_log.hold_type_id8. Records - Roles & Student Data
records__bulletinsrecords.major_blocks.bulletin_id5. Records - Academic Calendar
records__advisorsrecords.major_default_advisors.advisor_id8. Records - Roles & Student Data
records__bulletinsrecords.majors.bulletin_id5. Records - Academic Calendar
records__bulletinsrecords.minor_blocks.bulletin_id5. Records - Academic Calendar
records__advisorsrecords.minor_default_advisors.advisor_id8. Records - Roles & Student Data
records__bulletinsrecords.minors.bulletin_id5. Records - Academic Calendar
records__requirement_blocksrecords.planned_courses.requirement_block_id7. Records - Programs & Requirements
records__requirement_itemsrecords.planned_courses.requirement_item_id7. Records - Programs & Requirements
records__course_sectionsrecords.planned_courses.section_id6. Records - Courses & Sections
records__studentsrecords.planned_courses.student_id8. Records - Roles & Student Data
records__majorsrecords.probation_alert_log.major_id7. Records - Programs & Requirements
records__studentsrecords.probation_alert_log.student_id8. Records - Roles & Student Data
records__studentsrecords.registration_transactions.student_id8. Records - Roles & Student Data
records__academic_termsrecords.registration_transactions.term_id5. Records - Academic Calendar
records__bulletinsrecords.requirement_blocks.bulletin_id5. Records - Academic Calendar
records__grading_system_gradesrecords.requirement_blocks.min_grade_id6. Records - Courses & Sections
records__grading_system_gradesrecords.requirement_groups.min_grade_id6. Records - Courses & Sections
records__coursesrecords.requirement_item_courses.course_id6. Records - Courses & Sections
records__coursesrecords.requirement_items.course_id6. Records - Courses & Sections
records__course_patternsrecords.requirement_items.course_pattern_id6. Records - Courses & Sections
records__requirement_blocksrecords.requirement_waivers.block_id7. Records - Programs & Requirements
records__requirement_itemsrecords.requirement_waivers.item_id7. Records - Programs & Requirements
records__studentsrecords.requirement_waivers.student_id8. Records - Roles & Student Data
records__coursesrecords.requirement_waivers.substitute_course_id6. Records - Courses & Sections
records__teachersrecords.section_instructors.teacher_id8. Records - Roles & Student Data
records__course_sectionsrecords.section_material_assignments.section_id6. Records - Courses & Sections
records__course_sectionsrecords.section_waitlists.section_id6. Records - Courses & Sections
records__bulletinsrecords.sequence_policies.bulletin_id5. Records - Academic Calendar
records__majorsrecords.student_academic_status_history.major_id7. Records - Programs & Requirements
records__academic_termsrecords.student_awards.term_id5. Records - Academic Calendar
records__requirement_blocksrecords.student_course_substitutions.block_id7. Records - Programs & Requirements
records__coursesrecords.student_course_substitutions.original_course_id6. Records - Courses & Sections
records__studentsrecords.student_course_substitutions.student_id8. Records - Roles & Student Data
records__coursesrecords.student_course_substitutions.substitute_course_id6. Records - Courses & Sections
records__degreesrecords.student_degree_progress.degree_id7. Records - Programs & Requirements
records__studentsrecords.student_degree_progress.student_id8. Records - Roles & Student Data
records__emphasis_areasrecords.student_emphases.emphasis_id7. Records - Programs & Requirements
records__academic_termsrecords.student_holds.term_id5. Records - Academic Calendar
records__bulletinsrecords.student_majors.bulletin_id5. Records - Academic Calendar
records__majorsrecords.student_majors.major_id7. Records - Programs & Requirements
records__bulletinsrecords.student_minors.bulletin_id5. Records - Academic Calendar
records__minorsrecords.student_minors.minor_id7. Records - Programs & Requirements
records__coursesrecords.student_noncredit_completions.course_id6. Records - Courses & Sections
records__studentsrecords.student_noncredit_completions.student_id8. Records - Roles & Student Data
records__requirement_blocksrecords.student_requirement_fulfillment.block_id7. Records - Programs & Requirements
records__grading_system_gradesrecords.student_section_enrollments.grade_id6. Records - Courses & Sections
records__grading_system_gradesrecords.student_section_enrollments.midterm_grade_id6. Records - Courses & Sections
records__course_sectionsrecords.student_section_enrollments.section_id6. Records - Courses & Sections
records__studentsrecords.student_section_enrollments.student_id8. Records - Roles & Student Data
records__studentsrecords.student_term_enrollments.student_id8. Records - Roles & Student Data
records__academic_termsrecords.student_term_enrollments.term_id5. Records - Academic Calendar
records__academic_termsrecords.students.initial_term_id5. Records - Academic Calendar
records__course_sectionsrecords.transaction_enrollment_items.section_id6. Records - Courses & Sections
records__coursesrecords.transfer_course_equivalencies.equivalent_course_id6. Records - Courses & Sections
records__coursesrecords.transfer_credits.equivalent_course_id6. Records - Courses & Sections
records__studentsrecords.transfer_credits.student_id8. Records - Roles & Student Data
records__academic_termsrecords.transfer_credits.transfer_term_id5. Records - Academic Calendar
studentfinance__student_billing_transactionsstudentfinance.billing_transaction_items.billing_transaction_uuid15. Student Finance - Student Charges & Payments
studentfinance__fee_typesstudentfinance.housing_plans.fee_type_id14. Student Finance - Catalog & Rates
studentfinance__fee_typesstudentfinance.meal_plans.fee_type_id14. Student Finance - Catalog & Rates
studentfinance__payment_plansstudentfinance.payment_plan_fees.plan_id15. Student Finance - Student Charges & Payments
studentfinance__billing_methodsstudentfinance.student_billing_transactions.billing_method_id14. Student Finance - Catalog & Rates
studentfinance__fee_typesstudentfinance.student_charges.fee_type_id14. Student Finance - Catalog & Rates

Cross-Schema Relationship Summary ​

Foreign keys whose two ends live in different schemas — the seams where one subsystem depends on another.

ParentChild columnChild table
records__studentscore.proxy_access_audit_log.student_idstudents
records__studentscore.proxy_invitations.student_idstudents
records__studentscore.student_organization_membership.student_idstudents
records__studentscore.student_proxy_access.student_idstudents
core__campuseslms.assignment_rules.campus_idcampuses
core__org_unitslms.assignment_rules.org_unit_idorg_units
records__academic_termslms.course_shells.term_idacademic_terms
core__peoplelms.enrollment_links.person_idpeople
records__student_section_enrollmentslms.enrollment_links.source_enrollment_idstudent_section_enrollments
core__org_unitslms.instance_org_unit_mappings.org_unit_idorg_units
records__academic_termslms.instance_term_mappings.term_idacademic_terms
records__course_sectionslms.section_overrides.section_idcourse_sections
records__course_sectionslms.shell_sections.section_idcourse_sections
core__peoplelms.user_mappings.person_idpeople
core__departmentsrecords.advisors.department_iddepartments
core__peoplerecords.advisors.person_idpeople
core__peoplerecords.applicant_test_scores.person_idpeople
core__auth_usersrecords.applicant_test_scores.verified_byauth_users
core__peoplerecords.applicants.person_idpeople
core__roomsrecords.class_schedules.room_idrooms
core__campusesrecords.cohorts.campus_idcampuses
core__departmentsrecords.course_patterns.department_iddepartments
core__campusesrecords.course_sections.campus_idcampuses
studentfinance__fee_typesrecords.course_sections.fee_type_idfee_types
core__peoplerecords.course_substitutions.approved_by_person_idpeople
core__colleges_schoolsrecords.degrees.college_idcolleges_schools
core__departmentsrecords.degrees.department_iddepartments
core__peoplerecords.enrollment_status_history.changed_by_person_idpeople
core__peoplerecords.graduation_applications.reviewed_bypeople
core__countriesrecords.institutions.country_idcountries
core__state_provincesrecords.institutions.state_province_idstate_provinces
core__campusesrecords.major_campus_offerings.campus_idcampuses
core__departmentsrecords.majors.department_iddepartments
core__campusesrecords.minor_campus_offerings.campus_idcampuses
core__departmentsrecords.minors.department_iddepartments
core__peoplerecords.person_superscore_records.person_idpeople
core__peoplerecords.planned_courses.capacity_override_bypeople
core__peoplerecords.planned_courses.impersonator_person_idpeople
core__peoplerecords.planned_courses.planned_by_person_idpeople
core__peoplerecords.planned_courses.prereq_override_bypeople
core__peoplerecords.planned_courses.sequence_override_bypeople
core__campusesrecords.registration_transactions.campus_idcampuses
core__peoplerecords.registration_transactions.initiated_by_person_idpeople
core__colleges_schoolsrecords.requirement_blocks.college_idcolleges_schools
core__departmentsrecords.requirement_blocks.department_iddepartments
core__auth_usersrecords.requirement_waivers.approved_by_idauth_users
core__roomsrecords.section_schedules.room_idrooms
core__peoplerecords.student_academic_status_history.created_bypeople
core__peoplerecords.student_admission_status_history.created_bypeople
core__campusesrecords.student_campus_assignments.campus_idcampuses
core__auth_usersrecords.student_course_substitutions.advisor_user_idauth_users
core__peoplerecords.student_course_substitutions.final_approved_by_person_idpeople
core__auth_usersrecords.student_course_substitutions.registrar_user_idauth_users
core__auth_usersrecords.student_course_substitutions.requested_by_user_idauth_users
core__peoplerecords.student_holds.cleared_by_person_idpeople
core__peoplerecords.student_holds.created_by_person_idpeople
core__peoplerecords.student_holds.impersonator_person_idpeople
core__auth_usersrecords.student_list_members.added_by_idauth_users
core__auth_usersrecords.student_list_shares.shared_by_idauth_users
core__auth_usersrecords.student_list_shares.shared_with_idauth_users
core__auth_usersrecords.student_lists.owner_idauth_users
core__peoplerecords.students.person_idpeople
core__campusesrecords.students.primary_campus_idcampuses
core__departmentsrecords.teachers.department_iddepartments
core__peoplerecords.teachers.person_idpeople
core__campusesrecords.term_campus_offerings.campus_idcampuses
studentfinance__student_paymentsrecords.transaction_payment_history.payment_uuidstudent_payments
core__auth_usersrecords.transaction_payment_history.recorded_byauth_users
core__peoplerecords.transaction_step_history.transitioned_by_person_idpeople
core__peoplerecords.transfer_credits.evaluated_by_person_idpeople
core__peoplerecords.transfer_credits.voided_bypeople
core__org_unitsrecords.workflow_instance_step_assignees.org_unit_idorg_units
core__peoplerecords.workflow_instance_step_assignees.person_idpeople
core__peoplerecords.workflow_instance_steps.assigned_to_person_idpeople
core__peoplerecords.workflow_instance_steps.completed_by_person_idpeople
core__peoplerecords.workflow_instance_steps.entered_by_person_idpeople
core__peoplerecords.workflow_instance_steps.impersonator_person_idpeople
core__peoplerecords.workflow_instances.impersonator_person_idpeople
core__peoplerecords.workflow_instances.initiated_by_person_idpeople
core__peoplerecords.workflow_instances.subject_person_idpeople
core__sys_currenciesstudentfinance.billing_bands.currency_idsys_currencies
core__campusesstudentfinance.billing_method_configs.campus_idcampuses
records__cohortsstudentfinance.billing_method_configs.cohort_idcohorts
records__academic_termsstudentfinance.billing_method_configs.term_idacademic_terms
records__course_sectionsstudentfinance.billing_transaction_items.section_idcourse_sections
records__studentsstudentfinance.colleague_ar_charges.student_idstudents
records__academic_termsstudentfinance.colleague_ar_charges.term_idacademic_terms
core__campusesstudentfinance.course_fees.campus_idcampuses
records__coursesstudentfinance.course_fees.course_idcourses
core__sys_currenciesstudentfinance.course_fees.currency_idsys_currencies
records__academic_termsstudentfinance.course_fees.term_idacademic_terms
core__sys_currenciesstudentfinance.credit_rate_schedules.currency_idsys_currencies
records__academic_termsstudentfinance.fee_schedules.term_idacademic_terms
core__campusesstudentfinance.housing_plans.campus_idcampuses
core__sys_currenciesstudentfinance.housing_plans.currency_idsys_currencies
records__academic_termsstudentfinance.housing_plans.term_idacademic_terms
core__campusesstudentfinance.meal_plans.campus_idcampuses
core__sys_currenciesstudentfinance.meal_plans.currency_idsys_currencies
records__academic_termsstudentfinance.meal_plans.term_idacademic_terms
core__campusesstudentfinance.payment_plan_eligibility.campus_idcampuses
records__majorsstudentfinance.payment_plan_eligibility.major_idmajors
records__student_listsstudentfinance.payment_plan_eligibility.student_list_idstudent_lists
core__sys_currenciesstudentfinance.payment_plan_fees.currency_idsys_currencies
records__academic_termsstudentfinance.payment_plan_terms.term_idacademic_terms
core__campusesstudentfinance.program_fees.campus_idcampuses
core__sys_currenciesstudentfinance.program_fees.currency_idsys_currencies
records__majorsstudentfinance.program_fees.major_idmajors
records__academic_termsstudentfinance.program_fees.term_idacademic_terms
records__academic_termsstudentfinance.refund_schedules.term_idacademic_terms
core__sys_currenciesstudentfinance.section_fee_overrides.currency_idsys_currencies
records__course_sectionsstudentfinance.section_fee_overrides.section_idcourse_sections
records__studentsstudentfinance.student_account_balance.student_idstudents
records__academic_termsstudentfinance.student_account_balance.term_idacademic_terms
core__sys_currenciesstudentfinance.student_billing_transactions.currency_idsys_currencies
records__studentsstudentfinance.student_billing_transactions.student_idstudents
records__academic_termsstudentfinance.student_billing_transactions.term_idacademic_terms
records__studentsstudentfinance.student_charges.student_idstudents
records__academic_termsstudentfinance.student_charges.term_idacademic_terms
records__course_sectionsstudentfinance.student_class_waivers.section_idcourse_sections
records__studentsstudentfinance.student_class_waivers.student_idstudents
records__academic_termsstudentfinance.student_class_waivers.term_idacademic_terms
records__studentsstudentfinance.student_housing_assignments.student_idstudents
records__academic_termsstudentfinance.student_housing_assignments.term_idacademic_terms
records__studentsstudentfinance.student_meal_plan_elections.student_idstudents
records__academic_termsstudentfinance.student_meal_plan_elections.term_idacademic_terms
records__studentsstudentfinance.student_payment_plan_enrollments.student_idstudents
records__studentsstudentfinance.student_payments.student_idstudents
core__campusesstudentfinance.term_fee_categories.campus_idcampuses
records__student_listsstudentfinance.term_fee_categories.student_list_idstudent_lists
core__sys_currenciesstudentfinance.term_fees.currency_idsys_currencies
records__academic_termsstudentfinance.term_fees.term_idacademic_terms
core__sys_currenciesstudentfinance.upfront_payment_discounts.currency_idsys_currencies
records__academic_termsstudentfinance.upfront_payment_discounts.term_idacademic_terms

Lookup Tables ​

116 lookup_* tables are referenced above but not drawn. All of them carry code, display_value, is_active, sort_order and the four audit columns; only four carry description, and only ten carry display_value_es / display_value_fr, so none of those three can be assumed.

  • core (41): lookup_academic_level, lookup_access_token_type, lookup_activity_type, lookup_address_type, lookup_communication_direction, lookup_communication_type, lookup_credential_type, lookup_document_type, lookup_education_level, lookup_email_type, lookup_essay_type, lookup_ethnicity, lookup_family_relationship, lookup_gender, lookup_housing_status, lookup_identifier_type, lookup_language, lookup_marital_status, lookup_name_type, lookup_org_admin_level, lookup_org_unit_type, lookup_organization_type, lookup_phone_type, lookup_photo_origin, lookup_photo_status, lookup_primary_language, lookup_proxy_permission_type, lookup_proxy_relationship_type, lookup_race, lookup_recognition_level, lookup_recommender_relationship, lookup_relationship, lookup_relationship_status, lookup_relationship_type, lookup_religion, lookup_room_feature, lookup_room_type, lookup_system_role, lookup_verification_status, lookup_veteran_status, lookup_visa_type
  • records (69): lookup_academic_status, lookup_admission_status, lookup_adoption_status, lookup_advisor_role, lookup_advisor_type, lookup_automation_rule_type, lookup_block_type, lookup_bulletin_status, lookup_bulletin_type, lookup_class_standing, lookup_class_status, lookup_cohort_type, lookup_course_attribute, lookup_course_level, lookup_course_status, lookup_credit_source, lookup_credit_system, lookup_credit_type, lookup_degree_level, lookup_degree_progress_status, lookup_degree_status, lookup_delivery_mode, lookup_enrollment_intensity, lookup_enrollment_status, lookup_equivalence_type, lookup_graduation_status, lookup_graduation_type, lookup_honors_type, lookup_initiator_role, lookup_institution_type, lookup_instruction_mode, lookup_instructional_method, lookup_instructor_role, lookup_ipeds_residency, lookup_ipeds_student_type, lookup_material_format, lookup_material_requirement, lookup_material_type, lookup_min_grade, lookup_non_course_req_type, lookup_oer_license, lookup_org_membership_role, lookup_plan_assignment_status, lookup_plan_status, lookup_planner_role, lookup_program_status, lookup_requirement_type, lookup_requisite_type, lookup_schedule_type, lookup_section_status, lookup_student_status, lookup_student_type, lookup_substitution_status, lookup_teacher_status, lookup_teaching_frequency, lookup_term_type, lookup_test_type, lookup_transaction_action, lookup_transaction_item_status, lookup_transaction_status, lookup_transaction_type, lookup_transfer_credit_status, lookup_validation_status, lookup_waitlist_status, lookup_waiver_type, lookup_workflow_condition_type, lookup_workflow_status, lookup_workflow_step_status, lookup_workflow_step_type
  • studentfinance (6): lookup_billing_transaction_status, lookup_charge_status, lookup_payment_method, lookup_payment_plan_status, lookup_payment_schedule_status, lookup_payment_status

Two of them also carry behavioral columns and are owned by their domain rather than the generic lookup layer: core.lookup_identifier_type and records.lookup_cohort_type. The generic endpoints read them but refuse every write with a 409 naming the owning endpoint.

See the Lookup Codes Reference for the type codes and their values.


Regenerating this diagram ​

The generator reads the live schema directly, so re-running it after a migration produces a revision that matches the database by construction. It refuses to run if any table is in no section, in two sections, or in a section but not in the database — so a new migration forces a placement decision instead of quietly dropping a table out of the diagram.

bash
python docs/generate_erd.py          # rewrite this file from the live schema
python docs/generate_erd.py --check  # exit 3 if it would change (for CI)
python docs/build_erd_page.py        # build docs/public/er-diagram.html

Read it as a single page at er-diagram.html, which renders each section independently so a malformed diagram cannot blank out its neighbours.

docs/er-split/ is the revision 7 render and is deliberately left frozen: its 18 pages inline Mermaid at roughly 3.6 MB each, and the single page above supersedes them.

Student Information System Documentation