**[Developer Version 1.1.0]** FHIR Standard in Learning Management System (LMS)
===
###### tags: `fhir-project` `LMS` `developer-version` `version 1.1.0`
## Table of Contents
[TOC]
## Prerequisites
* [FHIR](https://www.hl7.org/fhir/)
* Some working knowledge of [HTML](https://www.w3schools.com/html/), [CSS](https://www.w3schools.com/css/default.asp), and [JavaScript](https://www.w3schools.com/js/default.asp)
## Related FHIR Resource
Before we start to jump into the program source code, it's better to have some understanding regarding the FHIR format we use in this system.
### [Organization](https://www.hl7.org/fhir/organization.html)
* Usage: Define the educational institution information
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | Organization |
| active | Whether the organization's record is still in active use | true|false |
| type | Kind of organization | type.coding.code= "team"; type.coding.display= "Organizational team" |
| name | Organization name | Oxford University |
| telecom | A contact detail for the organization | telecom.system= “phone”; telecom.value= “911” |
| address | An address for the organization | address.text= “21, Washington Street” |
### [Person](http://hl7.org/fhir/person.html)
* Usage: Define a person, where each person may have multiple role (student or teacher)
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | Person |
| identifier | A human identifier for this person. We also use this field to store other information related to this person (e.g. password, institution, etc.) | identifier.system= “UserID”; identifier.value= “elonmusk@gmail.com”; |
| name | Person name | Elon Musk |
| telecom | A contact detail for the person | telecom.system= “phone”; telecom.value= “081234568” |
| active | This person's record is in active use | true|false |
| link | Link to \[Patient\] or \[Practitioner\] resource that concerns the same actual person. Since a person can have multiple role, e.g. they may be a student from 2 different organizations and a teacher from 1 organization, then “link” field will reference to 2 \[Patient\] and 1 \[Practitioner\] | link.target.reference= “Patient/01” |
### [Patient](http://hl7.org/fhir/patient.html)
* Usage: Define the role of student
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | Patient |
| identifier | Student ID | identifier.system= “StudentID”; identifier.value= “111316001”; |
| active | Whether the student's record is still in active use | true|false |
| name | Student name | Elon Musk |
| managingOrganization | Education institution where the student belongs to | managingOrganization.reference= “Organization/2” |
### [Practitioner](http://www.hl7.org/fhir/practitioner.html)
* Usage: Define the role of teacher. This resource only store the information of teacher, not included the organization where the teacher belong to
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | Practitioner |
| active | Whether the teacher's record is still in active use | true|false |
| name | Teacher name | Albert Einstein |
### [PractitionerRole](https://www.hl7.org/fhir/practitionerrole.html)
* Usage: Define the organization where the teacher belong to
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | PractitionerRole |
| identifier | Identifiers that are specific to a teacher | Identifier.system = ”PractitionerID”; Identifier.value = ”P0001” |
| active | Whether the teacher's record is still in active use | true|false |
| practitioner | \[Practitioner\] resource where the practitioner role belongs to | practitioner.reference= “Practitioner/5”; practitioner.display= “Albert Einstein”; |
| organization | Education institution where the teacher belongs to | organization.reference= “Organization/2”; organization.display= “Oxford University”; |
| telecom | A contact detail for the person | telecom.system= “email”; telecom.value= “albertEinstein@oxfuni.com” |
### [Schedule](https://www.hl7.org/fhir/schedule.html)
* Usage: Store course information
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | Schedule |
| active | Whether the course's record is still in active use | true|false |
| serviceCategory | Document category | serviceCategory\[0\].coding\[0\].code= “100000”; serviceCategory\[0\].coding\[0\].display= “Course Schedule”; |
| serviceType | Course type | serviceType\[0\].coding\[0\].code= “100000100”; serviceType\[0\].coding\[0\].display= “Educational Course Schedule”; |
| specialty | Course name and code. Each course will have unique course code | specialty\[0\].coding\[0\].code= “100000100105”; specialty\[0\].coding\[0\].display= “FHIR Beginner Course”; |
| actor | Reference to course’s teacher (\[PractitionerRole\] resource) | actor\[0\].reference= "PractitionerRole/114"; actor\[0\].display= "Albert Einstein" |
| planningHorizon | Course start and end date | planningHorizon.start= "2022-02-21T09:00:00Z" |
| comment | Course other information (e.g. number of slot session) | comment= "Course schedule-with maximum 50 slots" |
### [Slot](https://www.hl7.org/fhir/slot.html)
* Usage: Define the slots of time that may be available for related course
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | Slot |
| identifier | Identifiers that are specific to a slot. We use this field to store “Slot session code” | Identifier.system = ”slotSessionCode”; Identifier.value = ”100000100105101” |
| schedule | Reference to \[Schedule\] resource | schedule.reference= "Schedule/16” |
| status | Course slot availability. When course slot already booked by a student, the “status” will be “busy”. Otherwise the “status” will be “free” | busy | free |
| start | Slot session start date | start= "2022-02-21T09:00:00Z" |
| end | Slot session end date | end= "2022-06-27T12:00:00Z" |
| comment | Slot other information | |
### [Appointment](https://www.hl7.org/fhir/appointment.html)
* Usage: Define course appointments booked by student
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | Appointment |
| status | Course slot availability. When course slot already booked by a student, the “status” will be “busy”. Otherwise the “status” will be “free” | proposed | pending | booked | arrived | cancelled | noshow |
| slot | Reference to \[Slot\] resource | slot.reference= "Slot/8” |
| participant | Reference to \[Patient\] and \[PractitionerRole\] resource | participant\[0\].actor.reference= "PractitionerRole/6"; participant\[0\].actor.display= "Albert Einstein" |
### [PlanDefinition](https://www.hl7.org/fhir/plandefinition.html)
* Usage: Store course material content
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | PlanDefinition |
| version | Update version of document | version= "1.0.0" |
| name | Name for this plan document | name= “ScheduleSlotDocumentReference” |
| title | Additional information of the course | title= "Oxford University-FHIR Beginner Course-Teaching Plan" |
| status | Course material document's record status | draft | active | retired | unknown |
| date | Created date | date= "2022-02-20" |
| approvalDate | Document approved by publisher date | approvalDate= "2022-02-20" |
| lastReviewDate | Document last review date | lastReviewDate= "2022-02-20" |
| effectivePeriod | The teaching plan effective period | effectivePeriod.start= "2022-02-24" effectivePeriod.end= "2022-03-24" |
| publisher | Publisher organization name | publisher= "Oxford University" |
| contact | A contact detail for the publisher | contact.telecom.value= "415-362-4007" |
| purpose | Document purpose | purpose= "This plan shows the instructions for the student who participates in the course.” |
| author | Author information | author.name= "Albert Einstein" |
| relatedArtifact | Course content documentation | - relatedArtifact.type = "composed-of" (default value)<br><br> **The 1st index item contains \[Schedule\] information**<br> - relatedArtifact.display= “CourseSchedule-\[Schedule name\]” <br>- relatedArtifact.resource= “Schedule/\[id\]” <br><br> **The 2nd and so on items contains \[Slot\] information** <br>- relatedArtifact.display= “session\[Session no\]-\[Course content type\]-\[Slot name\]” <br>- relatedArtifact.resource= \[Course content URL\] |
| action | Hierarchical course design plan. Student must complete 1st chapter to continue the 2nd chapter. | **Schedule** <br>- action.title= "Oxford University Course Introduction" <br>- action.documentation.type= "composed-of" <br>- action.documentation.display= "CourseSchedule-FHIR Beginner Course" <br>- action.documentation.resource= "Schedule/#ID" <br><br> **Slot 1** <br>-- action.action.title": "session1" <br>- action.action.documentation.display= "session1-ppt-FHIR Introduction" <br>- action.action.documentation.url= "https://www.google.com/search?q=course+content"<br><br>**Slot 2** <br>- action.action.action.title= "session2" <br>- action.action.action.documentation.display= "session2-ppt-FHIR JSON Format Data" <br>- ... |
### [Group](https://www.hl7.org/fhir/group.html)
* Usage: Store student who have joined the course or still on the pending list student
* Field format:
| Field Name | Definition | Example Value |
|-|-|-|
| resourceType | FHIR resource type | Group |
| identifier | Unique identifier for this group. Use this field as a link to Schedule | 100000100105 |
| code | Group type a. Joined List (201) b. Pending List (202) | code.coding\[0\].code= "201" code.coding\[0\].display= "Joined List" |
| name | Label for Group | Joined course member list |
| quantity | Max student who can join this course | 50 |
| member | Student list name | member\[x\].entity.reference= “Patient/01” member\[x\].period.start= "2015-04-02" |
:::spoiler [Group/2868235](https://hapi.fhir.org/baseR4/Group/2868235)
```gherkin=
{
"resourceType": "Group",
"id": "2868235",
"meta": {
"versionId": "1",
"lastUpdated": "2022-04-01T16:20:07.597+00:00",
"source": "#YF0qfPnU9eG7jsq1"
},
"identifier": [ {
"system": "courseCode",
"value": "100000100105"
} ],
"code": {
"coding": [ {
"code": "201",
"display": "Joined List"
} ]
},
"name": "Joined course member list",
"quantity": 50,
"member": [ {
"entity": {
"reference": "Patient/2806433"
},
"period": {
"start": "2022-02-28"
}
}, {
"entity": {
"reference": "Patient/2868223"
},
"period": {
"start": "2022-03-01"
}
} ]
}
```
:::
FHIR Resource Relation
---

### Schedule-Slot-Appointment-PlanDefinition

* **Schedule**: Store course name, period of date
* **Slot**: Store course every week time
* **Appointment**: Student booking appointment
* **Patient**: Student
* **Group**: Store current and max student
* Group 1: Joined list member 確認選課學員
* Group 2: Pending list member 已選課待確認人員
* **PlanDefinition**: Course plan and material
Example:

System Workflow
---
LMS system divides into different subsystem, we are going to explain it one by one.
### Menu 1. Sign up
Method A: Sign up and register to course directly

Method B: Sign up only (1 account sign up for all courses)
### Menu 2. Login

### Menu 3. Role: Student
##### 3b. Select new course

### Menu 4. Role: Teacher
#### 4f. Create new course

### Menu 5. Forget password
**Step:**
1. User click "forget password" menu
2. User input email

3. System create random token (64 digit char)
4. Random token store into Person.identifier
5. System send reset password link with random id (e.g. https://github.com/password_reset/AI2H4SUSBBSEYKC6KWHBHB3C35QIFBFFMVWWC2LMW53GSY3UN5ZGSYLUNJUWCYKAM5WWC2LMFZRW63NFMZXXEY3FYKZXI53PL5TGCY3UN5ZF65TFOJUWM2LFMTBLUZTPOJRWKZC7O5SWC227OBQXG43XN5ZGIX3SMVZWK5GC?auto=true)

6. User update new password

7. System update new password in Person.identifier
8. System delete random token in Person.identifier
```
<!--```flow
st=>start: Start
st1=>operation: Create Schedule
st2=>operation: Create Slot
st3=>operation: Create Group
st4=>operation: Create Appointment
st5=>operation: Create PlanDefinition
e=>end: End
st->st1->st2->st3->st4->st5->e
```
-->
<!--
```flow
st=>start: Start
st1=>operation: Update Patient to Group 2
cond1=>condition: System automatic check?
st2y_1=>operation: Check max student and current student
cond2=>condition: Exceed max no?
st2y_2=>operation: Move Patient from Group 2 into Group 1
st2y_3=>operation: Update Appointment
st2n_1=>operation: Manual check mechanism
cond3=>condition: Approved?
e=>end: End
st->st1->cond1
cond1(yes)->st2y_1
st2y_1->cond2
cond2(yes)->e
cond2(no)->st2y_2->st2y_3
st2y_3->e
cond1(no)->st2n_1->cond3
cond3(no)->e
cond3(yes)->st2y_2->st2y_3
```
-->
<!--
#### Plan B

##### Create new course workflow
```flow
st=>start: Start
st1=>operation: Create Schedule
st2=>operation: Create Slot
st3=>operation: Create PlanDefinition
e=>end: End
st->st1->st2->st3->e
```
##### Student select course workflow
```flow
st=>start: Start
st1=>operation: Read Schedule.comment (Check max student)
st2=>operation: Read Appointment?status=booked (Check current student)
cond1=>condition: Exceed max no?
st3=>operation: Create Appointment (status=booked)
st4=>operation: Create Appointment (status=waitlist)
e=>end: End
st->st1->st2->cond1
cond1(no)->st3->e
cond1(yes)->st4->e
```
-->
Testing Scenario
---
### **Scenario**: Oxford University is going to open a new course, with details below:
* Course Name: FHIR Beginner Course
* Period: 2022-02-21 until 2022-06-27 (18 weeks)
* Schedule: Tuesday (09:00-12:00) and Friday (10:00-12:00)
* Total student (max): 5 students
**Step:**
1. Create FHIR Organization for Oxford University
:::spoiler [Organization/2867568](https://hapi.fhir.org/baseR4/Organization/2867568)
```gherkin=
{
"resourceType": "Organization",
"active": true,
"type": [ {
"coding": [ {
"system": "http://terminology.hl7.org/CodeSystem/organization-type",
"code": "team",
"display": "Organizational team"
} ]
} ],
"name": "Oxford University",
"telecom": [ {
"system": "phone",
"value": "911"
} ],
"address": [ {
"text": "21, Washington Street"
} ]
}
```
:::
<br>
2. Create FHIR Schedule for "FHIR Beginner Course"
:::spoiler [Schedule/2867570](https://hapi.fhir.org/baseR4/Schedule/2867570)
```gherkin=
{
"resourceType": "Schedule",
"active": true,
"serviceCategory": [ {
"coding": [ {
"code": "100000",
"display": "Course Schedule"
} ]
} ],
"serviceType": [ {
"coding": [ {
"code": "100000100",
"display": "Educational Course Schedule"
} ]
} ],
"specialty": [ {
"coding": [ {
"code": "100000100105",
"display": "FHIR Beginner Course"
} ]
} ],
"planningHorizon": {
"start": "2022-02-21T09:00:00Z",
"end": "2022-06-27T12:00:00Z"
},
"comment": "Course schedule-with maximum 5 slots"
}
```
:::
<br>
3. Create FHIR Slot
:::spoiler Tuesday: [Slot/2867571](https://hapi.fhir.org/baseR4/Slot/2867571)
```gherkin=
{
"resourceType": "Slot",
"identifier": [ {
"system": "slotSessionCode",
"value": "100000100105101"
} ],
"schedule": {
"reference": "Schedule/2867570"
},
"status": "free",
"start": "2022-02-21T09:00:00Z",
"end": "2022-06-27T12:00:00Z",
"comment": "FHIR Beginner Course-Slot1-Tuesday"
}
```
:::
<br>
:::spoiler Friday: [Slot/2867572](https://hapi.fhir.org/baseR4/Slot/2867572)
```gherkin=
{
"resourceType": "Slot",
"identifier": [ {
"system": "slotSessionCode",
"value": "100000100105102"
} ],
"schedule": {
"reference": "Schedule/2867570"
},
"status": "free",
"start": "2022-02-21T10:00:00Z",
"end": "2022-06-27T12:00:00Z",
"comment": "FHIR Beginner Course-Slot2-Friday"
}
```
:::
<br>
4. Create FHIR Group I to limit only 5 students can join this course and to store the list of students who have successfully joined this course
:::spoiler Group I: [Group/2867573](https://hapi.fhir.org/baseR4/Group/2867573)
```gherkin=
{
"resourceType": "Group",
"identifier": [ {
"system": "courseCode",
"value": "100000100105"
} ],
"code": {
"coding": [
{
"code": "201",
"display": "Joined List"
}
]
},
"name": "Joined course member list",
"quantity": 5
}
```
:::
<br>
5. Create FHIR Group II to store the pending list of students who want to join this course
:::spoiler Group II: [Group/2867574](https://hapi.fhir.org/baseR4/Group/2867574)
```gherkin=
{
"resourceType": "Group",
"identifier": [ {
"system": "courseCode",
"value": "100000100105"
} ],
"code": {
"coding": [
{
"code": "202",
"display": "Pending List"
}
]
},
"name": "Pending member list"
}
```
:::
<br>
6. Create 5 FHIR Appointment
:::spoiler [Appointment/2898165 - Appointment/2898169](https://hapi.fhir.org/baseR4/Appointment/2898165)
```gherkin=
{
"resourceType": "Appointment",
"status": "proposed",
"slot": [ {
"reference": "Slot/2867571"
}, {
"reference": "Slot/2867572"
} ]
}
```
:::
### Scenario: Oxford University assign Prof. Albert Einstein to teach "FHIR Beginner Course"
**Step:**
1. Create FHIR Person
:::spoiler [Person/2867575](https://hapi.fhir.org/baseR4/Person/2867575)
```gherkin=
{
"resourceType": "Person",
"identifier": [ {
"system": "UserID",
"value": "albertEinstein2@gmail.com"
}, {
"system": "Password",
"value": "NzJkMDE2NmI1NzA3ZDEyOWRjMzIxZTU2NjkyZmU0NTRjMDM0NTUyZWU5ZTJiMzhmNWE3ZjFjMTMwNmE2MzJlYQ=="
}, {
"system": "HighestEduDegree",
"value": "PhD"
}, {
"system": "Institution",
"value": "Oxford University"
} ],
"name": [ {
"text": "Albert Einstein"
} ],
"telecom": [ {
"system": "email",
"value": "albertEinstein2@gmail.com"
} ]
}
```
:::
<br>
2. Create FHIR Practitioner
:::spoiler [Practitioner/2867576](https://hapi.fhir.org/baseR4/Practitioner/2867576)
```gherkin=
{
"resourceType": "Practitioner",
"active": true,
"name": [
{
"text": [
"Albert Einstein2"
]
}
]
}
```
:::
<br>
3. Create FHIR PractitionerRole
:::spoiler [PractitionerRole/2867577](https://hapi.fhir.org/baseR4/PractitionerRole/2867577)
```gherkin=
{
"resourceType": "PractitionerRole",
"identifier": [ {
"system": "PractitionerID",
"value": "P0001"
} ],
"active": true,
"practitioner": {
"reference": "Practitioner/2867576",
"display": "Albert Einstein"
},
"organization": {
"reference": "Organization/2867568",
"display": "Oxford University"
},
"telecom": [ {
"system": "email",
"value": "albertEinstein2@oxfuni.com",
"use": "work"
} ]
}
```
:::
<br>
4. Update FHIR Person
:::spoiler [Person/2867575](https://hapi.fhir.org/baseR4/Person/2867575)
```gherkin=
"link": [ {
"target": {
"reference": "Practitioner/2867576"
}
} ]
```
:::
<br>
5. Update FHIR Schedule
:::spoiler [Schedule/2867570](https://hapi.fhir.org/baseR4/Schedule/2867570)
```gherkin=
"actor": [ {
"reference": "PractitionerRole/2867577",
"display": "Albert Einstein"
} ]
```
:::
<br>
### Scenario: Prof. Albert Einstein upload the course plan design and content
**Step:**
1. Create Plan Definition for course teaching plan
:::spoiler [PlanDefinition/2868221](https://hapi.fhir.org/baseR4/PlanDefinition/2868221)
```gherkin=
{
"resourceType": "PlanDefinition",
"identifier": [ {
"use": "official"
} ],
"version": "1.0.0",
"name": "ScheduleSlotDocumentReference",
"title": "Oxford University-FHIR Beginner Course-Teaching Plan",
"status": "active",
"date": "2022-02-20",
"publisher": "Oxford University",
"contact": [ {
"telecom": [ {
"system": "phone",
"value": "415-362-4007",
"use": "work"
} ]
} ],
"purpose": "This plan shows the instructions for the student who participates in the course.",
"approvalDate": "2022-02-20",
"lastReviewDate": "2022-02-20",
"effectivePeriod": {
"start": "2022-02-24",
"end": "2022-03-24"
},
"author": [ {
"name": "Albert Einstein",
"telecom": [ {
"system": "phone",
"value": "911",
"use": "work"
}, {
"system": "email",
"value": "albertEinstein@oxfuni.com",
"use": "work"
} ]
} ],
"relatedArtifact": [ {
"type": "composed-of",
"display": "CourseSchedule-FHIR Beginner Course",
"resource": "Schedule/16"
}, {
"type": "composed-of",
"label": "2022-02-21",
"display": "session1-ppt-FHIR Introduction",
"url": "http://203.64.84.150:51888/user4/course/FHIRbeginner_IT/courseMaterial/FHIR%20Introduction_20220115.pptx"
}, {
"type": "composed-of",
"label": "2022-02-28",
"display": "session2-ppt-FHIR JSON Format Data",
"url": "http://203.64.84.150:51888/user4/course/FHIRbeginner_IT/courseMaterial/FHIR%20Beginner%20JSON_20220122.pptx"
} ],
"action": [ {
"title": "Oxford University Course Introduction",
"documentation": [ {
"type": "composed-of",
"display": "CourseSchedule-FHIR Beginner Course",
"resource": "Schedule/16"
} ],
"action": [ {
"title": "session1",
"documentation": [ {
"type": "composed-of",
"display": "session1-ppt-FHIR Introduction",
"url": "http://203.64.84.150:51888/user4/course/FHIRbeginner_IT/courseMaterial/FHIR%20Introduction_20220115.pptx"
} ],
"action": [ {
"title": "session2",
"documentation": [ {
"type": "composed-of",
"display": "session2-ppt-FHIR JSON Format Data",
"url": "http://203.64.84.150:51888/user4/course/FHIRbeginner_IT/courseMaterial/FHIR%20Beginner%20JSON_20220122.pptx"
} ]
} ]
} ]
} ]
}
```
:::
<br>
### Scenario: Elon Musk is a student in Oxford University. He want to register in "FHIR Beginner Course"
**Step:**
1. Create Person
:::spoiler [Person/2868222](https://hapi.fhir.org/baseR4/Person/2868222)
```gherkin=
{
"resourceType": "Person",
"identifier": [ {
"system": "UserID",
"value": "elonmusk2@gmail.com"
}, {
"system": "Password",
"value": "NThjYzgzZjViODBjYjUzY2U1Mzg1YWY5NTY0NThmYTllYWVkODk4MjVhZmY3NmE4MjQ5MTAzYzEwZGVlODY3ZQ=="
}, {
"system": "HighestEduDegree",
"value": "Master Degree"
}, {
"system": "Institution",
"value": "Oxford University"
} ],
"name": [ {
"text": "Elon Musk"
} ],
"telecom": [ {
"system": "email",
"value": "elonmusk2@gmail.com"
} ],
"active": true
}
```
:::
<br>
2. Create Patient
:::spoiler [Patient/2868223](https://hapi.fhir.org/baseR4/Patient/2868223)
```gherkin=
{
"resourceType": "Patient",
"identifier": [ {
"system": "StudentID",
"value": "111316001"
} ],
"active": true,
"name": [ {
"text": "Elon Musk"
} ],
"managingOrganization": {
"reference": "Organization/2867568"
}
}
```
:::
<br>
3. Update Person
:::spoiler [Person/2868222](https://hapi.fhir.org/baseR4/Person/2868222)
```gherkin=
"link": [ {
"target": {
"reference": "Patient/2868223"
}
} ]
```
:::
<br>
<!--
4. Update Group 2
> [https://hapi.fhir.org/baseR4/Group?<font style="color:red">identifier=100000100105</font>&<font style="color:green">code=202</font>](https://hapi.fhir.org/baseR4/Group?identifier=100000100105&code=202)
:::spoiler [Group/2867574](https://hapi.fhir.org/baseR4/Person/2868222)
```gherkin=
"member": [
{
"entity": {
"reference": "Patient/2868223"
},
"period": {
"start": "2022-04-15"
}
}
```
:::
-->
4. Create Appointment with status "**waitlist**".
:::spoiler [Appointment/2898168](https://hapi.fhir.org/baseR4/Appointment/2868229)
```gherkin=
{
"resourceType": "Appointment",
"status": "waitlist",
"slot": [ {
"reference": "Slot/2867571"
}, {
"reference": "Slot/2867572"
} ],
"participant": [ {
"actor": {
"reference": "Patient/2868223",
"display": "Elon Musk"
}
}, {
"actor": {
"reference": "PractitionerRole/2867577",
"display": "Albert Einstein"
}
} ]
}
```
:::
5. Check maximum quota of student
> [https://hapi.fhir.org/baseR4/Group?<font style="color:red">identifier=100000100105</font>&<font style="color:green">code=201</font>](https://hapi.fhir.org/baseR4/Group?identifier=100000100105&code=201)
>
> Get entry[0].resource.quantity
6. System automatic method: check current total of students
> [https://hapi.fhir.org/baseR4/Appointment?<font style="color:red">slot=2867571</font>&<font style="color:green">status=booked</font>](https://hapi.fhir.org/baseR4/Appointment?slot=2867571&status=booked)
>
> Get total
7. Allowing student join a course mechanism:
* If current total of students **already** reach its maximum quota, then
* If current total of students **has not** reach its maximum quota, then Create Appointment with status "**booked**"
> [Appointment/2898165](https://hapi.fhir.org/baseR4/Appointment/2868225)
> https://hapi.fhir.org/baseR4/Appointment?slot=2867571&status=waitlist&_sort=_lastUpdated
## :memo: Exercise, it's your turn now!
### **Exercise I**: Harvard University is going to open a new course, with details below:
* Course Name: FHIR Intermediate Course
* Period: 2023-01-02 until 2023-03-10 (10 weeks)
* Schedule: Friday (13:00-17:00)
* Total student (max): 20 students
* Tutor name: Prof. Neil Armstrong
* Student name: Peter Parker
**FHIR Server Option**:
* UHN open source server: [http://hapi.fhir.org](http://hapi.fhir.org)
**Task**:
- [ ] Create Organization
- [ ] Create Schedule
- [ ] Create Slot
- [ ] Create Person
- [ ] Create Practitioner
- [ ] Create PractitionerRole
- [ ] Update Person
- [ ] Update Schedule
- [ ] Create Plan Definition
- [ ] Create Person
- [ ] Create Patient
- [ ] Update Person
- [ ] Create Appointment
- [ ] Update Slot
If you need any review from me, feel free to leave the FHIR Resource URL by comment on each task item.
:::info
**Source Code?** [click here!](https://github.com/victoriatjia/FHIR_LMS/tree/main/vers2_with%20registration/TestingCourse)
:::
## Appendix and FAQ
:::info
**Find this document incomplete?** Leave a comment!
> :pushpin: **How to comment?** Select the text you want to comment on and hit the **Comment** button that pops up. Leave the comment on the right-hand side comment area and hit Enter or Return.
:::