Additionally, we acknowledge that CLInic is based on the AddressBook-Level 3 (AB-3) project created by the SE-EDU initiative. All features developed in CLInic are built upon those existing in AB-3.
In developing our User-Guide and Developer-Guide, our project drew inspiration off the structure of past projects: Connectify, [Ba]king [Br]ead and WedLog.
Refer to the guide Setting up and getting started.
The Architecture Diagram given above explains the high-level design of the App.
Given below is a quick overview of main components and how they interact with each other.
Main components of the architecture
Main
(consisting of classes Main
and MainApp
) is in charge of the app launch and shut down.
The bulk of the app's work is done by the following four components:
UI
: The UI of the App.Logic
: The command executor.Model
: Holds the data of the App in memory.Storage
: Reads data from, and writes data to, the hard disk.Commons
represents a collection of classes used by multiple other components.
How the architecture components interact with each other
The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command deletePatient i/T0123456A
using the shorthand dp i/T0123456A
.
Each of the four main components (also shown in the diagram above),
interface
with the same name as the Component.{Component Name}Manager
class (which follows the corresponding API interface
mentioned in the previous point.For example, the Logic
component defines its API in the Logic.java
interface and implements its functionality using the LogicManager.java
class which follows the Logic
interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component's being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.
The sections below give more details of each component.
The API of this component is specified in Ui.java
The UI consists of a MainWindow
that is made up of parts e.g.CommandBox
, ResultDisplay
, PatientListPanel
, StatusBarFooter
etc. All these, including the MainWindow
, inherit from the abstract UiPart
class which captures the commonalities between classes that represent parts of the visible GUI.
The UI
component uses the JavaFx UI framework. The layout of these UI parts are defined in matching .fxml
files that are in the src/main/resources/view
folder. For example, the layout of the MainWindow
is specified in MainWindow.fxml
.
The UI
component,
Logic
component.Model
data so that the UI can be updated with the modified data.Logic
component, because the UI
relies on the Logic
to execute commands.Model
component, as it displays Patient
object residing in the Model
.API : Logic.java
Here's a (partial) class diagram of the Logic
component:
The sequence diagram below illustrates the interactions within the Logic
component, taking execute("deletePatient i/T0123456A")
as the shorthand command execute("dp i/T0123456A")
API call as an example.
Note: The lifeline for DeletePatientCommandParser
should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the Logic
component works:
Logic
is called upon to execute a command, it is passed to an AddressBookParser
object which in turn creates a parser that matches the command (e.g.,DeletePatientCommandParser
) and uses it to parse the command.Command
object (more precisely, an object of one of its subclasses e.g., DeletePatientCommandParser
) which is executed by the LogicManager
.Model
when it is executed (e.g. to delete a patient).Model
) to achieve.CommandResult
object which is returned back from Logic
.Here are the other classes in Logic
(omitted from the class diagram above) that are used for parsing a user command:
How the parsing works:
AddressBookParser
class creates an XYZCommandParser
(XYZ
is a placeholder for the specific command name e.g., AddPatientCommandParser
) which uses the other classes shown above to parse the user command and create a XYZCommand
object (e.g., AddPatientCommand
) which the AddressBookParser
returns back as a Command
object.XYZCommandParser
classes (e.g., AddPatientCommandParser
, DeletePatientCommandParser
, ...) inherit from the Parser
interface so that they can be treated similarly where possible e.g, during testing.API : Model.java
The Model
component,
Patient
, Appointment
, AppointmentView
objects (which are contained in a UniquePatientList
, AppointmentList
and AppointmentViewList
objects respectively). An AppointmentView
object has both an Appointment
and the Name
of the Patient
it is for, so that it contains the necessary information to be displayed on the UI.Patient
and AppointmentView
objects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiable ObservableList<Patient>
and ObservableList<AppointmentView>
that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.AppointmentView
objects for today (i.e. date of appointment is today) as a separate filtered list using similar logic as above, for the purpose of Day-View.UserPref
object that represents the user’s preferences. This is exposed to the outside as a ReadOnlyUserPref
objects.Model
represents data entities of the domain, they should make sense on their own without depending on other components)Note: An alternative (arguably, a more OOP) model is given below. It has a Tag
list in the AddressBook
, which Patient
references. This allows AddressBook
to only require one Tag
object per unique tag, instead of each Patient
needing their own Tag
objects.
API : Storage.java
The Storage
component,
AddressBookStorage
and UserPrefStorage
, which means it can be treated as either one (if only the functionality of only one is needed).Model
component (because the Storage
component's job is to save/retrieve objects that belong to the Model
).Classes used by multiple components are in the seedu.addressbook.commons
package.
This section describes some noteworthy details on how certain features are implemented.
The implementation of AddPatientCommand
is supported by the Patient
class stored internally in a UniquePatientList
in AddressBook
.
Fields that a Patient
has include:
Nric
Name
DateOfBirth
Phone
Email
Address
Tag
[optional]To add a Patient
, UniquePatientList
implements the following operations:
UniquePatientList#hasPatientWithNric(Nric)
- Checks if there is another patient with the same NRIC already in the list.UniquePatientList#add(Patient)
- Add the Patient to the list.Those operations are exposed in the Model
interface as Model#hasPatientWithNric(Nric)
and Model#addPatient(Patient)
respectively.
ap i/T0123456A n/John Doe b/2001-05-02 p/98765432 e/johnd@example.com a/John street, block 123, #01-01
(shorthand for addPatient).AddPatientCommand
calls Model#hasPatientWithNric(Nric)
using Patient#getNric()
to get the NRIC of the patient to be added. This checks if there is already a patient with an NRIC of T0123456A. If that is the case, we throw a CommandException
highlighting to the user that the patient they are trying to add already exists in the CLInic.AddPatientCommand
calls Model#AddPatient(Patient)
, to add the patient to the AddressBook
.The following diagram shows how an AddPatientCommand goes through the Logic
component:
The following activity diagram summarizes what happens when a user executes an AddPatientCommand
:
The implementation of AddApptCommand
is supported by the Appointment
class and its related classes.
The management of all appointments is achieved through the AppointmentList
class stored in the AddressBook
,
similar to the UniquePatientList
.
Details captured in an Appointment
class include:
To add an AppointmentList
, UniquePatientList
and AddressBook
implements the following operations:
UniquePatientList#hasPatientWithNric(Nric)
- Checks if there exists a patient with the NRIC in the list.AppointmentList#hasAppointment(Appointment)
- Checks if there exists an appointment with the same NRIC, date and start time.AddressBook#isValidApptForPatient(Appointment)
- Checks if appointment date is not before date of birth of patient.AppointmentList#samePatientHasOverlappingAppointment(Appointment)
- Checks if same patient has another appointment with overlapping time period.AppointmentList#addAppointment(Appointment)
- Add the appointment to the list.Those operations are exposed in the Model
interface as Model#hasPatientWithNric(Nric)
, Model#hasAppointment(Appointment)
, Model#isValidApptForPatient(Appointment)
, Model#samePatientHasOverlappingAppointment(Appointment)
and Model#addAppointment(Appointment)
respectively.
aa i/T0123456A d/2024-03-27 from/00:00 to/00:30 t/Medical Check-up
(shorthand for addAppt).AddApptCommand
calls Model#hasPatientWithNric(Nric)
using Appointment#getNric()
to get the NRIC of the patient that the appointment is for. This checks if T0123456A (NRIC) belongs to an existing patient in the system. If yes, continue. Else, throw a CommandException
to highlight to the user that the given NRIC does not exist.AddApptCommand
calls Model#hasAppointment(Appointment)
to check if an equivalent appointment exists in the system. If no, continue. Else, throw a CommandException
to highlight to the user that the appointment to be created already exists.AddApptCommand
calls Model#isValidApptForPatient(Appointment)
to check if the date of appointment is before the corresponding patient's date of birth. If no, continue. Else, throw a CommandException
to highlight to the user that the date of the appointment cannot be before patient is born.AddApptCommand
calls Model#samePatientHasOverlappingAppointment(Appointment)
to check if there exists another appointment for the same patient over an overlapping time period. If no, continue. Else throw a CommandException
to highlight to the user that an existing appointment overlaps with the appointment to be created.AddApptCommand
calls Model#addAppointment(Appointment)
to add the appointment to the AddressBook
.The following sequence diagram shows how an addAppt operation goes through the Logic
component:
The following activity diagram summarises what happens when a user executes addApptCommand.
Aspect: How to match an Appointment
to a Patient
:
Alternative 1 (current choice): Store only the NRIC of the Patient
in Appointment
.
Patient
and will not change, space efficient.Person
.Alternative 2: Store Patient
in Appointment
Patient
from Appointment
.Patient
. We need to ensure Patient
in UniquePatientList
and Patient
in
each Appointment
are always consistent which can be tricky.The Edit Appointment feature will involve parsing user input and updating the existing appointment with new values.
An appointment's DATE
, START_TIME
, END_TIME
, APPOINTMENT_TYPE
and NOTE
can be edited. NRIC
cannot be edited.
The implementation will include the following key components:
ea i/ T0123456A d/ 2024-02-20 from/ 11:00 newd/ 2024-02-21
(shorthand for editAppt).T0123456A
), date (2024-02-20
) and start time (11:00
) criteria for the target appointment. The new date is parsed as (2024-02-21
).2024-02-21
).The following activity diagram summarizes what happens when a user executes an editAppt command:
Aspect: How to differentiate prefixes for target appointment and prefixes for new values:
Alternative 1 (current choice): Use the new
prefix in addition to the original prefixes.
Alternative 2: Edit appointments by a unique index.
The Find Appointment feature will involve parsing user input, executing search queries based on specified criteria, and presenting the results to the user.
The implementation will include the following key components:
fa i/T0123456A d/2024-03-23 from/11:00
(shorthand for findAppt).T0123456A
), date (2024-03-23
), and start time (11:00
) criteria for the search.The following activity diagram summarizes what happens when a user executes a findAppt command:
The Mark Appointment feature will involve parsing user input and marking the appointment as completed/ not completed.
The implementation will include the following key components:
NRIC
, DATE
, START_TIME
).mark i/T0123456A d/2024-02-20 from/11:00
.T0123456A
), date (2024-02-20
) and start time (11:00
) criteria for the target appointment.The following activity diagram summarizes what happens when a user executes a new command:
Target user profile:
Value proposition: manage patient appointments faster than a typical mouse/GUI driven app.
Priorities: High (must have) - * * *
, Medium (nice to have) - * *
, Low (unlikely to have) - *
Priority | As a … | I want to … | So that I can… |
---|---|---|---|
* * * | user | add a new patient | |
* * * | user | delete a patient | |
* * * | user | schedule an appointment for a patient | |
* * * | user | cancel an appointment | account for changes in scheduling |
* * * | user | have an overall view of upcoming patient appointments | have situational awareness of the schedule for the day |
* * * | user | mark patients who have been seen for the day | track patient's appointment attendance |
* * | user | update a patient's information | keep the database up to date |
* * | user | easily filter the patients by their medical records | see which is in need of more assistance or follow up care |
* * | user | search for patients by their name | look up their appointment information quickly |
* * | user | update the details of the appointment | reschedule appointments as needed |
* * | user | view the list of patients for the given date and/or time | see the schedule for a given time frame |
* * | user | tag appointments based on appointment type | I can categorize which appointments require test or room bookings |
* * | user | input commands without having inputs to be in a specific order | key in commands fast in busy periods |
** | user | prevent appointments from overlapping | ensure the patients have enough time to be seen for their different appointments |
** | user | quickly navigate the CLI with intuitive commands | increase my efficiency |
* | user | tag appointments based on insurance type | prepare necessary insurance documents before patient’s appointments |
* | user | sort the time to a patient's appointment | remind patients of their appointment |
* | user | see how long it has been since a patient's last appointment | remind patients to come for another checkup |
* | user | set notifications for upcoming appointments | staff and patients can be well informed early in advance |
* | user | track if the patients have been sent reminders on their appointments | patients do not get spammed with reminders |
* | user | be notified of upcoming appointments on entry into the system | will not miss approaching deadlines |
* | user | easily contact the patients via SMS or email through the program | update patients about their details and upcoming appointments |
* | user | check if patients are related to one another | have alternate contacts |
* | user | update or create new records in bulk | process a family more efficiently |
* | user | set recurring tasks | I do not have to keep scheduling recurring appointments |
* | user | retrieve past records or revert changes easily | revert my changes if I accidentally delete or wrongly edit a patient’s records |
* | user | select what information is available when I view the list of patients | cater the view to my needs |
* | user | add notes to a patient | include other additional information |
* | user | easily generate reports of the patient details and export it to the doctor/patient | have easy access |
Use case (UC1) : Add new patient information to the database
MSS
User requests to add new patient information.
CLInic adds the patient's information to the database.
Use case ends.
Extensions
1a. User gives incomplete or invalid patient details.
Use case resumes at step 1.
1b. User attempts to add a patient that already exists in CLInic.
Use case ends.
Use case (UC2) : Delete patient information from the database
MSS
User requests to delete patient information with a specified NRIC from the database.
CLInic deletes the patient and the corresponding appointments.
Use case ends.
Extensions
1a. User did not provide the NRIC or gives an invalid NRIC.
1a1. CLInic informs user of the error.
Use case resumes at step 1.
1b. User provides an NRIC that does not belong to any patient in the database.
1b1. CLInic informs user that no such patient exists.
Use case resumes at step 1.
Use case (UC3) : Edit patient information in the database
MSS
User requests to edit patient information with a specified NRIC.
CLInic edits patient information to the updated details.
Use case ends.
Extensions
1a. User does not provide any field to update.
1a1. CLInic informs user to provide at least one field.
Use case resumes at step 1.
1b. User gives invalid patient details.
1b1. CLInic informs user of the error.
Use case resumes at step 1.
1c. User provides an NRIC that does not belong to any patient in the database.
1c1. CLInic informs user that no such patient exists.
Use case ends.
Use case (UC4) : Find patient information in the database
MSS
User requests to find patient information by NRIC or by name.
CLInic displays all patients satisfying the search criteria.
Use case ends.
Extensions
1a. User does not provide any search criteria.
1a1. CLInic informs user to search by either NRIC or name.
Use case resumes at step 1.
1b. User provides both NRIC and name for search.
1b1. CLInic informs user to provide only one.
Use case resumes at step 1.
2a. User is currently on Day-View.
2a1. CLInic changes the view to Overall-View where the results will be shown.
Use case ends.
2b. There are no search results.
Use case ends.
Use case (UC5) : Schedule an appointment for a patient
MSS
User requests to add an appointment for a patient with a specified NRIC.
CLInic adds the appointment to the database.
Use case ends.
Extensions
1a. User gives incomplete or invalid appointment details.
1a1. CLInic informs user of the error.
Use case resumes at step 1.
1b. User provides an NRIC that does not belong to any patient in the database.
1b1. CLInic informs user that no such patient exists and appointment cannot be created.
Use case ends.
1c. User attempts to add an appointment that already exists in CLInic.
1c1. CLInic informs user that appointment with given details already exists.
Use case ends.
1d. User attempts to create an appointment that overlaps with another appointment for the same patient.
1d1. CLInic informs user of the error and shows user other possible time slots.
Use case resumes at step 1.
Use case (UC6) : Cancel an appointment
MSS
User requests to cancel an appointment for a patient with a specified NRIC.
CLInic deletes the appointment from the database.
Use case ends.
Extensions
1a. User gives incomplete or invalid appointment details.
1a1. CLInic informs user of the error.
Use case resumes at step 1.
1b. User gives an NRIC or appointment information that do not exist in the system.
1b1. CLInic informs user that no such patient or appointment exists.
Use case resumes at step 1.
Use case (UC7) : Edit an appointment
MSS
User requests to edit appointment information for a patient with a specified NRIC.
CLInic edit appointment information to the updated details.
Use case ends.
Extensions
1a. User does not provide any field to update.
1a1. CLInic informs user to provide at least one field.
Use case resumes at step 1.
1b. User gives incomplete or invalid appointment details.
1b1. CLInic informs user of the error.
Use case resumes at step 1.
1c. User gives an NRIC or appointment information that do not exist in the system.
1c1. CLInic informs user that no such patient or appointment exists.
Use case ends.
1d. User attempts to edit an appointment into a time that overlaps with another appointment for the same patient.
1d1. CLInic informs user of the error and shows user other possible time slots.
Use case resumes at step 1.
Use case (UC8) : Find appointment information in the database
MSS
User requests to find appointment information by NRIC, date and/or start time.
CLInic displays all appointments satisfying the search criteria.
Use case ends.
Extensions
1a. User does not provide any search criteria.
1a1. CLInic informs user to search by at least one field.
Use case resumes at step 1.
1b. User gives invalid NRIC, date or start time fields.
1b1. CLInic informs user of the error.
Use case resumes at step 1.
2a. User is currently on Day-View.
2a1. CLInic changes the view to Overall-View where the results will be shown.
Use case ends.
2b. There are no search results.
Use case ends.
Use case (UC9) : Mark / unmark an appointment
MSS
User requests to mark / unmark an appointment for a patient with a specified NRIC.
CLInic marks / unmarks the appointment as complete / incomplete.
Use case ends.
Extensions
1a. User gives incomplete or invalid appointment details.
1a1. CLInic informs user of the error.
Use case resumes at step 1.
1b. User gives an NRIC or appointment information that do not exist in the system.
1b1. CLInic informs user that no such patient or appointment exists.
Use case resumes at step 1.
Use case (UC10) : View all patients and appointments displayed in a concise format
MSS
User requests to view all patients and appointments.
CLInic shows a list of all appointments on that day.
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
Use case (UC11) : Switch between Overall-View and Day-View
MSS
User requests to change the view from Overall-View to Day-View or vice versa.
CLInic changes the view.
Use case ends.
Use case (UC12) : Clear all data in CLInic
MSS
User requests to clear all patient and appointment information in the database.
CLInic deletes all patients and appointment information.
Use case ends.
Use case (UC13) : Exiting CLInic
MSS
User requests to exit the application.
CLInic stops running and closes.
Use case ends.
Use case (UC14) : Getting help in CLInic
MSS
User requests for help.
CLInic provides a link to the User-Guide for the user's reference.
Use case ends.
11
or above installed.findAppt
, findPatient
or list
commands.Given below are instructions to test the app manually.
Note: These instructions only provide a starting point for testers to work on; testers are expected to do more exploratory testing.
Initial launch
Download the jar file and copy into an empty folder
Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
Saving window preferences
Resize the window to an optimum size. Move the window to a different location. Close the window.
Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
Adding a patient
Test case: addPatient i/T0123456A n/John Doe b/2001-05-02 p/98765432 e/johnd@example.com a/John street, block 123, #01-01
Expected: New patient with NRIC T0123456A is added. Details of the added patient is shown in the status message.
Command with invalid value: addPatient i/x ...
, ap i/T0123456A n/John Doe b/x ...
(where x is an invalid value for the parameter)
Expected: No patient is added. Error details shown in the status message.
Other incorrect commands to try: add
, addP
, ...
Expected: Similar to previous.
Adding a duplicate patient
Prerequisites: Completing the first test case for Adding a Patient.
Test case: addPatient i/T0123456A n/John Doe b/2001-05-02 p/98765432 e/johnd@example.com a/John street, block 123, #01-01
Expected: The error message This patient already exists in CLInic should be displayed in the status message.
Deleting a patient
Prerequisites: Have a patient with NRIC T0123456A in CLInic.
Test case: deletePatient i/T0123456A
Expected: Patient with corresponding NRIC T0123456A is removed. Details of the deleted patient is shown in the status message.
Test case: deletePatient i/T0123456
Expected: No patient is deleted. Error details shown in the status message.
Other incorrect commands to try: deletePatient
, deletePatient x
, ...
(where x is an invalid NRIC)
Expected: Similar to previous.
Editing a patient
Prerequisites: Have a patient with NRIC T0123456A in CLInic.
Test case: editPatient i/T0123456A newp/91234567 newe/johndoe@example.com
Expected: Patient with corresponding NRIC T0123456A is successfully edited. Details of the edited patient is shown in the status message.
Test case: editPatient i/T0123456A
Expected: No patient is edited. The error message At least one field to edit must be provided. should be displayed in the status message.
Test case: editPatient i/x ...
(where x is an invalid NRIC)
Expected: No patient is edited. Error details shown in the status message.
Other incorrect commands to try: edit
, editP
, ...
Expected: Similar to previous.
Finding a patient
Test case: findPatient n/John
Expected: Patients with name starting with 'John' are successfully listed.
Test case: findPatient i/T01
Expected: Patients with NRIC starting with 'T01' is successfully listed.
Test case: findPatient n/John i/T01
Expected: The error message Find by either NRIC or name, not both! should be displayed in the status message.
Other incorrect commands to try: fin
, find
, ...
Expected: Error details shown in the status message.
Adding an appointment
Prerequisites: Have a patient with NRIC T0123456A in CLInic.
Test case: addAppt i/T0123456A d/2024-05-20 from/11:00 to/11:30 t/Medical Check-up note/Routine check-in
Expected: New appointment for patient with NRIC T0123456A is added. Details of the added appointment is shown in the status message.
Test case : addAppt i/T0123456A d/2024-05-20 from/12:00 to/11:30 t/Medical Check-up note/Routine check-in
Expected: The error message End time of appointment cannot be earlier than start time. should be displayed in the status message.
Command with invalid value: addAppt i/x ...
, addAppt i/T0123456A d/x ...
(where x is an invalid value for the parameter)
Expected: No appointment is added. Error details shown in the status message.
Other incorrect commands to try: add
, addA
, ...
Expected: Similar to previous.
Add appointment that overlaps with existing appointment for the same patient.
Prerequisites: Have a patient with NRIC T0123456A in CLInic.
Test case: addAppt i/T0123456A d/2024-05-20 from/11:00 to/11:30 t/Medical Check-up note/Routine check-in
Expected: The error message New appointment overlaps with an existing appointment for the same patient should be displayed in the status message.
Deleting an appointment
Prerequisites: Have an appointment for a patient with NRIC T0123456A on 2024-05-20 from 11:00 in CLInic.
Test case: deleteAppt i/T0123456A d/2024-05-20 from/11:00
Expected: Appointment with appointment details specified is removed. Details of the deleted appointment is shown in the status message.
Test case : deleteAppt i/x d/x from/x
(where x is an invalid value for the parameter)
Expected: No appointment is deleted. Error details shown in the status message.
Other incorrect commands to try: delete
, deleteA
, ...
Expected: Similar to previous.
Editing an appointment
Prerequisites: Have an appointment for a patient with NRIC T0123456A on 2024-05-20 from 11:00 in CLInic.
Test case: editAppt i/T0123456A d/2024-05-20 from/11:00 newd/2024-05-21
Expected: Appointment with specified appointment details is successfully edited. Details of the edited appointment is shown in the status message.
Test case: editAppt i/T0123456A
Expected: No appointment is edited. The error message At least one field to edit must be provided. should be displayed in the status message.
Test case: editAppt i/x d/x from/x ...
(where x is an invalid value for the parameter)
Expected: No appointment is edited. Error details shown in the status message.
Other incorrect commands to try: edit
, editA
, ...
Expected: Similar to previous.
Edit appointment that overlaps with existing appointment for the same patient.
Prerequisites: Add two appointments with the following commands:
addAppt i/T0123456A d/2024-05-19 from/11:00 to/11:30 t/Medical Check-up note/Routine check-in
addAppt i/T0123456A d/2024-05-20 from/11:00 to/11:30 t/Medical Check-up note/Routine check-in
Test case: editAppt i/T0123456A d/2024-05-19 from/11:00 newd/2024-05-20
Expected: The error message Edited appointment information overlaps with an existing appointment for the same patient should be displayed in the status message.
Finding an appointment while all appointments are being shown
Test case: findAppt i/T0123456A
Expected: Appointments for patient with NRIC 'T0123456A' are successfully listed.
Test case: findAppt d/2024-05-20
Expected: Appointments on the date '2024-05-20' are successfully listed.
Test case: findAppt from/11:00
Expected: Appointments starting on or after 11:00 on any date are successfully listed.
Other incorrect delete commands to try: fin
, find
, ...
Expected: Error details shown in the status message.
Finding an appointment while on Day-View
Prerequisites: Have an appointment with the specified details i/T0123456A d/2024-05-20 from/11:00
in CLInic.
Test case: findAppt i/T0123456A
Expected: A switchView will occur to switch to Overall-View.
Appointments for patient with NRIC 'T0123456A' are successfully listed.
Marking an appointment
Prerequisites: Have an appointment with the specified details i/T0123456A d/2024-05-20 from/11:00
in CLInic.
Test case: mark i/T0123456A d/2024-05-20 from/11:00
Expected: Appointment with appointment details specified is marked. Details of the marked appointment is shown in the status message.
Test case : mark i/x d/x from/x
(where x is an invalid value for the parameter)
Expected: No appointment is marked. Error details shown in the status message.
Other incorrect commands to try: m
, markAppointment
, ...
Expected: Similar to previous.
Unmarking an appointment
Prerequisites: Have an appointment with the specified details i/T0123456A d/2024-05-20 from/11:00
in CLInic.
Test case: unmark i/T0123456A d/2024-05-20 from/11:00
Expected: Appointment with appointment details specified is unmarked. Details of the unmarked appointment is shown in the status message.
Test case : unmark i/x d/x from/x
(where x is an invalid value for the parameter)
Expected: No appointment is unmarked. Error details shown in the status message.
Other incorrect commands to try: um
, unmarkAppointment
, ...
Expected: Similar to previous.
Dealing with missing data files
Delete CLInic.json within the data folder where your jar file is located. data/CLInic.json
Launch CLInic.
Expected: CLInic should display a list with sample data.
Dealing with corrupted data files
Fields in CLInic.json are modified to become invalid. E.g change date field to null.
Launch CLInic.
Expected: CLInic displays an empty list with warnings sent in the console.
Team size: 5
Current Issues: CLInic currently restricts a patient's ID to be a Singaporean NRIC or FIN number, restricts a patient's phone number to be a Singaporean phone number with 8 digits and is not compatible with long foreign names exceeding 55 characters.
Planned Enhancement: We plan to accommodate passport numbers, foreign phone numbers and longer patient names in the system. However, to do this, we need more research into how we can give less restriction but yet validate the fields accordingly to prevent erroneous data entries.
For example, we could consider including the nationality of the patient and validating based on that, or perhaps giving a warning to the user to take note of these details.
Current Issues: CLInic currently restricts addresses, tags, notes, etc to have less than some number of characters. E.g. Address should have less than 60 characters. We have received tester feedback that these constraints could be very limiting, especially for long addresses.
Planned Enhancement: We plan to broaden restrictions on character limits, especially on address, to accommodate longer inputs. However, we will need to ensure that these entries can be viewed on the user interface with no issues. To do so, we could consider using
wrapping or other UI capabilities.
Current Issues: CLInic is currently case-sensitive for command and NRIC input.
Planned Enhancement: To support faster typing, we plan to allow for ID input to be not case-sensitive in future iterations. Also, for commands to be case-insensitive, e.g. deletePatient
should work as well.
Current Issues: The current restrictions for names do not allow for special characters, such as in "S/O" or "D/O". Although the workaround such as "SO" and "DO" exists, we hope to accommodate such names in the future.
Planned Enhancement: We plan to account for this by removing strict restrictions of no special characters, but rather allow exceptional symbols that may be used in names.
Current Issues: CLInic does not support NRIC validation in line with Singapore's NRIC checksum algorithms. This means that there are no checks for invalid starting alphabets, or checks to ensure that the start of the NRIC is in line with the DOB given.
Planned Enhancement: As we work towards building stronger NRIC validation, we plan to first validate this for patients born after 01/01/1968, which was when this synchronisation was implemented as seen here. Afterwards, we will need to conduct more research into the algorithms available to check if an NRIC is valid or not.
Current Issues: CLInic is currently catered towards day clinics that work regular hours. Therefore, adding overnight appointments is not possible. Furthermore, the "today" in Day-View is taken to be the date at which the application was launched, CLInic will not auto-sync at 12am going into a new day.
Planned Enhancement: We plan to make the feature for adding and editing appointments to allow for a start date, start time, end date and end time. Along with this, day-view will be updated to show live appointments that start on the current date or spans the current date as well.
Current Issues: Currently, an appointment remains marked even if it is edited to a future time.
Planned Enhancement: We plan to automatically unmark an appointment when it is moved to a future time and inform the user accordingly. This is to accommodate for the intuitive understanding that future appointments should be likely unmarked by default.
Current Issues: Currently, CLInic does not flag edits that give the exact same details as before or flag marks that attempt to mark an already marked appointment.
Planned Enhancement: We plan to handle this as an error in the future, such that you will not mistakenly believe an edit had been made even if it hadn't. We could consider a warning given to the user to inform them that they have inputted
the same details as the current appointment.
Current Issues: Currently, using the help
command opens up a pop-up which requires the user to use the mouse and navigate to the user guide link to see the commands available.
Planned Enhancement: We plan to include an in-built help message to orientate the user to the list of commands available without needing to navigate to external links. A simple list of commands could be provided in the command feedback within CLInic instead.
Current Issues: Currently, the dummy data that is loaded when a user first uses CLInic only contains patients. Furthermore, patients are tagged with relationship-related tags such as "family" and "friends" which do not fit the intended use case of tags (medical allergies).
Planned Enhancement: We plan to include a wider variety of dummy data, including some sample appointments. This should also include having patients tagged with medical allergies as that is one of the main scenarios we intended for tags to be used for.
AB3 only deals with one entity type, Person
, or Patient
as refactored in CLInic.
In building onto AB3 to develop CLInic, we needed to implement a new module, Appointment
which has a many-to-one relationship with a Patient
.
This brought about new logic, commands and other improvements that were developed.
Overall, the main effort in the development process went towards:
Building the model.appointment
package
Appointment
with other classes, such as AddressBook
, so that they be managed and stored.Appointment
classes were designed to be similar to Patient
classes to allow for easy maintenance.Adapting the existing Person
module into Patient
Person
to Patient
to standardise terminologies.model.patient
package with NRIC
compatibility.Adding new features to suit the new adapted use case
addAppt
, findAppt
, markAppt
, etc to allow efficient management of patients and their appointments.add
and edit
to addPatient
, editPatient
respectively and ensuring NRIC
compatibility.Adding JUnit tests for new and existing features and packages
User interface improvements to support efficient management of patient and appointments
Documentation improvements