> For the complete documentation index, see [llms.txt](https://docs.mymedtrics.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.mymedtrics.com/get-started/classic-data-mapping/curriculum.md).

# Curriculum

Preclinical / Sessions / Curriculum, Objectives / Outcomes: 20 Medtrics Classic tables and their confirmed Oracle fields.

Preclinical / Sessions / Curriculum, Objectives / Outcomes — 20 Medtrics Classic tables with 112 confirmed fields (8% of the mapping): Unchanged 33 · Renamed 40 · ID changed 39. Each table below lists where its confirmed fields went, what to change in a query, and a starter query. Back to the [map of the data](/get-started/classic-data-mapping.md).

![Curriculum: 20 Medtrics Classic tables; the number is confirmed fields, the bar is the outcome mix](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FzvawpSJsYFuYKwyMsqQB%2Fmap-curric.png?alt=media)

### Preclinical / Sessions / Curriculum

15 tables, 76 confirmed fields: Unchanged 20 · Renamed 26 · ID changed 30.

#### curriculum\_curriculumcourcerotation

**curriculum\_curriculumcourcerotation** → `curriculum_courses` · *renamed* · 9 confirmed fields (Unchanged 6 · Renamed 2 · ID changed 1)

Curriculum course definitions.

> Same concept, cleaner name and spelling. The `curriculum_type` free text became a constrained `course_type` of 'course' or 'rotation', and required/elective moved to its own `is_required` flag.

![Where the 9 confirmed fields of curriculum\_curriculumcourcerotation went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FuwaTjLpv9HYps0xrm2BO%2Fflow-curriculum-curriculumcourcerotation.png?alt=media)

| Medtrics Classic field    | Oracle                 | Outcome    | Note                         |
| ------------------------- | ---------------------- | ---------- | ---------------------------- |
| `id` integer              | `id` UUID              | ID changed | Integer link → UUID          |
| `curriculum_type` varchar | `course_type` TEXT     | Renamed    |                              |
| `mandatory` boolean       | `is_required` BOOLEAN  | Renamed    |                              |
| `credits` varchar         | `credits` NUMERIC(6,2) | Unchanged  | text → number (Type changed) |
| `code` text               | `code` TEXT            | Unchanged  |                              |
| `name` text               | `name` TEXT            | Unchanged  |                              |
| `start_date` date         | `start_date` DATE      | Unchanged  |                              |
| `end_date` date           | `end_date` DATE        | Unchanged  |                              |
| `description` text        | `description` TEXT     | Unchanged  |                              |

* Swap the 2 renamed fields and point `FROM` at `curriculum_courses`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_courses` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_curriculumcourcerotation.
SELECT
  t.id,          -- was id
  t.course_type, -- was curriculum_type
  t.is_required, -- was mandatory
  t.credits,     -- was credits
  t.code,        -- was code
  t.name,        -- was name
  t.start_date,  -- was start_date
  t.end_date,    -- was end_date
  t.description  -- was description
FROM curriculum_courses t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_curriculumcourcerotation\_groups

**curriculum\_curriculumcourcerotation\_groups** → `curriculum_course_groups` · 2 confirmed fields (ID changed 2)

Course to cohort group links.

![Where the 2 confirmed fields of curriculum\_curriculumcourcerotation\_groups went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FNypC94yVqBNXmrdDpAUm%2Fflow-curriculum-curriculumcourcerotation-groups.png?alt=media)

| Medtrics Classic field                | Oracle           | Outcome    | Note                                                |
| ------------------------------------- | ---------------- | ---------- | --------------------------------------------------- |
| `id` integer                          | `id` UUID        | ID changed | Integer link → UUID                                 |
| `curriculumcourcerotation_id` integer | `course_id` UUID | ID changed | Integer link → UUID pointing to curriculum\_courses |

* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_course_groups` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_curriculumcourcerotation_groups.
SELECT
  t.id,        -- was id
  t.course_id  -- was curriculumcourcerotation_id
FROM curriculum_course_groups t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_keyword

**curriculum\_keyword** → `curriculum_keywords` · *split* · 7 confirmed fields (Unchanged 3 · Renamed 1 · ID changed 3)

Keyword definitions per institution/program.

> Medtrics Classic keywords were one global list. Oracle scopes them per institution or program, versions them into named sets, adds a closure table for fast ancestor lookups, and separates AI suggestions from approved links.

![Where the 7 confirmed fields of curriculum\_keyword went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FtgrU76oLY3UqKd2jxJKe%2Fflow-curriculum-keyword.png?alt=media)

| Medtrics Classic field | Oracle              | Outcome    | Note                                                            |
| ---------------------- | ------------------- | ---------- | --------------------------------------------------------------- |
| `id` integer           | `id` UUID           | ID changed | Integer link → UUID                                             |
| `keyword_id` varchar   | `code` TEXT         | ID changed | Integer link → UUID                                             |
| `category_id` integer  | `category_id` UUID  | ID changed | Integer link → UUID pointing to curriculum\_keyword\_categories |
| `active` boolean       | `is_active` BOOLEAN | Renamed    |                                                                 |
| `name` varchar         | `name` TEXT         | Unchanged  |                                                                 |
| `description` text     | `description` TEXT  | Unchanged  |                                                                 |
| `synonyms` ARRAY       | `synonyms` TEXT\[]  | Unchanged  |                                                                 |

* Swap the 1 renamed field and point `FROM` at `curriculum_keywords`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_keywords` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_keyword.
SELECT
  t.id,          -- was id
  t.name,        -- was name
  t.code,        -- was keyword_id
  t.description, -- was description
  t.synonyms,    -- was synonyms
  t.is_active,   -- was active
  t.category_id  -- was category_id
FROM curriculum_keywords t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_keywordcategory

**curriculum\_keywordcategory** → `curriculum_keyword_categories` · *split* · 2 confirmed fields (Unchanged 1 · ID changed 1)

Category bands within a curriculum keyword taxonomy.

> Medtrics Classic keywords were one global list. Oracle scopes them per institution or program, versions them into named sets, adds a closure table for fast ancestor lookups, and separates AI suggestions from approved links.

![Where the 2 confirmed fields of curriculum\_keywordcategory went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F7OVo629uz9OZNXNoT54i%2Fflow-curriculum-keywordcategory.png?alt=media)

| Medtrics Classic field | Oracle      | Outcome    | Note                |
| ---------------------- | ----------- | ---------- | ------------------- |
| `id` integer           | `id` UUID   | ID changed | Integer link → UUID |
| `name` varchar         | `name` TEXT | Unchanged  |                     |

* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_keyword_categories` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_keywordcategory.
SELECT
  t.id,   -- was id
  t.name  -- was name
FROM curriculum_keyword_categories t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_sessionattachment

**curriculum\_sessionattachment** → `curriculum_resources` · *split* · 5 confirmed fields (Renamed 4 · ID changed 1)

> Medtrics Classic attachments hung off a learning method; Oracle attaches files directly to the session and adds a richer `curriculum_resources` table for links and typed materials.

![Where the 5 confirmed fields of curriculum\_sessionattachment went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FBBBI3efJnPYFOR5zkLMQ%2Fflow-curriculum-sessionattachment.png?alt=media)

| Medtrics Classic field    | Oracle                              | Outcome    | Note                                                        |
| ------------------------- | ----------------------------------- | ---------- | ----------------------------------------------------------- |
| `id` integer              | `id` UUID                           | ID changed | Integer link → UUID                                         |
| `updated_date` date       | `updated_at` TIMESTAMPTZ            | Renamed    | date → timestamp (Type changed)                             |
| `file_attachment` varchar | `file_path` TEXT                    | Renamed    | (Split)                                                     |
| `file_attachment` varchar | `resource_type` enum:resource\_type | Renamed    | Now a fixed value list (resource\_type) (Split, Value list) |
| `file_attachment` varchar | `url` TEXT                          | Renamed    | (Split)                                                     |

* Swap the 4 renamed fields and point `FROM` at `curriculum_resources`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_resources` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessionattachment.
SELECT
  t.id,            -- was id
  t.updated_at,    -- was updated_date
  t.file_path,     -- was file_attachment
  t.resource_type, -- was file_attachment
  t.url            -- was file_attachment
FROM curriculum_resources t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_sessioncourcerotation

**curriculum\_sessioncourcerotation** → `curriculum_sessions` · *renamed* · 7 confirmed fields (Unchanged 2 · Renamed 2 · ID changed 3)

Individual sessions within courses.

> Session template survives intact; the event-type and location links moved to `curriculum_session_types` and to the schedule rows.

![Where the 7 confirmed fields of curriculum\_sessioncourcerotation went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F4wk9nmTRpZ943QK7UQzn%2Fflow-curriculum-sessioncourcerotation.png?alt=media)

| Medtrics Classic field       | Oracle                     | Outcome    | Note                                                       |
| ---------------------------- | -------------------------- | ---------- | ---------------------------------------------------------- |
| `id` integer                 | `id` UUID                  | ID changed | Integer link → UUID                                        |
| `course_rotation_id` integer | `course_id` UUID           | ID changed | Integer link → UUID pointing to curriculum\_courses        |
| `event_type_id` integer      | `session_type_id` UUID     | ID changed | Integer link → UUID pointing to curriculum\_session\_types |
| `title` varchar              | `name` TEXT                | Renamed    |                                                            |
| `duration` integer           | `duration_minutes` INTEGER | Renamed    |                                                            |
| `code` varchar               | `code` TEXT                | Unchanged  |                                                            |
| `description` text           | `description` TEXT         | Unchanged  |                                                            |

* Swap the 2 renamed fields and point `FROM` at `curriculum_sessions`.
* Re-key 3 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_sessions` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessioncourcerotation.
SELECT
  t.id,               -- was id
  t.code,             -- was code
  t.name,             -- was title
  t.duration_minutes, -- was duration
  t.description,      -- was description
  t.course_id,        -- was course_rotation_id
  t.session_type_id   -- was event_type_id
FROM curriculum_sessions t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_sessioncourcerotation\_session\_theme

**curriculum\_sessioncourcerotation\_session\_theme** → `curriculum_session_themes` · 3 confirmed fields (ID changed 3)

Session to theme mappings.

![Where the 3 confirmed fields of curriculum\_sessioncourcerotation\_session\_theme went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F7aMrR24fKUbgJWHpzGGQ%2Fflow-curriculum-sessioncourcerotation-session-theme.png?alt=media)

| Medtrics Classic field             | Oracle            | Outcome    | Note                                                                                                                |
| ---------------------------------- | ----------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer                       | `id` UUID         | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `sessioncourcerotation_id` integer | `session_id` UUID | ID changed | Integer link → UUID pointing to curriculum\_sessions                                                                |
| `sessionthemes_id` integer         | `theme_id` UUID   | ID changed | Integer link → UUID pointing to curriculum\_themes                                                                  |

* Re-key 3 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessioncourcerotation_session_theme.
SELECT
  t.id,         -- was id
  t.session_id, -- was sessioncourcerotation_id
  t.theme_id    -- was sessionthemes_id
FROM curriculum_session_themes t;
```

#### curriculum\_sessionkeyword

**curriculum\_sessionkeyword** → `curriculum_session_keywords` · *split* · 3 confirmed fields (ID changed 3)

Operational source-of-truth junction for session→keyword links. Manual add/remove writes here directly (source='manual'). AI approval RPC (approve\_curriculum\_keyword\_mapping) writes here with the mapping's source on appr.

> Medtrics Classic keywords were one global list. Oracle scopes them per institution or program, versions them into named sets, adds a closure table for fast ancestor lookups, and separates AI suggestions from approved links.

![Where the 3 confirmed fields of curriculum\_sessionkeyword went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F0qotg2aRFEGX8RaX4yoy%2Fflow-curriculum-sessionkeyword.png?alt=media)

| Medtrics Classic field               | Oracle            | Outcome    | Note                                                                                                                |
| ------------------------------------ | ----------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer                         | `id` UUID         | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `keyword_id` integer                 | `keyword_id` UUID | ID changed | Integer link → UUID pointing to curriculum\_keywords                                                                |
| `session_course_rotation_id` integer | `session_id` UUID | ID changed | Integer link → UUID pointing to curriculum\_sessions                                                                |

* Re-key 3 ID fields. Join people on `email`, not on old IDs.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessionkeyword.
SELECT
  t.id,         -- was id
  t.keyword_id, -- was keyword_id
  t.session_id  -- was session_course_rotation_id
FROM curriculum_session_keywords t;
```

#### curriculum\_sessionlearningmethod

**curriculum\_sessionlearningmethod** → `curriculum_resources`, `curriculum_session_assessments`, `curriculum_session_methods` · *split* · 13 confirmed fields (Unchanged 1 · Renamed 8 · ID changed 4)

Session to assessment method mappings. Split table: each field names its new table.

> Medtrics Classic mixed the teaching method and the assessment type on one row (`SessionLearningMethod.assessment_type`). Oracle separated instructional method from assessment method and added an AAMC facet layer. Medtrics Classic's per-method title, description and `available_for_students` flag have no direct Oracle counterpart.

![Where the 13 confirmed fields of curriculum\_sessionlearningmethod went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FN265afgSFJFhHOnwwcfL%2Fflow-curriculum-sessionlearningmethod.png?alt=media)

| Medtrics Classic field               | Oracle                                             | Outcome    | Note                                                                        |
| ------------------------------------ | -------------------------------------------------- | ---------- | --------------------------------------------------------------------------- |
| `method_type_id` integer             | curriculum\_session\_methods.`method_id` UUID      | ID changed | Integer link → UUID pointing to curriculum\_instructional\_methods (Merged) |
| `session_course_rotation_id` integer | curriculum\_resources.`session_id` UUID            | ID changed | Integer link → UUID pointing to curriculum\_sessions (Split)                |
| `session_course_rotation_id` integer | curriculum\_session\_assessments.`session_id` UUID | ID changed | Integer link → UUID pointing to curriculum\_sessions (Split)                |
| `session_course_rotation_id` integer | curriculum\_session\_methods.`session_id` UUID     | ID changed | Integer link → UUID pointing to curriculum\_sessions (Split, Merged)        |
| `title` varchar                      | curriculum\_resources.`name` TEXT                  | Renamed    | (Split)                                                                     |
| `title` varchar                      | curriculum\_session\_assessments.`notes` TEXT      | Renamed    | (Split, Merged)                                                             |
| `title` varchar                      | curriculum\_session\_methods.`notes` TEXT          | Renamed    | (Split, Merged)                                                             |
| `description` text                   | curriculum\_session\_assessments.`notes` TEXT      | Renamed    | (Split, Merged)                                                             |
| `description` text                   | curriculum\_session\_methods.`notes` TEXT          | Renamed    | (Split, Merged)                                                             |
| `duration` integer                   | curriculum\_session\_methods.`notes` TEXT          | Renamed    | int → text (Merged, Type changed)                                           |
| `available_for_students` boolean     | curriculum\_session\_assessments.`notes` TEXT      | Renamed    | bool → text (Split, Merged, Type changed)                                   |
| `available_for_students` boolean     | curriculum\_session\_methods.`notes` TEXT          | Renamed    | bool → text (Split, Merged, Type changed)                                   |
| `description` text                   | curriculum\_resources.`description` TEXT           | Unchanged  | (Split)                                                                     |

* Swap the 8 renamed fields and point `FROM` at `curriculum_resources` (and the other new tables).
* Re-key 4 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_resources` keeps deleted rows.

#### curriculum\_sessionlearningmethodtype

**curriculum\_sessionlearningmethodtype** → `curriculum_instructional_methods` · *split* · 4 confirmed fields (Unchanged 1 · Renamed 2 · ID changed 1)

Instructional methods (e.g., Problem-Based Learning, Team-Based Learning, Simulation); shared institution-wide when program\_id IS NULL, program-scoped otherwise.

> Medtrics Classic mixed the teaching method and the assessment type on one row (`SessionLearningMethod.assessment_type`). Oracle separated instructional method from assessment method and added an AAMC facet layer. Medtrics Classic's per-method title, description and `available_for_students` flag have no direct Oracle counterpart.

![Where the 4 confirmed fields of curriculum\_sessionlearningmethodtype went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FoIo5eoSJFxpPQrbnYrry%2Fflow-curriculum-sessionlearningmethodtype.png?alt=media)

| Medtrics Classic field | Oracle             | Outcome    | Note                |
| ---------------------- | ------------------ | ---------- | ------------------- |
| `id` integer           | `id` UUID          | ID changed | Integer link → UUID |
| `uid` varchar          | `code` TEXT        | Renamed    |                     |
| `type` varchar         | `description` TEXT | Renamed    |                     |
| `name` varchar         | `name` TEXT        | Unchanged  |                     |

* Swap the 2 renamed fields and point `FROM` at `curriculum_instructional_methods`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_instructional_methods` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessionlearningmethodtype.
SELECT
  t.id,          -- was id
  t.code,        -- was uid
  t.name,        -- was name
  t.description  -- was type
FROM curriculum_instructional_methods t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_sessionschedule

**curriculum\_sessionschedule** → `curriculum_session_schedules` · *split* · 8 confirmed fields (Unchanged 3 · Renamed 3 · ID changed 2)

Session scheduling instances. Canonical source for session date, time, and venue (8b).

> Medtrics Classic had a schedule row plus a child date row for recurrence, with audience stored as many-to-many lists. Oracle flattened to one row per occurrence and gave each audience type its own table. The recurrence concept (Medtrics Classic `recurrent_session` self-link and `weekdays` array) has no Oracle column.

![Where the 8 confirmed fields of curriculum\_sessionschedule went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FqzJeZ6TwmKSm2b41dXHc%2Fflow-curriculum-sessionschedule.png?alt=media)

| Medtrics Classic field               | Oracle                 | Outcome    | Note                                                 |
| ------------------------------------ | ---------------------- | ---------- | ---------------------------------------------------- |
| `id` integer                         | `id` UUID              | ID changed | Integer link → UUID                                  |
| `session_course_rotation_id` integer | `session_id` UUID      | ID changed | Integer link → UUID pointing to curriculum\_sessions |
| `end` timestamptz                    | `end_time` TIME        | Renamed    | timestamp → time (Type changed)                      |
| `start` timestamptz                  | `scheduled_date` DATE  | Renamed    | timestamp → date (Split, Type changed)               |
| `start` timestamptz                  | `start_time` TIME      | Renamed    | timestamp → time (Split, Type changed)               |
| `section_name` varchar               | `section_name` TEXT    | Unchanged  |                                                      |
| `is_mandatory` boolean               | `is_mandatory` BOOLEAN | Unchanged  |                                                      |
| `is_published` boolean               | `is_published` BOOLEAN | Unchanged  |                                                      |

* Swap the 3 renamed fields and point `FROM` at `curriculum_session_schedules`.
* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_session_schedules` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessionschedule.
SELECT
  t.id,             -- was id
  t.section_name,   -- was section_name
  t.is_mandatory,   -- was is_mandatory
  t.session_id,     -- was session_course_rotation_id
  t.end_time,       -- was end
  t.scheduled_date, -- was start
  t.start_time,     -- was start
  t.is_published    -- was is_published
FROM curriculum_session_schedules t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_sessionschedule\_individuals

**curriculum\_sessionschedule\_individuals** → `curriculum_session_schedule_individuals` · 2 confirmed fields (ID changed 2)

Schedule-specific individual learner assignments for curriculum sessions.

![Where the 2 confirmed fields of curriculum\_sessionschedule\_individuals went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FX5yANMSwrElV87T9Zurg%2Fflow-curriculum-sessionschedule-individuals.png?alt=media)

| Medtrics Classic field | Oracle         | Outcome    | Note                                                                                                                |
| ---------------------- | -------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer           | `id` UUID      | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `user_id` integer      | `user_id` UUID | ID changed | Integer link → UUID pointing to profiles                                                                            |

* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_session_schedule_individuals` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessionschedule_individuals.
SELECT
  t.id,      -- was id
  t.user_id  -- was user_id
FROM curriculum_session_schedule_individuals t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_sessionschedule\_speakers

**curriculum\_sessionschedule\_speakers** → `curriculum_session_schedule_speakers` · 2 confirmed fields (ID changed 2)

Schedule-specific faculty and speaker assignments for curriculum sessions. Auto-populated from curriculum\_session\_leaders when a schedule is created (editable defaults). Supports guest speakers via guest\_name when profil.

![Where the 2 confirmed fields of curriculum\_sessionschedule\_speakers went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F2w0JXPhuwY1KsdXwMDah%2Fflow-curriculum-sessionschedule-speakers.png?alt=media)

| Medtrics Classic field | Oracle            | Outcome    | Note                                                                                                                |
| ---------------------- | ----------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer           | `id` UUID         | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `user_id` integer      | `profile_id` UUID | ID changed | Integer link → UUID pointing to profiles                                                                            |

* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_session_schedule_speakers` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessionschedule_speakers.
SELECT
  t.id,         -- was id
  t.profile_id  -- was user_id
FROM curriculum_session_schedule_speakers t
WHERE t.deleted_at IS NULL;
```

#### curriculum\_sessionscheduledate

**curriculum\_sessionscheduledate** → `curriculum_session_schedule_groups`, `curriculum_session_schedule_individuals`, `curriculum_session_schedule_speakers`, `curriculum_session_schedules` · *split* · 5 confirmed fields (Unchanged 1 · Renamed 3 · ID changed 1)

Schedule-specific audience group assignments for curriculum sessions. Split table: each field names its new table.

> Medtrics Classic had a schedule row plus a child date row for recurrence, with audience stored as many-to-many lists. Oracle flattened to one row per occurrence and gave each audience type its own table. The recurrence concept (Medtrics Classic `recurrent_session` self-link and `weekdays` array) has no Oracle column.

![Where the 5 confirmed fields of curriculum\_sessionscheduledate went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FFP8ZFRFs3T1WPWAHfmFb%2Fflow-curriculum-sessionscheduledate.png?alt=media)

| Medtrics Classic field | Oracle                                                | Outcome    | Note                                   |
| ---------------------- | ----------------------------------------------------- | ---------- | -------------------------------------- |
| `id` integer           | curriculum\_session\_schedules.`id` UUID              | ID changed | Integer link → UUID                    |
| `start` timestamptz    | curriculum\_session\_schedules.`scheduled_date` DATE  | Renamed    | timestamp → date (Split, Type changed) |
| `start` timestamptz    | curriculum\_session\_schedules.`start_time` TIME      | Renamed    | timestamp → time (Split, Type changed) |
| `end` timestamptz      | curriculum\_session\_schedules.`end_time` TIME        | Renamed    | timestamp → time (Type changed)        |
| `is_published` boolean | curriculum\_session\_schedules.`is_published` BOOLEAN | Unchanged  |                                        |

* Swap the 3 renamed fields and point `FROM` at `curriculum_session_schedule_groups` (and the other new tables).
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_session_schedule_groups`, `curriculum_session_schedule_individuals`, `curriculum_session_schedule_speakers`, `curriculum_session_schedules` keep deleted rows.

#### curriculum\_sessionthemes

**curriculum\_sessionthemes** → `curriculum_themes` · *same* · 4 confirmed fields (Unchanged 2 · Renamed 1 · ID changed 1)

Curriculum themes for cross-cutting content threads (e.g., Patient Safety, Ethics, Evidence-Based Medicine); shared institution-wide when program\_id IS NULL, program-scoped otherwise.

> Same idea, now scoped to an institution or program instead of being global.

![Where the 4 confirmed fields of curriculum\_sessionthemes went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FuhfJoXedeVndsb8lmHOX%2Fflow-curriculum-sessionthemes.png?alt=media)

| Medtrics Classic field | Oracle             | Outcome    | Note                |
| ---------------------- | ------------------ | ---------- | ------------------- |
| `id` integer           | `id` UUID          | ID changed | Integer link → UUID |
| `code` varchar         | `name` TEXT        | Renamed    | (Split)             |
| `code` varchar         | `code` TEXT        | Unchanged  | (Split)             |
| `description` varchar  | `description` TEXT | Unchanged  |                     |

* Swap the 1 renamed field and point `FROM` at `curriculum_themes`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `curriculum_themes` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_sessionthemes.
SELECT
  t.id,          -- was id
  t.code,        -- was code
  t.name,        -- was code
  t.description  -- was description
FROM curriculum_themes t
WHERE t.deleted_at IS NULL;
```

### Objectives / Outcomes

5 tables, 36 confirmed fields: Unchanged 13 · Renamed 14 · ID changed 9.

#### curriculum\_objective

**curriculum\_objective** → `framework_node_categories`, `framework_nodes` · *merged* · 3 confirmed fields (Unchanged 3)

Categories for grouping objectives (Basic Science, Clinical Skills, etc.). Split table: each field names its new table.

> Six Medtrics Classic tables become one typed tree plus a mapping table. This is the strongest single improvement in the area: one place to look, real foreign keys, and one approval workflow instead of four many-to-many tables.

![Where the 3 confirmed fields of curriculum\_objective went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FXmmADLElyoSSbsMzAePa%2Fflow-curriculum-objective.png?alt=media)

| Medtrics Classic field | Oracle                                  | Outcome   | Note    |
| ---------------------- | --------------------------------------- | --------- | ------- |
| `code` varchar         | framework\_node\_categories.`code` TEXT | Unchanged | (Split) |
| `code` varchar         | framework\_nodes.`code` TEXT            | Unchanged | (Split) |
| `description` text     | framework\_nodes.`description` TEXT     | Unchanged |         |

* Add `WHERE deleted_at IS NULL`: `framework_node_categories`, `framework_nodes` keep deleted rows.

#### curriculum\_objectivesgroup

**curriculum\_objectivesgroup** → `framework_node_categories` · *merged* · 3 confirmed fields (Renamed 2 · ID changed 1)

Categories for grouping objectives (Basic Science, Clinical Skills, etc.).

> Six Medtrics Classic tables become one typed tree plus a mapping table. This is the strongest single improvement in the area: one place to look, real foreign keys, and one approval workflow instead of four many-to-many tables.

![Where the 3 confirmed fields of curriculum\_objectivesgroup went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FsS2xUPeXcNEKmeSquLba%2Fflow-curriculum-objectivesgroup.png?alt=media)

| Medtrics Classic field | Oracle                  | Outcome    | Note                                                                                                                |
| ---------------------- | ----------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
| `id` integer           | `id` UUID               | ID changed | Integer ID replaced by a new UUID. Medtrics Classic → new ID crosswalk is kept by the migration (see Keys & joins). |
| `description` text     | `name` TEXT             | Renamed    |                                                                                                                     |
| `order` smallint       | `display_order` INTEGER | Renamed    |                                                                                                                     |

* Swap the 2 renamed fields and point `FROM` at `framework_node_categories`.
* Re-key 1 ID field. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `framework_node_categories` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was curriculum_objectivesgroup.
SELECT
  t.id,            -- was id
  t.name,          -- was description
  t.display_order  -- was order
FROM framework_node_categories t
WHERE t.deleted_at IS NULL;
```

#### programs\_competency

**programs\_competency** → `framework_nodes` · *merged* · 13 confirmed fields (Unchanged 4 · Renamed 5 · ID changed 4)

Unified hierarchy for objectives, competencies, and milestones.

> Three tables became one tree: core\_competency and sub\_competency replace Competency, level replaces Milestone, part replaces MilestonePart (05\_framework/01\_enums.sql:21-42).

![Where the 13 confirmed fields of programs\_competency went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2FseThX8nPzN3cpJDy6Rfs%2Fflow-programs-competency.png?alt=media)

| Medtrics Classic field      | Oracle                                 | Outcome    | Note                                                     |
| --------------------------- | -------------------------------------- | ---------- | -------------------------------------------------------- |
| `id` integer                | `id` UUID                              | ID changed | Integer link → UUID                                      |
| `parent_id` integer         | `node_type` enum:framework\_node\_type | ID changed | Integer link → UUID (Split)                              |
| `parent_id` integer         | `parent_id` UUID                       | ID changed | Integer link → UUID pointing to framework\_nodes (Split) |
| `program_id` integer        | `program_id` UUID                      | ID changed | Integer link → UUID pointing to programs                 |
| `codename` text             | `code` TEXT                            | Renamed    |                                                          |
| `order` smallint            | `display_order` INTEGER                | Renamed    |                                                          |
| `active` boolean            | `is_active` BOOLEAN                    | Renamed    |                                                          |
| `updated_date` timestamptz  | `updated_at` TIMESTAMPTZ               | Renamed    |                                                          |
| `created_date` timestamptz  | `created_at` TIMESTAMPTZ               | Renamed    |                                                          |
| `name` text                 | `name` TEXT                            | Unchanged  |                                                          |
| `description` text          | `description` TEXT                     | Unchanged  |                                                          |
| `original_description` text | `original_description` TEXT            | Unchanged  |                                                          |
| `effective_date` date       | `effective_date` DATE                  | Unchanged  |                                                          |

* Swap the 5 renamed fields and point `FROM` at `framework_nodes`.
* Re-key 4 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `framework_nodes` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was programs_competency.
SELECT
  t.id,                   -- was id
  t.name,                 -- was name
  t.code,                 -- was codename
  t.description,          -- was description
  t.display_order,        -- was order
  t.is_active,            -- was active
  t.original_description, -- was original_description
  t.updated_at,           -- was updated_date
  t.created_at,           -- was created_date
  t.effective_date,       -- was effective_date
  t.node_type,            -- was parent_id
  t.parent_id,            -- was parent_id
  t.program_id            -- was program_id
FROM framework_nodes t
WHERE t.deleted_at IS NULL;
```

#### programs\_milestone

**programs\_milestone** → `framework_nodes` · *merged* · 7 confirmed fields (Unchanged 2 · Renamed 3 · ID changed 2)

Unified hierarchy for objectives, competencies, and milestones.

> Three tables became one tree: core\_competency and sub\_competency replace Competency, level replaces Milestone, part replaces MilestonePart (05\_framework/01\_enums.sql:21-42).

![Where the 7 confirmed fields of programs\_milestone went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F8Eo3fOanCTDvLwecNVlW%2Fflow-programs-milestone.png?alt=media)

| Medtrics Classic field     | Oracle                   | Outcome    | Note                                             |
| -------------------------- | ------------------------ | ---------- | ------------------------------------------------ |
| `id` integer               | `id` UUID                | ID changed | Integer link → UUID                              |
| `competency_id` integer    | `parent_id` UUID         | ID changed | Integer link → UUID pointing to framework\_nodes |
| `order` smallint           | `display_order` INTEGER  | Renamed    |                                                  |
| `created_date` timestamptz | `created_at` TIMESTAMPTZ | Renamed    |                                                  |
| `updated_date` timestamptz | `updated_at` TIMESTAMPTZ | Renamed    |                                                  |
| `name` varchar             | `name` TEXT              | Unchanged  |                                                  |
| `effective_date` date      | `effective_date` DATE    | Unchanged  |                                                  |

* Swap the 3 renamed fields and point `FROM` at `framework_nodes`.
* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `framework_nodes` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was programs_milestone.
SELECT
  t.id,             -- was id
  t.name,           -- was name
  t.display_order,  -- was order
  t.created_at,     -- was created_date
  t.effective_date, -- was effective_date
  t.parent_id,      -- was competency_id
  t.updated_at      -- was updated_date
FROM framework_nodes t
WHERE t.deleted_at IS NULL;
```

#### programs\_milestonepart

**programs\_milestonepart** → `framework_nodes` · *merged* · 10 confirmed fields (Unchanged 4 · Renamed 4 · ID changed 2)

Unified hierarchy for objectives, competencies, and milestones.

> Three tables became one tree: core\_competency and sub\_competency replace Competency, level replaces Milestone, part replaces MilestonePart (05\_framework/01\_enums.sql:21-42).

![Where the 10 confirmed fields of programs\_milestonepart went](https://2912658775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxpbJErq8GWWHPPkzmpv3%2Fuploads%2F69d14o6K380KnwPeofVQ%2Fflow-programs-milestonepart.png?alt=media)

| Medtrics Classic field      | Oracle                      | Outcome    | Note                                             |
| --------------------------- | --------------------------- | ---------- | ------------------------------------------------ |
| `id` integer                | `id` UUID                   | ID changed | Integer link → UUID                              |
| `milestone_id` integer      | `parent_id` UUID            | ID changed | Integer link → UUID pointing to framework\_nodes |
| `order` smallint            | `display_order` INTEGER     | Renamed    |                                                  |
| `active` boolean            | `is_active` BOOLEAN         | Renamed    |                                                  |
| `updated_date` timestamptz  | `updated_at` TIMESTAMPTZ    | Renamed    |                                                  |
| `created_date` timestamptz  | `created_at` TIMESTAMPTZ    | Renamed    |                                                  |
| `name` varchar              | `name` TEXT                 | Unchanged  |                                                  |
| `description` text          | `description` TEXT          | Unchanged  |                                                  |
| `original_description` text | `original_description` TEXT | Unchanged  |                                                  |
| `effective_date` date       | `effective_date` DATE       | Unchanged  |                                                  |

* Swap the 4 renamed fields and point `FROM` at `framework_nodes`.
* Re-key 2 ID fields. Join people on `email`, not on old IDs.
* Add `WHERE deleted_at IS NULL`: `framework_nodes` keeps deleted rows.

```sql
-- Starter query: confirmed fields only. Was programs_milestonepart.
SELECT
  t.id,                   -- was id
  t.name,                 -- was name
  t.description,          -- was description
  t.display_order,        -- was order
  t.is_active,            -- was active
  t.original_description, -- was original_description
  t.updated_at,           -- was updated_date
  t.created_at,           -- was created_date
  t.effective_date,       -- was effective_date
  t.parent_id             -- was milestone_id
FROM framework_nodes t
WHERE t.deleted_at IS NULL;
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.mymedtrics.com/get-started/classic-data-mapping/curriculum.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
