Skip to content

Lookup Tables Reference ​

Complete reference for all lookup types in the SDASIS Student Information System.

For non-lookup database tables, see Database Table Reference.

Overview ​

Lookup values are stored in individual lookup_* tables (e.g., lookup_program_status, lookup_course_status). Each table has the following columns:

ColumnTypeDescription
{name}_idintegerPrimary key, named after the table minus its lookup_ prefix — lookup_course_status.course_status_id. Never a bare id (migration 083)
codevarcharShort code, unique within the table
display_valuevarcharHuman-readable label
is_activebooleanWhether the value is available for selection
sort_orderintegerDisplay ordering
created_at, created_by, updated_at, updated_byAudit columns

Those eight are present on all 133 lookup tables. The rest are not universal, and assuming otherwise is the most common way to break a lookup query:

ColumnActually present in
description4 tables
display_value_es10 tables
display_value_fr10 tables
is_sensitive, uses_dates, allow_multiple, country_mode, state_mode, input_mask, validation_regexlookup_identifier_type only
uses_dates, allow_multiple, requires_majorlookup_cohort_type only

So a query joining display_value_es across lookup types will fail on almost all of them.

Extended lookups ​

Two tables carry behavioral columns rather than just labels — flags that drive validation and what the UI renders, not merely how a value is displayed:

TypeTableWhat the extra columns decide
IDENTIFIER_TYPEcore.lookup_identifier_typeWhether an identifier is encrypted at rest, whether it expires, whether an issuing country and state apply, whether a person may hold more than one, and what input format is valid (migrations 120a, 182, 194)
COHORT_TYPErecords.lookup_cohort_typeWhether a cohort carries start/end dates, whether a student may hold more than one open membership at a time, whether a major is required (migration 181), and whether programs and an advisor can be bulk-assigned to its members (allows_bulk_assign, migration 277)

Both are read and written by their owning domain, not through the generic lookup layer:

  • people.IdentifierType — GET/POST /people/identifier-types, PATCH|DELETE /people/identifier-types/{id}
  • roles.CohortType — GET/POST /roles/cohort-types, PATCH|DELETE /roles/cohort-types/{id}

The generic layer still reads both types their four standard fields, so an existing dropdown keeps working, and refuses every write to them: POST/PATCH/DELETE /core/lookup-values return 409 naming the owning endpoint (core.refuseExtendedWrite). It cannot serve the extra columns: lookupEntryCols/lookupEntryTargets (core/repository.go) build a fixed select list scanned positionally, and CreateEntry/ UpdateEntry have no write path for extra columns at all. That is also why lookup_visa_type.metadata has sat unread since it was added: a behavioral column reachable only through the generic layer is a column nothing can use. Migration 281 seeded student_status and sevis flags into it for every visa type, and still nothing reads them -- the International tab decides whether to show its SEVIS block from the HOME_COUNTRY setting instead. lookup_cohort_group.is_billing_relevant was the other example, and it ended the way that argument predicts -- migration 185 superseded the table with records.cohorts and 186 dropped it, flag and all. The six codes it marked (AHMBA, SON24, SON25, UKIH23, UKIH24, UKIH25) are now discoverable from billing_method_configs.cohort_id instead of from a boolean nobody maintained.

LookupTypeMeta.ExtendedAdminRoute marks these types, and the admin lookup screen lists their values read-only behind a button to the screen that owns them. ExtendedAPIPath is the endpoint named when a generic write is refused — a separate field because the caller being turned away is an API client, and a Vue route would be no use to it.

Why the refusal, and not just the UI change. The link used to sit beside a fully-enabled Edit button reading "cannot be edited here", and an administrator hit the pencil, got the four-field form, and concluded the behavioural settings did not exist. Worse, the generic writers are not merely incomplete for these two types, they are wrong:

  • CreateEntry names four columns and leaves the rest at their defaults. allow_multiple defaults TRUE, so an identifier type created generically silently permits two per person — the exact condition migration 195's unique index exists to prevent.
  • UpdateEntry writes code. Migrations and the daily ODS importer match it literally; the owning screens disable the field, but that only binds a browser.
  • DeleteEntry is a bare DELETE. core.lookup_identifier_type has two inbound FKs (person_identifiers, identifier_access_log), both NO ACTION, so it either raises a constraint error or removes a type that should have been deactivated.

A rule enforced only by a screen binds only that screen. Create and delete for these types therefore exist on the owning endpoint and nowhere else, and each owning service applies the rules the generic one cannot: a code pattern, a duplicate-code check, an RE2 compile of validation_regex, and a delete refused while either FK is populated — the audit trail included, because a reveal record has to outlive its subject.

That link was, for a day, the only way in. Both screens shipped complete -- views, routes, locale strings, and entries in the two frontend configs that bucket the Admin menu -- but neither had a row in core.permission_nodes, and the sidebar is built entirely from that table (GET /authorization/user-menu -> filterMenuTree, consumed by useMenuModel.ts; AppLayout.vue carries no static entries). No node, no menu item, however finished the screen. Migration 193 created ADMIN.IDENTIFIER_TYPES and ADMIN.COHORT_TYPES and moved the write routes onto them, so the node that puts a screen in the menu is the node that authorizes its Save button. A new admin screen needs its permission node in the same change as its route -- the name must match the frontend configs exactly, because they join on the English name rather than the code.

Alias the key when scanning

The shared core.LookupEntry struct expects a column called id, so single-table SQL should alias it: SELECT course_status_id AS id, code, display_value .... Use core.LookupTableName(typeCode) and core.LookupIDColumn(typeCode) rather than hard-coding either name.

The registry in core/lookup_registry.go maps type codes to table names: 130 registered types against 130 lookup_* tables in the database, spread across the core (41), records (70), admissions (12), studentfinance (6) and financialaid (1) schemas. The Go code names them unqualified and relies on search_path.

The two counts are meant to match exactly, and TestLookupColumnsSelectableForEveryType fails if a registered type has no table. They drifted apart historically because a table could be dropped without deregistering its type, or registered without ever being created; migration 262 closed the last gap by dropping lookup_section_enrollment_status, which shadowed lookup_enrollment_status with the same ids and opposite meanings.

The registry and the schema can drift for a deploy, so the bulk endpoints (GET /core/lookups, GET /core/lookup-types) skip a registered type whose table is missing and log a warning, rather than failing the whole response. They used to fail: migration 177 dropped lookup_hold_type and lookup_hold_reason while the registry still listed them, and both endpoints returned 500 for every signed-in user until the entries were removed.

How to Find Lookup Codes ​

  1. Navigate to Admin > Lookup Tables
  2. Select a lookup type
  3. View available codes and descriptions

API Access ​

GET /api/v1/core/lookups/by-type/{typeCode}

Example: GET /api/v1/core/lookups/by-type/PROGRAM_STATUS


Person & Demographics ​

Identity & Contact ​

Type CodeDescription
NAME_TYPEName variant type: LEGAL_PRIMARY, LEGAL_SECONDARY, PREFERRED, MAIDEN, FORMER
ADDRESS_TYPEAddress category (Permanent, Mailing, Campus)
PHONE_TYPEPhone number type (Mobile, Home, Work)
EMAIL_TYPEEmail type (Institutional, Personal, Work)
IDENTIFIER_TYPEGovernment ID type (SSN, Passport, Driver's License; I-94, EAD and I-20 / DS-2019 since migration 281)
DOCUMENT_TYPEDocument type for name display configuration

Demographics ​

Type CodeDescription
GENDERGender identity options
ETHNICITYHispanic/Latino ethnicity classification (IPEDS)
RACERace categories (IPEDS multi-select)
RELIGIONReligious affiliation
MARITAL_STATUSMarital status
VETERAN_STATUSMilitary/veteran status
PRIMARY_LANGUAGEPrimary spoken language
HOUSING_STATUSStudent housing classification
CLASS_STANDINGAcademic class standing (Freshman, Sophomore, Junior, Senior)
VISA_TYPEImmigration status type: STUDENT, RESIDENT, H1B (migration 273), F1, J1, M1, DEPENDENT, REFUGEE, OTHER (migration 281). Codes are identity

Relationships & Activities ​

Type CodeDescription
FAMILY_RELATIONSHIPFamily member relationship (Parent, Sibling, Spouse)
RECOMMENDER_RELATIONSHIPRecommender's relationship to applicant (Professor, Employer)
RELATIONSHIPGeneric relationship type
EDUCATION_LEVELHighest education level attained (for family members)
RECOGNITION_LEVELHonor/award recognition level (Local, Regional, National)
ESSAY_TYPEApplication essay category
ACTIVITY_TYPEExtracurricular activity type (Sport, Club, Volunteer)
PHOTO_STATUSPhoto approval workflow status

Academic Structure ​

Type CodeDescription
TERM_TYPEAcademic term category (Fall, Spring, Summer, Winter, J-Term)
DEGREE_LEVELDegree classification (Certificate, Associate, Bachelor, Master, Doctoral)
COURSE_LEVELCourse level classification (100-level, 200-level, Upper Division)
COURSE_ATTRIBUTECourse attribute flags (Writing-Intensive, Lab, Capstone)
REQUISITE_TYPECourse requisite type (Prerequisite, Corequisite, Antirequisite)
EQUIVALENCE_TYPECourse equivalency relationship type (Direct, Substitute)
MIN_GRADEMinimum grade thresholds for requirements (C, C+, B, etc.)
BLOCK_TYPERequirement block category (General Ed, Major, Minor, Elective, Core)
REQUIREMENT_TYPEIndividual requirement type (Course, Non-Course, Pattern)
NON_COURSE_REQ_TYPENon-course requirement type (Service Hours, Portfolio, Exam)
TEACHING_FREQUENCYHow often a course is typically taught (Every Term, Annually, Alternate Years)
BULLETIN_TYPEBulletin/catalog type (Undergraduate, Graduate, Professional)
CREDIT_SYSTEMCredit system type (Quarter, Semester, Trimester, Clock Hours)

Instruction & Scheduling ​

Type CodeDescription
INSTRUCTION_MODESection modality — where the student is (In Person, Online, Hybrid, Remote). Derived by the importer, not declared
INSTRUCTIONAL_METHODSection pedagogy — what kind of teaching it is (Lecture, Laboratory, Seminar, …, 26 values). Declared by Colleague and stored verbatim
DELIVERY_MODEAdditional delivery mode classification
SCHEDULE_TYPESchedule source (Template-Based, Custom)

Status Types ​

Program & Catalog Statuses ​

Type CodeDescription
PROGRAM_STATUSAcademic program lifecycle (Active, Inactive, Suspended, Discontinued)
COURSE_STATUSCourse catalog status (Active, Inactive, Pending)
SECTION_STATUSCourse section status (Open, Closed, Cancelled)
CLASS_STATUSClass status
BULLETIN_STATUSBulletin lifecycle (Draft, Published, Archived)
DEGREE_STATUSDegree program status
SUBSTITUTION_STATUSCourse substitution approval status

Student & Role Statuses ​

Type CodeDescription
STUDENT_STATUSStudent enrollment status (Active, Graduated, Withdrawn, Leave, Dismissed)
ACADEMIC_STATUSAcademic standing (Good Standing, Probation, Suspension)
ADMISSION_STATUSAdmission decision status (Admitted, Denied, Conditional, Waitlisted)
TEACHER_STATUSTeacher active/inactive status
APPLICANT_STATUSApplicant processing status

Enrollment & Registration Statuses ​

Type CodeDescription
ENROLLMENT_STATUSTerm enrollment status (Registered, Waitlisted, Dropped, Withdrawn)
WAITLIST_STATUSWaitlist entry status
PLAN_STATUSCourse planning status (Planned, Confirmed, Registered)

Degree Progress & Graduation Statuses ​

Type CodeDescription
DEGREE_PROGRESS_STATUSDegree audit progress status
GRADUATION_STATUSGraduation application status
GRADUATION_TYPEType of graduation (Regular, Summer Completion, Early)
TRANSFER_CREDIT_STATUSTransfer credit evaluation status: PENDING, APPROVED, REJECTED, and PRE_APPROVED (migration 295), a course approved before it is taken, which counts nowhere until Records posts the grade

Billing & Payment Statuses ​

Type CodeDescription
CHARGE_STATUSBilling charge status
PAYMENT_STATUSPayment transaction status
BILLING_TRANSACTION_STATUSBilling transaction lifecycle status
PAYMENT_PLAN_STATUSPayment plan enrollment status
PAYMENT_SCHEDULE_STATUSIndividual installment status

Admissions Statuses ​

Type CodeDescription
CHECKLIST_STATUSApplication checklist item status (Pending, Received, Waived)
VERIFICATION_STATUSDocument verification status
RECOMMENDATION_STATUSRecommendation letter status

Workflow Statuses ​

Type CodeDescription
WORKFLOW_STATUSWorkflow definition lifecycle (Draft, Active, Archived)
WORKFLOW_STEP_STATUSStep completion status
FORM_TEMPLATE_STATUSForm template lifecycle (Draft, Published, Archived)

Roles & Authorization ​

Type CodeDescription
STUDENT_TYPEStudent classification (Traditional, Non-Traditional, Transfer)
ADVISOR_TYPEAdvisor classification (Faculty, Staff, Peer)
ADVISOR_ROLEAdvisor assignment role (Primary, Secondary, Department)
INSTRUCTOR_ROLEInstructor role in a section (Primary, TA, Guest)
CREDENTIAL_TYPETeacher credential type
ORG_MEMBERSHIP_ROLEOrganization membership role
SYSTEM_ROLESystem-level role classification
IPEDS_RESIDENCYIPEDS residency classification (In-State, Out-of-State, International)
IPEDS_STUDENT_TYPEIPEDS student type (First-Time, Transfer, Continuing)

Registration Transactions ​

Type CodeDescription
TRANSACTION_TYPERegistration transaction type (Add, Drop, Swap)
TRANSACTION_STATUSTransaction workflow status
TRANSACTION_ACTIONAction type for enrollment items (Add, Drop)
TRANSACTION_ITEM_STATUSIndividual item status within a transaction
VALIDATION_STATUSValidation check status
INITIATOR_ROLEWho initiated the transaction (Student, Advisor, Registrar)
PLANNER_ROLEWho planned the courses
ENROLLMENT_INTENSITYEnrollment load (Full-Time, Part-Time, Half-Time)
CREDIT_SOURCESource of earned credit
CREDIT_TYPETransfer credit type classification

Admissions ​

Type CodeDescription
ADMISSION_DECISIONFinal admission decision (Accept, Deny, Defer, Waitlist)
APPLICATION_TYPEApplication category (Freshman, Transfer, Graduate, Readmit)
CHECKLIST_TYPEChecklist item category
REVIEW_RECOMMENDATIONReviewer's recommendation (Admit, Deny, Hold)
TEST_TYPEStandardized test type (SAT, ACT, GRE, TOEFL)
DOCUMENT_TYPE_APPApplication document type (Transcript, Essay, ID)

Billing & Financial ​

Type CodeDescription
PAYMENT_METHODPayment method (Credit Card, Check, Wire, Financial Aid)
AWARD_TYPEFinancial aid award type

Degree Audit & Graduation ​

Type CodeDescription
WAIVER_TYPERequirement waiver type (Course Waiver, Credit Waiver, Substitution)
HONORS_TYPELatin graduation honor, one per degree (Cum Laude, Magna Cum Laude, Summa Cum Laude); imported from Colleague
GRADUATION_HONORAdditional graduation honors entered by the registrar, several per degree (language, music, leadership)

Workflow & Automation ​

Type CodeDescription
WORKFLOW_STEP_TYPEWorkflow step category (Search, Cart, Payment, Confirm)
WORKFLOW_CONDITION_TYPETransition condition type
AUTOMATION_RULE_TYPEAutomation rule category (Hold Check, Prerequisite, Balance)

Organization & Facilities ​

Type CodeDescription
ROOM_TYPERoom classification (Classroom, Lab, Auditorium, Office)
ROOM_FEATURERoom features/equipment (Projector, Whiteboard, AV System)
ORGANIZATION_TYPEOrganization classification

Communication ​

Type CodeDescription
COMMUNICATION_TYPECommunication channel (Email, Phone, Letter, In-Person)
COMMUNICATION_DIRECTIONCommunication direction (Inbound, Outbound)

Proxy Access ​

Type CodeDescription
PROXY_RELATIONSHIP_TYPEProxy-to-student relationship (Parent, Guardian, Spouse)

Course Materials ​

Type CodeDescription
MATERIAL_TYPEMaterial classification (Textbook, Coursepack, Software, Equipment)
MATERIAL_FORMATMaterial format (Print, Digital, eBook, Loose-Leaf)
MATERIAL_REQUIREMENTMaterial requirement level (Required, Recommended, Optional)
ADOPTION_STATUSFaculty adoption status for materials
OER_LICENSEOpen Educational Resource license type (CC-BY, CC-BY-SA, etc.)

Forms & Templates ​

Type CodeDescription
FORM_TEMPLATE_STATUSForm template lifecycle (Draft, Published, Archived)
FORM_FIELD_TYPEForm field input type (Text, Select, Checkbox, Date)
FORM_REQUIREMENT_TYPEForm field requirement level

LMS Integration ​

Type CodeDescription
LMS_PLATFORM_TYPELMS platform family (Canvas, Moodle, Blackboard, etc.)
LMS_URL_TYPELMS platform URL purpose (Base, API, OAuth, LTI)
LMS_SYNC_TYPELMS sync operation type (Enrollment, Grade, Course, Roster)
LMS_SYNC_STATUSLMS sync operation status (Pending, Success, Failed)

Authentication & System ​

Type CodeDescription
ACCESS_TOKEN_TYPEAPI token type (Personal, Application, Integration)
LANGUAGELanguage codes for translations

Using Lookup Values in Code ​

Go Backend ​

go
// The lookup registry maps type codes to table names
tableName := core.LookupTableName("COURSE_STATUS") // -> "lookup_course_status"

// Check if a type code is valid
if core.IsValidLookupType("COURSE_STATUS") {
    // type is registered
}

// Get all known type codes (sorted)
allTypes := core.KnownLookupTypes()

// Get metadata for a type
meta, ok := core.GetLookupTypeMeta("COURSE_STATUS")
// meta.Category = "Program & Catalog Status"
// meta.Description = "Course catalog status (Active, Inactive, Pending)"

Frontend ​

typescript
// Using the lookups store (cached)
import { useLookupsStore } from '@/stores/lookups'
const lookups = useLookupsStore()
const statuses = await lookups.getByType('COURSE_STATUS')

// Or via API directly
const response = await api.get('/core/lookups/by-type/COURSE_STATUS')

Filtering by Lookup Value ​

typescript
// Filter entities by status ID
const params = { status_id: activeStatusId }
const response = await courseApi.getAll(params)

Additional lookup types ​

These exist in the database but were missing from the sections above.

Type CodeDescriptionCodes
ACADEMIC_LEVELLevel a course attempt counts at. GPA and credits are computed per level, so a student can hold a separate undergraduate and graduate GPA in the same termUG, GR, HS, CE, NC
ORG_UNIT_TYPETier in the institutional hierarchyINSTITUTION, DIVISION, COLLEGE, OFFICE, DEPARTMENT
ORG_ADMIN_LEVELSeniority of a unit administrator appointmentPRESIDENT, VP, DEAN, ASSOC_DEAN, CHAIR, DIRECTOR
RELATIONSHIP_TYPEFamily relationship. Codes are terse: P parent, C child, S spouse, SB sibling, GP grandparent, GC grandchildP, C, S, SB, GP, GC
PROXY_PERMISSION_TYPEWhat a proxy may see — granted individually, never as a bundleVIEW_GRADES, VIEW_SCHEDULE, VIEW_TRANSCRIPT, VIEW_GPA, VIEW_HOLDS, VIEW_ENROLLMENTS
PLAN_ASSIGNMENT_STATUSState of a housing or meal plan assignmentREQUESTED, ACTIVE, CANCELLED, COMPLETED, NO_SHOW
COHORT_GROUPNamed intake groupsUKIH23, SON24, AHMBA, …
ACA_CAMPUSAdventist Colleges Abroad partner campusesUAP, BOGENHOFEN, UNASP, SALEVE, …

ACADEMIC_LEVEL is the one worth reading twice. It was added by migration 097 so that concurrent undergraduate and graduate enrolment in the same term are distinct rows, which widened the (student_id, term_id) uniqueness constraint to include the level. Code that assumes one GPA per student per term is wrong.

Student Information System Documentation