From ef3d689b1548fadced2dced0c98b9d6b4dcdbcf5 Mon Sep 17 00:00:00 2001 From: Wen Yee <141599443+chwenyee@users.noreply.github.com> Date: Fri, 21 Feb 2025 08:36:41 +0800 Subject: [PATCH 001/203] Update README.md for Tutorial Week 6 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3d0bded12..717729cbc8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Duke project template +# CLI-Based Clinic Management System This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. From d3cc79f73aaf9a23b50be80670e9c0377d7fa84a Mon Sep 17 00:00:00 2001 From: Wen Yee <141599443+chwenyee@users.noreply.github.com> Date: Fri, 21 Feb 2025 12:39:00 +0800 Subject: [PATCH 002/203] Update README.md title --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 717729cbc8..b6d564ce16 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# CLI-Based Clinic Management System +# ClinicEase This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. From 406aa83c52698e5d08b2cb55d373029ab465dba2 Mon Sep 17 00:00:00 2001 From: judHoka Date: Thu, 6 Mar 2025 11:18:18 +0800 Subject: [PATCH 003/203] Updated the docs file, fill in credentials --- docs/AboutUs.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..a9f132ec83 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -2,8 +2,4 @@ Display | Name | Github Profile | Portfolio --------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | Judha Hoka Wishika | [GitHub](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | [Portfolio](https://www.linkedin.com/in/judha-hoka-wishika-13b567233/) \ No newline at end of file From 7db3cdce4b66fa433cb42be82079cf993bd437f7 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Thu, 6 Mar 2025 11:22:01 +0800 Subject: [PATCH 004/203] Updated AboutUs.md page --- docs/AboutUs.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..f09a998dc7 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,6 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:------------:|:--------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Chan Wen Yee | [Github](https://github.com/chwenyee) | [Portfolio](chwenyee) + From 9bbe76515b717770f1ff0b927f6d697d0e0aca1a Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Thu, 6 Mar 2025 11:24:37 +0800 Subject: [PATCH 005/203] changed AboutUs - dylan --- docs/AboutUs.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..10535462bc 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,5 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:----------:|:--------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Dylan Chua | [https://github.com/dylancmznus](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 526d16db156f4300520ea71c0bfc5308d8794e5a Mon Sep 17 00:00:00 2001 From: yukuan Date: Thu, 6 Mar 2025 11:30:38 +0800 Subject: [PATCH 006/203] yukuan's personal info --- docs/AboutUs.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..1c97f00c43 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,5 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:------:|:--------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Yukuan | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From ebe96f7fb25e97338850b6ff64961d510e6fd064 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Thu, 6 Mar 2025 11:48:22 +0800 Subject: [PATCH 007/203] Update About Me section with latest details --- docs/AboutUs.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..6001d17033 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,5 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:-------------------:|:----------------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Basudeb Chakraborty | [Github](https://github.com/Basudeb2005) | [Portfolio](docs/team/johndoe.md) From 2ae9b1a31313785330f8305ab90ce5e4ca0235c9 Mon Sep 17 00:00:00 2001 From: judHoka Date: Mon, 17 Mar 2025 00:41:56 +0800 Subject: [PATCH 008/203] Created unfinished add and delete features, have to add parser to finish, refer to code for details --- src/main/java/ClinicEase.java | 17 ++++++++++++++ src/main/java/ManagementSystem.java | 35 +++++++++++++++++++++++++++++ src/main/java/Patient.java | 33 +++++++++++++++++++++++++++ src/main/java/seedu/duke/Duke.java | 21 ----------------- 4 files changed, 85 insertions(+), 21 deletions(-) create mode 100644 src/main/java/ClinicEase.java create mode 100644 src/main/java/ManagementSystem.java create mode 100644 src/main/java/Patient.java delete mode 100644 src/main/java/seedu/duke/Duke.java diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java new file mode 100644 index 0000000000..c265ecca75 --- /dev/null +++ b/src/main/java/ClinicEase.java @@ -0,0 +1,17 @@ +import java.util.Scanner; + +public class ClinicEase { + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + String line = in.nextLine(); + + ManagementSystem manager = new ManagementSystem(); + + if(line.startsWith("add")){ + manager.addPatient(line); + } + if(line.startsWith("delete")) { + manager.deletePatient(line); + } + } +} diff --git a/src/main/java/ManagementSystem.java b/src/main/java/ManagementSystem.java new file mode 100644 index 0000000000..05ba6ed578 --- /dev/null +++ b/src/main/java/ManagementSystem.java @@ -0,0 +1,35 @@ +import java.util.HashMap; +import java.util.Map; + +class ManagementSystem { + private Map patients; + + public ManagementSystem() { + patients = new HashMap<>(); + } + + public void addPatient(String line) { + // Parse the line first, which will return an array of Strings + // Output should be {id, name, dob, gender, address, contactInfo} + // String [] details = new String[6]; + + // if (patients.containsKey(details[0]) { + // System.out.println("Patient ID already exists!"); + // return; + // } + + // Patient newPatient = new Patient(id, name, dob, gender, address, contactInfo); + // patients.put(details[0], newPatient); + // System.out.println("Patient added: " + name); + + // If parser has been correctly implemented, delete comments and remove slashes from processes + } + + public void deletePatient(String id) { + if (patients.remove(id) != null) { + System.out.println("Patient removed successfully."); + } else { + System.out.println("Patient not found."); + } + } +} diff --git a/src/main/java/Patient.java b/src/main/java/Patient.java new file mode 100644 index 0000000000..06e4c01646 --- /dev/null +++ b/src/main/java/Patient.java @@ -0,0 +1,33 @@ +import java.util.ArrayList; +import java.util.List; + +class Patient { + private String id; + private String name; + private String dob; + private String contactInfo; + private String gender; + private String address; + private List medicalHistory; + + public Patient(String id, String name, String dob, String gender, String address, String contactInfo) { + this.id = id; + this.name = name; + this.dob = dob; + this.gender = gender; + this.address = address; + this.contactInfo = contactInfo; + this.medicalHistory = new ArrayList<>(); + } + + public String getId() { return id; } + public String getName() { return name; } + public String getDob() { return dob; } + public String getContactInfo() { return contactInfo; } + public List getMedicalHistory() { return medicalHistory; } + + @Override + public String toString() { + return "Patient ID: " + id + ", Name: " + name + ", Date of Birth: " + dob + ", Contact: " + contactInfo; + } +} diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java deleted file mode 100644 index 5c74e68d59..0000000000 --- a/src/main/java/seedu/duke/Duke.java +++ /dev/null @@ -1,21 +0,0 @@ -package seedu.duke; - -import java.util.Scanner; - -public class Duke { - /** - * Main entry-point for the java.duke.Duke application. - */ - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("What is your name?"); - - Scanner in = new Scanner(System.in); - System.out.println("Hello " + in.nextLine()); - } -} From c176f1c5168841639c92497bc9169db5310a271d Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Mon, 17 Mar 2025 13:32:24 +0800 Subject: [PATCH 009/203] Add OOP Using Parser,UI,Storage etc --- src/main/java/Appointment.java | 41 +++++++++++++++ src/main/java/ClinicEase.java | 54 ++++++++++++++++---- src/main/java/ManagementSystem.java | 57 ++++++++++++--------- src/main/java/Parser.java | 77 +++++++++++++++++++++++++++++ src/main/java/Ui.java | 27 ++++++++++ 5 files changed, 222 insertions(+), 34 deletions(-) create mode 100644 src/main/java/Appointment.java create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Appointment.java b/src/main/java/Appointment.java new file mode 100644 index 0000000000..85ae991b1e --- /dev/null +++ b/src/main/java/Appointment.java @@ -0,0 +1,41 @@ +public class Appointment { + private static int runningId = 100; + private String id; + private String nric; + private String date; + private String time; + private String description; + + public Appointment(String nric, String date, String time, String description) { + this.id = "A" + runningId++; + this.nric = nric; + this.date = date; + this.time = time; + this.description = description; + } + + public String getId() { + return id; + } + + public String getNric() { + return nric; + } + + public String getDate() { + return date; + } + + public String getTime() { + return time; + } + + public String getDescription() { + return description; + } + + @Override + public String toString() { + return "[" + id + "] - " + nric + " - " + date + " " + time + " - " + description; + } +} diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index c265ecca75..de60ef768f 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,17 +1,51 @@ -import java.util.Scanner; - public class ClinicEase { public static void main(String[] args) { - Scanner in = new Scanner(System.in); - String line = in.nextLine(); - ManagementSystem manager = new ManagementSystem(); + Ui ui = new Ui(); + ui.showWelcome(); - if(line.startsWith("add")){ - manager.addPatient(line); - } - if(line.startsWith("delete")) { - manager.deletePatient(line); + boolean running = true; + while (running) { + String input = ui.readCommand(); + + if (Parser.isBye(input)) { + ui.showBye(); + running = false; + } + else if (Parser.isAddAppointment(input)) { + String[] details = Parser.parseAddAppointment(input); + if (details == null) { + System.out.println("Invalid format. Use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); + } else { + manager.addAppointment(details); + } + } + else if (Parser.isDeleteAppointment(input)) { + String apptId = Parser.parseDeleteAppointment(input); + if (apptId == null) { + System.out.println("Invalid format. Use: delete-appointment APPOINTMENT_ID"); + } else { + manager.deleteAppointment(apptId); + } + } + else if (Parser.isListAppointments(input)) { + manager.listAppointments(); + } + else if (Parser.isAddPatient(input)) { + System.out.println("Feature not implemented yet."); + } + else if (Parser.isDeletePatient(input)) { + System.out.println("Feature not implemented yet."); + } + else if (Parser.isViewPatient(input)) { + System.out.println("Feature not implemented yet."); + } + else if (Parser.isViewHistory(input)) { + System.out.println("Feature not implemented yet."); + } + else { + System.out.println("Unknown command."); + } } } } diff --git a/src/main/java/ManagementSystem.java b/src/main/java/ManagementSystem.java index 05ba6ed578..a1c1db76a6 100644 --- a/src/main/java/ManagementSystem.java +++ b/src/main/java/ManagementSystem.java @@ -1,35 +1,44 @@ -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; -class ManagementSystem { - private Map patients; +public class ManagementSystem { + private List appointments; public ManagementSystem() { - patients = new HashMap<>(); + appointments = new ArrayList<>(); } - public void addPatient(String line) { - // Parse the line first, which will return an array of Strings - // Output should be {id, name, dob, gender, address, contactInfo} - // String [] details = new String[6]; - - // if (patients.containsKey(details[0]) { - // System.out.println("Patient ID already exists!"); - // return; - // } - - // Patient newPatient = new Patient(id, name, dob, gender, address, contactInfo); - // patients.put(details[0], newPatient); - // System.out.println("Patient added: " + name); + public void addAppointment(String[] details) { + String nric = details[0]; + String date = details[1]; + String time = details[2]; + String desc = details[3]; + Appointment appt = new Appointment(nric, date, time, desc); + appointments.add(appt); + System.out.println("Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); + } - // If parser has been correctly implemented, delete comments and remove slashes from processes + public void deleteAppointment(String apptId) { + for (int i = 0; i < appointments.size(); i++) { + if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { + appointments.remove(i); + System.out.println("Appointment " + apptId + " is deleted successfully."); + return; + } + } + System.out.println("No appointment found with ID " + apptId + "."); } - public void deletePatient(String id) { - if (patients.remove(id) != null) { - System.out.println("Patient removed successfully."); - } else { - System.out.println("Patient not found."); + public void listAppointments() { + if (appointments.isEmpty()) { + System.out.println("No appointments found."); + return; + } + System.out.println("Appointments:"); + int count = 1; + for (Appointment a : appointments) { + System.out.println(count + ". " + a.toString()); + count++; } } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..227bff3b60 --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,77 @@ +public class Parser { + public static boolean isBye(String input) { + return input.equalsIgnoreCase("bye"); + } + + public static boolean isAddPatient(String input) { + return input.toLowerCase().startsWith("add-patient"); + } + + public static boolean isDeletePatient(String input) { + return input.toLowerCase().startsWith("delete-patient"); + } + + public static boolean isViewPatient(String input) { + return input.toLowerCase().startsWith("view-patient"); + } + + public static boolean isViewHistory(String input) { + return input.toLowerCase().startsWith("view-history"); + } + + public static boolean isAddAppointment(String input) { + return input.toLowerCase().startsWith("add-appointment"); + } + + public static boolean isDeleteAppointment(String input) { + return input.toLowerCase().startsWith("delete-appointment"); + } + + public static boolean isListAppointments(String input) { + return input.toLowerCase().equals("list-appointments"); + } + + public static String[] parseAddAppointment(String input) { + String temp = input.replaceFirst("(?i)add-appointment\\s*", ""); + String nric = extractValue(temp, "ic/"); + String date = extractValue(temp, "dt/"); + String time = extractValue(temp, "t/"); + String desc = extractValue(temp, "dsc/"); + if (nric == null || date == null || time == null || desc == null) { + return null; + } + return new String[]{nric.trim(), date.trim(), time.trim(), desc.trim()}; + } + + public static String parseDeleteAppointment(String input) { + String temp = input.replaceFirst("(?i)delete-appointment\\s*", ""); + return temp.isBlank() ? null : temp.trim(); + } + + // For placeholder commands + public static String parseDeletePatient(String input) { + return input.replaceFirst("(?i)delete-patient\\s*", "").trim(); + } + public static String parseViewPatient(String input) { + return input.replaceFirst("(?i)view-patient\\s*", "").trim(); + } + public static String parseViewHistory(String input) { + return input.replaceFirst("(?i)view-history\\s*", "").trim(); + } + + private static String extractValue(String input, String prefix) { + int start = input.toLowerCase().indexOf(prefix.toLowerCase()); + if (start < 0) return null; + start += prefix.length(); + String[] possible = {"ic/", "dt/", "t/", "dsc/"}; + int end = input.length(); + for (String p : possible) { + if (p.equalsIgnoreCase(prefix)) continue; + int idx = input.toLowerCase().indexOf(p.toLowerCase(), start); + if (idx >= 0 && idx < end) { + end = idx; + } + } + return input.substring(start, end).trim(); + } +} diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..7b948bcf13 --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,27 @@ +import java.util.Scanner; + +public class Ui { + private Scanner sc; + + public Ui() { + sc = new Scanner(System.in); + } + + public void showWelcome() { + System.out.println("===================================================="); + System.out.println("Welcome to Clinic Management v1!"); + System.out.println("Type a command, or 'bye' to exit."); + System.out.println("===================================================="); + } + + public void showBye() { + System.out.println("===================================================="); + System.out.println("Goodbye!"); + System.out.println("===================================================="); + } + + public String readCommand() { + System.out.print("> "); + return sc.nextLine().trim(); + } +} From 3ea6983b469731b44ccd4d26ca3dda36bdfbd953 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Mon, 17 Mar 2025 14:39:39 +0800 Subject: [PATCH 010/203] Fix Syntax Issues --- src/main/java/Appointment.java | 10 ++++---- src/main/java/ClinicEase.java | 24 ++++++----------- src/main/java/ManagementSystem.java | 4 +-- src/main/java/Parser.java | 13 +++++++--- src/main/java/Patient.java | 40 +++++++++++++++++++---------- src/main/java/Ui.java | 2 +- 6 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/main/java/Appointment.java b/src/main/java/Appointment.java index 85ae991b1e..016e3ed41a 100644 --- a/src/main/java/Appointment.java +++ b/src/main/java/Appointment.java @@ -1,10 +1,10 @@ public class Appointment { private static int runningId = 100; - private String id; - private String nric; - private String date; - private String time; - private String description; + private final String id; + private final String nric; + private final String date; + private final String time; + private final String description; public Appointment(String nric, String date, String time, String description) { this.id = "A" + runningId++; diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index de60ef768f..2d02099644 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -11,39 +11,31 @@ public static void main(String[] args) { if (Parser.isBye(input)) { ui.showBye(); running = false; - } - else if (Parser.isAddAppointment(input)) { + } else if (Parser.isAddAppointment(input)) { String[] details = Parser.parseAddAppointment(input); if (details == null) { System.out.println("Invalid format. Use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); } else { manager.addAppointment(details); } - } - else if (Parser.isDeleteAppointment(input)) { + } else if (Parser.isDeleteAppointment(input)) { String apptId = Parser.parseDeleteAppointment(input); if (apptId == null) { System.out.println("Invalid format. Use: delete-appointment APPOINTMENT_ID"); } else { manager.deleteAppointment(apptId); } - } - else if (Parser.isListAppointments(input)) { + } else if (Parser.isListAppointments(input)) { manager.listAppointments(); - } - else if (Parser.isAddPatient(input)) { + } else if (Parser.isAddPatient(input)) { System.out.println("Feature not implemented yet."); - } - else if (Parser.isDeletePatient(input)) { + } else if (Parser.isDeletePatient(input)) { System.out.println("Feature not implemented yet."); - } - else if (Parser.isViewPatient(input)) { + } else if (Parser.isViewPatient(input)) { System.out.println("Feature not implemented yet."); - } - else if (Parser.isViewHistory(input)) { + } else if (Parser.isViewHistory(input)) { System.out.println("Feature not implemented yet."); - } - else { + } else { System.out.println("Unknown command."); } } diff --git a/src/main/java/ManagementSystem.java b/src/main/java/ManagementSystem.java index a1c1db76a6..81dc51f9ef 100644 --- a/src/main/java/ManagementSystem.java +++ b/src/main/java/ManagementSystem.java @@ -2,7 +2,7 @@ import java.util.List; public class ManagementSystem { - private List appointments; + private final List appointments; public ManagementSystem() { appointments = new ArrayList<>(); @@ -37,7 +37,7 @@ public void listAppointments() { System.out.println("Appointments:"); int count = 1; for (Appointment a : appointments) { - System.out.println(count + ". " + a.toString()); + System.out.println(count + ". " + a); count++; } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 227bff3b60..ad1bd5bc62 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -28,7 +28,7 @@ public static boolean isDeleteAppointment(String input) { } public static boolean isListAppointments(String input) { - return input.toLowerCase().equals("list-appointments"); + return input.equalsIgnoreCase("list-appointments"); } public static String[] parseAddAppointment(String input) { @@ -48,25 +48,30 @@ public static String parseDeleteAppointment(String input) { return temp.isBlank() ? null : temp.trim(); } - // For placeholder commands public static String parseDeletePatient(String input) { return input.replaceFirst("(?i)delete-patient\\s*", "").trim(); } + public static String parseViewPatient(String input) { return input.replaceFirst("(?i)view-patient\\s*", "").trim(); } + public static String parseViewHistory(String input) { return input.replaceFirst("(?i)view-history\\s*", "").trim(); } private static String extractValue(String input, String prefix) { int start = input.toLowerCase().indexOf(prefix.toLowerCase()); - if (start < 0) return null; + if (start < 0) { + return null; + } start += prefix.length(); String[] possible = {"ic/", "dt/", "t/", "dsc/"}; int end = input.length(); for (String p : possible) { - if (p.equalsIgnoreCase(prefix)) continue; + if (p.equalsIgnoreCase(prefix)) { + continue; + } int idx = input.toLowerCase().indexOf(p.toLowerCase(), start); if (idx >= 0 && idx < end) { end = idx; diff --git a/src/main/java/Patient.java b/src/main/java/Patient.java index 06e4c01646..7240e2b222 100644 --- a/src/main/java/Patient.java +++ b/src/main/java/Patient.java @@ -1,14 +1,14 @@ import java.util.ArrayList; import java.util.List; -class Patient { - private String id; - private String name; - private String dob; - private String contactInfo; - private String gender; - private String address; - private List medicalHistory; +public class Patient { + private final String id; + private final String name; + private final String dob; + private final String contactInfo; + private final String gender; + private final String address; + private final List medicalHistory; public Patient(String id, String name, String dob, String gender, String address, String contactInfo) { this.id = id; @@ -20,11 +20,25 @@ public Patient(String id, String name, String dob, String gender, String address this.medicalHistory = new ArrayList<>(); } - public String getId() { return id; } - public String getName() { return name; } - public String getDob() { return dob; } - public String getContactInfo() { return contactInfo; } - public List getMedicalHistory() { return medicalHistory; } + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDob() { + return dob; + } + + public String getContactInfo() { + return contactInfo; + } + + public List getMedicalHistory() { + return medicalHistory; + } @Override public String toString() { diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 7b948bcf13..2c9f2a9c3c 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -1,7 +1,7 @@ import java.util.Scanner; public class Ui { - private Scanner sc; + private final Scanner sc; public Ui() { sc = new Scanner(System.in); From b760ef1de9a060573275592deced31866b40a41e Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 00:02:00 +0800 Subject: [PATCH 011/203] Combined appointment and patient add and delete, added JUnit as well --- src/main/java/ClinicEase.java | 14 ++- .../java/{ => MainFunction}/Appointment.java | 2 + .../java/MainFunction/ManagementSystem.java | 102 ++++++++++++++++++ src/main/java/{ => MainFunction}/Patient.java | 27 ++--- src/main/java/ManagementSystem.java | 44 -------- src/main/java/{ => Misc}/Parser.java | 26 +++-- src/main/java/{ => Misc}/Ui.java | 2 + src/test/java/clinicease_test/Testing.java | 18 ++++ src/test/java/seedu/duke/DukeTest.java | 12 --- text-ui-test/EXPECTED.TXT | 39 +++++-- text-ui-test/input.txt | 7 +- 11 files changed, 197 insertions(+), 96 deletions(-) rename src/main/java/{ => MainFunction}/Appointment.java (97%) create mode 100644 src/main/java/MainFunction/ManagementSystem.java rename src/main/java/{ => MainFunction}/Patient.java (62%) delete mode 100644 src/main/java/ManagementSystem.java rename src/main/java/{ => Misc}/Parser.java (73%) rename src/main/java/{ => Misc}/Ui.java (98%) create mode 100644 src/test/java/clinicease_test/Testing.java delete mode 100644 src/test/java/seedu/duke/DukeTest.java diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 2d02099644..b3b5e5c744 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,9 +1,14 @@ +import MainFunction.ManagementSystem; +import Misc.Parser; +import Misc.Ui; + public class ClinicEase { public static void main(String[] args) { ManagementSystem manager = new ManagementSystem(); Ui ui = new Ui(); ui.showWelcome(); + boolean running = true; while (running) { String input = ui.readCommand(); @@ -28,10 +33,13 @@ public static void main(String[] args) { } else if (Parser.isListAppointments(input)) { manager.listAppointments(); } else if (Parser.isAddPatient(input)) { - System.out.println("Feature not implemented yet."); + manager.addPatient(input); } else if (Parser.isDeletePatient(input)) { - System.out.println("Feature not implemented yet."); - } else if (Parser.isViewPatient(input)) { + manager.deletePatient(input); + } else if (Parser.isListPatient(input)){ + manager.listPatients(); + } + else if (Parser.isViewPatient(input)) { System.out.println("Feature not implemented yet."); } else if (Parser.isViewHistory(input)) { System.out.println("Feature not implemented yet."); diff --git a/src/main/java/Appointment.java b/src/main/java/MainFunction/Appointment.java similarity index 97% rename from src/main/java/Appointment.java rename to src/main/java/MainFunction/Appointment.java index 016e3ed41a..6ea8e96e7b 100644 --- a/src/main/java/Appointment.java +++ b/src/main/java/MainFunction/Appointment.java @@ -1,3 +1,5 @@ +package MainFunction; + public class Appointment { private static int runningId = 100; private final String id; diff --git a/src/main/java/MainFunction/ManagementSystem.java b/src/main/java/MainFunction/ManagementSystem.java new file mode 100644 index 0000000000..3aa678b5b5 --- /dev/null +++ b/src/main/java/MainFunction/ManagementSystem.java @@ -0,0 +1,102 @@ +package MainFunction; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import Misc.Parser; + +public class ManagementSystem { + private final Map patients; + private final List appointments; + + public ManagementSystem() { + patients = new HashMap<>(); + appointments = new ArrayList<>(); + } + + public Map getPatient() { + return patients; + } + + public void addPatient(String line) { + String [] details = Parser.parseAddPatient(line); + + if (details == null){ + System.out.println("Patients details is incomplete!"); + return; + } + + else if (patients.containsKey(details[0])) { + System.out.println("MainFunction.Patient ID already exists!"); + return; + } + + Patient newPatient = new Patient(details[0], details[1], details[2], details[3], details[4], details[5]); + patients.put(details[0], newPatient); + System.out.println("MainFunction.Patient added: " + details[1]); + } + + public void deletePatient(String line) { + String nric = line.substring(15); + if (nric == null || nric.isBlank()) { + System.out.println("Invalid NRIC provided."); + return; + } + + if (patients.containsKey(nric)) { + Patient removedPatient = patients.remove(nric); + System.out.println("MainFunction.Patient removed successfully: " + removedPatient.getName() + " (NRIC: " + nric + ")"); + } else { + System.out.println("Error: MainFunction.Patient with NRIC " + nric + " not found."); + } + } + + public void listPatients() { + if (patients.isEmpty()) { + System.out.println("No patients have been added."); + return; + } + System.out.println("===== MainFunction.Patient List ====="); + int count = 1; + for (Patient p : patients.values()) { + System.out.println(count + ". " + p); + System.out.println("-----------------------"); + count++; + } + } + + public void addAppointment(String[] details) { + String nric = details[0]; + String date = details[1]; + String time = details[2]; + String desc = details[3]; + Appointment appt = new Appointment(nric, date, time, desc); + appointments.add(appt); + System.out.println("MainFunction.Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); + } + + public void deleteAppointment(String apptId) { + for (int i = 0; i < appointments.size(); i++) { + if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { + appointments.remove(i); + System.out.println("MainFunction.Appointment " + apptId + " is deleted successfully."); + return; + } + } + System.out.println("No appointment found with ID " + apptId + "."); + } + + public void listAppointments() { + if (appointments.isEmpty()) { + System.out.println("No appointments found."); + return; + } + System.out.println("Appointments:"); + int count = 1; + for (Appointment a : appointments) { + System.out.println(count + ". " + a); + count++; + } + } +} diff --git a/src/main/java/Patient.java b/src/main/java/MainFunction/Patient.java similarity index 62% rename from src/main/java/Patient.java rename to src/main/java/MainFunction/Patient.java index 7240e2b222..b0fa555bf1 100644 --- a/src/main/java/Patient.java +++ b/src/main/java/MainFunction/Patient.java @@ -1,3 +1,5 @@ +package MainFunction; + import java.util.ArrayList; import java.util.List; @@ -20,28 +22,13 @@ public Patient(String id, String name, String dob, String gender, String address this.medicalHistory = new ArrayList<>(); } - public String getId() { - return id; - } - - public String getName() { - return name; - } - - public String getDob() { - return dob; - } - - public String getContactInfo() { - return contactInfo; - } - - public List getMedicalHistory() { - return medicalHistory; - } + public String getName() {return name;} @Override public String toString() { - return "Patient ID: " + id + ", Name: " + name + ", Date of Birth: " + dob + ", Contact: " + contactInfo; + return String.format( + "MainFunction.Patient ID: %s\n Name: %s\n Date of Birth: %s\n Gender: %s\n Address: %s\n Contact: %s", + id, name, dob, gender, address, contactInfo + ); } } diff --git a/src/main/java/ManagementSystem.java b/src/main/java/ManagementSystem.java deleted file mode 100644 index 81dc51f9ef..0000000000 --- a/src/main/java/ManagementSystem.java +++ /dev/null @@ -1,44 +0,0 @@ -import java.util.ArrayList; -import java.util.List; - -public class ManagementSystem { - private final List appointments; - - public ManagementSystem() { - appointments = new ArrayList<>(); - } - - public void addAppointment(String[] details) { - String nric = details[0]; - String date = details[1]; - String time = details[2]; - String desc = details[3]; - Appointment appt = new Appointment(nric, date, time, desc); - appointments.add(appt); - System.out.println("Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); - } - - public void deleteAppointment(String apptId) { - for (int i = 0; i < appointments.size(); i++) { - if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { - appointments.remove(i); - System.out.println("Appointment " + apptId + " is deleted successfully."); - return; - } - } - System.out.println("No appointment found with ID " + apptId + "."); - } - - public void listAppointments() { - if (appointments.isEmpty()) { - System.out.println("No appointments found."); - return; - } - System.out.println("Appointments:"); - int count = 1; - for (Appointment a : appointments) { - System.out.println(count + ". " + a); - count++; - } - } -} diff --git a/src/main/java/Parser.java b/src/main/java/Misc/Parser.java similarity index 73% rename from src/main/java/Parser.java rename to src/main/java/Misc/Parser.java index ad1bd5bc62..4ca78fc0c3 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Misc/Parser.java @@ -1,3 +1,5 @@ +package Misc; + public class Parser { public static boolean isBye(String input) { return input.equalsIgnoreCase("bye"); @@ -15,6 +17,10 @@ public static boolean isViewPatient(String input) { return input.toLowerCase().startsWith("view-patient"); } + public static boolean isListPatient(String input) { + return input.toLowerCase().startsWith("list-patient"); + } + public static boolean isViewHistory(String input) { return input.toLowerCase().startsWith("view-history"); } @@ -48,12 +54,18 @@ public static String parseDeleteAppointment(String input) { return temp.isBlank() ? null : temp.trim(); } - public static String parseDeletePatient(String input) { - return input.replaceFirst("(?i)delete-patient\\s*", "").trim(); - } - - public static String parseViewPatient(String input) { - return input.replaceFirst("(?i)view-patient\\s*", "").trim(); + public static String[] parseAddPatient(String input) { + String temp = input.replaceFirst("(?i)add-patient\\s*", ""); + String name = extractValue(temp, "n/"); + String nric = extractValue(temp, "ic/"); + String birthdate = extractValue(temp, "dob/"); + String gender = extractValue(temp, "g/"); + String phone = extractValue(temp, "p/"); + String address = extractValue(temp, "a/"); + if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) { + return null; + } + return new String[]{nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim()}; } public static String parseViewHistory(String input) { @@ -66,7 +78,7 @@ private static String extractValue(String input, String prefix) { return null; } start += prefix.length(); - String[] possible = {"ic/", "dt/", "t/", "dsc/"}; + String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/"}; int end = input.length(); for (String p : possible) { if (p.equalsIgnoreCase(prefix)) { diff --git a/src/main/java/Ui.java b/src/main/java/Misc/Ui.java similarity index 98% rename from src/main/java/Ui.java rename to src/main/java/Misc/Ui.java index 2c9f2a9c3c..8565c697a5 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Misc/Ui.java @@ -1,3 +1,5 @@ +package Misc; + import java.util.Scanner; public class Ui { diff --git a/src/test/java/clinicease_test/Testing.java b/src/test/java/clinicease_test/Testing.java new file mode 100644 index 0000000000..54a2e5aa8f --- /dev/null +++ b/src/test/java/clinicease_test/Testing.java @@ -0,0 +1,18 @@ +package clinicease_test; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import MainFunction.ManagementSystem; +import org.junit.jupiter.api.Test; + +class Testing { + @Test + public void testAddPatient_Success() { + ManagementSystem system = new ManagementSystem(); + String input = "add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"; + + system.addPatient(input); + + assertTrue(system.getPatient().containsKey("S1234567A")); + } +} + diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/DukeTest.java deleted file mode 100644 index 2dda5fd651..0000000000 --- a/src/test/java/seedu/duke/DukeTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package seedu.duke; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -class DukeTest { - @Test - public void sampleTest() { - assertTrue(true); - } -} diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 892cb6cae7..69c6928acd 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,9 +1,30 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - -What is your name? -Hello James Gosling +MainFunction.Patient added: John Doe +----------------------- +MainFunction.Patient added: Jane Smith +----------------------- +===== MainFunction.Patient List ===== +1. MainFunction.Patient ID: S1234567A + Name: John Doe + Date of Birth: 01-01-1990 + Gender: M + Address: 123 Main St + Contact: 98765432 +----------------------- +2. MainFunction.Patient ID: T7654321B + Name: Jane Smith + Date of Birth: 02-02-1985 + Gender: F + Address: 456 Side St + Contact: 87654321 +----------------------- +MainFunction.Patient removed successfully: John Doe (NRIC: S1234567A) +----------------------- +===== MainFunction.Patient List ===== +1. MainFunction.Patient ID: T7654321B + Name: Jane Smith + Date of Birth: 02-02-1985 + Gender: F + Address: 456 Side St + Contact: 87654321 +----------------------- +Goodbye! \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f6ec2e9f95..e21a4f3cd2 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1,6 @@ -James Gosling \ No newline at end of file +add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St +add-patient n/Jane Smith ic/T7654321B dob/02-02-1985 g/F p/87654321 a/456 Side St +list-patient +delete-patient ic/S1234567A +list-patient +bye \ No newline at end of file From 1fc1d60a0e01c471434b6354f62693018cbe727d Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 00:02:52 +0800 Subject: [PATCH 012/203] Revert "Combined appointment and patient add and delete, added JUnit as well" This reverts commit b760ef1de9a060573275592deced31866b40a41e. --- .../java/{MainFunction => }/Appointment.java | 2 - src/main/java/ClinicEase.java | 14 +-- .../java/MainFunction/ManagementSystem.java | 102 ------------------ src/main/java/ManagementSystem.java | 44 ++++++++ src/main/java/{Misc => }/Parser.java | 26 ++--- src/main/java/{MainFunction => }/Patient.java | 27 +++-- src/main/java/{Misc => }/Ui.java | 2 - src/test/java/clinicease_test/Testing.java | 18 ---- src/test/java/seedu/duke/DukeTest.java | 12 +++ text-ui-test/EXPECTED.TXT | 39 ++----- text-ui-test/input.txt | 7 +- 11 files changed, 96 insertions(+), 197 deletions(-) rename src/main/java/{MainFunction => }/Appointment.java (97%) delete mode 100644 src/main/java/MainFunction/ManagementSystem.java create mode 100644 src/main/java/ManagementSystem.java rename src/main/java/{Misc => }/Parser.java (73%) rename src/main/java/{MainFunction => }/Patient.java (62%) rename src/main/java/{Misc => }/Ui.java (98%) delete mode 100644 src/test/java/clinicease_test/Testing.java create mode 100644 src/test/java/seedu/duke/DukeTest.java diff --git a/src/main/java/MainFunction/Appointment.java b/src/main/java/Appointment.java similarity index 97% rename from src/main/java/MainFunction/Appointment.java rename to src/main/java/Appointment.java index 6ea8e96e7b..016e3ed41a 100644 --- a/src/main/java/MainFunction/Appointment.java +++ b/src/main/java/Appointment.java @@ -1,5 +1,3 @@ -package MainFunction; - public class Appointment { private static int runningId = 100; private final String id; diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index b3b5e5c744..2d02099644 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,14 +1,9 @@ -import MainFunction.ManagementSystem; -import Misc.Parser; -import Misc.Ui; - public class ClinicEase { public static void main(String[] args) { ManagementSystem manager = new ManagementSystem(); Ui ui = new Ui(); ui.showWelcome(); - boolean running = true; while (running) { String input = ui.readCommand(); @@ -33,13 +28,10 @@ public static void main(String[] args) { } else if (Parser.isListAppointments(input)) { manager.listAppointments(); } else if (Parser.isAddPatient(input)) { - manager.addPatient(input); + System.out.println("Feature not implemented yet."); } else if (Parser.isDeletePatient(input)) { - manager.deletePatient(input); - } else if (Parser.isListPatient(input)){ - manager.listPatients(); - } - else if (Parser.isViewPatient(input)) { + System.out.println("Feature not implemented yet."); + } else if (Parser.isViewPatient(input)) { System.out.println("Feature not implemented yet."); } else if (Parser.isViewHistory(input)) { System.out.println("Feature not implemented yet."); diff --git a/src/main/java/MainFunction/ManagementSystem.java b/src/main/java/MainFunction/ManagementSystem.java deleted file mode 100644 index 3aa678b5b5..0000000000 --- a/src/main/java/MainFunction/ManagementSystem.java +++ /dev/null @@ -1,102 +0,0 @@ -package MainFunction; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import Misc.Parser; - -public class ManagementSystem { - private final Map patients; - private final List appointments; - - public ManagementSystem() { - patients = new HashMap<>(); - appointments = new ArrayList<>(); - } - - public Map getPatient() { - return patients; - } - - public void addPatient(String line) { - String [] details = Parser.parseAddPatient(line); - - if (details == null){ - System.out.println("Patients details is incomplete!"); - return; - } - - else if (patients.containsKey(details[0])) { - System.out.println("MainFunction.Patient ID already exists!"); - return; - } - - Patient newPatient = new Patient(details[0], details[1], details[2], details[3], details[4], details[5]); - patients.put(details[0], newPatient); - System.out.println("MainFunction.Patient added: " + details[1]); - } - - public void deletePatient(String line) { - String nric = line.substring(15); - if (nric == null || nric.isBlank()) { - System.out.println("Invalid NRIC provided."); - return; - } - - if (patients.containsKey(nric)) { - Patient removedPatient = patients.remove(nric); - System.out.println("MainFunction.Patient removed successfully: " + removedPatient.getName() + " (NRIC: " + nric + ")"); - } else { - System.out.println("Error: MainFunction.Patient with NRIC " + nric + " not found."); - } - } - - public void listPatients() { - if (patients.isEmpty()) { - System.out.println("No patients have been added."); - return; - } - System.out.println("===== MainFunction.Patient List ====="); - int count = 1; - for (Patient p : patients.values()) { - System.out.println(count + ". " + p); - System.out.println("-----------------------"); - count++; - } - } - - public void addAppointment(String[] details) { - String nric = details[0]; - String date = details[1]; - String time = details[2]; - String desc = details[3]; - Appointment appt = new Appointment(nric, date, time, desc); - appointments.add(appt); - System.out.println("MainFunction.Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); - } - - public void deleteAppointment(String apptId) { - for (int i = 0; i < appointments.size(); i++) { - if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { - appointments.remove(i); - System.out.println("MainFunction.Appointment " + apptId + " is deleted successfully."); - return; - } - } - System.out.println("No appointment found with ID " + apptId + "."); - } - - public void listAppointments() { - if (appointments.isEmpty()) { - System.out.println("No appointments found."); - return; - } - System.out.println("Appointments:"); - int count = 1; - for (Appointment a : appointments) { - System.out.println(count + ". " + a); - count++; - } - } -} diff --git a/src/main/java/ManagementSystem.java b/src/main/java/ManagementSystem.java new file mode 100644 index 0000000000..81dc51f9ef --- /dev/null +++ b/src/main/java/ManagementSystem.java @@ -0,0 +1,44 @@ +import java.util.ArrayList; +import java.util.List; + +public class ManagementSystem { + private final List appointments; + + public ManagementSystem() { + appointments = new ArrayList<>(); + } + + public void addAppointment(String[] details) { + String nric = details[0]; + String date = details[1]; + String time = details[2]; + String desc = details[3]; + Appointment appt = new Appointment(nric, date, time, desc); + appointments.add(appt); + System.out.println("Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); + } + + public void deleteAppointment(String apptId) { + for (int i = 0; i < appointments.size(); i++) { + if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { + appointments.remove(i); + System.out.println("Appointment " + apptId + " is deleted successfully."); + return; + } + } + System.out.println("No appointment found with ID " + apptId + "."); + } + + public void listAppointments() { + if (appointments.isEmpty()) { + System.out.println("No appointments found."); + return; + } + System.out.println("Appointments:"); + int count = 1; + for (Appointment a : appointments) { + System.out.println(count + ". " + a); + count++; + } + } +} diff --git a/src/main/java/Misc/Parser.java b/src/main/java/Parser.java similarity index 73% rename from src/main/java/Misc/Parser.java rename to src/main/java/Parser.java index 4ca78fc0c3..ad1bd5bc62 100644 --- a/src/main/java/Misc/Parser.java +++ b/src/main/java/Parser.java @@ -1,5 +1,3 @@ -package Misc; - public class Parser { public static boolean isBye(String input) { return input.equalsIgnoreCase("bye"); @@ -17,10 +15,6 @@ public static boolean isViewPatient(String input) { return input.toLowerCase().startsWith("view-patient"); } - public static boolean isListPatient(String input) { - return input.toLowerCase().startsWith("list-patient"); - } - public static boolean isViewHistory(String input) { return input.toLowerCase().startsWith("view-history"); } @@ -54,18 +48,12 @@ public static String parseDeleteAppointment(String input) { return temp.isBlank() ? null : temp.trim(); } - public static String[] parseAddPatient(String input) { - String temp = input.replaceFirst("(?i)add-patient\\s*", ""); - String name = extractValue(temp, "n/"); - String nric = extractValue(temp, "ic/"); - String birthdate = extractValue(temp, "dob/"); - String gender = extractValue(temp, "g/"); - String phone = extractValue(temp, "p/"); - String address = extractValue(temp, "a/"); - if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) { - return null; - } - return new String[]{nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim()}; + public static String parseDeletePatient(String input) { + return input.replaceFirst("(?i)delete-patient\\s*", "").trim(); + } + + public static String parseViewPatient(String input) { + return input.replaceFirst("(?i)view-patient\\s*", "").trim(); } public static String parseViewHistory(String input) { @@ -78,7 +66,7 @@ private static String extractValue(String input, String prefix) { return null; } start += prefix.length(); - String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/"}; + String[] possible = {"ic/", "dt/", "t/", "dsc/"}; int end = input.length(); for (String p : possible) { if (p.equalsIgnoreCase(prefix)) { diff --git a/src/main/java/MainFunction/Patient.java b/src/main/java/Patient.java similarity index 62% rename from src/main/java/MainFunction/Patient.java rename to src/main/java/Patient.java index b0fa555bf1..7240e2b222 100644 --- a/src/main/java/MainFunction/Patient.java +++ b/src/main/java/Patient.java @@ -1,5 +1,3 @@ -package MainFunction; - import java.util.ArrayList; import java.util.List; @@ -22,13 +20,28 @@ public Patient(String id, String name, String dob, String gender, String address this.medicalHistory = new ArrayList<>(); } - public String getName() {return name;} + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDob() { + return dob; + } + + public String getContactInfo() { + return contactInfo; + } + + public List getMedicalHistory() { + return medicalHistory; + } @Override public String toString() { - return String.format( - "MainFunction.Patient ID: %s\n Name: %s\n Date of Birth: %s\n Gender: %s\n Address: %s\n Contact: %s", - id, name, dob, gender, address, contactInfo - ); + return "Patient ID: " + id + ", Name: " + name + ", Date of Birth: " + dob + ", Contact: " + contactInfo; } } diff --git a/src/main/java/Misc/Ui.java b/src/main/java/Ui.java similarity index 98% rename from src/main/java/Misc/Ui.java rename to src/main/java/Ui.java index 8565c697a5..2c9f2a9c3c 100644 --- a/src/main/java/Misc/Ui.java +++ b/src/main/java/Ui.java @@ -1,5 +1,3 @@ -package Misc; - import java.util.Scanner; public class Ui { diff --git a/src/test/java/clinicease_test/Testing.java b/src/test/java/clinicease_test/Testing.java deleted file mode 100644 index 54a2e5aa8f..0000000000 --- a/src/test/java/clinicease_test/Testing.java +++ /dev/null @@ -1,18 +0,0 @@ -package clinicease_test; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import MainFunction.ManagementSystem; -import org.junit.jupiter.api.Test; - -class Testing { - @Test - public void testAddPatient_Success() { - ManagementSystem system = new ManagementSystem(); - String input = "add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"; - - system.addPatient(input); - - assertTrue(system.getPatient().containsKey("S1234567A")); - } -} - diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/DukeTest.java new file mode 100644 index 0000000000..2dda5fd651 --- /dev/null +++ b/src/test/java/seedu/duke/DukeTest.java @@ -0,0 +1,12 @@ +package seedu.duke; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class DukeTest { + @Test + public void sampleTest() { + assertTrue(true); + } +} diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 69c6928acd..892cb6cae7 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,30 +1,9 @@ -MainFunction.Patient added: John Doe ------------------------ -MainFunction.Patient added: Jane Smith ------------------------ -===== MainFunction.Patient List ===== -1. MainFunction.Patient ID: S1234567A - Name: John Doe - Date of Birth: 01-01-1990 - Gender: M - Address: 123 Main St - Contact: 98765432 ------------------------ -2. MainFunction.Patient ID: T7654321B - Name: Jane Smith - Date of Birth: 02-02-1985 - Gender: F - Address: 456 Side St - Contact: 87654321 ------------------------ -MainFunction.Patient removed successfully: John Doe (NRIC: S1234567A) ------------------------ -===== MainFunction.Patient List ===== -1. MainFunction.Patient ID: T7654321B - Name: Jane Smith - Date of Birth: 02-02-1985 - Gender: F - Address: 456 Side St - Contact: 87654321 ------------------------ -Goodbye! \ No newline at end of file +Hello from + ____ _ +| _ \ _ _| | _____ +| | | | | | | |/ / _ \ +| |_| | |_| | < __/ +|____/ \__,_|_|\_\___| + +What is your name? +Hello James Gosling diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e21a4f3cd2..f6ec2e9f95 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,6 +1 @@ -add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St -add-patient n/Jane Smith ic/T7654321B dob/02-02-1985 g/F p/87654321 a/456 Side St -list-patient -delete-patient ic/S1234567A -list-patient -bye \ No newline at end of file +James Gosling \ No newline at end of file From 3177a56a035ac6b5bb85fed4f481a414e90b9102 Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 00:31:22 +0800 Subject: [PATCH 013/203] Combined add and delete patient with appointment feature, added JUnit testing for patient feature --- src/main/java/ClinicEase.java | 10 +- .../java/{ => MainFunction}/Appointment.java | 2 + .../java/MainFunction/ManagementSystem.java | 108 ++++++++++++++++++ src/main/java/{ => MainFunction}/Patient.java | 7 +- src/main/java/ManagementSystem.java | 44 ------- src/main/java/{ => Misc}/Parser.java | 37 +++++- src/main/java/{ => Misc}/Ui.java | 2 + src/test/java/ce_test/PatientTest.java | 30 +++++ src/test/java/seedu/duke/DukeTest.java | 12 -- 9 files changed, 187 insertions(+), 65 deletions(-) rename src/main/java/{ => MainFunction}/Appointment.java (97%) create mode 100644 src/main/java/MainFunction/ManagementSystem.java rename src/main/java/{ => MainFunction}/Patient.java (80%) delete mode 100644 src/main/java/ManagementSystem.java rename src/main/java/{ => Misc}/Parser.java (72%) rename src/main/java/{ => Misc}/Ui.java (98%) create mode 100644 src/test/java/ce_test/PatientTest.java delete mode 100644 src/test/java/seedu/duke/DukeTest.java diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 2d02099644..b6c81ff826 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,3 +1,7 @@ +import MainFunction.ManagementSystem; +import Misc.Parser; +import Misc.Ui; + public class ClinicEase { public static void main(String[] args) { ManagementSystem manager = new ManagementSystem(); @@ -28,9 +32,11 @@ public static void main(String[] args) { } else if (Parser.isListAppointments(input)) { manager.listAppointments(); } else if (Parser.isAddPatient(input)) { - System.out.println("Feature not implemented yet."); + manager.addPatient(input); } else if (Parser.isDeletePatient(input)) { - System.out.println("Feature not implemented yet."); + manager.deletePatient(input); + } else if (Parser.isListPatient(input)){ + manager.listPatients(); } else if (Parser.isViewPatient(input)) { System.out.println("Feature not implemented yet."); } else if (Parser.isViewHistory(input)) { diff --git a/src/main/java/Appointment.java b/src/main/java/MainFunction/Appointment.java similarity index 97% rename from src/main/java/Appointment.java rename to src/main/java/MainFunction/Appointment.java index 016e3ed41a..6ea8e96e7b 100644 --- a/src/main/java/Appointment.java +++ b/src/main/java/MainFunction/Appointment.java @@ -1,3 +1,5 @@ +package MainFunction; + public class Appointment { private static int runningId = 100; private final String id; diff --git a/src/main/java/MainFunction/ManagementSystem.java b/src/main/java/MainFunction/ManagementSystem.java new file mode 100644 index 0000000000..ba88146185 --- /dev/null +++ b/src/main/java/MainFunction/ManagementSystem.java @@ -0,0 +1,108 @@ +package MainFunction; + +import Misc.Parser; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ManagementSystem { + private final Map patients; + private final List appointments; + + public ManagementSystem() { + patients = new HashMap<>(); + appointments = new ArrayList<>(); + } + + public Map getPatient() { + return patients; + } + + public void addPatient(String line) { + String [] details = Parser.parseAddPatient(line); + + + if (details == null){ + System.out.println("Patients details is incomplete!"); + return; + } + + + else if (patients.containsKey(details[0])) { + System.out.println("MainFunction.Patient ID already exists!"); + return; + } + + + Patient newPatient = new Patient(details[0], details[1], details[2], details[3], details[4], details[5]); + patients.put(details[0], newPatient); + System.out.println("MainFunction.Patient added: " + details[1]); + } + + + public void deletePatient(String line) { + String nric = line.substring(15); + if (nric == null || nric.isBlank()) { + System.out.println("Invalid NRIC provided."); + return; + } + + + if (patients.containsKey(nric)) { + Patient removedPatient = patients.remove(nric); + System.out.println("MainFunction.Patient removed successfully: " + removedPatient.getName() + " (NRIC: " + nric + ")"); + } else { + System.out.println("Error: MainFunction.Patient with NRIC " + nric + " not found."); + } + } + + + public void listPatients() { + if (patients.isEmpty()) { + System.out.println("No patients have been added."); + return; + } + System.out.println("===== MainFunction.Patient List ====="); + int count = 1; + for (Patient p : patients.values()) { + System.out.println(count + ". " + p); + System.out.println("-----------------------"); + count++; + } + } + + public void addAppointment(String[] details) { + String nric = details[0]; + String date = details[1]; + String time = details[2]; + String desc = details[3]; + Appointment appt = new Appointment(nric, date, time, desc); + appointments.add(appt); + System.out.println("MainFunction.Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); + } + + public void deleteAppointment(String apptId) { + for (int i = 0; i < appointments.size(); i++) { + if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { + appointments.remove(i); + System.out.println("MainFunction.Appointment " + apptId + " is deleted successfully."); + return; + } + } + System.out.println("No appointment found with ID " + apptId + "."); + } + + public void listAppointments() { + if (appointments.isEmpty()) { + System.out.println("No appointments found."); + return; + } + System.out.println("Appointments:"); + int count = 1; + for (Appointment a : appointments) { + System.out.println(count + ". " + a); + count++; + } + } +} diff --git a/src/main/java/Patient.java b/src/main/java/MainFunction/Patient.java similarity index 80% rename from src/main/java/Patient.java rename to src/main/java/MainFunction/Patient.java index 7240e2b222..5f65dcc886 100644 --- a/src/main/java/Patient.java +++ b/src/main/java/MainFunction/Patient.java @@ -1,3 +1,5 @@ +package MainFunction; + import java.util.ArrayList; import java.util.List; @@ -42,6 +44,9 @@ public List getMedicalHistory() { @Override public String toString() { - return "Patient ID: " + id + ", Name: " + name + ", Date of Birth: " + dob + ", Contact: " + contactInfo; + return String.format( + "MainFunction.Patient ID: %s\n Name: %s\n Date of Birth: %s\n Gender: %s\n Address: %s\n Contact: %s", + id, name, dob, gender, address, contactInfo + ); } } diff --git a/src/main/java/ManagementSystem.java b/src/main/java/ManagementSystem.java deleted file mode 100644 index 81dc51f9ef..0000000000 --- a/src/main/java/ManagementSystem.java +++ /dev/null @@ -1,44 +0,0 @@ -import java.util.ArrayList; -import java.util.List; - -public class ManagementSystem { - private final List appointments; - - public ManagementSystem() { - appointments = new ArrayList<>(); - } - - public void addAppointment(String[] details) { - String nric = details[0]; - String date = details[1]; - String time = details[2]; - String desc = details[3]; - Appointment appt = new Appointment(nric, date, time, desc); - appointments.add(appt); - System.out.println("Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); - } - - public void deleteAppointment(String apptId) { - for (int i = 0; i < appointments.size(); i++) { - if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { - appointments.remove(i); - System.out.println("Appointment " + apptId + " is deleted successfully."); - return; - } - } - System.out.println("No appointment found with ID " + apptId + "."); - } - - public void listAppointments() { - if (appointments.isEmpty()) { - System.out.println("No appointments found."); - return; - } - System.out.println("Appointments:"); - int count = 1; - for (Appointment a : appointments) { - System.out.println(count + ". " + a); - count++; - } - } -} diff --git a/src/main/java/Parser.java b/src/main/java/Misc/Parser.java similarity index 72% rename from src/main/java/Parser.java rename to src/main/java/Misc/Parser.java index ad1bd5bc62..94ca0acb8b 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Misc/Parser.java @@ -1,36 +1,51 @@ +package Misc; + public class Parser { public static boolean isBye(String input) { return input.equalsIgnoreCase("bye"); } + public static boolean isAddPatient(String input) { return input.toLowerCase().startsWith("add-patient"); } + public static boolean isDeletePatient(String input) { return input.toLowerCase().startsWith("delete-patient"); } + public static boolean isViewPatient(String input) { return input.toLowerCase().startsWith("view-patient"); } + + public static boolean isListPatient(String input) { + return input.toLowerCase().startsWith("list-patient"); + } + + public static boolean isViewHistory(String input) { return input.toLowerCase().startsWith("view-history"); } + public static boolean isAddAppointment(String input) { return input.toLowerCase().startsWith("add-appointment"); } + public static boolean isDeleteAppointment(String input) { return input.toLowerCase().startsWith("delete-appointment"); } + public static boolean isListAppointments(String input) { return input.equalsIgnoreCase("list-appointments"); } + public static String[] parseAddAppointment(String input) { String temp = input.replaceFirst("(?i)add-appointment\\s*", ""); String nric = extractValue(temp, "ic/"); @@ -43,30 +58,40 @@ public static String[] parseAddAppointment(String input) { return new String[]{nric.trim(), date.trim(), time.trim(), desc.trim()}; } + public static String parseDeleteAppointment(String input) { String temp = input.replaceFirst("(?i)delete-appointment\\s*", ""); return temp.isBlank() ? null : temp.trim(); } - public static String parseDeletePatient(String input) { - return input.replaceFirst("(?i)delete-patient\\s*", "").trim(); - } - public static String parseViewPatient(String input) { - return input.replaceFirst("(?i)view-patient\\s*", "").trim(); + public static String[] parseAddPatient(String input) { + String temp = input.replaceFirst("(?i)add-patient\\s*", ""); + String name = extractValue(temp, "n/"); + String nric = extractValue(temp, "ic/"); + String birthdate = extractValue(temp, "dob/"); + String gender = extractValue(temp, "g/"); + String phone = extractValue(temp, "p/"); + String address = extractValue(temp, "a/"); + if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) { + return null; + } + return new String[]{nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim()}; } + public static String parseViewHistory(String input) { return input.replaceFirst("(?i)view-history\\s*", "").trim(); } + private static String extractValue(String input, String prefix) { int start = input.toLowerCase().indexOf(prefix.toLowerCase()); if (start < 0) { return null; } start += prefix.length(); - String[] possible = {"ic/", "dt/", "t/", "dsc/"}; + String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/"}; int end = input.length(); for (String p : possible) { if (p.equalsIgnoreCase(prefix)) { diff --git a/src/main/java/Ui.java b/src/main/java/Misc/Ui.java similarity index 98% rename from src/main/java/Ui.java rename to src/main/java/Misc/Ui.java index 2c9f2a9c3c..8565c697a5 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Misc/Ui.java @@ -1,3 +1,5 @@ +package Misc; + import java.util.Scanner; public class Ui { diff --git a/src/test/java/ce_test/PatientTest.java b/src/test/java/ce_test/PatientTest.java new file mode 100644 index 0000000000..d8f85de742 --- /dev/null +++ b/src/test/java/ce_test/PatientTest.java @@ -0,0 +1,30 @@ +package ce_test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import MainFunction.ManagementSystem; +import org.junit.jupiter.api.Test; + +class PatientTest { + @Test + public void testAddPatient_Success() { + ManagementSystem system = new ManagementSystem(); + String input = "add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"; + + system.addPatient(input); + + assertTrue(system.getPatient().containsKey("S1234567A")); + } + + @Test + public void testDeletePatient() { + ManagementSystem system = new ManagementSystem(); + + system.addPatient("add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"); + + system.deletePatient("delete-patient S1234567A"); + + assertTrue(!system.getPatient().containsKey("S1234567A")); + } +} + diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/DukeTest.java deleted file mode 100644 index 2dda5fd651..0000000000 --- a/src/test/java/seedu/duke/DukeTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package seedu.duke; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -class DukeTest { - @Test - public void sampleTest() { - assertTrue(true); - } -} From f41176e06224691ac8c89c232a1bcb335d4be706 Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 00:57:34 +0800 Subject: [PATCH 014/203] renaming packages --- src/main/java/{MainFunction => manager}/Appointment.java | 0 src/main/java/{MainFunction => manager}/ManagementSystem.java | 0 src/main/java/{MainFunction => manager}/Patient.java | 0 src/main/java/{Misc => misc}/Parser.java | 0 src/main/java/{Misc => misc}/Ui.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/{MainFunction => manager}/Appointment.java (100%) rename src/main/java/{MainFunction => manager}/ManagementSystem.java (100%) rename src/main/java/{MainFunction => manager}/Patient.java (100%) rename src/main/java/{Misc => misc}/Parser.java (100%) rename src/main/java/{Misc => misc}/Ui.java (100%) diff --git a/src/main/java/MainFunction/Appointment.java b/src/main/java/manager/Appointment.java similarity index 100% rename from src/main/java/MainFunction/Appointment.java rename to src/main/java/manager/Appointment.java diff --git a/src/main/java/MainFunction/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java similarity index 100% rename from src/main/java/MainFunction/ManagementSystem.java rename to src/main/java/manager/ManagementSystem.java diff --git a/src/main/java/MainFunction/Patient.java b/src/main/java/manager/Patient.java similarity index 100% rename from src/main/java/MainFunction/Patient.java rename to src/main/java/manager/Patient.java diff --git a/src/main/java/Misc/Parser.java b/src/main/java/misc/Parser.java similarity index 100% rename from src/main/java/Misc/Parser.java rename to src/main/java/misc/Parser.java diff --git a/src/main/java/Misc/Ui.java b/src/main/java/misc/Ui.java similarity index 100% rename from src/main/java/Misc/Ui.java rename to src/main/java/misc/Ui.java From bfb0dd36750f9ef5e9b9fd60361a6b20dfc82d46 Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 00:58:29 +0800 Subject: [PATCH 015/203] Adjusted packages names --- src/main/java/ClinicEase.java | 6 +++--- src/main/java/manager/Appointment.java | 2 +- src/main/java/manager/ManagementSystem.java | 4 ++-- src/main/java/manager/Patient.java | 2 +- src/main/java/misc/Parser.java | 2 +- src/main/java/misc/Ui.java | 2 +- src/test/java/ce_test/PatientTest.java | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index b6c81ff826..640c0eb297 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,6 +1,6 @@ -import MainFunction.ManagementSystem; -import Misc.Parser; -import Misc.Ui; +import manager.ManagementSystem; +import misc.Parser; +import misc.Ui; public class ClinicEase { public static void main(String[] args) { diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index 6ea8e96e7b..8fb952a135 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -1,4 +1,4 @@ -package MainFunction; +package manager; public class Appointment { private static int runningId = 100; diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index ba88146185..64c9f2cbe2 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,6 +1,6 @@ -package MainFunction; +package manager; -import Misc.Parser; +import misc.Parser; import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 5f65dcc886..c03d42ef89 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -1,4 +1,4 @@ -package MainFunction; +package manager; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/misc/Parser.java b/src/main/java/misc/Parser.java index 94ca0acb8b..17e88ed69c 100644 --- a/src/main/java/misc/Parser.java +++ b/src/main/java/misc/Parser.java @@ -1,4 +1,4 @@ -package Misc; +package misc; public class Parser { public static boolean isBye(String input) { diff --git a/src/main/java/misc/Ui.java b/src/main/java/misc/Ui.java index 8565c697a5..550b62590c 100644 --- a/src/main/java/misc/Ui.java +++ b/src/main/java/misc/Ui.java @@ -1,4 +1,4 @@ -package Misc; +package misc; import java.util.Scanner; diff --git a/src/test/java/ce_test/PatientTest.java b/src/test/java/ce_test/PatientTest.java index d8f85de742..7d18edbe15 100644 --- a/src/test/java/ce_test/PatientTest.java +++ b/src/test/java/ce_test/PatientTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; -import MainFunction.ManagementSystem; +import manager.ManagementSystem; import org.junit.jupiter.api.Test; class PatientTest { From 76193bed8ec7d95206c02a0243f2d4ba95e4c82e Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Wed, 19 Mar 2025 02:19:14 +0800 Subject: [PATCH 016/203] added view-patients --- src/main/java/ClinicEase.java | 4 ++-- .../java/MainFunction/ManagementSystem.java | 15 +++++++++++-- src/main/java/MainFunction/Patient.java | 5 +++-- .../java/{ce_test => cetest}/PatientTest.java | 21 ++++++++++++++----- 4 files changed, 34 insertions(+), 11 deletions(-) rename src/test/java/{ce_test => cetest}/PatientTest.java (55%) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index b6c81ff826..f7399ff22a 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -35,10 +35,10 @@ public static void main(String[] args) { manager.addPatient(input); } else if (Parser.isDeletePatient(input)) { manager.deletePatient(input); + } else if (Parser.isViewPatient(input)) { + manager.viewPatient(input); } else if (Parser.isListPatient(input)){ manager.listPatients(); - } else if (Parser.isViewPatient(input)) { - System.out.println("Feature not implemented yet."); } else if (Parser.isViewHistory(input)) { System.out.println("Feature not implemented yet."); } else { diff --git a/src/main/java/MainFunction/ManagementSystem.java b/src/main/java/MainFunction/ManagementSystem.java index ba88146185..efc7cb2c75 100644 --- a/src/main/java/MainFunction/ManagementSystem.java +++ b/src/main/java/MainFunction/ManagementSystem.java @@ -48,15 +48,26 @@ public void deletePatient(String line) { return; } - if (patients.containsKey(nric)) { Patient removedPatient = patients.remove(nric); - System.out.println("MainFunction.Patient removed successfully: " + removedPatient.getName() + " (NRIC: " + nric + ")"); + System.out.println("MainFunction.Patient removed successfully: " + removedPatient.getName() + + " (NRIC: " + nric + ")"); } else { System.out.println("Error: MainFunction.Patient with NRIC " + nric + " not found."); } } + public void viewPatient(String line) { + String nric = line.substring(13); + if (nric == null || nric.isBlank()) { + System.out.println("Invalid NRIC provided."); + return; + } + + System.out.println("===== MainFunction.Patient Details ====="); + System.out.println(patients.values()); + System.out.println("-----------------------"); + } public void listPatients() { if (patients.isEmpty()) { diff --git a/src/main/java/MainFunction/Patient.java b/src/main/java/MainFunction/Patient.java index 5f65dcc886..d01875923e 100644 --- a/src/main/java/MainFunction/Patient.java +++ b/src/main/java/MainFunction/Patient.java @@ -4,7 +4,7 @@ import java.util.List; public class Patient { - private final String id; + public final String id; private final String name; private final String dob; private final String contactInfo; @@ -45,7 +45,8 @@ public List getMedicalHistory() { @Override public String toString() { return String.format( - "MainFunction.Patient ID: %s\n Name: %s\n Date of Birth: %s\n Gender: %s\n Address: %s\n Contact: %s", + "MainFunction.Patient ID: %s\n Name: %s\n Date of Birth: %s\n " + + "Gender: %s\n Address: %s\n Contact: %s", id, name, dob, gender, address, contactInfo ); } diff --git a/src/test/java/ce_test/PatientTest.java b/src/test/java/cetest/PatientTest.java similarity index 55% rename from src/test/java/ce_test/PatientTest.java rename to src/test/java/cetest/PatientTest.java index d8f85de742..d6b1ffbe06 100644 --- a/src/test/java/ce_test/PatientTest.java +++ b/src/test/java/cetest/PatientTest.java @@ -1,13 +1,13 @@ -package ce_test; - -import static org.junit.jupiter.api.Assertions.assertTrue; +package cetest; import MainFunction.ManagementSystem; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + class PatientTest { @Test - public void testAddPatient_Success() { + public void testAddPatientSuccess() { ManagementSystem system = new ManagementSystem(); String input = "add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"; @@ -24,7 +24,18 @@ public void testDeletePatient() { system.deletePatient("delete-patient S1234567A"); - assertTrue(!system.getPatient().containsKey("S1234567A")); + assertFalse(system.getPatient().containsKey("S1234567A")); + } + + @Test + public void testViewPatientExpectedDetails() { + ManagementSystem system = new ManagementSystem(); + + system.addPatient("add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"); + + system.viewPatient("view-patient S1234567A"); + + assertTrue(system.getPatient().containsKey("S1234567A")); } } From de9cde955dd5c1d4df41a9478c1bb57400579db0 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Wed, 19 Mar 2025 02:34:06 +0800 Subject: [PATCH 017/203] edited checkstyle --- src/test/java/cetest/PatientTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/cetest/PatientTest.java b/src/test/java/cetest/PatientTest.java index d6b1ffbe06..cc0b107f75 100644 --- a/src/test/java/cetest/PatientTest.java +++ b/src/test/java/cetest/PatientTest.java @@ -3,7 +3,8 @@ import MainFunction.ManagementSystem; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; class PatientTest { @Test From a2b3c37e87b2c74fdc77642e3db78679a90ae12b Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Wed, 19 Mar 2025 02:51:17 +0800 Subject: [PATCH 018/203] edited ui test --- text-ui-test/EXPECTED.TXT | 13 ++++--------- text-ui-test/input.txt | 1 - 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 892cb6cae7..5cbd60b33b 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,9 +1,4 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - -What is your name? -Hello James Gosling +==================================================== +Welcome to Clinic Management v1! +Type a command, or 'bye' to exit. +==================================================== \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f6ec2e9f95..e69de29bb2 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +0,0 @@ -James Gosling \ No newline at end of file From a435253e05b7e8cbfc66202f0059a19479f058bf Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Wed, 19 Mar 2025 02:59:01 +0800 Subject: [PATCH 019/203] cleaned and rebuilt gradle --- gradle/wrapper/gradle-wrapper.jar | Bin 63375 -> 61624 bytes gradle/wrapper/gradle-wrapper.properties | 1 - gradlew | 16 ++++++---------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 033e24c4cdf41af1ab109bc7f253b2b887023340..afba109285af78dbd2a1d187e33ac4f87c76e392 100644 GIT binary patch delta 24872 zcmY(q1CS;`mp0nAZQI7QZQHi(d8cjLw(Xv_ZQHhS=iA-by?;bioy>DGqbe$K^knP} zXxknrxS|Xw7)&BC9C|zsDlkkugA?$7)eymefPfsFEf_(8{;$Ov`hN=(!GQ6BVH!z* z?P2~g;$a>Bi!J#-LIXJLe?l*~2#|jS46zREA0OcayKx%T7x-V%?qAUqUHo6Mu@XZJ z;veS@@BH7>{uI0M2|oh#AO8>W{eSwpkg5Oc+c-{D1A+zv1Ox^3?~{apbP9bi7a)Lu zD3B9x*eMhB&+!0Lnr9xUYG^;*98*OLz%ubPVosu`39kMDJnA-LWldt$7_0Ute#Wns(kieO5riaJ$o*@Xn0yx-_K2RplaWiQjR^W^?bzV{P84%eL@?+FG! zZ}+%BQ?IJx^!BMrp*&=p)P-2MGSCHg4dJO=jL`b7;#&YZVr-#YFp*&r+jymrYF}xw zSpx`E3{v>fvSGbXD;Y;KRb!?AVr*vH#Cm*>hbcZ5``+#-PXn+Q)5tIR3euj^g7px(11z0-8%&8PImDwK&`9sLoN`)HU4V$LBIah1%ao!azpgn`A{6UNSdxN%DEwR6Z;3fykt3H zgJ8lW)K0onOXR#Vi#;$~a7dPPRTp5s>TZfM#cSjDG4$(s%SrChsw$y-ZLS*Yc4Tr> zavOu5cS#q?-yYJeiE{p1^pp0*MmYA7y*=yL-qnD*QWzd{^Wl{zsG#*KFf9*=Lf7IC z&a-E^^%688nqO6IDd%&xfqy{_N3U2%)sk)GY(^iOGY-FGU}@uWlXxk0%qz2HUoJ{$ z9o_6|d@js!*27YcG~y@Z4Kav^TivZe{oNY5F*2^)&o*?G#SE>kqRgh{&#!T&uv?4T zTCM@=Gh79Dl4qC2D2zu`F7&Mmtt;Tg1#q5wlfK7A3i3^XRdKgjK_}#0M7Iw=0w*vg zj1Tt>mK)0YDR=Xe6VCeTj`;F{pxj*>(i=`++JT@t>46KQXL-BMRflGwy_3okuRKXB2(&CwCf8@J=xGmW+yRfnEEV zgmRILLWI@jy!ctvbMp!H14`sAsy#LES|d#%$aVCtm}Z#mUTtUx7+uxbjqH#EMFzmz zn=l1rwV}Q~*TpA>(^Z4Kgc7)eNox=v%=11z_>FODfS;#A-|rYv8H-;>II1RE%Q3%- zHr|`k341?a5E`BccL${OUna!*h}~Z$UN!qEL9Fxll^n4oz!>t{C*(edK zjKuAP@_tjW(<}0ItBcurc8#y=Z7ly!)~bR5v>w-{4D?Y5*(Cw1jyS*yy2%$h`IrHla*dG5J- zZmY(zmnm`6ALE>&I<+W*3n)E*)E1YIdVne$>c`nqp_wDG*6?bwM6<^1jESDC5dKn1 z7My6oNkuW4VTG);#a-@vZqxyk(a{g3>)w% zo?%Mhf2C0ifyZ+FQoBuhaK{0-Zp$}LZ&)D&oQF?~wZR!_Tlu0K!USCA5ekquX-Ety zp^3%jx4lpalTw8bizCG>#|lPpL=mB6EA-Bj62xL?V+w-|>QEs&7N#S#M%4_GM zaOoNtp6!W(ot^?SGy2YpieH)25)gM!T=jD0GT7yzJC9(G+7AGL{(K)bYVnG5v&VS2 zL)3OeqLVCU{9{Uu%sZ8GBpxB{7}vZaFyHZsJwa|#{~nBch2|NW!NT}EOMAxYOCECo zdB^h`1>pG|k)YtNyzQ=>6?up5RTIgQ{P5tpJAlC(>(<6U8UPM8B7d8B5rRsU?0B$K z_6vB3Crbx`rpYWbz|oGPB*`|eu>L*dEx!;+q6Ew~wNx-NHd&4vn-fxuw2+bt2m2zh zAl@lbgU$DRsG6)03YWL1HNVeA1dExgtn>rD$pCBrFAZMPya#6^W2|BVk7VEvywk0# zvtNa@A7|I^JvssQC*BZO=0L{$r*vpihpK8V%`l{;)gZH|I{dLNKyY!H{%%iZN`EE0f{8)+3*5n zd^SYU_)yp4ZE5|=f+(z@N&Lvv!xu4>M*|b~OB5X!{v;+f88JJRv}kLwka82#a(srr zBG#ROXturWfEDY8w2$RYp>blf6kBRAWzl`)Yud592kD;h083Rls~+`Hr1o^Y1f>^U zkHG13C$QI2yx9|VsqaJP5K;(-@ZK(aDjTHwDvYK<7I&2KqdUjTjaRTjQT{uFDPoLzT#wZn(S8C z>+_p3F6qJjB}sACyX8NxI{H9{G|uI^=OAsjR#QyZm3{lR235+A}To|~MA zUmT$OgFI|ET4ju|B^iL|WvLFYCRTE{oWL*HP~tAR3r8BfK)K2_b|OrbrV~eCOrO}+ zywVP-6DW~TtPlA0l;p9`n9G!7)flEvy!YH`1=IXueT7*B-4cxj(frjDKa^BSgale0 z_Z&k@3~#0#RBAJ}6Ia6~r=fah{KJhj=PF@uEK1)-_=$S)Ut9pEuz1oe-k_W}WbCUo z=65hL@JSLxObe=8Xx(DXnmI=Mme?^}!bBr$JG=B>f>Xk=lZYdxRVrZ1;_5!fnx#B- z>q(FovNX7ERh-J2%L(&ywk@1l5{AO3GaG8ki_`u{lN^R86yOR zB+SY?Ru@yGSznakCiqc0s6iF8ng-mdR@rhgm*1fOwUzv@EuBohP|}|G?Ia0!6!S_F zG?22g>Ej3kSBn>9pi_49UzNQiP9MjXIDq~{!{s2V-vxc88mvc!hSGCob|G|`UTS}t zo-x<~0C`4q13k1ghIIm8@AbsW5hD7sfn(%Y6>hosYghU)?Bbu4qqJe$6mCa_@|n$; zGMbbipM+0N7cZId%6Z%8!TJMklbOc}EE=fL21cChKa_UH*;M8zX(dR_3NgK|VMcaU ztry(pf0?!Bx>5;JgyV4gSF8IH3ye#i%*kYzPm_%ook{3fG@p5_-%znGsT-adP$gq= zSE+tWpg?uJtx{Bo!r1Ck9G02ZU!W$MdI>F;I|uSU-7yW4+6Ld&Q`G_Ztjm=Z&POx1sa(KpySu9k%e6{Re>k``7kkPcB07l~b{%0QcWNxPz(Z+`HY1? z5)U4EI;EtHyLur(y?`x~h1{v%aE?(ZYR4sqMmTsBIlK zCeM?!o-~UEQW-6c+YF;mEf4ubpL(RYHN*o{={wUH*0uX~&pKOL8v3suxhI^*5xOTW zJJQ|QHuj#mMDplr;6TGK&grjWQaIQe)24s5*kg?FMc5ZJoQf!V$H#ly=H2@TlyH$@VM$tRLSbaQMfIkjBbjZ!p`$X%SS4U)@ z1W1KjYfL0Di zCXouc*^w9K*}Ai1r9GO+82ciDNBL+XGbxEOk*!eGK^rh|Nnj}VjVIjX#Xz{+FmzRt zubTew{bN`Kh@LkIIA`hwZp}c$b<*o9Aw4)F~v}3 zl|w^E>4{}H7tTG$Ut5=Gl+EPY)qcetApkD=n*ror^7N zwj@p7cQai@NjdWOVi$~MnI2UeUB&d)e76ZLW$|TYUd)VekUGn{ALan)d$n~uvzJ8o z=zJAMPP!I^Ku=*U-`0$&bZsd*-n(q+mP-k|JVZ~R{TWD#6oTy91)YqXs2u-2_&S5L z26z!y2t8vo=wIjxKvHlEiAG?BWMbo&U}W!**RlNlEo&k_c^;@ex~n%op#E77Y#&g4 z@R9&~k|a`PiD{2An07#fyfKxUt6iSY}iP7&x(72y~5b9zk)bV_*2L7Sz1XClD|Rge5?Ts93}0#XP~D0 zHy$d%KmQZrlJVL{{6AZkXaX&nC6U)#6ObtHAxcU#WrH%D2@*yAc5bT0c*!unAZicVHgxp6~0$@92 z_st`XKom($ArklnlZJ6z5rPfB!ZyhgWZSBJL?EIu_f)Y~VWDoDqxUkoq;_ox>+L(`jQh03w@K?VVqpm0FW|tP z0*K$Ueuo071>>&kMapud9c*s41aN<9o0z5hJRCR3(S{f3a9n{eG!Fh88_(8ixrO9N z{hqL0{WeO+jtUSt2(nwg$O2)&8@hM|m=+dFsb%yeIJ`%{i%z*#boI}sFl=+IOjZqi zT}HPH+k0zU&QD5QD0$={arB6H@z4^=Ui? zJ^U87^Ragd+Zu~fHz9@&>HAnZ5-l`=a88HaK(Dy$^FXs9&@dV37ef@C2+OB;13B)ru z!^Bnrvoqr??OV=~YWdx=Y-gW^gVNDL@R$DvE)|uRBFlbS4i{P}z(k<=E#ss{CNvIX z!(}q9fI12Nq2@GSSm-gX!B}anBZiChao#Qs>@GMU=oG8t8>PU?5-zMKpIP$TK8wsJ z;+uY+Y37EXlmgrSd{3*^ZRQg#X;tQVs6`%Q2ND_cTa7uYF7rJoY zAt$X%VFAJ|=yE;^3tugB79)WI{)^W){Ypf7O6Hf-5QGet<>f zAUF+i)I*$6shDubp+cEVn0levAhr9Kwn!iCRH|(8OY14zMpV2@+!(*On4S zRiZydK<8^nU#$wds;*+5NDD5o1Suw`G4OLV|0Kzod{ja9vz3;poy4vd>5#O-!<&@0v1kT_9f3P7HM-ab(1zyAVF74K( z=H(-@U0<@cPO|t;xGi4zy}uV`faD8Jcd5h+*|IohLp_qcDI#8OdlLS+$Hdb(SOaZ< z7#D~F7^EQyKi~`IR2s#O(mh zMk{h9S2-g_=ow{i6Xq)6yl$4N zI4$PN)=UiouXc}Xg!z%Se3UsD8@~}R*C@t>0QMIKcZ#Fl2z-p$rs=88%%}2HgUtMa zW*-fH%9dRAfs2`EvT75>h!h!i!%rDwo!6k>&4MI=zRIG<#_&KAjihAYP951`&^S`j*hTl}{CEga| zQ$JOZh`qS7PwY0XT;bE=*27kINklVOafOnysBYsxdUNOeqYfTNN*E|$hrSBdq5ol! zf={;mQQAM_cdny4%o#b{JkO?t1AFAi5D(5jDd%1h3EpqfsY+#YRzzCmLHx$vx+n4}}p z!vWfVdM2G6C^(6+iI~EeXk?zDNDM)gP*9*u`(!~NRJ+JH$9hdErZB?cN1Ww$~Dv=U?7Gnm;GoPkc{!PBu~# zU)OJPed5DX?q}}HgMOdn$DY0rOb#;mvcWHnJ%IVfBCu40A7CX- zVnYLTiOjWu`TBxkFrmXhJ?`0<(IWFjjcP-sy*e}}kp^Ui@>Gws_7`oF{a|M9W_kI? z23+1u5%EvFjMErrKaIJDMC^Pk`b(+1dPO3=@zAIt*N=FoTdX>(NuNYytI%xWot9pzf>ddxC1LDk0;rV)S_%I$c zT~bFbe2WA0!haZ&K?!hx{MQ<5NFH!hyk)m><3h}t;!V^=BgW!UR^Qqtg0Z2K&GCGDilR3=Xwh)u(VA8CSO8XdA{H;; z^-c%5O+1!<^Ew4iQXu(@v(?qP_F|KdXl%Jj)Pi zZA(H;ZE59s^`*td?KVDnZU7rrL9;>Crt(S`Jq;J4x^64JS4SvX)^?HjKB2x_DZBVn z!z)A88$|48pMv+%Fyv~x#7sk}z77#W4kY+AJC1^SL$XO#UKXj_bKMu;tQv-O0->wM2F1n5kw|tldfm{9_;tZBA(ZyVfl|tc}bV zl1#U}q}VH|$36HJp#W4OUoi0$=jUiLbk*F8Z&@9W>s71A^ruAP{^ej`m79%VmwS$2 zMzvR#U`7jT0cL-N)$*FOc|m|ISr*g~v^sK&-{Z_^FSNB(o!3#WiUJE1!N-I~(xD4O zfEy84m?~#|z-ZJ36{@85-zhxl_^Y{5`({49>gS<8Njn)PQ-I_atvBE=5)d^LF1lI4 zPFQ+hou7x&vlf`k!#2N(sO`R^Q-Zn8DqDdOUl8bB8nPa%HpT%@K3c2_;B7Zt)y+5^U>9(!;Tp`FOhA?<6 zVL1ug2%_)q*npDkJ(Wq&8DiGoR?@xGZQLlF`CcM~!|wV_S<+UkcJLPVG|Yazr{N(K zr?u7kd$edh%6kgbzRCR>w7zmM+@ov`0Y>ALG(U%Qf`$gGi!bJPc$h0m{oc{ubgP_m zsN*g;zZ(*QU_IZJZMb6Vv~4_z0$R*N30PAYZ4h3@_5sahbP{$GOZjMsI3;dW>-K3P z$Z4MP5c-Q)Q2yH0&5*uRaidbYL)zkvAA~#rktq;&bBiXe*pL7a8*>Qtk`S`}2sqK! zM;cjkv#dBhoy^TYV>M=q~xO>0n5HK`hJ5y<-9EuIEB`422?n&!qcQY(^;w*>W-;o$#Q?h>lQjwef zOgSf~(0J_X<~o8F-JjzZ8RV%jN9h#bwRWZSli&NoF&J5~d1T@%nB#L*gqvC2)LyAx zF%fA~w#A!&h3HY*%Vhgz+o`&v_pKbx-P=ejIRQ|e;OtDdT77E0D<1F+Udn&t;mlDF z&Yr5jM~S!2HREi_Gnsv%jl%NhOF<5NdPVcgcv!k}ZspB2xh{4O2%p z-ja7bl%2nShB?091V>=TF$y!t{RALfAr3f{kIESKWFj-^Ad|ut{1IehxmspHLBYo`AjYjOLE=OiyPvtr^lY6VkTcCQTbr6SACN zn5OS~2;IY5joYk3cK4H(s;xE~9 zkUc`h#1@npMUx|hx4FFKgfk%fI^WVX_6aXLy)k?AneVM57px+46RkMI8;{ z5-{kOuoMP{;FDHG0+%&Yao#-LW6{27OPTBVnf*8Yy!8zpxV?zM}yR5~-)g_<_Q(k=n_7w ze#U!V=7FY8*g-k*i?m?Mo4D&d3E-xz7A~vsN7f0xu1W!{;L5hiu*W_$`TJtxPm}wB z>C_OjZi_*E8{wUg!<>yxFSIEc|fL%#gQJbSGEUrZ?U?KhsGeerok@SSSt&?!MPIYN$Hfg zefk*yOG843Wh3Xo1ofbcNF=HBCecP?FQvW@bS}fY%oemUc(p*;#mr%g`UUohCj?+a1~61{54jI5)+9(5 zDW|_N+2lElA{9&a`TCKWYd6YK#XieoE@PCRZnhCeI0Bc@EBQHU_SA^WkFvXb{(Agz zmvy`n_dLyC1tXNIu&*4ds)FyIO&?F_^`3ZWj0kmL$@r2DP6+y0U7`O3JD`Au8luQu zJvroRw3|<#)B#ZNty=$hZEZelJ2zNW|XqwG{V)oBD^gW0cHj~F9dq^N!ev$a-P z(fmc#kN-W;2}v?%w3XGXhOj5FymxViMw3s(tS3ZpKgaG$fBX?n6D;kg9dS5zVxtN^H< z1e8(;#po&}#g6+UKYG%z=B?fE6g9PM^M`id;RwC(u)2&_bb+=4aV`ob_W^0D>b4z# zfUFUvWaVJCL^btGw2{`l12G_Y^ObuOe$DNO05MZ5{xZpPpMqlodoHX}folT=Ilj?J?fp%C+_1Nxf9WZ^Wmy`QK zr01BHLVh~wQ|1_z^5U%#H9uZh49@!SazP6t4SUpD_iu~MX3qkgd=(i@H2zHcSj7Zk z)4~YZyOSFhgG-cc%PsLQF|z^$genoDc0#MqwwIu-Z`)(y&t1q*FV9Vys(%Tc;N@Na z5<|i(6hBO(xLF5dhlSSZx?pNF)x5DA;uXU69jCJ6)#jvs365x+<-9swm<1r?mm*q5 zzux;=et`0e{igS5!~8ApO8od6*;fuyop7oU*ffE-LO5DWnkPQlo!A>7a{FR*9#Y&g z2X&PfxfiTtIAqD0?n*wSWb@qL_(F`pSWJ1w;(2lOX!nkGdQ+O4$I=};{@B|44o))< z>B{aWx$-CROIK*ciC%AJ;#6E;it~=9BYj5P428gzlUHnTDKZQTJn6s{jawc32=)v& zEX~&urNqJb7+9e5R3{Ih2~-nuYBmW&JmP@_TiZLrU!?7gPAm4RHc!gj$cMr@LHf`J z{C3cJ2!v>x>*mDg7u$mfkAA1@oxS}B5W&PP4}L(TR;Cy(YzKp{aVi(Qt$b=1yd9tJ z61EyHNhm=j8$5(^(KPSGRC_omLQD`ErIl&wP%msFj`rTig`x^@VgUOfRAh=08I3KB zM~d^8C+fY;zQwjkyV|4}Hx#rkK@xf6J!h$EFZ=7X?J zUzCM-mlB$@yHNMHRfkby)k`7wEh-?Xu69_=T7)P@_%j4 zQ-)qPc)>2V@CjiyYj{0@UEMx&>*sxgVdJZ91J@I{8gBtEZV|wNs$A4rp97)SwN6l) zF*5t~C5k;X0)z!u-%#KQ2gky=xD)*5PY!ig-Q=xmBE`Ogy6+7i<;viV&V_Bf$a_*^ zX!5Xy-;|UP%}J$J1iu^e{9TY)^pKpO%0HxoPSv2~^J^dS{nvV5Y2R%&6-7$tb_|cf zOgT_`clrPUBD3}2oiIx$H)n)Q7s3T^;O6}j_EKl>808v|dy*tSl0RSs!6CHN4tR(7 z^U=tHf6s@8M% zv$DQ=)>p5RmgpOf60Ggb#Xb%01oz(J*T~bjYX|MNHp^>W)e9CXN5CtYKrG1sqRr3` zb#(w3{>FRuL{)mkkRI7^1xAtW(CQdi9%YmKW}NSTh}-;8vo68`Kiw%3S6?uH_gJHA zE=2!8oYZZz;QpdCzcx<(j{M%>u%+)IAt@HM3fV+yV=A0-nsXrE<9#RO{$`{>BL?T* z>wgWEk-39tgJBRr+^O`>@3SFrJNW_r7wQK22OcL)z4-?bLrsJD4|WVEci=zJGvY_= z#FzZp{~vCf9->NL?;nIa0VVM+A19Hq5&}TR{NFf*Yz;48G!6Wpo=fHlQxGevd|XRh z>J}LyE#Y<)1X$=HODHyA;XE;l&H?j;wRAW46hXeS7Hb`ci{#~xej1t~bJPfqZAk44 zzsTi6>+TD}XO*G%kEu(F&P;OhO7y<#9Jq5N^)P}y!S9`I`*nG>&q1t&hroordAh4z5;PK+VKl`kYriZl?C}ud)UdD zTH9`cgVU7u5e|xU*{SgBvumP~i8MO%^w1~KVfA!*L##Dj6^;FEW zw~G!j^cYHH3H}mOnth@D z`Lww|4+$$W24wyw&CLZl5Bt`+nGg71*>Ew?U3 z9nt2hSW^X$cBveH4zB-Sy8BA1)P;0is)?+vh0AqB`R#Tob=Dq0hcIHkUw!VhxH^l# ze$*iOniQmhLO^6gDW@RAMepdvpJp%a@r-EAyv$cBp^#RQSTD7eas~ztq3AZq(o&r+ z-xM7%dOp5N`l5-=Q{p8weo_)X2F129nPyZBEzQGb(HkN2+7tlETw#c7uUdzkiDrAe z=hY_EhheKW8{!TC--svI3a&tlGD_|3R}QnEIu+M#M2|X%3J7&fxnDPhr+$U2Z9Qm& zAs7w{n7O<4+Wr9PDchBKZ3w8{twiZ5*}dQ@-Nk(^36enbg^i_o<)9$*mFV-hOA+v$3=oyC}C+67bEw)5X_-9NniiZ{|9W-3}Ch11P6sUSQ6$h=SRhP%; zbb`>E@z|{qa90bwk!+GxqGUA6nALXwinH7*rf8n0$?AaDY>~1nVpcA>lHVBb%fb?g zIkJP+MWtSOmih1~&as~XonlXYS65Wefn^NSJ4_e( zwz6*MJ-^U;DABTE2pRlj`2{6Kt&bga0)7-H42>|{p0CJ)nXDw>W+3IOaaHfu5luRT z7-R-0b|~!9smx{1J962yB1d7+jO@+sG&BeCcrECsLJdhyW3hwJY;k%naXSQU*dy_? zr!mZbJv><=N2Y~9pd=P;R(R^!C`dJv(!vmSy=u(V>*xKtLz<_=HLxqX<=sIF7spXt z&|6nJxBI=2eGgG(0*Yf{())dX)v4?8_$~$5^C{bv;>6d#SWC%d=t~hEG?1Q{ptUpt z$Nj#sXrhh4TNi3r1Vh(6QccXTLwk$4t;u4rOKVkB`0J`I^h~U&H>E)Q=Xk0;oj~+j z)`7&M#3G(&p)>q9>H8^wCr4ou|FM}6J{I61UKU@#?*y%@*t;)k29izkNOAaO8+bJ<6mH zN|`e&rWOj^0yP+xi)V=KDL}Dua$76z~xLh%0U~8 zgtiMhGMl**JF=P54L*P9Q0SLM-C$_lPNKVLPF6}H16y)@-wm-7%e(ePq zAEQWh9|}3LG73UMW)3^I*xoKz%2SS~ISD0qoR|p4gcjk~!d}FtP;hC>9T)gS|MKCz z(#nN>&acR3zfZRztYtaDus{-O<;TM98{-Rmx_l>ClAs+7VF${+)=;MASj7zmOX=BZ zCih*gy$g5YRjJLOh120e(I+f``vPhkrh-wfW*C1x!N-s~9@2(mBv+US33N1DdB6DI zHbQ161gASFzUmnhL0$ws-f*EiM!0YbLsc-t_E&zmbT$SO`cCL6O6Vt_viVOk0Qd8} zMqCj-QT7MaLC~!(zUUz8X`zb0krUz48t^_J!*$=3YBoPF`MD!3LP8SYLGwx)VOMOh z7^&OCJ**&qUY_+3c9oKtEdRr5vbsY^_YW!Aqd_kSG&A&F=^O`D{@G63n}DW->TKAQ zLI8q>Lp~CD7mDa2y_6!KMg6zxnzTA^Ko(@8u_d14nHyZk0}|W|9dzP7(BiB z0Qdw^>@xv%LNiNKP^22GBU%u{H{)i&mdqQFpnee)Qa8 zFW*}%1zS(pX!=861dhbU1X%Tia=a<6CiSUNwii36=O_JT(rq9iobVGA15qCVf+LJ(u+$1z9)`%~7aFtI zsi@U2k;Q3NA88Dx+Ym5}L^0mSsmV+mBuAxCrhp@p+Z@Knr-gIDbT!?Fum_Cah7oVQ zJe&I%tlEW~{g^CLEX5ad(g-o?gJGZjF~_zF9R@o(L~s?R*6|l-?R^b@#i0Ei_^nmW zpb|B~V~e3-X%A89sKyMpc1R^0A5DZNj|{?zyk;o5T0kd#fR>y~HJvL+n<9_&H9ufl z2Bry(qazqVZ=9e7lMZj1HVmK_oFdCAPq*a|7Vy3|O2=dy_bK1ku>6~Elba_NdnWAK zYh%`HLj$%`41kM2bVD(2DWPccpM{vvRnK&GqL}j#r)rV^DpCZ zgB>&=pfGwMAfkWyW{gCJN(6uww6Ct(k^p66*Vv<*OlFG+CWPgBmE4P&a)edJd=eYI z9OgpBZ9*3rXk!qk!+H>nwHUaN(weCf(hv=aa-NjTp8z7Bu(rTIBn2dyw0VMmf7%_) zS)}x>E^cfRKejt3w0=%DT^tDf{)HUEEcySU7U}USWf)sgNU>^VPzM7nh3D}ob5#OW zhZop#u8F_jx`klw;jnr1GaTa-c2SGDsYhAc$s{!%=&a0bba9HpbtxVu*lVC1&Eo7& zXrfQR&bVq2=J9zoypP8=e7$t??)r&>y|m*n@Aiq7?oi%zX{K1LND5DhR=_;lhbbp+ zBZ&O66ym25!Q0exXafPdBb6Y!jHH!f?-fZw-jei7=f}$&4`d(-+isEpv z_RJaRI`l)djo_?f{DS#upqJ4`4X|Gt2YN#1D3$JaBNB5upU_s*3$KYn5f7ySpH|!S z4y6;9GnT$R!@2Ov(iobb+*(gwbFTqJ-Sj=D3CDIliU*9AzQ~E&aguA|bm}W+E!oxl zs3mHctjg4^LudePwZ9$iE(ay7>g;R|>#KFn4<#W_au&8_TTLP5Wp{KYp-T9yDA`L> zE$DKt%S_QVGBDji-9ur;Q$Pljhq2^5JaUm%)+Y1kRo6{X&uLoS3oIR-a+MuQ@Wy6& zeC@2rGB{VVteX@ZRpU{xsrCcc6~SS5%V~=Ib9Q|ppWFaV*Q~V#44Kjbp2?-TG_8$g z^AhEYsGxk)O7}uVz$!S=i2;F}=oPvwA?+7XH@{{gX{26D@R&}jEob^Lhd8Ra%CBu} z?Myhh2*?CGaob2Eu_K;^v*yl%+f6o&>6lt#zq%a8HKY&idPd64lzNm^lnB4k`cft*hoQ97chWI~ z$#=of)EU>pYg$>Wx1OZCMlHoaYLAekn)71Rj{}E!xgdWgE z3cQentX!>{5LTFJS9o>lCf?egKAdX#X%_u#`H5a4#Uo3*K9}jx7d=K6=eEvNEkSb? zkqUs5w>Unb2xH)t+_F5+OXOKOZh*5t$|Kroax}qkxA`+rGA) z4GN{#-k}s%dmV+24 ztu5HKteJP>Ko8={3NO|1_r-RoK13WHSo0p$Fu34EbN6n#46h1*Ov6 z{SfOcB7r&6)Oj_!v6`OACIqIl&nb81RSP0%jPrHMfE(8ytN3yDt>@73{RHnVg8RHDN}*EP*=F#){4 zljacO&J*t1;srm?(vq53luGZ4nXK5F*)w`MAoTc(%{KDXS(Z$pZecd2(x}gto$C=P ztjn9$^@+%PKlRJp$N7&%1MO)#?G&%oF`{(6Vv*xcU88cF^VpJ>mT+Xy?7azP62KtT%!;0$ zrJB^dlCGLuxbj@n(hgU*OBEycH(F#Yy9(wb9oAukY}+CpE6V+VlWNFfSNlj6gF0m9 z5<-0V(qtDmi(Dz?sZ{p2aP6rp<5uay&6!v>K~bpdJDs0=>CEigucw9I*$n%%y{~B% z`dY5V@|g3OuJ62hd3P(WJ%EVX79KC zkzil=c(RO@MfH5g`8V-z1QxMxOMRq35Z5EVPrdBFBb;ZSem%k`nQxGin%8Dg!>y;E zB0Xv+-M*RAtq=I~mkaH&wM*@}`i8$ARLLE<{w_kzFi1@yv{Fu~aslF-2Fg6`NHd^t z!}Vnw>-Z?iA*Z2NES}Hnvf(@oDWNj?R+mk>_q^J@x?L2D;b2;Op6FaJx^fXueJTIl zm^;Ida|1B(d)Xk7rd;2DrScxOd}D_p|GzS>0xFJWX~W_K_a(SXu%N-+-JRePoW+7H z5G28q#ogV4yE_CAPH+pB4W1zXCjWi8_r5oKPEXBORXx?+Gv{niSAU+J$!C^^epWF9 zp5gS;9<323y20P$ZUQr%b6gJZ;2!n&QOq?@mubM(TJ(dIR}LxrJ9Qk2!@_o#;PK zonlJGnQrci*Rvo@zesf>;dw@=Esz$noTQJOx>m9f$zdGa;h07J zu){HXI*TSm%J1PBjkwlV!h&4qQfUqB_z>b57-~9os}ZQYKeT&-CJ>*MoPydYi=Qe$ z1W?P16fj2OLtIDk+r7@zzUByJ#?mj5c)O~;F z{R;-mkngQlg7Z~0DAvy{IE@%1+EAYCy2{N&hSEQ_=RnUu4;=!sN=18g>Rb+Yc@tpp zMl#Ps{shN)Ht2!-5vflo^M~fX-c7Y&*JyQafhSu&=rzP_;TF?vC;hIeB1~>hRq)Zo z{aOt4z}QuA-qpW08!lvdA8+BR7$`VFi6?evwE8_s^=t|Z3QTtakYabCaefjVeT};7 z?WG?=dbxLJDK=*tP;H!a&N4fPEg%ox-=^=X7|*XS9aB67#lE);*X1p_lTAkxT9yN{=1v*gB0Vqm zg~fJQ~UP?hibn>H9hC@5%JOS}3*PxSdL59BZ$nDGtswGDAfj6$0B+z#^)H90_C9 zpC=OMeZ*ZuNvG$^9AlpNk)DXpDadt#5u@C2iYDag@Jlo-V|gHoChVr#JO%wTG|rv* z$S$e%nX+@T_ragU2W(6kvNMu%!oLivx^)%c1mYt{Ja4j|c^Y5hq^)N$7Kb)M%RWyh zQ#JNQa__VA;%99Ol1v5ZCGc79O317ct+&}yh(e}K9E*CLo>y+4sopT5a;=A*%2HIB z;Hgz7W~yYC{k+DB!(wZgXl zF#Vlj&J(E1P17%3t2@0BQ%aL7fU=hhk}SMcefqkTuW?MiQpwOJU>qFXC-jn+#r$e9 zb#l{rbQc#>*Tb3aTZWCl@@nw%q@?8 z9YfE~f$-Hua&{blp^plwAizo9bDHlOZ$%ZdX^Pag%Y(eM-mkvg=#a1Co;yDW1-~|x zH|zEQ?3qdv=ik$GiXws0O@(cfuC>f>;gF0XWn+pXek!cX<&Uvmz1KBuiM!j?`Dr(9 zIYevz`2#6*#Z^wAsb!?<1ggt+Z`u%uUNEKotRs9dr zik+Ti_twa&FdMDh{e{D)DV{Vc`A6UOijO`nM;pg_u3wW9 zeve6Ck>hR(_n*(s0|2j*0kgHNd+3ws@Bk(8hbyk1sQR`UE7PFNM4xaJ>YwG z7s&8Lb*k|93Q$koVVwjsw?Q9FNDT9x;HIxRS*qHE_tVA>8AwRYkyzG?(-V)g^C_p; z;#=OS7E*?QBZ*;~#4GEGFP!_*!V1U%23@jkJZTlvC!}jVq$jjwoi-KoB^=*GV}_b! z%>$Ed?6t44Vkovo1I1_15~Okt@o&dACCs!w!>4`f?(5IfJX_PA-zs(dqPF|9bW1l{ zo5sx~BDZW)Dhq+9I0#Nd;ykb{5EZhAl}?9n?yU11{FcK;gL+vh_u6{u#vL6YX*b9U z(*&Wiy6`e+D-~{&UeS!+e8Pqty{O^~R(B&(jyuDe0z%DFY0aGp$>q!%$wH#F^)W^C zyOY5W`zGkGK;N3Z?HMZMXs!cN1p)}7`$ar;ur-~0t;IgY`IOUf5*w?W2Tg|=MG@I6 zRz~g-fjI<;_?vFZ(u{(1G`P2(=FqcIn~AZBH1kIY%FVh+AXFX?5hLDc zNpLPsoGa!rfxl7;E}$$$#{%}B`}i(%~0cLuwT9I&FX&!hz-VpIVC6dGROdFGVREz1n6 z)H1xGhPdjmh}nzPLKN{w)f6BzMr;azfBX$Jd0Ju^#NT@uoT0Qo?SmAE$xS@dcY#U} zWc5O3!Df}LThYx~VxmxWQse+PjCI%pwNz;=yiX#AVgS2Onj7&;)+!u>SkZ@r?VEs* zEHKCd4*7z0`fSL?ZB%DxO-LMK#1bhwr`B-PY#*fCcym_NN~AW;;?q$=AsTU{$A3Lr zs(NMm<~U}2)|If5BBy~30c05E&wn-B8t4#7m0lfD$=@CRAS&2FkLMH55K*5OqZ%3t z_!KbLPH3Q^++J#rt>Q84+{1bmaeuKX3U+|a;J0!)y-=Nk8sBWmMT#!VQR0(qP0QI{ zOsD$gs&Hw}Bh?#-aL9ahec2qtkQ+cUABcG6hw*cFI|WKdb%P%{rB!pF#&vCvI5v6c z_yfsn-OT*{Jm=zRL7VMH;=aU*LFiW(+`LJ6Jr203E(C2eZHg0Q@vNrtyNz@0uw-j~SY&3eqfv$jK< zM~efkJJvLq>j#B9p_dk26drpH{c*0=qSEDYJ}+606IlV)eD1WJ;zsIVUBu87JB3{K z4z&L1WSAGU;a5~&860Mr- zF^_VMuIjlgp&dk8?E8W-0$TtcXGB}b%sEwdMYZ@Cch4SmFW00GMp(@lc(087y*zC^ zpaJ4~_rl~ZmOV!cb+~m3`o%vQBny9vMZ?#<0a$>Gj@o`}Tg^(p?@BPNfgbchs~GX6 zNwF##l|P-QZRU;2H(;M7w|}_c$L`EeC_);GJJg{=)O;qz)pj|6;Tm8ruFvPeXnMtm_|PhovDv++ZTc z^cCVi5)g=klMRSqTk+IUf72vz%#(plv}VN#!Y3u|m+=m~ZwYV-mUE;f)ZwG1h$?km z4ZDFZDG7skj`$1;)`ROiVH1mPgHOOgVxv$;yqq;>+x8c>b^GmSqD!+Elj~+(@Gp_B zByqwS0m7KwbyU&4;c)5ji+N-FJXZFLL>ow-gm{i;;_<0C#DjzMXP>Rim9c@1xIuvY zLXX`#nxir{%EYL2M4HS?lL1Y%{?)ATyoFu#`3u37Yt@gFsB}V2EViSg%dZPR(^2_P zvl}zEy8FpN`<43cKqb67`PTSUGJpp*m4)MH!9Ae8lpqeq1GS(v5><*RefFc9L=k(ydiZM^EQeN%b8EtlUZLPqwy^LJ&+*dZO+@Kq*%~pr~ zwkp~W6E(zmjf+Kgt!)vtgFx2n0DL{KHE-f3pHCwo7mms04)OWEHFDe6LPea;muz9` zmzxf<)aBtg}<8V=;?K8eX$@g5Gy3mRQt}Yk8{WBcy{jRIF1?gHa)z zGB1<36<*)OT9>M1w7ffiZSZ9z8J$rsQSx@@bI(c$D%V^5lpXn~R%_N6HVz@V_S}` z8_u);GhCs!d+(S6M{&C_c+a}On+#d98hx8bRL3p*Whd)BBFzBu$_B*Zfe&>;aHHal zCWvb$eDf@Jj4c|nF_Z#FnT0F)h$>j@>P;G8TSL>D<@(fy3%?-id;-EXyBvRk(C@Mk z9%$=PBqa=D%aWtj%NRI?UuI)#kZA8gd(q}mlIl&S>72YTu6I!eKIplA8H})HDM8ds z6&1f1e4~$p#;X({eo%4H17v^O9rDaWf=(26uE?=zz?SbtFxU!-uAw?Ij{oT&k4t2Q zz?&W*{()i`fn7cbX~bP3>6Qwf$cmV^MU;veTY4`9(I8%geOO9VJ|4+8CXGKpd{8)E zPN3T~ezO{5Sd^I8ijd+uNZB)>pIsivnPQV7oLy9FUcEXro|oyWd=M+E zy1I!8ce}~~-B;L$3T#)6m2*T!j?}qDirA5r9cMo~&wds)oCRw9K#up&864B19CVIkx9SioET;Hx=-@BDh0%Ip-yDF|8m`2q^`h5e)le@flJm4l-B<5=~>m~~&L*)sZE z_25ugzX98%Y)U<+*mesaL9rIDdWos}{I(C>Ym*k^hXxX5A2Sl=kUifG8d7#Qqm+-P z| zj+o_K@l_$?wdWSHiB{5|w>I29*-qk1n_jurH;kQVaPb~g2`PSQ-)L@gsJ@+I|2`xA zvc3bnRCDmk@FyKedaNfK>!U|?7W)(z;ECgNIfc3w6ItCeX64v}`5?aD*6_CR`lO{I z1LW#8mBy7sr3Y#eTwvW#^tAt#R2iBNlB_Is#- z`(v}S-)Gu2yW(fx@V2HO8I`O|e1ephfNL+>PVeGB7)PW=b2#POFBfDd9nCMYf2#Ea zEA=zy7;IZP<;P)Y_PSEh*NbL~qn*q8f1A`G>MTa=heG zPi=gki^?g;8MqjFHNBt2e>DPBR4i!L0+*b#j9Mc_#nI9iP#OPsq=6%Q50dkI43`$D;B@g4K1=5(vUPI{NODTr)B&;*A%l+pLeFCLmfv{M z7l$290;IL~-vWwYlztmZE0cuV zN1j>9h7q@P$z0tCtUhN9>(i@Y1cR$AG6JAai0+i`6bGt(ubxJ$CqHF7>IM>l(<9s5 zR+g;XSJ>7@zpQ@eQ6YjF5q9;R>D&c#(?{U~!P-#9JA*+p?K?uS78I7NG$^KX_r#XY z@qmjqkA=n$!;hv`X??#yPPDi%`tD4{VBWjrr>@+s5$$tfj-)w6hXaeOImgGrt&>?*!W;e? zhAtR0=H4D_by>LGt;vXS3?VUTF>|8-oSwGjm$(+Z5d7DC)pcz-Ax-)M(xcgsf~it+ z*$Ld@osK6FTS09Ew$tJX;H+9jJk#O?r{T#W#5{#7+2g~f{#+uVM-B>-EF!t*NZLaS zBqAoYjkA_f97!|ywWY&Z?s$SKDDt2wJ{fvm?an8+6MKdX3(^7W^y9e7w#r`py&mh! zJ1IQSl`Ru`_Y;3g#yZDuM;(Dp!iR}XVV+K%E@=kgqj}%_h6FMp;Ler>^<^a+r+|#G z(1V7Q;wsDReDn{^DGwB%a>c^Y4Qqgz^~;jwETE|$z^qGuLzl}6;%UJ{12g%fr@}|{ z^_|mooeA?MS)K&uoxXMydt-9ZAo6K_HSn1x3Dtyzp_3%$r=TRDycBl{X=GS=F>Z>4 zs~sutYU@if_Y;%{Iq4?V7BZplcz?LNapHsfp4>p08*=?C@r; zWSAfO-9jy)+jh|qzKCxxh1~$>7DI2J#}qO1MA`d@Vr%Jhf@6}HpMkE3Uiej7xO}Yh z&aLyt^<{b<7M1yleqxV40&2J|X=oQwifx9$5vBc?QHojHF?!I#qBv+(|6%wT}iQy`Mtbu6Hw* z+4vGMLBH9ORL=$W6^fe6L?q@F3wKqr_JI^Fp*-_8yO)kDchxkl)@D-%>$xaREq#=2 zjm=x(nnt0llwQFfCVnJ}*l}Yr>aP@ZwKPt{5^8e{*upBatU{SH)9sAqEm?!>C~$LE zEcnlT2ZO=p1-_iFb^OvQWHhmH(I#Yh$|@Rb3O}Z|hbku%d1^hW8Oay)=C9ulAy6+M z;3@B{o}ZlFQe{^QJNjUuL`AsdVz~JyQojiy`x#1m-^v@j3ndzjKB8o%c>$kFM`_D^ zrV_lknZdH>K;pY7sYrr!Oa#Oqq&P0DLoe-!BO?Mc2~tUbUW>INS9sL%!q`RNS#}hk zK2swKkHnMm$vUWt2DL@ihsBqX7lcyIIIH2<(n61KdCKupyqi<_@%Yad2DU00Yl2CK z(Hw;};r+`|nyXNa^$@FQH;9|Nf0}Hd*bx%QC>BZ(`hHFmSK8olFa*fq7vn0EnfRkN zd=vodjB1o>lPk$9;G{{SPtcEZp3*I}<2-RCwmw{w?i#|+Y0P7Hk}+8}ruFq=%-n%v z>yNVIpsLlAxCDk;uM$?!SG7f%f6f1~p;eiu&(}$ zG@AnR%5WC$4_5k&3i7diQ+01)DGgbpYa_)Gb#aZsUu`ZWms z@k2W%hN-EKX#uq&f553@WX%6hbpNXtAt5k>3h{p!{HpZim=-<*f_owalT}V=0Z^IW z2DY*ke}&Qt16dVdAPpo(0U6~#m0_LI0w#4^nZ{2AC^}b z3p@9Jx({|P2*!q-oRLEUUjd)}_w(|bX%ZfmW(S*qbNtKa%o#ErNC;ysB>Nwyzljau z;9yBme~yCSOV_`g2q15v7_eZKe1VWEC_2E*3#Ooe1o@&s)}hD@e+T`W&I?9rzX&7Z zk@!>7ub?Hpf4eY$XZ?ryzj%B8Wj^Z%Gv|ZUeE(~jVfFbD&d(;!^g9DhcQ`hpgal?jo!B!U=U5d0&? zzjsu?!O{Hdrf;)g=43qo*P~Y<#SQx?lFii5NdE{5LfRw)98ojGu&z&0#*ckl{ zP)?KoPaJ=L#`*8yzfJyj;+QA>AE$p!VE+}o#_VsW^(8_gbtNQNhrq${!+xCjaB%Kx HzpnldrMqp; delta 26705 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 66c01cfeba..4e86b92707 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,6 +2,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip networkTimeout=10000 -validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index fcb6fca147..65dcd68d65 100755 --- a/gradlew +++ b/gradlew @@ -85,6 +85,9 @@ done APP_BASE_NAME=${0##*/} APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,13 +133,10 @@ location of your Java installation." fi else JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,10 +197,6 @@ if "$cygwin" || "$msys" ; then done fi - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in From fcb69f684b56ee254c1f2997046c482cfb9906ef Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Wed, 19 Mar 2025 03:05:04 +0800 Subject: [PATCH 020/203] Revert "cleaned and rebuilt gradle" This reverts commit a435253e05b7e8cbfc66202f0059a19479f058bf. --- gradle/wrapper/gradle-wrapper.jar | Bin 61624 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 1 + gradlew | 16 ++++++++++------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index afba109285af78dbd2a1d187e33ac4f87c76e392..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 26705 zcmY&<18`@-vuF(+IrhOkg;RYO1Sq>Zm0|<(MnS_T9iUDlc#!Zsa{wMs?AVYwFfH=BXGJ}KsKdW`j z|9%OC044k<Hje>M8N$gZSLYWCnGq6fnqd6AU8n#gJ0;W zp#MM))9^n~jU@r~&+Lxi{9j{>uo(Ow1d`tWvjhqd1Wg?nHUGm2PcI?}@Cqz0M^ zvsh5dIar$38w+nB?xe-{T!7s9f5#5p<9A) zC}gSbwkjVvJidLP;f}BS?)J{j&inPn*E6!EAmm)QGwx)Af+R*?T7$kMZHr6MZ`gg^s6@+g_yOtz5 zQOX_uM_L-`RnKgb^~&um^u_5~PP4uN62 z#>vpU`U??A@D8uSb)tOQJjvnS#a;>EjlYIz8D{V;Fz;VMlj)(%v&y0%3U z>f$S+RP&pdSYxsmx0UITY@)Q_VY*6v#se=qF0)hZHd}bo{r*vz3C=jsv8e;t)*a&5 z@(3#a%PwBaqdF3lxxSzN7dDiy79!UHsrj)a+~f3Vdn2AgrOHI}r`(fu>%cB3>mMXM z2#vo~i+G&=_4jjzYFj~rMWH!%nS@WmHqzYsL3$VEgI#uIg>hE6{u*k_uv28CFV_zC zJUrWW@nIHS0&hg=KT)*}giNym&CqV1A;)G)s=9rb1~*O=yg5s_rEJVcG_H)E%5B`x zr9}w7`|`WROZL(VkmAAW`8&{_i@!ER5l8bR6#?vU|S#o<3H zsNAR>@QMCXCDiP}7^vOy?Ib#>4`lO{?eQSdc)>f;dqspS?c~aKLZupxRu#vew+bo* zVsyu#!|j+FeZ@aNfE{Qh2LlOW)Lw)KBfxALJ5_H{MA2QO3s1@>8CdDI+jAhp(# z+~LB9@)P<-XO9l7orTSiYe(m;$GTiSkkPB1!rL4U0^h2IT^XY+BRQO1EoCkyj@;rrXIdCBmv~=q)!3qT zY#|)@@>?-sl>7EfEAHC(0~l--{qGM2IL+G~FPDP3<`7RqiuFl^<>a_^*2S;HM_Y6C-Ppb;vWL zYkGdJEqMJEDK%tLc~emjr@KyWsXCB6n_i;t$=oRAR-+H=S7>1xn1)%DCd{C@68BCE z5Ko=&=Act7rtrZk{VYet6VquiM%cGH#3`{_#37r96lV}RI(wmviy;9$z)XosSEfZW z?e)UsJb=Lh#H=dQ8;mgyH!rNlBDsO>L83*!z@+i4NF4>2Wq|+PNiU;17g?9Sx7W8pK!r9z=h@lv}#8M7T~A8EDA(h5DFb!bxy{b$)+hvZ$XHx-gM zv1$JnFjjHri8bm6DO5hT&Qo`XwJ9dGXv82JVd=boD?c|szs(b5yB_q~(yqA2Uw30| zg*TRbh~4+Fyrifc+vKNJ{(A1SMru+k6mX}fn`XIhPmVw`W1Pp6pm9LFMj{wODmW&1 zr{rVfAH_Y~=Oq6DZ5a7|@O=Py(e*nb#in!vAgMt;D-X-vK^nJbx}>rH&6d~B8zpRK zACCxwsqYL_K)db?bb;;JEj|XraCBCntoRdv3E@CZTiOyrU~groi^7NKY@>SmX51vVC^ZS13yWXV5A%hHAr5;^7?S`*r^S zSM#kmds$18W?Mft@Y~S&?j-Sp{J(;Cb2;1Re}Zb@AKd0%&Wrzu7k_YpW|(;Y6+3SQ zpqtNmX8)sBKKfs3VBQgGGdzFwe}Z+J!0SJY=0@S0|3IOb`hVa_g7-f`n?pFwTDfnb4Q|Tb@IhX*3Z)D>2nq?7oD2FYxx(c!<5Vbes>u6 zEbL*e--{Ox6W!QPO4>j(X^XyzP{mkQyf8=vRS0e0qXnN@hwNRR)@GcokDg=3svbum zPOLK`PB{wC5WA5?Rn8cva+tmY?`8(C8om!F3@{>z!mvEj9k=K;JIdh#MP;bgiw)5| z7)+^Sz2sGq)<^%~lU>a1&XhM1%_9e*leTPZnaQ9vf;5|4x-}`urbk_*lPi+Y^ssRe zQfrCP5(Ukrc^eiUU{xF%1BI|VT6Jt>x8VdFLd3V#ZgUp7c;~-Q*?8o~PiWyf^3HB~ z14OMo_<>ts_~OkEr*m;RtqhyuD+yos4z8B$_@}PPeOHI=?Cmm9{JLM1Uddo%SuLJY zf^&r4>KgKCg+UCbJvh?Uzf!p~9VsbFQ`P`qsh%nH@#ve<%4E26#OG&tC>dcOa`4=7 zQ`?QftjEQva{5J9%$JT=XrE|Cn#pI=1nB*>V7%!`8+n@;4L8q}?v3TCpxUO8z;g%c zPy1E~_+)Wwp63(c&i4?L+fHW*C=(;zDR(D9jVG6@-sU2~2DTs{Ak26WIrhuDpYA&jr-Uwo@l}SM zwsJ(KjEPDM*}^zZ){A2+4`U;$T4h}tK6b{IHel|-o{RRVwGU5`{9<$9$TrHZ7g|I? z;m~w4)!~1_W*PAD_J-I`muHqVQWGMI1v{k!V7oCIxQEs$xtmKa3P}!O8|rthEb$&l zWJt?GsQl|B#S*JtiuUU|K@C@T(P*^L=+xw{NlpE+2G1sY`;e=eBO)h@r!u|l&K*CFZ`XD z+uLo$=4rW*nJi|-xk1{6Jig@&=eXY5bv>9}ex++-+ZVGXlaM3Zx$9ErNGW z^FxM3A0IKta)NK8b%g@9ivhqqWq!asp?gP^&?c*z^+}zawO_x7ZdCIle?a~3S=iUG zP}vCz0)h(;0tUhi4BEj0k~q=8OoaN`9BL0d0)Mn$m~M^<5Gw?w zT5ec9|14Os$%pZZ@UDWW8{MejUc3`t_jE~QU5tDXx1e4)XUn4&;9dv=2)|6=m?N|6 zU_|d1^Rx|FS(#^5o&r;WQBCtP{GMT^P7J@!epu%=`6~HfkO0LMa{3+U1%broB@d^i zGwP05<_ieLz0Dg4zE{sFnKtwdPs}N@u>@Ll-{i0mpMEyz8f1{IGw3eLO>2LXWSY83 zF0?yT^4{8sO`y9-{c7LMqV{1Wkc$6{nkgaQ zHY(!5*e%LHoZc$^$1X{)`Yh;8D&6{k`OZFqaF?Xqbj9p%De+a=36}(XIYX8AZs8lv z$72Mx^7I`}jw(;$Rp(;5Mgvyv2APX}s#d2k1K|`c=Ue>$J*E>b)c&xLARq{EARvtY zGo%=R|8^g7ntEF3S{PqQG8rrg24rv|LD~frDAMyAng!}{G;;-MG+YZCNWV#A6)hGr zVMQIE9GGYQZ)=4HdLeW*uk^Y!0cu)W&zUk5uyO`o>ibq23_6W}D4cNp$$W5Z(e4o@x{aOaE2~?l z?Za2Br{{8Tp$s`%r}mVxcxRkgN^w7AD;p+iFV3qJla(i?s@|GxtPi@#9)Dcm0bV0Z z<>~Xs^=uSRqI}bI8C>X{2RH~f3lk(X*cak$c(<}lVAc*&jafRAJBuAEVD&lgqgqU@ zB?BgaRu%`zWe>F22{uQxgGp4Q2u;{7GYlwc;D57mH~6oDZBXB8ta&Nc+T&zIqHMySE4XWK6sTUTdg3-E@}4A61**<8`i+3U$mI{d(l+(Y=<6 zuLM8W9Sdp=mKX-@b@edV?9*x(uw_jubx6m;z#+kL)LG)Vqk?;WrpbmE12A9E*ASXz znoCZ|!q3Fr$cFY&Epw%qx{jjM8zr!2m?b!h>1M1k)bto(k(2gGeZ6w_=L{07t36?A zAruA(w=kvM!t2VHfM_+#G&KE*Mszd>HX+E5Lo`+30%cC;@z`6yj(tz$jK z90ntN*FhMeG%pzW^SqcRfS?L{n#$l=XTw2kxZYtcv|i0yM5t;fx(~Gr)K9X zsZ{nQW-X!96u#U81~*={{qSq$o6EEogW5ZT+MqZ1{&KMAaR+b*&_rlZ;rMD*(|GZu zo7ehNjnP55xAEMqO44V7DM<>^adnlkZbA5TJdI($;%!?8dj$x0%jKD@0Hvn%h`Ybx z=2I_UR%o%rm8nVg>%4*QIY-sU*JKvYdRu96K59M|@qx*ahc)%^E(cu=b-us0RZ5lH z{yJ_zShJfQfdionaBNwf>bUUHu&sB6CDvuJ8r#N|>t@p2-g&-_YaCJNO%-m>88LPe<8mM#zJ~2?Jh1AK$f%c(Z4; zW;j~dAmr8_J7-2h07FQ6F%!$|#-Tsj_kS*7T{ieSOYt!O zFvT>OnWQ|+6<;nn$#aJi@_6bWxihc-Xx=(+C~3y}h0S-6@YyFE{jMlrlCXsq-Qo)a zLKEcyM?{4d{&O6iNjk|Q^fKHDgxxDfwaCfAh2$NTD90848{*O$v=#DX`^}JKLO5mN zYJVZ*8}z@NC$RS%7wGTt`~TmBRog!^{!7l*{?%7S{>zOfdcXqxJXrygRH2E=G<|wj zVg(StiV|B}5yi#CDno;#Kt|UHLh77G4$)RDt#Az8%4p(r!kxl4yKUZb_9tYZEw>5BJfTVkMhMi+4zBv;Hhef;zd0^j~Q+>Q;V|NT6A>V^>-TJe$AMD!F4qpp9G-^ol_{yzH z9{sUOMn^Bebvy@*^*s4dFm0CTI!Asa5gmp&GHo_iYVApEj&Y*H5JV(1#<0ZL++S>L z1u<9QN5pB7rstxB(SWx$#do;rs7E4gA3N-z#}}rQmZq3Jxid~-Q)=}q`54g=AdVE(ML#t1(aUiXW-K#v+`GX9?>PjwMgmR zx~sSqI|}kAoV`ZIx2U|lshMAx6HIU_na*D^a!pimZ4B6zcp|JZ7&((1cato484v3P zIV%MZ_V(BmGwu+TCa6C)@_G2>zu+iQFAD5^dht>WxoJ*JeSD0pkQrIGcQRCg=dM4= zECxydZ{%+fCncT8xmIJ628En~%WkTr486jev2Q=fY`4#eiU7SSdukcs^NG%&#>w+? zGFM{E7h@Fo{TN-+XyJ+G*eqk=r76|oOtOF2)g>`?eCibr1XOVTWZ&PbVgTt$Ws`~q zmCGD#S#)Kvw^0!F}YAIN{EI2v^NDN}^K_5JU>3@ctEIPYIoC*Yq$;rPD}1Nbh#t-a z*sh{_KmeCmr9YX-qgiKb+mDi!@ad589BR~8!K2=T{O2^}5JD>B#~;ze+V|2Z#FXY; z{_l3qO(>Fom~P@`rd5`#p)pKt zX8JwvC9nq&%_f7U+I7(0vm zw!z+~+kBb)$fMaH8)5FLcG6ypaO30`)P->8Ar?Ng&SfC-N}!C06vT;H``Z~#Cj9dI z0y^BZi@L=g!Obk0G(~l3tTOxf&nl-5WpUVaG}$i&fD$LS#w6))EDB8OS2~_>v1V8H zwlrMDzN+0anyB-U4l+hgDGB<}gK0jowoaNZg{`g-NBf6ELhYhA_{EfE8y5~G#4Lfm z+%*rw2gV;#&tg3+aQlhbNlQD$&ytH)0`AX#p5>J$jEa>uDHy1$mrfQ}c^scu5pk3U z{hsg_fWhor{ze&OHM$ZkE8i3R+Q{IQ7Lx0K|q|2A@wW;5%?kgaC;XCxap+@qnJa1+rBL5V9E=u11OY zLyc3LB#s1MofKR9_zo-O8AZb(_L2iG{p$b~t{!<&>+Ku-e=p?)aFThxf5)&K48UCg zBVbvGI&;c5v)c|_912tl5Zecpf5o9dh2M*xAmL%WCvF1 z<6q zx)5SEeJ2==Zxo(WP|U(&GBdz>CgqqRZuUtTlR0_7#5xTo#MP}XO<&HvZoYj*48CJ# z=LqYJww<2iOdaLfiCzm-*B_bm4Skanm{0yJ-dZB$&%(i1p%+?DS zk%#Fp3)g1p-OQ0Ly?9Z0!n3z8c%5z$GovTa61|F<^ifGdx3BdO7?HPc&*%7jTk4m2 z+5XdlY1J!Yrha}sg^>{N2BQ|b6o8vNnrxw+g=#HX3TxvRHq#|OnmA)hv@vF!OU{>Y z@u8a;7Y%Jfgm=Xa)x)M+K-UcS`3F+2yy70#v1x~pxt}yD%#VkVz`>r{DlypDjvMdDDh4Ze5+Wb7 z@~hr(b9cF|xV*>lqHHJb2jGpbYm@u$^VR9~<@q^6OPl?<4z|(3jA)T7U52dg`)a-8 z%{J=k)=GS(jS1c6R@d3V&Xcf_lpgdS8jNSw4zZ*pRMeNpI%&5OX9^pnu$oZ;6<5El zXfBURiO3S;Ez@`%d7{Tw?Rjk$G>a;n{4y{9URQ$|MV=0_R^(6C8bBZm5ynN@rlibp zNa3i1D}ne((4O>KEOimeUhvlP@**RTe;K4@N?7enp0t~mq0>|}#euTFI}1T<8_O@v z*@E{mYKu* zuIvhJQ7#t_>`k~cIAD>%U(r2{l^uRsuH3r-h9&-b$g=B`mpa`fDGMsslKZ5$< z5d?HlipC|j*^%G8;MniP^4(`~hQ4ON>){di&fS{C0qJ^B&^>GPX5nQUuP>tVeF;O* zTv=bBIOHo=ng=spt(&a(a}S^#sMeAk={*ftP^5#o{`_{N0Z^X!L0mXFK~y@}K&s%j zHRwi8m}+`e46#M{)UHz1;DA*wfN~}OGzB=8=O#O0v`)>|xD6j3e)i~BFdK)$Awh($ z%SySjEUa}@`rj0AUe{n!6^WS5Y!#~@njAMQ6C*0K!i=_Dg@1~9XUz6qN_ z_>VWz*_>iT0T#(>ki!`$`z(+UqmEQ&!VAn;F4qbe(lIzG+-)p*93+OyVA3LW=6{i= zsfj1Kcu<8$lnP_oIgZTl4{O&`nxqVqJF_pDhe;h2>rm^6RnqQ&_?Dml)T1C}$T&Wx z$upf}XO{~a-(#Y`R?i_As)AEb)ihHh6U>VQhfU)R2OI?(@r=>#PZf=}+4yCTw%L9N z#@$H&01wdR!30+EoWBp)sI7L8~ z3XILQn9>ah@byy0oS)#TEnpCE-oxkp8j1l(HckgGfCo9lSSmDrH1f4e618~ukr_KI*nsU zR3dKM+hQ6IeP6!IvSu25HGR5ZyqL3l5Z6x5Ax3Yeh1Q9{0J*DPBF&$39TVgnUp;dR zT7i@J;Y)l2XNoj|4lX_(y4BtRkv+h?_etL55+IQ~z3hf@(GeNaw{a3ZlA8`_#ZkIxB+E`s$ExYKYjQ3>e=N z`!Eg>8YDK)Nw`&z8-o-(E-ri}%V!ARU;}0l4(g2NI)m;P#IbHaMq<6J8L%2ml6IV~NI} zLsSK9OMjG7G5R2y`gB)_BN*f)W+POuXKMAO!R0PKoPXTCRVO)(nM8lVLjjWVSzhFX z;r(Os#J%P19W@{a@g`$8>Su8Ljg3V?l=P$_Ua!j5x<}SYKM-vfDikx z_<`LcWcF9p>-!s4)31W1L@N`12SiS*4}p-rSs|8}h!1kAg_kiXA;|X!B?vOhZc#=N zx03j9^UtCA@eE>XGW#wDbewgWvAz6gb^z7%ti*A7>2oZ{Y*CQzEGfSQ4R*u3&xqIu zmxJU!5pUX;4D)_!0g2u1!v}mB;8Sn)>B;Ts=jBa8R3xFlfA(k9#Ea`>tWdC2^e(~> zKdUVYHVL3C83w3s{bUOKHo-*vA|2M^XlEzoK>V5}om6Lm9Sa7@5K6MZu@as@^+>Y1 zl`XI6uqQ=$W9+fIWq#Fy`pyDav9Ci(?Luid z#0i1ZiNvn&i5H*vt!_hrYl9!IoIIJ6iq;w(!0cQ&>c&sYknh3El$!8uMNsyfB(;o* zt9@+?$(UihOP@0lX3GtA%FD-*#?cX0z~2My=C?MEYTH}GSI2QkZ#4Up&c{^u0eSBi z{t^oHj)j~9@GJI1#rFO$GAoZ>DJzFikJ50(a~b zwe7pwgAEnt|GVWOvE1BU;p1DK(M2Xj`Aa>zE2ttF?_{)BfPS44=VEHBIm6~V&I#gC zwJi?B#)@nOz!lwml%k`y;M z>e-2c&tkM(I#ud5T|si%jY>l`IAcea=zdYF>WtDS|7fPt=JQ&piA2QiO6Sw>! zt5A;QT~|#D)~v&$M>aEAJzSA@@z6_vh-`?+=!r)I zV_`)Mn6OGTkjX^pnwsp)dFDpSScbJBjje)Qt8)K7;Lplfs5JK}J2?F)^M)bleqI28 zPH~K{LWd)$qNuq1g=}OGW^4b)C#oBdaPjnof{`*^5_y9>4uMX2+aI`=(xq(0ytljC zU;(}tdOs@GYJ95eHDuq_Q@3++kExNTw*OMZGKqb$_vBG37o(83dKKIj%mD(o2+|Nl zM#G?*g@^RHJy$=Dda)>56G7OR*WV4G`d%)u2=3JY5>L)O*yxIG~mdH8`XnYqxU1v|tS+9!9;2z)x+@K^;qS8Q7y`8!7{J4KU_ ztF1+IazU3-&h{5W?Q+w<20?8Jb%m?tSsQ~?AMnLHl*m1}f6$>&NB04w@fq-V$k7Kv zQ>|VMY4eDanqLqG&dD!gNk9&etYxDVWu7hH@mHL2%oCtoU%=kp`Ux5vp zWT6fwsuPg3q&lm)4o>T&$o+(2v~hX;xicc8tEzS(Mv@nz!YSXuA=AJueoqMtFH;39 z>opgl^xtQy`XPb{PF;aI?*^!Q?xtWIGOoYROPC3!(BIRKS4`HFpPK+iSh)jjEzYUj z>?Evn0|7iqpx9uM7Bm5R-v23N7eK z+%UVy#y2z`$mE;xB#@AcIBEX*#j`^+u)3hOLUkYBJaK_TkC1O+0 zGnsP&ZG)dq*!mu^Tol%awdy{>nuuOqR2A=L8ozT6K98f5t5pB$=xXp~`;0~-?}$L9 z@xLSQNIop({3^n@JYF%WtNO!Z@1fSC#GIp+QzD0?uoGXZvjf6i`9GO(@AGGlggv3cKwCX9Is3 z?y)bIBMxpR{){YY@FieP1z9H2g>hskTLll*B7Lkcv*?7fen6DwSS3^4jRf;0H0mHO z1PG9LgI|?#hX4*3U*0`Z?(tQE9KcSINP@NyjEEq<_0Hb+9x>477o~Y-$x(X(tNUXf ziKJcVSLf`vq}v`|-Jt7Bet2_kPh*qf!Upfamq;JHam_6D^NQ>i-hi2^KukP4d9YHz z9zKSE{F3N8g?<#H3sNtBB!84G9K$9ZN(gGiu0$QUO97Nf8308oe2~cIn^AT886VN# zXfZ{hJf5(e**{|gkl<7A*f7N%F!_{Je^Y3u+Nf8~bH(MYoZ`miEuZp+0_n7zO|S=@ z(F$46G3l$CtEou4)6$XJ@?}mlnx$vZY+E2fKRzg`L?r~lPLQSNZk?SWD^@RLNzE>}JPnz{OruaxO zJ{IJIM|q8O)#8EI6_V^zef&$Ow_drcU}v+YPts@YbU$azBXX}NhvQ8?XU9~z;EjCk2 zls$7j8DxwdOKulA@=8{pmb{DE;yYM~XdXwwGwfWJ*;mkIHn!C%un8Ebpx|tKe3M(S zA-Vv>h5k|v5AID5e>;BoGtEfZYq8&Gctiz9@;SJr_rLbQyxZPdZ&pC1k-kVkKc0Yn zAXX4ngQUw97%&GLVLY`%?YlC9Nng6tGO%D{^cC+OhC=aWe+A~jv%8)pJW_i(VQ{sc z)JgpQX8(ljF`&rmE275fV70%%Pt`B=xhe?%8w zpTgXFTqSXYU*bPJCshT2@PDGv{*@9QRnu9smb+LyRzGy(5-)sd~1VyX;%RvH84;_8(WVwPUQAJ?w@UBl`E zgTvN?KnwHHaX_}fz#R-#jD#OLz`=d&jS2?!BP6Sl35weYWDLPBt=@QBeDOXl_Yy2o zC1wlV_!IOdn426b+IX;N%P-o6y}gV{DQ`PbW0n?Kx>6*VN*I5ZI8U-?a#>e&wvNf zoe}bk6_~mW>woP2_wgk2B`z>@2OXH`0RtoecKu_G#{Z9I{F0=ZBBk@+-I3jXh2h#w@8 zNDqS)O_FA1Ow9L^>*_t1VYg7>An`ThyaC~V|uJ9_+c1B zQEw`bYsoTTlso{537(-k9}eo$#Ah2Ym(LNq9~J)g^{+w__QiOK`BEq_^uf2B7@rAC!p^Pj)Td# zE_33w%rv2Er74l|bNJ;|1Z`s&U>9y`$jZ*EWhofcN;)=8!B&^oYGyLC+^lm(MK$!R zJ|*>!?T7WE?HSsdj*QjZlizkz#!ZHG_7^NDcPpN$w|r^?;F$r%kloTnVU)0WMEM3R>Z)PAm2CbQHxkHYPlE}+d#EmCCxAWmDC@T;~a z)*{@_e{rE8c_ZkW>_`yTa6x}Uc4A3qJ2%N;4dMdW>oA3Iu^xPJUU?Bd<+7CrCS~-H z%%0|8iDs#$Rk{z1?<~n|bQd~FmcHphAPwsrl~uOI;ayE_%|9ilUYlsVzg28dlA%7q zV|%owZB?`=F3E2~oV=3<{9tGJw5F~lsos}p$J>}M+(+fFDohnYu*W-Ct1m>)`BJ6F z^W$e~s6Dkw#@n39nab4EO|B!Tv(6ZD50WltFW!eb%=MBPnryG!$Aqe9yW;Gw+ehsF zNBi%t-6KT2IS@d+IRu9!wt0aewtWfh5E`+B6I{K8>{Y)_4X?ig#DzOLs~P#u$2{WjAZRrsxQyL^1ztBVb#b~3+Po54J) zcbBH#tWG#248Kg&&PoH+Pe2CilwpYHEsrMh5H7~igWWf+gW}hE#-3#{=#+wg^`a+3 zJdM!B#j;8K+2C6Q6r;-EdT!wdbz%SRJPQkOpb+v^%QHRlsaa=kzMlGv!Fu5j;%xdOhD3?n>|~nxj7s!W z`AdnQ-oamyRzJV#v`M|9#$d$r5(ZPOzYl4$xuTGDGIDZnfTq)F(kF{6=Gl8awSd;N zbW177;{eNq44zVuv(ZyFee4<<03asL#h=;Ob8DG#E(|e)BIza+$2b6+~uI@ zF3$q_5rCKm(JxPB?q49B!z)LHoHf*mW8siKXHj^+i@&hqFK0~`8QsuDSXlY3w8amd z-pROjMHw0O9KM5VTO1}2Ne>*e7@V}`nROGZ42GZ30F?6*m*b|EDoX6cO?48NWQ1MR zVq;lU;GdoimeGg|1+TLtfSfS&HEE|nmk$nqlDttAsH9=spZzSVI3iFdr^~Vno9y8? ztntLGLHR6EhEb-d>A{yHsFWRqJi)~xL^oLXI77%hlAIV6+ZsFqijUKgA2IN77?1)0 z(;*=o-BLtvum$p4Gk<3D&q|gH5&sUw&YEx|$9@2s|G-9q+Q2$U zm`|h!qWEUaZGA+AlJF<-|2_t4G%H{9`N!eK{>Rh*Z>AmK8XBlyjtTh33R1=y&2M(6 zrzhO|7-deOH6P5YjY(^=!9nygz4a3Pr4~eNyI-uxoFQdjvH}+_nt*# zf8`nBR9@dcZ@KtgbN~*crQD2TemMLtX)?kQ)XP*qnqh{#F2Ivt zciL_a?r2m}2Xm%J6vE(Y%26*bY6w~BHo{(r_3JUBYQvVUDHQW(2oN*cSXkGQs^Vmnw zA*l{H4R*rhFiP36mB=kR;@k?+^6}e=lmlz-9uUJ!mjKFVKLFh<5cgc6E(=j&p4zWz+^E^*x@u_cZlh_TwxG=SNB$;y#u}oVVuSWa8CSfYNLnlOj|bWyG*2 zi?^t}g%7bdz!}x^J#x_!efP)4UHr=r)$*tZS$_AH^=%W6ES{Z{cKLS7p|+dR3Oq8OOzYymd>%e}J5s&+-U#r;CG7QclvNL9kNdZpE-cKg!C z_Syec_m@rYcgM}NBvk0vdBWE7j{c0m(@(r*R6 zdVn)Z-+f8?Pd`nf&Q;k(hG{dFo$#rLO#b7-fXv> z%TkjavXq+E=*G*_?q ziJX96CQ8TFkd{~F%y}PMzQN)1$s+R$_`=Vl{p!+pJY++9SE1AWi~Cof9Y$hqY1iV2 zXRk9uKi~|vZ>7S^3pYU8$04b$qT7FMvhCj90PaCbykgTlA;ISbDOZRp*SF`<8PKc7 zcXNL`cJvC%ygU8u^t8TCzvaAQ7Y(=oB(aMd}4MGLKGl< z65$>&Je1($)fY>2y8!a9#?I{J%?4088T-R~St>#_|5}jl5%q@r`$2BOZuzw#y>BW( z?jbat>4X%S`0f^H5D?v$Jf`%Z1qjQp_kO|k7NpPSFMn9=Y0<-I$j+ZVvH1$;*j;+n zGw8&9I>3IB@b(q9=qq_>a}QXTBTj;ByYn<#rYGz7?DUCIyU-ryqwL&RqxnkB=$M_3m`AShz;cd zVIvykWT+rThK2CF%o=AK3De_b;!46{zD0c{7ur+BqFmH}JKgm|&go*A~mq|Louo3Ueh;QN6GwN%()Wu{CZyw4Lx zJQ>;}ZUO7gfB1SSZl<3;rsZeCr4xR06jI`FZ9+kJPOXiCK#lMxT?<>el3=Acb}eR} zA`jLqx?bCXf^PYCnOcw-b3q-#mSOTzu9*lJU+oy}8ZjioNDjI`FapFO$T^G9StUG= zc@{s=sUV|#8vGg7IB9mXO-Re`uwEN7E7q5GVrj!jQ5#uJ^Jav^Jtyb4<>hwNvR%h& z29Y{h=5b<6xs)a?DyG|@itiC~L6I%g(?t5hdMt{%gt9}X&DSxS!gy^iLphNkV&Stb zl)71uNV+irWjH$X!+@v4EVb!zh;x5^x6!(YY6byGX08o4t`F&IVzW9fDLfbO`A{%#6_Tt0mtjDBiB|XmF2MW`#q7I2zm>uUk5; z!OXaY)KW(#t>yrwX^15I4k5f`EzbU>iqWmE+lnOA6o5mm6%!+=oyOmKU7KqMsF1)XJ)QM7Zz&GuOOmXKK0|epG9=IQ%iY}|^V+3KPc*3T55&J3FZ~VbzMd7H=ct7>` z*N3lL5q`!2oiE7m@92`^ERsSc&f*b%M*c)K=9Ff?XMNHMNw8q$xpzJRavr3?c^Zcr zKD~Rc6hEIS6JMt#i7FxMH#=f zu4!g;xEy$IJj^50@6`jwfEzypVS1QpSSHk~Uz+hsAxH{uux{!Um-L8Yp5GPbT^>Kh zeLTOSD{ybFNzAXmIR1!#Dc3gdY?GM)X4Z$WYV#}PL9aKl6iLigN=31P!m>{|xJtu@ z&~WTJ_Mr1+B1fk<-H9aoVg|z4+=x_VZK~rC%#kI>EXbQu=em`EU$|K@%XWz~Uxo~g zIPjzDM3OaME`=14I#OFn(Md8+p`caEG4eD;>POZnb2N=C;YwcHYMO~SX67rW{bieg;PXbSSrwQjy^LpT)fB28GN$n|nr7eo%U_HYBdEgg%iIU9l>?&_i=9 z9&hYEmT)ItLUk+w=8wiU$|Y|;wG%p{KCW1QZS>nT@84`uYEmUd*_O99N%GOJAQr!BRGBUHy?&yM`+ zq+uN}x>T7%(6goOaeRrrL8NzcfK;4Zmp}}*`oaVou!*zT$H>6Z22H;(pWD`+t!tKn z4(*i5u{xjI{#XrRzp5S;T$BOi=vG-w%#9Z%w=J@sYJ zE*GsqKub?e(s5*Zbt>0z@9bdvHyoo?YA-%f@Q*nG@YrSt46P~!#Pb?lQ@D96HHB2p z7yAg3$3-9ZKL0dUu6*SFl zKXNmMqf>mj(0j%gM{P&c8?`}mOg5kZc8wBN0G`D7CP!NFJFBdGY@_a?#gZT5YOP}^ z9jhQ&fU+nrif_@ob}WhG?RiDu-|iVgNDM<+JD3&ce2nBf>bst5>hI!{>hDJTfvkPq zUcJ;^=N%pPCpUd`#bRf{8?U^D72Fq;x2dEa#U5M-{-3%c)B25zCMERkuht|<%DWlK zkb!74O3<9?FG>vkHT3rUr8(e+GYCEGvf5ufpP^RDwkT`Ty*1c>vd9*jxf*8>T*Fcc znq9GymN`(t9vDK>6!Fp#!8#kle-V$CXtCD7KZuE~-BJyXe^?hLJVi$86cDHq+div@ z&1!V$UfHvf;u!H)sQw-~y!4IQP+rf?$q%?)v`UL2^Qzx?c8n+vQBIi9nJ9uLY^Ors z%It=Ckg#D{1#ZvdaQlRVe*z5F)T9k?csCTBCMJ(w28?N=pWRoGsiaDTlaQcTit=fu z3c?93bAGQi$Q<;M4W;aBhZqyuRiV>3$NOUD30ExZ!SqF1mZ;?}!eWD`GN^>Poq1pt z(-%zS&?!fw!QBjVQbFa^-8Rb4pcjMO^W0`H>)e`(jX%--eUgnwR_RfRX__Mcp!*7U2MVW5Qg%tB|!RCYQoOY{AzvxCIRyBOd^u zjc{>TTJhiYO3yofV2zDoUx?(+KpE+17Q&w}6vT>C&QzwJla~_sen8fdmVVZsCUdv_ z2m-8I-9O{{3*7twFeGKMb`gy1rum4-VU+Lpe?tNfra#i1%KAc?oYNBUUuGMKNK9Py z?;J6?63n~Sg!tuC3c89nX zg{-DUD+TfSMGYk55n*zI~!o|&m#tT_zvFdoR-gqT}-?M4j68XbBv-l9%XQ%fNa`q^gG!pJ3 zPNjt>8u(9`W$GTgGP!l89hwHr7+)o~-6fr^$f|teP>r-^)zVkzmjI1b%GfBhGqHt@ z=xn;hPR(7RxU2LZ`2**4kLjmZ@6_`rZ7Z;p64N@^mlOkz z3N?;OQ96)(2=h4UB$ROnI~41#%FOTf))korGT9_7)A=@C1c5Ne8tBx z#6%<~lMopv^7apoy@FqBEOl$!CVt5(cJ#&}6`afZ+J`*hRJ0H6N^)j*N(s zcAnNM{d_ebAHLZs*Eb!1{^&|~XZCKvr;2wnQJ=OhCyna>8?#bCPI0hgjH$1`Nyu%; z_5kl&m0avqfE<1xpfKST3TR{&-pv@sw$NtRHYg9Dtrghylfi52i#z^YC%C5nXjK&3d^AF(%2;Xr^%<5JlUGJJY_JhRsc)RI zdg4YTE)=+KRe22#g=n6n;QW1*B*2s3w(zU2PMF_ITg9<#ZS#@y*glns&t`{s76G{d zrs0VM;!404VI6+`QxSnuW=$7HW)prRhZYp&;vWGH+^}%gMF^E~Bx*2iALVkYCo+1e zr)8(#5%`=#If;hVwWaY)=QM?ifKj51?+4w!Nrv9KX)5sZ?&9q;m`o)zT*=wbm!FC1 zCJi`{h8Y)=FV;V1QBVar8SzW>XH=(zmx0Txk1&DxgzJi97c;$iI@xGdGQ>QkrNwwf zJdTUJ4=2#gsserM!MDb6A0Ib9-^~(Pg5OwX6|ps9aRgNLQF+NBH>yMiK1BpRLe_ct zo&i3wT9cEGmqVc2xV8&>fgfAU)QhZ#9?OBXU-ilrg{mn}ZSh)4tL42jcfuN5EJs^k zGuZ+8RYoD1HFSlGFQXS;Qs@k4GBjB`C$2K#OsMDEk%M#LOGFTj$wOp?;9^9TmJ`@v zhcgaW=2MbdqXVpnYsb)S-4Z+lswFaq4_}6qItJRw>|72PH|7YOy@rlIC@Dw{o?CKF zUlK@+UT76~jfX##Cfqy$SQ6f;#05F(a&H6Arh!`b*>Qk=_lfT5b(r?k$Kf)Mk?2Ve zI7-O8T2z^Ihf7LZ1-LEO4#l>qVxajxD!6GHMJy}(PNRELug)}`$N7@K*nT3_-muI0 z8}(wDyJ&hAl#IQ0nQl2aHIt{1?Im3w8oZL&5sTCn7^V~q%?o}3pDYd^ohY0JivVo) z0!LcIUVOmc$_Dr0m=jM57Mq$>Dvdyd4alpg$LRnuteJptV&&9JnSb}R5KA@5saT}nx3Vm;@N~38*yBwJ_<*DUfH18qv@}11b_iWRZ zeyZ6{(R`}|1#UU?NR{<0YS=+oabck@N|#XC0il$HYK zUICC!RKM?*Gbnz5%kM#RF_G!>hmUw-dD=&e=o5uAHz_{7P*C5;j_$|R@O1=ECb#|+ z%ONUrC~e&=M6b$`KBqHL@vV&cu_AK`=h~$l;B~B3oMFxsK%h{!a%1K2YO^5!NY9ll z@Y*9^ABV)_JjMC4rGU(6M03L2>%G zNGlDb)HX%KyIF_a#(@t=-X`QF8^#Jd|J3_ne+p>BB;P;W3B0c%U16!%O=z&{?0D@4= zG6O)6ZQkq;zED9@X{_EnARP)O)C+=lF=|S4+)9`FX_MSaksq3d7_t!rcYQx0ooY4D znk~VfqU(K`?VHe_v?mGVqNa%bESW~44D2&6PaMjoTW&g zRbXod`_Q!UqcAzA(Fbw*6bM=}O*;il1j*y|AIu%#}Rhix5!g)lgHwCJcxtwm; z({{=9$L<||+2l6qFfP@E-aI^5wTvtsM-)asygS~c*Ep8bJ#4TU(IRRbSM8_qb{cNhxDHW5 zVHA&ZSVvx~xbl;A3_+VbW)%Gl*Km=M)~Xqh(Kao}L}^2)X$joBmLN34V(z`;Fiv!B z{GQGaJ2Hm6pI(`i2!rJ^lcH76KHa;}y*5dglViLkl)N&A(3m)>LI z<&s;v=R3-*6$&8tc+~~pE3rTt z|9Qb>igp}!NPg#S>@%{dgY3p)7K@bj;kd!@xIuYB>$JNFxyw(O%&}$886R7PEsel$ z=aAAEbzDwAx0rzzG3sQb3l6jS6}Oyk)=Jsiw?x1_u3308cwOdFdh53QXzN!p>UhI<8O2Y+ z*PDXdn`!(?{kZ2-JKp|6*H6UX>za*dJ(a%_NH)%XC7a-ah|ga&qCobYKvGL``ehLz zx7|?;_3QiIFA`V zvS0%i31&B6qc=a0^8gjchAAkCO`d@>fX3t?hSb_`6Y)Zl|BOa_)WyZG(YJl|=NW5j z+S9|2ZCWU$UK!LaHpYHKIAiI2(mgBPh+azOYs=JOrm;GSfE1;m&-NVl9Jp4x)_KWj zpMcG=!I}2DG{G%f^|$Jp%B$M%T2N+Dw_-2h$EN}A_x#%9Rb|vM8F(V+v3q3fay(8c zaZQmUFm7j@d`A$E|u%P&-8Jvo0a*A33mhk<45VSCsQrE78#>Uv}MMQtR7e0%M&D^;VF7<^04vv%XyWWWFV0d z!EO!Mp_EEN=kgMGv$BrveXI{S=%aXs-nz$# z6vNRT(8l@jejgO13g0bwao9^0y^n?H4?~zkycFOk@XE-;iAtg?2|9G|*;%=pm9h4*auuZ2}-w?Y4(I**t2M=Omw0zQmvMqw}&Nf(J8(EmI zxCNf@V5Zx8-p$y00rT1$U~t>_+Ita8m`kQNyy~7#P3YBWa_r9UkhuGeLz8pywDRzB zNVz8{=R7bY5l4{3UD+6561@`C=VC$wr!LAa(=ny?#I;@y!?H(w4i=Ib2Vo{yLUFLb z*=~!2QN*>_<%lsjVly)^6SSa!S87Puo8o&R6!8NTSY(!1+}|-1&Y&zMkg#{fUqjGA z3Ux9|H10vn1b3(_I2w2gUQsuSEQthq5&*_bv<_3AM?oGKa{&B!Tgvpy+-t_r_k}0aJ944RIF$ zKQT@?#`yA>BtpzP*vaZBbhoP6#RobPD^CjGmuG@VP2Cq4KTkw0aVdi`OKk0ZN=pt? z$Zq8f9H_pkSfbM|v|#)LiJv!DBadIWy*UB6osdDscYfVRPp zlIl_z$bs(Cmw+~=+G@sr0`k#__Zofn&WTt+yg(bfP17V-XfQd&?z>UsFhsc?$$B1ROq7LA;=kJ4Ag! zzBLKJvZi+EE6w;(7ozSLw&3@=kLo@<#EoyV-ZZ8~@Rh@SRs#U6Db^blBYPJe=BZ(ztwl*V)%rFZ2H z#3Tpj$d-0Y*U(kwdY}=@W)g{+yUv){b;k|t^cp&}&NtZ(#DaQA`k9|p+AH#!M&_2* zO6xl@rkUyaFT`$<6}L@IvYt%?O9)qmcofB`!o@@-B_;4$OIX%Q%+qr@yP9*wjrxMk zaG^$a_I5rvvqkD$MYQ3~SkNA)9qcn)=5&`KOI%KL^!f`;3qUdh=A4-P^h|J(^lpEL zxaV!9!INu*WB6P?Dl-+ENhKNWBz}v%d^0B}PZ<%rRf0cS%dw<_ zdAzxelAu!Da=l_Zl_*K?S(lh%K?#R@o}@hgaa4<){P+rusWv!mt-NxXN-WO`ucmR% z(?(92A8?UT2qdBo`2Hlp#I8l%Evc9lwr2kdj;W^lTA;8P*(mZ|=Ph?0wR{CS_Nc;qYg0t6I)|**Y(pv9n{-Cg>6nosJD!_cso@n$jnPFt=$q!B zlkAw3*2iMh1^Cx_j{fB3CLa@kX7j`jCTw%4bv8@eu-O0 zbxHD{-J29JisXz!CR_##zM3qkN<6G{v64Rs=O7Ut#R86?U7(+XPa+~}XKlIXlAY2? z^#zpe8i9IA1wKQB8mHJs**bKwsH~=ooN2g&XEkQf&E5|@?Mp9-tvmB#2)2kVmnskR zZk3ZQ=PVW8UL!ujSSM;Io-B`iR6V4H(wOV*P8 z%noWfrHNttQ^XiwOqS(S$oQU(JL6tiOm4%_q^|BJzKkqh$4)^8J3zFR-6`er#cNQ! zO*x%oq@BS%wIVQusxAmP{(ikKFIix!&50yJUE~IJceC}LlxmG>`|cjrD8)Udsm;9N z42U4(s5wM_NyxZHxvhH7c>^0iuk<)mVU6v=c(_ODw#1y3r&SWrIGZ=2k=M*JMUX9Xu*iVD$h(PtbfQAp5X zhDzvNAO}D*=lBdWq))ZIi3>w73qJ*cfGXvZOLZkflKL~V-!nMp`9MJ{f-h-V>(wR6 zTUmScR#|jf@ORUi0xN}ChqIlegxl* zB~@dewMOOBD0l8P@-CfNyeX`VtJ<1Rnrj0on3rT;#o^*Dh=1uuc%m^H&kW?A1d{ka z3wN;P02fog>>brT?t1HREWB`;1+NGhvE;XR@Vt`;JGE%ZCwCXg6=?s^ALXGfUJYTc z|416CoSaz1S?XEsU%Fh(B&@Sl8Tfp@r;Yw{rF@Owul zPMJ+JsK$&XKf>BJW&Da#3qa-YDnTQLi<{>fJB7fk`)>98eIXQfMbgebTECUN>TrOe zbk8&X)cG2GnFO&X_KjfyN?qK65lctZGbM`;{WNde0p@h4(KpwEWutEl1wcVV_w)l5 zg4GC$^%5?Ot5CaG_rV!mg&tks`f#p0>@QK2nb6v^m=7iDQv~SvDj#{#fa|zXB@`;U zZzoG@t98Rg9!75|zZpyoeoccX39=a>>H{II1XIt_oxM=#=G2|iA&diu356y#IxuD1 z7fv;(D^S&CvJt5VbF&zrsQ?LC>)b<$hz^7;i1E$};6=6!QC0Jk0|~G%3N-0n@McS} z83IvuZ+6CAgbdf;5=Hl8i5 zB0>9`?B*|;y1uusLW%pR_~PHtn($7wz$~a;FxF$**MAkTIhMDldTolsW6DWd$V}M# zI=v15ohk9zphtS|O~|Z*9CKUXsaG~St1hRAF8sWT zR>1~641JL>fjULsqy>=E<@@4Zc7$<(ml3x#0JSD-;Nd!<@1uw2*SZBFp1t#*EKAo& zqa)XgKWaUNTyA?vuzRqOGnH4Anbv+5&wibgUG8Wv1UGbsKDUAc=SH^e7<~sV^C|65 z6$E(lY@+B}G#KJ3@Z{iQzi`bbtUCx>dNBaOj? zrOnvw{t?)FV>H0LjGb@a++n^dbipt}-@K2npc4&)O&wG)ptWZYOw%QeOLTHg@Wj^0 zkDc2HE$ZZPVZoj>R%nEIas39-jn}p@K)$VekE^EiNH{k2@j7spWh05{tvr5PNTA6c z)cO{3*D8$DI3igt;>8&0h5_luW5m|#CJk=Ud`m!M?dUroy0mt8WSH9puM(4R+!otS zHX2T!Lp^ihfp{CXmD|gFgpo}JS5M^4`3;^Va*xxet18y9#%`u}4WAm9hZ)zt+jaFV z;jz3x4ppU~+bZixZ*rPE1M=dL)mGF$tf2SI?mzhL0Kb2xPE1P^G_o$BIaZ9_jtPyH7uWnTwQvQ;lMqDHL+u~oN`rC3{V}w}XH62Kq_yPdJ zSm*s+0|1$>3;*rYxK0bPme-9TrND*_q%7R{Wh>$VK*XEByejblAlFR+h;>N<01a&l zL97*00ElEu6=DUx1b{-fWFgl0mMx^@-FCzIZ_eUB=URY1Z2vlh1Am7KW|0H5Nk;`T z-ucymKnSqF4f@DO51QEd)q`UQu)+rc_#tCi=-=H{+oggz5d=*O3V<+nex0q+0s#(% zf0N+$AR67EdNBZqZ4U)zTkJPzwfE~u`H}!o76hD?{N3KNB-Y>btvxCjI+@=fn+)0C zAe%e@6>=2E@2e=tTpm(QiT0P)=6~WS+^2$pHw2L!P=b#3Q6VjCSO7qn2PiPumJpB& z0;nHQ!SGmvh^>YG3BDZyq1b}XZ3O>;{!$EwqyDQgOsG@wRlC2=C9!rjvvjaxg-8ZF zu>PmjU)~pXaDNB)%Nxxe1eucqahz5%Y~ln75g8r^dI6MQm20quiPL+)_>kz z_YoD0j5h?rgKVL}Wct4WkpElj?~muu`}|G%CH+VJKg2&Yz5XCJ2mC`s^CSEp;(rx{ zprBs+m`U@Z=QqamN+P}VoKQiC{aOW$7 zxU+&p&i?(`{E>tFhx?BTh&##u`D4&}0HCTf6d3%$-<=pg`}MPKoKeB_efkXqo}+y8X-J{{iL=@t6Pr delta 24872 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 HzpnldrMqp; diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4e86b92707..66c01cfeba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d65..fcb6fca147 100755 --- a/gradlew +++ b/gradlew @@ -85,9 +85,6 @@ done APP_BASE_NAME=${0##*/} APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in From 02d972f2f69e16f8bc01b705f1c1ce9c326649b0 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Wed, 19 Mar 2025 03:14:11 +0800 Subject: [PATCH 021/203] renamed packages accordingly --- src/main/java/ClinicEase.java | 6 +++--- src/main/java/{MainFunction => manager}/Appointment.java | 2 +- .../java/{MainFunction => manager}/ManagementSystem.java | 4 ++-- src/main/java/{MainFunction => manager}/Patient.java | 2 +- src/main/java/{Misc => misc}/Parser.java | 2 +- src/main/java/{Misc => misc}/Ui.java | 2 +- src/test/java/{cetest => ce_test}/PatientTest.java | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) rename src/main/java/{MainFunction => manager}/Appointment.java (97%) rename src/main/java/{MainFunction => manager}/ManagementSystem.java (98%) rename src/main/java/{MainFunction => manager}/Patient.java (98%) rename src/main/java/{Misc => misc}/Parser.java (99%) rename src/main/java/{Misc => misc}/Ui.java (98%) rename src/test/java/{cetest => ce_test}/PatientTest.java (95%) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index f7399ff22a..574b751edd 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,6 +1,6 @@ -import MainFunction.ManagementSystem; -import Misc.Parser; -import Misc.Ui; +import manager.ManagementSystem; +import misc.Parser; +import misc.Ui; public class ClinicEase { public static void main(String[] args) { diff --git a/src/main/java/MainFunction/Appointment.java b/src/main/java/manager/Appointment.java similarity index 97% rename from src/main/java/MainFunction/Appointment.java rename to src/main/java/manager/Appointment.java index 6ea8e96e7b..8fb952a135 100644 --- a/src/main/java/MainFunction/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -1,4 +1,4 @@ -package MainFunction; +package manager; public class Appointment { private static int runningId = 100; diff --git a/src/main/java/MainFunction/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java similarity index 98% rename from src/main/java/MainFunction/ManagementSystem.java rename to src/main/java/manager/ManagementSystem.java index efc7cb2c75..b78eb9afd2 100644 --- a/src/main/java/MainFunction/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,6 +1,6 @@ -package MainFunction; +package manager; -import Misc.Parser; +import misc.Parser; import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/MainFunction/Patient.java b/src/main/java/manager/Patient.java similarity index 98% rename from src/main/java/MainFunction/Patient.java rename to src/main/java/manager/Patient.java index d01875923e..f38575eb24 100644 --- a/src/main/java/MainFunction/Patient.java +++ b/src/main/java/manager/Patient.java @@ -1,4 +1,4 @@ -package MainFunction; +package manager; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/Misc/Parser.java b/src/main/java/misc/Parser.java similarity index 99% rename from src/main/java/Misc/Parser.java rename to src/main/java/misc/Parser.java index 94ca0acb8b..17e88ed69c 100644 --- a/src/main/java/Misc/Parser.java +++ b/src/main/java/misc/Parser.java @@ -1,4 +1,4 @@ -package Misc; +package misc; public class Parser { public static boolean isBye(String input) { diff --git a/src/main/java/Misc/Ui.java b/src/main/java/misc/Ui.java similarity index 98% rename from src/main/java/Misc/Ui.java rename to src/main/java/misc/Ui.java index 8565c697a5..550b62590c 100644 --- a/src/main/java/Misc/Ui.java +++ b/src/main/java/misc/Ui.java @@ -1,4 +1,4 @@ -package Misc; +package misc; import java.util.Scanner; diff --git a/src/test/java/cetest/PatientTest.java b/src/test/java/ce_test/PatientTest.java similarity index 95% rename from src/test/java/cetest/PatientTest.java rename to src/test/java/ce_test/PatientTest.java index cc0b107f75..e23d45ee54 100644 --- a/src/test/java/cetest/PatientTest.java +++ b/src/test/java/ce_test/PatientTest.java @@ -1,6 +1,6 @@ -package cetest; +package ce_test; -import MainFunction.ManagementSystem; +import manager.ManagementSystem; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; From bc6e5219df9c9004588939875da3f5595adea1ef Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 10:47:41 +0800 Subject: [PATCH 022/203] Cleaning up ManagementSystem --- src/main/java/manager/ManagementSystem.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 251476336a..2a8061591d 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -43,16 +43,11 @@ else if (patients.containsKey(details[0])) { public void deletePatient(String line) { String nric = line.substring(15); - if (nric == null || nric.isBlank()) { + if (nric.isBlank()) { System.out.println("Invalid NRIC provided."); return; } - if (patients.containsKey(nric)) { - Patient removedPatient = patients.remove(nric); - System.out.println("MainFunction.Patient removed successfully: " + removedPatient.getName() - + " (NRIC: " + nric + ")"); - if (patients.containsKey(nric)) { Patient removedPatient = patients.remove(nric); System.out.println("MainFunction.Patient removed successfully: " + removedPatient.getName() + " (NRIC: " + nric + ")"); @@ -63,7 +58,7 @@ public void deletePatient(String line) { public void viewPatient(String line) { String nric = line.substring(13); - if (nric == null || nric.isBlank()) { + if (nric.isBlank()) { System.out.println("Invalid NRIC provided."); return; } From f3577ef4f48c1f2406239f7f06b0da3c026b1c24 Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 11:16:06 +0800 Subject: [PATCH 023/203] More cleanups in the code --- src/main/java/ClinicEase.java | 4 ++-- src/main/java/manager/ManagementSystem.java | 7 ++++--- src/main/java/manager/Patient.java | 7 ++++++- src/main/java/{misc => miscellaneous}/Parser.java | 2 +- src/main/java/{misc => miscellaneous}/Ui.java | 2 +- src/test/java/{ce_test => tests}/PatientTest.java | 3 +-- 6 files changed, 15 insertions(+), 10 deletions(-) rename src/main/java/{misc => miscellaneous}/Parser.java (99%) rename src/main/java/{misc => miscellaneous}/Ui.java (97%) rename src/test/java/{ce_test => tests}/PatientTest.java (98%) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 574b751edd..d96b1c3e11 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,6 +1,6 @@ import manager.ManagementSystem; -import misc.Parser; -import misc.Ui; +import miscellaneous.Parser; +import miscellaneous.Ui; public class ClinicEase { public static void main(String[] args) { diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 2a8061591d..b4c4703d55 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,18 +1,19 @@ package manager; -import misc.Parser; +import miscellaneous.Parser; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ManagementSystem { - private final Map patients; private final List appointments; + private final Map patients; public ManagementSystem() { - patients = new HashMap<>(); appointments = new ArrayList<>(); + patients = new HashMap<>(); } public Map getPatient() { diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 56908a282a..ba11c7a56c 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -46,7 +46,12 @@ public List getMedicalHistory() { @Override public String toString() { return String.format( - "MainFunction.Patient ID: %s\n Name: %s\n Date of Birth: %s\n Gender: %s\n Address: %s\n Contact: %s", + "MainFunction.Patient ID: %s\n " + + "Name: %s\n " + + "Date of Birth: %s\n " + + "Gender: %s\n " + + "Address: %s\n " + + "Contact: %s", id, name, dob, gender, address, contactInfo ); } diff --git a/src/main/java/misc/Parser.java b/src/main/java/miscellaneous/Parser.java similarity index 99% rename from src/main/java/misc/Parser.java rename to src/main/java/miscellaneous/Parser.java index 17e88ed69c..fce19e34f6 100644 --- a/src/main/java/misc/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -1,4 +1,4 @@ -package misc; +package miscellaneous; public class Parser { public static boolean isBye(String input) { diff --git a/src/main/java/misc/Ui.java b/src/main/java/miscellaneous/Ui.java similarity index 97% rename from src/main/java/misc/Ui.java rename to src/main/java/miscellaneous/Ui.java index 550b62590c..89de94cdc7 100644 --- a/src/main/java/misc/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -1,4 +1,4 @@ -package misc; +package miscellaneous; import java.util.Scanner; diff --git a/src/test/java/ce_test/PatientTest.java b/src/test/java/tests/PatientTest.java similarity index 98% rename from src/test/java/ce_test/PatientTest.java rename to src/test/java/tests/PatientTest.java index 5f103a491e..7b6264a9cd 100644 --- a/src/test/java/ce_test/PatientTest.java +++ b/src/test/java/tests/PatientTest.java @@ -1,5 +1,4 @@ -package ce_test; - +package tests; import manager.ManagementSystem; import org.junit.jupiter.api.Test; From 34f8e6dc67cb6db7de7a6cdcc049a7edac1d3cb3 Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 11:20:24 +0800 Subject: [PATCH 024/203] Reformatting in ManagementSystem --- src/main/java/manager/ManagementSystem.java | 36 ++++++++++----------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index b4c4703d55..6454c5eae2 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -21,27 +21,22 @@ public Map getPatient() { } public void addPatient(String line) { - String [] details = Parser.parseAddPatient(line); + String[] details = Parser.parseAddPatient(line); - - if (details == null){ - System.out.println("Patients details is incomplete!"); + if (details == null) { + System.out.println("Patient details are incomplete!"); return; - } - - - else if (patients.containsKey(details[0])) { - System.out.println("MainFunction.Patient ID already exists!"); + } else if (patients.containsKey(details[0])) { + System.out.println("Error: Patient ID already exists!"); return; } - - Patient newPatient = new Patient(details[0], details[1], details[2], details[3], details[4], details[5]); + Patient newPatient = new Patient(details[0], details[1], details[2], + details[3], details[4], details[5]); patients.put(details[0], newPatient); - System.out.println("MainFunction.Patient added: " + details[1]); + System.out.println("Patient added: " + details[1]); } - public void deletePatient(String line) { String nric = line.substring(15); if (nric.isBlank()) { @@ -51,9 +46,10 @@ public void deletePatient(String line) { if (patients.containsKey(nric)) { Patient removedPatient = patients.remove(nric); - System.out.println("MainFunction.Patient removed successfully: " + removedPatient.getName() + " (NRIC: " + nric + ")"); + System.out.println("Patient removed successfully: " + removedPatient.getName() + + " (NRIC: " + nric + ")"); } else { - System.out.println("Error: MainFunction.Patient with NRIC " + nric + " not found."); + System.out.println("Error: Patient with NRIC " + nric + " not found."); } } @@ -64,7 +60,7 @@ public void viewPatient(String line) { return; } - System.out.println("===== MainFunction.Patient Details ====="); + System.out.println("===== Patient Details ====="); System.out.println(patients.values()); System.out.println("-----------------------"); } @@ -74,7 +70,7 @@ public void listPatients() { System.out.println("No patients have been added."); return; } - System.out.println("===== MainFunction.Patient List ====="); + System.out.println("===== Patient List ====="); int count = 1; for (Patient p : patients.values()) { System.out.println(count + ". " + p); @@ -88,16 +84,18 @@ public void addAppointment(String[] details) { String date = details[1]; String time = details[2]; String desc = details[3]; + Appointment appt = new Appointment(nric, date, time, desc); appointments.add(appt); - System.out.println("MainFunction.Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); + System.out.println("Appointment added for NRIC " + nric + + " on " + date + " at " + time + "."); } public void deleteAppointment(String apptId) { for (int i = 0; i < appointments.size(); i++) { if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { appointments.remove(i); - System.out.println("MainFunction.Appointment " + apptId + " is deleted successfully."); + System.out.println("Appointment " + apptId + " is deleted successfully."); return; } } From 541c469e38ac50629de7357902f96bcf2d0808b0 Mon Sep 17 00:00:00 2001 From: judHoka Date: Wed, 19 Mar 2025 11:29:35 +0800 Subject: [PATCH 025/203] Update runtest --- text-ui-test/runtest.bat | 21 ++++++++------------- text-ui-test/runtest.sh | 20 +++++++------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 25ac7a2989..1824035146 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -3,17 +3,12 @@ setlocal enableextensions pushd %~dp0 cd .. -call gradlew clean shadowJar - -cd build\libs -for /f "tokens=*" %%a in ( - 'dir /b *.jar' -) do ( - set jarloc=%%a +call gradlew clean test + +if %errorlevel% equ 0 ( + echo All tests passed! + exit /b 0 +) else ( + echo Some tests failed! + exit /b 1 ) - -java -jar %jarloc% < ..\..\text-ui-test\input.txt > ..\..\text-ui-test\ACTUAL.TXT - -cd ..\..\text-ui-test - -FC ACTUAL.TXT EXPECTED.TXT >NUL && ECHO Test passed! || Echo Test failed! diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index 1dcbd12021..0b754c31fe 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -1,23 +1,17 @@ #!/usr/bin/env bash -# change to script directory +# Change to script directory cd "${0%/*}" - cd .. -./gradlew clean shadowJar - -cd text-ui-test -java -jar $(find ../build/libs/ -mindepth 1 -print -quit) < input.txt > ACTUAL.TXT +# Run Gradle tests +./gradlew clean test -cp EXPECTED.TXT EXPECTED-UNIX.TXT -dos2unix EXPECTED-UNIX.TXT ACTUAL.TXT -diff EXPECTED-UNIX.TXT ACTUAL.TXT -if [ $? -eq 0 ] -then - echo "Test passed!" +# Check test results +if [ $? -eq 0 ]; then + echo "All tests passed!" exit 0 else - echo "Test failed!" + echo "Some tests failed!" exit 1 fi From 0dd0ab76630f52620bbfbd4c2108aab550c54191 Mon Sep 17 00:00:00 2001 From: yukuan Date: Wed, 19 Mar 2025 17:12:54 +0800 Subject: [PATCH 026/203] add the function of store history and view history by name or nric --- build.gradle | 4 +- src/main/java/ClinicEase.java | 68 +++++++----- src/main/java/ClinicEaseException.java | 5 + src/main/java/ManagementSystem.java | 30 +++--- src/main/java/MedicalHistoryManager.java | 97 +++++++++++++++++ src/main/java/Parser.java | 105 +++++++++++++++++-- src/test/java/MedicalHistoryManagerTest.java | 48 +++++++++ src/test/java/seedu/duke/DukeTest.java | 12 --- 8 files changed, 305 insertions(+), 64 deletions(-) create mode 100644 src/main/java/ClinicEaseException.java create mode 100644 src/main/java/MedicalHistoryManager.java create mode 100644 src/test/java/MedicalHistoryManagerTest.java delete mode 100644 src/test/java/seedu/duke/DukeTest.java diff --git a/build.gradle b/build.gradle index ea82051fab..ec2aeeffb6 100644 --- a/build.gradle +++ b/build.gradle @@ -29,11 +29,11 @@ test { } application { - mainClass.set("seedu.duke.Duke") + mainClass.set("ClinicEase") } shadowJar { - archiveBaseName.set("duke") + archiveBaseName.set("ClinicEase") archiveClassifier.set("") } diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 2d02099644..7a2640d85b 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,42 +1,56 @@ public class ClinicEase { public static void main(String[] args) { ManagementSystem manager = new ManagementSystem(); + MedicalHistoryManager mhManager = new MedicalHistoryManager(); Ui ui = new Ui(); ui.showWelcome(); boolean running = true; while (running) { - String input = ui.readCommand(); + try { + String input = ui.readCommand(); - if (Parser.isBye(input)) { - ui.showBye(); - running = false; - } else if (Parser.isAddAppointment(input)) { - String[] details = Parser.parseAddAppointment(input); - if (details == null) { - System.out.println("Invalid format. Use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); - } else { + if (Parser.isBye(input)) { + ui.showBye(); + running = false; + } else if (Parser.isViewHistory(input)) { + // 解析用户的 view-history 命令,获得 [type, value] + String[] typeAndValue = Parser.parseViewHistory(input); + String type = typeAndValue[0]; + String value = typeAndValue[1]; + + // 根据 type 判断调用哪个方法 + if ("ic".equals(type)) { + mhManager.viewMedicalHistoryByNric(value); + } else { + mhManager.viewMedicalHistoryByName(value); + } + } else if (Parser.isStoreHistory(input)) { + // 解析 store-history 命令 + String[] details = Parser.parseStoreHistory(input); + if (details == null) { + System.out.println("Invalid format. Use: store-history n/NAME ic/NRIC h/MEDICAL_HISTORY"); + } else { + // details = [name, nric, medHistory] + mhManager.storeMedicalHistory(details[0], details[1], details[2]); + } + } else if (Parser.isAddAppointment(input)) { + String[] details = Parser.parseAddAppointment(input); manager.addAppointment(details); - } - } else if (Parser.isDeleteAppointment(input)) { - String apptId = Parser.parseDeleteAppointment(input); - if (apptId == null) { - System.out.println("Invalid format. Use: delete-appointment APPOINTMENT_ID"); + } else if (Parser.isDeleteAppointment(input)) { + String apptId = Parser.parseDeleteAppointment(input); + if (apptId == null || apptId.isEmpty()) { + System.out.println("Invalid format. Use: delete-appointment APPOINTMENT_ID"); + } else { + manager.deleteAppointment(apptId); + } + } else if (Parser.isListAppointments(input)) { + manager.listAppointments(); } else { - manager.deleteAppointment(apptId); + System.out.println("Unknown command."); } - } else if (Parser.isListAppointments(input)) { - manager.listAppointments(); - } else if (Parser.isAddPatient(input)) { - System.out.println("Feature not implemented yet."); - } else if (Parser.isDeletePatient(input)) { - System.out.println("Feature not implemented yet."); - } else if (Parser.isViewPatient(input)) { - System.out.println("Feature not implemented yet."); - } else if (Parser.isViewHistory(input)) { - System.out.println("Feature not implemented yet."); - } else { - System.out.println("Unknown command."); + } catch (ClinicEaseException e) { + System.out.println(e.getMessage()); } } } diff --git a/src/main/java/ClinicEaseException.java b/src/main/java/ClinicEaseException.java new file mode 100644 index 0000000000..bee3624c89 --- /dev/null +++ b/src/main/java/ClinicEaseException.java @@ -0,0 +1,5 @@ +public class ClinicEaseException extends Exception { + public ClinicEaseException(String message) { + super(message); + } +} diff --git a/src/main/java/ManagementSystem.java b/src/main/java/ManagementSystem.java index 81dc51f9ef..6bf6cb908b 100644 --- a/src/main/java/ManagementSystem.java +++ b/src/main/java/ManagementSystem.java @@ -9,24 +9,24 @@ public ManagementSystem() { } public void addAppointment(String[] details) { - String nric = details[0]; - String date = details[1]; - String time = details[2]; - String desc = details[3]; - Appointment appt = new Appointment(nric, date, time, desc); - appointments.add(appt); - System.out.println("Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); +// String nric = details[0]; +// String date = details[1]; +// String time = details[2]; +// String desc = details[3]; +// Appointment appt = new Appointment(nric, date, time, desc); +// appointments.add(appt); +// System.out.println("Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); } public void deleteAppointment(String apptId) { - for (int i = 0; i < appointments.size(); i++) { - if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { - appointments.remove(i); - System.out.println("Appointment " + apptId + " is deleted successfully."); - return; - } - } - System.out.println("No appointment found with ID " + apptId + "."); +// for (int i = 0; i < appointments.size(); i++) { +// if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { +// appointments.remove(i); +// System.out.println("Appointment " + apptId + " is deleted successfully."); +// return; +// } +// } +// System.out.println("No appointment found with ID " + apptId + "."); } public void listAppointments() { diff --git a/src/main/java/MedicalHistoryManager.java b/src/main/java/MedicalHistoryManager.java new file mode 100644 index 0000000000..9ef8cead20 --- /dev/null +++ b/src/main/java/MedicalHistoryManager.java @@ -0,0 +1,97 @@ +import java.util.ArrayList; +import java.util.List; + +public class MedicalHistoryManager { + private static final List patients = new ArrayList<>(); + + public MedicalHistoryManager() {} + + public void storeMedicalHistory(String name, String nric, String medHistory) { + String cleanedNric = nric.trim(); + String cleanedName = name.trim(); + + Patient existingPatient = findPatientByNric(cleanedNric); + + if (existingPatient == null) { + existingPatient = new Patient(cleanedNric, cleanedName, "", "", "", ""); + patients.add(existingPatient); + System.out.println("New patient " + cleanedName + " (NRIC: " + cleanedNric + ") created."); + } + + String[] historyEntries = medHistory.split(",\s*"); + for (String entry : historyEntries) { + if (!existingPatient.getMedicalHistory().contains(entry.trim())) { + existingPatient.getMedicalHistory().add(entry.trim()); + } + } + System.out.println("Medical history added for " + cleanedName + " (NRIC: " + cleanedNric + ")."); + } + + public void viewMedicalHistoryByNric(String nric) { + Patient patient = findPatientByNric(nric.trim()); + if (patient == null) { + System.out.println("No patient found with NRIC " + nric + "."); + } else { + printPatientHistory(patient); + } + } + + public void viewMedicalHistoryByName(String name) { + List matchedPatients = findPatientsByName(name.trim()); + if (matchedPatients.isEmpty()) { + System.out.println("No patients found with name '" + name + "'."); + } else { + System.out.println("Found " + matchedPatients.size() + " patient(s) with name '" + name + "':"); + for (Patient p : matchedPatients) { + printPatientHistory(p); + } + } + } + +// private Patient findPatientByNric(String nric) { +// for (Patient p : patients) { +// if (p.getId().trim().equalsIgnoreCase(nric)) { +// return p; +// } +// } +// return null; +// } + + public Patient findPatientByNric(String nric) { + String target = nric.trim().toUpperCase(); // 统一转为大写 + for (Patient p : patients) { + String patientId = p.getId().trim().toUpperCase(); + if (patientId.equals(target)) { + return p; + } + } + return null; + } + + + public List findPatientsByName(String name) { + List result = new ArrayList<>(); + for (Patient p : patients) { + if (p.getName().trim().equalsIgnoreCase(name)) { + result.add(p); + } + } + return result; + } + + private void printPatientHistory(Patient patient) { + System.out.println("Medical History for " + patient.getName() + " (NRIC: " + patient.getId() + "):"); + List histories = patient.getMedicalHistory(); + if (histories.isEmpty()) { + System.out.println("No medical history recorded."); + } else { + for (String h : histories) { + System.out.println("- " + h); + } + } + } + + public List getPatients() { + return patients; + } +} diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index ad1bd5bc62..d117d69fdc 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -56,27 +56,116 @@ public static String parseViewPatient(String input) { return input.replaceFirst("(?i)view-patient\\s*", "").trim(); } - public static String parseViewHistory(String input) { - return input.replaceFirst("(?i)view-history\\s*", "").trim(); + /** + * 解析 "view-history ic/NRIC" 或 "view-history n/NAME" + * 返回 {type, value},type 可为 "ic" 或 "n" + * 若不符合格式,则尝试根据内容判断 NRIC(简单正则)或姓名 + */ + + public static String[] parseViewHistory(String input) throws ClinicEaseException { + // Remove the command prefix "view-history" (case-insensitive) and get the remaining string. + String temp = input.replaceFirst("(?i)view-history\\s*", ""); + String type; + String nameOrIc; + + // Check if the remaining string starts with "ic/" or "n/" (case-insensitive). + if (temp.toLowerCase().startsWith("ic/")) { + type = "ic"; + // Extract the real content after "ic/" using extractValue(...) + nameOrIc = extractValue(temp, "ic/"); + } else { + // If there's no explicit prefix, try to detect NRIC vs. name. + // Uses a simple regex matching a 9-character format: e.g., S1234567A + if (temp.matches("^[A-Za-z]\\d{7}[A-Za-z]$")) { + type = "ic"; + nameOrIc = temp.trim(); + } else { + // Otherwise, assume it's a name + type = "n"; + nameOrIc = temp.trim(); + } + } + + // Return null if the parsed value is null or empty + if (nameOrIc == null || nameOrIc.isEmpty()) { + throw new ClinicEaseException("Invalid format. Use: view-history NRIC or view-history NAME"); + } + + // Return the result as [type, value] + return new String[]{type, nameOrIc}; + } + + public static String[] parseStoreHistory(String input) throws ClinicEaseException{ + // Remove the command prefix "store-history" (case-insensitive) + // and get the remaining string. + String temp = input.replaceFirst("(?i)store-history\\s*", ""); + + // Extract n/NAME, ic/NRIC, and h/MEDICAL_HISTORY from the remaining string + String name = extractValue(temp, "n/"); + String nric = extractValue(temp, "ic/"); + String medHistory = extractValue(temp, "h/"); + + // If any part is missing, return null to indicate a parse failure + if (name == null || nric == null || medHistory == null) { + throw new ClinicEaseException("Invalid format. Use: store-history n/NAME ic/NRIC h/MEDICAL_HISTORY"); + } + + // Return the trimmed values as an array + return new String[]{name.trim(), nric.trim(), medHistory.trim()}; } private static String extractValue(String input, String prefix) { - int start = input.toLowerCase().indexOf(prefix.toLowerCase()); + String lowerInput = input.toLowerCase(); + String lowerPrefix = prefix.toLowerCase(); + int start = -1; + + // Find the first occurrence of the prefix that is either at the start or come before blank space + // Ensure checks are not done at where the prefix can’t fully fit + for (int i = 0; i <= lowerInput.length() - lowerPrefix.length(); i++) { + boolean isParamPrefixMatch = lowerInput.startsWith(lowerPrefix, i); + // Check if the character before the prefix is blank space in input to have a valid input format + boolean isParamAtValidPosition = (i == 0) || Character.isWhitespace(input.charAt(i - 1)); + if (isParamPrefixMatch && isParamAtValidPosition) { + start = i; + break; + } + } + if (start < 0) { return null; } + start += prefix.length(); - String[] possible = {"ic/", "dt/", "t/", "dsc/"}; + String[] possible = {"ic/", "n/", "dt/", "t/", "dsc/", "h/"}; int end = input.length(); + + // Determine where the current parameter's detail ends by finding the start of the next parameter for (String p : possible) { if (p.equalsIgnoreCase(prefix)) { continue; } - int idx = input.toLowerCase().indexOf(p.toLowerCase(), start); - if (idx >= 0 && idx < end) { - end = idx; + String lowerP = p.toLowerCase(); + // Find the next occurrence of p that is either at the start or come before blank space + for (int i = start; i <= lowerInput.length() - lowerP.length(); i++) { + boolean isNextParamPrefixMatch = lowerInput.startsWith(lowerP, i); + // Check if the character before the prefix is blank space in input to have a valid input format + boolean isNextParamAtValidPosition = (i == 0) || Character.isWhitespace(input.charAt(i - 1)); + if (isNextParamPrefixMatch && isNextParamAtValidPosition) { + if (i < end) { + end = i; + } + break; + } } } - return input.substring(start, end).trim(); + + String detail = input.substring(start, end).trim(); + return detail.isEmpty() ? null : detail; + } + + public static boolean isStoreHistory(String input) { + return input.toLowerCase().startsWith("store-history"); } + + } diff --git a/src/test/java/MedicalHistoryManagerTest.java b/src/test/java/MedicalHistoryManagerTest.java new file mode 100644 index 0000000000..eae876e8d1 --- /dev/null +++ b/src/test/java/MedicalHistoryManagerTest.java @@ -0,0 +1,48 @@ +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class MedicalHistoryManagerTest { + + private MedicalHistoryManager medicalHistoryManager; + + @BeforeEach + void setUp() { + medicalHistoryManager = new MedicalHistoryManager(); + } + + @Test + void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedHistory() { + // Arrange + String name = "John Doe"; + String nric = "S1234567A"; + String medHistory = "Diabetes, Hypertension"; + + // Act + medicalHistoryManager.storeMedicalHistory(name, nric, medHistory); + + // Assert + List patients = medicalHistoryManager.getPatients(); + assertEquals(1, patients.size(), "There should be one patient stored"); + + Patient storedPatient = patients.get(0); + assertEquals(name, storedPatient.getName(), "Patient name should match"); + assertEquals(nric, storedPatient.getId(), "Patient NRIC should match"); + + List history = storedPatient.getMedicalHistory(); + assertEquals(2, history.size(), "Medical history should contain 2 entries"); + assertTrue(history.contains("Diabetes"), "Medical history should contain 'Diabetes'"); + assertTrue(history.contains("Hypertension"), "Medical history should contain 'Hypertension'"); + } + @Test + void viewMedicalHistoryByNric() { + } + + @Test + void viewMedicalHistoryByName() { + } +} \ No newline at end of file diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/DukeTest.java deleted file mode 100644 index 2dda5fd651..0000000000 --- a/src/test/java/seedu/duke/DukeTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package seedu.duke; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -class DukeTest { - @Test - public void sampleTest() { - assertTrue(true); - } -} From 06e29aca619990151c87e5239775165b51c3ebcd Mon Sep 17 00:00:00 2001 From: yukuan Date: Wed, 19 Mar 2025 17:30:07 +0800 Subject: [PATCH 027/203] Slight change on MedicalHistoryManager --- src/main/java/MedicalHistoryManager.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/MedicalHistoryManager.java b/src/main/java/MedicalHistoryManager.java index 9ef8cead20..3eb28dfe8f 100644 --- a/src/main/java/MedicalHistoryManager.java +++ b/src/main/java/MedicalHistoryManager.java @@ -48,14 +48,6 @@ public void viewMedicalHistoryByName(String name) { } } -// private Patient findPatientByNric(String nric) { -// for (Patient p : patients) { -// if (p.getId().trim().equalsIgnoreCase(nric)) { -// return p; -// } -// } -// return null; -// } public Patient findPatientByNric(String nric) { String target = nric.trim().toUpperCase(); // 统一转为大写 From 88ef717df13fc81885251cd05b57054f8bf70fc9 Mon Sep 17 00:00:00 2001 From: yukuan Date: Wed, 19 Mar 2025 19:07:45 +0800 Subject: [PATCH 028/203] fix the Junit test error --- src/test/java/MedicalHistoryManagerTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/MedicalHistoryManagerTest.java b/src/test/java/MedicalHistoryManagerTest.java index 594ae6d8f0..a5bf9a5086 100644 --- a/src/test/java/MedicalHistoryManagerTest.java +++ b/src/test/java/MedicalHistoryManagerTest.java @@ -2,10 +2,11 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.ArrayList; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + class MedicalHistoryManagerTest { From e6a48fb60ea070433e4d6a0d4119837f578db4a0 Mon Sep 17 00:00:00 2001 From: yukuan Date: Wed, 19 Mar 2025 19:16:57 +0800 Subject: [PATCH 029/203] fix the test error --- src/test/java/MedicalHistoryManagerTest.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/test/java/MedicalHistoryManagerTest.java b/src/test/java/MedicalHistoryManagerTest.java index a5bf9a5086..d35fabde22 100644 --- a/src/test/java/MedicalHistoryManagerTest.java +++ b/src/test/java/MedicalHistoryManagerTest.java @@ -7,7 +7,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; - class MedicalHistoryManagerTest { private MedicalHistoryManager medicalHistoryManager; @@ -41,11 +40,4 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH assertTrue(history.contains("Hypertension"), "Medical history should contain 'Hypertension'"); } - @Test - void viewMedicalHistoryByNric() { - } - - @Test - void viewMedicalHistoryByName() { - } -} \ No newline at end of file +} From 1143d6b6874f9389d855b01fb784cc07aa886497 Mon Sep 17 00:00:00 2001 From: yukuan Date: Wed, 19 Mar 2025 19:23:53 +0800 Subject: [PATCH 030/203] Solve the issue of checkstyle --- src/test/java/MedicalHistoryManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/MedicalHistoryManagerTest.java b/src/test/java/MedicalHistoryManagerTest.java index d35fabde22..a991748226 100644 --- a/src/test/java/MedicalHistoryManagerTest.java +++ b/src/test/java/MedicalHistoryManagerTest.java @@ -39,5 +39,5 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH assertTrue(history.contains("Diabetes"), "Medical history should contain 'Diabetes'"); assertTrue(history.contains("Hypertension"), "Medical history should contain 'Hypertension'"); } - } + From 3f4a804ec9c5446e7fc353d5c27e57706a97407b Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Wed, 19 Mar 2025 19:45:35 +0800 Subject: [PATCH 031/203] Edited appointment's related feature. Added exceptions and some JUnit tests. --- build.gradle | 4 +- src/main/java/Appointment.java | 1 + src/main/java/ClinicEase.java | 54 +++++++-------- src/main/java/ManagementSystem.java | 23 ++++++- src/main/java/Parser.java | 58 +++++++++++++--- src/main/java/Ui.java | 23 +++++-- .../InvalidInputFormatException.java | 7 ++ src/test/java/ManagementSystemTest.java | 57 ++++++++++++++++ src/test/java/ParserTest.java | 67 +++++++++++++++++++ src/test/java/seedu/duke/DukeTest.java | 12 ---- 10 files changed, 247 insertions(+), 59 deletions(-) create mode 100644 src/main/java/exception/InvalidInputFormatException.java create mode 100644 src/test/java/ManagementSystemTest.java create mode 100644 src/test/java/ParserTest.java delete mode 100644 src/test/java/seedu/duke/DukeTest.java diff --git a/build.gradle b/build.gradle index ea82051fab..ec2aeeffb6 100644 --- a/build.gradle +++ b/build.gradle @@ -29,11 +29,11 @@ test { } application { - mainClass.set("seedu.duke.Duke") + mainClass.set("ClinicEase") } shadowJar { - archiveBaseName.set("duke") + archiveBaseName.set("ClinicEase") archiveClassifier.set("") } diff --git a/src/main/java/Appointment.java b/src/main/java/Appointment.java index 016e3ed41a..405edd2425 100644 --- a/src/main/java/Appointment.java +++ b/src/main/java/Appointment.java @@ -1,4 +1,5 @@ public class Appointment { + private static int runningId = 100; private final String id; private final String nric; diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 2d02099644..5de6fb2208 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,3 +1,5 @@ +import exception.InvalidInputFormatException; + public class ClinicEase { public static void main(String[] args) { ManagementSystem manager = new ManagementSystem(); @@ -6,37 +8,35 @@ public static void main(String[] args) { boolean running = true; while (running) { - String input = ui.readCommand(); + try { + String input = ui.readCommand(); - if (Parser.isBye(input)) { - ui.showBye(); - running = false; - } else if (Parser.isAddAppointment(input)) { - String[] details = Parser.parseAddAppointment(input); - if (details == null) { - System.out.println("Invalid format. Use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); - } else { + if (Parser.isBye(input)) { + ui.showBye(); + running = false; + } else if (Parser.isAddAppointment(input)) { + String[] details = Parser.parseAddAppointment(input); manager.addAppointment(details); - } - } else if (Parser.isDeleteAppointment(input)) { - String apptId = Parser.parseDeleteAppointment(input); - if (apptId == null) { - System.out.println("Invalid format. Use: delete-appointment APPOINTMENT_ID"); - } else { + } else if (Parser.isDeleteAppointment(input)) { + String apptId = Parser.parseDeleteAppointment(input); manager.deleteAppointment(apptId); + } else if (Parser.isListAppointments(input)) { + manager.listAppointments(); + } else if (Parser.isAddPatient(input)) { + System.out.println("Feature not implemented yet."); + } else if (Parser.isDeletePatient(input)) { + System.out.println("Feature not implemented yet."); + } else if (Parser.isViewPatient(input)) { + System.out.println("Feature not implemented yet."); + } else if (Parser.isViewHistory(input)) { + System.out.println("Feature not implemented yet."); + } else { + Ui.showLine(); + System.out.println("There is no such command. Please try again."); + Ui.showLine(); } - } else if (Parser.isListAppointments(input)) { - manager.listAppointments(); - } else if (Parser.isAddPatient(input)) { - System.out.println("Feature not implemented yet."); - } else if (Parser.isDeletePatient(input)) { - System.out.println("Feature not implemented yet."); - } else if (Parser.isViewPatient(input)) { - System.out.println("Feature not implemented yet."); - } else if (Parser.isViewHistory(input)) { - System.out.println("Feature not implemented yet."); - } else { - System.out.println("Unknown command."); + } catch (InvalidInputFormatException e) { + ui.showError(e.getMessage()); } } } diff --git a/src/main/java/ManagementSystem.java b/src/main/java/ManagementSystem.java index 81dc51f9ef..61b6f624d9 100644 --- a/src/main/java/ManagementSystem.java +++ b/src/main/java/ManagementSystem.java @@ -15,30 +15,49 @@ public void addAppointment(String[] details) { String desc = details[3]; Appointment appt = new Appointment(nric, date, time, desc); appointments.add(appt); - System.out.println("Appointment added for NRIC " + nric + " on " + date + " at " + time + "."); + + Ui.showLine(); + System.out.println("Appointment added for NRIC: " + nric + " on " + date + " at " + time + "."); + System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); + Ui.showLine(); } public void deleteAppointment(String apptId) { for (int i = 0; i < appointments.size(); i++) { if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { appointments.remove(i); + + Ui.showLine(); System.out.println("Appointment " + apptId + " is deleted successfully."); + System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); + Ui.showLine(); return; } } - System.out.println("No appointment found with ID " + apptId + "."); + Ui.showLine(); + System.out.println("No appointment found with ID: " + apptId + "."); + Ui.showLine(); } public void listAppointments() { if (appointments.isEmpty()) { + Ui.showLine(); System.out.println("No appointments found."); + Ui.showLine(); return; } + + Ui.showLine(); System.out.println("Appointments:"); int count = 1; for (Appointment a : appointments) { System.out.println(count + ". " + a); count++; } + Ui.showLine(); + } + + public List getAppointments() { + return appointments; } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index ad1bd5bc62..66a5794f6a 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -1,4 +1,7 @@ +import exception.InvalidInputFormatException; + public class Parser { + public static boolean isBye(String input) { return input.equalsIgnoreCase("bye"); } @@ -31,21 +34,25 @@ public static boolean isListAppointments(String input) { return input.equalsIgnoreCase("list-appointments"); } - public static String[] parseAddAppointment(String input) { - String temp = input.replaceFirst("(?i)add-appointment\\s*", ""); + public static String[] parseAddAppointment(String input) throws InvalidInputFormatException { + String temp = input.replaceFirst("(?i)add-appointment\\s+", ""); String nric = extractValue(temp, "ic/"); String date = extractValue(temp, "dt/"); String time = extractValue(temp, "t/"); String desc = extractValue(temp, "dsc/"); if (nric == null || date == null || time == null || desc == null) { - return null; + throw new InvalidInputFormatException("Missing details or wrong format for add-appointment!" + System.lineSeparator() + + "Please follow this format: add-appointment ic/NRIC dt/MM-DD t/HHmm dsc/DESCRIPTION"); } return new String[]{nric.trim(), date.trim(), time.trim(), desc.trim()}; } - public static String parseDeleteAppointment(String input) { - String temp = input.replaceFirst("(?i)delete-appointment\\s*", ""); - return temp.isBlank() ? null : temp.trim(); + public static String parseDeleteAppointment(String input) throws InvalidInputFormatException { + if (!input.matches("(?i)delete-appointment\\s+A\\d+")) { + throw new InvalidInputFormatException("Invalid format. Please follow this format: " + + "delete-appointment APPOINTMENT_ID"); + } + return input.replaceFirst("(?i)delete-appointment\\s*", "").trim(); } public static String parseDeletePatient(String input) { @@ -61,22 +68,51 @@ public static String parseViewHistory(String input) { } private static String extractValue(String input, String prefix) { - int start = input.toLowerCase().indexOf(prefix.toLowerCase()); + String lowerInput = input.toLowerCase(); + String lowerPrefix = prefix.toLowerCase(); + int start = -1; + + // Find the first occurrence of the prefix that is either at the start or come before blank space + // Ensure checks are not done at where the prefix can’t fully fit + for (int i = 0; i <= lowerInput.length() - lowerPrefix.length(); i++) { + boolean isParamPrefixMatch = lowerInput.startsWith(lowerPrefix, i); + // Check if the character before the prefix is blank space in input to have a valid input format + boolean isParamAtValidPosition = (i == 0) || Character.isWhitespace(input.charAt(i - 1)); + if (isParamPrefixMatch && isParamAtValidPosition) { + start = i; + break; + } + } + if (start < 0) { return null; } + start += prefix.length(); String[] possible = {"ic/", "dt/", "t/", "dsc/"}; int end = input.length(); + + // Determine where the current parameter's detail ends by finding the start of the next parameter for (String p : possible) { if (p.equalsIgnoreCase(prefix)) { continue; } - int idx = input.toLowerCase().indexOf(p.toLowerCase(), start); - if (idx >= 0 && idx < end) { - end = idx; + String lowerP = p.toLowerCase(); + // Find the next occurrence of p that is either at the start or come before blank space + for (int i = start; i <= lowerInput.length() - lowerP.length(); i++) { + boolean isNextParamPrefixMatch = lowerInput.startsWith(lowerP, i); + // Check if the character before the prefix is blank space in input to have a valid input format + boolean isNextParamAtValidPosition = (i == 0) || Character.isWhitespace(input.charAt(i - 1)); + if (isNextParamPrefixMatch && isNextParamAtValidPosition) { + if (i < end) { + end = i; + } + break; + } } } - return input.substring(start, end).trim(); + + String detail = input.substring(start, end).trim(); + return detail.isEmpty() ? null : detail; } } diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 2c9f2a9c3c..2cffc46da5 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -7,21 +7,34 @@ public Ui() { sc = new Scanner(System.in); } + public static final String DIVIDER = "-".repeat(100); + + public static void showLine() { + System.out.println(DIVIDER); + } + public void showWelcome() { - System.out.println("===================================================="); - System.out.println("Welcome to Clinic Management v1!"); + System.out.println(DIVIDER); + System.out.println("Welcome to ClinicEase v1!"); System.out.println("Type a command, or 'bye' to exit."); - System.out.println("===================================================="); + System.out.println(DIVIDER); } public void showBye() { - System.out.println("===================================================="); + System.out.println(DIVIDER); System.out.println("Goodbye!"); - System.out.println("===================================================="); + System.out.println(DIVIDER); } public String readCommand() { System.out.print("> "); return sc.nextLine().trim(); } + + public void showError(String message) { + System.out.println(DIVIDER); + System.out.println(message); + System.out.println(DIVIDER); + } + } diff --git a/src/main/java/exception/InvalidInputFormatException.java b/src/main/java/exception/InvalidInputFormatException.java new file mode 100644 index 0000000000..026baabf39 --- /dev/null +++ b/src/main/java/exception/InvalidInputFormatException.java @@ -0,0 +1,7 @@ +package exception; + +public class InvalidInputFormatException extends Exception { + public InvalidInputFormatException (String message) { + super(message); + } +} diff --git a/src/test/java/ManagementSystemTest.java b/src/test/java/ManagementSystemTest.java new file mode 100644 index 0000000000..88560db4e0 --- /dev/null +++ b/src/test/java/ManagementSystemTest.java @@ -0,0 +1,57 @@ +import java.util.List; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ManagementSystemTest { + + @Test + // methodBeingTested_conditionBeingTested_expectedOutcome + // happy path + void addAppointment_correctInput_expectOneNewAppointment() { + ManagementSystem ms = new ManagementSystem(); + String[] details = {"S1234567D", "03-10", "1200", "medical check-up"}; + + List appointments = ms.getAppointments(); + ms.addAppointment(details); + + assertEquals(1, appointments.size(), "Expected one appointment to be added"); + + Appointment addedAppointment = appointments.get(0); + assertEquals("S1234567D", addedAppointment.getNric(), "NRIC does not match"); + assertEquals("03-10", addedAppointment.getDate(), "Date does not match"); + assertEquals("1200", addedAppointment.getTime(), "Time does not match"); + assertEquals("medical check-up", addedAppointment.getDescription(), "Description does not match"); + } + + + @Test + void deleteAppointment_existingId_expectAppointmentDeleted() { + ManagementSystem ms = new ManagementSystem(); + String[] details = {"S1234567D", "03-10", "1200", "medical check-up"}; + + List appointments = ms.getAppointments(); + ms.addAppointment(details); + + String apptId = ms.getAppointments().get(0).getId(); + ms.deleteAppointment(apptId); + + assertEquals(0, appointments.size(), "Expected one appointment to be deleted"); + } + + @Test + void deleteAppointment_nonExistingId_expectNoAppointmentDeleted() { + ManagementSystem ms = new ManagementSystem(); + String[] details = {"S1234567D", "03-10", "1200", "medical check-up"}; + + List appointments = ms.getAppointments(); + ms.addAppointment(details); + + String nonExistingId = "A999"; + ms.deleteAppointment(nonExistingId); + + assertEquals(1, appointments.size(), "Expected previous appointment to be in the list."); + } + +} \ No newline at end of file diff --git a/src/test/java/ParserTest.java b/src/test/java/ParserTest.java new file mode 100644 index 0000000000..3653562cf0 --- /dev/null +++ b/src/test/java/ParserTest.java @@ -0,0 +1,67 @@ +import exception.InvalidInputFormatException; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ParserTest { + + @Test + void parseAddAppointment_correctFormat_expectSuccessfulParsing() throws InvalidInputFormatException { + String input = "add-appointment ic/S1234567D dt/03-19 t/1200 dsc/medical check-up"; + + String[] result = Parser.parseAddAppointment(input); + + assertNotNull(result, "Result should not be null"); + assertEquals(4, result.length, "Result array should have 4 elements"); + assertEquals("S1234567D", result[0], "NRIC does not match"); + assertEquals("03-19", result[1], "Date does not match"); + assertEquals("1200", result[2], "Time does not match"); + assertEquals("medical check-up", result[3], "Description does not match"); + } + + @Test + void parseAddAppointment_invalidFormat_expectException() { + String input = "add-appointment ic/S1234567D dt/03-19 t/1200"; + + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); + } + + @Test + void parseAddAppointment_missingDetail_expectedException() { + String input = "add-appointment ic/ dt/03-19 t/1200 dsc/medical check-up"; + + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); + } + + @Test + void parseDeleteAppointment_validInput_expectedSuccess() throws InvalidInputFormatException { + String input = "delete-appointment A100"; + String result = Parser.parseDeleteAppointment(input); + + assertEquals("A100", result, "Appointment ID does not match"); + } + + @Test + void parseDeleteAppointment_extraSpaces_expectSuccess() throws InvalidInputFormatException { + String input = "delete-appointment A100"; + String result = Parser.parseDeleteAppointment(input); + + assertEquals("A100", result, "Appointment ID does not match"); + } + + @Test + void parseDeleteAppointment_invalidAppointmentId_expectedException() { + String input = "delete-appointment 100"; + + assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); + } + + @Test + void parseDeleteAppointment_lowercaseInput_expectSuccess() throws InvalidInputFormatException { + String input = "delete-appointment a100"; + String result = Parser.parseDeleteAppointment(input); + + assertEquals("a100", result, "Appointment ID does not match"); + } +} diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/DukeTest.java deleted file mode 100644 index 2dda5fd651..0000000000 --- a/src/test/java/seedu/duke/DukeTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package seedu.duke; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -class DukeTest { - @Test - public void sampleTest() { - assertTrue(true); - } -} From 23ba3aeb28ccb3ea79a45d8ca3d918d036ddd4b8 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Wed, 19 Mar 2025 22:38:40 +0800 Subject: [PATCH 032/203] Fixed checkstyle. --- .../exception/DuplicatePatientIDException.java | 2 +- src/main/java/miscellaneous/Parser.java | 7 ++++--- src/main/java/miscellaneous/Ui.java | 3 +-- .../java/manager/ManagementSystemTest.java | 18 +++++++++++------- .../manager/MedicalHistoryManagerTest.java | 2 +- src/test/java/miscellaneous/ParserTest.java | 6 +++--- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/exception/DuplicatePatientIDException.java b/src/main/java/exception/DuplicatePatientIDException.java index 9a6d020af1..8cfa91ffd3 100644 --- a/src/main/java/exception/DuplicatePatientIDException.java +++ b/src/main/java/exception/DuplicatePatientIDException.java @@ -4,4 +4,4 @@ public class DuplicatePatientIDException extends Exception { public DuplicatePatientIDException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 7667e7f5d3..4a29aaf212 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -58,8 +58,8 @@ public static String[] parseAddAppointment(String input) throws InvalidInputForm String time = extractValue(temp, "t/"); String desc = extractValue(temp, "dsc/"); if (nric == null || date == null || time == null || desc == null) { - throw new InvalidInputFormatException("Missing details or wrong format for add-appointment!" + System.lineSeparator() + - "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); + throw new InvalidInputFormatException("Missing details or wrong format for add-appointment!" + + System.lineSeparator() + "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); } return new String[]{nric.trim(), date.trim(), time.trim(), desc.trim()}; } @@ -132,7 +132,8 @@ public static String[] parseStoreHistory(String input) throws InvalidInputFormat // If any part is missing, return null to indicate a parse failure if (name == null || nric == null || medHistory == null) { - throw new InvalidInputFormatException("Invalid format. Please use: store-history n/NAME ic/NRIC h/MEDICAL_HISTORY"); + throw new InvalidInputFormatException("Invalid format. " + + "Please use: store-history n/NAME ic/NRIC h/MEDICAL_HISTORY"); } // Return the trimmed values as an array diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 9bbbae23b1..d78b0e795d 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -4,13 +4,12 @@ public class Ui { private final Scanner sc; + public static final String DIVIDER = "-".repeat(100); public Ui() { sc = new Scanner(System.in); } - public static final String DIVIDER = "-".repeat(100); - public static void showLine() { System.out.println(DIVIDER); } diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 6cd64c0a84..4c9b4fe25e 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -2,7 +2,6 @@ import exception.DuplicatePatientIDException; import exception.InvalidInputFormatException; -import miscellaneous.Parser; import java.util.List; @@ -16,7 +15,8 @@ class ManagementSystemTest { @Test - void addPatient_correctInput_expectOneNewPatient() throws DuplicatePatientIDException, InvalidInputFormatException { + void addPatient_correctInput_expectOneNewPatient() throws DuplicatePatientIDException, + InvalidInputFormatException { ManagementSystem system = new ManagementSystem(); String input = "add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"; @@ -26,7 +26,8 @@ void addPatient_correctInput_expectOneNewPatient() throws DuplicatePatientIDExce } @Test - void addPatient_duplicatePatientID_expectException() throws DuplicatePatientIDException, InvalidInputFormatException { + void addPatient_duplicatePatientID_expectException() throws DuplicatePatientIDException, + InvalidInputFormatException { ManagementSystem system = new ManagementSystem(); String input1 = "add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"; String input2 = "add-patient n/John Smith ic/S1234567A dob/01-10-1999 g/M p/91207878 a/123 High St"; @@ -37,7 +38,8 @@ void addPatient_duplicatePatientID_expectException() throws DuplicatePatientIDEx } @Test - void deletePatient_correctInput_expectPatientDeleted() throws DuplicatePatientIDException, InvalidInputFormatException { + void deletePatient_correctInput_expectPatientDeleted() throws DuplicatePatientIDException, + InvalidInputFormatException { ManagementSystem system = new ManagementSystem(); system.addPatient("add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"); @@ -47,7 +49,8 @@ void deletePatient_correctInput_expectPatientDeleted() throws DuplicatePatientID } @Test - void viewPatient_correctInput_expectSpecifiedPatientViewed() throws DuplicatePatientIDException, InvalidInputFormatException, DuplicatePatientIDException { + void viewPatient_correctInput_expectSpecifiedPatientViewed() throws InvalidInputFormatException, + DuplicatePatientIDException { ManagementSystem system = new ManagementSystem(); system.addPatient("add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"); @@ -71,7 +74,8 @@ void addAppointment_correctInput_expectOneNewAppointment() { assertEquals("S1234567D", addedAppointment.getNric(), "NRIC does not match"); assertEquals("03-10", addedAppointment.getDate(), "Date does not match"); assertEquals("1200", addedAppointment.getTime(), "Time does not match"); - assertEquals("medical check-up", addedAppointment.getDescription(), "Description does not match"); + assertEquals("medical check-up", addedAppointment.getDescription(), + "Description does not match"); } @@ -103,4 +107,4 @@ void deleteAppointment_nonExistingId_expectNoAppointmentDeleted() { assertEquals(1, appointments.size(), "Expected previous appointment to be in the list."); } -} \ No newline at end of file +} diff --git a/src/test/java/manager/MedicalHistoryManagerTest.java b/src/test/java/manager/MedicalHistoryManagerTest.java index 26d32c32fd..5516b75360 100644 --- a/src/test/java/manager/MedicalHistoryManagerTest.java +++ b/src/test/java/manager/MedicalHistoryManagerTest.java @@ -32,4 +32,4 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH assertTrue(history.contains("Hypertension"), "Medical history should contain 'Hypertension'"); } -} \ No newline at end of file +} diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index 0f51296617..73c28956a1 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -1,6 +1,5 @@ package miscellaneous; -import exception.DuplicatePatientIDException; import exception.InvalidInputFormatException; import org.junit.jupiter.api.Test; @@ -73,8 +72,9 @@ void parseDeleteAppointment_lowercaseInput_expectSuccess() throws InvalidInputFo @Test void parseAddPatient_invalidInputFormat_expectException() { - String input = "add-patient n/John Doe ic/ dob/12-12-1999 g/M p/98765432 a/123 Main Street h/Diabetes, Hypertension"; + String input = "add-patient n/John Doe ic/ dob/12-12-1999 g/M " + + "p/98765432 a/123 Main Street h/Diabetes, Hypertension"; assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); } -} \ No newline at end of file +} From d7b4e83fd0d207c2e3e4f3a36d0a1327bd707df6 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Wed, 19 Mar 2025 22:40:57 +0800 Subject: [PATCH 033/203] Fixed checkstyle for UI --- src/main/java/miscellaneous/Ui.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index d78b0e795d..0185f2ea8c 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -3,9 +3,10 @@ import java.util.Scanner; public class Ui { - private final Scanner sc; public static final String DIVIDER = "-".repeat(100); + private final Scanner sc; + public Ui() { sc = new Scanner(System.in); } From a583cfc52836004d3181ca1d62fdb58501f675b6 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Wed, 19 Mar 2025 22:47:50 +0800 Subject: [PATCH 034/203] Enable assertions in build.gradle --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index ec2aeeffb6..4686c26b8a 100644 --- a/build.gradle +++ b/build.gradle @@ -43,4 +43,5 @@ checkstyle { run{ standardInput = System.in + enableAssertions = true } From 3b7d1a00ed5480dd99a6253f14784d5cbffffa51 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Wed, 19 Mar 2025 23:23:25 +0800 Subject: [PATCH 035/203] Fixed edge case of delete-patient and view-patient. Fixed one inconsistency of view-history output message. --- META-INF/MANIFEST.MF | 3 ++ src/main/java/manager/ManagementSystem.java | 31 ++++++++++++------- .../java/manager/MedicalHistoryManager.java | 2 +- 3 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 META-INF/MANIFEST.MF diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..a2d87b6b88 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: ClinicEase + diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 68bb7e425a..7655318e30 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -41,15 +41,13 @@ public void addPatient(String line) throws DuplicatePatientIDException, InvalidI Ui.showLine(); } - public void deletePatient(String line) { - String nric = line.substring(15); - if (nric.isBlank()) { - Ui.showLine(); - System.out.println("Invalid NRIC provided."); - Ui.showLine(); - return; + public void deletePatient(String line) throws InvalidInputFormatException { + if (line.length() < 15) { + throw new InvalidInputFormatException("Invalid command format. Use: delete-patient [NRIC]"); } + String nric = line.substring(15).trim(); // Trim whitespace + if (patients.containsKey(nric)) { Patient removedPatient = patients.remove(nric); Ui.showLine(); @@ -58,18 +56,27 @@ public void deletePatient(String line) { Ui.showLine(); } else { Ui.showLine(); - System.out.println("Error: Patient with NRIC " + nric + " not found."); + System.out.println("Patient with NRIC " + nric + " not found."); Ui.showLine(); } } - public void viewPatient(String line) { - String nric = line.substring(13); - if (nric.isBlank()) { - System.out.println("Invalid NRIC provided."); + public void viewPatient(String line) throws InvalidInputFormatException{ + if (line.length() < 13) { + throw new InvalidInputFormatException("Invalid command format. Use: view-patient [NRIC]"); + } + + String nric = line.substring(13).trim(); // Extract and trim NRIC + + // Check if patient exists + if (!patients.containsKey(nric)) { + Ui.showLine(); + System.out.println("Patient with NRIC " + nric + " not found."); + Ui.showLine(); return; } + Ui.showLine(); System.out.println("-".repeat(43)+ "Patient Details" + "-".repeat(43)); System.out.println(patients.get(nric).toString()); Ui.showLine(); diff --git a/src/main/java/manager/MedicalHistoryManager.java b/src/main/java/manager/MedicalHistoryManager.java index e69ab192c5..2582143f81 100644 --- a/src/main/java/manager/MedicalHistoryManager.java +++ b/src/main/java/manager/MedicalHistoryManager.java @@ -42,9 +42,9 @@ public void viewMedicalHistoryByNric(String nric) { Ui.showLine(); System.out.println("No patient found with NRIC " + nric + "."); } else { + Ui.showLine(); printPatientHistory(patient); } - Ui.showLine(); } public void viewMedicalHistoryByName(String name) { From d403595d788f5e44d55eb1eaadd73c732e1ba707 Mon Sep 17 00:00:00 2001 From: judHoka Date: Thu, 20 Mar 2025 23:32:35 +0800 Subject: [PATCH 036/203] Added JUnit for patient --- src/test/java/manager/ManagementSystemTest.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 4c9b4fe25e..454560ba65 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -15,14 +15,13 @@ class ManagementSystemTest { @Test - void addPatient_correctInput_expectOneNewPatient() throws DuplicatePatientIDException, - InvalidInputFormatException { - ManagementSystem system = new ManagementSystem(); - String input = "add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"; + void addPatient_correctInput_expectOnePatient() throws DuplicatePatientIDException, InvalidInputFormatException { + ManagementSystem manager = new ManagementSystem(); + String input = "add-patient n/John Doe ic/S1234567A dob/12-12-1990 g/M p/91234567 a/123 Main St"; - system.addPatient(input); + manager.addPatient(input); - assertTrue(system.getPatient().containsKey("S1234567A")); + assertTrue(manager.getPatient().containsKey("S1234567A")); } @Test @@ -80,7 +79,7 @@ void addAppointment_correctInput_expectOneNewAppointment() { @Test - void deleteAppointment_existingId_expectAppointmentDeleted() { + void deleteAppointment_existingId_expectAppointmentDeleted() { ManagementSystem ms = new ManagementSystem(); String[] details = {"S1234567D", "03-10", "1200", "medical check-up"}; @@ -94,7 +93,7 @@ void deleteAppointment_existingId_expectAppointmentDeleted() { } @Test - void deleteAppointment_nonExistingId_expectNoAppointmentDeleted() { + void deleteAppointment_nonExistingId_expectNoAppointmentDeleted() { ManagementSystem ms = new ManagementSystem(); String[] details = {"S1234567D", "03-10", "1200", "medical check-up"}; From 07d8de3d11a1b8124f05aeea02f5dcf18a6c606c Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 24 Mar 2025 16:43:44 +0800 Subject: [PATCH 037/203] Fix Gradle wrapper --- gradle/wrapper/gradle-wrapper.jar | Bin 63375 -> 61624 bytes gradle/wrapper/gradle-wrapper.properties | 1 - gradlew | 16 ++++++---------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 033e24c4cdf41af1ab109bc7f253b2b887023340..afba109285af78dbd2a1d187e33ac4f87c76e392 100644 GIT binary patch delta 24872 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 HzpnldrMqp; delta 26705 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 66c01cfeba..4e86b92707 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,6 +2,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip networkTimeout=10000 -validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index fcb6fca147..65dcd68d65 100755 --- a/gradlew +++ b/gradlew @@ -85,6 +85,9 @@ done APP_BASE_NAME=${0##*/} APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,13 +133,10 @@ location of your Java installation." fi else JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,10 +197,6 @@ if "$cygwin" || "$msys" ; then done fi - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in From ef55aeb5a3977b28dfc71f6b2cbe26f15b37f60a Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 24 Mar 2025 20:09:34 +0800 Subject: [PATCH 038/203] added junit --- .../java/manager/ManagementSystemTest.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 454560ba65..480af45c5f 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -47,18 +47,6 @@ void deletePatient_correctInput_expectPatientDeleted() throws DuplicatePatientID assertFalse(system.getPatient().containsKey("S1234567A")); } - @Test - void viewPatient_correctInput_expectSpecifiedPatientViewed() throws InvalidInputFormatException, - DuplicatePatientIDException { - ManagementSystem system = new ManagementSystem(); - - system.addPatient("add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"); - - system.viewPatient("view-patient S1234567A"); - - assertTrue(system.getPatient().containsKey("S1234567A")); - } - @Test void addAppointment_correctInput_expectOneNewAppointment() { ManagementSystem ms = new ManagementSystem(); @@ -106,4 +94,16 @@ void deleteAppointment_nonExistingId_expectNoAppointmentDeleted() { assertEquals(1, appointments.size(), "Expected previous appointment to be in the list."); } + @Test + void viewPatients_correctInput_expectPatientsViewed() throws + DuplicatePatientIDException, InvalidInputFormatException { + ManagementSystem system = new ManagementSystem(); + + system.addPatient("add-patient n/John Doe ic/S1234567A " + + "dob/01-01-1990 g/M p/98765432 a/123 Main St"); + + system.viewPatient("view-patient S1234567A"); + assertTrue(system.getPatient().containsKey("S1234567A")); + } + } From 70ad8c015d681e27b1c4e4640b84bdaa96f13264 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 24 Mar 2025 21:09:40 +0800 Subject: [PATCH 039/203] gradle --- gradle/wrapper/gradle-wrapper.jar | Bin 61624 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 1 + gradlew | 16 ++++++++++------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index afba109285af78dbd2a1d187e33ac4f87c76e392..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 26705 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 delta 24872 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 HzpnldrMqp; diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4e86b92707..66c01cfeba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d65..fcb6fca147 100755 --- a/gradlew +++ b/gradlew @@ -85,9 +85,6 @@ done APP_BASE_NAME=${0##*/} APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in From cb434dc64aedcd3794fc8463882ae032e6e61ae2 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 24 Mar 2025 21:15:13 +0800 Subject: [PATCH 040/203] checkstyle test --- src/test/java/manager/ManagementSystemTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 480af45c5f..03b2947bf4 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -96,7 +96,7 @@ void deleteAppointment_nonExistingId_expectNoAppointmentDeleted() { @Test void viewPatients_correctInput_expectPatientsViewed() throws - DuplicatePatientIDException, InvalidInputFormatException { + DuplicatePatientIDException, InvalidInputFormatException { ManagementSystem system = new ManagementSystem(); system.addPatient("add-patient n/John Doe ic/S1234567A " + From d1299f1d5e97fd2a51b82dbb07b3ef516a81c6b4 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Wed, 26 Mar 2025 19:03:49 +0800 Subject: [PATCH 041/203] Add assertions and JUnit tests --- src/main/java/miscellaneous/Parser.java | 9 ++-- src/test/java/miscellaneous/ParserTest.java | 48 +++++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 4a29aaf212..2b8af0d678 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -59,12 +59,13 @@ public static String[] parseAddAppointment(String input) throws InvalidInputForm String desc = extractValue(temp, "dsc/"); if (nric == null || date == null || time == null || desc == null) { throw new InvalidInputFormatException("Missing details or wrong format for add-appointment!" - + System.lineSeparator() + "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); + + System.lineSeparator() + "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); } return new String[]{nric.trim(), date.trim(), time.trim(), desc.trim()}; } public static String parseDeleteAppointment(String input) throws InvalidInputFormatException { + assert input != null : "Input cannot be null in parseDeleteAppointment()"; if (!input.matches("(?i)delete-appointment\\s+A\\d+")) { throw new InvalidInputFormatException("Invalid format! Please use: " + "delete-appointment APPOINTMENT_ID"); @@ -73,6 +74,7 @@ public static String parseDeleteAppointment(String input) throws InvalidInputFor } public static String[] parseAddPatient(String input) throws InvalidInputFormatException { + assert input != null : "Input cannot be null in parseAddPatient()"; String temp = input.replaceFirst("(?i)add-patient\\s*", ""); String name = extractValue(temp, "n/"); String nric = extractValue(temp, "ic/"); @@ -81,7 +83,7 @@ public static String[] parseAddPatient(String input) throws InvalidInputFormatEx String phone = extractValue(temp, "p/"); String address = extractValue(temp, "a/"); if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) { - throw new InvalidInputFormatException ("Patient details are incomplete!" + System.lineSeparator() + throw new InvalidInputFormatException("Patient details are incomplete!" + System.lineSeparator() + "Also, please use: add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS"); } return new String[]{nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim()}; @@ -89,6 +91,7 @@ public static String[] parseAddPatient(String input) throws InvalidInputFormatEx public static String[] parseViewHistory(String input) throws InvalidInputFormatException { // Remove the command prefix "view-history" (case-insensitive) and get the remaining string. + assert input != null : "Input cannot be null in parseViewHistory()"; String temp = input.replaceFirst("(?i)view-history\\s*", ""); String type; String nameOrIc; @@ -120,7 +123,7 @@ public static String[] parseViewHistory(String input) throws InvalidInputFormatE return new String[]{type, nameOrIc}; } - public static String[] parseStoreHistory(String input) throws InvalidInputFormatException{ + public static String[] parseStoreHistory(String input) throws InvalidInputFormatException { // Remove the command prefix "store-history" (case-insensitive) // and get the remaining string. String temp = input.replaceFirst("(?i)store-history\\s*", ""); diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index 73c28956a1..b66c2ce25c 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -77,4 +77,52 @@ void parseAddPatient_invalidInputFormat_expectException() { assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); } + + @Test + void parseViewHistory_validNric() throws InvalidInputFormatException { + String[] result = Parser.parseViewHistory("view-history S1234567D"); + assertEquals("ic", result[0]); + assertEquals("S1234567D", result[1]); + } + + @Test + void parseViewHistory_validName() throws InvalidInputFormatException { + String[] result = Parser.parseViewHistory("view-history John Doe"); + assertEquals("n", result[0]); + assertEquals("John Doe", result[1]); + } + + @Test + void parseViewHistory_explicitNricPrefix() throws InvalidInputFormatException { + String[] result = Parser.parseViewHistory("view-history ic/S1234567A"); + assertEquals("ic", result[0]); + assertEquals("S1234567A", result[1]); + } + + @Test + void parseViewHistory_invalidInput_expectException() { + assertThrows(InvalidInputFormatException.class, () -> + Parser.parseViewHistory("view-history")); + assertThrows(InvalidInputFormatException.class, () -> + Parser.parseViewHistory("view-history ")); + } + + @Test + void parseStoreHistory_validInput_expectSuccess() throws InvalidInputFormatException { + String[] result = Parser.parseStoreHistory("store-history n/John Doe ic/S1234567D h/Allergic to nuts"); + assertEquals("John Doe", result[0]); + assertEquals("S1234567D", result[1]); + assertEquals("Allergic to nuts", result[2]); + } + + @Test + void parseStoreHistory_missingFields_expectException() { + assertThrows(InvalidInputFormatException.class, () -> + Parser.parseStoreHistory("store-history ic/S1234567D h/Allergic to nuts")); + assertThrows(InvalidInputFormatException.class, () -> + Parser.parseStoreHistory("store-history n/John Doe h/Allergic to nuts")); + assertThrows(InvalidInputFormatException.class, () -> + Parser.parseStoreHistory("store-history n/John Doe ic/S1234567D")); + } } + From fe07c70164bc43d933d28120da43cc1897bb71a8 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Wed, 26 Mar 2025 20:26:52 +0800 Subject: [PATCH 042/203] Make the code more OOP. --- build.gradle | 2 +- src/main/java/ClinicEase.java | 66 +++---- .../java/command/AddAppointmentCommand.java | 21 +++ src/main/java/command/AddPatientCommand.java | 21 +++ src/main/java/command/Command.java | 14 ++ .../command/DeleteAppointmentCommand.java | 19 ++ .../java/command/DeletePatientCommand.java | 19 ++ src/main/java/command/ExitCommand.java | 17 ++ .../java/command/ListAppointmentCommand.java | 11 ++ src/main/java/command/ListPatientCommand.java | 11 ++ .../java/command/StoreMedHistoryCommand.java | 21 +++ .../java/command/ViewMedHistoryCommand.java | 23 +++ src/main/java/command/ViewPatientCommand.java | 19 ++ .../exception/UnknownCommandException.java | 8 + src/main/java/manager/ManagementSystem.java | 177 +++++++++--------- .../java/manager/MedicalHistoryManager.java | 105 ----------- src/main/java/miscellaneous/Parser.java | 155 ++++++++------- src/main/java/miscellaneous/Ui.java | 120 +++++++++++- .../java/manager/ManagementSystemTest.java | 109 ----------- .../manager/MedicalHistoryManagerTest.java | 35 ---- src/test/java/miscellaneous/ParserTest.java | 15 -- 21 files changed, 513 insertions(+), 475 deletions(-) create mode 100644 src/main/java/command/AddAppointmentCommand.java create mode 100644 src/main/java/command/AddPatientCommand.java create mode 100644 src/main/java/command/Command.java create mode 100644 src/main/java/command/DeleteAppointmentCommand.java create mode 100644 src/main/java/command/DeletePatientCommand.java create mode 100644 src/main/java/command/ExitCommand.java create mode 100644 src/main/java/command/ListAppointmentCommand.java create mode 100644 src/main/java/command/ListPatientCommand.java create mode 100644 src/main/java/command/StoreMedHistoryCommand.java create mode 100644 src/main/java/command/ViewMedHistoryCommand.java create mode 100644 src/main/java/command/ViewPatientCommand.java create mode 100644 src/main/java/exception/UnknownCommandException.java delete mode 100644 src/main/java/manager/MedicalHistoryManager.java delete mode 100644 src/test/java/manager/ManagementSystemTest.java delete mode 100644 src/test/java/manager/MedicalHistoryManagerTest.java diff --git a/build.gradle b/build.gradle index 4686c26b8a..d45b786b93 100644 --- a/build.gradle +++ b/build.gradle @@ -43,5 +43,5 @@ checkstyle { run{ standardInput = System.in - enableAssertions = true + //enableAssertions = true } diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 7104c761c0..456b2e3f5e 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,63 +1,39 @@ +import command.Command; import exception.DuplicatePatientIDException; import exception.InvalidInputFormatException; +import exception.UnknownCommandException; import manager.ManagementSystem; -import manager.MedicalHistoryManager; import miscellaneous.Parser; import miscellaneous.Ui; public class ClinicEase { - public static void main(String[] args) { - ManagementSystem manager = new ManagementSystem(); - MedicalHistoryManager mhManager = new MedicalHistoryManager(); - Ui ui = new Ui(); - ui.showWelcome(); + private ManagementSystem manager; + private Ui ui; + + public ClinicEase() { + this.manager = new ManagementSystem(); + this.ui = new Ui(); + } + + public void run() { + ui.showWelcome(); boolean running = true; + while (running) { try { String input = ui.readCommand(); - - if (Parser.isBye(input)) { - ui.showBye(); - running = false; - } else if (Parser.isAddPatient(input)) { - manager.addPatient(input); - } else if (Parser.isDeletePatient(input)) { - manager.deletePatient(input); - } else if (Parser.isViewPatient(input)) { - manager.viewPatient(input); - } else if (Parser.isListPatient(input)) { - manager.listPatients(); - } else if (Parser.isViewHistory(input)) { - String[] typeAndValue = Parser.parseViewHistory(input); - String type = typeAndValue[0]; - String value = typeAndValue[1]; - - if ("ic".equals(type)) { - mhManager.viewMedicalHistoryByNric(value); - } else { - mhManager.viewMedicalHistoryByName(value); - } - } else if (Parser.isStoreHistory(input)) { - String[] details = Parser.parseStoreHistory(input); - mhManager.storeMedicalHistory(details[0], details[1], details[2]); - } else if (Parser.isAddAppointment(input)) { - String[] details = Parser.parseAddAppointment(input); - manager.addAppointment(details); - } else if (Parser.isDeleteAppointment(input)) { - String apptId = Parser.parseDeleteAppointment(input); - manager.deleteAppointment(apptId); - } else if (Parser.isListAppointments(input)) { - manager.listAppointments(); - } else { - Ui.showLine(); - System.out.println("Unknown command. Please try again."); - Ui.showLine(); - } - } catch (InvalidInputFormatException | DuplicatePatientIDException e) { + Command command = Parser.parse(input); + command.execute(manager, ui); + running = !command.isExit(); + } catch (InvalidInputFormatException | UnknownCommandException | DuplicatePatientIDException e) { ui.showError(e.getMessage()); } } } + + public static void main(String[] args) { + new ClinicEase().run(); + } } diff --git a/src/main/java/command/AddAppointmentCommand.java b/src/main/java/command/AddAppointmentCommand.java new file mode 100644 index 0000000000..37ffc90af3 --- /dev/null +++ b/src/main/java/command/AddAppointmentCommand.java @@ -0,0 +1,21 @@ +package command; + +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class AddAppointmentCommand extends Command { + + protected Appointment appointment; + + public AddAppointmentCommand(Appointment appointment) { + this.appointment = appointment; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + manager.addAppointment(appointment); + ui.showAppointmentAdded(manager.getAppointments()); + } + +} diff --git a/src/main/java/command/AddPatientCommand.java b/src/main/java/command/AddPatientCommand.java new file mode 100644 index 0000000000..cceed8c80b --- /dev/null +++ b/src/main/java/command/AddPatientCommand.java @@ -0,0 +1,21 @@ +package command; + +import exception.DuplicatePatientIDException; +import manager.ManagementSystem; +import manager.Patient; +import miscellaneous.Ui; + +public class AddPatientCommand extends Command { + + protected Patient patient; + + public AddPatientCommand(Patient patient) { + this.patient = patient; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException { + manager.addPatient(patient); + ui.showPatientAdded(manager.getPatients()); + } +} diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java new file mode 100644 index 0000000000..42814b77f7 --- /dev/null +++ b/src/main/java/command/Command.java @@ -0,0 +1,14 @@ +package command; + +import exception.DuplicatePatientIDException; +import manager.ManagementSystem; +import miscellaneous.Ui; + +public abstract class Command { + + public abstract void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException; + + public boolean isExit() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/command/DeleteAppointmentCommand.java b/src/main/java/command/DeleteAppointmentCommand.java new file mode 100644 index 0000000000..5832ca373d --- /dev/null +++ b/src/main/java/command/DeleteAppointmentCommand.java @@ -0,0 +1,19 @@ +package command; + +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class DeleteAppointmentCommand extends Command { + protected String apptId; + + public DeleteAppointmentCommand(String apptId) { + this.apptId = apptId; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + Appointment removedAppointment = manager.deleteAppointment(apptId); + ui.showAppointmentDeleted(manager.getAppointments(), removedAppointment, apptId); + } +} diff --git a/src/main/java/command/DeletePatientCommand.java b/src/main/java/command/DeletePatientCommand.java new file mode 100644 index 0000000000..a6b43a0c6e --- /dev/null +++ b/src/main/java/command/DeletePatientCommand.java @@ -0,0 +1,19 @@ +package command; + +import manager.ManagementSystem; +import manager.Patient; +import miscellaneous.Ui; + +public class DeletePatientCommand extends Command { + protected String nric; + + public DeletePatientCommand(String nric) { + this.nric = nric; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + Patient removedPatient = manager.deletePatient(nric); + ui.showPatientDeleted(removedPatient, nric); + } +} diff --git a/src/main/java/command/ExitCommand.java b/src/main/java/command/ExitCommand.java new file mode 100644 index 0000000000..163d22021b --- /dev/null +++ b/src/main/java/command/ExitCommand.java @@ -0,0 +1,17 @@ +package command; + +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class ExitCommand extends Command { + + @Override + public void execute(ManagementSystem manager, Ui ui) { + Ui.showBye(); + } + + @Override + public boolean isExit() { + return true; + } +} diff --git a/src/main/java/command/ListAppointmentCommand.java b/src/main/java/command/ListAppointmentCommand.java new file mode 100644 index 0000000000..a8c56662e1 --- /dev/null +++ b/src/main/java/command/ListAppointmentCommand.java @@ -0,0 +1,11 @@ +package command; + +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class ListAppointmentCommand extends Command { + @Override + public void execute(ManagementSystem manager, Ui ui) { + ui.showAppointmentList(manager.getAppointments()); + } +} diff --git a/src/main/java/command/ListPatientCommand.java b/src/main/java/command/ListPatientCommand.java new file mode 100644 index 0000000000..7c9a00bd79 --- /dev/null +++ b/src/main/java/command/ListPatientCommand.java @@ -0,0 +1,11 @@ +package command; + +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class ListPatientCommand extends Command { + @Override + public void execute(ManagementSystem manager, Ui ui) { + ui.showPatientList(manager.getPatients()); + } +} diff --git a/src/main/java/command/StoreMedHistoryCommand.java b/src/main/java/command/StoreMedHistoryCommand.java new file mode 100644 index 0000000000..b16ecaef15 --- /dev/null +++ b/src/main/java/command/StoreMedHistoryCommand.java @@ -0,0 +1,21 @@ +package command; + +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class StoreMedHistoryCommand extends Command { + private String name; + private String nric; + private String medHistory; + + public StoreMedHistoryCommand(String[] details) { + this.name = details[0]; + this.nric = details[1]; + this.medHistory = details[2]; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + manager.storeMedicalHistory(name, nric, medHistory); + } +} diff --git a/src/main/java/command/ViewMedHistoryCommand.java b/src/main/java/command/ViewMedHistoryCommand.java new file mode 100644 index 0000000000..d4af0c4314 --- /dev/null +++ b/src/main/java/command/ViewMedHistoryCommand.java @@ -0,0 +1,23 @@ +package command; + +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class ViewMedHistoryCommand extends Command { + protected String type; + protected String nameOrIc; + + public ViewMedHistoryCommand(String[] details) { + this.type = details[0]; + this.nameOrIc = details[1]; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + if (type.equals("ic")) { + manager.viewMedicalHistoryByNric(nameOrIc); + } else { + manager.viewMedicalHistoryByName(nameOrIc); + } + } +} diff --git a/src/main/java/command/ViewPatientCommand.java b/src/main/java/command/ViewPatientCommand.java new file mode 100644 index 0000000000..abc545979d --- /dev/null +++ b/src/main/java/command/ViewPatientCommand.java @@ -0,0 +1,19 @@ +package command; + +import manager.ManagementSystem; +import manager.Patient; +import miscellaneous.Ui; + +public class ViewPatientCommand extends Command { + protected String nric; + + public ViewPatientCommand(String nric) { + this.nric = nric; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + Patient matchedPatient = manager.viewPatient(nric); + ui.showPatientViewed(matchedPatient, nric); + } +} diff --git a/src/main/java/exception/UnknownCommandException.java b/src/main/java/exception/UnknownCommandException.java new file mode 100644 index 0000000000..259e59193b --- /dev/null +++ b/src/main/java/exception/UnknownCommandException.java @@ -0,0 +1,8 @@ +package exception; + +public class UnknownCommandException extends Exception{ + public UnknownCommandException (String message) { + super(message); + } + +} diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 7655318e30..07a6cce6cd 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,25 +1,21 @@ package manager; import exception.DuplicatePatientIDException; -import exception.InvalidInputFormatException; -import miscellaneous.Parser; import miscellaneous.Ui; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; public class ManagementSystem { private final List appointments; - private final Map patients; + private final List patients; public ManagementSystem() { appointments = new ArrayList<>(); - patients = new HashMap<>(); + patients = new ArrayList<>(); } - public Map getPatient() { + public List getPatients() { return patients; } @@ -27,121 +23,122 @@ public List getAppointments() { return appointments; } - public void addPatient(String line) throws DuplicatePatientIDException, InvalidInputFormatException { - String[] details = Parser.parseAddPatient(line); - - if (patients.containsKey(details[0])) { - throw new DuplicatePatientIDException("Patient ID already exists!"); + public void addPatient(Patient patient) throws DuplicatePatientIDException { + for (Patient existingPatient : patients) { + if (existingPatient.getId().equals(patient.getId())) { + throw new DuplicatePatientIDException("Patient ID already exists!"); + } } + patients.add(patient); + } - Patient newPatient = new Patient(details[0], details[1], details[2], details[3], details[4], details[5]); - patients.put(details[0], newPatient); - Ui.showLine(); - System.out.println("Patient added: " + details[1]); - Ui.showLine(); + public Patient deletePatient(String nric) { + for (Patient patient : patients) { + if (patient.getId().equals(nric)) { + patients.remove(patient); + // Return the removed patient + return patient; + } + } + return null; } - public void deletePatient(String line) throws InvalidInputFormatException { - if (line.length() < 15) { - throw new InvalidInputFormatException("Invalid command format. Use: delete-patient [NRIC]"); + public Patient viewPatient(String nric) { + Patient matchedPatient = null; + for (Patient patient : patients) { + if (patient.getId().equals(nric)) { + matchedPatient = patient; + break; + } } + return matchedPatient; + } - String nric = line.substring(15).trim(); // Trim whitespace + public void storeMedicalHistory(String name, String nric, String medHistory) { + Patient existingPatient = findPatientByNric(nric); - if (patients.containsKey(nric)) { - Patient removedPatient = patients.remove(nric); - Ui.showLine(); - System.out.println("Patient removed successfully: " + removedPatient.getName() - + " (NRIC: " + nric + ")"); + if (existingPatient == null) { + existingPatient = new Patient(nric, name, "", "", "", ""); + patients.add(existingPatient); Ui.showLine(); + System.out.println("New patient " + name + " (NRIC: " + nric + ") created."); } else { Ui.showLine(); - System.out.println("Patient with NRIC " + nric + " not found."); - Ui.showLine(); } - } - public void viewPatient(String line) throws InvalidInputFormatException{ - if (line.length() < 13) { - throw new InvalidInputFormatException("Invalid command format. Use: view-patient [NRIC]"); + String[] historyEntries = medHistory.split(",\s*"); + for (String entry : historyEntries) { + if (!existingPatient.getMedicalHistory().contains(entry.trim())) { + existingPatient.getMedicalHistory().add(entry.trim()); + } } + System.out.println("Medical history added for " + name + " (NRIC: " + nric + ")."); + Ui.showLine(); + } - String nric = line.substring(13).trim(); // Extract and trim NRIC + public void viewMedicalHistoryByNric(String nric) { + Patient matchedPatients = findPatientByNric(nric.trim()); - // Check if patient exists - if (!patients.containsKey(nric)) { + if (matchedPatients == null) { Ui.showLine(); - System.out.println("Patient with NRIC " + nric + " not found."); + System.out.println("No patient found with NRIC " + nric + "."); + } else { Ui.showLine(); - return; + Ui.showPatientHistory(matchedPatients); } + } + + public void viewMedicalHistoryByName(String name) { + List matchedPatients = findPatientsByName(name.trim()); Ui.showLine(); - System.out.println("-".repeat(43)+ "Patient Details" + "-".repeat(43)); - System.out.println(patients.get(nric).toString()); - Ui.showLine(); - } - public void listPatients() { - if (patients.isEmpty()) { - System.out.println("No patients have been added."); - return; - } - System.out.println("-".repeat(43)+ "Patient Details" + "-".repeat(43)); - int count = 1; - for (Patient p : patients.values()) { - System.out.println(count + ". " + p.toStringForListView()); + if (matchedPatients.isEmpty()) { + System.out.println("No patients found with name '" + name + "'."); Ui.showLine(); - count++; + } else { + System.out.println("Found " + matchedPatients.size() + " patient(s) with name '" + name + "'"); + for (Patient p : matchedPatients) { + Ui.showPatientHistory(p); + } } } - public void addAppointment(String[] details) { - String nric = details[0]; - String date = details[1]; - String time = details[2]; - String desc = details[3]; - Appointment appt = new Appointment(nric, date, time, desc); - appointments.add(appt); - - Ui.showLine(); - System.out.println("Appointment added for NRIC: " + nric + " on " + date + " at " + time + "."); - System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); - Ui.showLine(); + // Find patient by NRIC + private Patient findPatientByNric(String nric) { + String target = nric.trim().toUpperCase(); + for (Patient p : patients) { + String patientId = p.getId().trim().toUpperCase(); + if (patientId.equals(target)) { + return p; + } + } + return null; } - public void deleteAppointment(String apptId) { - for (int i = 0; i < appointments.size(); i++) { - if (appointments.get(i).getId().equalsIgnoreCase(apptId)) { - appointments.remove(i); - - Ui.showLine(); - System.out.println("Appointment " + apptId + " is deleted successfully."); - System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); - Ui.showLine(); - return; + // Find patients by Name + public List findPatientsByName(String name) { + List result = new ArrayList<>(); + for (Patient p : patients) { + if (p.getName().trim().equalsIgnoreCase(name)) { + result.add(p); } } - Ui.showLine(); - System.out.println("No appointment found with ID: " + apptId + "."); - Ui.showLine(); + return result; } - public void listAppointments() { - if (appointments.isEmpty()) { - Ui.showLine(); - System.out.println("No appointments found."); - Ui.showLine(); - return; - } - System.out.println("-".repeat(43)+ "Appointments" + "-".repeat(43)); - int count = 1; - for (Appointment a : appointments) { - System.out.println(count + ". " + a); - count++; - } - Ui.showLine(); + public void addAppointment(Appointment appointment) { + appointments.add(appointment); } + public Appointment deleteAppointment(String apptId) { + for (Appointment appointment : appointments) { + if (appointment.getId().equalsIgnoreCase(apptId)) { + appointments.remove(appointment); + return appointment; + } + } + return null; + } } diff --git a/src/main/java/manager/MedicalHistoryManager.java b/src/main/java/manager/MedicalHistoryManager.java deleted file mode 100644 index 2582143f81..0000000000 --- a/src/main/java/manager/MedicalHistoryManager.java +++ /dev/null @@ -1,105 +0,0 @@ -package manager; - -import miscellaneous.Ui; - -import java.util.ArrayList; -import java.util.List; - -public class MedicalHistoryManager { - private static final List patients = new ArrayList<>(); - - public MedicalHistoryManager() {} - - public void storeMedicalHistory(String name, String nric, String medHistory) { - String cleanedNric = nric.trim(); - String cleanedName = name.trim(); - - Patient existingPatient = findPatientByNric(cleanedNric); - - if (existingPatient == null) { - existingPatient = new Patient(cleanedNric, cleanedName, "", "", "", ""); - patients.add(existingPatient); - Ui.showLine(); - System.out.println("New patient " + cleanedName + " (NRIC: " + cleanedNric + ") created."); - } else { - Ui.showLine(); - } - - String[] historyEntries = medHistory.split(",\s*"); - for (String entry : historyEntries) { - if (!existingPatient.getMedicalHistory().contains(entry.trim())) { - existingPatient.getMedicalHistory().add(entry.trim()); - } - } - System.out.println("Medical history added for " + cleanedName + " (NRIC: " + cleanedNric + ")."); - Ui.showLine(); - } - - public void viewMedicalHistoryByNric(String nric) { - Patient patient = findPatientByNric(nric.trim()); - - if (patient == null) { - Ui.showLine(); - System.out.println("No patient found with NRIC " + nric + "."); - } else { - Ui.showLine(); - printPatientHistory(patient); - } - } - - public void viewMedicalHistoryByName(String name) { - List matchedPatients = findPatientsByName(name.trim()); - - Ui.showLine(); - - if (matchedPatients.isEmpty()) { - System.out.println("No patients found with name '" + name + "'."); - Ui.showLine(); - } else { - System.out.println("Found " + matchedPatients.size() + " patient(s) with name '" + name + "'"); - for (Patient p : matchedPatients) { - printPatientHistory(p); - } - } - } - - - public Patient findPatientByNric(String nric) { - String target = nric.trim().toUpperCase(); - for (Patient p : patients) { - String patientId = p.getId().trim().toUpperCase(); - if (patientId.equals(target)) { - return p; - } - } - return null; - } - - - public List findPatientsByName(String name) { - List result = new ArrayList<>(); - for (Patient p : patients) { - if (p.getName().trim().equalsIgnoreCase(name)) { - result.add(p); - } - } - return result; - } - - private void printPatientHistory(Patient patient) { - System.out.println("Medical History for " + patient.getName() + " (NRIC: " + patient.getId() + "):"); - List histories = patient.getMedicalHistory(); - if (histories.isEmpty()) { - System.out.println("No medical history recorded."); - } else { - for (String h : histories) { - System.out.println("- " + h); - } - Ui.showLine(); - } - } - - public List getPatients() { - return patients; - } -} diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 4a29aaf212..5f0892141d 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -1,78 +1,54 @@ package miscellaneous; +import command.AddAppointmentCommand; +import command.AddPatientCommand; +import command.Command; +import command.DeleteAppointmentCommand; +import command.DeletePatientCommand; +import command.ExitCommand; +import command.ListAppointmentCommand; +import command.ListPatientCommand; +import command.StoreMedHistoryCommand; +import command.ViewMedHistoryCommand; +import command.ViewPatientCommand; import exception.InvalidInputFormatException; +import exception.UnknownCommandException; +import manager.Appointment; +import manager.Patient; public class Parser { - public static boolean isBye(String input) { - return input.equalsIgnoreCase("bye"); - } - - - public static boolean isAddPatient(String input) { - return input.toLowerCase().startsWith("add-patient"); - } - - - public static boolean isDeletePatient(String input) { - return input.toLowerCase().startsWith("delete-patient"); - } - - - public static boolean isViewPatient(String input) { - return input.toLowerCase().startsWith("view-patient"); - } - - - public static boolean isListPatient(String input) { - return input.toLowerCase().startsWith("list-patient"); - } - - public static boolean isStoreHistory(String input) { - return input.toLowerCase().startsWith("store-history"); - } - - public static boolean isViewHistory(String input) { - return input.toLowerCase().startsWith("view-history"); - } - - - public static boolean isAddAppointment(String input) { - return input.toLowerCase().startsWith("add-appointment"); - } - - - public static boolean isDeleteAppointment(String input) { - return input.toLowerCase().startsWith("delete-appointment"); - } - - - public static boolean isListAppointments(String input) { - return input.equalsIgnoreCase("list-appointment"); - } - - - public static String[] parseAddAppointment(String input) throws InvalidInputFormatException { - String temp = input.replaceFirst("(?i)add-appointment\\s+", ""); - String nric = extractValue(temp, "ic/"); - String date = extractValue(temp, "dt/"); - String time = extractValue(temp, "t/"); - String desc = extractValue(temp, "dsc/"); - if (nric == null || date == null || time == null || desc == null) { - throw new InvalidInputFormatException("Missing details or wrong format for add-appointment!" - + System.lineSeparator() + "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); + public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { + // Split into two parts to extract the command keyword and its detail + String[] parts = userInput.split(" ", 2); + String commandWord = parts[0]; + + switch (commandWord) { + case "bye": + return new ExitCommand(); + case "add-patient": + return new AddPatientCommand(parseAddPatient(userInput)); + case "delete-patient": + return new DeletePatientCommand(parseDeletePatient(userInput)); + case "view-patient": + return new ViewPatientCommand(parseViewPatient(userInput)); + case "list-patient": + return new ListPatientCommand(); + case "store-history": + return new StoreMedHistoryCommand(parseStoreHistory(userInput)); + case "view-history": + return new ViewMedHistoryCommand(parseViewHistory(userInput)); + case "add-appointment": + return new AddAppointmentCommand(parseAddAppointment(userInput)); + case "delete-appointment": + return new DeleteAppointmentCommand(parseDeleteAppointment(userInput)); + case "list-appointment": + return new ListAppointmentCommand(); + default: + throw new UnknownCommandException("Unknown command. Please try again."); } - return new String[]{nric.trim(), date.trim(), time.trim(), desc.trim()}; } - public static String parseDeleteAppointment(String input) throws InvalidInputFormatException { - if (!input.matches("(?i)delete-appointment\\s+A\\d+")) { - throw new InvalidInputFormatException("Invalid format! Please use: " + - "delete-appointment APPOINTMENT_ID"); - } - return input.replaceFirst("(?i)delete-appointment\\s*", "").trim(); - } - - public static String[] parseAddPatient(String input) throws InvalidInputFormatException { + private static Patient parseAddPatient(String input) throws InvalidInputFormatException { String temp = input.replaceFirst("(?i)add-patient\\s*", ""); String name = extractValue(temp, "n/"); String nric = extractValue(temp, "ic/"); @@ -80,11 +56,30 @@ public static String[] parseAddPatient(String input) throws InvalidInputFormatEx String gender = extractValue(temp, "g/"); String phone = extractValue(temp, "p/"); String address = extractValue(temp, "a/"); + if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) { throw new InvalidInputFormatException ("Patient details are incomplete!" + System.lineSeparator() + "Also, please use: add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS"); } - return new String[]{nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim()}; + return new Patient(nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim()); + } + + private static String parseDeletePatient(String input) throws InvalidInputFormatException { + if (input.length() < 15) { + throw new InvalidInputFormatException("Invalid command format. Use: delete-patient [NRIC]"); + } + + String nric = input.substring(15).trim(); + return nric; + } + + private static String parseViewPatient(String input) throws InvalidInputFormatException { + if (input.length() < 13) { + throw new InvalidInputFormatException("Invalid command format. Use: view-patient [NRIC]"); + } + + String nric = input.substring(13).trim(); // Extract and trim NRIC + return nric; } public static String[] parseViewHistory(String input) throws InvalidInputFormatException { @@ -140,6 +135,30 @@ public static String[] parseStoreHistory(String input) throws InvalidInputFormat return new String[]{name.trim(), nric.trim(), medHistory.trim()}; } + public static Appointment parseAddAppointment(String input) throws InvalidInputFormatException { + String temp = input.replaceFirst("(?i)add-appointment\\s+", ""); + String nric = extractValue(temp, "ic/"); + String date = extractValue(temp, "dt/"); + String time = extractValue(temp, "t/"); + String desc = extractValue(temp, "dsc/"); + + if (nric == null || date == null || time == null || desc == null) { + throw new InvalidInputFormatException("Missing details or wrong format for add-appointment!" + + System.lineSeparator() + "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); + } + return new Appointment(nric.trim(), date.trim(), time.trim(), desc.trim()); + } + + public static String parseDeleteAppointment(String input) throws InvalidInputFormatException { + if (!input.matches("(?i)delete-appointment\\s+A\\d+")) { + throw new InvalidInputFormatException("Invalid format! Please use: " + + "delete-appointment APPOINTMENT_ID"); + } + + String apptId = input.replaceFirst("(?i)delete-appointment\\s*", "").trim(); + return apptId; + } + private static String extractValue(String input, String prefix) { String lowerInput = input.toLowerCase(); String lowerPrefix = prefix.toLowerCase(); diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 0185f2ea8c..d3c881b9f7 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -1,5 +1,9 @@ package miscellaneous; +import manager.Appointment; +import manager.Patient; + +import java.util.List; import java.util.Scanner; public class Ui { @@ -16,16 +20,16 @@ public static void showLine() { } public void showWelcome() { - System.out.println(DIVIDER); + showLine(); System.out.println("Welcome to ClinicEase v1!"); System.out.println("Type a command, or 'bye' to exit."); - System.out.println(DIVIDER); + showLine(); } - public void showBye() { - System.out.println(DIVIDER); + public static void showBye() { + showLine(); System.out.println("Goodbye!"); - System.out.println(DIVIDER); + showLine(); } public String readCommand() { @@ -34,9 +38,111 @@ public String readCommand() { } public void showError(String message) { - System.out.println(DIVIDER); + showLine(); System.out.println(message); - System.out.println(DIVIDER); + showLine(); + } + + public void showPatientAdded(List patients) { + showLine(); + System.out.println("Patient added successfully: " + patients.get(patients.size() - 1).getName()); + showLine(); + } + + public void showPatientDeleted(Patient removedPatient, String nric) { + if (removedPatient == null) { + showLine(); + System.out.println("Patient with NRIC " + nric + " not found."); + showLine(); + return; + } + showLine(); + System.out.println("Patient deleted successfully: " + removedPatient.getName()); + showLine(); + } + + public void showPatientViewed(Patient matchedPatient, String nric) { + if (matchedPatient == null) { + showLine(); + System.out.println("Patient with NRIC " + nric + " not found."); + showLine(); + return; + } + + System.out.println("-".repeat(43) + "Patient Details" + "-".repeat(43)); + System.out.println(matchedPatient); + showLine(); + + } + + public void showPatientList(List patients) { + if (patients.isEmpty()) { + System.out.println("No patients have been added."); + return; + } + + System.out.println("-".repeat(43)+ "Patient Details" + "-".repeat(43)); + + int count = 1; + for (Patient p : patients) { + System.out.println(count + ". " + p.toStringForListView()); + showLine(); + count++; + } + } + + public static void showPatientHistory(Patient patient) { + System.out.println("Medical History for " + patient.getName() + " (NRIC: " + patient.getId() + "):"); + List histories = patient.getMedicalHistory(); + if (histories.isEmpty()) { + System.out.println("No medical history recorded."); + } else { + for (String h : histories) { + System.out.println("- " + h); + } + showLine(); + } + } + + public void showAppointmentAdded(List appointments) { + Appointment currentAppt = appointments.get(appointments.size() - 1); + + showLine(); + System.out.println("Appointment added for NRIC: " + currentAppt.getId() + " on " + currentAppt.getDate() + + " at " + currentAppt.getTime() + "."); + System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); + showLine(); + } + + public void showAppointmentDeleted(List appointments, Appointment removedAppointment, String apptId) { + if (removedAppointment == null) { + showLine(); + System.out.println("No appointment found with ID: " + apptId + "."); + showLine(); + return; + } + + showLine(); + System.out.println("Appointment " + apptId + " is deleted successfully."); + System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); + showLine(); + } + + public void showAppointmentList(List appointments) { + if (appointments.isEmpty()) { + showLine(); + System.out.println("No appointments found."); + showLine(); + return; + } + + System.out.println("-".repeat(43)+ "Appointments" + "-".repeat(45)); + int count = 1; + for (Appointment a : appointments) { + System.out.println(count + ". " + a); + count++; + } + showLine(); } } diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java deleted file mode 100644 index 454560ba65..0000000000 --- a/src/test/java/manager/ManagementSystemTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package manager; - -import exception.DuplicatePatientIDException; -import exception.InvalidInputFormatException; - -import java.util.List; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class ManagementSystemTest { - - @Test - void addPatient_correctInput_expectOnePatient() throws DuplicatePatientIDException, InvalidInputFormatException { - ManagementSystem manager = new ManagementSystem(); - String input = "add-patient n/John Doe ic/S1234567A dob/12-12-1990 g/M p/91234567 a/123 Main St"; - - manager.addPatient(input); - - assertTrue(manager.getPatient().containsKey("S1234567A")); - } - - @Test - void addPatient_duplicatePatientID_expectException() throws DuplicatePatientIDException, - InvalidInputFormatException { - ManagementSystem system = new ManagementSystem(); - String input1 = "add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"; - String input2 = "add-patient n/John Smith ic/S1234567A dob/01-10-1999 g/M p/91207878 a/123 High St"; - - system.addPatient(input1); - - assertThrows(DuplicatePatientIDException.class, () -> system.addPatient(input2)); - } - - @Test - void deletePatient_correctInput_expectPatientDeleted() throws DuplicatePatientIDException, - InvalidInputFormatException { - ManagementSystem system = new ManagementSystem(); - - system.addPatient("add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"); - system.deletePatient("delete-patient S1234567A"); - - assertFalse(system.getPatient().containsKey("S1234567A")); - } - - @Test - void viewPatient_correctInput_expectSpecifiedPatientViewed() throws InvalidInputFormatException, - DuplicatePatientIDException { - ManagementSystem system = new ManagementSystem(); - - system.addPatient("add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St"); - - system.viewPatient("view-patient S1234567A"); - - assertTrue(system.getPatient().containsKey("S1234567A")); - } - - @Test - void addAppointment_correctInput_expectOneNewAppointment() { - ManagementSystem ms = new ManagementSystem(); - String[] details = {"S1234567D", "03-10", "1200", "medical check-up"}; - - List appointments = ms.getAppointments(); - ms.addAppointment(details); - - assertEquals(1, appointments.size(), "Expected one appointment to be added"); - - Appointment addedAppointment = appointments.get(0); - assertEquals("S1234567D", addedAppointment.getNric(), "NRIC does not match"); - assertEquals("03-10", addedAppointment.getDate(), "Date does not match"); - assertEquals("1200", addedAppointment.getTime(), "Time does not match"); - assertEquals("medical check-up", addedAppointment.getDescription(), - "Description does not match"); - } - - - @Test - void deleteAppointment_existingId_expectAppointmentDeleted() { - ManagementSystem ms = new ManagementSystem(); - String[] details = {"S1234567D", "03-10", "1200", "medical check-up"}; - - List appointments = ms.getAppointments(); - ms.addAppointment(details); - - String apptId = ms.getAppointments().get(0).getId(); - ms.deleteAppointment(apptId); - - assertEquals(0, appointments.size(), "Expected one appointment to be deleted"); - } - - @Test - void deleteAppointment_nonExistingId_expectNoAppointmentDeleted() { - ManagementSystem ms = new ManagementSystem(); - String[] details = {"S1234567D", "03-10", "1200", "medical check-up"}; - - List appointments = ms.getAppointments(); - ms.addAppointment(details); - - String nonExistingId = "A999"; - ms.deleteAppointment(nonExistingId); - - assertEquals(1, appointments.size(), "Expected previous appointment to be in the list."); - } - -} diff --git a/src/test/java/manager/MedicalHistoryManagerTest.java b/src/test/java/manager/MedicalHistoryManagerTest.java deleted file mode 100644 index 5516b75360..0000000000 --- a/src/test/java/manager/MedicalHistoryManagerTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package manager; - -import java.util.List; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class MedicalHistoryManagerTest { - - @Test - void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedHistory() { - MedicalHistoryManager mhm = new MedicalHistoryManager(); - - String name = "John Doe"; - String nric = "S1234567A"; - String medHistory = "Diabetes, Hypertension"; - - mhm.storeMedicalHistory(name, nric, medHistory); - - List patients = mhm.getPatients(); - assertEquals(1, patients.size(), "There should be one patient stored"); - - Patient storedPatient = patients.get(0); - assertEquals(name, storedPatient.getName(), "Patient name should match"); - assertEquals(nric, storedPatient.getId(), "Patient NRIC should match"); - - List history = storedPatient.getMedicalHistory(); - assertEquals(2, history.size(), "Medical history should contain 2 entries"); - assertTrue(history.contains("Diabetes"), "Medical history should contain 'Diabetes'"); - assertTrue(history.contains("Hypertension"), "Medical history should contain 'Hypertension'"); - } - -} diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index 73c28956a1..7002e89f6a 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -5,25 +5,10 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; class ParserTest { - @Test - void parseAddAppointment_correctFormat_expectSuccessfulParsing() throws InvalidInputFormatException { - String input = "add-appointment ic/S1234567D dt/03-19 t/1200 dsc/medical check-up"; - - String[] result = Parser.parseAddAppointment(input); - - assertNotNull(result, "Result should not be null"); - assertEquals(4, result.length, "Result array should have 4 elements"); - assertEquals("S1234567D", result[0], "NRIC does not match"); - assertEquals("03-19", result[1], "Date does not match"); - assertEquals("1200", result[2], "Time does not match"); - assertEquals("medical check-up", result[3], "Description does not match"); - } - @Test void parseAddAppointment_invalidFormat_expectException() { From 6a71405dd4b8831c70f9f921271df6c77f841915 Mon Sep 17 00:00:00 2001 From: yukuan Date: Wed, 26 Mar 2025 21:11:12 +0800 Subject: [PATCH 043/203] Slight changes on the method --- src/main/java/manager/ManagementSystem.java | 39 +++++++++++---------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 07a6cce6cd..0eec4c39a0 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -55,11 +55,11 @@ public Patient viewPatient(String nric) { } public void storeMedicalHistory(String name, String nric, String medHistory) { - Patient existingPatient = findPatientByNric(nric); + Patient existedPatient = findPatientByNric(nric); - if (existingPatient == null) { - existingPatient = new Patient(nric, name, "", "", "", ""); - patients.add(existingPatient); + if (existedPatient == null) { + existedPatient = new Patient(nric, name, "", "", "", ""); + patients.add(existedPatient); Ui.showLine(); System.out.println("New patient " + name + " (NRIC: " + nric + ") created."); } else { @@ -68,37 +68,38 @@ public void storeMedicalHistory(String name, String nric, String medHistory) { String[] historyEntries = medHistory.split(",\s*"); for (String entry : historyEntries) { - if (!existingPatient.getMedicalHistory().contains(entry.trim())) { - existingPatient.getMedicalHistory().add(entry.trim()); + if (!existedPatient.getMedicalHistory().contains(entry.trim())) { + existedPatient.getMedicalHistory().add(entry.trim()); } } System.out.println("Medical history added for " + name + " (NRIC: " + nric + ")."); + Ui.showLine(); } public void viewMedicalHistoryByNric(String nric) { - Patient matchedPatients = findPatientByNric(nric.trim()); + Patient foundPatients = findPatientByNric(nric.trim()); - if (matchedPatients == null) { + if (foundPatients == null) { Ui.showLine(); - System.out.println("No patient found with NRIC " + nric + "."); + System.out.println("No patient/patients found with NRIC " + nric + "."); } else { Ui.showLine(); - Ui.showPatientHistory(matchedPatients); + Ui.showPatientHistory(foundPatients); } } public void viewMedicalHistoryByName(String name) { - List matchedPatients = findPatientsByName(name.trim()); + List foundPatients = findPatientsByName(name.trim()); Ui.showLine(); - if (matchedPatients.isEmpty()) { + if (foundPatients.isEmpty()) { System.out.println("No patients found with name '" + name + "'."); Ui.showLine(); } else { - System.out.println("Found " + matchedPatients.size() + " patient(s) with name '" + name + "'"); - for (Patient p : matchedPatients) { + System.out.println("Found " + foundPatients.size() + " patient(s) with name '" + name + "'"); + for (Patient p : foundPatients) { Ui.showPatientHistory(p); } } @@ -106,10 +107,10 @@ public void viewMedicalHistoryByName(String name) { // Find patient by NRIC private Patient findPatientByNric(String nric) { - String target = nric.trim().toUpperCase(); + String object = nric.trim().toUpperCase(); for (Patient p : patients) { String patientId = p.getId().trim().toUpperCase(); - if (patientId.equals(target)) { + if (patientId.equals(object)) { return p; } } @@ -118,13 +119,13 @@ private Patient findPatientByNric(String nric) { // Find patients by Name public List findPatientsByName(String name) { - List result = new ArrayList<>(); + List object = new ArrayList<>(); for (Patient p : patients) { if (p.getName().trim().equalsIgnoreCase(name)) { - result.add(p); + object.add(p); } } - return result; + return object; } From f08a6e2777d4026def7a7135dd6afe49b9c5e379 Mon Sep 17 00:00:00 2001 From: judHoka Date: Thu, 27 Mar 2025 01:51:20 +0800 Subject: [PATCH 044/203] Implemented storage system for patients, adjusted Patient constructor to take in medical history, added JUnit for add patient and save testing --- src/main/java/ClinicEase.java | 20 ++++- src/main/java/command/AddPatientCommand.java | 3 +- src/main/java/command/Command.java | 3 +- .../exception/UnloadedStorageException.java | 8 ++ src/main/java/manager/ManagementSystem.java | 13 ++-- src/main/java/manager/Patient.java | 17 ++++- src/main/java/miscellaneous/Parser.java | 31 +++++++- src/main/java/storage/Storage.java | 63 ++++++++++++++++ src/main/java/storage/patient_data.txt | 0 .../java/manager/ManagementSystemTest.java | 74 +++++++++++++++++++ 10 files changed, 216 insertions(+), 16 deletions(-) create mode 100644 src/main/java/exception/UnloadedStorageException.java create mode 100644 src/main/java/storage/Storage.java create mode 100644 src/main/java/storage/patient_data.txt create mode 100644 src/test/java/manager/ManagementSystemTest.java diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index fc3006ec70..b7aa9c7236 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -4,18 +4,29 @@ import exception.InvalidInputFormatException; import exception.UnknownCommandException; +import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Parser; import miscellaneous.Ui; +import storage.Storage; public class ClinicEase { private ManagementSystem manager; private Ui ui; + private Storage storage; - public ClinicEase() { - this.manager = new ManagementSystem(); + public ClinicEase(String filePath) { this.ui = new Ui(); + storage = new Storage(filePath); + + try { + this.manager = new ManagementSystem(Storage.loadPatients()); + } catch (UnloadedStorageException e) { + ui.showError("Could not load data: " + e.getMessage()); + this.manager = new ManagementSystem(null); + } + } public void run() { @@ -28,13 +39,14 @@ public void run() { Command command = Parser.parse(input); command.execute(manager, ui); running = !command.isExit(); - } catch (InvalidInputFormatException | UnknownCommandException | DuplicatePatientIDException e) { + } catch (InvalidInputFormatException | UnknownCommandException | DuplicatePatientIDException | + UnloadedStorageException e) { ui.showError(e.getMessage()); } } } public static void main(String[] args) { - new ClinicEase().run(); + new ClinicEase("src/main/java/storage").run(); } } diff --git a/src/main/java/command/AddPatientCommand.java b/src/main/java/command/AddPatientCommand.java index cceed8c80b..5b65a87d35 100644 --- a/src/main/java/command/AddPatientCommand.java +++ b/src/main/java/command/AddPatientCommand.java @@ -1,6 +1,7 @@ package command; import exception.DuplicatePatientIDException; +import exception.UnloadedStorageException; import manager.ManagementSystem; import manager.Patient; import miscellaneous.Ui; @@ -14,7 +15,7 @@ public AddPatientCommand(Patient patient) { } @Override - public void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException { + public void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException { manager.addPatient(patient); ui.showPatientAdded(manager.getPatients()); } diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 87be60032e..a6fd217cc1 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -1,12 +1,13 @@ package command; import exception.DuplicatePatientIDException; +import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Ui; public abstract class Command { - public abstract void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException; + public abstract void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException; public boolean isExit() { return false; diff --git a/src/main/java/exception/UnloadedStorageException.java b/src/main/java/exception/UnloadedStorageException.java new file mode 100644 index 0000000000..bc2dc8b024 --- /dev/null +++ b/src/main/java/exception/UnloadedStorageException.java @@ -0,0 +1,8 @@ +package exception; + +public class UnloadedStorageException extends Exception{ + public UnloadedStorageException (String message) { + super(message); + } + +} diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 07a6cce6cd..292580d7b2 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,18 +1,20 @@ package manager; import exception.DuplicatePatientIDException; +import exception.UnloadedStorageException; import miscellaneous.Ui; +import storage.Storage; import java.util.ArrayList; import java.util.List; public class ManagementSystem { private final List appointments; - private final List patients; + private final List patients; - public ManagementSystem() { + public ManagementSystem(List list) { appointments = new ArrayList<>(); - patients = new ArrayList<>(); + patients = list; } public List getPatients() { @@ -23,13 +25,14 @@ public List getAppointments() { return appointments; } - public void addPatient(Patient patient) throws DuplicatePatientIDException { + public void addPatient(Patient patient) throws DuplicatePatientIDException, UnloadedStorageException { for (Patient existingPatient : patients) { if (existingPatient.getId().equals(patient.getId())) { throw new DuplicatePatientIDException("Patient ID already exists!"); } } patients.add(patient); + Storage.savePatients(patients); } public Patient deletePatient(String nric) { @@ -58,7 +61,7 @@ public void storeMedicalHistory(String name, String nric, String medHistory) { Patient existingPatient = findPatientByNric(nric); if (existingPatient == null) { - existingPatient = new Patient(nric, name, "", "", "", ""); + existingPatient = new Patient(nric, name, "", "", "", "", null); patients.add(existingPatient); Ui.showLine(); System.out.println("New patient " + name + " (NRIC: " + nric + ") created."); diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 201b3cae87..bad83182de 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -13,14 +13,14 @@ public class Patient { private final String address; private final List medicalHistory; - public Patient(String id, String name, String dob, String gender, String address, String contactInfo) { + public Patient(String id, String name, String dob, String gender, String address, String contactInfo, List medicalHistory) { this.id = id; this.name = name; this.dob = dob; this.gender = gender; this.address = address; this.contactInfo = contactInfo; - this.medicalHistory = new ArrayList<>(); + this.medicalHistory = new ArrayList<>(medicalHistory); } public String getId() { @@ -57,14 +57,23 @@ public String toString() { } public String toStringForListView() { + String history = medicalHistory.isEmpty() + ? "None" + : String.join(", ", medicalHistory); + return String.format( "Patient ID: %s\n " + "Name: %s\n " + "Date of Birth: %s\n " + "Gender: %s\n " + "Address: %s\n " + - "Contact: %s", - id, name, dob, gender, address, contactInfo + "Contact: %s\n " + + "Medical History: %s", + id, name, dob, gender, address, contactInfo, history ); } + + public String toFileFormat() { + return this.id + "|" + this.name + "|" + this.dob + "|" + this.gender + "|" + this.address + "|" + this.contactInfo + "|" + this.medicalHistory; + } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 5f0892141d..96b6547e43 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -16,6 +16,10 @@ import manager.Appointment; import manager.Patient; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class Parser { public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { // Split into two parts to extract the command keyword and its detail @@ -56,12 +60,22 @@ private static Patient parseAddPatient(String input) throws InvalidInputFormatEx String gender = extractValue(temp, "g/"); String phone = extractValue(temp, "p/"); String address = extractValue(temp, "a/"); + String history = extractValue(temp, "h/"); if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) { throw new InvalidInputFormatException ("Patient details are incomplete!" + System.lineSeparator() + "Also, please use: add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS"); } - return new Patient(nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim()); + + List medHistory = new ArrayList<>(); + if (history != null && !history.trim().isEmpty()) { + String[] entries = history.split(",\\s*"); + for (String entry : entries) { + medHistory.add(entry.trim()); + } + } + + return new Patient(nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim(), medHistory); } private static String parseDeletePatient(String input) throws InvalidInputFormatException { @@ -208,4 +222,19 @@ private static String extractValue(String input, String prefix) { return detail.isEmpty() ? null : detail; } + public static Patient parsePatient(String line) { + String[] tokens = line.split("\\|"); + if (tokens.length < 7) return null; + + String id = tokens[0]; + String name = tokens[1]; + String dob = tokens[2]; + String gender = tokens[3]; + String address = tokens[4]; + String contact = tokens[5]; + List medHistory = Arrays.asList(tokens[6].split(",")); + + return new Patient(id, name, dob, gender, address, contact, medHistory); + } + } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java new file mode 100644 index 0000000000..3e415a3cc9 --- /dev/null +++ b/src/main/java/storage/Storage.java @@ -0,0 +1,63 @@ +package storage; + +import exception.UnloadedStorageException; + +import java.io.*; +import java.util.List; +import java.util.ArrayList; +import java.util.Scanner; + +import manager.Patient; +import miscellaneous.Parser; + +public class Storage { + private static String directoryPath; + private static String patientFilePath; + + public Storage(String directory) { + directoryPath = directory; + patientFilePath = directory + File.separator + "patient_data.txt"; + } + + public static void savePatients(List patientList) throws UnloadedStorageException { + try { + if (directoryPath == null || patientFilePath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } + + File dir = new File(directoryPath); + if (!dir.exists()) { + dir.mkdirs(); + } + + BufferedWriter writer = new BufferedWriter(new FileWriter(patientFilePath)); + + for (Patient patient : patientList) { + writer.write(patient.toFileFormat()); + writer.newLine(); + } + + writer.close(); + } catch (IOException e) { + throw new UnloadedStorageException("Unable to save the patient!"); + } + } + + public static List loadPatients() throws UnloadedStorageException { + List patients = new ArrayList<>(); + File file = new File(patientFilePath); + if (!file.exists()) return patients; + + try (Scanner scanner = new Scanner(file)) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + Patient patient = Parser.parsePatient(line); + if (patient != null) patients.add(patient); + } + } catch (Exception e) { + throw new UnloadedStorageException("Unable to load patient data!"); + } + + return patients; + } +} diff --git a/src/main/java/storage/patient_data.txt b/src/main/java/storage/patient_data.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java new file mode 100644 index 0000000000..a64a439439 --- /dev/null +++ b/src/test/java/manager/ManagementSystemTest.java @@ -0,0 +1,74 @@ +package manager; + +import exception.DuplicatePatientIDException; +import exception.UnloadedStorageException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import storage.Storage; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class ManagementSystemTest { + + private static final String TEST_DIR = "test-data"; + private static final Path TEST_FILE_PATH = Paths.get(TEST_DIR, "patient_data.txt"); + + @BeforeEach + void setUp() throws IOException { + new Storage(TEST_DIR); + Files.deleteIfExists(TEST_FILE_PATH); + } + + @Test + void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDException, UnloadedStorageException { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + "M", "123 Main St", "81234567", new ArrayList<>()); + + manager.addPatient(patient); + + assertEquals(1, manager.getPatients().size()); + assertEquals("John Doe", manager.getPatients().get(0).getName()); + } + + @Test + void addPatient_duplicateId_expectExceptionThrown() throws DuplicatePatientIDException, UnloadedStorageException { + List existing = new ArrayList<>(); + Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + "M", "123 Main St", "81234567", new ArrayList<>()); + existing.add(patient); + + ManagementSystem manager = new ManagementSystem(existing); + + Patient duplicate = new Patient("S1234567A", "Jane Smith", "1992-02-02", + "F", "456 Sample Rd", "90000000", new ArrayList<>()); + + assertThrows(DuplicatePatientIDException.class, () -> manager.addPatient(duplicate)); + } + + @Test + void addPatient_validInput_expectPatientAddedAndSaved() throws DuplicatePatientIDException, UnloadedStorageException, IOException { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + "M", "123 Main St", "81234567", new ArrayList<>()); + manager.addPatient(patient); + + assertTrue(Files.exists(TEST_FILE_PATH), "Patient file was not created."); + + List lines = Files.readAllLines(TEST_FILE_PATH); + assertFalse(lines.isEmpty(), "Patient file is empty."); + assertTrue(lines.get(0).contains("John Doe"), "Saved patient name not found in file."); + assertTrue(lines.get(0).contains("S1234567A"), "Saved patient NRIC not found in file."); + } +} From 03e6cb95768eb24d35a4ce14669342037e176066 Mon Sep 17 00:00:00 2001 From: judHoka Date: Thu, 27 Mar 2025 02:04:50 +0800 Subject: [PATCH 045/203] Fixed checkStyles --- src/main/java/manager/Patient.java | 15 ++++++--------- src/main/java/miscellaneous/Parser.java | 5 +++-- src/main/java/storage/Storage.java | 13 ++++++++++--- src/test/java/manager/ManagementSystemTest.java | 11 ++++++++--- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index bad83182de..4d245e977c 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -13,7 +13,8 @@ public class Patient { private final String address; private final List medicalHistory; - public Patient(String id, String name, String dob, String gender, String address, String contactInfo, List medicalHistory) { + public Patient(String id, String name, String dob, String gender, String address, + String contactInfo, List medicalHistory) { this.id = id; this.name = name; this.dob = dob; @@ -62,18 +63,14 @@ public String toStringForListView() { : String.join(", ", medicalHistory); return String.format( - "Patient ID: %s\n " + - "Name: %s\n " + - "Date of Birth: %s\n " + - "Gender: %s\n " + - "Address: %s\n " + - "Contact: %s\n " + - "Medical History: %s", + "Patient ID: %s\n Name: %s\n Date of Birth: %s\n Gender: %s\n " + + "Address: %s\n Contact: %s\n Medical History: %s", id, name, dob, gender, address, contactInfo, history ); } public String toFileFormat() { - return this.id + "|" + this.name + "|" + this.dob + "|" + this.gender + "|" + this.address + "|" + this.contactInfo + "|" + this.medicalHistory; + return this.id + "|" + this.name + "|" + this.dob + "|" + this.gender + "|" + + this.address + "|" + this.contactInfo + "|" + this.medicalHistory; } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 96b6547e43..4972f1abc0 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -157,8 +157,9 @@ public static Appointment parseAddAppointment(String input) throws InvalidInputF String desc = extractValue(temp, "dsc/"); if (nric == null || date == null || time == null || desc == null) { - throw new InvalidInputFormatException("Missing details or wrong format for add-appointment!" - + System.lineSeparator() + "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); + String msg = "Missing details or wrong format for add-appointment!" + System.lineSeparator() + + "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"; + throw new InvalidInputFormatException(msg); } return new Appointment(nric.trim(), date.trim(), time.trim(), desc.trim()); } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 3e415a3cc9..63b2d18244 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -2,7 +2,10 @@ import exception.UnloadedStorageException; -import java.io.*; +import java.io.File; +import java.io.FileWriter; +import java.io.BufferedWriter; +import java.io.IOException; import java.util.List; import java.util.ArrayList; import java.util.Scanner; @@ -46,13 +49,17 @@ public static void savePatients(List patientList) throws UnloadedStorag public static List loadPatients() throws UnloadedStorageException { List patients = new ArrayList<>(); File file = new File(patientFilePath); - if (!file.exists()) return patients; + if (!file.exists()) { + return patients; + } try (Scanner scanner = new Scanner(file)) { while (scanner.hasNextLine()) { String line = scanner.nextLine(); Patient patient = Parser.parsePatient(line); - if (patient != null) patients.add(patient); + if (patient != null) { + patients.add(patient); + } } } catch (Exception e) { throw new UnloadedStorageException("Unable to load patient data!"); diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index a64a439439..7482d2b184 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -13,7 +13,10 @@ import java.util.ArrayList; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; class ManagementSystemTest { @@ -68,7 +71,9 @@ void addPatient_validInput_expectPatientAddedAndSaved() throws DuplicatePatientI List lines = Files.readAllLines(TEST_FILE_PATH); assertFalse(lines.isEmpty(), "Patient file is empty."); - assertTrue(lines.get(0).contains("John Doe"), "Saved patient name not found in file."); - assertTrue(lines.get(0).contains("S1234567A"), "Saved patient NRIC not found in file."); + + String line = lines.get(0); + assertTrue(line.contains("John Doe"), "Saved patient name not found in file."); + assertTrue(line.contains("S1234567A"), "Saved patient NRIC not found in file."); } } From 2b84d686f53f621420550a623c2fdec8c865885a Mon Sep 17 00:00:00 2001 From: judHoka Date: Thu, 27 Mar 2025 02:09:15 +0800 Subject: [PATCH 046/203] More checkstyle fixes and code reformatting --- src/main/java/command/Command.java | 3 ++- src/main/java/manager/Patient.java | 12 ++++++------ src/main/java/miscellaneous/Parser.java | 11 +++++++---- src/test/java/manager/ManagementSystemTest.java | 3 ++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index a6fd217cc1..b9d4372d5e 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -7,7 +7,8 @@ public abstract class Command { - public abstract void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException; + public abstract void execute(ManagementSystem manager, Ui ui) + throws DuplicatePatientIDException, UnloadedStorageException; public boolean isExit() { return false; diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 4d245e977c..c63007b43f 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -4,7 +4,7 @@ import java.util.List; public class Patient { - + private final String id; private final String name; private final String dob; @@ -48,11 +48,11 @@ public List getMedicalHistory() { public String toString() { return String.format( "Patient ID: %s\n" + - "Name: %s\n" + - "Date of Birth: %s\n" + - "Gender: %s\n" + - "Address: %s\n" + - "Contact: %s", + "Name: %s\n" + + "Date of Birth: %s\n" + + "Gender: %s\n" + + "Address: %s\n" + + "Contact: %s", id, name, dob, gender, address, contactInfo ); } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 4972f1abc0..84c202eb7c 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -63,7 +63,7 @@ private static Patient parseAddPatient(String input) throws InvalidInputFormatEx String history = extractValue(temp, "h/"); if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) { - throw new InvalidInputFormatException ("Patient details are incomplete!" + System.lineSeparator() + throw new InvalidInputFormatException("Patient details are incomplete!" + System.lineSeparator() + "Also, please use: add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS"); } @@ -75,7 +75,8 @@ private static Patient parseAddPatient(String input) throws InvalidInputFormatEx } } - return new Patient(nric.trim(), name.trim(), birthdate.trim(), gender.trim(), address.trim(), phone.trim(), medHistory); + return new Patient(nric.trim(), name.trim(), birthdate.trim(), + gender.trim(), address.trim(), phone.trim(), medHistory); } private static String parseDeletePatient(String input) throws InvalidInputFormatException { @@ -129,7 +130,7 @@ public static String[] parseViewHistory(String input) throws InvalidInputFormatE return new String[]{type, nameOrIc}; } - public static String[] parseStoreHistory(String input) throws InvalidInputFormatException{ + public static String[] parseStoreHistory(String input) throws InvalidInputFormatException { // Remove the command prefix "store-history" (case-insensitive) // and get the remaining string. String temp = input.replaceFirst("(?i)store-history\\s*", ""); @@ -225,7 +226,9 @@ private static String extractValue(String input, String prefix) { public static Patient parsePatient(String line) { String[] tokens = line.split("\\|"); - if (tokens.length < 7) return null; + if (tokens.length < 7) { + return null; + } String id = tokens[0]; String name = tokens[1]; diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 7482d2b184..0781c66901 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -59,7 +59,8 @@ void addPatient_duplicateId_expectExceptionThrown() throws DuplicatePatientIDExc } @Test - void addPatient_validInput_expectPatientAddedAndSaved() throws DuplicatePatientIDException, UnloadedStorageException, IOException { + void addPatient_validInput_expectPatientAddedAndSaved() + throws DuplicatePatientIDException, UnloadedStorageException, IOException { List emptyList = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(emptyList); From b12d9afc24afcd42db43ddfb30783c9dbdc01e21 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Thu, 27 Mar 2025 21:27:54 +0800 Subject: [PATCH 047/203] Add authorship for the methods as my restructure of codes affect them. --- src/main/java/ClinicEase.java | 2 +- src/main/java/manager/Appointment.java | 29 +++++++++------ src/main/java/manager/ManagementSystem.java | 7 ++-- src/main/java/miscellaneous/Parser.java | 17 ++++++++- src/main/java/miscellaneous/Ui.java | 2 ++ src/main/java/storage/patient_data.txt | 2 ++ .../java/manager/ManagementSystemTest.java | 29 +++++++++++++++ src/test/java/miscellaneous/ParserTest.java | 36 ++++++++++++++++--- 8 files changed, 103 insertions(+), 21 deletions(-) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index b7aa9c7236..12271e004b 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -18,7 +18,7 @@ public class ClinicEase { public ClinicEase(String filePath) { this.ui = new Ui(); - storage = new Storage(filePath); + this.storage= new Storage(filePath); try { this.manager = new ManagementSystem(Storage.loadPatients()); diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index af1bebe120..9ce0b5df15 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -1,19 +1,24 @@ package manager; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + public class Appointment { + public static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + private static int runningId = 100; private final String id; private final String nric; - private final String date; - private final String time; + private final LocalDateTime dateTime; private final String description; - public Appointment(String nric, String date, String time, String description) { + public Appointment(String nric, LocalDateTime dateTime, String description) { this.id = "A" + runningId++; this.nric = nric; - this.date = date; - this.time = time; + this.dateTime = dateTime; this.description = description; } @@ -25,12 +30,16 @@ public String getNric() { return nric; } - public String getDate() { - return date; + public LocalDate getDate() { + return dateTime.toLocalDate(); + } + + public LocalTime getTime() { + return dateTime.toLocalTime(); } - public String getTime() { - return time; + public LocalDateTime getDateTime() { + return dateTime; } public String getDescription() { @@ -39,6 +48,6 @@ public String getDescription() { @Override public String toString() { - return "[" + id + "] - " + nric + " - " + date + " " + time + " - " + description; + return "[" + id + "] - " + nric + " - " + dateTime.format(DATE_TIME_FORMAT) + " - " + description; } } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 292580d7b2..a75e8ed4a6 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -57,6 +57,7 @@ public Patient viewPatient(String nric) { return matchedPatient; } + //@@author jyukuan public void storeMedicalHistory(String name, String nric, String medHistory) { Patient existingPatient = findPatientByNric(nric); @@ -107,7 +108,6 @@ public void viewMedicalHistoryByName(String name) { } } - // Find patient by NRIC private Patient findPatientByNric(String nric) { String target = nric.trim().toUpperCase(); for (Patient p : patients) { @@ -119,8 +119,7 @@ private Patient findPatientByNric(String nric) { return null; } - // Find patients by Name - public List findPatientsByName(String name) { + private List findPatientsByName(String name) { List result = new ArrayList<>(); for (Patient p : patients) { if (p.getName().trim().equalsIgnoreCase(name)) { @@ -130,7 +129,7 @@ public List findPatientsByName(String name) { return result; } - + //@@author chwenyee public void addAppointment(Appointment appointment) { appointments.add(appointment); } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 84c202eb7c..06df7bbb41 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -16,10 +16,14 @@ import manager.Appointment; import manager.Patient; +import java.time.LocalDateTime; +import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static manager.Appointment.DATE_TIME_FORMAT; + public class Parser { public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { // Split into two parts to extract the command keyword and its detail @@ -52,6 +56,7 @@ public static Command parse(String userInput) throws InvalidInputFormatException } } + //@@author JudHoka private static Patient parseAddPatient(String input) throws InvalidInputFormatException { String temp = input.replaceFirst("(?i)add-patient\\s*", ""); String name = extractValue(temp, "n/"); @@ -97,6 +102,7 @@ private static String parseViewPatient(String input) throws InvalidInputFormatEx return nric; } + //@@author jyukuan public static String[] parseViewHistory(String input) throws InvalidInputFormatException { // Remove the command prefix "view-history" (case-insensitive) and get the remaining string. String temp = input.replaceFirst("(?i)view-history\\s*", ""); @@ -150,6 +156,7 @@ public static String[] parseStoreHistory(String input) throws InvalidInputFormat return new String[]{name.trim(), nric.trim(), medHistory.trim()}; } + //@@author chwenyee public static Appointment parseAddAppointment(String input) throws InvalidInputFormatException { String temp = input.replaceFirst("(?i)add-appointment\\s+", ""); String nric = extractValue(temp, "ic/"); @@ -162,7 +169,14 @@ public static Appointment parseAddAppointment(String input) throws InvalidInputF + "Please use: add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"; throw new InvalidInputFormatException(msg); } - return new Appointment(nric.trim(), date.trim(), time.trim(), desc.trim()); + + try { + String combined = date.trim() + " " + time.trim(); + LocalDateTime dateTime = LocalDateTime.parse(combined, DATE_TIME_FORMAT); + return new Appointment(nric.trim(), dateTime, desc.trim()); + } catch (DateTimeParseException e) { + throw new InvalidInputFormatException("Invalid date/time format. Please use dt/yyyy-MM-dd and t/HHmm"); + } } public static String parseDeleteAppointment(String input) throws InvalidInputFormatException { @@ -224,6 +238,7 @@ private static String extractValue(String input, String prefix) { return detail.isEmpty() ? null : detail; } + //@@author JudHoka public static Patient parsePatient(String line) { String[] tokens = line.split("\\|"); if (tokens.length < 7) { diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index d3c881b9f7..5d62aa0942 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -77,7 +77,9 @@ public void showPatientViewed(Patient matchedPatient, String nric) { public void showPatientList(List patients) { if (patients.isEmpty()) { + showLine(); System.out.println("No patients have been added."); + showLine(); return; } diff --git a/src/main/java/storage/patient_data.txt b/src/main/java/storage/patient_data.txt index e69de29bb2..1acf0f8df5 100644 --- a/src/main/java/storage/patient_data.txt +++ b/src/main/java/storage/patient_data.txt @@ -0,0 +1,2 @@ +S1234567D|HOW|2013-02-12|M|HAHAHAH|91227877|[] +S456789D|CWW|2015-02-20|M|HA?|91227800|[] diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 0781c66901..1909e1dc2d 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -10,6 +10,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @@ -77,4 +81,29 @@ void addPatient_validInput_expectPatientAddedAndSaved() assertTrue(line.contains("John Doe"), "Saved patient name not found in file."); assertTrue(line.contains("S1234567A"), "Saved patient NRIC not found in file."); } + + @Test + void addAppointment_validInput_expectAppointmentAdded() throws DuplicatePatientIDException, + UnloadedStorageException { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + + LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); + + Appointment appointment = new Appointment("S1234567D", appointmentTime, + "Medical Check-up"); + + manager.addAppointment(appointment); + + assertEquals(1, manager.getAppointments().size()); + assertEquals("S1234567D", manager.getAppointments().get(0).getNric()); + assertEquals(LocalDate.of(2025, 3, 20), manager.getAppointments().get(0).getDate()); + assertEquals(LocalTime.of(19, 0), manager.getAppointments().get(0).getTime()); + } + + @Test + void deleteAppointment_() { + } } diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index c0693c5c9a..3d048fd496 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -1,31 +1,57 @@ package miscellaneous; import exception.InvalidInputFormatException; +import manager.Appointment; + +import java.time.LocalDateTime; import org.junit.jupiter.api.Test; +import static manager.Appointment.DATE_TIME_FORMAT; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; class ParserTest { + @Test + void parseAddAppointment_validInput_returnsAppointment() throws Exception { + String input = "add-appointment ic/S1234567D dt/2025-03-20 t/1430 dsc/Checkup"; + + Appointment appointment = Parser.parseAddAppointment(input); + + assertNotNull(appointment); + assertEquals("S1234567D", appointment.getNric()); + assertEquals(LocalDateTime.parse("2025-03-20 1430", DATE_TIME_FORMAT), appointment.getDateTime()); + assertEquals("Checkup", appointment.getDescription()); + } + @Test void parseAddAppointment_invalidFormat_expectException() { - String input = "add-appointment ic/S1234567D dt/03-19 t/1200"; + String input = "add-appointment ic/S1234567D dt/2025-03-19 t/1200"; assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); } @Test - void parseAddAppointment_missingDetail_expectedException() { - String input = "add-appointment ic/ dt/03-19 t/1200 dsc/medical check-up"; + void parseAddAppointment_missingDetail_expectException() { + String input = "add-appointment ic/ dt/2025-03-19 t/1200 dsc/medical check-up"; assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); } @Test - void parseDeleteAppointment_validInput_expectedSuccess() throws InvalidInputFormatException { + void parseAddAppointment_invalidDateTimeFormat_throwsException() { + String input1 = "add-appointment ic/S1234567D dt/03-19 t/1900 dsc/Checkup"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input1)); + + String input2 = "add-appointment ic/S1234567D dt/2025-03-20 t/7:00PM dsc/Checkup"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input2)); + } + + @Test + void parseDeleteAppointment_validInput_expectSuccess() throws InvalidInputFormatException { String input = "delete-appointment A100"; String result = Parser.parseDeleteAppointment(input); @@ -41,7 +67,7 @@ void parseDeleteAppointment_extraSpaces_expectSuccess() throws InvalidInputForma } @Test - void parseDeleteAppointment_invalidAppointmentId_expectedException() { + void parseDeleteAppointment_invalidAppointmentId_expectException() { String input = "delete-appointment 100"; assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); From ff59fd8f50a8755bffb98a047acd1721c1042364 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Thu, 27 Mar 2025 22:33:14 +0800 Subject: [PATCH 048/203] Appointment's dateTime variable type is now LocalDateTime. Added more JUnit Test Cases. --- src/main/java/ClinicEase.java | 1 + src/main/java/manager/ManagementSystem.java | 1 + src/main/java/miscellaneous/Parser.java | 6 +- .../java/manager/ManagementSystemTest.java | 68 ++++++++++++++++--- src/test/java/miscellaneous/ParserTest.java | 41 +++++++++++ 5 files changed, 104 insertions(+), 13 deletions(-) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 12271e004b..acdc4e4daf 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -17,6 +17,7 @@ public class ClinicEase { private Storage storage; public ClinicEase(String filePath) { + assert filePath != null : "File path cannot be null"; this.ui = new Ui(); this.storage= new Storage(filePath); diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index a75e8ed4a6..7dd3bac126 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -46,6 +46,7 @@ public Patient deletePatient(String nric) { return null; } + //@@author dylancmznus public Patient viewPatient(String nric) { Patient matchedPatient = null; for (Patient patient : patients) { diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 06df7bbb41..0694e1f4b3 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -56,7 +56,6 @@ public static Command parse(String userInput) throws InvalidInputFormatException } } - //@@author JudHoka private static Patient parseAddPatient(String input) throws InvalidInputFormatException { String temp = input.replaceFirst("(?i)add-patient\\s*", ""); String name = extractValue(temp, "n/"); @@ -102,7 +101,6 @@ private static String parseViewPatient(String input) throws InvalidInputFormatEx return nric; } - //@@author jyukuan public static String[] parseViewHistory(String input) throws InvalidInputFormatException { // Remove the command prefix "view-history" (case-insensitive) and get the remaining string. String temp = input.replaceFirst("(?i)view-history\\s*", ""); @@ -156,7 +154,6 @@ public static String[] parseStoreHistory(String input) throws InvalidInputFormat return new String[]{name.trim(), nric.trim(), medHistory.trim()}; } - //@@author chwenyee public static Appointment parseAddAppointment(String input) throws InvalidInputFormatException { String temp = input.replaceFirst("(?i)add-appointment\\s+", ""); String nric = extractValue(temp, "ic/"); @@ -190,6 +187,8 @@ public static String parseDeleteAppointment(String input) throws InvalidInputFor } private static String extractValue(String input, String prefix) { + assert prefix != null : "Prefix cannot be null"; + String lowerInput = input.toLowerCase(); String lowerPrefix = prefix.toLowerCase(); int start = -1; @@ -238,7 +237,6 @@ private static String extractValue(String input, String prefix) { return detail.isEmpty() ? null : detail; } - //@@author JudHoka public static Patient parsePatient(String line) { String[] tokens = line.split("\\|"); if (tokens.length < 7) { diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 1909e1dc2d..8f7a2b4ebe 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -18,6 +18,8 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -26,6 +28,8 @@ class ManagementSystemTest { private static final String TEST_DIR = "test-data"; private static final Path TEST_FILE_PATH = Paths.get(TEST_DIR, "patient_data.txt"); + private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + @BeforeEach void setUp() throws IOException { @@ -83,27 +87,73 @@ void addPatient_validInput_expectPatientAddedAndSaved() } @Test - void addAppointment_validInput_expectAppointmentAdded() throws DuplicatePatientIDException, - UnloadedStorageException { + void addAppointment_validInput_expectAppointmentAdded() { List emptyList = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(emptyList); - DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); - LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); - Appointment appointment = new Appointment("S1234567D", appointmentTime, - "Medical Check-up"); + Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); + String expectedNric = appointment.getNric(); manager.addAppointment(appointment); - assertEquals(1, manager.getAppointments().size()); - assertEquals("S1234567D", manager.getAppointments().get(0).getNric()); + assertEquals(1, manager.getAppointments().size(), "Size does not match"); + assertEquals(expectedNric, manager.getAppointments().get(0).getNric(), "NRIC does not match"); assertEquals(LocalDate.of(2025, 3, 20), manager.getAppointments().get(0).getDate()); assertEquals(LocalTime.of(19, 0), manager.getAppointments().get(0).getTime()); } @Test - void deleteAppointment_() { + void deleteAppointment_validInput_expectAppointmentDeleted() { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); + + Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); + + String expectedId = appointment.getId(); + manager.addAppointment(appointment); + Appointment removedAppointment = manager.deleteAppointment(expectedId); + + assertNotNull(removedAppointment, "Deleted appointment should be returned"); + assertEquals(expectedId, appointment.getId(), "Appointment ID does not match"); + assertEquals(0, manager.getAppointments().size(), "Size does not match"); } + + @Test + void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-30 2200", DATE_TIME_FORMAT); + + Appointment appointment = new Appointment("S3456789D", appointmentTime, "Checkup"); + + String expectedId = appointment.getId(); + manager.addAppointment(appointment); + Appointment removedAppointment = manager.deleteAppointment(expectedId); + + assertNotNull(removedAppointment, "Deleted appointment should be returned"); + assertEquals(expectedId, appointment.getId(), "Appointment ID does not match"); + assertEquals(0, manager.getAppointments().size(), "Size does not match"); + } + + @Test + void deleteAppointment_nonExistentId_expectNullReturned() { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-25 2100", DATE_TIME_FORMAT); + + Appointment appointment = new Appointment("S2345678D", appointmentTime, "Checkup"); + + manager.addAppointment(appointment); + Appointment removedAppointment = manager.deleteAppointment("A999"); + + assertEquals(1, manager.getAppointments().size(), "Size does not match"); + assertNull(removedAppointment, "Should return null"); + } + } diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index 3d048fd496..ea07dab934 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -1,6 +1,11 @@ package miscellaneous; +import command.AddAppointmentCommand; +import command.Command; +import command.DeleteAppointmentCommand; +import command.ListAppointmentCommand; import exception.InvalidInputFormatException; +import exception.UnknownCommandException; import manager.Appointment; import java.time.LocalDateTime; @@ -8,7 +13,9 @@ import org.junit.jupiter.api.Test; import static manager.Appointment.DATE_TIME_FORMAT; +import static miscellaneous.Parser.parse; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -135,5 +142,39 @@ void parseStoreHistory_missingFields_expectException() { assertThrows(InvalidInputFormatException.class, () -> Parser.parseStoreHistory("store-history n/John Doe ic/S1234567D")); } + + + @Test + void parse_addAppointmentCommand_expectAddAppointmentCommand() throws InvalidInputFormatException, + UnknownCommandException { + Command command = Parser.parse("add-appointment ic/S1234567D dt/2025-03-27 t/1900 dsc/Checkup"); + assertInstanceOf(AddAppointmentCommand.class, command); + } + + @Test + void parse_wrongFormatAddAppointment_expectInvalidInputFormatException() { + String input = "add-appointment ic/ dt/ t/ dsc/"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input)); + } + + @Test + void parse_deleteAppointmentCommand_expectDeleteAppointmentCommand() throws InvalidInputFormatException, + UnknownCommandException { + Command command = Parser.parse("delete-appointment A100"); + assertInstanceOf(DeleteAppointmentCommand.class, command); + } + + @Test + void parse_listAppointmentCommand_expectListAppointmentCommandCommand() throws Exception { + Command command = Parser.parse("list-appointment"); + assertInstanceOf(ListAppointmentCommand.class, command); + } + + @Test + void parse_unknownCommand_expectUnknownCommandException() { + String userInput = "bee-boo"; + assertThrows(UnknownCommandException.class, () -> parse(userInput)); + } + } From ecb82826e64e445fd3ae36dea733d9562f66a9b8 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Thu, 27 Mar 2025 23:19:05 +0800 Subject: [PATCH 049/203] Added feature sort-appointment by date in ascending order. --- .../java/command/SortAppointmentCommand.java | 18 ++++++++++++++ src/main/java/manager/ManagementSystem.java | 11 +++++++++ src/main/java/miscellaneous/Parser.java | 3 +++ src/main/java/miscellaneous/Ui.java | 2 +- .../java/manager/ManagementSystemTest.java | 24 +++++++++++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/main/java/command/SortAppointmentCommand.java diff --git a/src/main/java/command/SortAppointmentCommand.java b/src/main/java/command/SortAppointmentCommand.java new file mode 100644 index 0000000000..349c184706 --- /dev/null +++ b/src/main/java/command/SortAppointmentCommand.java @@ -0,0 +1,18 @@ +package command; + +import exception.DuplicatePatientIDException; +import exception.UnloadedStorageException; +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +import java.util.List; + +public class SortAppointmentCommand extends Command { + @Override + public void execute (ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, + UnloadedStorageException { + List sortedAppointment = manager.sortAppointments(manager.getAppointments()); + ui.showAppointmentList(sortedAppointment); + } +} diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 7dd3bac126..1ec350571a 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -6,6 +6,7 @@ import storage.Storage; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; public class ManagementSystem { @@ -144,4 +145,14 @@ public Appointment deleteAppointment(String apptId) { } return null; } + + public List sortAppointments(List appointments) { + // comparing NRIC and Desc could be useless as there will not have clashing appointments + appointments.sort(Comparator + .comparing(Appointment::getDateTime) + .thenComparing(Appointment::getNric) + .thenComparing(Appointment::getDescription)); + + return appointments; + } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 0694e1f4b3..938da78273 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -8,6 +8,7 @@ import command.ExitCommand; import command.ListAppointmentCommand; import command.ListPatientCommand; +import command.SortAppointmentCommand; import command.StoreMedHistoryCommand; import command.ViewMedHistoryCommand; import command.ViewPatientCommand; @@ -51,6 +52,8 @@ public static Command parse(String userInput) throws InvalidInputFormatException return new DeleteAppointmentCommand(parseDeleteAppointment(userInput)); case "list-appointment": return new ListAppointmentCommand(); + case "sort-appointment": + return new SortAppointmentCommand(); default: throw new UnknownCommandException("Unknown command. Please try again."); } diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 5d62aa0942..7461f15512 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -110,7 +110,7 @@ public void showAppointmentAdded(List appointments) { Appointment currentAppt = appointments.get(appointments.size() - 1); showLine(); - System.out.println("Appointment added for NRIC: " + currentAppt.getId() + " on " + currentAppt.getDate() + System.out.println("Appointment added for NRIC: " + currentAppt.getNric() + " on " + currentAppt.getDate() + " at " + currentAppt.getTime() + "."); System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); showLine(); diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 8f7a2b4ebe..1664be6f3b 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -156,4 +156,28 @@ void deleteAppointment_nonExistentId_expectNullReturned() { assertNull(removedAppointment, "Should return null"); } + @Test + void sortAppointments_sortByDateTime_expectSortedAppointments() { + ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + List appointments = new ArrayList<>(); + + LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); + LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-24 1200", DATE_TIME_FORMAT); + LocalDateTime appointmentTime3 = LocalDateTime.parse("2025-03-25 1000", DATE_TIME_FORMAT); + + Appointment appointment1 = new Appointment("S1234567D", appointmentTime1, "Checkup"); + appointments.add(appointment1); + + Appointment appointment2 = new Appointment("S4567890D", appointmentTime2, "CT scan"); + appointments.add(appointment2); + + Appointment appointment3 = new Appointment("S7891234D", appointmentTime3, "Consultation"); + appointments.add(appointment3); + + manager.sortAppointments(appointments); + + assertEquals("CT scan", appointments.get(0).getDescription()); + assertEquals("Consultation", appointments.get(1).getDescription()); + assertEquals("Checkup", appointments.get(2).getDescription()); + } } From 7dee5b9b7b1b719b221a1f4f9c15e53532a36d81 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Fri, 28 Mar 2025 00:09:12 +0800 Subject: [PATCH 050/203] Added some JUnit Test Cases for AddAppointment, DeleteAppointment, ListAppointment and SortAppointment --- src/main/java/miscellaneous/Parser.java | 2 +- .../command/AddAppointmentCommandTest.java | 33 +++++++++++ .../command/DeleteAppointmentCommandTest.java | 32 ++++++++++ .../command/ListAppointmentCommandTest.java | 44 ++++++++++++++ .../command/SortAppointmentCommandTest.java | 58 +++++++++++++++++++ src/test/java/miscellaneous/ParserTest.java | 1 - 6 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 src/test/java/command/AddAppointmentCommandTest.java create mode 100644 src/test/java/command/DeleteAppointmentCommandTest.java create mode 100644 src/test/java/command/ListAppointmentCommandTest.java create mode 100644 src/test/java/command/SortAppointmentCommandTest.java diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 938da78273..4ccd07b988 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -175,7 +175,7 @@ public static Appointment parseAddAppointment(String input) throws InvalidInputF LocalDateTime dateTime = LocalDateTime.parse(combined, DATE_TIME_FORMAT); return new Appointment(nric.trim(), dateTime, desc.trim()); } catch (DateTimeParseException e) { - throw new InvalidInputFormatException("Invalid date/time format. Please use dt/yyyy-MM-dd and t/HHmm"); + throw new InvalidInputFormatException("Invalid date/time format. Please use: dt/yyyy-MM-dd and t/HHmm"); } } diff --git a/src/test/java/command/AddAppointmentCommandTest.java b/src/test/java/command/AddAppointmentCommandTest.java new file mode 100644 index 0000000000..8bf628bd8c --- /dev/null +++ b/src/test/java/command/AddAppointmentCommandTest.java @@ -0,0 +1,33 @@ +package command; + +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class AddAppointmentCommandTest { + private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + + @Test + void execute_validAppointment_expectAppointmentAdded() { + ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + Ui ui = new Ui(); + + LocalDateTime dateTime = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); + Appointment appointment = new Appointment("S1234567D", dateTime, "Checkup"); + + new AddAppointmentCommand(appointment).execute(manager, ui); + + List appointments = manager.getAppointments(); + assertEquals(1, appointments.size(), "Size of appointments should be 1"); + assertEquals(appointment, appointments.get(0)); + } +} diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java new file mode 100644 index 0000000000..9364a8480d --- /dev/null +++ b/src/test/java/command/DeleteAppointmentCommandTest.java @@ -0,0 +1,32 @@ +package command; + +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +class DeleteAppointmentCommandTest { + private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + + @Test + void execute_validNric_expectAppointmentDeleted() { + ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + Ui ui = new Ui(); + + LocalDateTime dateTime = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); + Appointment appointment = new Appointment("S1234567D", dateTime, "Checkup"); + + new AddAppointmentCommand(appointment).execute(manager, ui); + new DeleteAppointmentCommand(appointment.getId()).execute(manager, ui); + + assertEquals(0, manager.getAppointments().size(), "Size of appointment does not match"); + } +} diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java new file mode 100644 index 0000000000..8af16d74f6 --- /dev/null +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -0,0 +1,44 @@ +package command; + +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +class ListAppointmentCommandTest { + + private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + + @Test + void execute_always_requestsAppointmentsFromManager() { + ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + Ui ui = new Ui(); + + LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); + LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); + LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); + + + List appointments = List.of( + new Appointment("S1234567D", dateTime1 , "Checkup"), + new Appointment("S2345678D", dateTime2 , "CT scan"), + new Appointment("S3456789D", dateTime3 , "Consultation") + ); + manager.addAppointment(appointments.get(0)); + manager.addAppointment(appointments.get(1)); + manager.addAppointment(appointments.get(2)); + + new ListAppointmentCommand().execute(manager, ui); + + assertEquals(3, manager.getAppointments().size(), "Size of appointment does not match"); + } +} \ No newline at end of file diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java new file mode 100644 index 0000000000..88f5d991ca --- /dev/null +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -0,0 +1,58 @@ +package command; + +import exception.DuplicatePatientIDException; +import exception.UnloadedStorageException; +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class SortAppointmentCommandTest { + private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + + @Test + void execute_appointmentsWithDifferentDateTime_sortsByDateInAscendingOrder() throws DuplicatePatientIDException, + UnloadedStorageException { + ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + Ui ui = new Ui(); + + LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); + LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); + LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); + + + List appointments = List.of( + new Appointment("S1234567D", dateTime1, "Checkup"), + new Appointment("S2345678D", dateTime2, "CT scan"), + new Appointment("S3456789D", dateTime3, "Consultation") + ); + manager.addAppointment(appointments.get(0)); + manager.addAppointment(appointments.get(1)); + manager.addAppointment(appointments.get(2)); + + new SortAppointmentCommand().execute(manager, ui); + List sortedAppointments = manager.getAppointments(); + + assertEquals(3, sortedAppointments.size(), "Size of appointment does not match"); + assertEquals("Consultation", sortedAppointments.get(0).getDescription()); + assertEquals("Checkup", sortedAppointments.get(1).getDescription()); + assertEquals("CT scan", sortedAppointments.get(2).getDescription()); + } + + @Test + void execute_emptyList_expectEmptyList() throws DuplicatePatientIDException, UnloadedStorageException { + ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + Ui ui = new Ui(); + + new SortAppointmentCommand().execute(manager, ui); + assertTrue(manager.getAppointments().isEmpty()); + } +} diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index ea07dab934..71626c2a62 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -177,4 +177,3 @@ void parse_unknownCommand_expectUnknownCommandException() { } } - From fc4ba238a05fd471025ca6fa92d5661c300ba863 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Fri, 28 Mar 2025 01:13:27 +0800 Subject: [PATCH 051/203] restored junit and authored --- src/main/java/command/ViewPatientCommand.java | 6 ++ .../java/manager/ManagementSystemTest.java | 77 +++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/src/main/java/command/ViewPatientCommand.java b/src/main/java/command/ViewPatientCommand.java index abc545979d..ed88339888 100644 --- a/src/main/java/command/ViewPatientCommand.java +++ b/src/main/java/command/ViewPatientCommand.java @@ -4,6 +4,7 @@ import manager.Patient; import miscellaneous.Ui; +//@@author dylancmznus public class ViewPatientCommand extends Command { protected String nric; @@ -13,7 +14,12 @@ public ViewPatientCommand(String nric) { @Override public void execute(ManagementSystem manager, Ui ui) { + assert manager != null : "ManagementSystem instance can't be empty"; + assert ui != null : "Ui instance can't be empty"; + Patient matchedPatient = manager.viewPatient(nric); + assert matchedPatient != null : "No patient found for NRIC: " + nric; + ui.showPatientViewed(matchedPatient, nric); } } diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 8f7a2b4ebe..6e0fceca12 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -86,6 +86,83 @@ void addPatient_validInput_expectPatientAddedAndSaved() assertTrue(line.contains("S1234567A"), "Saved patient NRIC not found in file."); } + @Test + void deletePatient_existingPatient_patientDeleted() { + List patients = new ArrayList<>(); + Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + "M", "123 Main St", "81234567", new ArrayList<>()); + patients.add(patient); + ManagementSystem manager = new ManagementSystem(patients); + + Patient deletedPatient = manager.deletePatient("S1234567A"); + + assertNotNull(deletedPatient, "Patient should be deleted"); + assertEquals("John Doe", deletedPatient.getName(), "Deleted patient's name should match"); + assertEquals("S1234567A", deletedPatient.getId(), "Deleted patient's NRIC should match"); + assertEquals(0, manager.getPatients().size(), "Patients list should be empty after deletion"); + } + + @Test + void deletePatient_nonExistentPatient_patientNotFound() { + List patients = new ArrayList<>(); + Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + "M", "123 Main St", "81234567", new ArrayList<>()); + patients.add(patient); + ManagementSystem manager = new ManagementSystem(patients); + + Patient deletedPatient = manager.deletePatient("S9999999X"); + + assertNull(deletedPatient, "Patient should not be found and returned as null"); + assertEquals(1, manager.getPatients().size(), "Patients list should remain unchanged"); + } + + @Test + void deletePatient_emptyList_patientNotFound() { + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients); + + Patient deletedPatient = manager.deletePatient("S1234567A"); + + assertNull(deletedPatient, "Patient should not be found in an empty system"); + assertEquals(0, manager.getPatients().size(), "Patients list should remain empty"); + } + + @Test + void viewPatient_validNric_patientFound() { + List patients = new ArrayList<>(); + patients.add(new Patient("S1234567A", "John Doe", "1990-01-01", + "M", "123 Main St", "81234567", new ArrayList<>())); + ManagementSystem manager = new ManagementSystem(patients); + + Patient retrievedPatient = manager.viewPatient("S1234567A"); + + assertNotNull(retrievedPatient, "Patient should be found"); + assertEquals("John Doe", retrievedPatient.getName(), "Patient name should match"); + assertEquals("S1234567A", retrievedPatient.getId(), "Patient NRIC should match"); + } + + @Test + void viewPatient_invalidNric_patientNotFound() { + List patients = new ArrayList<>(); + patients.add(new Patient("S1234567A", "John Doe", "1990-01-01", + "M", "123 Main St", "81234567", new ArrayList<>())); + ManagementSystem manager = new ManagementSystem(patients); + + Patient retrievedPatient = manager.viewPatient("S9999999X"); + + assertNull(retrievedPatient, "Patient should not be found with this NRIC"); + } + + @Test + void viewPatient_emptySystem_patientNotFound() { + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients); + + Patient retrievedPatient = manager.viewPatient("S1234567A"); + + assertNull(retrievedPatient, "Patient should not be found when system is empty"); + } + @Test void addAppointment_validInput_expectAppointmentAdded() { List emptyList = new ArrayList<>(); From 6214f56df0f9223bdbbd6541e0d00e23e20ef802 Mon Sep 17 00:00:00 2001 From: yukuan Date: Fri, 28 Mar 2025 19:13:41 +0800 Subject: [PATCH 052/203] edit patients' detail --- src/main/java/command/EditPatientCommand.java | 29 ++++++++++ .../command/EditPatientHistoryCommand.java | 26 +++++++++ src/main/java/manager/ManagementSystem.java | 48 +++++++++++++++++ src/main/java/manager/Patient.java | 52 ++++++++++++++---- src/main/java/miscellaneous/Parser.java | 53 ++++++++++++++----- src/main/java/miscellaneous/Ui.java | 7 ++- 6 files changed, 189 insertions(+), 26 deletions(-) create mode 100644 src/main/java/command/EditPatientCommand.java create mode 100644 src/main/java/command/EditPatientHistoryCommand.java diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java new file mode 100644 index 0000000000..b32960a71a --- /dev/null +++ b/src/main/java/command/EditPatientCommand.java @@ -0,0 +1,29 @@ +package command; + +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class EditPatientCommand extends Command { + + // details: [0]=nric, [1]=name, [2]=dob, [3]=gender, [4]=address, [5]=phone + private final String[] details; + + public EditPatientCommand(String[] details) { + this.details = details; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + String nric = details[0]; + String name = details[1]; + String dob = details[2]; + String gender = details[3]; + String addr = details[4]; + String phone = details[5]; + + manager.editPatient(nric, name, dob, gender, addr, phone); + Ui.showLine(); + System.out.println("Edit-patient command executed."); + Ui.showLine(); + } +} diff --git a/src/main/java/command/EditPatientHistoryCommand.java b/src/main/java/command/EditPatientHistoryCommand.java new file mode 100644 index 0000000000..4ad23aeb5b --- /dev/null +++ b/src/main/java/command/EditPatientHistoryCommand.java @@ -0,0 +1,26 @@ +package command; + +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class EditPatientHistoryCommand extends Command { + + private final String[] details; + + public EditPatientHistoryCommand(String[] details) { + this.details = details; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + String nric = details[0]; + String oldHistory = details[1]; + String newHistory = details[2]; + + manager.editPatientHistory(nric, oldHistory, newHistory); + + Ui.showLine(); + System.out.println("Edit-history command executed."); + Ui.showLine(); + } +} diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 0eec4c39a0..0f16e6b4e5 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -54,6 +54,32 @@ public Patient viewPatient(String nric) { return matchedPatient; } + public void editPatient(String nric, String newName, String newDob, String newGender, + String newAddress, String newPhone) { + Patient patient = findPatientByNric(nric); + if (patient == null) { + System.out.println("Patient with NRIC " + nric + " not found."); + return; + } + if (newName != null && !newName.isBlank()) { + patient.setName(newName); + } + if (newDob != null && !newDob.isBlank()) { + patient.setDob(newDob); + } + if (newGender != null && !newGender.isBlank()) { + patient.setGender(newGender); + } + if (newAddress != null && !newAddress.isBlank()) { + patient.setAddress(newAddress); + } + if (newPhone != null && !newPhone.isBlank()) { + patient.setContactInfo(newPhone); + } + System.out.println("Patient with NRIC " + nric + " updated successfully."); + } + + public void storeMedicalHistory(String name, String nric, String medHistory) { Patient existedPatient = findPatientByNric(nric); @@ -105,6 +131,28 @@ public void viewMedicalHistoryByName(String name) { } } + public void editPatientHistory(String nric, String oldHistory, String newHistory) { + Patient patient = findPatientByNric(nric); + if (patient == null) { + System.out.println("Patient with NRIC " + nric + " not found."); + return; + } + List histories = patient.getMedicalHistory(); + boolean foundOld = false; + for (int i = 0; i < histories.size(); i++) { + if (histories.get(i).equalsIgnoreCase(oldHistory.trim())) { + histories.set(i, newHistory.trim()); + foundOld = true; + System.out.println("Replaced old history \"" + oldHistory + "\" with \"" + newHistory + "\"."); + break; + } + } + if (!foundOld) { + System.out.println("Old history \"" + oldHistory + "\" not found for patient " + patient.getName()); + } + } + + // Find patient by NRIC private Patient findPatientByNric(String nric) { String object = nric.trim().toUpperCase(); diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 201b3cae87..9b81059aae 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -4,13 +4,13 @@ import java.util.List; public class Patient { - - private final String id; - private final String name; - private final String dob; - private final String contactInfo; - private final String gender; - private final String address; + + private String id; + private String name; + private String dob; + private String contactInfo; + private String gender; + private String address; private final List medicalHistory; public Patient(String id, String name, String dob, String gender, String address, String contactInfo) { @@ -43,6 +43,26 @@ public List getMedicalHistory() { return medicalHistory; } + public void setName(String name) { + this.name = name; + } + + public void setDob(String dob) { + this.dob = dob; + } + + public void setContactInfo(String contactInfo) { + this.contactInfo = contactInfo; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public void setAddress(String address) { + this.address = address; + } + @Override public String toString() { return String.format( @@ -51,13 +71,14 @@ public String toString() { "Date of Birth: %s\n" + "Gender: %s\n" + "Address: %s\n" + - "Contact: %s", - id, name, dob, gender, address, contactInfo + "Contact: %s\n" + + "Medical History: %s", + id, name, dob, gender, address, contactInfo, medicalHistory ); } public String toStringForListView() { - return String.format( + String result = String.format( "Patient ID: %s\n " + "Name: %s\n " + "Date of Birth: %s\n " + @@ -66,5 +87,16 @@ public String toStringForListView() { "Contact: %s", id, name, dob, gender, address, contactInfo ); + + if (medicalHistory.isEmpty()) { + result += "\n Medical History: None"; + } else { + result += "\n Medical History:"; + for (String h : medicalHistory) { + result += "\n - " + h; + } + } + return result; } + } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 5f0892141d..f8b46b2e8c 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -1,16 +1,6 @@ package miscellaneous; -import command.AddAppointmentCommand; -import command.AddPatientCommand; -import command.Command; -import command.DeleteAppointmentCommand; -import command.DeletePatientCommand; -import command.ExitCommand; -import command.ListAppointmentCommand; -import command.ListPatientCommand; -import command.StoreMedHistoryCommand; -import command.ViewMedHistoryCommand; -import command.ViewPatientCommand; +import command.*; import exception.InvalidInputFormatException; import exception.UnknownCommandException; import manager.Appointment; @@ -43,6 +33,10 @@ public static Command parse(String userInput) throws InvalidInputFormatException return new DeleteAppointmentCommand(parseDeleteAppointment(userInput)); case "list-appointment": return new ListAppointmentCommand(); + case "edit-patient": + return new EditPatientCommand(parseEditPatient(userInput)); + case "edit-history": + return new EditPatientHistoryCommand(parseEditHistory(userInput)); default: throw new UnknownCommandException("Unknown command. Please try again."); } @@ -181,7 +175,8 @@ private static String extractValue(String input, String prefix) { } start += prefix.length(); - String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/", "h/"}; + String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/", "h/", + "old/", "new/"}; int end = input.length(); // Determine where the current parameter's detail ends by finding the start of the next parameter @@ -208,4 +203,38 @@ private static String extractValue(String input, String prefix) { return detail.isEmpty() ? null : detail; } + private static String[] parseEditPatient(String input) throws InvalidInputFormatException { + String temp = input.replaceFirst("(?i)edit-patient\\s*", ""); + String nric = extractValue(temp, "ic/"); + if (nric == null) { + throw new InvalidInputFormatException("Missing NRIC! Usage: edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]"); + } + String name = extractValue(temp, "n/"); + String dob = extractValue(temp, "dob/"); + String gender = extractValue(temp, "g/"); + String address = extractValue(temp, "a/"); + String phone = extractValue(temp, "p/"); + + return new String[]{nric, name, dob, gender, address, phone}; + } + + private static String[] parseEditHistory(String input) throws InvalidInputFormatException { + String temp = input.replaceFirst("(?i)edit-history\\s*", ""); + + String nric = extractValue(temp, "ic/"); + if (nric == null) { + throw new InvalidInputFormatException("Missing NRIC! Usage: edit-history ic/NRIC old/OLD_HISTORY new/NEW_HISTORY"); + } + + String oldHistory = extractValue(temp, "old/"); + String newHistory = extractValue(temp, "new/"); + + if (oldHistory == null || newHistory == null) { + throw new InvalidInputFormatException("Missing old or new history text! Usage: edit-history ic/NRIC old/OLD_TEXT new/NEW_TEXT"); + } + + return new String[]{nric, oldHistory, newHistory}; + } + + } diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index d3c881b9f7..5a8e2b5613 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -68,20 +68,18 @@ public void showPatientViewed(Patient matchedPatient, String nric) { showLine(); return; } - - System.out.println("-".repeat(43) + "Patient Details" + "-".repeat(43)); System.out.println(matchedPatient); showLine(); - } + public void showPatientList(List patients) { if (patients.isEmpty()) { System.out.println("No patients have been added."); return; } - System.out.println("-".repeat(43)+ "Patient Details" + "-".repeat(43)); + System.out.println("-".repeat(43) + "Patient Details" + "-".repeat(43)); int count = 1; for (Patient p : patients) { @@ -91,6 +89,7 @@ public void showPatientList(List patients) { } } + public static void showPatientHistory(Patient patient) { System.out.println("Medical History for " + patient.getName() + " (NRIC: " + patient.getId() + "):"); List histories = patient.getMedicalHistory(); From a9a9457f8acf7ceabfb2a07b3ae5d698e30be5a9 Mon Sep 17 00:00:00 2001 From: yukuan Date: Fri, 28 Mar 2025 19:46:02 +0800 Subject: [PATCH 053/203] Fixed the checkstyle of the code. --- src/main/java/miscellaneous/Parser.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index d0b8c4be79..7f04e1cb6c 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -1,5 +1,6 @@ package miscellaneous; + import command.*; import exception.InvalidInputFormatException; import exception.UnknownCommandException; @@ -204,8 +205,7 @@ private static String extractValue(String input, String prefix) { } start += prefix.length(); - String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/", "h/", - "old/", "new/"}; + String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/", "h/", "old/", "new/"}; int end = input.length(); // Determine where the current parameter's detail ends by finding the start of the next parameter @@ -236,7 +236,8 @@ private static String[] parseEditPatient(String input) throws InvalidInputFormat String temp = input.replaceFirst("(?i)edit-patient\\s*", ""); String nric = extractValue(temp, "ic/"); if (nric == null) { - throw new InvalidInputFormatException("Missing NRIC! Usage: edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]"); + throw new InvalidInputFormatException("Missing NRIC! Usage: edit-patient ic/NRIC [n/NAME] " + + "[dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]"); } String name = extractValue(temp, "n/"); String dob = extractValue(temp, "dob/"); @@ -252,14 +253,16 @@ private static String[] parseEditHistory(String input) throws InvalidInputFormat String nric = extractValue(temp, "ic/"); if (nric == null) { - throw new InvalidInputFormatException("Missing NRIC! Usage: edit-history ic/NRIC old/OLD_HISTORY new/NEW_HISTORY"); + throw new InvalidInputFormatException("Missing NRIC! Usage: edit-history ic/NRIC " + + "old/OLD_HISTORY new/NEW_HISTORY"); } String oldHistory = extractValue(temp, "old/"); String newHistory = extractValue(temp, "new/"); if (oldHistory == null || newHistory == null) { - throw new InvalidInputFormatException("Missing old or new history text! Usage: edit-history ic/NRIC old/OLD_TEXT new/NEW_TEXT"); + throw new InvalidInputFormatException("Missing old or new history text! Usage: edit-history " + + "ic/NRIC old/OLD_TEXT new/NEW_TEXT"); } return new String[]{nric, oldHistory, newHistory}; From 8062b22f393a4af3d0e07ea6003b8c4ae2b8d49c Mon Sep 17 00:00:00 2001 From: yukuan Date: Fri, 28 Mar 2025 19:52:52 +0800 Subject: [PATCH 054/203] Fixed checkstyle of Parser.java --- src/main/java/miscellaneous/Parser.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 7f04e1cb6c..fb1eb8d55a 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -1,7 +1,19 @@ package miscellaneous; -import command.*; +import command.AddPatientCommand; +import command.Command; +import command.DeletePatientCommand; +import command.ExitCommand; +import command.AddAppointmentCommand; +import command.DeleteAppointmentCommand; +import command.EditPatientCommand; +import command.ListAppointmentCommand; +import command.EditPatientHistoryCommand; +import command.ListPatientCommand; +import command.StoreMedHistoryCommand; +import command.ViewPatientCommand; +import command.ViewMedHistoryCommand; import exception.InvalidInputFormatException; import exception.UnknownCommandException; import manager.Appointment; From 740ca948dfcaa701fc6e94bd6be1b4d3bd14116c Mon Sep 17 00:00:00 2001 From: judHoka Date: Fri, 28 Mar 2025 21:08:39 +0800 Subject: [PATCH 055/203] Adjusted the patient_data file, implemented save feature to delete-patient --- {src/main/java/storage => data}/patient_data.txt | 0 src/main/java/ClinicEase.java | 2 +- src/main/java/command/DeletePatientCommand.java | 3 ++- src/main/java/manager/ManagementSystem.java | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) rename {src/main/java/storage => data}/patient_data.txt (100%) diff --git a/src/main/java/storage/patient_data.txt b/data/patient_data.txt similarity index 100% rename from src/main/java/storage/patient_data.txt rename to data/patient_data.txt diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index b7aa9c7236..fe6e66f110 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -47,6 +47,6 @@ public void run() { } public static void main(String[] args) { - new ClinicEase("src/main/java/storage").run(); + new ClinicEase("data").run(); } } diff --git a/src/main/java/command/DeletePatientCommand.java b/src/main/java/command/DeletePatientCommand.java index a6b43a0c6e..17d09a199c 100644 --- a/src/main/java/command/DeletePatientCommand.java +++ b/src/main/java/command/DeletePatientCommand.java @@ -1,5 +1,6 @@ package command; +import exception.UnloadedStorageException; import manager.ManagementSystem; import manager.Patient; import miscellaneous.Ui; @@ -12,7 +13,7 @@ public DeletePatientCommand(String nric) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Patient removedPatient = manager.deletePatient(nric); ui.showPatientDeleted(removedPatient, nric); } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 292580d7b2..a4f2fdd294 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -35,11 +35,12 @@ public void addPatient(Patient patient) throws DuplicatePatientIDException, Unlo Storage.savePatients(patients); } - public Patient deletePatient(String nric) { + public Patient deletePatient(String nric) throws UnloadedStorageException { for (Patient patient : patients) { if (patient.getId().equals(nric)) { patients.remove(patient); // Return the removed patient + Storage.savePatients(patients); return patient; } } From 2768c2d720f18f0ef4ae3e1a96380cd271f79b76 Mon Sep 17 00:00:00 2001 From: judHoka Date: Fri, 28 Mar 2025 21:17:47 +0800 Subject: [PATCH 056/203] Added assertions into the ManagementSystem --- src/main/java/manager/ManagementSystem.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index a4f2fdd294..4b9ca16380 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -26,7 +26,10 @@ public List getAppointments() { } public void addPatient(Patient patient) throws DuplicatePatientIDException, UnloadedStorageException { + assert patient != null : "Patient should not be null"; + for (Patient existingPatient : patients) { + assert existingPatient != null : "Existing patient in list should not be null"; if (existingPatient.getId().equals(patient.getId())) { throw new DuplicatePatientIDException("Patient ID already exists!"); } @@ -36,6 +39,7 @@ public void addPatient(Patient patient) throws DuplicatePatientIDException, Unlo } public Patient deletePatient(String nric) throws UnloadedStorageException { + assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; for (Patient patient : patients) { if (patient.getId().equals(nric)) { patients.remove(patient); @@ -48,6 +52,7 @@ public Patient deletePatient(String nric) throws UnloadedStorageException { } public Patient viewPatient(String nric) { + assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; Patient matchedPatient = null; for (Patient patient : patients) { if (patient.getId().equals(nric)) { From 288ea80aa008a484119904adb6ce4c0205de9251 Mon Sep 17 00:00:00 2001 From: judHoka Date: Fri, 28 Mar 2025 21:39:51 +0800 Subject: [PATCH 057/203] Resolve conflicts --- src/main/java/storage/patient_data.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/storage/patient_data.txt diff --git a/src/main/java/storage/patient_data.txt b/src/main/java/storage/patient_data.txt deleted file mode 100644 index e69de29bb2..0000000000 From 58539971ef64897be1f37c27d7d21e396dfd2241 Mon Sep 17 00:00:00 2001 From: judHoka Date: Fri, 28 Mar 2025 21:45:16 +0800 Subject: [PATCH 058/203] Adjusted testing to fit new functionality --- src/test/java/manager/ManagementSystemTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 6e0fceca12..eb5936760e 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -87,7 +87,7 @@ void addPatient_validInput_expectPatientAddedAndSaved() } @Test - void deletePatient_existingPatient_patientDeleted() { + void deletePatient_existingPatient_patientDeleted() throws UnloadedStorageException { List patients = new ArrayList<>(); Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", "M", "123 Main St", "81234567", new ArrayList<>()); @@ -103,7 +103,7 @@ void deletePatient_existingPatient_patientDeleted() { } @Test - void deletePatient_nonExistentPatient_patientNotFound() { + void deletePatient_nonExistentPatient_patientNotFound() throws UnloadedStorageException { List patients = new ArrayList<>(); Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", "M", "123 Main St", "81234567", new ArrayList<>()); @@ -117,7 +117,7 @@ void deletePatient_nonExistentPatient_patientNotFound() { } @Test - void deletePatient_emptyList_patientNotFound() { + void deletePatient_emptyList_patientNotFound() throws UnloadedStorageException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients); From 9bd48ea04a21c44968d023ce27737a045ffeab93 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Fri, 28 Mar 2025 23:00:14 +0800 Subject: [PATCH 059/203] Refine sort-appointment and added JUnit Test Cases --- .../java/command/SortAppointmentCommand.java | 15 +++++++- src/main/java/manager/ManagementSystem.java | 13 ++++--- src/main/java/manager/Patient.java | 9 +++-- src/main/java/miscellaneous/Parser.java | 18 ++++++++- src/main/java/miscellaneous/Ui.java | 6 +-- .../command/ListAppointmentCommandTest.java | 2 +- .../command/SortAppointmentCommandTest.java | 38 +++++++++++++++++-- .../java/manager/ManagementSystemTest.java | 30 ++++++++++++++- 8 files changed, 108 insertions(+), 23 deletions(-) diff --git a/src/main/java/command/SortAppointmentCommand.java b/src/main/java/command/SortAppointmentCommand.java index 349c184706..7e3bbd3e25 100644 --- a/src/main/java/command/SortAppointmentCommand.java +++ b/src/main/java/command/SortAppointmentCommand.java @@ -9,10 +9,21 @@ import java.util.List; public class SortAppointmentCommand extends Command { + protected String type; + + public SortAppointmentCommand(String type) { + this.type = type; + } + @Override public void execute (ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException { - List sortedAppointment = manager.sortAppointments(manager.getAppointments()); - ui.showAppointmentList(sortedAppointment); + if (type.equals("date")) { + List sortedApptByDateTime = manager.sortAppointmentsByDateTime(manager.getAppointments()); + ui.showAppointmentList(sortedApptByDateTime); + } else { + List sortedApptById = manager.sortAppointmentsById(manager.getAppointments()); + ui.showAppointmentList(sortedApptById); + } } } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 1ec350571a..617b452c3b 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -146,13 +146,14 @@ public Appointment deleteAppointment(String apptId) { return null; } - public List sortAppointments(List appointments) { - // comparing NRIC and Desc could be useless as there will not have clashing appointments - appointments.sort(Comparator - .comparing(Appointment::getDateTime) - .thenComparing(Appointment::getNric) - .thenComparing(Appointment::getDescription)); + public List sortAppointmentsByDateTime(List appointments) { + appointments.sort(Comparator.comparing(Appointment::getDateTime)); return appointments; } + + public List sortAppointmentsById(List appointments) { + appointments.sort(Comparator.comparing(Appointment::getId)); + return appointments; + } } diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index c63007b43f..317ae30d57 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -47,13 +47,14 @@ public List getMedicalHistory() { @Override public String toString() { return String.format( - "Patient ID: %s\n" + + "Patient NRIC: %s\n" + "Name: %s\n" + "Date of Birth: %s\n" + "Gender: %s\n" + "Address: %s\n" + - "Contact: %s", - id, name, dob, gender, address, contactInfo + "Contact: %s\n" + + "Medical History: %s", + id, name, dob, gender, address, contactInfo, medicalHistory ); } @@ -63,7 +64,7 @@ public String toStringForListView() { : String.join(", ", medicalHistory); return String.format( - "Patient ID: %s\n Name: %s\n Date of Birth: %s\n Gender: %s\n " + + "Patient NRIC: %s\n Name: %s\n Date of Birth: %s\n Gender: %s\n " + "Address: %s\n Contact: %s\n Medical History: %s", id, name, dob, gender, address, contactInfo, history ); diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 4ccd07b988..efe605e30b 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -29,7 +29,7 @@ public class Parser { public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { // Split into two parts to extract the command keyword and its detail String[] parts = userInput.split(" ", 2); - String commandWord = parts[0]; + String commandWord = parts[0].toLowerCase(); switch (commandWord) { case "bye": @@ -53,7 +53,7 @@ public static Command parse(String userInput) throws InvalidInputFormatException case "list-appointment": return new ListAppointmentCommand(); case "sort-appointment": - return new SortAppointmentCommand(); + return new SortAppointmentCommand(parseSortAppointment(userInput)); default: throw new UnknownCommandException("Unknown command. Please try again."); } @@ -189,6 +189,20 @@ public static String parseDeleteAppointment(String input) throws InvalidInputFor return apptId; } + private static String parseSortAppointment(String input) throws InvalidInputFormatException { + String temp = input.replaceFirst("(?i)sort-appointment\\s*", ""); + + switch (temp.toLowerCase()) { + case "bydate": + return "date"; + case "byid": + return "id"; + default: + throw new InvalidInputFormatException("Invalid format! Please use: 'sort-appointment byDate' or " + + "'sort-appointment byId' (case-insensitive)."); + } + } + private static String extractValue(String input, String prefix) { assert prefix != null : "Prefix cannot be null"; diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 7461f15512..221db3c552 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -21,7 +21,7 @@ public static void showLine() { public void showWelcome() { showLine(); - System.out.println("Welcome to ClinicEase v1!"); + System.out.println("Welcome to ClinicEase!"); System.out.println("Type a command, or 'bye' to exit."); showLine(); } @@ -69,7 +69,7 @@ public void showPatientViewed(Patient matchedPatient, String nric) { return; } - System.out.println("-".repeat(43) + "Patient Details" + "-".repeat(43)); + System.out.println("-".repeat(42) + "Patient Details" + "-".repeat(42)); System.out.println(matchedPatient); showLine(); @@ -83,7 +83,7 @@ public void showPatientList(List patients) { return; } - System.out.println("-".repeat(43)+ "Patient Details" + "-".repeat(43)); + System.out.println("-".repeat(42)+ "Patient Details" + "-".repeat(42)); int count = 1; for (Patient p : patients) { diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index 8af16d74f6..6a9df9dd9e 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -41,4 +41,4 @@ void execute_always_requestsAppointmentsFromManager() { assertEquals(3, manager.getAppointments().size(), "Size of appointment does not match"); } -} \ No newline at end of file +} diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index 88f5d991ca..9d6b3c237f 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -13,7 +13,9 @@ import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + class SortAppointmentCommandTest { private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); @@ -38,7 +40,7 @@ void execute_appointmentsWithDifferentDateTime_sortsByDateInAscendingOrder() thr manager.addAppointment(appointments.get(1)); manager.addAppointment(appointments.get(2)); - new SortAppointmentCommand().execute(manager, ui); + new SortAppointmentCommand("date").execute(manager, ui); List sortedAppointments = manager.getAppointments(); assertEquals(3, sortedAppointments.size(), "Size of appointment does not match"); @@ -47,12 +49,42 @@ void execute_appointmentsWithDifferentDateTime_sortsByDateInAscendingOrder() thr assertEquals("CT scan", sortedAppointments.get(2).getDescription()); } + @Test + void execute_appointmentsFirstSortedByDateThenId_sortsByIdInAscendingOrder() throws DuplicatePatientIDException, + UnloadedStorageException { + ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + Ui ui = new Ui(); + + LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); + LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); + LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); + + + List appointments = List.of( + new Appointment("S1234567D", dateTime1, "Checkup"), + new Appointment("S2345678D", dateTime2, "CT scan"), + new Appointment("S3456789D", dateTime3, "Consultation") + ); + manager.addAppointment(appointments.get(0)); + manager.addAppointment(appointments.get(1)); + manager.addAppointment(appointments.get(2)); + + new SortAppointmentCommand("date").execute(manager, ui); + new SortAppointmentCommand("id").execute(manager, ui); + List sortedAppointments = manager.getAppointments(); + + assertEquals(3, sortedAppointments.size(), "Size of appointment does not match"); + assertEquals("Checkup", sortedAppointments.get(0).getDescription()); + assertEquals("CT scan", sortedAppointments.get(1).getDescription()); + assertEquals("Consultation", sortedAppointments.get(2).getDescription()); + } + @Test void execute_emptyList_expectEmptyList() throws DuplicatePatientIDException, UnloadedStorageException { ManagementSystem manager = new ManagementSystem(new ArrayList<>()); Ui ui = new Ui(); - new SortAppointmentCommand().execute(manager, ui); + new SortAppointmentCommand("date").execute(manager, ui); assertTrue(manager.getAppointments().isEmpty()); } } diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 1664be6f3b..75c959a115 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -157,7 +157,7 @@ void deleteAppointment_nonExistentId_expectNullReturned() { } @Test - void sortAppointments_sortByDateTime_expectSortedAppointments() { + void sortAppointmentsByDateTime_sortByDateTime_appointmentsSortedByDateTime() { ManagementSystem manager = new ManagementSystem(new ArrayList<>()); List appointments = new ArrayList<>(); @@ -174,10 +174,36 @@ void sortAppointments_sortByDateTime_expectSortedAppointments() { Appointment appointment3 = new Appointment("S7891234D", appointmentTime3, "Consultation"); appointments.add(appointment3); - manager.sortAppointments(appointments); + manager.sortAppointmentsByDateTime(appointments); assertEquals("CT scan", appointments.get(0).getDescription()); assertEquals("Consultation", appointments.get(1).getDescription()); assertEquals("Checkup", appointments.get(2).getDescription()); } + + @Test + void sortAppointmentsById_sortById_appointmentsSortedById() { + ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + List appointments = new ArrayList<>(); + + LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); + LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-24 1200", DATE_TIME_FORMAT); + LocalDateTime appointmentTime3 = LocalDateTime.parse("2025-03-25 1000", DATE_TIME_FORMAT); + + Appointment appointment1 = new Appointment("S1234567D", appointmentTime1, "Checkup"); + appointments.add(appointment1); + + Appointment appointment2 = new Appointment("S4567890D", appointmentTime2, "CT scan"); + appointments.add(appointment2); + + Appointment appointment3 = new Appointment("S7891234D", appointmentTime3, "Consultation"); + appointments.add(appointment3); + + manager.sortAppointmentsByDateTime(appointments); + manager.sortAppointmentsById(appointments); + + assertEquals("Checkup", appointments.get(0).getDescription()); + assertEquals("CT scan", appointments.get(1).getDescription()); + assertEquals("Consultation", appointments.get(2).getDescription()); + } } From d9daf3ac99aa4a841678ae471b94171fe0aa4803 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sat, 29 Mar 2025 03:27:32 +0800 Subject: [PATCH 060/203] Created storage system for appointments --- data/appointment_data.txt | 0 src/main/java/ClinicEase.java | 21 ++-- .../java/command/AddAppointmentCommand.java | 3 +- .../command/DeleteAppointmentCommand.java | 3 +- src/main/java/manager/Appointment.java | 21 ++++ src/main/java/manager/ManagementSystem.java | 12 ++- src/main/java/miscellaneous/Parser.java | 27 ++++- src/main/java/miscellaneous/Ui.java | 2 +- src/main/java/storage/Storage.java | 100 ++++++++++++++---- 9 files changed, 152 insertions(+), 37 deletions(-) create mode 100644 data/appointment_data.txt diff --git a/data/appointment_data.txt b/data/appointment_data.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 3c6884f1e2..368b7510b6 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,15 +1,17 @@ import command.Command; - import exception.DuplicatePatientIDException; import exception.InvalidInputFormatException; - import exception.UnknownCommandException; import exception.UnloadedStorageException; import manager.ManagementSystem; +import manager.Patient; +import manager.Appointment; import miscellaneous.Parser; import miscellaneous.Ui; import storage.Storage; +import java.util.List; + public class ClinicEase { private ManagementSystem manager; @@ -19,15 +21,16 @@ public class ClinicEase { public ClinicEase(String filePath) { assert filePath != null : "File path cannot be null"; this.ui = new Ui(); - this.storage= new Storage(filePath); + this.storage = new Storage(filePath); try { - this.manager = new ManagementSystem(Storage.loadPatients()); + List patients = Storage.loadPatients(); + List appointments = Storage.loadAppointments(); + this.manager = new ManagementSystem(patients, appointments); } catch (UnloadedStorageException e) { ui.showError("Could not load data: " + e.getMessage()); - this.manager = new ManagementSystem(null); + this.manager = new ManagementSystem(null, null); } - } public void run() { @@ -40,8 +43,8 @@ public void run() { Command command = Parser.parse(input); command.execute(manager, ui); running = !command.isExit(); - } catch (InvalidInputFormatException | UnknownCommandException | DuplicatePatientIDException | - UnloadedStorageException e) { + } catch (InvalidInputFormatException | UnknownCommandException | + DuplicatePatientIDException | UnloadedStorageException e) { ui.showError(e.getMessage()); } } @@ -50,4 +53,4 @@ public void run() { public static void main(String[] args) { new ClinicEase("data").run(); } -} +} \ No newline at end of file diff --git a/src/main/java/command/AddAppointmentCommand.java b/src/main/java/command/AddAppointmentCommand.java index 37ffc90af3..4e8d9f5e01 100644 --- a/src/main/java/command/AddAppointmentCommand.java +++ b/src/main/java/command/AddAppointmentCommand.java @@ -1,5 +1,6 @@ package command; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; import miscellaneous.Ui; @@ -13,7 +14,7 @@ public AddAppointmentCommand(Appointment appointment) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { manager.addAppointment(appointment); ui.showAppointmentAdded(manager.getAppointments()); } diff --git a/src/main/java/command/DeleteAppointmentCommand.java b/src/main/java/command/DeleteAppointmentCommand.java index 5832ca373d..831eaa0475 100644 --- a/src/main/java/command/DeleteAppointmentCommand.java +++ b/src/main/java/command/DeleteAppointmentCommand.java @@ -1,5 +1,6 @@ package command; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; import miscellaneous.Ui; @@ -12,7 +13,7 @@ public DeleteAppointmentCommand(String apptId) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Appointment removedAppointment = manager.deleteAppointment(apptId); ui.showAppointmentDeleted(manager.getAppointments(), removedAppointment, apptId); } diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index 9ce0b5df15..6a8168d4f7 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -5,6 +5,8 @@ import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import static java.lang.Integer.parseInt; + public class Appointment { public static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); @@ -22,10 +24,21 @@ public Appointment(String nric, LocalDateTime dateTime, String description) { this.description = description; } + public Appointment(String id, String nric, LocalDateTime dateTime, String description) { + this.id = id; + this.nric = nric; + this.dateTime = dateTime; + this.description = description; + } + public String getId() { return id; } + public static void setRunningId(int newId) { + runningId = newId; + } + public String getNric() { return nric; } @@ -42,6 +55,10 @@ public LocalDateTime getDateTime() { return dateTime; } + public static int getRunningId() { + return runningId; + } + public String getDescription() { return description; } @@ -50,4 +67,8 @@ public String getDescription() { public String toString() { return "[" + id + "] - " + nric + " - " + dateTime.format(DATE_TIME_FORMAT) + " - " + description; } + + public String toFileFormat() { + return id.substring(1) + "|" + this.nric + "|" + dateTime.format(DATE_TIME_FORMAT) + "|" + this.description; + } } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 005a03ccfa..96f90c84d4 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -12,9 +12,9 @@ public class ManagementSystem { private final List appointments; private final List patients; - public ManagementSystem(List list) { - appointments = new ArrayList<>(); - patients = list; + public ManagementSystem(List loadedPatients, List loadedAppointments) { + appointments = loadedAppointments; + patients = loadedPatients; } public List getPatients() { @@ -188,14 +188,16 @@ private List findPatientsByName(String name) { } //@@author chwenyee - public void addAppointment(Appointment appointment) { + public void addAppointment(Appointment appointment) throws UnloadedStorageException { appointments.add(appointment); + Storage.saveAppointments(appointments); } - public Appointment deleteAppointment(String apptId) { + public Appointment deleteAppointment(String apptId) throws UnloadedStorageException { for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { appointments.remove(appointment); + Storage.saveAppointments(appointments); return appointment; } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index fb1eb8d55a..6f20517a23 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -280,7 +280,7 @@ private static String[] parseEditHistory(String input) throws InvalidInputFormat return new String[]{nric, oldHistory, newHistory}; } - public static Patient parsePatient(String line) { + public static Patient parseLoadPatient(String line) { String[] tokens = line.split("\\|"); if (tokens.length < 7) { return null; @@ -297,4 +297,29 @@ public static Patient parsePatient(String line) { return new Patient(id, name, dob, gender, address, contact, medHistory); } + public static Appointment parseAppointment(String line) { + // Skip header line like "countId:103" + if (line.startsWith("countId:")) { + return null; + } + + String[] tokens = line.split("\\|"); + if (tokens.length < 4) return null; + + try { + String id = tokens[0].trim(); + String nric = tokens[1].trim(); + String dateTimeStr = tokens[2].trim(); + String desc = tokens[3].trim(); + + LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, Appointment.DATE_TIME_FORMAT); + Appointment appointment = new Appointment("A" + id, nric, dateTime, desc); + + return appointment; + } catch (Exception e) { + return null; + } + } + + } diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 42dee04779..4507667f7c 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -109,7 +109,7 @@ public void showAppointmentAdded(List appointments) { Appointment currentAppt = appointments.get(appointments.size() - 1); showLine(); - System.out.println("Appointment added for NRIC: " + currentAppt.getId() + " on " + currentAppt.getDate() + System.out.println("Appointment added for NRIC: " + currentAppt.getNric() + " Entry number: " + currentAppt.getId() + " on " + currentAppt.getDate() + " at " + currentAppt.getTime() + "."); System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); showLine(); diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 63b2d18244..622b54d759 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,46 +1,44 @@ package storage; import exception.UnloadedStorageException; +import manager.Appointment; +import manager.Patient; +import miscellaneous.Parser; +import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; -import java.io.BufferedWriter; import java.io.IOException; -import java.util.List; import java.util.ArrayList; +import java.util.List; import java.util.Scanner; -import manager.Patient; -import miscellaneous.Parser; - public class Storage { private static String directoryPath; private static String patientFilePath; + private static String appointmentFilePath; public Storage(String directory) { directoryPath = directory; patientFilePath = directory + File.separator + "patient_data.txt"; + appointmentFilePath = directory + File.separator + "appointment_data.txt"; } public static void savePatients(List patientList) throws UnloadedStorageException { - try { - if (directoryPath == null || patientFilePath == null) { - throw new UnloadedStorageException("Storage not initialized with a directory!"); - } - - File dir = new File(directoryPath); - if (!dir.exists()) { - dir.mkdirs(); - } + if (directoryPath == null || patientFilePath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } - BufferedWriter writer = new BufferedWriter(new FileWriter(patientFilePath)); + File dir = new File(directoryPath); + if (!dir.exists()) { + dir.mkdirs(); + } + try (BufferedWriter writer = new BufferedWriter(new FileWriter(patientFilePath))) { for (Patient patient : patientList) { writer.write(patient.toFileFormat()); writer.newLine(); } - - writer.close(); } catch (IOException e) { throw new UnloadedStorageException("Unable to save the patient!"); } @@ -56,7 +54,7 @@ public static List loadPatients() throws UnloadedStorageException { try (Scanner scanner = new Scanner(file)) { while (scanner.hasNextLine()) { String line = scanner.nextLine(); - Patient patient = Parser.parsePatient(line); + Patient patient = Parser.parseLoadPatient(line); if (patient != null) { patients.add(patient); } @@ -67,4 +65,68 @@ public static List loadPatients() throws UnloadedStorageException { return patients; } -} + + public static void saveAppointments(List appointmentList) throws UnloadedStorageException { + if (directoryPath == null || appointmentFilePath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } + + File dir = new File(directoryPath); + if (!dir.exists()) { + dir.mkdirs(); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(appointmentFilePath))) { + writer.write("countId:" + Appointment.getRunningId()); + writer.newLine(); + + for (Appointment appointment : appointmentList) { + writer.write(appointment.toFileFormat()); + writer.newLine(); + } + } catch (IOException e) { + throw new UnloadedStorageException("Unable to save the appointment!"); + } + } + + + public static List loadAppointments() throws UnloadedStorageException { + List appointments = new ArrayList<>(); + File file = new File(appointmentFilePath); + + if (!file.exists()) { + return appointments; + } + + try (Scanner scanner = new Scanner(file)) { + int countId = 100; + + if (scanner.hasNextLine()) { + String firstLine = scanner.nextLine(); + if (firstLine.startsWith("countId:")) { + String[] parts = firstLine.split(":"); + if (parts.length == 2) { + countId = Integer.parseInt(parts[1].trim()); + } + } + } + + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + if (!line.trim().isEmpty()) { + Appointment appointment = Parser.parseAppointment(line); + if (appointment != null) { + appointments.add(appointment); + } + } + } + + Appointment.setRunningId(countId); + + } catch (Exception e) { + throw new UnloadedStorageException("Unable to load appointment data!"); + } + + return appointments; + } +} From 0e533750e2f1a0f1e199f344c63093daddab096a Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Sat, 29 Mar 2025 12:09:38 +0800 Subject: [PATCH 061/203] Added mark and unmark appointments function --- .../java/command/MarkApppointmentCommand.java | 19 ++++++++++++++ .../command/UnmarkAppointmentCommand.java | 19 ++++++++++++++ src/main/java/manager/Appointment.java | 14 ++++++++++ src/main/java/manager/ManagementSystem.java | 21 +++++++++++++++ src/main/java/miscellaneous/Parser.java | 22 ++++++++++++++++ src/main/java/miscellaneous/Ui.java | 26 +++++++++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 src/main/java/command/MarkApppointmentCommand.java create mode 100644 src/main/java/command/UnmarkAppointmentCommand.java diff --git a/src/main/java/command/MarkApppointmentCommand.java b/src/main/java/command/MarkApppointmentCommand.java new file mode 100644 index 0000000000..fafa4bbf7c --- /dev/null +++ b/src/main/java/command/MarkApppointmentCommand.java @@ -0,0 +1,19 @@ +package command; + +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class MarkApppointmentCommand extends Command { + protected String apptId; + + public MarkApppointmentCommand(String apptId) { + this.apptId = apptId; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + Appointment appointment = manager.markAppointment(apptId); + ui.showAppointmentMarked(manager.getAppointments(), appointment, apptId); + } +} diff --git a/src/main/java/command/UnmarkAppointmentCommand.java b/src/main/java/command/UnmarkAppointmentCommand.java new file mode 100644 index 0000000000..815995cc95 --- /dev/null +++ b/src/main/java/command/UnmarkAppointmentCommand.java @@ -0,0 +1,19 @@ +package command; + +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class UnmarkAppointmentCommand extends Command { + protected String apptId; + + public UnmarkAppointmentCommand(String apptId) { + this.apptId = apptId; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + Appointment appointment = manager.unmarkAppointment(apptId); + ui.showAppointmentUnmarked(manager.getAppointments(), appointment, apptId); + } +} diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index 9ce0b5df15..9a2e77e68b 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -14,12 +14,14 @@ public class Appointment { private final String nric; private final LocalDateTime dateTime; private final String description; + private boolean isDone; public Appointment(String nric, LocalDateTime dateTime, String description) { this.id = "A" + runningId++; this.nric = nric; this.dateTime = dateTime; this.description = description; + this.isDone = false; } public String getId() { @@ -46,6 +48,18 @@ public String getDescription() { return description; } + public boolean isDone() { + return isDone; + } + + public void markAsDone() { + this.isDone = true; + } + + public void unmarkAsDone() { + this.isDone = false; + } + @Override public String toString() { return "[" + id + "] - " + nric + " - " + dateTime.format(DATE_TIME_FORMAT) + " - " + description; diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 005a03ccfa..fe98efdf7b 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -201,4 +201,25 @@ public Appointment deleteAppointment(String apptId) { } return null; } + + public Appointment markAppointment(String apptId) { + for (Appointment appointment : appointments) { + if (appointment.getId().equalsIgnoreCase(apptId)) { + appointment.markAsDone(); + return appointment; + } + } + return null; + } + + public Appointment unmarkAppointment(String apptId) { + for (Appointment appointment : appointments) { + if (appointment.getId().equalsIgnoreCase(apptId)) { + appointment.unmarkAsDone(); + return appointment; + } + } + return null; + } + } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index fb1eb8d55a..8d7fa57d30 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -14,6 +14,8 @@ import command.StoreMedHistoryCommand; import command.ViewPatientCommand; import command.ViewMedHistoryCommand; +import command.MarkApppointmentCommand; +import command.UnmarkAppointmentCommand; import exception.InvalidInputFormatException; import exception.UnknownCommandException; import manager.Appointment; @@ -58,6 +60,10 @@ public static Command parse(String userInput) throws InvalidInputFormatException return new EditPatientCommand(parseEditPatient(userInput)); case "edit-history": return new EditPatientHistoryCommand(parseEditHistory(userInput)); + case "mark-appointment": + return new MarkApppointmentCommand(parseMarkAppointment(userInput)); + case "unmark-appointment": + return new UnmarkAppointmentCommand(parseUnmarkAppointment(userInput)); default: throw new UnknownCommandException("Unknown command. Please try again."); } @@ -193,6 +199,22 @@ public static String parseDeleteAppointment(String input) throws InvalidInputFor return apptId; } + private static String parseMarkAppointment(String input) throws InvalidInputFormatException { + String apptId = input.replaceFirst("(?i)mark-appointment\\s*", "").trim(); + if (apptId.isEmpty()) { + throw new InvalidInputFormatException("Invalid format! Use: mark-appointment APPOINTMENT_ID"); + } + return apptId; + } + + private static String parseUnmarkAppointment(String input) throws InvalidInputFormatException { + String apptId = input.replaceFirst("(?i)unmark-appointment\\s*", "").trim(); + if (apptId.isEmpty()) { + throw new InvalidInputFormatException("Invalid format! Use: unmark-appointment APPOINTMENT_ID"); + } + return apptId; + } + private static String extractValue(String input, String prefix) { assert prefix != null : "Prefix cannot be null"; diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 42dee04779..4fcd770414 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -129,6 +129,32 @@ public void showAppointmentDeleted(List appointments, Appointment r showLine(); } + public void showAppointmentMarked(List appointments, Appointment markedAppointment, String apptId) { + if (markedAppointment == null) { + showLine(); + System.out.println("No appointment found with ID: " + apptId + "."); + showLine(); + return; + } + + showLine(); + System.out.println("Appointment " + apptId + " is marked successfully."); + showLine(); + } + + public void showAppointmentUnmarked(List appointments, Appointment markedAppointment, String apptId) { + if (markedAppointment == null) { + showLine(); + System.out.println("No appointment found with ID: " + apptId + "."); + showLine(); + return; + } + + showLine(); + System.out.println("Appointment " + apptId + " is unmarked successfully."); + showLine(); + } + public void showAppointmentList(List appointments) { if (appointments.isEmpty()) { showLine(); From c49c580c7c93ce016539dab7c4fd8419a2a8c6b6 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Sat, 29 Mar 2025 12:33:42 +0800 Subject: [PATCH 062/203] Added function to find appointment by nric --- .../java/command/FindAppointmentCommand.java | 19 +++++++++++++++++++ src/main/java/manager/ManagementSystem.java | 9 +++++++++ src/main/java/miscellaneous/Parser.java | 11 +++++++++++ src/main/java/miscellaneous/Ui.java | 7 +++++++ 4 files changed, 46 insertions(+) create mode 100644 src/main/java/command/FindAppointmentCommand.java diff --git a/src/main/java/command/FindAppointmentCommand.java b/src/main/java/command/FindAppointmentCommand.java new file mode 100644 index 0000000000..47c46b06ff --- /dev/null +++ b/src/main/java/command/FindAppointmentCommand.java @@ -0,0 +1,19 @@ +package command; + +import manager.Appointment; +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class FindAppointmentCommand extends Command { + protected String nric; + + public FindAppointmentCommand(String nric) { + this.nric = nric; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) { + Appointment foundAppointment = manager.findAppointmentByNric(nric); + ui.showAppointmentFound(foundAppointment, nric); + } +} diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index fe98efdf7b..f8aeb54ecd 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -222,4 +222,13 @@ public Appointment unmarkAppointment(String apptId) { return null; } + public Appointment findAppointmentByNric(String nric) { + for (Appointment appt : appointments) { + if (appt.getNric().equals(nric)) { + return appt; + } + } + return null; + } + } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 8d7fa57d30..8abd1e1b51 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -16,6 +16,7 @@ import command.ViewMedHistoryCommand; import command.MarkApppointmentCommand; import command.UnmarkAppointmentCommand; +import command.FindAppointmentCommand; import exception.InvalidInputFormatException; import exception.UnknownCommandException; import manager.Appointment; @@ -64,6 +65,8 @@ public static Command parse(String userInput) throws InvalidInputFormatException return new MarkApppointmentCommand(parseMarkAppointment(userInput)); case "unmark-appointment": return new UnmarkAppointmentCommand(parseUnmarkAppointment(userInput)); + case "find-appointment": + return new FindAppointmentCommand(parseFindAppointment(userInput)); default: throw new UnknownCommandException("Unknown command. Please try again."); } @@ -215,6 +218,14 @@ private static String parseUnmarkAppointment(String input) throws InvalidInputFo return apptId; } + private static String parseFindAppointment(String input) throws InvalidInputFormatException { + String apptId = input.replaceFirst("(?i)find-appointment\\s*", "").trim(); + if (apptId.isEmpty()) { + throw new InvalidInputFormatException("Invalid format! Use: find-appointment APPOINTMENT_ID"); + } + return apptId; + } + private static String extractValue(String input, String prefix) { assert prefix != null : "Prefix cannot be null"; diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 4fcd770414..fe458b77cd 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -172,4 +172,11 @@ public void showAppointmentList(List appointments) { showLine(); } + public void showAppointmentFound(Appointment appointment, String nric) { + if (appointment != null) { + System.out.println("Appointment found for NRIC " + nric + ": " + appointment); + } else { + System.out.println("No appointment found for NRIC " + nric); + } + } } From 203cc1c5e31d08da3a21f428519f69b1eec6befc Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Sat, 29 Mar 2025 12:42:48 +0800 Subject: [PATCH 063/203] Added junit tests for mark unmark and find appointments --- .../java/manager/ManagementSystemTest.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index eb5936760e..e2b372a38e 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -233,4 +233,58 @@ void deleteAppointment_nonExistentId_expectNullReturned() { assertNull(removedAppointment, "Should return null"); } + @Test + void markAppointment_validInput_expectAppointmentMarked() { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + LocalDateTime appointmentTime = LocalDateTime.parse("2025-04-10 1500", DATE_TIME_FORMAT); + Appointment appointment = new Appointment("S9876543Z", appointmentTime, "Dental Checkup"); + + manager.addAppointment(appointment); + manager.markAppointment(appointment.getId()); + + assertTrue(manager.getAppointments().get(0).isDone(), "Appointment should be marked"); + } + + @Test + void unmarkAppointment_validInput_expectAppointmentUnmarked() { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + LocalDateTime appointmentTime = LocalDateTime.parse("2025-05-15 1030", DATE_TIME_FORMAT); + Appointment appointment = new Appointment("S8765432Y", appointmentTime, "Eye Examination"); + + manager.addAppointment(appointment); + manager.markAppointment(appointment.getId()); + manager.unmarkAppointment(appointment.getId()); + + assertFalse(manager.getAppointments().get(0).isDone(), "Appointment should be unmarked"); + } + + @Test + void findAppointment_existingAppointment_expectAppointmentFound() { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + LocalDateTime appointmentTime = LocalDateTime.parse("2025-06-20 0900", DATE_TIME_FORMAT); + Appointment appointment = new Appointment("S7654321X", appointmentTime, "General Consultation"); + + manager.addAppointment(appointment); + Appointment foundAppointment = manager.findAppointmentByNric(appointment.getNric()); + + assertNotNull(foundAppointment, "Appointment should be found"); + assertEquals(appointment.getId(), foundAppointment.getId(), "Appointment ID should match"); + } + + @Test + void findAppointment_nonExistentAppointment_expectNullReturned() { + List emptyList = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyList); + + Appointment foundAppointment = manager.findAppointmentByNric("A999"); + + assertNull(foundAppointment, "Non-existent appointment should return null"); + } + } From 06556dbac0b7d839129682b0eb7236e5b6d92253 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 29 Mar 2025 13:24:56 +0800 Subject: [PATCH 064/203] Resolved remaining conflict. --- src/test/java/manager/ManagementSystemTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 1036a0f77b..4c0fcbcfab 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -234,7 +234,6 @@ void deleteAppointment_nonExistentId_expectNullReturned() { } @Test -<<<<<<< HEAD void sortAppointmentsByDateTime_sortByDateTime_appointmentsSortedByDateTime() { ManagementSystem manager = new ManagementSystem(new ArrayList<>()); List appointments = new ArrayList<>(); @@ -284,7 +283,8 @@ void sortAppointmentsById_sortById_appointmentsSortedById() { assertEquals("CT scan", appointments.get(1).getDescription()); assertEquals("Consultation", appointments.get(2).getDescription()); } -======= + + @Test void markAppointment_validInput_expectAppointmentMarked() { List emptyList = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(emptyList); @@ -337,6 +337,4 @@ void findAppointment_nonExistentAppointment_expectNullReturned() { assertNull(foundAppointment, "Non-existent appointment should return null"); } - ->>>>>>> fix3 } From d80a606b46bc85126b455aa08bef1b14d551308c Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 29 Mar 2025 14:13:16 +0800 Subject: [PATCH 065/203] Added output format for appointment date and time. --- src/main/java/manager/Appointment.java | 10 ++++++++-- src/main/java/manager/Patient.java | 4 ++-- src/main/java/miscellaneous/Parser.java | 12 ++++++------ src/main/java/miscellaneous/Ui.java | 8 +++++++- src/test/java/miscellaneous/ParserTest.java | 4 ++-- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index 9a2e77e68b..dd0345845e 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -7,7 +7,8 @@ public class Appointment { - public static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + public static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + public static final DateTimeFormatter OUTPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd h:mm a"); private static int runningId = 100; private final String id; @@ -60,8 +61,13 @@ public void unmarkAsDone() { this.isDone = false; } + public String getStatusIcon() { + return (isDone ? "X" : " "); + } + @Override public String toString() { - return "[" + id + "] - " + nric + " - " + dateTime.format(DATE_TIME_FORMAT) + " - " + description; + return "[" + id + "]" + "[" + this.getStatusIcon() + "]" + " - " + + nric + " - " + dateTime.format(OUTPUT_FORMAT) + " - " + description; } } diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 6544bf6c22..d3cc60c449 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -67,7 +67,7 @@ public void setAddress(String address) { @Override public String toString() { return String.format( - "Patient ID: %s\n" + + "Patient NRIC: %s\n" + "Name: %s\n" + "Date of Birth: %s\n" + "Gender: %s\n" + @@ -80,7 +80,7 @@ public String toString() { public String toStringForListView() { String result = String.format( - "Patient ID: %s\n " + + "Patient NRIC: %s\n " + "Name: %s\n " + "Date of Birth: %s\n " + "Gender: %s\n " + diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index c086badf4f..847988fc1c 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -29,7 +29,7 @@ import java.util.Arrays; import java.util.List; -import static manager.Appointment.DATE_TIME_FORMAT; +import static manager.Appointment.INPUT_FORMAT; public class Parser { public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { @@ -188,7 +188,7 @@ public static Appointment parseAddAppointment(String input) throws InvalidInputF try { String combined = date.trim() + " " + time.trim(); - LocalDateTime dateTime = LocalDateTime.parse(combined, DATE_TIME_FORMAT); + LocalDateTime dateTime = LocalDateTime.parse(combined, INPUT_FORMAT); return new Appointment(nric.trim(), dateTime, desc.trim()); } catch (DateTimeParseException e) { throw new InvalidInputFormatException("Invalid date/time format. Please use: dt/yyyy-MM-dd and t/HHmm"); @@ -236,11 +236,11 @@ private static String parseUnmarkAppointment(String input) throws InvalidInputFo } private static String parseFindAppointment(String input) throws InvalidInputFormatException { - String apptId = input.replaceFirst("(?i)find-appointment\\s*", "").trim(); - if (apptId.isEmpty()) { - throw new InvalidInputFormatException("Invalid format! Use: find-appointment APPOINTMENT_ID"); + String patientId = input.replaceFirst("(?i)find-appointment\\s*", "").trim(); + if (patientId.isEmpty()) { + throw new InvalidInputFormatException("Invalid format! Use: find-appointment PATIENT_NRIC"); } - return apptId; + return patientId; } private static String extractValue(String input, String prefix) { diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 7cfddfc739..43daa8026e 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -3,11 +3,13 @@ import manager.Appointment; import manager.Patient; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Scanner; public class Ui { public static final String DIVIDER = "-".repeat(100); + public static final DateTimeFormatter OUTPUT_TIME_FORMAT = DateTimeFormatter.ofPattern("h:mm a"); private final Scanner sc; @@ -111,7 +113,7 @@ public void showAppointmentAdded(List appointments) { showLine(); System.out.println("Appointment added for NRIC: " + currentAppt.getNric() + " on " + currentAppt.getDate() - + " at " + currentAppt.getTime() + "."); + + " at " + currentAppt.getTime().format(OUTPUT_TIME_FORMAT) + "."); System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); showLine(); } @@ -175,9 +177,13 @@ public void showAppointmentList(List appointments) { public void showAppointmentFound(Appointment appointment, String nric) { if (appointment != null) { + showLine(); System.out.println("Appointment found for NRIC " + nric + ": " + appointment); + showLine(); } else { + showLine(); System.out.println("No appointment found for NRIC " + nric); + showLine(); } } } diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index 71626c2a62..f56000c3e2 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; -import static manager.Appointment.DATE_TIME_FORMAT; +import static manager.Appointment.INPUT_FORMAT; import static miscellaneous.Parser.parse; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -30,7 +30,7 @@ void parseAddAppointment_validInput_returnsAppointment() throws Exception { assertNotNull(appointment); assertEquals("S1234567D", appointment.getNric()); - assertEquals(LocalDateTime.parse("2025-03-20 1430", DATE_TIME_FORMAT), appointment.getDateTime()); + assertEquals(LocalDateTime.parse("2025-03-20 1430", INPUT_FORMAT), appointment.getDateTime()); assertEquals("Checkup", appointment.getDescription()); } From 9cfda7573a060fb6308a9857048c133b876fc9f1 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sun, 30 Mar 2025 00:08:20 +0800 Subject: [PATCH 066/203] Linked Patient Class and Appointment Class together. Patient will now also store his/her appointments. --- src/main/java/ClinicEase.java | 2 +- .../java/command/AddAppointmentCommand.java | 2 +- src/main/java/manager/ManagementSystem.java | 18 ++++-- src/main/java/manager/Patient.java | 59 ++++++++++++++++- src/main/java/miscellaneous/Parser.java | 4 +- src/main/java/miscellaneous/Ui.java | 17 +++-- .../command/AddAppointmentCommandTest.java | 33 ++++++++-- .../command/DeleteAppointmentCommandTest.java | 28 +++++++-- .../command/ListAppointmentCommandTest.java | 37 +++++++++-- .../command/SortAppointmentCommandTest.java | 63 +++++++++++-------- .../java/manager/ManagementSystemTest.java | 36 +++++++---- 11 files changed, 231 insertions(+), 68 deletions(-) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 3c6884f1e2..fa7f54b6e5 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -41,7 +41,7 @@ public void run() { command.execute(manager, ui); running = !command.isExit(); } catch (InvalidInputFormatException | UnknownCommandException | DuplicatePatientIDException | - UnloadedStorageException e) { + UnloadedStorageException | IllegalArgumentException e) { ui.showError(e.getMessage()); } } diff --git a/src/main/java/command/AddAppointmentCommand.java b/src/main/java/command/AddAppointmentCommand.java index 37ffc90af3..862d725a29 100644 --- a/src/main/java/command/AddAppointmentCommand.java +++ b/src/main/java/command/AddAppointmentCommand.java @@ -13,7 +13,7 @@ public AddAppointmentCommand(Appointment appointment) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws IllegalArgumentException { manager.addAppointment(appointment); ui.showAppointmentAdded(manager.getAppointments()); } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 4b85f746c5..f0bbe806be 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -65,6 +65,7 @@ public Patient viewPatient(String nric) { return matchedPatient; } + //@@author jyukuan public void editPatient(String nric, String newName, String newDob, String newGender, String newAddress, String newPhone) { Patient patient = findPatientByNric(nric); @@ -90,8 +91,6 @@ public void editPatient(String nric, String newName, String newDob, String newGe System.out.println("Patient with NRIC " + nric + " updated successfully."); } - - //@@author jyukuan public void storeMedicalHistory(String name, String nric, String medHistory) { Patient existingPatient = findPatientByNric(nric); @@ -189,14 +188,24 @@ private List findPatientsByName(String name) { } //@@author chwenyee - public void addAppointment(Appointment appointment) { + public void addAppointment(Appointment appointment) throws IllegalArgumentException { + Patient patient = findPatientByNric(appointment.getNric()); + if (patient == null) { + throw new IllegalArgumentException("Patient with NRIC: " + appointment.getNric() + " not found"); + } + appointments.add(appointment); + patient.addAppointment(appointment); } public Appointment deleteAppointment(String apptId) { for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { - appointments.remove(appointment); + Patient patient = findPatientByNric(appointment.getNric()); + if (patient != null) { + appointments.remove(appointment); + patient.deleteAppointment(apptId); + } return appointment; } } @@ -243,4 +252,5 @@ public Appointment findAppointmentByNric(String nric) { } return null; } + } diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index d3cc60c449..b6af35fcf3 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -12,6 +12,7 @@ public class Patient { private String gender; private String address; private final List medicalHistory; + private final List appointments; public Patient(String id, String name, String dob, String gender, String address, String contactInfo, List medicalHistory) { @@ -22,6 +23,7 @@ public Patient(String id, String name, String dob, String gender, String address this.address = address; this.contactInfo = contactInfo; this.medicalHistory = new ArrayList<>(medicalHistory); + this.appointments = new ArrayList<>(); } public String getId() { @@ -64,9 +66,33 @@ public void setAddress(String address) { this.address = address; } + public List getAppointments() { + return appointments; + } + + public void addAppointment(Appointment appointment) { + appointments.add(appointment); + } + + public void deleteAppointment(String apptId) { + for (Appointment appt : appointments) { + if (appt.getId().equals(apptId)) { + appointments.remove(appt); + break; + } + } + } + @Override public String toString() { - return String.format( + String formattedMedicalHistory; + if (medicalHistory.isEmpty()) { + formattedMedicalHistory = "None"; + } else { + formattedMedicalHistory = String.join(", ", medicalHistory); + } + + String result = String.format( "Patient NRIC: %s\n" + "Name: %s\n" + "Date of Birth: %s\n" + @@ -74,8 +100,23 @@ public String toString() { "Address: %s\n" + "Contact: %s\n" + "Medical History: %s", - id, name, dob, gender, address, contactInfo, medicalHistory + id, name, dob, gender, address, contactInfo, formattedMedicalHistory ); + + if (appointments.isEmpty()) { + result += "\nAppointments: None"; + } else { + result += "\nAppointments:"; + for (Appointment appt : appointments) { + result += String.format( + "\n- [%s][%s]: %s (%s)", + appt.getId(), + appt.getStatusIcon(), + appt.getDateTime().format(Appointment.OUTPUT_FORMAT), + appt.getDescription()); + } + } + return result; } public String toStringForListView() { @@ -97,6 +138,20 @@ public String toStringForListView() { result += "\n - " + h; } } + + if (appointments.isEmpty()) { + result += "\n Appointments: None"; + } else { + result += "\n Appointments:"; + for (Appointment appt : appointments) { + result += String.format( + "\n - [%s][%s]: %s (%s)", + appt.getId(), + appt.getStatusIcon(), + appt.getDateTime().format(Appointment.OUTPUT_FORMAT), + appt.getDescription()); + } + } return result; } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 847988fc1c..dbe7163f89 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -104,7 +104,7 @@ private static Patient parseAddPatient(String input) throws InvalidInputFormatEx private static String parseDeletePatient(String input) throws InvalidInputFormatException { if (input.length() < 15) { - throw new InvalidInputFormatException("Invalid command format. Use: delete-patient [NRIC]"); + throw new InvalidInputFormatException("Invalid command format. Use: delete-patient NRIC"); } String nric = input.substring(15).trim(); @@ -113,7 +113,7 @@ private static String parseDeletePatient(String input) throws InvalidInputFormat private static String parseViewPatient(String input) throws InvalidInputFormatException { if (input.length() < 13) { - throw new InvalidInputFormatException("Invalid command format. Use: view-patient [NRIC]"); + throw new InvalidInputFormatException("Invalid command format. Use: view-patient NRIC"); } String nric = input.substring(13).trim(); // Extract and trim NRIC diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 43daa8026e..484d3fbc29 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -45,6 +45,7 @@ public void showError(String message) { showLine(); } + //@@author judHoka public void showPatientAdded(List patients) { showLine(); System.out.println("Patient added successfully: " + patients.get(patients.size() - 1).getName()); @@ -63,6 +64,7 @@ public void showPatientDeleted(Patient removedPatient, String nric) { showLine(); } + //@@author dylancmznus public void showPatientViewed(Patient matchedPatient, String nric) { if (matchedPatient == null) { showLine(); @@ -75,7 +77,7 @@ public void showPatientViewed(Patient matchedPatient, String nric) { showLine(); } - + //@@author judHoka public void showPatientList(List patients) { if (patients.isEmpty()) { showLine(); @@ -94,7 +96,7 @@ public void showPatientList(List patients) { } } - + //@@author jyukuan public static void showPatientHistory(Patient patient) { System.out.println("Medical History for " + patient.getName() + " (NRIC: " + patient.getId() + "):"); List histories = patient.getMedicalHistory(); @@ -108,12 +110,14 @@ public static void showPatientHistory(Patient patient) { } } + //@@author chwenyee public void showAppointmentAdded(List appointments) { - Appointment currentAppt = appointments.get(appointments.size() - 1); + Appointment currentAppointment = appointments.get(appointments.size() - 1); showLine(); - System.out.println("Appointment added for NRIC: " + currentAppt.getNric() + " on " + currentAppt.getDate() - + " at " + currentAppt.getTime().format(OUTPUT_TIME_FORMAT) + "."); + System.out.println("Appointment added for NRIC: " + currentAppointment.getNric() + " on " + + currentAppointment.getDate() + " at " + currentAppointment.getTime().format(OUTPUT_TIME_FORMAT) + + "."); System.out.println("Now you have " + appointments.size() + " appointment(s) in the list."); showLine(); } @@ -132,6 +136,7 @@ public void showAppointmentDeleted(List appointments, Appointment r showLine(); } + //@@author dylancmznus public void showAppointmentMarked(List appointments, Appointment markedAppointment, String apptId) { if (markedAppointment == null) { showLine(); @@ -158,6 +163,7 @@ public void showAppointmentUnmarked(List appointments, Appointment showLine(); } + //@@author Basudeb2005 public void showAppointmentList(List appointments) { if (appointments.isEmpty()) { showLine(); @@ -175,6 +181,7 @@ public void showAppointmentList(List appointments) { showLine(); } + //@@author dylancmznus public void showAppointmentFound(Appointment appointment, String nric) { if (appointment != null) { showLine(); diff --git a/src/test/java/command/AddAppointmentCommandTest.java b/src/test/java/command/AddAppointmentCommandTest.java index 8bf628bd8c..bf7165b167 100644 --- a/src/test/java/command/AddAppointmentCommandTest.java +++ b/src/test/java/command/AddAppointmentCommandTest.java @@ -1,33 +1,56 @@ package command; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; +import manager.Patient; import miscellaneous.Ui; +import storage.Storage; +import java.nio.file.Path; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import static org.junit.jupiter.api.Assertions.assertEquals; class AddAppointmentCommandTest { private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + @TempDir + Path tempDir; + private ManagementSystem manager; + private Ui ui; + private Storage storage; + + @BeforeEach + void setUp() throws UnloadedStorageException { + storage = new Storage(tempDir.toString()); + ui = new Ui(); + manager = new ManagementSystem(storage.loadPatients()); + } + @Test - void execute_validAppointment_expectAppointmentAdded() { - ManagementSystem manager = new ManagementSystem(new ArrayList<>()); - Ui ui = new Ui(); + void execute_validAppointment_expectAppointmentAdded() throws Exception { + Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()); + new AddPatientCommand(patient).execute(manager, ui); LocalDateTime dateTime = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); Appointment appointment = new Appointment("S1234567D", dateTime, "Checkup"); - new AddAppointmentCommand(appointment).execute(manager, ui); List appointments = manager.getAppointments(); - assertEquals(1, appointments.size(), "Size of appointments should be 1"); + assertEquals(1, appointments.size()); assertEquals(appointment, appointments.get(0)); + + Patient updatedPatient = manager.viewPatient("S1234567D"); + assertEquals(1, updatedPatient.getAppointments().size()); + assertEquals(appointment, updatedPatient.getAppointments().get(0)); } } diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java index 9364a8480d..3e7be98bdb 100644 --- a/src/test/java/command/DeleteAppointmentCommandTest.java +++ b/src/test/java/command/DeleteAppointmentCommandTest.java @@ -1,14 +1,21 @@ package command; +import exception.DuplicatePatientIDException; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; +import manager.Patient; import miscellaneous.Ui; +import storage.Storage; +import java.nio.file.Path; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -16,14 +23,27 @@ class DeleteAppointmentCommandTest { private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); + @TempDir + Path tempDir; + private ManagementSystem manager; + private Ui ui; + private Storage storage; + + @BeforeEach + void setUp() throws UnloadedStorageException { + storage = new Storage(tempDir.toString()); + ui = new Ui(); + manager = new ManagementSystem(storage.loadPatients()); + } + @Test - void execute_validNric_expectAppointmentDeleted() { - ManagementSystem manager = new ManagementSystem(new ArrayList<>()); - Ui ui = new Ui(); + void execute_validNric_expectAppointmentDeleted() throws DuplicatePatientIDException, UnloadedStorageException { + Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()); + new AddPatientCommand(patient).execute(manager, ui); LocalDateTime dateTime = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); Appointment appointment = new Appointment("S1234567D", dateTime, "Checkup"); - new AddAppointmentCommand(appointment).execute(manager, ui); new DeleteAppointmentCommand(appointment.getId()).execute(manager, ui); diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index 6a9df9dd9e..ef8d9e8079 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -1,32 +1,59 @@ package command; +import exception.DuplicatePatientIDException; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; +import manager.Patient; import miscellaneous.Ui; +import storage.Storage; +import java.nio.file.Path; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import static org.junit.jupiter.api.Assertions.assertEquals; class ListAppointmentCommandTest { - private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); - @Test - void execute_always_requestsAppointmentsFromManager() { - ManagementSystem manager = new ManagementSystem(new ArrayList<>()); - Ui ui = new Ui(); + @TempDir + Path tempDir; + private ManagementSystem manager; + private Ui ui; + private Storage storage; + + @BeforeEach + void setUp() throws UnloadedStorageException { + storage = new Storage(tempDir.toString()); + ui = new Ui(); + manager = new ManagementSystem(storage.loadPatients()); + } + @Test + void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDException, UnloadedStorageException { LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); + List patients = List.of( + new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()), + new Patient("S2345678D", "James" , "1980-12-31", + "M", "133 Main St", "81229312", new ArrayList<>()), + new Patient("S3456789D", "William" , "1970-08-31", + "M", "17 Cornelia St", "81009214", new ArrayList<>()) + ); + manager.addPatient(patients.get(0)); + manager.addPatient(patients.get(1)); + manager.addPatient(patients.get(2)); List appointments = List.of( new Appointment("S1234567D", dateTime1 , "Checkup"), diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index 9d6b3c237f..e12c7957ab 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -4,14 +4,19 @@ import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; +import manager.Patient; import miscellaneous.Ui; +import storage.Storage; +import java.nio.file.Path; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -20,17 +25,34 @@ class SortAppointmentCommandTest { private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); - @Test - void execute_appointmentsWithDifferentDateTime_sortsByDateInAscendingOrder() throws DuplicatePatientIDException, - UnloadedStorageException { - ManagementSystem manager = new ManagementSystem(new ArrayList<>()); - Ui ui = new Ui(); + @TempDir + Path tempDir; + private ManagementSystem manager; + private Ui ui; + private Storage storage; + + @BeforeEach + void setUp() throws UnloadedStorageException, DuplicatePatientIDException { + storage = new Storage(tempDir.toString()); + ui = new Ui(); + manager = new ManagementSystem(storage.loadPatients()); + + List patients = List.of( + new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()), + new Patient("S2345678D", "James" , "1980-12-31", + "M", "133 Main St", "81229312", new ArrayList<>()), + new Patient("S3456789D", "William" , "1970-08-31", + "M", "17 Cornelia St", "81009214", new ArrayList<>()) + ); + manager.addPatient(patients.get(0)); + manager.addPatient(patients.get(1)); + manager.addPatient(patients.get(2)); LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); - List appointments = List.of( new Appointment("S1234567D", dateTime1, "Checkup"), new Appointment("S2345678D", dateTime2, "CT scan"), @@ -39,6 +61,11 @@ void execute_appointmentsWithDifferentDateTime_sortsByDateInAscendingOrder() thr manager.addAppointment(appointments.get(0)); manager.addAppointment(appointments.get(1)); manager.addAppointment(appointments.get(2)); + } + + @Test + void execute_appointmentsWithDifferentDateTime_sortsByDateInAscendingOrder() throws DuplicatePatientIDException, + UnloadedStorageException { new SortAppointmentCommand("date").execute(manager, ui); List sortedAppointments = manager.getAppointments(); @@ -52,23 +79,6 @@ void execute_appointmentsWithDifferentDateTime_sortsByDateInAscendingOrder() thr @Test void execute_appointmentsFirstSortedByDateThenId_sortsByIdInAscendingOrder() throws DuplicatePatientIDException, UnloadedStorageException { - ManagementSystem manager = new ManagementSystem(new ArrayList<>()); - Ui ui = new Ui(); - - LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); - LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); - LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); - - - List appointments = List.of( - new Appointment("S1234567D", dateTime1, "Checkup"), - new Appointment("S2345678D", dateTime2, "CT scan"), - new Appointment("S3456789D", dateTime3, "Consultation") - ); - manager.addAppointment(appointments.get(0)); - manager.addAppointment(appointments.get(1)); - manager.addAppointment(appointments.get(2)); - new SortAppointmentCommand("date").execute(manager, ui); new SortAppointmentCommand("id").execute(manager, ui); List sortedAppointments = manager.getAppointments(); @@ -81,10 +91,9 @@ void execute_appointmentsFirstSortedByDateThenId_sortsByIdInAscendingOrder() thr @Test void execute_emptyList_expectEmptyList() throws DuplicatePatientIDException, UnloadedStorageException { - ManagementSystem manager = new ManagementSystem(new ArrayList<>()); - Ui ui = new Ui(); + ManagementSystem emptyManager = new ManagementSystem(new ArrayList<>()); - new SortAppointmentCommand("date").execute(manager, ui); - assertTrue(manager.getAppointments().isEmpty()); + new SortAppointmentCommand("date").execute(emptyManager, ui); + assertTrue(emptyManager.getAppointments().isEmpty(), "Appointment list should be empty"); } } diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 4c0fcbcfab..8f85437736 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -165,11 +165,14 @@ void viewPatient_emptySystem_patientNotFound() { @Test void addAppointment_validInput_expectAppointmentAdded() { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); + Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()); + patients.add(patient); Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); String expectedNric = appointment.getNric(); @@ -183,11 +186,14 @@ void addAppointment_validInput_expectAppointmentAdded() { @Test void deleteAppointment_validInput_expectAppointmentDeleted() { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); + Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()); + patients.add(patient); Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); String expectedId = appointment.getId(); @@ -201,12 +207,15 @@ void deleteAppointment_validInput_expectAppointmentDeleted() { @Test void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-30 2200", DATE_TIME_FORMAT); - Appointment appointment = new Appointment("S3456789D", appointmentTime, "Checkup"); + Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()); + patients.add(patient); + Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); String expectedId = appointment.getId(); manager.addAppointment(appointment); @@ -219,12 +228,15 @@ void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() { @Test void deleteAppointment_nonExistentId_expectNullReturned() { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-25 2100", DATE_TIME_FORMAT); - Appointment appointment = new Appointment("S2345678D", appointmentTime, "Checkup"); + Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()); + patients.add(patient); + Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); manager.addAppointment(appointment); Appointment removedAppointment = manager.deleteAppointment("A999"); @@ -284,7 +296,7 @@ void sortAppointmentsById_sortById_appointmentsSortedById() { assertEquals("Consultation", appointments.get(2).getDescription()); } - @Test + /* @Test void markAppointment_validInput_expectAppointmentMarked() { List emptyList = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(emptyList); @@ -326,7 +338,7 @@ void findAppointment_existingAppointment_expectAppointmentFound() { assertNotNull(foundAppointment, "Appointment should be found"); assertEquals(appointment.getId(), foundAppointment.getId(), "Appointment ID should match"); - } + } */ @Test void findAppointment_nonExistentAppointment_expectNullReturned() { From 0276de771739835246116d1dabd38ffb4c31f86c Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 30 Mar 2025 16:34:05 +0800 Subject: [PATCH 067/203] Add assertions to key classes and fix formatting --- src/main/java/manager/Appointment.java | 6 ++- src/main/java/manager/ManagementSystem.java | 26 +++++++------ src/main/java/manager/Patient.java | 43 +++++++++++++-------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index dd0345845e..660857e0b0 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -18,6 +18,10 @@ public class Appointment { private boolean isDone; public Appointment(String nric, LocalDateTime dateTime, String description) { + assert nric != null && !nric.isBlank() : "NRIC cannot be null or blank"; + assert dateTime != null : "DateTime cannot be null"; + assert description != null && !description.isBlank() : "Description cannot be null or blank"; + this.id = "A" + runningId++; this.nric = nric; this.dateTime = dateTime; @@ -68,6 +72,6 @@ public String getStatusIcon() { @Override public String toString() { return "[" + id + "]" + "[" + this.getStatusIcon() + "]" + " - " - + nric + " - " + dateTime.format(OUTPUT_FORMAT) + " - " + description; + + nric + " - " + dateTime.format(OUTPUT_FORMAT) + " - " + description; } } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index f0bbe806be..d8a1bc0dfe 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -14,6 +14,7 @@ public class ManagementSystem { private final List patients; public ManagementSystem(List list) { + assert list != null : "Patient list cannot be null"; appointments = new ArrayList<>(); patients = list; } @@ -27,10 +28,11 @@ public List getAppointments() { } public void addPatient(Patient patient) throws DuplicatePatientIDException, UnloadedStorageException { - assert patient != null : "Patient should not be null"; + assert patient != null : "Patient cannot be null"; + assert patients != null : "Patient list cannot be null"; for (Patient existingPatient : patients) { - assert existingPatient != null : "Existing patient in list should not be null"; + assert existingPatient != null : "Existing patient in list cannot be null"; if (existingPatient.getId().equals(patient.getId())) { throw new DuplicatePatientIDException("Patient ID already exists!"); } @@ -41,10 +43,11 @@ public void addPatient(Patient patient) throws DuplicatePatientIDException, Unlo public Patient deletePatient(String nric) throws UnloadedStorageException { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; + assert patients != null : "Patient list cannot be null"; + for (Patient patient : patients) { if (patient.getId().equals(nric)) { patients.remove(patient); - // Return the removed patient Storage.savePatients(patients); return patient; } @@ -67,7 +70,7 @@ public Patient viewPatient(String nric) { //@@author jyukuan public void editPatient(String nric, String newName, String newDob, String newGender, - String newAddress, String newPhone) { + String newAddress, String newPhone) { Patient patient = findPatientByNric(nric); if (patient == null) { System.out.println("Patient with NRIC " + nric + " not found."); @@ -103,14 +106,13 @@ public void storeMedicalHistory(String name, String nric, String medHistory) { Ui.showLine(); } - String[] historyEntries = medHistory.split(",\s*"); + String[] historyEntries = medHistory.split(",\\s*"); for (String entry : historyEntries) { if (!existingPatient.getMedicalHistory().contains(entry.trim())) { existingPatient.getMedicalHistory().add(entry.trim()); } } System.out.println("Medical history added for " + name + " (NRIC: " + nric + ")."); - Ui.showLine(); } @@ -163,8 +165,6 @@ public void editPatientHistory(String nric, String oldHistory, String newHistory } } - - // Find patient by NRIC private Patient findPatientByNric(String nric) { String object = nric.trim().toUpperCase(); for (Patient p : patients) { @@ -176,7 +176,6 @@ private Patient findPatientByNric(String nric) { return null; } - private List findPatientsByName(String name) { List result = new ArrayList<>(); for (Patient p : patients) { @@ -189,6 +188,9 @@ private List findPatientsByName(String name) { //@@author chwenyee public void addAppointment(Appointment appointment) throws IllegalArgumentException { + assert appointment != null : "Appointment cannot be null"; + assert patients != null : "Patient list cannot be null"; + Patient patient = findPatientByNric(appointment.getNric()); if (patient == null) { throw new IllegalArgumentException("Patient with NRIC: " + appointment.getNric() + " not found"); @@ -199,11 +201,14 @@ public void addAppointment(Appointment appointment) throws IllegalArgumentExcept } public Appointment deleteAppointment(String apptId) { + assert apptId != null && !apptId.isBlank() : "Appointment ID cannot be null or blank"; + assert appointments != null : "Appointment list cannot be null"; + for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { + appointments.remove(appointment); Patient patient = findPatientByNric(appointment.getNric()); if (patient != null) { - appointments.remove(appointment); patient.deleteAppointment(apptId); } return appointment; @@ -214,7 +219,6 @@ public Appointment deleteAppointment(String apptId) { public List sortAppointmentsByDateTime(List appointments) { appointments.sort(Comparator.comparing(Appointment::getDateTime)); - return appointments; } diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index b6af35fcf3..7bfc747bd6 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -16,6 +16,14 @@ public class Patient { public Patient(String id, String name, String dob, String gender, String address, String contactInfo, List medicalHistory) { + assert id != null && !id.isBlank() : "Patient ID cannot be null or blank"; + assert name != null && !name.isBlank() : "Patient name cannot be null or blank"; + assert dob != null : "Date of birth cannot be null"; + assert gender != null : "Gender cannot be null"; + assert address != null : "Address cannot be null"; + assert contactInfo != null : "Contact info cannot be null"; + assert medicalHistory != null : "Medical history list cannot be null"; + this.id = id; this.name = name; this.dob = dob; @@ -71,10 +79,13 @@ public List getAppointments() { } public void addAppointment(Appointment appointment) { + assert appointment != null : "Appointment cannot be null"; + assert appointment.getNric().equals(this.id) : "Appointment NRIC must match patient ID"; appointments.add(appointment); } public void deleteAppointment(String apptId) { + assert apptId != null && !apptId.isBlank() : "Appointment ID cannot be null or blank"; for (Appointment appt : appointments) { if (appt.getId().equals(apptId)) { appointments.remove(appt); @@ -93,15 +104,14 @@ public String toString() { } String result = String.format( - "Patient NRIC: %s\n" + - "Name: %s\n" + - "Date of Birth: %s\n" + - "Gender: %s\n" + - "Address: %s\n" + - "Contact: %s\n" + - "Medical History: %s", - id, name, dob, gender, address, contactInfo, formattedMedicalHistory - ); + "Patient NRIC: %s\n" + + "Name: %s\n" + + "Date of Birth: %s\n" + + "Gender: %s\n" + + "Address: %s\n" + + "Contact: %s\n" + + "Medical History: %s", + id, name, dob, gender, address, contactInfo, formattedMedicalHistory); if (appointments.isEmpty()) { result += "\nAppointments: None"; @@ -121,14 +131,13 @@ public String toString() { public String toStringForListView() { String result = String.format( - "Patient NRIC: %s\n " + - "Name: %s\n " + - "Date of Birth: %s\n " + - "Gender: %s\n " + - "Address: %s\n " + - "Contact: %s", - id, name, dob, gender, address, contactInfo - ); + "Patient NRIC: %s\n " + + "Name: %s\n " + + "Date of Birth: %s\n " + + "Gender: %s\n " + + "Address: %s\n " + + "Contact: %s", + id, name, dob, gender, address, contactInfo); if (medicalHistory.isEmpty()) { result += "\n Medical History: None"; From 9b2d6f90529fa0ccd1f547626e3c2a6cd9fde9e5 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sun, 30 Mar 2025 17:06:38 +0800 Subject: [PATCH 068/203] Updated DG and UG --- docs/AboutUs.md | 12 ++-- docs/DeveloperGuide.md | 14 ++-- docs/README.md | 2 +- docs/UserGuide.md | 96 +++++++++++++++++++++---- src/main/java/miscellaneous/Parser.java | 6 +- 5 files changed, 103 insertions(+), 27 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 78a2042fb8..13f6a07a25 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:-------------------:|:----------------------------------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | Basudeb Chakraborty | [Github](https://github.com/Basudeb2005) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:-------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Basudeb Chakraborty | [Github](https://github.com/Basudeb2005) | [Portfolio](docs/team/johndoe.md) ![](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | Judha Hoka Wishika | [GitHub](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | [Portfolio](https://www.linkedin.com/in/judha-hoka-wishika-13b567233/) -![](https://via.placeholder.com/100.png?text=Photo) | Yukuan | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Dylan Chua | [https://github.com/dylancmznus](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Chan Wen Yee | [Github](https://github.com/chwenyee) | [Portfolio](chwenyee) +![](https://via.placeholder.com/100.png?text=Photo) | Yukuan | [Github](https://github.com/jyukuan) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Dylan Chua | [Github](https://github.com/dylancmznus) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Chan Wen Yee | [Github](https://github.com/chwenyee) | [Portfolio](chwenyee) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 64e1f0ed2b..4b9c72b4da 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -26,12 +26,18 @@ |v2.0|user|find a to-do item by name|locate a to-do without having to go through the entire list| ## Non-Functional Requirements - -{Give non-functional requirements} +1. Should work on any mainstream OS as long as it has Java `17` or above installed. +2. The system should efficiently manage up to 1000 patients or appointments without any noticeable performance lag during typical usage. +3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks within 40 seconds using CLI commands. +4. All error messages should clearly indicate how to correct the invalid input. +5. Data files should be compatible across different OS platforms. +6. All functionality should be accessible via keyboard-only commands. ## Glossary - -* *glossary item* - Definition +* *Mainstream OS* - Windows, Linux, Unix, macOS +* *Performance Lag* – A noticeable delay or slowdown in the system’s response to user actions. +* *Error Messages* – System-generated messages that inform users of incorrect input and provide guidance on how to fix it. +* *OS Platform Compatibility* – The ability for data files and system functionality to work consistently across different operating systems. ## Instructions for manual testing diff --git a/docs/README.md b/docs/README.md index bbcc99c1e7..dbf207e2a7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# Duke +# ClinicEase {Give product intro here} diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d6cf4c3b3a..a70c084d6e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,26 +8,77 @@ {Give steps to get started quickly} -1. Ensure that you have Java 17 or above installed. -1. Down the latest version of `Duke` from [here](http://link.to/duke). +1. Ensure that you have Java 17 or above installed.
+ **Mac users:** Ensure you have the precise JDK version prescribed + [here](https://se-education.org/guides/tutorials/javaInstallationMac.html). +2. Download the latest version of `Duke` from [here](http://link.to/duke). +3. Copy the file to the folder you want to use as the home folder for ClinicEase. +4. Open a command terminal, `cd` into the folder you put the jar file in, and use the + `java -jar ClinicEase.jar` command to run the application. +5. Type the command in the command box and press Enter to execute it.
+ Some example commands you can try: + - `add-patient n/John ic/S1234567D dob/2003-04-06 g/M p/91218188 a/123 Main St`:
+ Adds a patient named `John` to the patient list. + - `delete-patient S1234567D`: Deletes the patient with NRIC `S1234567D` in the patient list. + - `bye`: Exits the app. +6. Refer to the Features below for details of each command. + ## Features +> [!NOTE] +> - Words in `UPPER_CASE` represent parameters that must be provided by the user.
+ e.g. in `view-patient NRIC`, `NRIC` is a parameter which can be used as `view-patient S1234567D`. +> - Items in square brackets are optional.
+ e.g `ic/NRIC [n/NAME] [dob/BIRTHDATE]` can be used as `ic/S1234567D n/John` or as `ic/S1234567D dob/2002-06-07`. +> - Every parameter must be supplied by the user.
+ e.g. if the command specifies `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`, the user + must fill in all parameters for the input to be valid. +> - Parameters must be entered in the **specified order**.
+ e.g. if the command specifies `ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`, the user + must follow this exact sequence for the input to be valid. +> - Extraneous parameters for commands that do not take in parameters (such as `list` and `bye`) will be ignored.
+ e.g. if the command specifies `list-patient 12345`, it will be interpreted as `list-patient`. +> - Command words are **case-insensitive**.
+ e.g. `liST-paTIEnt` will be interpreted as `list-patient`. + +### Adding an appointment: `add-appointment` +Adds a new appointment to the list of appointment. + +Format: `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION` + +* The patient with the specified `NRIC` **must** exist must exist in the system. +* `DATE` format: `yyyy-MM-dd`, where `yyyy` is year, `MM` is month, + `dd` is day (e.g., `2025-03-31`). +* `TIME` format: `HHmm` in 24-hour format (e.g., `1430` for 2:30 PM). -{Give detailed description of each feature} +Example of usage: -### Adding a todo: `todo` -Adds a new item to the list of todo items. +`add-appointment ic/S1234567D dt/2025-03-31 t/1200 dsc/Annual checkup` -Format: `todo n/TODO_NAME d/DEADLINE` +### Deleting an appointment: `delete-appointment` +Deletes a specified appointment from the appointment list. -* The `DEADLINE` can be in a natural language format. -* The `TODO_NAME` cannot contain punctuation. +Format: `delete-appointment APPOINTMENT_ID` -Example of usage: +* The `APPOINTMENT_ID` refers to the unique identifier assigned by the program (e.g., "A1XX") to an appointment. +* The `APPOINTMENT_ID` can be found in the displayed appointment list when using the list-appointment command. + +Example of usage: + +`delete-appointment A100` + +### Sorting appointments: `sort-appointment` +Sorts the appointments in the appointment list. -`todo n/Write the rest of the User Guide d/next week` +Format: `sort-appointment byDate` or `sort-appointment byId` -`todo n/Refactor the User Guide to remove passive voice d/13/04/2020` +* The `sort-appointment byDate` sorts the appointments by date and time in **ascending order**. +* The `sort-appointment byId` sorts the appointments by `APPOINTMENT_ID` in **ascending order**. + +Example of usage: + +* `sort-appointment byDate` +* `sort-appointment byId` ## FAQ @@ -37,6 +88,25 @@ Example of usage: ## Command Summary -{Give a 'cheat sheet' of commands here} +| Action | Format, Examples | +|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Add patient | `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS`
e.g. `add-patient n/John Doe ic/S1234567D dob/1999-12-12 g/M p/98765432 a/123 Main Street h/Diabetes, Hypertension` | +| Delete patient | `delete-patient NRIC`
e.g. `delete-patient S1234567D` | +| Edit patient | `edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]`
e.g. `edit-patient ic/S1234567D n/Billy Joe dob/1999-12-21` | +| List patient | `list-patient` | +| View patient | `view-patient NRIC`
e.g. `view-patient S1234567D` | +| Store medical history | `store-history n/NAME ic/NRIC h/MEDICAL_HISTORY`
e.g. `store-history n/John Doe ic/S1234567D h/Depression` | +| View medical history | `view-history NRIC` or `view-history NAME`
e.g. `view-history S1234567D` or `view-history John Doe` | +| Edit medical history | `edit-history ic/NRIC old/OLD_TEXT new/NEW_TEXT`
e.g. `edit-history ic/S1234567D old/Depression new/Obesity` | +| Add appointment | `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`
e.g. `add-appointment ic/S1234567D dt/2025-06-15 t/1400 dsc/Annual Checkup` | +| Delete appointment | `delete-appointment APPOINTMENT_ID`
e.g. `delete-appointment A123` | +| List appointment | `list-appointment` | +| Mark appointment | `mark-appointment APPOINTMENT_ID`
e.g. `mark-appointment A101` | +| Unmark appointment | `unmark-appointment APPOINTMENT_ID`
e.g. `unmark-appointment A101` | +| Sort appointment | `sort-appointment byDate` or `sort-appointment byId` | +| Find appointment | `find-appointment PATIENT_NRIC`
e.g. `find-appointment S1234567D` | + +# About us + + -* Add todo `todo n/TODO_NAME d/DEADLINE` diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index dbe7163f89..201df75030 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -298,7 +298,7 @@ private static String[] parseEditPatient(String input) throws InvalidInputFormat String temp = input.replaceFirst("(?i)edit-patient\\s*", ""); String nric = extractValue(temp, "ic/"); if (nric == null) { - throw new InvalidInputFormatException("Missing NRIC! Usage: edit-patient ic/NRIC [n/NAME] " + + throw new InvalidInputFormatException("Missing NRIC! Use: edit-patient ic/NRIC [n/NAME] " + "[dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]"); } String name = extractValue(temp, "n/"); @@ -315,7 +315,7 @@ private static String[] parseEditHistory(String input) throws InvalidInputFormat String nric = extractValue(temp, "ic/"); if (nric == null) { - throw new InvalidInputFormatException("Missing NRIC! Usage: edit-history ic/NRIC " + + throw new InvalidInputFormatException("Missing NRIC! Use: edit-history ic/NRIC " + "old/OLD_HISTORY new/NEW_HISTORY"); } @@ -323,7 +323,7 @@ private static String[] parseEditHistory(String input) throws InvalidInputFormat String newHistory = extractValue(temp, "new/"); if (oldHistory == null || newHistory == null) { - throw new InvalidInputFormatException("Missing old or new history text! Usage: edit-history " + + throw new InvalidInputFormatException("Missing old or new history text! Use: edit-history " + "ic/NRIC old/OLD_TEXT new/NEW_TEXT"); } From 511cdf2d920495e531eba7b0c150ef75e7cdb51d Mon Sep 17 00:00:00 2001 From: yukuan Date: Sun, 30 Mar 2025 17:10:57 +0800 Subject: [PATCH 069/203] DG-Instructions for manual testing --- docs/DeveloperGuide.md | 310 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 308 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 64e1f0ed2b..099336d21d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -33,6 +33,312 @@ * *glossary item* - Definition -## Instructions for manual testing -{Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} +## Instructions for Manual Testing + +Below is a suggested guide for **manual testing** of the ClinicEase application in a Command Line Interface (CLI) environment. + +--- + +## 1. Getting Started + +1. **Compilation** + - Navigate to the project’s root folder (where the `ClinicEase.java` and other `.java` files reside). + - Compile the source files. For example: + ``` + javac *.java + ``` + - Alternatively, use your favorite IDE’s build tool. + +2. **Launching the Application** + - Run the compiled main class: + ``` + java ClinicEase + ``` + - You should see a welcome message that looks like this: + ``` + -------------------------------------------------------------------------------- + Welcome to ClinicEase! + Type a command, or 'bye' to exit. + -------------------------------------------------------------------------------- + > + ``` + +3. **Exiting the Application** + - To exit, type: + ``` + bye + ``` + - Expected output: + ``` + -------------------------------------------------------------------------------- + Goodbye! + -------------------------------------------------------------------------------- + ``` + - The program will then terminate. + +--- + +## 2. Testing Patient Management Features + +### 2.1 Add a New Patient + +**Command Format**: `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS [h/MEDICAL_HISTORY]` + +- `[h/MEDICAL_HISTORY]` is optional and can be multiple entries separated by commas. + +**Steps to Test** +1. Input: + ``` + add-patient n/Alice Tan ic/S1234567A dob/1990-01-01 g/F p/91234567 a/123 Bedok Road h/High blood pressure + ``` +2. Expected output: + ``` + -------------------------------------------------------------------------------- + Patient added successfully: Alice Tan + -------------------------------------------------------------------------------- + ``` +3. The system should store the new patient data (written to `patient_data.txt`). + +**Additional Test Cases** +- **Missing required fields** (e.g., no `a/ADDRESS`) should produce an `InvalidInputFormatException` message. +- **Duplicate NRIC** should produce a `DuplicatePatientIDException`. + +--- + +### 2.2 List All Patients + +**Command Format**: `list-patient` + +**Steps to Test** +1. Input: + ``` + list-patient + ``` +2. If you have existing patients, the system displays each patient in a list format: + ``` + ------------------------------------------Patient Details------------------------------------------ + Patient NRIC: S1234567A Name: Alice Tan ... + -------------------------------------------------------------------------------- + ``` +3. If no patients exist, the system prints: + ``` + -------------------------------------------------------------------------------- + No patients have been added. + -------------------------------------------------------------------------------- + ``` + + +--- + +### 2.3 View a Patient by NRIC + +**Command Format**: `view-patient NRIC` + +**Steps to Test** +1. Input: + ``` + view-patient S1234567A + ``` +2. If the patient is found, detailed information is displayed. Otherwise, the system notifies you that no matching patient was found. + +--- + +### 2.4 Delete a Patient + +**Command Format**: `delete-patient NRIC` + + +**Steps to Test** +1. Input: + ``` + delete-patient S1234567A + ``` +2. If the patient exists, the system confirms deletion: + ``` + -------------------------------------------------------------------------------- + No patients have been added. + -------------------------------------------------------------------------------- + ``` +3. If the patient doesn’t exist, it notifies you accordingly. + +--- + + +### 2.5 Edit Patient Information + +**Command Format** `edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]` + +- `ic/NRIC` is required to locate the patient. +- The remaining fields are optional; include only those you want to edit. + +**Steps to Test** +1. Input: + ``` + edit-patient ic/S1234567A n/Alice Tan g/F a/321 Jurong Avenue + ``` +2. Expected output upon success: + ``` + -------------------------------------------------------------------------------- + Patient with NRIC S1234567A updated successfully. + Edit-patient command executed. + -------------------------------------------------------------------------------- + ``` +3. Use `view-patient S1234567A` to confirm the updated details. + +--- + +## 3. Testing Medical History Features + +### 3.1 Store Medical History + +**Command Format**: `store-history n/NAME ic/NRIC h/HISTORY` + +- `h/HISTORY` can contain multiple entries separated by commas. + +**Steps to Test** +1. Input: + ``` + store-history n/Bob Lee ic/S7654321B h/Diabetes,High cholesterol + + ``` +2. If the patient doesn’t exist, the system creates a new one and prints a confirmation message. If the patient exists, it simply adds new history entries. + +--- + +### 3.2 View Medical History + +**Command Format**: +1. By NRIC: `view-history ic/NRIC` +2. By Name: `view-history NAME` + + +**Steps to Test** +1. Input: + ``` + view-history ic/S7654321B + ``` +2. Displays the patient’s history if found. Otherwise, notifies you that it cannot find the patient. + +--- + +### 3.3 Edit Medical History + +**Command Format**: `edit-history ic/NRIC old/OLD_TEXT new/NEW_TEXT` + +**Steps to Test** +1. Input: + ``` + edit-history ic/S7654321B old/Diabetes new/Type 2 Diabetes + ``` +2. If `old/Diabetes` matches an existing record, the system replaces it with `Type 2 Diabetes` and prints a confirmation message. + +--- + +## 4. Testing Appointment Features + +### 4.1 Add an Appointment + +**Command Format**: `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION` + +- Date: `yyyy-MM-dd` +- Time: `HHmm` (24-hour format) + +**Steps to Test** +1. Input: + ``` + add-appointment ic/S1234567A dt/2025-12-01 t/0930 dsc/Dental Checkup + ``` +2. If the patient is found, the system adds the appointment and shows a success message. If the patient doesn’t exist, it prints an error. + +--- + +### 4.2 List Appointments + +**Command Format**: `list-appointment` + +**Steps to Test** +1. Input: + ``` + list-appointment + ``` + +2. Shows all appointments if any exist. Otherwise, prints a “No appointments found” message. + +--- + +### 4.3 Sort Appointments + +**Command Format**: +1. by date:`sort-appointment byDate` +2. by appointment id: `sort-appointment byId` + +**Steps to Test** +1. Input: + ``` + sort-appointment byDate + ``` +- Appointments should be sorted chronologically. + +2. Input: + ``` + sort-appointment byId + ``` +- Appointments should be sorted by their `Axxx` IDs. + +--- + +### 4.4 Mark and Unmark an Appointment + +**Command Format**: `mark-appointment APPOINTMENT_ID unmark-appointment APPOINTMENT_ID` + +**Steps to Test** +1. Input: + ``` + mark-appointment A100 + ``` +- The system marks the appointment as done (`[X]`). +2. Input: + ``` + unmark-appointment A100 + ``` +- The system reverts the appointment to undone (`[ ]`). + +--- + +### 4.5 Find an Appointment by NRIC + +**Command Format**: `find-appointment NRIC` + +**Steps to Test** +1. Input: + ``` + find-appointment S1234567A + ``` +2. If any matching appointment is found, it prints the details. Otherwise, it prints “No appointment found.” + +--- + +## 5. Error Handling Scenarios + +- **Unknown Commands** +- If you type something invalid like `randomCommand`, the system should respond: + ``` + Unknown command. Please try again. + ``` +- **Missing or Invalid Parameters** +- For instance, `add-appointment` missing the `dt/DATE` should trigger an error message (`InvalidInputFormatException`). +- **Storage Failures** +- If there’s an I/O error with reading or writing to `patient_data.txt`, you might see `UnloadedStorageException`. + +--- + +## 6. Comprehensive Test Workflow + +1. **Add multiple patients** and confirm they appear correctly with `list-patient`. +2. **Add detailed medical histories** with `store-history`; verify them using `view-history`. +3. **Add appointments** to different patients and use `list-appointment`, `sort-appointment`, `mark-appointment`, etc. to test appointment functionality. +4. **Delete a patient** and confirm the removal. +5. **Exit** the program with `bye`. + +--- \ No newline at end of file From 87bdb15d65778e622354a05ebc8702be4063a86b Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 30 Mar 2025 16:21:16 +0700 Subject: [PATCH 070/203] Adjusted storage functionality to some features --- src/main/java/manager/ManagementSystem.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 96f90c84d4..27a4f645af 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -65,7 +65,7 @@ public Patient viewPatient(String nric) { } public void editPatient(String nric, String newName, String newDob, String newGender, - String newAddress, String newPhone) { + String newAddress, String newPhone) throws UnloadedStorageException { Patient patient = findPatientByNric(nric); if (patient == null) { System.out.println("Patient with NRIC " + nric + " not found."); @@ -86,12 +86,13 @@ public void editPatient(String nric, String newName, String newDob, String newGe if (newPhone != null && !newPhone.isBlank()) { patient.setContactInfo(newPhone); } + Storage.savePatients(patients); System.out.println("Patient with NRIC " + nric + " updated successfully."); } //@@author jyukuan - public void storeMedicalHistory(String name, String nric, String medHistory) { + public void storeMedicalHistory(String name, String nric, String medHistory) throws UnloadedStorageException { Patient existingPatient = findPatientByNric(nric); if (existingPatient == null) { @@ -109,6 +110,7 @@ public void storeMedicalHistory(String name, String nric, String medHistory) { existingPatient.getMedicalHistory().add(entry.trim()); } } + Storage.savePatients(patients); System.out.println("Medical history added for " + name + " (NRIC: " + nric + ")."); Ui.showLine(); @@ -142,7 +144,7 @@ public void viewMedicalHistoryByName(String name) { } } - public void editPatientHistory(String nric, String oldHistory, String newHistory) { + public void editPatientHistory(String nric, String oldHistory, String newHistory) throws UnloadedStorageException { Patient patient = findPatientByNric(nric); if (patient == null) { System.out.println("Patient with NRIC " + nric + " not found."); @@ -158,6 +160,7 @@ public void editPatientHistory(String nric, String oldHistory, String newHistory break; } } + Storage.savePatients(patients); if (!foundOld) { System.out.println("Old history \"" + oldHistory + "\" not found for patient " + patient.getName()); } From 2e96772fd8e441f45f5c91032a7796b80aaf683d Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 30 Mar 2025 16:56:21 +0700 Subject: [PATCH 071/203] Adjusted some formatting --- src/main/java/manager/Appointment.java | 2 +- src/main/java/miscellaneous/Parser.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index 84d9b8a1e2..e436664bec 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -93,6 +93,6 @@ public String toString() { } public String toFileFormat() { - return id.substring(1) + "|" + this.nric + "|" + dateTime.format(DATE_TIME_FORMAT) + "|" + this.description; + return id.substring(1) + "|" + this.nric + "|" + dateTime.format(OUTPUT_FORMAT) + "|" + this.description; } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 7fd86bcf26..b2fa4a5003 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -362,7 +362,7 @@ public static Appointment parseAppointment(String line) { String dateTimeStr = tokens[2].trim(); String desc = tokens[3].trim(); - LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, Appointment.DATE_TIME_FORMAT); + LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, Appointment.OUTPUT_FORMAT); Appointment appointment = new Appointment("A" + id, nric, dateTime, desc); return appointment; From 186c4ed406aa8c62af4a18164bd88a40294c00d9 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 30 Mar 2025 16:59:31 +0700 Subject: [PATCH 072/203] Fixed some gradle checks --- src/main/java/command/EditPatientCommand.java | 3 ++- src/main/java/command/EditPatientHistoryCommand.java | 3 ++- src/main/java/command/StoreMedHistoryCommand.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java index b32960a71a..e4a29328ac 100644 --- a/src/main/java/command/EditPatientCommand.java +++ b/src/main/java/command/EditPatientCommand.java @@ -1,5 +1,6 @@ package command; +import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Ui; @@ -13,7 +14,7 @@ public EditPatientCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { String nric = details[0]; String name = details[1]; String dob = details[2]; diff --git a/src/main/java/command/EditPatientHistoryCommand.java b/src/main/java/command/EditPatientHistoryCommand.java index 4ad23aeb5b..c3375d9ea7 100644 --- a/src/main/java/command/EditPatientHistoryCommand.java +++ b/src/main/java/command/EditPatientHistoryCommand.java @@ -1,5 +1,6 @@ package command; +import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Ui; @@ -12,7 +13,7 @@ public EditPatientHistoryCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { String nric = details[0]; String oldHistory = details[1]; String newHistory = details[2]; diff --git a/src/main/java/command/StoreMedHistoryCommand.java b/src/main/java/command/StoreMedHistoryCommand.java index b16ecaef15..c0a811877c 100644 --- a/src/main/java/command/StoreMedHistoryCommand.java +++ b/src/main/java/command/StoreMedHistoryCommand.java @@ -1,5 +1,6 @@ package command; +import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Ui; @@ -15,7 +16,7 @@ public StoreMedHistoryCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { manager.storeMedicalHistory(name, nric, medHistory); } } From 8e72411e9c76c5d2d3b1260dd0da4de85d7663f8 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 30 Mar 2025 17:19:21 +0700 Subject: [PATCH 073/203] gradle wrapper debug --- src/main/java/manager/Appointment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index e436664bec..fc19eb0c57 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -95,4 +95,6 @@ public String toString() { public String toFileFormat() { return id.substring(1) + "|" + this.nric + "|" + dateTime.format(OUTPUT_FORMAT) + "|" + this.description; } + + //THIS IS FOR DEBUGGING GRADLE } From 3b610d10cdac7a084f536595aeaf5716c47b59f5 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 30 Mar 2025 17:22:16 +0700 Subject: [PATCH 074/203] Gradle debug --- src/main/java/manager/Appointment.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index fc19eb0c57..e436664bec 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -95,6 +95,4 @@ public String toString() { public String toFileFormat() { return id.substring(1) + "|" + this.nric + "|" + dateTime.format(OUTPUT_FORMAT) + "|" + this.description; } - - //THIS IS FOR DEBUGGING GRADLE } From 9317034a4011bf96b6eb214d683c19e14b7a4eb5 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 30 Mar 2025 17:52:33 +0700 Subject: [PATCH 075/203] Adjusted params in Test cases --- src/main/java/manager/ManagementSystem.java | 1 + .../command/AddAppointmentCommandTest.java | 2 +- .../command/DeleteAppointmentCommandTest.java | 2 +- .../command/ListAppointmentCommandTest.java | 2 +- .../command/SortAppointmentCommandTest.java | 4 +- .../java/manager/ManagementSystemTest.java | 49 ++++++++++--------- 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 7f7ec6c690..ca1f514375 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -15,6 +15,7 @@ public class ManagementSystem { public ManagementSystem(List loadedPatients, List loadedAppointments) { assert loadedPatients != null : "Patient list cannot be null"; + assert loadedAppointments != null : "Appointment list cannot be null"; appointments = loadedAppointments; patients = loadedPatients; } diff --git a/src/test/java/command/AddAppointmentCommandTest.java b/src/test/java/command/AddAppointmentCommandTest.java index bf7165b167..f04e0b5483 100644 --- a/src/test/java/command/AddAppointmentCommandTest.java +++ b/src/test/java/command/AddAppointmentCommandTest.java @@ -32,7 +32,7 @@ class AddAppointmentCommandTest { void setUp() throws UnloadedStorageException { storage = new Storage(tempDir.toString()); ui = new Ui(); - manager = new ManagementSystem(storage.loadPatients()); + manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); } @Test diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java index 3e7be98bdb..b58d51954c 100644 --- a/src/test/java/command/DeleteAppointmentCommandTest.java +++ b/src/test/java/command/DeleteAppointmentCommandTest.java @@ -33,7 +33,7 @@ class DeleteAppointmentCommandTest { void setUp() throws UnloadedStorageException { storage = new Storage(tempDir.toString()); ui = new Ui(); - manager = new ManagementSystem(storage.loadPatients()); + manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); } @Test diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index ef8d9e8079..1b25bf3461 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -34,7 +34,7 @@ class ListAppointmentCommandTest { void setUp() throws UnloadedStorageException { storage = new Storage(tempDir.toString()); ui = new Ui(); - manager = new ManagementSystem(storage.loadPatients()); + manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); } @Test diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index e12c7957ab..c643d6ff06 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -35,7 +35,7 @@ class SortAppointmentCommandTest { void setUp() throws UnloadedStorageException, DuplicatePatientIDException { storage = new Storage(tempDir.toString()); ui = new Ui(); - manager = new ManagementSystem(storage.loadPatients()); + manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); List patients = List.of( new Patient("S1234567D", "Billy", "1990-10-01", @@ -91,7 +91,7 @@ void execute_appointmentsFirstSortedByDateThenId_sortsByIdInAscendingOrder() thr @Test void execute_emptyList_expectEmptyList() throws DuplicatePatientIDException, UnloadedStorageException { - ManagementSystem emptyManager = new ManagementSystem(new ArrayList<>()); + ManagementSystem emptyManager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); new SortAppointmentCommand("date").execute(emptyManager, ui); assertTrue(emptyManager.getAppointments().isEmpty(), "Appointment list should be empty"); diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 8f85437736..c4faf601ac 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -39,8 +39,9 @@ void setUp() throws IOException { @Test void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDException, UnloadedStorageException { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + List emptyListPatient = new ArrayList<>(); + List emptyListAppoint = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint); Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", "M", "123 Main St", "81234567", new ArrayList<>()); @@ -58,7 +59,7 @@ void addPatient_duplicateId_expectExceptionThrown() throws DuplicatePatientIDExc "M", "123 Main St", "81234567", new ArrayList<>()); existing.add(patient); - ManagementSystem manager = new ManagementSystem(existing); + ManagementSystem manager = new ManagementSystem(existing, new ArrayList<>()); Patient duplicate = new Patient("S1234567A", "Jane Smith", "1992-02-02", "F", "456 Sample Rd", "90000000", new ArrayList<>()); @@ -69,8 +70,9 @@ void addPatient_duplicateId_expectExceptionThrown() throws DuplicatePatientIDExc @Test void addPatient_validInput_expectPatientAddedAndSaved() throws DuplicatePatientIDException, UnloadedStorageException, IOException { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + List emptyListPatient = new ArrayList<>(); + List emptyListAppoint = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint); Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", "M", "123 Main St", "81234567", new ArrayList<>()); @@ -92,7 +94,7 @@ void deletePatient_existingPatient_patientDeleted() throws UnloadedStorageExcept Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", "M", "123 Main St", "81234567", new ArrayList<>()); patients.add(patient); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); Patient deletedPatient = manager.deletePatient("S1234567A"); @@ -108,7 +110,7 @@ void deletePatient_nonExistentPatient_patientNotFound() throws UnloadedStorageEx Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", "M", "123 Main St", "81234567", new ArrayList<>()); patients.add(patient); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); Patient deletedPatient = manager.deletePatient("S9999999X"); @@ -119,7 +121,7 @@ void deletePatient_nonExistentPatient_patientNotFound() throws UnloadedStorageEx @Test void deletePatient_emptyList_patientNotFound() throws UnloadedStorageException { List patients = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); Patient deletedPatient = manager.deletePatient("S1234567A"); @@ -132,7 +134,7 @@ void viewPatient_validNric_patientFound() { List patients = new ArrayList<>(); patients.add(new Patient("S1234567A", "John Doe", "1990-01-01", "M", "123 Main St", "81234567", new ArrayList<>())); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); Patient retrievedPatient = manager.viewPatient("S1234567A"); @@ -146,7 +148,7 @@ void viewPatient_invalidNric_patientNotFound() { List patients = new ArrayList<>(); patients.add(new Patient("S1234567A", "John Doe", "1990-01-01", "M", "123 Main St", "81234567", new ArrayList<>())); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); Patient retrievedPatient = manager.viewPatient("S9999999X"); @@ -156,7 +158,7 @@ void viewPatient_invalidNric_patientNotFound() { @Test void viewPatient_emptySystem_patientNotFound() { List patients = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); Patient retrievedPatient = manager.viewPatient("S1234567A"); @@ -164,9 +166,9 @@ void viewPatient_emptySystem_patientNotFound() { } @Test - void addAppointment_validInput_expectAppointmentAdded() { + void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageException { List patients = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); @@ -185,9 +187,9 @@ void addAppointment_validInput_expectAppointmentAdded() { } @Test - void deleteAppointment_validInput_expectAppointmentDeleted() { + void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStorageException { List patients = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); @@ -206,9 +208,9 @@ void deleteAppointment_validInput_expectAppointmentDeleted() { } @Test - void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() { + void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws UnloadedStorageException { List patients = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-30 2200", DATE_TIME_FORMAT); @@ -227,9 +229,9 @@ void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() { } @Test - void deleteAppointment_nonExistentId_expectNullReturned() { + void deleteAppointment_nonExistentId_expectNullReturned() throws UnloadedStorageException { List patients = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(patients); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-25 2100", DATE_TIME_FORMAT); @@ -247,7 +249,7 @@ void deleteAppointment_nonExistentId_expectNullReturned() { @Test void sortAppointmentsByDateTime_sortByDateTime_appointmentsSortedByDateTime() { - ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); List appointments = new ArrayList<>(); LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); @@ -272,7 +274,7 @@ void sortAppointmentsByDateTime_sortByDateTime_appointmentsSortedByDateTime() { @Test void sortAppointmentsById_sortById_appointmentsSortedById() { - ManagementSystem manager = new ManagementSystem(new ArrayList<>()); + ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); List appointments = new ArrayList<>(); LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); @@ -342,8 +344,9 @@ void findAppointment_existingAppointment_expectAppointmentFound() { @Test void findAppointment_nonExistentAppointment_expectNullReturned() { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + List emptyListPatient = new ArrayList<>(); + List emptyListAppoint = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint); Appointment foundAppointment = manager.findAppointmentByNric("A999"); From 1345ae3dfa1046c5d435288f594722ebd4cb1404 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 30 Mar 2025 17:56:48 +0700 Subject: [PATCH 076/203] Fixes to gradle checks --- src/main/java/ClinicEase.java | 2 +- src/main/java/manager/Appointment.java | 2 -- src/main/java/miscellaneous/Parser.java | 4 +++- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index ade2bcf489..b409cccec8 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -53,4 +53,4 @@ public void run() { public static void main(String[] args) { new ClinicEase("data").run(); } -} \ No newline at end of file +} diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index e436664bec..512db43515 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -5,8 +5,6 @@ import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import static java.lang.Integer.parseInt; - public class Appointment { public static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index b2fa4a5003..40cb26193d 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -354,7 +354,9 @@ public static Appointment parseAppointment(String line) { } String[] tokens = line.split("\\|"); - if (tokens.length < 4) return null; + if (tokens.length < 4) { + return null; + } try { String id = tokens[0].trim(); From efbb9b0e52f36d76c4d87940c4d6f71aedc3bf95 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 30 Mar 2025 18:41:23 +0700 Subject: [PATCH 077/203] Adjusted new mark feature to storage --- src/main/java/command/MarkApppointmentCommand.java | 3 ++- src/main/java/command/UnmarkAppointmentCommand.java | 3 ++- src/main/java/manager/Appointment.java | 7 ++++++- src/main/java/manager/ManagementSystem.java | 6 ++++-- src/main/java/miscellaneous/Parser.java | 13 +++++++------ src/main/java/storage/Storage.java | 2 +- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/main/java/command/MarkApppointmentCommand.java b/src/main/java/command/MarkApppointmentCommand.java index fafa4bbf7c..e38d423fe6 100644 --- a/src/main/java/command/MarkApppointmentCommand.java +++ b/src/main/java/command/MarkApppointmentCommand.java @@ -1,5 +1,6 @@ package command; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; import miscellaneous.Ui; @@ -12,7 +13,7 @@ public MarkApppointmentCommand(String apptId) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Appointment appointment = manager.markAppointment(apptId); ui.showAppointmentMarked(manager.getAppointments(), appointment, apptId); } diff --git a/src/main/java/command/UnmarkAppointmentCommand.java b/src/main/java/command/UnmarkAppointmentCommand.java index 815995cc95..ad5b4ae003 100644 --- a/src/main/java/command/UnmarkAppointmentCommand.java +++ b/src/main/java/command/UnmarkAppointmentCommand.java @@ -1,5 +1,6 @@ package command; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; import miscellaneous.Ui; @@ -12,7 +13,7 @@ public UnmarkAppointmentCommand(String apptId) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Appointment appointment = manager.unmarkAppointment(apptId); ui.showAppointmentUnmarked(manager.getAppointments(), appointment, apptId); } diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index 512db43515..b7bacbefa8 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -80,6 +80,10 @@ public void unmarkAsDone() { this.isDone = false; } + public void setIsDone(boolean mark) { + this.isDone = mark; + } + public String getStatusIcon() { return (isDone ? "X" : " "); } @@ -91,6 +95,7 @@ public String toString() { } public String toFileFormat() { - return id.substring(1) + "|" + this.nric + "|" + dateTime.format(OUTPUT_FORMAT) + "|" + this.description; + return id.substring(1) + "|" + this.isDone + "|" + this.nric + "|" + + dateTime.format(OUTPUT_FORMAT) + "|" + this.description; } } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index ca1f514375..67b855c0ac 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -234,20 +234,22 @@ public List sortAppointmentsById(List appointments) { } //@@author dylancmznus - public Appointment markAppointment(String apptId) { + public Appointment markAppointment(String apptId) throws UnloadedStorageException { for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { appointment.markAsDone(); + Storage.saveAppointments(appointments); return appointment; } } return null; } - public Appointment unmarkAppointment(String apptId) { + public Appointment unmarkAppointment(String apptId) throws UnloadedStorageException { for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { appointment.unmarkAsDone(); + Storage.saveAppointments(appointments); return appointment; } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 40cb26193d..8255c363ff 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -347,25 +347,26 @@ public static Patient parseLoadPatient(String line) { return new Patient(id, name, dob, gender, address, contact, medHistory); } - public static Appointment parseAppointment(String line) { - // Skip header line like "countId:103" + public static Appointment parseLoadAppointment(String line) { if (line.startsWith("countId:")) { return null; } String[] tokens = line.split("\\|"); - if (tokens.length < 4) { + if (tokens.length < 5) { return null; } try { String id = tokens[0].trim(); - String nric = tokens[1].trim(); - String dateTimeStr = tokens[2].trim(); - String desc = tokens[3].trim(); + boolean isDone = tokens[1].equals("true"); + String nric = tokens[2].trim(); + String dateTimeStr = tokens[3].trim(); + String desc = tokens[4].trim(); LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, Appointment.OUTPUT_FORMAT); Appointment appointment = new Appointment("A" + id, nric, dateTime, desc); + appointment.setIsDone(isDone); return appointment; } catch (Exception e) { diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 622b54d759..c59daa19f1 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -114,7 +114,7 @@ public static List loadAppointments() throws UnloadedStorageExcepti while (scanner.hasNextLine()) { String line = scanner.nextLine(); if (!line.trim().isEmpty()) { - Appointment appointment = Parser.parseAppointment(line); + Appointment appointment = Parser.parseLoadAppointment(line); if (appointment != null) { appointments.add(appointment); } From 1aa83f501c05b51e9968f2b3f8dbce5c90ef7bb5 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 31 Mar 2025 17:28:27 +0800 Subject: [PATCH 078/203] Added Use cases and UG intro --- docs/DeveloperGuide.md | 131 +++++++++++++++++++++++++++++++++++++++++ docs/UserGuide.md | 2 +- 2 files changed, 132 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c7cfb66afe..0ffb5eab95 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -25,6 +25,137 @@ |v1.0|new user|see usage instructions|refer to them when I forget how to use the application| |v2.0|user|find a to-do item by name|locate a to-do without having to go through the entire list| + +## Use Cases + +### Use Case: Add a Patient + +#### MSS +User requests to add a patient, adding the personal details. +ClinicEase adds the patient to the system. +ClinicEase confirms the patient has been added successfully. + +Use case ends. + +#### Extensions +1a. Required details are missing or incorrectly formatted. +1a1. ClinicEase displays an error message. +Use case resumes at step 1. + +1b. A patient with the same NRIC already exists. +1b1. ClinicEase displays an error message. +Use case ends. + +### Use Case: Delete a Patient + +#### MSS +User requests to list patients. +ClinicEase displays a list of patients. +User requests to delete a specific patient from the list. +ClinicEase deletes the patient. + +Use case ends. + +#### Extensions +2a. The patient list is empty. +Use case ends. + +3a. The given NRIC is invalid. +3a1. ClinicEase displays an error message. +Use case resumes at step 2. + +### Use Case: Add an Appointment + +#### MSS +User requests to add appointment, specifying the patient NRIC, date, time, and description. +ClinicEase verifies that the patient exists. +ClinicEase adds the appointment to the system. +ClinicEase confirms that the appointment has been added successfully. + +Use case ends. + +#### Extensions +2a. The patient does not exist in the system. +2a1. ClinicEase displays an error message. +Use case ends. + +1a. Required details are missing or incorrectly formatted. +1a1. ClinicEase displays an error message. +Use case resumes at step 1. + +### Use Case: Delete an Appointment + +#### MSS +User requests to list appointments. +ClinicEase displays a list of appointments. +User requests to delete a specific appointment. +ClinicEase deletes the appointment. + +Use case ends. + +#### Extensions +2a. The appointment list is empty. +Use case ends. + +3a. The given appointment ID is invalid. +3a1. ClinicEase displays an error message. +Use case resumes at step 2. + +### Use Case: View a Patient’s Medical History + +#### MSS +User requests to view patient’s medical history using the patient’s NRIC. +ClinicEase retrieves and displays the medical history of the patient. + +Use case ends. + +#### Extensions +1a. The given NRIC is invalid or does not exist. +1a1. ClinicEase displays an error message. +Use case ends. + +2a. The patient has no recorded medical history. +2a1. ClinicEase informs the user that no history is available. +Use case ends. + +### Use Case: Edit a Patient’s Details + +#### MSS +User requests to edit a patient’s details using the patient’s NRIC and the new details. +ClinicEase verifies that the patient exists. +ClinicEase updates patient’s details. +ClinicEase confirms the update was successful. + +Use case ends. + +#### Extensions +2a. The patient does not exist in the system. +2a1. ClinicEase displays an error message. +Use case ends. + +1a. The provided new details are invalid or missing. +1a1. ClinicEase displays an error message. +Use case resumes at step 1. + +### Use Case: Sort Appointments + +#### MSS +User requests to sort appointments by date or by appointment ID. +ClinicEase sorts the appointments accordingly. +ClinicEase displays the sorted list. + +Use case ends. + +#### Extensions +1a. The appointment list is empty. +1a1. ClinicEase displays a message indicating there are no appointments to sort. +Use case ends. + +1b. The sorting parameter is invalid. +1b1. ClinicEase displays an error message. +Use case resumes at step 1. + + ## Non-Functional Requirements 1. Should work on any mainstream OS as long as it has Java `17` or above installed. 2. The system should efficiently manage up to 1000 patients or appointments without any noticeable performance lag during typical usage. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a70c084d6e..a6a9c8140c 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -2,7 +2,7 @@ ## Introduction -{Give a product intro} +ClinicEase is an application designed to assist doctors in managing patient records and appointments efficiently. It allows the user to add, edit, view, and delete patient information and medical history, as well as schedule and track appointments with ease. With its intuitive command-based interface, ClinicEase ensures smooth and reliable clinic operations. ## Quick Start From 8e7755d22086da1932790cc824dca40729a3076a Mon Sep 17 00:00:00 2001 From: yukuan Date: Tue, 1 Apr 2025 14:49:42 +0800 Subject: [PATCH 079/203] change the story-history logic(no patient no store) --- src/main/java/manager/ManagementSystem.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 67b855c0ac..92a997e48d 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -96,14 +96,11 @@ public void editPatient(String nric, String newName, String newDob, String newGe System.out.println("Patient with NRIC " + nric + " updated successfully."); } - public void storeMedicalHistory(String name, String nric, String medHistory) throws UnloadedStorageException { + public void storeMedicalHistory(String name, String nric, String medHistory) throws UnloadedStorageException{ Patient existingPatient = findPatientByNric(nric); if (existingPatient == null) { - existingPatient = new Patient(nric, name, "", "", "", "", null); - patients.add(existingPatient); - Ui.showLine(); - System.out.println("New patient " + name + " (NRIC: " + nric + ") created."); + throw new UnloadedStorageException("Patient with NRIC not found. Patient's history can not be added"); } else { Ui.showLine(); } From fffa1f8f452a62d01277a0e4d6b93522e71d6687 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Tue, 1 Apr 2025 15:41:01 +0800 Subject: [PATCH 080/203] Added a new PatientNotFoundException --- docs/UserGuide.md | 13 +++--- src/main/java/ClinicEase.java | 3 +- .../java/command/AddAppointmentCommand.java | 3 +- src/main/java/command/Command.java | 3 +- src/main/java/command/EditPatientCommand.java | 3 +- .../java/command/StoreMedHistoryCommand.java | 3 +- .../java/command/ViewMedHistoryCommand.java | 3 +- .../exception/PatientNotFoundException.java | 6 +++ src/main/java/manager/ManagementSystem.java | 24 +++++------ .../command/DeleteAppointmentCommandTest.java | 4 +- .../command/ListAppointmentCommandTest.java | 4 +- .../command/SortAppointmentCommandTest.java | 3 +- .../java/manager/ManagementSystemTest.java | 40 +++++++++++++++++-- test-data/appointment_data.txt | 2 + 14 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 src/main/java/exception/PatientNotFoundException.java create mode 100644 test-data/appointment_data.txt diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a6a9c8140c..dbdbfa94ac 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -6,8 +6,6 @@ ClinicEase is an application designed to assist doctors in managing patient reco ## Quick Start -{Give steps to get started quickly} - 1. Ensure that you have Java 17 or above installed.
**Mac users:** Ensure you have the precise JDK version prescribed [here](https://se-education.org/guides/tutorials/javaInstallationMac.html). @@ -25,11 +23,12 @@ ClinicEase is an application designed to assist doctors in managing patient reco ## Features + > [!NOTE] > - Words in `UPPER_CASE` represent parameters that must be provided by the user.
e.g. in `view-patient NRIC`, `NRIC` is a parameter which can be used as `view-patient S1234567D`. > - Items in square brackets are optional.
- e.g `ic/NRIC [n/NAME] [dob/BIRTHDATE]` can be used as `ic/S1234567D n/John` or as `ic/S1234567D dob/2002-06-07`. + e.g. `ic/NRIC [n/NAME] [dob/BIRTHDATE]` can be used as `ic/S1234567D n/John` or as `ic/S1234567D dob/2002-06-07`. > - Every parameter must be supplied by the user.
e.g. if the command specifies `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`, the user must fill in all parameters for the input to be valid. @@ -46,7 +45,7 @@ Adds a new appointment to the list of appointment. Format: `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION` -* The patient with the specified `NRIC` **must** exist must exist in the system. +* The patient with the specified `NRIC` **must** exist in the system. * `DATE` format: `yyyy-MM-dd`, where `yyyy` is year, `MM` is month, `dd` is day (e.g., `2025-03-31`). * `TIME` format: `HHmm` in 24-hour format (e.g., `1430` for 2:30 PM). @@ -84,7 +83,11 @@ Example of usage: **Q**: How do I transfer my data to another computer? -**A**: {your answer here} +**A**: You can copy the 'data' folder and paste it in the directory that you save your jar file in another computer. + +## Known Issues +1. The parameter `NRIC` can take in + ## Command Summary diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index b409cccec8..221c65ca70 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,6 +1,7 @@ import command.Command; import exception.DuplicatePatientIDException; import exception.InvalidInputFormatException; +import exception.PatientNotFoundException; import exception.UnknownCommandException; import exception.UnloadedStorageException; import manager.ManagementSystem; @@ -44,7 +45,7 @@ public void run() { command.execute(manager, ui); running = !command.isExit(); } catch (InvalidInputFormatException | UnknownCommandException | DuplicatePatientIDException | - UnloadedStorageException | IllegalArgumentException e) { + UnloadedStorageException | PatientNotFoundException e) { ui.showError(e.getMessage()); } } diff --git a/src/main/java/command/AddAppointmentCommand.java b/src/main/java/command/AddAppointmentCommand.java index 3817d6f335..7f60bdb6da 100644 --- a/src/main/java/command/AddAppointmentCommand.java +++ b/src/main/java/command/AddAppointmentCommand.java @@ -1,5 +1,6 @@ package command; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; @@ -14,7 +15,7 @@ public AddAppointmentCommand(Appointment appointment) { } @Override - public void execute(ManagementSystem manager, Ui ui) throws IllegalArgumentException, UnloadedStorageException { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException { manager.addAppointment(appointment); ui.showAppointmentAdded(manager.getAppointments()); } diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index b9d4372d5e..5ea47165e8 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -1,6 +1,7 @@ package command; import exception.DuplicatePatientIDException; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Ui; @@ -8,7 +9,7 @@ public abstract class Command { public abstract void execute(ManagementSystem manager, Ui ui) - throws DuplicatePatientIDException, UnloadedStorageException; + throws DuplicatePatientIDException, UnloadedStorageException, PatientNotFoundException; public boolean isExit() { return false; diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java index e4a29328ac..d1e4e003b7 100644 --- a/src/main/java/command/EditPatientCommand.java +++ b/src/main/java/command/EditPatientCommand.java @@ -1,5 +1,6 @@ package command; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Ui; @@ -14,7 +15,7 @@ public EditPatientCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException { String nric = details[0]; String name = details[1]; String dob = details[2]; diff --git a/src/main/java/command/StoreMedHistoryCommand.java b/src/main/java/command/StoreMedHistoryCommand.java index c0a811877c..1bb0bc971b 100644 --- a/src/main/java/command/StoreMedHistoryCommand.java +++ b/src/main/java/command/StoreMedHistoryCommand.java @@ -1,5 +1,6 @@ package command; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Ui; @@ -16,7 +17,7 @@ public StoreMedHistoryCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException { manager.storeMedicalHistory(name, nric, medHistory); } } diff --git a/src/main/java/command/ViewMedHistoryCommand.java b/src/main/java/command/ViewMedHistoryCommand.java index d4af0c4314..e99a3dd789 100644 --- a/src/main/java/command/ViewMedHistoryCommand.java +++ b/src/main/java/command/ViewMedHistoryCommand.java @@ -1,5 +1,6 @@ package command; +import exception.PatientNotFoundException; import manager.ManagementSystem; import miscellaneous.Ui; @@ -13,7 +14,7 @@ public ViewMedHistoryCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) { + public void execute(ManagementSystem manager, Ui ui) throws PatientNotFoundException { if (type.equals("ic")) { manager.viewMedicalHistoryByNric(nameOrIc); } else { diff --git a/src/main/java/exception/PatientNotFoundException.java b/src/main/java/exception/PatientNotFoundException.java new file mode 100644 index 0000000000..a4b03d7a4a --- /dev/null +++ b/src/main/java/exception/PatientNotFoundException.java @@ -0,0 +1,6 @@ +package exception; + +public class PatientNotFoundException extends Exception { + public PatientNotFoundException(String message) { super(message); } +} + diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 92a997e48d..a5ea185d7a 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,6 +1,7 @@ package manager; import exception.DuplicatePatientIDException; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import miscellaneous.Ui; import storage.Storage; @@ -70,12 +71,11 @@ public Patient viewPatient(String nric) { } //@@author jyukuan - public void editPatient(String nric, String newName, String newDob, String newGender, - String newAddress, String newPhone) throws UnloadedStorageException { + public void editPatient(String nric, String newName, String newDob, String newGender, String newAddress, + String newPhone) throws UnloadedStorageException, PatientNotFoundException { Patient patient = findPatientByNric(nric); if (patient == null) { - System.out.println("Patient with NRIC " + nric + " not found."); - return; + throw new PatientNotFoundException("Patient with NRIC " + nric + " not found."); } if (newName != null && !newName.isBlank()) { patient.setName(newName); @@ -96,11 +96,12 @@ public void editPatient(String nric, String newName, String newDob, String newGe System.out.println("Patient with NRIC " + nric + " updated successfully."); } - public void storeMedicalHistory(String name, String nric, String medHistory) throws UnloadedStorageException{ + public void storeMedicalHistory(String name, String nric, String medHistory) throws PatientNotFoundException, + UnloadedStorageException { Patient existingPatient = findPatientByNric(nric); if (existingPatient == null) { - throw new UnloadedStorageException("Patient with NRIC not found. Patient's history can not be added"); + throw new PatientNotFoundException("Patient with NRIC not found. Patient's history can not be added"); } else { Ui.showLine(); } @@ -116,12 +117,11 @@ public void storeMedicalHistory(String name, String nric, String medHistory) thr Ui.showLine(); } - public void viewMedicalHistoryByNric(String nric) { + public void viewMedicalHistoryByNric(String nric) throws PatientNotFoundException { Patient foundPatients = findPatientByNric(nric.trim()); if (foundPatients == null) { - Ui.showLine(); - System.out.println("No patient/patients found with NRIC " + nric + "."); + throw new PatientNotFoundException("No patient/patients found with NRIC " + nric + "."); } else { Ui.showLine(); Ui.showPatientHistory(foundPatients); @@ -188,13 +188,13 @@ private List findPatientsByName(String name) { } //@@author chwenyee - public void addAppointment(Appointment appointment) throws IllegalArgumentException, UnloadedStorageException { + public void addAppointment(Appointment appointment) throws UnloadedStorageException, PatientNotFoundException { assert appointment != null : "Appointment cannot be null"; assert patients != null : "Patient list cannot be null"; - + Patient patient = findPatientByNric(appointment.getNric()); if (patient == null) { - throw new IllegalArgumentException("Patient with NRIC: " + appointment.getNric() + " not found"); + throw new PatientNotFoundException("Patient with NRIC: " + appointment.getNric() + " not found"); } appointments.add(appointment); diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java index b58d51954c..f1a902fdb4 100644 --- a/src/test/java/command/DeleteAppointmentCommandTest.java +++ b/src/test/java/command/DeleteAppointmentCommandTest.java @@ -1,6 +1,7 @@ package command; import exception.DuplicatePatientIDException; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; @@ -37,7 +38,8 @@ void setUp() throws UnloadedStorageException { } @Test - void execute_validNric_expectAppointmentDeleted() throws DuplicatePatientIDException, UnloadedStorageException { + void execute_validNric_expectAppointmentDeleted() throws DuplicatePatientIDException, UnloadedStorageException, + PatientNotFoundException { Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", "M", "124 High St", "81234567", new ArrayList<>()); new AddPatientCommand(patient).execute(manager, ui); diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index 1b25bf3461..4a27816745 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -1,6 +1,7 @@ package command; import exception.DuplicatePatientIDException; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; @@ -38,7 +39,8 @@ void setUp() throws UnloadedStorageException { } @Test - void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDException, UnloadedStorageException { + void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDException, UnloadedStorageException, + PatientNotFoundException { LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index c643d6ff06..a280514fed 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -1,6 +1,7 @@ package command; import exception.DuplicatePatientIDException; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; @@ -32,7 +33,7 @@ class SortAppointmentCommandTest { private Storage storage; @BeforeEach - void setUp() throws UnloadedStorageException, DuplicatePatientIDException { + void setUp() throws UnloadedStorageException, DuplicatePatientIDException, PatientNotFoundException { storage = new Storage(tempDir.toString()); ui = new Ui(); manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index c4faf601ac..915579fc32 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -1,6 +1,7 @@ package manager; import exception.DuplicatePatientIDException; +import exception.PatientNotFoundException; import exception.UnloadedStorageException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -166,7 +167,7 @@ void viewPatient_emptySystem_patientNotFound() { } @Test - void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageException { + void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageException, PatientNotFoundException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -187,7 +188,8 @@ void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageEx } @Test - void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStorageException { + void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStorageException, + PatientNotFoundException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -208,7 +210,8 @@ void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStor } @Test - void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws UnloadedStorageException { + void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws UnloadedStorageException, + PatientNotFoundException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -229,7 +232,8 @@ void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws Unloaded } @Test - void deleteAppointment_nonExistentId_expectNullReturned() throws UnloadedStorageException { + void deleteAppointment_nonExistentId_expectNullReturned() throws UnloadedStorageException, + PatientNotFoundException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -352,4 +356,32 @@ void findAppointment_nonExistentAppointment_expectNullReturned() { assertNull(foundAppointment, "Non-existent appointment should return null"); } + + + //@@author jyukuan + @Test + void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedHistory() + throws UnloadedStorageException, PatientNotFoundException { + List patients = new ArrayList<>(); + ManagementSystem mhm = new ManagementSystem(patients, new ArrayList<>()); + + LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); + + Patient patient = new Patient("S1234567A", "John Doe", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()); + patients.add(patient); + + mhm.storeMedicalHistory("John Doe", "S1234567A", "Diabetes, Hypertension"); + + assertEquals(1, patients.size(), "There should be one patient stored"); + + Patient storedPatient = patients.get(0); + assertEquals("John Doe", storedPatient.getName(), "Patient name should match"); + assertEquals("S1234567A", storedPatient.getId(), "Patient NRIC should match"); + + List history = storedPatient.getMedicalHistory(); + assertEquals(2, history.size(), "Medical history should contain 2 entries"); + assertTrue(history.contains("Diabetes"), "Medical history should contain 'Diabetes'"); + assertTrue(history.contains("Hypertension"), "Medical history should contain 'Hypertension'"); + } } diff --git a/test-data/appointment_data.txt b/test-data/appointment_data.txt new file mode 100644 index 0000000000..3aa7f17876 --- /dev/null +++ b/test-data/appointment_data.txt @@ -0,0 +1,2 @@ +countId:110 +109|false|S1234567D|2025-03-20 7:00 PM|Medical Checkup From 2d2b032e1ce3a06440af162f37f952be7f3512be Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 1 Apr 2025 16:13:35 +0800 Subject: [PATCH 081/203] Add prescription generation and HTML printing feature --- data/patient_data.txt | 1 + data/prescription_data.txt | 1 + .../prescription_S9876543B_1.html | 62 ++++++ src/main/java/ClinicEase.java | 7 +- .../java/command/AddPrescriptionCommand.java | 39 ++++ .../command/ViewAllPrescriptionsCommand.java | 65 ++++++ .../java/command/ViewPrescriptionCommand.java | 54 +++++ src/main/java/manager/ManagementSystem.java | 75 +++++++ src/main/java/manager/Patient.java | 8 + src/main/java/manager/Prescription.java | 195 ++++++++++++++++++ src/main/java/miscellaneous/Parser.java | 69 ++++++- src/main/java/storage/Storage.java | 72 +++++++ test-data/appointment_data.txt | 2 + 13 files changed, 646 insertions(+), 4 deletions(-) create mode 100644 data/prescription_data.txt create mode 100644 data/prescriptions/prescription_S9876543B_1.html create mode 100644 src/main/java/command/AddPrescriptionCommand.java create mode 100644 src/main/java/command/ViewAllPrescriptionsCommand.java create mode 100644 src/main/java/command/ViewPrescriptionCommand.java create mode 100644 src/main/java/manager/Prescription.java create mode 100644 test-data/appointment_data.txt diff --git a/data/patient_data.txt b/data/patient_data.txt index e69de29bb2..e8577bb133 100644 --- a/data/patient_data.txt +++ b/data/patient_data.txt @@ -0,0 +1 @@ +S9876543B|Jane Smith|1985-06-15|Female|123 Health Street|91234567|[] diff --git a/data/prescription_data.txt b/data/prescription_data.txt new file mode 100644 index 0000000000..d74f2bb538 --- /dev/null +++ b/data/prescription_data.txt @@ -0,0 +1 @@ +S9876543B-1|S9876543B|2025-04-01 16:09|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals diff --git a/data/prescriptions/prescription_S9876543B_1.html b/data/prescriptions/prescription_S9876543B_1.html new file mode 100644 index 0000000000..ad65aff19b --- /dev/null +++ b/data/prescriptions/prescription_S9876543B_1.html @@ -0,0 +1,62 @@ + + + + + + Prescription S9876543B-1 + + + +
+
+

ClinicEase Medical Prescription

+

Prescription ID: S9876543B-1

+

Date: 2025-04-01 16:09

+
+
+

Patient Information

+ + + + + + +
Patient ID:S9876543B
Name:Jane Smith
Gender:Female
Date of Birth:1985-06-15
Contact:91234567
+
+
+

Symptoms

+
    +
  • High blood sugar
  • +
  • Fatigue
  • +
+
+
+

Prescribed Medications

+
    +
  • Metformin
  • +
  • Blood pressure pills
  • +
+
+
+

Special Instructions

+

Take with meals

+
+ +
+ + diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index b409cccec8..ecda7d596f 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -6,10 +6,12 @@ import manager.ManagementSystem; import manager.Patient; import manager.Appointment; +import manager.Prescription; import miscellaneous.Parser; import miscellaneous.Ui; import storage.Storage; +import java.util.ArrayList; import java.util.List; public class ClinicEase { @@ -26,10 +28,11 @@ public ClinicEase(String filePath) { try { List patients = Storage.loadPatients(); List appointments = Storage.loadAppointments(); - this.manager = new ManagementSystem(patients, appointments); + List prescriptions = Storage.loadPrescriptions(); + this.manager = new ManagementSystem(patients, appointments, prescriptions); } catch (UnloadedStorageException e) { ui.showError("Could not load data: " + e.getMessage()); - this.manager = new ManagementSystem(null, null); + this.manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); } } diff --git a/src/main/java/command/AddPrescriptionCommand.java b/src/main/java/command/AddPrescriptionCommand.java new file mode 100644 index 0000000000..37167fc12d --- /dev/null +++ b/src/main/java/command/AddPrescriptionCommand.java @@ -0,0 +1,39 @@ +package command; + +import exception.UnloadedStorageException; +import manager.ManagementSystem; +import manager.Prescription; +import miscellaneous.Ui; + +import java.util.List; + +//@@author Basudeb2005 +public class AddPrescriptionCommand extends Command { + private final Prescription prescription; + + public AddPrescriptionCommand(Prescription prescription) { + this.prescription = prescription; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { + try { + manager.addPrescription(prescription); + ui.showLine(); + System.out.println("Successfully added prescription:"); + System.out.println(prescription.toString()); + System.out.println(""); + System.out.println("Prescription has been generated."); + System.out.println("View the prescription for the patient with ID: " + prescription.getPatientId()); + System.out.println("and prescription ID: " + prescription.getPrescriptionId()); + ui.showLine(); + } catch (IllegalArgumentException e) { + ui.showError("Failed to add prescription: " + e.getMessage()); + } + } + + @Override + public boolean isExit() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/command/ViewAllPrescriptionsCommand.java b/src/main/java/command/ViewAllPrescriptionsCommand.java new file mode 100644 index 0000000000..b87089a516 --- /dev/null +++ b/src/main/java/command/ViewAllPrescriptionsCommand.java @@ -0,0 +1,65 @@ +package command; + +import exception.UnloadedStorageException; +import manager.ManagementSystem; +import manager.Patient; +import manager.Prescription; +import miscellaneous.Ui; + +import java.util.List; + +//@@author Basudeb2005 +public class ViewAllPrescriptionsCommand extends Command { + private final String patientId; + + public ViewAllPrescriptionsCommand(String patientId) { + this.patientId = patientId; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { + Patient patient = manager.viewPatient(patientId); + if (patient == null) { + ui.showError("Patient with ID " + patientId + " not found."); + return; + } + + List prescriptions = manager.getPrescriptionsForPatient(patientId); + + ui.showLine(); + if (prescriptions.isEmpty()) { + System.out.println("No prescriptions found for patient " + patient.getName() + " (" + patientId + ")."); + } else { + System.out.println("Prescriptions for patient " + patient.getName() + " (" + patientId + "):"); + System.out.println(""); + + for (Prescription prescription : prescriptions) { + System.out.println("Prescription ID: " + prescription.getPrescriptionId()); + System.out.println("Date: " + prescription.getTimestamp().format( + java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); + + System.out.println("Symptoms:"); + for (String symptom : prescription.getSymptoms()) { + System.out.println("- " + symptom); + } + + System.out.println("Medicines:"); + for (String medicine : prescription.getMedicines()) { + System.out.println("- " + medicine); + } + + System.out.println("Notes: " + prescription.getNotes()); + System.out.println(""); + } + + System.out.println("Total prescriptions: " + prescriptions.size()); + System.out.println("Use 'view-prescription PRESCRIPTION_ID' to view details and generate HTML."); + } + ui.showLine(); + } + + @Override + public boolean isExit() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/command/ViewPrescriptionCommand.java b/src/main/java/command/ViewPrescriptionCommand.java new file mode 100644 index 0000000000..1b21f0294c --- /dev/null +++ b/src/main/java/command/ViewPrescriptionCommand.java @@ -0,0 +1,54 @@ +package command; + +import exception.UnloadedStorageException; +import manager.ManagementSystem; +import manager.Patient; +import manager.Prescription; +import miscellaneous.Ui; +import storage.Storage; + +import java.io.File; + +//@@author Basudeb2005 +public class ViewPrescriptionCommand extends Command { + private final String prescriptionId; + + public ViewPrescriptionCommand(String prescriptionId) { + this.prescriptionId = prescriptionId; + } + + @Override + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { + Prescription prescription = manager.getPrescriptionById(prescriptionId); + if (prescription == null) { + ui.showError("Prescription with ID " + prescriptionId + " not found."); + return; + } + + Patient patient = manager.viewPatient(prescription.getPatientId()); + + ui.showLine(); + System.out.println("Prescription details:"); + System.out.println(prescription.toString()); + System.out.println(""); + + // Generate HTML file + Storage.savePrescriptionHtml(prescription, patient); + + String fileName = "prescription_" + prescription.getPatientId() + "_" + + prescription.getPrescriptionId().split("-")[1] + ".html"; + String filePath = new File("").getAbsolutePath() + + File.separator + "data" + + File.separator + "prescriptions" + + File.separator + fileName; + + System.out.println("Prescription HTML file generated at: " + filePath); + System.out.println("Open this file in a web browser to view and print the prescription."); + ui.showLine(); + } + + @Override + public boolean isExit() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 92a997e48d..53e2217bc9 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -12,12 +12,24 @@ public class ManagementSystem { private final List appointments; private final List patients; + private final List prescriptions; public ManagementSystem(List loadedPatients, List loadedAppointments) { assert loadedPatients != null : "Patient list cannot be null"; assert loadedAppointments != null : "Appointment list cannot be null"; appointments = loadedAppointments; patients = loadedPatients; + prescriptions = new ArrayList<>(); + } + + public ManagementSystem(List loadedPatients, List loadedAppointments, + List loadedPrescriptions) { + assert loadedPatients != null : "Patient list cannot be null"; + assert loadedAppointments != null : "Appointment list cannot be null"; + assert loadedPrescriptions != null : "Prescription list cannot be null"; + appointments = loadedAppointments; + patients = loadedPatients; + prescriptions = loadedPrescriptions; } public List getPatients() { @@ -262,4 +274,67 @@ public Appointment findAppointmentByNric(String nric) { return null; } + //@@author Basudeb2005 + public List getPrescriptions() { + return prescriptions; + } + + //@@author Basudeb2005 + public void addPrescription(Prescription prescription) + throws IllegalArgumentException, UnloadedStorageException { + assert prescription != null : "Prescription cannot be null"; + assert patients != null : "Patient list cannot be null"; + + Patient patient = findPatientByNric(prescription.getPatientId()); + if (patient == null) { + throw new IllegalArgumentException("Patient with NRIC: " + prescription.getPatientId() + " not found"); + } + + // Generate prescription ID with counter + int prescriptionCount = 1; + for (Prescription p : prescriptions) { + if (p.getPatientId().equals(prescription.getPatientId())) { + prescriptionCount++; + } + } + + String prescriptionId = prescription.getPatientId() + "-" + prescriptionCount; + + // Create a new prescription with updated ID + Prescription newPrescription = new Prescription( + prescription.getPatientId(), + prescriptionId, + prescription.getTimestamp(), + prescription.getSymptoms(), + prescription.getMedicines(), + prescription.getNotes() + ); + + prescriptions.add(newPrescription); + Storage.savePrescriptions(prescriptions); + + return; + } + + //@@author Basudeb2005 + public List getPrescriptionsForPatient(String patientId) { + List patientPrescriptions = new ArrayList<>(); + for (Prescription prescription : prescriptions) { + if (prescription.getPatientId().equals(patientId)) { + patientPrescriptions.add(prescription); + } + } + return patientPrescriptions; + } + + //@@author Basudeb2005 + public Prescription getPrescriptionById(String prescriptionId) { + for (Prescription prescription : prescriptions) { + if (prescription.getPrescriptionId().equals(prescriptionId)) { + return prescription; + } + } + return null; + } + } diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 7bfc747bd6..3a699f5612 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -46,6 +46,14 @@ public String getDob() { return dob; } + public String getGender() { + return gender; + } + + public String getAddress() { + return address; + } + public String getContactInfo() { return contactInfo; } diff --git a/src/main/java/manager/Prescription.java b/src/main/java/manager/Prescription.java new file mode 100644 index 0000000000..22e9a5fec1 --- /dev/null +++ b/src/main/java/manager/Prescription.java @@ -0,0 +1,195 @@ +package manager; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +//@@author Basudeb2005 +public class Prescription { + private final String patientId; + private final LocalDateTime timestamp; + private final String prescriptionId; + private final List symptoms; + private final List medicines; + private final String notes; + + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + + public Prescription(String patientId, List symptoms, List medicines, String notes) { + this.patientId = patientId; + this.timestamp = LocalDateTime.now(); + this.prescriptionId = patientId + "-" + "1"; // Will be updated to handle numbering + this.symptoms = new ArrayList<>(symptoms); + this.medicines = new ArrayList<>(medicines); + this.notes = notes; + } + + public Prescription(String patientId, String prescriptionId, LocalDateTime timestamp, + List symptoms, List medicines, String notes) { + this.patientId = patientId; + this.timestamp = timestamp; + this.prescriptionId = prescriptionId; + this.symptoms = new ArrayList<>(symptoms); + this.medicines = new ArrayList<>(medicines); + this.notes = notes; + } + + public String getPatientId() { + return patientId; + } + + public String getPrescriptionId() { + return prescriptionId; + } + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public List getSymptoms() { + return symptoms; + } + + public List getMedicines() { + return medicines; + } + + public String getNotes() { + return notes; + } + + @Override + public String toString() { + StringBuilder symptomsStr = new StringBuilder(); + for (String symptom : symptoms) { + symptomsStr.append("- ").append(symptom).append("\n"); + } + + StringBuilder medicinesStr = new StringBuilder(); + for (String medicine : medicines) { + medicinesStr.append("- ").append(medicine).append("\n"); + } + + return String.format( + "Prescription [%s] (%s)\n" + + "Patient ID: %s\n" + + "Symptoms: \n%s" + + "Medicines: \n%s" + + "Notes: %s", + prescriptionId, timestamp.format(DATE_TIME_FORMATTER), + patientId, symptomsStr.toString(), medicinesStr.toString(), notes); + } + + public String toFileFormat() { + return String.join("|", + prescriptionId, + patientId, + timestamp.format(DATE_TIME_FORMATTER), + String.join(",", symptoms), + String.join(",", medicines), + notes); + } + + public static Prescription fromFileFormat(String fileEntry) { + String[] parts = fileEntry.split("\\|"); + String prescriptionId = parts[0]; + String patientId = parts[1]; + LocalDateTime timestamp = LocalDateTime.parse(parts[2], DATE_TIME_FORMATTER); + List symptoms = Arrays.asList(parts[3].split(",")); + List medicines = Arrays.asList(parts[4].split(",")); + String notes = parts[5]; + + return new Prescription(patientId, prescriptionId, timestamp, symptoms, medicines, notes); + } + + public String generateHtml(Patient patient) { + StringBuilder html = new StringBuilder(); + html.append("\n") + .append("\n") + .append("\n") + .append(" \n") + .append(" \n") + .append(" Prescription ").append(prescriptionId).append("\n") + .append(" \n") + .append("\n") + .append("\n") + .append("
\n") + .append("
\n") + .append("

ClinicEase Medical Prescription

\n") + .append("

Prescription ID: ").append(prescriptionId).append("

\n") + .append("

Date: ").append(timestamp.format(DATE_TIME_FORMATTER)).append("

\n") + .append("
\n"); + + if (patient != null) { + html.append("
\n") + .append("

Patient Information

\n") + .append(" \n") + .append(" \n") + .append(" \n") + .append(" \n") + .append(" \n") + .append(" \n") + .append("
Patient ID:").append(patient.getId()).append("
Name:").append(patient.getName()).append("
Gender:").append(patient.getGender()).append("
Date of Birth:").append(patient.getDob()).append("
Contact:").append(patient.getContactInfo()).append("
\n") + .append("
\n"); + } else { + html.append("
\n") + .append("

Patient Information

\n") + .append(" \n") + .append(" \n") + .append("
Patient ID:").append(patientId).append("
\n") + .append("
\n"); + } + + html.append("
\n") + .append("

Symptoms

\n") + .append("
    \n"); + + for (String symptom : symptoms) { + html.append("
  • ").append(symptom).append("
  • \n"); + } + + html.append("
\n") + .append("
\n") + .append("
\n") + .append("

Prescribed Medications

\n") + .append("
    \n"); + + for (String medicine : medicines) { + html.append("
  • ").append(medicine).append("
  • \n"); + } + + html.append("
\n") + .append("
\n"); + + if (notes != null && !notes.isEmpty()) { + html.append("
\n") + .append("

Special Instructions

\n") + .append("

").append(notes).append("

\n") + .append("
\n"); + } + + html.append("
\n") + .append("

This prescription was generated by ClinicEase System

\n") + .append(" \n") + .append("
\n") + .append("
\n") + .append("\n") + .append("\n"); + + return html.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 8255c363ff..048647aed2 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -18,10 +18,14 @@ import command.MarkApppointmentCommand; import command.UnmarkAppointmentCommand; import command.FindAppointmentCommand; +import command.AddPrescriptionCommand; +import command.ViewAllPrescriptionsCommand; +import command.ViewPrescriptionCommand; import exception.InvalidInputFormatException; import exception.UnknownCommandException; import manager.Appointment; import manager.Patient; +import manager.Prescription; import java.time.LocalDateTime; import java.time.format.DateTimeParseException; @@ -70,6 +74,12 @@ public static Command parse(String userInput) throws InvalidInputFormatException return new UnmarkAppointmentCommand(parseUnmarkAppointment(userInput)); case "find-appointment": return new FindAppointmentCommand(parseFindAppointment(userInput)); + case "add-prescription": + return new AddPrescriptionCommand(parseAddPrescription(userInput)); + case "view-all-prescriptions": + return new ViewAllPrescriptionsCommand(parseViewAllPrescriptions(userInput)); + case "view-prescription": + return new ViewPrescriptionCommand(parseViewPrescription(userInput)); default: throw new UnknownCommandException("Unknown command. Please try again."); } @@ -251,7 +261,7 @@ private static String extractValue(String input, String prefix) { int start = -1; // Find the first occurrence of the prefix that is either at the start or come before blank space - // Ensure checks are not done at where the prefix can’t fully fit + // Ensure checks are not done at where the prefix can't fully fit for (int i = 0; i <= lowerInput.length() - lowerPrefix.length(); i++) { boolean isParamPrefixMatch = lowerInput.startsWith(lowerPrefix, i); // Check if the character before the prefix is blank space in input to have a valid input format @@ -267,7 +277,7 @@ private static String extractValue(String input, String prefix) { } start += prefix.length(); - String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/", "h/", "old/", "new/"}; + String[] possible = {"n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", "dsc/", "h/", "old/", "new/", "s/", "m/", "nt/"}; int end = input.length(); // Determine where the current parameter's detail ends by finding the start of the next parameter @@ -374,5 +384,60 @@ public static Appointment parseLoadAppointment(String line) { } } + public static Prescription parseAddPrescription(String input) throws InvalidInputFormatException { + String temp = input.replaceFirst("(?i)add-prescription\\s*", ""); + + String patientId = extractValue(temp, "ic/"); + String symptoms = extractValue(temp, "s/"); + String medicines = extractValue(temp, "m/"); + String notes = extractValue(temp, "nt/"); + + if (patientId == null || symptoms == null || medicines == null) { + String msg = "Missing details or wrong format for add-prescription!" + System.lineSeparator() + + "Please use: add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]"; + throw new InvalidInputFormatException(msg); + } + + // Split symptoms by comma + List symptomsList = new ArrayList<>(); + if (symptoms != null && !symptoms.trim().isEmpty()) { + String[] entries = symptoms.split(",\\s*"); + for (String entry : entries) { + symptomsList.add(entry.trim()); + } + } + + // Split medicines by comma + List medicinesList = new ArrayList<>(); + if (medicines != null && !medicines.trim().isEmpty()) { + String[] entries = medicines.split(",\\s*"); + for (String entry : entries) { + medicinesList.add(entry.trim()); + } + } + + // Notes is optional, so it can be null + String finalNotes = (notes != null) ? notes.trim() : ""; + + return new Prescription(patientId.trim(), symptomsList, medicinesList, finalNotes); + } + + public static String parseViewAllPrescriptions(String input) throws InvalidInputFormatException { + if (input.length() < 22) { + throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID"); + } + + String patientId = input.substring(22).trim(); + return patientId; + } + + public static String parseViewPrescription(String input) throws InvalidInputFormatException { + if (input.length() < 17) { + throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID"); + } + + String prescriptionId = input.substring(17).trim(); + return prescriptionId; + } } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index c59daa19f1..ab5ec99e5a 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -3,6 +3,7 @@ import exception.UnloadedStorageException; import manager.Appointment; import manager.Patient; +import manager.Prescription; import miscellaneous.Parser; import java.io.BufferedWriter; @@ -17,11 +18,15 @@ public class Storage { private static String directoryPath; private static String patientFilePath; private static String appointmentFilePath; + private static String prescriptionFilePath; + private static String prescriptionDirPath; public Storage(String directory) { directoryPath = directory; patientFilePath = directory + File.separator + "patient_data.txt"; appointmentFilePath = directory + File.separator + "appointment_data.txt"; + prescriptionFilePath = directory + File.separator + "prescription_data.txt"; + prescriptionDirPath = directory + File.separator + "prescriptions"; } public static void savePatients(List patientList) throws UnloadedStorageException { @@ -129,4 +134,71 @@ public static List loadAppointments() throws UnloadedStorageExcepti return appointments; } + + public static void savePrescriptions(List prescriptionList) throws UnloadedStorageException { + if (directoryPath == null || prescriptionFilePath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } + + File dir = new File(directoryPath); + if (!dir.exists()) { + dir.mkdirs(); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(prescriptionFilePath))) { + for (Prescription prescription : prescriptionList) { + writer.write(prescription.toFileFormat()); + writer.newLine(); + } + } catch (IOException e) { + throw new UnloadedStorageException("Unable to save prescriptions!"); + } + } + + public static List loadPrescriptions() throws UnloadedStorageException { + List prescriptions = new ArrayList<>(); + File file = new File(prescriptionFilePath); + + if (!file.exists()) { + return prescriptions; + } + + try (Scanner scanner = new Scanner(file)) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + if (!line.trim().isEmpty()) { + Prescription prescription = Prescription.fromFileFormat(line); + if (prescription != null) { + prescriptions.add(prescription); + } + } + } + } catch (Exception e) { + throw new UnloadedStorageException("Unable to load prescription data: " + e.getMessage()); + } + + return prescriptions; + } + + public static void savePrescriptionHtml(Prescription prescription, Patient patient) + throws UnloadedStorageException { + if (directoryPath == null || prescriptionDirPath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } + + File dir = new File(prescriptionDirPath); + if (!dir.exists()) { + dir.mkdirs(); + } + + String fileName = "prescription_" + prescription.getPatientId() + "_" + + prescription.getPrescriptionId().split("-")[1] + ".html"; + String filePath = prescriptionDirPath + File.separator + fileName; + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { + writer.write(prescription.generateHtml(patient)); + } catch (IOException e) { + throw new UnloadedStorageException("Unable to generate HTML prescription: " + e.getMessage()); + } + } } diff --git a/test-data/appointment_data.txt b/test-data/appointment_data.txt new file mode 100644 index 0000000000..755d09abaf --- /dev/null +++ b/test-data/appointment_data.txt @@ -0,0 +1,2 @@ +countId:124 +123|false|S1234567D|2025-03-20 7:00 pm|Medical Checkup From 9a1dfd492f2b5457b3d89d105ad8a031e9e42224 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 1 Apr 2025 16:31:59 +0800 Subject: [PATCH 082/203] Fix checkstyle issues in prescription feature --- data/prescription_data.txt | 1 + src/main/java/command/AddPrescriptionCommand.java | 5 ++--- src/main/java/command/ViewAllPrescriptionsCommand.java | 3 ++- src/main/java/command/ViewPrescriptionCommand.java | 3 ++- src/main/java/manager/Prescription.java | 7 ++++--- src/main/java/miscellaneous/Parser.java | 3 ++- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/data/prescription_data.txt b/data/prescription_data.txt index d74f2bb538..4b2c0dec3f 100644 --- a/data/prescription_data.txt +++ b/data/prescription_data.txt @@ -1 +1,2 @@ S9876543B-1|S9876543B|2025-04-01 16:09|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals +S9876543B-2|S9876543B|2025-04-01 16:30|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals diff --git a/src/main/java/command/AddPrescriptionCommand.java b/src/main/java/command/AddPrescriptionCommand.java index 37167fc12d..88fd4797d0 100644 --- a/src/main/java/command/AddPrescriptionCommand.java +++ b/src/main/java/command/AddPrescriptionCommand.java @@ -5,8 +5,6 @@ import manager.Prescription; import miscellaneous.Ui; -import java.util.List; - //@@author Basudeb2005 public class AddPrescriptionCommand extends Command { private final Prescription prescription; @@ -36,4 +34,5 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep public boolean isExit() { return false; } -} \ No newline at end of file +} + diff --git a/src/main/java/command/ViewAllPrescriptionsCommand.java b/src/main/java/command/ViewAllPrescriptionsCommand.java index b87089a516..bc33309eb1 100644 --- a/src/main/java/command/ViewAllPrescriptionsCommand.java +++ b/src/main/java/command/ViewAllPrescriptionsCommand.java @@ -62,4 +62,5 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep public boolean isExit() { return false; } -} \ No newline at end of file +} + diff --git a/src/main/java/command/ViewPrescriptionCommand.java b/src/main/java/command/ViewPrescriptionCommand.java index 1b21f0294c..d6dea84dff 100644 --- a/src/main/java/command/ViewPrescriptionCommand.java +++ b/src/main/java/command/ViewPrescriptionCommand.java @@ -51,4 +51,5 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep public boolean isExit() { return false; } -} \ No newline at end of file +} + diff --git a/src/main/java/manager/Prescription.java b/src/main/java/manager/Prescription.java index 22e9a5fec1..04d98a6aea 100644 --- a/src/main/java/manager/Prescription.java +++ b/src/main/java/manager/Prescription.java @@ -8,6 +8,8 @@ //@@author Basudeb2005 public class Prescription { + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + private final String patientId; private final LocalDateTime timestamp; private final String prescriptionId; @@ -15,8 +17,6 @@ public class Prescription { private final List medicines; private final String notes; - private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - public Prescription(String patientId, List symptoms, List medicines, String notes) { this.patientId = patientId; this.timestamp = LocalDateTime.now(); @@ -192,4 +192,5 @@ public String generateHtml(Patient patient) { return html.toString(); } -} \ No newline at end of file +} + diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 048647aed2..6f5c0d906d 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -290,7 +290,8 @@ private static String extractValue(String input, String prefix) { for (int i = start; i <= lowerInput.length() - lowerP.length(); i++) { boolean isNextParamPrefixMatch = lowerInput.startsWith(lowerP, i); // Check if the character before the prefix is blank space in input to have a valid input format - boolean isNextParamAtValidPosition = (i == 0) || Character.isWhitespace(input.charAt(i - 1)); + boolean isNextParamAtValidPosition = (i == 0) + || Character.isWhitespace(input.charAt(i - 1)); if (isNextParamPrefixMatch && isNextParamAtValidPosition) { if (i < end) { end = i; From 91771035beaa43c61ad37d22273a86ee71001366 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 1 Apr 2025 16:35:42 +0800 Subject: [PATCH 083/203] Fix remaining checkstyle line length issues --- src/main/java/manager/Prescription.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/manager/Prescription.java b/src/main/java/manager/Prescription.java index 04d98a6aea..b6f3496c1a 100644 --- a/src/main/java/manager/Prescription.java +++ b/src/main/java/manager/Prescription.java @@ -115,11 +115,13 @@ public String generateHtml(Patient patient) { .append(" + + +
+
+

ClinicEase Medical Prescription

+

Prescription ID: S9876543B-8

+

Date: 2025-04-01 17:01

+
+
+

Patient Information

+ + + + + + +
Patient ID:S9876543B
Name:Jane Smith
Gender:Female
Date of Birth:1985-06-15
Contact:91234567
+
+
+

Symptoms

+
    +
  • Joint pain
  • +
  • Inflammation
  • +
+
+
+

Prescribed Medications

+
    +
  • Ibuprofen
  • +
  • Calcium supplements
  • +
+
+
+

Special Instructions

+

Take after food and avoid strenuous activity

+
+ +
+ + diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0ffb5eab95..b97b231a01 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -20,11 +20,21 @@ ## User Stories -|Version| As a ... | I want to ... | So that I can ...| -|--------|----------|---------------|------------------| -|v1.0|new user|see usage instructions|refer to them when I forget how to use the application| -|v2.0|user|find a to-do item by name|locate a to-do without having to go through the entire list| - +| Version | As a ... | I want to ... | So that I can ... | +|---------|----------|---------------|-------------------| +| v1.0 | doctor | add my patients' personal details | I can add them into the system | +| v1.0 | doctor | delete my patients' personal details | I can remove them from the system | +| v1.0 | doctor | view my certain patient's personal details | I can view them in the system | +| v1.0 | doctor | add appointments into my schedule | I can add appointments plan from a patient needed to be tracked | +| v1.0 | doctor | delete appointments from my schedule | I can get rid of appointments no longer needed to track | +| v1.0 | doctor | list my upcoming appointments | I can manage my time effectively without manual scheduling | +| v1.0 | doctor | store patients' medical history | I can understand the patient's situation better | +| v1.0 | doctor | check all medical histories for one certain patient | I can know what happened before the patient come | +| v2.0 | doctor | add a new prescription for a patient | record the prescribed medications and instructions | +| v2.0 | doctor | view all prescriptions for a patient | track the patient's medication history | +| v2.0 | doctor | add symptoms to a prescription | document the patient's condition | +| v2.0 | doctor | add special notes to prescriptions | provide additional instructions to patients | +| v2.0 | doctor | generate a printable prescription | provide a professional document to the patient | ## Use Cases @@ -101,10 +111,10 @@ Use case ends. 3a1. ClinicEase displays an error message. Use case resumes at step 2. -### Use Case: View a Patient’s Medical History +### Use Case: View a Patient's Medical History #### MSS -User requests to view patient’s medical history using the patient’s NRIC. +User requests to view patient's medical history using the patient's NRIC. ClinicEase retrieves and displays the medical history of the patient. Use case ends. @@ -118,12 +128,12 @@ Use case ends. 2a1. ClinicEase informs the user that no history is available. Use case ends. -### Use Case: Edit a Patient’s Details +### Use Case: Edit a Patient's Details #### MSS -User requests to edit a patient’s details using the patient’s NRIC and the new details. +User requests to edit a patient's details using the patient's NRIC and the new details. ClinicEase verifies that the patient exists. -ClinicEase updates patient’s details. +ClinicEase updates patient's details. ClinicEase confirms the update was successful. Use case ends. @@ -166,7 +176,7 @@ Use case resumes at step 1. ## Glossary * *Mainstream OS* - Windows, Linux, Unix, macOS -* *Performance Lag* – A noticeable delay or slowdown in the system’s response to user actions. +* *Performance Lag* – A noticeable delay or slowdown in the system's response to user actions. * *Error Messages* – System-generated messages that inform users of incorrect input and provide guidance on how to fix it. * *OS Platform Compatibility* – The ability for data files and system functionality to work consistently across different operating systems. @@ -180,12 +190,12 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ## 1. Getting Started 1. **Compilation** - - Navigate to the project’s root folder (where the `ClinicEase.java` and other `.java` files reside). + - Navigate to the project's root folder (where the `ClinicEase.java` and other `.java` files reside). - Compile the source files. For example: ``` javac *.java ``` - - Alternatively, use your favorite IDE’s build tool. + - Alternatively, use your favorite IDE's build tool. 2. **Launching the Application** - Run the compiled main class: @@ -297,7 +307,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application No patients have been added. -------------------------------------------------------------------------------- ``` -3. If the patient doesn’t exist, it notifies you accordingly. +3. If the patient doesn't exist, it notifies you accordingly. --- @@ -339,7 +349,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application store-history n/Bob Lee ic/S7654321B h/Diabetes,High cholesterol ``` -2. If the patient doesn’t exist, the system creates a new one and prints a confirmation message. If the patient exists, it simply adds new history entries. +2. If the patient doesn't exist, the system creates a new one and prints a confirmation message. If the patient exists, it simply adds new history entries. --- @@ -355,7 +365,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` view-history ic/S7654321B ``` -2. Displays the patient’s history if found. Otherwise, notifies you that it cannot find the patient. +2. Displays the patient's history if found. Otherwise, notifies you that it cannot find the patient. --- @@ -386,7 +396,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` add-appointment ic/S1234567A dt/2025-12-01 t/0930 dsc/Dental Checkup ``` -2. If the patient is found, the system adds the appointment and shows a success message. If the patient doesn’t exist, it prints an error. +2. If the patient is found, the system adds the appointment and shows a success message. If the patient doesn't exist, it prints an error. --- @@ -400,7 +410,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application list-appointment ``` -2. Shows all appointments if any exist. Otherwise, prints a “No appointments found” message. +2. Shows all appointments if any exist. Otherwise, prints a "No appointments found" message. --- @@ -452,7 +462,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` find-appointment S1234567A ``` -2. If any matching appointment is found, it prints the details. Otherwise, it prints “No appointment found.” +2. If any matching appointment is found, it prints the details. Otherwise, it prints "No appointment found." --- @@ -466,7 +476,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application - **Missing or Invalid Parameters** - For instance, `add-appointment` missing the `dt/DATE` should trigger an error message (`InvalidInputFormatException`). - **Storage Failures** -- If there’s an I/O error with reading or writing to `patient_data.txt`, you might see `UnloadedStorageException`. +- If there's an I/O error with reading or writing to `patient_data.txt`, you might see `UnloadedStorageException`. --- diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index ecda7d596f..a25d156927 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -43,6 +43,9 @@ public void run() { while (running) { try { String input = ui.readCommand(); + if (input.isEmpty()) { + continue; + } Command command = Parser.parse(input); command.execute(manager, ui); running = !command.isExit(); diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 2a56c3835b..9a91e3813d 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -37,6 +37,11 @@ public class Parser { public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { + // Handle empty input + if (userInput == null || userInput.trim().isEmpty()) { + throw new InvalidInputFormatException("Please enter a command."); + } + // Split into two parts to extract the command keyword and its detail String[] parts = userInput.split(" ", 2); String commandWord = parts[0].toLowerCase(); From 71bfc98d919a1cc998a079f2826d47f15bb71feb Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 1 Apr 2025 23:51:19 +0800 Subject: [PATCH 088/203] Add Add prescription feature related UG and DG updates --- docs/DeveloperGuide.md | 105 +++++++++++++++++++++++++++++++++++++++++ docs/UserGuide.md | 42 +++++++++++++++++ 2 files changed, 147 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b97b231a01..c1d9744de5 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -165,6 +165,73 @@ Use case ends. 1b1. ClinicEase displays an error message. Use case resumes at step 1. +### Use case: Add a new prescription + +**MSS** + +1. Doctor requests to add a new prescription +2. System prompts for prescription details (patient ID, symptoms, medicines, optional notes) +3. Doctor enters the required information +4. System validates the patient ID exists +5. System generates a unique prescription ID +6. System saves the prescription +7. System displays success message with the prescription details + + Use case ends. + +**Extensions** + +* 4a. Patient ID does not exist + * 4a1. System shows an error message + * 4a2. Use case resumes at step 2 + +* 3a. Required fields are missing + * 3a1. System shows error message with correct format + * 3a2. Use case resumes at step 2 + +### Use case: View all prescriptions for a patient + +**MSS** + +1. Doctor requests to view all prescriptions for a patient +2. Doctor enters patient ID +3. System validates patient exists +4. System retrieves and displays all prescriptions for the patient + + Use case ends. + +**Extensions** + +* 3a. Patient ID does not exist + * 3a1. System shows an error message + * 3a2. Use case ends + +* 4a. No prescriptions found + * 4a1. System shows "No prescriptions found" message + * 4a2. Use case ends + +### Use case: View and generate HTML prescription + +**MSS** + +1. Doctor requests to view a specific prescription +2. Doctor enters prescription ID +3. System validates prescription exists +4. System displays prescription details +5. System generates HTML version +6. System shows location of generated file + + Use case ends. + +**Extensions** + +* 3a. Prescription ID does not exist + * 3a1. System shows an error message + * 3a2. Use case ends + +* 5a. HTML generation fails + * 5a1. System shows error message + * 5a2. Use case ends ## Non-Functional Requirements 1. Should work on any mainstream OS as long as it has Java `17` or above installed. @@ -488,4 +555,42 @@ Below is a suggested guide for **manual testing** of the ClinicEase application 4. **Delete a patient** and confirm the removal. 5. **Exit** the program with `bye`. +--- + +### Managing Prescriptions + +1. Adding a new prescription + + Prerequisites: Patient with ID "S9876543B" exists in the system. + + Test case: `add-prescription ic/S9876543B s/Fever, Cough m/Paracetamol, Cough syrup nt/Take after meals` + * Expected: Prescription is added. Details of the new prescription shown. + + Test case: `add-prescription ic/S9876543B s/Fever m/` + * Expected: Error shown. Missing medicines field. + + Test case: `add-prescription ic/X1234567Y s/Fever m/Paracetamol` + * Expected: Error shown. Patient ID does not exist. + +2. Viewing prescriptions + + Prerequisites: At least one prescription exists for patient "S9876543B". + + Test case: `view-all-prescriptions S9876543B` + * Expected: List of all prescriptions for the patient shown. + + Test case: `view-prescription S9876543B-1` + * Expected: Details of the specific prescription shown. HTML file generated. + + Test case: `view-prescription INVALID-ID` + * Expected: Error shown. Invalid prescription ID. + +3. Generating HTML prescriptions + + Prerequisites: Valid prescription exists with ID "S9876543B-1". + + Test case: `view-prescription S9876543B-1` + * Expected: HTML file generated in data/prescriptions folder. + * Verify: Open the generated HTML file in a browser. Check that all prescription details are correctly displayed. + --- \ No newline at end of file diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a6a9c8140c..ef12145f25 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -80,6 +80,43 @@ Example of usage: * `sort-appointment byDate` * `sort-appointment byId` +### Managing Prescriptions + +#### Adding a prescription: `add-prescription` + +Adds a new prescription for a patient. + +Format: `add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]` + +* `PATIENT_ID` must be a valid patient ID in the system +* `SYMPTOMS` is a comma-separated list of symptoms +* `MEDICINES` is a comma-separated list of prescribed medications +* `NOTES` is optional and can contain special instructions + +Example: +* `add-prescription ic/S9876543B s/Fever, Cough m/Paracetamol, Cough syrup nt/Take after meals` + +#### Viewing all prescriptions: `view-all-prescriptions` + +Shows all prescriptions for a specific patient. + +Format: `view-all-prescriptions PATIENT_ID` + +Example: +* `view-all-prescriptions S9876543B` + +#### Viewing specific prescription: `view-prescription` + +Views details of a specific prescription and generates a printable HTML version. + +Format: `view-prescription PRESCRIPTION_ID` + +* The HTML file will be generated in the data/prescriptions folder +* Open the HTML file in a web browser to view and print + +Example: +* `view-prescription S9876543B-1` + ## FAQ **Q**: How do I transfer my data to another computer? @@ -105,6 +142,11 @@ Example of usage: | Unmark appointment | `unmark-appointment APPOINTMENT_ID`
e.g. `unmark-appointment A101` | | Sort appointment | `sort-appointment byDate` or `sort-appointment byId` | | Find appointment | `find-appointment PATIENT_NRIC`
e.g. `find-appointment S1234567D` | +| Prescription Management + +* Add prescription : `add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]` +* View all prescriptions : `view-all-prescriptions PATIENT_ID` +* View specific prescription : `view-prescription PRESCRIPTION_ID` # About us From e94a47952f0b7b2a0ea6f753ca42ea42b4628b88 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Wed, 2 Apr 2025 10:49:00 +0800 Subject: [PATCH 089/203] Added UG features --- docs/UserGuide.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 78e6acc32c..a954c9c412 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -41,6 +41,26 @@ ClinicEase is an application designed to assist doctors in managing patient reco > - Command words are **case-insensitive**.
e.g. `liST-paTIEnt` will be interpreted as `list-patient`. +### Viewing patient details: `view-patient` +Displays the details of a specific patient. + +Format: `view-patient NRIC` + +* The `NRIC` must be of a patient existing in the system. + +Example of usage: + +`view-patient S1234567D` + +### Listing all patients: `list-patient` +Displays a list of all registered patients in the system with details provided. + +Format: `list-patient` + +Example of usage: + +`list-patient` + ### Adding an appointment: `add-appointment` Adds a new appointment to the list of appointment. @@ -80,6 +100,29 @@ Example of usage: * `sort-appointment byDate` * `sort-appointment byId` +### Marking an appointment as done: `mark-appointment` +Marks a specified appointment as done. + +Format: `mark-appointment APPOINTMENT_ID` + +* The `APPOINTMENT_ID` refers to the unique identifier assigned by the system to an appointment. +* A completed appointment will be marked accordingly in the system. + +Example of usage: + +`mark-appointment A100` + +### Unmarking a completed appointment: `unmark-appointment` +Unmarks a completed appointment, setting it back to pending. + +Format: `unmark-appointment APPOINTMENT_ID` + +* The `APPOINTMENT_ID` must belong to an appointment that has been marked as completed. + +Example of usage: + +`unmark-appointment A100` + ### Managing Prescriptions #### Adding a prescription: `add-prescription` From 74676360ea600d0386f96bc6a564c293f4eb62c3 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Wed, 2 Apr 2025 10:58:13 +0800 Subject: [PATCH 090/203] Added find appt in UG --- docs/UserGuide.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a954c9c412..11c425be29 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -123,6 +123,17 @@ Example of usage: `unmark-appointment A100` +### Finding a patient's appointments: `find-appointment` +Searches for appointments based on the patient's NRIC. + +Format: `find-appointment NRIC` + +* The `NRIC` must match a registered patient’s NRIC in the system. +* All appointments associated with the specified NRIC will be displayed. + +Example of usage: +* `find-appointment S1234567D` + ### Managing Prescriptions #### Adding a prescription: `add-prescription` From 1bf8ed20851625cabdff9958bf89231bd7706deb Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Wed, 2 Apr 2025 15:55:50 +0800 Subject: [PATCH 091/203] Fixed checkstyle for PatientNotFoundException --- docs/UserGuide.md | 2 +- src/main/java/exception/PatientNotFoundException.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index dbdbfa94ac..846341f7d3 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -86,7 +86,7 @@ Example of usage: **A**: You can copy the 'data' folder and paste it in the directory that you save your jar file in another computer. ## Known Issues -1. The parameter `NRIC` can take in +1. The parameter `NRIC` can take in any format. ## Command Summary diff --git a/src/main/java/exception/PatientNotFoundException.java b/src/main/java/exception/PatientNotFoundException.java index a4b03d7a4a..d55d497689 100644 --- a/src/main/java/exception/PatientNotFoundException.java +++ b/src/main/java/exception/PatientNotFoundException.java @@ -1,6 +1,8 @@ package exception; public class PatientNotFoundException extends Exception { - public PatientNotFoundException(String message) { super(message); } + public PatientNotFoundException(String message) { + super(message); + } } From 3ef1a4336535903870d8a310606b523df8c48014 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Wed, 2 Apr 2025 19:32:06 +0800 Subject: [PATCH 092/203] Updated DG --- docs/DeveloperGuide.md | 33 +++++++++++ docs/UserGuide.md | 69 ++++++++++------------ docs/diagrams/addAppointmentSequence.png | Bin 0 -> 57692 bytes docs/diagrams/addAppointmentSequence.puml | 58 ++++++++++++++++++ 4 files changed, 122 insertions(+), 38 deletions(-) create mode 100644 docs/diagrams/addAppointmentSequence.png create mode 100644 docs/diagrams/addAppointmentSequence.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c1d9744de5..b84ab1e1c3 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -8,6 +8,39 @@ {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +### Add appointment feature +The `add-appointment` feature allows users to schedule appointments for registered patients. +The system ensures that the **patient exists** before adding the appointment. The appointment is then stored persistently. + +Given below is an example usage scenario and how the `add appointment` mechanism behaves at each step. + +Step 1. The user launches the application for the first time. The `ClinicEase` will be initialized with the.... +The system loads the stored list of patients and appointments. The user is now ready to add a new appointment. + +Step 2. The user executes `add-appointment ic/S1234567D ...` command to add the appointment to the appointment list. +This command let `ClinicEase` class reads the user input and passes it to the `Parser`. +The `Parser` class determines that the command is `add-appointment` and creates an `AddAppointmentCommand` object. + +> [!NOTE]: +> If the input does not match the expected format, an InvalidInputFormatException is thrown. Hence, the appointment will +> not be successfully added and stored. + +Step 3. The system calls `execute()` method in `AddAppointmentCommand`. Then, this class calls `ManagementSystem.addAppointment()` +to add the appointment to the system. `ManagementSystem` checks if the patient exists using `findPatientByNRIC()`. +If the patient is found, the system creates an `Appointment` object and adds it to the appointment list. +If the patient’s NRIC does not exist, a PatientNotFoundException is thrown. Thus, the appointment will not be successfully added and stored. + +Step 4. After the appointment is successfully added, `Storage.saveAppointments()` is called to update the saved appointment list. +If saving fails, `ClinicEase` catches an `UnloadedStorageException` and informs the user. + +The following sequence diagram shows how an `add-aappointment` operation goes through the system: +![add-appointment](./diagrams/addAppointmentSequence.png) + + + + + + ## Product scope ### Target user profile diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5adde8d588..5fa256dcab 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -131,7 +131,8 @@ Format: `find-appointment NRIC` * All appointments associated with the specified NRIC will be displayed. Example of usage: -* `find-appointment S1234567D` + +`find-appointment S1234567D` ### Managing Prescriptions @@ -169,8 +170,7 @@ Format: `view-prescription PRESCRIPTION_ID` Example: * `view-prescription S9876543B-1` -======= -## Managing Medical History + ### Adding Medical History: `store-history` Adds one or more entries to a patient's medical history. @@ -181,10 +181,9 @@ store-history n/NAME ic/NRIC h/HISTORY_ENTRY1, HISTORY_ENTRY2, ... *Tip: Use commas to separate multiple history entries.* **Examples:** -store-history n/Alex Tan ic/S1234567A h/Diabetes, Hypertension -store-history n/Lim Mei ic/T7654321Z h/Asthma +`store-history n/Alex Tan ic/S1234567A h/Diabetes, Hypertension` +`store-history n/Lim Mei ic/T7654321Z h/Asthma` ---- ### Viewing Medical History: `view-history` Displays medical history of a patient by NRIC or name. @@ -194,10 +193,9 @@ Displays medical history of a patient by NRIC or name. `view-history NAME` **Examples:** -view-history ic/S1234567A -view-history Alex Tan +`view-history ic/S1234567A` +`view-history Alex Tan` ---- ### Editing Medical History: `edit-history` Modifies a specific entry in a patient’s medical history. @@ -205,17 +203,13 @@ Modifies a specific entry in a patient’s medical history. **Format:** `edit-history ic/NRIC old/OLD_HISTORY_ENTRY new/NEW_HISTORY_ENTRY` -**Example:** -`edit-history ic/S1234567A old/Diabetes new/Type 2 Diabetes` - ---- - -### Notes - NRIC must match an existing patient record. - All history entries are stored as simple strings. - Viewing by name will display all patients with the given name. - Editing only replaces the **first matched** old entry. +**Example:** +`edit-history ic/S1234567A old/Diabetes new/Type 2 Diabetes` ## FAQ @@ -224,33 +218,32 @@ Modifies a specific entry in a patient’s medical history. **A**: You can copy the 'data' folder and paste it in the directory that you save your jar file in another computer. ## Known Issues -1. The parameter `NRIC` can take in any format. +1. The parameter `NRIC` can take in any String format. ## Command Summary -| Action | Format, Examples | -|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Add patient | `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS`
e.g. `add-patient n/John Doe ic/S1234567D dob/1999-12-12 g/M p/98765432 a/123 Main Street h/Diabetes, Hypertension` | -| Delete patient | `delete-patient NRIC`
e.g. `delete-patient S1234567D` | -| Edit patient | `edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]`
e.g. `edit-patient ic/S1234567D n/Billy Joe dob/1999-12-21` | -| List patient | `list-patient` | -| View patient | `view-patient NRIC`
e.g. `view-patient S1234567D` | -| Store medical history | `store-history n/NAME ic/NRIC h/MEDICAL_HISTORY`
e.g. `store-history n/John Doe ic/S1234567D h/Depression` | -| View medical history | `view-history NRIC` or `view-history NAME`
e.g. `view-history S1234567D` or `view-history John Doe` | -| Edit medical history | `edit-history ic/NRIC old/OLD_TEXT new/NEW_TEXT`
e.g. `edit-history ic/S1234567D old/Depression new/Obesity` | -| Add appointment | `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`
e.g. `add-appointment ic/S1234567D dt/2025-06-15 t/1400 dsc/Annual Checkup` | -| Delete appointment | `delete-appointment APPOINTMENT_ID`
e.g. `delete-appointment A123` | -| List appointment | `list-appointment` | -| Mark appointment | `mark-appointment APPOINTMENT_ID`
e.g. `mark-appointment A101` | -| Unmark appointment | `unmark-appointment APPOINTMENT_ID`
e.g. `unmark-appointment A101` | -| Sort appointment | `sort-appointment byDate` or `sort-appointment byId` | -| Find appointment | `find-appointment PATIENT_NRIC`
e.g. `find-appointment S1234567D` | -| Prescription Management - -* Add prescription : `add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]` -* View all prescriptions : `view-all-prescriptions PATIENT_ID` -* View specific prescription : `view-prescription PRESCRIPTION_ID` +| Action | Format, Examples | +|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Add patient | `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS`
e.g. `add-patient n/John Doe ic/S1234567D dob/1999-12-12 g/M p/98765432 a/123 Main Street h/Diabetes, Hypertension` | +| Delete patient | `delete-patient NRIC`
e.g. `delete-patient S1234567D` | +| Edit patient | `edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]`
e.g. `edit-patient ic/S1234567D n/Billy Joe dob/1999-12-21` | +| List patient | `list-patient` | +| View patient | `view-patient NRIC`
e.g. `view-patient S1234567D` | +| Store medical history | `store-history n/NAME ic/NRIC h/MEDICAL_HISTORY`
e.g. `store-history n/John Doe ic/S1234567D h/Depression` | +| View medical history | `view-history NRIC` or `view-history NAME`
e.g. `view-history S1234567D` or `view-history John Doe` | +| Edit medical history | `edit-history ic/NRIC old/OLD_TEXT new/NEW_TEXT`
e.g. `edit-history ic/S1234567D old/Depression new/Obesity` | +| Add appointment | `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`
e.g. `add-appointment ic/S1234567D dt/2025-06-15 t/1400 dsc/Annual Checkup` | +| Delete appointment | `delete-appointment APPOINTMENT_ID`
e.g. `delete-appointment A123` | +| List appointment | `list-appointment` | +| Mark appointment | `mark-appointment APPOINTMENT_ID`
e.g. `mark-appointment A101` | +| Unmark appointment | `unmark-appointment APPOINTMENT_ID`
e.g. `unmark-appointment A101` | +| Sort appointment | `sort-appointment byDate` or `sort-appointment byId` | +| Find appointment | `find-appointment PATIENT_NRIC`
e.g. `find-appointment S1234567D` | +| Add prescription | `add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]` | +| View all prescriptions | `view-all-prescriptions PATIENT_ID` | +| View specific prescription | `view-prescription PRESCRIPTION_ID` | + # About us diff --git a/docs/diagrams/addAppointmentSequence.png b/docs/diagrams/addAppointmentSequence.png new file mode 100644 index 0000000000000000000000000000000000000000..c347ba92a13fe0db445ea67a828af6965f325d1f GIT binary patch literal 57692 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
CHebX@`X8JM*IFQHK5hw&9O>OIq4 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 D%mwGZ literal 0 HcmV?d00001 diff --git a/docs/diagrams/addAppointmentSequence.puml b/docs/diagrams/addAppointmentSequence.puml new file mode 100644 index 0000000000..02a96c0e1b --- /dev/null +++ b/docs/diagrams/addAppointmentSequence.puml @@ -0,0 +1,58 @@ +@startuml +hide footbox + +participant ":ClinicEase" as ClinicEase +participant ":Parser" as Parser +participant ":Appointment" as Appointment +participant ":AddAppointmentCommand" as AddAppointmentCommand +participant ":ManagementSystem" as ManagementSystem +participant ":Storage" as Storage + +ClinicEase -> Parser : parse(input) +activate Parser + +Parser -> Parser : parseAddAppointment(userInput) +activate Parser +Parser -> Parser : extractValue(userInput) +activate Parser +note right of Parser: extractValue is called multiple times\n to parse input and extract parameters +Parser --> Parser : :String +deactivate Parser + +create Appointment +Parser -> Appointment : new Appointment() +activate Appointment +Appointment --> Parser : :Appointment +deactivate Appointment +deactivate Parser + +create AddAppointmentCommand +Parser -> AddAppointmentCommand : new AddAppointmentCommand(Appointment) +activate AddAppointmentCommand +AddAppointmentCommand --> Parser : :AddAppointmentCommand +deactivate AddAppointmentCommand +Parser --> ClinicEase : :AddAppointmentCommand +deactivate Parser + +ClinicEase -> AddAppointmentCommand : execute() +activate AddAppointmentCommand +AddAppointmentCommand -> ManagementSystem : addAppointment(appointment) +activate ManagementSystem +ManagementSystem -> ManagementSystem : findPatientByNRIC() +activate ManagementSystem +ManagementSystem -> Appointment : getNric() +activate Appointment +Appointment --> ManagementSystem : nric :String +deactivate Appointment +deactivate ManagementSystem + +ManagementSystem -> Storage : saveAppointments() +activate Storage +Storage --> ManagementSystem : +deactivate Storage +ManagementSystem --> AddAppointmentCommand : +deactivate ManagementSystem +AddAppointmentCommand -> ClinicEase : +deactivate AddAppointmentCommand + +@enduml \ No newline at end of file From 1c7d6b0ab30c575a0ea9a59e2c6d51f931e46dd8 Mon Sep 17 00:00:00 2001 From: yukuan Date: Wed, 2 Apr 2025 20:26:38 +0800 Subject: [PATCH 093/203] Update user guide with sequence diagram --- docs/DeveloperGuide.md | 35 ++++++++++++ docs/diagrams/storeMedicalHistorySequence.png | Bin 0 -> 57476 bytes .../diagrams/storeMedicalHistorySequence.puml | 54 ++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 docs/diagrams/storeMedicalHistorySequence.png create mode 100644 docs/diagrams/storeMedicalHistorySequence.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b84ab1e1c3..c0b446a5dd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -38,7 +38,42 @@ The following sequence diagram shows how an `add-aappointment` operation goes th +### Storing Medical History Feature +The `store-history` feature allows users to **add new medical history entries** for a specific patient in the system. +The system verifies that the **patient exists** before adding the entries, then the updated data is saved persistently. + +Below is a usage scenario illustrating how the `store-history` mechanism behaves step by step. + +--- + +**Step 1.** The user executes a command such as: + +store-history n/John Doe ic/S1234567A h/Diabetes,High Cholesterol +- **ClinicEase** reads this command and passes the input string to **Parser**. +- **Parser** identifies the command as `store-history` (based on the command word) and extracts the relevant parameters (`name`, `nric`, `h/` tokens). +- If the input is invalid (missing or malformed parameters), an `InvalidInputFormatException` is thrown, aborting the process. + +**Step 2.** **Parser** creates a `StoreMedHistoryCommand` object with the extracted details: + +- `StoreMedHistoryCommand` holds the `name` ("John Doe"), `nric` ("S1234567A"), and `medHistory` string ("Diabetes,High Cholesterol"). + +**Step 3.** `ClinicEase` invokes `StoreMedHistoryCommand#execute(...)`, which calls: + +1. `ManagementSystem.storeMedicalHistory(name, nric, medHistory)` +2. `ManagementSystem` checks if the patient exists using `findPatientByNric(nric)`. + - If **not found**, it prints an error, and **no** changes are made to storage. + - If **found**, it splits `"Diabetes,High Cholesterol"` into an array of entries: + - `"Diabetes"` + - `"High Cholesterol"` + - Then, it appends these entries to the patient’s existing `medicalHistory` list (skipping duplicates). + +**Step 4.** `ManagementSystem` calls `Storage.savePatients(...)` to persist any changes to the patient data on disk: + +- If saving fails, `UnloadedStorageException` is thrown, and `ClinicEase` displays an error to the user. + +Below is a detailed **PlantUML** sequence diagram showing how a `store-history` operation moves through the system and includes the check for a valid patient: +![add-appointment](./diagrams/storeMedicalHistorySequence.png) diff --git a/docs/diagrams/storeMedicalHistorySequence.png b/docs/diagrams/storeMedicalHistorySequence.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7cf05006fa1b8e986f3f5ca11f8327c449f026 GIT binary patch literal 57476 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/storeMedicalHistorySequence.puml b/docs/diagrams/storeMedicalHistorySequence.puml new file mode 100644 index 0000000000..cc9e3f1fed --- /dev/null +++ b/docs/diagrams/storeMedicalHistorySequence.puml @@ -0,0 +1,54 @@ +@startuml +hide footbox + +participant ":ClinicEase" as ClinicEase +participant ":Parser" as Parser +participant ":StoreMedHistoryCommand" as StoreMedHistoryCommand +participant ":ManagementSystem" as ManagementSystem +participant ":Patient" as Patient +participant ":Storage" as Storage + +ClinicEase -> Parser : parse(input) +activate Parser + +Parser -> Parser : parseStoreHistory(userInput) +activate Parser +Parser -> Parser : extractValue(userInput) +activate Parser +note right of Parser + extractValue is called multiple times + to parse input and extract parameters +end note +Parser --> Parser : :String +deactivate Parser + +create StoreMedHistoryCommand +Parser -> StoreMedHistoryCommand : new StoreMedHistoryCommand(String[]) +activate StoreMedHistoryCommand +StoreMedHistoryCommand --> Parser : :StoreMedHistoryCommand +deactivate StoreMedHistoryCommand +Parser --> ClinicEase : :StoreMedHistoryCommand +deactivate Parser + +ClinicEase -> StoreMedHistoryCommand : execute() +activate StoreMedHistoryCommand +StoreMedHistoryCommand -> ManagementSystem : storeMedicalHistory(name, nric, medHistory) +activate ManagementSystem +ManagementSystem -> ManagementSystem : findPatientByNric(nric) +activate ManagementSystem +ManagementSystem -> Patient : getMedicalHistory() +activate Patient +Patient --> ManagementSystem : returns List +deactivate Patient +deactivate ManagementSystem + +ManagementSystem -> Storage : savePatients(patients) +activate Storage +Storage --> ManagementSystem : +deactivate Storage +ManagementSystem --> StoreMedHistoryCommand : +deactivate ManagementSystem +StoreMedHistoryCommand -> ClinicEase : +deactivate StoreMedHistoryCommand + +@enduml From 786dfeca2586c97f5f47cfa6754a02c691b13af1 Mon Sep 17 00:00:00 2001 From: Judha Hoka Wishika <74255920+JudHoka@users.noreply.github.com> Date: Thu, 3 Apr 2025 00:12:38 +0800 Subject: [PATCH 094/203] Update DeveloperGuide.md Updated product scope --- docs/DeveloperGuide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c1d9744de5..8d24e5444e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -12,11 +12,11 @@ ## Product scope ### Target user profile -{Describe the target user profile} +The target users are clinic staff, such as receptionists, assistants, or solo practitioners, who need a lightweight, no-frills system to manage patient records and appointment schedules. These users are assumed to be comfortable with basic command-line interfaces but may not have advanced technical expertise. ### Value proposition -{Describe the value proposition: what problem does it solve?} +This CLI-based Clinic Management System offers a simple yet effective solution for managing patient data and appointments without the need for complex software installations or internet access. It helps clinics save time, stay organized, and reduce manual errors by streamlining common administrative tasks like adding patients, scheduling appointments, and retrieving records, all from the command line. ## User Stories @@ -593,4 +593,4 @@ Below is a suggested guide for **manual testing** of the ClinicEase application * Expected: HTML file generated in data/prescriptions folder. * Verify: Open the generated HTML file in a browser. Check that all prescription details are correctly displayed. ---- \ No newline at end of file +--- From 419c437f99fe707388ddf7806c437e4ad3c075c4 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Thu, 3 Apr 2025 00:27:35 +0800 Subject: [PATCH 095/203] Added view-patient implementation in DG --- docs/DeveloperGuide.md | 29 +++++++++++++ docs/diagrams/viewPatientSequence.png | Bin 0 -> 41378 bytes docs/diagrams/viewPatientSequence.puml | 54 +++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 docs/diagrams/viewPatientSequence.png create mode 100644 docs/diagrams/viewPatientSequence.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c0b446a5dd..7f75c4340d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -8,6 +8,35 @@ {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +### View patient feature + +The 'view-patient' feature allows the user to retrieve and view the personal details of a specified patient. + +**Step 1.** The user launches the application for the first time. +- The `ClinicEase` will be initialized and load stored patient data. +- The patient’s details are now ready to view. + +**Step 2.** The user executes `view-patient ic/S1234567D` command to view the patient's details. +- This command lets `ClinicEase` read the user input through the `UI` and pass it to `Parser`. +- The `Parser` class determines that the command is `view-patient` and creates a `ViewPatientCommand` object. + +> [!NOTE]: +> If the input does not match the expected format, an `InvalidInputFormatException` is thrown. Hence, the patient's details will not be retrieved. + +**Step 3.** The system calls `execute()` method in `ViewPatientCommand`. +- This class calls for the patient list in `ManagementSystem`. +- The system checks if the patient exists in the list: + - If the NRIC exists, the system retrieves the patient’s details. + +**Step 4.** If the patient is found, the system calls `showPatientViewed()` from `UI`. +- The patient's details are displayed to the user. + +The sequence diagram below illustrates how the operation for 'view-patient' would be executed in the system. + +![viewPatientSequence.png](diagrams/viewPatientSequence.png) + + + ### Add appointment feature The `add-appointment` feature allows users to schedule appointments for registered patients. The system ensures that the **patient exists** before adding the appointment. The appointment is then stored persistently. diff --git a/docs/diagrams/viewPatientSequence.png b/docs/diagrams/viewPatientSequence.png new file mode 100644 index 0000000000000000000000000000000000000000..474b9e47a3e800b19a5cae834fce50bd4ea9f346 GIT binary patch literal 41378 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/viewPatientSequence.puml b/docs/diagrams/viewPatientSequence.puml new file mode 100644 index 0000000000..9d1218eca3 --- /dev/null +++ b/docs/diagrams/viewPatientSequence.puml @@ -0,0 +1,54 @@ +@startuml +hide footbox + +participant ":ClinicEase" as ClinicEase +participant ":UI" as UI +participant ":Parser" as Parser +participant ":ViewPatientCommand" as ViewPatientCommand +participant ":ManagementSystem" as ManagementSystem +participant ":Patient" as Patient + +ClinicEase -> UI : readCommand() +activate UI + +UI --> ClinicEase : input +deactivate UI +ClinicEase -> Parser : parse(input) +activate Parser +Parser -> Parser : parseViewPatient(userInput) +activate Parser +Parser -> Parser : extractValue(userInput) +activate Parser +Parser --> Parser : nric :String +deactivate Parser + +Parser -> ViewPatientCommand : ViewPatientCommand(nric) +activate ViewPatientCommand +Parser --> ClinicEase : ViewPatientCommand +deactivate Parser + +deactivate Parser + +ClinicEase -> ViewPatientCommand : execute() +activate ViewPatientCommand + +activate ManagementSystem +ViewPatientCommand -> ManagementSystem : viewPatient(nric) + +ManagementSystem -> Patient : getPatient(nric) +activate Patient + +Patient --> ManagementSystem : matchedPatient +deactivate Patient + +ManagementSystem --> ViewPatientCommand +deactivate ManagementSystem + +ViewPatientCommand --> UI : showPatientViewed(matchedPatient) +activate UI + +UI --> ClinicEase : Patient details +deactivate UI +deactivate ViewPatientCommand + +@enduml From 98aa4a4a112b5467bcd8acffba400014d3c3f79f Mon Sep 17 00:00:00 2001 From: judHoka Date: Thu, 3 Apr 2025 00:42:46 +0800 Subject: [PATCH 096/203] Updated DG to include implementation of add patient feature --- docs/DeveloperGuide.md | 33 +++++++++++++++ docs/diagrams/addPatientSequence.png | Bin 0 -> 52801 bytes docs/diagrams/addPatientSequence.puml | 58 ++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 docs/diagrams/addPatientSequence.png create mode 100644 docs/diagrams/addPatientSequence.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4dbfe92f5c..ba93274017 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -36,7 +36,40 @@ If saving fails, `ClinicEase` catches an `UnloadedStorageException` and informs The following sequence diagram shows how an `add-aappointment` operation goes through the system: ![add-appointment](./diagrams/addAppointmentSequence.png) +### Add patient feature +The `add-patient` feature allows users to register new patients by providing their personal information. +The system ensures that the **input is valid** and that the **patient does not already exist** before adding them to the patient list. +**Step 1.** +The user launches the application for the first time. `ClinicEase` will be initialized with the saved data (if any). +The system loads the stored list of patients and appointments. The user is now ready to register a new patient. + +**Step 2.** +The user executes the following command to add a new patient: + +add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St + +This command is read by the `ClinicEase` class and passed to the `Parser`. +The `Parser` class identifies the command as `add-patient` and parses the fields. A `Patient` object is then constructed from the parsed data. + +> **Note** +> If any required field (such as name, NRIC, or address) is missing, the parser will return `null`, and the system will display an appropriate error message. +> The patient will not be added in this case. + +**Step 3.** +The `ManagementSystem.addPatient()` method is called with the parsed input. +The method first checks if a patient with the same NRIC already exists in the system. +If the NRIC is unique and all details are present, a new `Patient` object is added to the patient list. + +> **Note** +> If the NRIC already exists, a message is shown to inform the user that the patient has already been registered. + +**Step 4.** +After successful registration, `Storage.savePatients()` is called to update the saved patient list on disk. +If saving fails, `ClinicEase` catches an `UnloadedStorageException` and alerts the user. + +The following sequence diagram shows how an `add-patient` operation flows through the system: +![add-patient](./diagrams/addPatientSequence.png) ### Storing Medical History Feature diff --git a/docs/diagrams/addPatientSequence.png b/docs/diagrams/addPatientSequence.png new file mode 100644 index 0000000000000000000000000000000000000000..6da6b7869f4ae53f1ca0913968d14fc728acbb01 GIT binary patch literal 52801 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 ZEr^rq!H;VLsc01H;Qk}~lJ=ar`F}ncqoDu* literal 0 HcmV?d00001 diff --git a/docs/diagrams/addPatientSequence.puml b/docs/diagrams/addPatientSequence.puml new file mode 100644 index 0000000000..7f2e64478b --- /dev/null +++ b/docs/diagrams/addPatientSequence.puml @@ -0,0 +1,58 @@ +@startuml +hide footbox + +participant ":ClinicEase" as ClinicEase +participant ":Parser" as Parser +participant ":AddPatientCommand" as AddPatientCommand +participant ":ManagementSystem" as ManagementSystem +participant ":Patient" as Patient +participant ":Storage" as Storage + +ClinicEase -> Parser : parse(input) +activate Parser + +Parser -> Parser : parseAddPatient(userInput) +activate Parser +Parser -> Parser : extractValue(userInput) +activate Parser +note right of Parser + extractValue is called multiple times\n + to get name, nric, dob, gender,\n + address, and phone +end note +Parser --> Parser : :String[] +deactivate Parser + +create AddPatientCommand +Parser -> AddPatientCommand : new AddPatientCommand(String[]) +activate AddPatientCommand +Parser --> ClinicEase : :AddPatientCommand +deactivate Parser + +ClinicEase -> AddPatientCommand : execute() +activate AddPatientCommand +AddPatientCommand -> ManagementSystem : addPatient(details) +activate ManagementSystem +ManagementSystem -> ManagementSystem : check if NRIC exists +alt NRIC already exists + ManagementSystem --> AddPatientCommand : Error message +else + create Patient + ManagementSystem -> Patient : new Patient(...) + activate Patient + Patient --> ManagementSystem : + deactivate Patient + + ManagementSystem -> ManagementSystem : add patient to HashMap + ManagementSystem -> Storage : savePatients(patients) + activate Storage + Storage --> ManagementSystem : + deactivate Storage + + ManagementSystem --> AddPatientCommand : +end +deactivate ManagementSystem +AddPatientCommand -> ClinicEase : +deactivate AddPatientCommand + +@enduml \ No newline at end of file From 745b68fe4eccf6b3709687001b2987b6b84cec1b Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Thu, 3 Apr 2025 17:30:17 +0800 Subject: [PATCH 097/203] Updated find-appointment feature --- .../java/command/FindAppointmentCommand.java | 5 +++-- src/main/java/manager/ManagementSystem.java | 7 ++++--- src/main/java/miscellaneous/Ui.java | 17 +++++++++-------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/command/FindAppointmentCommand.java b/src/main/java/command/FindAppointmentCommand.java index 47c46b06ff..3bd38c1a0f 100644 --- a/src/main/java/command/FindAppointmentCommand.java +++ b/src/main/java/command/FindAppointmentCommand.java @@ -1,5 +1,6 @@ package command; +import java.util.List; import manager.Appointment; import manager.ManagementSystem; import miscellaneous.Ui; @@ -13,7 +14,7 @@ public FindAppointmentCommand(String nric) { @Override public void execute(ManagementSystem manager, Ui ui) { - Appointment foundAppointment = manager.findAppointmentByNric(nric); - ui.showAppointmentFound(foundAppointment, nric); + List foundAppointments = manager.findAppointmentsByNric(nric); + ui.showAppointmentsFound(foundAppointments, nric); } } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 0ee02b05d9..dac77d65f3 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -279,13 +279,14 @@ public Appointment unmarkAppointment(String apptId) throws UnloadedStorageExcept return null; } - public Appointment findAppointmentByNric(String nric) { + public List findAppointmentsByNric(String nric) { + List matchingAppointments = new ArrayList<>(); for (Appointment appt : appointments) { if (appt.getNric().equals(nric)) { - return appt; + matchingAppointments.add(appt); } } - return null; + return matchingAppointments; } //@@author Basudeb2005 diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 484d3fbc29..010ad04c81 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -182,15 +182,16 @@ public void showAppointmentList(List appointments) { } //@@author dylancmznus - public void showAppointmentFound(Appointment appointment, String nric) { - if (appointment != null) { - showLine(); - System.out.println("Appointment found for NRIC " + nric + ": " + appointment); - showLine(); + public void showAppointmentsFound(List appointments, String nric) { + System.out.println("____________________________________________________________"); + if (appointments.isEmpty()) { + System.out.println(" No appointments found for NRIC: " + nric); } else { - showLine(); - System.out.println("No appointment found for NRIC " + nric); - showLine(); + System.out.println(" Appointments found for NRIC: " + nric); + for (Appointment appt : appointments) { + System.out.println(" - " + appt); + } } + System.out.println("____________________________________________________________"); } } From 998b759f7c6b28a9764d8be6914f118273b1117f Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Thu, 3 Apr 2025 17:33:37 +0800 Subject: [PATCH 098/203] updated test cases --- src/test/java/manager/ManagementSystemTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 915579fc32..35066e3fcc 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -344,7 +344,7 @@ void findAppointment_existingAppointment_expectAppointmentFound() { assertNotNull(foundAppointment, "Appointment should be found"); assertEquals(appointment.getId(), foundAppointment.getId(), "Appointment ID should match"); - } */ + } @Test void findAppointment_nonExistentAppointment_expectNullReturned() { @@ -355,7 +355,7 @@ void findAppointment_nonExistentAppointment_expectNullReturned() { Appointment foundAppointment = manager.findAppointmentByNric("A999"); assertNull(foundAppointment, "Non-existent appointment should return null"); - } + } */ //@@author jyukuan From 49d80e64359fcf4a9d39770f36af069f4b97a0bd Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Thu, 3 Apr 2025 21:05:37 +0800 Subject: [PATCH 099/203] Update UG with better formatting. --- docs/UserGuide.md | 28 ++++-- src/main/java/miscellaneous/Ui.java | 4 +- .../java/manager/ManagementSystemTest.java | 94 +++++++++++++++---- 3 files changed, 101 insertions(+), 25 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5fa256dcab..5619ccbda3 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -9,7 +9,7 @@ ClinicEase is an application designed to assist doctors in managing patient reco 1. Ensure that you have Java 17 or above installed.
**Mac users:** Ensure you have the precise JDK version prescribed [here](https://se-education.org/guides/tutorials/javaInstallationMac.html). -2. Download the latest version of `Duke` from [here](http://link.to/duke). +2. Download the latest version of `ClinicEase` from [here](https://github.com/AY2425S2-CS2113-T11b-4/tp/releases). 3. Copy the file to the folder you want to use as the home folder for ClinicEase. 4. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar ClinicEase.jar` command to run the application. @@ -60,6 +60,18 @@ Example of usage: `list-patient` +### Editing a specified patient: `edit-patient` +Displays a list of all registered patients in the system with details provided. + +Format: `edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]` + +* The `NRIC` must be of a patient existing in the system. + +Example of usage: + +`edit-patient ic/S1234567D p/91238989` + + ### Adding an appointment: `add-appointment` Adds a new appointment to the list of appointment. @@ -176,25 +188,27 @@ Example: Adds one or more entries to a patient's medical history. **Format:** -store-history n/NAME ic/NRIC h/HISTORY_ENTRY1, HISTORY_ENTRY2, ... +`store-history n/NAME ic/NRIC h/HISTORY_ENTRY1, HISTORY_ENTRY2, ...` + +* The `NRIC` must be of a patient existing in the system.
*Tip: Use commas to separate multiple history entries.* **Examples:** -`store-history n/Alex Tan ic/S1234567A h/Diabetes, Hypertension` -`store-history n/Lim Mei ic/T7654321Z h/Asthma` +- `store-history n/Alex Tan ic/S1234567A h/Diabetes, Hypertension` +- `store-history n/Lim Mei ic/T7654321Z h/Asthma` ### Viewing Medical History: `view-history` Displays medical history of a patient by NRIC or name. **Format:** -`view-history ic/NRIC` +`view-history ic/NRIC` or `view-history NAME` **Examples:** -`view-history ic/S1234567A` -`view-history Alex Tan` +- `view-history ic/S1234567A` +- `view-history Alex Tan` ### Editing Medical History: `edit-history` diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 010ad04c81..e9212c9e95 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -183,7 +183,7 @@ public void showAppointmentList(List appointments) { //@@author dylancmznus public void showAppointmentsFound(List appointments, String nric) { - System.out.println("____________________________________________________________"); + showLine(); if (appointments.isEmpty()) { System.out.println(" No appointments found for NRIC: " + nric); } else { @@ -192,6 +192,6 @@ public void showAppointmentsFound(List appointments, String nric) { System.out.println(" - " + appt); } } - System.out.println("____________________________________________________________"); + showLine(); } } diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 35066e3fcc..b4f996afbd 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -302,10 +302,14 @@ void sortAppointmentsById_sortById_appointmentsSortedById() { assertEquals("Consultation", appointments.get(2).getDescription()); } - /* @Test - void markAppointment_validInput_expectAppointmentMarked() { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + @Test + void markAppointment_validInput_expectAppointmentMarked() throws DuplicatePatientIDException, + UnloadedStorageException, PatientNotFoundException { + ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); + + Patient patient = new Patient("S9876543Z", "John Doe", "1990-01-01", + "M", "123 Street", "12345678", new ArrayList<>()); + manager.addPatient(patient); LocalDateTime appointmentTime = LocalDateTime.parse("2025-04-10 1500", DATE_TIME_FORMAT); Appointment appointment = new Appointment("S9876543Z", appointmentTime, "Dental Checkup"); @@ -317,9 +321,13 @@ void markAppointment_validInput_expectAppointmentMarked() { } @Test - void unmarkAppointment_validInput_expectAppointmentUnmarked() { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + void unmarkAppointment_validInput_expectAppointmentUnmarked() throws DuplicatePatientIDException, + UnloadedStorageException, PatientNotFoundException { + ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); + + Patient patient = new Patient("S8765432Y", "John Doe", "1990-01-01", + "M", "123 Street", "12345678", new ArrayList<>()); + manager.addPatient(patient); LocalDateTime appointmentTime = LocalDateTime.parse("2025-05-15 1030", DATE_TIME_FORMAT); Appointment appointment = new Appointment("S8765432Y", appointmentTime, "Eye Examination"); @@ -332,18 +340,22 @@ void unmarkAppointment_validInput_expectAppointmentUnmarked() { } @Test - void findAppointment_existingAppointment_expectAppointmentFound() { - List emptyList = new ArrayList<>(); - ManagementSystem manager = new ManagementSystem(emptyList); + void findAppointment_existingAppointment_expectAppointmentFound() throws DuplicatePatientIDException, + UnloadedStorageException, PatientNotFoundException { + ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); + + Patient patient = new Patient("S7654321X", "John Doe", "1990-01-01", + "M", "123 Street", "12345678", new ArrayList<>()); + manager.addPatient(patient); LocalDateTime appointmentTime = LocalDateTime.parse("2025-06-20 0900", DATE_TIME_FORMAT); Appointment appointment = new Appointment("S7654321X", appointmentTime, "General Consultation"); manager.addAppointment(appointment); - Appointment foundAppointment = manager.findAppointmentByNric(appointment.getNric()); + List foundAppointments = manager.findAppointmentsByNric(appointment.getNric()); - assertNotNull(foundAppointment, "Appointment should be found"); - assertEquals(appointment.getId(), foundAppointment.getId(), "Appointment ID should match"); + assertNotNull(foundAppointments, "Appointment should be found"); + assertEquals(appointment.getId(), foundAppointments.get(0).getId(), "Appointment ID should match"); } @Test @@ -352,10 +364,10 @@ void findAppointment_nonExistentAppointment_expectNullReturned() { List emptyListAppoint = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint); - Appointment foundAppointment = manager.findAppointmentByNric("A999"); + List foundAppointments = manager.findAppointmentsByNric("A999"); - assertNull(foundAppointment, "Non-existent appointment should return null"); - } */ + assertTrue(foundAppointments.isEmpty(), "Non-existent appointment should return empty list"); + } //@@author jyukuan @@ -384,4 +396,54 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH assertTrue(history.contains("Diabetes"), "Medical history should contain 'Diabetes'"); assertTrue(history.contains("Hypertension"), "Medical history should contain 'Hypertension'"); } + + @Test + void editPatientHistory_oldEntryNotFound_expectNoChange() throws UnloadedStorageException { + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); + + List history = new ArrayList<>(List.of("Cold", "Migraine")); + Patient patient = new Patient("F8888888Q", "Ellen", "1970-12-12", "F", "99 Peace Ave", "85556666", history); + patients.add(patient); + + manager.editPatientHistory("F8888888Q", "Cancer", "Diabetes"); + + List updatedHistory = patient.getMedicalHistory(); + + assertEquals(2, updatedHistory.size(), "Unexpected change in history size"); + assertFalse(updatedHistory.contains("Diabetes"), "Incorrectly added new history"); + assertTrue(updatedHistory.contains("Cold"), "Valid entry unexpectedly removed"); + assertTrue(updatedHistory.contains("Migraine"), "Valid entry unexpectedly removed"); + } + + @Test + void editPatientHistory_validHistory_expectUpdated() throws UnloadedStorageException { + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); + List history = new ArrayList<>(List.of("High BP", "Migraine")); + Patient patient = new Patient("F1234567X", "Carol", "1975-03-15", "F", "Blk 999", "83334444", history); + patients.add(patient); + + manager.editPatientHistory("F1234567X", "High BP", "Hypertension"); + + List updatedHistory = patient.getMedicalHistory(); + assertTrue(updatedHistory.contains("Hypertension"), "Replacement failed"); + assertFalse(updatedHistory.contains("High BP"), "Old entry not removed"); + } + + @Test + void editPatientHistory_emptyNewHistory_expectAssertionError() { + // Setup + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); + List history = new ArrayList<>(List.of("Headache")); + Patient patient = new Patient("T7654321B", "Sarah", "1992-03-03", + "F", "88 Health Ave", "81231234", history); + patients.add(patient); + + // Verify assertion + assertThrows(AssertionError.class, + () -> manager.editPatientHistory("T7654321B", "Headache", "")); + } + } From f95fe54631e7782efea63ebffd0b0e3af676c987 Mon Sep 17 00:00:00 2001 From: yukuan Date: Thu, 3 Apr 2025 22:33:29 +0800 Subject: [PATCH 100/203] Yukuan's PPP --- docs/team/jyukuan.md | 87 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 docs/team/jyukuan.md diff --git a/docs/team/jyukuan.md b/docs/team/jyukuan.md new file mode 100644 index 0000000000..c5611e7bab --- /dev/null +++ b/docs/team/jyukuan.md @@ -0,0 +1,87 @@ +# Project Portfolio Page (PPP) + +## Overview + +**ClinicEase** is a CLI-based clinic management application that enables users to handle patient records, medical histories, and appointments quickly and effectively. It provides commands for adding, editing, and viewing patient details, as well as storing and updating their medical histories. This project streamlines a clinic’s administrative tasks in a single, user-friendly CLI system. + +I have been primarily involved in designing and implementing the **patient’s history** functionality to ensure users can store, view, and edit patients’ medical histories with robust validation and persistence. + +--- + +## Summary of Contributions + +### 1. Code Contributed + +- **Code Dashboard Link**: [Click here to see my code contribution]() + +### 2. Enhancements Implemented + +1. **Medical History Commands** + - **`store-history`**: + - Allows users to add new medical history entries to an existing patient’s record. + - Accepts multiple comma-separated entries for one command (e.g., `h/Diabetes, Hypertension`). + - Performs checks to ensure the patient exists, preventing invalid input from updating records. + - **`view-history`**: + - Supports viewing a patient’s medical history by either NRIC (e.g., `view-history ic/S1234567A`) or by name (e.g., `view-history John Doe`). + - Displays all stored entries for the patient(s) found. + - **`edit-history`**: + - Enables replacing the first occurrence of a specified old history entry with a new one. + - Uses `equalsIgnoreCase()` matching, providing leniency in text formatting. + +2. **Parser Integration** + - Implemented specialized parsing logic (`parseStoreHistory`, `parseViewHistory`, `parseEditHistory`) to handle the format for new commands. + - Ensured error messages (e.g., `InvalidInputFormatException`) provide clarity when commands are malformed. + +3. **Persistence and Data Integrity** + - Extended the `ManagementSystem` to: + - Validate whether the patient exists (`findPatientByNric`) before appending new history entries. + - Call `Storage.savePatients(...)` after every history edit or addition to keep data consistent. + - Addressed potential duplication of medical history entries by checking for existing strings before adding them. + +4. **Exception Handling** + - Enhanced user feedback for invalid commands or missing parameters. + - Threw `UnloadedStorageException` if data writing fails, allowing the system to safely abort the operation. + +5. **Contributions to Team-Based Tasks** + + - Participated in **team discussions** to decide on the command naming patterns (`store-history` vs. `add-history`) and the approach to handle multiple comma-separated entries. + - Ensured consistent **exception messages** across the project for invalid data entries. + - Reviewed and tested merges from teammates, particularly those that affected `ManagementSystem` or `Parser`. + +6. **Review / Mentoring Contributions** + + - Provided code reviews on pull requests that impacted the data structures storing patient details. + - Assisted team members in debugging `Storage`-related exceptions by clarifying how the `savePatients` and `loadPatients` methods handle file I/O. + - Helped maintain consistent Java coding conventions (e.g., method naming, usage of final variables) throughout the codebase. + +7. **Contributions Beyond the Project Team** + + - Shared insights on how to structure sequence diagrams in PlantUML to illustrate commands and interactions effectively. + + +### 3. Contributions to the User Guide (UG) + +- **Sections**: + - [Adding Medical History: `store-history`](#) + - [Viewing Medical History: `view-history`](#) + - [Editing Medical History: `edit-history`](#) + + I wrote the instructions, formats, and examples for these commands. I also included **tips** about commas for multiple entries and clarifications on the usage of NRIC vs. name. + +### 4. Contributions to the Developer Guide (DG) + +1. **Testing Patient Management Features** + - Authored the guidelines and scenarios on how to manually test and validate patient-related operations. + - Added use cases and step-by-step instructions to ensure testers can verify correctness for storing, viewing, and editing patient history. + +2. **Storing Medical History Feature** + - Wrote the detailed explanation of how `store-history`, `view-history`, and `edit-history` commands work internally. + - Added or updated sequence diagrams in PlantUML to illustrate the flow of data and command execution for medical history. + +3. **UML Diagrams** + - Created the **Sequence Diagrams** for the `store-history` feature, demonstrating how the command interacts with `Parser`, `ManagementSystem`, and `Storage`. + - Ensured diagrams accurately reflect the final implementation (parameter extraction, validation steps, and file-saving routines). + + +--- + From 04b12e44054e254235e6e93e0822e782798adf07 Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Fri, 4 Apr 2025 01:32:44 +0800 Subject: [PATCH 101/203] Added PPP --- docs/team/dylancmznus.md | 93 +++++++++++++++++++ .../java/manager/ManagementSystemTest.java | 4 + 2 files changed, 97 insertions(+) create mode 100644 docs/team/dylancmznus.md diff --git a/docs/team/dylancmznus.md b/docs/team/dylancmznus.md new file mode 100644 index 0000000000..0bce18bdd3 --- /dev/null +++ b/docs/team/dylancmznus.md @@ -0,0 +1,93 @@ +# Dylan's Project Portfolio Page + +## Project: ClinicEase + +**ClinicEase** is a CLI-based clinic management application that allows users to efficiently manage patient records, medical histories, and appointments. The system provides commands for viewing and updating patient details, managing appointments, and maintaining medical history records. This project aims to simplify clinic administrative tasks with a user-friendly interface. + +Given below are my contributions to the project. + +--- + +### New Feature: +**`view-patient`**: +- Allows users to view a patient's personal details via their NRIC (e.g., `view-patient ic/S1234567A`). +- Displays the patient's full name, contact details, and other personal information. +- Ensures that the provided NRIC matches an existing patient before retrieving the data. + +### New Feature: + +**`find-appointment`**: +- Finds and lists all appointments for a patient using their NRIC (e.g., `find-appointment ic/S1234567A`). +- Retrieves a list of appointments with the specified patient. + +### New Feature: +**`mark-appointment`**: +- Allows users to mark an appointment as completed for a specific patient using their NRIC and the appointment ID (e.g., `mark-appointment ic/S1234567A id/001`). +- Verifies that the patient exists and that the appointment ID corresponds to an existing appointment before updating the status. + +### New Feature: +**`unmark-appointment`**: +- Unmarks a completed appointment, changing its status as uncompleted (e.g., `unmark-appointment ic/S1234567A id/001`). + +--- + +### Code Contributed: + +**Code Dashboard Link**: [Click here]() + +--- + +### Enhancements Implemented: + +**Parser Integration** + - Implemented some parsing logic (`parseViewPatient`, `parseMarkAppointment`, `parseUnmarkAppointment`, `parseFindAppointment`) to handle new command formats. + - Ensured error messages provide clarity for invalid commands or incorrect command parameters (e.g., `InvalidInputFormatException`). + +**Persistence and Data Integrity** + - Enhanced the `ManagementSystem` to: + - Verify the existence of the patient and appointments before marking or unmarking. + - Ensure that changes to appointment statuses are reflected persistently in the system. + +**Exception Handling** + - Improved user feedback for invalid commands or missing parameters, particularly for appointment management. + +--- + +### User Guide (UG) + +- **Sections**: + - [Viewing Patient Information: `view-patient`](#) + - [Marking Appointments: `mark-appointment`](#) + - [Unmarking Appointments: `unmark-appointment`](#) + - [Finding Appointments: `find-appointment`](#) + + I authored the instructions, formats, and examples for these commands, providing clarification on valid NRIC formats and how to use appointment IDs for marking and unmarking. + +--- + +### Developer Guide (DG) + +1. **Use Cases for Essential and Additional Features** + - Authored the use cases for essential commands like: + - `add-patient` + - `delete-patient` + - `add-appointment` + - `edit-patient` + - `sort-appointment` + - Provided detailed step-by-step scenarios for users to understand how these features should be used to interact with the system. + +2. **Implementation and UML Diagrams** + - Created **Sequence Diagrams** for the `view-patient` feature, demonstrating how the command interacts with the `Parser`, `ManagementSystem`, and `Storage` components. + - Updated UML diagrams to reflect the data flow and validation steps involved in retrieving patient information using NRIC. + +--- + +### Community Involvement + +- Conducted code reviews for pull requests affecting appointment management, particularly focusing on ensuring that appointments are validated correctly and updates are persisted in storage. +- Assisted teammates in resolving command parsing issues and clarified how appointments are managed and retrieved in the system. +- Ensured adherence to Java coding conventions across the codebase, especially in method naming and parameter validation. +- Suggested improvements for better user experience, such as providing clearer feedback on appointment status updates. +- Contributed ideas for expanding the appointment feature, such as introducing appointment reminders or notifications. + +--- diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index b4f996afbd..a072c3cfe6 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -302,6 +302,7 @@ void sortAppointmentsById_sortById_appointmentsSortedById() { assertEquals("Consultation", appointments.get(2).getDescription()); } + //@@author dylancmznus @Test void markAppointment_validInput_expectAppointmentMarked() throws DuplicatePatientIDException, UnloadedStorageException, PatientNotFoundException { @@ -320,6 +321,7 @@ void markAppointment_validInput_expectAppointmentMarked() throws DuplicatePatien assertTrue(manager.getAppointments().get(0).isDone(), "Appointment should be marked"); } + //@@author dylancmznus @Test void unmarkAppointment_validInput_expectAppointmentUnmarked() throws DuplicatePatientIDException, UnloadedStorageException, PatientNotFoundException { @@ -339,6 +341,7 @@ void unmarkAppointment_validInput_expectAppointmentUnmarked() throws DuplicatePa assertFalse(manager.getAppointments().get(0).isDone(), "Appointment should be unmarked"); } + //@@author dylancmznus @Test void findAppointment_existingAppointment_expectAppointmentFound() throws DuplicatePatientIDException, UnloadedStorageException, PatientNotFoundException { @@ -358,6 +361,7 @@ void findAppointment_existingAppointment_expectAppointmentFound() throws Duplica assertEquals(appointment.getId(), foundAppointments.get(0).getId(), "Appointment ID should match"); } + //@@author dylancmznus @Test void findAppointment_nonExistentAppointment_expectNullReturned() { List emptyListPatient = new ArrayList<>(); From 6611a0da9ba556478ed3fe9aa57e7daba14d2c7e Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Fri, 4 Apr 2025 03:21:47 +0800 Subject: [PATCH 102/203] Add Project Portfolio Page and update AboutUs link --- docs/AboutUs.md | 2 +- docs/team/Basudeb2005.md | 70 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 docs/team/Basudeb2005.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 13f6a07a25..76cad565b1 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -2,7 +2,7 @@ Display | Name | Github Profile | Portfolio --------|:-------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | Basudeb Chakraborty | [Github](https://github.com/Basudeb2005) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Basudeb Chakraborty | [Github](https://github.com/Basudeb2005) | [Portfolio](docs/team/Basudeb2005.md) ![](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | Judha Hoka Wishika | [GitHub](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | [Portfolio](https://www.linkedin.com/in/judha-hoka-wishika-13b567233/) ![](https://via.placeholder.com/100.png?text=Photo) | Yukuan | [Github](https://github.com/jyukuan) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Dylan Chua | [Github](https://github.com/dylancmznus) | [Portfolio](docs/team/johndoe.md) diff --git a/docs/team/Basudeb2005.md b/docs/team/Basudeb2005.md new file mode 100644 index 0000000000..148cf5e914 --- /dev/null +++ b/docs/team/Basudeb2005.md @@ -0,0 +1,70 @@ +# Basudeb Chakraborty - Project Portfolio Page + +## Overview + +ClinicEase is a desktop application designed for clinic management. It provides doctors with a command-line interface to manage patients, appointments, and prescriptions. The application enables doctors to track patient information, medical histories, schedule appointments, and create detailed prescriptions with HTML export capabilities. + +## Summary of Contributions + +### Code contributed +[RepoSense Code Dashboard](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=basudeb2005) + +### Enhancements implemented + +#### 1. Core Application Structure +I designed and implemented the foundational structure of the application, including: +- Initial UI class setup with welcome/goodbye messages and command reading functionality +- Parser framework for processing user commands +- Basic application workflow in ClinicEase main class + +#### 2. Appointment Management System +I implemented key appointment features: +- Appointment class design with unique IDs and status tracking +- Add appointment command to schedule patient appointments +- Delete appointment functionality to remove unnecessary appointments +- Appointment display functionality in UI with proper formatting + +#### 3. Prescription Management System +I implemented the complete Prescription Management System, a key feature that enables doctors to create and manage patient prescriptions in the ClinicEase application: +- **Prescription Class Design**: Designed and implemented the `Prescription` class with essential attributes and functionality: + - Storage of patient details, symptoms, medicines, and notes + - Automatic generation of unique prescription IDs + - Timestamp recording for each prescription + +- **Prescription Commands**: Implemented three main commands for managing prescriptions: + - `add-prescription`: Allows doctors to create new prescriptions with patient ID, symptoms, medicines, and optional notes + - `view-all-prescriptions`: Shows all prescriptions for a specific patient + - `view-prescription`: Displays details of a specific prescription by ID + +- **HTML Generation**: Created a feature that generates HTML prescription documents for printing: + - Professional layout with CSS styling + - Organized sections for patient information, symptoms, medicines, and special instructions + - Print functionality via a button in the HTML document + +- **Storage and Persistence**: Implemented storage functionality to save and retrieve prescriptions from file system: + - Custom serialization format for prescriptions + - Load and save operations for persistent storage + +### Contributions to the User Guide + +- Added the "Managing Prescriptions" section, documenting: + - Command format and examples for adding prescriptions + - Instructions for viewing all prescriptions for a patient + - Instructions for viewing specific prescriptions and generating HTML reports + - Command summary section for all prescription-related commands + +### Contributions to the Developer Guide + +- Added documentation for the core application structure +- Added documentation for the appointment management system +- Added documentation for the prescription management features, including: + - Use cases for adding, viewing, and generating prescriptions + - Manual testing instructions for prescription management + - User stories related to prescription functionality + +### Contributions to team-based tasks + +- Set up the initial application architecture that the team built upon +- Integrated the prescription management subsystem with the existing patient management system +- Ensured compatibility of prescription commands with the overall command parsing structure +- Collaborated on refining the storage mechanisms to handle multiple data types \ No newline at end of file From b47c135fd098aa54a99b04d0fde68755473761ad Mon Sep 17 00:00:00 2001 From: judHoka Date: Fri, 4 Apr 2025 03:59:09 +0800 Subject: [PATCH 103/203] Updated PPP --- docs/team/judhoka.md | 99 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 docs/team/judhoka.md diff --git a/docs/team/judhoka.md b/docs/team/judhoka.md new file mode 100644 index 0000000000..c3bd747970 --- /dev/null +++ b/docs/team/judhoka.md @@ -0,0 +1,99 @@ +# Judha's Project Portfolio Page + +## Project: ClinicEase + +**ClinicEase** is a Command-Line Interface (CLI) based clinic management application designed to streamline the handling of patient records, appointment tracking, and medical history storage. The system simplifies daily administrative workflows while ensuring reliability and user-friendliness. + +--- + +### Code Contributed + +- **Code Dashboard Link**: [Click the link to see my code contribution]() + +## Features Implemented + +### `add-patient` +- Registers a new patient using their NRIC, name, birthdate, gender, phone number, and address. +- Prevents duplicate entries by checking for existing NRICs. +- Example: `add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St` + +### `delete-patient` +- Deletes a patient's information from the system using their NRIC. +- Verifies the NRIC exists before deletion. +- Example: `delete-patient ic/S1234567A` + +### `list-patient` +- Lists all current patients in a formatted and numbered list. +- Improves usability by including separators for readability. + +--- + +## Command Parsing + +- Implemented parsing logic for: + - `add-patient` + - `delete-patient` + - `list-patient` +- Used consistent prefixes (`n/`, `ic/`, `dob/`, `g/`, `p/`, `a/`) for structured input. +- Added validation and exception handling for malformed or incomplete inputs. + +--- + +## Persistent Storage + +- Built the file storage system for: + - Saving and loading patients + - Saving and loading appointments +- Used serialization to ensure data persists across sessions. +- Automatically syncs after adding or deleting entries. + +--- + +## Unit Testing + +- Created JUnit test cases for: + - `addPatient_Success` + - `deletePatient_Success` + - `addPatient_IncompleteDetails` +- Verified both valid and invalid inputs. +- Used `ByteArrayOutputStream` to capture and assert printed outputs. + +--- + +## Exception Handling + +- Ensured invalid input commands are safely rejected. +- Gave clear feedback to users for: + - Duplicate NRICs + - Deleting non-existent patients + - Incomplete command inputs + +--- + +## User Guide (UG) + +- Designed and authored sections on: + - Adding patients + - Deleting patients + - Listing patients +- Structured the UG to be browsable and beginner-friendly. +- Included command format, usage examples, and error notes. + +--- + +## Developer Guide (DG) + +- Documented feature-specific implementation details for patient commands. +- Wrote sequence diagrams for: + - `add-patient` + - `delete-patient` +- Helped standardize the Feature section format across the DG for consistency. + +--- + +## Community Involvement + +- Reviewed PRs related to appointment and patient logic. +- Provided feedback on command parsing patterns and error messaging. +- Collaborated with teammates on refining UG/DG formats. +- Ensured consistent coding style and naming conventions across related modules. From 63795c72ed349093c807434f4274beb3fe810bc6 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Fri, 4 Apr 2025 09:21:50 +0800 Subject: [PATCH 104/203] Created my PPP draft. --- docs/AboutUs.md | 14 ++++---- docs/team/chwenyee.md | 74 +++++++++++++++++++++++++++++++++++++++++++ docs/team/johndoe.md | 6 ---- 3 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 docs/team/chwenyee.md delete mode 100644 docs/team/johndoe.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 76cad565b1..408ed9011c 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:-------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | Basudeb Chakraborty | [Github](https://github.com/Basudeb2005) | [Portfolio](docs/team/Basudeb2005.md) -![](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | Judha Hoka Wishika | [GitHub](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | [Portfolio](https://www.linkedin.com/in/judha-hoka-wishika-13b567233/) -![](https://via.placeholder.com/100.png?text=Photo) | Yukuan | [Github](https://github.com/jyukuan) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Dylan Chua | [Github](https://github.com/dylancmznus) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Chan Wen Yee | [Github](https://github.com/chwenyee) | [Portfolio](chwenyee) +| Display | Name | Github Profile | Portfolio | +|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:--------------------------------:| +| ![](https://via.placeholder.com/100.png?text=Photo) | Basudeb Chakraborty | [Github](https://github.com/Basudeb2005) | [Portfolio](team/Basudeb2005.md) | +| ![](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | Judha Hoka Wishika | [GitHub](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.detik.com%2Fedu%2Fedutainment%2Fd-6761377%2Fblak-blakan-judha-siswa-sma-pradita-dirgantara-yang-diterima-11-kampus-luar-negeri&psig=AOvVaw1BQ3wU1pFhYGxi0EuDmLOq&ust=1741317092826000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCLiFj-m99IsDFQAAAAAdAAAAABAE) | [Portfolio](team/judhoka.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Yukuan | [Github](https://github.com/jyukuan) | [Portfolio](team/jyukuan.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Dylan Chua | [Github](https://github.com/dylancmznus) | [Portfolio](team/dylancmznus.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Chan Wen Yee | [Github](https://github.com/chwenyee) | [Portfolio](team/chwenyee.md) | diff --git a/docs/team/chwenyee.md b/docs/team/chwenyee.md new file mode 100644 index 0000000000..0846f19a3d --- /dev/null +++ b/docs/team/chwenyee.md @@ -0,0 +1,74 @@ +# Wen Yee's Project Portfolio Page + +## Project: ClinicEase + +**ClinicEase** is a CLI-based clinic management program that helps doctors - our target users - to efficiently manage patient records, +medical histories, and appointments. The system enables user to view and update patient details, +manage appointments, maintain medical history records, and manage prescriptions. +This project aims to simplify clinic administrative tasks with a user-friendly interface. + +## Summary of Contributions +Code Dashboard Link: [Wen Yee's Code Dashboard](https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=chwenyee&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2025-02-21&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) + +### Enhancement Implemented + +1. Reformat the UI output to ensure a consistent and aligned display format across the program. +2. Introduced custom exceptions e.g. `DuplicatePatientIDException`, `UnknownCommandException` and `InvalidInputFormatException` +in v1.0 to enable more graceful error handling. +3. Improved the logic of `Parser.extractValue()` to correctly extract user input parameters, especially when both `dt/` and `t/` +are present. +4. Restructured the code in `ClinicEase.java` and `Parser.java`, and created a `command` package to make the codebase more OOP after v1.0. +5. Linked `Appointment` Class to `Patient` Class to ensure appointments stored in a `Patient` object are kept in sync +with the appointment list in `ManagementSystem`. +6. Changed the data type of `dateTime` variable in `Appointment` to be `LocalDateTime` or better input validation with +`dt/` and `t/`, and to simplify the implementation of the `sort-appointment` feature. + +#### Features Implemented +1. **add-appointment**: Adds a new appointment to the list of appointment. + +2. **delete-appointment**: Deletes a specified appointment from the appointment list. + +3. **sort-appointment**: Sorts the appointments in the appointment list and display the sorted list to the user. Sorting + can be performed by either `byDate` or `byId`. + +#### Contributions to the UG: + +**Sections:** +- **Quick Start** + +- **Features:** + + - NOTE: Explains how to interpret command syntax, parameters, optional fields, input order, and case sensitivity. + - `add-appointments` + - `delete-appointments` + - `sort-appointments` + + I wrote the description, command input formats, and examples of usage for these features, providing the important things to note for +parameters such as `NRIC`, `DATE`, `TIME`, and `APPOINTMENT_ID`. + +- **Known Issues** + +- **Command Summary** + +#### Contributions to the DG: + +**Sections:** + +- Add appointment feature: + + - Write an explanation of how `add-appointment` work in the system. + - Create a sequence diagram for `add-appointment` feature, visualizing how the command interacts with the `Parser`, `ManagementSystem`, and `Storage` components. +- Non-functional requirements +- Glossary + +#### Contributions to team-based tasks: + +- Setting up the Github team org/repo +- Maintaining the issue tracker e.g. issue and milestones +- Release management e.g. wrapping up milestones, saving DG and UG as PDFs + +#### Review/mentoring contributions: + +- Helped teammates resolve Git merge conflicts and guided them on pull request practices. +- Reminding teammates of important deadlines +- Helped to test out the newly-implemented features to ensure the feature works as desired. \ No newline at end of file diff --git a/docs/team/johndoe.md b/docs/team/johndoe.md deleted file mode 100644 index ab75b391b8..0000000000 --- a/docs/team/johndoe.md +++ /dev/null @@ -1,6 +0,0 @@ -# John Doe - Project Portfolio Page - -## Overview - - -### Summary of Contributions From 0d49d3207e547deffb3c20e320f6e06c7168b1c8 Mon Sep 17 00:00:00 2001 From: yukuan Date: Fri, 4 Apr 2025 10:02:29 +0800 Subject: [PATCH 105/203] Fix the discribtion in PPP --- docs/team/jyukuan.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/team/jyukuan.md b/docs/team/jyukuan.md index c5611e7bab..827944b659 100644 --- a/docs/team/jyukuan.md +++ b/docs/team/jyukuan.md @@ -35,7 +35,6 @@ I have been primarily involved in designing and implementing the **patient’s h 3. **Persistence and Data Integrity** - Extended the `ManagementSystem` to: - Validate whether the patient exists (`findPatientByNric`) before appending new history entries. - - Call `Storage.savePatients(...)` after every history edit or addition to keep data consistent. - Addressed potential duplication of medical history entries by checking for existing strings before adding them. 4. **Exception Handling** @@ -51,7 +50,6 @@ I have been primarily involved in designing and implementing the **patient’s h 6. **Review / Mentoring Contributions** - Provided code reviews on pull requests that impacted the data structures storing patient details. - - Assisted team members in debugging `Storage`-related exceptions by clarifying how the `savePatients` and `loadPatients` methods handle file I/O. - Helped maintain consistent Java coding conventions (e.g., method naming, usage of final variables) throughout the codebase. 7. **Contributions Beyond the Project Team** From a43cd223bc8f2df56676f7dbfdd6b8c2a0ec05e2 Mon Sep 17 00:00:00 2001 From: judHoka Date: Fri, 4 Apr 2025 11:07:51 +0800 Subject: [PATCH 106/203] Fixed some issues in storage feature for appointments --- data/patient_data.txt | 1 - src/main/java/ClinicEase.java | 6 ++++-- src/main/java/manager/ManagementSystem.java | 7 ++++++- src/main/java/manager/Patient.java | 3 ++- src/main/java/miscellaneous/Parser.java | 5 ++++- src/main/java/storage/Storage.java | 9 ++++++++- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/data/patient_data.txt b/data/patient_data.txt index e8577bb133..e69de29bb2 100644 --- a/data/patient_data.txt +++ b/data/patient_data.txt @@ -1 +0,0 @@ -S9876543B|Jane Smith|1985-06-15|Female|123 Health Street|91234567|[] diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 3c392f0c72..6137f82860 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -28,9 +28,11 @@ public ClinicEase(String filePath) { try { List patients = Storage.loadPatients(); - List appointments = Storage.loadAppointments(); List prescriptions = Storage.loadPrescriptions(); - this.manager = new ManagementSystem(patients, appointments, prescriptions); + this.manager = new ManagementSystem(patients, new ArrayList<>(), prescriptions); + + List appointments = Storage.loadAppointments(manager); + manager.setAppointments(appointments); } catch (UnloadedStorageException e) { ui.showError("Could not load data: " + e.getMessage()); this.manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index dac77d65f3..4f9aa5269f 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -37,6 +37,11 @@ public List getPatients() { return patients; } + public void setAppointments(List appointments) { + this.appointments.clear(); + this.appointments.addAll(appointments); + } + public List getAppointments() { return appointments; } @@ -192,7 +197,7 @@ public void editPatientHistory(String nric, String oldHistory, String newHistory } } - private Patient findPatientByNric(String nric) { + public Patient findPatientByNric(String nric) { String object = nric.trim().toUpperCase(); for (Patient p : patients) { String patientId = p.getId().trim().toUpperCase(); diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 3a699f5612..1060702999 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -173,7 +173,8 @@ public String toStringForListView() { } public String toFileFormat() { + String history = String.join(", ", this.medicalHistory); return this.id + "|" + this.name + "|" + this.dob + "|" + this.gender + "|" - + this.address + "|" + this.contactInfo + "|" + this.medicalHistory; + + this.address + "|" + this.contactInfo + "|" + history; } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 9a91e3813d..a50352ed4b 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import static manager.Appointment.INPUT_FORMAT; @@ -361,7 +362,9 @@ public static Patient parseLoadPatient(String line) { String gender = tokens[3]; String address = tokens[4]; String contact = tokens[5]; - List medHistory = Arrays.asList(tokens[6].split(",")); + List medHistory = Arrays.stream(tokens[6].split(",")) + .map(String::trim) + .collect(Collectors.toList()); return new Patient(id, name, dob, gender, address, contact, medHistory); } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index ab5ec99e5a..32f4d8a3e9 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -5,6 +5,7 @@ import manager.Patient; import manager.Prescription; import miscellaneous.Parser; +import manager.ManagementSystem; import java.io.BufferedWriter; import java.io.File; @@ -20,6 +21,7 @@ public class Storage { private static String appointmentFilePath; private static String prescriptionFilePath; private static String prescriptionDirPath; + private static Patient patients; public Storage(String directory) { directoryPath = directory; @@ -95,7 +97,7 @@ public static void saveAppointments(List appointmentList) throws Un } - public static List loadAppointments() throws UnloadedStorageException { + public static List loadAppointments(ManagementSystem system) throws UnloadedStorageException { List appointments = new ArrayList<>(); File file = new File(appointmentFilePath); @@ -122,6 +124,11 @@ public static List loadAppointments() throws UnloadedStorageExcepti Appointment appointment = Parser.parseLoadAppointment(line); if (appointment != null) { appointments.add(appointment); + + Patient patient = system.findPatientByNric(appointment.getNric()); + if (patient != null) { + patient.addAppointment(appointment); + } } } } From a395d52a3d76a5766c819e4cd6ce455faa038ca8 Mon Sep 17 00:00:00 2001 From: judHoka Date: Fri, 4 Apr 2025 11:08:15 +0800 Subject: [PATCH 107/203] Cleared out patient data --- data/patient_data.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/data/patient_data.txt b/data/patient_data.txt index e69de29bb2..822cfc1f53 100644 --- a/data/patient_data.txt +++ b/data/patient_data.txt @@ -0,0 +1 @@ +S9876543B|Jane Smith|1985-06-15|Female|123 Health Street|91234567| From 5fcf3b31d0c6436772276af855bfcef01df3d86e Mon Sep 17 00:00:00 2001 From: judHoka Date: Fri, 4 Apr 2025 11:19:19 +0800 Subject: [PATCH 108/203] Fixes from test cases --- data/patient_data.txt | 2 +- src/test/java/command/AddAppointmentCommandTest.java | 2 +- src/test/java/command/DeleteAppointmentCommandTest.java | 2 +- src/test/java/command/ListAppointmentCommandTest.java | 2 +- src/test/java/command/SortAppointmentCommandTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/data/patient_data.txt b/data/patient_data.txt index 822cfc1f53..f80b08ece0 100644 --- a/data/patient_data.txt +++ b/data/patient_data.txt @@ -1 +1 @@ -S9876543B|Jane Smith|1985-06-15|Female|123 Health Street|91234567| +S9876543B|Jane Smith|1985-06-15|Female|123 Health Street|91234567| \ No newline at end of file diff --git a/src/test/java/command/AddAppointmentCommandTest.java b/src/test/java/command/AddAppointmentCommandTest.java index f04e0b5483..616e7ae28b 100644 --- a/src/test/java/command/AddAppointmentCommandTest.java +++ b/src/test/java/command/AddAppointmentCommandTest.java @@ -32,7 +32,7 @@ class AddAppointmentCommandTest { void setUp() throws UnloadedStorageException { storage = new Storage(tempDir.toString()); ui = new Ui(); - manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); + manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments(manager)); } @Test diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java index f1a902fdb4..5ce2b825f4 100644 --- a/src/test/java/command/DeleteAppointmentCommandTest.java +++ b/src/test/java/command/DeleteAppointmentCommandTest.java @@ -34,7 +34,7 @@ class DeleteAppointmentCommandTest { void setUp() throws UnloadedStorageException { storage = new Storage(tempDir.toString()); ui = new Ui(); - manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); + manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments(manager)); } @Test diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index 4a27816745..ea1422f842 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -35,7 +35,7 @@ class ListAppointmentCommandTest { void setUp() throws UnloadedStorageException { storage = new Storage(tempDir.toString()); ui = new Ui(); - manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); + manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments(manager)); } @Test diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index a280514fed..5b910c323a 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -36,7 +36,7 @@ class SortAppointmentCommandTest { void setUp() throws UnloadedStorageException, DuplicatePatientIDException, PatientNotFoundException { storage = new Storage(tempDir.toString()); ui = new Ui(); - manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments()); + manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments(manager)); List patients = List.of( new Patient("S1234567D", "Billy", "1990-10-01", From 7002c45297bc0f970ff9e92349a4acde5afed7bc Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Fri, 4 Apr 2025 22:40:24 +0800 Subject: [PATCH 109/203] Added table of content for UG --- docs/DeveloperGuide.md | 24 ++++++++--- docs/UserGuide.md | 49 +++++++++++++++++++---- docs/diagrams/addAppointmentSequence.puml | 8 +++- docs/team/chwenyee.md | 2 + 4 files changed, 69 insertions(+), 14 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4c02b5d1e0..b6562c2695 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,12 +1,15 @@ # Developer Guide + +--- + ## Acknowledgements {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} -## Design & implementation +--- -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +## Design & implementation ### View patient feature @@ -35,7 +38,7 @@ The sequence diagram below illustrates how the operation for 'view-patient' woul ![viewPatientSequence.png](diagrams/viewPatientSequence.png) - +--- ### Add appointment feature The `add-appointment` feature allows users to schedule appointments for registered patients. @@ -65,6 +68,8 @@ If saving fails, `ClinicEase` catches an `UnloadedStorageException` and informs The following sequence diagram shows how an `add-aappointment` operation goes through the system: ![add-appointment](./diagrams/addAppointmentSequence.png) +--- + ### Add patient feature The `add-patient` feature allows users to register new patients by providing their personal information. The system ensures that the **input is valid** and that the **patient does not already exist** before adding them to the patient list. @@ -100,6 +105,8 @@ If saving fails, `ClinicEase` catches an `UnloadedStorageException` and alerts t The following sequence diagram shows how an `add-patient` operation flows through the system: ![add-patient](./diagrams/addPatientSequence.png) +--- + ### Storing Medical History Feature The `store-history` feature allows users to **add new medical history entries** for a specific patient in the system. @@ -107,8 +114,6 @@ The system verifies that the **patient exists** before adding the entries, then Below is a usage scenario illustrating how the `store-history` mechanism behaves step by step. ---- - **Step 1.** The user executes a command such as: store-history n/John Doe ic/S1234567A h/Diabetes,High Cholesterol @@ -137,7 +142,7 @@ store-history n/John Doe ic/S1234567A h/Diabetes,High Cholesterol Below is a detailed **PlantUML** sequence diagram showing how a `store-history` operation moves through the system and includes the check for a valid patient: ![add-appointment](./diagrams/storeMedicalHistorySequence.png) - +--- ## Product scope ### Target user profile @@ -148,6 +153,8 @@ The target users are clinic staff, such as receptionists, assistants, or solo pr This CLI-based Clinic Management System offers a simple yet effective solution for managing patient data and appointments without the need for complex software installations or internet access. It helps clinics save time, stay organized, and reduce manual errors by streamlining common administrative tasks like adding patients, scheduling appointments, and retrieving records, all from the command line. +--- + ## User Stories | Version | As a ... | I want to ... | So that I can ... | @@ -166,6 +173,8 @@ This CLI-based Clinic Management System offers a simple yet effective solution f | v2.0 | doctor | add special notes to prescriptions | provide additional instructions to patients | | v2.0 | doctor | generate a printable prescription | provide a professional document to the patient | +--- + ## Use Cases ### Use Case: Add a Patient @@ -363,6 +372,8 @@ Use case resumes at step 1. * 5a1. System shows error message * 5a2. Use case ends +--- + ## Non-Functional Requirements 1. Should work on any mainstream OS as long as it has Java `17` or above installed. 2. The system should efficiently manage up to 1000 patients or appointments without any noticeable performance lag during typical usage. @@ -377,6 +388,7 @@ Use case resumes at step 1. * *Error Messages* – System-generated messages that inform users of incorrect input and provide guidance on how to fix it. * *OS Platform Compatibility* – The ability for data files and system functionality to work consistently across different operating systems. +--- ## Instructions for Manual Testing diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5619ccbda3..3b0dec0d68 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -4,12 +4,38 @@ ClinicEase is an application designed to assist doctors in managing patient records and appointments efficiently. It allows the user to add, edit, view, and delete patient information and medical history, as well as schedule and track appointments with ease. With its intuitive command-based interface, ClinicEase ensures smooth and reliable clinic operations. +--- +## Table of Contents +- [Quick Start](#quick-start) +- [Features](#features) + - [Viewing patient details: `view-patient`](#viewing-patient-details-view-patient) + - [Listing all patients: `list-patient`](#listing-all-patients-list-patient) + - [Editing a specified patient: `edit-patient`](#editing-a-specified-patient-edit-patient) + - [Adding an appointment: `add-appointment`](#adding-an-appointment-add-appointment) + - [Deleting an appointment: `delete-appointment`](#deleting-an-appointment-delete-appointment) + - [Sorting appointments: `sort-appointment`](#sorting-appointments-sort-appointment) + - [Marking an appointment as done: `mark-appointment`](#marking-an-appointment-as-done-mark-appointment) + - [Unmarking a completed appointment: `unmark-appointment`](#unmarking-a-completed-appointment-unmark-appointment) + - [Finding a patient's appointments: `find-appointment`](#finding-a-patients-appointments-find-appointment) + - [Managing Prescriptions](#managing-prescriptions) + - [Adding a prescription: `add-prescription`](#adding-a-prescription-add-prescription) + - [Viewing all prescriptions: `view-all-prescriptions`](#viewing-all-prescriptions-view-all-prescriptions) + - [Viewing specific prescription: `view-prescription`](#viewing-specific-prescription-view-prescription) + - [Adding medical history: `store-history`](#adding-medical-history-store-history) + - [Viewing medical history: `view-history`](#viewing-medical-history-view-history) + - [Editing medical history: `edit-history`](#editing-medical-history-edit-history) + - [Exiting the program: `bye`](#exiting-the-program-bye) +- [FAQ](#faq) +- [Known Issues](#known-issues) +- [Command Summary](#command-summary) + +--- ## Quick Start 1. Ensure that you have Java 17 or above installed.
**Mac users:** Ensure you have the precise JDK version prescribed [here](https://se-education.org/guides/tutorials/javaInstallationMac.html). -2. Download the latest version of `ClinicEase` from [here](https://github.com/AY2425S2-CS2113-T11b-4/tp/releases). +2. Download the latest version of `ClinicEase` [here](https://github.com/AY2425S2-CS2113-T11b-4/tp/releases). 3. Copy the file to the folder you want to use as the home folder for ClinicEase. 4. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar ClinicEase.jar` command to run the application. @@ -21,7 +47,7 @@ ClinicEase is an application designed to assist doctors in managing patient reco - `bye`: Exits the app. 6. Refer to the Features below for details of each command. - +--- ## Features > [!NOTE] @@ -71,7 +97,7 @@ Example of usage: `edit-patient ic/S1234567D p/91238989` - +--- ### Adding an appointment: `add-appointment` Adds a new appointment to the list of appointment. @@ -146,6 +172,7 @@ Example of usage: `find-appointment S1234567D` +--- ### Managing Prescriptions #### Adding a prescription: `add-prescription` @@ -183,7 +210,7 @@ Format: `view-prescription PRESCRIPTION_ID` Example: * `view-prescription S9876543B-1` - +--- ### Adding Medical History: `store-history` Adds one or more entries to a patient's medical history. @@ -225,16 +252,26 @@ Modifies a specific entry in a patient’s medical history. **Example:** `edit-history ic/S1234567A old/Diabetes new/Type 2 Diabetes` +--- + +### Exiting the program: `bye` +Exits the program. + +**Format:** `bye` + +--- ## FAQ **Q**: How do I transfer my data to another computer? **A**: You can copy the 'data' folder and paste it in the directory that you save your jar file in another computer. +--- + ## Known Issues 1. The parameter `NRIC` can take in any String format. - +--- ## Command Summary | Action | Format, Examples | @@ -259,7 +296,5 @@ Modifies a specific entry in a patient’s medical history. | View specific prescription | `view-prescription PRESCRIPTION_ID` | -# About us - diff --git a/docs/diagrams/addAppointmentSequence.puml b/docs/diagrams/addAppointmentSequence.puml index 02a96c0e1b..ba24fd7755 100644 --- a/docs/diagrams/addAppointmentSequence.puml +++ b/docs/diagrams/addAppointmentSequence.puml @@ -1,6 +1,8 @@ @startuml hide footbox +actor User + participant ":ClinicEase" as ClinicEase participant ":Parser" as Parser participant ":Appointment" as Appointment @@ -8,6 +10,8 @@ participant ":AddAppointmentCommand" as AddAppointmentCommand participant ":ManagementSystem" as ManagementSystem participant ":Storage" as Storage +User -> ClinicEase : enter input +activate ClinicEase ClinicEase -> Parser : parse(input) activate Parser @@ -52,7 +56,9 @@ Storage --> ManagementSystem : deactivate Storage ManagementSystem --> AddAppointmentCommand : deactivate ManagementSystem -AddAppointmentCommand -> ClinicEase : +AddAppointmentCommand --> ClinicEase : deactivate AddAppointmentCommand +ClinicEase --> User : display confirmation message +deactivate ClinicEase @enduml \ No newline at end of file diff --git a/docs/team/chwenyee.md b/docs/team/chwenyee.md index 0846f19a3d..d3370507dc 100644 --- a/docs/team/chwenyee.md +++ b/docs/team/chwenyee.md @@ -34,6 +34,8 @@ with the appointment list in `ManagementSystem`. #### Contributions to the UG: **Sections:** + +- **Table of Content** - **Quick Start** - **Features:** From 59f0ff1933c38a803a7ecd83dd4abb4e5d167d86 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 5 Apr 2025 00:04:01 +0800 Subject: [PATCH 110/203] Updated DG for add/delete feature implementation, so as the addAppointment sequence diagram. Updated PPP as DG's content has changed. --- docs/DeveloperGuide.md | 100 +++++++++++++++++-- docs/diagrams/addAppointmentSequence.png | Bin 57692 -> 67575 bytes docs/diagrams/addAppointmentSequence.puml | 6 +- docs/diagrams/deleteAppointmentSequence.png | Bin 0 -> 52798 bytes docs/diagrams/deleteAppointmentSequence.puml | 58 +++++++++++ docs/team/chwenyee.md | 11 +- 6 files changed, 158 insertions(+), 17 deletions(-) create mode 100644 docs/diagrams/deleteAppointmentSequence.png create mode 100644 docs/diagrams/deleteAppointmentSequence.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b6562c2695..3dc867c0be 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -40,34 +40,112 @@ The sequence diagram below illustrates how the operation for 'view-patient' woul --- -### Add appointment feature -The `add-appointment` feature allows users to schedule appointments for registered patients. -The system ensures that the **patient exists** before adding the appointment. The appointment is then stored persistently. +### Add and Delete Appointment feature +The `add-appointment` and `delete-appointment` features allow users to manage appointments for registered patients. +The system ensures that the **patient exists** before adding the appointment and that the **appointment exists** before deleting it. +All changes are stored persistently. -Given below is an example usage scenario and how the `add appointment` mechanism behaves at each step. +#### Add Appointment +The add-appointment feature lets users schedule appointments for patients who are already registered in the system. -Step 1. The user launches the application for the first time. The `ClinicEase` will be initialized with the.... -The system loads the stored list of patients and appointments. The user is now ready to add a new appointment. +**Example usage scenario** and how the `add appointment` mechanism behaves at each step: -Step 2. The user executes `add-appointment ic/S1234567D ...` command to add the appointment to the appointment list. +Step 1. The user launches the application for the first time. The `ClinicEase` is initialized with the stored list of +patients and appointments. The user is now ready to add a new appointment. + +Step 2. The user executes the command: `add-appointment ic/S1234567D ...` to add the appointment to the appointment list. This command let `ClinicEase` class reads the user input and passes it to the `Parser`. The `Parser` class determines that the command is `add-appointment` and creates an `AddAppointmentCommand` object. +```` +public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { + //... + case "add-appointment": + return new AddAppointmentCommand(parseAddAppointment(userInput)); + //... +```` + > [!NOTE]: > If the input does not match the expected format, an InvalidInputFormatException is thrown. Hence, the appointment will > not be successfully added and stored. Step 3. The system calls `execute()` method in `AddAppointmentCommand`. Then, this class calls `ManagementSystem.addAppointment()` to add the appointment to the system. `ManagementSystem` checks if the patient exists using `findPatientByNRIC()`. -If the patient is found, the system creates an `Appointment` object and adds it to the appointment list. -If the patient’s NRIC does not exist, a PatientNotFoundException is thrown. Thus, the appointment will not be successfully added and stored. +- If the patient is found, the system creates an `Appointment` object and adds it to the appointment list. +- If the patient’s NRIC does not exist, a PatientNotFoundException is thrown. Thus, the appointment will not be successfully added and stored. -Step 4. After the appointment is successfully added, `Storage.saveAppointments()` is called to update the saved appointment list. +Step 4. After the appointment is successfully added, `Storage.saveAppointments()` is called to update the stored appointment list. If saving fails, `ClinicEase` catches an `UnloadedStorageException` and informs the user. -The following sequence diagram shows how an `add-aappointment` operation goes through the system: +The following sequence diagram shows how an `add-appointment` operation goes through the system: ![add-appointment](./diagrams/addAppointmentSequence.png) +#### Delete Appointment +The `delete-appointment` feature allows users to remove an appointment that is no longer required. + +**Example usage scenario** and how the `delete appointment` mechanism behaves at each step: +Step 1. Suppose the user has already added one or more appointments and wishes to delete one. The appointment must +exist in the current appointment list. + +Step 2. The user needs to know the appointment ID of the appointment to be deleted. If unsure, he/she may execute the +`list-appointment` command to view all existing appointments. + +Step 3. The user executes the command `delete-appointment A100`. Similar to `add appointment`, The `ClinicEase` class +reads the user input and passes it to the `Parser`, which creates a `DeleteAppointmentCommand` object using the provided +`APPOINTMENT_ID`. + +```` +public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { + //... + case "delete-appointment": + return new DeleteAppointmentCommand(parseDeleteAppointment(userInput)); + //... +```` + +Step 4. The system calls `execute()` method in `DeleteAppointmentCommand`. Then, it calls `ManagementSystem.deleteAppointment()` +which removes the corresponding `Appointment` object from the list. + +- The system searches for the appointment with the specified `APPOINTMENT_ID`. +- If found, it removes the appointment from the list. +- It also retrieves the corresponding patient using findPatientByNric() and updates the patient's internal appointment list. + +>[!NOTE]: +> If the `APPOINTMENT_ID` is invalid, an error message will be displayed and the deletion will not proceed. + +Step 5. After successful deletion, the system updates the stored list using `Storage.saveAppointments()`. + +The following sequence diagram shows how an `delete-appointment` operation goes through the system **(positive case, +where the appointment exists and is successfully deleted):** +![delete-appointment](./diagrams/deleteAppointmentSequence.png) + +### Why they are implemented this way +The current design separates command parsing (`Parser`), command execution (`Command` subclasses), and core logic (`ManagementSystem`). +This structure helps improve modularity, testability, and clarity in our codebase. + +- By using distinct `Command` classes (`AddAppointmentCommand`, `DeleteAppointmentCommand)`, each operation is encapsulated with its own logic, making it easier to maintain and extend. + +- Centralizing the data logic in ManagementSystem so that it is easier to maintain and test appointment-related operations. + +- Validating `NRIC` and `APPOINTMENT_ID` before performing operations could prevent invalid data from entering the system and improves user experience by providing clear error feedback. + +This design also aligns with the **Separation of Concerns** principle, allowing changes in one component (e.g., how appointments are stored) +without affecting others (e.g., how commands are parsed or executed). + +### Alternatives considered +1. **Allowing appointment creation without verifying patient existence**
+ - **Description:** This could simplify the logic slightly. + + - **Reason for rejection:** It compromises data integrity, as appointments could become orphaned (unlinked to valid patients). + + +2. **Store appointments exclusively in `Patient` objects**
+ - **Description:** Remove the separate appointments list in `ManagementSystem` and rely only on per-patient storage. + + - **Reason for rejection:** + - **Performance impact:** Aggregating all appointments (e.g., for a doctor’s view) would require + iterating through every patient, which is inefficient. + - Features like finding appointments across patients become harder to implement cleanly. + --- ### Add patient feature diff --git a/docs/diagrams/addAppointmentSequence.png b/docs/diagrams/addAppointmentSequence.png index c347ba92a13fe0db445ea67a828af6965f325d1f..b93475f765e177c9a02f53417a1cb1cc4d845998 100644 GIT binary patch literal 67575 zcmb@ucRbbq|2N(+jwr__o9r^m$nJ1NBzq-fE31&bLfNbA84_iWNJ#c5**lb#kz{YK z$I*NAet$mKb^HE)*LD7Q4_@c_dXC4q-|vsdQ=sw<+0&=ao;r5y*y(F>Xw_rKu(XdI zJIReW0Y6EvW_Skw;&hPFb}+WR=VE1Q=5S2b)W+1#(81J%!N`Td!olI5y$BD_Ju5>S zhX>YH+{U)nj-T4-j~zSl@Q%8+!=FDtb{xiWPD<9Oy+O@~tls6iniM0AL}jN5Gsr(9 z=12=bK9{eK8@*OoYFS`qo3Q86e61{g^ue>m_LTU|Ju@*n17V)Lf}mSfF9{57Lc9dH z7)|CwAH_>^p|25fYGn4(g+0!=btigE-d~o1_Ir8W8`(Q})qz9Yx(7U_ccM11@7CZM z?K+yo@O^6`ebhTdPO@6sN%C^~gs<0IN4ntCh1OPvFQUY@h0-ctBhx55D@~~CkpT~L z1=JMgA_x4iNgQ+$KGBAeR=1noKIh*sqUb-)-=oNBH`>U-MDS)MrcU2P|Ers_ zwS{%xM7wYNQiviyJMPPm_8*^R+ZD9Y)aINRRXROpm1(1J!hu$Rf6(-yI`^h5-GHo2 zxjYa0akA@k^7)`A81EbVaS*;e-_1W>n|A8Ush&3Dm6{5DM>@wh-7`6ny8@ywE+IwG z_g5;qhcecJtOgeRvno|q3ZAzg=soi)%o+%0DORx`m|y*gW} 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 GzyAT1mpW?z literal 57692 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
CHebX@`X8JM*IFQHK5hw&9O>OIq4 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 D%mwGZ diff --git a/docs/diagrams/addAppointmentSequence.puml b/docs/diagrams/addAppointmentSequence.puml index ba24fd7755..09d3f94bbd 100644 --- a/docs/diagrams/addAppointmentSequence.puml +++ b/docs/diagrams/addAppointmentSequence.puml @@ -26,12 +26,12 @@ deactivate Parser create Appointment Parser -> Appointment : new Appointment() activate Appointment -Appointment --> Parser : :Appointment +Appointment --> Parser : appt : Appointment deactivate Appointment deactivate Parser create AddAppointmentCommand -Parser -> AddAppointmentCommand : new AddAppointmentCommand(Appointment) +Parser -> AddAppointmentCommand : new AddAppointmentCommand(appt) activate AddAppointmentCommand AddAppointmentCommand --> Parser : :AddAppointmentCommand deactivate AddAppointmentCommand @@ -58,7 +58,7 @@ ManagementSystem --> AddAppointmentCommand : deactivate ManagementSystem AddAppointmentCommand --> ClinicEase : deactivate AddAppointmentCommand -ClinicEase --> User : display confirmation message +ClinicEase --> User : display message deactivate ClinicEase @enduml \ No newline at end of file diff --git a/docs/diagrams/deleteAppointmentSequence.png b/docs/diagrams/deleteAppointmentSequence.png new file mode 100644 index 0000000000000000000000000000000000000000..da000cdbffdd898839f1e842692d071150412e20 GIT binary patch literal 52798 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≺||EsvcY>E-OMB;ZQ)Sg6Adj&Us`;( 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/deleteAppointmentSequence.puml b/docs/diagrams/deleteAppointmentSequence.puml new file mode 100644 index 0000000000..5b813c15d2 --- /dev/null +++ b/docs/diagrams/deleteAppointmentSequence.puml @@ -0,0 +1,58 @@ +@startuml +hide footbox + +actor User + +participant ":ClinicEase" as ClinicEase +participant ":Parser" as Parser +participant ":Appointment" as Appointment +participant ":DeleteAppointmentCommand" as DeleteAppointmentCommand +participant ":ManagementSystem" as ManagementSystem +participant ":Storage" as Storage + +User -> ClinicEase : enter input +activate ClinicEase +ClinicEase -> Parser : parse(input) +activate Parser + +Parser -> Parser : parseDeleteAppointment(userInput) +activate Parser +Parser --> Parser : apptId :String +deactivate Parser + +create DeleteAppointmentCommand +Parser -> DeleteAppointmentCommand : new DeleteAppointmentCommand(apptId) +activate DeleteAppointmentCommand +DeleteAppointmentCommand --> Parser : :DeleteAppointmentCommand +deactivate DeleteAppointmentCommand +Parser --> ClinicEase : :DeleteAppointmentCommand +deactivate Parser + +ClinicEase -> DeleteAppointmentCommand : execute() +activate DeleteAppointmentCommand +DeleteAppointmentCommand -> ManagementSystem : deleteAppointment(apptId) + +activate ManagementSystem +ManagementSystem -> ManagementSystem : findPatientByNRIC() +activate ManagementSystem +ManagementSystem -> Appointment : getNric() +activate Appointment +Appointment --> ManagementSystem : nric :String +deactivate Appointment +deactivate ManagementSystem + +ManagementSystem -> Storage : saveAppointments() +activate Storage +Storage --> ManagementSystem : +deactivate Storage +ManagementSystem --> DeleteAppointmentCommand : +deactivate ManagementSystem + +deactivate ManagementSystem +DeleteAppointmentCommand --> ClinicEase : +deactivate DeleteAppointmentCommand +ClinicEase --> User : display message +deactivate ClinicEase + + +@enduml \ No newline at end of file diff --git a/docs/team/chwenyee.md b/docs/team/chwenyee.md index d3370507dc..647e96dc4b 100644 --- a/docs/team/chwenyee.md +++ b/docs/team/chwenyee.md @@ -56,10 +56,15 @@ parameters such as `NRIC`, `DATE`, `TIME`, and `APPOINTMENT_ID`. **Sections:** -- Add appointment feature: +- **Add and Delete Appointment feature:** + + - Documented the implementation details of the `add-appointment` and `delete-appointment` features, + including step-by-step usage scenarios to clarify system behavior. + - Created a sequence diagram for both `add-appointment` and `delete-appointment` features, + visualizing how the command interacts with the `Parser`, `ManagementSystem`, and `Storage` components. + - Explained the reason they are implemented this way + - Explained the alternatives considered and justified their rejection - - Write an explanation of how `add-appointment` work in the system. - - Create a sequence diagram for `add-appointment` feature, visualizing how the command interacts with the `Parser`, `ManagementSystem`, and `Storage` components. - Non-functional requirements - Glossary From 5aff871efffe941ed41644d910a8fa6c6ce7ed13 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sat, 5 Apr 2025 01:57:32 +0800 Subject: [PATCH 111/203] Added features into UG and expected outputs into some features --- docs/UserGuide.md | 66 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5619ccbda3..755316960b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -40,6 +40,23 @@ ClinicEase is an application designed to assist doctors in managing patient reco > - Command words are **case-insensitive**.
e.g. `liST-paTIEnt` will be interpreted as `list-patient`. +### Adding a new patient : `add-patient` +Adds a new patient to the system with their credentials. + +Format: `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS h/MEDICAL_HISTORY` + +* The `NRIC` must be unique to the existing ones in the system + +Example of usage: + +`add-patient n/John Doe ic/S1234567D dob/12-12-1999 g/M p/98765432 a/123 Main Street h/Diabetes, Hypertension` + +Expected output: + +
---------------------------------------------------------------------------------------------------- 
+Patient added successfully: John Doe 
+---------------------------------------------------------------------------------------------------- 
+ ### Viewing patient details: `view-patient` Displays the details of a specific patient. @@ -51,6 +68,19 @@ Example of usage: `view-patient S1234567D` +Expected Output: + +
------------------------------------------Patient Details------------------------------------------
+Patient NRIC: S1234567D
+Name: John Doe
+Date of Birth: 12-12-1999
+Gender: M
+Address: 123 Main Street
+Contact: 98765432
+Medical History: Diabetes, Hypertension
+Appointments: None
+----------------------------------------------------------------------------------------------------
+ ### Listing all patients: `list-patient` Displays a list of all registered patients in the system with details provided. @@ -60,17 +90,49 @@ Example of usage: `list-patient` +Expected Output: + +
------------------------------------------Patient Details------------------------------------------
+1. Patient NRIC: S1234567D
+   Name: John Doe
+   Date of Birth: 12-12-1999
+   Gender: M
+   Address: 123 Main Street
+   Contact: 98765432
+   Medical History:
+   - Diabetes
+   - Hypertension
+   Appointments: None
+----------------------------------------------------------------------------------------------------
+2. Patient NRIC: S8765432F
+   Name: Jane Donna
+   Date of Birth: 12-05-2000
+   Gender: F
+   Address: 546 Main Street
+   Contact: 91209310
+   Medical History:
+   - Cough
+   Appointments: None
+----------------------------------------------------------------------------------------------------
+ ### Editing a specified patient: `edit-patient` Displays a list of all registered patients in the system with details provided. -Format: `edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]` +Format: `edit-patient ic/NRIC ATTRIBUTE` * The `NRIC` must be of a patient existing in the system. +* The `ATTRIBUTE` can possibly be between `n/NAME`, `dob/BIRTHDATE`, `g/GENDER`, `a/ADDRESS`, or `p/PHONE` Example of usage: -`edit-patient ic/S1234567D p/91238989` +`edit-patient ic/S1234567D p/91238989` or `edit-patient ic/S1234567D dob/17-08-1945` + +Expected output: +
Patient with NRIC S1234567D updated successfully. 
+----------------------------------------------------------------------------------------------------.
+Edit-patient command executed.
+---------------------------------------------------------------------------------------------------- 
### Adding an appointment: `add-appointment` Adds a new appointment to the list of appointment. From 05fcb93d5ca645557d118a8c3fdc1d14c2f8b408 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 5 Apr 2025 16:06:23 +0800 Subject: [PATCH 112/203] Fixed the bug where multiple appointments can be added to the same timing and appointment timing can be in the past. --- docs/DeveloperGuide.md | 8 +++-- src/main/java/ClinicEase.java | 3 +- .../java/command/AddAppointmentCommand.java | 4 ++- src/main/java/command/Command.java | 4 ++- .../exception/AppointmentClashException.java | 7 ++++ src/main/java/manager/ManagementSystem.java | 14 +++++++- src/main/java/miscellaneous/Parser.java | 7 ++++ .../command/DeleteAppointmentCommandTest.java | 3 +- .../command/ListAppointmentCommandTest.java | 3 +- .../command/SortAppointmentCommandTest.java | 4 ++- .../java/manager/ManagementSystemTest.java | 35 +++++++++++++++---- src/test/java/miscellaneous/ParserTest.java | 14 +++++--- 12 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 src/main/java/exception/AppointmentClashException.java diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3dc867c0be..d8d4c2071e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -72,7 +72,9 @@ public static Command parse(String userInput) throws InvalidInputFormatException Step 3. The system calls `execute()` method in `AddAppointmentCommand`. Then, this class calls `ManagementSystem.addAppointment()` to add the appointment to the system. `ManagementSystem` checks if the patient exists using `findPatientByNRIC()`. - If the patient is found, the system creates an `Appointment` object and adds it to the appointment list. -- If the patient’s NRIC does not exist, a PatientNotFoundException is thrown. Thus, the appointment will not be successfully added and stored. +- Conditions the appointment fail to be added and stored: + - If the patient’s NRIC does not exist (a `PatientNotFoundException` is thrown). + - If the appointment clashes with another scheduled within 1 hour (an `AppointmentClashException` is thrown). Step 4. After the appointment is successfully added, `Storage.saveAppointments()` is called to update the stored appointment list. If saving fails, `ClinicEase` catches an `UnloadedStorageException` and informs the user. @@ -250,7 +252,9 @@ This CLI-based Clinic Management System offers a simple yet effective solution f | v2.0 | doctor | add symptoms to a prescription | document the patient's condition | | v2.0 | doctor | add special notes to prescriptions | provide additional instructions to patients | | v2.0 | doctor | generate a printable prescription | provide a professional document to the patient | - +| v2.0 | doctor | edit my patients' personal details | update them if there is any updates | +| v2.0 | doctor | sort appointments by date | check which appointements are coming first | +| v2.0 | doctor | mark/unmark appointments | track my appointments more easily | --- ## Use Cases diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 6137f82860..1388e0c2af 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -1,4 +1,5 @@ import command.Command; +import exception.AppointmentClashException; import exception.DuplicatePatientIDException; import exception.InvalidInputFormatException; import exception.PatientNotFoundException; @@ -53,7 +54,7 @@ public void run() { command.execute(manager, ui); running = !command.isExit(); } catch (InvalidInputFormatException | UnknownCommandException | DuplicatePatientIDException | - UnloadedStorageException | PatientNotFoundException e) { + UnloadedStorageException | PatientNotFoundException | AppointmentClashException e) { ui.showError(e.getMessage()); } } diff --git a/src/main/java/command/AddAppointmentCommand.java b/src/main/java/command/AddAppointmentCommand.java index 7f60bdb6da..7d90fb651a 100644 --- a/src/main/java/command/AddAppointmentCommand.java +++ b/src/main/java/command/AddAppointmentCommand.java @@ -1,5 +1,6 @@ package command; +import exception.AppointmentClashException; import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.Appointment; @@ -15,7 +16,8 @@ public AddAppointmentCommand(Appointment appointment) { } @Override - public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException, + AppointmentClashException { manager.addAppointment(appointment); ui.showAppointmentAdded(manager.getAppointments()); } diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 5ea47165e8..4dcbd5d898 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -1,5 +1,6 @@ package command; +import exception.AppointmentClashException; import exception.DuplicatePatientIDException; import exception.PatientNotFoundException; import exception.UnloadedStorageException; @@ -9,7 +10,8 @@ public abstract class Command { public abstract void execute(ManagementSystem manager, Ui ui) - throws DuplicatePatientIDException, UnloadedStorageException, PatientNotFoundException; + throws DuplicatePatientIDException, UnloadedStorageException, PatientNotFoundException, + AppointmentClashException; public boolean isExit() { return false; diff --git a/src/main/java/exception/AppointmentClashException.java b/src/main/java/exception/AppointmentClashException.java new file mode 100644 index 0000000000..02dae4f4a8 --- /dev/null +++ b/src/main/java/exception/AppointmentClashException.java @@ -0,0 +1,7 @@ +package exception; + +public class AppointmentClashException extends Exception { + public AppointmentClashException(String message) { + super(message); + } +} diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 4f9aa5269f..189507316d 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,11 +1,13 @@ package manager; +import exception.AppointmentClashException; import exception.DuplicatePatientIDException; import exception.PatientNotFoundException; import exception.UnloadedStorageException; import miscellaneous.Ui; import storage.Storage; +import java.time.Duration; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -219,10 +221,20 @@ private List findPatientsByName(String name) { } //@@author chwenyee - public void addAppointment(Appointment appointment) throws UnloadedStorageException, PatientNotFoundException { + public void addAppointment(Appointment appointment) throws UnloadedStorageException, PatientNotFoundException, + AppointmentClashException { assert appointment != null : "Appointment cannot be null"; assert patients != null : "Patient list cannot be null"; + // Check if there is any scheduled appointment in the list clashing with this newly-added one + for (Appointment appointmentInList : appointments) { + long timeDiff = Math.abs(Duration.between(appointmentInList.getDateTime(), + appointment.getDateTime()).toMinutes()); + if (timeDiff < 60) { + throw new AppointmentClashException("This appointment clashes with another scheduled within 1 hour."); + } + } + Patient patient = findPatientByNric(appointment.getNric()); if (patient == null) { throw new PatientNotFoundException("Patient with NRIC: " + appointment.getNric() + " not found"); diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index a50352ed4b..33c856ba01 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -205,6 +205,13 @@ public static Appointment parseAddAppointment(String input) throws InvalidInputF try { String combined = date.trim() + " " + time.trim(); LocalDateTime dateTime = LocalDateTime.parse(combined, INPUT_FORMAT); + + LocalDateTime now = LocalDateTime.now(); + if (dateTime.isBefore(now)) { + throw new InvalidInputFormatException + ("The appointment date/time cannot be before the current date/time"); + } + return new Appointment(nric.trim(), dateTime, desc.trim()); } catch (DateTimeParseException e) { throw new InvalidInputFormatException("Invalid date/time format. Please use: dt/yyyy-MM-dd and t/HHmm"); diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java index 5ce2b825f4..d4f25bf703 100644 --- a/src/test/java/command/DeleteAppointmentCommandTest.java +++ b/src/test/java/command/DeleteAppointmentCommandTest.java @@ -1,5 +1,6 @@ package command; +import exception.AppointmentClashException; import exception.DuplicatePatientIDException; import exception.PatientNotFoundException; import exception.UnloadedStorageException; @@ -39,7 +40,7 @@ void setUp() throws UnloadedStorageException { @Test void execute_validNric_expectAppointmentDeleted() throws DuplicatePatientIDException, UnloadedStorageException, - PatientNotFoundException { + PatientNotFoundException, AppointmentClashException { Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", "M", "124 High St", "81234567", new ArrayList<>()); new AddPatientCommand(patient).execute(manager, ui); diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index ea1422f842..86641ba2e1 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -1,5 +1,6 @@ package command; +import exception.AppointmentClashException; import exception.DuplicatePatientIDException; import exception.PatientNotFoundException; import exception.UnloadedStorageException; @@ -40,7 +41,7 @@ void setUp() throws UnloadedStorageException { @Test void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDException, UnloadedStorageException, - PatientNotFoundException { + PatientNotFoundException, AppointmentClashException { LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index 5b910c323a..9bd25913d2 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -1,5 +1,6 @@ package command; +import exception.AppointmentClashException; import exception.DuplicatePatientIDException; import exception.PatientNotFoundException; import exception.UnloadedStorageException; @@ -33,7 +34,8 @@ class SortAppointmentCommandTest { private Storage storage; @BeforeEach - void setUp() throws UnloadedStorageException, DuplicatePatientIDException, PatientNotFoundException { + void setUp() throws UnloadedStorageException, DuplicatePatientIDException, PatientNotFoundException, + AppointmentClashException { storage = new Storage(tempDir.toString()); ui = new Ui(); manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments(manager)); diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index a072c3cfe6..7fb6b06b1c 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -1,5 +1,6 @@ package manager; +import exception.AppointmentClashException; import exception.DuplicatePatientIDException; import exception.PatientNotFoundException; import exception.UnloadedStorageException; @@ -167,7 +168,8 @@ void viewPatient_emptySystem_patientNotFound() { } @Test - void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageException, PatientNotFoundException { + void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageException, PatientNotFoundException, + AppointmentClashException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -187,9 +189,28 @@ void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageEx assertEquals(LocalTime.of(19, 0), manager.getAppointments().get(0).getTime()); } + @Test + void addAppointment_clashedAppointments_expectException() throws UnloadedStorageException, PatientNotFoundException, + AppointmentClashException { + List patients = new ArrayList<>(); + ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); + + LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); + LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-20 1950", DATE_TIME_FORMAT); + + Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + "M", "124 High St", "81234567", new ArrayList<>()); + patients.add(patient); + Appointment appointment1 = new Appointment("S1234567D", appointmentTime1, "Medical Checkup"); + Appointment appointment2 = new Appointment("S1234567D", appointmentTime2, "X-ray"); + + manager.addAppointment(appointment1); + assertThrows(AppointmentClashException.class, () -> manager.addAppointment(appointment2)); + } + @Test void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStorageException, - PatientNotFoundException { + PatientNotFoundException, AppointmentClashException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -211,7 +232,7 @@ void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStor @Test void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws UnloadedStorageException, - PatientNotFoundException { + PatientNotFoundException, AppointmentClashException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -233,7 +254,7 @@ void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws Unloaded @Test void deleteAppointment_nonExistentId_expectNullReturned() throws UnloadedStorageException, - PatientNotFoundException { + PatientNotFoundException, AppointmentClashException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -305,7 +326,7 @@ void sortAppointmentsById_sortById_appointmentsSortedById() { //@@author dylancmznus @Test void markAppointment_validInput_expectAppointmentMarked() throws DuplicatePatientIDException, - UnloadedStorageException, PatientNotFoundException { + UnloadedStorageException, PatientNotFoundException, AppointmentClashException { ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); Patient patient = new Patient("S9876543Z", "John Doe", "1990-01-01", @@ -324,7 +345,7 @@ void markAppointment_validInput_expectAppointmentMarked() throws DuplicatePatien //@@author dylancmznus @Test void unmarkAppointment_validInput_expectAppointmentUnmarked() throws DuplicatePatientIDException, - UnloadedStorageException, PatientNotFoundException { + UnloadedStorageException, PatientNotFoundException, AppointmentClashException { ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); Patient patient = new Patient("S8765432Y", "John Doe", "1990-01-01", @@ -344,7 +365,7 @@ void unmarkAppointment_validInput_expectAppointmentUnmarked() throws DuplicatePa //@@author dylancmznus @Test void findAppointment_existingAppointment_expectAppointmentFound() throws DuplicatePatientIDException, - UnloadedStorageException, PatientNotFoundException { + UnloadedStorageException, PatientNotFoundException, AppointmentClashException { ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); Patient patient = new Patient("S7654321X", "John Doe", "1990-01-01", diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index f56000c3e2..c7e3f91ff0 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -24,13 +24,13 @@ class ParserTest { @Test void parseAddAppointment_validInput_returnsAppointment() throws Exception { - String input = "add-appointment ic/S1234567D dt/2025-03-20 t/1430 dsc/Checkup"; + String input = "add-appointment ic/S1234567D dt/2025-09-20 t/1430 dsc/Checkup"; Appointment appointment = Parser.parseAddAppointment(input); assertNotNull(appointment); assertEquals("S1234567D", appointment.getNric()); - assertEquals(LocalDateTime.parse("2025-03-20 1430", INPUT_FORMAT), appointment.getDateTime()); + assertEquals(LocalDateTime.parse("2025-09-20 1430", INPUT_FORMAT), appointment.getDateTime()); assertEquals("Checkup", appointment.getDescription()); } @@ -49,7 +49,13 @@ void parseAddAppointment_missingDetail_expectException() { } @Test - void parseAddAppointment_invalidDateTimeFormat_throwsException() { + void parseAddAppointment_dateTimeInThePast_expectException() { + String input2 = "add-appointment ic/S1234567D dt/2025-03-20 t/1300 dsc/Checkup"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input2)); + } + + @Test + void parseAddAppointment_invalidDateTimeFormat_expectException() { String input1 = "add-appointment ic/S1234567D dt/03-19 t/1900 dsc/Checkup"; assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input1)); @@ -147,7 +153,7 @@ void parseStoreHistory_missingFields_expectException() { @Test void parse_addAppointmentCommand_expectAddAppointmentCommand() throws InvalidInputFormatException, UnknownCommandException { - Command command = Parser.parse("add-appointment ic/S1234567D dt/2025-03-27 t/1900 dsc/Checkup"); + Command command = Parser.parse("add-appointment ic/S1234567D dt/2025-09-20 t/1900 dsc/Checkup"); assertInstanceOf(AddAppointmentCommand.class, command); } From 4de800c95d1d831444a0858b3ee98414a8d07929 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sat, 5 Apr 2025 20:04:05 +0800 Subject: [PATCH 113/203] Updated UG to provide expected outputs in feature --- data/patient_data.txt | 1 - data/prescription_data.txt | 8 - .../prescription_S9876543B_1.html | 64 ----- .../prescription_S9876543B_8.html | 64 ----- docs/UserGuide.md | 223 +++++++++++++++--- 5 files changed, 193 insertions(+), 167 deletions(-) delete mode 100644 data/prescriptions/prescription_S9876543B_1.html delete mode 100644 data/prescriptions/prescription_S9876543B_8.html diff --git a/data/patient_data.txt b/data/patient_data.txt index f80b08ece0..e69de29bb2 100644 --- a/data/patient_data.txt +++ b/data/patient_data.txt @@ -1 +0,0 @@ -S9876543B|Jane Smith|1985-06-15|Female|123 Health Street|91234567| \ No newline at end of file diff --git a/data/prescription_data.txt b/data/prescription_data.txt index 319c6292dc..e69de29bb2 100644 --- a/data/prescription_data.txt +++ b/data/prescription_data.txt @@ -1,8 +0,0 @@ -S9876543B-1|S9876543B|2025-04-01 16:09|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals -S9876543B-2|S9876543B|2025-04-01 16:30|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals -S9876543B-3|S9876543B|2025-04-01 16:51|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals -S9876543B-4|S9876543B|2025-04-01 16:51|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals -S9876543B-5|S9876543B|2025-04-01 16:53|Headache,Dizziness|Paracetamol,Vitamin B12|Drink plenty of water -S9876543B-6|S9876543B|2025-04-01 16:54|Headache,Dizziness|Paracetamol,Vitamin B12|Drink plenty of water -S9876543B-7|S9876543B|2025-04-01 16:56|Joint pain,Inflammation|Ibuprofen,Calcium supplements|Take after food and avoid strenuous activity -S9876543B-8|S9876543B|2025-04-01 17:01|Joint pain,Inflammation|Ibuprofen,Calcium supplements|Take after food and avoid strenuous activity diff --git a/data/prescriptions/prescription_S9876543B_1.html b/data/prescriptions/prescription_S9876543B_1.html deleted file mode 100644 index 66367840b8..0000000000 --- a/data/prescriptions/prescription_S9876543B_1.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - Prescription S9876543B-1 - - - -
-
-

ClinicEase Medical Prescription

-

Prescription ID: S9876543B-1

-

Date: 2025-04-01 16:09

-
-
-

Patient Information

- - - - - - -
Patient ID:S9876543B
Name:Jane Smith
Gender:Female
Date of Birth:1985-06-15
Contact:91234567
-
-
-

Symptoms

-
    -
  • High blood sugar
  • -
  • Fatigue
  • -
-
-
-

Prescribed Medications

-
    -
  • Metformin
  • -
  • Blood pressure pills
  • -
-
-
-

Special Instructions

-

Take with meals

-
- -
- - diff --git a/data/prescriptions/prescription_S9876543B_8.html b/data/prescriptions/prescription_S9876543B_8.html deleted file mode 100644 index 232d549220..0000000000 --- a/data/prescriptions/prescription_S9876543B_8.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - Prescription S9876543B-8 - - - -
-
-

ClinicEase Medical Prescription

-

Prescription ID: S9876543B-8

-

Date: 2025-04-01 17:01

-
-
-

Patient Information

- - - - - - -
Patient ID:S9876543B
Name:Jane Smith
Gender:Female
Date of Birth:1985-06-15
Contact:91234567
-
-
-

Symptoms

-
    -
  • Joint pain
  • -
  • Inflammation
  • -
-
-
-

Prescribed Medications

-
    -
  • Ibuprofen
  • -
  • Calcium supplements
  • -
-
-
-

Special Instructions

-

Take after food and avoid strenuous activity

-
- -
- - diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 755316960b..a04c607caa 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -23,7 +23,10 @@ ClinicEase is an application designed to assist doctors in managing patient reco ## Features +Here are some feature that the product provides: +* `add-patient`: adds a patient to the system +* `` > [!NOTE] > - Words in `UPPER_CASE` represent parameters that must be provided by the user.
e.g. in `view-patient NRIC`, `NRIC` is a parameter which can be used as `view-patient S1234567D`. @@ -40,12 +43,14 @@ ClinicEase is an application designed to assist doctors in managing patient reco > - Command words are **case-insensitive**.
e.g. `liST-paTIEnt` will be interpreted as `list-patient`. +
+ ### Adding a new patient : `add-patient` Adds a new patient to the system with their credentials. Format: `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS h/MEDICAL_HISTORY` -* The `NRIC` must be unique to the existing ones in the system +* The `NRIC` must be unique to the existing ones in the system. Example of usage: @@ -56,6 +61,25 @@ Expected output:
---------------------------------------------------------------------------------------------------- 
 Patient added successfully: John Doe 
 ---------------------------------------------------------------------------------------------------- 
+
+ +### Deleting a patient : `delete-patient` +Deletes an existing patient in the system. + +Format: `delete-patient NRIC` + +* The `NRIC` must be of a patient existing in the system. + +Example of usage: + +`delete-patient S1234567D` + +Expected output: + +
---------------------------------------------------------------------------------------------------- 
+Patient deleted successfully: John Doe
+---------------------------------------------------------------------------------------------------- 
+
### Viewing patient details: `view-patient` Displays the details of a specific patient. @@ -80,6 +104,7 @@ Contact: 98765432 Medical History: Diabetes, Hypertension Appointments: None ---------------------------------------------------------------------------------------------------- +
### Listing all patients: `list-patient` Displays a list of all registered patients in the system with details provided. @@ -114,6 +139,7 @@ Expected Output: - Cough Appointments: None ---------------------------------------------------------------------------------------------------- +
### Editing a specified patient: `edit-patient` Displays a list of all registered patients in the system with details provided. @@ -133,6 +159,7 @@ Expected output: ----------------------------------------------------------------------------------------------------. Edit-patient command executed. ---------------------------------------------------------------------------------------------------- +
### Adding an appointment: `add-appointment` Adds a new appointment to the list of appointment. @@ -148,6 +175,14 @@ Example of usage: `add-appointment ic/S1234567D dt/2025-03-31 t/1200 dsc/Annual checkup` +Expected output: + +
----------------------------------------------------------------------------------------------------
+Appointment added for NRIC: S1234567D on 2025-03-31 at 12:00 PM.
+Now you have 1 appointment(s) in the list.
+----------------------------------------------------------------------------------------------------
+
+ ### Deleting an appointment: `delete-appointment` Deletes a specified appointment from the appointment list. @@ -160,6 +195,14 @@ Example of usage: `delete-appointment A100` +Expected output: + +
----------------------------------------------------------------------------------------------------
+Appointment A100 is deleted successfully.
+Now you have 0 appointment(s) in the list.
+----------------------------------------------------------------------------------------------------
+
+ ### Sorting appointments: `sort-appointment` Sorts the appointments in the appointment list. @@ -173,6 +216,14 @@ Example of usage: * `sort-appointment byDate` * `sort-appointment byId` +Expected output: + +
-------------------------------------------Appointments---------------------------------------------
+1. [A101][ ] - S1234567D - 2025-03-31 12:00 PM - Annual checkup
+2. [A102][ ] - S1234567D - 2025-04-30 2:00 PM - Annual checkup
+----------------------------------------------------------------------------------------------------
+
+ ### Marking an appointment as done: `mark-appointment` Marks a specified appointment as done. @@ -185,6 +236,13 @@ Example of usage: `mark-appointment A100` +Expected output: + +
----------------------------------------------------------------------------------------------------
+Appointment A101 is marked successfully.
+----------------------------------------------------------------------------------------------------
+
+ ### Unmarking a completed appointment: `unmark-appointment` Unmarks a completed appointment, setting it back to pending. @@ -196,6 +254,13 @@ Example of usage: `unmark-appointment A100` +Expected output: + +
----------------------------------------------------------------------------------------------------
+Appointment A101 is unmarked successfully.
+----------------------------------------------------------------------------------------------------
+
+ ### Finding a patient's appointments: `find-appointment` Searches for appointments based on the patient's NRIC. @@ -208,9 +273,16 @@ Example of usage: `find-appointment S1234567D` -### Managing Prescriptions +Expected output: + +
----------------------------------------------------------------------------------------------------
+ Appointments found for NRIC: S1234567D
+ - [A101][ ] - S1234567D - 2025-03-31 12:00 PM - Annual checkup
+ - [A102][ ] - S1234567D - 2025-04-30 2:00 PM - Annual checkup
+----------------------------------------------------------------------------------------------------
+
-#### Adding a prescription: `add-prescription` +### Adding a prescription: `add-prescription` Adds a new prescription for a patient. @@ -221,72 +293,165 @@ Format: `add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]` * `MEDICINES` is a comma-separated list of prescribed medications * `NOTES` is optional and can contain special instructions -Example: -* `add-prescription ic/S9876543B s/Fever, Cough m/Paracetamol, Cough syrup nt/Take after meals` +Example of usage: -#### Viewing all prescriptions: `view-all-prescriptions` +`add-prescription ic/S9876543B s/Fever, Cough m/Paracetamol, Cough syrup nt/Take after meals` + +Expected output: + +
----------------------------------------------------------------------------------------------------
+Successfully added prescription:
+Prescription [S1234567D-1] (2025-04-05 18:52)
+Patient ID: S1234567D
+Symptoms: 
+- Fever
+- Cough
+Medicines: 
+- Paracetamol
+- Cough syrup
+Notes: Take after meals
+
+Prescription has been generated.
+View the prescription for the patient with ID: S1234567D
+and prescription ID: S1234567D-1
+----------------------------------------------------------------------------------------------------
+
+ +### Viewing all prescriptions: `view-all-prescriptions` Shows all prescriptions for a specific patient. -Format: `view-all-prescriptions PATIENT_ID` +Format: `view-all-prescriptions NRIC` + +`NRIC` must be an existing patient in the system + +Example of Usage: + +`view-all-prescriptions S9876543B` + +Expected output: -Example: -* `view-all-prescriptions S9876543B` +
----------------------------------------------------------------------------------------------------
+Prescriptions for patient John Doe (S1234567D):
+
+Prescription ID: S1234567D-1
+Date: 2025-04-05 18:52
+Symptoms:
+- Fever
+- Cough
+Medicines:
+- Paracetamol
+- Cough syrup
+Notes: Take after meals
+
+Prescription ID: S1234567D-2
+Date: 2025-04-05 19:08
+Symptoms:
+- Sore throat
+Medicines:
+- Cough pills
+Notes: Take 3 times a day
+
+Total prescriptions: 2
+Use 'view-prescription PRESCRIPTION_ID' to view details and generate HTML.
+----------------------------------------------------------------------------------------------------
+
-#### Viewing specific prescription: `view-prescription` +### Viewing specific prescription: `view-prescription` Views details of a specific prescription and generates a printable HTML version. Format: `view-prescription PRESCRIPTION_ID` +* `PRESCRIPTION_ID` must be existent in the system * The HTML file will be generated in the data/prescriptions folder * Open the HTML file in a web browser to view and print -Example: -* `view-prescription S9876543B-1` +Example of usage: +`view-prescription S9876543B-1` + +Expected output: + +
----------------------------------------------------------------------------------------------------
+Prescription details:
+Prescription [S1234567D-1] (2025-04-05 18:52)
+Patient ID: S1234567D
+Symptoms: 
+- Fever
+- Cough
+Medicines: 
+- Paracetamol
+- Cough syrup
+Notes: Take after meals
+
+Prescription HTML file generated at: C:\Users\Judha Hoka Wishika\Downloads\tp_personal\data\prescriptions\prescription_S1234567D_1.html
+Open this file in a web browser to view and print the prescription.
+----------------------------------------------------------------------------------------------------
+
### Adding Medical History: `store-history` Adds one or more entries to a patient's medical history. -**Format:** -`store-history n/NAME ic/NRIC h/HISTORY_ENTRY1, HISTORY_ENTRY2, ...` +Format: `store-history n/NAME ic/NRIC h/HISTORY_ENTRY1, HISTORY_ENTRY2, ...` -* The `NRIC` must be of a patient existing in the system.
+* The `NRIC` must be of a patient existing in the system. +* Use commas to separate multiple history entries. -*Tip: Use commas to separate multiple history entries.* +Examples of usage: -**Examples:** -- `store-history n/Alex Tan ic/S1234567A h/Diabetes, Hypertension` -- `store-history n/Lim Mei ic/T7654321Z h/Asthma` +`store-history n/Alex Tan ic/S1234567A h/Coughing, Swelling on left leg` +Expected output: + +
----------------------------------------------------------------------------------------------------
+Medical history added for John Doe (NRIC: S1234567D).
+----------------------------------------------------------------------------------------------------
+
### Viewing Medical History: `view-history` Displays medical history of a patient by NRIC or name. -**Format:** -`view-history ic/NRIC` or -`view-history NAME` +Format: `view-history ic/NRIC` or `view-history NAME` + +Example of usage: -**Examples:** - `view-history ic/S1234567A` - `view-history Alex Tan` +Expected output: + +
----------------------------------------------------------------------------------------------------
+Medical History for John Doe (NRIC: S1234567D):
+- Diabetes
+- Hypertension`
+- Coughing
+- Swelling on left leg
+----------------------------------------------------------------------------------------------------
+
### Editing Medical History: `edit-history` Modifies a specific entry in a patient’s medical history. -**Format:** -`edit-history ic/NRIC old/OLD_HISTORY_ENTRY new/NEW_HISTORY_ENTRY` +Format: `edit-history ic/NRIC old/OLD_HISTORY_ENTRY new/NEW_HISTORY_ENTRY` - NRIC must match an existing patient record. - All history entries are stored as simple strings. - Viewing by name will display all patients with the given name. - Editing only replaces the **first matched** old entry. -**Example:** +Example of usage: + `edit-history ic/S1234567A old/Diabetes new/Type 2 Diabetes` +Expected output: + +
+Replaced old history "Diabetes" with "Type 2 Diabetes".
+----------------------------------------------------------------------------------------------------
+Edit-history command executed.
+----------------------------------------------------------------------------------------------------
+ ## FAQ **Q**: How do I transfer my data to another computer? @@ -295,7 +460,8 @@ Modifies a specific entry in a patient’s medical history. ## Known Issues 1. The parameter `NRIC` can take in any String format. - +2. The parameter `BIRTHDATE` doesn't have to be a valid past date. +3. The parameter `PHONE` ## Command Summary @@ -321,7 +487,4 @@ Modifies a specific entry in a patient’s medical history. | View specific prescription | `view-prescription PRESCRIPTION_ID` | -# About us - - From 65bc72a75a33b7e787eb09669dea25d83da481c0 Mon Sep 17 00:00:00 2001 From: Basudeb chakraborty <154761800+Basudeb2005@users.noreply.github.com> Date: Sat, 5 Apr 2025 20:17:11 +0800 Subject: [PATCH 114/203] Rename Basudeb2005.md to basudeb2005.md --- docs/team/{Basudeb2005.md => basudeb2005.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename docs/team/{Basudeb2005.md => basudeb2005.md} (99%) diff --git a/docs/team/Basudeb2005.md b/docs/team/basudeb2005.md similarity index 99% rename from docs/team/Basudeb2005.md rename to docs/team/basudeb2005.md index 148cf5e914..74d296d913 100644 --- a/docs/team/Basudeb2005.md +++ b/docs/team/basudeb2005.md @@ -67,4 +67,4 @@ I implemented the complete Prescription Management System, a key feature that en - Set up the initial application architecture that the team built upon - Integrated the prescription management subsystem with the existing patient management system - Ensured compatibility of prescription commands with the overall command parsing structure -- Collaborated on refining the storage mechanisms to handle multiple data types \ No newline at end of file +- Collaborated on refining the storage mechanisms to handle multiple data types From df3483c6d72ca0d229be7bb229d525a3619030bb Mon Sep 17 00:00:00 2001 From: yukuan Date: Sat, 5 Apr 2025 20:44:57 +0800 Subject: [PATCH 115/203] Fix some bugs --- data/patient_data.txt | 2 +- docs/UserGuide.md | 4 ++-- src/main/java/command/EditPatientCommand.java | 18 +++++++++++++++++- .../java/command/StoreMedHistoryCommand.java | 8 +++----- src/main/java/manager/ManagementSystem.java | 17 ++++++----------- src/main/java/miscellaneous/Parser.java | 5 ++--- .../java/manager/ManagementSystemTest.java | 2 +- 7 files changed, 32 insertions(+), 24 deletions(-) diff --git a/data/patient_data.txt b/data/patient_data.txt index f80b08ece0..6e498e0603 100644 --- a/data/patient_data.txt +++ b/data/patient_data.txt @@ -1 +1 @@ -S9876543B|Jane Smith|1985-06-15|Female|123 Health Street|91234567| \ No newline at end of file +S1234567A|Alice Tan|1990-01-01|F|123 Bedok Road|91234567|High blood pressure, Diabete, High cholesterol diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d1294e0081..657164c2fb 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -294,11 +294,11 @@ Adds one or more entries to a patient's medical history. Displays medical history of a patient by NRIC or name. **Format:** -`view-history ic/NRIC` or +`view-history NRIC` or `view-history NAME` **Examples:** -- `view-history ic/S1234567A` +- `view-history S1234567A` - `view-history Alex Tan` diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java index d1e4e003b7..c79aa78fde 100644 --- a/src/main/java/command/EditPatientCommand.java +++ b/src/main/java/command/EditPatientCommand.java @@ -5,6 +5,10 @@ import manager.ManagementSystem; import miscellaneous.Ui; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + public class EditPatientCommand extends Command { // details: [0]=nric, [1]=name, [2]=dob, [3]=gender, [4]=address, [5]=phone @@ -15,7 +19,9 @@ public EditPatientCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException { + public void execute(ManagementSystem manager, Ui ui) + throws UnloadedStorageException, PatientNotFoundException { + String nric = details[0]; String name = details[1]; String dob = details[2]; @@ -23,6 +29,16 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep String addr = details[4]; String phone = details[5]; + if (dob != null && !dob.isBlank()) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + try { + LocalDate.parse(dob, formatter); + } catch (DateTimeParseException e) { + ui.showError("Invalid date format for Date of Birth! Please use yyyy-MM-dd (e.g., 1990-05-12)."); + return; + } + } + manager.editPatient(nric, name, dob, gender, addr, phone); Ui.showLine(); System.out.println("Edit-patient command executed."); diff --git a/src/main/java/command/StoreMedHistoryCommand.java b/src/main/java/command/StoreMedHistoryCommand.java index 1bb0bc971b..71890119f5 100644 --- a/src/main/java/command/StoreMedHistoryCommand.java +++ b/src/main/java/command/StoreMedHistoryCommand.java @@ -6,18 +6,16 @@ import miscellaneous.Ui; public class StoreMedHistoryCommand extends Command { - private String name; private String nric; private String medHistory; public StoreMedHistoryCommand(String[] details) { - this.name = details[0]; - this.nric = details[1]; - this.medHistory = details[2]; + this.nric = details[0]; + this.medHistory = details[1]; } @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException { - manager.storeMedicalHistory(name, nric, medHistory); + manager.storeMedicalHistory(nric, medHistory); } } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 189507316d..1c3f1a5d98 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -119,19 +119,11 @@ public void editPatient(String nric, String newName, String newDob, String newGe System.out.println("Patient with NRIC " + nric + " updated successfully."); } - public void storeMedicalHistory(String name, String nric, String medHistory) throws PatientNotFoundException, - UnloadedStorageException { + public void storeMedicalHistory(String nric, String medHistory) throws PatientNotFoundException, UnloadedStorageException { Patient existingPatient = findPatientByNric(nric); - assert name != null && !name.isBlank() : "Name must not be null or blank"; - assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; - assert medHistory != null && !medHistory.isBlank() : "Medical history must not be null or blank"; - - if (existingPatient == null) { - throw new PatientNotFoundException("Patient with NRIC not found. Patient's history can not be added"); - } else { - Ui.showLine(); + throw new PatientNotFoundException("Patient with NRIC " + nric + " not found. Cannot add history."); } String[] historyEntries = medHistory.split(",\\s*"); @@ -140,11 +132,14 @@ public void storeMedicalHistory(String name, String nric, String medHistory) thr existingPatient.getMedicalHistory().add(entry.trim()); } } + Storage.savePatients(patients); - System.out.println("Medical history added for " + name + " (NRIC: " + nric + ")."); + Ui.showLine(); + System.out.println("Medical history added for " + existingPatient.getName() + " (NRIC: " + nric + ")."); Ui.showLine(); } + public void viewMedicalHistoryByNric(String nric) throws PatientNotFoundException { Patient foundPatients = findPatientByNric(nric.trim()); diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 33c856ba01..58e3b2b962 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -175,18 +175,17 @@ public static String[] parseStoreHistory(String input) throws InvalidInputFormat String temp = input.replaceFirst("(?i)store-history\\s*", ""); // Extract n/NAME, ic/NRIC, and h/MEDICAL_HISTORY from the remaining string - String name = extractValue(temp, "n/"); String nric = extractValue(temp, "ic/"); String medHistory = extractValue(temp, "h/"); // If any part is missing, return null to indicate a parse failure - if (name == null || nric == null || medHistory == null) { + if (nric == null || medHistory == null) { throw new InvalidInputFormatException("Invalid format. " + "Please use: store-history n/NAME ic/NRIC h/MEDICAL_HISTORY"); } // Return the trimmed values as an array - return new String[]{name.trim(), nric.trim(), medHistory.trim()}; + return new String[]{nric.trim(), medHistory.trim()}; } public static Appointment parseAddAppointment(String input) throws InvalidInputFormatException { diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 7fb6b06b1c..57892ef2b7 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -408,7 +408,7 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH "M", "124 High St", "81234567", new ArrayList<>()); patients.add(patient); - mhm.storeMedicalHistory("John Doe", "S1234567A", "Diabetes, Hypertension"); + mhm.storeMedicalHistory("S1234567A", "Diabetes, Hypertension"); assertEquals(1, patients.size(), "There should be one patient stored"); From fde4ec544c566d4ca9bfde96f011f6ccb3cefce4 Mon Sep 17 00:00:00 2001 From: yukuan Date: Sat, 5 Apr 2025 21:00:03 +0800 Subject: [PATCH 116/203] fix gradle error --- src/main/java/manager/ManagementSystem.java | 3 ++- src/test/java/manager/ManagementSystemTest.java | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 1c3f1a5d98..579168850a 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -119,7 +119,8 @@ public void editPatient(String nric, String newName, String newDob, String newGe System.out.println("Patient with NRIC " + nric + " updated successfully."); } - public void storeMedicalHistory(String nric, String medHistory) throws PatientNotFoundException, UnloadedStorageException { + public void storeMedicalHistory(String nric, String medHistory) throws PatientNotFoundException, + UnloadedStorageException { Patient existingPatient = findPatientByNric(nric); if (existingPatient == null) { diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 57892ef2b7..48b410c5ac 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -413,7 +413,6 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH assertEquals(1, patients.size(), "There should be one patient stored"); Patient storedPatient = patients.get(0); - assertEquals("John Doe", storedPatient.getName(), "Patient name should match"); assertEquals("S1234567A", storedPatient.getId(), "Patient NRIC should match"); List history = storedPatient.getMedicalHistory(); From cca66eaf114a1cf850ad0b470a48d95c976eff51 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 5 Apr 2025 22:41:40 +0800 Subject: [PATCH 117/203] Fixed the bug where appointment records are not deleted when its associated patient is deleted from the system. Update UG table of content and feature sections --- data/appointment_data.txt | 0 data/patient_data.txt | 1 - data/prescription_data.txt | 8 -------- docs/UserGuide.md | 10 ++++++---- src/main/java/manager/ManagementSystem.java | 3 +++ 5 files changed, 9 insertions(+), 13 deletions(-) delete mode 100644 data/appointment_data.txt delete mode 100644 data/patient_data.txt delete mode 100644 data/prescription_data.txt diff --git a/data/appointment_data.txt b/data/appointment_data.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/data/patient_data.txt b/data/patient_data.txt deleted file mode 100644 index f80b08ece0..0000000000 --- a/data/patient_data.txt +++ /dev/null @@ -1 +0,0 @@ -S9876543B|Jane Smith|1985-06-15|Female|123 Health Street|91234567| \ No newline at end of file diff --git a/data/prescription_data.txt b/data/prescription_data.txt deleted file mode 100644 index 319c6292dc..0000000000 --- a/data/prescription_data.txt +++ /dev/null @@ -1,8 +0,0 @@ -S9876543B-1|S9876543B|2025-04-01 16:09|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals -S9876543B-2|S9876543B|2025-04-01 16:30|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals -S9876543B-3|S9876543B|2025-04-01 16:51|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals -S9876543B-4|S9876543B|2025-04-01 16:51|High blood sugar,Fatigue|Metformin,Blood pressure pills|Take with meals -S9876543B-5|S9876543B|2025-04-01 16:53|Headache,Dizziness|Paracetamol,Vitamin B12|Drink plenty of water -S9876543B-6|S9876543B|2025-04-01 16:54|Headache,Dizziness|Paracetamol,Vitamin B12|Drink plenty of water -S9876543B-7|S9876543B|2025-04-01 16:56|Joint pain,Inflammation|Ibuprofen,Calcium supplements|Take after food and avoid strenuous activity -S9876543B-8|S9876543B|2025-04-01 17:01|Joint pain,Inflammation|Ibuprofen,Calcium supplements|Take after food and avoid strenuous activity diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d1294e0081..a4718c6992 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -7,7 +7,8 @@ ClinicEase is an application designed to assist doctors in managing patient reco --- ## Table of Contents - [Quick Start](#quick-start) -- [Features](#features) +- [Features](#features-) + - [Adding a new patient: `add-patient`](#adding-a-new-patient--add-patient) - [Viewing patient details: `view-patient`](#viewing-patient-details-view-patient) - [Listing all patients: `list-patient`](#listing-all-patients-list-patient) - [Editing a specified patient: `edit-patient`](#editing-a-specified-patient-edit-patient) @@ -58,9 +59,9 @@ ClinicEase is an application designed to assist doctors in managing patient reco > - Every parameter must be supplied by the user.
e.g. if the command specifies `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`, the user must fill in all parameters for the input to be valid. -> - Parameters must be entered in the **specified order**.
- e.g. if the command specifies `ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`, the user - must follow this exact sequence for the input to be valid. +> - Parameters could be entered in any order.
+ e.g. if the command recommends `ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION`, the user + can also not follow this exact sequence for the input to be valid. > - Extraneous parameters for commands that do not take in parameters (such as `list` and `bye`) will be ignored.
e.g. if the command specifies `list-patient 12345`, it will be interpreted as `list-patient`. > - Command words are **case-insensitive**.
@@ -171,6 +172,7 @@ Format: `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION` * `DATE` format: `yyyy-MM-dd`, where `yyyy` is year, `MM` is month, `dd` is day (e.g., `2025-03-31`). * `TIME` format: `HHmm` in 24-hour format (e.g., `1430` for 2:30 PM). +* `DATE` and `TIME` **must not** be **before current date/time**. Example of usage: diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 189507316d..d4f5a9da9d 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -69,7 +69,10 @@ public Patient deletePatient(String nric) throws UnloadedStorageException { for (Patient patient : patients) { if (patient.getId().equals(nric)) { patients.remove(patient); + // delete all appointments associated with a patient to be deleted + appointments.removeIf(appointment -> appointment.getNric().equals(nric)); Storage.savePatients(patients); + Storage.saveAppointments(appointments); return patient; } } From 7964a8b47bc2e01e8be2f055382e2c36b8bc64a1 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 5 Apr 2025 22:44:15 +0800 Subject: [PATCH 118/203] Clear txt file --- data/appointment_data.txt | 0 data/patient_data.txt | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/appointment_data.txt create mode 100644 data/patient_data.txt diff --git a/data/appointment_data.txt b/data/appointment_data.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/data/patient_data.txt b/data/patient_data.txt new file mode 100644 index 0000000000..e69de29bb2 From bc06d6e78e8b443e5d77286ddf339001ac792c70 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 5 Apr 2025 22:45:40 +0800 Subject: [PATCH 119/203] Restored deleted prescription data txt file --- data/prescription_data.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/prescription_data.txt diff --git a/data/prescription_data.txt b/data/prescription_data.txt new file mode 100644 index 0000000000..e69de29bb2 From 389f1b77921b488f7a2da4c28ad0eaed805828f7 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 5 Apr 2025 22:53:26 +0800 Subject: [PATCH 120/203] Added input validation for NRIC in add-appointment feature. --- src/main/java/miscellaneous/Parser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 33c856ba01..a732e2e176 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -202,6 +202,10 @@ public static Appointment parseAddAppointment(String input) throws InvalidInputF throw new InvalidInputFormatException(msg); } + if (!nric.trim().matches("(?i)[A-Z]\\d{7}[A-Z]")) { + throw new InvalidInputFormatException("Invalid IC format. Please use a valid IC e.g. S1234567D"); + } + try { String combined = date.trim() + " " + time.trim(); LocalDateTime dateTime = LocalDateTime.parse(combined, INPUT_FORMAT); From 0c926bd97be5c9a2b414fbaecdbda1f924c76dac Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sat, 5 Apr 2025 23:10:49 +0800 Subject: [PATCH 121/203] Added `help` command to improve user experience --- docs/UserGuide.md | 7 ++++++ docs/team/chwenyee.md | 6 ++++- src/main/java/command/ExitCommand.java | 2 +- src/main/java/command/HelpCommand.java | 11 ++++++++++ src/main/java/miscellaneous/Parser.java | 3 +++ src/main/java/miscellaneous/Ui.java | 29 ++++++++++++++++++++++++- 6 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/main/java/command/HelpCommand.java diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a4718c6992..44f6f5ab21 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,6 +8,7 @@ ClinicEase is an application designed to assist doctors in managing patient reco ## Table of Contents - [Quick Start](#quick-start) - [Features](#features-) + - [Viewing help: `help`](#viewing-help-help) - [Adding a new patient: `add-patient`](#adding-a-new-patient--add-patient) - [Viewing patient details: `view-patient`](#viewing-patient-details-view-patient) - [Listing all patients: `list-patient`](#listing-all-patients-list-patient) @@ -67,6 +68,12 @@ ClinicEase is an application designed to assist doctors in managing patient reco > - Command words are **case-insensitive**.
e.g. `liST-paTIEnt` will be interpreted as `list-patient`. +### Viewing help: `help` +Shows all available commands of the application. + +Format: `help` + +--- ### Adding a new patient : `add-patient` Adds a new patient to the system with their credentials. diff --git a/docs/team/chwenyee.md b/docs/team/chwenyee.md index 647e96dc4b..5b69588aad 100644 --- a/docs/team/chwenyee.md +++ b/docs/team/chwenyee.md @@ -41,13 +41,17 @@ with the appointment list in `ManagementSystem`. - **Features:** - NOTE: Explains how to interpret command syntax, parameters, optional fields, input order, and case sensitivity. + - `help` - `add-appointments` - `delete-appointments` - `sort-appointments` + - `bye` I wrote the description, command input formats, and examples of usage for these features, providing the important things to note for parameters such as `NRIC`, `DATE`, `TIME`, and `APPOINTMENT_ID`. +- **FAQ** + - **Known Issues** - **Command Summary** @@ -70,7 +74,7 @@ parameters such as `NRIC`, `DATE`, `TIME`, and `APPOINTMENT_ID`. #### Contributions to team-based tasks: -- Setting up the Github team org/repo +- Setting up the Github team repo - Maintaining the issue tracker e.g. issue and milestones - Release management e.g. wrapping up milestones, saving DG and UG as PDFs diff --git a/src/main/java/command/ExitCommand.java b/src/main/java/command/ExitCommand.java index 163d22021b..e4d05fa546 100644 --- a/src/main/java/command/ExitCommand.java +++ b/src/main/java/command/ExitCommand.java @@ -7,7 +7,7 @@ public class ExitCommand extends Command { @Override public void execute(ManagementSystem manager, Ui ui) { - Ui.showBye(); + ui.showBye(); } @Override diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java new file mode 100644 index 0000000000..933d5b59d4 --- /dev/null +++ b/src/main/java/command/HelpCommand.java @@ -0,0 +1,11 @@ +package command; + +import manager.ManagementSystem; +import miscellaneous.Ui; + +public class HelpCommand extends Command { + @Override + public void execute(ManagementSystem manager, Ui ui) { + ui.showHelp(); + } +} diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index a732e2e176..5068bb0e50 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -8,6 +8,7 @@ import command.AddAppointmentCommand; import command.DeleteAppointmentCommand; import command.EditPatientCommand; +import command.HelpCommand; import command.ListAppointmentCommand; import command.EditPatientHistoryCommand; import command.ListPatientCommand; @@ -50,6 +51,8 @@ public static Command parse(String userInput) throws InvalidInputFormatException switch (commandWord) { case "bye": return new ExitCommand(); + case "help": + return new HelpCommand(); case "add-patient": return new AddPatientCommand(parseAddPatient(userInput)); case "delete-patient": diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index e9212c9e95..f7103d7f2e 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -28,7 +28,7 @@ public void showWelcome() { showLine(); } - public static void showBye() { + public void showBye() { showLine(); System.out.println("Goodbye!"); showLine(); @@ -45,6 +45,33 @@ public void showError(String message) { showLine(); } + public void showHelp() { + showLine(); + System.out.println("These are the available commands:"); + System.out.println("Patient: "); + System.out.println("- add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS"); + System.out.println("- delete-patient NRIC"); + System.out.println("- edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]"); + System.out.println("- list-patient"); + System.out.println("- view-patient NRIC"); + System.out.println("- store-history n/NAME ic/NRIC h/MEDICAL_HISTORY"); + System.out.println("- view-history NRIC or view-history NAME"); + System.out.println("- edit-history ic/NRIC old/OLD_TEXT new/NEW_TEXT"); + System.out.println("Appointment: "); + System.out.println("- add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION"); + System.out.println("- delete-appointment APPOINTMENT_ID"); + System.out.println("- list-appointment"); + System.out.println("- mark-appointment APPOINTMENT_ID"); + System.out.println("- unmark-appointment APPOINTMENT_ID"); + System.out.println("- sort-appointment byDate or sort-appointment byId"); + System.out.println("- find-appointment PATIENT_NRIC"); + System.out.println("Prescription: "); + System.out.println("- add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]"); + System.out.println("- view-all-prescriptions PATIENT_ID"); + System.out.println("- view-prescription PRESCRIPTION_ID"); + showLine(); + } + //@@author judHoka public void showPatientAdded(List patients) { showLine(); From 00861daa351d638ae4c84ee4cad8a40a3c40cbbd Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 01:58:03 +0800 Subject: [PATCH 122/203] Checkpoint 1: Nothing changed --- .vscode/settings.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..9c081d7b94 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "workbench.editor.defaultBinaryEditor": "default" +} \ No newline at end of file From 1cd4a356e9974c08f43c38af6293d2fafa900e9f Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 03:18:58 +0800 Subject: [PATCH 123/203] Implemented valid birthdate feature using LocalDate and adjusted test cases to match changes --- data/patient_data.txt | 1 + src/main/java/command/Command.java | 7 +- src/main/java/command/EditPatientCommand.java | 3 +- src/main/java/manager/ManagementSystem.java | 22 +++-- src/main/java/manager/Patient.java | 39 ++++++--- src/main/java/miscellaneous/Parser.java | 8 +- .../command/AddAppointmentCommandTest.java | 2 +- .../command/DeleteAppointmentCommandTest.java | 9 +- .../command/ListAppointmentCommandTest.java | 14 ++-- .../command/SortAppointmentCommandTest.java | 13 ++- .../java/manager/ManagementSystemTest.java | 83 +++++++++---------- src/test/java/miscellaneous/ParserTest.java | 5 +- test-data/appointment_data.txt | 4 +- 13 files changed, 113 insertions(+), 97 deletions(-) diff --git a/data/patient_data.txt b/data/patient_data.txt index e69de29bb2..9213d25421 100644 --- a/data/patient_data.txt +++ b/data/patient_data.txt @@ -0,0 +1 @@ +S1234567D|John|06-04-2003|M|123 Main St|91218188| diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 4dcbd5d898..396b026756 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -1,9 +1,6 @@ package command; -import exception.AppointmentClashException; -import exception.DuplicatePatientIDException; -import exception.PatientNotFoundException; -import exception.UnloadedStorageException; +import exception.*; import manager.ManagementSystem; import miscellaneous.Ui; @@ -11,7 +8,7 @@ public abstract class Command { public abstract void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException, PatientNotFoundException, - AppointmentClashException; + AppointmentClashException, InvalidInputFormatException; public boolean isExit() { return false; diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java index d1e4e003b7..176d087aa1 100644 --- a/src/main/java/command/EditPatientCommand.java +++ b/src/main/java/command/EditPatientCommand.java @@ -1,5 +1,6 @@ package command; +import exception.InvalidInputFormatException; import exception.PatientNotFoundException; import exception.UnloadedStorageException; import manager.ManagementSystem; @@ -15,7 +16,7 @@ public EditPatientCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException, InvalidInputFormatException { String nric = details[0]; String name = details[1]; String dob = details[2]; diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index d4f5a9da9d..09af8317cb 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,13 +1,13 @@ package manager; -import exception.AppointmentClashException; -import exception.DuplicatePatientIDException; -import exception.PatientNotFoundException; -import exception.UnloadedStorageException; +import exception.*; import miscellaneous.Ui; import storage.Storage; import java.time.Duration; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -94,7 +94,7 @@ public Patient viewPatient(String nric) { //@@author jyukuan public void editPatient(String nric, String newName, String newDob, String newGender, String newAddress, - String newPhone) throws UnloadedStorageException, PatientNotFoundException { + String newPhone) throws UnloadedStorageException, PatientNotFoundException, InvalidInputFormatException { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; assert patients != null : "Patient list cannot be null"; @@ -107,8 +107,18 @@ public void editPatient(String nric, String newName, String newDob, String newGe patient.setName(newName); } if (newDob != null && !newDob.isBlank()) { - patient.setDob(newDob); + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate parsedDob = LocalDate.parse(newDob, formatter); + if (parsedDob.isAfter(LocalDate.now())) { + throw new InvalidInputFormatException("Date of birth must be before today."); + } + patient.setDob(parsedDob); + } catch (DateTimeParseException e) { + throw new InvalidInputFormatException("Invalid date format. Use dd-MM-yyyy."); + } } + if (newGender != null && !newGender.isBlank()) { patient.setGender(newGender); } diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 1060702999..0147fb00b2 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -1,5 +1,10 @@ package manager; +import exception.InvalidInputFormatException; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.List; @@ -7,18 +12,18 @@ public class Patient { private String id; private String name; - private String dob; + private LocalDate dob; private String contactInfo; private String gender; private String address; private final List medicalHistory; private final List appointments; - public Patient(String id, String name, String dob, String gender, String address, - String contactInfo, List medicalHistory) { + public Patient(String id, String name, String dobStr, String gender, String address, + String contactInfo, List medicalHistory) throws InvalidInputFormatException { assert id != null && !id.isBlank() : "Patient ID cannot be null or blank"; assert name != null && !name.isBlank() : "Patient name cannot be null or blank"; - assert dob != null : "Date of birth cannot be null"; + assert dobStr != null : "Date of birth cannot be null"; assert gender != null : "Gender cannot be null"; assert address != null : "Address cannot be null"; assert contactInfo != null : "Contact info cannot be null"; @@ -26,7 +31,7 @@ public Patient(String id, String name, String dob, String gender, String address this.id = id; this.name = name; - this.dob = dob; + this.dob = parseAndValidateDob(dobStr); this.gender = gender; this.address = address; this.contactInfo = contactInfo; @@ -42,7 +47,7 @@ public String getName() { return name; } - public String getDob() { + public LocalDate getDob() { return dob; } @@ -66,7 +71,7 @@ public void setName(String name) { this.name = name; } - public void setDob(String dob) { + public void setDob(LocalDate dob) { this.dob = dob; } @@ -92,6 +97,19 @@ public void addAppointment(Appointment appointment) { appointments.add(appointment); } + private LocalDate parseAndValidateDob(String dobStr) throws InvalidInputFormatException { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + try { + LocalDate dob = LocalDate.parse(dobStr, formatter); + if (dob.isAfter(LocalDate.now())) { + throw new InvalidInputFormatException("Date of birth must be before the current date."); + } + return dob; + } catch (DateTimeParseException e) { + throw new InvalidInputFormatException("Invalid date format. Use dd-MM-yyyy."); + } + } + public void deleteAppointment(String apptId) { assert apptId != null && !apptId.isBlank() : "Appointment ID cannot be null or blank"; for (Appointment appt : appointments) { @@ -111,6 +129,7 @@ public String toString() { formattedMedicalHistory = String.join(", ", medicalHistory); } + String result = String.format( "Patient NRIC: %s\n" + "Name: %s\n" @@ -119,7 +138,7 @@ public String toString() { + "Address: %s\n" + "Contact: %s\n" + "Medical History: %s", - id, name, dob, gender, address, contactInfo, formattedMedicalHistory); + id, name, dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")), gender, address, contactInfo, formattedMedicalHistory); if (appointments.isEmpty()) { result += "\nAppointments: None"; @@ -145,7 +164,7 @@ public String toStringForListView() { + "Gender: %s\n " + "Address: %s\n " + "Contact: %s", - id, name, dob, gender, address, contactInfo); + id, name, dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")), gender, address, contactInfo); if (medicalHistory.isEmpty()) { result += "\n Medical History: None"; @@ -174,7 +193,7 @@ public String toStringForListView() { public String toFileFormat() { String history = String.join(", ", this.medicalHistory); - return this.id + "|" + this.name + "|" + this.dob + "|" + this.gender + "|" + return this.id + "|" + this.name + "|" + dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + "|" + this.gender + "|" + this.address + "|" + this.contactInfo + "|" + history; } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 33c856ba01..53f1392968 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -103,7 +103,7 @@ private static Patient parseAddPatient(String input) throws InvalidInputFormatEx if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) { throw new InvalidInputFormatException("Patient details are incomplete!" + System.lineSeparator() - + "Also, please use: add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS"); + + "Please use: add-patient n/NAME ic/NRIC dob/BIRTHDATE(dd-MM-yyyy) g/GENDER p/PHONE a/ADDRESS"); } List medHistory = new ArrayList<>(); @@ -357,7 +357,7 @@ private static String[] parseEditHistory(String input) throws InvalidInputFormat return new String[]{nric, oldHistory, newHistory}; } - public static Patient parseLoadPatient(String line) { + public static Patient parseLoadPatient(String line) throws InvalidInputFormatException { String[] tokens = line.split("\\|"); if (tokens.length < 7) { return null; @@ -365,7 +365,7 @@ public static Patient parseLoadPatient(String line) { String id = tokens[0]; String name = tokens[1]; - String dob = tokens[2]; + String dobStr = tokens[2]; String gender = tokens[3]; String address = tokens[4]; String contact = tokens[5]; @@ -373,7 +373,7 @@ public static Patient parseLoadPatient(String line) { .map(String::trim) .collect(Collectors.toList()); - return new Patient(id, name, dob, gender, address, contact, medHistory); + return new Patient(id, name, dobStr, gender, address, contact, medHistory); } public static Appointment parseLoadAppointment(String line) { diff --git a/src/test/java/command/AddAppointmentCommandTest.java b/src/test/java/command/AddAppointmentCommandTest.java index 616e7ae28b..1c60bbd4f1 100644 --- a/src/test/java/command/AddAppointmentCommandTest.java +++ b/src/test/java/command/AddAppointmentCommandTest.java @@ -37,7 +37,7 @@ void setUp() throws UnloadedStorageException { @Test void execute_validAppointment_expectAppointmentAdded() throws Exception { - Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + Patient patient = new Patient("S1234567D", "Billy", "01-10-1990", "M", "124 High St", "81234567", new ArrayList<>()); new AddPatientCommand(patient).execute(manager, ui); diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java index d4f25bf703..f401cef3df 100644 --- a/src/test/java/command/DeleteAppointmentCommandTest.java +++ b/src/test/java/command/DeleteAppointmentCommandTest.java @@ -1,9 +1,6 @@ package command; -import exception.AppointmentClashException; -import exception.DuplicatePatientIDException; -import exception.PatientNotFoundException; -import exception.UnloadedStorageException; +import exception.*; import manager.Appointment; import manager.ManagementSystem; import manager.Patient; @@ -40,8 +37,8 @@ void setUp() throws UnloadedStorageException { @Test void execute_validNric_expectAppointmentDeleted() throws DuplicatePatientIDException, UnloadedStorageException, - PatientNotFoundException, AppointmentClashException { - Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + PatientNotFoundException, AppointmentClashException, InvalidInputFormatException { + Patient patient = new Patient("S1234567D", "Billy", "01-10-1990", "M", "124 High St", "81234567", new ArrayList<>()); new AddPatientCommand(patient).execute(manager, ui); diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index 86641ba2e1..a714964388 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -1,9 +1,6 @@ package command; -import exception.AppointmentClashException; -import exception.DuplicatePatientIDException; -import exception.PatientNotFoundException; -import exception.UnloadedStorageException; +import exception.*; import manager.Appointment; import manager.ManagementSystem; import manager.Patient; @@ -41,17 +38,17 @@ void setUp() throws UnloadedStorageException { @Test void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDException, UnloadedStorageException, - PatientNotFoundException, AppointmentClashException { + PatientNotFoundException, AppointmentClashException, InvalidInputFormatException { LocalDateTime dateTime1 = LocalDateTime.parse("2025-03-25 1900", DATE_TIME_FORMAT); LocalDateTime dateTime2 = LocalDateTime.parse("2025-03-28 2000", DATE_TIME_FORMAT); LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT); List patients = List.of( - new Patient("S1234567D", "Billy", "1990-10-01", + new Patient("S1234567D", "Billy", "01-10-1990", "M", "124 High St", "81234567", new ArrayList<>()), - new Patient("S2345678D", "James" , "1980-12-31", + new Patient("S2345678D", "James" , "31-12-1980", "M", "133 Main St", "81229312", new ArrayList<>()), - new Patient("S3456789D", "William" , "1970-08-31", + new Patient("S3456789D", "William" , "31-08-1970", "M", "17 Cornelia St", "81009214", new ArrayList<>()) ); manager.addPatient(patients.get(0)); @@ -71,4 +68,5 @@ void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDE assertEquals(3, manager.getAppointments().size(), "Size of appointment does not match"); } + } diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index 9bd25913d2..05379e6915 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -1,9 +1,6 @@ package command; -import exception.AppointmentClashException; -import exception.DuplicatePatientIDException; -import exception.PatientNotFoundException; -import exception.UnloadedStorageException; +import exception.*; import manager.Appointment; import manager.ManagementSystem; import manager.Patient; @@ -35,17 +32,17 @@ class SortAppointmentCommandTest { @BeforeEach void setUp() throws UnloadedStorageException, DuplicatePatientIDException, PatientNotFoundException, - AppointmentClashException { + AppointmentClashException, InvalidInputFormatException { storage = new Storage(tempDir.toString()); ui = new Ui(); manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments(manager)); List patients = List.of( - new Patient("S1234567D", "Billy", "1990-10-01", + new Patient("S1234567D", "Billy", "01-10-1990", "M", "124 High St", "81234567", new ArrayList<>()), - new Patient("S2345678D", "James" , "1980-12-31", + new Patient("S2345678D", "James" , "31-12-1980", "M", "133 Main St", "81229312", new ArrayList<>()), - new Patient("S3456789D", "William" , "1970-08-31", + new Patient("S3456789D", "William" , "31-08-1970", "M", "17 Cornelia St", "81009214", new ArrayList<>()) ); manager.addPatient(patients.get(0)); diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 7fb6b06b1c..2a68cae96d 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -1,9 +1,6 @@ package manager; -import exception.AppointmentClashException; -import exception.DuplicatePatientIDException; -import exception.PatientNotFoundException; -import exception.UnloadedStorageException; +import exception.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import storage.Storage; @@ -40,12 +37,12 @@ void setUp() throws IOException { } @Test - void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDException, UnloadedStorageException { + void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDException, UnloadedStorageException, InvalidInputFormatException { List emptyListPatient = new ArrayList<>(); List emptyListAppoint = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint); - Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>()); manager.addPatient(patient); @@ -55,15 +52,15 @@ void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDExcepti } @Test - void addPatient_duplicateId_expectExceptionThrown() throws DuplicatePatientIDException, UnloadedStorageException { + void addPatient_duplicateId_expectExceptionThrown() throws DuplicatePatientIDException, UnloadedStorageException, InvalidInputFormatException { List existing = new ArrayList<>(); - Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>()); existing.add(patient); ManagementSystem manager = new ManagementSystem(existing, new ArrayList<>()); - Patient duplicate = new Patient("S1234567A", "Jane Smith", "1992-02-02", + Patient duplicate = new Patient("S1234567A", "Jane Smith", "02-02-1992", "F", "456 Sample Rd", "90000000", new ArrayList<>()); assertThrows(DuplicatePatientIDException.class, () -> manager.addPatient(duplicate)); @@ -71,12 +68,12 @@ void addPatient_duplicateId_expectExceptionThrown() throws DuplicatePatientIDExc @Test void addPatient_validInput_expectPatientAddedAndSaved() - throws DuplicatePatientIDException, UnloadedStorageException, IOException { + throws DuplicatePatientIDException, UnloadedStorageException, IOException, InvalidInputFormatException { List emptyListPatient = new ArrayList<>(); List emptyListAppoint = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint); - Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>()); manager.addPatient(patient); @@ -91,9 +88,9 @@ void addPatient_validInput_expectPatientAddedAndSaved() } @Test - void deletePatient_existingPatient_patientDeleted() throws UnloadedStorageException { + void deletePatient_existingPatient_patientDeleted() throws UnloadedStorageException, InvalidInputFormatException { List patients = new ArrayList<>(); - Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>()); patients.add(patient); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -107,9 +104,9 @@ void deletePatient_existingPatient_patientDeleted() throws UnloadedStorageExcept } @Test - void deletePatient_nonExistentPatient_patientNotFound() throws UnloadedStorageException { + void deletePatient_nonExistentPatient_patientNotFound() throws UnloadedStorageException, InvalidInputFormatException { List patients = new ArrayList<>(); - Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01", + Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>()); patients.add(patient); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -132,9 +129,9 @@ void deletePatient_emptyList_patientNotFound() throws UnloadedStorageException { } @Test - void viewPatient_validNric_patientFound() { + void viewPatient_validNric_patientFound() throws InvalidInputFormatException { List patients = new ArrayList<>(); - patients.add(new Patient("S1234567A", "John Doe", "1990-01-01", + patients.add(new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>())); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -146,9 +143,9 @@ void viewPatient_validNric_patientFound() { } @Test - void viewPatient_invalidNric_patientNotFound() { + void viewPatient_invalidNric_patientNotFound() throws InvalidInputFormatException { List patients = new ArrayList<>(); - patients.add(new Patient("S1234567A", "John Doe", "1990-01-01", + patients.add(new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>())); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); @@ -169,13 +166,13 @@ void viewPatient_emptySystem_patientNotFound() { @Test void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageException, PatientNotFoundException, - AppointmentClashException { + AppointmentClashException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); - Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + Patient patient = new Patient("S1234567D", "Billy", "01-10-1990", "M", "124 High St", "81234567", new ArrayList<>()); patients.add(patient); Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); @@ -191,14 +188,14 @@ void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageEx @Test void addAppointment_clashedAppointments_expectException() throws UnloadedStorageException, PatientNotFoundException, - AppointmentClashException { + AppointmentClashException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-20 1950", DATE_TIME_FORMAT); - Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + Patient patient = new Patient("S1234567D", "Billy", "01-10-1990", "M", "124 High St", "81234567", new ArrayList<>()); patients.add(patient); Appointment appointment1 = new Appointment("S1234567D", appointmentTime1, "Medical Checkup"); @@ -210,13 +207,13 @@ void addAppointment_clashedAppointments_expectException() throws UnloadedStorage @Test void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStorageException, - PatientNotFoundException, AppointmentClashException { + PatientNotFoundException, AppointmentClashException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); - Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + Patient patient = new Patient("S1234567D", "Billy", "10-01-1990", "M", "124 High St", "81234567", new ArrayList<>()); patients.add(patient); Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); @@ -232,13 +229,13 @@ void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStor @Test void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws UnloadedStorageException, - PatientNotFoundException, AppointmentClashException { + PatientNotFoundException, AppointmentClashException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-30 2200", DATE_TIME_FORMAT); - Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + Patient patient = new Patient("S1234567D", "Billy", "10-01-1990", "M", "124 High St", "81234567", new ArrayList<>()); patients.add(patient); Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); @@ -254,13 +251,13 @@ void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws Unloaded @Test void deleteAppointment_nonExistentId_expectNullReturned() throws UnloadedStorageException, - PatientNotFoundException, AppointmentClashException { + PatientNotFoundException, AppointmentClashException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-25 2100", DATE_TIME_FORMAT); - Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", + Patient patient = new Patient("S1234567D", "Billy", "10-01-1990", "M", "124 High St", "81234567", new ArrayList<>()); patients.add(patient); Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); @@ -326,10 +323,10 @@ void sortAppointmentsById_sortById_appointmentsSortedById() { //@@author dylancmznus @Test void markAppointment_validInput_expectAppointmentMarked() throws DuplicatePatientIDException, - UnloadedStorageException, PatientNotFoundException, AppointmentClashException { + UnloadedStorageException, PatientNotFoundException, AppointmentClashException, InvalidInputFormatException { ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); - Patient patient = new Patient("S9876543Z", "John Doe", "1990-01-01", + Patient patient = new Patient("S9876543Z", "John Doe", "01-01-1990", "M", "123 Street", "12345678", new ArrayList<>()); manager.addPatient(patient); @@ -345,10 +342,10 @@ void markAppointment_validInput_expectAppointmentMarked() throws DuplicatePatien //@@author dylancmznus @Test void unmarkAppointment_validInput_expectAppointmentUnmarked() throws DuplicatePatientIDException, - UnloadedStorageException, PatientNotFoundException, AppointmentClashException { + UnloadedStorageException, PatientNotFoundException, AppointmentClashException, InvalidInputFormatException { ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); - Patient patient = new Patient("S8765432Y", "John Doe", "1990-01-01", + Patient patient = new Patient("S8765432Y", "John Doe", "01-01-1990", "M", "123 Street", "12345678", new ArrayList<>()); manager.addPatient(patient); @@ -365,10 +362,10 @@ void unmarkAppointment_validInput_expectAppointmentUnmarked() throws DuplicatePa //@@author dylancmznus @Test void findAppointment_existingAppointment_expectAppointmentFound() throws DuplicatePatientIDException, - UnloadedStorageException, PatientNotFoundException, AppointmentClashException { + UnloadedStorageException, PatientNotFoundException, AppointmentClashException, InvalidInputFormatException { ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>()); - Patient patient = new Patient("S7654321X", "John Doe", "1990-01-01", + Patient patient = new Patient("S7654321X", "John Doe", "01-01-1990", "M", "123 Street", "12345678", new ArrayList<>()); manager.addPatient(patient); @@ -398,13 +395,13 @@ void findAppointment_nonExistentAppointment_expectNullReturned() { //@@author jyukuan @Test void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedHistory() - throws UnloadedStorageException, PatientNotFoundException { + throws UnloadedStorageException, PatientNotFoundException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem mhm = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); - Patient patient = new Patient("S1234567A", "John Doe", "1990-10-01", + Patient patient = new Patient("S1234567A", "John Doe", "10-01-1990", "M", "124 High St", "81234567", new ArrayList<>()); patients.add(patient); @@ -423,12 +420,12 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH } @Test - void editPatientHistory_oldEntryNotFound_expectNoChange() throws UnloadedStorageException { + void editPatientHistory_oldEntryNotFound_expectNoChange() throws UnloadedStorageException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); List history = new ArrayList<>(List.of("Cold", "Migraine")); - Patient patient = new Patient("F8888888Q", "Ellen", "1970-12-12", "F", "99 Peace Ave", "85556666", history); + Patient patient = new Patient("F8888888Q", "Ellen", "12-12-1970", "F", "99 Peace Ave", "85556666", history); patients.add(patient); manager.editPatientHistory("F8888888Q", "Cancer", "Diabetes"); @@ -442,11 +439,11 @@ void editPatientHistory_oldEntryNotFound_expectNoChange() throws UnloadedStorage } @Test - void editPatientHistory_validHistory_expectUpdated() throws UnloadedStorageException { + void editPatientHistory_validHistory_expectUpdated() throws UnloadedStorageException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); List history = new ArrayList<>(List.of("High BP", "Migraine")); - Patient patient = new Patient("F1234567X", "Carol", "1975-03-15", "F", "Blk 999", "83334444", history); + Patient patient = new Patient("F1234567X", "Carol", "15-03-1975", "F", "Blk 999", "83334444", history); patients.add(patient); manager.editPatientHistory("F1234567X", "High BP", "Hypertension"); @@ -457,12 +454,12 @@ void editPatientHistory_validHistory_expectUpdated() throws UnloadedStorageExcep } @Test - void editPatientHistory_emptyNewHistory_expectAssertionError() { + void editPatientHistory_emptyNewHistory_expectAssertionError() throws InvalidInputFormatException { // Setup List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); List history = new ArrayList<>(List.of("Headache")); - Patient patient = new Patient("T7654321B", "Sarah", "1992-03-03", + Patient patient = new Patient("T7654321B", "Sarah", "03-03-1992", "F", "88 Health Ave", "81231234", history); patients.add(patient); diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index c7e3f91ff0..c33456285b 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -99,7 +99,7 @@ void parseAddPatient_invalidInputFormat_expectException() { String input = "add-patient n/John Doe ic/ dob/12-12-1999 g/M " + "p/98765432 a/123 Main Street h/Diabetes, Hypertension"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input)); } @Test @@ -147,8 +147,7 @@ void parseStoreHistory_missingFields_expectException() { Parser.parseStoreHistory("store-history n/John Doe h/Allergic to nuts")); assertThrows(InvalidInputFormatException.class, () -> Parser.parseStoreHistory("store-history n/John Doe ic/S1234567D")); - } - +} @Test void parse_addAppointmentCommand_expectAddAppointmentCommand() throws InvalidInputFormatException, diff --git a/test-data/appointment_data.txt b/test-data/appointment_data.txt index 755d09abaf..71a3c2707d 100644 --- a/test-data/appointment_data.txt +++ b/test-data/appointment_data.txt @@ -1,2 +1,2 @@ -countId:124 -123|false|S1234567D|2025-03-20 7:00 pm|Medical Checkup +countId:129 +128|true|S9876543Z|2025-04-10 3:00 PM|Dental Checkup From ecb5b122e5651dd81757d46f5c81e912f3ab16d9 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 05:36:19 +0800 Subject: [PATCH 124/203] Add test cases for prescription feature --- src/main/java/miscellaneous/Parser.java | 16 +- .../command/AddPrescriptionCommandTest.java | 120 +++++++++++++ .../ViewAllPrescriptionsCommandTest.java | 134 ++++++++++++++ .../command/ViewPrescriptionCommandTest.java | 111 ++++++++++++ .../ManagementSystemPrescriptionTest.java | 163 ++++++++++++++++++ src/test/java/manager/PrescriptionTest.java | 134 ++++++++++++++ .../miscellaneous/ParserPrescriptionTest.java | 119 +++++++++++++ 7 files changed, 793 insertions(+), 4 deletions(-) create mode 100644 src/test/java/command/AddPrescriptionCommandTest.java create mode 100644 src/test/java/command/ViewAllPrescriptionsCommandTest.java create mode 100644 src/test/java/command/ViewPrescriptionCommandTest.java create mode 100644 src/test/java/manager/ManagementSystemPrescriptionTest.java create mode 100644 src/test/java/manager/PrescriptionTest.java create mode 100644 src/test/java/miscellaneous/ParserPrescriptionTest.java diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 33c856ba01..b59e61066e 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -442,20 +442,28 @@ public static Prescription parseAddPrescription(String input) throws InvalidInpu } public static String parseViewAllPrescriptions(String input) throws InvalidInputFormatException { - if (input.length() < 22) { + String trimmedInput = input.trim(); + if (trimmedInput.equals("view-all-prescriptions") || trimmedInput.length() <= 22) { throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID"); } - String patientId = input.substring(22).trim(); + String patientId = trimmedInput.substring(22).trim(); + if (patientId.isEmpty()) { + throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID"); + } return patientId; } public static String parseViewPrescription(String input) throws InvalidInputFormatException { - if (input.length() < 17) { + String trimmedInput = input.trim(); + if (trimmedInput.equals("view-prescription") || trimmedInput.length() <= 17) { throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID"); } - String prescriptionId = input.substring(17).trim(); + String prescriptionId = trimmedInput.substring(17).trim(); + if (prescriptionId.isEmpty()) { + throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID"); + } return prescriptionId; } diff --git a/src/test/java/command/AddPrescriptionCommandTest.java b/src/test/java/command/AddPrescriptionCommandTest.java new file mode 100644 index 0000000000..7bb2df4f2b --- /dev/null +++ b/src/test/java/command/AddPrescriptionCommandTest.java @@ -0,0 +1,120 @@ +package command; + +import exception.UnloadedStorageException; +import manager.ManagementSystem; +import manager.Patient; +import manager.Prescription; +import miscellaneous.Ui; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import storage.Storage; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +//@@author Basudeb2005 +public class AddPrescriptionCommandTest { + + private ManagementSystem system; + private Ui ui; + private ByteArrayOutputStream outputStream; + private PrintStream originalOut; + + @BeforeEach + public void setUp() { + // Save original System.out + originalOut = System.out; + + // Redirect System.out to capture output + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + + try { + // Initialize Storage with temp directory + new Storage(System.getProperty("java.io.tmpdir") + File.separator + "clinicease_test"); + + // Initialize system and UI + system = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + ui = new Ui(); + + // Add a test patient + Patient patient = new Patient( + "S1234567A", "John Doe", "1990-01-01", "Male", + "123 Main St", "98765432", new ArrayList<>() + ); + system.addPatient(patient); + } catch (Exception e) { + fail("Failed to set up test: " + e.getMessage()); + } + } + + @Test + public void execute_validPrescription_success() { + // Create prescription and command + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + Prescription prescription = new Prescription("S1234567A", symptoms, medicines, "Take after meals"); + AddPrescriptionCommand command = new AddPrescriptionCommand(prescription); + + try { + // Execute command + command.execute(system, ui); + + // Verify command output indicates success + String output = outputStream.toString(); + assertTrue(output.contains("Successfully added prescription")); + assertTrue(output.contains("S1234567A-1")); // Prescription ID + assertTrue(output.contains("Fever")); + assertTrue(output.contains("Paracetamol")); + assertTrue(output.contains("Take after meals")); + + // Verify prescription was added to the system + assertEquals(1, system.getPrescriptions().size()); + assertNotNull(system.getPrescriptionById("S1234567A-1")); + } catch (UnloadedStorageException e) { + fail("Should not throw exception for a valid prescription: " + e.getMessage()); + } + } + + @Test + public void execute_nonExistentPatient_showsError() { + // Create prescription for non-existent patient and command + List symptoms = Arrays.asList("Fever"); + List medicines = Arrays.asList("Paracetamol"); + Prescription prescription = new Prescription("NONEXISTENT", symptoms, medicines, ""); + AddPrescriptionCommand command = new AddPrescriptionCommand(prescription); + + try { + // Execute command + command.execute(system, ui); + + // Verify command output indicates error + String output = outputStream.toString(); + assertTrue(output.contains("Failed to add prescription")); + assertTrue(output.contains("Patient with NRIC: NONEXISTENT not found")); + + // Verify no prescription was added to the system + assertEquals(0, system.getPrescriptions().size()); + } catch (UnloadedStorageException e) { + fail("Should handle patient not found gracefully: " + e.getMessage()); + } + } + + @Test + public void isExit_returnsFalse() { + // Create command + List symptoms = Arrays.asList("Fever"); + List medicines = Arrays.asList("Paracetamol"); + Prescription prescription = new Prescription("S1234567A", symptoms, medicines, ""); + AddPrescriptionCommand command = new AddPrescriptionCommand(prescription); + + // Verify isExit returns false + assertFalse(command.isExit()); + } +} \ No newline at end of file diff --git a/src/test/java/command/ViewAllPrescriptionsCommandTest.java b/src/test/java/command/ViewAllPrescriptionsCommandTest.java new file mode 100644 index 0000000000..1ee4accf2e --- /dev/null +++ b/src/test/java/command/ViewAllPrescriptionsCommandTest.java @@ -0,0 +1,134 @@ +package command; + +import exception.UnloadedStorageException; +import manager.ManagementSystem; +import manager.Patient; +import manager.Prescription; +import miscellaneous.Ui; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import storage.Storage; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +//@@author Basudeb2005 +public class ViewAllPrescriptionsCommandTest { + + private ManagementSystem system; + private Ui ui; + private ByteArrayOutputStream outputStream; + private Patient testPatient; + private PrintStream originalOut; + + @BeforeEach + public void setUp() { + // Save original System.out + originalOut = System.out; + + // Redirect System.out to capture output + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + + try { + // Initialize Storage with temp directory + new Storage(System.getProperty("java.io.tmpdir") + File.separator + "clinicease_test"); + + // Initialize system and UI + system = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + ui = new Ui(); + + // Add a test patient + testPatient = new Patient( + "S1234567A", "John Doe", "1990-01-01", "Male", + "123 Main St", "98765432", new ArrayList<>() + ); + system.addPatient(testPatient); + } catch (Exception e) { + fail("Failed to set up test: " + e.getMessage()); + } + } + + @Test + public void execute_patientWithPrescriptions_success() { + try { + // Add some prescriptions for the test patient + List symptoms1 = Arrays.asList("Fever", "Cough"); + List medicines1 = Arrays.asList("Paracetamol", "Cough syrup"); + system.addPrescription(new Prescription(testPatient.getId(), symptoms1, medicines1, "Take after meals")); + + List symptoms2 = Arrays.asList("Headache"); + List medicines2 = Arrays.asList("Ibuprofen"); + system.addPrescription(new Prescription(testPatient.getId(), symptoms2, medicines2, "Take with water")); + + // Create command + ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand(testPatient.getId()); + + // Execute command + command.execute(system, ui); + + // Verify command output + String output = outputStream.toString(); + assertTrue(output.contains("Prescriptions for patient John Doe")); + assertTrue(output.contains("Fever")); + assertTrue(output.contains("Cough")); + assertTrue(output.contains("Headache")); + assertTrue(output.contains("Paracetamol")); + assertTrue(output.contains("Ibuprofen")); + assertTrue(output.contains("Take after meals")); + assertTrue(output.contains("Take with water")); + assertTrue(output.contains("Total prescriptions: 2")); + } catch (UnloadedStorageException e) { + fail("Should not throw exception: " + e.getMessage()); + } + } + + @Test + public void execute_patientWithNoPrescriptions_showsMessage() { + try { + // Create command for patient with no prescriptions + ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand(testPatient.getId()); + + // Execute command + command.execute(system, ui); + + // Verify command output + String output = outputStream.toString(); + assertTrue(output.contains("No prescriptions found for patient John Doe")); + } catch (UnloadedStorageException e) { + fail("Should not throw exception for patient with no prescriptions: " + e.getMessage()); + } + } + + @Test + public void execute_nonExistentPatient_showsError() { + // Create command for non-existent patient + ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand("NONEXISTENT"); + + try { + // Execute command + command.execute(system, ui); + + // Verify command output indicates error + String output = outputStream.toString(); + assertTrue(output.contains("Patient with ID NONEXISTENT not found")); + } catch (UnloadedStorageException e) { + fail("Should handle patient not found gracefully: " + e.getMessage()); + } + } + + @Test + public void isExit_returnsFalse() { + // Create command + ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand("S1234567A"); + + // Verify isExit returns false + assertFalse(command.isExit()); + } +} \ No newline at end of file diff --git a/src/test/java/command/ViewPrescriptionCommandTest.java b/src/test/java/command/ViewPrescriptionCommandTest.java new file mode 100644 index 0000000000..07138f4c5e --- /dev/null +++ b/src/test/java/command/ViewPrescriptionCommandTest.java @@ -0,0 +1,111 @@ +package command; + +import exception.UnloadedStorageException; +import manager.ManagementSystem; +import manager.Patient; +import manager.Prescription; +import miscellaneous.Ui; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import storage.Storage; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +//@@author Basudeb2005 +public class ViewPrescriptionCommandTest { + + private ManagementSystem system; + private Ui ui; + private ByteArrayOutputStream outputStream; + private Prescription testPrescription; + private PrintStream originalOut; + + @BeforeEach + public void setUp() { + // Save original System.out + originalOut = System.out; + + // Redirect System.out to capture output + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + + try { + // Initialize Storage with temp directory + new Storage(System.getProperty("java.io.tmpdir") + File.separator + "clinicease_test"); + + // Initialize system and UI + system = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + ui = new Ui(); + + // Add a test patient + Patient patient = new Patient( + "S1234567A", "John Doe", "1990-01-01", "Male", + "123 Main St", "98765432", new ArrayList<>() + ); + system.addPatient(patient); + + // Add a test prescription + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + Prescription prescription = new Prescription("S1234567A", symptoms, medicines, "Take after meals"); + testPrescription = system.addPrescription(prescription); + } catch (Exception e) { + fail("Failed to set up test: " + e.getMessage()); + } + } + + @Test + public void execute_existingPrescription_success() { + // Create command for existing prescription + ViewPrescriptionCommand command = new ViewPrescriptionCommand(testPrescription.getPrescriptionId()); + + try { + // Execute command + command.execute(system, ui); + + // Verify command output + String output = outputStream.toString(); + assertTrue(output.contains("Prescription details")); + assertTrue(output.contains(testPrescription.getPrescriptionId())); + assertTrue(output.contains("Fever")); + assertTrue(output.contains("Paracetamol")); + assertTrue(output.contains("Take after meals")); + assertTrue(output.contains("Prescription HTML file generated")); + } catch (UnloadedStorageException e) { + fail("Should not throw exception for an existing prescription: " + e.getMessage()); + } + } + + @Test + public void execute_nonExistentPrescription_showsError() { + // Create command for non-existent prescription + ViewPrescriptionCommand command = new ViewPrescriptionCommand("NONEXISTENT-ID"); + + try { + // Execute command + command.execute(system, ui); + + // Verify command output indicates error + String output = outputStream.toString(); + assertTrue(output.contains("Prescription with ID NONEXISTENT-ID not found")); + } catch (UnloadedStorageException e) { + fail("Should handle prescription not found gracefully: " + e.getMessage()); + } + } + + @Test + public void isExit_returnsFalse() { + // Create command + ViewPrescriptionCommand command = new ViewPrescriptionCommand("S1234567A-1"); + + // Verify isExit returns false + assertFalse(command.isExit()); + } +} \ No newline at end of file diff --git a/src/test/java/manager/ManagementSystemPrescriptionTest.java b/src/test/java/manager/ManagementSystemPrescriptionTest.java new file mode 100644 index 0000000000..3e46decd8e --- /dev/null +++ b/src/test/java/manager/ManagementSystemPrescriptionTest.java @@ -0,0 +1,163 @@ +package manager; + +import exception.UnloadedStorageException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import storage.Storage; + +import java.io.File; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +//@@author Basudeb2005 +public class ManagementSystemPrescriptionTest { + + private ManagementSystem system; + private Patient testPatient; + + @BeforeEach + public void setUp() { + // Create a temporary directory for Storage + try { + // Initialize Storage with temp directory + new Storage(System.getProperty("java.io.tmpdir") + File.separator + "clinicease_test"); + + // Initialize system with empty lists + system = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + + // Add a test patient + testPatient = new Patient( + "S1234567A", "John Doe", "1990-01-01", "Male", + "123 Main St", "98765432", new ArrayList<>() + ); + + system.addPatient(testPatient); + } catch (Exception e) { + fail("Failed to set up test: " + e.getMessage()); + } + } + + @Test + public void addPrescription_validPrescription_success() { + // Create a prescription for an existing patient + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + Prescription prescription = new Prescription(testPatient.getId(), symptoms, medicines, "Take after meals"); + + try { + // Add prescription + Prescription addedPrescription = system.addPrescription(prescription); + + // Verify prescription was added with correct attributes + assertNotNull(addedPrescription); + assertEquals(testPatient.getId() + "-1", addedPrescription.getPrescriptionId()); + assertEquals(testPatient.getId(), addedPrescription.getPatientId()); + assertEquals(symptoms, addedPrescription.getSymptoms()); + assertEquals(medicines, addedPrescription.getMedicines()); + assertEquals("Take after meals", addedPrescription.getNotes()); + + // Verify it was added to the system's list + assertEquals(1, system.getPrescriptions().size()); + } catch (Exception e) { + fail("Should not throw exception for a valid prescription: " + e.getMessage()); + } + } + + @Test + public void addPrescription_nonExistentPatient_throwsException() { + // Create a prescription with non-existent patient ID + List symptoms = Arrays.asList("Fever"); + List medicines = Arrays.asList("Paracetamol"); + Prescription prescription = new Prescription("NONEXISTENT", symptoms, medicines, ""); + + // Try to add prescription - should throw IllegalArgumentException + Exception exception = assertThrows(IllegalArgumentException.class, () -> { + system.addPrescription(prescription); + }); + + assertTrue(exception.getMessage().contains("Patient with NRIC: NONEXISTENT not found")); + } + + @Test + public void getPrescriptionsForPatient_multipleExistingPrescriptions_returnsAllPrescriptions() { + try { + // Add two prescriptions for the same patient + List symptoms1 = Arrays.asList("Fever"); + List medicines1 = Arrays.asList("Paracetamol"); + Prescription prescription1 = new Prescription(testPatient.getId(), symptoms1, medicines1, ""); + + List symptoms2 = Arrays.asList("Headache"); + List medicines2 = Arrays.asList("Ibuprofen"); + Prescription prescription2 = new Prescription(testPatient.getId(), symptoms2, medicines2, ""); + + system.addPrescription(prescription1); + system.addPrescription(prescription2); + + // Get prescriptions for patient + List results = system.getPrescriptionsForPatient(testPatient.getId()); + + // Verify both prescriptions are returned + assertEquals(2, results.size()); + assertTrue(results.get(0).getSymptoms().contains("Fever")); + assertTrue(results.get(1).getSymptoms().contains("Headache")); + } catch (Exception e) { + fail("Should not throw exception: " + e.getMessage()); + } + } + + @Test + public void getPrescriptionsForPatient_noExistingPrescriptions_returnsEmptyList() { + // Get prescriptions for patient with no prescriptions + List results = system.getPrescriptionsForPatient(testPatient.getId()); + + // Verify empty list is returned + assertTrue(results.isEmpty()); + } + + @Test + public void getPrescriptionsForPatient_nonExistentPatient_returnsEmptyList() { + // Get prescriptions for non-existent patient ID + List results = system.getPrescriptionsForPatient("NONEXISTENT"); + + // Verify empty list is returned + assertTrue(results.isEmpty()); + } + + @Test + public void getPrescriptionById_existingPrescription_returnsPrescription() { + try { + // Add a prescription + List symptoms = Arrays.asList("Fever"); + List medicines = Arrays.asList("Paracetamol"); + Prescription added = system.addPrescription( + new Prescription(testPatient.getId(), symptoms, medicines, "") + ); + + // Get prescription by ID + Prescription result = system.getPrescriptionById(added.getPrescriptionId()); + + // Verify prescription is returned + assertNotNull(result); + assertEquals(added.getPrescriptionId(), result.getPrescriptionId()); + assertEquals(testPatient.getId(), result.getPatientId()); + assertTrue(result.getSymptoms().contains("Fever")); + assertTrue(result.getMedicines().contains("Paracetamol")); + } catch (Exception e) { + fail("Should not throw exception: " + e.getMessage()); + } + } + + @Test + public void getPrescriptionById_nonExistentPrescription_returnsNull() { + // Get prescription with non-existent ID + Prescription result = system.getPrescriptionById("NON-EXISTENT-ID"); + + // Verify null is returned + assertNull(result); + } +} \ No newline at end of file diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java new file mode 100644 index 0000000000..82cd79cd7c --- /dev/null +++ b/src/test/java/manager/PrescriptionTest.java @@ -0,0 +1,134 @@ +package manager; + +import org.junit.jupiter.api.Test; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +//@@author Basudeb2005 +public class PrescriptionTest { + + @Test + public void toFileFormat_validPrescription_success() { + // Create a sample prescription + String patientId = "S1234567A"; + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + String notes = "Take after meals"; + + LocalDateTime timestamp = LocalDateTime.now(); + String prescriptionId = patientId + "-1"; + + Prescription prescription = new Prescription( + patientId, prescriptionId, timestamp, symptoms, medicines, notes + ); + + // Convert to file format + String fileFormat = prescription.toFileFormat(); + + // Verify all required components are in the file format + assertTrue(fileFormat.contains(prescriptionId)); + assertTrue(fileFormat.contains(patientId)); + assertTrue(fileFormat.contains(timestamp.format( + java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))); + assertTrue(fileFormat.contains("Fever,Cough")); + assertTrue(fileFormat.contains("Paracetamol,Cough syrup")); + assertTrue(fileFormat.contains(notes)); + } + + @Test + public void fromFileFormat_validInput_success() { + // Create a properly formatted file entry + String fileEntry = "S1234567A-1|S1234567A|2023-04-01 14:30|Fever,Cough|Paracetamol,Cough syrup|Take after meals"; + + // Parse from file format + Prescription prescription = Prescription.fromFileFormat(fileEntry); + + // Verify all fields are correctly parsed + assertEquals("S1234567A-1", prescription.getPrescriptionId()); + assertEquals("S1234567A", prescription.getPatientId()); + assertEquals(2, prescription.getSymptoms().size()); + assertTrue(prescription.getSymptoms().contains("Fever")); + assertTrue(prescription.getSymptoms().contains("Cough")); + assertEquals(2, prescription.getMedicines().size()); + assertTrue(prescription.getMedicines().contains("Paracetamol")); + assertTrue(prescription.getMedicines().contains("Cough syrup")); + assertEquals("Take after meals", prescription.getNotes()); + } + + @Test + public void fromFileFormat_invalidInput_throwsException() { + // Create an improperly formatted file entry (missing fields) + String invalidFileEntry = "S1234567A-1|S1234567A"; + + // This should throw an array index out of bounds exception + assertThrows(ArrayIndexOutOfBoundsException.class, () -> { + Prescription.fromFileFormat(invalidFileEntry); + }); + } + + @Test + public void generateHtml_withPatient_containsPatientInfo() { + // Create a sample prescription + String patientId = "S1234567A"; + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + String notes = "Take after meals"; + + LocalDateTime timestamp = LocalDateTime.now(); + String prescriptionId = patientId + "-1"; + + Prescription prescription = new Prescription( + patientId, prescriptionId, timestamp, symptoms, medicines, notes + ); + + // Create a sample patient + Patient patient = new Patient( + patientId, "John Doe", "1990-01-01", "Male", + "123 Main St", "98765432", new ArrayList<>() + ); + + // Generate HTML + String html = prescription.generateHtml(patient); + + // Verify HTML contains both prescription and patient information + assertTrue(html.contains("")); + assertTrue(html.contains("Prescription " + prescriptionId + "")); + assertTrue(html.contains("John Doe")); // Patient name + assertTrue(html.contains("Male")); // Patient gender + assertTrue(html.contains("Fever")); // Symptom + assertTrue(html.contains("Paracetamol")); // Medicine + assertTrue(html.contains("Take after meals")); // Notes + } + + @Test + public void generateHtml_withoutPatient_containsOnlyPrescriptionInfo() { + // Create a sample prescription + String patientId = "S1234567A"; + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + String notes = "Take after meals"; + + LocalDateTime timestamp = LocalDateTime.now(); + String prescriptionId = patientId + "-1"; + + Prescription prescription = new Prescription( + patientId, prescriptionId, timestamp, symptoms, medicines, notes + ); + + // Generate HTML without patient + String html = prescription.generateHtml(null); + + // Verify HTML contains prescription info but limited patient info + assertTrue(html.contains("")); + assertTrue(html.contains("Prescription " + prescriptionId + "")); + assertFalse(html.contains("John Doe")); // Should not contain patient name + assertTrue(html.contains(patientId)); // Should contain patient ID + assertTrue(html.contains("Fever")); // Should contain symptom + assertTrue(html.contains("Paracetamol")); // Should contain medicine + assertTrue(html.contains("Take after meals")); // Should contain notes + } +} \ No newline at end of file diff --git a/src/test/java/miscellaneous/ParserPrescriptionTest.java b/src/test/java/miscellaneous/ParserPrescriptionTest.java new file mode 100644 index 0000000000..993de852d1 --- /dev/null +++ b/src/test/java/miscellaneous/ParserPrescriptionTest.java @@ -0,0 +1,119 @@ +package miscellaneous; + +import exception.InvalidInputFormatException; +import manager.Prescription; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +//@@author Basudeb2005 +public class ParserPrescriptionTest { + + @Test + public void parseAddPrescription_validInput_success() throws InvalidInputFormatException { + // Valid input with all fields including optional notes + String input = "add-prescription ic/S1234567A s/Fever, Cough m/Paracetamol, Cough syrup nt/Take after meals"; + + Prescription prescription = Parser.parseAddPrescription(input); + + // Verify all fields are correctly parsed + assertEquals("S1234567A", prescription.getPatientId()); + List symptoms = prescription.getSymptoms(); + assertEquals(2, symptoms.size()); + assertTrue(symptoms.contains("Fever")); + assertTrue(symptoms.contains("Cough")); + + List medicines = prescription.getMedicines(); + assertEquals(2, medicines.size()); + assertTrue(medicines.contains("Paracetamol")); + assertTrue(medicines.contains("Cough syrup")); + + assertEquals("Take after meals", prescription.getNotes()); + } + + @Test + public void parseAddPrescription_missingPatientId_throwsException() { + // Missing the required ic/ parameter + String input = "add-prescription s/Fever m/Paracetamol nt/Take after meals"; + + assertThrows(InvalidInputFormatException.class, () -> { + Parser.parseAddPrescription(input); + }); + } + + @Test + public void parseAddPrescription_missingSymptoms_throwsException() { + // Missing the required s/ parameter + String input = "add-prescription ic/S1234567A m/Paracetamol nt/Take after meals"; + + assertThrows(InvalidInputFormatException.class, () -> { + Parser.parseAddPrescription(input); + }); + } + + @Test + public void parseAddPrescription_missingMedicines_throwsException() { + // Missing the required m/ parameter + String input = "add-prescription ic/S1234567A s/Fever nt/Take after meals"; + + assertThrows(InvalidInputFormatException.class, () -> { + Parser.parseAddPrescription(input); + }); + } + + @Test + public void parseAddPrescription_noOptionalNotes_success() throws InvalidInputFormatException { + // Valid input with only required fields + String input = "add-prescription ic/S1234567A s/Fever m/Paracetamol"; + + Prescription prescription = Parser.parseAddPrescription(input); + + // Verify required fields are parsed and optional field is empty + assertEquals("S1234567A", prescription.getPatientId()); + assertEquals(1, prescription.getSymptoms().size()); + assertEquals(1, prescription.getMedicines().size()); + assertEquals("", prescription.getNotes()); + } + + @Test + public void parseViewAllPrescriptions_validInput_success() throws InvalidInputFormatException { + // Valid command format + String input = "view-all-prescriptions S1234567A"; + + String patientId = Parser.parseViewAllPrescriptions(input); + + assertEquals("S1234567A", patientId); + } + + @Test + public void parseViewAllPrescriptions_missingPatientId_throwsException() { + // Command without patient ID - needs to be shorter than 22 characters + String input = "view-all-prescriptions"; + + assertThrows(InvalidInputFormatException.class, () -> { + Parser.parseViewAllPrescriptions(input); + }); + } + + @Test + public void parseViewPrescription_validInput_success() throws InvalidInputFormatException { + // Valid command format + String input = "view-prescription S1234567A-1"; + + String prescriptionId = Parser.parseViewPrescription(input); + + assertEquals("S1234567A-1", prescriptionId); + } + + @Test + public void parseViewPrescription_missingPrescriptionId_throwsException() { + // Command without prescription ID - needs to be shorter than 17 characters + String input = "view-prescription"; + + assertThrows(InvalidInputFormatException.class, () -> { + Parser.parseViewPrescription(input); + }); + } +} \ No newline at end of file From 383ddc331460741446088702583de5b571c41c57 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 05:52:33 +0800 Subject: [PATCH 125/203] Fix checkstyle issues --- .../command/AddPrescriptionCommandTest.java | 34 ++++----- .../ViewAllPrescriptionsCommandTest.java | 38 +++++----- .../command/ViewPrescriptionCommandTest.java | 28 ++++---- .../ManagementSystemPrescriptionTest.java | 57 +++++++-------- src/test/java/manager/PrescriptionTest.java | 72 ++++++++++--------- .../miscellaneous/ParserPrescriptionTest.java | 44 ++++++------ 6 files changed, 137 insertions(+), 136 deletions(-) diff --git a/src/test/java/command/AddPrescriptionCommandTest.java b/src/test/java/command/AddPrescriptionCommandTest.java index 7bb2df4f2b..aa87cb81e9 100644 --- a/src/test/java/command/AddPrescriptionCommandTest.java +++ b/src/test/java/command/AddPrescriptionCommandTest.java @@ -7,6 +7,7 @@ import miscellaneous.Ui; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; import storage.Storage; import java.io.ByteArrayOutputStream; @@ -16,8 +17,6 @@ import java.util.Arrays; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - //@@author Basudeb2005 public class AddPrescriptionCommandTest { @@ -50,7 +49,7 @@ public void setUp() { ); system.addPatient(patient); } catch (Exception e) { - fail("Failed to set up test: " + e.getMessage()); + Assertions.fail("Failed to set up test: " + e.getMessage()); } } @@ -68,17 +67,17 @@ public void execute_validPrescription_success() { // Verify command output indicates success String output = outputStream.toString(); - assertTrue(output.contains("Successfully added prescription")); - assertTrue(output.contains("S1234567A-1")); // Prescription ID - assertTrue(output.contains("Fever")); - assertTrue(output.contains("Paracetamol")); - assertTrue(output.contains("Take after meals")); + Assertions.assertTrue(output.contains("Successfully added prescription")); + Assertions.assertTrue(output.contains("S1234567A-1")); // Prescription ID + Assertions.assertTrue(output.contains("Fever")); + Assertions.assertTrue(output.contains("Paracetamol")); + Assertions.assertTrue(output.contains("Take after meals")); // Verify prescription was added to the system - assertEquals(1, system.getPrescriptions().size()); - assertNotNull(system.getPrescriptionById("S1234567A-1")); + Assertions.assertEquals(1, system.getPrescriptions().size()); + Assertions.assertNotNull(system.getPrescriptionById("S1234567A-1")); } catch (UnloadedStorageException e) { - fail("Should not throw exception for a valid prescription: " + e.getMessage()); + Assertions.fail("Should not throw exception for a valid prescription: " + e.getMessage()); } } @@ -96,13 +95,13 @@ public void execute_nonExistentPatient_showsError() { // Verify command output indicates error String output = outputStream.toString(); - assertTrue(output.contains("Failed to add prescription")); - assertTrue(output.contains("Patient with NRIC: NONEXISTENT not found")); + Assertions.assertTrue(output.contains("Failed to add prescription")); + Assertions.assertTrue(output.contains("Patient with NRIC: NONEXISTENT not found")); // Verify no prescription was added to the system - assertEquals(0, system.getPrescriptions().size()); + Assertions.assertEquals(0, system.getPrescriptions().size()); } catch (UnloadedStorageException e) { - fail("Should handle patient not found gracefully: " + e.getMessage()); + Assertions.fail("Should handle patient not found gracefully: " + e.getMessage()); } } @@ -115,6 +114,7 @@ public void isExit_returnsFalse() { AddPrescriptionCommand command = new AddPrescriptionCommand(prescription); // Verify isExit returns false - assertFalse(command.isExit()); + Assertions.assertFalse(command.isExit()); } -} \ No newline at end of file +} + diff --git a/src/test/java/command/ViewAllPrescriptionsCommandTest.java b/src/test/java/command/ViewAllPrescriptionsCommandTest.java index 1ee4accf2e..bd70d8bf3d 100644 --- a/src/test/java/command/ViewAllPrescriptionsCommandTest.java +++ b/src/test/java/command/ViewAllPrescriptionsCommandTest.java @@ -7,6 +7,7 @@ import miscellaneous.Ui; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; import storage.Storage; import java.io.ByteArrayOutputStream; @@ -16,8 +17,6 @@ import java.util.Arrays; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - //@@author Basudeb2005 public class ViewAllPrescriptionsCommandTest { @@ -51,7 +50,7 @@ public void setUp() { ); system.addPatient(testPatient); } catch (Exception e) { - fail("Failed to set up test: " + e.getMessage()); + Assertions.fail("Failed to set up test: " + e.getMessage()); } } @@ -75,17 +74,17 @@ public void execute_patientWithPrescriptions_success() { // Verify command output String output = outputStream.toString(); - assertTrue(output.contains("Prescriptions for patient John Doe")); - assertTrue(output.contains("Fever")); - assertTrue(output.contains("Cough")); - assertTrue(output.contains("Headache")); - assertTrue(output.contains("Paracetamol")); - assertTrue(output.contains("Ibuprofen")); - assertTrue(output.contains("Take after meals")); - assertTrue(output.contains("Take with water")); - assertTrue(output.contains("Total prescriptions: 2")); + Assertions.assertTrue(output.contains("Prescriptions for patient John Doe")); + Assertions.assertTrue(output.contains("Fever")); + Assertions.assertTrue(output.contains("Cough")); + Assertions.assertTrue(output.contains("Headache")); + Assertions.assertTrue(output.contains("Paracetamol")); + Assertions.assertTrue(output.contains("Ibuprofen")); + Assertions.assertTrue(output.contains("Take after meals")); + Assertions.assertTrue(output.contains("Take with water")); + Assertions.assertTrue(output.contains("Total prescriptions: 2")); } catch (UnloadedStorageException e) { - fail("Should not throw exception: " + e.getMessage()); + Assertions.fail("Should not throw exception: " + e.getMessage()); } } @@ -100,9 +99,9 @@ public void execute_patientWithNoPrescriptions_showsMessage() { // Verify command output String output = outputStream.toString(); - assertTrue(output.contains("No prescriptions found for patient John Doe")); + Assertions.assertTrue(output.contains("No prescriptions found for patient John Doe")); } catch (UnloadedStorageException e) { - fail("Should not throw exception for patient with no prescriptions: " + e.getMessage()); + Assertions.fail("Should not throw exception for patient with no prescriptions: " + e.getMessage()); } } @@ -117,9 +116,9 @@ public void execute_nonExistentPatient_showsError() { // Verify command output indicates error String output = outputStream.toString(); - assertTrue(output.contains("Patient with ID NONEXISTENT not found")); + Assertions.assertTrue(output.contains("Patient with ID NONEXISTENT not found")); } catch (UnloadedStorageException e) { - fail("Should handle patient not found gracefully: " + e.getMessage()); + Assertions.fail("Should handle patient not found gracefully: " + e.getMessage()); } } @@ -129,6 +128,7 @@ public void isExit_returnsFalse() { ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand("S1234567A"); // Verify isExit returns false - assertFalse(command.isExit()); + Assertions.assertFalse(command.isExit()); } -} \ No newline at end of file +} + diff --git a/src/test/java/command/ViewPrescriptionCommandTest.java b/src/test/java/command/ViewPrescriptionCommandTest.java index 07138f4c5e..2cf0bc5b38 100644 --- a/src/test/java/command/ViewPrescriptionCommandTest.java +++ b/src/test/java/command/ViewPrescriptionCommandTest.java @@ -7,6 +7,7 @@ import miscellaneous.Ui; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; import storage.Storage; import java.io.ByteArrayOutputStream; @@ -16,8 +17,6 @@ import java.util.Arrays; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - //@@author Basudeb2005 public class ViewPrescriptionCommandTest { @@ -57,7 +56,7 @@ public void setUp() { Prescription prescription = new Prescription("S1234567A", symptoms, medicines, "Take after meals"); testPrescription = system.addPrescription(prescription); } catch (Exception e) { - fail("Failed to set up test: " + e.getMessage()); + Assertions.fail("Failed to set up test: " + e.getMessage()); } } @@ -72,14 +71,14 @@ public void execute_existingPrescription_success() { // Verify command output String output = outputStream.toString(); - assertTrue(output.contains("Prescription details")); - assertTrue(output.contains(testPrescription.getPrescriptionId())); - assertTrue(output.contains("Fever")); - assertTrue(output.contains("Paracetamol")); - assertTrue(output.contains("Take after meals")); - assertTrue(output.contains("Prescription HTML file generated")); + Assertions.assertTrue(output.contains("Prescription details")); + Assertions.assertTrue(output.contains(testPrescription.getPrescriptionId())); + Assertions.assertTrue(output.contains("Fever")); + Assertions.assertTrue(output.contains("Paracetamol")); + Assertions.assertTrue(output.contains("Take after meals")); + Assertions.assertTrue(output.contains("Prescription HTML file generated")); } catch (UnloadedStorageException e) { - fail("Should not throw exception for an existing prescription: " + e.getMessage()); + Assertions.fail("Should not throw exception for an existing prescription: " + e.getMessage()); } } @@ -94,9 +93,9 @@ public void execute_nonExistentPrescription_showsError() { // Verify command output indicates error String output = outputStream.toString(); - assertTrue(output.contains("Prescription with ID NONEXISTENT-ID not found")); + Assertions.assertTrue(output.contains("Prescription with ID NONEXISTENT-ID not found")); } catch (UnloadedStorageException e) { - fail("Should handle prescription not found gracefully: " + e.getMessage()); + Assertions.fail("Should handle prescription not found gracefully: " + e.getMessage()); } } @@ -106,6 +105,7 @@ public void isExit_returnsFalse() { ViewPrescriptionCommand command = new ViewPrescriptionCommand("S1234567A-1"); // Verify isExit returns false - assertFalse(command.isExit()); + Assertions.assertFalse(command.isExit()); } -} \ No newline at end of file +} + diff --git a/src/test/java/manager/ManagementSystemPrescriptionTest.java b/src/test/java/manager/ManagementSystemPrescriptionTest.java index 3e46decd8e..c86daa4518 100644 --- a/src/test/java/manager/ManagementSystemPrescriptionTest.java +++ b/src/test/java/manager/ManagementSystemPrescriptionTest.java @@ -1,19 +1,15 @@ package manager; -import exception.UnloadedStorageException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.api.Assertions; import storage.Storage; import java.io.File; -import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - //@@author Basudeb2005 public class ManagementSystemPrescriptionTest { @@ -38,7 +34,7 @@ public void setUp() { system.addPatient(testPatient); } catch (Exception e) { - fail("Failed to set up test: " + e.getMessage()); + Assertions.fail("Failed to set up test: " + e.getMessage()); } } @@ -54,17 +50,17 @@ public void addPrescription_validPrescription_success() { Prescription addedPrescription = system.addPrescription(prescription); // Verify prescription was added with correct attributes - assertNotNull(addedPrescription); - assertEquals(testPatient.getId() + "-1", addedPrescription.getPrescriptionId()); - assertEquals(testPatient.getId(), addedPrescription.getPatientId()); - assertEquals(symptoms, addedPrescription.getSymptoms()); - assertEquals(medicines, addedPrescription.getMedicines()); - assertEquals("Take after meals", addedPrescription.getNotes()); + Assertions.assertNotNull(addedPrescription); + Assertions.assertEquals(testPatient.getId() + "-1", addedPrescription.getPrescriptionId()); + Assertions.assertEquals(testPatient.getId(), addedPrescription.getPatientId()); + Assertions.assertEquals(symptoms, addedPrescription.getSymptoms()); + Assertions.assertEquals(medicines, addedPrescription.getMedicines()); + Assertions.assertEquals("Take after meals", addedPrescription.getNotes()); // Verify it was added to the system's list - assertEquals(1, system.getPrescriptions().size()); + Assertions.assertEquals(1, system.getPrescriptions().size()); } catch (Exception e) { - fail("Should not throw exception for a valid prescription: " + e.getMessage()); + Assertions.fail("Should not throw exception for a valid prescription: " + e.getMessage()); } } @@ -76,11 +72,11 @@ public void addPrescription_nonExistentPatient_throwsException() { Prescription prescription = new Prescription("NONEXISTENT", symptoms, medicines, ""); // Try to add prescription - should throw IllegalArgumentException - Exception exception = assertThrows(IllegalArgumentException.class, () -> { + Exception exception = Assertions.assertThrows(IllegalArgumentException.class, () -> { system.addPrescription(prescription); }); - assertTrue(exception.getMessage().contains("Patient with NRIC: NONEXISTENT not found")); + Assertions.assertTrue(exception.getMessage().contains("Patient with NRIC: NONEXISTENT not found")); } @Test @@ -102,11 +98,11 @@ public void getPrescriptionsForPatient_multipleExistingPrescriptions_returnsAllP List results = system.getPrescriptionsForPatient(testPatient.getId()); // Verify both prescriptions are returned - assertEquals(2, results.size()); - assertTrue(results.get(0).getSymptoms().contains("Fever")); - assertTrue(results.get(1).getSymptoms().contains("Headache")); + Assertions.assertEquals(2, results.size()); + Assertions.assertTrue(results.get(0).getSymptoms().contains("Fever")); + Assertions.assertTrue(results.get(1).getSymptoms().contains("Headache")); } catch (Exception e) { - fail("Should not throw exception: " + e.getMessage()); + Assertions.fail("Should not throw exception: " + e.getMessage()); } } @@ -116,7 +112,7 @@ public void getPrescriptionsForPatient_noExistingPrescriptions_returnsEmptyList( List results = system.getPrescriptionsForPatient(testPatient.getId()); // Verify empty list is returned - assertTrue(results.isEmpty()); + Assertions.assertTrue(results.isEmpty()); } @Test @@ -125,7 +121,7 @@ public void getPrescriptionsForPatient_nonExistentPatient_returnsEmptyList() { List results = system.getPrescriptionsForPatient("NONEXISTENT"); // Verify empty list is returned - assertTrue(results.isEmpty()); + Assertions.assertTrue(results.isEmpty()); } @Test @@ -142,13 +138,13 @@ public void getPrescriptionById_existingPrescription_returnsPrescription() { Prescription result = system.getPrescriptionById(added.getPrescriptionId()); // Verify prescription is returned - assertNotNull(result); - assertEquals(added.getPrescriptionId(), result.getPrescriptionId()); - assertEquals(testPatient.getId(), result.getPatientId()); - assertTrue(result.getSymptoms().contains("Fever")); - assertTrue(result.getMedicines().contains("Paracetamol")); + Assertions.assertNotNull(result); + Assertions.assertEquals(added.getPrescriptionId(), result.getPrescriptionId()); + Assertions.assertEquals(testPatient.getId(), result.getPatientId()); + Assertions.assertTrue(result.getSymptoms().contains("Fever")); + Assertions.assertTrue(result.getMedicines().contains("Paracetamol")); } catch (Exception e) { - fail("Should not throw exception: " + e.getMessage()); + Assertions.fail("Should not throw exception: " + e.getMessage()); } } @@ -158,6 +154,7 @@ public void getPrescriptionById_nonExistentPrescription_returnsNull() { Prescription result = system.getPrescriptionById("NON-EXISTENT-ID"); // Verify null is returned - assertNull(result); + Assertions.assertNull(result); } -} \ No newline at end of file +} + diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java index 82cd79cd7c..d686bf4b84 100644 --- a/src/test/java/manager/PrescriptionTest.java +++ b/src/test/java/manager/PrescriptionTest.java @@ -1,13 +1,13 @@ package manager; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - //@@author Basudeb2005 public class PrescriptionTest { @@ -30,13 +30,16 @@ public void toFileFormat_validPrescription_success() { String fileFormat = prescription.toFileFormat(); // Verify all required components are in the file format - assertTrue(fileFormat.contains(prescriptionId)); - assertTrue(fileFormat.contains(patientId)); - assertTrue(fileFormat.contains(timestamp.format( - java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))); - assertTrue(fileFormat.contains("Fever,Cough")); - assertTrue(fileFormat.contains("Paracetamol,Cough syrup")); - assertTrue(fileFormat.contains(notes)); + Assertions.assertTrue(fileFormat.contains(prescriptionId)); + Assertions.assertTrue(fileFormat.contains(patientId)); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + String formattedTimestamp = timestamp.format(formatter); + Assertions.assertTrue(fileFormat.contains(formattedTimestamp)); + + Assertions.assertTrue(fileFormat.contains("Fever,Cough")); + Assertions.assertTrue(fileFormat.contains("Paracetamol,Cough syrup")); + Assertions.assertTrue(fileFormat.contains(notes)); } @Test @@ -48,15 +51,15 @@ public void fromFileFormat_validInput_success() { Prescription prescription = Prescription.fromFileFormat(fileEntry); // Verify all fields are correctly parsed - assertEquals("S1234567A-1", prescription.getPrescriptionId()); - assertEquals("S1234567A", prescription.getPatientId()); - assertEquals(2, prescription.getSymptoms().size()); - assertTrue(prescription.getSymptoms().contains("Fever")); - assertTrue(prescription.getSymptoms().contains("Cough")); - assertEquals(2, prescription.getMedicines().size()); - assertTrue(prescription.getMedicines().contains("Paracetamol")); - assertTrue(prescription.getMedicines().contains("Cough syrup")); - assertEquals("Take after meals", prescription.getNotes()); + Assertions.assertEquals("S1234567A-1", prescription.getPrescriptionId()); + Assertions.assertEquals("S1234567A", prescription.getPatientId()); + Assertions.assertEquals(2, prescription.getSymptoms().size()); + Assertions.assertTrue(prescription.getSymptoms().contains("Fever")); + Assertions.assertTrue(prescription.getSymptoms().contains("Cough")); + Assertions.assertEquals(2, prescription.getMedicines().size()); + Assertions.assertTrue(prescription.getMedicines().contains("Paracetamol")); + Assertions.assertTrue(prescription.getMedicines().contains("Cough syrup")); + Assertions.assertEquals("Take after meals", prescription.getNotes()); } @Test @@ -65,7 +68,7 @@ public void fromFileFormat_invalidInput_throwsException() { String invalidFileEntry = "S1234567A-1|S1234567A"; // This should throw an array index out of bounds exception - assertThrows(ArrayIndexOutOfBoundsException.class, () -> { + Assertions.assertThrows(ArrayIndexOutOfBoundsException.class, () -> { Prescription.fromFileFormat(invalidFileEntry); }); } @@ -95,13 +98,13 @@ public void generateHtml_withPatient_containsPatientInfo() { String html = prescription.generateHtml(patient); // Verify HTML contains both prescription and patient information - assertTrue(html.contains("")); - assertTrue(html.contains("Prescription " + prescriptionId + "")); - assertTrue(html.contains("John Doe")); // Patient name - assertTrue(html.contains("Male")); // Patient gender - assertTrue(html.contains("Fever")); // Symptom - assertTrue(html.contains("Paracetamol")); // Medicine - assertTrue(html.contains("Take after meals")); // Notes + Assertions.assertTrue(html.contains("")); + Assertions.assertTrue(html.contains("Prescription " + prescriptionId + "")); + Assertions.assertTrue(html.contains("John Doe")); // Patient name + Assertions.assertTrue(html.contains("Male")); // Patient gender + Assertions.assertTrue(html.contains("Fever")); // Symptom + Assertions.assertTrue(html.contains("Paracetamol")); // Medicine + Assertions.assertTrue(html.contains("Take after meals")); // Notes } @Test @@ -123,12 +126,13 @@ public void generateHtml_withoutPatient_containsOnlyPrescriptionInfo() { String html = prescription.generateHtml(null); // Verify HTML contains prescription info but limited patient info - assertTrue(html.contains("")); - assertTrue(html.contains("Prescription " + prescriptionId + "")); - assertFalse(html.contains("John Doe")); // Should not contain patient name - assertTrue(html.contains(patientId)); // Should contain patient ID - assertTrue(html.contains("Fever")); // Should contain symptom - assertTrue(html.contains("Paracetamol")); // Should contain medicine - assertTrue(html.contains("Take after meals")); // Should contain notes + Assertions.assertTrue(html.contains("")); + Assertions.assertTrue(html.contains("Prescription " + prescriptionId + "")); + Assertions.assertFalse(html.contains("John Doe")); // Should not contain patient name + Assertions.assertTrue(html.contains(patientId)); // Should contain patient ID + Assertions.assertTrue(html.contains("Fever")); // Should contain symptom + Assertions.assertTrue(html.contains("Paracetamol")); // Should contain medicine + Assertions.assertTrue(html.contains("Take after meals")); // Should contain notes } -} \ No newline at end of file +} + diff --git a/src/test/java/miscellaneous/ParserPrescriptionTest.java b/src/test/java/miscellaneous/ParserPrescriptionTest.java index 993de852d1..6f64e36669 100644 --- a/src/test/java/miscellaneous/ParserPrescriptionTest.java +++ b/src/test/java/miscellaneous/ParserPrescriptionTest.java @@ -3,11 +3,10 @@ import exception.InvalidInputFormatException; import manager.Prescription; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - //@@author Basudeb2005 public class ParserPrescriptionTest { @@ -19,18 +18,18 @@ public void parseAddPrescription_validInput_success() throws InvalidInputFormatE Prescription prescription = Parser.parseAddPrescription(input); // Verify all fields are correctly parsed - assertEquals("S1234567A", prescription.getPatientId()); + Assertions.assertEquals("S1234567A", prescription.getPatientId()); List symptoms = prescription.getSymptoms(); - assertEquals(2, symptoms.size()); - assertTrue(symptoms.contains("Fever")); - assertTrue(symptoms.contains("Cough")); + Assertions.assertEquals(2, symptoms.size()); + Assertions.assertTrue(symptoms.contains("Fever")); + Assertions.assertTrue(symptoms.contains("Cough")); List medicines = prescription.getMedicines(); - assertEquals(2, medicines.size()); - assertTrue(medicines.contains("Paracetamol")); - assertTrue(medicines.contains("Cough syrup")); + Assertions.assertEquals(2, medicines.size()); + Assertions.assertTrue(medicines.contains("Paracetamol")); + Assertions.assertTrue(medicines.contains("Cough syrup")); - assertEquals("Take after meals", prescription.getNotes()); + Assertions.assertEquals("Take after meals", prescription.getNotes()); } @Test @@ -38,7 +37,7 @@ public void parseAddPrescription_missingPatientId_throwsException() { // Missing the required ic/ parameter String input = "add-prescription s/Fever m/Paracetamol nt/Take after meals"; - assertThrows(InvalidInputFormatException.class, () -> { + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseAddPrescription(input); }); } @@ -48,7 +47,7 @@ public void parseAddPrescription_missingSymptoms_throwsException() { // Missing the required s/ parameter String input = "add-prescription ic/S1234567A m/Paracetamol nt/Take after meals"; - assertThrows(InvalidInputFormatException.class, () -> { + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseAddPrescription(input); }); } @@ -58,7 +57,7 @@ public void parseAddPrescription_missingMedicines_throwsException() { // Missing the required m/ parameter String input = "add-prescription ic/S1234567A s/Fever nt/Take after meals"; - assertThrows(InvalidInputFormatException.class, () -> { + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseAddPrescription(input); }); } @@ -71,10 +70,10 @@ public void parseAddPrescription_noOptionalNotes_success() throws InvalidInputFo Prescription prescription = Parser.parseAddPrescription(input); // Verify required fields are parsed and optional field is empty - assertEquals("S1234567A", prescription.getPatientId()); - assertEquals(1, prescription.getSymptoms().size()); - assertEquals(1, prescription.getMedicines().size()); - assertEquals("", prescription.getNotes()); + Assertions.assertEquals("S1234567A", prescription.getPatientId()); + Assertions.assertEquals(1, prescription.getSymptoms().size()); + Assertions.assertEquals(1, prescription.getMedicines().size()); + Assertions.assertEquals("", prescription.getNotes()); } @Test @@ -84,7 +83,7 @@ public void parseViewAllPrescriptions_validInput_success() throws InvalidInputFo String patientId = Parser.parseViewAllPrescriptions(input); - assertEquals("S1234567A", patientId); + Assertions.assertEquals("S1234567A", patientId); } @Test @@ -92,7 +91,7 @@ public void parseViewAllPrescriptions_missingPatientId_throwsException() { // Command without patient ID - needs to be shorter than 22 characters String input = "view-all-prescriptions"; - assertThrows(InvalidInputFormatException.class, () -> { + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseViewAllPrescriptions(input); }); } @@ -104,7 +103,7 @@ public void parseViewPrescription_validInput_success() throws InvalidInputFormat String prescriptionId = Parser.parseViewPrescription(input); - assertEquals("S1234567A-1", prescriptionId); + Assertions.assertEquals("S1234567A-1", prescriptionId); } @Test @@ -112,8 +111,9 @@ public void parseViewPrescription_missingPrescriptionId_throwsException() { // Command without prescription ID - needs to be shorter than 17 characters String input = "view-prescription"; - assertThrows(InvalidInputFormatException.class, () -> { + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseViewPrescription(input); }); } -} \ No newline at end of file +} + From 5fdf6970861ef5c391f89cffd7bbb16c64b9b7d9 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 05:58:13 +0800 Subject: [PATCH 126/203] Fix 120 chars checkstyle issue --- src/test/java/command/AddPrescriptionCommandTest.java | 2 ++ src/test/java/command/ViewAllPrescriptionsCommandTest.java | 4 ++++ src/test/java/command/ViewPrescriptionCommandTest.java | 2 ++ src/test/java/manager/ManagementSystemPrescriptionTest.java | 2 ++ src/test/java/manager/PrescriptionTest.java | 5 ++++- src/test/java/miscellaneous/ParserPrescriptionTest.java | 2 ++ 6 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/test/java/command/AddPrescriptionCommandTest.java b/src/test/java/command/AddPrescriptionCommandTest.java index aa87cb81e9..5519341afc 100644 --- a/src/test/java/command/AddPrescriptionCommandTest.java +++ b/src/test/java/command/AddPrescriptionCommandTest.java @@ -118,3 +118,5 @@ public void isExit_returnsFalse() { } } + + diff --git a/src/test/java/command/ViewAllPrescriptionsCommandTest.java b/src/test/java/command/ViewAllPrescriptionsCommandTest.java index bd70d8bf3d..ca70f864e8 100644 --- a/src/test/java/command/ViewAllPrescriptionsCommandTest.java +++ b/src/test/java/command/ViewAllPrescriptionsCommandTest.java @@ -132,3 +132,7 @@ public void isExit_returnsFalse() { } } + + + + diff --git a/src/test/java/command/ViewPrescriptionCommandTest.java b/src/test/java/command/ViewPrescriptionCommandTest.java index 2cf0bc5b38..dbe3e0dda5 100644 --- a/src/test/java/command/ViewPrescriptionCommandTest.java +++ b/src/test/java/command/ViewPrescriptionCommandTest.java @@ -109,3 +109,5 @@ public void isExit_returnsFalse() { } } + + diff --git a/src/test/java/manager/ManagementSystemPrescriptionTest.java b/src/test/java/manager/ManagementSystemPrescriptionTest.java index c86daa4518..499882313e 100644 --- a/src/test/java/manager/ManagementSystemPrescriptionTest.java +++ b/src/test/java/manager/ManagementSystemPrescriptionTest.java @@ -158,3 +158,5 @@ public void getPrescriptionById_nonExistentPrescription_returnsNull() { } } + + diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java index d686bf4b84..88d5f52867 100644 --- a/src/test/java/manager/PrescriptionTest.java +++ b/src/test/java/manager/PrescriptionTest.java @@ -45,7 +45,8 @@ public void toFileFormat_validPrescription_success() { @Test public void fromFileFormat_validInput_success() { // Create a properly formatted file entry - String fileEntry = "S1234567A-1|S1234567A|2023-04-01 14:30|Fever,Cough|Paracetamol,Cough syrup|Take after meals"; + String fileEntry = "S1234567A-1|S1234567A|2023-04-01 14:30|" + + "Fever,Cough|Paracetamol,Cough syrup|Take after meals"; // Parse from file format Prescription prescription = Prescription.fromFileFormat(fileEntry); @@ -136,3 +137,5 @@ public void generateHtml_withoutPatient_containsOnlyPrescriptionInfo() { } } + + diff --git a/src/test/java/miscellaneous/ParserPrescriptionTest.java b/src/test/java/miscellaneous/ParserPrescriptionTest.java index 6f64e36669..a59642a053 100644 --- a/src/test/java/miscellaneous/ParserPrescriptionTest.java +++ b/src/test/java/miscellaneous/ParserPrescriptionTest.java @@ -117,3 +117,5 @@ public void parseViewPrescription_missingPrescriptionId_throwsException() { } } + + From 4d4b948aae843c448f4d48788e61aad5c4c7399c Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 06:58:02 +0800 Subject: [PATCH 127/203] Add prescription feature documentation with sequence and class diagrams --- docs/DeveloperGuide.md | 181 +++++++++++++++++- docs/diagrams/prescriptionClassDiagram.png | Bin 0 -> 133534 bytes docs/diagrams/prescriptionClassDiagram.puml | 86 +++++++++ .../prescriptionManagementSequence.png | Bin 0 -> 91705 bytes .../prescriptionManagementSequence.puml | 76 ++++++++ 5 files changed, 338 insertions(+), 5 deletions(-) create mode 100644 docs/diagrams/prescriptionClassDiagram.png create mode 100644 docs/diagrams/prescriptionClassDiagram.puml create mode 100644 docs/diagrams/prescriptionManagementSequence.png create mode 100644 docs/diagrams/prescriptionManagementSequence.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d8d4c2071e..7333f23b6b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -17,7 +17,7 @@ The 'view-patient' feature allows the user to retrieve and view the personal det **Step 1.** The user launches the application for the first time. - The `ClinicEase` will be initialized and load stored patient data. -- The patient’s details are now ready to view. +- The patient's details are now ready to view. **Step 2.** The user executes `view-patient ic/S1234567D` command to view the patient's details. - This command lets `ClinicEase` read the user input through the `UI` and pass it to `Parser`. @@ -29,7 +29,7 @@ The 'view-patient' feature allows the user to retrieve and view the personal det **Step 3.** The system calls `execute()` method in `ViewPatientCommand`. - This class calls for the patient list in `ManagementSystem`. - The system checks if the patient exists in the list: - - If the NRIC exists, the system retrieves the patient’s details. + - If the NRIC exists, the system retrieves the patient's details. **Step 4.** If the patient is found, the system calls `showPatientViewed()` from `UI`. - The patient's details are displayed to the user. @@ -73,7 +73,7 @@ Step 3. The system calls `execute()` method in `AddAppointmentCommand`. Then, th to add the appointment to the system. `ManagementSystem` checks if the patient exists using `findPatientByNRIC()`. - If the patient is found, the system creates an `Appointment` object and adds it to the appointment list. - Conditions the appointment fail to be added and stored: - - If the patient’s NRIC does not exist (a `PatientNotFoundException` is thrown). + - If the patient's NRIC does not exist (a `PatientNotFoundException` is thrown). - If the appointment clashes with another scheduled within 1 hour (an `AppointmentClashException` is thrown). Step 4. After the appointment is successfully added, `Storage.saveAppointments()` is called to update the stored appointment list. @@ -144,7 +144,7 @@ without affecting others (e.g., how commands are parsed or executed). - **Description:** Remove the separate appointments list in `ManagementSystem` and rely only on per-patient storage. - **Reason for rejection:** - - **Performance impact:** Aggregating all appointments (e.g., for a doctor’s view) would require + - **Performance impact:** Aggregating all appointments (e.g., for a doctor's view) would require iterating through every patient, which is inefficient. - Features like finding appointments across patients become harder to implement cleanly. @@ -213,7 +213,7 @@ store-history n/John Doe ic/S1234567A h/Diabetes,High Cholesterol - If **found**, it splits `"Diabetes,High Cholesterol"` into an array of entries: - `"Diabetes"` - `"High Cholesterol"` - - Then, it appends these entries to the patient’s existing `medicalHistory` list (skipping duplicates). + - Then, it appends these entries to the patient's existing `medicalHistory` list (skipping duplicates). **Step 4.** `ManagementSystem` calls `Storage.savePatients(...)` to persist any changes to the patient data on disk: @@ -224,6 +224,177 @@ Below is a detailed **PlantUML** sequence diagram showing how a `store-history` --- +### Prescription Management Feature + +The `add-prescription`, `view-prescription`, and `view-all-prescriptions` features allow doctors and medical staff to create and track medication prescriptions for patients within the clinic system. The system ensures that the **patient exists** before adding a prescription and handles the generation of unique prescription IDs and HTML documents for printing. + +#### Adding a Prescription + +The add-prescription feature allows users to create detailed prescriptions with symptoms, medicines, and optional notes for registered patients. + +**Example usage scenario** and how the `add-prescription` mechanism behaves at each step: + +Step 1. The user launches the application. The `ClinicEase` is initialized with stored patient, appointment, and prescription data. The user is now ready to add a new prescription. + +Step 2. The user executes the command: +``` +add-prescription ic/S1234567A s/Fever,Cough m/Paracetamol,Cough syrup nt/Take after meals +``` + +This command lets `ClinicEase` read the user input and pass it to the `Parser`. The `Parser` determines that the command is `add-prescription` and creates an `AddPrescriptionCommand` object with a new `Prescription` object. + +```java +public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { + //... + case "add-prescription": + return new AddPrescriptionCommand(parseAddPrescription(userInput)); + //... +} +``` + +> [!NOTE]: +> If the input does not match the expected format, an `InvalidInputFormatException` is thrown. Hence, the prescription will not be successfully added and stored. + +Step 3. The system calls `execute()` method in `AddPrescriptionCommand`. This class calls `ManagementSystem.addPrescription(prescription)` to add the prescription to the system. + +The `ManagementSystem` verifies the patient exists using `findPatientByNric()`: +- If the patient is found, the system generates a proper prescription ID and creates a new `Prescription` object. +- If the patient's NRIC does not exist, an `IllegalArgumentException` is thrown. + +Step 4. After the prescription is successfully added, `Storage.savePrescriptions()` is called to update the stored prescriptions list. If saving fails, an `UnloadedStorageException` is thrown and ClinicEase informs the user. + +The following sequence diagram shows how an `add-prescription` operation flows through the system: +![add-prescription](./diagrams/prescriptionManagementSequence.png) + +#### Viewing Prescriptions + +The system provides two commands for viewing prescriptions: + +1. **`view-all-prescriptions PATIENT_ID`** - Shows all prescriptions for a specific patient. +2. **`view-prescription PRESCRIPTION_ID`** - Shows details of a specific prescription and generates an HTML version. + +**Example usage scenario** for `view-prescription`: + +Step 1. The user needs to view a specific prescription and generate its printable HTML version. If the user knows the prescription ID, they can directly proceed to step 2. Otherwise, they may need to first use `view-all-prescriptions` to find the required ID. + +Step 2. The user executes the command `view-prescription S1234567A-1`. The `Parser` extracts the prescription ID and creates a `ViewPrescriptionCommand` object. + +Step 3. The system calls `execute()` in `ViewPrescriptionCommand`. The system fetches: + - The prescription using `ManagementSystem.getPrescriptionById()` + - The patient information using `ManagementSystem.viewPatient()` + +Step 4. If the prescription is found, the system: + - Displays the prescription details to the user + - Generates an HTML file with `Storage.savePrescriptionHtml()` + - Shows the file location to the user + +> [!NOTE]: +> If the prescription ID is invalid, an error message will be displayed and no HTML will be generated. + +#### HTML Prescription Generation + +An important feature of the prescription management system is the generation of printable HTML documents. This functionality is embedded within the `Prescription` class: + +```java +public String generateHtml(Patient patient) { + StringBuilder html = new StringBuilder(); + // Generate structured HTML with prescription details + // Include patient information when available + // Add print button and styling + return html.toString(); +} +``` + +The generated HTML provides: +- A professional format for printing +- All prescription details (ID, timestamp, symptoms, medicines) +- Patient information when available +- A print button for easy printing from any browser + +#### Why It's Implemented This Way + +The current design separates command parsing (`Parser`), command execution (command classes like `AddPrescriptionCommand`), and core logic (`ManagementSystem` and `Prescription`). This structure allows: + +- Better modularity by separating different aspects of functionality +- Improved testability with clear interfaces between components +- Consistent approach with other features in the system +- Easy extension for future prescription-related features + +The HTML generation approach was chosen as it provides a printable output without requiring additional libraries, while maintaining visual quality needed for medical documentation. + +#### Class Structure + +The implementation follows these key classes: + +1. **Prescription** - Core class representing a prescription with all its attributes and conversion methods. +2. **Command Classes:** + - **AddPrescriptionCommand** - Creates new prescriptions + - **ViewPrescriptionCommand** - Displays a prescription and generates HTML + - **ViewAllPrescriptionsCommand** - Lists all prescriptions for a patient +3. **ManagementSystem** - Maintains the list of prescriptions and provides methods to add and retrieve them +4. **Storage** - Handles saving and loading prescriptions from disk + +The class diagram below shows the relationships between these classes: +![prescription-classes](./diagrams/prescriptionClassDiagram.png) + +#### Design Considerations + +##### Aspect: Prescription Identification + +* **Alternative 1 (current choice):** Patient ID plus sequence number (e.g., "S1234567A-1"). + * Pros: + * Clear association between patients and their prescriptions + * Easy for staff to understand and reference verbally + * Intuitive sequential numbering for prescriptions + * Cons: + * Requires tracking the last used number for each patient + +* **Alternative 2:** Generate UUIDs for prescriptions. + * Pros: + * Guaranteed global uniqueness + * No need for sequence management + * Cons: + * Not human-friendly for verbal reference + * No visual connection to the patient ID + +##### Aspect: Prescription Output Format + +* **Alternative 1 (current choice):** HTML documents for prescriptions. + * Pros: + * Universal browser support for viewing and printing + * No external dependencies required + * Responsive design across devices + * Cons: + * Not a standardized medical document format + +* **Alternative 2:** PDF documents. + * Pros: + * Industry standard format for medical documents + * Better control over print layouts + * Cons: + * Requires external PDF library dependencies + * Increases complexity and dependencies + +##### Aspect: Storage Format + +* **Alternative 1 (current choice):** Simple pipe-delimited text storage. + * Pros: + * Consistency with other system data formats + * Easy to parse and maintain + * Human-readable in storage + * Cons: + * Limited handling of special characters + +* **Alternative 2:** JSON format. + * Pros: + * Better handling of complex data structures + * Standard data interchange format + * Cons: + * Requires additional parsing libraries + * Inconsistent with the system's other storage formats + +--- + ## Product scope ### Target user profile diff --git a/docs/diagrams/prescriptionClassDiagram.png b/docs/diagrams/prescriptionClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..04fd0cc997a93444a0b4d994b085c9a7c58f6646 GIT binary patch literal 133534 zcmb@uWn9(y7e9!tgcyW?fC?y$w6ubBcXyX4DJ>!>4VP}|?vhqOx;q3!TDlwdT%8$b ze*b;#?t}G-j04E#J-g`j8Ph8yP2`#bF4f)r81Y5o zi$e|{&%KrOAWqcBqlvg0Qu7gwpUwRd+DA0BL~;h^tDF%g1ZHt@b6BDe_(}Si5YC68HTBninfN_b6L;w!Sl=CR{PUiaoOL_5~^RcMSwRWX{_3Tl&tdy+(OxJ1v_ zi7co7M+toqZfEr-{w9c51$(H%!p|>B$RAKohka<>p~vrI7EF?&eiszLm@AGtd8?DG z%R7xHbeanP2R80aX|kSRgN*bu^u4!&Y&ni6_AMbw=7m47QA-TING*J-NhfcoOdIG8 z$cdlNUXygcXE7ZkcvJh__at5%q2|+g%4*H&%89UXUy(NNfQ6-l;u40)q;)Mb?g!$p zD-ftj*BkoX2{ISy*f7vPw6+PFFxWNOe|TrkSCO)RWKNGgS3a)Socq2?^KqJXMB07L ztLX;jC3Yhj*Y}U!$#@Q7-5Wb^A9Yf3Zqi>%J``*0rQ+GZb*Y{pqMDuU{+Y!R>n;WN z#!`w`!^x(+@1AQTLdLH7%oH;jmDa55l$cUsP1#gS6-bu_vMj_-v{4yke(Lt16MWEe z%Lhwi`JGde`SQD%i+SdL0`rR%W@aJR`?F>E_yvVmlW#RBE;=SX_8ZlG=X!>a-DTOW$0>I-Fh!K{wdx5A-1b_PG(Xn7y=B%%Ya1i7 zO?0(C)?E~%U9nEh-BeaQdY!nvr9G~M=yB5`>o>K7r+g7dQ51`zMXqbaZVxlo`RLK*$E4`rbYD77d`Yl-d2wi3 zd5mjU4fj?GS6fY-@6%1C{i|+7xLYDD;hTZf*N#6ZZ$@o>KRQ3M{=?K3CEQH-lA&;F z&eY25te4vvjsnOf*KauA zB%}ZJ^;4p!GME4Q`X1&ziVG+xfzh{a-+pufrCBVBY4Nk$g&*OU;2VDZrgEdLxsGTS za|8;CMyYnar_Iu!mnQsLsfGK$e$uq&V2*$u>jFx56sLXRekc?W52D{cc^O__YHL7I z^S?h37;+AUS*R7(?bg4(&mH;x$p8AC|1aOt_`&6ql-6wm0**^4-~F5qX2ZR_ynf(z zjJYL?x%C$t%gW~HeDxj~8QhTAt1P*U-WWD3huvl63TtCOfg=4joPwKAC6Mn2g^X1H^Bv@i{lLUS zdBe)5N&UmFL-h^3l=DrSbNLyAx&2rm!YalLakUro5}5+u^i0!;?JKqRM~G;Rag7q(rJ{Mjr1f5ZZ%dr z?p;Sm_x16~QYz5V(<2QfB_q3Z@uHHlaww%d<->=b%%Y;AOJikpp&{hb4>&nFNl5r| zII!;gy}(+&@aEsBy-!B3VzHM=HSCJR_nZ6v#r^*M``X&tS&Dh9y(ws+F+8qu%tj-H zDJd!X<(9J#NJ#8fzqM2h<*GZbjFwo1q&bl=h9MEkC8!p#25TBvk}B-Tczvn zh++Td&Q5=w&GvRN%8>%yE1@BDniIlpqoWlj1DPh{37>!6hY(mNUHBX*Gwh`L-%DC7 zGJO-%uW9AVtwc9w?XIqhZ4w7+G_XAM@`SrlMxVk2LMBACH+D0je!X=}bK zZACPkwx`rd`cABJXnTA6=g&_W8H)&5U#QhMjWjeQ!|Umg?EKGZO1)QZv!qb#azcKc zLbcSa$e?3+WrYGOLng(0xbs872h+`&7M)8oR6?zvO=TbI@2*WsYN9zGZjXF=r3=^E zh=ZEiSN@uEXm)mXcXv1PeX?13s`RpIo0w3BUb%9m4_8-DZw8Ly-ttJ1)|d0K;|cek zA?wFq>m}y)C3n57urP|tk%g}6^~R4<^D(^~-|-5YCGsDmC8ps@=MGR24C|v&OvXQc z{CI$M`O>9GQx8v1+l6ko8nRT0SdrNrm6F8WDrE(QFn4$Nj0_6qmzI`?yJHs02XOk~ zG767pe54$^Lw$@_aG6C^SXen<>l}8e#UwW^?ds}y<>qRdL~Im` zc~oufSp>cAi;1e1%&Vc8cb{}OH5qO%^e`2Ad0kt(dVqys2wYlNnw_Y2M6hfjVq(P3 zuvPUcUC+3k$GuVz+v`*Ha7l_n-4j0Z{d>i}1V%6p#We&hah>9#N$<4VW9RsFWGoxMFe^$KfPG9|nE=pI`o zC8eiNQA(7H4E(Api;ApvehzSPaUIlJ24A>xT}f57FT@jrU~XpSx%}?#ZZ_&B9rBi1 z{Hn8m)uU9c;c}}qfh0U0mnx+Mo3)8*xR`7l96S!&A2hgMufM@RIymUDg{uqqTKT2p z@&2nYdp4^%-(+=<1lVx1ix;Bx_4M*FN}1449?p#~&VIN_Lb}4E)3=+iU9S`x5FqJ( z83XPT*@~=1PEJmx-CAeny)$GX+{F3MmGOj6Vaycu?%l-#UelgLez~@xQqr)nu$8g0 zG(WgFmoHw-uVXeHlqy=QJ&UWhwzIPs&c8p#k{_AuyxZ5CBI>yFliz$WN3{tx!}0xf z!r|Qv*|c<%x%NoJE(6{{Lw>7;n;Y_m)BI@&P=V2dA4v`xF{zflz@{ob++7hZaY_h7 z!=;UgjP&sE7_YLIC8?}2m}w4z3bm|F78w~iI5>E6xRYdlAv%`FwFdSP-jtqcs}yc& zwtF`hH+P)I!-o%hVP~t2k6>4`y>m9(6w}>~(V(6+tNyz*Q{2I!RZH(Nx{QHOs$g{K z(k1B?xPv2Y_xU`#+s2_#j8}xRuvkpAw>mpHnGEH2ltMufkY9c#ahb)+*0!{)%rJx4 zp$T@ZfQ8r2VebLIcYXCQPy#zg~PuSTDo06`M!x>apS0Awz61pmnap$oXbP?)j z?(!~Zm;cZ6_gP3p#Pa3KZllPEh@A8NPQ zn<5fQna!cvMaIGsR_*)Y1Gz%>9aYz%&jx(&ub1TKKW1gcL`D5MQO&^&g)^o*HiTN4 zft2)}dHj=Cb}Z{Ck6c z_ul_Gawt!8krm;;$NzWp{GYA*)%4E2sq*+69yMM?o*^4}iKi3DEA)3A{@u6!bF~jQ z+vujJrvcZ^AZFXbYm1W6YidxQdewOR!821L$lta`O+ivakMia}*YW@N_wx(-5F!}z z%)ftj1LT1tTCy#NeGBSZwf$DAQk0#HtZXm>(HYMZ9~nt8SWP%qX5qU2-AxI#;(zcH z{1TBg$#@n~zG}g6ur!o6HazUKGoYyBLF=(Xdh^e+)P*APkuNC) zUyv1`wmh}+2MW!4`ubk{qr9=R=y@`xNy`#+SqeF=wApvqt<$T#S+xjSlYKiWy~~yc zbJ|Lw<%!h$16Zlno4GC3`99o-UnNha^J>ZI=_z!fpm1_L?(f;kMc&v{wu`-F%GK8$ zF89ll88#QUK<{0Qpi?as%kJiQd&;(uH=CH4C=yP4vOdLEz?+aCOM3p#8X^yFE+Znj zJxMTt{05i(X0p@-bOgXU-dm>q>Dv1G10|+I@Gpg#_FHrIj*ftZtIS3U;oEU48oqv& z&sL&mU|@jTdGFqv!?52NnDs9Vj2-qj26hi!`&J%oz+g2emYFG)@Yd-X0$P9fcQVm1 zr?Zp2MM4^C>eqAplA)Xv2JV8-pI;3Q>7P%sI>nj~xI>?)Qet9YU|?%&Ywbk()qm^O zApeSxKR$CSKt`dU2k`!`qoUq&=pn!$WDmKVd>MLfux8DdDCeV+2t{ zp>=HAP06<|9vmHE-g*3{q}=6%T^y037}6KVWPGb55VM((-TH$+8=-1~8r$3ZSESeu zpyCt-)QCkgZ1>30bi9*?_7XSY0KH~8WfVQ7&JJ<)&(%ft@bb>)Ui8iGzKxH?kw zh~Mkquzr3P%N1Ikr>7^XU69l}V{Pr8Jk46DAgnLGMVQ$CUbWOO89#wW)R8KOb{;Im z@Kh7}^(6^nQYN4{0%1hxG$~)RF;wsOp9$bOUHI`sCV}@7zUy?OA1|E)iIvqB!1s|N z!#<6Oh=}E}vH(mYfIx}Qy`Wjz{p|O;{0$BO+zaDP>e2a*87nE-TWzB0;(<(}j*UAY7L@^S`UPAIyNPlrN{wJ1XaCR5$t&)P8%;{_4lYos^eB z)p~BTKwL&dy?LTpEnLn{PtI%tlc^MQrNjts-u$8=Gb1@woLv3WO-Bfo&N%wKC{AA? z%TS(XS$_V)U=D#}WL%s^vd~Q&m!%9u@i|8RBCJ_1Ytvs@PO@u12+pMFX8<`K#&6U&s0*Sd*kU@85ST1t9pmlI6v>Cx;h} z-PJ?BM7PX;T&~NqmXM^OAfZUjX#(H`upvFKq+|yOmVLQp(+=^|*%>;`8fu>BczAf5 z0dd1)V`b)JVYPCy=@N)#`qL}_1`1G8Hd!cc-@d)&rch!sK&}NO^nqiG1xt{i@4MEH z_IC2du;MaHYL#MgCZ_(Oq42}b2zoxl@GkBnUz3&PW%Bjuy$3791@5R6r`ElRO4UHP z)0}P)bOy927kxv7&_v>hXOP_C)<7TE{9$$gW1aUmFXRB zcG3#Mg^RNyG6KCC#S9h`oCE{}w{HjU@4r?^FP&x=wU%&!BUAj$^?8*~es5r9rDO0z z@qJNdkDsJdH2*66zlv7dShARo&W~F;2V3*9pIKi0c)n{1r8e8`2HEb?P(Tz=9x5)b zaVXh?gDejo=p1e@;_oD*D;MbS!~e>_sEyDcD>Yx9%{BvmpK3`*N9R`uuq(p^(0y?= zP%Ca~%-S6}VY%BwMBA9@eH-Xbr>7vzv5oQmoX1cAOE&6IK%V#BrB8wjN3Z))%PN zlG!W{SFYdfF2{eXwYNInFGHRn6==ToELAMha^nZTebKi>!?=M=`K9s7GO36%VLXYh z712%do`HdZ!ND+=!CZCGl|@m$)*70(d3g!w9AxHC@7%d#1od{h5yQd$U{fCs+*Hl2 z!{=h+;_opCY`F=XNu+UMy)sjR!+zM;EKoDEu(BFXmBmrEKq;~c6_R6@pd5+%Qex$#@ zZNz#Y&c0mmd^6eCY4mboSy@?8k?xoYM{d#c`5EIRD96CKv}XY-;*UfzEG{l?2jOil zEb!VO^206vfW1v)8BdoaAN~rd_Q7P~+ZPDtNr0ztpP>7Bdn0grMJdgC5EbM%W<=Cfcz1XV{7Xgm(5s-Epe~N}N_5jiZ zUVQVuRB>um$~CCaqDR=cxOVH`pOt=OsAU$WnOFsFplw-H`kjG^x>9K8qQ|>;!^6Yb zYUP$dw6@cdgUIyX8TUorbLvA1B!t{f`#~gvK(tV#FomM63!`_#ln}d{vYJwNvcn)QDwx58=ahzqO79Qo2OmC>&82XicJXu zi*k1J{K9m%Q45`>q=ZDO=73!K?#u4;PxluLJ7a`-R!3$DpkVTx?oVf>Dx&j*PY^|& zm0Qg>^oI9n#?Q@`@GG@|@-ZyR-3bTnK!qKQ@#6 zM#_iLo}K~_V5`m*IqaB-+cGS@Cw9>?9^9L7wAfu9`Ra{59f`{&&xD7Ii_3kFB%U-W zCLo#njKgl#X@BZ{cFZZ$uxwzcZma0_UExESL_8Tb(bQ%~^=gNKv9ah;)8ed|)-zU8 zi^d=3sMBOCB`U>7z=`EqWS1UfNCx~kj$$^I(FPbX!p3Pn$~4Fy!Q!0Mo1i6cNu`jT zUs%{{)N^J8^x3r8pV3o{o0*xJle6m8bmNyVUnX78xSYx3oppGLPyQ;Nt1hNwC#Ij0u`r9nq|5Dnw+I@5Mz# z5;gsnM`D)AN_e1no0(<975qBIR1eG%c)rc*w@B8cGF7A&)GG#3)#^kw)tbxCeu~4X z)wMOr+A|P>GSavb8bMe|*6ad6>K_m=e>Oq87?l%pf+OgE7mvf%3`#sjMQS)y(Yfj; zw(mV+V+l`m<~*Q)P^echg%*8%IPfsFl*FN;YQlf!b^4B-VyDzWPi19g-?Qd+4PE)( zT)U_8n@4sFW;12+W~0Skb5AXXfGllqThG2hOimt(K^D$kR z8()`H7?1f_bJW;%jNkSS)g-L&1&pON_JJd zIHY#;c)bEu{cx$<-t!K_TemQ3WnR~{ws5+%71*!-3|YZ)I*VMb7}9^$Q*_~0seX3j zUebie^z=P|z4?7`uzuiB$h_lKR**QCCQw=U(1OwB_%)Y0xlVCGK|;8jn;X{b=2r@G zN?L#t!00svT?w6?-+9`KlMn%#sBB7Op%n zw*$!r3M1B+Fk1B}mxV2ZV)4GKSFd(A(}o$0$HvAQi%CjKitqBoWtB{pS;T`{?tzN! zd7W@HUz;xz8i%1gyJ6cTl0W3;=3cmr{;^)BP)|7aoU669btHrS=~nz12zL2WemX8z zR#x7@#urf|$acIkRz9eN4^0H!#Vk2pZN;PHaTxs=4wA`q?WS?3T%pMT<*sGDCq~q= z&l6Ca%?u0#-Wv_)YcmnYUicX=k;ZzboHx1B^8ybOBx4Q>&9!fgqSd_3kO2Ojs2;&)m707qzX~K9 z*q6wt>YWA5Fzy#PM_eGoMjad+2-DSi1O#Aqyw|_5c&|=b<>Z)y?*CeIw_i+Fwr_W3Y)eYhFdTFc z6YFt|xX{p@3CFdKcb#!uj!Yv%FQmGgiND;-K(7S7!_SQH`Qog;$VljUWI=aaTwRs8 zPirCkWf!Cl3biyA5E67f`eS)`|pnNWVXbPw23dLwsI8RBS52f4r_t5$4K#; z){v)*2t)J&=-)wX7F>G}{tIBu*V;j^%O z3m;#^qxN_c&7x82jriO6{znc&8s-ar-B9|p1`H8qf>s7&C^wn$d% zWAc}_{OlIiM-^37=wtz>ngNIIxN4$$7%@i(oab8=;XFrcCN02vkXK8F#57$sUvuw@|FPbg}0U62e2Ki=+> zj9P98eB7MC_kLzAr4jIaeZ9NHefE1*^r99U1KLKOz_+crnYj23q&x@x7p+hkw| z-xa0V^bbt#M?m|KcNzJLh1Gv;7GaC0;_WEtd*|8N&c?>nEPG|X{xj(5v~(fGXzV71 zR_wJWyU}25K>18wzB1TKOq*miOt0H0bzd_-P<^Aoe#>ANVIW^=YhLQSJWQVnMpS8X z^^3ZRiMUHC(D4AU^o=+-2j0hO?fq`DVjMlHS#HVSJE7B;$d6WYE37s|i-;K~jl$V81CLC0ij0YnNk zo^nV)-~G9u;FdY}M>koSF%qtR34;qf+wNB|Wf<*u?*kTs#$q-rsvX$eEF>!02B>zU zk^Rz@D`TUhg#jai4JenW^+3qE~w2a^2#(ubQ^xby%cQW z{tfJ=5i(tY2LP}rD74Lv<0nWNgCUl^BMWBzk)Tj?p1tU@($48b{((sKkW z5bk-QD`%Rf4fIm|u2sUvT5mYj`bRv}W%+`pfcFU&5C>R{3|wR?18}R5rx9B^QkM?U zCSe8OccCbDzh}x>RCM%KgqqT|(DS22Tn_o>Ea&jUN-4xrB9GVWG2!!;mX@Zb$K`ZA zu-@C=)zwPs!w&=AFqX{hel}?@@SUhk8^OZ)qa0XN$09#pV<%QwlxMPCs z+Ds~&@0t4Yfu@0Gc$de8)AeEaOIo}qWF=gQ)0#yF;<0QbCBe$vg>jNGyFKmg*)AuC zh9x>WI@HwEI=Z^bIZlC49Vq29^9M{wt98LQ3?d{e#lhs8Vh`=U_7Z$Ab}4K8?s?kk zV;r#0i^W|>VH5SQ;m2kjgO}Fa?UvXlAaqkAn#He%5{#RH3L8^9J3IRUQx4}trdY~W z!Fz4t%Appl=A->`NIQRLHI}3xdpIqUvCG;zwxr9;WLAi!*zx zYgzXq#v>jG6<}gw>eH%HNT%-L|0(vf5h3<#)q5djkHGkR_x`=?OQG79g<9aka+V9- z_fcnt8L|+&qu#g3M5JElrJKRpW0YrZI%s()Vdl?OQdC$uOv=P-1 zx~#_j*y*a*=9`r;h8Gf=hgN-c2+t?cjf*8*{0 zSTL#y*&#^WdKXJ7EG)cfS(1!yE|)21+!@2RjVlLnk)NNyo;|a1j7I;q1QJo(kSS~a zP?p2?f;7DD$eHs*uj=Ev)${}lqQf?me-!>jM=$4snc)+RN0Mi4skNpxlvVg8i^6Oj z>lkVOv(G)#U)--?z1+NVg3oJ+i%J45qU#o_Wvd_qyh64u}iP{)@m zu0@GiS{7Q0yuCYy3_;+JROI_wmX^~tc~LB`ZL-+TFjs5^#H9*4Q|x2S0k=JX#$TYC zJ7Y9tt-<&pMl_F}%rjBh+hRwpB@Y?_NSLZffeoSn9*prxJbHkH4|Iz(y8wYL^bHk} z$k_nE4=d=c7eX*Fb>*s8Qg&Toi*+SbR?#tL(MTB-n26=Z0-@f;4Ld=$r@!BN^;>z> z^N(laHi^6PSql0sBBiBRX^$vmkx`lsS|0)qTWZIamOZ)o5NjNfJdNL8#PLr~<~*j4 zops<9gUjPfQ%|wDTQu3x%F~iT7c5wuJnyzh~MPr=NtE>_R#ew^83uSFiohrd!0pH7me8^>VIgU1S;+Q87TiB|0PEX=Ke!jt^%Mr~AVTX8JVlSH^RHD;khS>&d|0EVe;phmh0G8n5 zp}6iD=m zmr6pCLCdo)BbSAbtItvX&kmuQ$Ot%?p6#a+pP*u5V5DdsY}Xe<4h9W}y4$M9jlL~_ zgTZ!r7~0UC!iT)8iFPwSohZ69!jWM#swyffqa!02#N1WT>-s(CHDSjfMFLH2JVg}O z&sN&pJ{%Z_^lRvJ60EGOhkZ)FZIJ`@cL>`JOYg_Jy1Ge8N#f$-;5E|f=XF) z93PK8P2JDu6iqDRxOCt&MYOB8C&_*AymwUv;H)8Jk2qw6Vxpp2iHsjf%G^POXq)B| zbG{BN30i|)sH)t&x;@Ap?{kWt@hUObjvzPE$}qCrUBMRN(LX@7z9(eCjfq5j_8fXvaE#XfpQ#-sonP;Iv{B<1-$ z(Y58bc{<<<^iq&k|JWwIU_c)8(}b~~v0Cwu6P=Fo2(l!3cU)ysoenl}Y1Opo;BpLo zdNmy$eLQ)dy+3?Xui-&E#K4Neu}t7@s(p%H1|*I(RkS2dYVITwc00GD8Wqj%B~nT*`y8(U_PH)TYsMHP1@Poh85cdbw63|q>j4$wG4En;%W%( zgyCqr3wbN4$Au)^Z~zO;-`~IALp-2l$}!VQ#7x!xqS7>==*?RKPpq?_bCZ>H@qQxo z+^c|ZDG;H=xG85Oslcy=3+s3E8g6b zYQ?wzW8T|Ghd^NQ;As}<1X#=9Xa-f!?5SPdxE~rF87ZAkVQg_v1;~++QF>k;-Og-y z;#KuwN>Q*QvGzB7n&G@Z^T5jGFqUqHpO;s_zI96mzT3eEXhnA;RAZ%bC#BeNh|wtz zey?1sNxBivA|@sV+Nn`z6^SDyr})l096vB$z7k76YWNAFH>h8rIhK{Nc6jHJBBn!> zLN~AGH!kxMu}yVfBXi(J(+})YDU8n9M~uCT+RzJhdKz`7WMKl1KVl?Vgmm zPTdoSxfm*8JYmP4R;Z(9W@Zc1AdrP)jbrd+ZnjuV*2I=Bb_MSx7D>nLyoBgZZ}K(Q z3;{MSiZr~R_AQ1H)7u)?{v8K`{K2fb%tLzmS6+k12U`@4(NA81`9vH-+wdNlzA-3! zF)ku0xwpQaUsB@t;X?$sGkcr$!ZI&p^rWGOnDphSvMLmskFo4pDwG0fFQN<+j9@gp zj`3rDzUfL3X4c^N#6%6`z#s?-{J7R~7PUmV#>pNeotph0XoEd%ZK6pZw{-3vltwS_ zlCklnHe3~a^S32~89N$6I%0S~(a7&<+xX4;BTl#UqLe0vEa2U_)G)jUp8pJ+6hvo2LGjr15bfeds$?GmP!8 z9P%#yi;`{c8Q?2wm9t)sI45@P1bLw@D$+a2qMBNs1U?#uie|o$PqsRR??N~`%qTc z*G`*TTMLVdipt8;E<*-!c6L*HpaKGK`4E%<%{q$B>R~k~Sk|vzC6ohl7wMhA)Q9Yl z*>L{W$aP|FG1(sh@v=SxEd3&#OK&``Xk2G$2Jg` zTF(i2uX+;8AIun6{$bS!sLCAm54-q)tt&u3x(bmYy=ieVczx_}w zT`HjtY6e+(cJLz)Pz#tTpY48` zDRRHel#*vt)&DY6`Y-TJ8Fj^RWpKz#f9s^1ythpw;=!w+$eo?s8#^a3`5GEyb_c{I z(^=TrqmT#QY`lV**iE_Gfw?3S((T)us?BA_^<06Kqh_*mI@GHBN0=s zZT8Hxki)#w`u8tLgT)?t3*<5c3BWtkm9JYxhlt7bn^_3e0v(Ug&`<%N)9|4(3r&_! zaYXo}eEnJD1r+hO@c;$I5q|dI z^*RXtoT#$5Qs9-}p7!P1m+jSf*pc_L#(wKz$w;*$t0RSAZPCcxhhh=kHO`KQ2hBtZ zzl^cpZUmNROFdsAg?zhBm{X=28jQ1Vf5FAAjr8e#MTkx z;?Ns&kdJaHAc$1If88}DjmNf>JL~QVc9HAPw8wEj#7dTq7VgAEr?H3eJYd_6VPZI*@48uu)&lv$<45-uL%xc5rc(%&LgpSa7y7M9$hfsJE>aJ-=|}9wx%%y*+IqU^7FgnUx3pwD z_qqkkLavy5*HtKIdou$07UeUs#w3J=0htC*UIS!G6{peTemS|NsQqfS1t<>2cSk?j ztr1n16csTZmF$5*7?l|xAFskj>?axU@F_=gX*9E`07=mbhX52;ac*xbv!G(6wE_3X=j^T4_k-?3xOL5AHBgA-~IVmW;e+MZcB~=t#4!Q+k>4UO=ZT;k&zJ) ziD#{i(t!qEBP3gi0GdsoNyd535(1`bU^YWVXba<+2Za}zFa@ez@?v~+d|X{)2Os7G zOfr#S#6wgaD%)y;Jg&2$)#ks#rK}bcPFo3}_=z~^&&YIluWYBFZXe`TBL$9(#vptL11pHsCL$JXQ`0f1 z6~r$4ZUP@`fL$poD{uNY^z{YPNux_i-KVJU*}LF;fs~ZA8I2;)KvQsgXJ?K|th~Hj z{s$KHlz~?a|Il|x2QlY}v7PUaRA4FAS_MIfR(Thg0;vnHf-95} z8Hwj{4(jw&8CF5G-3*Aln1t+l=H^@=b_{yDh(lbouBS(uZ4N%}NMAVQ>uHQF&ouu+c)~KCr;kB@0B(t0z$-AX>s(aa&}&vDlH*s!;jG*g$fr)B-z;u$kU zL}aBFlL{9bTOOp$6GhF;Uus!9%nkh>)YI~X z1-=8OgZz96rNzRJuRhDDSi+Urz97DL48mbB)Z4DKn!j!;%=67yHG7anNJ2tkLOoA` z7RCs^EcT^&q}hOHo1f*laD@s(=a@(J+{9%PfadX!z9v4BjKgY$95~^fJ3?;GP*PwT zsls-pRS^MgG_I`74uloBiyWZqCWxx3slmqpPz_n}^XJc}TYw`BBL3?l5bq&1Eu#(K zx30ckxuO)P479=HG2iPFK@a%BHu(B}pl^J9`~+C5ehK_v0J*y$YmT%%gFburiIf8y zMG=TWqq84ATotA_6du}_OE0DSpG+|IJgqN9eC?<-A+t$HNeS}`gE%)ixzI#JZ4U_J z#!pRT^E9|zA~8+3R>~%OCwji6V^D<`hvRSXe+#wh9^p54K(Nr$Ykfv3bv`+?iF(wg zNp6UQ3Q^j-foJs!?7=)@QoRG}2VQrc*t6TGmjVZaF}H+11pYde5@^1X7S%AdxQLzh zXm$d9M~n{h&oEDGXmUFTOc%lEM|@!54VOh!lshyelC8yNBfapav-1T&`sH(0oM*h6 z4F4MclWm|{lgU+M^Ol1_hsC)$fmh2A&q5CC5fwIWFOLMj9e{8apcQb8VJk&POwDqX z3f`8yva>U!@-NahCg&PIIXPKbSy85O>>P(6&jVw-9GDGaG-wahkZA3`+K-$$MCf#~ zHyMuGtfG00Fv$TYN)Jr5w#~|Toa%IHBDm8;>mc7>3YXBDfboMH9~fkfJh{MPah9xmES}O6;#N+093f9-Y3af^H-; z09S)doiU!-Gz`QPQ;L^1HYxtV_U9odTuH@q^TH#^c%Z|0&Q4&5B4gW`Fi4P}2?r3= zFQf^d_k@dL&mi5LVF2x$F~?@5p`_9`MiHB*L5601C1#a9kJ;(=gpG(vE|T-@e7rG+9A}-*4Ab zYBUv7j>Hiq{`bO-Zi6?A$c@Y@cRnhGn88j-X{koJB^eb~1)5+$=*$y)+ggHO!C`2W zL55r~X=ooM>DRd^TuxtqH!WQ84}zLaLe5#?{zvIz1z`r1t}=_}X))eefWlZMBBKOO z|4eR*I*+7~x6&eGVgsPuN`G&%u=xh_n%FWkYsvgQ7Jvbj<%NWVU@~lx2GXXy1jn8t z2l?!ku-io!8<6g04}&=*%9E3myJPGHM?uSf`SRuZ?r!SF!RCXy7#n}O#c^C)dH`GAf9cWGuG+%9dFrz0@1SzbWAC9^zMxMJIck`-znnL zwl9BaTa4bnv@H*|t7Im@kp18=@0-M0<4+6ZT$);4oq+u3sf?ecgUpL|7;m42S#(9EGADud+j$k*qp_tlmoqkPDzk;WJT1nE@q%Hynjz0LI_nHB)%Cq z1)_yXloStKg$E;Yo^ene72?7erE}?%icTyPb7a~$?vhlr`zeHF{}VRm5bja8$H8Mb z0BPA+FD)^-*`a$%X9x$6mz#@%)d2LpO&A3Idsz5zvE?-52Fg7}WXA1*IdTYFO0@N* z!wXG>U>p!}0Kqc5Kj>gAHoS1HQ!6W%yz((t_~px&qaq{6KfU7XoiKo+pSUG}$j+wb z;NWm{bTr9_@lOp}VuhR|m|+)%h#7PSxJJFAa8Do-88rqhQt1L~J%Yhxnz62?dsSA~ zHY)@UgGvK!i+^Ua-|+!IAG$?512r;MN+l^S&dkaR8V8~*NJB!VyUE1ZxFzq0^k1L7 zIC@!vmf~nb9u(BaR(#!8#EHw27jij$&?7m`!vUy4gUP1k=GGulEhgjQisdd*bTDBC zd4zzmpQrj?$nVcIyYKLPyemXqUltTUP8d&fzZZss1*POzj_SdKx4a!Npo=5}5u?gk zz|(U8j{^IKbmlb(d#6cQ7|sx_MM2jL6CX1>Hcr!b+W+vrQr%1Zpd z`C#i|W8?&|-PDwkf&z}S0E`&%02gPbQZ1!+oWs9%{d($EHU@@G07H;5Mh?nSJ;F-u zeFIQ?bH3>seSYUE6P_QAY9fR^V@e4L3GL~S>x;7hMF6030I);Nt?2huHlEW-Fx!hOEw?Tr2wGvDzxx@VO-|HMO^l*qQ$#Ops4<|IYqqZEkEBgQ7O( zG5{Te39P=hfABks7Wttchi)VK;lUW3418u22&oI2N$+<*`^fj~%Dd}mgm>AW>-Zcm z0x*H(7pQ$$k9}-@>XbC}@;+=z_QgNNJPoH+mzk)IL?G&N@j=l}43u9fx4;@~ji;sF z`#p@kb;(Y1fWWpZ$kK`Hh}YG~`UXQ0F3KR^nRIBeWZbQ|4N^PE9$uLIpj>LE3_(RO z7D*M-AL}{jNVA+U8ZL0MIqsUt$RIY~(I;0gdT7O)4iT%cX3+OZ+qrnpn zjz^@VA8aTA=}wHO^9n3=1TzHsOq@vjd3nJ|Dvqdp)zRWC#1j^f`1b2p7`FX9I9Lk9 zA=Cu?g5Qxk>yn*>xx=3cU=%rI$Oa-0AT|Jkg6L{JaspU$#hV9C)FX+Q8>+Yp*5t$D zcZ`1nylLH7r%mtj;OTRQ3TiDEXnUWhQBt@~w^ zJJ+V@w$=ZcOhpMgZLcGzvA;$h;MM7*z`X-MA{O!Z%fNsQD6u-RFj13OTU)E7vQHlT zZ#e_ySkiy*dvhM@ISH9^2O<0U@a}uW2M6=<F$*M+&o&@-T7L#T9(pwq zw-dPnF1~E4*v;w3C@493wWlh_NcO^u3BYaNLP22=a*9@JIbnJ64-`JTo@Kel5+2~U zSf?+(@uAsthipFyC1q~X)BCHHYYllwBEJm?hWwU05$W5b8kS^ z9tHj4!i5VkV@EdV_GNc*Wo`62@L$cyvzw5Xud1H$;69B!xs1)q%02h_n)w_@e2sR4B|YP zGdKj;*NdmYUm<2RK##?QP{Rjr?@>^VU_igYRx1L7fCZ8hG4LRbY?OMC*;!5c7osg{ zK#BHHx&m*;0uS)T`Wf5;=pGV=8Ukl;DLyYM+rGa}O{l@%ti$hu9LfLq@g5IPEmU2y zhY!66C_&S%hGGhF3Ya~of+*Pi`%{on!X>~q0^JqHB)4Gd6{ZQu2ft87!DfQ;=z6rm zT5w+DD<~+(CmB-n|i_}_;h-+{fhTLF;m zD_7nReVB#kA%Ipj1{4Ku6wLkSsFll@2Q3~WqeD73XAt0(G&D36zZgFRYhQ=3ssbq8 zbwc+3v9Tj~M1>9^a_yOay&fyfOMtw5<>EzjVs14JZV^$9^M@1xcL-%%UC*Fl(WqC* zX=rFIRDEuJ>3VuF4?Z?L&jgyy@$oUlonGzylrNC3K}1DWK$!;uJ(wvk+T8u@MFLM2 zSvYG`!H;+JyOB0Lig_;kA{r&s* z7T`m`vjfa7md|W2_H7EjdG_K9E;kCw=Sq;uo@zrK=Yx+0$iDXU&?j_#$7m-z@ciM1 z{OfnvArzyFz~d~kO^dY)JACKEjdSR4MOE>Fn;qxo8V`Gzwx;QNq3nc_?yJVfxtuaQo-apZE9op>KHkO{Bu(VBWoZ z2eQPW9w>u!3Ky`XUT+h@vW&rllb+r$c{#^Hu2rvzq^_m0OZGIM;4!wZ!M2nq~UJ&!PabU(9J_ckO;W#!<8&6cj(E}{=A!U8{ z1VnBkA|g2CxK!}D?y*AQky?NqrKY6Jgd%vAdg~jk3Dm0Sz`%P7Z?xlhTwQ=lL`2+S zr5XLm7qxVjNhjR9zcCF{Pp~zVgI_qFxsq&$C-QiqTXcaS4U@Z27w8n=w|^#p$0B@u z3CoDoAB2ROkr$u687-Vn6P{DC0ejbg`kEh-CJ`*=Do~&xX1@bNq2Pqhg14@d6w`gL zx#~_dTp?s>0J@`dsfrJD-<{oEA_lz=8+m0I@UW{|A|d5ox(3`OQlA*Cd^y; z=7x&1FVCo@p>&`u30OG5u2_Ib+i{Bm=K#=FMwFU8vPvI5(o5+T`4M6 zcU^~`5*8->{Glw)rqySCL?afSMs?6n z{O$2&AXH!VjEaF0w)%OGHNIE@GmLnZ7_*p~nv%7tyNZf=uU@q(ipdHSUOpp@OtMW!%N&M~szKR4_|5eZvtQ5*Nb>S#;4gyz-w~XQ zQA@ThwMl7rUZdZLRlUj*LIU}Og-?NlM^@V;6xM|%K|I{W;Dmq( zj;#tw@Y^ciqt4WVth-G*&_^5iOgMH16G&y@9coPSk->W>B2B1hbdVdsLesxs6kAZi?Z@&PD&2{kNEpx3_lU-pnY=-s4vhK)Y2%;)#!D z-i7raIql}=h8>Do`*eIZdJaEeg7SMZ`?i6iQ17TNbNu5+k9^Lb*G=3ziZ)Tx*I(a| z0YO7{RuQvHC?zm%hU`vcl)AI{R1%5!RH9DkBLds+-`jw;dkvZMGoCv5u08${H7aC!wX9NSUB zhMRd6^T;6;6-?5`zo0I8Apr1-zETIrc}UqyiZ*&70OQ|XUeEDiV&WArLvhvO6tvqm zJOQhwMw((kk>Y^g`4gpx->cfx)P%rxOU(AN2~}__vN$3(w2F2mPaT#34k+0=a3{F) zW!33`i!k00xUX>G=Uo$PYGBOK$w?W|dN<#}39Nof=_^h-bW5McvXI>Y zz@hV0b~e;Qt(%QWS>xhkEJCRr5B*oFZr>inIxjEH>6UB&WwsG{al1m|f%7P_7@$ZH zI-4in)BkPurI8yBZsxzdoK9uu+kz|BE6xv^#BaO7hVk>Zyx z4NErACn7(cnCM7DiwrbD1c9CPOmL2(6y$stJuoU$RaLdtS#c5x6rc!;#3J-=uX;2% z93_3st=~3TQ#=Y<9a{`iTu)cmwTz6qNY>5Go3@N@o3GzzRTBU>-I2Sq_n>t-!Z8*n zG!sh|OsKLJ6n%VraL&Mgxb;Zocq1hulVgT*@l(He$({#%{QT_+VuW4*kOVy342Bai z6hW2@lp;pGkV*iAIu2$jqk8&u;oR4DY|0)e{T4rL>g7?j=Qy@n2f$7s2m4F(ECC#l zx}2Rq!E>QbmXruhMU2f)EdGPvL6b-fP+cQ4y(fx~kH;~gSijTD(<6#VJ`nDMS?e^e zMI4%J91m?M>NM^JpoPfB(%V`?Ljwaz;97Y^s5>Hc*kw;mj4%-ZX;uOIA&is87JHG7 zj?RWAU=K5i((w*0a^(6D&*ITK;#?$53Va?sb6L|d1n>L|! z#?8fb!Pgf6`yVg4>YXf!SmfCE$e)@9s&DK|{Fv z_3N8DNob~bl6miYophZgU^@)g0>lVMO%IPUKo5l6dRfxyPXiU*{r%qfaW=t^AY#Hk zJo~Y??cF=H(y(I)gtK|eBm__U96C}_w!`;Gj~eav5(M3l@b&iZfBSs-@&#dym7d|# zQIcNcBH{;fP6Zxo{u;Wx9zdknJXc=5Slcm)7IuEq5%|j>NnRuVwyJrfZsgJjY+{e^ zT|jzEKdL>V?;hG(a`!GoDCR}GeNQ#Y1jOKAykj8VX9TZ0ly@r&?fzlnrGZPtya+$3lMe<`&^70FvjD>f5^4ugxA_ngqD<@VNnGhbM!LicNmk z&tJb#f_z8YJ^ed|HGo>CzkL%1mxg~$xV`3Z2fKFm3>do0Yh%3lYm*Z9>6TOlz&Uua(vX2NKuQJ~mK-37~)l#nn#)f2k&7Pc(r z-P=*;Vv$i{XR(K!%MLgNIUIAPH&V2>cgcey{5AOdVK0D(R`K80Ts6#`>R51R#q74g7ydm?ov}!&mqrq9#mT!*u`^D^ag8)mi($t`U;BR@OcXgUb&oHJA~`-%nc_cEvVSfGf|10&UkA>-=)dqS z&O+Y)oI4Jk);Z2?+u8>i9v zBGm42B8elhz-xFP(PF}x0&Zvom(nl$I}FVO@Xp%0D4*oLxdDhZeHfXlCEU?e9sv+? zw^_=9?s~%(B84C;pmNEqk2AdX%N4&BXLfeQQb!ZbvfnR{iCm0N{Wb*`63kdQd=?xt zP3>_Z>)e8;F$g@DN%Of$mNXWE|ThT{sKsYzbH3*I$B)XS=wPn`NXw6y)UCjB( z75^b-HfU}t+B8L;7|zi_1~X&|v{wKn>Y4Tfsug+b_zO$RQq!O7^?od_hWC@N%O{r( z$}5zN-_GDMq1T@oy0XpS!K>xGx5TUrxc?xUHynN-P(mTDMWUj$v$KHZO2pwtzX(mM&1S@J4IEPi`y_P$-uFm`C#mnHu2UL!O z*1Re0W`px^=GQSJQrKO%1DNH&xH%U`j|iLhxFgGE2@jK=7No9w<0pJ8JC)pMN5*S{3!Bz}oDzir(lK}w%s7i9a)T@~skSlxsT!DS-!Uj&Id1_@P zB@of|gG@YWvVK9@96e&G`}{<`@E#LZOWKhdZT$d5=zl@#Ay~=C5-{KnLBwz0C&YXc ztGM^i>X;Q&Yp@DKA?k;C3w-kin+_ABv%24dH~Whng3<}R&ac6h-S8UUrzVOF4E0^{#)qQmP*v8+#}}7C7cAhrJs?F?{=Y-UNwY zRK%Nsp5Euj+jD$LsGwkyd}}>Dv%oYau;=_^HP7&(W4GzH&r~j>{LfU(ks^uzYM7nz z0?x)@RHMSgk@&XeW}lgQw#hOS=ICQ+Xllmnq2~1icmc@QPLWGw%`7YBmT=fusL$Y% z^@{1^#(;^&Ks-2Ib(c(0wxG! z=0{6`uZafRY~LM$76h8LmMY?FJ;#775OfaS$;bWz{(FMr#bHFPV9VA#+u?2NBQG4( z&>^r9u<^MO7stoh z-%7NjQIi8QvaB?*uv;U)0L&5WJ&HFO5DW;G07_Qi-9Xee^llZUdTxT+0JJAp+7&#J z;<1a`9Hdqr;K`jkKRo&Iu6yA}2}vtSQh59JRDgH{0|FENI(MAfAyZrPBkBaP)dBoV zU_6Ly(vuf=*I)ISJ)#q2mP;SSLHj^hSc)qsekm!>AUB)_JqOrXFNZIy*;k9l+XcUu zesGO2PS9;7ZQl>p4v%m#VM+~k#3p8D56n{|e77Xofr;!!skyQ=u3+7Wc zeD4uyWl>dOZ1B(_BGS-q;6iEU*D3H-O zcM4SpN+Ou-!d>q^Qc=j?D%xc|@g>{gY4B$M*GdHOBpCaMF+SvgWV8VFqKU~X@QPK- zizmmI*6ftf1JF4D&K3twxplQm698`=Z$6OPbKS|I*J= zXlMwU&B?yvK|nhgX!5+KirRvL`+J+z;MH7wa)3|(_7T@pl&(+;+)hXkun)M<1}h}2 zHYXd~c-PADMRfSM#O<}PMFOjZ#`X*qsk#~&Nq9~>P9oeq zfTRY5LFWb%4KWyf^z;)J4vuR-)B%uPcibhf4tR^~rGR-7DC{r);CaZh;LM})9yJGu zcGwi=CQ!|?5lk^Aa(C|B2~*R$%F1CZJfg-@U-dHH?I6}3)h;$7=inuh>=K|L(eDH| zQ*s?xu*QgpBi}E6s7ARB^!yPomT4{^6fQ$ch{^|$>@itckT6c$@$?~{uIxq0mzABX z$H%KzexF9^1tQxaC)E2zEy~}NTeslqRfZ7L1IcLYS>zOny@&Ucb`y4~Hdr~*`vL-a z?stWR&8%Dp#1Vehrn!KY=;-LZ{>w}F3DnfoD7!x6p)q%w=PbLSlw#f97`q? zvVWoagIxP(=4Z^QovVJnG=Q}8B~ z*3~-gpq+uHD>9ksW}#xlL7i6Gv%$S3Wt9s!Tfx6YPS~Ossnm?$vd`&dj?_CZWwmo>P%7Vr6DQ~M zr4^~)gDbxW@vckS6C%^D5cD~G6h|pXUU1?&Yp96>zQf^wIJCL=b?_}bjP*gw53l?y zSaM(^&@||I=_bpLrmu|lmH!C_8@M@{m0kiOwckQFw{I!{JiXz8i&q zuAIIJ5a8t{-K2(7YFudMi5_j|hLLr^lzh8>&oQ=f-rR2^h@bJ^3O_^f1%QAEMrNkE zGFuRf>*TCXqlM8&bd|LB)!<-ZGB6g34SQ09I7lXa78#pC$AOS!Vo*jxb6sh-0OAqajs!lakKBKBdgD>YIa#`a=5Dh`W z!Jt_`p=Y#lF5pR;k*|_cV8YF04FB}>5$5HrC16kB#=#;UP(eH_j#^h%D?v)%cb38C zxZu_*3%60!DBpXJo`zrY1IKQAkgb424d0Jc1=(wZ7jdAyM(oW19s*tXT)@V~ADWdO zzm`D7Mfyfud|*^ZYhz{Js#b|8|8 z(Di9o4JV-SInE(4cEwM=p3L^q@|@LB<6vOKqCss-#KfK>mIs*IMLk^Tb%%0DvX1) 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

YAn{&CYI)3=86IBfXD)pk4C`kqB1Z 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

4VPg;$=B3&$axm68 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/prescriptionClassDiagram.puml b/docs/diagrams/prescriptionClassDiagram.puml new file mode 100644 index 0000000000..15df428e32 --- /dev/null +++ b/docs/diagrams/prescriptionClassDiagram.puml @@ -0,0 +1,86 @@ +@startuml +skinparam classAttributeIconSize 0 +hide circle + +class Prescription { + - patientId: String + - prescriptionId: String + - timestamp: LocalDateTime + - symptoms: List + - medicines: List + - notes: String + + Prescription(patientId: String, symptoms: List, medicines: List, notes: String) + + Prescription(patientId: String, prescriptionId: String, timestamp: LocalDateTime, symptoms: List, medicines: List, notes: String) + + getPatientId(): String + + getPrescriptionId(): String + + getTimestamp(): LocalDateTime + + getSymptoms(): List + + getMedicines(): List + + getNotes(): String + + toString(): String + + toFileFormat(): String + + {static} fromFileFormat(fileEntry: String): Prescription + + generateHtml(patient: Patient): String +} + +class AddPrescriptionCommand extends Command { + - prescription: Prescription + + AddPrescriptionCommand(prescription: Prescription) + + execute(manager: ManagementSystem, ui: Ui): void + + isExit(): boolean +} + +class ViewPrescriptionCommand extends Command { + - prescriptionId: String + + ViewPrescriptionCommand(prescriptionId: String) + + execute(manager: ManagementSystem, ui: Ui): void + + isExit(): boolean +} + +class ViewAllPrescriptionsCommand extends Command { + - patientId: String + + ViewAllPrescriptionsCommand(patientId: String) + + execute(manager: ManagementSystem, ui: Ui): void + + isExit(): boolean +} + +class ManagementSystem { + - prescriptions: List + + getPrescriptions(): List + + addPrescription(prescription: Prescription): Prescription + + getPrescriptionsForPatient(patientId: String): List + + getPrescriptionById(prescriptionId: String): Prescription +} + +class Parser { + + {static} parseAddPrescription(input: String): Prescription + + {static} parseViewAllPrescriptions(input: String): String + + {static} parseViewPrescription(input: String): String +} + +class Storage { + + {static} savePrescriptions(prescriptions: List): void + + {static} loadPrescriptions(): List + + {static} savePrescriptionHtml(prescription: Prescription, patient: Patient): void +} + +abstract class Command { + + {abstract} execute(manager: ManagementSystem, ui: Ui): void + + {abstract} isExit(): boolean +} + +Patient "1" -- "0..*" Prescription: has > + +ManagementSystem "1" --o "0..*" Prescription: manages > + +AddPrescriptionCommand "1" --o "1" Prescription: creates > +ViewPrescriptionCommand .. ManagementSystem: retrieves prescription from > +ViewAllPrescriptionsCommand .. ManagementSystem: retrieves prescriptions from > + +Parser ..> AddPrescriptionCommand: creates > +Parser ..> ViewPrescriptionCommand: creates > +Parser ..> ViewAllPrescriptionsCommand: creates > + +Storage ..> Prescription: saves/loads > + +@enduml \ No newline at end of file diff --git a/docs/diagrams/prescriptionManagementSequence.png b/docs/diagrams/prescriptionManagementSequence.png new file mode 100644 index 0000000000000000000000000000000000000000..895f5af067bf730a269d8dbfcc4fe36877c87373 GIT binary patch literal 91705 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

5uX~IT;c$MOV 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�Msmmvj8I%U=`h+zH9eB^5-2-Sd}g7 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

  • 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 aXv&9j4n6A=+vvz&ZQrUOb5Hu ClinicEase : enter input +activate ClinicEase +ClinicEase -> Parser : parse(input) +activate Parser + +Parser -> Parser : parseAddPrescription(userInput) +activate Parser +Parser -> Parser : extractValue(userInput) +activate Parser +note right of Parser: extractValue is called multiple times\n to parse patient ID, symptoms, medicines, and notes +Parser --> Parser : :String +deactivate Parser + +create Prescription +Parser -> Prescription : new Prescription(patientId, symptomsList, medicinesList, notes) +activate Prescription +Prescription --> Parser : prescription : Prescription +deactivate Prescription +deactivate Parser + +create AddPrescriptionCommand +Parser -> AddPrescriptionCommand : new AddPrescriptionCommand(prescription) +activate AddPrescriptionCommand +AddPrescriptionCommand --> Parser : :AddPrescriptionCommand +deactivate AddPrescriptionCommand +Parser --> ClinicEase : :AddPrescriptionCommand +deactivate Parser + +ClinicEase -> AddPrescriptionCommand : execute() +activate AddPrescriptionCommand +AddPrescriptionCommand -> ManagementSystem : addPrescription(prescription) +activate ManagementSystem +ManagementSystem -> ManagementSystem : findPatientByNric() +activate ManagementSystem +ManagementSystem --> ManagementSystem : patient : Patient +deactivate ManagementSystem + +alt Patient not found + ManagementSystem --> AddPrescriptionCommand : throw IllegalArgumentException +else Patient found + ManagementSystem -> ManagementSystem : Generate prescription ID + + create Prescription + ManagementSystem -> Prescription : new Prescription(patientId, prescriptionId, timestamp, symptoms, medicines, notes) + activate Prescription + Prescription --> ManagementSystem : newPrescription : Prescription + deactivate Prescription + + ManagementSystem -> Storage : savePrescriptions(prescriptions) + activate Storage + Storage --> ManagementSystem + deactivate Storage + + ManagementSystem --> AddPrescriptionCommand : newPrescription : Prescription +end +deactivate ManagementSystem + +AddPrescriptionCommand -> AddPrescriptionCommand : Display prescription details +AddPrescriptionCommand --> ClinicEase +deactivate AddPrescriptionCommand +ClinicEase --> User : display message +deactivate ClinicEase + +@enduml \ No newline at end of file From 941b594b1b53a13ae4fb7e9358a4e650a7b8a0f2 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 07:11:23 +0800 Subject: [PATCH 128/203] Fix formatting issues --- docs/DeveloperGuide.md | 85 +++++++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 22 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7333f23b6b..7449ed2a00 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -952,40 +952,81 @@ Below is a suggested guide for **manual testing** of the ClinicEase application --- -### Managing Prescriptions +## 7. Testing Prescription Management Features -1. Adding a new prescription +### 7.1 Adding a New Prescription - Prerequisites: Patient with ID "S9876543B" exists in the system. +**Command Format**: `add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]` - Test case: `add-prescription ic/S9876543B s/Fever, Cough m/Paracetamol, Cough syrup nt/Take after meals` - * Expected: Prescription is added. Details of the new prescription shown. +- `[nt/NOTES]` is optional and can include special instructions. +- Multiple symptoms and medicines can be separated by commas. - Test case: `add-prescription ic/S9876543B s/Fever m/` - * Expected: Error shown. Missing medicines field. +**Steps to Test** +1. Prerequisites: Patient with ID "S9876543B" exists in the system. - Test case: `add-prescription ic/X1234567Y s/Fever m/Paracetamol` - * Expected: Error shown. Patient ID does not exist. +2. Input: + ``` + add-prescription ic/S9876543B s/Fever, Cough m/Paracetamol, Cough syrup nt/Take after meals + ``` + * Expected output: Prescription is added. Details of the new prescription shown. -2. Viewing prescriptions +**Additional Test Cases** +- **Missing medicines field**: + ``` + add-prescription ic/S9876543B s/Fever m/ + ``` + * Expected output: Error shown. Missing medicines field. + +- **Non-existent patient**: + ``` + add-prescription ic/X1234567Y s/Fever m/Paracetamol + ``` + * Expected output: Error shown. Patient ID does not exist. - Prerequisites: At least one prescription exists for patient "S9876543B". +--- - Test case: `view-all-prescriptions S9876543B` - * Expected: List of all prescriptions for the patient shown. +### 7.2 Viewing Prescriptions - Test case: `view-prescription S9876543B-1` - * Expected: Details of the specific prescription shown. HTML file generated. +**Command Format**: +1. View all for a patient: `view-all-prescriptions PATIENT_ID` +2. View specific prescription: `view-prescription PRESCRIPTION_ID` - Test case: `view-prescription INVALID-ID` - * Expected: Error shown. Invalid prescription ID. +**Steps to Test** +1. Prerequisites: At least one prescription exists for patient "S9876543B". -3. Generating HTML prescriptions +2. Input: + ``` + view-all-prescriptions S9876543B + ``` + * Expected output: List of all prescriptions for the patient shown. - Prerequisites: Valid prescription exists with ID "S9876543B-1". +3. Input: + ``` + view-prescription S9876543B-1 + ``` + * Expected output: Details of the specific prescription shown. HTML file generated. - Test case: `view-prescription S9876543B-1` - * Expected: HTML file generated in data/prescriptions folder. - * Verify: Open the generated HTML file in a browser. Check that all prescription details are correctly displayed. +**Additional Test Cases** +- **Invalid prescription ID**: + ``` + view-prescription INVALID-ID + ``` + * Expected output: Error shown. Invalid prescription ID. + +--- + +### 7.3 Generating HTML Prescriptions + +**Command Format**: `view-prescription PRESCRIPTION_ID` + +**Steps to Test** +1. Prerequisites: Valid prescription exists with ID "S9876543B-1". + +2. Input: + ``` + view-prescription S9876543B-1 + ``` + * Expected output: HTML file generated in data/prescriptions folder. + * Verification: Open the generated HTML file in a browser. Check that all prescription details are correctly displayed. --- From bab86a570416775d28c2bd893a22aa56f8a82575 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 07:19:24 +0800 Subject: [PATCH 129/203] Fix sequence of Tests --- docs/DeveloperGuide.md | 57 +++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7449ed2a00..43fe5bf248 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -928,33 +928,9 @@ Below is a suggested guide for **manual testing** of the ClinicEase application --- -## 5. Error Handling Scenarios +## 5. Testing Prescription Management Features -- **Unknown Commands** -- If you type something invalid like `randomCommand`, the system should respond: - ``` - Unknown command. Please try again. - ``` -- **Missing or Invalid Parameters** -- For instance, `add-appointment` missing the `dt/DATE` should trigger an error message (`InvalidInputFormatException`). -- **Storage Failures** -- If there's an I/O error with reading or writing to `patient_data.txt`, you might see `UnloadedStorageException`. - ---- - -## 6. Comprehensive Test Workflow - -1. **Add multiple patients** and confirm they appear correctly with `list-patient`. -2. **Add detailed medical histories** with `store-history`; verify them using `view-history`. -3. **Add appointments** to different patients and use `list-appointment`, `sort-appointment`, `mark-appointment`, etc. to test appointment functionality. -4. **Delete a patient** and confirm the removal. -5. **Exit** the program with `bye`. - ---- - -## 7. Testing Prescription Management Features - -### 7.1 Adding a New Prescription +### 5.1 Adding a New Prescription **Command Format**: `add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]` @@ -985,7 +961,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application --- -### 7.2 Viewing Prescriptions +### 5.2 Viewing Prescriptions **Command Format**: 1. View all for a patient: `view-all-prescriptions PATIENT_ID` @@ -1015,7 +991,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application --- -### 7.3 Generating HTML Prescriptions +### 5.3 Generating HTML Prescriptions **Command Format**: `view-prescription PRESCRIPTION_ID` @@ -1030,3 +1006,28 @@ Below is a suggested guide for **manual testing** of the ClinicEase application * Verification: Open the generated HTML file in a browser. Check that all prescription details are correctly displayed. --- + +## 6. Error Handling Scenarios + +- **Unknown Commands** +- If you type something invalid like `randomCommand`, the system should respond: + ``` + Unknown command. Please try again. + ``` +- **Missing or Invalid Parameters** +- For instance, `add-appointment` missing the `dt/DATE` should trigger an error message (`InvalidInputFormatException`). +- **Storage Failures** +- If there's an I/O error with reading or writing to `patient_data.txt`, you might see `UnloadedStorageException`. + +--- + +## 7. Comprehensive Test Workflow + +1. **Add multiple patients** and confirm they appear correctly with `list-patient`. +2. **Add detailed medical histories** with `store-history`; verify them using `view-history`. +3. **Add appointments** to different patients and use `list-appointment`, `sort-appointment`, `mark-appointment`, etc. to test appointment functionality. +4. **Add prescriptions** to patients and test the prescription view and HTML generation features. +5. **Delete a patient** and confirm the removal. +6. **Exit** the program with `bye`. + +--- From f29553b0a23a7f335da83f97273434472640b0a6 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 10:19:33 +0800 Subject: [PATCH 130/203] Checkstyle fixes --- src/main/java/command/Command.java | 6 ++- src/main/java/manager/ManagementSystem.java | 3 +- src/main/java/manager/Patient.java | 7 ++-- .../command/DeleteAppointmentCommandTest.java | 6 ++- .../command/ListAppointmentCommandTest.java | 6 ++- .../command/SortAppointmentCommandTest.java | 6 ++- .../java/manager/ManagementSystemTest.java | 6 ++- src/test/java/miscellaneous/ParserTest.java | 38 ++++++++----------- 8 files changed, 47 insertions(+), 31 deletions(-) diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 396b026756..95d4326df2 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -1,6 +1,10 @@ package command; -import exception.*; +import exception.PatientNotFoundException; +import exception.AppointmentClashException; +import exception.DuplicatePatientIDException; +import exception.InvalidInputFormatException; +import exception.UnloadedStorageException; import manager.ManagementSystem; import miscellaneous.Ui; diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 09af8317cb..8bacf65621 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -94,7 +94,8 @@ public Patient viewPatient(String nric) { //@@author jyukuan public void editPatient(String nric, String newName, String newDob, String newGender, String newAddress, - String newPhone) throws UnloadedStorageException, PatientNotFoundException, InvalidInputFormatException { + String newPhone) throws UnloadedStorageException, PatientNotFoundException, + InvalidInputFormatException { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; assert patients != null : "Patient list cannot be null"; diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 0147fb00b2..7f9a7df77d 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -138,7 +138,8 @@ public String toString() { + "Address: %s\n" + "Contact: %s\n" + "Medical History: %s", - id, name, dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")), gender, address, contactInfo, formattedMedicalHistory); + id, name, dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")), + gender, address, contactInfo, formattedMedicalHistory); if (appointments.isEmpty()) { result += "\nAppointments: None"; @@ -193,7 +194,7 @@ public String toStringForListView() { public String toFileFormat() { String history = String.join(", ", this.medicalHistory); - return this.id + "|" + this.name + "|" + dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + "|" + this.gender + "|" - + this.address + "|" + this.contactInfo + "|" + history; + return this.id + "|" + this.name + "|" + dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + + "|" + this.gender + "|" + this.address + "|" + this.contactInfo + "|" + history; } } diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java index f401cef3df..4b553f40cb 100644 --- a/src/test/java/command/DeleteAppointmentCommandTest.java +++ b/src/test/java/command/DeleteAppointmentCommandTest.java @@ -1,6 +1,10 @@ package command; -import exception.*; +import exception.PatientNotFoundException; +import exception.AppointmentClashException; +import exception.DuplicatePatientIDException; +import exception.InvalidInputFormatException; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; import manager.Patient; diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index a714964388..906e1e1313 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -1,6 +1,10 @@ package command; -import exception.*; +import exception.PatientNotFoundException; +import exception.AppointmentClashException; +import exception.DuplicatePatientIDException; +import exception.InvalidInputFormatException; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; import manager.Patient; diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index 05379e6915..002b5a0d31 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -1,6 +1,10 @@ package command; -import exception.*; +import exception.PatientNotFoundException; +import exception.AppointmentClashException; +import exception.DuplicatePatientIDException; +import exception.InvalidInputFormatException; +import exception.UnloadedStorageException; import manager.Appointment; import manager.ManagementSystem; import manager.Patient; diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 2a68cae96d..5edae40424 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -1,6 +1,10 @@ package manager; -import exception.*; +import exception.PatientNotFoundException; +import exception.AppointmentClashException; +import exception.DuplicatePatientIDException; +import exception.InvalidInputFormatException; +import exception.UnloadedStorageException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import storage.Storage; diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index c33456285b..a716bb66c9 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -19,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; - class ParserTest { @Test @@ -37,21 +36,19 @@ void parseAddAppointment_validInput_returnsAppointment() throws Exception { @Test void parseAddAppointment_invalidFormat_expectException() { String input = "add-appointment ic/S1234567D dt/2025-03-19 t/1200"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); } @Test void parseAddAppointment_missingDetail_expectException() { String input = "add-appointment ic/ dt/2025-03-19 t/1200 dsc/medical check-up"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); } @Test void parseAddAppointment_dateTimeInThePast_expectException() { - String input2 = "add-appointment ic/S1234567D dt/2025-03-20 t/1300 dsc/Checkup"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input2)); + String input = "add-appointment ic/S1234567D dt/2025-03-20 t/1300 dsc/Checkup"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); } @Test @@ -82,7 +79,6 @@ void parseDeleteAppointment_extraSpaces_expectSuccess() throws InvalidInputForma @Test void parseDeleteAppointment_invalidAppointmentId_expectException() { String input = "delete-appointment 100"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); } @@ -96,10 +92,9 @@ void parseDeleteAppointment_lowercaseInput_expectSuccess() throws InvalidInputFo @Test void parseAddPatient_invalidInputFormat_expectException() { - String input = "add-patient n/John Doe ic/ dob/12-12-1999 g/M " + - "p/98765432 a/123 Main Street h/Diabetes, Hypertension"; - - assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input)); + String input = "add-patient n/John Doe ic/ dob/12-12-1999 g/M " + + "p/98765432 a/123 Main Street h/Diabetes, Hypertension"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); } @Test @@ -125,10 +120,10 @@ void parseViewHistory_explicitNricPrefix() throws InvalidInputFormatException { @Test void parseViewHistory_invalidInput_expectException() { - assertThrows(InvalidInputFormatException.class, () -> - Parser.parseViewHistory("view-history")); - assertThrows(InvalidInputFormatException.class, () -> - Parser.parseViewHistory("view-history ")); + assertThrows(InvalidInputFormatException.class, + () -> Parser.parseViewHistory("view-history")); + assertThrows(InvalidInputFormatException.class, + () -> Parser.parseViewHistory("view-history ")); } @Test @@ -141,13 +136,13 @@ void parseStoreHistory_validInput_expectSuccess() throws InvalidInputFormatExcep @Test void parseStoreHistory_missingFields_expectException() { - assertThrows(InvalidInputFormatException.class, () -> - Parser.parseStoreHistory("store-history ic/S1234567D h/Allergic to nuts")); - assertThrows(InvalidInputFormatException.class, () -> - Parser.parseStoreHistory("store-history n/John Doe h/Allergic to nuts")); - assertThrows(InvalidInputFormatException.class, () -> - Parser.parseStoreHistory("store-history n/John Doe ic/S1234567D")); -} + assertThrows(InvalidInputFormatException.class, + () -> Parser.parseStoreHistory("store-history ic/S1234567D h/Allergic to nuts")); + assertThrows(InvalidInputFormatException.class, + () -> Parser.parseStoreHistory("store-history n/John Doe h/Allergic to nuts")); + assertThrows(InvalidInputFormatException.class, + () -> Parser.parseStoreHistory("store-history n/John Doe ic/S1234567D")); + } @Test void parse_addAppointmentCommand_expectAddAppointmentCommand() throws InvalidInputFormatException, @@ -180,5 +175,4 @@ void parse_unknownCommand_expectUnknownCommandException() { String userInput = "bee-boo"; assertThrows(UnknownCommandException.class, () -> parse(userInput)); } - } From 52b68cef5918bf9feff3113e2b79da0d999771da Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 10:22:43 +0800 Subject: [PATCH 131/203] More checkstyle fixes --- src/main/java/command/EditPatientCommand.java | 3 ++- src/main/java/manager/ManagementSystem.java | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java index 176d087aa1..9872f4aeeb 100644 --- a/src/main/java/command/EditPatientCommand.java +++ b/src/main/java/command/EditPatientCommand.java @@ -16,7 +16,8 @@ public EditPatientCommand(String[] details) { } @Override - public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException, InvalidInputFormatException { + public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, + PatientNotFoundException, InvalidInputFormatException { String nric = details[0]; String name = details[1]; String dob = details[2]; diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 8bacf65621..f39ff2364a 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -1,6 +1,10 @@ package manager; -import exception.*; +import exception.PatientNotFoundException; +import exception.AppointmentClashException; +import exception.DuplicatePatientIDException; +import exception.InvalidInputFormatException; +import exception.UnloadedStorageException; import miscellaneous.Ui; import storage.Storage; From 883acd38ab2e15fcecf6113f16c905fb3eacab10 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 10:45:43 +0800 Subject: [PATCH 132/203] More and more checkstyle fixes --- src/test/java/manager/ManagementSystemTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 5edae40424..5695d35b3a 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -41,7 +41,8 @@ void setUp() throws IOException { } @Test - void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDException, UnloadedStorageException, InvalidInputFormatException { + void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDException, + UnloadedStorageException, InvalidInputFormatException { List emptyListPatient = new ArrayList<>(); List emptyListAppoint = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint); @@ -56,7 +57,7 @@ void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDExcepti } @Test - void addPatient_duplicateId_expectExceptionThrown() throws DuplicatePatientIDException, UnloadedStorageException, InvalidInputFormatException { + void addPatient_duplicateId_expectExceptionThrown() throws InvalidInputFormatException { List existing = new ArrayList<>(); Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>()); @@ -108,7 +109,8 @@ void deletePatient_existingPatient_patientDeleted() throws UnloadedStorageExcept } @Test - void deletePatient_nonExistentPatient_patientNotFound() throws UnloadedStorageException, InvalidInputFormatException { + void deletePatient_nonExistentPatient_patientNotFound() throws + UnloadedStorageException, InvalidInputFormatException { List patients = new ArrayList<>(); Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "81234567", new ArrayList<>()); @@ -424,7 +426,8 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH } @Test - void editPatientHistory_oldEntryNotFound_expectNoChange() throws UnloadedStorageException, InvalidInputFormatException { + void editPatientHistory_oldEntryNotFound_expectNoChange() throws + UnloadedStorageException, InvalidInputFormatException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); From 33bbc12bbbbb379039be0ea099b5fe96aa8235e3 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 11:01:16 +0800 Subject: [PATCH 133/203] More and more and more checkstyle fixes --- src/test/java/manager/PrescriptionTest.java | 139 ++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/test/java/manager/PrescriptionTest.java diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java new file mode 100644 index 0000000000..ed14805614 --- /dev/null +++ b/src/test/java/manager/PrescriptionTest.java @@ -0,0 +1,139 @@ +package manager; + +import exception.InvalidInputFormatException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +//@@author Basudeb2005 +public class PrescriptionTest { + + @Test + public void toFileFormat_validPrescription_success() { + // Create a sample prescription + String patientId = "S1234567A"; + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + String notes = "Take after meals"; + + LocalDateTime timestamp = LocalDateTime.now(); + String prescriptionId = patientId + "-1"; + + Prescription prescription = new Prescription( + patientId, prescriptionId, timestamp, symptoms, medicines, notes + ); + + // Convert to file format + String fileFormat = prescription.toFileFormat(); + + // Verify all required components are in the file format + Assertions.assertTrue(fileFormat.contains(prescriptionId)); + Assertions.assertTrue(fileFormat.contains(patientId)); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + String formattedTimestamp = timestamp.format(formatter); + Assertions.assertTrue(fileFormat.contains(formattedTimestamp)); + + Assertions.assertTrue(fileFormat.contains("Fever,Cough")); + Assertions.assertTrue(fileFormat.contains("Paracetamol,Cough syrup")); + Assertions.assertTrue(fileFormat.contains(notes)); + } + + @Test + public void fromFileFormat_validInput_success() { + // Create a properly formatted file entry + String fileEntry = "S1234567A-1|S1234567A|2023-04-01 14:30|" + + "Fever,Cough|Paracetamol,Cough syrup|Take after meals"; + + // Parse from file format + Prescription prescription = Prescription.fromFileFormat(fileEntry); + + // Verify all fields are correctly parsed + Assertions.assertEquals("S1234567A-1", prescription.getPrescriptionId()); + Assertions.assertEquals("S1234567A", prescription.getPatientId()); + Assertions.assertEquals(2, prescription.getSymptoms().size()); + Assertions.assertTrue(prescription.getSymptoms().contains("Fever")); + Assertions.assertTrue(prescription.getSymptoms().contains("Cough")); + Assertions.assertEquals(2, prescription.getMedicines().size()); + Assertions.assertTrue(prescription.getMedicines().contains("Paracetamol")); + Assertions.assertTrue(prescription.getMedicines().contains("Cough syrup")); + Assertions.assertEquals("Take after meals", prescription.getNotes()); + } + + @Test + public void fromFileFormat_invalidInput_throwsException() { + // Create an improperly formatted file entry (missing fields) + String invalidFileEntry = "S1234567A-1|S1234567A"; + + // This should throw an array index out of bounds exception + Assertions.assertThrows(ArrayIndexOutOfBoundsException.class, () -> { + Prescription.fromFileFormat(invalidFileEntry); + }); + } + + @Test + public void generateHtml_withPatient_containsPatientInfo() throws InvalidInputFormatException { + // Create a sample prescription + String patientId = "S1234567A"; + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + String notes = "Take after meals"; + + LocalDateTime timestamp = LocalDateTime.now(); + String prescriptionId = patientId + "-1"; + + Prescription prescription = new Prescription( + patientId, prescriptionId, timestamp, symptoms, medicines, notes + ); + + // Create a sample patient + Patient patient = new Patient( + patientId, "John Doe", "1990-01-01", "Male", + "123 Main St", "98765432", new ArrayList<>() + ); + + // Generate HTML + String html = prescription.generateHtml(patient); + + // Verify HTML contains both prescription and patient information + Assertions.assertTrue(html.contains("")); + Assertions.assertTrue(html.contains("Prescription " + prescriptionId + "")); + Assertions.assertTrue(html.contains("John Doe")); // Patient name + Assertions.assertTrue(html.contains("Male")); // Patient gender + Assertions.assertTrue(html.contains("Fever")); // Symptom + Assertions.assertTrue(html.contains("Paracetamol")); // Medicine + Assertions.assertTrue(html.contains("Take after meals")); // Notes + } + + @Test + public void generateHtml_withoutPatient_containsOnlyPrescriptionInfo() { + // Create a sample prescription + String patientId = "S1234567A"; + List symptoms = Arrays.asList("Fever", "Cough"); + List medicines = Arrays.asList("Paracetamol", "Cough syrup"); + String notes = "Take after meals"; + + LocalDateTime timestamp = LocalDateTime.now(); + String prescriptionId = patientId + "-1"; + + Prescription prescription = new Prescription( + patientId, prescriptionId, timestamp, symptoms, medicines, notes + ); + + // Generate HTML without patient + String html = prescription.generateHtml(null); + + // Verify HTML contains prescription info but limited patient info + Assertions.assertTrue(html.contains("")); + Assertions.assertTrue(html.contains("Prescription " + prescriptionId + "")); + Assertions.assertFalse(html.contains("John Doe")); // Should not contain patient name + Assertions.assertTrue(html.contains(patientId)); // Should contain patient ID + Assertions.assertTrue(html.contains("Fever")); // Should contain symptom + Assertions.assertTrue(html.contains("Paracetamol")); // Should contain medicine + Assertions.assertTrue(html.contains("Take after meals")); // Should contain notes + } +} \ No newline at end of file From 6362d370bd52eb2cc998ccacb765bfd7203c949e Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 11:26:34 +0800 Subject: [PATCH 134/203] Format fixes in test cases --- src/test/java/command/AddPrescriptionCommandTest.java | 2 +- src/test/java/command/ViewAllPrescriptionsCommandTest.java | 2 +- src/test/java/command/ViewPrescriptionCommandTest.java | 2 +- src/test/java/manager/ManagementSystemPrescriptionTest.java | 2 +- src/test/java/manager/PrescriptionTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/command/AddPrescriptionCommandTest.java b/src/test/java/command/AddPrescriptionCommandTest.java index 5519341afc..d32c6f0d80 100644 --- a/src/test/java/command/AddPrescriptionCommandTest.java +++ b/src/test/java/command/AddPrescriptionCommandTest.java @@ -44,7 +44,7 @@ public void setUp() { // Add a test patient Patient patient = new Patient( - "S1234567A", "John Doe", "1990-01-01", "Male", + "S1234567A", "John Doe", "01-01-1990", "Male", "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(patient); diff --git a/src/test/java/command/ViewAllPrescriptionsCommandTest.java b/src/test/java/command/ViewAllPrescriptionsCommandTest.java index ca70f864e8..f10b75f423 100644 --- a/src/test/java/command/ViewAllPrescriptionsCommandTest.java +++ b/src/test/java/command/ViewAllPrescriptionsCommandTest.java @@ -45,7 +45,7 @@ public void setUp() { // Add a test patient testPatient = new Patient( - "S1234567A", "John Doe", "1990-01-01", "Male", + "S1234567A", "John Doe", "01-01-1990", "Male", "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(testPatient); diff --git a/src/test/java/command/ViewPrescriptionCommandTest.java b/src/test/java/command/ViewPrescriptionCommandTest.java index dbe3e0dda5..1c2d279b75 100644 --- a/src/test/java/command/ViewPrescriptionCommandTest.java +++ b/src/test/java/command/ViewPrescriptionCommandTest.java @@ -45,7 +45,7 @@ public void setUp() { // Add a test patient Patient patient = new Patient( - "S1234567A", "John Doe", "1990-01-01", "Male", + "S1234567A", "John Doe", "01-01-1990", "Male", "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(patient); diff --git a/src/test/java/manager/ManagementSystemPrescriptionTest.java b/src/test/java/manager/ManagementSystemPrescriptionTest.java index 499882313e..b1b0602aca 100644 --- a/src/test/java/manager/ManagementSystemPrescriptionTest.java +++ b/src/test/java/manager/ManagementSystemPrescriptionTest.java @@ -28,7 +28,7 @@ public void setUp() { // Add a test patient testPatient = new Patient( - "S1234567A", "John Doe", "1990-01-01", "Male", + "S1234567A", "John Doe", "01-01-1990", "Male", "123 Main St", "98765432", new ArrayList<>() ); diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java index f426f225f5..9ec9b3ca20 100644 --- a/src/test/java/manager/PrescriptionTest.java +++ b/src/test/java/manager/PrescriptionTest.java @@ -93,7 +93,7 @@ public void generateHtml_withPatient_containsPatientInfo() // Create a sample patient Patient patient = new Patient( - patientId, "John Doe", "1990-01-01", "Male", + patientId, "John Doe", "01-01-1990", "Male", "123 Main St", "98765432", new ArrayList<>() ); From de8c0e0a96c10d0b3af7dda8dcc780b84933a719 Mon Sep 17 00:00:00 2001 From: yukuan Date: Sun, 6 Apr 2025 11:55:03 +0800 Subject: [PATCH 135/203] fix the bug that I assign to myself(in issue) --- src/main/java/command/EditPatientCommand.java | 10 ++--- src/main/java/manager/ManagementSystem.java | 42 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java index dc7334fa6c..44ab3bf221 100644 --- a/src/main/java/command/EditPatientCommand.java +++ b/src/main/java/command/EditPatientCommand.java @@ -22,12 +22,12 @@ public EditPatientCommand(String[] details) { @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException, InvalidInputFormatException { - String nric = details[0]; - String name = details[1]; - String dob = details[2]; + String nric = details[0]; + String name = details[1]; + String dob = details[2]; String gender = details[3]; - String addr = details[4]; - String phone = details[5]; + String addr = details[4]; + String phone = details[5]; if (dob != null && !dob.isBlank()) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index f2215ed592..a28e1ebeef 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -29,8 +29,8 @@ public ManagementSystem(List loadedPatients, List loadedAp prescriptions = new ArrayList<>(); } - public ManagementSystem(List loadedPatients, List loadedAppointments, - List loadedPrescriptions) { + public ManagementSystem(List loadedPatients, List loadedAppointments, + List loadedPrescriptions) { assert loadedPatients != null : "Patient list cannot be null"; assert loadedAppointments != null : "Appointment list cannot be null"; assert loadedPrescriptions != null : "Prescription list cannot be null"; @@ -69,7 +69,7 @@ public void addPatient(Patient patient) throws DuplicatePatientIDException, Unlo public Patient deletePatient(String nric) throws UnloadedStorageException { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; assert patients != null : "Patient list cannot be null"; - + for (Patient patient : patients) { if (patient.getId().equals(nric)) { patients.remove(patient); @@ -99,7 +99,7 @@ public Patient viewPatient(String nric) { //@@author jyukuan public void editPatient(String nric, String newName, String newDob, String newGender, String newAddress, String newPhone) throws UnloadedStorageException, PatientNotFoundException, - InvalidInputFormatException { + InvalidInputFormatException { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; assert patients != null : "Patient list cannot be null"; @@ -241,7 +241,7 @@ public void addAppointment(Appointment appointment) throws UnloadedStorageExcept assert patients != null : "Patient list cannot be null"; // Check if there is any scheduled appointment in the list clashing with this newly-added one - for (Appointment appointmentInList : appointments) { + for (Appointment appointmentInList : appointments) { long timeDiff = Math.abs(Duration.between(appointmentInList.getDateTime(), appointment.getDateTime()).toMinutes()); if (timeDiff < 60) { @@ -262,7 +262,7 @@ public void addAppointment(Appointment appointment) throws UnloadedStorageExcept public Appointment deleteAppointment(String apptId) throws UnloadedStorageException { assert apptId != null && !apptId.isBlank() : "Appointment ID cannot be null or blank"; assert appointments != null : "Appointment list cannot be null"; - + for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { appointments.remove(appointment); @@ -324,13 +324,13 @@ public List findAppointmentsByNric(String nric) { public List getPrescriptions() { return prescriptions; } - + //@@author Basudeb2005 - public Prescription addPrescription(Prescription prescription) + public Prescription addPrescription(Prescription prescription) throws IllegalArgumentException, UnloadedStorageException { assert prescription != null : "Prescription cannot be null"; assert patients != null : "Patient list cannot be null"; - + Patient patient = findPatientByNric(prescription.getPatientId()); if (patient == null) { throw new IllegalArgumentException("Patient with NRIC: " + prescription.getPatientId() + " not found"); @@ -343,25 +343,25 @@ public Prescription addPrescription(Prescription prescription) prescriptionCount++; } } - + String prescriptionId = prescription.getPatientId() + "-" + prescriptionCount; - + // Create a new prescription with updated ID Prescription newPrescription = new Prescription( - prescription.getPatientId(), - prescriptionId, - prescription.getTimestamp(), - prescription.getSymptoms(), - prescription.getMedicines(), - prescription.getNotes() + prescription.getPatientId(), + prescriptionId, + prescription.getTimestamp(), + prescription.getSymptoms(), + prescription.getMedicines(), + prescription.getNotes() ); - + prescriptions.add(newPrescription); Storage.savePrescriptions(prescriptions); - + return newPrescription; } - + //@@author Basudeb2005 public List getPrescriptionsForPatient(String patientId) { List patientPrescriptions = new ArrayList<>(); @@ -372,7 +372,7 @@ public List getPrescriptionsForPatient(String patientId) { } return patientPrescriptions; } - + //@@author Basudeb2005 public Prescription getPrescriptionById(String prescriptionId) { for (Prescription prescription : prescriptions) { From 6563959faac08a3aa8cdb6d901930d727fcb985a Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 12:09:09 +0800 Subject: [PATCH 136/203] Updated DG UML for add patient --- docs/diagrams/addPatientSequence.png | Bin 52801 -> 52706 bytes docs/diagrams/addPatientSequence.puml | 10 ++++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/diagrams/addPatientSequence.png b/docs/diagrams/addPatientSequence.png index 6da6b7869f4ae53f1ca0913968d14fc728acbb01..fe5544fa8e31b91333458f778e4420343ed87172 100644 GIT binary patch delta 29578 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 delta 29683 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 diff --git a/docs/diagrams/addPatientSequence.puml b/docs/diagrams/addPatientSequence.puml index 7f2e64478b..636139e5a9 100644 --- a/docs/diagrams/addPatientSequence.puml +++ b/docs/diagrams/addPatientSequence.puml @@ -26,6 +26,8 @@ deactivate Parser create AddPatientCommand Parser -> AddPatientCommand : new AddPatientCommand(String[]) activate AddPatientCommand +AddPatientCommand --> Parser +deactivate Parser Parser --> ClinicEase : :AddPatientCommand deactivate Parser @@ -36,7 +38,7 @@ activate ManagementSystem ManagementSystem -> ManagementSystem : check if NRIC exists alt NRIC already exists ManagementSystem --> AddPatientCommand : Error message -else +else Else create Patient ManagementSystem -> Patient : new Patient(...) activate Patient @@ -50,9 +52,9 @@ else deactivate Storage ManagementSystem --> AddPatientCommand : + deactivate AddPatientCommand + deactivate ManagementSystem end -deactivate ManagementSystem -AddPatientCommand -> ClinicEase : +AddPatientCommand --> ClinicEase : deactivate AddPatientCommand - @enduml \ No newline at end of file From 41b7818aea55aba42e3318c7f011f6cad67f5d56 Mon Sep 17 00:00:00 2001 From: yukuan Date: Sun, 6 Apr 2025 12:09:51 +0800 Subject: [PATCH 137/203] fix the bug that caused by last change --- src/test/java/miscellaneous/ParserTest.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index a716bb66c9..801e82f0d4 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -128,20 +128,17 @@ void parseViewHistory_invalidInput_expectException() { @Test void parseStoreHistory_validInput_expectSuccess() throws InvalidInputFormatException { - String[] result = Parser.parseStoreHistory("store-history n/John Doe ic/S1234567D h/Allergic to nuts"); - assertEquals("John Doe", result[0]); - assertEquals("S1234567D", result[1]); - assertEquals("Allergic to nuts", result[2]); + String[] result = Parser.parseStoreHistory("store-history ic/S1234567D h/Allergic to nuts"); + assertEquals("S1234567D", result[0]); + assertEquals("Allergic to nuts", result[1]); } @Test void parseStoreHistory_missingFields_expectException() { assertThrows(InvalidInputFormatException.class, - () -> Parser.parseStoreHistory("store-history ic/S1234567D h/Allergic to nuts")); - assertThrows(InvalidInputFormatException.class, - () -> Parser.parseStoreHistory("store-history n/John Doe h/Allergic to nuts")); + () -> Parser.parseStoreHistory("store-history ic/S1234567D")); assertThrows(InvalidInputFormatException.class, - () -> Parser.parseStoreHistory("store-history n/John Doe ic/S1234567D")); + () -> Parser.parseStoreHistory("store-history h/Allergic to nuts")); } @Test From 27a4cee45e7db7a35f93a96d47485fbab444dd10 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 12:30:57 +0800 Subject: [PATCH 138/203] Adjusted contactNumber to only input valid phone number --- data/patient_data.txt | 1 - docs/UserGuide.md | 1 + src/main/java/manager/Patient.java | 14 +++++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/data/patient_data.txt b/data/patient_data.txt index 9213d25421..e69de29bb2 100644 --- a/data/patient_data.txt +++ b/data/patient_data.txt @@ -1 +0,0 @@ -S1234567D|John|06-04-2003|M|123 Main St|91218188| diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 7d867246f7..501f6a5a35 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -78,6 +78,7 @@ Adds a new patient to the system with their credentials. Format: `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS h/MEDICAL_HISTORY` * The `NRIC` must be unique to the existing ones in the system. +* All inputs doesn't handle every ASCII characters, only alphabets and numbers. Example of usage: diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 7f9a7df77d..238d2dda9f 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -34,7 +34,7 @@ public Patient(String id, String name, String dobStr, String gender, String addr this.dob = parseAndValidateDob(dobStr); this.gender = gender; this.address = address; - this.contactInfo = contactInfo; + this.contactInfo = parseContactInfo(contactInfo); this.medicalHistory = new ArrayList<>(medicalHistory); this.appointments = new ArrayList<>(); } @@ -120,6 +120,18 @@ public void deleteAppointment(String apptId) { } } + private String parseContactInfo(String contactInfo) throws InvalidInputFormatException { + try { + if (contactInfo.length() != 8 || !contactInfo.matches("\\d+")) { + throw new InvalidInputFormatException("Contact number must be 8 digits."); + } + return contactInfo; + } catch (NullPointerException e) { + throw new InvalidInputFormatException("Contact number cannot be null."); + } + } + + @Override public String toString() { String formattedMedicalHistory; From 1fabbedd02263b9cc4e2bf0aa2406efe646569ca Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 12:59:50 +0800 Subject: [PATCH 139/203] Gender can only input M or F --- src/main/java/manager/Patient.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 238d2dda9f..d26ed3d4a6 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -32,7 +32,7 @@ public Patient(String id, String name, String dobStr, String gender, String addr this.id = id; this.name = name; this.dob = parseAndValidateDob(dobStr); - this.gender = gender; + this.gender = checkGender(gender); this.address = address; this.contactInfo = parseContactInfo(contactInfo); this.medicalHistory = new ArrayList<>(medicalHistory); @@ -97,6 +97,15 @@ public void addAppointment(Appointment appointment) { appointments.add(appointment); } + private String checkGender(String gender) throws InvalidInputFormatException { + if(gender.equals("M") || gender.equals("F")) { + return gender; + } + else{ + throw new InvalidInputFormatException("The gender must to be either M (male) or F (female)"); + } + } + private LocalDate parseAndValidateDob(String dobStr) throws InvalidInputFormatException { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); try { From 597d83556dd344ee3b2929777b07febd00514ade Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 13:16:23 +0800 Subject: [PATCH 140/203] Updated addPatient to check for valid IC --- src/main/java/manager/Patient.java | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index d26ed3d4a6..f8b276c5aa 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -29,7 +29,7 @@ public Patient(String id, String name, String dobStr, String gender, String addr assert contactInfo != null : "Contact info cannot be null"; assert medicalHistory != null : "Medical history list cannot be null"; - this.id = id; + this.id = parseValidIC(id); this.name = name; this.dob = parseAndValidateDob(dobStr); this.gender = checkGender(gender); @@ -97,6 +97,30 @@ public void addAppointment(Appointment appointment) { appointments.add(appointment); } + private String parseValidIC(String ic) throws InvalidInputFormatException { + if (ic == null || ic.length() != 9) { + throw new InvalidInputFormatException("IC must be exactly 9 characters long."); + } + + String prefix = ic.substring(0, 1).toUpperCase(); + String numberPart = ic.substring(1, 8); + String suffix = ic.substring(8).toUpperCase(); + + if (!prefix.matches("[STFGM]")) { + throw new InvalidInputFormatException("IC must start with S, T, F, G, or M."); + } + + if (!numberPart.matches("\\d{7}")) { + throw new InvalidInputFormatException("IC must contain 7 digits after the prefix."); + } + + if (!suffix.matches("[A-Z]")) { + throw new InvalidInputFormatException("IC must end with an uppercase letter."); + } + + return ic; + } + private String checkGender(String gender) throws InvalidInputFormatException { if(gender.equals("M") || gender.equals("F")) { return gender; From d2b9da485a0162722e84c2242190dc9638c9d1a3 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 13:22:52 +0800 Subject: [PATCH 141/203] Updated editPatient description in UG --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 1eb6841c91..4d8492fff1 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -170,7 +170,7 @@ Expected Output:
    ### Editing a specified patient: `edit-patient` -Displays a list of all registered patients in the system with details provided. +Edits a specific patient credentials by NRIC. Format: `edit-patient ic/NRIC ATTRIBUTE` From d45f2bbc4ed3c9a028b55dfdb158e313d8c875ad Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 14:12:19 +0800 Subject: [PATCH 142/203] Updated UG and DG --- docs/DeveloperGuide.md | 2 +- docs/UserGuide.md | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 43fe5bf248..8206353bdc 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -161,7 +161,7 @@ The system loads the stored list of patients and appointments. The user is now r **Step 2.** The user executes the following command to add a new patient: -add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St +add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St h/Diabetes, Hypertension This command is read by the `ClinicEase` class and passed to the `Parser`. The `Parser` class identifies the command as `add-patient` and parses the fields. A `Patient` object is then constructed from the parsed data. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 4d8492fff1..1f4847014a 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,23 +8,26 @@ ClinicEase is an application designed to assist doctors in managing patient reco ## Table of Contents - [Quick Start](#quick-start) - [Features](#features-) - - [Adding a new patient: `add-patient`](#adding-a-new-patient--add-patient) - - [Viewing patient details: `view-patient`](#viewing-patient-details-view-patient) - - [Listing all patients: `list-patient`](#listing-all-patients-list-patient) - - [Editing a specified patient: `edit-patient`](#editing-a-specified-patient-edit-patient) - - [Adding an appointment: `add-appointment`](#adding-an-appointment-add-appointment) - - [Deleting an appointment: `delete-appointment`](#deleting-an-appointment-delete-appointment) - - [Sorting appointments: `sort-appointment`](#sorting-appointments-sort-appointment) - - [Marking an appointment as done: `mark-appointment`](#marking-an-appointment-as-done-mark-appointment) - - [Unmarking a completed appointment: `unmark-appointment`](#unmarking-a-completed-appointment-unmark-appointment) - - [Finding a patient's appointments: `find-appointment`](#finding-a-patients-appointments-find-appointment) - - [Managing Prescriptions](#managing-prescriptions) + - Managing Patients + - [Adding a new patient: `add-patient`](#adding-a-new-patient--add-patient) + - [Viewing patient details: `view-patient`](#viewing-patient-details-view-patient) + - [Listing all patients: `list-patient`](#listing-all-patients-list-patient) + - [Editing a specified patient: `edit-patient`](#editing-a-specified-patient-edit-patient) + - Managing Appointments + - [Adding an appointment: `add-appointment`](#adding-an-appointment-add-appointment) + - [Deleting an appointment: `delete-appointment`](#deleting-an-appointment-delete-appointment) + - [Sorting appointments: `sort-appointment`](#sorting-appointments-sort-appointment) + - [Marking an appointment as done: `mark-appointment`](#marking-an-appointment-as-done-mark-appointment) + - [Unmarking a completed appointment: `unmark-appointment`](#unmarking-a-completed-appointment-unmark-appointment) + - [Finding a patient's appointments: `find-appointment`](#finding-a-patients-appointments-find-appointment) + - Managing Prescriptions - [Adding a prescription: `add-prescription`](#adding-a-prescription-add-prescription) - [Viewing all prescriptions: `view-all-prescriptions`](#viewing-all-prescriptions-view-all-prescriptions) - [Viewing specific prescription: `view-prescription`](#viewing-specific-prescription-view-prescription) - - [Adding medical history: `store-history`](#adding-medical-history-store-history) - - [Viewing medical history: `view-history`](#viewing-medical-history-view-history) - - [Editing medical history: `edit-history`](#editing-medical-history-edit-history) + - Updating Medical History + - [Adding medical history: `store-history`](#adding-medical-history-store-history) + - [Viewing medical history: `view-history`](#viewing-medical-history-view-history) + - [Editing medical history: `edit-history`](#editing-medical-history-edit-history) - [Exiting the program: `bye`](#exiting-the-program-bye) - [FAQ](#faq) - [Known Issues](#known-issues) @@ -500,9 +503,6 @@ Format: `bye` --- ## Known Issues -1. The parameter `NRIC` can take in any String format. -2. The parameter `BIRTHDATE` doesn't have to be a valid past date. -3. The parameter `PHONE` ## Command Summary From 9ec385f093d2c6b2ee6db14d12018e9ff0aa5aa5 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 14:19:23 +0800 Subject: [PATCH 143/203] checkstyle fixes --- src/test/java/command/AddPrescriptionCommandTest.java | 2 +- src/test/java/command/ViewAllPrescriptionsCommandTest.java | 2 +- src/test/java/command/ViewPrescriptionCommandTest.java | 2 +- src/test/java/manager/ManagementSystemPrescriptionTest.java | 2 +- src/test/java/manager/PrescriptionTest.java | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/command/AddPrescriptionCommandTest.java b/src/test/java/command/AddPrescriptionCommandTest.java index d32c6f0d80..f9b5d42eb1 100644 --- a/src/test/java/command/AddPrescriptionCommandTest.java +++ b/src/test/java/command/AddPrescriptionCommandTest.java @@ -44,7 +44,7 @@ public void setUp() { // Add a test patient Patient patient = new Patient( - "S1234567A", "John Doe", "01-01-1990", "Male", + "S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(patient); diff --git a/src/test/java/command/ViewAllPrescriptionsCommandTest.java b/src/test/java/command/ViewAllPrescriptionsCommandTest.java index f10b75f423..dccfff0475 100644 --- a/src/test/java/command/ViewAllPrescriptionsCommandTest.java +++ b/src/test/java/command/ViewAllPrescriptionsCommandTest.java @@ -45,7 +45,7 @@ public void setUp() { // Add a test patient testPatient = new Patient( - "S1234567A", "John Doe", "01-01-1990", "Male", + "S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(testPatient); diff --git a/src/test/java/command/ViewPrescriptionCommandTest.java b/src/test/java/command/ViewPrescriptionCommandTest.java index 1c2d279b75..369ad82460 100644 --- a/src/test/java/command/ViewPrescriptionCommandTest.java +++ b/src/test/java/command/ViewPrescriptionCommandTest.java @@ -45,7 +45,7 @@ public void setUp() { // Add a test patient Patient patient = new Patient( - "S1234567A", "John Doe", "01-01-1990", "Male", + "S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(patient); diff --git a/src/test/java/manager/ManagementSystemPrescriptionTest.java b/src/test/java/manager/ManagementSystemPrescriptionTest.java index b1b0602aca..c5155a9842 100644 --- a/src/test/java/manager/ManagementSystemPrescriptionTest.java +++ b/src/test/java/manager/ManagementSystemPrescriptionTest.java @@ -28,7 +28,7 @@ public void setUp() { // Add a test patient testPatient = new Patient( - "S1234567A", "John Doe", "01-01-1990", "Male", + "S1234567A", "John Doe", "01-01-1990", "M", "123 Main St", "98765432", new ArrayList<>() ); diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java index 9ec9b3ca20..8bb22eda27 100644 --- a/src/test/java/manager/PrescriptionTest.java +++ b/src/test/java/manager/PrescriptionTest.java @@ -93,7 +93,7 @@ public void generateHtml_withPatient_containsPatientInfo() // Create a sample patient Patient patient = new Patient( - patientId, "John Doe", "01-01-1990", "Male", + patientId, "John Doe", "01-01-1990", "M", "123 Main St", "98765432", new ArrayList<>() ); @@ -104,7 +104,7 @@ public void generateHtml_withPatient_containsPatientInfo() Assertions.assertTrue(html.contains("")); Assertions.assertTrue(html.contains("Prescription " + prescriptionId + "")); Assertions.assertTrue(html.contains("John Doe")); // Patient name - Assertions.assertTrue(html.contains("Male")); // Patient gender + Assertions.assertTrue(html.contains("M")); // Patient gender Assertions.assertTrue(html.contains("Fever")); // Symptom Assertions.assertTrue(html.contains("Paracetamol")); // Medicine Assertions.assertTrue(html.contains("Take after meals")); // Notes From db10e3003befcc01704d40c6cd4252ce5a08f79c Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sun, 6 Apr 2025 17:17:05 +0800 Subject: [PATCH 144/203] Added more JUnit Test --- .../java/manager/ManagementSystemTest.java | 34 ++++----- src/test/java/miscellaneous/ParserTest.java | 75 +++++++++++++++++-- 2 files changed, 85 insertions(+), 24 deletions(-) diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 7fb6b06b1c..a6342aca6a 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -173,20 +173,26 @@ void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageEx List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); - LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); + LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); + LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-22 1200", DATE_TIME_FORMAT); Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", "M", "124 High St", "81234567", new ArrayList<>()); patients.add(patient); - Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); + Appointment appointment1 = new Appointment("S1234567D", appointmentTime1, "Medical Checkup"); + Appointment appointment2 = new Appointment("S1234567D", appointmentTime2, "Consultation"); - String expectedNric = appointment.getNric(); - manager.addAppointment(appointment); + String expectedNric = appointment1.getNric(); + manager.addAppointment(appointment1); + manager.addAppointment(appointment2); - assertEquals(1, manager.getAppointments().size(), "Size does not match"); + assertEquals(2, manager.getAppointments().size(), "Size does not match"); assertEquals(expectedNric, manager.getAppointments().get(0).getNric(), "NRIC does not match"); + assertEquals(expectedNric, manager.getAppointments().get(1).getNric(), "NRIC does not match"); assertEquals(LocalDate.of(2025, 3, 20), manager.getAppointments().get(0).getDate()); assertEquals(LocalTime.of(19, 0), manager.getAppointments().get(0).getTime()); + assertEquals(LocalDate.of(2025, 3, 22), manager.getAppointments().get(1).getDate()); + assertEquals(LocalTime.of(12, 0), manager.getAppointments().get(1).getTime()); } @Test @@ -209,34 +215,24 @@ void addAppointment_clashedAppointments_expectException() throws UnloadedStorage } @Test - void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStorageException, - PatientNotFoundException, AppointmentClashException { + void addAppointment_nonExistingPatient_expectException() { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); - Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", - "M", "124 High St", "81234567", new ArrayList<>()); - patients.add(patient); Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup"); - String expectedId = appointment.getId(); - manager.addAppointment(appointment); - Appointment removedAppointment = manager.deleteAppointment(expectedId); - - assertNotNull(removedAppointment, "Deleted appointment should be returned"); - assertEquals(expectedId, appointment.getId(), "Appointment ID does not match"); - assertEquals(0, manager.getAppointments().size(), "Size does not match"); + assertThrows(PatientNotFoundException.class, () -> manager.addAppointment(appointment)); } @Test - void deleteAppointment_lowerCaseInput_expectAppointmentDeleted() throws UnloadedStorageException, + void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStorageException, PatientNotFoundException, AppointmentClashException { List patients = new ArrayList<>(); ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); - LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-30 2200", DATE_TIME_FORMAT); + LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", "M", "124 High St", "81234567", new ArrayList<>()); diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index c7e3f91ff0..4a176edd91 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -3,7 +3,10 @@ import command.AddAppointmentCommand; import command.Command; import command.DeleteAppointmentCommand; +import command.ExitCommand; +import command.HelpCommand; import command.ListAppointmentCommand; +import command.SortAppointmentCommand; import exception.InvalidInputFormatException; import exception.UnknownCommandException; import manager.Appointment; @@ -43,15 +46,38 @@ void parseAddAppointment_invalidFormat_expectException() { @Test void parseAddAppointment_missingDetail_expectException() { - String input = "add-appointment ic/ dt/2025-03-19 t/1200 dsc/medical check-up"; + String missingIc = "add-appointment ic/ dt/2025-03-19 t/1200 dsc/medical check-up"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(missingIc)); - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); + String missingDate = "add-appointment ic/S1234567D dt/ t/1200 dsc/medical check-up"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(missingDate)); + + String missingTime = "add-appointment ic/S1234567D dt/2025-03-19 t/ dsc/medical check-up"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(missingTime)); + + String missingDescription = "add-appointment ic/S1234567D dt/2025-03-19 t/1200 dsc/"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(missingDescription)); } @Test void parseAddAppointment_dateTimeInThePast_expectException() { - String input2 = "add-appointment ic/S1234567D dt/2025-03-20 t/1300 dsc/Checkup"; + String input = "add-appointment ic/S1234567D dt/2025-03-20 t/1300 dsc/Checkup"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); + } + + @Test + void parseAddAppointment_invalidIcFormat_expectException() { + String input1 = "add-appointment ic/S1234567 dt/2025-03-20 t/1300 dsc/Checkup"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input1)); + + String input2 = "add-appointment ic/S123467D dt/2025-03-20 t/1300 dsc/Checkup"; assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input2)); + + String input3 = "add-appointment ic/123467D dt/2025-03-20 t/1300 dsc/Checkup"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input3)); + + String input4 = "add-appointment ic/123467 dt/2025-03-20 t/1300 dsc/Checkup"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input4)); } @Test @@ -171,7 +197,7 @@ void parse_deleteAppointmentCommand_expectDeleteAppointmentCommand() throws Inva } @Test - void parse_listAppointmentCommand_expectListAppointmentCommandCommand() throws Exception { + void parse_listAppointmentCommand_expectListAppointmentCommand() throws Exception { Command command = Parser.parse("list-appointment"); assertInstanceOf(ListAppointmentCommand.class, command); } @@ -179,7 +205,46 @@ void parse_listAppointmentCommand_expectListAppointmentCommandCommand() throws E @Test void parse_unknownCommand_expectUnknownCommandException() { String userInput = "bee-boo"; - assertThrows(UnknownCommandException.class, () -> parse(userInput)); + assertThrows(UnknownCommandException.class, () -> Parser.parse(userInput)); + } + + @Test + void parse_sortAppointmentCommand_expectSortAppointmentCommand() throws InvalidInputFormatException, + UnknownCommandException { + Command byDate = Parser.parse("sort-appointment byDate"); + assertInstanceOf(SortAppointmentCommand.class, byDate); + + Command byId = Parser.parse("sort-appointment byId"); + assertInstanceOf(SortAppointmentCommand.class, byId); } + @Test + void parse_invalidSortAppointmentCommand_expectException() { + assertThrows(InvalidInputFormatException.class, () -> Parser.parse("sort-appointment")); + } + + @Test + void parse_byeCommand_expectByeCommand() throws InvalidInputFormatException, + UnknownCommandException { + Command command = Parser.parse("bye"); + assertInstanceOf(ExitCommand.class, command); + + } + + @Test + void parse_helpCommand_expectHelpCommand() throws InvalidInputFormatException, + UnknownCommandException { + Command command = Parser.parse("help"); + assertInstanceOf(HelpCommand.class, command); + } + + @Test + void parse_nullInput_expectException() { + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(null)); + } + + @Test + void parse_emptyInput_expectException() { + assertThrows(InvalidInputFormatException.class, () -> Parser.parse("")); + } } From 116ebb640a71b2b75a16b63541ac6b82e572fc41 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sun, 6 Apr 2025 17:29:22 +0800 Subject: [PATCH 145/203] Fixed checkstyle issue of ParserTest --- src/test/java/miscellaneous/ParserTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index 034b756fd5..9fbe7b231d 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -16,7 +16,6 @@ import org.junit.jupiter.api.Test; import static manager.Appointment.INPUT_FORMAT; -import static miscellaneous.Parser.parse; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; From 2e12e0a24b62e525d87bbc6c05056d2fec87cf59 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 19:18:41 +0800 Subject: [PATCH 146/203] Add Architecture section to Developer Guide --- docs/DeveloperGuide.md | 102 ++++++++++++++++++ docs/diagrams/ArchitectureDiagram.png | Bin 0 -> 50454 bytes docs/diagrams/ArchitectureDiagram.puml | 44 ++++++++ docs/diagrams/ArchitectureSequenceDiagram.png | Bin 0 -> 41867 bytes .../diagrams/ArchitectureSequenceDiagram.puml | 44 ++++++++ 5 files changed, 190 insertions(+) create mode 100644 docs/diagrams/ArchitectureDiagram.png create mode 100644 docs/diagrams/ArchitectureDiagram.puml create mode 100644 docs/diagrams/ArchitectureSequenceDiagram.png create mode 100644 docs/diagrams/ArchitectureSequenceDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 43fe5bf248..3fbbbbd4d2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -9,6 +9,108 @@ --- +## Architecture + +![Architecture Diagram](diagrams/ArchitectureDiagram.png) + +The **Architecture Diagram** above illustrates the high-level design of the ClinicEase application. The diagram shows how the different components interact with each other and with the user. + +Given below is a quick overview of the main components and how they interact with each other: + +### Main components of the architecture + +**ClinicEase** (consisting of the `ClinicEase.java` class) is in charge of the application launch and shutdown. + +* At application launch, it initializes the other components in the correct sequence, and connects them with each other. +* At shutdown, it ensures proper cleanup of resources. + +The application's functionality is implemented through the following five components: + +* **UI**: The user interface of the application. +* **Parser**: Processes and interprets user inputs. +* **Command**: Executes user commands. +* **Model**: Holds the data of the application 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 for the scenario where the user executes a `add-patient` command: + +![Sequence Diagram for add-patient](diagrams/ArchitectureSequenceDiagram.png) + +The following sections explain the various components in more detail. + +### UI component + +The UI component: + +* Receives user commands via the console +* Displays results to the user + +The UI is implemented in the `miscellaneous.Ui` class, which contains methods to display different types of information to the user, such as welcome messages, error messages, and command results. + +### Parser component + +The Parser component: + +* Parses user input into commands +* Creates the appropriate Command objects based on the parsed input +* Validates input format and throws exceptions for invalid inputs + +The Parser is implemented in the `miscellaneous.Parser` class and is responsible for interpreting user commands and converting them into executable Command objects. + +### Command component + +The Command component: + +* Represents executable user commands +* Implements the Command pattern +* Contains multiple subclasses for different command types + +All commands extend the abstract `command.Command` class, which defines the `execute()` method. Each specific command (e.g., `AddPatientCommand`, `DeletePatientCommand`) implements this method with its own functionality. + +### Model component + +The Model component: + +* Holds the application data in memory +* Manages patients, appointments, and prescriptions +* Contains business logic for operations like adding and removing entities + +The main model class is `manager.ManagementSystem`, which acts as a facade for the model layer. It contains lists of: +* `Patient` objects +* `Appointment` objects +* `Prescription` objects + +These entity classes (`Patient`, `Appointment`, `Prescription`) encapsulate the data and behavior of their respective domain objects. + +### Storage component + +The Storage component: + +* Saves data to text files when instructed to +* Loads data from text files when the application starts +* Ensures data persistence across application launches + +The Storage is implemented in the `storage.Storage` class and is responsible for reading/writing patient, appointment, and prescription data to/from files. + +### How the components interact + +* **User** enters commands through the **UI** +* **UI** passes the command string to the **Parser** +* **Parser** creates the appropriate **Command** object based on the input +* **Command** executes operations using the **Model** (e.g., adding a patient) +* **Model** updates its internal state and may request the **Storage** to save changes +* **Command** may use the **UI** to display results to the user + +This architecture follows several design principles: + +1. **Single Responsibility Principle**: Each component has a specific responsibility +2. **Separation of Concerns**: UI logic is separated from business logic which is separated from data persistence logic +3. **Command Pattern**: Commands encapsulate actions and provide a uniform interface for execution + ## Design & implementation ### View patient feature diff --git a/docs/diagrams/ArchitectureDiagram.png b/docs/diagrams/ArchitectureDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..2419a9537330193ce067102584659d42a6c80600 GIT binary patch literal 50454 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­gF^Kj@B!m@=%fKA81L*1MnwuJo$37ZwbM`>Y4S(DeE>G{WEwXG7fo!u<&;%D$LBx(4V+GEkrq7piuMlDfzaD-&H9k&%artE%3-h zLj&rm#*G{6v89x*OJQAIO18Eukm#P8HY7SJt0Vp%U8q$)?(T2jy(1+i=9*a^g`5G6 zMJs!I--Dfdb>u}_f6p1H5r+Eua&C)w)0_=J8H;uMySsU0WpkXamfQb%lD5r@7cU^R zK^i~=>|dHbyOJSdF7LM31N`$zMa2b^`c;r!mT8G32w*OU#QA_wSS~wvvSXmjkAs5) zM`UwnC;vC4np(fuuQ!=u%2UnId%xh7$Sy~s5cp*%3(^mqHdsS25~OtyPYezWFiJQ) zC@NZbAfP)Sx%V3in%h#}-u^z6Am^Ev8d_Q-kQa{je~pSU2H8>R@WMdnc~NtqoPbUQ zDqywIGpnDgW7y*~JvuoFQjLd)M;K=a8(!(akB*bTEsn|R+i{g52!z>GGlZQWieAX* zl!E-d50})-EW0DowmV&_}Gw5ZbPYv|-m4Wv2<;xd^qo3~p9xzi=yFouY zL-vZM<}j()z~r@WB-j|J!q>Wcmv3YKef4cDk%ESKcgKwkp%AuDzt$&>cj@I76ixt_ zQ;CZflTc7Z&WC)GhpZG`3`_55Z;y5#9UBWdq9%LF*=#}i0$@Oe%JtijR&_9xdHLB}) zb?ftM(eMw@>V~8O{8h|h{M^(RfQuwNSRci%NM|+HumN!hnDp#M3y{OXk;ODebXK2RQ`CZsa%qeqWilW_#_3D044yEZQcv&ji5 zk6l+T?%o8{9hZ1}zA@_X?j>{-!tZA^^J;f)X9^8oep_2xS((kJ_JDi$?iFbr11|51 zqT_{UCIMFDUTxA|X$-x3|}RR;FNLVd>7G zjH*x8!YJfPxp9wMS`aFeOfmKL^mJMZY)DMCroRRz4fLN<{FGY1pPygt%&(t65rKzN zZs(s
    #d%5+3Uot483d5rb-D7;ovQJSuK!*6uhd%)r1Pglqg72(k4<>k4|HmklA;GT-0u2#f8oyQ~wX`(;KCn1RQFa8( zHA=4V#S1S72f^vGkL51zP=2_?m6Vma#LH>8A-_;O!)Z}nFed_tuof_FUH}FmiRqtT z-&Ks!`4jn@I5};A8r92T0+c-Aq@mD;gv{q^JR>y~)fLHe<*!~{XI$zEA*%XZRV7r% zBtZ`6YluKgMI}5kvd^XCsH`)n#()guZr~c%z2+XAk-tchsAPd5&newvwN$5sKPMv? z0fiE_!L^Ww!6K+0{3vx#R?F4;y8B+u1DB?R6~$trbA+EC^K_h zY)!hWc!oLP;#Y@{6v%d=n_*C8q$qhVWN7Fn926g)-vH55?v+yzB;721{5YrwealQEx&*SXkH~0pBfcZLy$Zf2fSo0gDAy zmY9JaFhxP-i*Qj5BU~F5^q*;kjt%I>N|<>gwf0;5u4($8(^683Dk`!vGu0)}MSTi7 z0eGA%cOSa_evF8V+P7{M0_z@Px5R(~b`#F&p{a9~X~XdQ_w+75&zsMmQ-lH!@Dv%Q z6B`pV_Wpg~-WK0@`yGf6n;LI1RTqbSrC&@PDizjk)c z^50WJp&B7w)a5ako&wl<&&5T{Al(R{OH)(R+rZ6T*d%~Oz#fJ_ZbzECb}U4YilFJzzvXc0kXP7qqz5m5#wg^n}ogX z5e2SdO!#SEl{`Hq1QQPNqten&XT!mcE0Ga}m6a^Cv=E;(WbD%)>h6-#A)u)PwT|I^ zjvtvTq&TN6)Okti&p&>M91rrm5pkHjch+26z+9zhWT##P)raG092&byd|o)gx$n)Zt7J%K1aOUsNzr;zHMgTD$;x zN_SX+P?8;ibr;&j#>I8dL`%Gyoo$1X13OG}VXnnTgqK&P{4+Rz~ zC8n$`uh4}=~Gyr)z`--CZ4S<7ponCc95L^uIO|j(!%BI@-p6% z!rhjhD6)KL)v4z}WliJB)*_~)EPw=mSOwW?Giw!EQ!4m@~cpG?EBm~eWRPUHMXo4^aVRzEYl`wnj9Et@Tc7Y5jz%^q*HeLJ zgCm)=x=@NDKD|tT_zOF5{#eXO~}h*`{f7CWatWqGk{eD687ui z;p)o*i@^CWv9YlovOLDy`SD4?b9EH#gQ?`#3Hn~u5;DsBH>SqlXQW`C|MKNM;I6v| zuXIjlWMt&YcnJbL6&8-1r4LU47S!Cl-**4^z%}X)^nzfOY+Y>6(zkDN0JIJ>&IlRT z^`Oy;OqwG5o|vAVo?P(FK#+G`x3c2aE7!L4_eZn_9v?Q<0>G%m5EoBY6<*cImD-Hr z2%KuW-vHeiC)ED_J|I&vA|lSm%7+;_IhAE)k-y#3jr8>=!1f3H5+b?)wipN;1Vuy; z*{jE4ggcS9sO3(O5WcsrUB4bW333O<52oH_Am#q`?V~u%4c>8D=&cd4hg=zL@~~Yq z;Xt7E*a3kaA8wBz>Bdr^!AN)qaxxdogCq<(DOL^-DUa&>>+%e{OkqEV^%3PT2SXas z01YDd^d>u*r$u8)J!Ot1m6xn{t1V%9d3i0M?+rrYSG*`FfJKcyKkkfyBTmlm!F4vq zO)v%ttl$rAQ6#bhFHkc`QGql@zQn%CkyhRbX4WWj7J{}or(3iaiP=v@g;>qe=-Q)| z%KBtLhQ01C7#AAShWm3HYZ`UBk{WvZ+v-?J`k}MT10W36)=NN@QpiaZ4bablxInF2 zvPZue7#aeZU5-JR4|~cLtoz97VoPtCnyxP{)}c17>J$aq{P%QBO-+YvD+U;h@kgMr z7ixYiB#U`cUHyIfIe$Ll!efB0kBf>zDwEtq_o065BR=5KTKr$EAF2Z;Z1{F}=v0 zjm5=cb$+8D8I+QeQh6z$**l=w4RlaFpN zunO_?x~`22ND=T?s%Mn*905^DA%8{4Z41;1^t!Vw%LzkaE1;iZLP&hcX>}xPr&(B7 z`g?kk$<_PdAZP*nZ9U>aZ7$;XVBp6G37WXK=Y65S0<{bjWN=_FlW!cmHg>0jVhy`( zuu#CjNx|ryla)32D~xb(UfSae8Quu6ry9}zuC8LRVNz35Bg5*htE(4Qhbp<_dHaIo zh`PvPXwfL`yM^p+w|%~AGo0Jx_sgM9P+?#`WWYWI`2$p|k1y}B9Dlu$h(|~$Dpl3l)tsun%E%s&1A8kFEVrtk1b zBL%(A&C83gGMdy?sIsJ_gz@2X^+7ax0n$EFpWOoE`UPNGZTY5r(INE43Dl;?Z@W=* zbh-sUdc?!nA|Eoww+}BMC0v9Dg7eYc$Mhl@`|x~m1}R9QcV0R% z8LJ{Nps!A?^qo8U)yl=i1>5$pMi(iD{n6|bXdCbEe9L+G5G?J1>Njud4G?<1#Ycmk z@S1@yz+Cah@;w)50Yg_9rm6+XMiq*3we-AOJF zt(s8k2`n9m1>d3ORi;}bQJUATak0=c|58Z;5?2?(fn>y9gW&Vo@z*gidG(E9AEJvl z0hXGPg~hztGsfvkEceBWI_BmbwYAB>%S59U?(Ya0e1E%!3xp84XdZ>3O} z!jcjmW7XKZknL-E44x={10hHrTjE|(!YWw0YV*V>ULJk>)(Q#&e)GFw=>)C*gI3|q_w&=Et! zKOjgs5P%uo2ZE$Wt;8)EMyS#rnU{wUJnff#s2vYUglb7a;`eZ;-B#*kN z0Uq9BXh$Sb&T308EG)e8Pzy_KcA0_3^8i8hpc^JSusySbG>niKb{tAgz%C{P7Qq=j zd^Bfo-bz*Dhw`602h;@^*d7jY~kdA+QJN@M zsB+gx42x1)Zvd$_7IXxckxQyVsO>KapkJ6Fs&uad*ByKJj;GQrZD}6evB^0IHs$NL zZyy1NMdIq51=Ztp$f=#z$gnOkQBl;-RchnU4_FD4R#)QoTA(2V`t5L;M$Uksjy#+; zMg*$1>l2fAZ!8^BD%W$>i^y$+B1o)?wn*o4quSFKcQX%TG z+muuX9k+o@F>4rsGu#=0ya>6FkA-$1nwkeX7XyMm%kn7j+n4A8)qvnnUwPuiD?cRw z$Q({Y3VCeTmpm43{|biAYF5eqp2(*|Jsf^!y2I9Ucc6yc>e9 z!1LrdK&muCk#ahCQ~{)crO%&L4d|3WeFH}maK-_GL^!6Aa162yO-&uGtvxoT#NaX$ zHT-XJadE&L=cWs(A}KlYfkYcfhr-c^Gwr~xLV=fLRd6wm5qKyU6%n?fDml;r2xj-- zAWi?DXKI_7RXuu?o}GPNl5;#0DqKLo5g>+Sa(7{F?yl+StSWbq&c)$GjmN`!W9L-G zJ$?!93-q=GczJujEGs)}{Fx{z^f5S>lq1Qw1hF1>c0O*V(gYRqjI89Cw7)Ovn|^4}x-J?7akPRqx-w z=hw>TWue-CaCmqKHCI(lEscC@2rlJ-(t}JV{kz&FSMdo6XQrnYr18}+{_T=M+#|z2 zk`NIYwfRXHe?Cn>X=}mN;540@qME?$xBZ2D?(wN>_CS|_kdS!j+k;#LTwp+u0d@vt z!3a3{?ErRmS#KH}!BwMI>E{Opl`f%$?a-n4NPT(jhbdbNZa?7Xi|Bs=YyoE}2r|!* zgQ>t|`uh8!(~+M`JLU;GF8nh!1USbI90z%jMZ3%bAQa((m~!1K87RF(3=+I=Kq!Ys zd#(STJHRI?UN=uq1Pa5cHLQ>#3*iPAqp;Z$SLw_(Ev-oqnB#AtEt32In8731@hO+F z^0VC|NU@>=kM5jz#ZY-kb;U+UXI^$;KMaB^6wM%5gD!XGU7-!!%NUrO%dg_*ji{{^ z1>F>%Q5oy4l9!i9rh6es*rEPHr*HZ5XKj}S)XDP^d5CM4Uk1LRYUQwx0s>fF7`A$B zeEjFuR&0EHxDoebW$vx*?V~1rkt7)F3pl_a z@pn7NIwhZXMZRxvG5<4lEp6>Fut9?3c%m3f{DFT8J55YZ8h)9lJ`+d{EW^^-xgE+8 z)Uz}ifl9c0BXtF>$d#G`x*vGXd{5R)!6CNYZ2-&2Co6jZ{Yr4}fc}GIdABTv3J3kq z`D5cV=UEv*iWe?C1ze$~sw%K8&p@FLnuP@yPy(?PNb%4}5D^mMWm%3&OM8b!AA&6? z282`U`aE@dR#p?-5L%0C1j51!8w+W1StVAOlha~tyaGwbRfZnRH~XZ7ZCB(f5U~6` zaYZnft12oeUtfC%hpq*Ms!%Y)!i^_)nTWLX^hdDc;cjtLge>Ebx1i=;mmG+J+Rh|y zldSJ;`6p-0mcy)F00Dwx0>xo`@WB1(=*o6(Uf$kz^7&HC*47prL%>Lb1ir}`8ImZB zMcpf52uab#@|=e`Irkyg7#dE>2kcKxO?93-fULQ!vb6#3Pf$M&ee)4I1Xy2E@)acR z4|K*`FiHKX$f|!2WgM{#tJ4JlmF$=7l0hbV_;4~y+!p)-17DY~`}#Jux69A{pm;{< z&AHTv$Jp->j+b@ zvX$?lby7}_sh!<9jl3x-p@O zyQdfchvLq_R+vtC9zVD?dc6 zL?sPYq(LnGVP-S36aeoF^Z=Gf&N$-cC({Np5y__6QosfE1QJ7ehFJ z!OIz|Mr(C-cf*aqo&{;^#c~ikK$^x1<((whu`d({f;mPFw7XjH-f1&!r7zAo#x|EEb+mN#cRg{^b`9n^deMMJ8ibkMFTQZKf__(mJ zhN80+<8E-&pH_(^~f_2QUDK&A&9+OL;&br*$&ox3B+A?1wI zDM1F*x_-TDSG|ybwxN*x$&{F zCeN(!S<$f8QnIo?K=k6{!&fHSM8o8uW}r}EXgC-iTm0w#%=;KF#PT!tBu{7!j*KV- z?Ei%JW(5^^1Yd!aW63){q^d+TXyV}Tu`(G+b)P&ZXsI3e(;Nh=cMv1=wl4By!ZgY_sq;pY}cgf6qejA}+86fO7$g&f=_k ziV);CBO@cs3RP4Z&CK6ugES=!q0CuX6-?Fax)2H;UNA6)j{ZGx3D2K!Dd?#`X`^qTO5zapIWirKSsez!xt8LKdhD0AiuZWYXwb z6ccj|u+dqK?ByRn3X+pC$4B?wb;7enAurIKH%Qih56JrW#a&C7@%0q0XS@4pf#|sMO$ksy2Bc$jz;^ z*ngjgPg_UlE!0kVRzDEG=RobMdUb{g(K#|gS@#$}H48$7^>|`zY(cqTiBd~TtD5~r z?*qUT@FoSYazWo2l!>XQa7#t}+__a)wnOPS;>~`jj$~wHM(p=4;pNO>Iq(x9i8BaJ z5s@EQd#tvMRTr$Dr3GmVzkAX72Dr>SrQy+ze{mf?g%ku`@P^vj;B;qeYuvCRNI0xy zTwI{SuW}*NZ-cY)JlXUhJdhos?hRUQv-dX{ET~b8nRx%6f<-d^D2{jvFN>LhL5)0e zd}1OZtY~=|$x0^hJT>(Ur1kJ{yt)uoFn0n^=B$J_T69Z7LtyHw=i2yJ>STPk zN+Gh0_3eQ0L?}}&SP&f_0CbjO)X{`a&E<<17nehv9sqj;3YVg93}!I>zho|`{9W69 zpFnw**t?>%!94O(7?5@dBp89B6cQ){QB3XgMrDX1q5*;|5)$CIXOH13pvs3l6z%Zl* zT};+arK!&ExW~}okJy0zp23%yt(KM+mk;$ZRmEqo7&gHf0W=Tpi8pWF6!Ab$>8a7P zMUZ@2n-|1V<4a1GAf*lnowkmH2t*B%$#A}$EL~xCT&TJG5C)ZUBGPOQ1jQ?x6aYeB<^TgZiZh4D;sA zA-HV~ZIQcHR&N1o0KdYzoH|2rlQ$VL?py%vUp)|j3In{w;?$cDSze3?A%P1Q^mTP* zeYbdj(d($8CZ<60F>d#ZqXgX;98nmGoI2cVxW2d*xYM}A<4;X5tMd%-s+U2`Gtkqg zDg>iWojzp%Z;GIWp@Urriwi6303f6Sw2hs6$_WxH=$l;)pFe*FRidkbgp#7_=g*(O zUlb)dvtY771T4W!_e8(4FOiLO$qCGDATL#$cd%bwaQBHr;L|fOJg%u3IZmhqFZIE} zkB&6`X>hd>k0nSo(Mbnkp+Cs9NV;cW(Iri+0;vFcCvQ7~g6Qbd0q)e8HElr)36c^x z$S&;RMqdCqVB_TLZ+KsW^*85fM#RTp94}~sJlOV}f+H7l1q0Ws;AIfHAdW#(BCHLo z1%jFZ-CGwa$#Us-)B>t=AC7-WJcE`)A;InbUbw zh+t9w)}t;&3XnJ8maRNlxuEMu$Hv0(%#^z?8GZ|_58x!iHWuLK7U)%-$1Mt@)^~caB*+(KZDe;}rD}eo=b3ug=w;2+ZkoX2m z2_)s)#s*k1fDV8(QFp-$h_~k!hZ{E-C(JJe`;?ccsHx>-X4d+KG_|zI%2Iy8is!77 zz!*~XBQoF}HB>~d4aHM{`~iSlJ|`&o|xwT@Bq3V|_CSqEH@#_reKRqZJ{|=nX5D-zsi=9&;tupI=Vt#ybhQi(7<~r zgp-p6AOTMc;ldfVuN*Wh~#>vwh>^^$P_zsg>%bq@{rmotKo%aI(lwPoDrlJSbQq zifY7@{S0zVihi$^qazEpcSEgo2`nhku_eU|1;0UEf;J#@auO2m%6RAyy@lKdIpB%` z9T9J3ObjuF50w=jYu{6o7jS;d$7X^=z4E?-`2r~0-{%8fn|R@9C|1LhrdFGWWy<>D z$tu{MJ;ZyB(X-+)3nH+?-Z%qq3>t)d{^wg#Wse^}gdUm!T^E=S;8jX)jbT)}^SAU( zO%EXNft?iY#T^^@2nS;>IRa!Di{T@fse)I9fao?r@C8`Z(A=E7uyA6PARai1q^|H( z5^)Js-D&d!?E{vUUDVP2DD{B&;zpE z%O(or^dJzAzz)v~gUE(dBZol1j?GJW(d{I2DZ`KAbmxKW4=-8KNy9o5(DN~|vC#M9 zt{j5=!${^c)x?>l0RV`O2oGuv=#tU$1MJ|v2as-{uMhXP;G#5>H#5W!_%7f^xhyRJ zg$jPDWCei=P#SglK*i?VVJKXZm+>*?zrjsEct-ujp_(sEmL60qutP94+=T~ttJ^_VI1lq1=Dtr z*6EW4!sr43N7|I?j|7(~)fXnsgKocYpfkP;Ui#m(Uv=_4{;U*l{>r$2${|Wg%4&L<#p5G^E)6(bKSlGyvz)Wj2)UfOj_|6BI4}>_0R_LGc6EX- zBqSto09o2h?~CUv1W|M+g0(c6+-Y!lIC3MzjWTd0l4=2}A?QNLbYfVw`QgS~^6=OOS5dNlg(U{l6^w%m;Pa}% zXEi0IE;tSYPZ)Qp5S?${JO#H02mw4SRR14aUjj{KyS{Ip=aNmvBobvFN*NkRMQDps zY$SweL^2O0GDJ}lnzZ+>HX2mQJQIp2k~wKI7NY*wtM7cjv;OOxwa!}KIiGjG@B6&Z zb3gZe-Pd(J);^evB6GbzE~xqYLqld9UXVCbUS7U2Kjwih--46e$Cv8IFXY1T=}BQ> z(D+$XtjVaii7ng)T($RslbVl;&MM+=EcAB(?eTqxMhv1TLH<0GO&N9f@Gy?Lb1-b@ zwG&9$^0Qx{=*B45d|T@sInWBIS>cz)^#GDV5d+)o%=4=gsMD98W+~Ehl`_CKj8so3 z9-L-gvDIF$Z^dty`FSp}3sHImP(*)%9u`d$cyfT{63P0&$A8y;&%eAZc+{vJ<_6q+ zcOm@8;JpBWqPJED;u36se}=9c1_<~Fp&4Bm5D_pD6OMnNlo7pp8yo1=gF(HdFn+`Dxgddxzf3{NWf-0dT2UmkWkxT_*7Tt2|__x6DMFp za42&`Bbx!k1In=cdmm)+DDf0%<4huD)zvZd*c}Z$VZx%Kq}G)rweak2AUm~C}{nLpxrJ2^QSfUEH!T9Q~X;bN$v^ry6s`S|$QlrAEXxb7nXslR1$ zCAwwlc7}JS4v;&A6KDih6>}pZ@xlrOy72tE!{}kRLSH+5>QRC-CqaS9o(99*rkGdc zDOUB)u-33%-lFNgb8B+9d#>=$6(rhOn#}hdW9Z9nROC+ZVntZ$m|^{`LCJR#5dgpW z*KL{E0a*$=BrmYZ}k^?biVstdLCPVws#nGSEpo$}9 zdG6LIk#jy#WA6j^7GyLv)WvH4(U*(%OV?GQQx-4l<0By?U+6l zg(QE$=g!2O@BG>H=ON4-f{q}Cn+J)nP(+(WdA=r#GOBgIsK`KGK4MzF5yAEj?S#{I zR#wyL5)>G*7DnhkoCZhV<~Hfe`)6Vsu20>O( zfFU}gw#g5>1k4%`lez6Dm*xJXlXKI4X{(;Bs}+)a3;k}`=;52M%6oc+<>jvfs?D$4 zhW%(A`jYlH6Rwp`0G-5~eD>r?5}u8Qpad8qjc(2p5o0PTB{lPi*Jqcv_ucd7EwDkq zHTr<&kE}m@;)0_Nf+PhnK?vD8NNj)hzX;mu6MHQ=CB@a-dxxz8_$%_~mZ;7STyU9| z)z&_a`pT8Oto1#ckcmo!OEuU%7nZud23@8TNh%s*`Nqpg1_mNRLOmZpn%d4BL?OA# zmM%*Z36o>@V*UO5x4HpA;yM~7FMT8N#J8@u*G&aUug^{7D$D70ZQr&{o+g5bn8aW( zqT63hB+_WB8kFr*Yee_|j^~t%5(6Y~Mf$FB6UbTcv#F(SLeL)ox(35US=t6)rH(@PA0d{sYnm*VKb}#oC^!Eh3Y_k%^PbJ0`K#P>F1_RY1dj z4X_pW5!=-U!qU=&x+q_HC3m2qiCLhCS0Hfr?eD7q;yZ$ApFTTrHIDA^^bIvCJ81f$FB!K{}zMOQtUymjlFU&1EV$zHFoXnBZC#RaUywo{MP zBmML@_5z?2@HgDN-u1F@@)VveWqIc$J zp8Qk34f2x?l-phT?_Wc-K*=OGf9Wg9V9wgkuBMgyTt2#0$ilbgE3?-UBVsOcIMCNM z2tD3 zsZ|yPb>lwtdvtTt%fvTG)4I})VjHOMM%zya3s(_Tfchtrr9-=`re&_(_%zRtrvV6f zcyHpdw7|L>X(_&U^NJ#uDm2~_gGnJlH6bpPM@2-CKFId~GHAXiHGBPw8=Xot2Z_Pw zPA1qW0NlO2RGtJK*vQ>3QNOKlC7u%3q>S6wBBHobD1HQQt&Z?RT3OuTZFafaGBmH) z`fIT(IsyK8pMmjI{y~RBUaNayrS{4A1UzPFj~-q05(11agAN5c-FN`|J$qnGnn?ac zJOfb?JU+a9rCl0v@y&gQ=&HE*2}*!Z@L|cI$3nD|0C*pG`DWWENCAGJuYqA)d8%0H z=KH8xmP5}r|KC+;)@_~G1j+A)cOYlLey2vcefy3bGKRt1ZEwmS_%3$y!869K>6w|k zH#bfmwC_}{o7!{XoI=;)mAdO49Y3IuNhIfC?X(~mudvMAjyrmJWn^Yr{JmPC{h6A* z?2luO{hp7N+7InmebLwEM%N^PVB$ad$~w5Q^PKUuIFgq8&MjLwFl|zvJEk~%FH74j zb(S#5=nXqzQ}|A`?$e$N*B5U497!o3KSq53vj4JEveC)OD{hw>U}3 zmwlShKjUL%(SBL-?-1ehZ9VFYp|wPR6Exq;^dog8C9;~D7yj!iBdKWKKP<*Ny3w@v zIT`n~_4kzRnEBJO?t7uqz5DT<*Uz>rzR)3*C;R-2oscL)Y^Rkm-F>leyu_*R=5(QF z?u$h?vwsN{UDYA4yyVNiW+f*v;qHmfnZoaZ9sAq}BE4JFPr(fZO-~BeHFO=lcItLl z%lav73_$ZD$tM!WxKa>AuNj6&(>N;MzMTOcY}dyB{!p=Gk`84y;y^@=Q?8p;tLcu# zr|d+Z-p))&NO(iLfU817Ltz=<(v}7G*Q-YM9HULUWj6)3Zh8R@hFPqOTp|oZB2L@*9ALXDu%|7+@lKiU`+hvp<`LP^cviaYOqGDnaB(!;GUu64* zm4Ll0)jzV_mfsvoAEc8Bikif)f90zI=<&d{jQhkQ^{~A2=fcv$K%F<078@12nZ1BwKD5o~BpF)|AWa#g8 zM?Sw%MYDu1kph?k1&YW&4?2PeRlDl(M`*jPcK%(zfi1cWzG^%(@z| z3?lmgf{jtEVlEdJ5hBM5Ys+7a zESGQ*qK|MWKD<`yenstc$=(9@2d43l*VB0{tPg`7^=@9?)u2p4Nl9t#S_xXTyn;d{ zKr!0W(yd<)s=dQYxwl_-4{MRu?*740*4s*`?fFS+Of(e?{%VA56fG6hUVo6K($mEs zU%L9gAFj5x7AbnUGH;E4WIfVb&~Gghcy*H?J@ca~Fol&6Y{ieyhR z_6QMU0~-+YRAn@3%9zXZfYG7ma3OORQs)ES=}^#v1iu4OX7%#x&?pm69L3fIyKPO^ z8X@`!)8WRPC8l=?E}Ux$)G@dmh;oTS1rzb59d335<<#-%I@1=8@zg>u6AhaZYOfxc zf{zdWA?~q9n?jIJta3I%$8t$^?+GA(YI5$CPS^U6gjeUr-6qs#t9I|tcioB=K$t4$ z8Un__QwaXO#eVb%sR0zST7+md^pA(=xvIskz1h^_9rv2~H;bQyZJls~(vySTS( z#*Q8PeguUv46-oK-;|a0K@>znwuO?FqB0E|K^SBSaac=;MvU14qejDK0y2R(sdY={ z>yUM4U7ZJPOmP{=2AFBQ_{9X^pD1#y*czXVD%PtUxrTuKUMjomzPzFcJQ7$jv97*9@;PH0f$>Z@_L(CApZLEY3J*>ot+xDi zAc*Q^D5ucgUArBy=)`cd-1MiFHn)08#Ih<^LbC}l50Vu=RjI;VCMGP4Se~&=I7#UF zI!{ZZFdj`tKZk&1nk_tb5q`sPgIJHTXKi~7t}VdY`eGgj z&PSZHoSS18qoTKZxE5Y}3k$~hPeWZD4~^ZpO5Po>&GKBIF0puc`X|)#w0C9XuT8Iu zxFf>2=Csn31ZoN)xOlLkd5zl!w0s2Ps$ajpFvArutXGZY=@bCCWpq8NLZCqGL6I6r zXeC51uwFG)V!bOjA#BU}5m{2$APRzw?f`2UL6DXBUIikiS=qx&+3vQh$|l<+3LDGD zQ`KLrcggO@+C1{>55cXxOH-3B`rS+?>Wb|}{k zRX900HM3RvpH;EG*h{m$i`89f5h|^Fz2I#;A1L>cEQ~+B!{z7M4`69#rL1x6-op`R zgLIXA_a*m2+)fKryKK32YbkXP_P|DbMr^rxp6(;<_XXE)qIZkw~RgrG}0swyWF`>KNm z<2K$$?7nT$_m%D0mPOL^h1--^LD4WT9@yDjdEdU13o%b^3Pz6oeSHk-5)El%$PrlA z-~aN(OHxe+;8gZFageJ3YNv zbvi_Z23NGbrUUPbncu$}(74MrBOCSHWFxZ41`5Cy_mz}Cjq&c{fmU>_{9<$R7l?0Adno~x_=nGfhSK(!aY@ETWz z<&pDma%yV^-hUjRv0a;_z@g$LJJK=;VcGKKT?h!A`T3CkWh5t;IfTEFL0>s6dd;>s zDrHT10Xv0tKEV*8Vf~Se^1TJQ^;Y$Qzuu>Tv@kz=oL(p0ZEj(4@dG2v@Sj^}Ntbm9 zFRbOY?;6dr50~&hJjJ{i^RLN!k=wxN8x@JKR{ejc#wqypL`AXNwwYAPA48>%_SqTo zMph|r;KaxW`$MBKLE;~Azve8`KDXsm>pyo0h4}>ZV;nRp0>)bCK0P`gsoJuKB5}R- zbLUV@`MbjpcBF0SxofZW?s^rG#>L#>L=NjYd4^p)p?T}JZ3P7dVFNL%^22u}Yo=5HH$qR)>L`QUb7KV!%#b&yW zw}fpJEbr4+KPLU}5eAasQ^l%BO{$sr6k|{2H+YepH<`?>@RAq8U({)RXPnIqP!fbLW({(Qp)X)y=W#TQoJCBOe z0sEd~qyS;i3&hO7X=IVhI?uW9l$*X+0z<(tK-Qi|WzmrK+lk{P&>EnS)%;JLf@;z! zl|7?9I9#@)Bw*yB$Lk>gdUj-H@dQ1bSrZY)Zp*&W**OPovn3JIFAo_S3wiYzOaXRT zv~=k?vS{MinFuWGufQB>COK%5?lIV27w}b)E1W;$b~nK2cDjAU-#-J;j?O2AYzDi9 zH;{SEw{7P5_XptzX9!b7IyE%TRFc4(kjdDIl92nNlC7rh(Yrs-X3PkiXx)orKllO} z3vVJMCie0B_XKj7A38P|4h&^asOP_b+KHAc`Z#~zI;*n&0KW;+U#+zYHUD|Q{dlv- zk9BRyMpg0xXh(X!p`Ru9`T?~@10F5XzEGZjf9)BF3-C->xO0mWsIo~(VdP#UYatl& zMKtA}q92RcN;zKIdp$p#OMzo3De8s z(~xdyhMonTDJODbWK2wfL1+Enr<^rg4=YHx5IK>>T@7+5$QaR|t)|L`?Y9JQemy70 zS5{^=7sIpo%m(Wws8j%u+L1ZL6Wk#~nL=jAP~HXM;n%NU3-a@Qdk#%n{o)Q+5<0z5 zpCJo#q$@|nnQ9?HD+VXpPE^h1fYa3f{Z%I1J}_SyRN@(Zkr<)yaUqwK_;PZrSDP$l zX8-s1y0Ik!>O4z6fLRfZy=oWDmY-I(0-F<-vZveKH>Q{vIYyI7fpEazLu|&WNZ3}; z@7_f*d7exm5Msc4PE)-9zRzLklR$H18)Q!?-|1G& zUY<=dcR2599(tp)@H*Ss*w|nv%t{MCh$(=szs)QM`QJZ$j7kRBH-#8cprUc&DyI1+ zE+8y|ddX=!W%Hi_fA_d;5v66E$vNfjfDagR<9PY z{th~sUKT6%n*%dHkbtNsB_<+A*iDa(#7m%`wjp4AlU32l@6xTmL7`NNWiuXLDkF2v z`ldNN5~Vqh^E8?hY5Nj%_{$|^@MaT&}&7DBU zn{=c9ytuIthS??N&K(aElkgm_s_WBMFOfz(Szo^5Bf30bbXO8DvuO*MQM=YJl3#*U z`5u71iK5AH z71`GIA}laOruYl@p~hI4(Mh03spD8IdTb(+3s9k;Ocmth3U_J*_ftwz5{PcZB$fq` zJh>!Jr?kpjx?8K{HQ*6eH*OKoJ25wNv?d-B21!}2aCStO@zK$mKMpzsvk5F6`iKmC z%!h59wPmnT^DG8J?U%ZcwpfWC8K;T5HZ`tcFu%V9ZFF;{EdR^S}~bUL?4D^dUrmpc1ajop5&sq{oEC#r5HsOE(Wk$3svs0cR8SFc}MJpj5`Kb+r}W zlCXTCw?0pvw?VfSOOHYfc3(djP3V~0rShm*#5|=jvrk|`#^yR(v zFpr$qH{!r;{17C7%s7!vV3k=9eZ1Q3HG>LVc^48B;Yx54%3{f#TL73sFBeLle_iP3 zqLVO)&y#>vfmD|LcVB3vUdZnvXwATS!RLufM!jLY#b|#|D9^jcheIHn!)L_{Af0d` z9x#V(ivd+y@&X^?{x!A8mvRo#nh%*S)L|m5K$-j-YCj*P0I6aFtgXOG%SAtr# zggP({{{uwg(qI^iJ%Ys`=q7pTA&Iif%K=mp+-soCz;b)i_GBFCT|ToT0Ccd85a8-`93&ym=h}di|o!#jDRA_Q7Zsqw$5!Ota|PTWiua2D11f8 zQK?hlfR+S8FvsiRL7_0umtyK-OeIciLrxB)|3RG7w&oQtfM|t8h1I-#`8z}gBzLrp z#<$F2PR8Cf(9)VHRzp>j&Evlc1}{T&qrtk=`c*rjG^$i;hWTz~o2WRHUw!unU=l5M zm&Il0j4rs0C2LHsFp! zFvZ~Sh)2tk5j(nYs&K3BfSs`Y{QW5{I zLceCq$Q$18pK3pdK+N2}5mD6pRw_QQskc(fpQq`ng!4-F;nCmYM`N+DmDd_a@rW+I zj@EkW{Z54V%J0{}!RzveuQGLbE9$S^YloO%>l=EKzqshsPXV2NOnZiR&phKH^5)QP zBMe~AwWx~^@UuuBGLX;4<>BN#!=e|hSVdubBo;45htnHOHhI?3UugRr%Mz4YTQO7{ zG6lUf6}7(IAp3BV!;2vCzcUP|gH}z($G$-X!0oK3QP~7^HVTP~-s~t8t3mK?(N!ay zqFT85j^u2tf&Hbz^5w|u5ZDCw5biSNx$|g|6=n=D)rWc7069Xdq*Q1WM7Kh=_7Y1Y zOI}(L)5iT~>I*?9g=q4%vNN*^g9~9g#pi?N(==4ax!dUV z_o1O^^8PGNvzvUA+0e_i5pk@Nu3kl<7}D9%A&DZjy28@Si~jK86zmboC+5YR zj`W=hMn!_QT+*$_m55g_um zL^n@PRh55XWL9BgPI6UDQnLW(jm4YLS@;@727xOB$socj>>sPu_jkZ_2+}=VT2~j_ z*cn;tUr`4dzx=Xg40E9z1%3UuRaMcA>#a;UW`AMA3Gnb}^qh{yJd@G(Tx=VVjSqq_ zR_3_@`HnfD8ZaGfxlI}>Dl4%C4ThY|xAQ4}aqN>d5-~Ylzfeblb_=%v`gr)AJ1dt~ zEA$Jm0^dL_qgvVcOon}d+tl|DGG_rGnZ`0fZ_X9hfo#Dq^kmjHPo)W(UEZ=QoV$rf zL|6uIDTW*_qz@jQH%RlbvB|5{m=G-MYiq5P6!c)WbokIA_=(s{s<9F592_{opoa92 z$oCw?7qWy^2!;<)PU6njkR`3v)2sPj$Ir{V%JD_fx2B2D2_R9KRT1I`H6iTCw#R(B z!CF{`13dxChmm{mrSoyqt5*bJ8k~cXj=X-PE5JP+ zk&hrA@l05JMw(UL6W6#-cZSVi-O82RwAqive|{G{dbE&rZi>5q|1eNb;wwN=m=A+n zs60=eIC0PVCi1AQ*dQsWMfnSJv(KJ6<9p=d|?j-qLagq}xKIqk}oh`~@nGTqJ(X+~j&@!LEX&O!k%WdW{GbjZbB%VDnT_}FLP zLPiTW=La=APkvq$xgTzh?$8JKZHp${ZX9ZS;Z@i0=FJa$LHMR4J>nl9c45 z+#Y}%w5+)ORxCtQNa<$|#lw2TkDJx+(<=oC*-h5gfe8d{{>QQk0 zfU{6iWp9}H_RK9x*WuUwSCs1@@BB-NVs`6dV zsvP_bL0%k$wkfcMHR&3(NxSY?Z~jTWw+^WrV5k=*AI-pp086o2c?~F=&yc(P{eEG; zWsi9ixfd%PA~`o$yYO;H;{X*3lFdn9k+2T%<&o>~uL~%}(gET11#(|WAri5f9zR~G zyas2JKzqZt@Ho2h656k3c@!t(N{*x79~L9cL7Y>Cl#8(yfw!{LoCI$v2Pe(1d6}UW znV@omNAG9kkFyP4;NRN~MuAfYe=p&`zlJvkmThSJ7GAU5Bp8VL3vu$*5&oVu*sEjj z=c|Tf1>oMbt5@S$%lh$S(NBdV=2K>nmbl>s_B3&DMew=z^{x>hEw1@`WUwwQyN}73 zbOw1OLJ*=-Z>TIKBs=OT4p)V|Uu5C?cR@A_P0$^?12JmxoLqc-_}`Pbi(ja$zoNEw z8;H?*i$a&wAOwTgaGt!Mgoa{0_X@-j{z)I?XXnT#26Qu_RC%tk*z#8Ksh{VCwXce; zUcY{Ro%qOy()|dFN(COTS3Efa8hHl;2||=L8-)pFF}M|c8m|l9(9s$~`H5gk@-RLZ zxsaz{K?W8h@iD(y^EEMgUy9V=tmN|$2igqxL6JwJOaTIdZsZ{LB_sf>Yt z=)yorqaOIW-{fYUKe}=~ht15)GQFg&?c6xlAL$2n%O5lcuoU7kp4II2@PctMLCD+aGj87RSeMms&nJ)Gn|Di!iM{Xr;DvNm*I=U}OYasVexF=(;UC{m~3`Jjg8b z>Ugo*TxaN_;t9i_+Gv+fXqw*9$b^s3^j>T)25;v^P?<>~RqFDGibH&zK5Sis2uOWm z4Ezpc4h*MA89r8=P|wRpAl z4K5|(*c#|_`&T!pY=~|5C%R3%@M1Z7X$(7iedCtYG0Y~`W4%o~P0Zp@i{KYx`|Pc5 z;&kE>$Zin+zc?CRHm#Cpw!PmLpB@Q+Mutsxqk-IBT6H!k8t2>$nR@X&sCQueKX>U-hh2Cum@ojO92k&s|3#QK>r)j zwJ0eqZTRcg_yrIx6VT5oppmKUo^c;Bu>tQ#9w1o^p7u6CdVm)0XiHaD5L``=&W8_T zt5Rpp0*)`1{Qe}EP1{FD-1ci3z;4Diz3zvkv$$T4(`u;{PO;H zfd~OqXo8;$YXt_ebP=|81Yv1vA5rrf?IL7?#br&ZXc7tjGM%sSzrn<}K|@0W9qyTU zQ+f1VPGX~*yYCYr*Mbgh8uQLzS#<=L%JIy4gSVSLGm>z`!y43^CylhDt=83l+8-IW zW%u+G!q5!abP1IQKWPN=BcW|<3vX`mpYFw8uV9`cRC#JA*O&&f(;v6bM)FP0NNBl- zBE+r_eDG?~khxrc5(|=6WXyuLye5mQSYe<6huK^S6XD47P+G$#M%^;)tkiJmBli{- zT2WR@1kKgJ+6fIr0?YF>K2zxr+j-v80q;^|3(>0YY;5$#tLVvESY+tIeDxrGoaLAh z@~eeuU>1f?Uw?nDz*MD*P>-WTg5fH*kl_XtTEJ!_$Soo=GWXw?i#~mwWz71cNib>5 zEDT)oso@q@8arWQXp#@z3U4O9U@E%tXzXG7IUdCW5#5HT_rg&-!nRHQ18qzCAp*}{-0?Y;{CT4q3w*xng5*z5F3tJ2}g;i8n|3XK|S-oCnmm+Fn zyl-!4TG*dJOlYidG}W+^mr*@y{FjG=ZFKALpyZNTZRzml#eXrhJNh4g{P>Ea*KcFN z^@i2}-G^apJ+f5bUTb$Yee|IjTtXXEvINP929s4zc6D)?~{;yW8mXiO@xe zSq9)H{=LWcYa67_ueWW>*`UvDQj~kY6D9UMkufWC_c+>2Iet!s4B2ziR!u|tECUtN z0vkhh87)kGh0hyH&{9l>GiYPJC#+vqyL;vK`w_54-*D`&9>oB zEe4o)>L^^`VMKhKm_+5BGz6tp_d8KMhxZcaoV-w8t`7@mSfnA$u{K%|RTt5Ulfr4t zYH-m1_qvc@Uv*~=1<0*|SMUA%=gbm;M}jZGOq)H36d$=LdKCyF%{K{`aEFi8Mi2cPCFW}+L0iB{$B*?y0| z9;~S3YvF{L|I8U6u)nAecAYtYK00IxZ59R!gMb9=$h_hS#{ddl-*WQxg)t%PD0OM* zpWM%(_Ww{6KqzQ|eC)Ba18u1Hl{E#)GvK3gYGxP*=jE#ljT1cg@~DW2a@2MUEfW)} zS{3U>8<@#Kn}Q>|cjxXbt*Ag{CM=dJw8vqf{VEb3qk;&6OOmu0G=9%+WBjAs4IUQ* zJ_IP}+MKaomm9pHqyg0juFRkw1WW;;&)L7%;I-hazlvzT;9WQO1F5D$G&``5lL)N0 zPG0&XpryCR!EPCTA9M$>!!a%;*<&bo_^PHugts&yUqt5aKDxJNpvpzAoaDesf~ylk zVjlG%T1tYA0=B&2ai-Sri16rOP_Sd~t}4KcgU78(c;Xl^G?e`g+oq$`GZB`+1eG}Z znF$#eY=wnvry9V4g~nik43rF&^8%nq`~>T~RM!uos`w@QoO~#8)uel$mHIw?y3^tn zpFyBdsy=UtAweWPXlTD^cNIb6>5Yz2^ZBhYsl^;~KvPTwA(eA^JmkS(5MWrqmmnyL ze}@GyGS&JfPksAr@|aMd30GCb3T|x!*a1PWA_!|{&EGnXy=ytC3%F7X6ASnpXu?2orZJ|apWwcrDq@&7o? zI-snNpu?fr%+1GlLpb3KNbFRY3)oI=hk^hoUHHOZ#$$;E1_S`!cTi9iPgqXz(C2eC z;P{C21W;!+rm*^w`n~Dkg<1ClWr8RYHRSGE!1U_F5(y-I-yS1uZ+TS9w4V%|=h4GN zj0DF-AYbkxy+pzPe$q40a`Nz$Q8xgYKTed9>#!uuFiU+tya1-|o0@@W8X-R1tS#+F z5a(e8MITvo_xsJ4^8HE6;mF{1Z`zOeqvXh&gK8L~3;^Jbnd_I*W?jenh=VGt7k-j( z_(Na`{pTl>BgMZlO#Sw0NdFGo$Yc>pKCOY1iIA()^8w3;LkN=p>DR)|*}~&uLQt#} zz#0s9#(5*y=uj5nv6dr9;y6^=Ob;=rTx{Zkf7saBjr&~4*RYQR8ssCGrb)8@;RsAD zd{ZF+V!uDNT(3rOU{K*Cp>ZrdI|eret_Kn#`WD2P3x>(|_sXnUb02TuLOzWC?IWTt zKEN-Yz=moLB!CfY9DY5A3e7Dvq*;us$_?Qfi5_z$wY#GzK(qeNlN1Eg9q5|@;mMoT z{=XlE`dGD_jj9bQ91lN#rSc(so3q!heLxKV=kF5E6Esjrlu>-3%+Xt6QR6>d-PI-e z!@zbby0|z5$g!TF8l=YTx|@9QBFCZm(Q-kA3|1*ygq;)a{%b7oPEzyAuD4V46a zOvI;Lp!;1Wz8td4=T3ho!qqV}L(1W-)6fuSg|vgC(GlR!U{(M3?=nI{&;#{;{mS1N z06yxL!yp|HWJU7Vf5?jHlVI?%KR_N-u8l#O4z!R{E z%-lCR*FZ``_@cAy<=v|Xy8+laO79tE*}eN|5|#%J`=Ra3E<>)4mc5amuWzV3Xua8D zwRB#f1$>*_ccdkZ9woqvFbkvEf|7luiSn8@;8fIbqBhAjst zrwbVau$)(mjG10VWx+gsQ>BUXQ#+W355aGiFM1{1YhtV9KVqBQ$tPhuB(If)qM9Hu z9&o42X+dgn-*!4M6^6d2!-s$FRd2=e}>U$@63+5eF5VUIBE<_4-e5ZsX%8ww2bc^0bpX80pBPchxC=h zmYG#=X2jkxBzty;@~B}SkA`&STjbTpo*?>w^F)%8iYMV8nGf>KwSD|Lats5L+SOKNe50^r_Q!0_j1hChDXo#(vy2km-%L&(+@nwm#3m(@&^ z9STPQtBSYO*4{yeAQZ03DadNd4CwFdD0%cVvXZ0^r|wQispxKP3#kxwH85b^cX5GQ za9GRx-6Vi3P?$8NYhQr@HQeD$X17c9UUhL7*hQ}ht_MA-D{ftNgyurZdA8Rnt@fQiQOuk zt2DXt2C$IU6Xb}I7@}=Xv;B&_Q!k4fd({D) z%iTQewD4$R{psp1Tja!%y}h(n%fuuU0x>dkYH(L--$S08-cPCItnJ7Mi=IDECp(#0 z4cBXDV)l?+QBx&zuPnQj?)D@wxZn6^QvDtKf?Hiom;izt9tRI{enuTm&Lah7CnQ(` zPWt}-*(ID$_FoT(?Hs#4(r>1R_mCypwFzO^@&Qv|$y5G$IM@(`MUQtLE=IBKaWQ;M zt@8~)1X#$D+RKj^88H>yqw4HyR7NO>Nl<%w-IdAx7|w1*X31prC&@>fBTm> z=}_b^{JRvV3q`&4h;>Y>^tsSFXPQ9-d5H6xXRmr)&WG=&nG)R-$&c$l=+MGE#wLQu zjAUA)zS$W8NuyqE^&K*8Nx_%TpZ9L(c<=~qm#`iCkmU|z_A}PnM0>nOth^sA>Yf!5 z9-eXaYPJ<&Qj@f7^9qZM8ahk7wih>@B?|S6z{`r^*y1v+*W;`Hj4FUG=3Kn?o!RIf zH%V3trX9sW@50eRm-2_Vpu;=)GJh%zaF+3T~Q6mJ(hasW0%oy`u9JS zoDtJ-&)X{L?AssqjXjPlU@03Z19L#iFj$f{OF`>K?MoFk8XM-4nvki(o+2;Cd@Hf7 z0HZK~<_-<$Inaj5)Lk7XEZMn=0>vnl^rpw)5eJ-Mlx5NG;M>(HAoctyMU@G+8LsV0khCO{W$k5`+1PMDP4 z{-?J`l}2Ne00i@>L>7;e$~Sm+ryEyo9Oe!q3C=~e+(lRN+wJJc?XavvN@_c`5w+w( z4om#K+drt$h**t3*Lpe0{;)xy6RhL_U?frWx+N>M|H1NcsT}C=}04Yp6RIBu0>^#kj zOf;pPkYK^afnXl|!F|9(KyR*!8tjg!e7U~r3+9FfzVo41H@Iz!6AkqrM#RM!aW(sc zGYWHNRu-1&AVV!fM!;uz#h}?qoVNG{&#jk5yb~D1y3q2MkBE&c-iA&~h>KZ5kf~gX zBo0GCd#e;CY?Vvb2Wr_)89@ubfMy`pid2LDg8qSBYPOdCL!;k1mf=o9x5fr)GpRnW zZk(O1J-XS{%#6!$T@ZGB2mZU*EG_;+Arq%2+t>heYniN#RG&bH7F%lHp0YKbBRXE0 zfJJ6?qtBc}=)oDL6tZCG^Tun2GPFIQtNFoGFzZ@4S=$cFaJr|2&@HgrZ?#G;t3V@=$ueb_AN=vV3V`%X#EPUOrXC% zRCW@a6*E$^z}mV`mu35j&2EM3N}>kMa7SKYqM);X(v!4ji^; zu(#U{UIsuEQBEQ6#jw2m57jK<04^DJvVUB91i6xqTLVc_NECA?rk4xiLqG<|0xPMH zFrzX68tejm{)s95?=_CZVe(&ld%>yakrd)i?14zku8kG+E^E!P>$h-;3@Ceu*Usb% zfNuPxpzC;M8%g$0b!bAj6p~2!oLsw9KHj(UAUxL!|<6cq-kKc<*IecRS%G z2W}-=WR=XNtb6bM=KtwHIdC8~GxI#z8}n}i4vB*Uj9r@nurU>PtH;?4oTCER#n-4q z5|{!As(5jtF{=*o6IQ>audgqri0wmjd zon0F(H<`huXi&?#f9B^Ke#M;ZE&_-D_40i@2OvI0%x6uASD*NjZl8wCtN&9L2LfK4!F zoK7FNH-)YV=+b$zMHoi~lHtxvkCVqp?C2ZKD7H1L6`yT_gSBZ@|g@6N&TPzs| zA8fUnSmyFowqKnG`uW7Pv@@ID1E!4RRy=+spwRS_rf*p`^1H4~wtB*u7(}!@>QYyO zEv4`=!J&WXvBf*c8Y!^7KBuyJY2X7^YSJ*?u2a;z$3A-KR&*0`SKem zx`C}#GH+zPf(fdPA;K2-s#f}VSX{M|nYp>=hZpNbp6tL)1TxycBCR|IHRPYW+0lbY zVlfgik!dY7{#SQb75n34HLdl7ROd^+d&tkl|O7HLA8z>C48`4eX{> zE{l!cp}!6Eey`O4G5=(Tulp3A{`Clz713Q_E+?`^d_hX8jovkt7(9(#u4D0r%K>7Z zs>>BWUgGC2>#3-!GI<{@ah~<*7@Ejn0Sp!!x9%({hBt#F{fPO_oy`Q}j;iTuP{k5= zspV7#Oi5ywsJ?^drkqVq4zwZolGtJr!9uW-r->UM{82$c|7fcFQJ!31t{s{lMco`SPrpVt<6jf!V{=e&il9prgl*fhHp- zFv{yXiIgIq{0)a1=Vbcq$D~>Uv4h^VpW(8Tjo=q3Lu~dUC_qw83yFkJYi`npmqU36 zTXU@t|I3w65-=W=u6BdqvAgsV=aO|ks#G@SN`<)H(b2K$IGejc3EEefs3l(?G)my$ zMFzH7`jKjYcf0R7oF%U&Ziz7?lqBXt;RC3?K`C@qF=bR;xN>DFj8g6vXLn0*R?*u# zB|*mb2g#Ry1Z?;`rmbb=4=mWS*FoFJc<_L&;EuzS{KR<9&|ZNDFK7K?@T`QN^$Mb4<~}xXNV{^x-Z2IgyEH6B1(fpMca8NHvOb7iVW269KkfB+(0B zc?TFGI=_BKO|4Y&wvdy$pbUXR!%LGSej^Uu4MbWz1BFSt0P_k?)&_4EDUa7W0g-0+ zF$i$%mHKG5q)iW~Rp6pc%|VC!O&NW}rxw z>1G#oG;@NB#c!Fdr7iCY;DkBe)$H0dTe6qbGxLuNNh;f;+i6 z`;0F^obmH(dCeXWnYrIiwi+H|AuG&rA^ftYx5GX@_w@J%v2Dns>=MHn3%IP5;4LmJBd1`D{SB@q?sVkR@PoNu zYoG`5m9*L_P#Xjh z5n6@`UJjt}=R21+2}$6H;H&7V&4FM@Ko062!eU|snR}*C5h=gr_vZqErM%(9vyiLPvUA>onD`M?=vIQE`u>Pv%= z-(B$2_+VL#oly!Cx&1@^buRRFg@@xdDoRu>L(vT8mk#_4iz9cO2lp`&mGG&l5q1Tn zB>divuCA`c=?2crj*VpB&QQX^G!ckgSF{h=qP7Kvtp!OH<}(4u{$V8L{XHtzqPtqp zrHVM~#EEUVkwXV*E@t9Pp8Luwq3%=? z3imlD@=+9%xe4c7v5ku zB~4Oy-h}fLY_$gx41aeJZJ^_#+ZzaWoQXdr^4fwwK&6^Vl8<>mLh>5;{3bj=Er<)OaL`A1UkIP+uHUIS}40?Nl zqS)O8$u0hvg3@H(r*6v#GVVqJvu~BuC2n_;Fz1hTc}GIH%TY?3*v` z$04|)JNjDh*sK-sOn-cS$dEZ#5Q{$vYY-s(5?Z8Q*hYdL@2-K>e)3C4X|3imHo=DE zQkCMssXC+pryb?sQoeHK*57%^(Z&y28Mn`$&&KovCdx{iMG8Vf?}a#|&X(IMDK+&W zY=qEwM|F#irNht8quc}rxwJAttt-q}@aQX~=Pa$_L1LnGa%?} z^PA-$JyeSzLH&S3oYPLrYuQcX<;><)1>z@?hq!s7-=-lPt$}|7y{-1@tAZpF`R<;! zh6cVDw-N8b7sX~wwYnbt?dV3R&u-!vMIh+NvXHbcbaKtPMDgI@14Qc~a|d2jK{44C zdN4E~lmgFZ;+XKBjTkC$T@9{?9SGYDtd5^2;`6TDoy=PdM?sBzSeP+{R*nS>@@at) z82Bfre?d1om1oX{y*Lg~CUOK_>=wY)wJMVMde)_8K}QN2$OjdPOc@$jtPiP{yDl#@>&07Yi$Fq>~JD(&AwuukNBJm^o?{ zVR-^^{=VEMCZRt|>|(~Gr|VytV9AiLZ{e@rZ;aMVIxM7R7Ek#3H_lEqIRE{Y<>KhT_m~Ez(%-wMRxtI7Zy}D&Dv^ z)E0Qp%dW1Bk9X>7{o@v|f3ADUsTM00%5WrgcHsWP5*}GfpGX(zRd(3wOqP{`m`yuh zWXJS+w5P9uJhrq`+8Haqg5uaprIkM_MM%=q~HSyoT>&6op<{^sR0AQ z-N$g`5)EJ;RFTzUWiF_c(U3b(m!huo{mHRUA{SfBdQ}zixg*{%(E_96s?Eaos~N88 zmL2EC{aDxUC<))b+h(MyR7@@CIm_>YlPx+fx=W` zjG@0NsjcOvMFzuRU=vu-+3Hu}8~w{>Cc_uYMJ*GX15w5zxOyFRaF7%bazOK2r+Wnl zITBBRbm0#A%!W2uOI6XKi9LVb2MHePbp*GpU!ScX^q|IRJ|nZF?dp-8s`aU>+VQB8 zvV~P2K3tpld9VP{!~YH{RLy6qrTRVUU}Yu1&kBK+zjGMeNVpPU5#T85qZo{`AR7l{ zuIR3Spm>gz?WCIS%F!UhrL5u!V=Ue|L9xffSINf1>kNE_Uz49E0Oa+leFt9^;NIeu z)|-OG(t~t@No+WibsGJ#3zxKHcWP2Pr;CTZca``;QP&MtD$=O~ICcn3hURO z#_J#r1Y|*+u_>^W3vjQ(HH>Rma(X&<2)2)=NbpM8vxyM&;vVzA%+xaG@O4j5et$V} z^!gD*uuF-FiBL|^MJ^L>hkyVc#rDfuXKA-r6|#so0Wj{BkMnPyFGM?F1}sk5Nr>0q zb#$oRcEtSF1&bGVL44ui*n)j^etJya<^}#?rxykWsU7OW=U9rs4iHk2qCEkEcK10+TtBCO$C4!K@^rxYU* z5OL_Y;o%OnDu(*Z!N@dX-Z=8^;b)L$Sr;g&b>Oj;nvRmD_rj)yk&dT*bKfxpTgfQD zEKK$?SH8tgJI(c`4OJ+`!yjsi5qRLXaQ<*>k8-4OD-fzCb$Hj`|A#@Y+bDG10! z_lp*UB)SMwg+oM|#`YHUfmi#>*#I~qw7P5imyBQaMVo-DR87g!wmR)$nz&lF+Jtai%#&D~ z2kusGlc2U7m_D<5ZJ8|W9`;$u73Lt)aRi-K#he_U{AA<4fnlDjfC1jH;ROm!_!nbL zM1Ic?&%`TQ{z$x)kRaI448LPmP1}uC1zvA8rinu?HU7AO?Rs<@%UpYaW86XH{^Q>P z?hFAAL6~$JwlUM;V^KFSC`$A?R>^l4wP>0Qd%ryjZ@IT^D^7|x=wXLCKE8&HVA#H7 z+e=dtdCK~n6Y>?-4LRE|N=6T9|1{h~cXCXA##ncwdUVf1@yDO`Kq9-Ke04Y9D-vED|=k^hY!WgV*PK?*;EOcXw;26 zwNj!9nG!!Q08xQmvT|}^GbYhU>W$Lze<;UBej_-ejFU;&aI{f6M|M>yk7>sZYWZ|^ zyna1_?NU$0tCiG*P>(6VZZ&kZS}iVO5ZSkS3)FcUD@rr=Ubv>^^3B|+N)x9kOb_?< zvD6cO8Ln;@6rY9jzhRLy#;vu`@F8k&sfE#a%29jXQ`P7mmKztHH2DRd8DFZS4cJVK=%XhK}Z$MDY;% zscdd7OR#3MAjN1(*Cb3O7<|vd#hK*#p^yzjVmd89jV>p5zf!|ieQ*_qT+kJ)Pgz;6 z5+PUm;x5n|l}oF3<4`rG*&Z;U7y%7pbvX4oCHtFjOz7a!xxUo^kdO?e&E2sWs8!*V zu-UzPw>$sl`83r9Hntm=wb=#~KNs&9trju*! zz`LFI5kXFl%~=K-2sSoEG8&8Y-+ekw{m>H7j7O`$9 zyLs8BVh(Jv9eyWIF8JcK5-1p~JSHbo29!*NJxEQM!Gxv! z*A)Un^Z>NeL89Rs|8aE=Ut}HD$$8jqQ;%&mGjqp;LtYs_z)wTBPt=N~Aewd59 zzo%zsPsu!TD9ofCK&+Tq5q-aee%?;N8L#?)o?ur(=?IRYZHE5`64RxqM=Q0oCePI9 z!-#cGOsmfr;*(Y+&sE`IwoG@dVubwpjiLnZZp7VDCPoL&s|rF(OT)itRse6J9H6^z z2bZ48*+T}A5)iQW3ejXH0d2ugmh$&9VEf5IgSFrvB6#4iodVdt5X?kI3o!Hm9)k+t zQ+W>`9?<;Bc9^&gKpH9}gSM3oXt>z5mcFe*E*ipmuLW;IAJcj<&TNZaH3p<<6%LV`ZCgoaz;t{|udQbr<-h|3j zB%Y2Un?}*r+1ZI*SN+1=BEFHm3MMSMh7~C8VMZ-z%Ma#F67q>+v>Ker2GBBf5~qu_ z|3qD&=Qf#pI2CNzA)${$LrO@_E6eYazeDKluD!=VH72_Xy2){T4LHYlC(%GlY~j6veir}+DK@k5}_oeG?lc7 zNSjjXy&jHpyzhHH@1O7I=Z`)gGxI#pec#W$e3$EcU8aF%Ptez?#$`CUm8~NUf`YyQ zZ3fj9)Wm??*oQv0a23X8wxz^d05y;`AeW~3TZQGVrV|M-OmMDGr`2R>)kt`)mUtH2rTxGyY%D+EsG6~x|s$= zgU!Oj*;%HkN)8X0p0WQM;A1zG1Q4_&*yoWCDcQ4)KdH#zXcB%*9F!;^*V8k_?WZ5$ zC;=eAc9jOgVT`=d+26WPj2B>4tE# z5V1e*=WB8unG~|Ox8Z4}E7WLR9i5{?eG+iS@ncO*D(+#siW6OlDo9_)a|=Mx!7>)X zzt$BshWCv`6AsrYMnV~Krc+gzERnT(DER~7?ZOp1%V1o4$JfGFspjA&#AZ+$;;N-1 zG)SBpCDH9at^po#9YOdfx#q}JF#HJEfdR;8iOc$f=L8R1=5%ioq1l~l)Ya>e%OnbC z|9Tqs03`fT$3tXoQKti^3=!AJV8i0A$a9h7zZ6hf7oH(RRFS|)n>o`+d8MQy!jz6c zX9RbsVX5HwWjTr0swXJGP9sPf0BSyw1+Rqbvz^YYHw$SymGjbtb*$XttDsGXx{lb@ z`R;CR5QtbSBh$frQ63r}rLBd!ARJ#f|J~;BLA20Se;Jk?$l6=bwJ%fhNv!lQrn5Hl zTvl3H>FVr^BR;VE^##0WfM4$uby{D(+$vZB_#h3Ip6Lr;9q=*>oF4df;WL^rW3ell z@Vz190}J?Le}9K7Y&;N__?WSPs*p0>=u;?PP|^Ncb)Ke%B%{ngjfy67XPTz#=!pSk zb#QV_O;rI?Y%F5%jIKaxze`yBmbL|@N{^36L7D>Okyw|VIx~@s)>ibIgPg|sE4;BE z7Lr>kW{L?d+TX0Ff{;32v_TDI$zE}-( zFe)cePB{;c{q3F-MxV`JD!lslFaOU6_V4^g|7fRoUSwbycG_j&?=Gg5b_qx9x?|g(XO+R1{YQk2o}iE#&V&K(u4PdRh&LORBVx7l z3TA;X_2*FgSGT|+g&&lZltg5A=?jQ(b98hW17h<(N9us+7&dy-0Pvxr@F2`Jv8>(d z?Hx#g+@b5;uar;QaAzm1`8ed#PLN`5P)AKaIKugx{& zQ{3E;q>^WQRUkWLr{@GDHOea==>p*rp%~l)AtOHKAIlxj$5%;Xvh1-B zOP?w;0VUl0_lS~*@o}A=xAy{SvggH}1Nw&?4c@wob_`EffcGsBJ5%Of`?4Ad&6VlM z6*LKCX289U44Yp(-{7}tdak=aT{kLCYa3GZ-1kU(kamRJa>+8s(giOBb|}H=;SF=x zNKsFI-_bFn4W1Q;}cH@)^9U)54(H=XJ0*9<+Gs@hq+87(6e+J zz>pFCBg4aB-zy3CBkcS$_=vxa*db9??^gZHmrkeewlsQ%v|pM)!Tg#nwi3;8;NY=6 zc4n3iK={YH5atd40DwmFQZ6T+^>!;IBZvvVXBL;FRxp6xegK}fWjoz>ysn(OS2=G< z#Fz7$KH=k;(JuSJdTli+vY`GE^9`b$(i-sXmVlRHcF}OxI?dnL*&a3$Z5(~|Fh0CD za1BpMGsZ3?R1Yp#B}c630f9o zs#8-HLg-E!g*pm_HCM9e`8Urzm9q3;T6gb!omrvsr%lRhjYjXp4ik~p%IV(r`}H{M zpQ@-WYzv=ZIGyltvA?>wp~?g+=kwJMv}a$}Yjsk|;_Z^;ujeOjlcm-Ke(ni=cDHe8 zJeZw3aeK%910WSGk?_bkTEA^nc~B4vf;R?JiA-GwCoQ%Higy8un+7 zL$Uc|uRHxkfTY?LjJl?q`uXM86hWiMzO}!%Hz5@eIm^HY`bjJ95G3G-5KYgV7}6M$ z9b|_S*kf~dK)@Q(&zzZea6hMsG&$RVqLB9#8rC&23M^O3y7G(F>FiyXjPApCTjo$= z8DJr0!Cczd+^m$610O9#=xt8fwTvj;kBh>qv^i{x2R%$*)f6^5D&L6$Jt=TKmh9Z> ziH!lnEN&?yef^~>DwB|oc`0PC{jFCvK=J%0-u#qvub!{}x&zL}=FP|6gmgsC4@#xX zmh@>m{I%M%1te(zl`i}2_*AL=beYW^)t^l~`VhV?L~5aM3k5{E<+9q^P7=*|&Jl0m zJ0yKoOwZfpoB8~;Vx4@Td%)J+1hRs{^kT)p>4fEO`3VN3wT;d8uWxOZ4`lUr2u~bq z|3YgCV2VQv2_Qb*lC3=35KNg2>BG5$h-b(MZDBkpOkjR@+aWwbUl(}2BuAuTvhKP{ zIqG&w`p#f{YuynT7Sf)~^KSw1R=>X}Irr}9xspRf{n_<9#`bVfM_z6Bl9!jCLk=6r zQ@VYjY;Z~C9ZwmZD#nO|7$0SBt>X|5Gv?x~NA9oY4n#-Preryi?A@$kK$ z?}P1s@CT1@&T*oqYwzB~ww&X?jofq6t7SoR$M!ZxMp-R=tU$oBK_qPr?#7f9P(?T4 zct=V3Q})uC|IFM?<0TD-?M#RHlGaxgFP6bqz&?EeL{<`kZwT4N=H|Vh=ZJ-w=m|wN zt>&a1$p~)klOJff&M(9incHO6Zc+C@W^^{IQ|eVt)J&)T5)7wWn8YkC(e>gkZNlU! z=hh&_|CpackXQ?X?}wYq@8ZPyYZ@E1r)D@S1!+FKCqtbiNM+#+kt zm?*0l-ZvH+Mt_Y#E^(eB)ZkTN1%C?im&HzY!{sfEhnz*RiCMkcob+rV3|N@fW))b^^YRk-q6K{Xb~!<7Uu!LYE2C3*E_s7W{S76Ss6-U~Kk3$xc+|IoLR9WYZeitnV{iGz z-lF7pB1~~J`T^9;Hio&re$020i=Kx^H=Jx$$I{)}!WBG{(v>Lsn!pxBDEv*wHTfbb z0s69ou4a~&Zc-z?xL)o0y?a{n^6oq?q0U~wq$R!_2ZK@nCCOG?KKdP@d0>D?SJ%`Y z=cJ7w7IMk)VqP+jB&qg6f^All+F%tal)hzvL<-jXfBLhSsW+9MH;dMvxf#ufHeVMn z;k3vpB`}92+wc3blsP|~o0Rb~w=(zA@j8!DI?H0;A2jvK>bfTmg*pSI4a4WWYNRLv zHm@&*@49fq*gkc2YH?r#H;aQ*_u-b$jzN#3YC1Q!P`36x6!RJUz}?Ax$mXyxnIzmm zQKOu^JWl%}#Va|!>IuE@p{>j3%c8`?>?6(653EUC8?*VXhO2#{+5W#iZ(ZOT-~8#3 zZI2KzX^}GXjNZV|6{{@^wN;Vpoy?dOBz!|?j=1F~Y zvi0(J-#}R^Nx+fQ5}JDl)Fnv+wsiS`THk=fc*VUJndNJFvign3 z{%%Nz42Dfyn0%5LD2{LiU;NB_!@wp%++Pr#k)e{xX0Yb2LBlkoHx2A-yLUG&t&H7# z4KKK5g%Xznsrq@u1#h^XgAQNf$Q1-44JTmXe!ATw*{}lHNcWK#dEl2L~G2 z_g(Z|izBgdaZU%jL=Sn^5)EDv`a_EG?ufzqh->+Ag%$oFwR_zQ*{sHpG?St&hlcC6 zT-%o7v7dKj{BpXoR631fgDsE5?KtZ>T9J~RoJH9l(R0=*1PN5Y>cEy4`_aSgh~M~m zRm7=8$S##WjO;MBdKo=HC0(hja;o%vW@g zsmT1QV71&AiHa9~$f(^k{LtG=9jsR98b0*-u8m{NxPPiNhBwTH&tN9#>GCUS4VmaqT#s-*p*;Jv5@B!Yzr!?j~D4CJHNoKt#R-L$j zH1%aMDd{WwkV)Y>uII?zU;cC-dT`R`icnZTn-_!G;K-NKu44mqY_a|gE+aP zZ?ur@fw((TqpHP(SZxg7$Z@VyBbSP_QY{_noJPp}W_t3=)21KE(g???Zw{pAFP9vQ zB*vbDhsY;Kv;u{i(<~9u1GJj?8?Rd($KE^0*-%QqY#vI_MvXf1z=xl%Y6SEVNG+39 zKri-OO`#;}BHC`Ub!)<=laG&El@hTF0JsyZ{GF_sYhDf&$!!Em8)UAQ6XQJaSnuX6tmP<{4($Qxl6X5hl{9_nAYR;4(vlVV48w!QD~M}{jI{&!q6~oRl&Cq zb17n9EW6k)wxIC-``h|2W)ZtU#v1AgDeb9RT_IF!wuNk%`(xMXZm*O0m)%I3x;ToM zMt|?IG2;KSm6_VwHnG{1<;l19!p`Ov6wh<|L?O0!!|z_NfDySVmdeP [UI] +[Main] --> [Logic] +[Main] --> [Model] +[Main] --> [Storage] + +[UI] --> [Logic] +[UI] <-- [Command] + +[Logic] --> [Model] +[Logic] --> [Storage] + +[Model] <-- [Command] +[Model] --> [Storage] + +User --> [UI] +Storage --> [File System] #00FF00 + +@enduml \ No newline at end of file diff --git a/docs/diagrams/ArchitectureSequenceDiagram.png b/docs/diagrams/ArchitectureSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8f482845385b0ad57e5409caea54558c01fd1a26 GIT binary patch literal 41867 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 MIdlBQ(F?c!53E9!P5=M^ literal 0 HcmV?d00001 diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml new file mode 100644 index 0000000000..182af1598a --- /dev/null +++ b/docs/diagrams/ArchitectureSequenceDiagram.puml @@ -0,0 +1,44 @@ +@startuml +actor User as user +participant ":UI" as ui +participant ":Parser" as parser +participant ":AddPatientCommand" as command +participant ":ManagementSystem" as model +participant ":Storage" as storage + +user -> ui : "add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St" +activate ui + +ui -> parser : parse(userInput) +activate parser +parser -> parser : parseAddPatient(userInput) +parser --> ui : AddPatientCommand +deactivate parser + +ui -> command : execute(model, ui) +activate command + +command -> model : addPatient(patient) +activate model + +model -> model : validate patient +model -> storage : savePatients(patients) +activate storage +storage --> model +deactivate storage + +model --> command +deactivate model + +command -> ui : showPatientAdded(patients) +activate ui +ui --> command +deactivate ui + +command --> ui +deactivate command + +ui --> user +deactivate ui + +@enduml \ No newline at end of file From 8e41af7d8847c45697c5c6869d78d48526f20ea2 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 19:49:27 +0800 Subject: [PATCH 147/203] Update architecture diagrams to match professor's example --- docs/diagrams/ArchitectureDiagram.png | Bin 50454 -> 21879 bytes docs/diagrams/ArchitectureDiagram.puml | 60 +++++--------- docs/diagrams/ArchitectureSequenceDiagram.png | Bin 41867 -> 27023 bytes .../diagrams/ArchitectureSequenceDiagram.puml | 76 ++++++++---------- 4 files changed, 53 insertions(+), 83 deletions(-) diff --git a/docs/diagrams/ArchitectureDiagram.png b/docs/diagrams/ArchitectureDiagram.png index 2419a9537330193ce067102584659d42a6c80600..33e411be8ec436441fcdd1be2a1117bf2a23ba5e 100644 GIT binary patch literal 21879 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 literal 50454 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­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 [UI] -[Main] --> [Logic] -[Main] --> [Model] -[Main] --> [Storage] - -[UI] --> [Logic] -[UI] <-- [Command] - -[Logic] --> [Model] -[Logic] --> [Storage] - -[Model] <-- [Command] -[Model] --> [Storage] - -User --> [UI] -Storage --> [File System] #00FF00 - +actor User +component UI +component Parser +component Command +component Model +component Storage +database FileSystem + +User --> UI +UI --> Parser +Parser ..> Command +Command ..> Model +Command --> UI + +UI --> Model +UI --> Storage +Model ..> Storage +Storage --> FileSystem @enduml \ No newline at end of file diff --git a/docs/diagrams/ArchitectureSequenceDiagram.png b/docs/diagrams/ArchitectureSequenceDiagram.png index 8f482845385b0ad57e5409caea54558c01fd1a26..e858a988000740593f41e86dbf9530b4b8e7ee7f 100644 GIT binary patch literal 27023 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 AEC2ui literal 41867 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 MIdlBQ(F?c!53E9!P5=M^ diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml index 182af1598a..ce2dd9fd2c 100644 --- a/docs/diagrams/ArchitectureSequenceDiagram.puml +++ b/docs/diagrams/ArchitectureSequenceDiagram.puml @@ -1,44 +1,38 @@ @startuml -actor User as user -participant ":UI" as ui -participant ":Parser" as parser -participant ":AddPatientCommand" as command -participant ":ManagementSystem" as model -participant ":Storage" as storage - -user -> ui : "add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St" -activate ui - -ui -> parser : parse(userInput) -activate parser -parser -> parser : parseAddPatient(userInput) -parser --> ui : AddPatientCommand -deactivate parser - -ui -> command : execute(model, ui) -activate command - -command -> model : addPatient(patient) -activate model - -model -> model : validate patient -model -> storage : savePatients(patients) -activate storage -storage --> model -deactivate storage - -model --> command -deactivate model - -command -> ui : showPatientAdded(patients) -activate ui -ui --> command -deactivate ui - -command --> ui -deactivate command - -ui --> user -deactivate ui + +actor User +participant ":UI" as UI +participant ":Parser" as Parser +participant ":DeleteCommand" as Command +participant ":Model" as Model +participant ":Storage" as Storage + +User -> UI : "delete 1" +activate UI + +UI -> Parser : parse("delete 1") +activate Parser +Parser --> UI : new DeleteCommand(1) +deactivate Parser + +UI -> Command : execute() +activate Command + +Command -> Model : deletePerson(1) +activate Model + +Model -> Storage : saveAddressBook() +activate Storage +Storage --> Model +deactivate Storage + +Model --> Command : result +deactivate Model + +Command --> UI +deactivate Command + +UI --> User +deactivate UI @enduml \ No newline at end of file From dd52be4f0ddff0b8dadb88e4825d7a4b3c3b9870 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Sun, 6 Apr 2025 20:06:52 +0800 Subject: [PATCH 148/203] Refine DG of add/delete appointment feature --- docs/DeveloperGuide.md | 42 ++++++++++++------- docs/diagrams/addAppointmentSequence.png | Bin 67575 -> 76261 bytes docs/diagrams/addAppointmentSequence.puml | 11 ++++- docs/diagrams/deleteAppointmentSequence.png | Bin 52798 -> 55883 bytes docs/diagrams/deleteAppointmentSequence.puml | 3 +- src/main/java/miscellaneous/Parser.java | 7 +++- 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8206353bdc..6c9ebfecc9 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,6 +1,5 @@ # Developer Guide - --- ## Acknowledgements @@ -82,6 +81,17 @@ If saving fails, `ClinicEase` catches an `UnloadedStorageException` and informs The following sequence diagram shows how an `add-appointment` operation goes through the system: ![add-appointment](./diagrams/addAppointmentSequence.png) +To clarify how is extractValue() called to extract each parameter: +```` +public static Appointment parseAddAppointment(String input) throws InvalidInputFormatException { + //... + String nric = extractValue(temp, "ic/"); + String date = extractValue(temp, "dt/"); + String time = extractValue(temp, "t/"); + String desc = extractValue(temp, "dsc/"); + //... +```` + #### Delete Appointment The `delete-appointment` feature allows users to remove an appointment that is no longer required. @@ -112,7 +122,8 @@ which removes the corresponding `Appointment` object from the list. - It also retrieves the corresponding patient using findPatientByNric() and updates the patient's internal appointment list. >[!NOTE]: -> If the `APPOINTMENT_ID` is invalid, an error message will be displayed and the deletion will not proceed. +> - If the `APPOINTMENT_ID` is invalid, an error message will be displayed and the deletion will not proceed. +> - When a **specified patient** is **deleted**, all **appointment records associated** with that patient will be **removed** too. Step 5. After successful deletion, the system updates the stored list using `Storage.saveAppointments()`. @@ -133,20 +144,23 @@ This structure helps improve modularity, testability, and clarity in our codebas This design also aligns with the **Separation of Concerns** principle, allowing changes in one component (e.g., how appointments are stored) without affecting others (e.g., how commands are parsed or executed). -### Alternatives considered -1. **Allowing appointment creation without verifying patient existence**
    - - **Description:** This could simplify the logic slightly. - - - **Reason for rejection:** It compromises data integrity, as appointments could become orphaned (unlinked to valid patients). +### Design considerations: +#### Aspect: Where to store appointment data + +1. **Alternative 1 (current choice)**: Maintain a centralized appointment list in `ManagementSystem` and update each patient's internal appointment list. + - **Pros:** Enables efficient listing, searching, and clash detection. + - **Cons:** Requires synchronization between the central list and per-patient records (slight redundancy). + +2. **Alternative 2:** Allowing appointment creation without verifying patient existence
    + - **Pros:** Simplifies implementation as patient verification is not needed. + - **Cons:** Compromises data integrity, as appointments could become orphaned (unlinked to valid patients). + -2. **Store appointments exclusively in `Patient` objects**
    - - **Description:** Remove the separate appointments list in `ManagementSystem` and rely only on per-patient storage. - - - **Reason for rejection:** - - **Performance impact:** Aggregating all appointments (e.g., for a doctor's view) would require - iterating through every patient, which is inefficient. - - Features like finding appointments across patients become harder to implement cleanly. +3. **Alternative 3:** Store appointments exclusively in `Patient` objects
    + - **Pros:** Keeps appointment data stored within each patient and reduces need for cross-references. + - **Cons:** Aggregating all appointments becomes inefficient (require + iterating through every patient); harder to search across patients and detect conflicts. --- diff --git a/docs/diagrams/addAppointmentSequence.png b/docs/diagrams/addAppointmentSequence.png index b93475f765e177c9a02f53417a1cb1cc4d845998..e2999127bcf809ab3a67c9cfe340e4e628bcc326 100644 GIT binary patch literal 76261 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 literal 67575 zcmb@ucRbbq|2N(+jwr__o9r^m$nJ1NBzq-fE31&bLfNbA84_iWNJ#c5**lb#kz{YK z$I*NAet$mKb^HE)*LD7Q4_@c_dXC4q-|vsdQ=sw<+0&=ao;r5y*y(F>Xw_rKu(XdI zJIReW0Y6EvW_Skw;&hPFb}+WR=VE1Q=5S2b)W+1#(81J%!N`Td!olI5y$BD_Ju5>S zhX>YH+{U)nj-T4-j~zSl@Q%8+!=FDtb{xiWPD<9Oy+O@~tls6iniM0AL}jN5Gsr(9 z=12=bK9{eK8@*OoYFS`qo3Q86e61{g^ue>m_LTU|Ju@*n17V)Lf}mSfF9{57Lc9dH z7)|CwAH_>^p|25fYGn4(g+0!=btigE-d~o1_Ir8W8`(Q})qz9Yx(7U_ccM11@7CZM z?K+yo@O^6`ebhTdPO@6sN%C^~gs<0IN4ntCh1OPvFQUY@h0-ctBhx55D@~~CkpT~L z1=JMgA_x4iNgQ+$KGBAeR=1noKIh*sqUb-)-=oNBH`>U-MDS)MrcU2P|Ers_ zwS{%xM7wYNQiviyJMPPm_8*^R+ZD9Y)aINRRXROpm1(1J!hu$Rf6(-yI`^h5-GHo2 zxjYa0akA@k^7)`A81EbVaS*;e-_1W>n|A8Ush&3Dm6{5DM>@wh-7`6ny8@ywE+IwG z_g5;qhcecJtOgeRvno|q3ZAzg=soi)%o+%0DORx`m|y*gW} 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 GzyAT1mpW?z diff --git a/docs/diagrams/addAppointmentSequence.puml b/docs/diagrams/addAppointmentSequence.puml index 09d3f94bbd..fe98dd9d96 100644 --- a/docs/diagrams/addAppointmentSequence.puml +++ b/docs/diagrams/addAppointmentSequence.puml @@ -17,19 +17,24 @@ activate Parser Parser -> Parser : parseAddAppointment(userInput) activate Parser + Parser -> Parser : extractValue(userInput) activate Parser -note right of Parser: extractValue is called multiple times\n to parse input and extract parameters +note right of Parser: extractValue is called separately \n (not in a loop) to parse input and extract each parameter \n: NRIC, date, time, and description Parser --> Parser : :String deactivate Parser create Appointment Parser -> Appointment : new Appointment() activate Appointment -Appointment --> Parser : appt : Appointment +Appointment --> Parser : appt :Appointment deactivate Appointment + +Parser --> Parser : appt :Appointment deactivate Parser + + create AddAppointmentCommand Parser -> AddAppointmentCommand : new AddAppointmentCommand(appt) activate AddAppointmentCommand @@ -42,12 +47,14 @@ ClinicEase -> AddAppointmentCommand : execute() activate AddAppointmentCommand AddAppointmentCommand -> ManagementSystem : addAppointment(appointment) activate ManagementSystem + ManagementSystem -> ManagementSystem : findPatientByNRIC() activate ManagementSystem ManagementSystem -> Appointment : getNric() activate Appointment Appointment --> ManagementSystem : nric :String deactivate Appointment +ManagementSystem --> ManagementSystem : nric :String deactivate ManagementSystem ManagementSystem -> Storage : saveAppointments() diff --git a/docs/diagrams/deleteAppointmentSequence.png b/docs/diagrams/deleteAppointmentSequence.png index da000cdbffdd898839f1e842692d071150412e20..6b7849ebd7ca4bdf4cf8a04fd7d5ee521532abf1 100644 GIT binary patch literal 55883 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≺||EsvcY>E-OMB;ZQ)Sg6Adj&Us`;( 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 diff --git a/docs/diagrams/deleteAppointmentSequence.puml b/docs/diagrams/deleteAppointmentSequence.puml index 5b813c15d2..194bf76f38 100644 --- a/docs/diagrams/deleteAppointmentSequence.puml +++ b/docs/diagrams/deleteAppointmentSequence.puml @@ -5,9 +5,9 @@ actor User participant ":ClinicEase" as ClinicEase participant ":Parser" as Parser -participant ":Appointment" as Appointment participant ":DeleteAppointmentCommand" as DeleteAppointmentCommand participant ":ManagementSystem" as ManagementSystem +participant ":Appointment" as Appointment participant ":Storage" as Storage User -> ClinicEase : enter input @@ -39,6 +39,7 @@ ManagementSystem -> Appointment : getNric() activate Appointment Appointment --> ManagementSystem : nric :String deactivate Appointment +ManagementSystem --> ManagementSystem : nric :String deactivate ManagementSystem ManagementSystem -> Storage : saveAppointments() diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index d057e4d732..f97b49cf7b 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -136,6 +136,11 @@ private static String parseViewPatient(String input) throws InvalidInputFormatEx } String nric = input.substring(13).trim(); // Extract and trim NRIC + + if (nric.isEmpty() || !nric.matches("(?i)[A-Z]\\d{7}[A-Z]")) { + throw new InvalidInputFormatException("Invalid IC format. Please use a valid IC e.g. S1234567D"); + } + return nric; } @@ -184,7 +189,7 @@ public static String[] parseStoreHistory(String input) throws InvalidInputFormat // If any part is missing, return null to indicate a parse failure if (nric == null || medHistory == null) { throw new InvalidInputFormatException("Invalid format. " + - "Please use: store-history n/NAME ic/NRIC h/MEDICAL_HISTORY"); + "Please use: store-history ic/NRIC h/MEDICAL_HISTORY"); } // Return the trimmed values as an array From c3be5069b05b4388ef1efdef2549dd1144dbe4ba Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 20:21:39 +0800 Subject: [PATCH 149/203] Update architecture diagrams and documentation to use exact package names from codebase --- docs/DeveloperGuide.md | 108 +++++------------- docs/diagrams/ArchitectureDiagram.png | Bin 21879 -> 62897 bytes docs/diagrams/ArchitectureDiagram.puml | 69 ++++++++--- docs/diagrams/ArchitectureSequenceDiagram.png | Bin 27023 -> 43654 bytes .../diagrams/ArchitectureSequenceDiagram.puml | 30 +++-- 5 files changed, 99 insertions(+), 108 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3fbbbbd4d2..83eeacb0db 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -13,103 +13,53 @@ ![Architecture Diagram](diagrams/ArchitectureDiagram.png) -The **Architecture Diagram** above illustrates the high-level design of the ClinicEase application. The diagram shows how the different components interact with each other and with the user. +The **Architecture Diagram** given above explains the high-level design of the ClinicEase application. The diagram shows the components of the system organized by packages and how they interact with each other. -Given below is a quick overview of the main components and how they interact with each other: +Given below is a quick overview of each component and how they interact with each other: ### Main components of the architecture -**ClinicEase** (consisting of the `ClinicEase.java` class) is in charge of the application launch and shutdown. +The application consists of the following components: -* At application launch, it initializes the other components in the correct sequence, and connects them with each other. -* At shutdown, it ensures proper cleanup of resources. +* **miscellaneous**: Contains the user interface and parser components. + * **UI**: Handles user interaction, displays information to the user, and reads commands from the console. + * **Parser**: Processes user input strings and converts them into appropriate Command objects. -The application's functionality is implemented through the following five components: +* **command**: Follows the Command pattern to implement various operations. + * **Command**: An abstract class that all specific commands extend. + * **Various Commands**: Specific command classes (AddPatientCommand, DeletePatientCommand, etc.) that implement different operations. -* **UI**: The user interface of the application. -* **Parser**: Processes and interprets user inputs. -* **Command**: Executes user commands. -* **Model**: Holds the data of the application in memory. -* **Storage**: Reads data from, and writes data to, the hard disk. +* **manager**: Contains entity classes and the management system that coordinates operations on them. + * **Entity Classes**: Patient, Appointment, and Prescription classes that represent domain objects. + * **ManagementSystem**: The central coordinator that manages collections of entities and implements business logic. -**Commons** represents a collection of classes used by multiple other components. +* **storage**: Handles data persistence. + * **Storage**: Saves and loads data to/from files on disk. -### How the architecture components interact with each other - -The **Sequence Diagram** below shows how the components interact for the scenario where the user executes a `add-patient` command: - -![Sequence Diagram for add-patient](diagrams/ArchitectureSequenceDiagram.png) - -The following sections explain the various components in more detail. - -### UI component - -The UI component: - -* Receives user commands via the console -* Displays results to the user - -The UI is implemented in the `miscellaneous.Ui` class, which contains methods to display different types of information to the user, such as welcome messages, error messages, and command results. - -### Parser component - -The Parser component: - -* Parses user input into commands -* Creates the appropriate Command objects based on the parsed input -* Validates input format and throws exceptions for invalid inputs - -The Parser is implemented in the `miscellaneous.Parser` class and is responsible for interpreting user commands and converting them into executable Command objects. - -### Command component +* **exception**: Contains custom exception classes for handling various error conditions. + * Various exceptions for handling input validation, patient lookup failures, etc. -The Command component: - -* Represents executable user commands -* Implements the Command pattern -* Contains multiple subclasses for different command types - -All commands extend the abstract `command.Command` class, which defines the `execute()` method. Each specific command (e.g., `AddPatientCommand`, `DeletePatientCommand`) implements this method with its own functionality. - -### Model component - -The Model component: - -* Holds the application data in memory -* Manages patients, appointments, and prescriptions -* Contains business logic for operations like adding and removing entities - -The main model class is `manager.ManagementSystem`, which acts as a facade for the model layer. It contains lists of: -* `Patient` objects -* `Appointment` objects -* `Prescription` objects - -These entity classes (`Patient`, `Appointment`, `Prescription`) encapsulate the data and behavior of their respective domain objects. - -### Storage component - -The Storage component: +### How the architecture components interact with each other -* Saves data to text files when instructed to -* Loads data from text files when the application starts -* Ensures data persistence across application launches +The **Sequence Diagram** below shows how the components interact for the scenario where the user executes a `delete-patient` command: -The Storage is implemented in the `storage.Storage` class and is responsible for reading/writing patient, appointment, and prescription data to/from files. +![Sequence Diagram](diagrams/ArchitectureSequenceDiagram.png) -### How the components interact +The typical flow of execution in the system is as follows: -* **User** enters commands through the **UI** -* **UI** passes the command string to the **Parser** -* **Parser** creates the appropriate **Command** object based on the input -* **Command** executes operations using the **Model** (e.g., adding a patient) -* **Model** updates its internal state and may request the **Storage** to save changes -* **Command** may use the **UI** to display results to the user +1. User enters a command through the UI +2. UI passes the command string to the Parser +3. Parser analyzes the command and creates the appropriate Command object +4. Command object executes the operation, interacting with the ManagementSystem +5. ManagementSystem updates its internal state and may request the Storage to save changes +6. Results are displayed to the user through the UI This architecture follows several design principles: 1. **Single Responsibility Principle**: Each component has a specific responsibility 2. **Separation of Concerns**: UI logic is separated from business logic which is separated from data persistence logic 3. **Command Pattern**: Commands encapsulate actions and provide a uniform interface for execution +4. **Entity-Control Separation**: Entity classes (Patient, Appointment, Prescription) are separate from the controlling ManagementSystem that operates on them ## Design & implementation @@ -765,8 +715,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application - Run the compiled main class: ``` java ClinicEase - ``` - - You should see a welcome message that looks like this: + ``` - You should see a welcome message that looks like this: ``` -------------------------------------------------------------------------------- Welcome to ClinicEase! @@ -1133,3 +1082,4 @@ Below is a suggested guide for **manual testing** of the ClinicEase application 6. **Exit** the program with `bye`. --- + diff --git a/docs/diagrams/ArchitectureDiagram.png b/docs/diagrams/ArchitectureDiagram.png index 33e411be8ec436441fcdd1be2a1117bf2a23ba5e..f422f95dd67fc1376247f82374b115d16337cf8b 100644 GIT binary patch literal 62897 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 diff --git a/docs/diagrams/ArchitectureDiagram.puml b/docs/diagrams/ArchitectureDiagram.puml index 68a85d4a46..22a5826163 100644 --- a/docs/diagrams/ArchitectureDiagram.puml +++ b/docs/diagrams/ArchitectureDiagram.puml @@ -1,20 +1,55 @@ @startuml actor User -component UI -component Parser -component Command -component Model -component Storage -database FileSystem - -User --> UI -UI --> Parser -Parser ..> Command -Command ..> Model -Command --> UI - -UI --> Model -UI --> Storage -Model ..> Storage -Storage --> FileSystem + +package "miscellaneous" { + [UI] + [Parser] +} + +package "command" { + [AddPatientCommand] + [DeletePatientCommand] + [ViewPatientCommand] + [AddAppointmentCommand] + [AddPrescriptionCommand] + [Command] + [Command] <|-- [AddPatientCommand] + [Command] <|-- [DeletePatientCommand] + [Command] <|-- [ViewPatientCommand] + [Command] <|-- [AddAppointmentCommand] + [Command] <|-- [AddPrescriptionCommand] +} + +package "manager" { + [Patient] + [Appointment] + [Prescription] + [ManagementSystem] + + [ManagementSystem] o--> [Patient] + [ManagementSystem] o--> [Appointment] + [ManagementSystem] o--> [Prescription] +} + +package "storage" { + [Storage] +} + +package "exception" { + [PatientNotFoundException] + [InvalidInputFormatException] + [DuplicatePatientIDException] + [UnloadedStorageException] +} + +database "File System" as filesystem + +User --> [UI] +[UI] --> [Parser] +[Parser] ..> [Command] +[Command] --> [ManagementSystem] + +[ManagementSystem] ..> [Storage] +[Storage] --> filesystem + @enduml \ No newline at end of file diff --git a/docs/diagrams/ArchitectureSequenceDiagram.png b/docs/diagrams/ArchitectureSequenceDiagram.png index e858a988000740593f41e86dbf9530b4b8e7ee7f..683a1c951ab154e578cd577ccb5fe141e4aef0ad 100644 GIT binary patch literal 43654 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 literal 27023 zcmdSBcRZH;`#+9SQ7Ee+q^u$mWp&wmU9vNatYl_qWR#T%*?VRu${xuG$tHUjva>RO z$4PZpckj>p^Lc##`rVI5w{>0Tb)K(r9M9wVd>$_^Ss770+*7z17#MisVnT8l7+BR9 z7?>G{u;4dEMbdom<$|TKilvUJncZDoJxdHxT@zi4Tb8=F&uH77F|f2WyT`@MYcW)Ck}=jl6X9;oLS!0_u$m{j|vSYAT6* z@q8~*L&e}ejcfg?*ks+0UhkCY=v;O09a{DM+{o(JX+HWWOZPFm4B7LGr#joh?%r;C z<|ci;{O$v_=UPgi=}Zpc_b6m7(cNtsKHhJo?)9MBzWSN!O|m7~%yw_}g~JC>osaE8 z{89dN^f%8{o_WXabdb{`t&Z{BQ~$bCw@R4lO=fTZhS0^oUej=*i>cn<)y1linbNrY{ z&y73S-x^n}i;L^Nj%^w}z`g%&Zpd2g?wn6Qe%jlUCDAX(%(z@T+zgMp=Y4ob>6UO< zZlzunfAHY=Z4d0V>@oFZSyYq9e1?c&-jpoo%DR%wQHQpysaJ>Rw=`adJgFgD#5Se5 zUl|h_5ZftoIF$*z{d0CVo%Pt%Wm$)%R&Rkg%uiaF9;gih6CT2Nhito37#RAu#fA74 zY&EB&4m%wAyk7h8=>DXs03ornIOok%2jayf>G3<#oXL}dE~ti3Ttul_DR@a5N~RVl z%F9{FJ(0XG^F>uLK(Iwt<|$#fQr}chk-^?GKz(KxQ!(G~se09LKN7f`p*+^jYyT-;SmeDOQ zqLjpBndI_3DU<{q@;73el6E3&Y;5O^-iTa%=FKK&r`O#dyhIw>1-EW1W+5+mFyg~* zKe91b?mX(tPC(9e{ydIdg44?YKZ`57SCGHfiClsDc>866mUjnj&Lh9|8On)1!K#;$ z&P}u^!ZVhteiHd@^|7XWJ8Gy}V2x1%Jbk?OPB>i%CUXmF~tyer~`(A@9M^a*0O1JjmulBVQ|&V|Rymh@pA+ zbLUCEPmeblYGJi}$1(gsk@Za4w8a5q>2C*+cU9br8` z#IG7#Uj0el@0C$G1*_g>C=1b&v1u8nd3})K=cX9tGRi|oK16bI->MAC(UI>cJY2Do zU*2-^*?J>;#4`_b?oV9LwY%B$>W!p=w4FW9RxGr=*A~0S74~5)Yjb9UQXvc$Bnyf$))KIl1EP@CYMR$$mw77@1=`j+}If0$+|{(QtujE zwGX*!i1yCIv;GTT;HvUy{edrD*=6f@zAcV>%S^>N38xey%L_m9iSO%d&UaF7x?FbuE&x z{bkp+HSRCXM3@bsEVN`H!lS(UY?J&X4K@1pM(;zld69cqg?nh@M{jO^Z5plhQ(mb* z!|;v%zO-w3E_(dy7a1Y_yEwcM4h zQJl>74&E5L^hVHGpWOcJO_tGuyZ6}HB9>ykbw^ppujonT#0VUFw{~BTB@sq3?=beo zm**}m*mTCxVUe;vX}D@5m@7_@rgD`>UQ?%rc;h^=%j0r=Qo(SvePsf{_S3Y*dZ$Haqj@V(q?OZr_SW#$zYxqv9xm zJlpotygWVD$r;v$?JaDh&by5t2JVl&JNfELY&g4pWi4fz+~&06g9Mf@R$ppf87#br zPjTKkUTu-9N5E##ELIvU{S4zMhr!8^xzg1)0r&y}^>Q_$eiYd&=SOM?8Y#$$ua`M| zJAg-+B4wvFlWahM3hK+~-kNfn>rvJ+7MHq9NKC9y$!}(6CMA{8bFo4#>@wB9gZPT8 zKFCbxrK~+Xt{Gs%bmL_J*XZb%^sR3-l*tC0lfx;nbWZ69PquxQ#q+)p%da=t+HohQ z!jR$%j)s%i{hrL2aeN0hJ=BE@$#!3ryrZ4A4tR|xOV5>V%s!fWbvJGQg9`qJ0x7}U zLPD9T^7>YD1L+daxKlsze!Km!CzGB`EBX|{1x7}Pn#XoJwK7w^HbWXViYcQ3RXOQ3 z=o9g!8zw#eRN2orNM;(C*+ZB#k_8^(&Xur6Fg1v&`O6x$CWiH}R*>MdrO{w6jYw>O7Lb>byLKx3k{G-h^7M8wfgq*ovvdTP1oRNgfFdeEhS7=X{*wxThASP^5+uE zHWiCs8Ff7!U}F6mgNt7Fo{~vXs%guNuwNxsN)C)M_y)VRhS*1Pz9V!0ZIur*eoFKequ18cYbp?b4B03-7x9LJBkq?d zXFIjar?!$?UO$UM#cFEwuf^RM<*!@b|B8TjGYCJ^W^Vgx*9L9OrO5Toab{;cJiLn< zMN;bOTUi>##TE^9oW#V$LTZ6?4@$_nEG?R2ZxLhm5YOapKJxc$I!MWwm|rmZq@KBS zX$m%sA8LiVbZ#F3+s2Q$6FM4Y#&P2MC%r`QY>5=5lA zT9=ljlugo=GE+Ramb0Ca0YhzB#taP&ne^M2Y^_M)@-(`pE1UYSxYXQWk$8QlBmA|X zl_=q@_UAby7Zeh&cbsFV^@8tWU0$JMK66`73()rHcb7eL`V{tAuW5TC`u^-W`Jo9M zVec6GG&*vtD6W=xj}h@>6YY~Y;^=ELTp#cQzrM8$mnU0t$Mt2E)Yc}#HIOsSdY@`Cd& zoLX`xW78vt1r=wmo}6>#>g$2G1SyZnxhI?B0^@nvSJ##%@7-UWMR%Q4$YGQ7aaw-P zrCnuU@%#qs-M)glk&T;@Ax<)=j`Xg?q9l<~&!xUddn>C^4~RiYokV$LmXB3ed>5V) zxMub7e7lXkEYC*FeI|TO)+;M8k)kJdse{1Ip);dfBHGY!a%4OZz0JwU*msWoqIhD^ zQ}I5wIav*-sJTE>U5b<*aqQ(SZ zg^!~~UMeyQqC=1Qj=o&7^Jt&&_FdYDvQeTD<~1KF&PqO;+HzZjjEdd7adk2!y=rl+ zj#VgvMTa7{DE`OxvHJ4TFl2p&JW+S>1m(9g6ZOUo!KbHE>@>>u$q}KS*Oiw`SShC~ z8RukNr#CQf3l%DiJ}NO$y1H$nPgAk%-gvBZVxlPM;Z@_FHc4^xC38LeHboiZSs4uk z0=01Dip_k<&W8v16sOiiQYYyp9xP2_r%bmp)j>8!S17Fp(V{f^xpKCqgoJmz{@VQT zVzl<-nv8to-Z;4=Zn0Ibkd2jYS2s6#`N3n%adhuJYs_zC(p9zj%#}sx6UaM-BfERW8s0w z8Ju-jz3@8yREK12egdXK>BEc+6miqeMtMqg!`8;(ce%O^qE(U?1^5#pYN+d%tNeH= zl8%*|4!TqV9QDgH#mu4;@uSeHe6umvlwbFAJ%5^QUq%3nFRM>UMKG||S$*YExq?ONfzuNm%>#H-o^gg=*!JEk>m`S75 zc42X0G-craoSWq#=JL((7k9eZm3c?;I zKO~6wlJIyVdB^kGJ?+4=aUlu@iNa^ko|Sx8wmo_w(>vKOy1?#h@@7)|WS&+Ad5 z7qPY)huj5%iffgC4Jpa^LaWyZaufnx8-9*Oy0qeF8`P?$#)!mRHP9nrz%i zuW8c}obzNH_5x3}y-QS*ImOqrj!Fw#3V7?%et3VYsQ$e3)H;IkgTo%)&RQA`y>h2L zk&wf7zC6EzB&mv8k{q_*Rm1wv(f3{S7}BtcE+v~AR(ZB)lPDW1vS}?>&Gr|^I4t_j z84uchjsoa*G%AEyi-OJI=(0kV`Zs3hZw_W~v+gtZnraA9@djIa-yXy%eULP<# z>WYfCKJ%7ue$g6iK18G2Z|oL*NCnc@DKZT?PsxLXcnX{E=PFKfm`QExUP^^MxY%o2 z9umFK{&6j?yVflrJlOHxc&>4;^Vp!i`MBOahi5kdao%4UOO;kIB35+X5#2W<9&~C( zPN|b(!T4AiQYVzkF@~peeD$asYd8G5xA6`~S*YdDYUb*tx7|Zum&gi8GBH6;G?d42J(NX9Y&0<`$!i+| zTl2&Fjp0|I7U;-dcDtFcjd9Ee$5T6VPqkpNbn0q9dOM8+e^YaJniy>mz4BU97 zl-c7!5F=O2(x{B$ABly1d7N1@D5LfX`8m9W#Rg`d5Z_Z*BxGbr8xra2Lzs8ARtF_N zxcL3ITFbUY?|o=j;k~ZnIg^ihlclBh%e^^o>!jt&zNOLC`0b1?40(Ebo@CYY-1(AY zK1%6#-~HjkD;BbG0uLu942Grb&z?Uo-t*-A{C}?(@1t4@%t!Cfl`0PqQBZ967-fqy zv$C>Auzee4=fA%+!Oz^4y)*jR!q9Hu;^oVi-RYLxi}=y|8TC$w7z4}?q)^DY3!A^@ z@%a^Go}8N)AF-|4kL1)+q^lP$jyHr=2C z*faF>6KLo4z&?HqRGbM^-v48@S{kiVVr%Y2NJHVgxnNqpb(Nbtf>aEBn#=Ot?AnLV zKFnon-#*8*HHcC==GiY#mG5kGFRxCvdE`|;zn|srJN?NwmD%r}+5X7vdxn6c) z(#zd_|E)Xi&s*xBF$nL#t#oE<@h)g|w8HW*?p0b!Nlauj9Z+YCcz7eX)q0vE7C(~d zBJa-KJ5$u-YOWOzYIK*oo@13b?rgoW`}*m;pU|U|NHL!eOTR7YqccJoZ~&__KF-TkDKSo}@j_mX z8!Ih?WpRuX`;f)sp9C5pZL1Jgl}#-*w@a_n^Bz+qWk3oyR@7&AhyECw7~0M zSEh9m;Tp%m|2z^C6CuXFyFYz_lCvvI0|5TVPmK}d_O65C$fp$uQ=*2aF#TcoXK9s} zy?8MX+cmbZZ?-_tKOjIZOTEzD-QA?WNZfwp-P3ch%pk?zRZwX6CSjQp*&R{E6^He*p{3~*a;=}t+$Uvd{5z^ z`0v?`*7%C+Pk+qOnP`r?V$?~z9T06cWd)o@`CZJ4!^18Jp4Mn}6cZrmHMe-;@T33Fa7g)Xp|fV`=$ z-q)S0f0B}ONwa)={mWEG`lMt2-EM&f+=I-`PSX`H{~Yk18!vB*7g~%PaAiZDhB)*fk&6Rh@@A%FSuCB$8#)2A7u>&&LkiEeJYNBSIR z#%)^|t!0H&!?w%vixR(zK9i+cYQHpbT{qk9>*uDgye~4X&v0tzcANASP%S@qWD}U8 zrlPtvKlFxTON10zZAY4kT;A9Ck{NZRkx)sr8*#B7U2^<>g^JmYUGwRBU z3JOxlH__jp8-FACnD3e`^SH%?;8Hq$6QrVI0S!6cjSdwZ3F@v*>wmmwYTE zx%aq<6F-*+p1pwAQKFHr_;Q4>oi{&4n2zC>Xb)vpgcGM=vF!gDD`M$P+^U2W6ckic zLN_0|V`;L?E8Ud#mUcOT{WDe~A&e5E)3LMX$Hww?r?Y!UCH5=X6CY+& zJhP4QOQvv78bYpfYGtOktITl&&AXK+XGL+lFa*u*6Qjg}LR$t+!Ny zkLd3^>Hu5@s65${Q2X?psF0sFod+J-Ywc?9US$xgZeo2OxmSl`jkXF33eL+XLv{BV zFwxF5Ac} zB*~E8P7vIV&hK6Igwf{@QMHdxw&j}+!qAC|h&U~^h{ii_t}PH;o9Ba|3so9avviz( z6sRJA9&vGT9t4!zBRrQT$MqxDof52;bpbR7kDTxi3;QHmb6Lb|BG(57a{?^CrD<`d|FQbOrT?Xh` zSYTM6^yZraE#odvnL@wheoBsT%>U`rIJVG}k|dtIzXyWj3f>fYFY|Jh!sBA>KAp@d zv6<5hzp}I7=PcGa=)AM_s!KD0!KtnglDT%6-q!s5yk28?%h<(l`uh59q+&kJ-GW#T zgYQ{bOpHX6TF(t!EEI2+LMQ*oLo)flCLZ&2I?v|j=Js|4-R!U&1(&sbzr>DfkC3su zu(N-7efbO2&!vv60#%<3yTGc%Gtq%c6x2iHr$KbYRYnPOnmA_k>&Z) zM8#8m+TAa8wOOax9Is3A}k+oq^qBu?#}f{?#RnyGZ*FWyBf-6mBxU&Wh0fBh%?dS z*#7+bidz1DNOH`pIo)^L#Z4AvTx>-r6Z~)F>fxY!`Uj%#w$GX~{W zpu%6ffn<^h8TWUlJ!>L}Fx;Dx7xbIZV*Kr#y- zuz~fNmtl4^LoJ_)ntBXio`l;U69s_q01t-T(k1UVA5;w=l|gZzrkGAjOl(<8ZsVzj z%|?`O*!C#-qr|fdNy*8<%vxoz%i3c?LpdxbWOGIe?|qI>NHDw@ZqWPMn89(CikX?2 zlQXQ7M*i6aMWswtT^oliepB=HrOBPL^vAFa{5`35U_(AR%_%p5Q|vSI&ZZ(&P)SKC zipvVPy6Q%f6dsGJIrO_i+lBZ_kChbNhTyjz1j=kyaw-sq=KsZ8o10r~Gk4YNGfevzxReD2t`4pPH0vHAxG z)AG#Xs372?D;pjE8KA8~4~X5BNU%#dF`cpOM!>W7nRh338e7keT6i~!s@%Oh?Ro56 zq*ETmMWucAl{)YMHu~7r`^-bm($YR^m9C7Jj<{N&fr;^gV=u9ux3{gXP~*?x7xP|Q zTMNfu>m~Uu$%XUSS5`1TCq|WMAI&}d;!Gmlgeib3042|^lGJ}a@IvK|JI?7n=#M0d zm?O3f^j87dCBxhV&BFE{8ymYnTbKf<>FcLPqQUJU^u7Vy_P@Q2;t*CS5?Zl`J@MeN*6JSQyJ}a!Gy?#7`}XZPJ2mlq3Z^Oc9mXq_ z`|lEp)UyR$VlwH z)#a3=?G zmTopS2PFJ~();5mD2@ZlgWiTt&&vEUEwFEcUEv{&T3GEC$ByA^IxZ`!4wTsCwh9Wr zeT3(6k{lpN3`!xA2rV5UyLuODA?+J@&Zp*;z>0DXiF4=!C9ft@)$&cCa*{`*Kzx(z zVGn1Hao+w0bTj?d?Sc-X-qZB=O+VLCIw!7{jy~ajgip?8+{0$y_Tt5h_wS{Ww9Zg< z5fR7l;gx0!Cnug|4-bzvEy9zPVL>+_^5466Z(PlPclEz{={>DE_f z7=ppzAR^#GTP+?)Tjxkjru+rxp`e_cTnvxn7|QxtQ-U9lYN{NK;R+4z;lmKN81Lb5 zjM=*e?VqHgDxo()*fUJH2_cBp#g>z2OM~9V96<2r`$OMnQg@=S@N0x=*|&OzY{(M{ z=A$)Vy0VXNi9R`P*p)@Df!nr3Yw`j>l*6a@VU;}zqJB_?T=s!EPFM0j9WqSjAev-M9NKnmWwLT{RQcQ&ht&^W>8D2Vi?W-K2o0Z;{o(~724b^!;-mLp%Ky48_BD>Y zdGp5dMmf}hVDO3&a_eW=Y8w+J8i0F&nY?gyd#Me5_{(HliX_KTn|?zRic2>uX4Dj? zaI|5d@^CZ1SdLnU?G?PYDJ6@yz#jSml1aWi|Ck$P#RTp7FNk_wvI(hQszhk_(>EU z*>sg?L00oK7rj?-P0eC!-{8sm(5z5HDsFByhim*PVtRVC7e9}UG2VFT{z-vw|K#Lk zp3?GE2k+XD8^Eb3rKe2AH0}1O6BTey3<-@~yjIU|S&~eqGe3*7K zuevTMWzcJK;W5upWxl%k25b17<3NsK8?EZc()+8KzFRJ;=%WCWQ&UqHDKL>88e1cG zPHN~U;l+YPv6EvlmrGU$?rT@70kmqo1;7i>gkO0eky;GxuvkY270pTDQJ}Q{`ccR4 zss5`w9TQVKuYI}Nh+sWBJj5lLX1Zz;GUK&N8%zmyt+$_#BssJLC4qNHBK5?$evG4D zISLD~`Q6q;FBPz2`HkCGW;OxvItTS{`*Z&LG+jhf^SGD*+nHLJCvm9A6P@7R{ppN7 zmco9l!e7JU_bBu1&7?bB);3~jib(I53F!e|mE&9U6*ip1;a9kAW~IKSS2kv~5&?H$ z1eJfZ{nYv5FTM=3=;!2OXn)UR4Kj{0QCz|soypQp^ZNWIoQMF2o$@-SPq}g*A{K-J@T0-_46%yXviq-UN!hT@Y9N)3VlXUbzx{ z>K4|)J??J;$8VT!-$4D4WhGP}T+(3+3kyb_8BlisA1~wNRJPTrPinbkY$G)Q*e5Xr z;;Fy!T)BU=EsQ(?B@ZJHy_b&<7!6KIyIXgWg{)LP6U^2uHQ?57iq>@)aQG_SlLU$2 z^Y}O-cl8%pofCPy1_k>&59?y6I@nkOzXH%WK}N<I8!MX{m9s5)?^7LUjQ5mv_gO)Q5CItxc2OIMlat|LW zyJXROzHqK=BTYFwYx~99*=8b|(?L+K^1B@Xu`M83u-M19VYTX4G-!;G!t?OqLpEdO zGzIYz?u&V*gPIPme3xBUgqGM%`c&+t__xavNy4uhUkFCl9KmD+s4kv1Qqs~%mw+wT z%89>Ll9&U=C0^`1WAC2Qm`r*>`XSUzLC3rvT;Ias1dfk7AND>zC6D@D(SL0sAQ)Z{ z!!A+*!d*mpg{{=9cZ0%wd(&=b>%i+?-*oaS4=fApgq0lbJ~3m21aNQ@`~U^Xc)f_0 zOe6_#QkEVis-RDniAtL;5>{0WU!$%*Kh?&EkMJn0SO8BqZ=cEcCL>Iw zg1jIuRaH|XAf>W@h7LTm!~}aV>D`5Xe@}1kv`Gx@$~y%p@gNO=P!_*T=?!tNLno<@ z9XrO4tJ9Nbn8!#_R&BAMnKg;eJ-`1qd?fHVj?^XQ$Q`a(^!o_*x$TWPKR-Xn#jito zp%O56u6+5g%4k#xE!F^Nk?hhnWcM(-%az~n=Q}M! zqC)gr-GablS ztF!&U|2cn-vT+v_5kZnVSWuNyK2(7rU=ctflouDNsi}E*G$$SaI(i?;DbFDl!-IlS zkyPZ#X>lGB1|{nJYME1|vt z@#{Oi9)PGw2Bcc$PFuroJq*`lxNWi+J_A%^H*6jIz&%I3wGgwjsSgU{y|c|GGYE2|+V9bN708b-W)ii}OaRTpZtudVQ&e$5TbCns1&Ue6RY z6Rq?DBq(|V;H#w)bn=G;$4;FJ4-daky5IiRpUZR?n2buW98$jl1%O1Ljg*v>n;N6q zYpGED(;R%sAZbQ4)^PZI04;LFnanCy7|qc?1VBFZ9-!Guk05DCK(y#+Mold8f33=z zXWB;#UV3xy2a;QP={PBAGRTO4&Dq%UUSur<4AuV`G%A7p}qV0^>aPjz>YxiT?RxpaP$H9ATfrso67LOD!OdU z-%13L!`sJ)`~FHsI-VS_)e|Izfe`SW+Zdr~KK8f!z|?7MXpjVboYELLK3!M{kR@>O z@sl|u0;Wfg~kI(k`A1f<&O2ghV}P2{fpu&z>o!$dLDJ zyJ8)7ZP|gdvZiLRBKI9Q@;yuR5lwg|;ktX=HrZNV z2HWKHN^R%ZuPpcrVkCUI)U~I|x3#u1sTahuVGJDv*NH3)AyoNL?KeiSH~I9EU_8M1 zC&2BW?1Jq8npjX!P(c9)+Ef|(mY`q64`I8pF%G#W#@c&5ehd!!#?sXRzp*j?yQo-t^|gGgp4d5VHp0?r4G3v0>z*Ag+zZR#!-+* zU~(;8etk1=7?N+08v((m>{Ur@q$K($Lt1S8*)u5pb(juCu- z5CU*T42+BOR#lK_9>xCPn~}HfDia#NKFPnwX97!0w1i{=`-2*y>i+o9f4}p$F^J#2 zr8i-$`e5@)pMLfwZ@jL(IPnFcWf<*r3KlG72b?D2xXV0=) z0uCRv*{OyW9OzD(o`AGf)+d@&HZ1YMkipMh9-IiI#-cA|NR~F=Us>frJ97 zF+Ftj5RbIZ_C`L2f(sS)w5PU7RKZ?i3&e zIEe_6HXi>^H(Qai@C29T^Smse-np8Cfb<3MS_@Mf!(m>T>bDgf9cxopUw@W`#diLt za`cilKR-WIrnEE*V9tV+Z#-1tVrOSZjSt2WQG6u(Zqd=?L2V>QmDikcgLQ%LKqlGg z)0-0se&8(G1Sko?wD6-K7vI#e-s8`g_n*g^s(bg&-wt!=I4tp+Nfp{RKkxgKX*kDm zMwK&~5-~QnLA(rGy&D*jB(mRRQ)a_b( z#R+6uH6MC-1oC>3v|{K(TyAk@y+;PkZ|L(KSKE8gK6sd}2ZUO5Z z=gy290%%XN1CaE~`!(#G1!nl{N5b@@k2PdDj5VPTsoQZmZU(Z+8W>Cf)is@;SOKZn z-DTb96!_fmvjiyvED^{yhDwo_caSL}QG*kj=@^)pW})9vTGXHcSe|iHMqO~#%?jPn^8LMNJVie zc3b)6<>di){E>WBRa-{~sFo5K&!j-3pQ{b3;vb<8(s+u0qUYnsiOn?B)QQQ-_U6S{ z7!(Lj_$Tm^6u43gTUuI5AA}$lJ&=X*;2^^3<~#*IK?V!V6IwF_!f-HdPyCSPeZ2pfOk0MVw#yyL4=>wJ#CZTuEa|NF z>dqC@fotZ@t^|yx*qE*^3BEs66Nl>y;AnuNu4wlbvd*wT_1Ou!1t9d=+FF7iA_vcl z5|aIg4m`Pv5L3rV_7KHhvKk6n9ds@S?G~PEk&F;`tzuE>=$R87JxJQuQuvNhc2lTJ zICwO`)3=O=gY9tBj^WVJBd3j#)XjY1pU^Rq$@d1VDOa|6Xem_&aIyC96D9i*Wd68a z&9?`G^Ib9CRJ4eI2ju)(JOVCu5rs?Fyvukd#*bV0j!x!JA zf04_72PqXs$a7%)OwhvBduVPCcG%+mc56rpjC}adr8t=u1#-RFctGMqYi62xN&SI8_6z^rve?v;y!}}W4w%)*G@M>3i zMn;}a8YcY*vRql&_%K!%D9V9YbU}d+(lh=EVGcsOsuB3Hz;U6Jp%Ry8_;znVhmig8 z#|-X{>vk;YDb$ByKPIvDRX#H@>zL!Vg66j;Ph=z{E&!jJDwnjlxEMrn$}EWvL|nq- z$Jur3gMPvj<;ghAy;)5f`g0=IJ?&?Ct)>)C9t5}4z2zoR^~nRuTZE6jJeGvO2x52( zbc-cY=dCYV&vq{_CN3l_{4_0g9I_2`&InH)`}mhx&&tqpSP%w|&v3-g)04w&=)uHk zUZ>4{1lNud61GCXhugo7hH)6Q9mO-u1pMI{@QL~;<#^KGmpLG)p6x|28>+R|i$2JF9FY@wv21gC>gP6?RmfW8FjK&pfd8@AnO z+VlNCaW=9@WHJFzJO^)dh0DILi;KYaInVZSw(uIZCW2-RASHXxmT_nqntXzj70nkM z!Mhb38w>LQRqs`kzEDdHjag`2SJ);+%uC(5bjIaSC`pI29gCtq2Bf0I*9EA{*zbPi z(-xk9X|S#xlb-7Uhezu{u>BUV&qPwVw#gI=qOYw_BtVxaqR@l{1p!FBvY41pdn^~A z4k7(6)Zt=M-qH>cLr3yDM_VVua6^_#l4<42L!6PvO@$;}HT7=a_6$kJfUp=z`fNXx zUk1Ci25hAad4|UB;o)I6dGHNt80PjGZaeL%17ZzqENvy*;LmMc1Zf%i*Z2;DSCGvp zVC`d(l@X#|_@pqGfBQtHnp|$}aWqa>4r4_v<}#zo3%*{Y6%lldEz>=f6#O=tP z;xUxh2D~hkYtS~CYz0Omk;RF@oo)7uZQQsX;GwYp)^9UdIF-+BJqadgx-j7)4~2(j zAM*@}cHvP8^&T`z3UTrKL7b%s)4cgJcql7{CxXG!kZBqMJJ6-VpCRuX4rD?zfRxnZ zW+EXd&_T*Gz|T^BH3j$xjRGu?L{gXX<{~6YkuBf>;E8)l`KQps%DT87|_Vak$SZT_H>8jwj4)qRXXgOTU(*NzQ|aa;*YcPiEi0cuQ; z8RSvHTQpZq2N-$x_k05pPdfVA4U1;aU$RA(x5Rhi?w>GNb3xCtD4OERouIAGq}K&% zmtgOT@9HW59iRn*UaPERZ9jkCrBGhyvb#FYoAyG$7Kn?NIQqbI?L6V0EwEh}iALR* zc*jE=dc`QX882&nCjSdgiYcA!Y1ecaar99{^^pE1aF9_oPs|c(dw)$mUERG&fF9zB z&P=jQnH)m=s}a7ZCuXV|KskG;89;xG`IXL)0pebey8c^^Cqcq@N+*nH%aYW+;Z*q) z=!B`#a0d#mS-k+3Y`DByo&kT?0th9s+ps)=y9tv5;(;g~2%=Kpy#5e5wn33Jh^JAc zDs4Ef<-l*0l#*4~{A^r{6wj4PnVBz)mKWcZB zO?&SNWqc%lLA`rPL?&|&k>TUw#@A&7CL7r}#Ab|`S@f2EGqY62WHqE}ZOaO1YHC_o zT()Wzfu-^iOmE;)LTyav2JE}8qH^NoNpX|BlG}BJa%5v@`3yOu%8hQ*1}KfFlWxb}{QuPLtr#R5XVoii)&BXgVUigu}XZ(E3G!n zua?rUmq)b;n)OV2Lwhwi__FIYyS8MIdhP+{zSg!jZp#TXDA@sy0P91@1k}8IQBlP& zX-{6k+U8eev3?MT?^Mdr6^EPE zw+~>sL-)x#86{;osK-gt4=;yoVh(OpOK+QnbiF4I={T)4f6Njkl(&xWJGoy7Jm+5@o2fe?(N$E71RweoF1X^ zOgnZ3fO~KEs&GL52<%en%GTNeuM;N~6_iGjhWoZX#C`jt6h)CaZo>O@F=X^W(_uGo z$|xo#CPqd^F0NDBmGteYPrpw}YHcGjk-uPaSb0h&8s$!oAU9OLeVh6fTBi-0V==4T zT@28XTHp>=nfhYpVDjfKkyQGI=M|0*-ccNuTO1}tDbtGt2zvkb_}upO_9nb6;A*ee z6fLdKana}N=?39)^)~XAvp*Kr@AvaMd30MyRaF(%l#aG`m5?GhEWqOkzZ|-`7mrLN zWxBB${r1QJ0LFl(>oZ}Oed#Z@F+K=ez@ON~Z7;LP`9&Bqb7JfVTh|`t2P2yPS|XnT zWDYS!KDqr^-?vp9(*@4o0MKJAxFVdVaN5baas&Z=yPNj6J;3cm*|zu>JoulgfS)wv z?-j}3zSym5er|$4svy{#|FNL?B#+`ZjBKe z!RveFj?vSf^d>8Ea~MBrx4qD$di!Sqz>3sSe^x-kkJQn3@0k_%JN%`TN*C<|mv(p3 z$wH(TaH=h($ykr561mEM7{M&WO9WIM^tyrW1L$~o&&8Yt#2zdM@FO4P`3}(=g3d!E zF(0bHZ0QCL2FP0PagZ5+D)G@3M?XHzc^Qgquzy1m291PNi52`dTCyN= z`*va;KQ!V;QPa`_6KW210`Ou-fBEDCNC5t=0-VAP-v-w*b8v2Mu4E8B3-qoOg*Lo@ zpEw>F843B~k%tGnQRm~^E)K%^aM)54H($l~z4LpKYxU4!T?>3GhMu9Jp$GC+Uf&Jt zk7I>~5=81qf$WB>KY;_TJEW}tcd6MyvN);L7X#R9dxpu`3>=Q{-@gaPGSYNP(MptE zzFnj;+nt-jfLeIZ+T^MG_4l#-cLAtD6|)WW>R(u_9kB8yUb=g=cMng2nU^{en1_xM zyL*dv-^N44A98g3qF>n>%Kc;tU{C$Ja2fc&+KY(PK%h|c`|}Z%w0?RF^dN&1Yee25tNQz%Nb3rZqiRbkA}wBxm;q{8!p-g` zmJxVXkuv2c;gI+`;EQn&9)GrvZUw8;Wq7U-`87vhT-msmPrw$gyIE8vYg z_YYN=e=h3fVHFC{6(L+v=R=tdL-rc-e0w)A*kZWkZ*~R-wB-56i=u+-hX0{TYT&T19;i!tXvYI_5u%52_e zJ=4&^-^UW}_uU1>+=?JkxVY$lTuG!QPefv9WA_m7FhuTcO-Jtqy6j%D|C7!*}>+6BOJ+ zJMrlEzrn*0OD=U0Rd2`KSw#B9;1|_|{Y&mv+o`la4KskW?)DY5aP26xT||x;tk8yq z1%k_+Zs#<^p|{KxjDI%kjVx;1eC3>Wp4S>9(lxM3^q+gvLLbWbioViOi~j)Y*M8ja z@+EhnoSl^L_c{B{{MHQjO#^+%yKPSAg4z9Pj6XjJ8W{f4L<^!R@+25a(CCPKE&I`s z`{O{qy^ZnrmR`iz!*ZH|lDqlPubq`(-%ud4Zet+`+p%>Uo zy9UA{v_Bh{l<*vNNgVKPN>(B8oI z7=zU4u-tJSN^C_6uOn^b&}OfCdHl*Ji5x9KI2X}Wgc%kORBK)S+4=xk@I-aZVS?Oo8>o*exla>5JY zN)r?5?H>_PGR>W@kqW(ZgPen$Y)Po%vflgsR%KY_(x5xQHKhJ_sNG+VI>AbO68;3w zey_9M*EzEHZzs=z%3=QXlk_*q)HcKN2Q1jc+aI{#BeiSHyFZy2T>aardtVjNp!03i z(Zw9W!z=yzftyY$^b8lsbk_`;&rGGlX#-l@iy;7^Jh!(&G=^?@Fnw(q;o}j{WkTmTqY5CnRc1K~u8oNkOj}csPWdfdd0ISs4NwArXB4 zzrH**J_KYdP?hTJ0Tr|!1@p{HTd>z8Aog@A`*?75gLS!d?DX3I;_NV+zj?ac4P?1` zGSi8Yg?$H~WNJh_i`o*@958%!WnOKt%G%D z<0`r5-X}L)ZY8B|4`(w>UO6&fgU;JKiRXOE)2CKrQPA?A{GrHdv}4=hmtz+%vPxq;*# zbQpp=Lgnh=|9HG09jGe=$+|@^pglPV&NNWWR5f0kzusD8iL(ZMC8f)qy~D%Dn9DdK z?cpf0o}5t~1tqp{zti6ynKd+`2GW&zr&1Lr@r&r6MpMXUXPIm^XDq}*&rFX8rIUn5 zXR(cQ#23dv^a&Y9h=Jvg9zBBNpJDKp58m z%_Vg2BzjA}WKHEsn3+vhv=Dg{vm32oj4N>Yz)`QPxZKN<_O4#6_d;dv-EoVSjnmbO zlYeR4CNn`8NiR`Luf8Py9EdWfIRMwrSZr#@L)ukxBJQvH5t zq39gvhBu97_mb*wsQ8snVEgQx!OT@JO01Q&O5BBEDhs2jsiADKu|ysq)1n!NC^y0 zO28mNFrc8)5kX2Qi3v&z0fK<^5(G(T0veih$3a>I1VRZyu+S0EKv4P~bar;0XLt75 z{rBeH+;iV^ZaLrgy}whWd>c0#EB3PBk^{iN89gpC^fcw#0mALMm95nc%;n*x72On! z%qE!Tb`m#xK!K_u`Ma*#EK8XBtU5B+fb-Qu(Km&C+zG_MVPxhBi7DKSQohPG$5B8d zZEn^knwc8AZI1@5i?bo6AoJ>oS)Jee@uQV<+0Z0ugX5X!TrOEy9FPMlm!Mu!&LC1$ zr|}pYh+%L5Fm1)SX>1gLYQUPejJ#2$F3EAdIc?-2dNg!>O^(Io_;mLM^N7M z5aqw1`Rh@c1z&Thk?ZGop`11U((LET$Vj7J$VMZcBlJuBSRQg>a=E!DL z)vZAtn_`F7)@CXM&2*j4>x@c?O>6uBBs?UiV84~r*7pAQreQ%ZGu*rQ3>wWi?-{x$ z*Qvtvv1Xbb26<3!k%38drUR2dhwAW2{8JzhQ)2mNyvlG;EjviEar;%OyY-^~AX^sy zAX{c4R_4ngOe0$pZmD-_zFNs^6M&UPZ8^-(dr|Tx4v{r~~ZH1^1pZq05Fb$IK2Z---a)1H@fn zkD1=?!h94f-LjhIDi}}9fdBIzrJ+LnLt`)P;OUq;Z;}At_{k$|RK!g-eQsgt9%KSd zPav^zP2@p$y0UHiIXSs&^}zX~jSCM)kCVmmiHeH&j26FsBdQ-i`@>Fp=w9XyqE?BV zy4(yhXD|&-@J=|uE1T1o8Wxf#nR@;lZbmv^CEyR>S|-9HHlLRf4Os*CzZd1rEjbkTLyr~0xy+6JcL)3 zV4OI|krM{yg~0(G(ePl>O;(tQ((Hgf<=$T$8p<33}`1-_DN4jNv z0P-eq?dV_=-d2z<_kgMiKt2a#YtMy|2jEqaO)~3KWSMItl4MfZ2naC6)FYV$#4T_u ze4Q@`(5ifL<0(7cA1p>2SY$rm7)G_ze-8WnEiB&62K51-5As!&E-+xfTc6R*L(UoY zdzM{QWXOck94_ zyBH(~FV^-IyV77*%uA)tT&Yj;^Ic5Fb`im7=V;A;N=*r_^qEk%c@)!|l>Br@2J4R$ z&BcqX=Be!MFWk={=oRtq@o|+3PzSds%=pq2gSZtxY|bLG0Prr_7@ z`B8gU9z($w-nJGSZ`tNUUkzzVl~gH2h2NBmr0ELlv+vzYdZa~@wk-OPtt26i&k@r( zlb)&%jkGYfxfuOOpH!7_;fQXG)czWa=x5~X!cht#yWN7F=WDa5T?_M$XpM|TobdaR zEDf*8YSpDW>ih-wXgOQ0y1*~9Gkts`UqjZ6=^UFhK?U1=g-W!O(>%Rg zTiyP&25Nb3Wa^#u=`asoMLYwg3wS;O6E#W6Rs;PflF$0NjGxuZE^N~!4;4z5+HE2t zP#_A|b$@D8i|m}KJi1IR+%28I{babB|DRJ zN2ya~YEMa`Y0Kl5ody=sJbX=x?Y?Ud>}`_Hlt_YDE$M0-=Bjuefs}3GN@)yQ%7>Fp zy*;TF6z`9dQ`?YYe^8;t@OmL{x53K_LvBnuc`-Ii@7h>U$gYWr2V|_VCvo~nWP^u& zl}F9UtJ}a9TOU-WhU*O3>m{h+-%FSGZBAF7i@wnPTwWUW8>TpC1oQe0tW!i|La>F> z%fr`wt#PB_p=6VG{;e7&OF$U`~H|XKIY+co5ppcn=Hh61p0pW|mAc9P~ z33lqfJC?Kw<%Nd&Zt&8V>3y-eKf^TAcamqSU)Gc>3-wa23P2isjYdawJ^{NOWYW$v`=dBh*pIKApEazxyglPNAC$bikwS29akaedZ4##qs z_D|M35>CX{kKLD31}N_AHh1x|pMo4@mwLOhfE(otw3v&`(hpkY!)BWX>J1w~SzRh` z93iS8ZL~R3LsitPL2w?N#WyoEQuHF~Np~3PMm;ALu${>3``ETW6Aw;C)VtT#mEnRg zL3-NC0{$I@Gu@qKodC8}KUMxsS%4ps^zL=qBHKPJbyU1e`FQ{H?OdI2VznZ$nU190 zQyxb!)8~%T14%<1P2K|m@P~b8PmyzsC~-2;f<6$4YFGB+@ueZSoe8$RgYaTcUC#T0 z#KUH0w;6={ZpuZH6uJkLT7K@zvWOh1VeJ<@pW~rVrF+j+UTZxg`93u^ZhuZ z`sd{rA@NsKx~O_O@N!a?i4$mT8bK;{XVfkviR%h#4%NC}Zhsl>C2v#VxVc7XXmGge zTEzJnl}nza*A(5*9WLgK5A=4)0baouL{@9dBHu6$Rjeedc0_5gDk?%K~Cs zfWF67jiq^q#v30~O@H~jQ<6^Ju!MbH4GS`di6s-3nC5S29&Y&-$Ja~^oE@SZ_@l(4 z(N0oE$NISs9a_Z%|IepCCiq%NjhVemBtF>haoMcgr8wP*|2#^yLY3Oomo5(xHE!SEt*;a$4Q*|Z%6;lpZjrzHS54#BKxv4+XI0C1(5BjvfLn+0}>2ZEV!a=yJI4OVo)U`uzT09wFXZl*VflF($i@r zj~(kiT?X;pd&^N4u#pCIby1PY=&T5uM5qPigFH(Ht2va7(*z0ycqZBjA&NB^A4s63 z(c_I-{O54pR0=Q-=ILQs`gToi>>HKr;3u5sES}xIf_C>dSkENy!VpT7iGSokv;thO zUNK9^jldk~2@3EPopcJB!+Y1nRiP1{0IQ<4o7D^gXsr{R7`0#(Qz5fa(6yiV%wZLk zm4rcI(UjJBL-08OcG_iZa8bWh_j<@b05lff AEC2ui diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml index ce2dd9fd2c..181434a087 100644 --- a/docs/diagrams/ArchitectureSequenceDiagram.puml +++ b/docs/diagrams/ArchitectureSequenceDiagram.puml @@ -3,31 +3,37 @@ actor User participant ":UI" as UI participant ":Parser" as Parser -participant ":DeleteCommand" as Command -participant ":Model" as Model +participant ":DeletePatientCommand" as Command +participant ":ManagementSystem" as Management participant ":Storage" as Storage -User -> UI : "delete 1" +User -> UI : "delete-patient S1234567A" activate UI -UI -> Parser : parse("delete 1") +UI -> Parser : parse("delete-patient S1234567A") activate Parser -Parser --> UI : new DeleteCommand(1) +Parser -> Parser : parseDeletePatient(userInput) +Parser --> UI : new DeletePatientCommand("S1234567A") deactivate Parser -UI -> Command : execute() +UI -> Command : execute(manager, ui) activate Command -Command -> Model : deletePerson(1) -activate Model +Command -> Management : deletePatient("S1234567A") +activate Management -Model -> Storage : saveAddressBook() +Management -> Storage : savePatients(patients) activate Storage -Storage --> Model +Storage --> Management deactivate Storage -Model --> Command : result -deactivate Model +Management --> Command : removedPatient +deactivate Management + +Command -> UI : showPatientDeleted(removedPatient, "S1234567A") +activate UI +UI --> Command +deactivate UI Command --> UI deactivate Command From d20bf6c2c498ad094d8e83c2b8ac8aaccd0bd339 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Sun, 6 Apr 2025 21:06:56 +0800 Subject: [PATCH 150/203] Fix component relationships in architecture diagram --- docs/diagrams/ArchitectureDiagram.png | Bin 62897 -> 20788 bytes docs/diagrams/ArchitectureDiagram.puml | 73 ++++++++----------------- 2 files changed, 23 insertions(+), 50 deletions(-) diff --git a/docs/diagrams/ArchitectureDiagram.png b/docs/diagrams/ArchitectureDiagram.png index f422f95dd67fc1376247f82374b115d16337cf8b..2f73b46e4d372c5365983f19143ee38b85f3228d 100644 GIT binary patch literal 20788 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 [Patient] - [ManagementSystem] o--> [Appointment] - [ManagementSystem] o--> [Prescription] -} - -package "storage" { - [Storage] -} - -package "exception" { - [PatientNotFoundException] - [InvalidInputFormatException] - [DuplicatePatientIDException] - [UnloadedStorageException] -} - -database "File System" as filesystem - -User --> [UI] -[UI] --> [Parser] -[Parser] ..> [Command] -[Command] --> [ManagementSystem] - -[ManagementSystem] ..> [Storage] -[Storage] --> filesystem +component UI +component Parser +component Command +component Manager +component Model +component Storage +database FileSystem + +' Model contains patient, prescription, and appointment +note right of Model + Patient + Prescription + Appointment +end note + +User --> UI +UI ..> Parser +Parser ..> Command +Command --> Manager +Manager --> Model +Manager --> Storage +UI --> Command +Storage --> FileSystem @enduml \ No newline at end of file From b7468fd275b221f6f15c9a78c12b893e30b77646 Mon Sep 17 00:00:00 2001 From: judHoka Date: Sun, 6 Apr 2025 21:14:24 +0800 Subject: [PATCH 151/203] Updated DG with delete patient feature --- docs/DeveloperGuide.md | 42 +++++++++++++++++- docs/diagrams/deletePatientSequence.png | Bin 0 -> 49115 bytes docs/diagrams/deletePatientSequence.puml | 53 +++++++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 docs/diagrams/deletePatientSequence.png create mode 100644 docs/diagrams/deletePatientSequence.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8206353bdc..93c1dae6bd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -161,7 +161,7 @@ The system loads the stored list of patients and appointments. The user is now r **Step 2.** The user executes the following command to add a new patient: -add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St h/Diabetes, Hypertension +`add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St h/Diabetes, Hypertension` This command is read by the `ClinicEase` class and passed to the `Parser`. The `Parser` class identifies the command as `add-patient` and parses the fields. A `Patient` object is then constructed from the parsed data. @@ -187,6 +187,46 @@ The following sequence diagram shows how an `add-patient` operation flows throug --- +### Delete patient feature +The `delete-patient` feature allows users to **remove a patient** from the system using their **NRIC**. +When a patient is deleted, all their associated **appointments** are also removed to maintain data consistency. + +### Step 1. +The user launches the application. `ClinicEase` loads any saved data, including the patient list and appointments. +The user is now ready to delete a patient from the system. + +### Step 2. +The user executes the following command: + +`delete-patient S1234567A` + +This command is passed to the `Parser` class. +The `Parser` identifies the command as `delete-patient`, extracts the NRIC `S1234567A`, and passes it to a new `DeletePatientCommand`. + +> **Note** +> If the input format is incorrect (e.g., `delete-patient` with no NRIC), the parser throws an `InvalidInputFormatException` and displays an error message to the user. + +### Step 3. +The `DeletePatientCommand.execute()` method calls `ManagementSystem.deletePatient(nric)`. + +The method first **searches for the patient** with the provided NRIC in the patient list. +If found: +- The patient is removed from the list. +- All of the patient’s appointments are also removed. +- Both `patients` and `appointments` are saved using `Storage.savePatients()` and `Storage.saveAppointments()`. + +> **Note** +> If the NRIC is not found, the method returns `null` and an appropriate message is displayed. + +### Step 4. +Once the patient is successfully deleted, a confirmation message is shown to the user. +If saving to disk fails, an `UnloadedStorageException` is thrown and handled by the system to alert the user. + +The following sequence diagram shows how a `delete-patient` operation flows through the system: +![delete-patient](./diagrams/deletePatientSequence.png) + +--- + ### Storing Medical History Feature The `store-history` feature allows users to **add new medical history entries** for a specific patient in the system. diff --git a/docs/diagrams/deletePatientSequence.png b/docs/diagrams/deletePatientSequence.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3f5b9726e2be3e3b213984fba0f293b89e6fd9 GIT binary patch literal 49115 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 WX4xCh*6JqyEGwh5BSz}L>HiOS?Bm7& literal 0 HcmV?d00001 diff --git a/docs/diagrams/deletePatientSequence.puml b/docs/diagrams/deletePatientSequence.puml new file mode 100644 index 0000000000..2106a8c6d1 --- /dev/null +++ b/docs/diagrams/deletePatientSequence.puml @@ -0,0 +1,53 @@ +@startuml +hide footbox + +participant ":ClinicEase" as ClinicEase +participant ":Parser" as Parser +participant ":DeletePatientCommand" as DeletePatientCommand +participant ":ManagementSystem" as ManagementSystem +participant ":Storage" as Storage + +ClinicEase -> Parser : parse(input) +activate Parser + +Parser -> Parser : parseDeletePatient(userInput) +activate Parser +Parser --> Parser : :String (nric) +deactivate Parser + +create DeletePatientCommand +Parser -> DeletePatientCommand : new DeletePatientCommand(String) +activate DeletePatientCommand +DeletePatientCommand --> Parser +Parser --> ClinicEase : :DeletePatientCommand +deactivate Parser + +ClinicEase -> DeletePatientCommand : execute() +activate DeletePatientCommand +DeletePatientCommand -> ManagementSystem : deletePatient(nric) +activate ManagementSystem +ManagementSystem -> ManagementSystem : find matching NRIC in list + +alt Patient found + ManagementSystem -> ManagementSystem : remove patient from list + ManagementSystem -> ManagementSystem : remove patient’s appointments + ManagementSystem -> Storage : savePatients(patients) + activate Storage + Storage --> ManagementSystem + deactivate Storage + + ManagementSystem -> Storage : saveAppointments(appointments) + activate Storage + Storage --> ManagementSystem + deactivate Storage + + ManagementSystem --> DeletePatientCommand : deleted Patient +else Patient not found + ManagementSystem --> DeletePatientCommand : null + deactivate ManagementSystem + deactivate DeletePatientCommand +end + +DeletePatientCommand --> ClinicEase : Result (success/failure message) +deactivate DeletePatientCommand +@enduml From bcabe6c769663ba7c6df5aca9438c1e11f89d2ce Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 7 Apr 2025 02:07:51 +0800 Subject: [PATCH 152/203] updated view-patient implementation in DG --- docs/diagrams/viewPatientSequence.puml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/diagrams/viewPatientSequence.puml b/docs/diagrams/viewPatientSequence.puml index 9d1218eca3..5e377d63fc 100644 --- a/docs/diagrams/viewPatientSequence.puml +++ b/docs/diagrams/viewPatientSequence.puml @@ -19,21 +19,19 @@ Parser -> Parser : parseViewPatient(userInput) activate Parser Parser -> Parser : extractValue(userInput) activate Parser +deactivate Parser Parser --> Parser : nric :String deactivate Parser -Parser -> ViewPatientCommand : ViewPatientCommand(nric) -activate ViewPatientCommand Parser --> ClinicEase : ViewPatientCommand -deactivate Parser deactivate Parser ClinicEase -> ViewPatientCommand : execute() activate ViewPatientCommand -activate ManagementSystem ViewPatientCommand -> ManagementSystem : viewPatient(nric) +activate ManagementSystem ManagementSystem -> Patient : getPatient(nric) activate Patient @@ -45,10 +43,10 @@ ManagementSystem --> ViewPatientCommand deactivate ManagementSystem ViewPatientCommand --> UI : showPatientViewed(matchedPatient) +deactivate ViewPatientCommand activate UI UI --> ClinicEase : Patient details deactivate UI -deactivate ViewPatientCommand @enduml From 0ee8030caeebd5d4f5b367337daaa9eb9f14b5bf Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 7 Apr 2025 03:37:17 +0800 Subject: [PATCH 153/203] update view-patient DG --- docs/diagrams/viewPatientSequence.puml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/diagrams/viewPatientSequence.puml b/docs/diagrams/viewPatientSequence.puml index 5e377d63fc..3c4d06d409 100644 --- a/docs/diagrams/viewPatientSequence.puml +++ b/docs/diagrams/viewPatientSequence.puml @@ -1,6 +1,8 @@ @startuml hide footbox +actor User + participant ":ClinicEase" as ClinicEase participant ":UI" as UI participant ":Parser" as Parser @@ -8,6 +10,9 @@ participant ":ViewPatientCommand" as ViewPatientCommand participant ":ManagementSystem" as ManagementSystem participant ":Patient" as Patient +User -> ClinicEase : enter input +activate ClinicEase + ClinicEase -> UI : readCommand() activate UI @@ -42,11 +47,14 @@ deactivate Patient ManagementSystem --> ViewPatientCommand deactivate ManagementSystem -ViewPatientCommand --> UI : showPatientViewed(matchedPatient) +ViewPatientCommand -> UI : showPatientViewed(matchedPatient) deactivate ViewPatientCommand activate UI -UI --> ClinicEase : Patient details +UI --> ClinicEase deactivate UI +ClinicEase --> User +deactivate ClinicEase + @enduml From 6551b01bcf4f6ba1ddcdc676a5f4920a08e5e998 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Mon, 7 Apr 2025 10:00:46 +0800 Subject: [PATCH 154/203] Updated DG --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 6c9ebfecc9..d49692df04 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -39,7 +39,7 @@ The sequence diagram below illustrates how the operation for 'view-patient' woul --- -### Add and Delete Appointment feature +### Add/delete appointment feature The `add-appointment` and `delete-appointment` features allow users to manage appointments for registered patients. The system ensures that the **patient exists** before adding the appointment and that the **appointment exists** before deleting it. All changes are stored persistently. From 8a4acc1ae6957f77da3c061648c272cfedb29b0f Mon Sep 17 00:00:00 2001 From: judHoka Date: Mon, 7 Apr 2025 11:17:57 +0800 Subject: [PATCH 155/203] Updated Architeture Diagram and added Storage component --- docs/DeveloperGuide.md | 46 +++++++++++++++++++++++++ docs/diagrams/ArchitectureDiagram.png | Bin 20788 -> 41221 bytes docs/diagrams/ArchitectureDiagram.puml | 28 ++++++++------- src/main/java/miscellaneous/Ui.java | 1 + 4 files changed, 63 insertions(+), 12 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 2ee50d610e..5692ce6286 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -61,6 +61,52 @@ This architecture follows several design principles: 3. **Command Pattern**: Commands encapsulate actions and provide a uniform interface for execution 4. **Entity-Control Separation**: Entity classes (Patient, Appointment, Prescription) are separate from the controlling ManagementSystem that operates on them +
    + +### Storage Component + +The `Storage` component is responsible for reading from and writing to the file system to ensure persistence of application data in `ClinicEase`. + +#### Responsibilities + +The `Storage` class handles: +- Saving and loading **Patients** from `patient_data.txt` +- Saving and loading **Appointments** from `appointment_data.txt` +- Saving and loading **Prescriptions** from `prescription_data.txt` +- Generating HTML files for prescriptions into a `/prescriptions/` directory + +#### Key Features + +- Each data type is stored in its own file. +- Upon loading, `Storage` uses the `Parser` class to reconstruct objects like `Patient` and `Appointment`. +- When appointments are loaded, they are automatically linked to the corresponding patients via the `ManagementSystem`. + +#### Structure + +All methods are defined within a **single `Storage` class** with static methods like `savePatients()`, `loadAppointments()`, etc. +Initialization is done through the constructor `Storage(String directory)`, which sets the correct file paths. + +#### Dependencies + +- **Model**: Uses `Patient`, `Appointment`, and `Prescription` objects for reading/writing. +- **Commons**: Uses constants and utility methods if applicable. +- **Parser**: Converts text from the file back into model objects. +- **ManagementSystem**: Required to link appointments to patients during data loading. + +#### Design Considerations + +- Implements **centralised file handling**, keeping storage logic simple and manageable. +- Ensures **robust error handling** by throwing `UnloadedStorageException` if I/O operations fail or if initialization is not completed. +- Separates file paths by type for modular persistence and ease of maintenance. + +> **Note:** `Storage` should be initialised before calling any static methods that rely on file paths. Otherwise, `UnloadedStorageException` will be thrown. + +### Remarks + +- The `Storage` component is **stateless**, which means all its methods are static and operate on input data. +- It must be initialized with a file directory path before any load/save operations can be performed. +- All file paths are determined at runtime and stored as static fields internally. + ## Design & implementation ### View patient feature diff --git a/docs/diagrams/ArchitectureDiagram.png b/docs/diagrams/ArchitectureDiagram.png index 2f73b46e4d372c5365983f19143ee38b85f3228d..6f7d280063318a06b6df76cda12e3b55357c79b4 100644 GIT binary patch literal 41221 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 YZ(MSc98v97#Dag8<~z(vP23~@9~u<4(f|Me literal 20788 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 UI +UI ..> Object UI ..> Parser +UI --> Manager +UI --> Storage Parser ..> Command -Command --> Manager -Manager --> Model -Manager --> Storage +Parser ..> Object +Command --> Object +Command ..> UI +Command ..> Manager +Command ..> Storage +Manager --> Object +Manager <..> Storage +Storage ..> Object UI --> Command Storage --> FileSystem -@enduml \ No newline at end of file +@enduml \ No newline at end of file diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index f7103d7f2e..a8caeb911b 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -3,6 +3,7 @@ import manager.Appointment; import manager.Patient; + import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Scanner; From 810245419a0920305e921e055349ea00936e3c5b Mon Sep 17 00:00:00 2001 From: judHoka Date: Mon, 7 Apr 2025 11:21:39 +0800 Subject: [PATCH 156/203] Updated date of birth format from hh-MM-yyyy to yyyy-MM-hh --- docs/DeveloperGuide.md | 2 +- docs/UserGuide.md | 10 ++--- src/main/java/manager/ManagementSystem.java | 4 +- src/main/java/manager/Patient.java | 10 ++--- src/main/java/miscellaneous/Parser.java | 2 +- .../command/AddAppointmentCommandTest.java | 2 +- .../command/AddPrescriptionCommandTest.java | 2 +- .../command/DeleteAppointmentCommandTest.java | 2 +- .../command/ListAppointmentCommandTest.java | 6 +-- .../command/SortAppointmentCommandTest.java | 6 +-- .../ViewAllPrescriptionsCommandTest.java | 2 +- .../command/ViewPrescriptionCommandTest.java | 2 +- .../ManagementSystemPrescriptionTest.java | 2 +- .../java/manager/ManagementSystemTest.java | 38 +++++++++---------- src/test/java/manager/PrescriptionTest.java | 2 +- src/test/java/miscellaneous/ParserTest.java | 2 +- test-data/appointment_data.txt | 4 +- 17 files changed, 49 insertions(+), 49 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5692ce6286..4f859a37d3 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -259,7 +259,7 @@ The system loads the stored list of patients and appointments. The user is now r **Step 2.** The user executes the following command to add a new patient: -`add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St h/Diabetes, Hypertension` +`add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St h/Diabetes, Hypertension` This command is read by the `ClinicEase` class and passed to the `Parser`. The `Parser` class identifies the command as `add-patient` and parses the fields. A `Patient` object is then constructed from the parsed data. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 9a381a91e4..af4f807603 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -90,7 +90,7 @@ Format: `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS h/M Example of usage: -`add-patient n/John Doe ic/S1234567D dob/12-12-1999 g/M p/98765432 a/123 Main Street h/Diabetes, Hypertension` +`add-patient n/John Doe ic/S1234567D dob/1999-12-12 g/M p/98765432 a/123 Main Street h/Diabetes, Hypertension` Expected output: @@ -133,7 +133,7 @@ Expected Output:

    +
    ### Adding an appointment: `add-appointment` Adds a new appointment to the list of appointment. @@ -353,6 +355,8 @@ Expected output: ----------------------------------------------------------------------------------------------------
    +
    + ### Adding a prescription: `add-prescription` Adds a new prescription for a patient. @@ -461,6 +465,8 @@ Open this file in a web browser to view and print the prescription. ----------------------------------------------------------------------------------------------------
    +
    + ### Adding Medical History: `store-history` Adds one or more entries to a patient's medical history. @@ -531,6 +537,8 @@ Exits the program. Format: `bye`
    +
    + ## FAQ **Q**: How do I save my data? @@ -565,6 +573,8 @@ Advanced users are welcome to update data directly by editing that data file. - **Current Resolution:** This is an intended design trade-off to maintain parsing consistency, though it may be revisited in future versions. --- +
    + ## Command Summary | Action | Format, Examples | From 61fc9cd38cbafd165feac320fd8185514a598203 Mon Sep 17 00:00:00 2001 From: Wen Yee <141599443+chwenyee@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:14:59 +0800 Subject: [PATCH 199/203] Update DeveloperGuide.md --- docs/DeveloperGuide.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1bc25ff900..2de029fc40 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -50,6 +50,8 @@ The **Architecture Diagram** given above explains the high-level design of the C Given below is a quick overview of each component and how they interact with each other: +
    + ### Main components of the architecture The application consists of the following components: @@ -575,6 +577,7 @@ The `Storage` component is responsible for reading from and writing to the file --- +
    ## Implementation @@ -1018,6 +1021,8 @@ The class diagram below shows the relationships between these classes: --- +
    + ## Appendix: Requirements ## Product scope @@ -1288,6 +1293,8 @@ Use case resumes at step 1. --- +
    + ## Appendix: Instructions for Manual Testing Below is a suggested guide for **manual testing** of the ClinicEase application in a Command Line Interface (CLI) environment. From f18da6850973f08ee64537e80216c13b377f83c4 Mon Sep 17 00:00:00 2001 From: judHoka Date: Tue, 8 Apr 2025 13:17:35 +0800 Subject: [PATCH 200/203] Small change in PPP --- docs/team/judhoka.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/judhoka.md b/docs/team/judhoka.md index 158b46ba71..c8d8b0999b 100644 --- a/docs/team/judhoka.md +++ b/docs/team/judhoka.md @@ -20,7 +20,7 @@ My main contribution in features was to design and implement patient related fea - Allows users to register a new patient by specifying fields such as name, NRIC, date of birth, gender, phone number, and address. - Includes validation to prevent duplicate NRIC entries, ensuring each patient is uniquely identified. - Example: - `add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St #diabetic #followup` + `add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St` ### [`delete-patient`](../UserGuide.md/#deleting-a-patient--delete-patient) - Enables the removal of a patient using their NRIC. From 64589ac08532d22b230d47e1856334ea60be3d17 Mon Sep 17 00:00:00 2001 From: Wen Yee <141599443+chwenyee@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:17:55 +0800 Subject: [PATCH 201/203] Update DeveloperGuide.md --- docs/DeveloperGuide.md | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 2de029fc40..0cf26f8262 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1038,24 +1038,26 @@ This CLI-based Clinic Management System offers a simple yet effective solution f ## User Stories -| Version | As a ... | I want to ... | So that I can ... | -|---------|----------|---------------|-------------------| -| v1.0 | doctor | add my patients' personal details | I can add them into the system | -| v1.0 | doctor | delete my patients' personal details | I can remove them from the system | -| v1.0 | doctor | view my certain patient's personal details | I can view them in the system | -| v1.0 | doctor | add appointments into my schedule | I can add appointments plan from a patient needed to be tracked | -| v1.0 | doctor | delete appointments from my schedule | I can get rid of appointments no longer needed to track | -| v1.0 | doctor | list my upcoming appointments | I can manage my time effectively without manual scheduling | -| v1.0 | doctor | store patients' medical history | I can understand the patient's situation better | -| v1.0 | doctor | check all medical histories for one certain patient | I can know what happened before the patient come | -| v2.0 | doctor | add a new prescription for a patient | record the prescribed medications and instructions | -| v2.0 | doctor | view all prescriptions for a patient | track the patient's medication history | -| v2.0 | doctor | add symptoms to a prescription | document the patient's condition | -| v2.0 | doctor | add special notes to prescriptions | provide additional instructions to patients | -| v2.0 | doctor | generate a printable prescription | provide a professional document to the patient | -| v2.0 | doctor | edit my patients' personal details | update them if there is any updates | -| v2.0 | doctor | sort appointments by date | check which appointements are coming first | -| v2.0 | doctor | mark/unmark appointments | track my appointments more easily | + +| Version | As a ... | I want to ... | So that I can ... | +|---------|----------|-----------------------------------------------------|-----------------------------------------------------------------| +| v1.0 | doctor | add my patients' personal details | I can add them into the system | +| v1.0 | doctor | delete my patients' personal details | I can remove them from the system | +| v1.0 | doctor | view my certain patient's personal details | I can view them in the system | +| v1.0 | doctor | add appointments into my schedule | I can add appointments plan from a patient needed to be tracked | +| v1.0 | doctor | delete appointments from my schedule | I can get rid of appointments no longer needed to track | +| v1.0 | doctor | list my upcoming appointments | I can manage my time effectively without manual scheduling | +| v1.0 | doctor | store patients' medical history | I can understand the patient's situation better | +| v1.0 | doctor | check all medical histories for one certain patient | I can know what happened before the patient come | +| v2.0 | doctor | add a new prescription for a patient | record the prescribed medications and instructions | +| v2.0 | doctor | view all prescriptions for a patient | track the patient's medication history | +| v2.0 | doctor | add symptoms to a prescription | document the patient's condition | +| v2.0 | doctor | add special notes to prescriptions | provide additional instructions to patients | +| v2.0 | doctor | generate a printable prescription | provide a professional document to the patient | +| v2.0 | doctor | edit my patients' personal details | update them if there is any updates | +| v2.0 | doctor | sort appointments by date | check which appointements are coming first | +| v2.0 | doctor | mark/unmark appointments | track my appointments more easily | + --- ## Use Cases From 02656a7ff334a257d8f888ff6f8090215adeaf3a Mon Sep 17 00:00:00 2001 From: Wen Yee <141599443+chwenyee@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:25:08 +0800 Subject: [PATCH 202/203] Update UserGuide.md --- docs/UserGuide.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5fde9d370e..93ac878249 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -355,8 +355,6 @@ Expected output: ----------------------------------------------------------------------------------------------------
    -
    - ### Adding a prescription: `add-prescription` Adds a new prescription for a patient. From 1e2f113fd65e90cd028665569440cb6addbf5229 Mon Sep 17 00:00:00 2001 From: Wen Yee <141599443+chwenyee@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:53:07 +0800 Subject: [PATCH 203/203] Update chwenyee.md --- docs/team/chwenyee.md | 71 +++++++++++-------------------------------- 1 file changed, 17 insertions(+), 54 deletions(-) diff --git a/docs/team/chwenyee.md b/docs/team/chwenyee.md index 02576d8221..4d06050d15 100644 --- a/docs/team/chwenyee.md +++ b/docs/team/chwenyee.md @@ -29,65 +29,28 @@ and future-dated appointments (prevents past-date/time entries) Appointment, ExitCommand, HelpCommand, and Parser. #### Features Implemented -1. **add-appointment**: Adds a new appointment to the list of appointment. - -2. **delete-appointment**: Deletes a specified appointment from the appointment list. - -3. **sort-appointment**: Sorts the appointments in the appointment list and display the sorted list to the user. Sorting - can be performed by either `byDate` or `byId`. - -4. **help**: Simple command that outputs all available command inputs of the application. +- `add-appointment`: Adds a new appointment. +- `delete-appointment`: Deletes a specified appointment. +- `sort-appointment`: Sorts appointments by `byDate` or `byId`. +- `help`: Lists all available commands. #### Contributions to the UG: - -**Sections:** - -- **Table of Content** -- **Quick Start** - -- **Features:** - - - NOTE: Explains how to interpret command syntax, parameters, optional fields, input order, and case sensitivity. - - `help` - - `add-appointments` - - `delete-appointments` - - `sort-appointments` - - `bye` - - I wrote the description, command input formats, and examples of usage for these features, providing the important things to note for -parameters such as `NRIC`, `DATE`, `TIME`, and `APPOINTMENT_ID`. - -- **FAQ**: I wrote the FAQ section, covering how data is saved, how to transfer data, and the risks of editing data files directly. - -- **Known Issues**: I authored the command-parameter parsing issue, explaining the cause, impact, and current resolution of the problem when users omit spaces between command words and parameters. - -- **Command Summary**: I wrote the Command Summary table, ensuring each command's format and example of usage are clearly presented for users' quick reference. +- Wrote sections: Table of Contents, Quick Start, Features (`help`, `add-appointment`, `delete-appointment`, `sort-appointment`, `bye`). +- Added "NOTES" on feature's command syntax, parameters (`NRIC`, `DATE`, `TIME`, `APPOINTMENT_ID`). +- Wrote FAQ: data saving, data transfer, risks of editing files. +- Documented Known Issue: space omission in command parsing. +- Wrote Command Summary table with formats & examples of usage. #### Contributions to the DG: - -**Sections:** -- **Table of content** - -- **Design: Parser component** - - Documented the `Parser` class and its interaction with `Command` subclasses - - Created: - - Class diagram `parserClassDiagram.png`, showing the structure - - Sequence diagram `parserSequence.png`, showing the parsing flow - - Explained the parsing workflow in `Parser` - - -- **Add and Delete Appointment feature:** - - - Documented the implementation details of the `add-appointment` and `delete-appointment` features, - including step-by-step usage scenarios to clarify system behavior. - - Created sequence diagrams to visualize how the command interacts with the `Parser`, `ManagementSystem`, and `Storage` components. - - `addAppointmentSequence.png` for `add-appointment` - - `deleteAppointmentSequence.png` for `delete-appointment` - - Explained the reason they are implemented this way - - Explained the alternatives considered and justified their rejection - +- Documented `Parser` component design: + - Wrote explanation of parsing workflow. + - Created diagrams: `parserClassDiagram.png`, `parserSequence.png`. +- Add & Delete Appointment Features: + - Documented implementation details & usage scenarios. + - Diagrams: `addAppointmentSequence.png`, `deleteAppointmentSequence.png`. + - Explained rationale & rejected alternatives. +- Other sections: Table of Contents, Non-functional Requirements, Glossary. - Non-functional requirements - - Glossary #### Contributions to team-based tasks:
    ------------------------------------------Patient Details------------------------------------------
     Patient NRIC: S1234567D
     Name: John Doe
    -Date of Birth: 12-12-1999
    +Date of Birth: 1999-12-12
     Gender: M
     Address: 123 Main Street
     Contact: 98765432
    @@ -156,7 +156,7 @@ Expected Output:
     
    ------------------------------------------Patient Details------------------------------------------
     1. Patient NRIC: S1234567D
        Name: John Doe
    -   Date of Birth: 12-12-1999
    +   Date of Birth: 1999-12-12
        Gender: M
        Address: 123 Main Street
        Contact: 98765432
    @@ -167,7 +167,7 @@ Expected Output:
     ----------------------------------------------------------------------------------------------------
     2. Patient NRIC: S8765432F
        Name: Jane Donna
    -   Date of Birth: 12-05-2000
    +   Date of Birth: 2000-05-19
        Gender: F
        Address: 546 Main Street
        Contact: 91209310
    @@ -187,7 +187,7 @@ Format: `edit-patient ic/NRIC ATTRIBUTE`
     
     Example of usage:
     
    -`edit-patient ic/S1234567D p/91238989` or `edit-patient ic/S1234567D dob/17-08-1945`
    +`edit-patient ic/S1234567D p/91238989` or `edit-patient ic/S1234567D dob/1945-08-17`
     
     Expected output:
     
    diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java
    index a28e1ebeef..2cbde45337 100644
    --- a/src/main/java/manager/ManagementSystem.java
    +++ b/src/main/java/manager/ManagementSystem.java
    @@ -113,14 +113,14 @@ public void editPatient(String nric, String newName, String newDob, String newGe
             }
             if (newDob != null && !newDob.isBlank()) {
                 try {
    -                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
    +                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                     LocalDate parsedDob = LocalDate.parse(newDob, formatter);
                     if (parsedDob.isAfter(LocalDate.now())) {
                         throw new InvalidInputFormatException("Date of birth must be before today.");
                     }
                     patient.setDob(parsedDob);
                 } catch (DateTimeParseException e) {
    -                throw new InvalidInputFormatException("Invalid date format. Use dd-MM-yyyy.");
    +                throw new InvalidInputFormatException("Invalid date format. Use yyyy-MM-dd.");
                 }
             }
     
    diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java
    index f8b276c5aa..104d28a3be 100644
    --- a/src/main/java/manager/Patient.java
    +++ b/src/main/java/manager/Patient.java
    @@ -131,7 +131,7 @@ private String checkGender(String gender) throws InvalidInputFormatException {
         }
     
         private LocalDate parseAndValidateDob(String dobStr) throws InvalidInputFormatException {
    -        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
    +        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
             try {
                 LocalDate dob = LocalDate.parse(dobStr, formatter);
                 if (dob.isAfter(LocalDate.now())) {
    @@ -139,7 +139,7 @@ private LocalDate parseAndValidateDob(String dobStr) throws InvalidInputFormatEx
                 }
                 return dob;
             } catch (DateTimeParseException e) {
    -            throw new InvalidInputFormatException("Invalid date format. Use dd-MM-yyyy.");
    +            throw new InvalidInputFormatException("Invalid date format. Use yyyy-MM-dd.");
             }
         }
     
    @@ -183,7 +183,7 @@ public String toString() {
                             + "Address: %s\n"
                             + "Contact: %s\n"
                             + "Medical History: %s",
    -                id, name, dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")),
    +                id, name, dob.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
                     gender, address, contactInfo, formattedMedicalHistory);
     
             if (appointments.isEmpty()) {
    @@ -210,7 +210,7 @@ public String toStringForListView() {
                             + "Gender: %s\n   "
                             + "Address: %s\n   "
                             + "Contact: %s",
    -                id, name, dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")), gender, address, contactInfo);
    +                id, name, dob.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), gender, address, contactInfo);
     
             if (medicalHistory.isEmpty()) {
                 result += "\n   Medical History: None";
    @@ -239,7 +239,7 @@ public String toStringForListView() {
     
         public String toFileFormat() {
             String history = String.join(", ", this.medicalHistory);
    -        return this.id + "|" + this.name + "|" + dob.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
    +        return this.id + "|" + this.name + "|" + dob.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
                     + "|" + this.gender + "|" + this.address + "|" + this.contactInfo + "|" + history;
         }
     }
    diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java
    index d057e4d732..f75ed9be59 100644
    --- a/src/main/java/miscellaneous/Parser.java
    +++ b/src/main/java/miscellaneous/Parser.java
    @@ -106,7 +106,7 @@ private static Patient parseAddPatient(String input) throws InvalidInputFormatEx
     
             if (name == null || nric == null || birthdate == null || gender == null || phone == null || address == null) {
                 throw new InvalidInputFormatException("Patient details are incomplete!" + System.lineSeparator()
    -                    + "Please use: add-patient n/NAME ic/NRIC dob/BIRTHDATE(dd-MM-yyyy) g/GENDER p/PHONE a/ADDRESS");
    +                    + "Please use: add-patient n/NAME ic/NRIC dob/BIRTHDATE(yyyy-MM-dd) g/GENDER p/PHONE a/ADDRESS");
             }
     
             List medHistory = new ArrayList<>();
    diff --git a/src/test/java/command/AddAppointmentCommandTest.java b/src/test/java/command/AddAppointmentCommandTest.java
    index 1c60bbd4f1..616e7ae28b 100644
    --- a/src/test/java/command/AddAppointmentCommandTest.java
    +++ b/src/test/java/command/AddAppointmentCommandTest.java
    @@ -37,7 +37,7 @@ void setUp() throws UnloadedStorageException {
     
         @Test
         void execute_validAppointment_expectAppointmentAdded() throws Exception {
    -        Patient patient = new Patient("S1234567D", "Billy", "01-10-1990",
    +        Patient patient = new Patient("S1234567D", "Billy", "1990-10-01",
                     "M", "124 High St", "81234567", new ArrayList<>());
             new AddPatientCommand(patient).execute(manager, ui);
     
    diff --git a/src/test/java/command/AddPrescriptionCommandTest.java b/src/test/java/command/AddPrescriptionCommandTest.java
    index f9b5d42eb1..cf6a3823a1 100644
    --- a/src/test/java/command/AddPrescriptionCommandTest.java
    +++ b/src/test/java/command/AddPrescriptionCommandTest.java
    @@ -44,7 +44,7 @@ public void setUp() {
                 
                 // Add a test patient
                 Patient patient = new Patient(
    -                "S1234567A", "John Doe", "01-01-1990", "M",
    +                "S1234567A", "John Doe", "1990-01-01", "M",
                     "123 Main St", "98765432", new ArrayList<>()
                 );
                 system.addPatient(patient);
    diff --git a/src/test/java/command/DeleteAppointmentCommandTest.java b/src/test/java/command/DeleteAppointmentCommandTest.java
    index 4b553f40cb..0b6fc25d4a 100644
    --- a/src/test/java/command/DeleteAppointmentCommandTest.java
    +++ b/src/test/java/command/DeleteAppointmentCommandTest.java
    @@ -42,7 +42,7 @@ void setUp() throws UnloadedStorageException {
         @Test
         void execute_validNric_expectAppointmentDeleted() throws DuplicatePatientIDException, UnloadedStorageException,
                 PatientNotFoundException, AppointmentClashException, InvalidInputFormatException {
    -        Patient patient = new Patient("S1234567D", "Billy", "01-10-1990",
    +        Patient patient = new Patient("S1234567D", "Billy", "1990-10-01",
                     "M", "124 High St", "81234567", new ArrayList<>());
             new AddPatientCommand(patient).execute(manager, ui);
     
    diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java
    index 906e1e1313..8ec89035b5 100644
    --- a/src/test/java/command/ListAppointmentCommandTest.java
    +++ b/src/test/java/command/ListAppointmentCommandTest.java
    @@ -48,11 +48,11 @@ void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDE
             LocalDateTime dateTime3 = LocalDateTime.parse("2025-03-23 1200", DATE_TIME_FORMAT);
     
             List patients = List.of(
    -                new Patient("S1234567D", "Billy", "01-10-1990",
    +                new Patient("S1234567D", "Billy", "1990-10-01",
                             "M", "124 High St", "81234567", new ArrayList<>()),
    -                new Patient("S2345678D", "James" , "31-12-1980",
    +                new Patient("S2345678D", "James" , "1980-12-31",
                             "M", "133 Main St", "81229312", new ArrayList<>()),
    -                new Patient("S3456789D", "William" , "31-08-1970",
    +                new Patient("S3456789D", "William" , "1970-08-21",
                             "M", "17 Cornelia St", "81009214", new ArrayList<>())
             );
             manager.addPatient(patients.get(0));
    diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java
    index 002b5a0d31..903d711f46 100644
    --- a/src/test/java/command/SortAppointmentCommandTest.java
    +++ b/src/test/java/command/SortAppointmentCommandTest.java
    @@ -42,11 +42,11 @@ void setUp() throws UnloadedStorageException, DuplicatePatientIDException, Patie
             manager = new ManagementSystem(storage.loadPatients(), storage.loadAppointments(manager));
     
             List patients = List.of(
    -                new Patient("S1234567D", "Billy", "01-10-1990",
    +                new Patient("S1234567D", "Billy", "1990-10-01",
                             "M", "124 High St", "81234567", new ArrayList<>()),
    -                new Patient("S2345678D", "James" , "31-12-1980",
    +                new Patient("S2345678D", "James" , "1980-12-31",
                             "M", "133 Main St", "81229312", new ArrayList<>()),
    -                new Patient("S3456789D", "William" , "31-08-1970",
    +                new Patient("S3456789D", "William" , "1970-08-20",
                             "M", "17 Cornelia St", "81009214", new ArrayList<>())
             );
             manager.addPatient(patients.get(0));
    diff --git a/src/test/java/command/ViewAllPrescriptionsCommandTest.java b/src/test/java/command/ViewAllPrescriptionsCommandTest.java
    index dccfff0475..9b678c4889 100644
    --- a/src/test/java/command/ViewAllPrescriptionsCommandTest.java
    +++ b/src/test/java/command/ViewAllPrescriptionsCommandTest.java
    @@ -45,7 +45,7 @@ public void setUp() {
                 
                 // Add a test patient
                 testPatient = new Patient(
    -                "S1234567A", "John Doe", "01-01-1990", "M",
    +                "S1234567A", "John Doe", "1990-01-01", "M",
                     "123 Main St", "98765432", new ArrayList<>()
                 );
                 system.addPatient(testPatient);
    diff --git a/src/test/java/command/ViewPrescriptionCommandTest.java b/src/test/java/command/ViewPrescriptionCommandTest.java
    index 369ad82460..e919beee52 100644
    --- a/src/test/java/command/ViewPrescriptionCommandTest.java
    +++ b/src/test/java/command/ViewPrescriptionCommandTest.java
    @@ -45,7 +45,7 @@ public void setUp() {
                 
                 // Add a test patient
                 Patient patient = new Patient(
    -                "S1234567A", "John Doe", "01-01-1990", "M",
    +                "S1234567A", "John Doe", "1990-10-01", "M",
                     "123 Main St", "98765432", new ArrayList<>()
                 );
                 system.addPatient(patient);
    diff --git a/src/test/java/manager/ManagementSystemPrescriptionTest.java b/src/test/java/manager/ManagementSystemPrescriptionTest.java
    index c5155a9842..638a293617 100644
    --- a/src/test/java/manager/ManagementSystemPrescriptionTest.java
    +++ b/src/test/java/manager/ManagementSystemPrescriptionTest.java
    @@ -28,7 +28,7 @@ public void setUp() {
                 
                 // Add a test patient
                 testPatient = new Patient(
    -                "S1234567A", "John Doe", "01-01-1990", "M",
    +                "S1234567A", "John Doe", "1990-01-01", "M",
                     "123 Main St", "98765432", new ArrayList<>()
                 );
                 
    diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java
    index a5a2e48f34..70ead33643 100644
    --- a/src/test/java/manager/ManagementSystemTest.java
    +++ b/src/test/java/manager/ManagementSystemTest.java
    @@ -47,7 +47,7 @@ void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDExcepti
             List emptyListAppoint = new ArrayList<>();
             ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint);
     
    -        Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990",
    +        Patient patient = new Patient("S1234567A", "John Doe", "1990-10-01",
                     "M", "123 Main St", "81234567", new ArrayList<>());
     
             manager.addPatient(patient);
    @@ -59,13 +59,13 @@ void addPatient_validInput_expectPatientAdded() throws DuplicatePatientIDExcepti
         @Test
         void addPatient_duplicateId_expectExceptionThrown() throws InvalidInputFormatException {
             List existing = new ArrayList<>();
    -        Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990",
    +        Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01",
                     "M", "123 Main St", "81234567", new ArrayList<>());
             existing.add(patient);
     
             ManagementSystem manager = new ManagementSystem(existing, new ArrayList<>());
     
    -        Patient duplicate = new Patient("S1234567A", "Jane Smith", "02-02-1992",
    +        Patient duplicate = new Patient("S1234567A", "Jane Smith", "1992-02-02",
                     "F", "456 Sample Rd", "90000000", new ArrayList<>());
     
             assertThrows(DuplicatePatientIDException.class, () -> manager.addPatient(duplicate));
    @@ -78,7 +78,7 @@ void addPatient_validInput_expectPatientAddedAndSaved()
             List emptyListAppoint = new ArrayList<>();
             ManagementSystem manager = new ManagementSystem(emptyListPatient, emptyListAppoint);
     
    -        Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990",
    +        Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01",
                     "M", "123 Main St", "81234567", new ArrayList<>());
             manager.addPatient(patient);
     
    @@ -95,7 +95,7 @@ void addPatient_validInput_expectPatientAddedAndSaved()
         @Test
         void deletePatient_existingPatient_patientDeleted() throws UnloadedStorageException, InvalidInputFormatException {
             List patients = new ArrayList<>();
    -        Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990",
    +        Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01",
                     "M", "123 Main St", "81234567", new ArrayList<>());
             patients.add(patient);
             ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>());
    @@ -112,7 +112,7 @@ void deletePatient_existingPatient_patientDeleted() throws UnloadedStorageExcept
         void deletePatient_nonExistentPatient_patientNotFound() throws
                 UnloadedStorageException, InvalidInputFormatException {
             List patients = new ArrayList<>();
    -        Patient patient = new Patient("S1234567A", "John Doe", "01-01-1990",
    +        Patient patient = new Patient("S1234567A", "John Doe", "1990-01-01",
                     "M", "123 Main St", "81234567", new ArrayList<>());
             patients.add(patient);
             ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>());
    @@ -137,7 +137,7 @@ void deletePatient_emptyList_patientNotFound() throws UnloadedStorageException {
         @Test
         void viewPatient_validNric_patientFound() throws InvalidInputFormatException {
             List patients = new ArrayList<>();
    -        patients.add(new Patient("S1234567A", "John Doe", "01-01-1990",
    +        patients.add(new Patient("S1234567A", "John Doe", "1990-01-01",
                     "M", "123 Main St", "81234567", new ArrayList<>()));
             ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>());
     
    @@ -151,7 +151,7 @@ void viewPatient_validNric_patientFound() throws InvalidInputFormatException {
         @Test
         void viewPatient_invalidNric_patientNotFound() throws InvalidInputFormatException {
             List patients = new ArrayList<>();
    -        patients.add(new Patient("S1234567A", "John Doe", "01-01-1990",
    +        patients.add(new Patient("S1234567A", "John Doe", "1990-01-01",
                     "M", "123 Main St", "81234567", new ArrayList<>()));
             ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>());
     
    @@ -179,7 +179,7 @@ void addAppointment_validInput_expectAppointmentAdded() throws UnloadedStorageEx
             LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT);
             LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-22 1200", DATE_TIME_FORMAT);
     
    -        Patient patient = new Patient("S1234567D", "Billy", "01-10-1990",
    +        Patient patient = new Patient("S1234567D", "Billy", "1990-10-01",
                     "M", "124 High St", "81234567", new ArrayList<>());
             patients.add(patient);
             Appointment appointment1 = new Appointment("S1234567D", appointmentTime1, "Medical Checkup");
    @@ -207,7 +207,7 @@ void addAppointment_clashedAppointments_expectException() throws UnloadedStorage
             LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT);
             LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-20 1950", DATE_TIME_FORMAT);
     
    -        Patient patient = new Patient("S1234567D", "Billy", "01-10-1990",
    +        Patient patient = new Patient("S1234567D", "Billy", "1990-10-01",
                     "M", "124 High St", "81234567", new ArrayList<>());
             patients.add(patient);
             Appointment appointment1 = new Appointment("S1234567D", appointmentTime1, "Medical Checkup");
    @@ -237,7 +237,7 @@ void deleteAppointment_validInput_expectAppointmentDeleted() throws UnloadedStor
     
             LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT);
     
    -        Patient patient = new Patient("S1234567D", "Billy", "10-01-1990",
    +        Patient patient = new Patient("S1234567D", "Billy", "1990-10-01",
                     "M", "124 High St", "81234567", new ArrayList<>());
             patients.add(patient);
             Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup");
    @@ -259,7 +259,7 @@ void deleteAppointment_nonExistentId_expectNullReturned() throws UnloadedStorage
     
             LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-25 2100", DATE_TIME_FORMAT);
     
    -        Patient patient = new Patient("S1234567D", "Billy", "10-01-1990",
    +        Patient patient = new Patient("S1234567D", "Billy", "1990-10-01",
                     "M", "124 High St", "81234567", new ArrayList<>());
             patients.add(patient);
             Appointment appointment = new Appointment("S1234567D", appointmentTime, "Medical Checkup");
    @@ -328,7 +328,7 @@ void markAppointment_validInput_expectAppointmentMarked() throws DuplicatePatien
                 UnloadedStorageException, PatientNotFoundException, AppointmentClashException, InvalidInputFormatException {
             ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>());
     
    -        Patient patient = new Patient("S9876543Z", "John Doe", "01-01-1990",
    +        Patient patient = new Patient("S9876543Z", "John Doe", "1990-01-01",
                     "M", "123 Street", "12345678", new ArrayList<>());
             manager.addPatient(patient);
     
    @@ -347,7 +347,7 @@ void unmarkAppointment_validInput_expectAppointmentUnmarked() throws DuplicatePa
                 UnloadedStorageException, PatientNotFoundException, AppointmentClashException, InvalidInputFormatException {
             ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>());
     
    -        Patient patient = new Patient("S8765432Y", "John Doe", "01-01-1990",
    +        Patient patient = new Patient("S8765432Y", "John Doe", "1990-01-01",
                     "M", "123 Street", "12345678", new ArrayList<>());
             manager.addPatient(patient);
     
    @@ -367,7 +367,7 @@ void findAppointment_existingAppointment_expectAppointmentFound() throws Duplica
                 UnloadedStorageException, PatientNotFoundException, AppointmentClashException, InvalidInputFormatException {
             ManagementSystem manager = new ManagementSystem(new ArrayList<>(), new ArrayList<>());
     
    -        Patient patient = new Patient("S7654321X", "John Doe", "01-01-1990",
    +        Patient patient = new Patient("S7654321X", "John Doe", "1990-01-01",
                     "M", "123 Street", "12345678", new ArrayList<>());
             manager.addPatient(patient);
     
    @@ -403,7 +403,7 @@ void storeMedicalHistory_storeMedHistoryOnNewPatient_expectOneNewPatientWithMedH
     
             LocalDateTime appointmentTime = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT);
     
    -        Patient patient = new Patient("S1234567A", "John Doe", "10-01-1990",
    +        Patient patient = new Patient("S1234567A", "John Doe", "1990-10-01",
                     "M", "124 High St", "81234567", new ArrayList<>());
             patients.add(patient);
     
    @@ -427,7 +427,7 @@ void editPatientHistory_oldEntryNotFound_expectNoChange() throws
             ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>());
     
             List history = new ArrayList<>(List.of("Cold", "Migraine"));
    -        Patient patient = new Patient("F8888888Q", "Ellen", "12-12-1970", "F", "99 Peace Ave", "85556666", history);
    +        Patient patient = new Patient("F8888888Q", "Ellen", "1970-12-12", "F", "99 Peace Ave", "85556666", history);
             patients.add(patient);
     
             manager.editPatientHistory("F8888888Q", "Cancer", "Diabetes");
    @@ -445,7 +445,7 @@ void editPatientHistory_validHistory_expectUpdated() throws UnloadedStorageExcep
             List patients = new ArrayList<>();
             ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>());
             List history = new ArrayList<>(List.of("High BP", "Migraine"));
    -        Patient patient = new Patient("F1234567X", "Carol", "15-03-1975", "F", "Blk 999", "83334444", history);
    +        Patient patient = new Patient("F1234567X", "Carol", "1975-03-15", "F", "Blk 999", "83334444", history);
             patients.add(patient);
     
             manager.editPatientHistory("F1234567X", "High BP", "Hypertension");
    @@ -461,7 +461,7 @@ void editPatientHistory_emptyNewHistory_expectAssertionError() throws InvalidInp
             List patients = new ArrayList<>();
             ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>());
             List history = new ArrayList<>(List.of("Headache"));
    -        Patient patient = new Patient("T7654321B", "Sarah", "03-03-1992",
    +        Patient patient = new Patient("T7654321B", "Sarah", "1992-03-03",
                     "F", "88 Health Ave", "81231234", history);
             patients.add(patient);
     
    diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java
    index 8bb22eda27..abcae95de0 100644
    --- a/src/test/java/manager/PrescriptionTest.java
    +++ b/src/test/java/manager/PrescriptionTest.java
    @@ -93,7 +93,7 @@ public void generateHtml_withPatient_containsPatientInfo()
     
             // Create a sample patient
             Patient patient = new Patient(
    -                patientId, "John Doe", "01-01-1990", "M",
    +                patientId, "John Doe", "1990-01-01", "M",
                     "123 Main St", "98765432", new ArrayList<>()
             );
     
    diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java
    index 9fbe7b231d..f5fa1d94bf 100644
    --- a/src/test/java/miscellaneous/ParserTest.java
    +++ b/src/test/java/miscellaneous/ParserTest.java
    @@ -118,7 +118,7 @@ void parseDeleteAppointment_lowercaseInput_expectSuccess() throws InvalidInputFo
     
         @Test
         void parseAddPatient_invalidInputFormat_expectException() {
    -        String input = "add-patient n/John Doe ic/ dob/12-12-1999 g/M "
    +        String input = "add-patient n/John Doe ic/ dob/1999-12-12 g/M "
                     + "p/98765432 a/123 Main Street h/Diabetes, Hypertension";
             assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input));
         }
    diff --git a/test-data/appointment_data.txt b/test-data/appointment_data.txt
    index 71a3c2707d..9859899f65 100644
    --- a/test-data/appointment_data.txt
    +++ b/test-data/appointment_data.txt
    @@ -1,2 +1,2 @@
    -countId:129
    -128|true|S9876543Z|2025-04-10 3:00 PM|Dental Checkup
    +countId:116
    +115|true|S9876543Z|2025-04-10 3:00 PM|Dental Checkup
    
    From ac3fbaa822eee160bed87127c2034a39e6070262 Mon Sep 17 00:00:00 2001
    From: judHoka 
    Date: Mon, 7 Apr 2025 11:41:15 +0800
    Subject: [PATCH 157/203] Updated storage component with class diagram and link
     to the repo
    
    ---
     docs/DeveloperGuide.md              |   2 ++
     docs/diagrams/storageComponent.png  | Bin 0 -> 48698 bytes
     docs/diagrams/storageComponent.puml |  43 ++++++++++++++++++++++++++++
     test-data/appointment_data.txt      |   4 +--
     4 files changed, 47 insertions(+), 2 deletions(-)
     create mode 100644 docs/diagrams/storageComponent.png
     create mode 100644 docs/diagrams/storageComponent.puml
    
    diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md
    index 8b70dd6ad3..8cdb99be36 100644
    --- a/docs/DeveloperGuide.md
    +++ b/docs/DeveloperGuide.md
    @@ -63,7 +63,9 @@ This architecture follows several design principles:
     
    ### Storage Component +**API** : [`Storage.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/storage/Storage.java) +![Storage Component](diagrams/storageComponent.png) The `Storage` component is responsible for reading from and writing to the file system to ensure persistence of application data in `ClinicEase`. #### Responsibilities diff --git a/docs/diagrams/storageComponent.png b/docs/diagrams/storageComponent.png new file mode 100644 index 0000000000000000000000000000000000000000..32ce5b15f1fd79d7da1ea722fe3cf2ea6bae5ecc GIT binary patch literal 48698 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 OzWa9D=Bp-b&c6Xwh) : void + + loadPatients() : List + + saveAppointments(appointmentList : List) : void + + loadAppointments(system : ManagementSystem) : List + + savePrescriptions(prescriptionList : List) : void + + loadPrescriptions() : List + + savePrescriptionHtml(prescription : Prescription, patient : Patient) : void + } + + package "Objects" { + class Patient + class Appointment + class Prescription + } + + package "Utils" { + class Parser + class ManagementSystem + } + + Storage --> Patient + Storage --> Appointment + Storage --> Prescription + Storage --> Parser + Storage --> ManagementSystem +} + +@enduml \ No newline at end of file diff --git a/test-data/appointment_data.txt b/test-data/appointment_data.txt index 9859899f65..654a6f46c7 100644 --- a/test-data/appointment_data.txt +++ b/test-data/appointment_data.txt @@ -1,2 +1,2 @@ -countId:116 -115|true|S9876543Z|2025-04-10 3:00 PM|Dental Checkup +countId:130 +129|true|S9876543Z|2025-04-10 3:00 PM|Dental Checkup From ba021de3a9402fc912359a1621a383277b247ee4 Mon Sep 17 00:00:00 2001 From: judHoka Date: Mon, 7 Apr 2025 14:01:45 +0800 Subject: [PATCH 158/203] Updated Architecture diagram, added UI and Main component --- docs/DeveloperGuide.md | 64 +++++++++++++++++++++---- docs/diagrams/ArchitectureDiagram.png | Bin 41221 -> 43280 bytes docs/diagrams/ArchitectureDiagram.puml | 13 +++-- docs/diagrams/mainComponent.png | Bin 0 -> 20504 bytes docs/diagrams/mainComponent.puml | 18 +++++++ docs/diagrams/storageComponent.png | Bin 48698 -> 47978 bytes docs/diagrams/storageComponent.puml | 10 ++-- docs/diagrams/uiComponent.png | Bin 0 -> 61281 bytes docs/diagrams/uiComponent.puml | 31 ++++++++++++ 9 files changed, 116 insertions(+), 20 deletions(-) create mode 100644 docs/diagrams/mainComponent.png create mode 100644 docs/diagrams/mainComponent.puml create mode 100644 docs/diagrams/uiComponent.png create mode 100644 docs/diagrams/uiComponent.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8cdb99be36..7b4cdc4b57 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -20,23 +20,21 @@ Given below is a quick overview of each component and how they interact with eac The application consists of the following components: -* **miscellaneous**: Contains the user interface and parser components. +* **Miscellaneous**: Contains the user interface and parser components. * **UI**: Handles user interaction, displays information to the user, and reads commands from the console. * **Parser**: Processes user input strings and converts them into appropriate Command objects. -* **command**: Follows the Command pattern to implement various operations. - * **Command**: An abstract class that all specific commands extend. +* **Main**: The entry point of the application and acts as the orchestrator that connects all other components + +* **Command**: Follows the Command pattern to implement various operations. + * **Command (Main)**: An abstract class that all specific commands extend. * **Various Commands**: Specific command classes (AddPatientCommand, DeletePatientCommand, etc.) that implement different operations. -* **manager**: Contains entity classes and the management system that coordinates operations on them. - * **Entity Classes**: Patient, Appointment, and Prescription classes that represent domain objects. - * **ManagementSystem**: The central coordinator that manages collections of entities and implements business logic. +* **Manager**: The central coordinator that manages collections of entities and implements business logic. -* **storage**: Handles data persistence. - * **Storage**: Saves and loads data to/from files on disk. +* **Object**: Patient, Appointment, and Prescription classes that represent domain objects. -* **exception**: Contains custom exception classes for handling various error conditions. - * Various exceptions for handling input validation, patient lookup failures, etc. +* **Storage**: Saves and loads data to/from files on disk. ### How the architecture components interact with each other @@ -62,6 +60,52 @@ This architecture follows several design principles:
    +### UI Component +**API**: [`Ui.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/miscellaneous/Ui.java) + +![UI Component](diagrams/uiComponent.png) + +The `UI` component is responsible for handling all user interactions. It presents messages to the user, reads user inputs, and displays command results or errors. + +#### Responsibilities + +- Display a welcome message, help instructions, and goodbye message. +- Accept and return user input from the command line. +- Display confirmation messages and outputs for commands such as `add-patient`, `delete-patient`, `view-patient`, `add-appointment`, etc. +- Print errors and validation issues clearly to the user. + +#### Key Features + +- Uses `Scanner` to read input from `System.in`. +- Methods like `showPatientAdded()`, `showAppointmentMarked()`, and `showPatientList()` format data in a readable and consistent way. +- Provides contextual error messages via `showError()` to aid debugging and usage. + +#### Dependencies + +**Model**: Uses `Patient` and `Appointment` for displaying information. + +
    + +### Main component +**API**: [`ClinicEase.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/ClinicEase.java) + +![Main Component](diagrams/mainComponent.png) +The `Main` component is the **entry point** of the application. + +#### Responsibilities + +- Initializes core components: `Ui`, `Storage`, and `ManagementSystem`. +- Loads previously saved patient, appointment, and prescription data using `Storage`. +- Runs the main input loop by: + - Reading commands via `Ui` + - Parsing them into `Command` objects via `Parser` + - Executing commands with access to `ManagementSystem` and `Ui` +- Handles exceptions gracefully and displays errors to the user when needed. + +> While not a logic-heavy component itself, `Main` serves as the **coordinator** that ties together UI, command parsing, logic execution, and data storage. + +
    + ### Storage Component **API** : [`Storage.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/storage/Storage.java) diff --git a/docs/diagrams/ArchitectureDiagram.png b/docs/diagrams/ArchitectureDiagram.png index 6f7d280063318a06b6df76cda12e3b55357c79b4..67253cca02442e1ad769bc3b6cb2e79126f70433 100644 GIT binary patch literal 43280 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

    o67p>^w*IYv`%sc>UiPMhvLt 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 Zk1LYad)C`kJY9xAX2upq6^3-i{{kI$AGrVk literal 0 HcmV?d00001 diff --git a/docs/diagrams/managerComponent.puml b/docs/diagrams/managerComponent.puml new file mode 100644 index 0000000000..b5988db00f --- /dev/null +++ b/docs/diagrams/managerComponent.puml @@ -0,0 +1,44 @@ +@startuml +skinparam classAttributeIconSize 0 + +package "Manager Component"{ +class ManagementSystem { + - appointments : List + - patients : List + - prescriptions : List + + + ManagementSystem(List, List) + + ManagementSystem(List, List, List) + + + getPatients() : List + + setAppointments(List) : void + + getAppointments() : List + + addPatient(Patient) : void + + deletePatient(String) : Patient + + viewPatient(String) : Patient + + editPatient(String, String, String, String, String, String) : void + + storeMedicalHistory(String, String) : void + + viewMedicalHistoryByNric(String) : void + + viewMedicalHistoryByName(String) : void + + editPatientHistory(String, String, String) : void + + findPatientByNric(String) : Patient + + addAppointment(Appointment) : void + + deleteAppointment(String) : Appointment + + sortAppointmentsByDateTime(List) : List + + sortAppointmentsById(List) : List + + markAppointment(String) : Appointment + + unmarkAppointment(String) : Appointment + + findAppointmentsByNric(String) : List + + getPrescriptions() : List + + addPrescription(Prescription) : Prescription +} +} + +ClinicEase --> ManagementSystem +ManagementSystem --> Patient +ManagementSystem --> Appointment +ManagementSystem --> Prescription + +hide circle +@enduml + diff --git a/docs/diagrams/objectComponent.png b/docs/diagrams/objectComponent.png new file mode 100644 index 0000000000000000000000000000000000000000..f6688f08fd003ff8b8707cfa4a816ce9d5846988 GIT binary patch literal 103987 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/objectComponent.puml b/docs/diagrams/objectComponent.puml new file mode 100644 index 0000000000..877c8a0c0b --- /dev/null +++ b/docs/diagrams/objectComponent.puml @@ -0,0 +1,89 @@ +@startuml +skinparam classAttributeIconSize 0 + +package "Object Component" { +class Patient { + - id: String + - name: String + - dob: LocalDate + - contactInfo: String + - gender: String + - address: String + - medicalHistory: List + - appointments: List + + + Patient(id, name, dobStr, gender, address, contactInfo, medicalHistory) + + getId(): String + + getName(): String + + getDob(): LocalDate + + getGender(): String + + getAddress(): String + + getContactInfo(): String + + getMedicalHistory(): List + + setName(name: String): void + + setDob(dob: LocalDate): void + + setContactInfo(info: String): void + + setGender(gender: String): void + + setAddress(address: String): void + + getAppointments(): List + + addAppointment(appointment: Appointment): void + + deleteAppointment(apptId: String): void + + toString(): String + + toStringForListView(): String + + toFileFormat(): String +} + +class Appointment { + - id : String + - nric : String + - dateTime : LocalDateTime + - description : String + - isDone : boolean + + + Appointment(nric: String, dateTime: LocalDateTime, description: String) + + Appointment(id: String, nric: String, dateTime: LocalDateTime, description: String) + + getId(): String + + setRunningId(newId: int): void + + getNric(): String + + getDate(): LocalDate + + getTime(): LocalTime + + getDateTime(): LocalDateTime + + getRunningId(): int + + getDescription(): String + + isDone(): boolean + + markAsDone(): void + + unmarkAsDone(): void + + setIsDone(mark: boolean): void + + getStatusIcon(): String + + toString(): String + + toFileFormat(): String +} + +class Prescription { + - patientId : String + - timestamp : LocalDateTime + - prescriptionId : String + - symptoms : List + - medicines : List + - notes : String + + + getPatientId(): String + + getPrescriptionId(): String + + getTimestamp(): LocalDateTime + + getSymptoms(): List + + getMedicines(): List + + getNotes(): String + + toString(): String + + toFileFormat(): String + + static fromFileFormat(String): Prescription + + generateHtml(Patient): String +} + +} + +ManagementSystem --> Patient +ManagementSystem --> Appointment +ManagementSystem --> Prescription + +hide circle +@enduml From 3e197e372e68e2d5daf4db617088c1b68cc7d226 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Mon, 7 Apr 2025 20:20:08 +0800 Subject: [PATCH 161/203] Updated DG for Parser component. Change Parser.parseAddAppointment and parseDeleteAppointment to be private. --- docs/DeveloperGuide.md | 56 +++++++++- docs/diagrams/parserClassDiagram.png | Bin 0 -> 122767 bytes docs/diagrams/parserClassDiagram.puml | 52 ++++++++++ docs/diagrams/parserSequence.png | Bin 0 -> 44073 bytes docs/diagrams/parserSequence.puml | 45 ++++++++ .../java/command/AddAppointmentCommand.java | 4 + .../command/DeleteAppointmentCommand.java | 4 + src/main/java/miscellaneous/Parser.java | 4 +- src/test/java/miscellaneous/ParserTest.java | 96 ++++++++++-------- 9 files changed, 214 insertions(+), 47 deletions(-) create mode 100644 docs/diagrams/parserClassDiagram.png create mode 100644 docs/diagrams/parserClassDiagram.puml create mode 100644 docs/diagrams/parserSequence.png create mode 100644 docs/diagrams/parserSequence.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c39278c1ae..19c685f891 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -60,7 +60,60 @@ This architecture follows several design principles: 3. **Command Pattern**: Commands encapsulate actions and provide a uniform interface for execution 4. **Entity-Control Separation**: Entity classes (Patient, Appointment, Prescription) are separate from the controlling ManagementSystem that operates on them -## Design & implementation +--- + +## Design + +### Parser Component +**API** : [`Parser.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/miscellaneous/Parser.java) + +#### Overview of the `Parser` Component +![parser-class-diagram](diagrams/parserClassDiagram.png) + +- **Parser:** + - **Public API:** `parse(input)` + + - **Helper Methods:** `parseAddPatient()`, `parseAddAppointment()`, etc. + - These methods extract and validate input (using extractValue()), then return domain objects (Patient, Appointment, etc.). + + - **Utility Method:** `extractValue()` (reusable parameter extractor). + +- **Command:** + - **Abstract Superclass:** Defines `execute()` and `isExit()` for all commands. + - **Subclasses:** `AddPatientCommand`, `DeleteAppointmentCommand`, etc. + - Each accepts specific data (e.g., `AddAppointmentCommand` takes an `Appointment`). + +The sequence diagram below illustrates the interactions within the `Parser` component, taking parse(`add-appointment ic/S1234567D dt/2025-04-05 t/1400 dsc/Consultation`) +as example: +![parser-sequence-diagram](diagrams/parserSequence.png) + +> [!NOTE]: This sequence diagram only focus on the interactions within the `Parser` component, the other components +> such as `Ui`, `ManagementSystem` and `Storage` are omitted. + +How the `Parser` component works: +1. When `Parser` is called upon to parse a user command, `Parser` splits the input to identify the command type (e.g. `add-appointment`). + A `switch-case` delegates to the appropriate helper method: +```` +public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { + //... + String[] parts = userInput.split(" ", 2); + String commandWord = parts[0].toLowerCase(); + switch (commandWord) { + //... + case "add-appointment": + return new AddAppointmentCommand(parseAddAppointment(userInput)); + //... +```` + +2. The helper method (e.g., `parseAddAppointment()`) uses `extractValue()` to: + - Extract parameters (`ic/`, `dt/`, `t/`, `dsc/`) from the raw user input + - Validate formats (e.g., NRIC format, date parsing) + +3. The `Appointment` object will be constructed using extracted data. Then, `AddAppointmentCommand` + object is created, it will be returned to `ClinicEase` for further operations. +--- + +## Implementation ### View patient feature @@ -132,6 +185,7 @@ If saving fails, `ClinicEase` catches an `UnloadedStorageException` and informs The following sequence diagram shows how an `add-appointment` operation goes through the system: ![add-appointment](./diagrams/addAppointmentSequence.png) +Note: Ui component is omitted (only represented by "Display message" here) for simplicity reason. To clarify how is extractValue() called to extract each parameter: ```` diff --git a/docs/diagrams/parserClassDiagram.png b/docs/diagrams/parserClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ef29bdae2665fda96ecd75461585076da815a3 GIT binary patch literal 122767 zcmcG$by$_#_Ad^Cl(Zl%DbgVVl8XkV8$lWbgHn)QC`fk+DoBc`ASI!cNP`lB(hZ7) zz>-?9fIF6+^F6xHeeUo1J@>i$kGVo{l;h2_p#(4i4Ex4HW|% z9DE}j96U3kWAKUNo)8ND!{@1L=4tQd?t9bmswa-RqpRaBTTe#^HalN7XHQS}+tR|q z?l)~+J-u9R3fa54-0A6J#lbmtaLvff^WUH2;KFl!GBO{G=`e{>hOHgYk^$e;fVQTS%ZubQ}o^jmQ8xc`spC3+4WvBh&?wq8uM06Ve9g|OC zQT$yoQgr$$iv__^oG>(pqITXJPA%z#=Qyv7WbQuK?>|>EzM-WbU2Jb}mtrnUqTf=N z@Fk~M>DHP2_v#u4uF=t*Ja?%~bKDq&e%cTHNLpr#6537v>5H4XPu54(rco2ce~N6l z^1XFX=z|*@ed-Gx!)TJl{a%8bEjWjGLw)gzj~JiwUb|Fr)nX*g3)3|j6Z16oUC!$r zrhBH+BQ$dQelBSy!R?8;TO`hPH1RIk_il4$wXpEV#*VrMFI5WO>pfmdxy7=)ZDBjI_JrXQ^d6PfQ*XC+#N<9n;tXf%3x2%AK7V<0Iqx zI2@(uq`oHP#4@kKgwXX2Z}VM;SMGgblpXmt+@I^nqe4UKMlhNMD`Cv-W?mm?7l$by zwhTn;;SM!hKjo|oZzU3zlU@&ql5^n4*y{yiE|i}TgE0B{4lqYFG}y5Rd|s? z`Q;8>;lhQ!7nfpppIOdd|GdhAHllM`+^h7S5$L9o*`iA!EYXyRzdUZ`%Kw8*pqwU? zaFN`WuNYN-E7eDIHmpLV`_#^pYi|X~&C(Cu>S`jM7QCF1a*yp%U*4&zuJZP)El%X3 zwXx z)(f%=Ukn{%dz@NFw%ljd?>yUAL`OUjySJQk;eF%>J3Ef^RHpB{8fCx#h`jyWO$<$FI1y zLbvDQ;zucU)Pd}NXGM=&Nqs?}Z10*q#k0O6Y9%7}`;z;fJ`E8M;@4;Q6OQ37gkyhupVELW8$+o?LWx912ONC$n0t^_#cQaB@I|Q{ zS)RR5nZ%O93XeX9`neaBT;tKLI~IK0I*wi{;!v50{mng;G7+zW9+bY41Xcq;&3b< zQ&(^VZ=s`yBw{~K)J0K^slK-GP5c1HsipLv2Non}4Q;Y25s8w+8yMWp#<+I}JAVU(w4g`Q~S zv3zS3eTuA1++`GJfth<=xV$!)=`}4{2VfWY}CY^R=;y z@GyB*!oSC<-fzqAV6XDf`WS@P=+|rB7e#;n@=+NX@B}&WxiYt8>Pqt?-|BpY>wRKrBWuHAW($es7cz-{}*%lA3dm);*^G(ir6ZdT!w}vUd_^f*xsp z?#94Xggz0*<$Jbb{nFrbdH3v{knnGmvbQ`r38Xw`6GkgvHW|21?(N6=?yzR8etubT z({^Q8F->Sq*?XZot+fo<-T1i*;m{G@FB-0jTkpLx{6aBgbf6%1FaAg?B8H^3Fe9@& zhEW`ccGm4M4!QjKC2{lxZ)92(RhgWYJi^m?ibB3Hlw@(E(r=25JCr!8Ue3>xMlwHB zsus_2kXbbMXdp#%)}8e9^4&P<6MO z&K-Gjyn~{P{za{S=5s^!!&U3U(}P{TZyOIIw%YZlkoyb;&okfO*m@$p>oQP4=Du6! zYsem668nLLAJ%6`xccoD)5EvZ?_1?o$Ex4y?$_8Ah=demh(P7MX75WEH#n z#pWInHyN?lv2HK4a?7)8Y00{)Y>~fmS!> z2^(-N-tEl^C^(ABt_qYM)ZL6LbQk_k>WA5QRucP>g`c1-GKyTzeZAzuiAt8tcbMW>G+27}xmbv?W{EeZ=LVq5jA@JLvlI zmM=v)SjJ8z$b)sX)6k+-HH1z$Z(3~NS$tq|!GwJqDNVbQn0dA9u|$Qd@tZV3iPCg@ zMnpmSZQEmQS#q+E8clwhGoP6(NO*L|*!$!o6Xg7yq{zLtScFe;SA0i)t4YPx)DZTd zk0wYfrZ=nF{0NIGA-blE$zf3^uAr)_QyYbxN6HgrufvWsEFc}K!sFka4l%d8KAfYj@^t_83cTaF>(a=(5 z;``7O%|-bbqHi>o%5H4bM~AG{4voViCuXWkK1b`9D%#&}kFx#35m7?upq66m0U0{? zhR0h~8J-iXS~Y>xxxvTA1-9Gzhn7^{_u}UrBQ;?@-btlBGj7YfKJo6tLi5%1=LxI> zQyI*X*sAE9^Q+*s%|A1K*+!MNZC88Rmx!Fxn|<}iWIf)eE4ym3jK&R^TOV$0yzbnw zjw0!pP>*HQE6>l&v%lt0*wNGbWGqsp?uyjeH=j$6yxrcUy1yT&AS)l^GrlrUcI(za zS8wp~tmtW|KjRb2btVghVQl>VzLiIxgJxv9d%u^iazuRB%9KV`sv)m_d~_GLBd;&6 z+WUdJa{w~^UWS!StuEp~Wo5Lkm4f(SGVn%A`zy<_Cac%tk_3YLz7HD|Zx$?ktK6t4 zm42sg^v+J{at@&qGMi8}`jp45TYcNeZ$GZNJiFjH`$X;y!{gdJt*_T&6&OD8pI0M_ z+>bC57<;}}yokjTS0%(inNGy`Mx4hRb2kv&brROofTNz2dk4ZoL zI$xs?1zF|9uWBp8jd<&XY}r1)K)u4TUj4M>oc+4Tdin^5{437>>s_dYZdal!xvQG|2$U4E7~}c~z5qrE6N)B@U=$&aM$dC!FSh&-95>cI$rJ1(VB$VLU zU=pN2;QOqG;?m%^3574cY5Yy}5w$;Tljv_RT?lc^%u>a}jy}lg(@5YTXAs zwoD%1*AS_Af=%hIc$&AA_gtM!XLn9Mwtgv@^ZA9bv20Pi7Ry(hrghYH#I;X)Dpjr) zGqVPY<0D>jD7`W}ReLw)R&}0O=OdH%#3`)YSy}RdH-}!W_U$(w>}%`xO28t!b79`? zh}vmZVDP!2++6Ea>#eUJHk8PpVgmNQpQVr2>$5(fv*XeeUR7}~-`iddyM0eI{`7%p zo7>GFK?caWdKp_Ej@_-HlX|!>9u#AyH4WSCi+;;SYKZ zO4x|R6b;FkzIb^R6R~`%4-!yEEAGcK1?d4$nctX=wH;=YYK^9QX;OTyjl!P_RUzv9 zFg8~E=y0NP_3?u&CXaSz=9SD0X1&RBFDZQG@q#l?zV*Avc%w~=76tgU(nat`&`k-A z4}>g97=M}v5@yyPOid}{JWm&MIyc&4z!q;^v3+E6+Ey9-owLO=RH&Mv%k z?x5&7zMZScZaUI)pxf2^d|*r@P>bZ_Y=ALTOF>wwC7-QbTStmaOSp?r%@nm!{D^`^ zDJfT|9Yp=V;d6N^>wv}R&l{u9?v_s&Jh7ArARPL+x%}4j)xpM;w=L1EU8{vl0&C(1 z!Y@GI`}myok>F(Ma^r#Kc+laHOYsI_GXlS+QFk)cE`*fhv`wy%VlxRI6l6G~gj|a+Zfa8r+7F+S;`*V&^aHcn^yh z3LFc&UeoO!qGgBkR=nId*L9&zG1qM8Bag+eu5EVrYBg z(e053xjf?3FK)5%q>Dn*b*=7?d*(tHy4bw((oyeSU``^~5VQLRm#o<-|7;4YY2bsJZFdSV7o`#kAJLda`tjS= zlv~T*Me9_cT%srbb$yogc6B}btCCB=!qSgp3sZuu?ZTzTqrJJfo&ZY4D}Pk&ta#{+ep3#J&WGdJ`PQ(SS>6w^LIwo&{r%~;XF*>HsRGZy zE45s~rq%oNv<(f>WUnv+U;c6BPI6OfR@P=JmeAhDvNXyh(_OTnXhPPRy-V;-5pS?0 zm#CB95~}8Q%rWu-y@DX*x#Adl;&I@bX58K3+{(zHk|g= z=%VO~SmdXIQGN~n75I{fm>5}>Qv&~e2iKW1t7DB;|9wYCN5?SzW^@W`3f14C*=T1C z!j#`i{IB1fo?YIlhflX^vC|}m-7}O);k$ci=lOQ^#>d!&#`$}pMU<>j93`+$v2On3 z(u28&|9!vEmn-PYMN`_?MfpoZNRVymT~p^p@GN_u#4fJ;zuu8z4{#SJ01+3FK9=KxXE#~*UvHy-PJ7PDw94QGywNv}O9ugqBOOoiP$&wpR}Z6}!zf%xtX7qWj1{S|Jv%WppI zOdZXgI$ZkeV`7rg1owTKe|$R97}UFVwraWrNr(-#)$dS0C@mcbvTVfv$4jZGsUdeJ z(sp0|^;&0md9TfPDE{+PPR_jB-?snp=>nvHLj64Hzemw~?Nff4yb3l{EWeZ6x4ihh zMP=-I8Tq|lZWn0pYq9>y1XwXgN#n`w?G=W=2yBF8AVLvme7BZ9mpgVN_r5=4C1zg} z+ck{|>VEj};a<=@yqGq2aXn}m8rs>IYbRl!KOj7MaDc&V9(542w>-k`c!5sr*mSdr z*w+LR2b;-xW@sWG0E5W+hhjO(BG}H8n9TGA8G(p6ReKFD@>c z)%$tL+if;rD~_4ezow{8od|uo+I4~|6=1Q~$}rWr+ee27!^38a+FDvMh3FBdtV*{j zD_>58b-+ewuGQqV(bwOjX!%t#M=G3-P~E~jFoxFVW;}m=HA817h-MTY0%|w)nki*C z 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


    nDTOA{Rdy*_iHd#0nM|jnxr#GEDC=ZBmKFNU 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̦+qZZXhY(Aip;}Ld1IK7QmsbFZ+*}~>&Cr2l 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 w(Wj69`Ed9N%+LPk+Tc%^zvBM?{;PAmq;TF? "1" XYZCommand : creates > +Parser --> SubData : creates > + +XYZCommand --> SubData : uses > + +note top of Parser : Parses input into executable commands +note bottom of XYZCommand: - XYZcommand = AddPatientCommand, AddAppointmentCommand, etc... \n- execute and isExit are overridden \n- Constructor: XYZCommand(SubData data) +note right of SubData : - Subdata = Patient, Appointment and Prescription \n- field1 and field2 represent the variables extracted using Parser.extractValue() +@enduml diff --git a/docs/diagrams/parserSequence.png b/docs/diagrams/parserSequence.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa74efe26781919a0177067a478444ac6977897 GIT binary patch literal 44073 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%0A~;w|}3TP;?v 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 G@&5;y!NcSL literal 0 HcmV?d00001 diff --git a/docs/diagrams/parserSequence.puml b/docs/diagrams/parserSequence.puml new file mode 100644 index 0000000000..6ad4f4e482 --- /dev/null +++ b/docs/diagrams/parserSequence.puml @@ -0,0 +1,45 @@ +@startuml +hide footbox + + +participant ":ClinicEase" as ClinicEase +box "Interactions happened in Parser" #F0F0F0 +participant ":Parser" as Parser +participant ":Appointment" as Appointment +participant ":AddAppointmentCommand" as AddAppointmentCommand +end box + +ClinicEase -> Parser : parse("add-appointment ic/...") +activate ClinicEase + +activate Parser +Parser -> Parser : parseAddAppointment(userInput) +activate Parser #lightblue + +Parser -> Parser : extractValue(userInput) +activate Parser #lightgreen +note right of Parser: extractValue is called separately \n (not in a loop) to parse input and extract each parameter \n: NRIC, date, time, and description +Parser --> Parser : :String +deactivate Parser + +create Appointment +Parser -> Appointment : new Appointment() +activate Appointment +Appointment --> Parser : appt :Appointment +deactivate Appointment + +Parser --> Parser : appt :Appointment +deactivate Parser + + +create AddAppointmentCommand +Parser -> AddAppointmentCommand : new AddAppointmentCommand(appt) +activate AddAppointmentCommand +AddAppointmentCommand --> Parser : :AddAppointmentCommand +deactivate AddAppointmentCommand +Parser --> ClinicEase : :AddAppointmentCommand +deactivate Parser +deactivate ClinicEase + + +@enduml \ No newline at end of file diff --git a/src/main/java/command/AddAppointmentCommand.java b/src/main/java/command/AddAppointmentCommand.java index 7d90fb651a..7b0490c374 100644 --- a/src/main/java/command/AddAppointmentCommand.java +++ b/src/main/java/command/AddAppointmentCommand.java @@ -15,6 +15,10 @@ public AddAppointmentCommand(Appointment appointment) { this.appointment = appointment; } + public Appointment getAppointment() { + return appointment; + } + @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException, AppointmentClashException { diff --git a/src/main/java/command/DeleteAppointmentCommand.java b/src/main/java/command/DeleteAppointmentCommand.java index 831eaa0475..aca8dbb042 100644 --- a/src/main/java/command/DeleteAppointmentCommand.java +++ b/src/main/java/command/DeleteAppointmentCommand.java @@ -12,6 +12,10 @@ public DeleteAppointmentCommand(String apptId) { this.apptId = apptId; } + public String getApptId() { + return apptId; + } + @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Appointment removedAppointment = manager.deleteAppointment(apptId); diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index f97b49cf7b..2c8d22ae84 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -196,7 +196,7 @@ public static String[] parseStoreHistory(String input) throws InvalidInputFormat return new String[]{nric.trim(), medHistory.trim()}; } - public static Appointment parseAddAppointment(String input) throws InvalidInputFormatException { + private static Appointment parseAddAppointment(String input) throws InvalidInputFormatException { String temp = input.replaceFirst("(?i)add-appointment\\s+", ""); String nric = extractValue(temp, "ic/"); String date = extractValue(temp, "dt/"); @@ -229,7 +229,7 @@ public static Appointment parseAddAppointment(String input) throws InvalidInputF } } - public static String parseDeleteAppointment(String input) throws InvalidInputFormatException { + private static String parseDeleteAppointment(String input) throws InvalidInputFormatException { if (!input.matches("(?i)delete-appointment\\s+A\\d+")) { throw new InvalidInputFormatException("Invalid format! Please use: " + "delete-appointment APPOINTMENT_ID"); diff --git a/src/test/java/miscellaneous/ParserTest.java b/src/test/java/miscellaneous/ParserTest.java index 9fbe7b231d..054b00140d 100644 --- a/src/test/java/miscellaneous/ParserTest.java +++ b/src/test/java/miscellaneous/ParserTest.java @@ -23,11 +23,25 @@ class ParserTest { + private Appointment extractAppointment(String input) throws InvalidInputFormatException, + UnknownCommandException { + Command command = Parser.parse(input); + assertInstanceOf(AddAppointmentCommand.class, command); + return ((AddAppointmentCommand) command).getAppointment(); + } + + private String extractAppointmentId(String input) throws InvalidInputFormatException, + UnknownCommandException { + Command command = Parser.parse(input); + assertInstanceOf(DeleteAppointmentCommand.class, command); + return ((DeleteAppointmentCommand) command).getApptId(); + } + @Test - void parseAddAppointment_validInput_returnsAppointment() throws Exception { + void parse_validInputToAddAppointment_returnCorrectAddAppointmentCommand() throws Exception { String input = "add-appointment ic/S1234567D dt/2025-09-20 t/1430 dsc/Checkup"; - Appointment appointment = Parser.parseAddAppointment(input); + Appointment appointment = extractAppointment(input); assertNotNull(appointment); assertEquals("S1234567D", appointment.getNric()); @@ -36,82 +50,64 @@ void parseAddAppointment_validInput_returnsAppointment() throws Exception { } @Test - void parseAddAppointment_invalidFormat_expectException() { - String input = "add-appointment ic/S1234567D dt/2025-03-19 t/1200"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); - } - - @Test - void parseAddAppointment_missingDetail_expectException() { - String missingIc = "add-appointment ic/ dt/2025-03-19 t/1200 dsc/medical check-up"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(missingIc)); - - String missingDate = "add-appointment ic/S1234567D dt/ t/1200 dsc/medical check-up"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(missingDate)); - - String missingTime = "add-appointment ic/S1234567D dt/2025-03-19 t/ dsc/medical check-up"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(missingTime)); - - String missingDescription = "add-appointment ic/S1234567D dt/2025-03-19 t/1200 dsc/"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(missingDescription)); - } - - @Test - void parseAddAppointment_dateTimeInThePast_expectException() { + void parse_dateTimeInThePastOfAddAppointment_expectException() { String input = "add-appointment ic/S1234567D dt/2025-03-20 t/1300 dsc/Checkup"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input)); } @Test - void parseAddAppointment_invalidIcFormat_expectException() { + void parse_invalidIcFormatToAddAppointment_expectException() { String input1 = "add-appointment ic/S1234567 dt/2025-03-20 t/1300 dsc/Checkup"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input1)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input1)); String input2 = "add-appointment ic/S123467D dt/2025-03-20 t/1300 dsc/Checkup"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input2)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input2)); String input3 = "add-appointment ic/123467D dt/2025-03-20 t/1300 dsc/Checkup"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input3)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input3)); String input4 = "add-appointment ic/123467 dt/2025-03-20 t/1300 dsc/Checkup"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input4)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input4)); } @Test - void parseAddAppointment_invalidDateTimeFormat_expectException() { + void parse_invalidDateTimeFormat_expectException() { String input1 = "add-appointment ic/S1234567D dt/03-19 t/1900 dsc/Checkup"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input1)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input1)); String input2 = "add-appointment ic/S1234567D dt/2025-03-20 t/7:00PM dsc/Checkup"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseAddAppointment(input2)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input2)); } @Test - void parseDeleteAppointment_validInput_expectSuccess() throws InvalidInputFormatException { + void parse_validInputToDeleteAppointment_expectSuccess() throws InvalidInputFormatException, + UnknownCommandException { String input = "delete-appointment A100"; - String result = Parser.parseDeleteAppointment(input); + String result = extractAppointmentId(input); assertEquals("A100", result, "Appointment ID does not match"); } @Test - void parseDeleteAppointment_extraSpaces_expectSuccess() throws InvalidInputFormatException { + void parse_extraSpacesToDeleteAppointment_expectSuccess() throws InvalidInputFormatException, + UnknownCommandException { String input = "delete-appointment A100"; - String result = Parser.parseDeleteAppointment(input); + String result = extractAppointmentId(input); assertEquals("A100", result, "Appointment ID does not match"); } @Test - void parseDeleteAppointment_invalidAppointmentId_expectException() { + void parse_invalidAppointmentIdToDeleteAppointment_expectException() { String input = "delete-appointment 100"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input)); } @Test - void parseDeleteAppointment_lowercaseInput_expectSuccess() throws InvalidInputFormatException { + void parse_lowercaseInputToDeleteAppointment_expectSuccess() throws InvalidInputFormatException, + UnknownCommandException { String input = "delete-appointment a100"; - String result = Parser.parseDeleteAppointment(input); + String result = extractAppointmentId(input); assertEquals("a100", result, "Appointment ID does not match"); } @@ -120,7 +116,7 @@ void parseDeleteAppointment_lowercaseInput_expectSuccess() throws InvalidInputFo void parseAddPatient_invalidInputFormat_expectException() { String input = "add-patient n/John Doe ic/ dob/12-12-1999 g/M " + "p/98765432 a/123 Main Street h/Diabetes, Hypertension"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parseDeleteAppointment(input)); + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input)); } @Test @@ -176,8 +172,20 @@ void parse_addAppointmentCommand_expectAddAppointmentCommand() throws InvalidInp @Test void parse_wrongFormatAddAppointment_expectInvalidInputFormatException() { - String input = "add-appointment ic/ dt/ t/ dsc/"; - assertThrows(InvalidInputFormatException.class, () -> Parser.parse(input)); + String unfilledParams = "add-appointment ic/ dt/ t/ dsc/"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(unfilledParams)); + + String missingIc = "add-appointment ic/ dt/2025-03-19 t/1200 dsc/medical check-up"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(missingIc)); + + String missingDate = "add-appointment ic/S1234567D dt/ t/1200 dsc/medical check-up"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(missingDate)); + + String missingTime = "add-appointment ic/S1234567D dt/2025-03-19 t/ dsc/medical check-up"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(missingTime)); + + String missingDescription = "add-appointment ic/S1234567D dt/2025-03-19 t/1200 dsc/"; + assertThrows(InvalidInputFormatException.class, () -> Parser.parse(missingDescription)); } @Test From 2bbc2bbca8513d24358bdc34f43f7877adff5482 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Mon, 7 Apr 2025 20:54:08 +0800 Subject: [PATCH 162/203] Updated known issue in UG, Updated PPP --- docs/UserGuide.md | 8 ++++++++ docs/team/chwenyee.md | 25 ++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 9a381a91e4..4ebca7fdaf 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -509,6 +509,14 @@ Format: `bye` ## Known Issues +1. **Command-Parameter Parsing Issue** + When users input commands without a space between the command word and parameters (e.g., `add-appointmentic/` instead of `add-appointment ic/`), + the system incorrectly treats this as an unknown command rather than identifying it as a valid command with incorrect formatting. + - **Cause:** + This behavior is due to from the current parser implementation's strict space-delimited tokenization logic in the initial input splitting phase. + - **Impact:** The system cannot recognize the intended valid command, provide appropriate format-suggestion error messages. + - **Current Resolution:** This is an intended design trade-off to maintain parsing consistency, though it may be revisited in future versions. + ## Command Summary | Action | Format, Examples | diff --git a/docs/team/chwenyee.md b/docs/team/chwenyee.md index 5b69588aad..3cee669b4c 100644 --- a/docs/team/chwenyee.md +++ b/docs/team/chwenyee.md @@ -20,8 +20,11 @@ are present. 4. Restructured the code in `ClinicEase.java` and `Parser.java`, and created a `command` package to make the codebase more OOP after v1.0. 5. Linked `Appointment` Class to `Patient` Class to ensure appointments stored in a `Patient` object are kept in sync with the appointment list in `ManagementSystem`. -6. Changed the data type of `dateTime` variable in `Appointment` to be `LocalDateTime` or better input validation with +6. Changed the data type of `dateTime` variable in `Appointment` to be `LocalDateTime` for better input validation of `dt/` and `t/`, and to simplify the implementation of the `sort-appointment` feature. +7. Added comprehensive validation for: NRIC format compliance, appointment scheduling conflicts (throws `AppointmentClashException`) +and future-dated appointments (prevents past-date/time entries) +8. Implemented cleanup of associated appointment records when the patient is deleted. #### Features Implemented 1. **add-appointment**: Adds a new appointment to the list of appointment. @@ -60,16 +63,27 @@ parameters such as `NRIC`, `DATE`, `TIME`, and `APPOINTMENT_ID`. **Sections:** +- **Design: Parser component** + - Documented the `Parser` class and its interaction with `Command` subclasses + - Created: + - Class diagram `parserClassDiagram.png`, showing the structure + - Sequence diagram `parserSequence.png`, showing the parsing flow + - Explained the parsing workflow in `Parser` + + - **Add and Delete Appointment feature:** - Documented the implementation details of the `add-appointment` and `delete-appointment` features, including step-by-step usage scenarios to clarify system behavior. - - Created a sequence diagram for both `add-appointment` and `delete-appointment` features, - visualizing how the command interacts with the `Parser`, `ManagementSystem`, and `Storage` components. + - Created sequence diagrams to visualize how the command interacts with the `Parser`, `ManagementSystem`, and `Storage` components. + - `addAppointmentSequence.png` for `add-appointment` + - `deleteAppointmentSequence.png` for `delete-appointment` - Explained the reason they are implemented this way - Explained the alternatives considered and justified their rejection - Non-functional requirements + + - Glossary #### Contributions to team-based tasks: @@ -81,5 +95,6 @@ parameters such as `NRIC`, `DATE`, `TIME`, and `APPOINTMENT_ID`. #### Review/mentoring contributions: - Helped teammates resolve Git merge conflicts and guided them on pull request practices. -- Reminding teammates of important deadlines -- Helped to test out the newly-implemented features to ensure the feature works as desired. \ No newline at end of file +- Reminding teammates of important deadlines. +- Helped to test out the newly-implemented features to ensure the feature works as desired. +- Discussed with teammates on what to include for Design and Implementation section in Developer Guide. \ No newline at end of file From d65d447910a2395e9eab8d89d7b1fc50bc5da4dc Mon Sep 17 00:00:00 2001 From: yukuan Date: Mon, 7 Apr 2025 21:02:31 +0800 Subject: [PATCH 163/203] add java-doc for my code, add command class diagram, and update ppp --- docs/DeveloperGuide.md | 87 +++++++++ docs/diagrams/Command.png | Bin 0 -> 359752 bytes docs/diagrams/Command.puml | 184 ++++++++++++++++++ docs/team/jyukuan.md | 73 ++++--- src/main/java/command/EditPatientCommand.java | 11 ++ .../command/EditPatientHistoryCommand.java | 21 ++ .../java/command/StoreMedHistoryCommand.java | 26 +++ .../java/command/ViewMedHistoryCommand.java | 19 ++ src/main/java/manager/ManagementSystem.java | 60 ++++++ 9 files changed, 455 insertions(+), 26 deletions(-) create mode 100644 docs/diagrams/Command.png create mode 100644 docs/diagrams/Command.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8cdb99be36..45ccf51cc2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -62,6 +62,93 @@ This architecture follows several design principles:
    +--- +## Command Component +**API** : [Command Classes](https://github.com/AY2425S2-CS2113-T11b-4/tp/tree/master/src/main/java/command) + +![Command Component](diagrams/Command.png) + +--- + +### Overview + +The `Command` component is responsible for **handling and executing user commands** in ClinicEase. It defines a common interface (`Command`) for all commands and organizes the various command classes (e.g., `AddAppointmentCommand`, `DeletePatientCommand`) that operate on the `ManagementSystem` and interact with the `Ui` to provide application functionality. + +--- +### Responsibilities + +1. **Encapsulate Command Logic**: Each command class holds the data or parameters needed to carry out a specific user request (e.g., adding a new appointment, deleting a patient). +2. **Execute on System**: Using a uniform `execute()` interface, commands interact with the `ManagementSystem` to perform the requested action. +3. **Provide Exit Control**: Certain commands can signal the application to terminate (e.g., `ExitCommand`), by overriding `isExit()` to return `true`. + +--- + +### Key Features + +- **Abstract Base Class** + `Command` is declared as an abstract class, defining two key methods: + - `execute(manager: ManagementSystem, ui: Ui) : void` – where the command’s logic is implemented. + - `isExit() : boolean` – indicates if the command should terminate the main program loop. + +- **Multiple Subclasses** + Each subclass, such as `AddPatientCommand` or `FindAppointmentCommand`, implements the `execute()` method to fulfill a specific function (adding a patient, finding an appointment, etc.). + +- **Command Pattern** + This design follows a simplified [Command Pattern](https://en.wikipedia.org/wiki/Command_pattern), enabling a clear separation of concerns between **input parsing**, **system logic**, and **UI presentation**. + +--- + +### Structure + +1. **Single Abstract Class** + `Command` resides at the top of the hierarchy. + +2. **Subclasses** + - **AddAppointmentCommand** — adds a new appointment to the system. + - **DeletePatientCommand** — removes a patient by NRIC. + - **SortAppointmentCommand** — sorts appointments by date or ID. + - *(... other commands like `EditPatientCommand`, `ViewPrescriptionCommand`, etc.)* + +3. **Uniform Execution** + All command classes share the same `execute()` signature but implement distinct behaviors. + +--- + +### Dependencies + +- **`ManagementSystem`**: Each command calls methods from `ManagementSystem` to manipulate the core data (patients, appointments, prescriptions). +- **`Ui`**: Commands display success/failure messages and prompt user outputs via the `Ui` component. +- **`Parser`**: Typically, commands themselves do not parse raw input strings. Instead, the `Parser` constructs a command object with the necessary parameters before execution. +- **`Storage`**: Some commands (e.g., `AddPatientCommand`) indirectly trigger save operations, relying on `ManagementSystem` which delegates to `Storage` to persist changes. + +--- + +### Design Considerations + +- **Extensibility** + Adding a new user action only requires creating a new `Command` subclass and updating `Parser` to recognize the new keyword(s). + +- **Error Handling** + Commands may throw or handle exceptions such as `PatientNotFoundException` or `UnloadedStorageException`, ensuring robust operation even if data is invalid or storage is unavailable. + +- **Single Responsibility** + Each command focuses on exactly one task (e.g., marking an appointment). This keeps classes small, cohesive, and easier to test or maintain. + +--- + +### Remarks + +- Commands are **stateless** aside from storing the **parameters** needed for execution (e.g., an appointment ID to be deleted). +- The **flow** is typically: + 1. `Parser` reads user input and creates an appropriate `Command` instance. + 2. The main loop calls `command.execute(manager, ui)`. + 3. If `command.isExit()` is `true`, the application terminates. + +- This approach **decouples** user input parsing from application logic, making the system easier to extend without modifying existing commands. + +> **Note:** The `Command` classes rely on the `Parser` to supply valid parameters. If parsing fails, `Parser` throws appropriate exceptions before the `Command` is even constructed. +--- + ### Storage Component **API** : [`Storage.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/storage/Storage.java) diff --git a/docs/diagrams/Command.png b/docs/diagrams/Command.png new file mode 100644 index 0000000000000000000000000000000000000000..52722af2019577938e23b77ef518fff87785f00d GIT binary patch literal 359752 zcmce;1yq&m);5fav^3JGASEqQ(j_2*D4^0Ppdj5T-Jl?0&?$n8ldm)Y6WcS)2?{Ua#7=Bk4PiNw-3lbb+scU6lw+c=m#htzz zVYcM34+4KOcX1`qYe%rld*iO<@u_naGtpR1fT)ex2-k@#A941hZFwDZU*!$@$EWlfGx9 zKip~zEis>@?0i8C8}Fc0J_WO`6Z2^svQ^*}y0y}2rF_2FDWu?R%oBTi z&x8DFhl{0acUwsaGhY79OGTv0?l)~a4)*id;_u6pr;R<6j?glER}~}0s#oHkaGI0g z@fq@fpatFbf^YjVoUM1#3f>xIzYW=6BWg)_x%`pIoQt)FZ(6v_tun8E^j*PX0>?Wp z)GN;+!I7@{hXk=5PL~O;IO}hABOji)6+Jik&B_BC&RU|pC8H%SERfHoR8Dy7KjpPH1>PuF&-b@d9gs1 z_VLSVu5-tgkPU}ajOcsKi!bVC^3w6HX*j7&#LsJNH&Trc-bp;}&P^?~dBfRpd*ofk ztJ8V@$Bu?&gcc;P9JTJPMc-6hWsFXiij8#LC+WM-IbQID2D9DTgRk*O`#J+45HYgx3iUEoseZ2P^7G@m;?Ex7w{xamkBC~(`zU(8q&-hJj4((|T_ ztl*}Fmn@3xUP|9Vz)8SOi*wSJ828Tf6=6*p3k_kEVx?ZeC^)r;e6DNWE9PAHUU{zbGDnq*5XLGt~>vV+4W+(oQx zY>KQ({Mz|NlvcwE`SY5lOG2%FAy57Mye2$zTeOaqNrk`^k)HH8`TIsgOZb% zNgq%@M!%YEaxn)G%i_Sl1WhxDe*H}rho53g?5`K$uUG%?e{C~Jc=hT4DTOU{y!YdC z&du!~mwx}yrqQI6jEu~O4@2^l zFMOD_G*b3X2Vp>E|62Hoqm~T%cHr{a(yLCFZYGx&6@^Ab47L`$zVlAoco3V2VbJ{d zjVjkEtvdM}p$v^h_OvL=t&=6a?xo9z%J^d~2>$+&ixYB)pHlAIi!-ycJDt4s^Z$Co z2mMA@6h!`Yn9UQps7EfoXCdg02?Tr+fe%zSp^f_EtB006Nun31 z7(!KDeZ2J1=Z-k8=UG}>ju{$hvaxJ82C#5{&FICH&C`hR=;)8xB_*41ZJWDTAJ`am z!XqNM@8rFxP#`O{L=wIV77-$P{bZ!nmm@Ua_Y8Jbb#=I7t^4-zHo^ziI?Gsvo#`O& zQ~?b0*WxVY1a{5SXEnZjEin(L;9~PjHE9ha=4-iMYT?@rkMt=Y7EP!@U_ij|$Vixx zKh`;`WH{J7Kb*e}n|&yQ2*eT0gDpx}ht9DPgqlW#jHK?G{J=m!kH zzrX*J!D>05JG>Ml-@b{9iqebPW8Sc+UD-w&^6FKr)q3n2#lgZ+x~;kypp1J!d-N zifbzNH(_9uVYeP3&ApB%{fS!YP(uZ=2FNry?98#z(SvOiB@NB1?XhHymeXhPx)S;2 zD1V2BXP%w-H9Tx=Sg+r|e?Owsf1XFL;?d{q6z_vaFp%x^S02CUvUhZp$E0Dav2F^$ zWwFjMs3u!zXppuF3J%6ccx-lGRj7gGI9%hpK85HtFcxrL(#<5I6M5=|Pr*5ue^-$F zgPU`G)>>6(0`G;Ry>-(}nBg#?e4>S$Qb)IMhmU0;v$C?BmPg8Lzc&eU_Vn}=6&0l? zX1)#MQT`n;_TyphdFu~vRoXv%duy^Sl2#%7yu$S2mv_O0^u_&p-DE^RYIjB~>m{oV zcE6gZgmN=$vJ`BJacDN7T2MDj4Rk(O-4z$F{#I^tArg;7X$8?+LpZj#?S>GypALyU z$V|y~p6z-moQFL6IdP&m^Zfa9zFY0d6_$=LROyKi+9IgW;*k?~ll-33c#C%o9H>gVtO?)F>1Em)pD-IfSB6imstBGX_C zul1?c`g=Q7IX6@ADCxx<*)!k6&^4jZn<+F}s4Mvz?U|+i4D12b1Rjb4RammbhJ{AH zJnDasMl7WV{cyRBAq?4*+e^#KN>OzCy*|fU4_Gf-V9>{&^QqIEXoN!kL_pzXJ zv@Od?4?AA$PlfY7n@1uh5b?EyZ^WGPJoh(3$hou$^o!k`8O^M$@?9gtA`faNLP#!5 zhhHmmb$375+ndk$okL=HKRrj{u8dYXY|h>o3qFMz&2X*C`>5(gt;C#-&re#+fxbp= zU+*T`ljGfbl;GfQ^=O6Nh1cWiuY}%0%$c&p`}>D_-Ea{ zalU14?Dt&+Omo2~&vm^-rvaroJ9oslY8PIW-q%-Ghf|W<+m*Y{AdtV;#>SbSyQ`~T zOD=hydz`Z=Qj0u_>;3yZW$!GdXa+(;!YW#U1*hMSVnVaC{0;k|xYt3curlJp?^iz? z~SLbMjUvOwCGJe5${`!jL&^8MBoI%)X*kiRehxfT4Z27~Z zqvfTgFmevRQ+4~ZuXEIs1}Hns)m{r1*!^fbU`G#DSM=YbTFb-5rJc{NS7H13ah~uz z3iYkT{H6j$&E{OMWr+cvtNzcO<=%I1u6Z~En6b9DhRi*X&}ljK;|D*F*X=VAgeSTB zRgSm|?d|Q5%@$RspT2lO?&7lRygZ^`VSDQJRqN5Gj8zpC(mPuUn`B#Js(mn-W*>jA ziU5OzxUR0Q7*^Gu6e&YR>+zaL=H`?nB)(hEFDSh?sO6j@Vw4=MazdpmgnRFO$0iYl zY+PE`($WH3@;R1rPF7YU$}yoSTkYko8dp1o%RWoP{5Zn{S*i&A>L8p^dw^VP{Fo2- zJ$6?D0|PGuvYPMD7!emWH8myCE4S8ncNY_0ov5#e_aVZY?#5oa$;QgMJW1<#7^z?&LKa)%9Z=^AsmBPP$ctUn2fN{$3 zeiuVq@#8OfuwGcu2roiMT##xH($!q|>vH2}tgoz^`|CeGQu64zPBxrcj$p1ZYCJut zhA6?TjUqO2CWwnPP{Jvaop%Z%pb={C>{PYJ!p7DqxOXRW#w+m|Pp0KiJ~c71#(TZW zJsC3GvcKiHP!M!rSx{jZG%)z;2 z;?Aq%^cM;Y>m|umHRrIK^C1Du^(5)*>tDNet#$KJh}s*G^%Jc4vx!t#1H}(j2k(|z zXhvwZ@TbGBF&6j+*u2oF5r)e2gShk3{PgtJ_h80!j0Y6l9--e-4bgj8ojC42CNlI$X z;#?wh(j0`R6(-??Tily{ZDYii;eBN{EOVu3VdKpSdozBJ<-RUrA|^OKOQs!sRv-*0BBP z=?iif&!&*uJoYV=nQJli2J{u|&XI>qvzc;V2*js+#sJVRy@xd5+=}nkGiJHdXU@Q2 zk!{J3s)TjeB?dV2-2addh>Qw{kPMIRn)_`{-rgqF1*f2Y?0xf4*xBmI64aqkaW=mq zB_mVNbJvGCfS6OgLVe@4FujB;-_)JF+fd}(P*)F1iC~msNcUrkuxRu<8@A}A5kA04 ze7ST3ikC1hRXD86Tw$oJn<5>r!|?)t!hArXc|B!1XUet^*~lx_Z8t#@&9qIjfG zMnCg1C)9(NqT53&0EwG+>$YgACNC$AyZ*;0`c^09Q#HAImG*FnC*MBA*-=tb5>T69 zHTp+Oz@ak{XOPoY3hOw^I^XLe?0*BjB2du5MVaI)2tR1kszu!s4@e`Rc4 zW(byDudYCLxThRJCpysEd$TPIDf5l#OdU-CHX)-V9Z#uQH%(%1qd&H>maT+EP(@YT zwxk+vP0!eve&)?LBECK*Vvh5v1wODt!wzr^>%EUAb=do0xr@83c5p`mYLb$WECcnj~|vd?w6y= z4-O8l=yd>OTxe)_O6&gq{^nc}ui0ccZykI+6vvNMHNFo;@K=V4`d5bPAth$;@bJJP zB6tiqSb(Qi-6QV0=0pz5MZD8mMJBCKP)y6pruv`@4|r0AB0Be^LWJqZs84#sBz`*Y z^rd2qmDQdjB;+xy zt1RlP`ofr)n5EWZH1D&Hl*_lOAZAGKx15XYtA`v18%Iqu zGVAu+Tdm=gN*bCr4+9vn&Yle&bC`EZg{5erUo$Fj@nTC)&&pJ5I4t$c`cJ;Yksct-B+($LtR2-C?$iT5SY&`=ov%>-x|Q8ylO_Kt+n}$~uUJ zp_YkmQ%;2~h`Iw6O{o^_=ZY@@hj5**;Sm+3R^cYZyG{LB{lC_8l@$&V(Z|&q&o9B! z?({Vl^L=Rw08?P7p-}exh&%taB&VdL#5K#?)|QWxWYy}nK^rRd$+Po=1iXHw4fEvN zB*nlW$dYs2$(x>^$EhdnahvaB1}cW!-=Oa2O0{jtQZ1p^(_s-&(Z;gr4FAjbKa^@R zE`Ih-@a%abO3b%)DiR9|E6ma^zD8YBs{E-nrACpaVIc>izcIBBv+CRx1)D$~PPb{N za7x}by)U_%XM#=JpD`O47)&)#yCbGvi91^EsR$KC_;}KW7uA2&;TEfX!`8xQK-0O=oE^a1^|_mw zWlJ`n2F?y(ys$HeZlO_{Y~Z-tT+-m+?dN3xngB9O8Xo#k|Hkjpq#H`of53~+Zezgp zfb?TMQCHCGiWNa9)dNdQR!maTyETmBfK-&}W)07U3(a4@x=l9tUbPtycmm(sLs${wTGie|CyoypBwPzUcCCk1Ei3?7sFIPA z%1iL`lN_JPkzE@pvkY@zof;~*PkH&?Rx^>5g{6q=8k3*L&XNqPK;o-cRd69-6&bFC zv_n0VrU=aMNToxL)!;1@3~X!kCXkrSuGg<$2Sk%_h4Gp@IVS}J1J7z!4Mfmi;JGgn za^u%?Nl5)VPq$Aotn5tQ`z7x5ZBC1W9Qtc}>p$4J#jzl`O)V_oew5SR->yTre>U&W;|h6uD-S4wLM8nn;Elt$)jGRg3bvkABp@Dxtogcz$N@eNHA>qs zzx3h4^fWmoWw0v{H`Uc1%|Yk-)2s2=^mL?{-A?~8I`*qh0BR^-1E(Gk%$|p2u6x*d zJ~Qn)F$FI#uU#lXb%Oz5+&9U|2C34%P_uF@eyMSp@Y8Pwl%ZeubVGXd_kp#voJ6++E`lR)7};` z*o9dye%J}aey5a_ippZ%3He_Cv%$^SfZ*U}g(CbVe7{RVcbHb2$>|wH?K9KW1BXz= z6R_^mcc{g}_*u>+`DaMFZD2m?y4cZ&YPb2bR)S~i@9#I+giJad5gzVuHvIMLr`_v- zx5{iL>QKr3fb9TVU7*CnE`KTXD5geq6PWN^nfBy#u{h<_;RHi(jsY=5=SWo=(rIZ} z)8GqBApaJ02mAva;GN-IbGtHnwddHvztS{_;^BbcTn2{(I~7X0(v z?7XOj8ufABylpWLkDumW*pH8o<$?%gn)>^pT#pnWT+T#3pTPMe6iowi;Zh5*gI^(i z^?hZ9CtOri^osT9u+Eu_*z1{@nZQmU^X}k#e0i^bUqUCyaVV!XRhpTZ8JNwg`~q6{ zr1J9J3cDZ4UvjLzedrz<($=h1|G9CUJm>}o4FU>b#>Y^HCbJVWGNw2nnnTpzh@?fr zn49jN!6szCiza;)U-Y{t?L17zNiT;IJ%H}9VZI;k|NTyX$^zemHKTm}dcPa}8&Cos z*>AQ#zhIkKS}J50oR;1}+JZ3eO@KA1PWGU9nQWcgXGKZ#pQO z#>U2(&IBF%NhjIqX;yjmyFIllo4rzqdu4e$rjCUIFo3XaI2P%15R*>IuCA`I1(Yxa z1qA5m=@*=)uloIwj=s9;qvKw{-TnQ2nc7q_;6yjKx9<$jp-K&|0_h1wR46SQNGwoc z_CM^5hdKTJKc=je=%awQ6 zmzS6S-W1qc;-GOw;DJg|lR(br7 z-1dp+TUx z!aK#B7Q2$fbrN1XK&F43(Fnk);pr)$K8AqS1RSQ3tws&RruHV}Y|tpg24H;yx4H}P zPEl6YufD!MDM|l1ivnN6)d|nd!M9omvilK0eM9)wwf2Uh8iMxc>67<0wi~7*wkhxSX@uoO-H}^d ziFvQ}Na?5U?gG&G4(#1-K%Li?75(^W|M!n40P~cU6cwTF&@p7ehP+{9Hvv!;pOVLD z6RJrKzzCG>$#oXqvM6-sIC<-p^!PQju-PH*qTwJ%ZljrLoe?rpGWAysR^F$(_L`ZJ6 zHARPc{Z!9rWwePrdM9~b6U0^3cy3XjV^8Wzx6N!Ae|dS#0g$dL-M8~XOhu~!1A!)U zwAM_-Vh?DsvPWG_jev-V^3hWvt5XI!)inOC{O7-h-8&vGG9@kq{v+&u&tyF4+(FUI zxnnZ`RxBJLVpCI73$Ww)oE+^I1BDyh?~wZgh=Md-z^qDZkdYuKwnb^27P=T|3Ati# z-LTG66qA>ea}i*F@hk`eO{e;N+_33OFSD`D0#uk+1chk{D}D?ZEEzI;!%ULKTLxCL zhkYyXW}q~lk-(=uBAq-I1~r;IB+c6p|#27w(f6+BZm z3<1o&`=>*CuD)&mv&WT0rzmQS57O26zL*XK^7*+kovw5gr1IRBgPftR6 zv5R>z=B7iH6d!4no&Xz{_ztjLXvIbiGL04}%Z5X}I?u0ts8r)z?9cDRGcGZD@1+TE z?0mB^J+|YFqP_ZF?WMpl3R2k~EeS1c_>b_n4Kn08DKX1wjgOvc{)kXG)%5{qN)Jdg zc9!B{u0JEAszLe2sC5GMD&Z*qF{)WBXmvktDt|oa@l}gHCV-ul)O2)uWsmPXk9Vmv zUJrBZes$%{>C-Tz$a)_iOt6@YmOj$bw1+IWC)z4Yw;*WVGyLtF>BBdFG22}4t&G0h z2g?PlZP5Be9cCw8Du8eqA0G$gwWgNesjv?>o*@XCIfb~kl;#XU4VG)3R=XfSI zbjXek=Stvr(?ZaD8V8MIKv&Aky}9xo!??}12WqDbx6N5F%2fT}xinGelz5r#>)05* zjDmwOO;3Ty&^(2E_-3WF@98x)exU^?k(PE@u6c71MflV64X_tvuig7XDLu}o50Crh z_~fhty|{anXrn0Bxn{#i2()Cc=b7bij|cBJ$!WdQzC7rEy4b9X>R6zoTjx)XA-?AQ z;^_F957GEyG#8Iw7y2mvV8wEAmLV;~iAVZP5^WeWSH`p*(Bhle;o{?4wD&^g0bAeF z(vr(s(6TSp7YL||+ks*&=8b9hV#k423 z{s932TU(BfYI?3RpI3p1f>`l9=wbvFzbtt&zbV$vo!dufe$!Pc+_O$Se|zT0s*f*! zHg0aU`Nd;?%OP&=(ZEg_jKaL2o1A&}4UgsNN&=WoMdk(b2{MSUprjcmFO#vU5x)lT zQC?CK9u=iMxP8s@mR^nDzxer&2L_rzeUTwm!B_Hh3uc4dDV|R;zyCRdz=IGCdWAdI zK+kuFpy~N&pvC^1o)1LId?HSW_cLyK-g34GL_D>#k2R80bf>3qWZ$*$fbXa2s~;vI zc2pFOYza0YT}TUHG=4EV{_`;q2i+blL{$%=2<{`tgE@K>RUNpZ$|S-i_a@II)+?(b z{7;z}+D$yt)6;{@S?o@q%?`Ga&G;)(Vqo+LxEmspd%4&5VCE2vwr1 z#bkg;QUI+f*=GK>7~L+!;?Dn`?jE~Wt2)6s%81wQ)4Z&8+epe=Zvnkde~NuB;&mXT z{XR4_l!d4EJ!os-ve4g+0Nsm_L4soQSzHN5fq0|W-@bzxhEO_k`;98|{7^Pal2v_W#9|5XDv>rR1cGViT+vXe;)f&3v4=+uahnVE* zWde^LfTvgE+OJrf3l%H9xHCDD`K+#I0+)`uW?TlKeu0&#DL>{6{rq-jQ-Sw0aP?e6 zoYxqV9GR4;p8zF7Cm~OP<%xL!sG~L>DuE!P0t%Tf3cn3pAx1_l8$?~o6Pu)>*BW1vcxm2Z6#D~9kd4=?RO6*JJ#gu=IRuhpF)I(?8Z*EBv~s@JLp^u;(sKfn?_^vjAsZJx z3uJEago(qs+0aD!iut|u!&)LOzpO$4PRc1FcBiFU!4K0nRPVNFrr`A$pUYl=2^{`yD8&Kqj@QGPHP zQ)>Pf9ubi}y?ntE6n5nw5{>j9_I{4G${qC7-b$xrc(+ zk`~G-{QTuSjWoYe&xe211ty<}kIHT-0( z>JCUyj}QVJi?rM(CMM4sSZKLM(E5wX+sKF4hPnZ(QnuR9JDDhWgAo4`UtE^&^5q-j z8cY5}}U=8+Aay8&38j?lM!N(Mr@7;)#0KGhr}q&A`ik^!qO+-&KHEEmEz38-QQq_-cUg=QGkze)$r&n^?yeYG{%P z(A_zoKR%_@I-)Nzj1}3UqR)MB*^T~?INTlxAAn1#m%wN6)WtZy<^I*$+S>l}G{A}+ z7->w=m?gW?t6|+r%Pmin&D1nII@k_7>!u9SY(%I(tPl#d>NPNXh|qSQi=<-9)*sca za9K6TY;`ak2@QOdVUrjS@GRA)FB33HIuWDS7RdvH8o65%YeCM&{mM(<%5Q2ilDAwx zjoZ}*xr7na%WpRImsgfwm}h(+oozuiH86LgaTvRuaP!HmV{b2yP2J9%LU3)dc4J9?A&~R$ZF}6aFZkF9Ovh zsyjQit5Fvv%cL`~#*$wcPR?-)QXAL=_MP$iz!zg~ZoWRgGdXEQyL~URy`vHd%+0w0 zzgOQCo}J%sodZ*!k!F-)k+TgrSzVXK@yZ{6!Ltr^2BME^XcF;Y%`7hB;RZK!uF`>VQmamgwApI7&^V6s4%53t z2ho=!p)iFQB))B_c}PPadi8g?H~`uAg((Wo#FwALD58VLD5J=m{S>4d4o4Qd}3<6e&96q z;XugIa6JR#=nqfJflORBnHo&xr$4yHw_mCL5pZHI86=Pyq5UOQyESvne~V^fSrV4F z^_B*JSm88Ow!p0%x~ZblagXYX1zIcfWv?5|se&kn-&pN17bPjD|Mla?kCsx}@j8?2 zM)yh$dpjArIK|$IJFnU9w<)9{*w2%ZZ8pgfTno}iwFQ0!cs^8neFNAik!;?4zSl#7 zf`TR9H`G71j;0HjvaEW0a`edwg}of?K9t*DP8d;EuK=UsPRWv?=XxOcivP+rr{8Rs zy+L67!IXPnMF`SYS&GPG6Xe~>Qki<^U)32?FX&^1@*&rdhpmbx`fA;;NJxx!cRv}g zabtN0USlZFz3cY4{vg4K-IG{B?m-))_a8~d!~ufXg2b#jG4OnQJGq_~{gX^-X=&$Z zgxCR#16|EzG__%R`}T{&cH@;lQtV$+$Nz|~7gFY~@90>%@*3L=Q?C6$#cN%ERmWAS zKGgMa&kk_i5HI7jxvhLL1NY^iv&1C9w`RwoAOYQ|%ET??`viV-9S53a+W*^)$De>~ zZE4}YSE|g|-SjE;5`>v;%@RAv8i!n3#SgBJ&GkS#LHHg3i&7b_*!Xz1Itd=g629T# z_-(qW(x)5uL+=# ztA|o?s`=ro;#sp_)CT#&1*It9g=Lo^LGcX(|12sZ0=|yT{c8po5rkSU3j?fhXV*PF z55cm(rFrhFN0Rd{DD>{&)#;7vyug0u{-b;jwR+Mu5AE|IAt4Z& z73I(iXnkGgh$ZUK2yX6yyDvtIFoQ0D|7 zNYWbszMIQR^`K>{>jtZnsYcjHB#>L-Of*f`SzSmTtU8U1ff_ownK(Tc#);=%4Zv5Q zPgq#nQ5wS>?2^$HZv|LcS%rigp`5*C$M5NAkbFr*j_>kt5>T;4+JAfVKxuT73ebLy z%&~Z8m~{3`dE2qe_uR8Q)030XQGzTVcYg<-Ba=8Oj~y$_qI@N^Tfa?!UN&$GY)h+) zi!{WM~!93WkE&@SFdlRXQZG+;B# z_09Wvw>iMS;p1}xT$1b;`R_dXRqcq|i2LPe=L+ccpnDVm9RTSZjU3S|LZ2LWh$dF2 zJ8UzTaX0L{%F3a6knJFq6)jnVR9;(qq{QfTamtq9mtmUOpwLKWFCyIlOQsBxj$e>5 z178Dhgj{*0z>#8SH0P2~$|&e}%k`q=(eK}VSw(1?=)$-|*Th64{nyS6aW0F4xOdY@yPRRarHv-m5=k9uyx^DMw-rHmUKlvd_nq=d zmry5lMY9*0R5FPK`5C}7Xl1MUVus~igkqNtN?>KVW?KR2=0fo(NkTEP=*1~-SoxQdHqbMr8=9}is7_d2R^t*yjUt12F8OQSz7)a zbD8+0j|tm&MYspp1Aqr7A&dDoMwjcKpL^m5#RwlN)@|<-iO=Lo6GKO2y zwYb@3V7-2)X!pAvqIymDgKTrlHd!LLdY?${Pm^V06HqmFG_eHRzSl*dSQAPrgv`Z)G<(q%F#4eR5Zn(ZVL_NE1O>7O(G@@ zq^PXO^lzI)4eyTsW$5sYirmFVk_Q!OV) z#WX9^!cPqGv7eEEYye&K02ZkM2T-~+xEC6H&!D-LQpc%A6klYbK_+-;gEvfK0zW)L z++1uAMHuGa}v;t=*fm(`iu{XEst>T>K{nEBEq5^s0(Xx5Ym2wUJMbdxFw5dW^R^tlzHO{)?A(9r8Rcc((~!_%GOTMb|@AP$K6YGIx3k%kPtasZe?!4^o}uO4GSBD885 zvq%DKo~8)tE!O1>=VGjpY-DM|2lDM@dVYTX4psLg*LZ>*d>>U+RV^U{oh+3&AaKL) zvw+TTZfW^C5;=2c&Tt+UErF^*aN2b=b#&h5`g1x7SK=>WzH)Z-^z=IUx~HyCR6_Uc zg&tOgS_Zgh*%uL!kvG)TO5L&z;?-+(cB%pbFmLlr^b3HWoX&kLO)j`FV@I)LdU_fZ zz_9B3PSx08^?dhMH1lqW8K{qt-rl%+EJ8SZB1HK1?2EO< z|BOJw^7Pzfqc?!RS#NNOGu!=i;7K1pq8nj$8c z1n&0?Eh@J7{;6z95h}5#%o&@*_1=R`4xpjU zHMEya)t&x4YKliv?I+sbw1Gk*bi9A`)c2vdlc?frc%b6%;ADuFKS>iy@i`Xl!rYdg z2JUU3&dZ}x2Y{}vb^8hBTE7zG6`OIrQ8BJ$mS$ys;w{YhD8asg&;&BXH&BgST`MB+ znVx~Oj*PxR2wGLmx2wRT480MG)d}eWeR%(*O*P0oPV7|tm+3OAW&UdPCw`BQFDiuQ{or)yabvNM% z{gUJFF9$MAK#XxwcvfX??KSOqXwhk!D4e(IOFb2j1PjMUPC83FlHfyf9zCj+oZRT) zMs^K~q2fMTx9%sYVahOk@@}P3Jvw=}7phn5{GW$q)uhoh3h{|WoUWXwIKMmpw4yHf z?A6E86XRaH`almEHwSSn#(LOl5@3D^joDD(1qaluS7H-No~D`P?f?pu?uf@}V!1wG zoVCST&x@ES-Q?X8Yn^Y=NS2}tYeN}1ii8a7c+Q{pmkk%@6mio~lcdYd{eXM3xu5d2 z$enx8>YJervNpjDNEMn0v60-HMw|f8-nh~a=7M!ffTwXylOia{o5lbk=*gI!URQ&C zo-+swolfh8(>BHEwC3NBl2g?YX+8ZBa$VZ|0p^FG>(a#4;0FpR$9^;s9J)#Od1Y}i z%om*4Xc9;}^tabsSs3s$7{QBrhP!`W zlU?<_Ga$8t9{5GcM^!st_xtRuGxQMYYAGuNQdB6-e$mUXI@g;b1^odBP;ZBI*4Lkb zZP#^ByEowrUBl2;dY|#=!k<>7JMQ|jva(P~J9y)A?MgsH5wzpy1Db~3Uob}8SYN>_ zF^cbLmeSYLYe_&AB0uT*(79-iq(uq=jjLp(JlYs}5fg@m7zo&8(HX9+nCvGX3_ zw$WOs*n=i|2#JX5!FIvJUb6!B5m;4Y;J4Jqfes2;IXSS!hU#@Qr~sdiHvGoUhlb48 zK;E(jyDGaacvPu9x8_O2F#22TaB*>2T!FDjOr(k+pW&A>d5^>Yr->b~8*MsaJno9{ zucB!Gu%Sz(ieVFAd=Gwl$l&b6{$ zv16QltCh1jRDhbCeCi$(8|wpSDL^}k5c4j*ly^-^%7hQfJ*c2y8EmUL_)Ta*VFS`1 zl)>kY8l$G{#6=81yt)6uDpVOB0y=pwbbuxBYkz+cY$`Af*mlYV6LR!=i~&*7f0f)7 zC{nN@T(ZWyp{nZfBl0R=I_w}L5q4W}D)+m?e&M>E+gIseuA`$vKI!1zBLBxEw!|R6 zBqDA8E+Y&Xlaa2UZ1t%ZoZt?8PlrxINCz31_q}6d2Gi|sA?bK|esbxR%q(=!Q#)U86`NLVhzp#hd)UMQ|R$0{r=jJlD=#|4Pfj-D6Da&c&}q!Cz{ofS52 z!qhZ_`tnz)1H=xGMyfPq!w~4yrcuWsi!}&#pR}@-)x8|M2d+WD-j|VOdL|X7|C&=j1g&8{zpwJO-e!gM_T*zJ0zR-TDDap@o z2aP^d*}=gd0TWY{Z3B?$z=J>qOL&HjdH)|VYNM*dVH|0Ipe-`D7e=DcM?&0&SP9b{ ztPGMu%ahozqrq=;tD7AxcXr}OjX;Y*hy_$BiV;-I zuRg0hf_?)dfBV>Ho`ipp(A;ig`9Cb*qV0j38cZo?}M1_@zsxt7px5Ef=7C9%%8mGRnl=kA?0%krW^K=jE_jI8q9 zFBZC`;5CCw-~iheHh$o%4si+QckJgWDKFI$Y6taSXKo1G?i}>G_N8MHfCmQ12E>?+WEtgv{wQ7_U+r$?JH{X4uSF8Kw{)l zEzjl4=d6VRr-NM8uyU}qpap&-$AO87iH{$ZYOLTGgKjtw2i@{j@EH{XMf-pB(g29q zm4&5k4z6GvFF)(XAtu48n1t^xpTI{(RObHyM0%}3|FR3hBrgoGGswyvVf{jBzlGxP zTb8oDq?k^Ra8?qs0}5q%mkK%<(RInc`tCo$!92^*aQpz=2(4OAz{$71i>!YcOT2Oa zk9C%YPh4aK{cT*lagmJuowqU53Lr za>!)c1=n6v>a!m{x0(Gm15}kAqPVZ&{Oag;EJL5zCy}h2Pc{6|GtzvA)QEH zp>Z>`rT;$ND4+1xVFz8^08_?Ye?$V8_50k4e3D;psdYg%7k8W|CM8Y(b?Q*jtzRR- z&kvR&Xt=w?_zrz=M0*PM?;k@qd!idP=KC*rVWH3Y3EBS5adA{SF2v;In0tEG{C=Xm z-!zNog9i^Fma((2$o{_T<==NLa16(bIIoPl0m1)kgq}&A`qki?7y%jD>u~+!0XzCK z?I~w|-$4sRc`q-o6Zq!huj8GL>3;tl&Cbf$H}FArb*cTjx%L#S-`|n}W2@oQ>*#Yg ze%~+dUdqWnBd{&N8~q-a;|ITg=rq_KS?` za2QGk6!V~_eKD`Oh>i#UY4uf>1Y=Cy-gNBEt^NeGRlevyJ99qq(uq6g19;JOS`ai~ zaM$N?1BVvuiY-kAnKj@hqwj3FiDF%m@NDB6jO`q90^_p0f&%pCqR-e!6l?w=Yk>D3 zIVXm94^GG0fj0YOfaWRdDt##XPq5JzrlwA>4qyS51D54vwzjyej!OA@@B zA35jT?$d|*qpsTcNJdEsW$85>f5{(r(vUOBu+ibH1$|mKK&fo%Z$jj6-zJw=#$=TA z#5n@@Sw9FZOf0rdkPX7OKo5hf!5BR$3KdviUtg<&ZikSNNq|p#Idj0=gt@;nhXNa_ z836vEmJwgSafAMs>zshZ1FWA2z>$gJ{CT#Oq88DiB2y)(umL|Cmw=UK zU>y_MfC8T+i#e%SL34aSP!Jqfu>r7vWdi`cBZg0U5A-9OB;us^Dl>{ZtG%fFKZLz^ zJeGajK7O|)DJvr+DnyASaY@Rm$PAU;Fp`MNmP)coQ5q;@q%KslDLaaY$exAEh{%lZ zaq51a+&!<~>-V4grfZz%=X{UjeH_Qzwrl0w5)|5?!LQICL&POYbEr5l=GtYWp{Nm0 zv*K%2)H*qZB`5aXcnLu)^NpeMf_5`FFLeD2Bp@{_Va@&}JO5_Jz?Ep&NpICYRE@LZcKEh&knJ6HJbT_1?eavK=g z5}(b2;9-ec^zL2Vt4mj4c*-ZW`(OKuGB&}IqsbLAi;{cyI^sbfEMb)FR^{%TXa><4 zdI}%_rax}0?Z0~2|CPAV7M{(WqNMQERu^!P3)-OIyha=wjl*ayn8%|z&#d<9AS=r! z5R*(u+Y1Yqje3d^{Y8O{)As}7*T>AF+~Y_do6h}wF7&iMOhBU(t&TECA5D#ov|hI- zOmN#-=W7g5|7#~KW68?QR1M!HXGJh5Dl2yaNlCbyVLAo#FacAr0g7^CY!oIVqg^7z zOQ3V$kwMy0$fY>}LU`}>XnITZdeNh(3Zq@kHMI9*cE&IdQ#5!Xu#9i#jUB=8M;T~P zfkq!WbFs!}HiS@5B)Xu*bypmERNu22kIlr$h=z9E)jeJ}Zun)0CjsC_)#2E(`@X~l zDW~to3U#+OAG*PF)l(W`GvF?~GT`(R3Xc9CWT4yv&pQ#IIW&*K-agmU-M#$7_qu-y<=oKg zrtIlG0fz=KBOXa1nk9jl3tkX(p7t;&`FIEO#oSzX^yy$)=pnUYh$pZir&5#pU21U6 z?&=NpN2{G$P-A`=iX2C-^&jR|U62KE2Qz&e*UBTy>Wv#7wK>K-xHYWd=n7}b+NcL&Yaen#y`SXl4F>&!%XWrccezWT# z>uc+G)Eo3%)0m|B2iF3~LMl5LYN1`?#?yr6%XGdw^z1QdP(`o%ZPdEG%MbaZrdG58Ou$%78=jCI#nGmTY~ zt{L9deItXDotu;M3SSLb(OZ~BP%{>qK$xYCrfot~wPLbf-c90wKJ6j-GiSTVva{bk zvq5_}&T|k_KW5d!yhk<(-AD-{RxP*cA?!&)sycS;7%y=N2(BD?gMj)!K@)FRZHj&J z#8;S28}V24JJOOX0Og5C-M;mkugbl>RBeyJ(JmJAtzdZFs$bG=IsjWl{4ZJ>8pMPD z9I91U&Q5QtmpmhL)d=1ZzEwp%+`S)h#(O4MUfJ3vs+Jy219MaG;wUr1 zOA*2~;|29AU*XPC%#xF{b<0bxJXeV7MMs+k4~qD3F|)A9FK1r|SBdlNGXMsat5L^Uzan$_e z>3W8ceFIXwVp1(<@UuoqCYgE%Ap%q#Qv#c=C+}$q4y?u*Xq7)8}W0^Q7{EPJ(mSVcl(arU1BitQJ&kKjK>+R z2Uvy3%D29aA(I<%^G53~{)TtK=mOimB8HuJS(Y^@1HhwhDH*Mxz3{#L?dQ**5rK<0 zwE|)S2=1TQ(9nQtG(Th70~d15c}&EQMe;;z6JO$gJ_u@>>oGB17xRB@Q#<2B*Gu^B z!j?vf+nq%q9n6$X&=X!IWLjs-nT3Rsz-3Z-Zjk-jzOQDKg?X!>;Jd=YE@afvnMl#?gu48>7~s zTeD^jJw0%}P?s>wG~udK+txN8wN}QPu5e{nSJ#sfl!DornHEZDjXQ^ixS5!CTQ_Gw zQr&(M(;1|;HLF+ea~Tsb6_JqG;E9XrCnyXZtBrq#LDA!%;+0pfTmegY0KRfUoWQE1 zHuCTiCqC-;i61n`yi|-b3@uqGzt|C4gNd3DJOiCo#zvs+(FrwN728To>3f#|CLS(AwFLa z=RV$@AdtRkZ8a24(*eGtpd@&ISQYk5?{U{4W7w4zTin*H z-vdps@KJ;K%jx9+6?buSamm0n4}2P5IlUYw(d;1Qf<<8=g}S2sm8@Yc}=#%kH8yxRJR0s~4U0J76RsyS9LXS;53E#FtG0<+ZVG%Nr*Uh+L{U z?G5m?FJs;@*bbBmG=TbD|!j|J6Ksg7l5F&Oc#y_yaiyt`(P#vVrm!$h0 zn!Q=w^H7gi)_1%ngj^%llFuONjl{r)ya%LcDGA=S1&`!BQK_bY`j5#G0A^Iq8w528 z*W2*Xk&(CBPEM0}sErb-@Ig!ofn%8I1K1m+rlp;&XE;p6Z~LrwxOdUwXc;>P24>*_ z>daeskD68MR7b)2XuYyz*|X=*MbVFHz`Kvk^|pD!q|*dSUUC!-fz5_XvUDysg7l^@4F#U*R=X z2(NKmNASe>9T-FW7TuI(C}hD~&!3;mCXL+5slcxU7st^zko#de*;AeFjbAO!I~V&A zA5nQpp1j51%KcYT%uNKbjyOTw?n!^8(lJHcFK|Vs(RVv{K0jFR?CkvOfc#iALJ*Om z{!MEamzN$U%3r0n*Z(IW=H?lB{HlXj1ZLKePECKm!8F(=-fK5*3qJYJ-ybUuhpd)j zAT2Jg9hveEaovco_3sIFQO(QCBg_&>mh6AO=KcG7FA};V=UOo$7A&eMddbMk;ujjV zxzpJGenBqc$isA%WGVXh3zh?a&_otpc)m7tsb&$%PAJzyVf%`Z*6$bul67ND4z@MwIee72e%`!)I15RZlK#3wL{T>B%9Ov!>fK} zB&&01&7v}9to#N{-rc4yIoICGIZT9~@93pNR-)*^lK?7sPkVa`XyFzT)%tKN0yb%2d6H96(4vOycd&ImtcYj$}lESofHe5bOKHSX(H4m z6*xqO*1SqQ;mGzosaGT43=9l>e{>cNF+dgMA*K&E8XjP>g2$mpDCg}D2u{FA<_Xs1 zSX5jXs)7^%qArZ+Jt~;)bgO0&c3}G;AN2LDrU&9g*y;NTeh0D@AK|jKHw)cIt)N;w`<>=Zr_wIw9`vGBwoRP{yWmV!qEIZn8P!qxC`GWp)tjcYMHfg4kOMEcq#3CIM*ev@ASCP5=w?YfoYIP1_-os!F0 zSy|EikRbZJ#X|*sFp<9Th!nRp@2+F_4Dw1z@H- zFpsuxLFl)suhpr|t>}~yw_5MGB>hRGw{L&pb147Vf=>}pAuRImGd3}(-^hrTSh|9l z)q##7s3OB}oTem2W1UG?$a#Ar0ow3`yHpqoEH>L=bE*GaL&xbu1g&p zGG%vuxZCVlHQDJB3f>($I`5m$R+C|qq^@$&>Z!rEo*u7Av?hgOV%b1kK>Y5HWB!z# zhFkRU*U3;cF^D1Sg4bEwq5*?-2UAz$k6j~YOxWk|3B;{ZY9a#|V^#I3XBm>@RvBO$ z;*k(~{i9CT$Rdh^uu@`Y6n%Upflzy~|%)-&o0vnqL$3 zGc#|c1GDQW)6e(8p{$W2?fO%Ar(e|p%|@cx|2L~>u37Z~*6px^zDF`~eor>YRERp? zmb@{0VpYoo)p%}piZJI}+IhrP>Y+<)kW~^w)2X%9S1}6S>US0?MKXwB?61FQPP!iG zl)P=qIea_kM~vq6PMxZMc7mzz+C~m+cQK8lzHgD@Rr*7R zf6r2Yfj@=rM=Jd0%`0KVt_?~d7lUWQ9y;#*ZhHFQp?tx7m02q*!SMrf5S}bk_7vf~ zY{n1JPURuY1P{z-Hn@(KeO7O;PYVb^=!tLu$@n8us7Y4u9!KS8tDzt^FC zdo(pCC+C)9MCK{DY72wbt?_HWO7jtv`B6sW`7o>Y-GkY*hGRy4f2N1&EXp~H8ggfg zY|ix}o<^}A%Aqogwo@oYLVBf0!kav1Q>7@bcR!F@bdB8WkP*hS5U!eF@$DkI0`Oqx zDNSu3hh}*zD=T^VA}YBBXTU~b+|{(`RH9`)*iiXqF0xv=8=kNbXu-eu*m2ASkb>qX zyVf}u;4(;k-=CiTRH==$yQyApf02IeYM)K7meYSqi?Y=WuEoeHXt@-2{M-rgKmz(X zHm0o-|C2>nZx?Jk*ouk)Y{aa?Z5E_N9wclGQ^6GJq;jIjvO0Tq>#^rh4q~|uxL}eF zT~E>}8~5pz*zJYE)5xBHUT?JQk8M&2`}fWAhzkC$eh*NRlvH}a2g|ST15w@isl9k| zxZd~nmXJe!eY(ZA{uyl8-a(yHjCKtWqQ=H17)hu$D6{C`_cZ8^cmTe~%mh8?Vb!hLe7$2v6H zkGQmhYcUYMLC1d0RPe-$*ucQR>9kEBF)~Aa<$Dm1KfMHRo~Y*GRB8}Z&jqna>^@Hr zLi~rj<=r=Tq%c5acegdmy4#pt!~3lE_3*|#cUP24ZM%OJNpK{i)9j=kX4V=f#EUb* zA5Z}xogY6OgO9x_@K8@@oQ5z?NJW?sEB6^YgZS_~-W610(Ms^@X(fBY_loi8ucDYC z1BrSvpib1nhNMa#lW|Yy?RHQ|VQf$u^DA;Sx44zMn}ddEgqWXP?M#wG3sO+y>kIzg z9F8{Nt2X#dFB`!FS*Z2Q(5q(sqEvhdxD9`hx^0o5n%-0KzO32|?Bwf>*$lg>~P*7`g

    {fmKLI$cGERiUf);!8=4C{D8v{qB}y%MHr9YeghSK&HCD}tDI*Gmc|!uuYZHk zs30e4?csraFWB;9gu21W!>Z5=Eb7s_zUyn}1B}EqM!z3CCN~pbTFRLECn4;3hgtU` z4MF$WYkUu#ir*}hs3jw-46(^Tfg%)KqPMfj)vY{U^QrMD#+%M7txX+#J+qH z!NA98<1mETf-WGnIPkc=<4BgvL*|}*JAN7hTn-w!ynW{OHr$qUb62{UV(15sPyRyp z@WA}okNcDrpJ6%#i7dRMq-H&{r|kD5&N}YAJ$KiK1qnpM{`3=y`uDj^q_7pYzH1UWT!sHDLGfztk`Rh z`QCIzAB2GQX2s2vU)r9)a(9dBQz&Q9oR)ok6D9fapfm|dFo}-FK2yDw*FopRd(SWT zJ3wPo9 zYBDYIk#u|UujR@u89~bj?h%Ne@K);s5mUqWaQ$(zn6C1^l!y(Nk6f!|3Bq-iRQo{E~Ub!J; z$fZ868Zy@bxJaHp4GVC7E>Q+frJuzyHbKQ|seg?V)o8%i8VA+0)r1e$NfJqG@D|JG z%?%H^ttALG`iH?+Mi>roz?y7+A-{2_c?NSF|7#_hoDG zonn}^tX$C^bwHy)bM^ka3mE+aeNcqB1qp}I*2C{SMiptp8F8ARsyb(+%gLo@^)&Ft zB4K0j;e#qZvy4mE3m^2>*Ie0q^D7T?AFU%Gh24Zj&&E#JhoZU@u=x`)-H61d_iqNx zI6z!1xQG9^uijH^Mb*|4lvanc?}~|Q502LW^|x+4@&k8h71NPHIOiT0`>&jaaIX>9 zs!itXwQdX*|9Z9eD?M&yY6Hg52-dGVG9%T_{xZ0r_;5(W`p@1}^qb>e5jV}Fe_wq* zv*!cP-?u8y2b|F%)v1>^g)BFh?6*HC;r!-q3`6=|q;mD$&1njYdOK?{nRE-;WR8i& zz*4&=Ro>GEU?FI#4Z|>gQBRj9-xrK-q{?$FY)d5qB)Vn%OjkdTA;?ke2446SxX01g z?ZiGHVCNY!lp0_ydk}#m{^{_*+DiPB_Rbk&#NpGu`%jHkc`|YBn%9v$@$tR`-{Ijf zztoSg^#)z;$~yF&n5fzx3!p{*0>8A=GNvl?jepgr1=-`%pmKh}lVtc6pT<6hK3CCq zhD9Fp^+d0RjQ(_G@@5$YhUCSXQ-PG>ytG|+ZrqGMJA-M8btAF1j%eW)wq9c>o`%{R zZ`QQ*ueRkO10!RWV*%7M?lntE98{hHh8ctL)5Mv<{5|k%#=3gm!v}IWE)73H$#j09 zMX0BiFiFFP=7@}~D3r;-$-k93A6GP~SfnBD{#)oo%S%a=Bu@UPlR4rKdZ+g!w0aBQ z9eskTX2ibrTgq!TRm#xBA6HGJ64HZJc{H|AIZNGHf3nJ^qgqV5gh1NLf6+qRKgzuU+#*!+pm$Esj#p#o}T*cL5#uy%TnGWWt<^rpto z?_Uj5@li2ba_|3s9Bkn*2soT};8--fIT0@}%xymr_P9X*kPuQ<%e5l-h`mdg2G0y!pyZO}T1D2RB>SwkmxS(FC2qRkYQ>~S z{_m4T&nyf-s$#JY;WLWz8G-b+LBWa?0ZT4meSI$Q8YwBG7yIiDX}s|I(*J1lDcfXy z(gAE*cWy&VKrK{!N0J${S4gQO%ppgIR1Mu*T~*od=SP``XX_m>WSb!j!7Dm4;-}XtdoWj&}xjFLh=b_X{ohM!ol+N)HYu+3%fh z#(SOUH@=Pgwn#a&DxdinHK&AnLd zzDHP?80m~61q8baob5>AQ3k!|9Y`bj#j0F0$kBfU#ko{I5ia#UKrh1;02XLABY<-o zSI?o2{sk`(wp|}Ttgn^-mMZe&%lu*35v$e!%HzV%Pr2Q5xcpcM0f}b4R3(wc@GTly zM^z0=iDS)8-11M9vt4)@n3cWn&aPJR6oYc~!g#syNK zr2*C1`K0;EGLGQnCX>Wmmu7Bbi6SzIzn_~iw0>wm;G*(s%pV%{m2Jbgoy&fb7e9K; zL3VRn9kWs3bj**I0GUXNc*-CsFu5j>+KKQmu>U;&^mr`@?%TJ7YtS{$Edm{#(?S6r zQsdavAbYIx3opmJ`Q`LS8z&TC6#Qyf! z>hDLf1f35kk>$hl+BV7mRD3I1Ww%q%f)UEflP8CBGcUYDmk;R;r|G4Wc#gxql)EFgdWZ(JP3|ESudCJ`391P-P0}CiX#u0+S%q?`>cN<+mKk z=tc;?KfIYE>upuwicH9f!1>EQ(LeE4F_;g}%4%pbm=9FZ1wPzx5WB7ek&SS2A?LZy z;fDeWwcHpTNR^jTtig#onc_OU6-%!-UbyTdCFBI%{@z`?Ok+5G^wUnW%Ge!1<6RjC zsvI+wRmibDJku^)v!1H?wy)bh(g+!rs5fWYSqS7nq7Gf1o+6UB>8IflaXhWR+N8sm z1tY&gfrNhtH}LUsz7R`35sS)VurIij(pe|iSRY6PMFpvI+izT5%sd0v!;=To>Y*TM zey}^->`=N=fJ_VH?xv{cer~{SLgxE6d0eYOIXv)r09hPJx}%b)a4Szk;^U?t2n(id z05C(lxQW3=fwU`}QYV9>mZO{h?IZaHjP!+RCC@>U3kCgASPf$&B%0H*7bGeQHXV+c zjh35-2*s`o{l!l%7^6nAe*cn*-H`RO-C@$T{b$BAsrz{2-XcH0G03AdbzvwSjkK8~ zkmL-{zbi_o&XJ{lp{MVBUcQzdXj*k8sE^ZzraN1~Kb^@0ok>=C(cD z97*+;AW9!bxArOoQGn6qQoe4I_{yMn$78o4MWo9a<~XA&y(X_~O2!$}Ao#WlXxK}W? z!w9RNPF~j|Vd>lJHGV*+!NhGP$R$abewaR)WV0Yp)&AAI>=nPJ>bOZ1PIiSWgNf1;c?9f55yVcHkhd*Y?6>U#Qn)NH4UN%n^$w zZ|!Uim4{jTEtkp@Y3fhk)R%W4QUQeZXvvd^U6e==b9*8Ymvxt|dimYyt`VoV09*St z&2Sc7?zua22yVLktEust!&-tvwRoKfuc#VAy}T`#$#4mOTccM?#*&ifzx970-?Wjw zM;>B@M|^u!%c4H}+-&)Whap9P)NVC2QM6X`p{Qxf`)&Q|MnAGRl;GYo&(@ai=TiH0 zxmG}bbVF>@C7Y|(&Y-fO7Wq++08#WTm-)l^B!P1|{e498KWfib1uEOs6;m$AxwJKG zpIj=_mWhU1W;k&y+rB-8VY@#@ak|#MAqqhvYw51~h_`Hjn$XX$;zvL7M}mBrXUd23 z->vYILN=5sm?iCz=JK@q`hNW-iH632Ys!0t5g^`j`duU>cDIu;=2@H26+&)m*P5sk z{JhnNtW{$to)NI~%HSLy4#6~1kEk7VjKe?m?!N*7I?S;Lo(x+O4sa*_-J>?dRj?Hv zu*=ima4C0iVZBdWC#3lk30E2Hq})>+vZeBEUA}+p++X`v>Q`%XB=tf5d32!^Zs(DY z(Wrti!PYx^26XJ2!wA18O-G2;Xmy8AWa5XHtHp$)n2@J%NU`5IK;?4+`UbU8rZ9hP zp#1#to<76U9r1YxBPHiUM7Ge-Tpq8~`bbr4BIR`Sh4s77H?L1qH1X_eSFwvbEXAJ2 zx2WC;K!!W^$w5#wSzZNCKRRgq)8K=8ZJEVAgSH;sW%*Y_aO6+J!{P%sH#b{ZC&w zjq2q-uU$umRbK52A7F~fu7Q_;u(U2C(<U^8ChEp5i2X{1?V? ziFLTykO4i009V2>#DLjt;t9%xuwC}l5`&uh_2OGA$vSaV-@}(VIOfrCbiNFnRPKo1 zXVdfKk(vTj5>7?tP~fJF&iv=82}M=aXWA_+rdA%wG`g7iuooTt@ZrNbK9Hu*Lq1PE z;{LaqywPpc4!V!zK%LJ~Uze9)0I@3I>hp6zVRBTsmD z)VR&wXRrQ5+OhTo;i~n3l7Nzr4T3(pwRrwbQ(y^hcKx`JTr z;6SDYaBLTVLdMGp;kdS-dWD(tNriyhy>1C^rnWR7* zhp|n;cVkm*5fO znShR@0r6Fxe7@1=BrfKI0*nc4xIuuIiMPL8)xO8J3Jq0Rr7^LUy0T%}T8^k&U_+3a z1pLZ&j2K?m+h{&-@ZT41a>uIZKm+&6(=SDj`4$eIA6opSI4psA#argnP?|p9+mR%3^XIq| z%K3}_fcr~}9Wc!!n;O8k%`!ZJKA@P7Aw^^3AwNHP(^C~fT)-fPH=FV$)G6^=CV~cO zZRhxNzijG#{B{$-1QQ!;Fpur9qT4>S@TQdeC+mDTc==Q{d-V2yt@-{QGr+3=P}&+q z!;T3$dkAI?)+$vN4IX5s?Ptup@Pa##e|5)nubbul%*;&c*2ei?RF)1YoY4zBdDida zaTCn{^f+DRD>MHob@HJLg^yt+`tP8WdkKqM?~oJTnfJk^vhXd#V(0SRj|gTa+8Yco z@mY)p14xlmREA7jMC%Pzn0+mH1P2D@2#u;trM%(`(f-t7` zb(%kWQ@7)s?C;P?X4MM=TR&5KEAhnGB3+@P!-(TS5_fQ8IC)G-dEnS2@(cZ?P(DZv zqxRpU${sZ)6i&(l537n&TUN96s49owtuy8K{J5cV`4_s32M9(SLdZe(Je{{*6M# zx>2nPfm-=s9;pnPM!Mz}=dl!)nE*5%gvbny_)9O!Bho(z6-!42!7tc$jJ<_iAPv$s*T9PCN0N4u{0M4n% zqxIMNw?%)NNZpw2yJlT%@M=#|^7`v{5++AkGaROQz*<^huA=1hv-P#T?1o!EW8_Bb zy;Q_e3y)Y|8??G8yh@wi=mw+lCP>!5@c4yDEA+a15_x~??fH!rjk~OSmRgm30H;p} zD;nwqamEl9N%jVs@e8jAc!#rAgR8s=*b4N1>=-jf!?!U-x`_0?J6aDTHd^~e3`vIA>DuI36wX3?QgM`-Hgu7q6-`$s%8P*KV>szouo+dqss&5tV%QP*2)eF9b0}` zfaz5Ibj981BGf9jlrCAnumED6k8TP;0b%HgzI1V-O~`|y2ezO_pUCxr+$xyfWiF@_T2fTi+gf+o?W_ob}*T}QREPtZ}iedlBN963^T zpK~^cOA!*bYX}kGeH7d~QA#RJtw)DH!T6_#htx_3pnnXwba$~?PQq4zQ~8T5&!2K; zC3u=KG#xDGPmA%Q^o8rCR`|VFLK#8F%>PTW=j1SlFZ39!=)NQ1=t`Xdf|365FCz_( zbie=U+&_00eQ?EBo~C|^FRDL(TDl(1>9VeWx^vs8a8ttCrubL*9AL&d7g_1-tCrE} zzPqa?)qdsY=}o7vE5_f~{RJ@wD4i!z@tzOAvi6RX=U#!i`ScV}M7(~tt3}LKl$g%M zd$9R88YP)=v|8+)5QB!L6(}Sl9Z}|&IU?5zuA)@o*1o1KO9S(#_Vm3+cD9~7XM1tya7~B^@hk7zrS$2omGQgHbn}@ zolyQ7-v=Wlz>YzYVr$7-dy8cKHk1GB`&^tx&+*ObjKA+C;o>V%QK+Yr+PRk|Z@NP# zdz`n{M=g=#0{lmjA@~h5EUjaZ|X5A~#dS*H9kIO$$|5-n_e&vA>!)zU?%my(r^_*M*`RZHus{^De_|Wh}0kfXs zBgi^}N1&Z2nS(qx1tFWgSRe8!)Q|;~n0DLFpuT_qVX8CZ&G8Wt6wMw$l=uz!G?odG z+^~kk?@~~NC`i4o>A&I)=c07S_YeuAowIGXxpfdkW3#8?;aYDQUEw0 zx0a{P&9+0g=0dlddZ7{`{-s6yLy#vy33y*Zh^Ps+e}rMHd1a*Ci&?iQVQWcO5T%J> z;`2lSY1;-?IM& z?a8AL!5lSk9J;1*{+#&ra{6fn^>GmjcCN(&_R{LoXJxhE$giZEhTBGAh1*y~_DDjT zt9;l1yUsuD(?8JyO2^WVb3bRco|t`d>SM~RZGbyVdXRH~cIlOnX_8BTzA@nj-0=}W zhdQ6uzE8PR8K zzVK|`@rHW1(Aem4}|@^iF540&@S<0>X-!DaCT`gPL(Zk=?Mij=6f3Ds+d&mIrk0= zvfKj4)9wE&HdJr~;jZia(%U1V^i+`|MEtWERh;e%L4gIUGLF(Jlmy!W^m?^-ql&t- zW1gj7D?*7AB08B#pGP*6iqj*&D?Z`mmHMe%8}Oh8W969#i4giNjhZL1>kDrO$;}P5 z-@g+fm`dFPYwhwJz4-nSO!dgDi((&kIF$H0(1NYz|WXA2to@F55qNJg5U4?WXI zq-hh#Z4*RN^?ey6cI`^E0ue;-C)=JO@W26SyR4qs>wz@99x2IW5vgH?b&O{N^V$n` z_XC1OMKds+*hI>)8#6Rs!s6OgWGb6BZ)O+lWr+1W831@Vy9{}>xZ@$K7xu5S zbjUTN24F5^XCxp&5Su_7v+0k}jK^oX@f}R8eykVUe7EvTKl3E{5pHzmKO$C}WXD3v zwWAzHM|jGWgqAtY=MVpVLUTAjocXp~5;gr|c2)I;3dKWhnMz4v;g5V*=G3Vd^Pj61 zNQc-+*-k1tyO^0|Q}(@ny7rx8@}3*p7?>-fya4qLE$2f{$>x1x2BW)bPbe|c{)S*d zgkOzHH2yY)d{e|LpRd)61{hXa3s9jODfd)d+WJ8Np(3os=VT;Vu|+v8nej{6m26g7 z{o*^G*J^?DQaxh5OV!x_wu#h_IgwF>Gz58ImwxdgO5&Obuds?flJ;(HEnTgcda_lf zV=$ZS|9qLGuS;>G3lZ%n>N{{C*||k*)A}SKdB%aq`2{= z@n6x3|NDc*@ECu{7?BrVGNQ!1#NYg&DF#qpw zvUT17bpUNTmlu_6c$mjXu?7}!jieimSPhi>$VT%CU6cc{t%M~9Ihu7+kL>ibG^KMm z4(lFlGQr3FCzv0T?YYX;a~E+5DLkhPjw>6UZERDcP)IzYRDlbW>)x4lxtiLT{<3mD z7+jw!3}f_#BXsLj*k-C43bbs)co_8^jtaFB+aFR&uPix_9ITLW>*4a!-zt=;r|d#)8-LU}*@e2!kOJ1+GekH7=qr(0-@($=Q#QSiZg1#_U|3(%qLu0#7nROZ> zJakE2ne+Mzv27&PBFg>^)Uv9k?t4glbi>rgHs03omv!`^9@I*O_V=$cs3T9xTFE@c z%fIEh?4`Cw*;7}ycZ42%PVR4TwwT#{f+*1kXN=>o9xq?+rFs7?#3CqtOuijrAX}cd z4_=`B74+xm6%j0PLXMYb?P8>6+ZAzlqu~&AN^DMyxvXx^olxzDl66-dx9L)2>#U?T z-gwf5a{>206Il%Gq@!ce*1SN(v|Vvw{p4>}4{*~2p^Z7rQ8v-IWy&~Nix-ts!YrB{ zkL6#J)MS344ciSbD~(OD-YvIwHByMDr;wy-$f=tT2%ScQd`~5S)Wnm?lp{^giE}<+ z?quOaJ!{OzT@z-*8J60w?B^W7tIXMpIQzU{IWs@1$#YyF7`W?+K??R>0+%jxwVd*o z3#Vbfo6;|JBBm*9`nX)qUk9)&QJJS-h5Fk3$ZCgdPLa^N&Z8zyId=x6(hWR?4}r28 z+2Xr_x$Es%&!wRpz3my?o_C0;$T1xb?P6Iam-wl;5Oik7ly6tHPNZ1Pj}Goo@CuzJ z+$c_w=aqJaM9bYzp^vB=Zr;o19Dvec{5(DV<+m4u27j)4j!IL>xeZFS+dQ}0w&ipG zBcaFx7nO`S#OUrn4j+`-q5t+#HoqkXk(etEgbAJ8W37~Ny3xn&{F-O#N>gmK$2}IW zy-M0zeeZp(rz;};%+eyLvN`zEs9G|VtH#6I8oavZpb7c@_Q;9r6o8ICy?cC*p{CLE z-k$@P*XO}`c}Ah9Q>^$-7BQ#M;dhs#$=>5oH~p3q7wU=!jdUr4o6PjM4K>hL*4Nix z_dm<-WRvhW53PJ9Ys=_!%zM_c5x!kqF7`8d5#E#Sw?E&L^!j8pIR)#+ddW`@e*gwV zsaHh3VH^ETgPS2W$16N;pGgl73metQQ1sCqWtq&o3UV_%G&Jw{1ukaBDK&F8MxkTO z{Zg)5L_D-!*|W>uV($3+%yz9_I$?kF$BFe%e?y~hf@B6O4b%)?I+cL6<>#^tp8^1e z&C$&k?ll5MyJrQ~VoruFdF-Q||MAu&Y&cWzZnq8%73JK~{IEFRM8Ok>LLG76$hsVf zO-A$VK%E(B!$eOeMtbjE-J7Ik;u;g%7cuPEe10=dc*D7`^qDaqPYn75zM)>KoQiTatFl6)Ma} zO{=VoZyh#T3Q{jC8F>Q!TJK17(w)(pR-#HZ=}YHLKG1yif9js4bNQ}m?yfKL%v$7E z=bOhaE;i?>Y%b@TK~0vQ+b(5sygujIs|OzG192g+r8+7mF~T7>P&zroII|Brqymep zxi+$ir?D(yjg7V%bu==f1rVYZA&XtnTtjvKl|zq@6-T; z=+8B`Q`%W+y(<^8|KnUgK*BK`#Y}EpQ#7jyI%WuT=_T)5EthuUww@s zqV?wUCy>t>T(2uP>ouNC-WF7z|E*B&jiKZ5`LS}&+pkdZmHVAI({jlOLO8URW2vvV z87n0Cd2qVz0}!3_68*?reRfF5E=M7G4%L>33l-|L1`W0X_x+qCjPL3b4*qhC!8#PV zIf+6)fuV0Lt-{2IB$H!<;asiMq0m!08T*1m!_A-CEmHO(rNszY9lt{i1JY-QV57n` zs+BMYzJp^>>R(g(`IPqNoiP59La?Kh>(^$1MP&@|7x4)lPSX;*a`xgq=M?uu2%f|_ zsoXYw=|6Dor;Qy4bvRUAofQZ4t7L)EoA=+(cqpJTB)>)H^NV>@M z#wP2>MA7tG%PM>4<$UX%=}KsODcS!bJZSE!PR3ZhLegHh*+i`Z)eU#{{f?*IP+zn8 z=1*JBEt06h&*fxQymDs6V)7)|M z13eubSKHzpB=)$@+1A8BHt^<}wSENUY_rU{A0BS+$#cm^4rEff^gZAyDm+T(LKPby zwS$dK*UcLc2P$YK^0$gM`{k3LJyUgfUQSOQb|*sr0-)nDB8P{2W6kA0ebyEJxgAOO z$2DU=Sg}mH)}5^LGPbTDt2BWe+^^9mY{hBowwvr4{>El@eG&1~uQFBXCPsbp(24@c zBc>irZM3vc2Mq-bIGkJVogX%;zy9^W%VX;we;F2RWo9JRTok=jJap~>nilu;v8PB( z(3ISc%$-f5r#(Vb&bD`Wk6mz+LZm(YkZq+w;F%>O;_K){TTb;%VF!x#ZnoD_FVk5Z zPWL8R$Ers~L`YSSE3PC_|7#WA&MwN`vu zA-yDht@3xYxkZWZyN?!Nyc`r@V|Lq2{*O|#X_~G#QHNAotE*ymm9+e=4a(4*?>_c2 z>fnz;=ju@F(PKD5G>g}dLt{ra>NH~9ET#8}Bd$MZE@Yf$>t|F3GHNp8=4DQMq&QIY zkupW@yuFzpfQa_TT{LDSjBhuY1 z$)?(Ixc5A-+r1;f`|{13T-fjK3+^f0anfj`{ML*|KfIg>Ug72XnGb1Dgbr;PG)bgX z$SqaAGF>t%Zb!FPe%ZpCF#y1V0nI7dcFz=>a8Qz>&#E1YXEjX2J zCZiHK-XpTVLnUe2E}A!{%Gz9(QGdZv zIG>NLa%rXhq+PI{;3CKM@lHKC$x!)?T%flwWRpIZ5;HBFgdmom$=m4T@_oAZ>KVYX zf>lht_-jp0lRMfFkLqKl3vD+ytLDkVqp48x6Nwi(K&QS3w-pP}V0Y6jN#26^tiriV zspW{BWxh{nghk^OnqCPYse)I^ws@!W>?dy_Y0P`!c=S27L)Y?rtTh)!cyHdJOLgOt zbD4_zlzNk{mc0m8(@J@~O`fd0DKTb|-Q5)a;vOJI8pW^%l;8g;;By4jctPTB5yJ7I zN5Z0+Q`@s{u_eVSw#qvB@SXeqMS?HVU*&CqAY9*Fe>%F_$7UTGQ4677r4-=j#h<4VF2KQ;b+_uRE`3x?x+2WC?>+-i zXL^NuId%hL3z6r2Sk**`+$~D>nC{!q#6udk zvhm2%Y8jj7K8%@<5>_y$IA=Mg6e0FCLJI|Yn8LLfrse_68L-jQzlKR%{i+w;wh8rH z2W<*?H1`x=u~yL^QS6`evP=FqXH~xPC}0Wu6>%0npuSr8RZ0WX^>D|}V`}x;2Un%P zJYCH$=q@~#P?e+_bV2gqOGkT7p3$T8VB~Lgp1xmmx9)mH;I+}N=3HAebAc&g3jTCV zqRC;9*cF=HeBjCXooVo}s;1kR47GQR(UyG@wYDjxT0GgibDx2yhzlG#$=N)HnoIO= zfHh#-?!X@&qNPi&a$KZu8A>mu=8^PKQ0Bh8bRYnkLa0!1>Uj=b- zTuSqBGR=I+4^>Qt1~8g;GC#74+Pl&qiP2du)xCR^TVj>_!W4Lip~5e4WsWa&=zZck z6Fe2SfqHjw!I8F*xE)O)q;3l{i*Tw7_EC^ub()A{5#&Zc+WtuOgHY7@%x52+PN^(2 z*L%;9JO~e2veb=b6LViKx@eA8$W?9#oqN$}VZsu3ZYqmEGv6I zfxDsbs84hsdcyqen!7t!%9ZB)l`Gh&K}_z~2bS{$JER;);?>;p$$~E*W93DbmDkva z@g;wSru-|+Vo730BrWW|y*qthr%74sc}K@r7!63bi%9pIy%BO0U{ZLOkLl0z5HBw2 zmyE24a57)ra*C>y(w&s_31(~xdXTA5Q1+l~#`a;QVW2VQs;0ysi?}Nhz=hCEpM(@Tad|cMd%>+y^PaFAH)uGWZ0k z_w8S&{pVrG77&{3%BhU8C-<60Ozd8DSm_q!Ms2yBf84YQ>8l`fpNjv0szxocvq{3y1ht{vg1y8H7PwGD= zCd(vrut;P9J?f#(QpQjh-_PJMF~jYNnH{Y29`>J>yocE{%-?tc3Pvm;BqdwW8E2!J zhvD8fCcK}GF*NJ_f}tMEjNvH_Q+cX?F`dc8*g>N3Y!{TlK~ zN$#mTn0&SRF=JL@I{3)US}&3{7y`)SYMv3Z*`5cq#cfzsO6mcGMSv>cN%9VJ4WM|= zqp3xX=%<^D`@_Pz{TUwoo0t7ZO77&;c>93~)`zZQdg=`3^wiE&ZSpjR1p|7BncMFV z5Dcw^+#jy`FV6O#;sWa6Q6pRy*j`sWdlm#!quwG5>~`CYzu$#(gHaPVx+Sg1x007J zX7|{=Y3zCh*+3din1WKINBPcITf;Fz4e_>ghsfs9M-_Y-a&4kb6rs&UrhkaN-S>|F zOYC8aR=})^V6Vsj)n!Q($us$W#_3YP;2nZyUv3XrsNTTX5@y61!31uG;6b*>ypH0VIuD(JSm(jl2t80NUauUix?K7tSBZmLCa zHGux^pEHAA6|GLLjOIqnB#F-YX@f52K2HND84WE!egi`KDcO6l(E{^e_;n_CA%5>zs1a zQ90hBF>YXA*nWMTqG3U7@!`j{?cVC#2CW1j(YuV&?E+!2sC7)4eruk4jdvaWh4mQ7 zOsum|_eeaQ1|?$ityYvmutBkdBx;LiWuVOc&y>4E zZARuaUiie?9=tA`_KPd(w&9Q4A^~|KH;SX{Ypiz3gzd83S>E{w^Ys@0Xo>$wG+GUg zRV~0w@ndDN)eQ3`tN%jid*8+fDaM*TS4UiQ!eB7cz1P$$iQ{WX7!--uRY6W&z9}iT zTn3*$BX9cV!ed)+z&Jh^9nEGAxoAv}hECj9MXV4{}}$^MTY|#BONiDb@?0a+2Xw!!zJlYDz8@U0?ZY@QjS1GAn#t0u)3vzr!%l z{atAb_ySzF+=aLp;0y5yNR@Fk#TV@=Ygq*EG+izCB^Tv=7+X&`$Y6G?n!x9HgW){Ka(*d(FnCVf`6 z6X@bm69Jb4jC75!HvpkC)NPq#k&1r6-hFgWo}O`wtw_NKRG+8lmW;=b`J6fJq`ddP z!db!}-Ka`SekvEToS*=9!J6 z+4nY=GgBw5Z9Q-o*0Ol7)>UYsD&CE1eTAzhL{SZ%FU17OvgVq<-rV`i^ULY(Jf8dY^O-oA zo7QW2t^u_jeHQ#fqmM_dQL(iROX6d=zwpJ%8jd>i@P$~ntfH}$H)HfH1a!}z zwi>(@Ed8#mtMwX~lo%IOKl{HRd@^&)UqXHH0n(4dytv@m&|_+S^GtDLrfW*I$@Zi1 z{%ts_$3soYGBO!K>kxUkFbE4{<-Fw*o^#_T?PaaxM=gXZ@3Q&+zqKtzjcYBf8AOB#DU zVHUjGp%&YZ-yZ3}K&j`%Uv30}^*%g2JUg(0+exz*V)`!x&7|TnpSi`*y?0`oXRGhQ zxMxq<-v?M{{JxY4$&9)Qh|DkYW{1eH5@q{#j;Z5I3c))Fb}@d1@DHt{Vix6BrsUlh z52l*Cp%UAMZ!w0FJ%x8B0Plza(ansnN*>ZEKGa*4Wum9Q^<>F|j8H1(1%Hd=v)Z9{ z`JCLO^^s{6R3RSlT^Ot5aQe*CDE&TSej;?qV-;aaIy5Y{QyHl$a71Gv{r(QQpE=;$(`u zR)*Uf@0k)eGs2pfN7ZEh-4TQt=N-I4AsYV}FoNW+yp z&q{N1O7%YpW|5}1|IuA|ui5{R+Ew=Fl#bnueXnBXIkb5_CGpcGZVQgs%Xd??l0O^f zVJuY3Sdq*K0W~9M_bHUN)LRb~K8%UH^ZfDimnff|`NU|zcrs4W$C)*~S%>h# z3q@##xtb;K9aJ5ZY&nLRTxa`JTfV;!=#Z-MSCU}GJv zXxISM+z}VeE4^|Unr@T}8nAA0W;<0*E|irvBpSBldkaCyco;5hd<-}D?gg6jFAzNv zcC8%1l`a{_u`VI9?0BjY;uwr|%T&;g6c)WEu$y_a>eDh#=9uq=9d-A=k6&WHkDbsCMnTt?lo{LfW|5%*ktSt~WFDgkNuiWE ziiBh+!@Dlu{p`J;_c?yY{%8Nu;d@`#_4%B`I@h@ttNB9&R7~CoOFyQ%L2!aub0=Ue z;mVa5wAq+{t^-$?s^N{U?RNDAlU!z=%edc6rHF?DQtqD-n@4gashbj*_kQmw$l9^h zF~ur~dWUIw39ZLG+`y^o^>P!=zsj)URN5|fzm%?f`swp8OtI6bb-m)GT<_#bubJd} z$uC;E$@+DXfMxxY@6F^YHC6fP3aZ? zoO_N}KrbS^dsNwp=bfbKSLLAcp?Ih9ED3@X`C7U|(Z-=6@vF|Gj5)!A+ zH)+&M$C&h*WGq3->D|fGcp%Um3mIKqTqLWY0fk!@JBlucKCn32-CUFrk!X7!7~3LBkov*vnE?+2R^$mkOV|{MK2~D0H?#C}z1Sv_o{ut)shl_XeKET1 z|L!IJHN(CByK=GlsS#&?u;%*y{qY>kwcS}!SRk`1zj)5A z!difnG?N1Ek)Fc!`X=`~QAa{JX*~k@sD-@uCU!AK!zdA#Q+B4aRKL%0dlzMJ{6_KA zRu7i=&C#U{LsVXqC^FC$*V)PDW|<&eJn)ZT=`Q#TR&M8!%8d~dt{?1Kcp89AU0K4vV{SLy=QOj3>?x6Z1{9k9feh3=6xL$q#ltU1?l^f=!`eYSO=0Rfe^ zrNeY4_{CB2klV`Nx|E+sY~#o^gB_*&{TtKQ37YNp4EEX$2D!H&?}u#Ur1)BrzJV(b z?p;@3SqvQXOkqlD{ZvY*P=4?>)UdI!`EF)-%UU)dAmFGGmqflUuw45uZCDSv?y&6D zc;J}(0pIcXO5i?~Wm|4x+#K;nZj)#9F$>2r@E8f>QO{K~aYz|}nN(_ZR^okV78W16 zoM0F`fdRqegP9@pw^d@n`iMCBM}hk{$3bP1Y7N_IF8s+n zX7Z@{0t{pmL?5dC0f8`Z`-pwO?bG=D4syq7`TzWo6g8)O>&7f^%vLs#DQCxIbc{Rm zQ7qZk1lhs8|G{xXgIls+(WZy?PNXy}Z+b`YfCd#hn%&%K#MAGU?w$SCV>Ko>*Ctu* z6r?)ZX$a!?`?Jilxx;BbWglaH*+i7avTRB{!rQUqsxm2TphGV#%9gu+c`DMj9Z_`~ zVFZfEU$8XQ?Gp|E68NoWb>*J0^wv1*OFJyN70&e3#TuT4^6pq>`{C?#2IdzBbmmrj z*wudUVby)) z^}59IOk=>ma6Ra1{)Q`(#L0Q0(-)j!KU9OyR_|&(&djyQhizz?yigPW_RAy{+bz;^@>_MslhHK zx&Quy)TN#iv{M-jPnhyAL8ZApd*oq(v{v|WLnmw(|G4jA_C7-n*Q*Eu(Wf4>8yp#c z0{DlBZN6^VBOkWp$YR`G%We7IW}ln5c;64UxPV-~&|4h+lbv0P=?5>SSvGpcJ^e%F z0n{OX1(0NPlN(pK8MY;+&3I93PXyX*cqMD|Xs*QcsS$0^lP5gG;B4hV62K+P0oL90 zHy^)lCDYrRrVH{8f4Y4q>4u=VE+JR)&$k%qc z4EZ$C%HIfePe3aN~=@R=Fa=E}r>XmAz(h z!XxHa+0BRvHVMnySQcH%m;)pOn838eIn~CU>(WIK77SgR#n7hbPeFeG#5;Z?1uUh| zu~R&MV#mMrmt6@)8zyS%F~RPbC$dsiGM@KR_JUR+WZVWi1iM@)6YFY35)v6^X`2Ag&4kmS$4*>uKY7IY)#XJnti zFc$sh`eRwZ(CvF-)>n=iR4ou~)ht5rJiyV zZvr@b#&pG^3{lU^%Zs)p##eA6a1b5(5v4*dR@NJMg!B8$bfPP~V}d<76n($8Zr`or z^V(x%&jUIC<)(_&9UcK@?X6FMGg#9?_C-xM{LAlD=abZBc=tyyD87& z)D-`pclw`y?*vakSkuj5$_#dgJIKs`U9fQ@_kT{^^?xAZbxq9ORsRd)B`B=xi#lTa z&JZ9h_Wu7z&*gtsE#^Wl?)>_@9G#GBzgk+tMiIrm_VhBaXp9Cg*<%r>>c?N(W3*>p zT8{LVl%yqnD9Ru|n@qf~0;T0?wenZtM+h?QI^1}JVMSObz4USuzkHkUDgf_~!;05$ z8Y}}41nO8kb@pv$BmVzZkIRHn%S3JpOa(3#S4~?bc`CU<$W$vJ+2ST@BA`B#FWv%t z{d(0t1%8vCPc?|F>u3`I*Prs`2f_tJ>b^^&?8yZ)(J@wN{^VF#k6t{so?tHwmxoGBlK=ZzqVO%KPs`B8}hK^AanLS@nCm=kQ z9vw1LN~1ZBv*oa2@sF6?iFJ|2+%5F<)jY%dWT{ongT@y2lm{#MuE5G-42QRuuDTnvz7H@m7j9^pZsFXPDF_^M%_~);5z(1W?{Uf)#9#7o7YgZD> zRp9A<6wQ>LN8>EZR^ka)3_$6S~3UGw-M?qhU8aLku+3s1*5FDqGwmW7NSD}($iRrTW z5$wVxtA!B7P%ps8n`k{Sivr0dm@4LymELau?>`IIg$S!4wW{c04qdqaOd!G*?C1|U zeuR|TC1zoIiFZ4`0M|@8NU7^uc)4URs(9oVk7)EQhtic+Ah}d=)x>-RfG|v&+N$`) zi{X~a>EioPgXi+x5v;YGyMhhM0LZ&+Z5aeQRo7m!DVTnA{zosw7OcDmH=AY5EG!xP z(@R-YaZB5DlP_@;U4BXP%jeV3LnqAIv&;CQNA=&GLE;P2Cf^tQU1iv1?k{z#&-b%( z;0n{BJ12+*hwm75c(;W@-TRxo2uoq6i{8O6_zCio0s`bIt$laRE- z+UcxlNNA|;B9KLERc(DYu5UHYl6TcfYq(twb^xsNA4-#)u{qZ#+1|EY!o0L*9yx=z z9peHWPAmxKRky6m*DdMBG|#uXeZFgnh)bz2Q(SDG#ofyvUS%TB>1R`T?9<(vj~}GpM{d) z2!oONAEv5*jN*p2ycuz;h{@? zjG#1(ZEksb#UM#^E4=q4n?f;bo$20-hB}XlkQ2lG?lKU2>XrLnFNp2A`SZo{L)i|M zss5_JB6zBQ$oJ^H`jr&}$c{_SRk>s|fpzrJK=E)P7`P`X3FUnH3m84oxkQHy@M0RK ztpRx^W~D8{XR$N`vQU(YbZhbifW5`N#t+Vcv<(5LxF3Mu40o(=c_{UwKFO#;z-_y= zuib~rpNVn$2SVt>vQUJXTAf!++k=^&T4gplinFe)V zG0i}yAcqg$d0cC;stE>8J=wbYI;C`B5@3{WhJ-^VN`!$cLuLQHhPQffzKuNh!Q|SS zU4L>xlm)dZa4PC}MM1l55l^Ig4{d*`{_9OH({^8VcI-0hEeZE_hN|vTrIHe_?^&_x z_w{en5+G}#`+-TjtbKdF4n^CB!;>Vs1HtTlDq_igP_GUCca~7vGZCQ8q`BSVxR;x zurS(x6Y;4&*R0zAG8-kgZzI)Im<1y{dw7!F&jO#qsuM5izCk!H{}qg)ofAp2{Bm+B z_Kz=T?{dmZ5Kl`LX!mw@Anno`%9-r{Uf^qx`&pXT% z^VybfoZhvuh!|X6=zRH-f{W{H+1s%8(5%X0aA{#fL@OT5tj zXF=4bv7;WnhQ((e%xA|S0Pr*0D0afXo9Z3!u^@J8n8$fz6BT(?N=C+hP>Jt1rU9~! z9oFDph5Pgd2t()k=#D)%L`|9E_jTnU)`!1>CsX{jH-y~8n>TOHojV8O3H@=qtBjSP zS43trK4E8P-wSuXBXpZc%*+YIEdP8zx4a|oCfh_66U+s_LDs~UjmbO{5FpkCg+o4n zF7s5g-V0Otq*%!UtkDA_*6_#3Zg5YK7YF%!=%{k+2we%>$_cQTq)TJF)0wMe$C9WK zLzXxBS)}K8-Q8MLF|0N`g{GWeJzZs4hVxSIra@29Eic%GH~LQOyfs-tPVb%*3g-^& z`uRR*+vx(`d;-6q8GZQ$euCEaUEJ)8^4OOMHvT>SmMq{1H|4d-VnGuv2)*?6_4TOP z9)*2zjU#?eUcWf+nEemW!X`Ov4PrbwRNZndPOLvi`&i=GYIMosA972THJ}J1!3(!MTbDnt{>rX*6e`Qtj-RKr$#M;` z9xKu*-R*Cfy|1|R7q;!VwOZhaEV+Q-ZnDe3i)%Wf$FluhZeqEo5s%jKN6Z42V`F1s zTy3kt)DPI{$Zih=jeEjklrhz2;e?ILxX$!14K1x<_S5O*BbH%gv|3yf4jE>h4*Z*E z>`Or2*YjYvw6w%)O0XZAR_kw`>KKZu$*X^z0)t{x(}MC^x&5xHg2KYXA{xU0;}#_ba6%fkbPiEN#4 zzjSGgwT>L6V<>z0)eFulBX*`qp$fKa@3;e9!}>o2+mRlsc7*<^UYa{N6}M$oik`ey zzo18eg=+tH71lYz(kf`YphH0R1Vew4&DoIgvmm@z#G^B}abxAHBM6bnCun{tkUt{4 z$<3nWSWgCp;P#TA3pYpljQmj7521ds@zR-xoYM7Mpj{mN>MlviJc4y_+c5>nI8D*N zXB5}|&Xda5gnlWg?A=OU9&R+q!EoRr3vZ@IN{cK*{B9$;MST!Nkc*-iZXcZ9`CB2I zjQ+0Jn(`3BCa?VRMaqkI*oM~2xz3emL^FBhX*a+M14C0z;mz~E`bP^-L0$#HleuAS zyUOs4+3w0mjdvV?hIWow5atjkDyE92&ow-{5=qyWTP z%)c{=<&Jgin{7|Uf-rdk#ok93|uR%*o+u><_ z9&XVE#R=Vv-pRMW!|j>$?CMGTcXzwrTgdDCRJ+W_Ydl_SaF1rVKDt z!bP(MiPj@Lf{%+Vg7=p~h_rMbyjQhG!&|ahF?3)K{S__nRWrZN&R+dT3M&&+oe<+F zSSv;h={p*Yp%p?Vrd}E>Jt@ek{vOEAsjH0q{`~%o8#^~i5$YQseuJ+gc8^}_be6)_xd9V+P#ZkJV0 zx<(eO$Sh*!hjI`#(Q>(YQbR+7vWwBtqrhKi&Da`F9PK?{+mcU22=stWU0sRojczy2 zR~)7|>@b-w8p_p8HF4F5LV1n$<+ zSR+R@t1r$*kMNeY`*20RU0Gf>Ic;cY_`&iyB--bV*;~?OoY;)AfbUN~*tmJ-kmP;M zPBXKh#osYKJtit@d3Haq*ZL2h7d0oUwiBNNK+YmIrp=$ZMZsOVd#de=NomcLT zcy@LtwZ3`Nd*Y}ZtV9Bih<$PuAqEKhoO?FN*n1eHD@EJsF#K%#v$&XX3cin-pUx{i zO76U}&}f;Qk`n%UY2V5Fhwt1xlt*;+`%T!jyGWzkGgq?xrI)k)OxXQujFZa?x)5qKW~bMzzMyRYVYuLV-GDaa|7{pOupntj?=$&CDHOZTbU6hn+WcjZg4ma?fE{)a}xj8`i^2_*k>h}XeRbUKA69;OO%R!-=017Z4G&W)pDT)VWz|O zmSY10q!qed{09!)uBO>V)@BS1imsPwr`TA&bPZXC1#?bq^<`;rSX(r1Zho}5Gtz(O zi7UeasAU)J-4cg3B()1ssZx#{t5#y}HU`2L4gU03p%cr5>WJoM1;wIWu^~W*a>cc;F9}ilb;WiQZ zw3i?=t&XI%PE6l=Ot1OEr`7NW_J+(xr6G5oB`hAUZF-%@NIaNe=u3VS1y&x)bId&Xq z9M$oqnhm`hf9QZpd-(5mq>dXhlL&;JC!81zicY*`pEOH+eEzND=3|ksix$PJqw;ze zCwbTr3fSW+$HyJtF9f+Z6rK;!zEb?Mp`qFT!t#@4d9`dZ2`5`SyWR)3$7<I zy?QClB0lKaAJ+uvOaxMz6Mv+(M?RFO~x_RvK@6^RXQLhqs@CQcFROjv*_qs=R zkIFhbJEM!)-Tqz>YW)w7X1_-8vpMwT%NGFl@8)Q>$ZK1kSq4Q1)eLbyFaBNFJuo@> zM8R_TL`_?p3%KdCeYZ&uh93C!O2B}g6^5oG78EKB>S?M^3*);V3Bw^5_)Ty1)!*$9 z)c$60aOD^dA`BOvL9p?1IbUAfi5>K7PoO@*@j{7*8Lrr2l&x;=uO~2*y|1u=q{2Y% z6N>(@rJOd16n+5NnLm%8N;PaGvD@aoVL1>dUj}j&zfG4n`6j7+vB&=(+1a&=!<$Qm zL184aateqkkCI>97!$19$yJsoj^sFxc#^A(GelQRLCy(?Vfw!FmSE2Oo|^+lR9J%e zXAI;sd0NEp$0Ml~&X?i4X=rNx`SS;!l#f%Xm{Mrz=v+GQU8~sp&%eH#;Vl2t(==dg z1%OrTal=0&WhA=Xr*kjD34!8DAJ#}X#I}st>#%vA=6Pl+OF^cx%whOj;oBj3GBUDd zjUDpMWA@0{AFx^WN_G90GBm6a->7Heo*idSHUdfi!y1Y%;}+~O^cud!oXEw+rPCDL z;88UVIGE@;*uMdL@I9T_Q$|M*T#bq<_5!hApp? z>MbE^%YXj-Pf;Z;x;#`3f3CLH^p1=w5yW?B^$8$o3;cc<7#K)I<~fKjF_@lqduKp_ zck3qwQU8Z%IzZsS$o|y6(L$JNQ;pp@kW4}mMHOUdSi(7920RhA2qZ;Cu5X08IT&o+ z-3xdE^RfX?Xso9uF{;>z60M@F_sSnneZD;k3V#55f}VL3lWu5|Hc21JK)Vdrp|6qq z96OYMusfk9g?rIs(FE_$|Df{a=lhi&G2Fj@|IgpQ=le<-Jp}cr+}zxNj)m!G3W{od z^&|+|l|C|C`rriNpyWMEzBO>%wzr`{J!v~DD=P;_q?m^HBu_~m6<^*o^ySBJ2Nns7 zX<=dE+g7vO>RfVW7Ut%7qw8NgB&hIP$Hc%v?zQukwGnp(x6Pj!`H{bWKBOXKM4qr; z0DABcvs8e9!7b?8gINt{6|9|{K0!MxDvGw*1~yJTVlwlbUjes8MMvu;id^x5tUPf& zzz?=#_3Om~g{hg@nnkxTaZwO%O@%7juzq1+KnxQd>Df-@eX5-SQ?~!E8s$jhuH$EM zU7sw2kp<`r^`M=L3*B=l?54!^PE=G>bjY&g=jVgpyu(*yub9}I=4L9hQw|PcZ&a>8 z$+~179~uiqMHoY16sEb+#~`*@ZF*rM4b!RN;b3NBZBwpf&jO!2riW2RSp-S$?>qtP z0z!hV)#~yu18;fatCPY5c+TE96lS?Fajk!sPmjXXo!`IQ_ANgxIo0vgZOyNhoB( z+T`$WClP$y$Mje0p1{WX&D3!Ay?fTR=swhhKvt55?SL_CGx7oT!yXq@X)t;TjT6&V z6#auCl2TKi4=LLygimemSOsXrTL4yONJYo7q}Vy|x<$gBnsy{4B*e$W#)f%gGa=;$ zZ+KtqWcg0W#mxh`yXNfVL~}f$?K&LjgNkTZ>hTHDKY#A)gU7U^qvQDaI8_rog(G5O zUhb5zidw%6Lso(7J;k>?_5%v8_y1B~nm>QEqr$i<;go%8cWt=!ek@R!7uar|yt*y$ z1@Efa&f1oi$aW2{uGNl}2mLv~%ob*gFW`y5E&|~5gMsMDXH=VU&|bY378HcL7x}G6 zd3kWQ6%BX#`LTF+UOu?5R31wLDkJX4s>7%e4FQlT=`ji%YkE{~6I*1Klo}sjfK!4Y zinR-(I8;9^krbGjnU6_hI0fKlz`1Uz7)KPr=E42@ohyp#r(#xc{ZO26zx%#o*rjjc zKwVPO-}lDGntv2qv3efGE=AzF%}`>Y_jQ(z9FyGa=H^9byWc#Jdn57h?+be3Z%)0Klb!MS({zvKoV^yQhN(ll*-D=kg1X!?mu{t)q`vNqTA-u z4KcG1yY@Izv%GC>rH%OrA>(ku%8SsAD^Ylq=#QC6zKW6#!wb%0%O+}S>Vo3p#+}1s zV++tcO^dbTb`je7uo>hxOn0KhQT|w9S0DvH8#^2MUcl<$`UHT^?(EqJo!eUIDv0d? z{0IoMH8;?|NjRako>1b6%%d<@Mq$aHy)e|8Snl#R_4mj+F+1YBYD}+kFa)<88z@yH9j(lV1f?X zzDGekq=yXcs@EJyKb4BDar>w_G%U47$O`8bh=Cwfr=p{y-6$}Opq0l_tbp-*#qF;Z zKmb8^%9p!sZ>Z%(Xe{?^^$Sl&9qhv%ZiS4ANo3HkkDot(e)o5lw`@u}7Nc5yiqk@QvC$BRNZ$Kkx-pe?s>s)3$zpr(hj61 zCLRMbb9r)pLjW7~Nt);P%o}QlNOMxAw07GPv zZ{S?xw)NMrN{z_z-15Or0@%8C?UikhTeR2mq7)BT+sBVPW(4&P`pltf)kUCRDR-1r zKIeGr`?Q;hhM!->cagF1P1!<^wtyjYLFLI15>Dp~J5qesqi!iM6ZzU-WA}KTmP_@* zg}p4|l9CMK&)r9Ly*^|9I{-25i}d-xPLFHgI$wK*SZMbFFWT^BW8>!0f-Z5!iwCEX zZl7y_wJB~TxLz2nDRu2Ko0?Vl3<K* z15Y@)xA#qgE}`EO!*j5W#RUhsb)v^EGYV~v^vcBBEJ|k8jJ&+|sqLGvw3T+=#ieb_ z9tg5DOxO%i+UE=`E-t!;CDz`2kd&CnBA%*?0!+7RX8k`dBJ!!ad4eiv@lRa$s6Y9P zx4Y)iqu0Bt4yPU1X(S^dA(7fG2BCwm{+y5aUQ6!TGc5fmBrT0Q*+7u6p|;ZB%)!C2 z^nFh~chK?8w}d{Ke2X@GiBfZM3N0j4e*&h#i9a2Qv(UkG_C|C?3?50BE;?bbOTB8}b6+Le6FgUyAaqoPXv@Zo~T%ub#xtc!_>c@m23 zmH!$rPLB_4d`;?IFy1ut(=)H?#q%^&a}>YUwA5kQYQ*PM{~gX*h}x~RPoF-Oa)KFvh&(K=MB#|*)5Xlm8FhAec=-IgzX|xm zOI*dT?{CgC!&3qA7-X=*owC?g zluH9N<<|}p&>a2{))X8+mHb#puX<81APJnVB{THiJ%JsU;z?9|v6;rb&jvgJ6j>CW zx)v7J6hNg)1ouUPZZ3N*1ff5DKlV_Q*kMP}-b#lY=;7vO6EOOV${q^B1ANkFIt5Vj zqE%VuL-9JXJ4l3BC&kj-d6fBp2)1evE~k|~o}waoddwZd`EN<1M6+jg6}KHDS>-`g zgQeuE(;d{x^R6F?+_qskp#xg$^N!<4ABLy#H$dswFXsP6D3(q^m4Q6I8Y$xBv_eqa z>`)_3xQdUD!YZ+LfUZp&WGjGgzA1kJmSIg2qzkSy=$4Y2h46^ypvGZKr_QUSq=ael zjbxHEGXq25ov6}i#VUIzr^t?TSd^feG?}9yaQMKVP;3kz1gW~kg^E+rr|acQO-po$ zOYwwClZ?!b&t!883tG=5LAyXO4v_HwLQyI1d$8m6>(^htqW2^e990R_+5S-k!3i0(|X)R6|y;@U92XL(Vm@MQSGav%H*K#`!Bh z?+Wjem7N0f_RgKp02QPz;U%JOK&>LF>20y*vuV>NPz0O*nBbn|BLO0jH}8*ZNB@YM zDfSCS&k$Q8T>j?g=NHR?Z(!clh1wl$25M>8B=3`wN|kfVjEtno+?W)1;x4gxC@LoA zwh3(kb8e9JP!mtUJ>iwYuPE8m($dh-qv%O&H>!F0Qs}?|^E5p`P%(3JbD&;u9rV9# z+D|Nv({Y`(v8i39Z)d zDP5?(-glp*NSMABrN+4u81dXW@a@|*Qs7E-M1<-c)GV$V4O>jgEB5jZqOwP`zsQT&EuJpS zd*DFd$B!r1-}!Nd*BF&%?EhG3PqXPJRQ+)}C{M(pm`+Vi#ed!rTxg6J`XH#~C!wf_ zrCaWhmsk0yRIjZ$%84hgV=2$BL9(`}=oiA0>pAQmF;?gq7_|5Fum|mfRSC9Lw=Y56 z%lhh|=X4nQ0e~Qd>R(@XdB9$}%Mbns%a@mC1(SkyV~Ez%)+fs^%s9D1T{*YA~pC4Tzgli2g&qKCpd6#JB;Bh~2q?5ytL!%4~fNOKW{bO44C<9Fa~cJTa{1LiIrpE$rQ zIQNldC~WmCw8Tm`++AyLZjO_d&iTJr-~utY;Fq(={;H&Q~_Ae zhetyJ)eU4cZ%q06NWKIlCZd9#KpdD@H|)m*Tul`NRu3?h7Gi&_?d8jtot;bxh&gf3 zQ4uf0cb-Qh@2^PJo2&ZfZr*%G+26e&`-0|YAbRoE_3M0ht}>HpY7xJdVG=hM{@dnQ z_#PcNVYuVP6#5ckldSK>o@d@Tpo=ous)(rZzBR=gEIweqsHmt&SO(hLzlU=RA^^5( zVtEd7Q{eisZ`&s9_jzq~9Rpl{uYhBMUyk=i}o8;46r>W+G#w2$>+e%-LfI z9M=;PQo9Q_L-KJR(IKt*Se^o#Ze07{#rUcRnT+A*A*B&9K885tEW+x2t<^dJ07VIq zEvoAbyf!l^EML(u0#ua7TEq?x4!{y$z?4D#zA*-J4;@P~~<_i}tgeXHsoHKw&(MLc+MY|Ng0P8n4b!=>Gy?#5`4)`z2 zkw`UPzHkQtAtS+cXn7^tJ%}{RgRUn$JY0D}2C@J+_dw070C}Ln16_rsPSm`D@Z11F z@71=yd_)Pi{);uBUqUJk!0hOzj1#O$BRP{C`$}hkT_G2DBbfp*+O}<*$p;`GJ&T@x zGbm~K`Li(VN?R;HyLoZ<#l_v}3o}^|_e!J}rd}mrYX|1J0cN5tDWCP*>LP7a;pa~b_>PXamus1Y*6`6MMf zYHK%M!#66*yGJT;Xy?W;lO@$6Okq3yT1NmlqT0%21D-$otH)#p_#$Y8#gh)yIy|}> zz{DJ2UqskU;bZ`o9QX-w_){L&M4Q|GMwC=es>2NiR6dwO62ROpF{es=rGAuNHyZU6SL(6w6JvAyZ@h7ExmbktRjS(GWydj+*0Z2>Bc^U`aj zpLza$cQ>&Ru!>!n1w8re=J4AarjXFjqLV@Qv^bA5@auzN9jgBHQQ$@h6I=08T~D7s z4+5vhoL5On$z&+E?H|0TxNcs*uvqBBYwwZ|=Xvtv$vw+U*a$F}Vc2zB(Kl(7Ae|(I z1B`_F#l=J4J%MQg{~n>Yq}#EV>f(=~A=|TOU%M;2yU&7o<0@4*gwo@Xfq}ykYD^Q( z02nh~?T_j2KKhyxpvUU!DvI=xThq8b>iZw=;pZo#)~BGLP+dd?V!9DK9U&hG)O_Hs zV0Z!c4rC#D2XzIENU~-Tu|e7y5f>EP9NNki3-9m|7*i>#suz&r?> z$p+2A$hYFzU^m{o<@sXkvSukK9bDW8V^C$|+s5-tV6qx7q1>~Bo15@g8q_6pS8%6a zr5#+}7BtPJd)mdN3PigkvdfP#Im6*C?Iyq;c@%p;5LZAHOwF$0Ar=wAS8ok^=t|7y zO`xArQCZnr2vKfAi*Yag;Ks~e%-xgdlY^H@2b7C3TKv%69TvhLfGmyFi`jT+gq`?@ z=4Hd3JOzg^a|69S(1c*YJ6hcdmZ7{cg?TtWwD*U3fi;8oIJswBad&!6DvNAj#itRsCM^}5eCRh0*;8=VA zwUtZv3L@h)+3(L0?_Wgf;^~toZ<1EWF)2dzl*jK*gJ>TZDkvyen};YHK^&v; zZ{K)bi8PFY(Z+33LXtrx6CF1ofQkO1~K#rl`9QnqZWK%mG5OQF?cU{}YU zDbFYrS9}at%g_T9tdrn8<3v{T1$U{W9J#N*-CrVdqXnv=id{jH890!woEhR&vR(yf zCHY4f)GfAS(AdtSa6x2vIG<{g|0?-8w7f~)7LJZ0w+N?+y+;ja6rM$}Ha9mb zE3J*_U{eAm(N%T8y%S$6xud{MMTJ<|6xnnDKif=!Q0%ggni z#_rr+v3LD-pKp>z_iP1-bv66YxcxdKZq-%yZ^OrrH_i4Dgi~)WZ?5>==*c&?zUk@d z!31LEepQu{0-c;0YSrm&@+s;kXdbEk4AjBd_ag1y14c@?6|zak_TG;lSK%N&`|)5C z#wl;#-A%6T2iWjS-|-8IbSxXatv+QL)SRuZsmV89d!!2!5O4!`^6{zuXbwU0@n)G- z`05!XLTi`^9R@!C8i56clv|aRml2nHjKa}kA|l{)h4XnSJ|w?Md385PBF@fu;B(>D zkvbw6oZ(NBzr7EAp~WGTW)fy4Pe|V*5)zo(wTex$j;i!iBz$TL81NtfnBQzWf90e;KBx8)n;voAh%HD7=y#)khTvjlP)vTG-21J_^1=E|U*1cwdQ&qXRkj{y zr#4qck*c^HY;4?6jtYcgXp>e4empTTrrqs|e~jF4nWg$xU2^9Zypz2$G8$pwQyjWG z(+`dKO!Ze+qdJ4G&R|Xc^XK$fhZfYb)ZU)hlS6~k0L*@g7L1oEwzi(3W4qEIEPU967)&FAe$J#tm+Fh`hW@huXZiuAt3Sh^L^R&u| z9!FP6Ad} zOLxSx{p4)WCqQ`1^see=jC$su#)ErEQo0y!IyE)b8~+gB;Sd_zs$-z2JMUN<55L~c zTcuitrq!8^kLSrId3aUV82>Ve4MMuh=w*;RMx)jEmFncILN(HQ8RaI$E_E-0}wH?Omnnu}-E4LyF z-Rd~>xUcjWydzLLVLhoWMXJ812kruGrhX2alMTLwt0BJ8&e2kdj9R=raiv217Qycj z6x2xjOF!`49ax`|%dKgh6Qn%_1qGemor$yC8D0QRJR~7yA`w6#y}xG4^@@>2`AG)1 z8OHDAGq=()6VubyHvFXBs;jGeee5jRp@32pzIOD#+6R|gFbi;(01n>tV&w?ubl~L| zBjDP&mY|mdB%%EL-c>0lEUWM|8sxL@*pbO`y=^6oYN#m&7ET-Uz&~bKBKvm97!4T| zL$m8o8ZN5?$h!H`;A7CA?Axk7db$yFvd1pYQmbBa{3!A0xa_QgsxZcDLIMJ$LGULB z2WO5fvr}-C_jPq0lQr3XAs6F)C@X0BVC3K``K>SDu)BL+BI_-rE7wRkidtQGxSbl8(lx)64M z<@!1@ctI8TdsbFf{Pe;?I#3*~8EOSZ#Y%h|tl}U?+ZE0t*AvQ%S~GUS*zZevvoaQP z^(p|aNdV!fT;+eC-h9`o^W8hQ3P5cDh3|Ln+k#Mf&vD1WGc>abL8QcvXI4iEN><3> zMI<}a8PN^s(SQ8-VJcK^v;g~9%$~Gq0$9SfIoO4xNqvk^GC^>L=poZnZns;25N^kb~?=J{C-G4mKhpH5@B1&|F< zMqu=XY&P4g?tf)SnE1(i{X5yZ2+m%}zrS}KFbg;Vwsj)u1jz|`0jS5~X`CcxiSJ7w zMGxTcMmG34FHkeJ{wmhAwatu=KccR#j_$3pvXb}$8ygL*YEXS~M>_7k$-wai_ZmQX ziDkyy#lukt)kj`fy+*9Up)xWu8r|bA*yFil#e`h#-J*_JhSf)G{^sFkrvgNc{Lilf zeg+bBO($mgllukn!cMiHLjSA%n;mVU1!5}WG2S=#^o*4wv0hpy2Ktj(iSw(fdYzFy z{(^b$Zi7SR_v;!m@F3?5JdL)!ZpF7avWR`*+3id)d~gNX%{w;)&E4$pASOXw6H`-w z;fE~`Z&HWytNpl1T$-HQP;&I%tK8P8iT$Ldq~3n`Py&ik&&9oDcisaD6KM3{$0{UN zi*FoAUgZ4eZvXF-QS;sjX;JiZb-)@@^JSJdhk)+jhvZiw|A@WY#0RVra-h4J06=N! zztWWLW<;W&07`1xgu)zC-&YRI-kcHXRU5qSDrchWCtXUinkzmFjZqzGH{dh2u84r*{QtO`$2>;1a)Lm7F6 zflBpDPsT-QDClBhV)6&VZ(n7`!vUDlavxa4xZAZED-^&2y|=GF!)K6RvgMK6^T116 z$N_M14jee#>Y16D|B&`Pm6dA{cum{Darzg&K*iBQy>%7gNAAA-}7-HDx4%r$*Ym_()731TMY3)fj-qRnCjE)A!cgwC`(7Jtm%1E-s zNN_|bfg`;T0X$n<$Hm9jPN?jV2M^YnX=n`mg_co{$V~{LHCA2MN^DM$n9pe{h>Awt zxWY5!b2BL^^iIh?NXbETcL*p*ZGJpkhFsJ)VggRJYfHZV;&*`h1!PBf&6CGyhAbOp zGf)4&UMz4tG*EWmP_*)g+nk}K3+T+-Cn~|imZ~`w z&}zoksieO8G4$_D4apm>EfaS!@NxIxu}0P_rdx7paL%5-c=6)t({q3j+>X+uR??k3 z3LPTgRx~s;J=R`ca?%eD-7($FJ@7D-`abIz?$X^-cQW`>~GI$ z)H#Vw4d9xD>$7!j(Buam<13p0I;aQmU8XZSw*r}la~Lt>B;uAvzew3^)My%e8^|IU zYFV_Mxw*Lk&q;eErJUVycskr*WlWG5n=9OgDLw`&y!G7+J`8%&aeZuKlAloDf8^k6 zXNX|C_n^<*y*r1Paiyfp;j#dlYObw{h>TR*?r4TCgJ}6pwLz#TxRJT5D@vS^1BCY( zezf8$j(v493qi*g#x`Mh}bV9bodP+_-ypus>Un zYG>Vx4=Sn+xNQ8W%*Vd@p{@`J-2akj9r1LiH2KJIw^=Uv9N@Q zt6Ev{Jg6ppIUYPKwYCwchN#saPN4;b>_3B^fHCwAAJ$Y*QmO(!$s`_V5c5?VTWI9j zI>i$xdH5)h%U&F5Ygoczf|SxN#j!jbdoUwhQs?4%=3J_NW_2K+C1p@Q{Rf0_YH+DN z&Pk9+gdsS}tr}PwB)8 zm7(f8f1ULqu7VBl3%_Z%5S8$kCOfWlgMt|^DJ^ZAt{p!(HntCRgCtAP9y9BaOz3Z3 zsUh@!pvL={>^`$M3xY(TXa%O;PTJ_Y&#$N>6vww$x*$SGDk@!qTtG9VrS4->pyx0~ zU*6mGF@ZE;sLTbF&Z-W{yO7zG8;OYxx7?5<%x?_H;%qv9sd$kw;Hmq&egfjlubt|5 zfm4PeyY{uU5lV+K`+K(`SvFx?*8I@u0o_P~H&?(&A<6)PC7?%WSpgM6@7g0KN`R-M zOF4mv8>!g;(NpU|PabA`S4SlHunt3I+nYDhtbuL32W4bDvBQI`VV8GrtZz^!WvldtMQJD~B zG0mAo9*3Amk9M|@BVPW$UJXO}v_yu0 zkPz(SuViBe)&*iV!MA|UcvFj>iYqgMerI@VRoh#3Ha3c|D2&fr8>(kjM=V7A|79rC)TbSR?r~jgA54C1Uzg%rmeWe<^6ww8nKaFf)@mF%`}c ztv%qOKWL_$nZ7qxi0|B~^L`@n`-xd%LChl$WWmR2X>#7-f9U(d;cedGtOy|GFxXeIF$3rB?6WA3i#i(%>DD5Oe2u zx<+~ZVJ3AY<$qtGLEK)Voj;?pOz*3dgZ^my_U)){RP^ijWPADeV5k(Ejp7JP_Xkg< zg7SK&KuDiUda66^>08Bk5)VhoI>o$Ha2qRVao@{s;_sWwY-ZKZt~ME5i2Bb%#jEB zw2HDaGY2e8xH!gYu+RSb^>^fSZ96j*Sys9s}jXgX97hK6FCfgZ8MOL9LG#a?Ar*Dg`S6^*d8~ z^oj|6TaZN620GIUD$oGv73NDQ<;$s4+55~-?hNnu4@s)YFf;%!GDYz8pl6519EAz_ zbut4F50Cnw$&1FwmQ{>aO9>R=XD3d~DmYsp5;BGsE|-?dIa_axKi?30&fOtc#l{n| zKn>!Z-Q5oTDsLmYfil0vQMQYH57C11O-}M&(-{bb+IHgpLAVTd2kGH_Rxw4h-WR;M zYjs`8AFrQg>sB$Cmv@O{g(G<~FmS`|%aebf2hC33usSdaqWFpbgfOsZ7K@Vc6$yqBzuB5%itZ-$8c~|&stY* zUy+w4&6pCcp+e71()aBF3N%GSV9|Xp6BLV+$!`Mx&^yGf8RapC{5?>3pFn^muLLs`{}ecm2bMmE49J zP?6#ImwQea`yWG7*x1l8AQ81&L?oQcqR@uJ9y@p)-QAba+=#Lq`(1_xx6o}zHUR-w zkCL4Rb_8A>@2}|_(J8LilXl(lXK4u|;PX8Sdv*SZ2?jL>{HF^g zEjqo;+?dx8m4b=g<+;fD#dMj^YiM1P^c1GeLes#EQnc08Tc3skfCj3*u+qrR1I z+qmVMQ^Di<|Btcvj_bMK*Xy}nCe$Op&OX{46dD(|+nXsr z$%s-YFzZ-V-XEFS4a|AOqL6t2*%PQerCzuL78LQ-g45E{Anq<*v=96hRtPX)8+*4P z^f?b7JzAWfuibtOasd0`kc`kbmeH922NdHnABF9y$~*2^sABA_a*DOd$mLtjZw%7t zY)2kkxr&XiDu<6BKMn^iST=Eqoe@#wu(XyFR2;*!)wH*b+J%9=jo{;uQ9|<^V?#GW zkn;I$Mmim9Us{M?_{BOdwxo(*N@oI++kuk?^$a#w0a$(f_gBIsx@kX+MpR71?c3re z9}#(oqGkkvt>M(=G#p^GLHc|4FkjDrZ3-<4zLHGYO{^&PL&sG18~#>Z)ZQhD26K$F z#5AaL$9~Ua<<~snpKao2%dzKXjs(eoMTn9U_`%FQ5h9PkDnZ?FO6ouSZ+*awl=h{t z;KIYHcZVrjrt*`;z~Sw!b);|jAcvw(!J){CZ1=&H3$N3O;FQ_S?i zk^*aN@4D&9@@Qu_YzZ;*A#vx^rSoAg(v6oB9-3S2w>3>Rz z6ab9aX+{%V_FmAh`m>3ALFK}bw)cmKm@+zPypacf;NnG{FNb7%Tu4=1N$ClqvLL-c z(Rp9u9O18&6!SliQ*AJU1)DVmh;22u&d-Y4I=DxU4glOzXx`X$B!eo z?Bvx-*tYQgtx9`MBCE7mV{v7tRU;TK=#Bg)I(U_$T07y+R$yP{Dwb#PFc^|0Gsls+ z|NlNRzc_9c_HBv#)coN=NC(x(B_3dF^`G`IUc3YJ0YWgtA6?nH1Tao>E#hQKz>Wq~ z+Q!ClG$>svwhvzW-AGMk=dTLIc8(|b$I8pfAQ!CuRBT}T3!kK8e12GJ`;zLpbLZS? zwpPL!foHlN{s9IDwSUHZR@`DxFdQKad^$ZV(zcl%D%vEa#18PAvMBPLYveB=;DN@4 zXEn41Sfb|@V2~U|=Ait6HWlgpTd&sh?DufBGO<~sS-`Qwtpfmcu)8~nPM5?Ufqr2@ zLE3)_ji|Tkh$9-O^+;5hl zEO^m^Fu^q^wXOTzJNUQ|TsDTukV7M9M8Sn%K<6%~5(NhUAWdCz~gW^|kr2LuL(+EjIcrj2$psp`JehfsU$BS6Wv{wEG zY{a>PhME3Xn|>uTieVb8fcQh6BTF*_3xp(wS?`n%``l&-tVs!^IXfnRs_(#Wh3hQm z&V2`*+H!V*9#~W9!-sbdSE$~5jAsr|behL z;~9jJQxYDCQK6)zt@pG=&jsvv)}PaZ@bxU5zN@tWNe*7o!Yp;P&E7sf5N#n!A5Q}f9D5jLyMefsB(jOKQDFav4frYgN4Y#n4fP;2 z)e9|SV=kEZHLfKm_kigaL2Hg4x?y2&l6o|OJ!Nn;o4o{d2RRD{%RTN5m;v!OXN3Rz zM5=mLq{y@jMrj)D|5&a=i|~xS&YT&!OgLB2qXb@|ciIOH2U=;u_6dgKMcP4xFm~`a ztVz(juyb)qUd!AzSQS`>0UV<9S<|Uh&8WfZ2j$<(2_QNBGUPk3@AC7n17Tj>>0PWH z0T#`PXdfE(PXdT&&i(h5;?WGi3pd=80c13RxK z4G5LwRTTp?7Z5;V9)f>lMS@=M)R0uYIZ`#(BIzYyT&I(fZAH9 zWh9D;iQ!zM@SA0^Xx=#ClJmoSpO~=lC>l(U`*1MZ+kb?B^lB#hcs921%nSI|xFn(G z(zviJZSR7%5CP|sCzxH)@Kz605l=-tREC~~Xe?N~p&5gl36pN@=Zr2nR$ zinKPoE!-=0tfNzNJyznHIUmp>_yCLq9zo7Di|-uN{}#lixzNq4X5-2L1{4$&($&rt z-MKRb?J%g12l0E>{`9O^;YPfQuk?(ViZdQmtkT5Tx(ui>XL1+lK7 zsF>mNYKv3gv!}n$Lu_W#@V+DRB*KsObLAJjDno2Bv!}J7cky59uLIkfzx_= z^&p85XqdlxJSrjKG$ebO@QDWC-81lu9a=9D1tf-2>1Bvz!=&@02J6UxwZ2=)^Px=1r#Jw;QJmm$L8R; zw;Ok>A^m*!Jgx*dKW-i&fkYIfZQ`G+Bjrz!$nL+djznA#@3AzL+Fk|e( z2v%jlf=sA6{_9uCci)4VBx9Vo)J(kunqgPWQ`|;V%0~+G8T;7-vWwm;Gg?{3A?J^i zANT|;A2Hd-AsYE>i%Si76+z=9md>~#-)eL0`5;vSZdh}evX2c&>5%XbkfUJ#r5D!L zOYq|2M{haH+Uzv6&-NPvTf{DC-v~;Jw*RI`av`L`!MV-M9!50Y|zBa7DvxB zLH-sleM~1dJQ3?pHG&27{`3l(Q>j3tk?u)8m*`5cS(xqL&X=R<2H(9GBrVO?IDgJe zUP|j@a_0912&(NX{A0wm0HWK$*rF0|)R*_q_m}Dw>3;TJc@5)4xK#X$F3l|HG(hG# z9=q>r$42^8D5LHPY%m8ZV^;!i7*m{l!=vUy`*Z9rZ|6GMzefyo9|9+j#b3VMi|w!- z;snnJdkZ>T=+epoK2b}OY=b)N(`A%ukn-ynd`^v^fg&QvvEK&&@#o8S{_O}3YN#~& zZqlvJ9LkZv!;MW%n8ZtDj~g#A1?@UpN?H`tBXA7Yi!zDm0#$IAGUNaU7ERQg;yG7i zw=A6ac=bd^K*GVwGuB0O(T zrlIBXm%;0dn*&twhHp9#tyEs3C*U~ra(W}02Yz`cGLzi)ei<+fJwG)wPcpv~TzL+% zG{w=}N6R_!>Ic8QKkG_f0!t2VuNmoK@?>Ua?qYT+ExU1^cSH(${=)`$I%d|>aSHEQ z<~CxLUcYjY!hJs`a`~pEz;C-91(y z?X?on72ErX911R!LM!Ws?h3^6sy{tCb#SNR^zY?N5`Hx_QEIMtw0^Po=rtjs^Xhaf(RuK$*HDoV;rGrP`ue9q}L z-@RKuLa2Q|32!1eWW2NIJMi)V#gf{R{5&!$O1mlgejT}uMnV^-@mz1!MpSw|hBA+l z`S5AIo4&t81uDhAUfKfb-FSBOU1_jX5;)9rCcn3{Kd$K4^3av>nbMv)r;uj7E*Kk#m z3qQ{>=#Ly9m|~1{P6Z<*&)NI*+q%>`b`1*@6c2y-632V(YDgndy%)oiE&3drFu;`1 zTF~_G-=(~lS+qvmVw3yNl@)I z2rA`OwM1pgUhm@EE2}XZ4C0UZosd*rkW1iI+hkdeU>yA$cY_6*Ec!%;>+X;2G%e|s zto`YIq;1_p>LA(cf@dQp<+Zj|d0PgI`k3xCM29#b{UzUtLA+-Fi>-s0KCs|C8p@I z3EbYGi3JM9^u{pMSTKJs2MRVvOUa6h{0_%tIhy;2UqGqo9-Ljxi2N239NfRqR`p>U z7L#TC!drKXho_W|D{3MMdso>N7Bnq~@0l^n;K$JTREpcz)IJCfb?uL(C-v_Rd(7ge zou`EhKz~{|zINm43uCsYy3*Rek0|(_-LsH(>*=kW+-U+Wa8lZ&cPqPSTl{#$AyK;~ zwfi_Q*M1Ja0XlKiZ~gaqzs7%m1fa+mk7W)bI}fY=1P(&$77y_YY`720@}ijp#*p>V zvK|Y&l?wu#*h=%%h7MU8adTe>@ud=HM7~JC8Q*V%Ccs@H}F3^QF5^~X~LWF zjJ^L{0}3q`j@Iy<_q2;B?uX-_q_L(Z8+vETF!b3E+%8Hr3=D937E3r|VZ}U_ngsmj zbK6NaI5S0;q6P5E*GxiQ$z(IrGN93Cytl6_9HG7}k8#q$z(@6oQ7)K>&KJO~C{0AO zi$c=II34QGvy$31v3CyQE_~Ut;LOeT$^&yhw*KRoF^WUgN|TpvPeOR|+rm5xGhheIQfzgyD+H=ju;1eo?7 zvg+>k#%&Gj#n?66tZq3)+kOx4+toK`c30$;cQ{QrCyxA2&yDM6O@7q>`>^o?;zWoa zgs9638{Ou-l?M}N>H9H_SKnW;-*>TC?bHkkgl7zj4^)|9(o;!bL~1Kwv{aRovoI6h z!&O1>54D3UTk^XWOactw1a5mBS7G1h+LXHksA*+>Zj%(9}e8phpm(7Vqe+X}RDrE5{(|K5t0uaalV) zcvW<`f=e&7X*6%8-AXp1K zgz}+7%t?wQ(->g4agu(zM9JqgisSB-5JJ3jm-yDDJ`0N#Y+0@e*Ym!yBHyW}Zw==O zeXwvYvxf>A!G}+tG{&P~1m-LQfdx=6;Eq|$QZupA{XKiVIHU&7-*`s!iXV!yZI(&i zQf~HOSkaqTiP12-`v4u3A*oZU{oU#Qr3HUI>?b89oM;5!jhBB#Az}=GfIhlB#}tAb zI&V8>jlt-)GB#^pTic8So z;Oerm{BY{EnlOgoDVl^Im>qmL!L;k}_aHPV&-d%&>Of1SCwjY+Rg z8asi9hAue^z3IH6wj+>+hRFxuFZ_;PPy4y+R+>#YHmt7#@^fji(*)OfGk# zc5GK@VwXF6?0X2DY7Qjwr#8Ncu-;?TH?=+EW>H9rPE3|UH;?~&mj363#chAxjh|oc zP}WFJ37vMt*w4Cm4#T=rDjH3W&#Dzma^I!`%l2A+JQKU3kl6g(_k`#6}$30psI$)QwKuh&fZWt8*Uyn zsvxGSdeAmCYz}$&EV4>U`%1aRsrVN{(+GxS%iWFKd_3KhIW$kG^T{s6wR^-hja?26 zSA+WPvSJ3BQf;@nkz;(l_ujZ{zo6+A`R;>Tx$mdG;Qp z&&$d%dgIkFL1he9j08bYY|(}TMNPA0(qknYzcLmotbS9dhhzW#{lIAkBpvphI7n@v zF<1_!bH|Rj*GGB<$A5_KZZRm2H`32~TnUqTOXLRt!&2QuUI$^Tzwtw~91V5!E(2s3 zl|%lrV)h;r4_H27mtB23FaCH0#1g~H`-evpG7LnxY2xrPj7b0f7gBB}>x8eG?cCU9`H`#;xK&kCB9Z({#|U|%D9zvHPRHf}Ii z=y5rmT1(lJNRS&0XMZK%auK#O%-f2|2_ZP)ZeTDTFWw;?8W{oFS&7#L_ja_;=sl<# z@ssA{qsvF{$t*LKf$9mOvjRXzj+SUL1JQ|1I{vS}8p9du{vD3WYHEfC2GN9F3Mzfr z;Wv?(KjNOisRLkNd3J*SDGuXpJVPC}*6Q9~B2y0YbL!^EJRPDo`=xPf=Ch1}y6CF= z=OQ)17lm9~#2F|*LWuNfe)_)02ob|7<@)C6BaZ_E&rGyrlpVVy9 z1T~`)WW>yZS0X!tsQcQ4>`=XJ$s|2F&Wksxd~s%=cUJc#zA%)0*>3Q0yJ0jhu>?4V zDRUR;tj|KRyUPqBqqySTX^blU#Z1RMZf2 z-qNp)KP#VY`DjvXixf>?SlShH#+zt+#NC+c8kxJ>Hqe|fzUc=h2^8zDfjx}vKXo3u zN3Z@}Z&Ly6Q;?AvHR7=$2F?1>8Ulofi1;H9A#;!36*V$8MiyAV9_kF8C(Bnx!I*|i z=|PX``enr#U6b2Zs5HJ;M&DX^t=k)NojgX6V?3bR&@y5|WG3Ix)YKFn*PhDVDa%HE z@#%^e^Svu9-`KX%B_zK&Jjw0GK46>{LOiP^)2ft4$UFRSOO(F8)Ya96tD|+Fi8Dm1 zkpWddK1&@FZ2?GBR|yue+pQaxcBFy?t*d~j#r-(K1#2GMg1+Eo^HljKyc8BmKBKiV)@h$GWk>ihC>wNflN9@-pEGNgCEz@6ptkjA01>} z_~#U(kl)yT;;IW)s~m%z)#V;AI3&uQ(m#9QNkT#=;%@XzaAvW%`Vb><)k}{qd&xR( zZHdj4<8$%rgew2k>C;v20}3iuI=HAK+tBP^-u%J&<&n0~{%82zNIrVw2C$uh)>>{7WUu-#U(|*PSN|CkIw2t; z*xG~+k;hJ}dVYua2|vsZ?MfDsy~MwW)B_`*9`8_c($j7$yHys?;NNZO2S;X<4y6)0 zlEcOd9dMcx@ZrqBwo@ut#0dBe%}bc=RkFrr`0UP2ziB@sI~;NuhikM3lPcr_L6wgH zJ^&jNu=$QMzCa~XIBm+gmSup6?)qj)V{>lQ(5nux)41#%k_;ZS|mt;@2PFR-jX4h`fZbm`N*ib`*x9TllmeBqQ zrzw3u>K*J%6d{pb*&rM;X`A8=ys_)Af;)(v+D~}d*@>0pzlBN4MSqNe-D$W(2B;y# z>zZa@03J}AF-2tlP+)%;dh#_q9)g^E1nZO=VTO-Iq``ES)NWV^}hk8an3a;A@GWe1W16mxuq>f&qCNy+Ig94koT08g&I zKld>^GwZ4E`SVwRZSj){JVrV1*LoTi9X;ZcvJNj)e`I|8;c~AnZ&N$DY@WDt7M{Y^ zZv$1n<%TP@bUBiYQ`ut$>OMT9oiAburQb=_InN;_I^HmI(k z!0g9&B}3qDPSzuk;EA!r!^8JB(CR%zU*di#9z+@~tzJfTh5ASV8j-|y;U zVx!GS8NN+}k;wVT5z&io^zSd?W-F72BuV1!?rhZI*{Ym;JbI7boQBeB^+<>JuV23o z)@VvCl4I7qzjNv7`?XW{rl$^eKkY1^UFUg3*+?2oos$o36h`u)A1^%^uXx>X++?*$ zb5eDxhH2j60s2(^8@$nN9Pd3Dm$UaCOKj9?&828(45BN-Fn5W_(r|x~L{bLoc$a36 z@Oa4Ev82S|$uJ`(^6GVEvG9{h^*L?*jVGJu)0B(28~ta7%6MkNHZaLcbjHpSw}rC6 zrVEyR+9^I$Jz*zLgxe+_#-DP@p!vkofF|V7bkTtEu zm}o$oH6oKKY)C(NqHH@gzJIYp4cOC~NWm?rI(Qq-ojv>W^W6ts;s?eF1xSMJ`cj`g z6fMa9^~X+HxqyLp?{=Jc(}ppgEroHT{QQs-VR;9flN3s~H3tR63JhTAd(B^qSQa&a z8Mtw#EDDvb51FU^nyX`*Cpq;i0zLbI*l2}k^LYfJ0PV95bVFp}-MYPX9kJ0|?YcKF z0;{6jIi&9?^h(fVM9z+)J=}e5Yn>-@L!K3d$TlcR@_(u!&nX>2EV0ZgKlpV0dUJvq$qsskgf_Wa`PzJ!j*RnIy}=kXW03)O zjl(PFcOKU#X+8S-dG99}7!G%vi-FO{e7bWf;nL zD9IhpaCrd3c6EzlOK2}dX2A0sic0l${^E6N|d?8WPNM?fdo>hk?>A8MEc%9vzk z^)Q^bq8uOa6%iACiQ?%Y8^z{(Gx-0El#k=F-7UAVz!A8%9pvBqU#zjitigl*Ii?xg3)tm z#X`A9pnYO#DvXlD7MbF~*^9U}8wWfU^;DcToI~nHM*J0v&F$UODBk@vO?nZ)0-_TidChlHuMrXImtSo_j z4(*9C>bi9sE#E1#^N%uB4$a)NgGD>4=H|LtTX(D=ioery-TE960tQ4jd7jVqLsCtLhV48jHI{DE@3X3MQa%H`q zq@|inUZt0q5v<8@gJ;*I%*;6+uVc+}Zw_^(V%-VQnusq@lD9= zE#GDPYBkt#@13sR#pQvcWi{El9?lBd1qFqyq&Yc1T0ok;2Q*}PmwZ^^tY=xa2cwVH z3f;_e1S#pqjeEYHsW_s4@k7HmVftPo_Q)eG^1b6TXloP?Bd@p5yGzCNlVo8+*jeY! zcUF&Qm6cym{EUlIG1#|)*VWnHhp`>EL&(5DIVm<3STLK-Z9wCsFI;_ss@8hINj>rpIQ0{ zC`$MAz|+(Gd*p99$f6O+Kl5Ypm|jNd(t9<%{XMGJA`3iPD_~{<02-Oykf%pXC{Q1* z?0$jZxY3T9lUv40cgiUuAkJ9}&V&~k1|0gb0i`$JKWW`${@~)_nUBRctfXXKrP-V= zn3ij-+W`>V_B7+Cx`e~TT@cI2q4D&t)-}R!b|y@p6hTmwQ7hll`_Y@1B|})Fsx7Nm zJrr#eb}RwdAK6}M%F&HHji)Vl8coI>HuWpX+BiocB9tS+_DO)&X*7S!Xt`@!6McuX zaebD1(xyovmhjzA^eDq9uS}^HxW#6zC8fGHH@pp2zgN9wg@Yf#ti@3>2`JDqq4tq> z{hrF{@}W8Wd{JNG8*7)rma;s4uWxs>f9t&`o;E%_i;N}5EH3oxFGL9?N&E-*mQ=d? zcrx_|MclSU6O@^t^dHmelN^%_?(;V2eRVv_cz?HT{BDPC;k@e_cA6jPA2#nlEl=xX zkDkoKaLASzO)pJ;_6VOWxfXgv(4nc)o%<&BF8_2-h{{)-)dw$ejCdX$UTLo5yEs%d z{EbSOvLnw}dRbhAF?i45i^Lts=(4cprMXtWM;ipsHN{$w0RS|In=ybO<4@NzcNNh| zb8G2xb`e@HfNRVYrpg@J)OoLzD@xZqj*@$ zQap7;Zze*eJwE8<Sz}#KBP+ifj_{|*qCLd6fJi2)hNlF24*T68mT*_hyYQE>oSxL_zy$jyQb**?VG)s z&*g2Luf6?3B=`ds719(|hHq6D|9DJIvYl4Ph}r&3^)j3R7E1L;O|QBECSu$easoo8 z)ou^!TZeo%M1Wgq7g z8t(XK;h|EDQtNOCtX!@j-IW&e2O!O{PhSh{rTxXc9F~4Oh4J^!VMO5S1v)U0Y2oem zJRPla=#g7?!A&|Q6-_bS9`CM*FN>r#rKsLhLp~)s?(bX9J&O!E@Uig*3B}6lMCQXg6v}rH)T{uXzb6AJ z(Ldx_q7`P`8WR?}Zu!cM?^N_eU+A>zq^J^W@9WoBeznzm^X}ZlBYVAA4kg-}^S~dOz*qmhtwc6(DmScJ5-5FF%5_i@hkp{k0RTd-`1wwecPQiriR?um+K^T z?!uC`5P~%O_^EQ>9x+u0=yLDLm}P3T&-lk0iZt1`ZKDw$PRg4G=F+?nS>91>2jw>P zQmei|ZKP>%k@GfJy4zGtxBh@qldJj38oYW{il@Hw=vIYp-B?lcO(QgR?V?E}TbcA= z1GXwVm=`u=TC!{>w$wol)Uf?)H!0dvXnHX?oOP}Fiq_Y)oc=q>S(+Y(9S*1~awE$w zhm$xrzxHn1HUBtl_-Ma+(d6K5j`{vWj%^xVlNMrec^~bEsM8dg`A=^798)^Ox5K2b z#{J?o~O4XL@dm_5yqYpNo#i$lm zS4tC6-<~AggbA_#X>K)SU0taxOXsC`%A66>AjYk&W)DWMjjV4cnuVHGE*Xz`vCrjI z>%R}pC!#in86L6PpZC7v#f$!4>&-P;<6pkmA-8Thc>&LN8&wEPh7Z1}rKWA4b~7N* z1oH>gS-Z;Piybga!;eYRLdm}2y9g&DY?@*@&tmaJX!f4uEl8U=jz&C(oc;uGikt?W zXCA}BH*WB*bzoeF-A+b)^Cpm~e|V&&^@^sRzj!2$%BCE*DOIB_v0<~VC{%skew>)% zV<%OYBNM8M?Cu}jervj3JAIn0f>GN_Q$lCM?SegVQKlWhs4UNf`uXMVj|SP3W^Rs8 z8#PSyy=g_dc@2lv9Nofg{mP3V`*aVcBWrddh=fJ zdHIvnk?lVh-9e@&)6b8!r`dBc?aXa%^9c{2x=6)KdSfl=#}$*sKnOK_MZBEJKF*R_ zZ~+{1)if2DoG26)6GPg{EzFP6Ke`x%6)p%Qe4rfm{PK3Ygt`Rha%4+gUC8^H<}MIy zfO(U4KSkWa)>HD>UZ}VSiS7sLZ9#DHL|l=xv}@u^8+~K(iYi*!;nsJnUE9C);R>n!OkO1h{{7K3EqTAWBKZpX=9rh(qko8aVDKC4xO6F0 z^C-F2_S!(M&*gxVI0EP>)pR1%R8+DRx~W(AFLG>eqn4c_%r2h1){V#kUAeH4nPX{w zqSIc>#+Xib1Ihkn4W$vq6ufe+wtd-`g(WZfS-;9JUfFAuHl3;{$~~nj^g4)3+e3^K zTiM#-#+;=KR~!Hq8xho?sW23!s0xK%+PRnKZ8F zPZwi%MF_f-(KJX1%YHRX&qHdkCy(-Dm>dnkeb+|X2g{zB{c__%>7o3vi%VbUPx&=+Krp}~M*HWM&zJorsClU4$>+n@fA{PSJ1Jf`Z4;2e8)o<|?0JaL zk?a@a7o!hR?T@&tC236lG@PV(;sRxvCt1oDxX^=~>+k0kJS-c2=^<76 zCAn)1F7IaetjX*qrl(`-bUqKQ0Ot&Kb&%!0eS8>oGkRZ>1+!9w(4?xekD}1>5&rUO z{o&Ya)?MclCrd0;xIF z1193s#L&E_ge}+0JF73u&dNyXFAZB{&-7@a$6EF4PA<~D&Q)oA{~4bc>6b|3At^bj z!h^b^)sc2!I{Ra$ZTq%-76?1O4kMGNV5IdQ)M$_~*lys*S6*Ab!3Z}?Ykguhkw}e9 z^sZZs{QRen9;K+NlYvVxYyyhumB4G#oMe$eC0y@He<<_RH4`I?tvA0lyY%y0G9YPA zZCXj&wTt`DGP2r}cC}@t$*pj9dt0QD??vKg`~~V^rXNrKo(Z~o8Jtk=F5k0o_gUqb zV){IHy5?B?;Vn7SEH{XPx8-vk#h5m4j#-z1e+nUdKD5oMo9fx3*Nq&Fm`gVL>bkTs z+ukVq$%iJ*Mm~N1teifbQ<6(2l148vY3kzOoq`0L?s|XrT4{noigx)SYJhHj#C=&U z#xqeIvC5&Pnc3xThAwkd0%Zt^N+i$O!a-5=8i{4fO?Q5vTmE9EEnNlWz)7?tR z+}J0{Is=#S$i$FGV9EJ$+9z!JDVBdu>EDevcF4N(H@39U+I%9i9I(0WE$<6XBdDbv9n7 z7916?)yoQl7MWzXl(-ESI3I9P!Cm@gR=8JDP36^giXV!IGvfL~I)yKq{D)Wk#k6n! zJO(jP#>OcUb3pCDre3>m=eWhjcsN^=kO%Iw>!^lSd#;l-z~kRfuT=#u!{|xng{R2% zhXdEh0OV=e3y4^uhBw(I)&qWYmjR{}w%j{zC0=|xeJvnnM^;@QR-(Ymtf6tZW3Kx$ z@xi?iKq4XI;uNLT@vN-OAI^SgsJ=oo8L0oVyPK)zQO0#SPNISauR-(g_wS_wrnh_M z9-LeV9gA|&;~^bI*Mp8+QuJCgK82l~oj%Q>R3TFTS*@{;f$RGEbUez%V9t=^fSd7Z z#^~rDn3FE zsVOTXiCkL|@?vz~wvSvkAnl$=<02%IH`U=G|Bbk}Gw}%=gfXqFj*#RC5OGj^|4_Hy zSSB!V$4Y#lki?F{TbvWRX9&l;K}U%^a8|*8L%S4n6^#M}<`oxz?o)K#fLNYx%+LjI z;01tU1=K^cipIV_*=G#@>oH-emL8hjBX^AfLdNr`2yudXdW2M028IOmLdLtq&cI2B zfx#r&-}pi$ihI|Eo`cs_CNxw$!y{p!q1vK+mQ z<1hM!TVsmaHhA#}iN2i}y-#nIheH%%nP;JV4$llQ?#$AsY3!f{!(NxW)CP%wqn*AN7t5)%OF(&{>UZCOk(2u$np<@p zlo^BOn!usG0w40IE)U_ghM`2`%vj_HD-A1Uj7)$$^jh(^xSu?UBsP6#11Go?kq!sK zes*C&3Rt(BTS3OCv(U9UE3UKn{~#-B-bdPX3o}6K{i}^Q{qisUmtODhshvdA5pfY_ z_?+&XsJJ-RDtC>)_)ph8Rm(U3qCbV@pNd7M0nb`ro#0my+|H!=wy5QA@{=+XE4VHKz=P%!cwT^biJb?tx*rRAAUM4NX&CpEN?{}7ohnuCNx9qo`yd-`i5j^mzdnCy4%#3?_G$x7f0 zjLC5^5X0|<^8sP8H$4*cs_(}YA{{LwBQYIudetS(`!*6h(?z5#Lae+yQ8rBL3M#>O zkP^x2!c(dhC&sjh&4^=qI#~l_{@)1I4(uo?p}eeFXWta=jX8--!H*tlx7Igkm&Xev z$Nnv`=^=@|hZjB-*gCW^RfrHLKuFvM5}OSTn-DD2d`#>i;)=nz#$3fGO4(}1rJLf` z<^VHXw(YYsxX#Lb8qyBH{r~=>9j=atP9wZ+$3G4{NjByZD%xcTgn; zo(V4C75oVr@*Bi^s=0L<~t{(fES9Qn>(S6v28d{ zf|+{L6$u0PGF4lJ8I;xGMyP#9n#;(cY^e=Fo!gzr7Kw32N&VRF!kv9jnMWYO_{`ir@)UcV; zhxQGRgvTZ7X;wEqthGQY9sMt|iiXzKyU0IS6WDNPhUUVg60})^@$*o*FmrczcjJ%i z|D1p3L5MtF*F5B$^6h8ePyHpL@X`*g7Rw7W%8i*w`!jXw9;N!dv23ew2me&krRQ9b*3-NMBiT*4*drqhi@7pTKd`D02wRSt!+QylYjd2;H`(#7d{@_GPg%AFvul#qjbUE2k7kw|1`GRB16z~418ld<=LYx& z3Q)#W|1EJjrj7PNKD2osYb0ac=?74F(El#S8%XJ&FVee;Ry%tnFN6UL4;+i!T6_g| zK7RaI-(>+?U&^RJa!6u-Z1&L288Y1a>;b?NEHfOoKFLk5h!XKelgdknwp8eut>lwJjqkB$Qx zKXUdNWPSqk;fs>CWpYjmUcMZ|0f^4Bg69NFD;`w-pw8xQ1(7=nAf)sQG#z*G2H^@n zjcrOK0v9g)MB}2OrdAisEM%s`7rF$u)$zBFwj>wV=v!kO089>H#XljBL|h3JvG3D( zxr9-JF*pYOx@@iybkp*cA(^r}yoUmH77S(8C74PSh*I$89b@EIr2LISiM-KPU_yc1m7c7xnWRm0{9mNuZe;`g z+oOWT1{2!y&^iYv6D!*rs`m~RmuVgQdY974YtB(%zuw5sHq=*`u0y`n$`wuL9m{|m z4dHcf16QpRduJ&bKY)&p*>e1RS4GLj$CuKz^M^^YnUA)o=Zj?IQi`uPu-mWwn10~q z^yrrUWI3zj^UCXQ?oBslJD)ROk@59Qy7q^_5MBvX+39_IzQ{CGd4uM8d-G2c+eWbt~PcUnFD#>V#yMR#BY^H7su@WH<2V^6rM zZ4$o5aZ}%5`xW}@iRfq5cD1d4F^Bufo`$z-heIX$@ZtVDd&up65scyeAlk*7e2&`x zUOigMNV%3iv{$a0V|hot7UdJUH6-5J87suVK06|i^9f25%3y2_)OT(q4dDr|z$@%7 z9NQ==>;@~@;|$r+9CpoiN~#stXzrNI*}xjk`?RCtWMz~rjFH9vl6&POyC^UA=kkT# zPjsAFrE;QVXHUhScYKa&L;3gs2QL=_iY79J6K)k*F?ZDIiKzZJyQk-#qIT}o)dQAc zWIWqxz5;oS`U1E_^7uwZb7%KzC8zC0RDwB-p;$2*NqHk9!=@}`W$Iz4M#%3VdToma zvh19~eG)?M0;iy{?}8tI_3=T*t=m{bBN-_iDNsqNmx-NdIR*=5$DcTa$F{Uc%N13RVm#QR_ymwD=C~YD zT@vy`u$k&*e0xPz(A7z~mySQq)p~K{w$sCdF>_YyS)So@y+G@-ZvFOSsP**KS2`~( zDM>A;tV0K4Zax50cgnDd6ra^#~L=Z}*@E%7& z-gitsGp$dU1_h#8_$<(g{kCD?8U=e_w&dYI=9r)%Ai2UtMHzgp-YHP%ZODS51^M}q zj@$xOHifACV8D;tj=7vX`TqY#&t3SJo;wgs=gBt?(~v+vX1B;5ovPuRd-puUNvo%A zrA=+9&(1O1+7Q(h?8i&`u50yM=fb)sw`1o=5xd(3#-!SkBl{=m^d8+~*M6h3qm;(I zuZZ`uN7puxYg;l{Yn?QHnZEM&<7LQ}3B2?WO;aR~hW_T)94svLPw3?J`;L(;72KH~ zddC{_-qR}UCPAWrX;{Z@wdfzMl++1N=&7i*1snKjvi1;RP1`#OZf>;*+}tBdyHw{r zx$@7&J*pH}*Kb`^8QA@@?g3LY@qJ)TGF!R1pt1IrV2MK?D;_?4s5>}5IVmBYwhNUU z=(6xZxkAB678y>~P;Ia*`mdJEezB1#VS9ZQTvRId1|lkRoBx|;3%%^}7tO|$8~GQ_ z#;ose7$!KS8hYSwmaWY8KP+2)8n+;Q!WE{+!pHE6&X_Nrgy2&D#`fsD5(us{j`W~7 z-#;j+_qvSpfNOoEv{Q(i_R12$v<*c4!?cy~*K(qzbnZdUzAa^HgAR7ynOWwZ4?VH7 zN(>}~Y{{K8`um~ILhPcM-iIEvE5hl#})laRjYv0%oFJZ(GM{kL}Hin!Jy8(QBq*AvOE{j(UPgD z8Q6U5&h){jr)2IAhw{Zg|1w5*Fn{_C6QA%T;zB1{5%b{QK$_8zz+zl{D)7Y(Vn3THHJJ zCb<9|i47Gsxs3I?k>Ll{=(s)_~PX~l`Fn_mco{7sk%BbCK1A+stAQg!o#{e z_j3TA*QUy$YALp%mL%s(ThF4$n@%Y_^2D@Oq+HLNH>MjrePb+id)Hz=!-~)T@M&$@ zMHoCxxdeU29&Th^+ASv*S8sSIy4*j#HjMGgcm$T?klpGK8t7i*SbD6 zetzNn`I6gr#DdE{BA%EeTn5E|ZPm0k}M zVqD4|S%>eguC8VuIq$4}Pl)@JOVRY=SLNm6bapCs{qp$c4gb~T*ic1C9ol zg3WcIhHh?du+(4UgNUv02tda*^G$u;{lwm@_&QSUqG`tEk^}w)%c%3h>!6t+1o@j| zEr+Y!Xy3A*$V-Mh3&_+FY;5op7=uG%`t{wW?~(^fMSg5rm&w9>5V`Nb*vk)wwO2-T zESSrz7PTtkk46`TkdDc2_Y@GQS{b3)x4~LiFF3pCI+PJ`hc#5NcpI*GlpU}ZJGgN@ zmmxR&z_6&@1WczzAup97S_ovfCh5jhzUrx1xnUE_8T9x4IkeS`Lp48tGrWb{{!*IbqoYoL#?wv^DP2!us{iKV({S z2aZoZl~@B_%(`@L>mdETlCq-S=c7=@pv9|Wdk4S&_ETg^SJI&t?Ed%cDW4gmg%d+J{d2p-y0LSIWCNfs(bDa90dmYhU<72eHK)-8-wf+>27QJ3z( z(P5e_*st#v&qz_T?+>-5+eK_y2_;q*8?eNSIrv0o5=7ivb4$|g1ie)vJw_Ke{^q~w zEmI{Z@b$c9H z_LKTO-Ue^#T*~85E`U5zg*2LnZ4X6LQ#(z2HJhE$YoZph+>g%|ai`bs@}^7~FjZO3 zrm{b(^`!6Q)fs16 z@Mx;%2JxoR6tc)3=J~$mIO$f%0dQWP{d-<6xre;Fa{rt5C7Ow?oUGdo{vW>H1Dwmh ze;ZekEjxSfGE+t(BP$8fKt+*}GBPSOkWtwYlD(QnC}eLbvqF+tMlwrE`Jb2ie(&G? zd!GMu9QSeG$Gtv2pX++RU*kN_*ZI;iA|xf^&6cpIycxXDT&}LMk$f)EzPSf3+@A0# zV^hqnT#X>C@-<|?m0qZM&VF^YZa){PLhzIN{W23*RTvl;R(|eHB*46#USVpER%m$z zwQi(+WVTc0*9MrtDULxNjhq%W8Y?QXHV7W}iK}f$O)|}cDdCM|e@&Z)V|z~K6^R{~ z5HwcYN_W=g=%tXttY*Pn9mH?hDfn#}Ie?gzJ+Zc|3}Ma&jq+E?HiSY}iiB$eGkh%eG%L zdZ(?r^DOHLoim*olokgL89PS<{J*{wDL#nBY1Y4{ia5TA80&GIINvzL46*t4=iwAJ zZnFOjrka!3njsPQ{@`&RBkcX&c+CLQC<2IA`*b9#3Y9yt-p-uf5w=+z)rI!0vjifF z&202EpW9%p0V8X;=P=A2thvd$pQ>U11o^-86yO0NU?J7j)kgb(xc*vMXnPqttI8K^ z@*Rcn*5eg`#a2GgIdjNBY*0H>pS=$K${nS1Sx&#`*CG|`&}|J(&Al-a^@YFCUH4w! zPO6@<<6qiB5Tqv^3%`XK{4(0H_qg}|CGMecwcld+Li3xKA&bBM=+QLht@ez7T52u7 zAx8qe|86tvElRe47RC(R7Wy!_ml-tK_a4?-v61?3MvCEVG{gZuzrMaD7}?W@4pYUN zoF8w)<1G;V#2yD2|M!KeO|OFHS7L{6tL)kZQOl4c!v2uwsEr?=$+~|_Z3aLi{?DQw zN#G&6d3we^nw%8*%v1~SlUrS_jql(4!j3g<3?g2HVqYMu_A6|PSPdMI_p0e>bmy0c5QCjWf~Yz0rc3D@SB5;4V8_a77qxmwD*ju#Q65Ewc)`3 zCZ*)lPyxf1HuBMo18h>Twn#`&{xH73EIr0*jP><7U@=5PN5?9O+XUfd6N#J%CD=l2 zHu+FnyP-6J6ML4?+MmNB;_jOfZ|76~*I(k7+z=`DXU0wYCdc-crp?qTQWz|kK!Y;X zo?44}7wn=F78MEsKCwFgLOLoR6MUcoVsG+N0+9i*e+F%QeNbjZ7hKXoE+xUKUTk?Q z^&0;*qB)_Am9*bd_rMN-;d~$zGA&ZI|NOz-LVVq^k7lk$%q}k8dNg?qb$3yIek4;A zsp)liZh}#^S3!`0_h#mDJntr$PIAcE=z`|VnAvSv<~fbkK4-dfB8RfcB-eL(fXtgq zb>}vubs$D>#Nl!_b9KMfX|fmp`GXIkmBIR{g0H*4>^TFcck*5O0u~%VYH?9fjHyo4 zGB!S-a1>_8v|;7xw^GgDjb**QSOPtD_##~RxU%vx9zJ%aY(0D5QO@J;+>F;Qh(s&a z1@hVstC&VUl7P|$j)wxCo2aRyyKbHsjmz?v+xy{-U~u@=O_^97&1XXOXRuVT{oYN3 zY@hkj5TLX}4=WKYss~VvL2aR{r#Ax20eT7S7#FUK^KZ%s^#D|^?0bxynFTO*|~{ld06@Hsjz&0J|EY&z^tmdSzJ!e zr1<`(E)ZRS-ULO3VsIjf7O-&ler(x$S>V3ck)DU=81nf`G7YdN&L>Z9gQ%{)^}>4I z>!ahPgqJSXrZ=6IY4;#DVnx#1?@;=HX_a0W@9uCSf?Zk|cuyA6ZSO$NRigTE9!*Uq zoly4EmCL~6%X9xDFA6=62`+G6HV>{0EYZN6miB0n*g->G;`whqkkyLcvV{Zv${P@^ z9rLd9m8-wn(05?1*sR4YoWpfAZ*4hr7ImkIiE>@=|AFw^crbp%V4`|E2uH` z<=xZp8&cz?;s>&XdUVL*^G85h_awu0YSZrk*{xeYV>k_>_=UyA73_43V_?Uu5*s~z zl~*He+Vb>gOwEDDHI|b*iVjW*_Mxz93GtKphjie*SHnZ){u7~uU&NRo1m5GWux>qk zg$9rDQv+mADJ1lzpaxREV>}CFSVN3}+GNmc7WKna|MS62gS5N&d!@w57sKi2SVfD zdUj9GCusJ@1(=Q70X(=NBj|8B{sqjJ>V)pp}1^`Cgqm?JiMWIvQcB(bv zX1fP5K!mM`n58k|`P_8usec18WP~-U>-M5s0GwSvAI_;D1*Qrp131>8Vq)GkCZLo~ zfv+Wy2JcDAD23z>GaTJd+t~$e!3Y$$6gfNmZ(qGShOsH+HN3AjVvm$uyZ6NaGJ^A? z*sHTPKN`JLS#CCV#x@WTddh;c;3e$$Psi)$7X%kWXVmeI_I}obb%N$*ab* zeh^HoTf&b{LDK_RU4j7w=kJH5@8Ut||8O5KsP0-b2l9NnAKI@>70b7ejy&1O7|f2c z+9LPZu5TIC%2a;$?~_bkx7FO35e8qNKaeIq-85ins_sIZ7(cVzyHl99{sJ^s-jY^W zMWx@xMC=xkN_)-`i<&;;fRV@&y$1^Gd=*TwHYIGIf(JTC|0rntaOmWILZs%RsU8BW zm66>~)R_us#4e-T%^$+DCP}LJmd|U$4QWZ-cF%p5<%$Ib1X5Ixv|i2AYyAjv=T@hW z4f`_|&W&ddn10cG)`aKrR7!A)Cp-$Ef!La} zIcZ%B?ORm~E4+7=?P6jS-pJNxFj3r^c5iJZ&0lu036G4j?s3ep#;SEKnlmHz93p-2mwJM;vry9lQeqJ)F3PcQW0fN+RACX7h9&;05+ zcmbe`P8$>a1ThqZJH$3mrU4vnj>10ZY?&YF-QlI*b@Y(a!P9dWjsh6gPI_zo6W0Zc z=CM+iWGk}LsV_l<_o?R~zii_zaF{GbBmVTvyV#k`oN!WC))i@vuU86ceEEM* zz(x|KH`h?bY-At|jB%nkXiY($pG8H!qX4$9=Z*$Vwg7KW4@eP;2*$8gdk&m9>C?t( z;QwZq&9rC2>w_=(_9gJ^k4)?n!5i^g>JLYgMD&gSMo_B%q<4mF6@3TlH1JM*lh#|v~ve!OH>_;!i=x3pq< zOytrO1Y&t!GsjN#gPBJU`WI_?i=c)52!#LtSBa9xnk=qI$*&TVRtx1M-hIS`Oh*p+ zt(fm}NjGl1zyrq4p*EI#X;K%~UsJmL+Xo!0?g7Bd7s}R+( z*7P0Hf|%wpAxmaRRX6PZpFtoD5)Okn8TDc+K32F27o$X=>yYpxHU{e%>hiQl;Bds; z6ysmawpnRXe>MYSwl80PV}X>?^ez-(i0ZiKA0hl0E8KK7>G6hh8i#JpI^6Dh5Hh{; zI55qS!Tmk@_X>=&kMpugA1%FwvK|Gm#Qn#dGFH3oHF_SLH98CAi(=Cz)DSNK1Xz5D zngZxi1^QG1%3x%{{JRWII`ta_K5JYVp4K;)FNnDUOy zZLsbC(*#$qt~@6!S!iokN5>xp9eH~8Xifo?Yh!p^Q1Z53!Z-#-I#UXbGM?FfcN0Og zQk6`gR^1|nyg%9epYeQz2qSfyv6UFH-B~UMbzZff1TvJDtE>7MjGg2^iGD1&b@TtM zmOKd$Q4Dhyn32pCLdWA|HqoBy@9(dvr4^7Ep+Z;<&YH?;R2js}?U7@g>5eglvIs7y zqM{V=3~>iygC~z&0avA>qPtKqDTl27nz@V^D>vWk`sCT=Rn=8xOGrxSj~7hi9wO>( zUTV60WFLu+W-pBzZ_t6kQ?e^9%P7OOgdHeMB6a#1vK76*J^a3FBT6UCl#p6a*sob6 z^)WCp9Vl_Lg~0%9y8xCoAM~KJ1K#%*JcOuFIED{Wb#XMALxV#gxp|*DYU}8bMTKf8LLtENUw;x-5&K{xEuw2Hn-3~Su7F#>JC77gl=(-p=K-J*l>RJLLl*Cg+ z+_-=6Q6KcG-S-n?9S>iBEJz_R&Hq1tm_C>hB=;>AWN;rrUj%3uD=f^PpLZPz{}~mS zo9m4KR`?{^7}Rxq?39u4hf!z5B6eLv8Ipqjwzf9B{MuT+46n`lyA6@CCOP8V|BX*yBeeZxBZU#z_TU~`P80VBdK`fxd;ScqpmyRDCgjOyh zUCED6_2M8qb^(c((V!Q+q4B5WVun~q>#~@Kmlv@)#>p)CzAyAxm_c;Y&?mWSefsnk z-^6KDZHQZdFG}o%Xw<^;f# zpdof0=6QnUm75tDteu@#F^topJB}^F{HB|k3y!>ahrTNE!On}Rk$h+hDQXn|v|Cw# zYm4CVSFoKQU5Yd$by+eLbacdCTFBNVMKkD8DZ_L$*v1`OYzu5cY=jnfPdzIsLFxMi z!cn&bV^BEVz-MxH0^$5ov-W)=|3n= zM8ZP=7LlUTxPl0H{7L6WGmTXgqdYHV5xNm{UNryxc;UYv?~Vm-9nS59ei0+71!iNpmA?xL z3Zfo~6ZQmf@ew+S&}*>rV+a2{Wb^PUB0Qj)Yd(W2AY_CfaG9`3x8wuO2xr%|i)BO})hEjzd~E4(`g9qbNR+B= z&>}Km(8qUtc$gT8!6t4c@;}eH@#^2_jKB(8l7~*)3Dabv=YJ#-;e#j^i?5Ai4K!v8 zJ2rI%*6h`;(c-%ab+j^|DjWR*6zGJ}0HT9^I^yd;kAwYhk$0LfkBhK*uny(%BDVh$ zAB$3x_*l##qTIz2-8~~nEqtO;-|n-`8UE5pDJ%1ay;?>%smMC{(CloK3Bvr9@ck4K zWm04>{NlZ^HdV#@Ij-MGDwj6w>IrH*K#nUo~;hzE&#g~d<+#YbSUKE7QS zx6zMJPUi2sMD6?r%l6Q~y7{fc5l43hsLC!kbqYm4Jc{ID#AXMaT1c=v7=O}6sFjS{ z3d^8TT}QbY(h;I1R369%y(_J7t7bg^=ehg|Aj2C5KY!+8VG*{Vb@B3gYoXpTFu?Oe zzc@=CxFAfp2zu83W=M#*Me%14)>?v*^6eGS{)Rjbca(y1)&iy-2vq#D@a}nz#=_kC z8u8_WY5dpDiVq1obX$F1n8YLvw8W#Y$T7*h?zE2#kSzfUG{Xx<$+m^LSyw0&co(8- z4$cVuNjLKXV`f_r<`CirRh{lDoWQvPHI4FZ%O^o1T>0g3t-VDNz*xv3sXDvG$s`DsVy;nY4I;=`Av2-t=ZIP~LXk9k}`0m{hI#0V;<{%3Pg zk;UEw8`tR_iys5&`tH8ele<4QJBYWSnglF^fN&fk0un=@5Rykr7lE|6!P%U6T<#%% z9~b6pKS1)>dw&l=M)^uZ9$wz#&s>JEbEKK_UKKvV_$F?|^#(vfh&=XEQyN0?NQH>K z*iWWSsD-;sg79zDNAg)L5yf8v&oy_gd;xB|$;$fg0qIIoqjQ)h7+|3Yqn*|XHCzk*U$ zx$R3=cJWY$`JXNU}hk8q5!u&+}%|$T#y)>bpF>54^z`_ z)Gx%|?Lj0%jYw88Ba)-c@36oJSNa_^vQX5bgc!R^xpqnowEsM88p65i0~P2?b)MBwe|!8uKc+wY(Boe3?Ew# zN}_uo932(1FiTm&dO9{XHZeQ{=*9B@K zYQRpQ2H;O{u680tL1e5xul|{3>*02+Qbq5H@5u{BE<-OG1#=$KAv`Pzr)9~@^=n5# zz&GvBSs;Y*OYoK`cDzafFTYM)kVvNP%mZ+;-pmvpZNf)&`&E;w3t*ES9l9BeXju!3 zioVXx5$++0vBs!c%ivsy%StGqp=3pAy?c;wVMn^8zl1^a?^v0Tw~o7qSn-6SsN>x` zZxk&NmuClhWR;aUs3KzB_}2pO-$=qnpxl__?7hE1pbyg2-uqH_O>opuWo3q1rzx%A1Vo@3bS@LEdmWviU5GXA+b zdyJi&oNOM@;Y#AKMLnAA6h~c$ZE=d{KHf}>O?Y^`k|#|g;XLa2y-Xk2giHc3?#6Vq zsjW?VgW9vb3^%^YiO2 zBp$0WlFzTgHmu*UAzsT8Ka_vnV-_Wxhv*kN^t`lCV1keR0p*TrJRimIu35@invcJ8 z?*DnaH;GxSWdAO~ty^2`>-QAjUxD%uAoHI-G+}qgcBdW}^e$<07~l!^-}hWVU=O_F z;rXZ3H%x?ijz}k*Eiz$NZtj;JeR#!jmp0(1TM~020U_l$?QRSdJ)Hgm&!*z-N2>(J zhA=2&s**tA{muT!v$C=mwb>_Qi~TSGlYi*zi&KT9(}S(y>@hxMAP&N*KB8)UZa16Fi`KX9`$KbPe2a5-4*QKhF{O9(&62P%yT}) zSyxv#IESiJ372)AOo%Y1DXHiT!2XyLv5mpQ$HC0&bbFv_W;8pFLZn3QA?%2wBM}h{ zRyIqR1|LD%t(ixD;P$4)i{L(k@ms|`_V(lWMvt>ksw-kXM=1e$-)I@5GPbv^nb%Ok z?^c*11oq2aU=|d+%Ij^n{?LKntCwXdLhKvPnlMux(P);c(TWXxc%-4T=gIckIQvUY zhRtH$Hg}p11}FPcO1|Mp6BC|_mp;|-5Yz$XcVYUe(DI`?Wh z@m$-l#HA+-O34eqmN1-hDt+dIbN@4jLrahb|Hk+E{5-rBAQ#NcghDg2v!TCK*s^6W z$EeTxh=vOnF7R{1pO$fFcHYa@1dzjLyJOE zQj%M!mYUzr9J|&#Dskoy7%c_Wgwrl5(*+5VFDZvvkIc+qIen|P?G^QVzS0^R8h$r! zP(L0suNbooqQ7zSw~PvObcptQ1rzr-K>80K_`#{EEk0p4Lu-e|3Gaw2R4^cDsH@xk z2~l7BEF-~v0SLhT!~V$8jf05b8`iI{sjW@*!D?yVnau6|Q;J++T=?g}m#9z)D|c;M zEcaXlSlg(5F3_-A_yRrz&w=2|2?yHH!P`gho3NVBA!4DqYAzYGudqs4SQHGZ9g+dc zPiRM;J*)b`DrKp7w*MKzgggc+Aw5Q_2Mx4@hzkyw18cC60zQ9s^1LwSk~`v}=!So0 z+ksaOyJ~69m?2!)z)IP+Ck(K{fRBiPLSBo`7!Wd}VC-0SZ~>ZxO6-=lVltbLAVzF~ z6XNwe?YY237nB}}JuTHsIPE-GZ)Sky1IBg?!fCeE0~moKMLvN)M?Dcb^kLBw9(x(U-=#k4HZ+DL(~;ev}XroH}&`+?>= zLt^W1>ICr5ah0oT$VKt`l^XR?xMlNu811Csk#FnlWSpj{bA~8X_eF{ys#XNGQ=3_b zjx`Rsj1C@alyw?Z!%OO`^r1OacWrXx)%VEKcvdd^Xg6)L`{e5by7et8C{#6i{($E^ zJv@G$-{jy@IErd_U|@g%^eg!2f@(WhdV71JN4Oar4Bx#8n7Si3m_xsfG7s%L;Aegr z85s!)2_>avj5_{%05*pE``4nf=*^)41vc^e!DddDAVajozd#Bg?^nP2DTEbT6)0Fc z?`VvYc|B|0tM97H`P~mMsQ>+Y9Ez4#c#nzURcPsuy6IV2KYse80FoV8JJ3+HVL|)G z6nU#q9JwU+=J4?aA8|6}Mi=9o=pTDSx8suL1;4LC!ovK?>ic>wTnwRGx~oY%ne&4V zXhp5k<)AXLoc>9Jn|U0YOHmwSi?+qjvdg9Q$eBDX#LPQ33knvViNioJ;6m_G#)J~6f5VXBdI5b z6BIJ8qQl zSNawP;PnaRPF#Jz{Lfp2I`mArd{jaLRj=k=Nm@76o#;nJE5u=ZkNEG&gA4B?|LpAq zt5WVxx6vk?z@|m~HLRRK$cT=KxfUK05&~WipSaU~Jc94yQPhf=FKP-5_U&tS*Vb-8 zkU}URCK-!v>{YlG8w-y3FPKVLWb73yrW?$;g1G z;!R~9YlIM_sY~By`IqBB&M`8s|5PWUOZctoc4KllUr9&}5Bu-}@-lGKi8swz*pX6- zAO+bHU(~Hz0kqToB?m5UBPM|rRdWW=if3+VtjJ}mW{GAMQFmfy!Yc^tTRFJFF(%ZT z`_s7sK%AIQ&ojQzPT~Qt&Cu()HIP5l;NU5HOxC^nX$sQeKHlz4iSIvu?uU+sV`!X` zK%kHv@wZ*>p8Djf$n{F+iuc{KkqgRwy9(e;gJ}$~WX_npgjFqs0kop`@D`z-1U0`k zXF(a_-CK2a2>mZ&w!8&Q3~{{{$joId0X*ee%AfHPD-NL=gySU6(zWA}MF398L)0;> zkGpv@G!(fljIUt5E<-FW_Te1hPr7^e*9VT#QwUmOH!q$TBdCeFX1qY`<2;cKzozS@ zu-IIJfflkyFp%K&JYvCj5ZtyE`|X2x?L06nMdk<-?7YFyNWnY?lcIh`XV7%)eaNN5 z;-Rf^ZPl3Pke+(?3pA?R&-VAcd`bJ@T9{jImn7oN#x}&ANQ)=N7X}UOEnL5CbCp*< z+y;=~jFXf5{I{MJSNQUwpPpd4f`RePeZA1J>gu~LUIRV?>wux_ik_c)(AhtEqQpg~ zlkI{}O(>TV6s&D(65FwZH4;EH3ic5|cz*h7tvF;~HiuvVC)Lm%%&OKtMCHMFfvL{h zwVh{PE79F`(jyN3&Wx1U`A}UK6&+1x{5UZ&v1w2W#}GDKWiExhBE{Dn3Q{CcH`Pm_ z`?~FuC}X|eo$j>%MgBuNcNqv#P8R;EbnwY|t26Bz)cf6mjA3~Hy2D}K#hd*XumVH; zXlWtefOmixBPA)qwT!0vqVhu*beD13XCe<`c=ZGaIenJSm#@~sVzuRlPl;@(GJ0m@ z`T%)56dB;-MJPUKo?Jp;La{#6lkXq@Q=A>iwQDo;$187)IEH*Ukk~)rAWKUdWg$3X zb02)|?Qq-@{p!)|qH$^7!J16<#iMl3leg+_7`Pr%0^*AjOz7^5^W2sX5-EhTQ5K>$ zSpXu`WT{9qN?!2^KCveNPuQ`Fa$-NZ#>bmmni{xpg`tEJ3U<3@t4HioN^lwl78H3NN9(_7cB?Lor=wVV=) z8Au7804W%K@<3jy`hj(g-DWk2IXF4vSBUK_yJa)T{pzNy^kuZ?XL*Eo?b;XV?SVHf0(B!*$uJW02erH7D)`Is(Rf{(NDse%pmaL?-K|Q0b08IcJ5K zl2A@3@Dz&%7}2})J2w5f2F#>chIj9en~}Q|W7_?Js#eg(w-~ix!ci*2#oM-YAkCA6 zMOr!++I@$B1>>P*rl8tLO^4qZTh5ndSPXgqno$zwmy$AU>Ue~@wW$Xofz-Gaq{>yH zbzNvu9p4qBGW8-0J!W_ItSXL^x{uc~3a3cU=*Kag^%J4h$lZgb$&ry)9dylsZi0~7 z+T?u~M!&ha(k1)gMZ7i56P!w0Ybykk4UGh!PydMccV*(i3R75iNU@W}?ZKgn^0WAV zxaZ|ai;AueTwU1?dV9gv;|ZinAe&968}LUh{PI$6DI`h7fYcQs3EKv^1nlIhA9!g z9U5QiCjz6QqWBEOHtqDIKiiXc^`X|QDL#)ll%T>-Tr@N?>Cy5?0GC3yp~uCg=u%Zv zvwnSG%+8%Vk=u^8N50L>&K5L=sEbCwW?S>=#lcv&W8@0Zyg4I(=ljdFV#J@w4f^k} z0lT3*Y$09=%Uxhv(vzc&6a_h8Eh(s(y*$!r5ZZ1kq{zY)Sl zjS|!*s0O4^Pbl3g-utIQS?EHewz%lN<35A4^9-WRw(6#)Cf-ZmhstyIgMG32cPP5J25{>WRP7x%z28vMF8Wa`fZDX~wl1RF-kD_t{%lRW;y-NN;xO9N4UK z$anuy#Cm`K4I)?_kCcsGsGj-zBA!-HU*9Pkn|56YGRn(;5jdiFea9}9%fsmI#9k)5 zlR4jBJC*;uW{fg@N=Db#sJ%TZDe0`8U3On;K1x8;Nf)InvQ_|Xw)VHxV4@Wrn^5TY z@87X0a4!m~L}``FgfMD^t6TM2Zfv%IlYFIEU*R{ayO?^hPETer#rkV;etz{AbBwAx z6|eA)JdowP^>KgcF!kD3*!Z8vg%_BBvb&(;xjg_STmq)W#YG^g6e1{16T&?%(KJnc z1_rZNP-efbgPU7H2D471&(Lxg*6UG?S=rdwAY{OKS+1gZBfh29ho=u>@kI&Ohx=h5 zWt_~F&7VH*d4A!EJIz_Mlq^8sLefV%mF{l=5s`WA8X27%LIRZWV^dQPR$EL9Y?`Hg zuDB7e;d{+HVKlSr{yljsgFc!&nza{(A!WMyT(%k>8T?Zhck-{|Q%?CtHn zV(&mIF*P*AFJ99jd;I)w(p;FytdK=w4hiMc5etiVy}i&PJlP{WIzcF9J1nnsLL7`3 zxBI-iloH@uTI^d+XXHEj?E29Xw`+G(spDdz6;#!y;k!gK_U=zB(flHPk^PGY5n|@9 zJ>845v*F+SyR5fwA3VL4IA7iXh~okHoDxO+CN`NX1_}T?+-q4(%muIBh+KjSI^O%+tt$-%(rC=9ojnN|VA0(3w&d%YV zBeWx~SF2!%Kpa<+z0x)Jz{JBIAbmi>BZ-aNuzi0EMIoewQ0)OdVG%k;-c~)+)X=bz z4Cc!65aW@il45Z9k!1-=DE~Qz+mze3ZG#P;m)8=IXN^nafw2A^9UavwCKhOMtO9(T z#3O<`$HO5^(t$YV-`|41BpcXe+;*42Dp*7jqW_E)04Y{{fLLk|=IyK#bx>4)n>Xio{uhp#Q^E&M-kCDjQXVR zneF)E!BtKYVyK#=ph-vUqZGk-MlGsu>tX1Z?kg;+3hI*P-)T4InESRSZpxt0u|xQX zHqYf$yX1pkO=cWwB{zDCuJt}(b;z?AgpMh|i>ZmGq@J|4`aW7>iP0}Xl)J7}MoysZ zreM2NV{^@=5-vDa7x9DkTxTx1^h;TMW2U&-{cb!tnY#%I=E!fT+o;nTP`L$&(Owcc zJPJKAj@7k&*0eUgAf*nY(;G9%t$hs{^HD!BV;50KI{3W~={Yf2R2R#X!@If8>vIo( zu$Q##zO#Gozek-XA13I}EB$01H#bsE@}4ae9zF7|N~X|8<)bh5^E9hjcU3t`)(JH! z*)GB32XVKaAEKYRJIq)0rm46+s?feeBSK9C+49Onq_^*3$`+U0lXq_Jui3no#c0LO z-0qg(1cGwxN+BgX3+GE}Au+%*2JJ6i+*ov80lkZoE0RKvOjQtN+x)^pIxh}kq@7@G zH1p7SAhLqVl!uYvum{K-V2^VRT(gmN_uk^RV(-KiR{J*(d!ddc4S9=;KBNzk^8Ocb z2?=NW3MrphiKEqptGkL8nRbw)0RodLiT=pYP~-vbYG|iHd5MI?);f$E^3sL1x< zZ#ajmZ`WIAhKa{!U&Hk@#UM8PSj`ygHpl^xVbo&M`O_L%WY=CrQXM=Ix?OWU)M{c) zyiE2hYyFUC<4>I53i9o{VVd#p3OtaT3U_#t3LnOpSg0`jyBD zw5M!st#3e)X_6cL>tLuzp zOARBEl6aVz!6xiN;F%ziun&eup@6-yu(}Fgj{xNfVQ_V#UFfEIloJ?oxShDh^o}3t zj=$L|Nx$c;LbkXbV(J#c&cHH#~Qc_aBxY*bo zn7k`>xWfGqDvXppF{F~urG$h6RCkgC{7mbe;&XFvN+h=J2KG<&h>S$f{;!mszL}WC z0fXvfN(~mE0#;iNqd>!eM_v5+O){&QNkm`AX1PbETo$LDbGzeW^6H9?Nx(uXf*I3u z#2dG4t@b3KHWr5u%b$L8vtPlVhgsaj22aaROcZ%VMp=E>Ls4zWbat1)Nm^ie0-I`v zx`C%lvfE^Wzy^5#s;Q|;zCR1ds*$2)Z0pOH@o&$iAI8HVHFhu}97W>>u)ZOy*($u9 z4QsULDSBblYl}H(11jF9d#jHd zpxZ%20*9M)>kPwPd)Yq^2eLourqI4fb+UQ$gN|^(&5L_ZtU5Cz`ZDdlR zTcZv7XQExBNPoGtE;;u=oZ7_o|1%|sf(72r`PvVW=zawSyp$uuYStgs`V!~;+fKVk z;Ul2^#Zk#gG9qY2Row3H>0x^#e`)1>np6Pf*kC2AQU>|KT8KQ!d5b0Y^il@HwRhE^NwP?6m zzTx$27S^Dzrn$%Ns=oF_?K3V$y3xYb(^F(57e!zS0UOq3e=Lj?E7~dW$-~cPY*g@Z zU5+;Y+^-q@cQF;$ebK6cgluq}W1-CY#GwI#D98tgcS$1 z977s*@6A(E7NZ~=@Ia9%5+~Xt-4}F#lX;rriJL)s6w&heQtmu;w8Dp-qoK~D2I&(K zvnNL-!pt-(^im|zwA4GV{PI9`%Z-0Y^n*PF;Xl!v!@Bt8{ZF_Tb~XVe1wdz*MNC6t zQe(n$*VTzojAsmBOuEze*22(AL%HE<#K8S1f%0ATLq6+?M#OKeVy642wC~t_>BmGi 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�TEG#sJJB+2h~7;AcDFd`Q~c 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%0A=aD*%9>w7XjrsqzZw-+2##) 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 z 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/Q2SlAetc5a0abxJGf?L&QH2{_H%ZlbQB2z}3P+ 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 FindAppointmentCommand + AddPatientCommand -[hidden]-> HelpCommand + AddPrescriptionCommand -[hidden]-> ListAppointmentCommand + DeleteAppointmentCommand -[hidden]-> ListPatientCommand + DeletePatientCommand -[hidden]-> MarkApppointmentCommand + EditPatientCommand -[hidden]-> SortAppointmentCommand + EditPatientHistoryCommand -[hidden]-> StoreMedHistoryCommand + ExitCommand -[hidden]-> UnmarkAppointmentCommand +} + +@enduml \ No newline at end of file diff --git a/docs/team/jyukuan.md b/docs/team/jyukuan.md index 827944b659..4dc57566fb 100644 --- a/docs/team/jyukuan.md +++ b/docs/team/jyukuan.md @@ -2,9 +2,13 @@ ## Overview -**ClinicEase** is a CLI-based clinic management application that enables users to handle patient records, medical histories, and appointments quickly and effectively. It provides commands for adding, editing, and viewing patient details, as well as storing and updating their medical histories. This project streamlines a clinic’s administrative tasks in a single, user-friendly CLI system. +**ClinicEase** is a CLI-based clinic management application that enables users to handle patient records, medical +histories, and appointments quickly and effectively. It provides commands for adding, editing, and viewing patient +details, as well as storing and updating their medical histories. This project streamlines a clinic’s administrative +tasks in a single, user-friendly CLI system. -I have been primarily involved in designing and implementing the **patient’s history** functionality to ensure users can store, view, and edit patients’ medical histories with robust validation and persistence. +I have been primarily involved in designing and implementing the **patient’s history** functionality to ensure users can +store, view, and edit patients’ medical histories with robust validation and persistence. --- @@ -12,7 +16,8 @@ I have been primarily involved in designing and implementing the **patient’s h ### 1. Code Contributed -- **Code Dashboard Link**: [Click here to see my code contribution]() +- **Code Dashboard Link + **: [Click here to see my code contribution]() ### 2. Enhancements Implemented @@ -22,64 +27,80 @@ I have been primarily involved in designing and implementing the **patient’s h - Accepts multiple comma-separated entries for one command (e.g., `h/Diabetes, Hypertension`). - Performs checks to ensure the patient exists, preventing invalid input from updating records. - **`view-history`**: - - Supports viewing a patient’s medical history by either NRIC (e.g., `view-history ic/S1234567A`) or by name (e.g., `view-history John Doe`). + - Supports viewing a patient’s medical history by either NRIC (e.g., `view-history ic/S1234567A`) or by name ( + e.g., `view-history John Doe`). - Displays all stored entries for the patient(s) found. - **`edit-history`**: - Enables replacing the first occurrence of a specified old history entry with a new one. - Uses `equalsIgnoreCase()` matching, providing leniency in text formatting. 2. **Parser Integration** - - Implemented specialized parsing logic (`parseStoreHistory`, `parseViewHistory`, `parseEditHistory`) to handle the format for new commands. + - Implemented specialized parsing logic (`parseStoreHistory`, `parseViewHistory`, `parseEditHistory`) to handle the + format for new commands. - Ensured error messages (e.g., `InvalidInputFormatException`) provide clarity when commands are malformed. -3. **Persistence and Data Integrity** - - Extended the `ManagementSystem` to: - - Validate whether the patient exists (`findPatientByNric`) before appending new history entries. - - Addressed potential duplication of medical history entries by checking for existing strings before adding them. - -4. **Exception Handling** +3. **Exception Handling** - Enhanced user feedback for invalid commands or missing parameters. - Threw `UnloadedStorageException` if data writing fails, allowing the system to safely abort the operation. +4. **Java Doc** + - Provided code reviews on pull requests that impacted the data structures for storing patient details and medical + histories. + - Authored detailed JavaDoc for classes and methods dealing with patient history (`store-history`, `view-history`, + `edit-history` commands, and related `ManagementSystem` methods). This documentation highlights parameters, return + values, and exceptions, making the code easier to read and maintain. + - Helped maintain consistent Java coding conventions (e.g., method naming, usage of final variables) throughout the + codebase. + 5. **Contributions to Team-Based Tasks** - - Participated in **team discussions** to decide on the command naming patterns (`store-history` vs. `add-history`) and the approach to handle multiple comma-separated entries. + - Participated in **team discussions** to decide on the command naming patterns (`store-history` vs. `add-history`) + and the approach to handle multiple comma-separated entries. - Ensured consistent **exception messages** across the project for invalid data entries. - Reviewed and tested merges from teammates, particularly those that affected `ManagementSystem` or `Parser`. 6. **Review / Mentoring Contributions** - Provided code reviews on pull requests that impacted the data structures storing patient details. - - Helped maintain consistent Java coding conventions (e.g., method naming, usage of final variables) throughout the codebase. - -7. **Contributions Beyond the Project Team** + - Helped maintain consistent Java coding conventions (e.g., method naming, usage of final variables) throughout the + codebase. - - Shared insights on how to structure sequence diagrams in PlantUML to illustrate commands and interactions effectively. - - -### 3. Contributions to the User Guide (UG) +### 3. Contributions to the User Guide (UG) - **Sections**: - [Adding Medical History: `store-history`](#) - [Viewing Medical History: `view-history`](#) - [Editing Medical History: `edit-history`](#) - I wrote the instructions, formats, and examples for these commands. I also included **tips** about commas for multiple entries and clarifications on the usage of NRIC vs. name. + I wrote the instructions, formats, and examples for these commands. I also included **tips** about commas for multiple + entries and clarifications on the usage of NRIC vs. name. ### 4. Contributions to the Developer Guide (DG) 1. **Testing Patient Management Features** - Authored the guidelines and scenarios on how to manually test and validate patient-related operations. - - Added use cases and step-by-step instructions to ensure testers can verify correctness for storing, viewing, and editing patient history. + - Added use cases and step-by-step instructions to ensure testers can verify correctness for storing, viewing, and + editing patient history. 2. **Storing Medical History Feature** - - Wrote the detailed explanation of how `store-history`, `view-history`, and `edit-history` commands work internally. - - Added or updated sequence diagrams in PlantUML to illustrate the flow of data and command execution for medical history. + - Wrote the detailed explanation of how `store-history`, `view-history`, and `edit-history` commands work + internally. + - Added or updated sequence diagrams in PlantUML to illustrate the flow of data and command execution for medical + history. 3. **UML Diagrams** - - Created the **Sequence Diagrams** for the `store-history` feature, demonstrating how the command interacts with `Parser`, `ManagementSystem`, and `Storage`. - - Ensured diagrams accurately reflect the final implementation (parameter extraction, validation steps, and file-saving routines). - + - Created the **Sequence Diagrams** for the `store-history` feature, demonstrating how the command interacts with + `Parser`, `ManagementSystem`, and `Storage`. + - Ensured diagrams accurately reflect the final implementation (parameter extraction, validation steps, and + file-saving routines). + - Created the **Class Diagrams** for Command Component. + - Ensured diagrams accurately reflect the final implementation. + +### 5. Contributions to Team-Based Tasks + +- Participated in **team discussions** to decide on command naming patterns (`store-history` vs. `add-history`) and the approach to handle multiple comma-separated entries. +- Ensured consistent **exception messages** across the project for invalid data entries. +- Reviewed and tested merges from teammates, particularly those that affected `ManagementSystem` or `Parser`. --- diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java index 44ab3bf221..ff53680ed9 100644 --- a/src/main/java/command/EditPatientCommand.java +++ b/src/main/java/command/EditPatientCommand.java @@ -19,6 +19,16 @@ public EditPatientCommand(String[] details) { this.details = details; } + /** + * Executes the edit-patient command by validating the new date of birth (if present), + * and then delegating to {@code manager.editPatient(...)} with the appropriate parameters. + * + * @param manager The ManagementSystem that manages patient data. + * @param ui The UI used to show error or success messages. + * @throws UnloadedStorageException If editing the patient data fails when saving to storage. + * @throws PatientNotFoundException If no patient with the specified NRIC is found. + * @throws InvalidInputFormatException If the provided date is invalid or if newDob is after the current date. + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException, InvalidInputFormatException { @@ -29,6 +39,7 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep String addr = details[4]; String phone = details[5]; + // If dob is specified, we parse it here to confirm validity before calling editPatient if (dob != null && !dob.isBlank()) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); try { diff --git a/src/main/java/command/EditPatientHistoryCommand.java b/src/main/java/command/EditPatientHistoryCommand.java index c3375d9ea7..e8155fefcc 100644 --- a/src/main/java/command/EditPatientHistoryCommand.java +++ b/src/main/java/command/EditPatientHistoryCommand.java @@ -4,14 +4,35 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to edit existing medical history entries for a patient. + */ public class EditPatientHistoryCommand extends Command { + /** + * String array containing: + * [0] = Patient NRIC + * [1] = Old history text to be replaced + * [2] = New history text to replace with + */ private final String[] details; + /** + * Constructs an EditPatientHistoryCommand with the specified details. + * + * @param details Contains patient NRIC, old history entry, and new history entry. + */ public EditPatientHistoryCommand(String[] details) { this.details = details; } + /** + * Executes the command to edit the medical history of a specified patient. + * + * @param manager The ManagementSystem managing patient data and operations. + * @param ui The Ui used to display output to the user. + * @throws UnloadedStorageException if saving changes to storage fails. + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { String nric = details[0]; diff --git a/src/main/java/command/StoreMedHistoryCommand.java b/src/main/java/command/StoreMedHistoryCommand.java index 71890119f5..8c832777c5 100644 --- a/src/main/java/command/StoreMedHistoryCommand.java +++ b/src/main/java/command/StoreMedHistoryCommand.java @@ -5,15 +5,41 @@ import manager.ManagementSystem; import miscellaneous.Ui; + +/** + * Represents a command to store medical history for a specified patient. + */ +//@@author jyukuan public class StoreMedHistoryCommand extends Command { + /** + * Patient's NRIC to which the medical history belongs. + */ private String nric; + /** + * The medical history (or histories) to store, typically in comma-separated format. + */ private String medHistory; + /** + * Constructs a StoreMedHistoryCommand with the necessary details. + * The first element in the array is the patient's NRIC, the second is the medical history text. + * + * @param details String array containing [0] = NRIC, [1] = Medical history text. + */ public StoreMedHistoryCommand(String[] details) { this.nric = details[0]; this.medHistory = details[1]; } + + /** + * Executes the command to store the given medical history for the specified patient. + * + * @param manager The ManagementSystem that manages patient and appointment data. + * @param ui The Ui used to display success or error messages. + * @throws UnloadedStorageException if saving to storage fails due to uninitialized storage. + * @throws PatientNotFoundException if the patient with the given NRIC is not found. + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException { manager.storeMedicalHistory(nric, medHistory); diff --git a/src/main/java/command/ViewMedHistoryCommand.java b/src/main/java/command/ViewMedHistoryCommand.java index e99a3dd789..8739915b79 100644 --- a/src/main/java/command/ViewMedHistoryCommand.java +++ b/src/main/java/command/ViewMedHistoryCommand.java @@ -4,15 +4,34 @@ import manager.ManagementSystem; import miscellaneous.Ui; + +/** + * Represents a command to view medical history for a patient, + * either by NRIC or by name. + */ public class ViewMedHistoryCommand extends Command { protected String type; protected String nameOrIc; + /** + * Constructs a ViewMedHistoryCommand with the necessary details. + * details[0] = "ic" or "n" (search type), details[1] = the actual NRIC or name. + * + * @param details String array indicating search type and the patient's NRIC or name. + */ public ViewMedHistoryCommand(String[] details) { this.type = details[0]; this.nameOrIc = details[1]; } + /** + * Executes the command to view a patient's medical history. + * If type == "ic", it searches by NRIC; otherwise, it searches by name. + * + * @param manager The ManagementSystem that manages patient data. + * @param ui The Ui used to display output to the user. + * @throws PatientNotFoundException if no matching patient is found when searching by NRIC. + */ @Override public void execute(ManagementSystem manager, Ui ui) throws PatientNotFoundException { if (type.equals("ic")) { diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 2cbde45337..fcd75858e7 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -96,6 +96,22 @@ public Patient viewPatient(String nric) { return matchedPatient; } + + /** + * Edits the information of an existing patient. Updates only the fields + * that are not null or blank in the provided parameters. + * + * @param nric The NRIC of the patient to edit. + * @param newName The new name to set. (Pass null or blank to leave it unchanged) + * @param newDob The new date of birth in "yyyy-MM-dd" format. (null/blank to skip) + * @param newGender The new gender (e.g., "M" or "F"). (null/blank to skip) + * @param newAddress The new address. (null/blank to skip) + * @param newPhone The new phone number. (null/blank to skip) + * @throws UnloadedStorageException If saving the edited patient data to storage fails. + * @throws PatientNotFoundException If no patient is found with the given NRIC. + * @throws InvalidInputFormatException If the newDob string is invalid or + * if the parsed date is after the current date. + */ //@@author jyukuan public void editPatient(String nric, String newName, String newDob, String newGender, String newAddress, String newPhone) throws UnloadedStorageException, PatientNotFoundException, @@ -137,6 +153,16 @@ public void editPatient(String nric, String newName, String newDob, String newGe System.out.println("Patient with NRIC " + nric + " updated successfully."); } + /** + * Stores new medical history entries for the patient with the specified NRIC. + * Entries can be comma-separated, and each unique entry is appended to + * the patient's existing medical history if not already present. + * + * @param nric The NRIC of the patient whose medical history is to be updated. + * @param medHistory A comma-separated list of new medical history entries. + * @throws PatientNotFoundException if no patient matches the given NRIC. + * @throws UnloadedStorageException if saving to storage fails. + */ public void storeMedicalHistory(String nric, String medHistory) throws PatientNotFoundException, UnloadedStorageException { Patient existingPatient = findPatientByNric(nric); @@ -159,6 +185,13 @@ public void storeMedicalHistory(String nric, String medHistory) throws PatientNo } + /** + * Views the medical history for a single patient identified by NRIC, + * and displays it to the user via the Ui component. + * + * @param nric The NRIC of the patient whose medical history should be displayed. + * @throws PatientNotFoundException if no patient with the specified NRIC is found. + */ public void viewMedicalHistoryByNric(String nric) throws PatientNotFoundException { Patient foundPatients = findPatientByNric(nric.trim()); @@ -170,6 +203,12 @@ public void viewMedicalHistoryByNric(String nric) throws PatientNotFoundExceptio } } + /** + * Finds one or more patients by name, then displays each patient's medical history. + * If multiple patients share the same name, all their histories are shown. + * + * @param name The name of the patient(s) whose medical history should be displayed. + */ public void viewMedicalHistoryByName(String name) { List foundPatients = findPatientsByName(name.trim()); @@ -186,6 +225,14 @@ public void viewMedicalHistoryByName(String name) { } } + /** + * Replaces an existing medical history entry for a given patient with new content. + * + * @param nric The NRIC of the patient whose medical history will be edited. + * @param oldHistory The old history text to be replaced. + * @param newHistory The new history text to replace with. + * @throws UnloadedStorageException if saving the updated data to storage fails. + */ public void editPatientHistory(String nric, String oldHistory, String newHistory) throws UnloadedStorageException { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; @@ -213,6 +260,13 @@ public void editPatientHistory(String nric, String oldHistory, String newHistory } } + + /** + * Finds a patient by their NRIC, ignoring case. + * + * @param nric The NRIC string to search for. + * @return The Patient object if found, or null if no matching patient is found. + */ public Patient findPatientByNric(String nric) { String object = nric.trim().toUpperCase(); for (Patient p : patients) { @@ -224,6 +278,12 @@ public Patient findPatientByNric(String nric) { return null; } + /** + * Finds a list of patients who have a matching name (case-insensitive). + * + * @param name The name string to search for. + * @return A List of Patient objects that match the given name (could be empty if none found). + */ private List findPatientsByName(String name) { List result = new ArrayList<>(); for (Patient p : patients) { From c96051596db6963a7290e00e4ab031db594c7e83 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Mon, 7 Apr 2025 21:05:47 +0800 Subject: [PATCH 164/203] Fixed the checkstyle of Patient --- src/main/java/manager/Patient.java | 3 +-- src/main/java/miscellaneous/Parser.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index f8b276c5aa..eed519f93b 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -124,8 +124,7 @@ private String parseValidIC(String ic) throws InvalidInputFormatException { private String checkGender(String gender) throws InvalidInputFormatException { if(gender.equals("M") || gender.equals("F")) { return gender; - } - else{ + } else { throw new InvalidInputFormatException("The gender must to be either M (male) or F (female)"); } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 2c8d22ae84..02445e2f57 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -209,7 +209,7 @@ private static Appointment parseAddAppointment(String input) throws InvalidInput throw new InvalidInputFormatException(msg); } - if (!nric.trim().matches("(?i)[A-Z]\\d{7}[A-Z]")) { + if (!nric.trim().matches("(?i)[STFGM]\\d{7}[A-Z]")) { throw new InvalidInputFormatException("Invalid IC format. Please use a valid IC e.g. S1234567D"); } From db5431983910895436a45611f3f238c08680efb6 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Mon, 7 Apr 2025 21:16:01 +0800 Subject: [PATCH 165/203] Updated the formatting of DG --- docs/DeveloperGuide.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 17ee866533..f5fc72eca2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -221,7 +221,7 @@ The sequence diagram below illustrates the interactions within the `Parser` comp as example: ![parser-sequence-diagram](diagrams/parserSequence.png) -> [!NOTE]: This sequence diagram only focus on the interactions within the `Parser` component, the other components +> This sequence diagram only focus on the interactions within the `Parser` component, the other components > such as `Ui`, `ManagementSystem` and `Storage` are omitted. How the `Parser` component works: @@ -410,7 +410,7 @@ The 'view-patient' feature allows the user to retrieve and view the personal det - This command lets `ClinicEase` read the user input through the `UI` and pass it to `Parser`. - The `Parser` class determines that the command is `view-patient` and creates a `ViewPatientCommand` object. -> [!NOTE]: +> **Note:** > If the input does not match the expected format, an `InvalidInputFormatException` is thrown. Hence, the patient's details will not be retrieved. **Step 3.** The system calls `execute()` method in `ViewPatientCommand`. @@ -452,7 +452,7 @@ public static Command parse(String userInput) throws InvalidInputFormatException //... ```` -> [!NOTE]: +> **Note:**
    > If the input does not match the expected format, an InvalidInputFormatException is thrown. Hence, the appointment will > not be successfully added and stored. @@ -510,7 +510,7 @@ which removes the corresponding `Appointment` object from the list. - If found, it removes the appointment from the list. - It also retrieves the corresponding patient using findPatientByNric() and updates the patient's internal appointment list. ->[!NOTE]: +> **Note:** > - If the `APPOINTMENT_ID` is invalid, an error message will be displayed and the deletion will not proceed. > - When a **specified patient** is **deleted**, all **appointment records associated** with that patient will be **removed** too. @@ -731,7 +731,7 @@ Step 4. If the prescription is found, the system: - Generates an HTML file with `Storage.savePrescriptionHtml()` - Shows the file location to the user -> [!NOTE]: +> **Note:** > If the prescription ID is invalid, an error message will be displayed and no HTML will be generated. #### HTML Prescription Generation From 895f6f99860e914ca97786ca670924525134740a Mon Sep 17 00:00:00 2001 From: jyukuan Date: Mon, 7 Apr 2025 21:25:38 +0800 Subject: [PATCH 166/203] Update jyukuan.md --- docs/team/jyukuan.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/docs/team/jyukuan.md b/docs/team/jyukuan.md index 4dc57566fb..ef269d351d 100644 --- a/docs/team/jyukuan.md +++ b/docs/team/jyukuan.md @@ -52,14 +52,7 @@ store, view, and edit patients’ medical histories with robust validation and p - Helped maintain consistent Java coding conventions (e.g., method naming, usage of final variables) throughout the codebase. -5. **Contributions to Team-Based Tasks** - - - Participated in **team discussions** to decide on the command naming patterns (`store-history` vs. `add-history`) - and the approach to handle multiple comma-separated entries. - - Ensured consistent **exception messages** across the project for invalid data entries. - - Reviewed and tested merges from teammates, particularly those that affected `ManagementSystem` or `Parser`. - -6. **Review / Mentoring Contributions** +5. **Review / Mentoring Contributions** - Provided code reviews on pull requests that impacted the data structures storing patient details. - Helped maintain consistent Java coding conventions (e.g., method naming, usage of final variables) throughout the From 8eea7a740233ac189988c49a0cf247f27827e462 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Mon, 7 Apr 2025 22:34:31 +0800 Subject: [PATCH 167/203] Updated JavaDoc --- data/patient_data.txt | 0 docs/team/chwenyee.md | 2 + .../java/command/AddAppointmentCommand.java | 22 ++++++++ .../command/DeleteAppointmentCommand.java | 21 ++++++++ src/main/java/command/ExitCommand.java | 15 ++++++ src/main/java/command/HelpCommand.java | 9 ++++ .../java/command/ListAppointmentCommand.java | 10 ++++ .../java/command/SortAppointmentCommand.java | 16 ++++++ .../exception/AppointmentClashException.java | 11 ++++ .../InvalidInputFormatException.java | 11 ++++ .../exception/UnknownCommandException.java | 11 ++++ src/main/java/manager/Appointment.java | 50 +++++++++++++++++++ src/main/java/miscellaneous/Parser.java | 13 +++++ 13 files changed, 191 insertions(+) delete mode 100644 data/patient_data.txt diff --git a/data/patient_data.txt b/data/patient_data.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/team/chwenyee.md b/docs/team/chwenyee.md index 3cee669b4c..05d4e69d06 100644 --- a/docs/team/chwenyee.md +++ b/docs/team/chwenyee.md @@ -34,6 +34,8 @@ and future-dated appointments (prevents past-date/time entries) 3. **sort-appointment**: Sorts the appointments in the appointment list and display the sorted list to the user. Sorting can be performed by either `byDate` or `byId`. +4. **help**: Simple command that outputs all available command inputs of the application. + #### Contributions to the UG: **Sections:** diff --git a/src/main/java/command/AddAppointmentCommand.java b/src/main/java/command/AddAppointmentCommand.java index 7b0490c374..27f7292dec 100644 --- a/src/main/java/command/AddAppointmentCommand.java +++ b/src/main/java/command/AddAppointmentCommand.java @@ -7,18 +7,40 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to add a new appointment to the management system. + */ public class AddAppointmentCommand extends Command { protected Appointment appointment; + /** + * Constructs an AddAppointmentCommand with the specified appointment. + * + * @param appointment The appointment to be added to the system. + */ public AddAppointmentCommand(Appointment appointment) { this.appointment = appointment; } + /** + * Gets the appointment associated with this command. + * + * @return The appointment to be added. + */ public Appointment getAppointment() { return appointment; } + /** + * Executes the command to add the appointment to the appointment list in management system. + * + * @param manager The management system that stores the appointment. + * @param ui The user interface for displaying messages. + * @throws UnloadedStorageException If the storage component is not properly loaded. + * @throws PatientNotFoundException If the patient associated with the appointment is not found. + * @throws AppointmentClashException If the appointment time conflicts with an existing appointment. + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException, PatientNotFoundException, AppointmentClashException { diff --git a/src/main/java/command/DeleteAppointmentCommand.java b/src/main/java/command/DeleteAppointmentCommand.java index aca8dbb042..f106e2a8bb 100644 --- a/src/main/java/command/DeleteAppointmentCommand.java +++ b/src/main/java/command/DeleteAppointmentCommand.java @@ -5,17 +5,38 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to delete an existing appointment from the management system. + */ public class DeleteAppointmentCommand extends Command { protected String apptId; + /** + * Constructs a DeleteAppointmentCommand with the specified appointment ID. + * + * @param apptId The unique identifier of the appointment to be deleted. + */ public DeleteAppointmentCommand(String apptId) { this.apptId = apptId; } + /** + * Gets the appointment ID associated with this command. + * + * @return The ID of the appointment to be deleted. + */ public String getApptId() { return apptId; } + + /** + * Executes the command to delete the appointment from the management system. + * + * @param manager The management system that contains the appointment. + * @param ui The user interface for displaying messages. + * @throws UnloadedStorageException If the storage component is not properly loaded. + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Appointment removedAppointment = manager.deleteAppointment(apptId); diff --git a/src/main/java/command/ExitCommand.java b/src/main/java/command/ExitCommand.java index e4d05fa546..48adf7ea1d 100644 --- a/src/main/java/command/ExitCommand.java +++ b/src/main/java/command/ExitCommand.java @@ -3,13 +3,28 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to exit the application. + * This command terminates the program after displaying a goodbye message. + */ public class ExitCommand extends Command { + /** + * Executes the exit command by displaying the goodbye message. + * + * @param manager The management system (unused in this command). + * @param ui The user interface used to display the goodbye message. + */ @Override public void execute(ManagementSystem manager, Ui ui) { ui.showBye(); } + /** + * Indicates that this command should terminate the application. + * + * @return Returns true to exit the application. + */ @Override public boolean isExit() { return true; diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 933d5b59d4..323c730fbe 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -3,7 +3,16 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to display all available commands and their usage formats. + */ public class HelpCommand extends Command { + /** + * Executes the help command by displaying the help message. + * + * @param manager The management system (unused in this command). + * @param ui The user interface used to display all available commands of the application. + */ @Override public void execute(ManagementSystem manager, Ui ui) { ui.showHelp(); diff --git a/src/main/java/command/ListAppointmentCommand.java b/src/main/java/command/ListAppointmentCommand.java index a8c56662e1..fbcfddff0c 100644 --- a/src/main/java/command/ListAppointmentCommand.java +++ b/src/main/java/command/ListAppointmentCommand.java @@ -3,7 +3,17 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to list all appointments in the system. + * This command displays all current appointments in the appointment list of the management system. + */ public class ListAppointmentCommand extends Command { + /** + * Executes the list appointments command by displaying all appointments. + * + * @param manager The management system containing the appointment list. + * @param ui The user interface for displaying the appointment list. + */ @Override public void execute(ManagementSystem manager, Ui ui) { ui.showAppointmentList(manager.getAppointments()); diff --git a/src/main/java/command/SortAppointmentCommand.java b/src/main/java/command/SortAppointmentCommand.java index 7e3bbd3e25..638a0e4241 100644 --- a/src/main/java/command/SortAppointmentCommand.java +++ b/src/main/java/command/SortAppointmentCommand.java @@ -8,13 +8,29 @@ import java.util.List; +/** + * Represents a command to sort appointments in the management system. + */ public class SortAppointmentCommand extends Command { protected String type; + /** + * Constructs a SortAppointmentCommand with the specified sorting type. + * + * @param type The type of sorting to perform ("date" or other supported types). + */ public SortAppointmentCommand(String type) { this.type = type; } + /** + * Executes the command to sort appointments in the management system. + * + * @param manager The management system containing the appointments. + * @param ui The user interface for displaying the sorted appointments. + * @throws DuplicatePatientIDException If duplicate patient IDs are encountered. + * @throws UnloadedStorageException If the storage component is not properly loaded. + */ @Override public void execute (ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException { diff --git a/src/main/java/exception/AppointmentClashException.java b/src/main/java/exception/AppointmentClashException.java index 02dae4f4a8..01a0c4ef39 100644 --- a/src/main/java/exception/AppointmentClashException.java +++ b/src/main/java/exception/AppointmentClashException.java @@ -1,6 +1,17 @@ package exception; +/** + * Represents an exception specific to appointment clash. + * This exception is thrown when attempting to schedule an appointment that conflicts with + * an existing appointment in the system. + */ public class AppointmentClashException extends Exception { + + /** + * Constructs an AppointmentClashException with the specified detail message. + * + * @param message The detail message explaining the appointment conflict + */ public AppointmentClashException(String message) { super(message); } diff --git a/src/main/java/exception/InvalidInputFormatException.java b/src/main/java/exception/InvalidInputFormatException.java index 026baabf39..828c2f4803 100644 --- a/src/main/java/exception/InvalidInputFormatException.java +++ b/src/main/java/exception/InvalidInputFormatException.java @@ -1,6 +1,17 @@ package exception; +/** + * Represents an exception specific to the invalid user input format. + * This exception is thrown when the user input does not match the expected format + * for a command or parameter. + */ public class InvalidInputFormatException extends Exception { + + /** + * Constructs an InvalidInputFormatException with the specified detail message. + * + * @param message The detail message explaining the correct input format + */ public InvalidInputFormatException (String message) { super(message); } diff --git a/src/main/java/exception/UnknownCommandException.java b/src/main/java/exception/UnknownCommandException.java index 259e59193b..a37d9f51c4 100644 --- a/src/main/java/exception/UnknownCommandException.java +++ b/src/main/java/exception/UnknownCommandException.java @@ -1,6 +1,17 @@ package exception; +/** + * Represents an exception specific to the unknown user command. + * This exception is thrown when the user enters a command that is not recognized + * by the application. + */ public class UnknownCommandException extends Exception{ + + /** + * Constructs an UnknownCommandException with the specified message. + * + * @param message The message indicating the command is invalid/unknown. + */ public UnknownCommandException (String message) { super(message); } diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index b7bacbefa8..dacbe22831 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -5,6 +5,11 @@ import java.time.LocalTime; import java.time.format.DateTimeFormatter; +/** + * Represents an appointment in the clinic management system. + * Contains information about the patient (NRIC), appointment date/time, + * description, and completion status. + */ public class Appointment { public static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm"); @@ -17,6 +22,13 @@ public class Appointment { private final String description; private boolean isDone; + /** + * Constructs a new Appointment with auto-generated ID. + * + * @param nric The NRIC of the patient for this appointment + * @param dateTime The date and time of the appointment + * @param description The description of the appointment + */ public Appointment(String nric, LocalDateTime dateTime, String description) { assert nric != null && !nric.isBlank() : "NRIC cannot be null or blank"; assert dateTime != null : "DateTime cannot be null"; @@ -29,6 +41,14 @@ public Appointment(String nric, LocalDateTime dateTime, String description) { this.isDone = false; } + /** + * Constructs an Appointment with a specific ID (used for loading from storage). + * + * @param id The predefined ID for the appointment + * @param nric The NRIC of the patient + * @param dateTime The date and time of the appointment + * @param description The description of the appointment + */ public Appointment(String id, String nric, LocalDateTime dateTime, String description) { this.id = id; this.nric = nric; @@ -40,6 +60,11 @@ public String getId() { return id; } + /** + * Sets the running ID counter for new appointments. + * + * @param newId The new starting value for ID generation + */ public static void setRunningId(int newId) { runningId = newId; } @@ -68,6 +93,11 @@ public String getDescription() { return description; } + /** + * Checks the completion status of the appointment. + * + * @return true if the appointment is completed, false otherwise + */ public boolean isDone() { return isDone; } @@ -80,20 +110,40 @@ public void unmarkAsDone() { this.isDone = false; } + /** + * Sets the completion status of the appointment. + * + * @param mark true to mark as done, false to mark as not done + */ public void setIsDone(boolean mark) { this.isDone = mark; } + /** + * Gets the status icon of the appointment for display purposes. + * + * @return "X" if done, " " (space) if not done + */ public String getStatusIcon() { return (isDone ? "X" : " "); } + /** + * Returns the formatted string representation of the appointment + * + * @return A formatted string showing appointment ID, status, NRIC, date/time and description + */ @Override public String toString() { return "[" + id + "]" + "[" + this.getStatusIcon() + "]" + " - " + nric + " - " + dateTime.format(OUTPUT_FORMAT) + " - " + description; } + /** + * Returns the string representation of the appointment in a file-friendly format (for storage). + * + * @return Pipe-delimited string containing all appointment's information + */ public String toFileFormat() { return id.substring(1) + "|" + this.isDone + "|" + this.nric + "|" + dateTime.format(OUTPUT_FORMAT) + "|" + this.description; diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 49e9316f2c..b16d44ca4b 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -37,7 +37,20 @@ import static manager.Appointment.INPUT_FORMAT; +/** + * Parses user input strings into executable Command objects. + * Handles all command types and parameter extraction for the clinic management system. + */ public class Parser { + + /** + * Parses raw user input and returns the corresponding Command object. + * + * @param userInput The full command string entered by the user + * @return A Command object for execution + * @throws InvalidInputFormatException If user input format is invalid + * @throws UnknownCommandException If command is not recognized + */ public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { // Handle empty input if (userInput == null || userInput.trim().isEmpty()) { From e01be4b78db6b4ade178ffbedd4740757ff192dd Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Mon, 7 Apr 2025 23:17:15 +0800 Subject: [PATCH 168/203] Updated FAQ in UG. Updated the clashing appointment's time diff. --- docs/UserGuide.md | 16 ++++++++++++++++ src/main/java/manager/ManagementSystem.java | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 2dfa88ed2a..cdd951a08d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -501,10 +501,25 @@ Format: `bye` ## FAQ +**Q**: How do I save my data? + +**A**: ClinicEase's data, i.e. patients, appointments and prescriptions, are saved in the hard disk automatically after any command that changes the data. +There is no need to save manually. + +**Q**: Can I edit the data file e.g. `patient_data.txt`? + +**A**: ClinicEase's data are saved automatically as a text file at [your current directory in Command Prompt]/data/[patient_data/appointment_data/prescription_data].txt. +Advanced users are welcome to update data directly by editing that data file. + **Q**: How do I transfer my data to another computer? **A**: You can copy the 'data' folder and paste it in the directory that you save your jar file in another computer. +> **CAUTION:** +> - If your changes to the data file makes its format invalid, ClinicEase will skip that row. +> - Consequently, that row of data will not be loaded. +> - Therefore, only edit the data file if you are confident in making the correct updates. + --- ## Known Issues @@ -517,6 +532,7 @@ Format: `bye` - **Impact:** The system cannot recognize the intended valid command, provide appropriate format-suggestion error messages. - **Current Resolution:** This is an intended design trade-off to maintain parsing consistency, though it may be revisited in future versions. +--- ## Command Summary | Action | Format, Examples | diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index fcd75858e7..74810aa48d 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -304,8 +304,8 @@ public void addAppointment(Appointment appointment) throws UnloadedStorageExcept for (Appointment appointmentInList : appointments) { long timeDiff = Math.abs(Duration.between(appointmentInList.getDateTime(), appointment.getDateTime()).toMinutes()); - if (timeDiff < 60) { - throw new AppointmentClashException("This appointment clashes with another scheduled within 1 hour."); + if (timeDiff <= 30) { + throw new AppointmentClashException("This appointment clashes with another scheduled within 30 minutes."); } } From 5d6a2e9f88696ad7a93f6eee400277e4fcc89c8c Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 7 Apr 2025 23:20:28 +0800 Subject: [PATCH 169/203] Added javadocs to respective features --- docs/team/dylancmznus.md | 4 ++ .../java/command/FindAppointmentCommand.java | 23 ++++++++++ .../java/command/MarkApppointmentCommand.java | 22 ++++++++++ .../command/UnmarkAppointmentCommand.java | 22 ++++++++++ src/main/java/command/ViewPatientCommand.java | 28 +++++++++++- src/main/java/manager/ManagementSystem.java | 43 +++++++++++++++++++ 6 files changed, 141 insertions(+), 1 deletion(-) diff --git a/docs/team/dylancmznus.md b/docs/team/dylancmznus.md index 0bce18bdd3..a1d783bff1 100644 --- a/docs/team/dylancmznus.md +++ b/docs/team/dylancmznus.md @@ -80,6 +80,10 @@ Given below are my contributions to the project. - Created **Sequence Diagrams** for the `view-patient` feature, demonstrating how the command interacts with the `Parser`, `ManagementSystem`, and `Storage` components. - Updated UML diagrams to reflect the data flow and validation steps involved in retrieving patient information using NRIC. +3. **Components and Class Diagrams** + - Created **Class Diagrams** for the Manager Component and Object Component. + - Provided details about these components in the Architecture Diagram,. + --- ### Community Involvement diff --git a/src/main/java/command/FindAppointmentCommand.java b/src/main/java/command/FindAppointmentCommand.java index 3bd38c1a0f..fb0849fa4d 100644 --- a/src/main/java/command/FindAppointmentCommand.java +++ b/src/main/java/command/FindAppointmentCommand.java @@ -5,13 +5,36 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Command to find appointments for a patient by their NRIC. + * Interacts with the {@link ManagementSystem} to retrieve + * all appointments associated with a specific NRIC and displays them through the {@link Ui}. + * + *

    This command follows the Command pattern, which encapsulates the appointment search + * functionality to allow for consistent execution without directly manipulating the system's components. + *

    + * + */ public class FindAppointmentCommand extends Command { protected String nric; + /** + * Constructs FindAppointmentCommand with the specified NRIC. + * + * @param nric the NRIC of the patient whose appointments are to be found + */ public FindAppointmentCommand(String nric) { this.nric = nric; } + /** + * Executes the command to find appointments for a patient with the given NRIC. + * It retrieves the list of appointments from ManagementSystem + * and displays the results using Ui. + * + * @param manager ManagementSystem responsible for handling appointment data + * @param ui Ui responsible for displaying the list of appointments + */ @Override public void execute(ManagementSystem manager, Ui ui) { List foundAppointments = manager.findAppointmentsByNric(nric); diff --git a/src/main/java/command/MarkApppointmentCommand.java b/src/main/java/command/MarkApppointmentCommand.java index e38d423fe6..2c285f61ee 100644 --- a/src/main/java/command/MarkApppointmentCommand.java +++ b/src/main/java/command/MarkApppointmentCommand.java @@ -5,13 +5,35 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to mark an appointment as done using its unique appointment ID. + * This command interacts with the ManagementSystem to update the appointment status + * and utilizes the Ui to provide feedback to the user. + * + *

    This class is part of the Command pattern implementation in the system, + * using the mark operation for appointments in a reusable and modular way.

    + */ public class MarkApppointmentCommand extends Command { protected String apptId; + /** + * Constructs a MarkApppointmentCommand with the specified appointment ID. + * + * @param apptId the ID of the appointment to be marked as completed + */ public MarkApppointmentCommand(String apptId) { this.apptId = apptId; } + /** + * Executes the command to mark the appointment with the given ID as completed. + * It updates the appointment's status through the ManagementSystem and + * displays the updated appointment list and confirmation via the Ui. + * + * @param manager the ManagementSystem responsible for managing appointments + * @param ui the Ui responsible for displaying results to the user + * @throws UnloadedStorageException if the storage system was not initialized when the command was executed + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Appointment appointment = manager.markAppointment(apptId); diff --git a/src/main/java/command/UnmarkAppointmentCommand.java b/src/main/java/command/UnmarkAppointmentCommand.java index ad5b4ae003..6dea2243fe 100644 --- a/src/main/java/command/UnmarkAppointmentCommand.java +++ b/src/main/java/command/UnmarkAppointmentCommand.java @@ -5,13 +5,35 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to unmark an appointment, indicating it is no longer completed. + * This command interacts with the ManagementSystem to revert the appointment status + * and utilizes the Ui to provide feedback to the user. + * + *

    It is part of the Command pattern implementation, encapsulating the logic + * for unmarking appointments in a modular and reusable way.

    + */ public class UnmarkAppointmentCommand extends Command { protected String apptId; + /** + * Constructs an UnmarkAppointmentCommand with the specified appointment ID. + * + * @param apptId the ID of the appointment to be unmarked + */ public UnmarkAppointmentCommand(String apptId) { this.apptId = apptId; } + /** + * Executes command to unmark the appointment with the given ID. + * It updates appointment's status through the ManagementSystem and + * displays the updated list and confirmation via the Ui. + * + * @param manager the ManagementSystem responsible for managing appointments + * @param ui the Ui responsible for displaying results to the user + * @throws UnloadedStorageException if the storage system was not initialized when the command was executed + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Appointment appointment = manager.unmarkAppointment(apptId); diff --git a/src/main/java/command/ViewPatientCommand.java b/src/main/java/command/ViewPatientCommand.java index ed88339888..fa0b4d6ba9 100644 --- a/src/main/java/command/ViewPatientCommand.java +++ b/src/main/java/command/ViewPatientCommand.java @@ -4,14 +4,40 @@ import manager.Patient; import miscellaneous.Ui; -//@@author dylancmznus +/** + * Command to view a patient in the system by their NRIC. + * This command interacts with the {@link ManagementSystem} to retrieve + * a patient and displays their details through the {@link Ui}. + * + *

    This command is part of the Command pattern used to encapsulate + * the viewing functionality of a patient, allowing easy execution + * without directly manipulating system objects. + *

    + * + * @author dylancmznus + */ public class ViewPatientCommand extends Command { protected String nric; + /** + * Constructs ViewPatientCommand with the specified NRIC. + * + * @param nric the NRIC of the patient to be viewed + */ public ViewPatientCommand(String nric) { this.nric = nric; } + /** + * Executes the command to view a patient with the given NRIC. + * Retrieves the patient from ManagementSystem and + * displays the details using Ui. + * + * @param manager the {@link ManagementSystem} responsible for handling patient data + * @param ui the {@link Ui} responsible for displaying the patient information + * @throws AssertionError if the manager or ui instances are null + * @throws AssertionError if no patient is found for the given NRIC + */ @Override public void execute(ManagementSystem manager, Ui ui) { assert manager != null : "ManagementSystem instance can't be empty"; diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index fcd75858e7..3f8aa86856 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -84,6 +84,17 @@ public Patient deletePatient(String nric) throws UnloadedStorageException { } //@@author dylancmznus + /** + * Retrieves the patient object that matches the specified NRIC. + * + *

    The method iterates through the list of existing patients to find a match + * based on the NRIC. If a match is found, the corresponding Patient object is returned; + * otherwise, it returns null.

    + * + * @param nric The NRIC of the patient to be retrieved. + * @return The Patient object matching the given NRIC, or null if no match is found. + * @throws AssertionError if the input NRIC is null or blank. + */ public Patient viewPatient(String nric) { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; Patient matchedPatient = null; @@ -348,6 +359,17 @@ public List sortAppointmentsById(List appointments) { } //@@author dylancmznus + /** + * Marks the appointment with the given appointment ID as done. + * + *

    The method searches through the list of appointments to find the one that matches + * the given ID (case-insensitive). If found, it marks the appointment as done and saves + * the updated list to storage.

    + * + * @param apptId The ID of the appointment to be marked as done. + * @return The Appointment object that was marked, or null if no match is found. + * @throws UnloadedStorageException If the storage system has not been properly initialized. + */ public Appointment markAppointment(String apptId) throws UnloadedStorageException { for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { @@ -359,6 +381,17 @@ public Appointment markAppointment(String apptId) throws UnloadedStorageExceptio return null; } + /** + * Unmarks the appointment with the given appointment ID as not done. + * + *

    This method searches through the list of appointments to find the one that matches + * the given ID (case-insensitive). If found, it unmarks the appointment and saves + * the updated list to storage.

    + * + * @param apptId The ID of the appointment to be unmarked. + * @return The Appointment object that was unmarked, or null if no match is found. + * @throws UnloadedStorageException If the storage system has not been properly initialized. + */ public Appointment unmarkAppointment(String apptId) throws UnloadedStorageException { for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { @@ -370,6 +403,16 @@ public Appointment unmarkAppointment(String apptId) throws UnloadedStorageExcept return null; } + + /** + * Finds all appointments associated with the specified NRIC. + * + *

    This method searches through the list of stored appointments and collects + * all appointments that match the given NRIC exactly.

    + * + * @param nric The NRIC used to search for matching appointments. + * @return A list of appointments that are associated with the provided NRIC. + */ public List findAppointmentsByNric(String nric) { List matchingAppointments = new ArrayList<>(); for (Appointment appt : appointments) { From 1460a0446b54e4a877677a03c940aa4a74f2a169 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Mon, 7 Apr 2025 23:25:13 +0800 Subject: [PATCH 170/203] Updated Parser JavaDoc and fixed checkstyle --- src/main/java/manager/ManagementSystem.java | 3 ++- src/main/java/miscellaneous/Parser.java | 20 +++++++++++++++++++ .../java/manager/ManagementSystemTest.java | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 74810aa48d..8fb2fd9b09 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -305,7 +305,8 @@ public void addAppointment(Appointment appointment) throws UnloadedStorageExcept long timeDiff = Math.abs(Duration.between(appointmentInList.getDateTime(), appointment.getDateTime()).toMinutes()); if (timeDiff <= 30) { - throw new AppointmentClashException("This appointment clashes with another scheduled within 30 minutes."); + throw new AppointmentClashException + ("This appointment clashes with another scheduled within 30 minutes."); } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index b16d44ca4b..f496121f77 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -222,6 +222,7 @@ private static Appointment parseAddAppointment(String input) throws InvalidInput throw new InvalidInputFormatException(msg); } + // Check if the input format of Singapore's NRIC is valid if (!nric.trim().matches("(?i)[STFGM]\\d{7}[A-Z]")) { throw new InvalidInputFormatException("Invalid IC format. Please use a valid IC e.g. S1234567D"); } @@ -290,6 +291,13 @@ private static String parseFindAppointment(String input) throws InvalidInputForm return patientId; } + /** + * Extracts parameter values from command strings. + * + * @param input The string containing parameters + * @param prefix The parameter prefix to extract (e.g. "ic/") + * @return The extracted value or null if not found + */ private static String extractValue(String input, String prefix) { assert prefix != null : "Prefix cannot be null"; @@ -381,6 +389,12 @@ private static String[] parseEditHistory(String input) throws InvalidInputFormat return new String[]{nric, oldHistory, newHistory}; } + /** + * Parses patient data from storage format. + * + * @param line The pipe-delimited storage string of the patient + * @return Patient object or null if invalid + */ public static Patient parseLoadPatient(String line) throws InvalidInputFormatException { String[] tokens = line.split("\\|"); if (tokens.length < 7) { @@ -400,6 +414,12 @@ public static Patient parseLoadPatient(String line) throws InvalidInputFormatExc return new Patient(id, name, dobStr, gender, address, contact, medHistory); } + /** + * Parses appointment data from storage format. + * + * @param line The pipe-delimited storage string of the appointment + * @return Appointment object or null if invalid + */ public static Appointment parseLoadAppointment(String line) { if (line.startsWith("countId:")) { return null; diff --git a/src/test/java/manager/ManagementSystemTest.java b/src/test/java/manager/ManagementSystemTest.java index 70ead33643..dc093ed54f 100644 --- a/src/test/java/manager/ManagementSystemTest.java +++ b/src/test/java/manager/ManagementSystemTest.java @@ -205,7 +205,7 @@ void addAppointment_clashedAppointments_expectException() throws UnloadedStorage ManagementSystem manager = new ManagementSystem(patients, new ArrayList<>()); LocalDateTime appointmentTime1 = LocalDateTime.parse("2025-03-20 1900", DATE_TIME_FORMAT); - LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-20 1950", DATE_TIME_FORMAT); + LocalDateTime appointmentTime2 = LocalDateTime.parse("2025-03-20 1930", DATE_TIME_FORMAT); Patient patient = new Patient("S1234567D", "Billy", "1990-10-01", "M", "124 High St", "81234567", new ArrayList<>()); From 17cff2117a1a583493e996c967b6e8c3804e822e Mon Sep 17 00:00:00 2001 From: judHoka Date: Mon, 7 Apr 2025 23:28:43 +0800 Subject: [PATCH 171/203] Updated a bug in loading patients --- docs/UserGuide.md | 2 ++ src/main/java/miscellaneous/Parser.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 2dfa88ed2a..17423b13ab 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -87,6 +87,8 @@ Format: `add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS h/M * The `NRIC` must be unique to the existing ones in the system. * All inputs doesn't handle every ASCII characters, only alphabets and numbers. +* `h/MEDICAL_HISTORY` is optional, so users can use add-patient without it. +* `p/PHONE` & `a/ADDRESS` can be duplicate, since some patient may be represented by the same phone number and/or address. Example of usage: diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 879fd0c3cd..f89ad280b2 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -370,7 +370,8 @@ private static String[] parseEditHistory(String input) throws InvalidInputFormat public static Patient parseLoadPatient(String line) throws InvalidInputFormatException { String[] tokens = line.split("\\|"); - if (tokens.length < 7) { + boolean isHistoryNonpresent = tokens.length == 6; + if (tokens.length < 6) { return null; } @@ -380,7 +381,7 @@ public static Patient parseLoadPatient(String line) throws InvalidInputFormatExc String gender = tokens[3]; String address = tokens[4]; String contact = tokens[5]; - List medHistory = Arrays.stream(tokens[6].split(",")) + List medHistory = isHistoryNonpresent ? new ArrayList<>() : Arrays.stream(tokens[6].split(",")) .map(String::trim) .collect(Collectors.toList()); From d8aac2a4056e766aadf8d5b025af92be4ec3e1b1 Mon Sep 17 00:00:00 2001 From: judHoka Date: Tue, 8 Apr 2025 00:13:31 +0800 Subject: [PATCH 172/203] Added JavaDoc for several classes --- src/main/java/command/AddPatientCommand.java | 20 +- .../java/command/DeletePatientCommand.java | 18 +- src/main/java/command/ListPatientCommand.java | 11 + .../exception/PatientNotFoundException.java | 12 +- src/main/java/manager/Patient.java | 270 +++++++++++------- src/main/java/storage/Storage.java | 62 +++- 6 files changed, 279 insertions(+), 114 deletions(-) diff --git a/src/main/java/command/AddPatientCommand.java b/src/main/java/command/AddPatientCommand.java index 5b65a87d35..2168effa2d 100644 --- a/src/main/java/command/AddPatientCommand.java +++ b/src/main/java/command/AddPatientCommand.java @@ -6,16 +6,34 @@ import manager.Patient; import miscellaneous.Ui; +/** + * Represents a command to add a patient to the system. + */ public class AddPatientCommand extends Command { protected Patient patient; + /** + * Constructs an AddPatientCommand with the specified patient. + * + * @param patient The patient to be added. + */ public AddPatientCommand(Patient patient) { this.patient = patient; } + /** + * Executes the add patient command. + * Adds the patient to the management system and shows confirmation via UI. + * + * @param manager The management system to update. + * @param ui The user interface to interact with the user. + * @throws DuplicatePatientIDException If a patient with the same ID already exists. + * @throws UnloadedStorageException If the storage is not properly initialized. + */ @Override - public void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException { + public void execute(ManagementSystem manager, Ui ui) + throws DuplicatePatientIDException, UnloadedStorageException { manager.addPatient(patient); ui.showPatientAdded(manager.getPatients()); } diff --git a/src/main/java/command/DeletePatientCommand.java b/src/main/java/command/DeletePatientCommand.java index 17d09a199c..c62c360949 100644 --- a/src/main/java/command/DeletePatientCommand.java +++ b/src/main/java/command/DeletePatientCommand.java @@ -5,16 +5,32 @@ import manager.Patient; import miscellaneous.Ui; +/** + * Represents a command to delete a patient from the system. + */ public class DeletePatientCommand extends Command { protected String nric; + /** + * Constructs a DeletePatientCommand with the given NRIC. + * + * @param nric The NRIC of the patient to delete. + */ public DeletePatientCommand(String nric) { this.nric = nric; } + /** + * Executes the delete patient command. + * Removes the patient with the specified NRIC from the system and shows confirmation via UI. + * + * @param manager The management system to update. + * @param ui The user interface to interact with the user. + * @throws UnloadedStorageException If storage is not properly initialized. + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Patient removedPatient = manager.deletePatient(nric); ui.showPatientDeleted(removedPatient, nric); } -} +} \ No newline at end of file diff --git a/src/main/java/command/ListPatientCommand.java b/src/main/java/command/ListPatientCommand.java index 7c9a00bd79..794d64dd33 100644 --- a/src/main/java/command/ListPatientCommand.java +++ b/src/main/java/command/ListPatientCommand.java @@ -3,7 +3,18 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Represents a command to list all patients in the system. + */ public class ListPatientCommand extends Command { + + /** + * Executes the list patient command. + * Displays all patients stored in the management system using the UI. + * + * @param manager The management system containing the patients. + * @param ui The user interface to interact with the user. + */ @Override public void execute(ManagementSystem manager, Ui ui) { ui.showPatientList(manager.getPatients()); diff --git a/src/main/java/exception/PatientNotFoundException.java b/src/main/java/exception/PatientNotFoundException.java index d55d497689..8a89903be6 100644 --- a/src/main/java/exception/PatientNotFoundException.java +++ b/src/main/java/exception/PatientNotFoundException.java @@ -1,8 +1,16 @@ package exception; +/** + * Exception thrown when a patient with the specified identifier is not found in the system. + */ public class PatientNotFoundException extends Exception { + + /** + * Constructs a new PatientNotFoundException with the specified detail message. + * + * @param message The detail message explaining the reason for the exception. + */ public PatientNotFoundException(String message) { super(message); } -} - +} \ No newline at end of file diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 104d28a3be..75bb779fb5 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -6,8 +6,15 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +/** + * Represents a patient in the clinic management system. + * Stores patient details such as NRIC, name, date of birth, contact info, gender, + * address, medical history, and appointments. + */ public class Patient { private String id; @@ -19,6 +26,18 @@ public class Patient { private final List medicalHistory; private final List appointments; + /** + * Constructs a new Patient object with the given details. + * + * @param id The NRIC of the patient. + * @param name The name of the patient. + * @param dobStr The date of birth in yyyy-MM-dd format. + * @param gender The gender (M or F). + * @param address The address. + * @param contactInfo The 8-digit contact number. + * @param medicalHistory A list of past medical history. + * @throws InvalidInputFormatException if any input format is invalid. + */ public Patient(String id, String name, String dobStr, String gender, String address, String contactInfo, List medicalHistory) throws InvalidInputFormatException { assert id != null && !id.isBlank() : "Patient ID cannot be null or blank"; @@ -28,7 +47,7 @@ public Patient(String id, String name, String dobStr, String gender, String addr assert address != null : "Address cannot be null"; assert contactInfo != null : "Contact info cannot be null"; assert medicalHistory != null : "Medical history list cannot be null"; - + this.id = parseValidIC(id); this.name = name; this.dob = parseAndValidateDob(dobStr); @@ -39,110 +58,81 @@ public Patient(String id, String name, String dobStr, String gender, String addr this.appointments = new ArrayList<>(); } - public String getId() { - return id; - } + /** + * Parses a pipe-delimited line into a Patient object. + * Accepts either 6 tokens (if medical history is empty) or 7 tokens. + * + * @param line The line to parse. + * @return A Patient object or null if the format is invalid. + * @throws InvalidInputFormatException if any of the fields are invalid. + */ + public static Patient parseLoadPatient(String line) throws InvalidInputFormatException { + String[] tokens = line.split("\\|"); + if (tokens.length < 6 || tokens.length > 7) { + return null; + } - public String getName() { - return name; - } + String id = tokens[0]; + String name = tokens[1]; + String dobStr = tokens[2]; + String gender = tokens[3]; + String address = tokens[4]; + String contact = tokens[5]; + List medHistory = new ArrayList<>(); + + if (tokens.length == 7 && !tokens[6].isBlank()) { + medHistory = Arrays.stream(tokens[6].split(",")) + .map(String::trim) + .collect(Collectors.toList()); + } - public LocalDate getDob() { - return dob; + return new Patient(id, name, dobStr, gender, address, contact, medHistory); } - public String getGender() { - return gender; - } + /** @return the patient NRIC */ + public String getId() { return id; } - public String getAddress() { - return address; - } + /** @return the patient name */ + public String getName() { return name; } - public String getContactInfo() { - return contactInfo; - } + /** @return the patient's date of birth */ + public LocalDate getDob() { return dob; } - public List getMedicalHistory() { - return medicalHistory; - } + /** @return the patient's gender */ + public String getGender() { return gender; } - public void setName(String name) { - this.name = name; - } + /** @return the patient's address */ + public String getAddress() { return address; } - public void setDob(LocalDate dob) { - this.dob = dob; - } + /** @return the patient's contact number */ + public String getContactInfo() { return contactInfo; } - public void setContactInfo(String contactInfo) { - this.contactInfo = contactInfo; - } + /** @return the patient's medical history list */ + public List getMedicalHistory() { return medicalHistory; } - public void setGender(String gender) { - this.gender = gender; - } + public void setName(String name) { this.name = name; } + public void setDob(LocalDate dob) { this.dob = dob; } + public void setContactInfo(String contactInfo) { this.contactInfo = contactInfo; } + public void setGender(String gender) { this.gender = gender; } + public void setAddress(String address) { this.address = address; } - public void setAddress(String address) { - this.address = address; - } - - public List getAppointments() { - return appointments; - } + /** @return the patient's list of appointments */ + public List getAppointments() { return appointments; } + /** + * Adds an appointment to the patient. + * @param appointment Appointment to be added. + */ public void addAppointment(Appointment appointment) { assert appointment != null : "Appointment cannot be null"; assert appointment.getNric().equals(this.id) : "Appointment NRIC must match patient ID"; appointments.add(appointment); } - private String parseValidIC(String ic) throws InvalidInputFormatException { - if (ic == null || ic.length() != 9) { - throw new InvalidInputFormatException("IC must be exactly 9 characters long."); - } - - String prefix = ic.substring(0, 1).toUpperCase(); - String numberPart = ic.substring(1, 8); - String suffix = ic.substring(8).toUpperCase(); - - if (!prefix.matches("[STFGM]")) { - throw new InvalidInputFormatException("IC must start with S, T, F, G, or M."); - } - - if (!numberPart.matches("\\d{7}")) { - throw new InvalidInputFormatException("IC must contain 7 digits after the prefix."); - } - - if (!suffix.matches("[A-Z]")) { - throw new InvalidInputFormatException("IC must end with an uppercase letter."); - } - - return ic; - } - - private String checkGender(String gender) throws InvalidInputFormatException { - if(gender.equals("M") || gender.equals("F")) { - return gender; - } - else{ - throw new InvalidInputFormatException("The gender must to be either M (male) or F (female)"); - } - } - - private LocalDate parseAndValidateDob(String dobStr) throws InvalidInputFormatException { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - try { - LocalDate dob = LocalDate.parse(dobStr, formatter); - if (dob.isAfter(LocalDate.now())) { - throw new InvalidInputFormatException("Date of birth must be before the current date."); - } - return dob; - } catch (DateTimeParseException e) { - throw new InvalidInputFormatException("Invalid date format. Use yyyy-MM-dd."); - } - } - + /** + * Removes an appointment from the patient by appointment ID. + * @param apptId ID of the appointment to be removed. + */ public void deleteAppointment(String apptId) { assert apptId != null && !apptId.isBlank() : "Appointment ID cannot be null or blank"; for (Appointment appt : appointments) { @@ -153,27 +143,13 @@ public void deleteAppointment(String apptId) { } } - private String parseContactInfo(String contactInfo) throws InvalidInputFormatException { - try { - if (contactInfo.length() != 8 || !contactInfo.matches("\\d+")) { - throw new InvalidInputFormatException("Contact number must be 8 digits."); - } - return contactInfo; - } catch (NullPointerException e) { - throw new InvalidInputFormatException("Contact number cannot be null."); - } - } - - + /** + * Returns a string representation of the patient for display. + * @return Formatted patient details and appointments. + */ @Override public String toString() { - String formattedMedicalHistory; - if (medicalHistory.isEmpty()) { - formattedMedicalHistory = "None"; - } else { - formattedMedicalHistory = String.join(", ", medicalHistory); - } - + String formattedMedicalHistory = medicalHistory.isEmpty() ? "None" : String.join(", ", medicalHistory); String result = String.format( "Patient NRIC: %s\n" @@ -202,6 +178,10 @@ public String toString() { return result; } + /** + * Returns a formatted string for list display. + * @return Compact patient details for list view. + */ public String toStringForListView() { String result = String.format( "Patient NRIC: %s\n " @@ -237,9 +217,89 @@ public String toStringForListView() { return result; } + /** + * Returns a pipe-delimited string for file storage. + * @return File format string. + */ public String toFileFormat() { String history = String.join(", ", this.medicalHistory); return this.id + "|" + this.name + "|" + dob.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "|" + this.gender + "|" + this.address + "|" + this.contactInfo + "|" + history; } + + /** + * Validates and parses the NRIC format. + * @param ic The NRIC string to validate. + * @return A validated NRIC string. + * @throws InvalidInputFormatException If the NRIC format is invalid. + */ + private String parseValidIC(String ic) throws InvalidInputFormatException { + if (ic == null || ic.length() != 9) { + throw new InvalidInputFormatException("IC must be exactly 9 characters long."); + } + String prefix = ic.substring(0, 1).toUpperCase(); + String numberPart = ic.substring(1, 8); + String suffix = ic.substring(8).toUpperCase(); + + if (!prefix.matches("[STFGM]")) { + throw new InvalidInputFormatException("IC must start with S, T, F, G, or M."); + } + if (!numberPart.matches("\\d{7}")) { + throw new InvalidInputFormatException("IC must contain 7 digits after the prefix."); + } + if (!suffix.matches("[A-Z]")) { + throw new InvalidInputFormatException("IC must end with an uppercase letter."); + } + return ic; + } + + /** + * Validates the gender input. + * @param gender Gender string to validate. + * @return Validated gender. + * @throws InvalidInputFormatException If the gender is not M or F. + */ + private String checkGender(String gender) throws InvalidInputFormatException { + if(gender.equals("M") || gender.equals("F")) { + return gender; + } else { + throw new InvalidInputFormatException("The gender must be either M (male) or F (female)"); + } + } + + /** + * Parses and validates the date of birth string. + * @param dobStr Date of birth in yyyy-MM-dd format. + * @return Parsed LocalDate object. + * @throws InvalidInputFormatException If format is incorrect or date is in the future. + */ + private LocalDate parseAndValidateDob(String dobStr) throws InvalidInputFormatException { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + try { + LocalDate dob = LocalDate.parse(dobStr, formatter); + if (dob.isAfter(LocalDate.now())) { + throw new InvalidInputFormatException("Date of birth must be before the current date."); + } + return dob; + } catch (DateTimeParseException e) { + throw new InvalidInputFormatException("Invalid date format. Use yyyy-MM-dd."); + } + } + + /** + * Validates and parses the contact number. + * @param contactInfo Contact number string. + * @return Validated contact number. + * @throws InvalidInputFormatException If not an 8-digit number. + */ + private String parseContactInfo(String contactInfo) throws InvalidInputFormatException { + try { + if (contactInfo.length() != 8 || !contactInfo.matches("\\d+")) { + throw new InvalidInputFormatException("Contact number must be 8 digits."); + } + return contactInfo; + } catch (NullPointerException e) { + throw new InvalidInputFormatException("Contact number cannot be null."); + } + } } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 32f4d8a3e9..c537ee9438 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -15,6 +15,10 @@ import java.util.List; import java.util.Scanner; +/** + * Handles saving and loading of patient, appointment, and prescription data + * to and from the local file system. + */ public class Storage { private static String directoryPath; private static String patientFilePath; @@ -23,6 +27,11 @@ public class Storage { private static String prescriptionDirPath; private static Patient patients; + /** + * Initializes storage paths based on a given directory. + * + * @param directory The directory to store data files in. + */ public Storage(String directory) { directoryPath = directory; patientFilePath = directory + File.separator + "patient_data.txt"; @@ -31,6 +40,12 @@ public Storage(String directory) { prescriptionDirPath = directory + File.separator + "prescriptions"; } + /** + * Saves a list of patients to file. + * + * @param patientList The list of patients to save. + * @throws UnloadedStorageException If storage is not initialized. + */ public static void savePatients(List patientList) throws UnloadedStorageException { if (directoryPath == null || patientFilePath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); @@ -51,6 +66,12 @@ public static void savePatients(List patientList) throws UnloadedStorag } } + /** + * Loads patients from file. + * + * @return A list of patients. + * @throws UnloadedStorageException If patient data cannot be loaded. + */ public static List loadPatients() throws UnloadedStorageException { List patients = new ArrayList<>(); File file = new File(patientFilePath); @@ -73,6 +94,12 @@ public static List loadPatients() throws UnloadedStorageException { return patients; } + /** + * Saves a list of appointments to file. + * + * @param appointmentList The list of appointments to save. + * @throws UnloadedStorageException If storage is not initialized. + */ public static void saveAppointments(List appointmentList) throws UnloadedStorageException { if (directoryPath == null || appointmentFilePath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); @@ -96,7 +123,13 @@ public static void saveAppointments(List appointmentList) throws Un } } - + /** + * Loads appointments from file and links them to their corresponding patients. + * + * @param system The management system containing the patient list. + * @return A list of appointments. + * @throws UnloadedStorageException If appointment data cannot be loaded. + */ public static List loadAppointments(ManagementSystem system) throws UnloadedStorageException { List appointments = new ArrayList<>(); File file = new File(appointmentFilePath); @@ -142,6 +175,12 @@ public static List loadAppointments(ManagementSystem system) throws return appointments; } + /** + * Saves a list of prescriptions to file. + * + * @param prescriptionList The list of prescriptions to save. + * @throws UnloadedStorageException If storage is not initialized. + */ public static void savePrescriptions(List prescriptionList) throws UnloadedStorageException { if (directoryPath == null || prescriptionFilePath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); @@ -162,10 +201,16 @@ public static void savePrescriptions(List prescriptionList) throws } } + /** + * Loads prescriptions from file. + * + * @return A list of prescriptions. + * @throws UnloadedStorageException If prescription data cannot be loaded. + */ public static List loadPrescriptions() throws UnloadedStorageException { List prescriptions = new ArrayList<>(); File file = new File(prescriptionFilePath); - + if (!file.exists()) { return prescriptions; } @@ -187,7 +232,14 @@ public static List loadPrescriptions() throws UnloadedStorageExcep return prescriptions; } - public static void savePrescriptionHtml(Prescription prescription, Patient patient) + /** + * Generates and saves a prescription HTML file. + * + * @param prescription The prescription to convert to HTML. + * @param patient The patient associated with the prescription. + * @throws UnloadedStorageException If storage is not initialized or HTML file cannot be written. + */ + public static void savePrescriptionHtml(Prescription prescription, Patient patient) throws UnloadedStorageException { if (directoryPath == null || prescriptionDirPath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); @@ -198,7 +250,7 @@ public static void savePrescriptionHtml(Prescription prescription, Patient patie dir.mkdirs(); } - String fileName = "prescription_" + prescription.getPatientId() + "_" + String fileName = "prescription_" + prescription.getPatientId() + "_" + prescription.getPrescriptionId().split("-")[1] + ".html"; String filePath = prescriptionDirPath + File.separator + fileName; @@ -208,4 +260,4 @@ public static void savePrescriptionHtml(Prescription prescription, Patient patie throw new UnloadedStorageException("Unable to generate HTML prescription: " + e.getMessage()); } } -} +} From 4d38f2dfabb11227a00de2ef8794e087cb85dc96 Mon Sep 17 00:00:00 2001 From: judHoka Date: Tue, 8 Apr 2025 00:29:42 +0800 Subject: [PATCH 173/203] Checkstyle finishes --- .../java/command/DeletePatientCommand.java | 2 +- .../exception/PatientNotFoundException.java | 2 +- src/main/java/manager/Patient.java | 99 ++++++++++++++----- 3 files changed, 79 insertions(+), 24 deletions(-) diff --git a/src/main/java/command/DeletePatientCommand.java b/src/main/java/command/DeletePatientCommand.java index c62c360949..7283e8c565 100644 --- a/src/main/java/command/DeletePatientCommand.java +++ b/src/main/java/command/DeletePatientCommand.java @@ -33,4 +33,4 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep Patient removedPatient = manager.deletePatient(nric); ui.showPatientDeleted(removedPatient, nric); } -} \ No newline at end of file +} diff --git a/src/main/java/exception/PatientNotFoundException.java b/src/main/java/exception/PatientNotFoundException.java index 8a89903be6..90244c800d 100644 --- a/src/main/java/exception/PatientNotFoundException.java +++ b/src/main/java/exception/PatientNotFoundException.java @@ -13,4 +13,4 @@ public class PatientNotFoundException extends Exception { public PatientNotFoundException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/manager/Patient.java b/src/main/java/manager/Patient.java index 75bb779fb5..d9d7628bff 100644 --- a/src/main/java/manager/Patient.java +++ b/src/main/java/manager/Patient.java @@ -89,38 +89,85 @@ public static Patient parseLoadPatient(String line) throws InvalidInputFormatExc return new Patient(id, name, dobStr, gender, address, contact, medHistory); } - /** @return the patient NRIC */ - public String getId() { return id; } + /** + * @return the patient NRIC + */ + public String getId() { + return id; + } + + /** + * @return the patient name + */ + public String getName() { + return name; + } + + /** + * @return the patient's date of birth + */ + public LocalDate getDob() { + return dob; + } - /** @return the patient name */ - public String getName() { return name; } + /** + * @return the patient's gender + */ + public String getGender() { + return gender; + } + + /** + * @return the patient's address + */ + public String getAddress() { + return address; + } + + /** + * @return the patient's contact number + */ + public String getContactInfo() { + return contactInfo; + } - /** @return the patient's date of birth */ - public LocalDate getDob() { return dob; } + /** + * @return the patient's medical history list + */ + public List getMedicalHistory() { + return medicalHistory; + } - /** @return the patient's gender */ - public String getGender() { return gender; } + public void setName(String name) { + this.name = name; + } - /** @return the patient's address */ - public String getAddress() { return address; } + public void setDob(LocalDate dob) { + this.dob = dob; + } - /** @return the patient's contact number */ - public String getContactInfo() { return contactInfo; } + public void setContactInfo(String contactInfo) { + this.contactInfo = contactInfo; + } - /** @return the patient's medical history list */ - public List getMedicalHistory() { return medicalHistory; } + public void setGender(String gender) { + this.gender = gender; + } - public void setName(String name) { this.name = name; } - public void setDob(LocalDate dob) { this.dob = dob; } - public void setContactInfo(String contactInfo) { this.contactInfo = contactInfo; } - public void setGender(String gender) { this.gender = gender; } - public void setAddress(String address) { this.address = address; } + public void setAddress(String address) { + this.address = address; + } - /** @return the patient's list of appointments */ - public List getAppointments() { return appointments; } + /** + * @return the patient's list of appointments + */ + public List getAppointments() { + return appointments; + } /** * Adds an appointment to the patient. + * * @param appointment Appointment to be added. */ public void addAppointment(Appointment appointment) { @@ -131,6 +178,7 @@ public void addAppointment(Appointment appointment) { /** * Removes an appointment from the patient by appointment ID. + * * @param apptId ID of the appointment to be removed. */ public void deleteAppointment(String apptId) { @@ -145,6 +193,7 @@ public void deleteAppointment(String apptId) { /** * Returns a string representation of the patient for display. + * * @return Formatted patient details and appointments. */ @Override @@ -180,6 +229,7 @@ public String toString() { /** * Returns a formatted string for list display. + * * @return Compact patient details for list view. */ public String toStringForListView() { @@ -219,6 +269,7 @@ public String toStringForListView() { /** * Returns a pipe-delimited string for file storage. + * * @return File format string. */ public String toFileFormat() { @@ -229,6 +280,7 @@ public String toFileFormat() { /** * Validates and parses the NRIC format. + * * @param ic The NRIC string to validate. * @return A validated NRIC string. * @throws InvalidInputFormatException If the NRIC format is invalid. @@ -255,12 +307,13 @@ private String parseValidIC(String ic) throws InvalidInputFormatException { /** * Validates the gender input. + * * @param gender Gender string to validate. * @return Validated gender. * @throws InvalidInputFormatException If the gender is not M or F. */ private String checkGender(String gender) throws InvalidInputFormatException { - if(gender.equals("M") || gender.equals("F")) { + if (gender.equals("M") || gender.equals("F")) { return gender; } else { throw new InvalidInputFormatException("The gender must be either M (male) or F (female)"); @@ -269,6 +322,7 @@ private String checkGender(String gender) throws InvalidInputFormatException { /** * Parses and validates the date of birth string. + * * @param dobStr Date of birth in yyyy-MM-dd format. * @return Parsed LocalDate object. * @throws InvalidInputFormatException If format is incorrect or date is in the future. @@ -288,6 +342,7 @@ private LocalDate parseAndValidateDob(String dobStr) throws InvalidInputFormatEx /** * Validates and parses the contact number. + * * @param contactInfo Contact number string. * @return Validated contact number. * @throws InvalidInputFormatException If not an 8-digit number. From 51bae95a069d460025cb3a3ddd639ac0766ccf1d Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 01:02:28 +0800 Subject: [PATCH 174/203] Add JavaDoc for non-trivial methods following coding standards --- src/main/java/ClinicEase.java | 27 ++++ src/main/java/manager/ManagementSystem.java | 159 +++++++++++++------- src/main/java/manager/Prescription.java | 82 ++++++++++ 3 files changed, 210 insertions(+), 58 deletions(-) diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index 1388e0c2af..a7b8ee69a5 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -16,12 +16,26 @@ import java.util.ArrayList; import java.util.List; +/** + * Main class of the ClinicEase application, responsible for initializing + * components and driving the command execution loop. + * ClinicEase is a desktop application designed for clinic management, + * providing a command-line interface for managing patients, appointments, + * and prescriptions. + */ public class ClinicEase { private ManagementSystem manager; private Ui ui; private Storage storage; + /** + * Constructs a new ClinicEase application with a specified storage location. + * Initializes the UI, storage, and management system components. + * Attempts to load existing data from storage files if available. + * + * @param filePath The directory path where data files will be stored + */ public ClinicEase(String filePath) { assert filePath != null : "File path cannot be null"; this.ui = new Ui(); @@ -40,6 +54,12 @@ public ClinicEase(String filePath) { } } + /** + * Starts the application's main execution loop. + * Displays welcome message, continuously reads user commands, + * executes them until an exit command is received. + * Handles exceptions by displaying appropriate error messages. + */ public void run() { ui.showWelcome(); boolean running = true; @@ -60,6 +80,13 @@ public void run() { } } + /** + * The entry point of the application. + * Creates a new ClinicEase instance with storage in the "data" directory + * and starts the application. + * + * @param args Command line arguments (not used) + */ public static void main(String[] args) { new ClinicEase("data").run(); } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 64a8cbf121..526e4c8b4f 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -52,6 +52,15 @@ public List getAppointments() { return appointments; } + /** + * Adds a new patient to the system. + * Checks for duplicate NRICs before adding the patient. + * Saves the updated patient list to storage after successful addition. + * + * @param patient The patient to add + * @throws DuplicatePatientIDException If a patient with the same NRIC already exists + * @throws UnloadedStorageException If there was an error saving to storage + */ public void addPatient(Patient patient) throws DuplicatePatientIDException, UnloadedStorageException { assert patient != null : "Patient cannot be null"; assert patients != null : "Patient list cannot be null"; @@ -66,10 +75,19 @@ public void addPatient(Patient patient) throws DuplicatePatientIDException, Unlo Storage.savePatients(patients); } + /** + * Deletes a patient from the system by NRIC. + * Also removes all appointments associated with the deleted patient. + * Saves the updated patient and appointment lists to storage after successful deletion. + * + * @param nric The NRIC of the patient to delete + * @return The deleted Patient object, or null if no patient was found with the given NRIC + * @throws UnloadedStorageException If there was an error saving to storage + */ public Patient deletePatient(String nric) throws UnloadedStorageException { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; assert patients != null : "Patient list cannot be null"; - + for (Patient patient : patients) { if (patient.getId().equals(nric)) { patients.remove(patient); @@ -109,19 +127,18 @@ public Patient viewPatient(String nric) { /** - * Edits the information of an existing patient. Updates only the fields - * that are not null or blank in the provided parameters. + * Edits an existing patient's information. + * Updates only the fields that are provided (non-null). + * Saves changes to storage after successful update. * - * @param nric The NRIC of the patient to edit. - * @param newName The new name to set. (Pass null or blank to leave it unchanged) - * @param newDob The new date of birth in "yyyy-MM-dd" format. (null/blank to skip) - * @param newGender The new gender (e.g., "M" or "F"). (null/blank to skip) - * @param newAddress The new address. (null/blank to skip) - * @param newPhone The new phone number. (null/blank to skip) - * @throws UnloadedStorageException If saving the edited patient data to storage fails. - * @throws PatientNotFoundException If no patient is found with the given NRIC. - * @throws InvalidInputFormatException If the newDob string is invalid or - * if the parsed date is after the current date. + * @param nric The NRIC of the patient to edit (cannot be changed) + * @param newName New name for the patient, or null to keep unchanged + * @param newDob New date of birth, or null to keep unchanged + * @param newGender New gender, or null to keep unchanged + * @param newAddress New address, or null to keep unchanged + * @param newPhone New phone number, or null to keep unchanged + * @throws UnloadedStorageException If there was an error saving to storage + * @throws PatientNotFoundException If no patient with the given NRIC exists */ //@@author jyukuan public void editPatient(String nric, String newName, String newDob, String newGender, String newAddress, @@ -165,21 +182,27 @@ public void editPatient(String nric, String newName, String newDob, String newGe } /** - * Stores new medical history entries for the patient with the specified NRIC. - * Entries can be comma-separated, and each unique entry is appended to - * the patient's existing medical history if not already present. + * Stores new medical history entries for a patient. + * If an entry already exists in the patient's history, it will not be duplicated. + * Saves the updated patient list to storage. * - * @param nric The NRIC of the patient whose medical history is to be updated. - * @param medHistory A comma-separated list of new medical history entries. - * @throws PatientNotFoundException if no patient matches the given NRIC. - * @throws UnloadedStorageException if saving to storage fails. + * @param nric The NRIC of the patient + * @param medHistory Comma-separated medical history entries to add + * @throws PatientNotFoundException If no patient with the given NRIC exists + * @throws UnloadedStorageException If there was an error saving to storage */ public void storeMedicalHistory(String nric, String medHistory) throws PatientNotFoundException, UnloadedStorageException { Patient existingPatient = findPatientByNric(nric); + assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; + assert medHistory != null && !medHistory.isBlank() : "Medical history must not be null or blank"; + + if (existingPatient == null) { - throw new PatientNotFoundException("Patient with NRIC " + nric + " not found. Cannot add history."); + throw new PatientNotFoundException("Patient with NRIC not found. Patient's history can not be added"); + } else { + Ui.showLine(); } String[] historyEntries = medHistory.split(",\\s*"); @@ -188,10 +211,8 @@ public void storeMedicalHistory(String nric, String medHistory) throws PatientNo existingPatient.getMedicalHistory().add(entry.trim()); } } - Storage.savePatients(patients); - Ui.showLine(); - System.out.println("Medical history added for " + existingPatient.getName() + " (NRIC: " + nric + ")."); + System.out.println("Medical history added for patient with NRIC: " + nric + "."); Ui.showLine(); } @@ -306,18 +327,27 @@ private List findPatientsByName(String name) { } //@@author chwenyee + /** + * Adds a new appointment to the system. + * Checks for appointment clashes (within 1 hour) and verifies the patient exists. + * Saves the updated appointment list to storage after successful addition. + * + * @param appointment The appointment to add + * @throws UnloadedStorageException If there was an error saving to storage + * @throws PatientNotFoundException If the patient associated with the appointment doesn't exist + * @throws AppointmentClashException If the appointment clashes with an existing appointment + */ public void addAppointment(Appointment appointment) throws UnloadedStorageException, PatientNotFoundException, AppointmentClashException { assert appointment != null : "Appointment cannot be null"; assert patients != null : "Patient list cannot be null"; // Check if there is any scheduled appointment in the list clashing with this newly-added one - for (Appointment appointmentInList : appointments) { + for (Appointment appointmentInList : appointments) { long timeDiff = Math.abs(Duration.between(appointmentInList.getDateTime(), appointment.getDateTime()).toMinutes()); - if (timeDiff <= 30) { - throw new AppointmentClashException - ("This appointment clashes with another scheduled within 30 minutes."); + if (timeDiff < 60) { + throw new AppointmentClashException("This appointment clashes with another scheduled within 1 hour."); } } @@ -331,10 +361,19 @@ public void addAppointment(Appointment appointment) throws UnloadedStorageExcept Storage.saveAppointments(appointments); } + /** + * Deletes an appointment from the system by appointment ID. + * Also removes the appointment from the patient's appointment list. + * Saves the updated appointment list to storage after successful deletion. + * + * @param apptId The ID of the appointment to delete + * @return The deleted Appointment object, or null if no appointment was found with the given ID + * @throws UnloadedStorageException If there was an error saving to storage + */ public Appointment deleteAppointment(String apptId) throws UnloadedStorageException { assert apptId != null && !apptId.isBlank() : "Appointment ID cannot be null or blank"; assert appointments != null : "Appointment list cannot be null"; - + for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { appointments.remove(appointment); @@ -359,17 +398,13 @@ public List sortAppointmentsById(List appointments) { return appointments; } - //@@author dylancmznus /** - * Marks the appointment with the given appointment ID as done. + * Marks an appointment as completed. + * Updates the appointment status and saves changes to storage. * - *

    The method searches through the list of appointments to find the one that matches - * the given ID (case-insensitive). If found, it marks the appointment as done and saves - * the updated list to storage.

    - * - * @param apptId The ID of the appointment to be marked as done. - * @return The Appointment object that was marked, or null if no match is found. - * @throws UnloadedStorageException If the storage system has not been properly initialized. + * @param apptId The ID of the appointment to mark as done + * @return The updated appointment, or null if no appointment with the given ID was found + * @throws UnloadedStorageException If there was an error saving to storage */ public Appointment markAppointment(String apptId) throws UnloadedStorageException { for (Appointment appointment : appointments) { @@ -383,15 +418,12 @@ public Appointment markAppointment(String apptId) throws UnloadedStorageExceptio } /** - * Unmarks the appointment with the given appointment ID as not done. - * - *

    This method searches through the list of appointments to find the one that matches - * the given ID (case-insensitive). If found, it unmarks the appointment and saves - * the updated list to storage.

    + * Unmarks a previously completed appointment. + * Updates the appointment status and saves changes to storage. * - * @param apptId The ID of the appointment to be unmarked. - * @return The Appointment object that was unmarked, or null if no match is found. - * @throws UnloadedStorageException If the storage system has not been properly initialized. + * @param apptId The ID of the appointment to unmark + * @return The updated appointment, or null if no appointment with the given ID was found + * @throws UnloadedStorageException If there was an error saving to storage */ public Appointment unmarkAppointment(String apptId) throws UnloadedStorageException { for (Appointment appointment : appointments) { @@ -430,11 +462,22 @@ public List getPrescriptions() { } //@@author Basudeb2005 - public Prescription addPrescription(Prescription prescription) + /** + * Adds a new prescription to the system. + * Verifies the patient exists before adding the prescription. + * Generates a unique prescription ID based on patient ID and prescription count. + * Saves the updated prescription list to storage. + * + * @param prescription The prescription to add (without final ID) + * @return The newly created prescription with final ID + * @throws IllegalArgumentException If the patient doesn't exist + * @throws UnloadedStorageException If there was an error saving to storage + */ + public Prescription addPrescription(Prescription prescription) throws IllegalArgumentException, UnloadedStorageException { assert prescription != null : "Prescription cannot be null"; assert patients != null : "Patient list cannot be null"; - + Patient patient = findPatientByNric(prescription.getPatientId()); if (patient == null) { throw new IllegalArgumentException("Patient with NRIC: " + prescription.getPatientId() + " not found"); @@ -447,22 +490,22 @@ public Prescription addPrescription(Prescription prescription) prescriptionCount++; } } - + String prescriptionId = prescription.getPatientId() + "-" + prescriptionCount; - + // Create a new prescription with updated ID Prescription newPrescription = new Prescription( - prescription.getPatientId(), - prescriptionId, - prescription.getTimestamp(), - prescription.getSymptoms(), - prescription.getMedicines(), - prescription.getNotes() + prescription.getPatientId(), + prescriptionId, + prescription.getTimestamp(), + prescription.getSymptoms(), + prescription.getMedicines(), + prescription.getNotes() ); - + prescriptions.add(newPrescription); Storage.savePrescriptions(prescriptions); - + return newPrescription; } diff --git a/src/main/java/manager/Prescription.java b/src/main/java/manager/Prescription.java index b6f3496c1a..24235dcaa4 100644 --- a/src/main/java/manager/Prescription.java +++ b/src/main/java/manager/Prescription.java @@ -6,6 +6,11 @@ import java.util.Arrays; import java.util.List; +/** + * Represents a medical prescription in the clinic management system. + * Contains information about the patient, symptoms, prescribed medicines, + * and additional notes provided by the doctor. + */ //@@author Basudeb2005 public class Prescription { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); @@ -17,6 +22,15 @@ public class Prescription { private final List medicines; private final String notes; + /** + * Constructs a new Prescription with the current timestamp. + * This constructor is used when creating a new prescription in the system. + * + * @param patientId The ID of the patient this prescription is for + * @param symptoms List of patient symptoms + * @param medicines List of prescribed medicines + * @param notes Additional instructions or notes for the patient + */ public Prescription(String patientId, List symptoms, List medicines, String notes) { this.patientId = patientId; this.timestamp = LocalDateTime.now(); @@ -26,6 +40,17 @@ public Prescription(String patientId, List symptoms, List medici this.notes = notes; } + /** + * Constructs a Prescription with specified prescriptionId and timestamp. + * This constructor is primarily used when loading prescriptions from storage. + * + * @param patientId The ID of the patient this prescription is for + * @param prescriptionId The unique identifier for this prescription + * @param timestamp The date and time when the prescription was created + * @param symptoms List of patient symptoms + * @param medicines List of prescribed medicines + * @param notes Additional instructions or notes for the patient + */ public Prescription(String patientId, String prescriptionId, LocalDateTime timestamp, List symptoms, List medicines, String notes) { this.patientId = patientId; @@ -36,30 +61,66 @@ public Prescription(String patientId, String prescriptionId, LocalDateTime times this.notes = notes; } + /** + * Gets the patient ID associated with this prescription. + * + * @return The patient's unique identifier + */ public String getPatientId() { return patientId; } + /** + * Gets the unique identifier for this prescription. + * + * @return The prescription's ID in format "patientID-number" + */ public String getPrescriptionId() { return prescriptionId; } + /** + * Gets the timestamp when this prescription was created. + * + * @return LocalDateTime representing when the prescription was written + */ public LocalDateTime getTimestamp() { return timestamp; } + /** + * Gets the list of symptoms recorded for this prescription. + * + * @return List of symptom descriptions + */ public List getSymptoms() { return symptoms; } + /** + * Gets the list of medicines prescribed. + * + * @return List of medicine names and dosage instructions + */ public List getMedicines() { return medicines; } + /** + * Gets any additional notes or instructions for this prescription. + * + * @return Notes string or empty if no notes were provided + */ public String getNotes() { return notes; } + /** + * Returns a string representation of the prescription with formatted details. + * Includes prescription ID, timestamp, patient ID, and lists of symptoms and medicines. + * + * @return A formatted multi-line string representation of the prescription + */ @Override public String toString() { StringBuilder symptomsStr = new StringBuilder(); @@ -82,6 +143,12 @@ public String toString() { patientId, symptomsStr.toString(), medicinesStr.toString(), notes); } + /** + * Converts the prescription to a storage-friendly string format. + * Uses pipe-delimited format to store all prescription attributes. + * + * @return A string representation suitable for file storage + */ public String toFileFormat() { return String.join("|", prescriptionId, @@ -92,6 +159,13 @@ public String toFileFormat() { notes); } + /** + * Creates a Prescription object from a storage file entry. + * Parses the pipe-delimited string from storage into a Prescription object. + * + * @param fileEntry The string from the storage file + * @return A new Prescription object with the stored data + */ public static Prescription fromFileFormat(String fileEntry) { String[] parts = fileEntry.split("\\|"); String prescriptionId = parts[0]; @@ -104,6 +178,14 @@ public static Prescription fromFileFormat(String fileEntry) { return new Prescription(patientId, prescriptionId, timestamp, symptoms, medicines, notes); } + /** + * Generates a formatted HTML document for the prescription. + * Creates a professional-looking prescription that can be printed. + * Includes patient details if provided, symptoms, medicines, and notes. + * + * @param patient The Patient object (can be null if patient details unavailable) + * @return A string containing HTML markup for the prescription + */ public String generateHtml(Patient patient) { StringBuilder html = new StringBuilder(); html.append("\n") From 487e9816d059e82a707079c6c4eda02b4e513cf6 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 01:16:17 +0800 Subject: [PATCH 175/203] Add JavaDoc to Command classes --- .../java/command/AddPrescriptionCommand.java | 24 +++++++++++++++++++ src/main/java/command/Command.java | 24 +++++++++++++++++++ .../command/ViewAllPrescriptionsCommand.java | 23 ++++++++++++++++++ .../java/command/ViewPrescriptionCommand.java | 24 +++++++++++++++++++ 4 files changed, 95 insertions(+) diff --git a/src/main/java/command/AddPrescriptionCommand.java b/src/main/java/command/AddPrescriptionCommand.java index 01d0e70bbf..dfdffd3773 100644 --- a/src/main/java/command/AddPrescriptionCommand.java +++ b/src/main/java/command/AddPrescriptionCommand.java @@ -5,14 +5,33 @@ import manager.Prescription; import miscellaneous.Ui; +/** + * Command to add a new prescription to the system. + * Handles the creation of a new prescription and displays + * feedback about the operation to the user. + */ //@@author Basudeb2005 public class AddPrescriptionCommand extends Command { private final Prescription prescription; + /** + * Constructs an AddPrescriptionCommand with the specified prescription. + * + * @param prescription The prescription to be added to the system + */ public AddPrescriptionCommand(Prescription prescription) { this.prescription = prescription; } + /** + * Executes the add prescription command. + * Adds the prescription to the management system and displays confirmation. + * Shows error message if the patient ID doesn't exist. + * + * @param manager The management system that handles the data + * @param ui The user interface to display results + * @throws UnloadedStorageException If there was an error saving to storage + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { try { @@ -30,6 +49,11 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep } } + /** + * Returns whether this command should exit the application. + * + * @return false (this command does not exit the application) + */ @Override public boolean isExit() { return false; diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 95d4326df2..d79351198c 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -8,12 +8,36 @@ import manager.ManagementSystem; import miscellaneous.Ui; +/** + * Abstract class representing a command in the clinic management system. + * All commands must extend this class and implement the execute method. + * Follows the Command pattern to encapsulate requests as objects. + */ public abstract class Command { + /** + * Executes the command with the given management system and UI. + * Each subclass must implement this method with its specific behavior. + * + * @param manager The management system that provides operations on data + * @param ui The user interface to display results + * @throws DuplicatePatientIDException If a patient with the same ID already exists + * @throws UnloadedStorageException If there was an error with storage operations + * @throws PatientNotFoundException If a requested patient was not found + * @throws AppointmentClashException If an appointment conflicts with existing ones + * @throws InvalidInputFormatException If the input format is invalid + */ public abstract void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException, PatientNotFoundException, AppointmentClashException, InvalidInputFormatException; + /** + * Returns whether this command should exit the application. + * Default implementation returns false. + * Can be overridden by commands that should exit the application. + * + * @return true if the command should cause the application to exit, false otherwise + */ public boolean isExit() { return false; } diff --git a/src/main/java/command/ViewAllPrescriptionsCommand.java b/src/main/java/command/ViewAllPrescriptionsCommand.java index bc33309eb1..232900ca25 100644 --- a/src/main/java/command/ViewAllPrescriptionsCommand.java +++ b/src/main/java/command/ViewAllPrescriptionsCommand.java @@ -8,14 +8,32 @@ import java.util.List; +/** + * Command to view all prescriptions for a specific patient. + * Lists all prescriptions with their basic details for the given patient ID. + */ //@@author Basudeb2005 public class ViewAllPrescriptionsCommand extends Command { private final String patientId; + /** + * Constructs a ViewAllPrescriptionsCommand with the specified patient ID. + * + * @param patientId The ID of the patient whose prescriptions will be displayed + */ public ViewAllPrescriptionsCommand(String patientId) { this.patientId = patientId; } + /** + * Executes the view all prescriptions command. + * Retrieves and displays all prescriptions associated with the specified patient. + * Shows an appropriate message if no prescriptions exist or if the patient is not found. + * + * @param manager The management system that handles the data + * @param ui The user interface to display results + * @throws UnloadedStorageException If there was an error with storage operations + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Patient patient = manager.viewPatient(patientId); @@ -58,6 +76,11 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep ui.showLine(); } + /** + * Returns whether this command should exit the application. + * + * @return false (this command does not exit the application) + */ @Override public boolean isExit() { return false; diff --git a/src/main/java/command/ViewPrescriptionCommand.java b/src/main/java/command/ViewPrescriptionCommand.java index d6dea84dff..fdb778beb2 100644 --- a/src/main/java/command/ViewPrescriptionCommand.java +++ b/src/main/java/command/ViewPrescriptionCommand.java @@ -9,14 +9,33 @@ import java.io.File; +/** + * Command to view a specific prescription and generate its HTML document. + * Displays detailed prescription information and creates a printable + * HTML version of the prescription. + */ //@@author Basudeb2005 public class ViewPrescriptionCommand extends Command { private final String prescriptionId; + /** + * Constructs a ViewPrescriptionCommand with the specified prescription ID. + * + * @param prescriptionId The ID of the prescription to view + */ public ViewPrescriptionCommand(String prescriptionId) { this.prescriptionId = prescriptionId; } + /** + * Executes the view prescription command. + * Retrieves the prescription with the specified ID and displays its details. + * Also generates an HTML file for printing the prescription. + * + * @param manager The management system that handles the data + * @param ui The user interface to display results + * @throws UnloadedStorageException If there was an error with storage operations + */ @Override public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageException { Prescription prescription = manager.getPrescriptionById(prescriptionId); @@ -47,6 +66,11 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep ui.showLine(); } + /** + * Returns whether this command should exit the application. + * + * @return false (this command does not exit the application) + */ @Override public boolean isExit() { return false; From af8a63b3d869b47e5fb803e0594dda261113cf29 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 01:26:02 +0800 Subject: [PATCH 176/203] Add JavaDoc to Storage class and its methods --- src/main/java/storage/Storage.java | 71 +++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 32f4d8a3e9..6b93b11f4d 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -15,6 +15,11 @@ import java.util.List; import java.util.Scanner; +/** + * Handles data persistence for the clinic management system. + * Provides methods for saving and loading patients, appointments, prescriptions, + * and generating HTML prescription documents. + */ public class Storage { private static String directoryPath; private static String patientFilePath; @@ -23,6 +28,12 @@ public class Storage { private static String prescriptionDirPath; private static Patient patients; + /** + * Constructs a Storage object with specified directory. + * Initializes file paths for patients, appointments, and prescriptions. + * + * @param directory The root directory for storage files + */ public Storage(String directory) { directoryPath = directory; patientFilePath = directory + File.separator + "patient_data.txt"; @@ -31,6 +42,14 @@ public Storage(String directory) { prescriptionDirPath = directory + File.separator + "prescriptions"; } + /** + * Saves patients to file storage. + * Writes each patient in the list to the patient file in a formatted string. + * + * @param patientList The list of patients to save + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error saving to file + */ public static void savePatients(List patientList) throws UnloadedStorageException { if (directoryPath == null || patientFilePath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); @@ -51,6 +70,14 @@ public static void savePatients(List patientList) throws UnloadedStorag } } + /** + * Loads patients from file storage. + * Reads and parses patient data from the patient file. + * + * @return A list of Patient objects loaded from file + * @throws UnloadedStorageException If there was an error reading from the file + * or if the data could not be properly parsed + */ public static List loadPatients() throws UnloadedStorageException { List patients = new ArrayList<>(); File file = new File(patientFilePath); @@ -73,6 +100,14 @@ public static List loadPatients() throws UnloadedStorageException { return patients; } + /** + * Saves appointments to file storage. + * Writes the running ID counter and each appointment in the list to the appointment file. + * + * @param appointmentList The list of appointments to save + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error saving to file + */ public static void saveAppointments(List appointmentList) throws UnloadedStorageException { if (directoryPath == null || appointmentFilePath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); @@ -96,7 +131,16 @@ public static void saveAppointments(List appointmentList) throws Un } } - + /** + * Loads appointments from file storage. + * Reads and parses appointment data from the appointment file. + * Also adds appointments to their respective patients. + * + * @param system The management system used to find patients for appointment association + * @return A list of Appointment objects loaded from file + * @throws UnloadedStorageException If there was an error reading from the file + * or if the data could not be properly parsed + */ public static List loadAppointments(ManagementSystem system) throws UnloadedStorageException { List appointments = new ArrayList<>(); File file = new File(appointmentFilePath); @@ -142,6 +186,14 @@ public static List loadAppointments(ManagementSystem system) throws return appointments; } + /** + * Saves prescriptions to file storage. + * Writes each prescription in the list to the prescription file in a formatted string. + * + * @param prescriptionList The list of prescriptions to save + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error saving to file + */ public static void savePrescriptions(List prescriptionList) throws UnloadedStorageException { if (directoryPath == null || prescriptionFilePath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); @@ -162,6 +214,14 @@ public static void savePrescriptions(List prescriptionList) throws } } + /** + * Loads prescriptions from file storage. + * Reads and parses prescription data from the prescription file. + * + * @return A list of Prescription objects loaded from file + * @throws UnloadedStorageException If there was an error reading from the file + * or if the data could not be properly parsed + */ public static List loadPrescriptions() throws UnloadedStorageException { List prescriptions = new ArrayList<>(); File file = new File(prescriptionFilePath); @@ -187,6 +247,15 @@ public static List loadPrescriptions() throws UnloadedStorageExcep return prescriptions; } + /** + * Generates and saves an HTML representation of a prescription. + * Creates a formatted HTML file that can be viewed in a browser and printed. + * + * @param prescription The prescription to generate HTML for + * @param patient The patient associated with the prescription, may be null + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error writing the HTML file + */ public static void savePrescriptionHtml(Prescription prescription, Patient patient) throws UnloadedStorageException { if (directoryPath == null || prescriptionDirPath == null) { From 6c1875620c8e230c5bc333a411b173814e356f6b Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 01:42:21 +0800 Subject: [PATCH 177/203] Add JavaDoc to remaining classes and methods in the codebase. --- .../DuplicatePatientIDException.java | 11 +++ .../exception/PatientNotFoundException.java | 11 +++ .../exception/UnloadedStorageException.java | 11 +++ src/main/java/manager/ManagementSystem.java | 80 +++++++++++++++++-- src/main/java/miscellaneous/Parser.java | 27 +++++++ src/main/java/miscellaneous/Ui.java | 6 ++ 6 files changed, 140 insertions(+), 6 deletions(-) diff --git a/src/main/java/exception/DuplicatePatientIDException.java b/src/main/java/exception/DuplicatePatientIDException.java index 8cfa91ffd3..eb8f0dee20 100644 --- a/src/main/java/exception/DuplicatePatientIDException.java +++ b/src/main/java/exception/DuplicatePatientIDException.java @@ -1,6 +1,17 @@ package exception; +/** + * Represents an exception specific to duplicate patient IDs. + * This exception is thrown when attempting to add a patient with an ID that already + * exists in the system. + */ public class DuplicatePatientIDException extends Exception { + + /** + * Constructs a DuplicatePatientIDException with the specified detail message. + * + * @param message The detail message explaining the duplicate ID issue + */ public DuplicatePatientIDException(String message) { super(message); } diff --git a/src/main/java/exception/PatientNotFoundException.java b/src/main/java/exception/PatientNotFoundException.java index d55d497689..c2d8f88174 100644 --- a/src/main/java/exception/PatientNotFoundException.java +++ b/src/main/java/exception/PatientNotFoundException.java @@ -1,6 +1,17 @@ package exception; +/** + * Represents an exception specific to a patient not being found in the system. + * This exception is thrown when attempting to perform an operation on a patient + * that does not exist in the database. + */ public class PatientNotFoundException extends Exception { + + /** + * Constructs a PatientNotFoundException with the specified detail message. + * + * @param message The detail message explaining which patient was not found + */ public PatientNotFoundException(String message) { super(message); } diff --git a/src/main/java/exception/UnloadedStorageException.java b/src/main/java/exception/UnloadedStorageException.java index bc2dc8b024..21ec7ea6be 100644 --- a/src/main/java/exception/UnloadedStorageException.java +++ b/src/main/java/exception/UnloadedStorageException.java @@ -1,6 +1,17 @@ package exception; +/** + * Represents an exception specific to storage access failure. + * This exception is thrown when the system fails to load or save data to/from storage, + * typically due to file system issues or corrupt data. + */ public class UnloadedStorageException extends Exception{ + + /** + * Constructs an UnloadedStorageException with the specified detail message. + * + * @param message The detail message explaining the storage failure + */ public UnloadedStorageException (String message) { super(message); } diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 526e4c8b4f..ad13f2a51f 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -16,11 +16,23 @@ import java.util.Comparator; import java.util.List; +/** + * The ManagementSystem class handles all business logic for the clinic management system. + * It manages patients, appointments, and prescriptions, and coordinates with the storage system. + * This class serves as the central component that maintains the state of the application + * and provides operations to access and modify that state. + */ public class ManagementSystem { private final List appointments; private final List patients; private final List prescriptions; + /** + * Constructs a ManagementSystem with patients and appointments but no prescriptions. + * + * @param loadedPatients The list of patients to initialize with + * @param loadedAppointments The list of appointments to initialize with + */ public ManagementSystem(List loadedPatients, List loadedAppointments) { assert loadedPatients != null : "Patient list cannot be null"; assert loadedAppointments != null : "Appointment list cannot be null"; @@ -29,6 +41,13 @@ public ManagementSystem(List loadedPatients, List loadedAp prescriptions = new ArrayList<>(); } + /** + * Constructs a ManagementSystem with patients, appointments, and prescriptions. + * + * @param loadedPatients The list of patients to initialize with + * @param loadedAppointments The list of appointments to initialize with + * @param loadedPrescriptions The list of prescriptions to initialize with + */ public ManagementSystem(List loadedPatients, List loadedAppointments, List loadedPrescriptions) { assert loadedPatients != null : "Patient list cannot be null"; @@ -39,15 +58,31 @@ public ManagementSystem(List loadedPatients, List loadedAp prescriptions = loadedPrescriptions; } + /** + * Gets the list of all patients in the system. + * + * @return List of all Patient objects + */ public List getPatients() { return patients; } + /** + * Updates the list of appointments in the system. + * Replaces the entire appointment list with the provided one. + * + * @param appointments The new list of appointments to set + */ public void setAppointments(List appointments) { this.appointments.clear(); this.appointments.addAll(appointments); } + /** + * Gets the list of all appointments in the system. + * + * @return List of all Appointment objects + */ public List getAppointments() { return appointments; } @@ -258,12 +293,13 @@ public void viewMedicalHistoryByName(String name) { } /** - * Replaces an existing medical history entry for a given patient with new content. - * - * @param nric The NRIC of the patient whose medical history will be edited. - * @param oldHistory The old history text to be replaced. - * @param newHistory The new history text to replace with. - * @throws UnloadedStorageException if saving the updated data to storage fails. + * Edits a specific medical history entry for a patient. + * Replaces the old history text with new text if the old text is found. + * + * @param nric The patient's unique identifier + * @param oldHistory The existing history text to be replaced + * @param newHistory The new history text to replace it with + * @throws UnloadedStorageException If there was an error saving to storage */ public void editPatientHistory(String nric, String oldHistory, String newHistory) throws UnloadedStorageException { @@ -388,11 +424,25 @@ public Appointment deleteAppointment(String apptId) throws UnloadedStorageExcept return null; } + /** + * Sorts a list of appointments by date and time. + * Orders appointments chronologically from earliest to latest. + * + * @param appointments The list of appointments to sort + * @return The sorted list of appointments + */ public List sortAppointmentsByDateTime(List appointments) { appointments.sort(Comparator.comparing(Appointment::getDateTime)); return appointments; } + /** + * Sorts a list of appointments by their ID. + * Orders appointments alphanumerically based on their appointment ID. + * + * @param appointments The list of appointments to sort + * @return The sorted list of appointments + */ public List sortAppointmentsById(List appointments) { appointments.sort(Comparator.comparing(Appointment::getId)); return appointments; @@ -457,6 +507,11 @@ public List findAppointmentsByNric(String nric) { } //@@author Basudeb2005 + /** + * Gets all prescriptions stored in the system. + * + * @return A list of all prescription records + */ public List getPrescriptions() { return prescriptions; } @@ -510,6 +565,13 @@ public Prescription addPrescription(Prescription prescription) } //@@author Basudeb2005 + /** + * Retrieves all prescriptions for a specific patient. + * Filters the complete prescription list to find those matching the provided patient ID. + * + * @param patientId The unique identifier of the patient + * @return A list of prescriptions for the specified patient (may be empty if none found) + */ public List getPrescriptionsForPatient(String patientId) { List patientPrescriptions = new ArrayList<>(); for (Prescription prescription : prescriptions) { @@ -521,6 +583,12 @@ public List getPrescriptionsForPatient(String patientId) { } //@@author Basudeb2005 + /** + * Finds a specific prescription by its unique identifier. + * + * @param prescriptionId The unique ID of the prescription to find + * @return The prescription if found, or null if no matching prescription exists + */ public Prescription getPrescriptionById(String prescriptionId) { for (Prescription prescription : prescriptions) { if (prescription.getPrescriptionId().equals(prescriptionId)) { diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 4db8976ece..033a732006 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -40,6 +40,8 @@ /** * Parses user input strings into executable Command objects. * Handles all command types and parameter extraction for the clinic management system. + * Provides methods for parsing different types of commands including patient, appointment, + * medical history, and prescription management. */ public class Parser { @@ -448,6 +450,15 @@ public static Appointment parseLoadAppointment(String line) { } } + /** + * Parses input for the add-prescription command. + * Extracts patient ID, symptoms, medicines, and optional notes from the input string. + * Symptoms and medicines are converted from comma-separated strings to lists. + * + * @param input The raw user input string for add-prescription command + * @return A new Prescription object with the parsed data + * @throws InvalidInputFormatException If required parameters are missing or format is incorrect + */ public static Prescription parseAddPrescription(String input) throws InvalidInputFormatException { String temp = input.replaceFirst("(?i)add-prescription\\s*", ""); @@ -486,6 +497,14 @@ public static Prescription parseAddPrescription(String input) throws InvalidInpu return new Prescription(patientId.trim(), symptomsList, medicinesList, finalNotes); } + /** + * Parses input for the view-all-prescriptions command. + * Extracts patient ID from the command string. + * + * @param input The raw user input string for view-all-prescriptions command + * @return The patient ID whose prescriptions should be viewed + * @throws InvalidInputFormatException If the input format is incorrect or no patient ID is provided + */ public static String parseViewAllPrescriptions(String input) throws InvalidInputFormatException { String trimmedInput = input.trim(); if (trimmedInput.equals("view-all-prescriptions") || trimmedInput.length() <= 22) { @@ -499,6 +518,14 @@ public static String parseViewAllPrescriptions(String input) throws InvalidInput return patientId; } + /** + * Parses input for the view-prescription command. + * Extracts prescription ID from the command string. + * + * @param input The raw user input string for view-prescription command + * @return The prescription ID to be viewed + * @throws InvalidInputFormatException If the input format is incorrect or no prescription ID is provided + */ public static String parseViewPrescription(String input) throws InvalidInputFormatException { String trimmedInput = input.trim(); if (trimmedInput.equals("view-prescription") || trimmedInput.length() <= 17) { diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index a8caeb911b..6957291881 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -8,6 +8,12 @@ import java.util.List; import java.util.Scanner; +/** + * The Ui class handles all user interaction for the clinic management system. + * It provides methods to display information to the user and collect input. + * This class is responsible for formatting output in a consistent way and + * providing a clean interface between the system and the user. + */ public class Ui { public static final String DIVIDER = "-".repeat(100); public static final DateTimeFormatter OUTPUT_TIME_FORMAT = DateTimeFormatter.ofPattern("h:mm a"); From cc35637e938ba5480d3672a8b86cf0f9d086a35c Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 03:59:34 +0800 Subject: [PATCH 178/203] Fix prescription storage issue --- src/main/java/manager/ManagementSystem.java | 19 +++- src/main/java/manager/Prescription.java | 13 ++- src/main/java/storage/Storage.java | 109 +++++++------------- src/test/java/manager/PrescriptionTest.java | 9 +- 4 files changed, 70 insertions(+), 80 deletions(-) diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index ad13f2a51f..8b54754aa7 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -525,7 +525,7 @@ public List getPrescriptions() { * * @param prescription The prescription to add (without final ID) * @return The newly created prescription with final ID - * @throws IllegalArgumentException If the patient doesn't exist + * @throws IllegalArgumentException If the patient doesn't exist or maximum prescriptions reached * @throws UnloadedStorageException If there was an error saving to storage */ public Prescription addPrescription(Prescription prescription) @@ -546,6 +546,14 @@ public Prescription addPrescription(Prescription prescription) } } + // Check for maximum prescription limit + final int MAX_PRESCRIPTIONS_PER_PATIENT = 100; // Reasonable upper limit + if (prescriptionCount > MAX_PRESCRIPTIONS_PER_PATIENT) { + throw new IllegalArgumentException("Maximum number of prescriptions (" + + MAX_PRESCRIPTIONS_PER_PATIENT + + ") reached for patient: " + prescription.getPatientId()); + } + String prescriptionId = prescription.getPatientId() + "-" + prescriptionCount; // Create a new prescription with updated ID @@ -559,7 +567,14 @@ public Prescription addPrescription(Prescription prescription) ); prescriptions.add(newPrescription); - Storage.savePrescriptions(prescriptions); + + try { + Storage.savePrescriptions(prescriptions); + } catch (UnloadedStorageException e) { + // Roll back the addition if saving fails + prescriptions.remove(newPrescription); + throw e; // Re-throw to notify the caller + } return newPrescription; } diff --git a/src/main/java/manager/Prescription.java b/src/main/java/manager/Prescription.java index 24235dcaa4..cd22e21c31 100644 --- a/src/main/java/manager/Prescription.java +++ b/src/main/java/manager/Prescription.java @@ -168,12 +168,19 @@ public String toFileFormat() { */ public static Prescription fromFileFormat(String fileEntry) { String[] parts = fileEntry.split("\\|"); + + // Check if we have sufficient parts to create a valid prescription + if (parts.length < 5) { + System.out.println("Warning: Invalid prescription format: " + fileEntry); + return null; + } + String prescriptionId = parts[0]; String patientId = parts[1]; LocalDateTime timestamp = LocalDateTime.parse(parts[2], DATE_TIME_FORMATTER); - List symptoms = Arrays.asList(parts[3].split(",")); - List medicines = Arrays.asList(parts[4].split(",")); - String notes = parts[5]; + List symptoms = parts[3].isEmpty() ? new ArrayList<>() : Arrays.asList(parts[3].split(",")); + List medicines = parts[4].isEmpty() ? new ArrayList<>() : Arrays.asList(parts[4].split(",")); + String notes = parts.length > 5 ? parts[5] : ""; // Default to empty string if notes aren't provided return new Prescription(patientId, prescriptionId, timestamp, symptoms, medicines, notes); } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index a77287cf21..2aa4b3bd90 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -16,14 +16,9 @@ import java.util.Scanner; /** -<<<<<<< HEAD - * Handles saving and loading of patient, appointment, and prescription data - * to and from the local file system. -======= * Handles data persistence for the clinic management system. * Provides methods for saving and loading patients, appointments, prescriptions, * and generating HTML prescription documents. ->>>>>>> AddJavaDoc */ public class Storage { private static String directoryPath; @@ -34,16 +29,10 @@ public class Storage { private static Patient patients; /** -<<<<<<< HEAD - * Initializes storage paths based on a given directory. - * - * @param directory The directory to store data files in. -======= * Constructs a Storage object with specified directory. * Initializes file paths for patients, appointments, and prescriptions. * * @param directory The root directory for storage files ->>>>>>> AddJavaDoc */ public Storage(String directory) { directoryPath = directory; @@ -54,19 +43,12 @@ public Storage(String directory) { } /** -<<<<<<< HEAD - * Saves a list of patients to file. - * - * @param patientList The list of patients to save. - * @throws UnloadedStorageException If storage is not initialized. -======= * Saves patients to file storage. * Writes each patient in the list to the patient file in a formatted string. * * @param patientList The list of patients to save * @throws UnloadedStorageException If the storage was not properly initialized * or if there was an error saving to file ->>>>>>> AddJavaDoc */ public static void savePatients(List patientList) throws UnloadedStorageException { if (directoryPath == null || patientFilePath == null) { @@ -89,19 +71,12 @@ public static void savePatients(List patientList) throws UnloadedStorag } /** -<<<<<<< HEAD - * Loads patients from file. - * - * @return A list of patients. - * @throws UnloadedStorageException If patient data cannot be loaded. -======= * Loads patients from file storage. * Reads and parses patient data from the patient file. * * @return A list of Patient objects loaded from file * @throws UnloadedStorageException If there was an error reading from the file * or if the data could not be properly parsed ->>>>>>> AddJavaDoc */ public static List loadPatients() throws UnloadedStorageException { List patients = new ArrayList<>(); @@ -126,19 +101,12 @@ public static List loadPatients() throws UnloadedStorageException { } /** -<<<<<<< HEAD - * Saves a list of appointments to file. - * - * @param appointmentList The list of appointments to save. - * @throws UnloadedStorageException If storage is not initialized. -======= * Saves appointments to file storage. * Writes the running ID counter and each appointment in the list to the appointment file. * * @param appointmentList The list of appointments to save * @throws UnloadedStorageException If the storage was not properly initialized * or if there was an error saving to file ->>>>>>> AddJavaDoc */ public static void saveAppointments(List appointmentList) throws UnloadedStorageException { if (directoryPath == null || appointmentFilePath == null) { @@ -164,13 +132,6 @@ public static void saveAppointments(List appointmentList) throws Un } /** -<<<<<<< HEAD - * Loads appointments from file and links them to their corresponding patients. - * - * @param system The management system containing the patient list. - * @return A list of appointments. - * @throws UnloadedStorageException If appointment data cannot be loaded. -======= * Loads appointments from file storage. * Reads and parses appointment data from the appointment file. * Also adds appointments to their respective patients. @@ -179,7 +140,6 @@ public static void saveAppointments(List appointmentList) throws Un * @return A list of Appointment objects loaded from file * @throws UnloadedStorageException If there was an error reading from the file * or if the data could not be properly parsed ->>>>>>> AddJavaDoc */ public static List loadAppointments(ManagementSystem system) throws UnloadedStorageException { List appointments = new ArrayList<>(); @@ -227,19 +187,12 @@ public static List loadAppointments(ManagementSystem system) throws } /** -<<<<<<< HEAD - * Saves a list of prescriptions to file. - * - * @param prescriptionList The list of prescriptions to save. - * @throws UnloadedStorageException If storage is not initialized. -======= * Saves prescriptions to file storage. * Writes each prescription in the list to the prescription file in a formatted string. * * @param prescriptionList The list of prescriptions to save * @throws UnloadedStorageException If the storage was not properly initialized * or if there was an error saving to file ->>>>>>> AddJavaDoc */ public static void savePrescriptions(List prescriptionList) throws UnloadedStorageException { if (directoryPath == null || prescriptionFilePath == null) { @@ -251,30 +204,40 @@ public static void savePrescriptions(List prescriptionList) throws dir.mkdirs(); } + // Create a backup of the existing file if it exists + File file = new File(prescriptionFilePath); + if (file.exists()) { + File backupFile = new File(prescriptionFilePath + ".bak"); + file.renameTo(backupFile); + } + try (BufferedWriter writer = new BufferedWriter(new FileWriter(prescriptionFilePath))) { + int savedCount = 0; for (Prescription prescription : prescriptionList) { - writer.write(prescription.toFileFormat()); - writer.newLine(); + if (prescription != null) { + try { + String fileFormat = prescription.toFileFormat(); + writer.write(fileFormat); + writer.newLine(); + savedCount++; + } catch (Exception e) { + System.out.println("Warning: Unable to save prescription: " + e.getMessage()); + } + } } + System.out.println("Saved " + savedCount + " prescriptions to storage."); } catch (IOException e) { - throw new UnloadedStorageException("Unable to save prescriptions!"); + throw new UnloadedStorageException("Unable to save prescriptions: " + e.getMessage()); } } /** -<<<<<<< HEAD - * Loads prescriptions from file. - * - * @return A list of prescriptions. - * @throws UnloadedStorageException If prescription data cannot be loaded. -======= * Loads prescriptions from file storage. * Reads and parses prescription data from the prescription file. * * @return A list of Prescription objects loaded from file * @throws UnloadedStorageException If there was an error reading from the file * or if the data could not be properly parsed ->>>>>>> AddJavaDoc */ public static List loadPrescriptions() throws UnloadedStorageException { List prescriptions = new ArrayList<>(); @@ -285,15 +248,31 @@ public static List loadPrescriptions() throws UnloadedStorageExcep } try (Scanner scanner = new Scanner(file)) { + int lineNumber = 0; while (scanner.hasNextLine()) { + lineNumber++; String line = scanner.nextLine(); if (!line.trim().isEmpty()) { - Prescription prescription = Prescription.fromFileFormat(line); - if (prescription != null) { - prescriptions.add(prescription); + try { + Prescription prescription = Prescription.fromFileFormat(line); + if (prescription != null) { + prescriptions.add(prescription); + } else { + System.out.println("Warning: Skipped invalid prescription at line " + lineNumber); + } + } catch (Exception e) { + // Log the error but continue processing other prescriptions + System.out.println("Warning: Error parsing prescription at line " + lineNumber + + ": " + e.getMessage()); } } } + + // If no prescriptions were loaded but file exists and has content, this is suspicious + if (prescriptions.isEmpty() && lineNumber > 0) { + System.out.println("Warning: No valid prescriptions were loaded from file with " + + lineNumber + " lines"); + } } catch (Exception e) { throw new UnloadedStorageException("Unable to load prescription data: " + e.getMessage()); } @@ -302,15 +281,6 @@ public static List loadPrescriptions() throws UnloadedStorageExcep } /** -<<<<<<< HEAD - * Generates and saves a prescription HTML file. - * - * @param prescription The prescription to convert to HTML. - * @param patient The patient associated with the prescription. - * @throws UnloadedStorageException If storage is not initialized or HTML file cannot be written. - */ - public static void savePrescriptionHtml(Prescription prescription, Patient patient) -======= * Generates and saves an HTML representation of a prescription. * Creates a formatted HTML file that can be viewed in a browser and printed. * @@ -320,7 +290,6 @@ public static void savePrescriptionHtml(Prescription prescription, Patient patie * or if there was an error writing the HTML file */ public static void savePrescriptionHtml(Prescription prescription, Patient patient) ->>>>>>> AddJavaDoc throws UnloadedStorageException { if (directoryPath == null || prescriptionDirPath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java index abcae95de0..513fdc16de 100644 --- a/src/test/java/manager/PrescriptionTest.java +++ b/src/test/java/manager/PrescriptionTest.java @@ -64,14 +64,13 @@ public void fromFileFormat_validInput_success() { } @Test - public void fromFileFormat_invalidInput_throwsException() { + public void fromFileFormat_invalidInput_returnsNull() { // Create an improperly formatted file entry (missing fields) String invalidFileEntry = "S1234567A-1|S1234567A"; - // This should throw an array index out of bounds exception - Assertions.assertThrows(ArrayIndexOutOfBoundsException.class, () -> { - Prescription.fromFileFormat(invalidFileEntry); - }); + // With our improved implementation, this should return null instead of throwing an exception + Prescription result = Prescription.fromFileFormat(invalidFileEntry); + Assertions.assertNull(result); } @Test From 624c7d2b36cfa2e5f00e1ea595ef84f066a777ef Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 04:16:17 +0800 Subject: [PATCH 179/203] Merge with upstream master --- data/appointment_data.txt | 2 + data/patient_data.txt | 2 + data/prescription_data.txt | 3 + data/prescription_data.txt.bak | 2 + .../prescription_S1234567A_1.html | 64 ++++ .../prescription_S1234567A_2.html | 64 ++++ src/main/java/storage/Storage.java.bak | 344 ++++++++++++++++++ test-data/appointment_data.txt | 2 +- 8 files changed, 482 insertions(+), 1 deletion(-) create mode 100644 data/patient_data.txt create mode 100644 data/prescription_data.txt.bak create mode 100644 data/prescriptions/prescription_S1234567A_1.html create mode 100644 data/prescriptions/prescription_S1234567A_2.html create mode 100644 src/main/java/storage/Storage.java.bak diff --git a/data/appointment_data.txt b/data/appointment_data.txt index e69de29bb2..e34ea9f6f4 100644 --- a/data/appointment_data.txt +++ b/data/appointment_data.txt @@ -0,0 +1,2 @@ +countId:101 +100|false|S1234567A|2026-12-25 2:30 pm|Annual checkup diff --git a/data/patient_data.txt b/data/patient_data.txt new file mode 100644 index 0000000000..473407197e --- /dev/null +++ b/data/patient_data.txt @@ -0,0 +1,2 @@ +S1234567A|John Doe|1990-05-15|M|123 Main Street|98765432| +S8765432B|Jane Smith|1985-10-20|F|456 Second Avenue|87654321| diff --git a/data/prescription_data.txt b/data/prescription_data.txt index e69de29bb2..b37a353acf 100644 --- a/data/prescription_data.txt +++ b/data/prescription_data.txt @@ -0,0 +1,3 @@ +S1234567A-1|S1234567A|2025-04-08 03:53|headache,fever|paracetamol,ibuprofen|Take twice daily after meals +S1234567A-2|S1234567A|2025-04-08 03:55|sore throat,cough|lozenges,cough syrup|Take every 6 hours +S8765432B-1|S8765432B|2025-04-08 03:56|migraine|aspirin|Take as needed diff --git a/data/prescription_data.txt.bak b/data/prescription_data.txt.bak new file mode 100644 index 0000000000..0a7919edb6 --- /dev/null +++ b/data/prescription_data.txt.bak @@ -0,0 +1,2 @@ +S1234567A-1|S1234567A|2025-04-08 03:53|headache,fever|paracetamol,ibuprofen|Take twice daily after meals +S1234567A-2|S1234567A|2025-04-08 03:55|sore throat,cough|lozenges,cough syrup|Take every 6 hours diff --git a/data/prescriptions/prescription_S1234567A_1.html b/data/prescriptions/prescription_S1234567A_1.html new file mode 100644 index 0000000000..387190c2b7 --- /dev/null +++ b/data/prescriptions/prescription_S1234567A_1.html @@ -0,0 +1,64 @@ + + + + + + Prescription S1234567A-1 + + + +
    +
    +

    ClinicEase Medical Prescription

    +

    Prescription ID: S1234567A-1

    +

    Date: 2025-04-08 03:53

    +
    +
    +

    Patient Information

    + + + + + + +
    Patient ID:S1234567A
    Name:John Doe
    Gender:M
    Date of Birth:1990-05-15
    Contact:98765432
    +
    +
    +

    Symptoms

    +
      +
    • headache
    • +
    • fever
    • +
    +
    +
    +

    Prescribed Medications

    +
      +
    • paracetamol
    • +
    • ibuprofen
    • +
    +
    +
    +

    Special Instructions

    +

    Take twice daily after meals

    +
    + +
    + + diff --git a/data/prescriptions/prescription_S1234567A_2.html b/data/prescriptions/prescription_S1234567A_2.html new file mode 100644 index 0000000000..db9b513134 --- /dev/null +++ b/data/prescriptions/prescription_S1234567A_2.html @@ -0,0 +1,64 @@ + + + + + + Prescription S1234567A-2 + + + +
    +
    +

    ClinicEase Medical Prescription

    +

    Prescription ID: S1234567A-2

    +

    Date: 2025-04-08 03:55

    +
    +
    +

    Patient Information

    + + + + + + +
    Patient ID:S1234567A
    Name:John Doe
    Gender:M
    Date of Birth:1990-05-15
    Contact:98765432
    +
    +
    +

    Symptoms

    +
      +
    • sore throat
    • +
    • cough
    • +
    +
    +
    +

    Prescribed Medications

    +
      +
    • lozenges
    • +
    • cough syrup
    • +
    +
    +
    +

    Special Instructions

    +

    Take every 6 hours

    +
    + +
    + + diff --git a/src/main/java/storage/Storage.java.bak b/src/main/java/storage/Storage.java.bak new file mode 100644 index 0000000000..a77287cf21 --- /dev/null +++ b/src/main/java/storage/Storage.java.bak @@ -0,0 +1,344 @@ +package storage; + +import exception.UnloadedStorageException; +import manager.Appointment; +import manager.Patient; +import manager.Prescription; +import miscellaneous.Parser; +import manager.ManagementSystem; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** +<<<<<<< HEAD + * Handles saving and loading of patient, appointment, and prescription data + * to and from the local file system. +======= + * Handles data persistence for the clinic management system. + * Provides methods for saving and loading patients, appointments, prescriptions, + * and generating HTML prescription documents. +>>>>>>> AddJavaDoc + */ +public class Storage { + private static String directoryPath; + private static String patientFilePath; + private static String appointmentFilePath; + private static String prescriptionFilePath; + private static String prescriptionDirPath; + private static Patient patients; + + /** +<<<<<<< HEAD + * Initializes storage paths based on a given directory. + * + * @param directory The directory to store data files in. +======= + * Constructs a Storage object with specified directory. + * Initializes file paths for patients, appointments, and prescriptions. + * + * @param directory The root directory for storage files +>>>>>>> AddJavaDoc + */ + public Storage(String directory) { + directoryPath = directory; + patientFilePath = directory + File.separator + "patient_data.txt"; + appointmentFilePath = directory + File.separator + "appointment_data.txt"; + prescriptionFilePath = directory + File.separator + "prescription_data.txt"; + prescriptionDirPath = directory + File.separator + "prescriptions"; + } + + /** +<<<<<<< HEAD + * Saves a list of patients to file. + * + * @param patientList The list of patients to save. + * @throws UnloadedStorageException If storage is not initialized. +======= + * Saves patients to file storage. + * Writes each patient in the list to the patient file in a formatted string. + * + * @param patientList The list of patients to save + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error saving to file +>>>>>>> AddJavaDoc + */ + public static void savePatients(List patientList) throws UnloadedStorageException { + if (directoryPath == null || patientFilePath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } + + File dir = new File(directoryPath); + if (!dir.exists()) { + dir.mkdirs(); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(patientFilePath))) { + for (Patient patient : patientList) { + writer.write(patient.toFileFormat()); + writer.newLine(); + } + } catch (IOException e) { + throw new UnloadedStorageException("Unable to save the patient!"); + } + } + + /** +<<<<<<< HEAD + * Loads patients from file. + * + * @return A list of patients. + * @throws UnloadedStorageException If patient data cannot be loaded. +======= + * Loads patients from file storage. + * Reads and parses patient data from the patient file. + * + * @return A list of Patient objects loaded from file + * @throws UnloadedStorageException If there was an error reading from the file + * or if the data could not be properly parsed +>>>>>>> AddJavaDoc + */ + public static List loadPatients() throws UnloadedStorageException { + List patients = new ArrayList<>(); + File file = new File(patientFilePath); + if (!file.exists()) { + return patients; + } + + try (Scanner scanner = new Scanner(file)) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + Patient patient = Parser.parseLoadPatient(line); + if (patient != null) { + patients.add(patient); + } + } + } catch (Exception e) { + throw new UnloadedStorageException("Unable to load patient data!"); + } + + return patients; + } + + /** +<<<<<<< HEAD + * Saves a list of appointments to file. + * + * @param appointmentList The list of appointments to save. + * @throws UnloadedStorageException If storage is not initialized. +======= + * Saves appointments to file storage. + * Writes the running ID counter and each appointment in the list to the appointment file. + * + * @param appointmentList The list of appointments to save + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error saving to file +>>>>>>> AddJavaDoc + */ + public static void saveAppointments(List appointmentList) throws UnloadedStorageException { + if (directoryPath == null || appointmentFilePath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } + + File dir = new File(directoryPath); + if (!dir.exists()) { + dir.mkdirs(); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(appointmentFilePath))) { + writer.write("countId:" + Appointment.getRunningId()); + writer.newLine(); + + for (Appointment appointment : appointmentList) { + writer.write(appointment.toFileFormat()); + writer.newLine(); + } + } catch (IOException e) { + throw new UnloadedStorageException("Unable to save the appointment!"); + } + } + + /** +<<<<<<< HEAD + * Loads appointments from file and links them to their corresponding patients. + * + * @param system The management system containing the patient list. + * @return A list of appointments. + * @throws UnloadedStorageException If appointment data cannot be loaded. +======= + * Loads appointments from file storage. + * Reads and parses appointment data from the appointment file. + * Also adds appointments to their respective patients. + * + * @param system The management system used to find patients for appointment association + * @return A list of Appointment objects loaded from file + * @throws UnloadedStorageException If there was an error reading from the file + * or if the data could not be properly parsed +>>>>>>> AddJavaDoc + */ + public static List loadAppointments(ManagementSystem system) throws UnloadedStorageException { + List appointments = new ArrayList<>(); + File file = new File(appointmentFilePath); + + if (!file.exists()) { + return appointments; + } + + try (Scanner scanner = new Scanner(file)) { + int countId = 100; + + if (scanner.hasNextLine()) { + String firstLine = scanner.nextLine(); + if (firstLine.startsWith("countId:")) { + String[] parts = firstLine.split(":"); + if (parts.length == 2) { + countId = Integer.parseInt(parts[1].trim()); + } + } + } + + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + if (!line.trim().isEmpty()) { + Appointment appointment = Parser.parseLoadAppointment(line); + if (appointment != null) { + appointments.add(appointment); + + Patient patient = system.findPatientByNric(appointment.getNric()); + if (patient != null) { + patient.addAppointment(appointment); + } + } + } + } + + Appointment.setRunningId(countId); + + } catch (Exception e) { + throw new UnloadedStorageException("Unable to load appointment data!"); + } + + return appointments; + } + + /** +<<<<<<< HEAD + * Saves a list of prescriptions to file. + * + * @param prescriptionList The list of prescriptions to save. + * @throws UnloadedStorageException If storage is not initialized. +======= + * Saves prescriptions to file storage. + * Writes each prescription in the list to the prescription file in a formatted string. + * + * @param prescriptionList The list of prescriptions to save + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error saving to file +>>>>>>> AddJavaDoc + */ + public static void savePrescriptions(List prescriptionList) throws UnloadedStorageException { + if (directoryPath == null || prescriptionFilePath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } + + File dir = new File(directoryPath); + if (!dir.exists()) { + dir.mkdirs(); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(prescriptionFilePath))) { + for (Prescription prescription : prescriptionList) { + writer.write(prescription.toFileFormat()); + writer.newLine(); + } + } catch (IOException e) { + throw new UnloadedStorageException("Unable to save prescriptions!"); + } + } + + /** +<<<<<<< HEAD + * Loads prescriptions from file. + * + * @return A list of prescriptions. + * @throws UnloadedStorageException If prescription data cannot be loaded. +======= + * Loads prescriptions from file storage. + * Reads and parses prescription data from the prescription file. + * + * @return A list of Prescription objects loaded from file + * @throws UnloadedStorageException If there was an error reading from the file + * or if the data could not be properly parsed +>>>>>>> AddJavaDoc + */ + public static List loadPrescriptions() throws UnloadedStorageException { + List prescriptions = new ArrayList<>(); + File file = new File(prescriptionFilePath); + + if (!file.exists()) { + return prescriptions; + } + + try (Scanner scanner = new Scanner(file)) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + if (!line.trim().isEmpty()) { + Prescription prescription = Prescription.fromFileFormat(line); + if (prescription != null) { + prescriptions.add(prescription); + } + } + } + } catch (Exception e) { + throw new UnloadedStorageException("Unable to load prescription data: " + e.getMessage()); + } + + return prescriptions; + } + + /** +<<<<<<< HEAD + * Generates and saves a prescription HTML file. + * + * @param prescription The prescription to convert to HTML. + * @param patient The patient associated with the prescription. + * @throws UnloadedStorageException If storage is not initialized or HTML file cannot be written. + */ + public static void savePrescriptionHtml(Prescription prescription, Patient patient) +======= + * Generates and saves an HTML representation of a prescription. + * Creates a formatted HTML file that can be viewed in a browser and printed. + * + * @param prescription The prescription to generate HTML for + * @param patient The patient associated with the prescription, may be null + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error writing the HTML file + */ + public static void savePrescriptionHtml(Prescription prescription, Patient patient) +>>>>>>> AddJavaDoc + throws UnloadedStorageException { + if (directoryPath == null || prescriptionDirPath == null) { + throw new UnloadedStorageException("Storage not initialized with a directory!"); + } + + File dir = new File(prescriptionDirPath); + if (!dir.exists()) { + dir.mkdirs(); + } + + String fileName = "prescription_" + prescription.getPatientId() + "_" + + prescription.getPrescriptionId().split("-")[1] + ".html"; + String filePath = prescriptionDirPath + File.separator + fileName; + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { + writer.write(prescription.generateHtml(patient)); + } catch (IOException e) { + throw new UnloadedStorageException("Unable to generate HTML prescription: " + e.getMessage()); + } + } +} diff --git a/test-data/appointment_data.txt b/test-data/appointment_data.txt index 654a6f46c7..122e2d65e1 100644 --- a/test-data/appointment_data.txt +++ b/test-data/appointment_data.txt @@ -1,2 +1,2 @@ countId:130 -129|true|S9876543Z|2025-04-10 3:00 PM|Dental Checkup +129|true|S9876543Z|2025-04-10 3:00 pm|Dental Checkup From 85b6bb76e65dbae1188e159892a99c0a3bb5695b Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 04:28:58 +0800 Subject: [PATCH 180/203] Improve error messages for view-all-prescriptions and view-prescription --- src/main/java/miscellaneous/Parser.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 033a732006..7b90e2b01e 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -508,12 +508,14 @@ public static Prescription parseAddPrescription(String input) throws InvalidInpu public static String parseViewAllPrescriptions(String input) throws InvalidInputFormatException { String trimmedInput = input.trim(); if (trimmedInput.equals("view-all-prescriptions") || trimmedInput.length() <= 22) { - throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID"); + throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID. " + + "Make sure there is a space between the command and the patient ID."); } String patientId = trimmedInput.substring(22).trim(); if (patientId.isEmpty()) { - throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID"); + throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID. " + + "Make sure there is a space between the command and the patient ID."); } return patientId; } @@ -529,12 +531,14 @@ public static String parseViewAllPrescriptions(String input) throws InvalidInput public static String parseViewPrescription(String input) throws InvalidInputFormatException { String trimmedInput = input.trim(); if (trimmedInput.equals("view-prescription") || trimmedInput.length() <= 17) { - throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID"); + throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID. " + + "Make sure there is a space between the command and the prescription ID."); } String prescriptionId = trimmedInput.substring(17).trim(); if (prescriptionId.isEmpty()) { - throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID"); + throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID. " + + "Make sure there is a space between the command and the prescription ID."); } return prescriptionId; } From 6594e80cb4a483cc4af82645d1a34dd12cdadc64 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 04:31:33 +0800 Subject: [PATCH 181/203] Update error messages for view-all-prescriptions and view-prescription commands --- src/main/java/miscellaneous/Parser.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 7b90e2b01e..033a732006 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -508,14 +508,12 @@ public static Prescription parseAddPrescription(String input) throws InvalidInpu public static String parseViewAllPrescriptions(String input) throws InvalidInputFormatException { String trimmedInput = input.trim(); if (trimmedInput.equals("view-all-prescriptions") || trimmedInput.length() <= 22) { - throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID. " - + "Make sure there is a space between the command and the patient ID."); + throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID"); } String patientId = trimmedInput.substring(22).trim(); if (patientId.isEmpty()) { - throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID. " - + "Make sure there is a space between the command and the patient ID."); + throw new InvalidInputFormatException("Invalid command format. Use: view-all-prescriptions PATIENT_ID"); } return patientId; } @@ -531,14 +529,12 @@ public static String parseViewAllPrescriptions(String input) throws InvalidInput public static String parseViewPrescription(String input) throws InvalidInputFormatException { String trimmedInput = input.trim(); if (trimmedInput.equals("view-prescription") || trimmedInput.length() <= 17) { - throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID. " - + "Make sure there is a space between the command and the prescription ID."); + throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID"); } String prescriptionId = trimmedInput.substring(17).trim(); if (prescriptionId.isEmpty()) { - throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID. " - + "Make sure there is a space between the command and the prescription ID."); + throw new InvalidInputFormatException("Invalid command format. Use: view-prescription PRESCRIPTION_ID"); } return prescriptionId; } From 6a35a16d6db9800ce96be9297786f4f5dba0ce96 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 05:11:33 +0800 Subject: [PATCH 182/203] Update PPP with issue resolution details --- docs/team/basudeb2005.md | 53 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/team/basudeb2005.md b/docs/team/basudeb2005.md index 74d296d913..b765372cda 100644 --- a/docs/team/basudeb2005.md +++ b/docs/team/basudeb2005.md @@ -45,6 +45,17 @@ I implemented the complete Prescription Management System, a key feature that en - Custom serialization format for prescriptions - Load and save operations for persistent storage +- **Comprehensive Testing**: Created extensive test suite for the prescription subsystem: + - Unit tests for all prescription-related classes + - Integration tests for prescription management functionality + - End-to-end testing of the prescription workflow + +- **User Experience Enhancements**: Improved user experience through better error handling and guidance: + - Enhanced error messages for prescription commands to provide clearer guidance on correct syntax + - Fixed formatting issues in the Parser for view-all-prescriptions and view-prescription commands + - Ensured consistent error message format across the application + - Improved user feedback for common command entry mistakes + ### Contributions to the User Guide - Added the "Managing Prescriptions" section, documenting: @@ -68,3 +79,45 @@ I implemented the complete Prescription Management System, a key feature that en - Integrated the prescription management subsystem with the existing patient management system - Ensured compatibility of prescription commands with the overall command parsing structure - Collaborated on refining the storage mechanisms to handle multiple data types + +### Features I'm proud of + +1. **HTML Prescription Generation** + - The ability to generate professional-looking prescriptions that doctors can print was a feature I'm particularly proud of implementing. This bridges the gap between digital management and the physical documents patients need. + +2. **Comprehensive Prescription Workflow** + - Creating a complete end-to-end solution that handles everything from prescription creation to storage to retrieval to presentation was a significant achievement. + +3. **Robust Testing Framework** + - The extensive test suite I developed ensures the reliability of the prescription system, with test coverage for all major components and operations. + +4. **Technical Documentation** + - The detailed sequence and class diagrams help future developers understand the architecture and implementation of the prescription management feature. + +5. **Architecture Documentation Blueprint** + - Developed the initial architecture diagram blueprint that formed the foundation for the final design + - Established the key component relationships that guided the team's understanding of the system + - Documented component interactions with sequence diagrams + - Designed the sequence diagram showing command execution flow + - Provided the interim architecture diagrams that guided subsequent improvements + - Collaborated with team members to evolve the architecture representation + +### Issues Resolved + +During the development and maintenance phase, I identified and fixed several issues to improve the application: + +1. **Enhanced Command Format Guidance**: + - Improved error messages in the Parser.java file for the view-all-prescriptions and view-prescription commands + - Made error messages more instructive by clearly indicating the correct command format + - Ensured consistent error handling across different commands in the application + +2. **User Experience Improvements**: + - Identified and fixed issues where users were receiving unhelpful error messages + - Created more intuitive feedback for prescription-related commands + - Enhanced overall user experience with clearer guidance on command syntax + +3. **Fixed Prescription Storage Limitation Issue**: + - Resolved critical bug where the system could not load prescription data beyond 5 entries + - Fixed "Index out of bounds" error that occurred when loading prescriptions + - Ensured the system can properly handle and save unlimited number of prescriptions + - Improved application stability by preventing data loss when storing multiple prescriptions \ No newline at end of file From 07fe5bc19c80b5f0debd7eab20ffdfafb5a91341 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 06:47:41 +0800 Subject: [PATCH 183/203] Update PPP: final edits by Basudeb2005 --- docs/team/basudeb2005.md | 67 ++++++++++++---------------------------- 1 file changed, 19 insertions(+), 48 deletions(-) diff --git a/docs/team/basudeb2005.md b/docs/team/basudeb2005.md index b765372cda..9ca9b5a49c 100644 --- a/docs/team/basudeb2005.md +++ b/docs/team/basudeb2005.md @@ -1,13 +1,14 @@ # Basudeb Chakraborty - Project Portfolio Page ## Overview - -ClinicEase is a desktop application designed for clinic management. It provides doctors with a command-line interface to manage patients, appointments, and prescriptions. The application enables doctors to track patient information, medical histories, schedule appointments, and create detailed prescriptions with HTML export capabilities. +ClinicEase is a desktop app with a command-line interface for doctors to manage patients, appointments, and prescriptions. It allows tracking medical histories, scheduling, and exporting detailed prescriptions in HTML format. ## Summary of Contributions ### Code contributed -[RepoSense Code Dashboard](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=basudeb2005) +[RepoSense Code Dashboard](https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=&sort=groupTitle%20dsc&sortWithin=title&since=2025-02-21&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false&tabOpen=true&tabType=authorship&tabAuthor=Basudeb2005&tabRepo=AY2425S2-CS2113-T11b-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +Full URL: https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=&sort=groupTitle%20dsc&sortWithin=title&since=2025-02-21&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false&tabOpen=true&tabType=authorship&tabAuthor=Basudeb2005&tabRepo=AY2425S2-CS2113-T11b-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false ### Enhancements implemented @@ -41,20 +42,9 @@ I implemented the complete Prescription Management System, a key feature that en - Organized sections for patient information, symptoms, medicines, and special instructions - Print functionality via a button in the HTML document -- **Storage and Persistence**: Implemented storage functionality to save and retrieve prescriptions from file system: - - Custom serialization format for prescriptions - - Load and save operations for persistent storage - -- **Comprehensive Testing**: Created extensive test suite for the prescription subsystem: - - Unit tests for all prescription-related classes - - Integration tests for prescription management functionality - - End-to-end testing of the prescription workflow - -- **User Experience Enhancements**: Improved user experience through better error handling and guidance: - - Enhanced error messages for prescription commands to provide clearer guidance on correct syntax - - Fixed formatting issues in the Parser for view-all-prescriptions and view-prescription commands - - Ensured consistent error message format across the application - - Improved user feedback for common command entry mistakes +- **Storage and Persistence**: Implemented storage functionality to save and retrieve prescriptions from the file system with a custom serialization format. + +- **Comprehensive Testing**: Created an extensive test suite for the prescription subsystem: Unit tests for all prescription-related classes, Integration tests for prescription management functionality, End-to-end testing of the prescription workflow. ### Contributions to the User Guide @@ -67,18 +57,12 @@ I implemented the complete Prescription Management System, a key feature that en ### Contributions to the Developer Guide - Added documentation for the core application structure -- Added documentation for the appointment management system -- Added documentation for the prescription management features, including: - - Use cases for adding, viewing, and generating prescriptions - - Manual testing instructions for prescription management - - User stories related to prescription functionality +- Added documentation for the prescription management features, including Use cases for adding, viewing, and generating prescriptions, Manual testing instructions for prescription management, and User stories related to prescription functionality. ### Contributions to team-based tasks - Set up the initial application architecture that the team built upon -- Integrated the prescription management subsystem with the existing patient management system -- Ensured compatibility of prescription commands with the overall command parsing structure -- Collaborated on refining the storage mechanisms to handle multiple data types +- Integrated the prescription management subsystem with the existing patient management system and ensured compatibility of prescription commands with the overall parsing structure ### Features I'm proud of @@ -94,30 +78,17 @@ I implemented the complete Prescription Management System, a key feature that en 4. **Technical Documentation** - The detailed sequence and class diagrams help future developers understand the architecture and implementation of the prescription management feature. -5. **Architecture Documentation Blueprint** - - Developed the initial architecture diagram blueprint that formed the foundation for the final design - - Established the key component relationships that guided the team's understanding of the system - - Documented component interactions with sequence diagrams - - Designed the sequence diagram showing command execution flow - - Provided the interim architecture diagrams that guided subsequent improvements - - Collaborated with team members to evolve the architecture representation +5. **Architecture Documentation Blueprint** + - Created initial architecture diagram + - Created the sequence diagrams + - Collaborated with the team to refine and evolve the architecture diagram ### Issues Resolved -During the development and maintenance phase, I identified and fixed several issues to improve the application: - -1. **Enhanced Command Format Guidance**: - - Improved error messages in the Parser.java file for the view-all-prescriptions and view-prescription commands - - Made error messages more instructive by clearly indicating the correct command format - - Ensured consistent error handling across different commands in the application - -2. **User Experience Improvements**: - - Identified and fixed issues where users were receiving unhelpful error messages - - Created more intuitive feedback for prescription-related commands - - Enhanced overall user experience with clearer guidance on command syntax +1. **Better User Experience** + - Fixed vague error messages for prescription commands + - Provided clearer, more intuitive feedback -3. **Fixed Prescription Storage Limitation Issue**: - - Resolved critical bug where the system could not load prescription data beyond 5 entries - - Fixed "Index out of bounds" error that occurred when loading prescriptions - - Ensured the system can properly handle and save unlimited number of prescriptions - - Improved application stability by preventing data loss when storing multiple prescriptions \ No newline at end of file +2. **Prescription Storage Bug Fixed** + - Resolved "Index out of bounds" error when loading over 5 prescriptions + - Enabled support for unlimited entries and prevented data loss \ No newline at end of file From f0fa0dc3863c318c8e590771de20e846c9195981 Mon Sep 17 00:00:00 2001 From: Basudeb2005 Date: Tue, 8 Apr 2025 07:01:29 +0800 Subject: [PATCH 184/203] Update PPP with clickable full URL --- docs/team/basudeb2005.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/team/basudeb2005.md b/docs/team/basudeb2005.md index 9ca9b5a49c..f84b42c53e 100644 --- a/docs/team/basudeb2005.md +++ b/docs/team/basudeb2005.md @@ -6,9 +6,9 @@ ClinicEase is a desktop app with a command-line interface for doctors to manage ## Summary of Contributions ### Code contributed -[RepoSense Code Dashboard](https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=&sort=groupTitle%20dsc&sortWithin=title&since=2025-02-21&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false&tabOpen=true&tabType=authorship&tabAuthor=Basudeb2005&tabRepo=AY2425S2-CS2113-T11b-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) +[RepoSense Code Dashboard](https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=&sort=groupTitle%20dsc&sortWithin=title&since=2025-02-21&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false&tabOpen=true&tabType=authorship&tabAuthor=Basudeb2005&tabRepo=AY2425S2-CS2113-T11b-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) -Full URL: https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=&sort=groupTitle%20dsc&sortWithin=title&since=2025-02-21&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false&tabOpen=true&tabType=authorship&tabAuthor=Basudeb2005&tabRepo=AY2425S2-CS2113-T11b-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false +Full URL: [https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=&sort=groupTitle%20dsc&sortWithin=title&since=2025-02-21&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false&tabOpen=true&tabType=authorship&tabAuthor=Basudeb2005&tabRepo=AY2425S2-CS2113-T11b-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false](https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=&sort=groupTitle%20dsc&sortWithin=title&since=2025-02-21&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false&tabOpen=true&tabType=authorship&tabAuthor=Basudeb2005&tabRepo=AY2425S2-CS2113-T11b-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) ### Enhancements implemented From b8ff106d483e91bf7289dff74e0250a8e813f093 Mon Sep 17 00:00:00 2001 From: judHoka Date: Tue, 8 Apr 2025 11:20:10 +0800 Subject: [PATCH 185/203] Final DG pushes --- docs/DeveloperGuide.md | 287 +++++++++++++++++++++++++++++++++-------- 1 file changed, 232 insertions(+), 55 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f5fc72eca2..4f876b31ea 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -2,9 +2,15 @@ --- -## Acknowledgements +### Acknowledgements -{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +We would like to acknowledge the following for their support and inspiration during the development of ClinicEase: + +- The teaching team of [CS2113] for providing guidance, sample code, and foundational project architecture. +- Open-source libraries and tools from the Java SDK. +- Online documentation and tutorials that supported implementation and testing efforts. + +All code was developed by the team unless otherwise specified. --- @@ -34,7 +40,7 @@ The application consists of the following components: * **Object**: Patient, Appointment, and Prescription classes that represent domain objects. -* **Storage**: Saves and loads data to/from files on disk. +* **Storage**: Saves and loads data to/from specific data files. ### How the architecture components interact with each other @@ -62,11 +68,8 @@ This architecture follows several design principles: ## Design -
    - ---- ## Command Component -**API** : [Command Classes](https://github.com/AY2425S2-CS2113-T11b-4/tp/tree/master/src/main/java/command) +**API** : [Command classes](https://github.com/AY2425S2-CS2113-T11b-4/tp/tree/master/src/main/java/command) ![Command Component](diagrams/Command.png) @@ -151,38 +154,129 @@ The `Command` component is responsible for **handling and executing user command > **Note:** The `Command` classes rely on the `Parser` to supply valid parameters. If parsing fails, `Parser` throws appropriate exceptions before the `Command` is even constructed. --- -### UI Component +## UI Component **API**: [`Ui.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/miscellaneous/Ui.java) ![UI Component](diagrams/uiComponent.png) -The `UI` component is responsible for handling all user interactions. It presents messages to the user, reads user inputs, and displays command results or errors. +--- -#### Responsibilities +### Overview -- Display a welcome message, help instructions, and goodbye message. -- Accept and return user input from the command line. -- Display confirmation messages and outputs for commands such as `add-patient`, `delete-patient`, `view-patient`, `add-appointment`, etc. -- Print errors and validation issues clearly to the user. +The `Ui` component manages **all user-facing interactions** in ClinicEase. It is responsible for reading raw user input, printing messages, displaying command results, and showing relevant errors or validations. By centralising all communication with the user, it ensures a consistent and clean user experience. -#### Key Features +--- + +### Responsibilities + +1. **User Communication**: Display outputs from commands, such as lists of patients, appointment confirmations, and system messages (welcome, exit, help, etc.). +2. **Input Handling**: Use `Scanner` to accept input from the command line and return it to the main program loop. +3. **Error Presentation**: Show descriptive error and validation messages to guide user actions. + +--- + +### Key Features + +- **Central Input Reader** + - Uses a single `Scanner` to read commands from standard input (`System.in`). + - Exposes a `readCommand()` method to fetch raw user input. + +- **Output Formatter** + Provides structured, readable messages for: + - Patient operations (add, delete, view, list). + - Appointment operations (add, mark, unmark, list). + - System messages like welcome, goodbye, and help. + +- **Error Display** + Handles invalid input gracefully via methods like: + - `showError(String message)` + - `showInvalidCommand(String command)` + - `showIndexOutOfBoundsError(...)` + +- **Consistent User Interface** + All outputs use standard formatting (icons, line dividers, spacing) to maintain visual consistency and improve usability. + +--- + +### Structure + +1. **Input** + - `readCommand()` — prompts and captures user input via CLI. + +2. **General System Messages** + - `showWelcome()`, `showGoodbye()`, `showHelp()`, `showDivider()` + +3. **Patient Display** + - `showPatientAdded(Patient)` + - `showPatientDeleted(Patient)` + - `showPatientList(List)` + - `showPatientDetails(Patient)` + +4. **Appointment Display** + - `showAppointmentAdded(Appointment)` + - `showAppointmentMarked(Appointment)` + - `showAppointmentUnmarked(Appointment)` + - `showAppointmentList(List)` + +5. **Error and Validation** + - `showError(String)` + - `showInvalidCommand(String)` + - `showInvalidInputFormat(String)` + - `showIndexOutOfBoundsError(String, int, int)` + +--- -- Uses `Scanner` to read input from `System.in`. -- Methods like `showPatientAdded()`, `showAppointmentMarked()`, and `showPatientList()` format data in a readable and consistent way. -- Provides contextual error messages via `showError()` to aid debugging and usage. +### Dependencies + +- **`Patient` and `Appointment` Classes** + Used to format and display relevant model information in a human-readable format. + +- **`Command` Classes** + Call various UI methods to output results of command execution. + +- **`Main` Loop / Driver Class** + Calls `readCommand()` to get user input and dispatch commands. + +--- + +### Design Considerations -#### Dependencies +- **Separation of Concerns** + UI strictly handles display and input, not business logic. This modularity improves maintainability and makes the system testable. -**Model**: Uses `Patient` and `Appointment` for displaying information. +- **Consistency and Usability** + Formatting styles (e.g., emojis/icons, dividers) improve user experience by clearly delineating different types of output. -
    +- **Scalability** + Designed to easily add new output functions (`showX`) when new features or commands are introduced. + +- **Extensibility** + Could be abstracted into an interface (`IUi`) to allow swapping between CLI, GUI (e.g. JavaFX), or web UI in future iterations. + +--- + +### Remarks + +- The UI component is **stateless**, meaning it does not store application data — it only serves as a medium to **interact** with users. +- It ensures a **clear communication loop**: + 1. `Parser` processes input → + 2. `Command` executes logic → + 3. `Ui` formats and displays the result. +- Centralising all UI output ensures messages are consistent across commands and improves the professionalism and polish of the CLI application. +- Future improvements could include: + - Theming/styling for different output types + - Logging system output to a file via a `Logger` + - Extending to support localisation/internationalisation +--- ### Main component **API**: [`ClinicEase.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/ClinicEase.java) ![Main Component](diagrams/mainComponent.png) + The `Main` component is the **entry point** of the application. +--- #### Responsibilities - Initializes core components: `Ui`, `Storage`, and `ManagementSystem`. @@ -194,9 +288,7 @@ The `Main` component is the **entry point** of the application. - Handles exceptions gracefully and displays errors to the user when needed. > While not a logic-heavy component itself, `Main` serves as the **coordinator** that ties together UI, command parsing, logic execution, and data storage. - -
    - +--- ### Parser Component **API** : [`Parser.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/miscellaneous/Parser.java) @@ -204,6 +296,7 @@ The `Main` component is the **entry point** of the application. #### Overview of the `Parser` Component ![parser-class-diagram](diagrams/parserClassDiagram.png) +--- - **Parser:** - **Public API:** `parse(input)` @@ -212,11 +305,13 @@ The `Main` component is the **entry point** of the application. - **Utility Method:** `extractValue()` (reusable parameter extractor). +--- - **Command:** - **Abstract Superclass:** Defines `execute()` and `isExit()` for all commands. - **Subclasses:** `AddPatientCommand`, `DeleteAppointmentCommand`, etc. - Each accepts specific data (e.g., `AddAppointmentCommand` takes an `Appointment`). +--- The sequence diagram below illustrates the interactions within the `Parser` component, taking parse(`add-appointment ic/S1234567D dt/2025-04-05 t/1400 dsc/Consultation`) as example: ![parser-sequence-diagram](diagrams/parserSequence.png) @@ -224,6 +319,7 @@ as example: > This sequence diagram only focus on the interactions within the `Parser` component, the other components > such as `Ui`, `ManagementSystem` and `Storage` are omitted. +--- How the `Parser` component works: 1. When `Parser` is called upon to parse a user command, `Parser` splits the input to identify the command type (e.g. `add-appointment`). A `switch-case` delegates to the appropriate helper method: @@ -247,9 +343,6 @@ public static Command parse(String userInput) throws InvalidInputFormatException object is created, it will be returned to `ClinicEase` for further operations. --- -
    - - ### Manager Component **API**: [`ManagementSystem.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/manager/ManagementSystem.java) @@ -258,6 +351,7 @@ public static Command parse(String userInput) throws InvalidInputFormatException The `ManagementSystem` class in manager component acts as the central coordinator, responsible for managing features for **Patient**, **Appointment**, and **Prescription** entities. It provides methods to add, remove, and retrieve these objects, ensuring business logic is applied and maintaining the integrity of the system’s data. +--- #### Responsibilities - Manages instances of **Patient**, **Appointment**, and **Prescription** objects. @@ -266,6 +360,7 @@ The `ManagementSystem` class in manager component acts as the central coordinato - Ensures consistency of data, validating changes before committing them to the system. - Handles business logic related to managing patients, their appointments, and prescriptions. +--- #### Key Features - Provides **methods** for managing **Patients**, **Appointments**, and **Prescriptions**. @@ -273,13 +368,13 @@ The `ManagementSystem` class in manager component acts as the central coordinato - Handles validation logic to ensure that the data is accurate and consistent (e.g., cannot add duplicate appointments or prescriptions). - Can interact with **Storage** to persist changes made to patients, appointments, and prescriptions. +--- #### Structure - The core functionality is provided through a **single class** (ManagementSystem), where all methods for interacting with the system’s data are defined. - Utilizes **arraylists** to store and manage **Patient**, **Appointment**, and **Prescription** objects. - The **ManagementSystem** class contains methods like `addPatient()`, `removePatient()`, `getPatient()`, etc., and primarily serve to manage the logic behind those operations. - -
    +--- ### Objects Component @@ -356,45 +451,108 @@ The `Prescription` class represents a prescription, typically linked to a patien - **Model**: Dependent on the **Patient** class to represent which patient the prescription is associated with. - **ManagementSystem**: The **ManagementSystem** interacts with this class to manage prescriptions and ensure they are associated with the correct patient. +--- -
    +## Storage Component +**API**: [`Storage.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/storage/Storage.java) + +![Storage Component](diagrams/storageComponent.png) +--- -### Storage Component -**API** : [`Storage.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/storage/Storage.java) +### Overview -![Storage Component](diagrams/storageComponent.png) -The `Storage` component is responsible for reading from and writing to the file system to ensure persistence of application data in `ClinicEase`. +The `Storage` component is responsible for reading from and writing to the file system to ensure **data persistence** in ClinicEase. It handles loading and saving of patients, appointments, and prescriptions, and also generates HTML representations of prescription data when required. -#### Responsibilities +--- + +### Responsibilities -The `Storage` class handles: -- Saving and loading **Patients** from `patient_data.txt` -- Saving and loading **Appointments** from `appointment_data.txt` -- Saving and loading **Prescriptions** from `prescription_data.txt` -- Generating HTML files for prescriptions into a `/prescriptions/` directory +- Save and load **patients** from `patient_data.txt`. +- Save and load **appointments** from `appointment_data.txt`. +- Save and load **prescriptions** from `prescription_data.txt`. +- Generate HTML files for prescriptions into a `/prescriptions/` directory. +- Ensure data is correctly formatted and persists across application runs. -#### Key Features +--- + +### Key Features -- Each data type is stored in its own file. -- Upon loading, `Storage` uses the `Parser` class to reconstruct objects like `Patient` and `Appointment`. -- When appointments are loaded, they are automatically linked to the corresponding patients via the `ManagementSystem`. +- **Separate Files for Each Data Type** + Each model object is saved in a different file for modularity and easier debugging. -#### Structure +- **Static Utility Methods** + Methods like `savePatients()`, `loadAppointments()`, and `savePrescriptions()` are static and utility-based, allowing them to be called globally. + +- **Data Linking** + When appointments are loaded, they are automatically linked to their respective patients using methods from `ManagementSystem`. + +- **HTML Generation** + Prescription objects are exported into readable HTML files, supporting offline viewing or printing. + +- **Path Initialization** + The `Storage` constructor accepts a directory path and configures the correct file paths. It must be called before any static operations. + +--- + +### Structure + +- The `Storage` class contains: + - A constructor `Storage(String directory)` to initialize the storage directory and file paths. + - Static methods: + - `savePatients(List)` + - `loadPatients()` + - `saveAppointments(List)` + - `loadAppointments(ManagementSystem)` + - `savePrescriptions(List)` + - `loadPrescriptions()` + - `exportPrescriptionToHtml(Prescription)` + +--- + +### Dependencies + +- **Model Classes**: + - `Patient`: For reading/writing patient data. + - `Appointment`: For loading and linking to patients. + - `Prescription`: For saving and generating HTML files. + +- **ManagementSystem**: + Required to correctly link appointments to existing patients upon loading. + +- **Parser**: + Parses raw text from files and reconstructs `Patient`, `Appointment`, and `Prescription` objects. -- All methods are defined within a **single `Storage` class** with static methods like `savePatients()`, `loadAppointments()`, etc. -- Initialization is done through the constructor `Storage(String directory)`, which sets the correct file paths. +- **Commons / Utils**: + May use constants or helper functions for formatting or file handling. -#### Dependencies +--- + +### Design Considerations + +- **Separation of Concerns** + The `Storage` class is solely responsible for persistence. It does not contain any business logic related to how data is used. + +- **Safety Checks** + Throws `UnloadedStorageException` if static methods are called before proper initialisation via the constructor. + +- **Portability** + Allows flexible directory configuration via constructor, making it easy to adapt file locations for testing or deployment. + +- **Extensibility** + New file-based data (e.g., billing records) can be added without affecting the current architecture — simply add new load/save methods. -- **Model**: Uses `Patient`, `Appointment`, and `Prescription` objects for reading/writing. -- **Commons**: Uses constants and utility methods if applicable. -- **Parser**: Converts text from the file back into model objects. -- **ManagementSystem**: Required to link appointments to patients during data loading. +--- + +### Remarks + +- `Storage` should be **initialized once** using its constructor before any read/write operations are performed. +- Data is stored in a human-readable plain text format to support debugging and versioning. +- HTML generation for prescriptions can be enhanced in future with CSS templates or PDF export support. +- File structure and save formats are intentionally kept simple for ease of testing and transparency. -> **Note:** `Storage` should be initialised before calling any static methods that rely on file paths. Otherwise, `UnloadedStorageException` will be thrown. +--- -
    ## Implementation @@ -891,6 +1049,8 @@ Use case resumes at step 1. 1b1. ClinicEase displays an error message. Use case ends. +--- + ### Use Case: Delete a Patient #### MSS @@ -909,6 +1069,8 @@ Use case ends. 3a1. ClinicEase displays an error message. Use case resumes at step 2. +--- + ### Use Case: Add an Appointment #### MSS @@ -928,6 +1090,8 @@ Use case ends. 1a1. ClinicEase displays an error message. Use case resumes at step 1. +--- + ### Use Case: Delete an Appointment #### MSS @@ -946,6 +1110,8 @@ Use case ends. 3a1. ClinicEase displays an error message. Use case resumes at step 2. +--- + ### Use Case: View a Patient's Medical History #### MSS @@ -963,6 +1129,8 @@ Use case ends. 2a1. ClinicEase informs the user that no history is available. Use case ends. +--- + ### Use Case: Edit a Patient's Details #### MSS @@ -982,6 +1150,8 @@ Use case ends. 1a1. ClinicEase displays an error message. Use case resumes at step 1. +--- + ### Use Case: Sort Appointments #### MSS @@ -1000,6 +1170,8 @@ Use case ends. 1b1. ClinicEase displays an error message. Use case resumes at step 1. +--- + ### Use case: Add a new prescription **MSS** @@ -1024,6 +1196,8 @@ Use case resumes at step 1. * 3a1. System shows error message with correct format * 3a2. Use case resumes at step 2 +--- + ### Use case: View all prescriptions for a patient **MSS** @@ -1045,6 +1219,8 @@ Use case resumes at step 1. * 4a1. System shows "No prescriptions found" message * 4a2. Use case ends +--- + ### Use case: View and generate HTML prescription **MSS** @@ -1106,7 +1282,8 @@ Below is a suggested guide for **manual testing** of the ClinicEase application - Run the compiled main class: ``` java ClinicEase - ``` - You should see a welcome message that looks like this: + ``` + You should see a welcome message that looks like this: ``` -------------------------------------------------------------------------------- Welcome to ClinicEase! From 51cf0f918335f7cb2590c16b5a8b735acacf0ad4 Mon Sep 17 00:00:00 2001 From: Wen Yee Date: Tue, 8 Apr 2025 11:34:39 +0800 Subject: [PATCH 186/203] Added table content for DG --- docs/DeveloperGuide.md | 283 +++++++++++++++++++++-------------------- docs/UserGuide.md | 1 + 2 files changed, 147 insertions(+), 137 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f5fc72eca2..6745e36dcc 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,5 +1,31 @@ # Developer Guide +- [Acknowledgement](#acknowledgements) +- [Design](#design-) + - [Architecture](#architecture) + - [Command Component](#command-component) + - [Ui Component](#ui-component) + - [Main Component](#main-component) + - [Parser Component](#parser-component) + - [Manager Component](#manager-component) + - [Objects Component](#objects-component) + - [Storage Component](#storage-component) +- [Implementation](#implementation) + - [View Patient Feature](#view-patient-feature) + - [Add Patient Feature](#add-patient-feature) + - [Delete Patient Feature](#delete-patient-feature) + - [Add/Delete Appointment Feature](#adddelete-appointment-feature) + - [Storing Medical History Feature](#storing-medical-history-feature) + - [Presciption Management Feature](#prescription-management-feature) +- [Appendix: Requirements](#appendix-requirements) + - [Product Scope](#product-scope) + - [User Stories](#user-stories) + - [Use Cases](#use-cases) + - [Non-Functional Requirements](#non-functional-requirements) + - [Glossary](#glossary) +- [Appendix: Instructions for Manual Testing](#appendix-instructions-for-manual-testing) + + --- ## Acknowledgements @@ -8,7 +34,9 @@ --- -## Architecture +## Design + +### Architecture ![Architecture Diagram](diagrams/ArchitectureDiagram.png) @@ -58,32 +86,25 @@ This architecture follows several design principles: 3. **Command Pattern**: Commands encapsulate actions and provide a uniform interface for execution 4. **Entity-Control Separation**: Entity classes (Patient, Appointment, Prescription) are separate from the controlling ManagementSystem that operates on them ---- - -## Design -
    --- -## Command Component +### Command Component **API** : [Command Classes](https://github.com/AY2425S2-CS2113-T11b-4/tp/tree/master/src/main/java/command) ![Command Component](diagrams/Command.png) ---- ### Overview The `Command` component is responsible for **handling and executing user commands** in ClinicEase. It defines a common interface (`Command`) for all commands and organizes the various command classes (e.g., `AddAppointmentCommand`, `DeletePatientCommand`) that operate on the `ManagementSystem` and interact with the `Ui` to provide application functionality. ---- ### Responsibilities 1. **Encapsulate Command Logic**: Each command class holds the data or parameters needed to carry out a specific user request (e.g., adding a new appointment, deleting a patient). 2. **Execute on System**: Using a uniform `execute()` interface, commands interact with the `ManagementSystem` to perform the requested action. 3. **Provide Exit Control**: Certain commands can signal the application to terminate (e.g., `ExitCommand`), by overriding `isExit()` to return `true`. ---- ### Key Features @@ -98,7 +119,6 @@ The `Command` component is responsible for **handling and executing user command - **Command Pattern** This design follows a simplified [Command Pattern](https://en.wikipedia.org/wiki/Command_pattern), enabling a clear separation of concerns between **input parsing**, **system logic**, and **UI presentation**. ---- ### Structure @@ -114,7 +134,6 @@ The `Command` component is responsible for **handling and executing user command 3. **Uniform Execution** All command classes share the same `execute()` signature but implement distinct behaviors. ---- ### Dependencies @@ -123,7 +142,6 @@ The `Command` component is responsible for **handling and executing user command - **`Parser`**: Typically, commands themselves do not parse raw input strings. Instead, the `Parser` constructs a command object with the necessary parameters before execution. - **`Storage`**: Some commands (e.g., `AddPatientCommand`) indirectly trigger save operations, relying on `ManagementSystem` which delegates to `Storage` to persist changes. ---- ### Design Considerations @@ -136,8 +154,6 @@ The `Command` component is responsible for **handling and executing user command - **Single Responsibility** Each command focuses on exactly one task (e.g., marking an appointment). This keeps classes small, cohesive, and easier to test or maintain. ---- - ### Remarks - Commands are **stateless** aside from storing the **parameters** needed for execution (e.g., an appointment ID to be deleted). @@ -177,10 +193,12 @@ The `UI` component is responsible for handling all user interactions. It present
    +--- ### Main component **API**: [`ClinicEase.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/ClinicEase.java) ![Main Component](diagrams/mainComponent.png) + The `Main` component is the **entry point** of the application. #### Responsibilities @@ -197,7 +215,7 @@ The `Main` component is the **entry point** of the application.
    - +--- ### Parser Component **API** : [`Parser.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/miscellaneous/Parser.java) @@ -245,11 +263,11 @@ public static Command parse(String userInput) throws InvalidInputFormatException 3. The `Appointment` object will be constructed using extracted data. Then, `AddAppointmentCommand` object is created, it will be returned to `ClinicEase` for further operations. ----
    +--- ### Manager Component **API**: [`ManagementSystem.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/manager/ManagementSystem.java) @@ -281,6 +299,8 @@ The `ManagementSystem` class in manager component acts as the central coordinato
    +--- + ### Objects Component ![Object Component](diagrams/objectComponent.png) @@ -288,7 +308,6 @@ The `ManagementSystem` class in manager component acts as the central coordinato The **Objects** component defines the objects used by the **Manager** component, which are **Patient**, **Appointment**, and **Prescription**. These objects encompass the data and behavior specific to their respective classes. ---- #### Patient Class @@ -307,7 +326,6 @@ The `Patient` class represents a patient, including personal details, appointmen - Can hold **appointments** and **prescriptions** for the patient. - Provides methods for managing appointments and prescriptions directly tied to the patient. ---- #### Appointment Class @@ -359,7 +377,7 @@ The `Prescription` class represents a prescription, typically linked to a patien
    - +--- ### Storage Component **API** : [`Storage.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/storage/Storage.java) @@ -396,6 +414,7 @@ The `Storage` class handles:
    +--- ## Implementation ### View patient feature @@ -427,9 +446,86 @@ The sequence diagram below illustrates how the operation for 'view-patient' woul --- +### Add patient feature +The `add-patient` feature allows users to register new patients by providing their personal information. +The system ensures that the **input is valid** and that the **patient does not already exist** before adding them to the patient list. + +**Step 1.** +The user launches the application for the first time. `ClinicEase` will be initialized with the saved data (if any). +The system loads the stored list of patients and appointments. The user is now ready to register a new patient. + +**Step 2.** +The user executes the following command to add a new patient: + +`add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St h/Diabetes, Hypertension` + +This command is read by the `ClinicEase` class and passed to the `Parser`. +The `Parser` class identifies the command as `add-patient` and parses the fields. A `Patient` object is then constructed from the parsed data. + +> **Note** +> If any required field (such as name, NRIC, or address) is missing, the parser will return `null`, and the system will display an appropriate error message. +> The patient will not be added in this case. + +**Step 3.** +The `ManagementSystem.addPatient()` method is called with the parsed input. +The method first checks if a patient with the same NRIC already exists in the system. +If the NRIC is unique and all details are present, a new `Patient` object is added to the patient list. + +> **Note** +> If the NRIC already exists, a message is shown to inform the user that the patient has already been registered. + +**Step 4.** +After successful registration, `Storage.savePatients()` is called to update the saved patient list on disk. +If saving fails, `ClinicEase` catches an `UnloadedStorageException` and alerts the user. + +The following sequence diagram shows how an `add-patient` operation flows through the system: +![add-patient](./diagrams/addPatientSequence.png) + +--- + +### Delete patient feature +The `delete-patient` feature allows users to **remove a patient** from the system using their **NRIC**. +When a patient is deleted, all their associated **appointments** are also removed to maintain data consistency. + +### Step 1. +The user launches the application. `ClinicEase` loads any saved data, including the patient list and appointments. +The user is now ready to delete a patient from the system. + +### Step 2. +The user executes the following command: + +`delete-patient S1234567A` + +This command is passed to the `Parser` class. +The `Parser` identifies the command as `delete-patient`, extracts the NRIC `S1234567A`, and passes it to a new `DeletePatientCommand`. + +> **Note** +> If the input format is incorrect (e.g., `delete-patient` with no NRIC), the parser throws an `InvalidInputFormatException` and displays an error message to the user. + +### Step 3. +The `DeletePatientCommand.execute()` method calls `ManagementSystem.deletePatient(nric)`. + +The method first **searches for the patient** with the provided NRIC in the patient list. +If found: +- The patient is removed from the list. +- All of the patient’s appointments are also removed. +- Both `patients` and `appointments` are saved using `Storage.savePatients()` and `Storage.saveAppointments()`. + +> **Note** +> If the NRIC is not found, the method returns `null` and an appropriate message is displayed. + +### Step 4. +Once the patient is successfully deleted, a confirmation message is shown to the user. +If saving to disk fails, an `UnloadedStorageException` is thrown and handled by the system to alert the user. + +The following sequence diagram shows how a `delete-patient` operation flows through the system: +![delete-patient](./diagrams/deletePatientSequence.png) + +--- + ### Add/delete appointment feature -The `add-appointment` and `delete-appointment` features allow users to manage appointments for registered patients. -The system ensures that the **patient exists** before adding the appointment and that the **appointment exists** before deleting it. +The `add-appointment` and `delete-appointment` features allow users to manage appointments for registered patients. +The system ensures that the **patient exists** before adding the appointment and that the **appointment exists** before deleting it. All changes are stored persistently. #### Add Appointment @@ -437,11 +533,11 @@ The add-appointment feature lets users schedule appointments for patients who ar **Example usage scenario** and how the `add appointment` mechanism behaves at each step: -Step 1. The user launches the application for the first time. The `ClinicEase` is initialized with the stored list of +Step 1. The user launches the application for the first time. The `ClinicEase` is initialized with the stored list of patients and appointments. The user is now ready to add a new appointment. -Step 2. The user executes the command: `add-appointment ic/S1234567D ...` to add the appointment to the appointment list. -This command let `ClinicEase` class reads the user input and passes it to the `Parser`. +Step 2. The user executes the command: `add-appointment ic/S1234567D ...` to add the appointment to the appointment list. +This command let `ClinicEase` class reads the user input and passes it to the `Parser`. The `Parser` class determines that the command is `add-appointment` and creates an `AddAppointmentCommand` object. ```` @@ -454,14 +550,14 @@ public static Command parse(String userInput) throws InvalidInputFormatException > **Note:**
    > If the input does not match the expected format, an InvalidInputFormatException is thrown. Hence, the appointment will -> not be successfully added and stored. +> not be successfully added and stored. -Step 3. The system calls `execute()` method in `AddAppointmentCommand`. Then, this class calls `ManagementSystem.addAppointment()` -to add the appointment to the system. `ManagementSystem` checks if the patient exists using `findPatientByNRIC()`. +Step 3. The system calls `execute()` method in `AddAppointmentCommand`. Then, this class calls `ManagementSystem.addAppointment()` +to add the appointment to the system. `ManagementSystem` checks if the patient exists using `findPatientByNRIC()`. - If the patient is found, the system creates an `Appointment` object and adds it to the appointment list. - Conditions the appointment fail to be added and stored: - - If the patient's NRIC does not exist (a `PatientNotFoundException` is thrown). - - If the appointment clashes with another scheduled within 1 hour (an `AppointmentClashException` is thrown). + - If the patient's NRIC does not exist (a `PatientNotFoundException` is thrown). + - If the appointment clashes with another scheduled within 1 hour (an `AppointmentClashException` is thrown). Step 4. After the appointment is successfully added, `Storage.saveAppointments()` is called to update the stored appointment list. If saving fails, `ClinicEase` catches an `UnloadedStorageException` and informs the user. @@ -485,14 +581,14 @@ public static Appointment parseAddAppointment(String input) throws InvalidInputF The `delete-appointment` feature allows users to remove an appointment that is no longer required. **Example usage scenario** and how the `delete appointment` mechanism behaves at each step: -Step 1. Suppose the user has already added one or more appointments and wishes to delete one. The appointment must -exist in the current appointment list. +Step 1. Suppose the user has already added one or more appointments and wishes to delete one. The appointment must +exist in the current appointment list. -Step 2. The user needs to know the appointment ID of the appointment to be deleted. If unsure, he/she may execute the +Step 2. The user needs to know the appointment ID of the appointment to be deleted. If unsure, he/she may execute the `list-appointment` command to view all existing appointments. -Step 3. The user executes the command `delete-appointment A100`. Similar to `add appointment`, The `ClinicEase` class -reads the user input and passes it to the `Parser`, which creates a `DeleteAppointmentCommand` object using the provided +Step 3. The user executes the command `delete-appointment A100`. Similar to `add appointment`, The `ClinicEase` class +reads the user input and passes it to the `Parser`, which creates a `DeleteAppointmentCommand` object using the provided `APPOINTMENT_ID`. ```` @@ -504,7 +600,7 @@ public static Command parse(String userInput) throws InvalidInputFormatException ```` Step 4. The system calls `execute()` method in `DeleteAppointmentCommand`. Then, it calls `ManagementSystem.deleteAppointment()` -which removes the corresponding `Appointment` object from the list. +which removes the corresponding `Appointment` object from the list. - The system searches for the appointment with the specified `APPOINTMENT_ID`. - If found, it removes the appointment from the list. @@ -512,12 +608,12 @@ which removes the corresponding `Appointment` object from the list. > **Note:** > - If the `APPOINTMENT_ID` is invalid, an error message will be displayed and the deletion will not proceed. -> - When a **specified patient** is **deleted**, all **appointment records associated** with that patient will be **removed** too. +> - When a **specified patient** is **deleted**, all **appointment records associated** with that patient will be **removed** too. Step 5. After successful deletion, the system updates the stored list using `Storage.saveAppointments()`. -The following sequence diagram shows how an `delete-appointment` operation goes through the system **(positive case, -where the appointment exists and is successfully deleted):** +The following sequence diagram shows how an `delete-appointment` operation goes through the system **(positive case, +where the appointment exists and is successfully deleted):** ![delete-appointment](./diagrams/deleteAppointmentSequence.png) ### Why they are implemented this way @@ -526,25 +622,25 @@ This structure helps improve modularity, testability, and clarity in our codebas - By using distinct `Command` classes (`AddAppointmentCommand`, `DeleteAppointmentCommand)`, each operation is encapsulated with its own logic, making it easier to maintain and extend. -- Centralizing the data logic in ManagementSystem so that it is easier to maintain and test appointment-related operations. +- Centralizing the data logic in ManagementSystem so that it is easier to maintain and test appointment-related operations. - Validating `NRIC` and `APPOINTMENT_ID` before performing operations could prevent invalid data from entering the system and improves user experience by providing clear error feedback. -This design also aligns with the **Separation of Concerns** principle, allowing changes in one component (e.g., how appointments are stored) +This design also aligns with the **Separation of Concerns** principle, allowing changes in one component (e.g., how appointments are stored) without affecting others (e.g., how commands are parsed or executed). ### Design considerations: #### Aspect: Where to store appointment data 1. **Alternative 1 (current choice)**: Maintain a centralized appointment list in `ManagementSystem` and update each patient's internal appointment list. - - **Pros:** Enables efficient listing, searching, and clash detection. - - **Cons:** Requires synchronization between the central list and per-patient records (slight redundancy). - + - **Pros:** Enables efficient listing, searching, and clash detection. + - **Cons:** Requires synchronization between the central list and per-patient records (slight redundancy). + 2. **Alternative 2:** Allowing appointment creation without verifying patient existence
    - **Pros:** Simplifies implementation as patient verification is not needed. - **Cons:** Compromises data integrity, as appointments could become orphaned (unlinked to valid patients). - + 3. **Alternative 3:** Store appointments exclusively in `Patient` objects
    - **Pros:** Keeps appointment data stored within each patient and reduces need for cross-references. @@ -553,83 +649,6 @@ without affecting others (e.g., how commands are parsed or executed). --- -### Add patient feature -The `add-patient` feature allows users to register new patients by providing their personal information. -The system ensures that the **input is valid** and that the **patient does not already exist** before adding them to the patient list. - -**Step 1.** -The user launches the application for the first time. `ClinicEase` will be initialized with the saved data (if any). -The system loads the stored list of patients and appointments. The user is now ready to register a new patient. - -**Step 2.** -The user executes the following command to add a new patient: - -`add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St h/Diabetes, Hypertension` - -This command is read by the `ClinicEase` class and passed to the `Parser`. -The `Parser` class identifies the command as `add-patient` and parses the fields. A `Patient` object is then constructed from the parsed data. - -> **Note** -> If any required field (such as name, NRIC, or address) is missing, the parser will return `null`, and the system will display an appropriate error message. -> The patient will not be added in this case. - -**Step 3.** -The `ManagementSystem.addPatient()` method is called with the parsed input. -The method first checks if a patient with the same NRIC already exists in the system. -If the NRIC is unique and all details are present, a new `Patient` object is added to the patient list. - -> **Note** -> If the NRIC already exists, a message is shown to inform the user that the patient has already been registered. - -**Step 4.** -After successful registration, `Storage.savePatients()` is called to update the saved patient list on disk. -If saving fails, `ClinicEase` catches an `UnloadedStorageException` and alerts the user. - -The following sequence diagram shows how an `add-patient` operation flows through the system: -![add-patient](./diagrams/addPatientSequence.png) - ---- - -### Delete patient feature -The `delete-patient` feature allows users to **remove a patient** from the system using their **NRIC**. -When a patient is deleted, all their associated **appointments** are also removed to maintain data consistency. - -### Step 1. -The user launches the application. `ClinicEase` loads any saved data, including the patient list and appointments. -The user is now ready to delete a patient from the system. - -### Step 2. -The user executes the following command: - -`delete-patient S1234567A` - -This command is passed to the `Parser` class. -The `Parser` identifies the command as `delete-patient`, extracts the NRIC `S1234567A`, and passes it to a new `DeletePatientCommand`. - -> **Note** -> If the input format is incorrect (e.g., `delete-patient` with no NRIC), the parser throws an `InvalidInputFormatException` and displays an error message to the user. - -### Step 3. -The `DeletePatientCommand.execute()` method calls `ManagementSystem.deletePatient(nric)`. - -The method first **searches for the patient** with the provided NRIC in the patient list. -If found: -- The patient is removed from the list. -- All of the patient’s appointments are also removed. -- Both `patients` and `appointments` are saved using `Storage.savePatients()` and `Storage.saveAppointments()`. - -> **Note** -> If the NRIC is not found, the method returns `null` and an appropriate message is displayed. - -### Step 4. -Once the patient is successfully deleted, a confirmation message is shown to the user. -If saving to disk fails, an `UnloadedStorageException` is thrown and handled by the system to alert the user. - -The following sequence diagram shows how a `delete-patient` operation flows through the system: -![delete-patient](./diagrams/deletePatientSequence.png) - ---- - ### Storing Medical History Feature The `store-history` feature allows users to **add new medical history entries** for a specific patient in the system. @@ -838,6 +857,8 @@ The class diagram below shows the relationships between these classes: --- +## Appendix: Requirements + ## Product scope ### Target user profile @@ -1073,11 +1094,13 @@ Use case resumes at step 1. ## Non-Functional Requirements 1. Should work on any mainstream OS as long as it has Java `17` or above installed. 2. The system should efficiently manage up to 1000 patients or appointments without any noticeable performance lag during typical usage. -3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks within 40 seconds using CLI commands. +3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks within 30 seconds using CLI commands. 4. All error messages should clearly indicate how to correct the invalid input. 5. Data files should be compatible across different OS platforms. 6. All functionality should be accessible via keyboard-only commands. +--- + ## Glossary * *Mainstream OS* - Windows, Linux, Unix, macOS * *Performance Lag* – A noticeable delay or slowdown in the system's response to user actions. @@ -1086,11 +1109,10 @@ Use case resumes at step 1. --- -## Instructions for Manual Testing +## Appendix: Instructions for Manual Testing Below is a suggested guide for **manual testing** of the ClinicEase application in a Command Line Interface (CLI) environment. ---- ## 1. Getting Started @@ -1155,7 +1177,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application - **Missing required fields** (e.g., no `a/ADDRESS`) should produce an `InvalidInputFormatException` message. - **Duplicate NRIC** should produce a `DuplicatePatientIDException`. ---- ### 2.2 List All Patients @@ -1180,8 +1201,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` ---- - ### 2.3 View a Patient by NRIC **Command Format**: `view-patient NRIC` @@ -1193,7 +1212,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` 2. If the patient is found, detailed information is displayed. Otherwise, the system notifies you that no matching patient was found. ---- ### 2.4 Delete a Patient @@ -1213,8 +1231,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` 3. If the patient doesn't exist, it notifies you accordingly. ---- - ### 2.5 Edit Patient Information @@ -1255,7 +1271,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` 2. If the patient doesn't exist, the system creates a new one and prints a confirmation message. If the patient exists, it simply adds new history entries. ---- ### 3.2 View Medical History @@ -1302,7 +1317,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` 2. If the patient is found, the system adds the appointment and shows a success message. If the patient doesn't exist, it prints an error. ---- ### 4.2 List Appointments @@ -1316,7 +1330,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application 2. Shows all appointments if any exist. Otherwise, prints a "No appointments found" message. ---- ### 4.3 Sort Appointments @@ -1337,7 +1350,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` - Appointments should be sorted by their `Axxx` IDs. ---- ### 4.4 Mark and Unmark an Appointment @@ -1355,7 +1367,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` - The system reverts the appointment to undone (`[ ]`). ---- ### 4.5 Find an Appointment by NRIC @@ -1401,7 +1412,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` * Expected output: Error shown. Patient ID does not exist. ---- ### 5.2 Viewing Prescriptions @@ -1431,7 +1441,6 @@ Below is a suggested guide for **manual testing** of the ClinicEase application ``` * Expected output: Error shown. Invalid prescription ID. ---- ### 5.3 Generating HTML Prescriptions diff --git a/docs/UserGuide.md b/docs/UserGuide.md index cdd951a08d..dd83146fcf 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -209,6 +209,7 @@ Format: `add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION` `dd` is day (e.g., `2025-03-31`). * `TIME` format: `HHmm` in 24-hour format (e.g., `1430` for 2:30 PM). * `DATE` and `TIME` **must not** be **before current date/time**. +* The new appointment will only be added if it does not clash with the others. Example of usage: From 92d4032705acfae0f90dccf2297116855568565a Mon Sep 17 00:00:00 2001 From: judHoka Date: Tue, 8 Apr 2025 11:58:35 +0800 Subject: [PATCH 187/203] Updated DG and UG some more, filled in PPP --- docs/DeveloperGuide.md | 2 +- docs/UserGuide.md | 6 +-- docs/team/judhoka.md | 120 +++++++++++++++++++++++------------------ 3 files changed, 72 insertions(+), 56 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4f876b31ea..549c48264c 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1282,7 +1282,7 @@ Below is a suggested guide for **manual testing** of the ClinicEase application - Run the compiled main class: ``` java ClinicEase - ``` + ``` You should see a welcome message that looks like this: ``` -------------------------------------------------------------------------------- diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 2fcea0a503..0879a7ed36 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -72,13 +72,14 @@ Here are some feature that the product provides: > - Command words are **case-insensitive**.
    e.g. `liST-paTIEnt` will be interpreted as `list-patient`. + + ### Viewing help: `help` Shows all available commands of the application. Format: `help` ---- - +
    ### Adding a new patient : `add-patient` Adds a new patient to the system with their credentials. @@ -199,7 +200,6 @@ Edit-patient command executed. ----------------------------------------------------------------------------------------------------

    UFU{QyEiCAMm$5$0AB1u52 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� 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

    F#qC4SXDXsNYkP;KA8e?Qq0)EsB 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 UzFM-M4gZ*K+hLez;2i#c08Hitf&c&j literal 41221 zcmce;c|4SF|2~{#jmSPNz&z7ZZjciS3gi^@9i%?lY zWM3ldknEoK(C2gC&-Z!0uh;YY=ehs6?^`q1T-SNNm*Y6z$9aWbG|;4{<)YoUZy&w3 z)`d&^_L0@^+qZw5dO!T-?4*MS{Fj)ky0PmGM<>i}8(Y_Xnl^WB?peCpSRb>(9J}f2 z>f~}(O3LZBB=Y3#wkNz z9B$l5`V#PEHR1Z@^Ebxl3VE7ua>u>YyZPPEqK50RbJ*tQz|v!-TzZF&%UMpI|yU%h;I52^?dqqu{K`F3orF=c!Xe|yqoPYhqjgcBNqa0o9SRwH< zF}Yb*#St6wTj#u=J*hq?KdwY@q%68ipgb-<9Xj{Plj6ODtHH&O-)|<$HH3Ltg=z-; z3F3C7cBC2^U+yB89?j?s6Zbm(reBD?rq*X!V%Ax^k0W2dE>8K4Xas5uA6<4tZCxgc zr=Awm-LpgYpyzJe`gH8Xy#ILEhk-WQ^ITbOi(K;&8-A(kC2j@$`j>XYY%ZKhvQu5<%Lq9XV3!yXBek zT-~_b^Y{B(-3w-nYOAUku>zYvqo-I-`fT$QBe^L~Md?|p0Y$-K%KPsRmpz|v3|6;2+s7B2zf*hCkS$92}5_mW=re;u&dKj*} z3G2bc!I6N)MlvtYZ*Fd0*WGLlV7z+~dvBOH{)sXB%(em#_aNB9DS<8WpE zA11>&Wl!JjU)@|=diU;Kr}stEQn%UVsSbNv9qJtsfKw2+d zjAN`%LyWV)CWoEJh`oP(t*EW*Tw^4+bGEdT<0=)Snzb6HIs3yY6~PPk|N9r4MPU_L zg5kFzW<(DCpa1gz@db!KXZwnNl-z&hx44fl;6@y-zp1GS_UMD}*4fR27NeGG)OiqT zKQ6g2R|JK9JHr=X5r;b(8Xiu^z@VxAN|l?HhVN)P zV!VF*)3awMt_2a+UL49O)}bDz8y98gQSn9GXrMFg+Mkh6pUb4?p@tEwjEjqFiWRoA zu^A>iAx+y?_0+?kv4$R^ZHgzZq)w9Wf<_$fB=h@dsl_{FY9ZkeA(@R-`t{zo)v2Gb zk7wUr9ypBu@&ixJ_cj9&AN)XZI^)MS4Icu6k1Up4TP`?@N$t!z*co;yb7_UIp-$gf ziscci)K6%}vpcWknYT_~@ODyha)f(?KmB*A>P%0xCObPje~*7AWr0<6mz0-BmugWP z@;4i4cM;HzRsLk(v0ixh2kl_GPf-Bllp$6JpMWTLnLOlun3p$CiS}(l!Ol|Zj>Oe>T1Hdd zc@}@>ek>7}I-8rrlt1wYFvsCy#DtK1@^^0E7DM4r`EIV(1~c4hbMc)0F4uGY%Zqc; zvd>T7;cB^-EO*P+&hFW>RGf5bSB3oU{s@lG&CN|sWt*9lxY|#(X9d=h3WM7D^L<5* zJ6&iCRQ9FufpV{l2$u=EG0}kA(QLzUKG8U4VS~t05(e1?@A|xk-Rd#0EbHzWy!Mtrra^lC2lTTzmdGf@jIWAGf zPnoX1zP?)DGM$$5>U)Q-p`q);rJjH0=sQruvLa5S4H58ElaSgqoXtkrCoC#9`y49+ zMJI8ozUxiGsdPLDV-LdebQfXJ=MQ(zmiXmY`_AW2Bauk>cI&UvxiI1V^*g(-?hYK`AN=iZP zhzlgfK_&)>92^&|Bvmc8|KBf=wSdsq)7$i$cA4%J-MsLTR2ywX1&~NAV(oXgh2IMu z{p8a=f9AM-HJ~QKqp-x_U{~;$vYH{}7dKlw1A~Hmm%nNb3=FJt?j~dN!=+P_l80W} zM@ziQW%^O-zO&NjC@U+w=znzg8B=hLQM|zjrF&!4ctYI+a;l;3!6HXqo@jE?(mY&Z zd0NgWvLJ;gT)1-OTjkEyJXXnTgiHb2aJmFP@syB|ZC~M?Bl33LFb!f%;Xs-4YA zm7Ud529CFdg+a+a8!N1Z7vvw~MjIedy0^bRWEHhi^ScWIZ;94=1X2YOl$V?P_1cQn&*C@HIEXrDr4yy@ z^9_A6G0Dl-($pwc^%woeNK5iGW~p;vfJZD#C!R?t^WoUon4Eq# zLb@N}At5*0Gik^z8v(pK=sboUOKh|BOyHS1g_e>wJTWv%|Ma4InUaIfY$HCzPsv*9B9 z>D7f=hEH*#y#FNPXO@jDia3^43DDYY}22XJMA zb#Z&@5fwv#qJq~-j;;Gw_}{b{c5Nw#-8R=7RkryAqy%O{nT3y?l2Z{mc5L4?V=1YG z^rxJ@ljJ14-{V!p5&3VqT2Z?R!iUUAPY(!CbIvfl>7SmQ|BdbL%KRYj-7DFbvW6O< zX0rP-3KUD@`Nl*gsub-piz9*3v|njl>=Ld&J#lSiaA&*7N!ZB|nX1e>uo7sMp%D>8 ze?(~WQW9@xy86M--fGyAk`jll7KESQPL%Sx2p`|MQV}RGYH?Ws2%nW1&YX(0OP$uQ zzwA3PJt0-OxnExVN{+FUD_{e)mTGS!jxLdjtq#aDzqRpa(hj$7Dc&3V2qCLo%skwI z39)r|cel)vqGn*|-h2T~>D!m~3LmdoFUXz1I}@K%^UUHnNXd9f4ZA;~k%o+gi78#w zyu?+Tx?+U<@*jkf-*(x8kq{Cq5&jTxTA9_7E97L2JE?NFLMG72^C1fg3S92pBNEZ; z(qc37Heoz>wtXzsH_!R9)LeKEAbR0` z+J-KxUqJ$*_0x{E_Npl3i$|37_ne%*Y$K*0ZE_c$3h0T5jARQs>o#)+@JTC`MKlhQ z^pvdZqYauvhgO!BHYSoCU(Egbb#RcPa=-W1Y|)@Wf;69q$Sc2{ZN_gd6D@~%f++P2 zEM*g3rI%R$O+=Qu#>PK0y-Nk3m6_XV&nPO^vdHDB3bFYWtRnOc4CWxMN$rt$aSE3@ z_oGxkFXVHEkU@%wclRs9i~x6mitY7Z01s$0qH$3?N>C@mY&R}t>D>SMWf-aoW-ayH z@98ex)ywbiG zI|B#rKYxTGNg#~|9GGn$HRzpK$8;aPC#>o0)CZc<18KBegPfw0(9@BsVa_9-Ig=#`lVq*M> zYgZaNOb=(hn26^d7j@5h{rXntE3$*$A3K2AbVELAM)7zYSEK#=?@uL6_G@1)x@$&l zGAiDV7lQ_GxSz^ z;}^qshZqoAo5c~ThmnDoLOh%HZa#=#?ZRc3={s#H3aeDiKB52q-5SHi$jB%XwDKp+ z!Jym_%O6v2y}JfB=iegKx2_=0CmA`$;X%_69c0IRc4Gf-dQCDMk;Z6&DG;ZhX^7|wUo9t{GZN${!!qQ(fN?wB{(TC{m-Ju;ke>(bpNgvP-+k* z&Zqygb>}enbC~AnSN}ZyMXbX`?Em+#r)gqI>_|vRqm+rA-F^Az*Re6{)%EZ1Z%uwq z?dFk7c{S0QJb+0`Nbne{dXS%=zp${7EblmCiDLTw&r&H7-x)kV>$AT6HCHvRDt2dc z&1JO&LZAM~>CV4b@Wqs1mL@ladaEfYFKO)8rl^S@VWHlkM|y6$Xm z@%k)({gQS*aFDxd^PTQ9Nh!eh8$tNv|Gg@nW1aR8yIscC0736!ly=>P?V!kIJ0A3gwiMlQ{kIGX%qXz#DB2|W1g+v~m; z=g52XWL*LNhWL7HI!%JC5*88BMaOCI@BWA&bX+V!TLR{6n}1exUi` zMI{fz81w#v-#U|M^-f%Sck@Y1sxz#}w@ynzWrt3YR(;spL|Hppi(hYTWK=}5s+6h% zI%{i>3#z!i&dKpz9S(*%IyX?RC@QL5K+pVd9779gwk znDw!ySb#p%Y+pT&4T9J(tTG1B^;A3%hLYmq%rUzZH;J_;LFT~_mbDxmL6TA?SJHk zbx_T(`9#Hxx-1{?Z!-RTf`dE=q+I#)CwRzTVG4kFF;4F*=2N=wMV$v;U&icRU6)Bx z25d}nVq*1UYQi?$w*6_@l>a>KGo0v}%Nv);wsY5%eb!l`-U#6pe!sN9(()*KQzPpk z?G{zHdA6nNPQRwjYGh!lP%m&{{ZA=NbI0mvLuG7@MhJ%dd)5D0(84};ym)a8x{E(C zj<4AWxU|iq9fZ&JCI;dr7d+`F6wly(2S{g_sL@umZW>(hlVBPiqe4n=22=p5U0Oq#0Zk68ded|6y zV8106l>VQKm||%`67}0&n@p0s1-T_AE`Bg#8Wh2_hf*dof7_qh(q%?w=8gh8q^4#g z0I5p99Ug|q7ck8i4W&%d{(dNZ>9W(xOm8H&BJh`E{QUeR{PjzZ)JR!&V)*vj;&BOy z@Yz7ggh#`$>5V^iS^2_vMA*S`R(>O%+z1v{Buc=k|KsNm<$Q^78tL5T5R2 zMc>UclH>E&!gT$pNLYZ>s2?+Oa`qNGk3x#1oN?YC6@Q@;_wbmN#ao1f`61{gvGE|4 z9ra+&wqNgl~7i%5#E6o>~_DtwtFV3ExNiWZcTH*T|6XRY+~!U+U| zTh;|dw;8Awyw@i}rU3|UZT!(xAM5|%Qdn3B^ugnW@xn*IypE2JD%Y#_CCCh0)-dma z867gAG$?Xv^-%M-fqT9(F01g_P!oD8W#Rkj>51?6jah3hysbmeetUflBIas=Ej^Ej zHVAdloo?U0tr2;2?dR9y2)$L+-Nnmz6l&R;BxeCS_;f`@g>>G9daKNrFRu`;%x-uC zaMNDfAj<$HNpoxcx2`Fl8dr_&(&Xnx^0WR_(q1dKb#*^M%@P(88nNV;-@QLB^wq0L zv9U(h)&e{qKmGdt{ue}-^ZT3mJ?_rVhl%fiO#{JEJF@(%+wp6<`YU5bfl~NSR1^cx z7yV0@+JQw&!2WwO?MtWHyWq2;qCY)vZaB-OmY4gOnjXz%qi5T=|La?zz!t3Eu}i~) za7VWs7Z!%ki;EL*$W#aRgA@wT&&f<#kMr?acD^z^efl)44fAi#Q!+ez7wsNxi~=tH zh=9QW#6}UWbomrvTCI4mtV=TlN`MrRlaX=5&8=|7R@(09S=U!?^{*fW%FD_ex^v5& zM>T30a`-9JcefV-h_B4iBa%tD2L8XkD4&sV*~;S|rDNm25; zQhM_?yQJyQ&TOOFAo@SEeZh?(0lUc|76pJJoJWZZ{h0Fc79i|{jS^d{qfzKQ^FS#G ze^iDBz462?#}Buk*^>SbmBSBDWMpK>$v1{`l6PEdZH4Qkcc@u>xK}?gVBYy5oi8UD7jGc+!h?2!YxudO6h-$#=z~tq&L3c=lFLTMWVB)Hq^In5y9 zj!;|}9T_>w&Fze`lm6W?UT#3$2r>cE6tVHYG*rfb>{o~gA5;OdAe3+`z+@WPD522f96Lm)1`KQ z>+PHC)%$<^DV`Z9FSWik06Lh$*|YaNLX;4hz%>C_czAgoaXgzNwp)VZ&p~iH4pu}E zG)BkA-{0;%X*yo}t2=LNb5r8P2^dZ#!@Mgvlw=NM7I`bwBG^67h z;Z-P^r+~4w(F-*vT5Rm>^32P>fBWVJbb(2rxM`Q)W@CYU0A!c@w#33*9 zhK7c&tgJw#Y9K!gPyLVw&7mGd$H~OQ6G;$!Am^2;?Bj$ISQT&2vrsXWOM*db+WFv` z0{uq((~#XwwA9M5}JuNf*O}8Sm-I$s&kzcrsA!&bt2eC(ynDI1e%l zsC_$7zdgb)F5UAdUQU7iy?X6hZKa2*9n{Pd%d|e}Rdj|?8N?+blC=kb&!4AzvtC>V=|e_FRxB0|=!S%#F&NP8hGpW@cB^(Kuo1+)F)h>hN5R33 zfLxtXQcz=pT))jP$q2oD`!+xx_2}V4IzPv&ANJNP8{&?NifR;pG?G_k0D|j^FfV3( zIXfd`6vB1UKLF~^X{$PFFRu*m%n0770rL!&*dQjvze3gC2 zn^}(>Inw(`LSEh-BuQyQZdu##Q^5`Q9`43RJ@mAx&g|IX;9!U1($XWv!T$bTlUL13 zTzktfvbkLQd=-QIeCeJ%eL68YNwrqt`P<=&<1MGiy)TnyV^DOAeGVOZQJ$ERIt67F zaR)dft$u^}oWJBb1Z?$21;fmmHEA-&K6<`7Rk5fr$Ni)Aa}l zW-!8OM3vXo)t$QYodx~-{^sf;fZ~&w-E*up1!^UA6-rJy%KgPR{S|f z6D0L@)^LIZ!h1Cz#tT8IYJD8JrXSjKOk|;rbevg9-QAD&#M5`K-n=Q2O9ZvDNIO;t|!~Y4i1;D`j(HN$~hb;ky z0+fMCI^yL4_yMCEShkW4zMQ%UcESB{QzXem3<-{go(xR}Q&cPf35Fx5b3iid z)8VFhTeb}Hpt;f%s1cxPe8wuBzh4M~qJoODFpvqMoAP)2tH{M%Ru?QG#dvvn4cgRS z9G5#KHQAYfyQ#UgyzFW`$#cd@we+K@fq_9FEi3JFu3y72tC0?_L9ww(nbR?!GDW4r zz#jN_O|19gh&rM{oOFT9&u~zVfKz{~_`U=<63W8s_o0SWYV9yafo+Cv2HQL$b};(* z)2B~qXlOiC<9&Cw{=ih0f{IFfB*QP((R@2w5-DX?vb^nxA??1Si1US zr}+1lwLvl}Q{jtMe(?~cksLDoFfoi;tR72#=7;}ebdyF_w&0;rJ;X6}_RpU;kCz)2 zg1i%iK5gTr9QQESqS72n{;Ydq1mE%F8K8Foq^>0|Yi?!wT^x z$#k^!_gE7%R8T;+BV>`)9s6(j33Zd*`1CFreYi6o2TB;sM*IEsIoVQP*kzQ0T_9`dH>!AoJl-G9GglmuC8NuZ0~$;B~VW{cYsj@ zCQrUQ>< z$Foa8vk2N?|D}0*iD?492Yh2R!H_xO)reiD^!#8Y2%LyohKIm+gnLb1MDi#(bl#w% z(c9y4f!sJCT92s0 zCqTA>CXqg1FkB6K1k`nBl$urYGignX10(m+GT;>`5ycMv5G3JTae>gwLUna@v4b_>Z=-LaFUCfOhu;8yG?i0+)2f?bephI5 z_!4Q^anlIap9z`!w}|hc^Z{_GLD|qAJa|OL>OigzKd_L2f$f>z0uO&(6B84VL}G{` zzNDwmKx|c-;OAgM(TJG+lJ>~dAw`-xyFgJ2geOlYBjPC7Csa4?HeN#FHW4auW>lauQEs= zA)i;mX2E=PNmAf&f`HnKQT*lW4yI5KRkl~j8Jx76mH7V+{Rw;6uim-BCd3Q%rna`A zL9GTVMs991D8K5aa{IPtKHu^A4V#XLGr#;9;S06pQhJ2NSf{ zVSE4&0v^4LxUdis9$tq!&e&HLpwMje=w}R0K|#UR*7o+F-c$1O!Ksl1rV^m3vmy8l z@Gt?h;6_KNl6F-DNuREZt!a6u6E9ZmkO0y|ZTb;(R@W=TQK z8|fJgf)Ih(tzW%`ky!851wNiDEM~-0qM|h4Y0&ihwoKkwshh@|YH5WO70Ktu)aWIh zvWH1(adQ&sahjrW;PF@m-Gek6@C8MCp`gFNAGDW64cataY(ryXceW7~I({C!YYXoD z03H~k_X9sRuJrXWwb3Wt?^sg@baYyaR0Wp_K-s`!w+7`6>CA}B0P`0%M)2A<`wCAm zH2Me%3BBDa{>))&Y6|}nOwbFxV_uWef}zz2=UDvVK3L5T87@6GG;|RN;c#tm?XqS; zL{!vg$I2}dd*GOc!T4pE4RvMdvMVYog6;_+VQ*Uui2T+-*@xG!PgpNQV+mV#yW-l^ z0p)BPo~zh_>07Ru_~QL_S~<&_1KUU`Qep5&DQ=G2U4T?vbP!2+YpQ(eqpGTU;X)lW zYq02D_sQ&S=<0e80vfah5LsG*=!0&zn7XrR2Yx?jB9D?623fut<@b`t3n0XUs{$r1 z!0i2Ch64#iQEBE<6x1Pz1pFmFIxw$6n#sDjEPdcP(W7*;{NQV;Hb zKwV(is#LWClkbIDunqN>d%0h_bV+Ahao@s6xOoOyBkG$8?@rsdADF`r70G7mVj(y3 zEh>GB9mD{x9O!If3M7%PlaQ&R)oW@-GH#T6KR!}tQ&#llBE%dK}UsVbFU z9PQMfAp!?)LUn^5K4U_BM3PNXkr;*};yjzUK#c#Q+fg=Bnwk?&oj%RxJ4Z5NCNEI* zO9&z5hIT}jW$SK2%z_E$Tb@N!k;qCPJv__Z@9#oqa|BMEa)mxwEXHf_bo07_vgx=s zbg>Bc_T8E{Du_%4b&R>4BvN#PO(Fks@NZv33>PyqX@>x}*LE{z09YoCbn?>PSmug( zQ&L=yDFr#;;b2>|B&GxmS0MS0;>m!rP%Pawjb{+n-3CZ|W|YYeL}+DLM^l>%q&)O! zGTJBm7-G@y&kuJC??v_N*N0#B5ybNs=on!ofKpeJf`dkUS+1J;1WU7pc)B%LgW7$Tb*?^|= za7~m)qy@$ge8wbOBf$BK!3q+~3S3qO&k#Vi`T7Vv^t{U6kfOz6;vf%^Qyqc^6%HgG zFriaC1*tQPiX&MypCO(nGeCIiWdzF3!DCu zMxNU|4g3fe4G^V=>RqS}H@4aE|5@YN4jco6@SA5ghof_O`Y{64x$sWG{%< zN*$_H_SK;M35IEiL1&aj^iaNkJ?d_Mse7K=?Dt|F+719@Btn5FBelo2FW~i3VYC7N zVL|3e@Ml2>8FtV<)(I{n5@fV6X+&8=1p*NdE_UwRIgPXH$?-6Ef;Bma)+PhJ(zx(8 zXD*j&)P&$|nU6-HKfs3B+sg@R_06y8(1M2X0w9LCPqc8Fc6GyUkq7|+u?PlImD6xL z#&4|ZKdbD76DWr&G5S~{aT&Y_&?xGb#>os8?xi@pZm ziGZZQ9UD~oY;mwm2#LV}6t4pfaTtGB0~oml+mUpjlu&i6Q9d6&d~m+6XO{-7_j9UB z6ya!38O8dq)-n2{j7RwQz#AMZ@aVVXY~{iG^)S9zEn`~3OyCvB1DEY$3Wka>2O zVV33Xdy}$Y0z^z=?C^d< z`YNe7&c9XC3H$p)#xvr-5DU4vxek4PB64!?0dbYgq==X2>{}2N}PuG=S~OiibNVz znC9svkwZv1i#RxX1Mr+@!awC#7oi(wtxhN@l4x@u3kszh!1dzhtFc1*K^zd4Sf&oJ({7QtMF6 znD&5F^Q}KJnszn+I(f0?iA=!OyJ(Cio)YMUcrx@zt?f z0<*61AI~|>zre>v@a7(O&Eqd#!ou-|k~@8c#SZx}c-qsb{SOE6-L$g4=CT0gj)&-6L&kLpFiKVzI@|A3Wo3A2_{D>0@Um{Y=gnxU-*zYg(F=DEE-h!&Rj~42C)&kKPM~N6$EQH-H}+u) zv$nIF?=7H0bJ`D-Da1yV!6G*85IGlr|28Z0kjW(q$jWv!G)%yTdZ?=9Km0%%WrQ`l zEa3xUh_0}@((3i7IZ#1^hSxIV1rZ2u(%_;w(cga`Nj8bU2vwhfS2>(8ve;iHmX?Wt zr$12?9KfCdBNZL*9z7T)Yeqfp(9-iDH*2^d2#~nJ`k5~_87&wWN3y%nA#Ei&3%lh} zPXS$mp&OT(IYib5X9{is90S>0)ad0VNUgy=oAAIs}u!7-tmxpyNEG}Alp{zTY!Av)H60xgIp11(L&UjXacKy%1A8AU9 zihzC%k8%_p`V^oo2vhsf^?w!Gp&fUCea5p>YjErWhF3?>^?>*5Q{-r2${Mws3xTAmGq4m;^kH^H&%n@#S_IYUWnI*0dwVM3YVimhA z?Ojr3w}cNnNnC~#fsi`Ict$Wv5=h7+jD>^4V`1o=DJmp0Qy>VPC|?MfVY2?Xxr!(b z%nYqQQh-6Jb7Hu7c$5Jlz~=yDfjgNDjnX)$=r!A0fP(=K=o2u-J-PW@P&pZmihF{~ z?+m1n$`z{vlK*obUl6;GOd+geP0S8Bc|EEUz(8iT>Pz8$Iu9>$90@_l%*5n`y0>2b zy3l>z+*oY{-|T_Gz;PsAC^z@Ubwb?}0@u8*UggRStJ`~&II4w|pYDv)pcTiJ5}3t( zeSKZ8#938^_be1}?G6?$2Y^5u6cjY#ply(H=4-Z*uqldDeSTi>0hgSEfH2@+t=(W| z9fth<_U)S$gLv`1aaz6G&L|u3m}c%oYn}rNMeo=6bT=kP01O$=Y!5`&khCeW1`smn zE$Etm0f&Q1UV|dCuPQ!=0Xl(yHykggzN42SP25K@MpE&~$;q8jhTyG(VPzPhB=qrPP+03w6reMlAvNfG68!w>yVU9^XbdHJ z9$__>OZW)*T~JY>8`h!J?K@w6g?x8H$uC@$R-h-$P||VagA>qnyayDz6R>(wADF7| z1-EtEaj`_>q%|+D|DK^sOsXDa>gaKSp;%McM(NLyk(!0(aCL1xy?1ZkRHGKp+%|u2 zsERGT`E_I$jEDfTfk9u0oBE$$qEI960FWrgtAaFER?c9~zpA?eC~!pV78IZybRG|s z;Jy3ojF#sWblO_KZz^_u?Bf&0$4SYMU-8#jn}Ga%15!OIHVD|hcC0z0zSMb?GWKz= zQ%{*gtrwP7@yL{OXPNcY!rNeUxYDZslm2z}4l^U;iw{>FY;9i-<9?yjK|(yldGY{y zjZ)khy7dos=5+=4IaBaaK#>_pLI-+$HcDu$Z)_YDLtcMtZ)b;7Fm?ir621M?=_Qbd z)-_5#JyzG3fG%M^T&K|YDm$C8O`4Hqa(T3iSX|i9=%}o1OG4S^2fOj+ zc-fODp=RQ?lvO=ER-sT0KL*_fJpJb%vW9~ z+>kvFxzclR+yNl^9{ivthF&NQLaGMOCiEJRlv4qqNU#uOn-si^h@c4K3?%66OB85r^8q+&YuB0-__y3&MuOg~`&1$u3L&sga7EF`8ikMr&RPD2yGX}r6z~8rC036bxr|>g_<;q_t-54av$Nq z2egS}=fzR@112|_%a5AVI#To5Pxnk zN%4fIQ|D%5<>Hzi9eqU5v4s(bBO~<&x`tn4P$9n%fy>z!)70GD zPV)?P0e`d{wt#^pmmQMB}WaUYxq!lMnrJ6dxm_aO>^zkjxQ}z`zkyj23t@AAfLpZOXQL42KCp(}bJ2&7Yp8yl>n+f{RU0E`-#!MIq!@24jYMi` zRiOm^6W>2^d*@H1ND!}f>MEPAyN@-m^yNNDfxaIb6LS(G01!S!lO>cFVAUP{DJN}c zTh6^irslraZh~b3ZQq~J{!o|^t8oQQ?&{{|3!|Z2v2#!nNK7l9A_y%uws&iwK)xDi zlsiw0fV~SmLIR7Dq6ZKW3)Ul(Xer>nB*zL$kOM4y0R5fg1K}tI$<&JeU4vS}Gk0T1 zNED`Rz-@qDJ4-YAyeS#bg9!vMbI{N80n0-P84^1P7r1`^`-$8n^z-7jj$DkpqoFiy6NY5ECcbrpulT;Qy~|B4RGq$_fE^UCtC@oaX1IQX&RYJ*sCTc_6BA8 z2cRY83>ckGoIpu78+8b`=z)@jBF!O=k7s}QfPvXZF5Vb+7se#!#-Cr4JN@uXuJZ;XlNEE7Ah{cbW#WdG$9T5WHx!FhlN6gdYL z2lD&d{QN2u>p>bCnN1UQy_cBy$HZknP~lAr!JTH)3^lFs`}cLwV(sB4?%g{%5a|WO zOOk2?Ly?8HsL;@_8|{OeBzaD9>K7cN4hspXLe(bdEs3$?FrK3g^yE>$*^+Uv(>p&i zqTq1%I#|@w_AhmSHv){k#Q7s)`+_m+Fi`kI!szj&(L$r3kAkA2Y^CdI;Z}le$^^K` zU4i&Gq3GUVXk9KTDwbN=W#N|6G=l-Uf)$q2sobAPcWQ^6Z*0tm2mn6TFKTgi=D8?j~|r~2)91m z8$Y%UOT6Eu52$c44A_8O1}4L3aurOfv&78J&c6O&f8$0*V%Kzq&40!hT9||m zA7YcR^flz}agso7i)IUkd8mX*d>>76iOT>8TmG0mqaYyOzkO@vD~dN zhtTzm@wgYD+d*;igTudWhQ)B$U|(z<$gK9$Fk2AS(0LFpE+lxr|0E1Dush(sqQ1Yn z|1Mi9F25=`n4O0wmlFs%7a9X^B5)>GF&n!8sL@%wj5HCMK7ckE%EWYqcOc|adJutQ z>(hk1>sHi8HF2Br+Q<3%fy)GJWu0}OqkBSSNoA1-b|s>?n3!0WY6EM0jObZM8Y6{- zXi4MzV}dFomg9$12&)JRz*_E3P99K!bhb6^K$!;T5*qLm%;HQ@;;XeSD`kFMd%bjB z1=>YW%R_0>!D+HjJM$GAZG(dr91j)L!5?e+6Nm$w@=x~ZvoEc~5>8CEBpSiEYIO=m z9Tb~vz=ScO7|&ndP8eT2&*%q7Rq{CP;2~mJj3#gNDCKxW4l-4Nr9!f{YRtt+g7@Wrf~O5cX*P};~p&? zB)Q$8lNzlKM^3cn5k4?89uv(Kd-?$53B(IvCZJHnsl4XJ1RUh=t&W%Uxna=5q6aV~ zzFX@smmS4haVFs4SjMi3;pTDEJbqM$bab6=hb|6|(UdPOL&5)E;iI^F)#>SJPk2cY z$cw=fC%>@>%Y7P9s?&-{5=;JFnxuW4tbPr{`~4@KC*Ftd@2Tf4*YR#Ge0 zJB<`{`!i<-2M5XByMid*4pRlOjsqwB(mpUS(6Dj%d!ggtp~VP-18@S`&xqW&dnZXL zkEJEaJKi0lpzsG}%<%IqDwhTr*c3T*iShA~MZNh3sj{%(WQrmH$mK}xah+}El-^l&As7^*u1!)RH4{{859WaW}>1c=grO297mH^4xD z0|})TB}osiQs6+~qyz6i^BFHKz!VaW`ovftrIpFgO-*m!ym^3TW8feo?KEOSbaO{n zPp=NO4UB+bn4tmP+oNh<^aVgJH7Iq`yCIM&TLA>2b5RH-mx=JwQpH>@s=cq;gZQp$edkj|lktzii7yzr$=tkDcx zv;MKA1#H0V3{EdWZXwxyfHP&&k?i45;A?ibZi%-_=C*enM;I%N^=Xe&+NH zC#^_;vs}6NY@y^r!Ipc|=>f$8+|V!%qF*bAmsu?<_E;Q-Goe5h;oJ+H1~~4u#56~| zY^({Y1c<(rM$#E`9#YQ$7SMA@lisf3dGtEWJZ3==Yf#oP(||W7044zxUW3YbQjVc< z$8hoTG872FR2o)hSy3f~A6^5Zmwfs)teNM`^Ad2{fT?p7PjlGIS9CS?cIT)NUcYuc)&~y@vaC6@RX`>XxYFmRv0mOl76zeZAQ6HF8 z{koR}W^h&!JTqWGIK+?-uP{1WEA@x}4VVM3UAKhtzO$sQ{OV#gKgdoY3>&e9^{SKQv7t|yj-5-@Cy}{_%MJLo1=m&6m>=O2O zb6Zb{wSNKA1D3PQaojCs7fCNca)(2^SCbP?axc9Dd;|ekiyDpH4T!V1 zzzn}MIf~c2PNWd`nQ}i9*z=G#g5donvh&@$Q{XHDNIn{&7bl5XAF3t?Oby!iDB0g{ zPtVU+l8&duHvt0>ESAU`QOyL~_bEk1FEABBrLL`gsS9ok3btCK@W=eSx686ErQ_lp z!t|rUr>~(wW6I9`G#19w#wI38-m8oZ36f^Sci=b!18Fr%`{O`aKq&$YCNnTVaY7w} zu~3SDVk%%H;nptlHA5?GLtP#Gw&sX?pPaR$d5sy?Ao=tx;ICq_4-jQ=>bE+EjUn0_ z-fi&i{rj%@cfQT2k+rNLzj=V&PAIXr@>0W+NKABM;?&rfz$eXjIv|S5CzTxsx7vdI z-gs#5RL+UI7(rclQ^XF!B#;8h7H&P$!QR^s7Dsl(!kWKG=3>8>9!8Z2nj}-0hFYb_RnP8v>Ww4t39-IWB zbhN8_6jxMO2ya`dCtq9o2Fjp*;zx1V*u`P=KeGb z_yC|+C&5vQ+-*TY!TPQ)R-yl^wKolfvVG%*kzHkpNcN=|A)=7%3N3^gO9-VbEfS(M z*@endLW@C!A%;|nvP-lmgzlD6Nu&}Hvb?{m`oHh{;raOV<^FJ+?YhqEJdfkI9gGko z4sgNP@y`{%unip_3$ND4K3Mc~^(R4)DXoYGqbc`8=!)h)v3Lw}ec-keiH2J=_2U4v z)Bu>5TFYa8b+^^qH#`2_B$%r~ka0OEYQVBls^%gNhU(dvEpaY zk?@MP`~Q2H-o}mX6Wp!sKQi1}1BQhn9;@4|_( zOkT6Pa~4vdDP8_V85M#7M%jnsZ?3*H5rf*hA3@ z*Dq2qe2Kp59*$1^Y=f9j%F#pE){l^v{#`h-J$W@1r`_K-#S>e<)ffjSClS%(KrV96 z!cHo>@7t9%@_*OmOTfJEZytcT#2K!@+K}*%16MblSWa0SI~%jBV(%l=VMoZByq|_} zTJ3v!B|ahG@0R@vZ75Iakup^!rPDjaT??_2b#!%eOt&_R8-z_koas-_?3m66cMUEa zL~ow!g_MyeTdUgb;*Iyh*Ygmz8`jkH4PeS3+5>aKc!h&~XT}n5l zKkbBK{qs12V)|LLVD>bf@hin|eD&XdIQ~Ddo}8YVLR^}dL)r*VgHc*s@px?^J#;#6 zSpUr}KL;$CBWdeU3#$&V-6H=8j|Vir|4B;W*SNU2==7B#Z)(}mQsg9XHW>@ zY44{Cj=Za_ZSq?fyN1f()y9?PW@dFCdc=D=lVwdS4`cIyp&@l)gVA1vk3PV^K%6H$ z)R8$no~r+LOiNYu2C7dKRUJaeji_o{5+aqLw|N|wABSV?_X`M@ak?Aewf#6qd+}8x z6<7MU8p~LJe|>k6wf&FP-4_#Uo@^ZpY47an>WcK+^+`q>P7x3nqb$~_Ne;o5n1Ivq z_N`l96-hm?4ai91z{*TNMOH#zugvceIkl9ie!kVOTMwOL=?=Zp?QcIRhSm)DSXm{o zhl&dcH9QObo;U`beMX!wEp-AyBs|dS0Qt|qDS$YWZ-{Z?*P)DDEY9Uw%W7gY>ZLis zXHH4}V0p(}f%2{e$kZr{^uLRac+|!P2N$m!0H7tPI=ecsO=m}J($|l^wE%2Q7TU^nP-*8{(<@ArhLQu1}7>Ei+rvNXica71x zaP{gN2yHWxVaZ-XdAK$wii*x#?d=YA)WH7FAe$^C;1>3Hm|UQqiD;gBcSk#+tIK}Z zu3dLaMXqy&=z{!f9e@64Y`yxU531IR2)0?j@3EN6KsSzEkA|fh&cN^i2C>dh{QC89 zWjxnip7VB9yQVh4D+%-jtxn8HEHl=ckEA)^2^b=DTVqZC^N$di z?g!FC#6*3Da{8o!rUktZy0I92crEI8ofeglSi`Oru6+Q7Iym8T8&aE4T`bIw zga3MlV2&$SuV(5`x9s`n^8g`FnB=S4?xV@wsHbN#S$;2!z?WhIV>#xb)mC^=cSdMp zsB=HWRaI>({y8)zp^N>~BV?mVVVLX>a$LIYh3c9$F0QVbH7DH1aFmf@@_2g8@#(sW zPh@tHfgx<39(p+cV!5o?l$VQ%>FlDwnidhGdp=H3SeX47hn=hA#0QPW(XiG`S=4;x zgd1QWiDyHZ?Pyv7Hir$P!-t!7aGF5Kd*qe^N~HgwFX824n%67d$0_&uPnXZ8zjHLO zf4@!tUx}{W*gK(=siwD{kN&GsNV=oH-P*d0sOdG?&Q}v{g0H3f`t&PT&YX`D=FC!3 zlrnd&0qW&5x%2mfx{2Joa(^G#pSU<^LK?`Mff?pM^w=pNptIiMIU4sVzl5y;QMCfE z2Kx*26`LW9yjf8}vM&rTUX%AHC188frhFx9^XD6_0Zgb4cyR|-!f5iZvm zei-5XD6R1S+#x%+qdl)de+f4?x3KB&6BAE6A=P=+*LUPr)asIpOj#dk!L6ZI2@f5z z0DPegUGCt7WQ*?a!d9fmcETymd(sN(5VnP43+mPkP4v9h)d*`OUJywr9QLHL-KW2M zaFN~yD+RBtEx};KhVq^o4GRmy`HXrhXt?VxR%39=*ahLFYW=S-^7+Qk8{Q8czm83B z#`TdYneZmO7*sAP!EvHGm$`_Ka82QM=g1BAwEjH~eHQ~~`#CyVM}AYNYF!U)-`-4G zWbb5o~QS$4>I?TlM+c|fuJLf@4jtE4kdMHSaKW~55yL1>lU1^ zgbv0dh|aG3?++`{!a-BijJGCP51d@Muna2$o81GcYEt`Ch06|3_9+D@@`)IB1_WQPX8acf)OmjsAk78Kl_;R*RKeuN5&6~SN z2g6wx`IGnKaz&i8B&{viKYRLg$M0)f`!e0eNlTBx+d5=77kq$}P+Pk|ILOHRhyTVq zJrBKf`SO=fpD2${QT1wtm8Fh_5||3GE06&N1^eyog+XJ)g!*!u4-SF#1rZ)!?CgDt zYODWktn1C2t6vpE5#Opc$n^qo%SzkE0?|#N4r(OJw?BFmQ9A&mCYMylpL^??g+|M{ zc9AI`hb3=lLb0b!Rzib^TG&MN41-^wp8oPgA`7oIA_wOT%7i#bSI#>MO`PV}2Bg+7{mMfPp2k(jJ=G;lo z&JFhzRVh~qKFcxE61ll~kGd9Xb0UXvbHZtNWAka*!tfY1p?sx;@UDY#j?`y;N7wZk z)a`p#>bLLZZ+^F%hJI~t6GIKgOW-H;IfE{h$bn?Hr^Xfvz$W|U?)u4llCsXC} zm;=ftlb!A9>OE3I87fv&K7h&KPe=qiu~}J7Z62`hwr$%AX{jyHeLxewcmL`4+9tei zS#o;~p>6#I@fM>^P;pi`>?XeONMZ&kPE-=`2=1Hv34oH}jII+fus-VL$Vj%}qp+mb z)fs_zfV39TaU2z^Zx=qef!G>UdwyPCUVeUj566D~jDFI0gYa_0W)Bwx%Bq&;=5jp= zZzyBH#4`x*UB$hG(ROQ`<%o++BES9jTkH@~0moZOfSIl#hYE7Xy)FQxAx?#t)*En~ zVb1^-A_?57rKJVU_#25cRY1w1+|@xqB@y-tG)PNR({`SMtFizca=ocFWJYN3i2zkl z*xLkq37>oYL66l8XYeCfNKd5*oj9-xUYz_(mUx+U_orY1&UE$m5_NS|_#JNLkkEwW zIbj#eiHM#H<96O376>XQDG7Gs1!TZxrl+s|Qcz(eXg>vhJ~PSvC=M(#nf!Q5?_NNO zr^@C;M=0*R2zX5c<$SI2NbT=$8(XZ~+uLgw=1(9@Gq@P~0=TzRonjXuRN&&KNN-_O)yBVHYMk z@oWGG0Jdkklu!A^YFZduk)j>@`V9aBYJ*o1Na@Ycle;4F8y2?S9y9`_x599{g++Mo z?o)FjXBIu+-1`Nx4bPkVbOc7Oys>f}ZMM$Q%mMUI@{e#4TDGj)z$s7sdFZI^>G4i9 z;c8A5?8UE(N=py*Rpbw!Jal2Q6D!S>-is7c@4H(KCOe^ZKtM}$T%75b-{|cD-cMsa zWXLh@f^wU`wT?%jphF@3rpTJc1q3-qz1a(x_Y4iKztM9fQN3(se*OBSBz9?@+SL03 zn{ul&@4ff#Wv>-1Zpt2K=HsGxczEDMXdxZTHb>jJza(Ibk0A#YiAqG__3Dk#3d8%y zzDsqDqAtn|a%VMI|G8k|AlcsjXWxDrf@{N{%l6M8ic`!GhSqvC$hYTo&CNhNg^FMAY_@LCTiaej zTP`YU>U;O#f9oBwNorKq=M22frnU9)(%b9mSQaa(sI)gDDqX#HFKr7@uc0qrZa&MF zDaIk;ev#*w9ZcFmU+L>{s%(Tko+47$)@C&n-&z^|G%DTX3JnXNt|KSBh<))C2j%Xy z1X`Qie{X+{j^eRbC-UNOkq^JF5|m&V8>Zb9F`Gj7Zaj-5Q}_QsO(OLrsgJ#)hiBO; zBQ`#BhQTZc%`<`fmmOjpL4SIZCF^3isMP^?jB}b7IT`-HKUOx**I&%aJly*yuwc@$ zs+polR8EMMW!2p7B9qQ}CvuVqNy^l^n9pDc*mhxeQ%dXBj<`1~tS03<{Yw^GeGl#v z5fZ@G%(!!B_1*E>zrV+%*HkKw{LScG@JO!)Zl5WYz8ND3P=hWt0LS9h8c94X4A+{} z+cxR6h5><6UPp2!wkSg7Rm{6+|EfoaXTIo%C^t>}7#l}8Z~n1j{Q<|Q#ziV@(^N#~ zbQL?OpFBAScGt8!A4**9%G3B(lOMi(NhEg@xGW+S070wSWT4~u^zoy6npmJzjqv+f zdsn2YA-=~mZR5w^$~z0&t&z0CKt)hOkFBn*cD{E`AkjTCy_Wl>wX740_7#-7rgImT z4UZA+)yT+!5_%mtMC`xzr)s12vM;NdHP4{(s#b#t_8==4(gI9esr2AaPp?+P3|_*^ z=fSRCCU~8O;0PoTxc~W!$Zdu(2YOz-7$ek(MvmO_A)#m2&e^+OEj6$)9N^BR&R`WO z^+eEi|NCErl$1!@q@+d8D6i)J*$I*bUF5Eb6p7X?V)gBQ7C$>vQ-wqZ@AcvW1G+7z z3wK%T8egKl?CJ`H(nodEU^s+phQRBJn~Y3G6C{M@0s%1sm3JJ7L`ZC09M|7Bw-_ge zFWg$pRZsMEaMqUyE#j$H3BV_;Shvq?^JdR9K5RNX+}w3^ThQY}qe1diRuPWw7{BC= zz| z{IzqAcMeHj{HTdAqcuJpg>r>T@p`dbuns!3Zw!EaHtKK;Sw!d9w=4I)wfnINMLK*; z{#<~H6Gho-%3bCNB3ZhWOU4BDu{{OY!i=2JSi3fy@sL!e17)6zV0l{#@CB%MitZ!{ zi`{qTjOY?jU@vQxeQpgcvHi&LO?aSju(d! zG(MbkNB#Y|p&sF&BMpSJx|yVrEKnmCXJ)u$@nYoZ;MpC;%|o=TM_SzDOWKKF&L*z1 zt+Rz3FseO-t+I$LaYdT6#NXA}oV@tFFG3 zh4g})+avlR4{h>iXcSXY1RY7WQcoZ|qolok2n`^Fgf6Qimvc67ySd44GvwG1(V|HS zZ3g|E{hZ!(z}y`o-1R{L0RYcE0rSBNF$pFoCNA#71bf?QLHWqYNCs(Xv|vrm=5Q+9 z5`HI7o-7$V3sv*PNZ+zzUKXmaw|7QH24JC)y1F{BU1-aIul->r$n}EDmvcJZ6?5w@ zTgJ++{!TFa&w>8>wM22)o}0oYB$g>3G=d)e5HpNybAeAEvQ?zmNZ%l>Q4orUZJyMb zIV$<@rN|$^FY-t`4Eo{&4m3wH%V;NByT%3}=%}}mcJf1<%?o@NL2l491dK+%&zsC%`bH!(Mb<^n6oFlM@lF;Zf%RDCVlY$yoG7P@Au6dt8fyEdYifl6Sgm?J zVH}2DFJMUD!9uDc>F=wDU@%4f6hUqdS2u)Xt7MET-t5J_Aip5RG~djRWWR7#NW=D! z)sWAP-qQJm$Pn`^dl}7MmLc0kJaiYnsIt3&{cnioaU9^svgBX7w1v(M zO?Vp+GX^OgtpBmk9mZ+tc6U=#Q(x4cI#rU&DqF9zk9&d;<|w`SrKqQOsdgIo>pP?~ z7)Nr3&y2;zm_XLLXNro7h5!+wu~O?$fKqv+t7sYJQTX3quUy%ecBl#6C!u|G9N@v0 zN%?k5iM4LxQ&B;|Ao}HUx(6oRImW5>CoBA=Z*1=R#J*tp#u$Qv2PaLSyT>#DD34GOUpMYWAux{+k5^tPYp zr3B6~cXt^zferuub`v(X$;%PGIoLN*n_{P_GLnSzb@!0kvb-bEGQrevI{5YZnLi7V zb!G^dSi$zov4F@x=0Ss7LXXF0Sl)PT^wNtLwt#}RFRp!dj9s86Y)d%xI7axOW!sa+ z|M-gTI3&!D?_Cgd>n*NYImL)R%d-9h86s&EV4C7Cq4maa3ZaO;tY5Vp&52ZI9-|OjV z>*{)zFQfstc4Oe@KRjx-t7g7?8cQpW+jEmr8q_;e%=#!tayUwV92xFuA(fqWzIYZ% zJDN*^ne-y}^jOfFDILFnA72Fq)ktDZURIME<6;Q;&nPMuIvWbm@#ofDOC>@u&7_2W z`ThI%kSHxH*7HJp%(r|^ov&)$QOFS#gm~0C^spHy^d3L>?+cLT+LWb#(=Mi`uUxT0 zc~kWIvLk_k2S&qAjDI={cihF@syFyOr9)Exek74?A5eC7?8vNLYfd3WE$5W3es;ME?Wv8PeOF*PUC9V!uAzBaoLI8B7jlx3`-i8U|2WcS3v~=XR zVn_wVqCP&#Y8`?QptN1hycBzdDWdvu21_X=KVOj|BC~1J)yJK#OVO3d1ykhCzJM5V zdYMyCR~Isgb`8}xYa3Ik51`_v@Pz+;sd6PNK%&yAjc?X~_PcZE&O=hYe#ofNT@|i( z0PAC<)fR5;L;&Z&q2J!;z{Hlh+!ZQjH`+0pusmSS-UpA-<84OIMB&KZyZU+OQk)zK z{Gak<2_qboIVEkN-QeZC{`{CkbTqLBxI3)d+uF8m-(GID7OpsgsHDfP*l@@NG%Ce1 z(q||Ro)9*xP24ge)8|;`enR*Jq@{sW1a3{rmeJ5);*#wlCod1&@GLo1hLLZr^Y5wP zh=Vs*mtx6rsS@muW4C^HclWAQtD1I{U~-w2OgM93Bim0qG_AV_H*kq4$jG=uCgIr4 z3pMBHT()8}O{6A6U*S$xL9Qz%U?@G0GUmWttKk6T*{D=LIUy%S*;ee`|4NcPa{s)+nriyb>|GZ;$B z%Jm!yM}}S~4saTFDw%PV>Bzpau3v^_$Dp$yLk!ownG_m+3>*6;o5RaoReC>l}RfCCIk6sYqJgMeN$8d#;p@j*l15nFcQX`_1hJxR)&Ho`b)N!F6oI_m(mo2QUcx^$_MPJ~5k>UhawcM)z+}gDV>TbHqf5$?&($;r16?V{>s5qaQZ9ekE6^;cv}`Y~;H+IkFT>sD~q?i#~c; zZr^?j-tbs4vBQ=Su23wM5OBGP$DT>VBUtM>om*-{Qj zTwQ&^du4(z_o|R-KK@xPL&F6uF2{r1TeoiQtBx=uPQ7=h79@-H-UG%5+jw=|{vF7s zfEEtjI%4y19FTu@qVKGe!lmL^;Mg~1*1Fj^;`$=7;`n%;-EJ}TCm@}OQF>%HnYAI! zocyx{^o69^CSOw{y7@@55+RG(d2|D!pvQm^AY+h-+se)-3L-~*cVq^!ocP>#bG73z zoU?VCaWEROeuoLf5zgqF&fB+dr%;yHernrcX^F90(%6FQm?A6nNA0+8$u0>z4jowKZ$89}2sIG8#HEYTGe6}6~lSh1kS1=Q!L z7=HRRH^aVV!v0q$kn6T@zyv9yqAnsr{XpJ;{IXvB`t_@qwBrvBi~gMt)lL3)jiLg( z9_VpBPj1AMG&eVg4?-Bn-hCUS^Ui0rIg`{rHMFM4XI`yaD$8?qtp{86E*7<90)hW; zG#a=uvZt2eIN3Lvz)PJ%joOL*zMPZ}OIgXEgNEg~#r5awV2z5sW$)4w0|Zdx0Z&f@ zGJW=764_$|SwlEw<$O*y>uA8}kHWwM^}=Geo%Q^Nu4t~N?KEm!arsy!^{q30^O{vRG7V^(ttW6?X!O_$G^8a8z0}VckU#N zS^&z*>Byc5?L?03R3e{v?)B^Y0D5ME&;WOmd}QAt%*TU)!CUV0Z^9U-;duC54*8N<@wT4@m& zsC7~JdR`toRr$9D);y><&4FQ75<5Mn_s;stq<^@>yV_G_Wo6b+!$TH>+=A4Ahq97Q zh=>^V*qCFXV54fITlJtR;oo1gg1LOrqIL=K7DA1COi!#>$uppy9pHa5UPP8d-CD4M z2FF`!rP>@yWrz1SREG-!vZ-zVLuM^FQO6{Z-~5324=7&dmqZ?EGiCvJ^4?aCzJo=y zihn3+Ab_B^Z{Iq0OCltMkb}|LxZhf*n775v_?#sEhWGHSmb!Y1x)9|Cr6 zyI-K>Zs?`iDQg=0L*?^7bL!6E6x4 zTp$8_0Q5d2Std)=$VFIF35F@y9}n?g3#b zNo9XjuOc+{k;v+MKNH4d>s)%DO^c97Wj-3ZVAM;!m$LeoHQG_+ua#Q~DR7lpFwfI2 zrlkRF@gS?AIJep#Gn^0Spw+V@a=6wu9hNHs2MVryd-H`oHOfI@^pSO%3?jm#ciKSg z4IU$-=xdtMVrm;t-@#j-3O>p+m;>@`zX(||GGg|SzhKl6(kK@f^U8-9k~xM8*0Axp z8OZq?#x&VjTNB>9Dx+$4c6Ln8@F05>(%K?sloRVB)04PgTN_$bZyOjK+(WJgVio6S zt?u;i|BptdALD*!jXY?e%~9m9FHkrj9^X0+iq26PnC zmJ17KT)LFHp3muIvUE*k+$pNKuyB))y`6WN)2>~6$caY5CGSrpv`zb1T0TNc)!#vQ zL7RT&MrZFdM2MVxkHeK9?&*4!5PU z2Zkm-8S)xNH~-n!{sMRfoHHJ2@-B12&NHLd$e!eXf$0FUJ{-l8YKj{-UVe^K0LCB~ zae<;3_VH{UiFT?%?7~u!bRd6p~pl%4evf;3su`z2kzKdeseR$yTWMdnE z3K09`0V3$H{^64+PwL+zkIKOJr0ayydppsOx@ z-L##)Y{iOcI0rocd`IuT3PrJZI90He9W~ake+gem$=C1;Xe8phk|1e?f#wtD(!d=> zMT$~KgV#%3t`o>a;9MduEFmEwE>8GZU@pA^w+$*?oVaK&MzV~&*cvNZuW}${sG#G_z|U4~Jw4~4 z@+)NaFy66^pt^Vr@55jo5y3jEQad}g)nZWg$=<-Ox9TW;uxh^($$`=sbI?CL+!n@e zh#Kc0nJiLmu+_~?YGfAG5Mvf%7>opId-g0znWU!1X}51yICu(?s(`6)t^^TBh1`E+ zOZW3Dw6Udb>}8Dpd|Cj9^L5nvSS3(X=)zb|(anvfu`#1YPqCYF?TTI)!p%~=H7o4= z%jQCIaviColrZYuT)Yx0%(JR(Xb~?);QkjCDR&JLG*h3_XC|F-9%F!lpMaXyr1GAK zm22&gUFV8S9i1RB_wGl7w|D2@L}_IXh~|zGQ41@@#g~hS^s_xd?XjOB`-k^S!_GMX zU2oh0!RaA%Jj{1jFJ5dRp&Mg=xc6ecH7s?l%c1jmTVF4WAQbVDj^(kEQs9vTr?@vh zYHfAzkbN~^0OhRWyNGWfw`BDHZJ!%;N0Y2X17@l;7)(|s{ zL2nx&vaz$@x$_4QObvp}jRFh#6aU$kvWhrCyO;xlo2pj|dpvWB6K$PF5L8udjd~$h}i46YwU70JdVRyn%x<%E|1E`L|?>EH6^(Fn~ zm`q@Y{mU_F{pYd0#X17zj+mHOoglO%Oo83hX~p0AZI2#V?%qv1$;lCa(9DeeX36qG zoYdMOq0x@B!nOox>P~JndbeKIzzmhSpLP*2;=PuTen!b2T7kD)?!t55@EZ8$7t$KLk^3C}VS zF><}^^N4O{{I-{zm?4yj$VFqcEsGYf(T{vcZ5t9?02d{b-$0K&a`fnbf1vxuZtE2? zTRDD3e-wUU=|V{am}kPvW2vMzl>tORQ9+^goowYVV4sinR;&To#8?0Y)i=M(*Z3@z z_uUfP2|TBZL`T`BILd7L%W1*GU6wzNv0|zb$Bi9i&L?(k-hsvWtJ22p4hl(2*TM+O zcm>F^v26ZZ_4m5aA6A#}K7>W_4-7IJv87(cK4hc-j%DoZ4}IqX(bOZCqxe!2R*mXa z-qv4st&y^GaViw_AHZ4Eey65g-1&)KyJwCB z2OA(om7={FvBnUlGU&n|e-|yqtB4^EN=n?tHIe^57bXbQX!zWz-@l7Bm8Bd|s;@^@ zPzi|xr(|I>K~6&0lym&q`Zo>Nm?9+oNjsh2=u3bu9x>j8a~qN^Px2n5S05w55Hc?g zHk(9RY+PL91b=Z@)W6TEgOCgG+v)D(;l1nDuARbDc_d<=W5r%e_!|its7RvgeL+L` z?s^rAsjmgtzX@E&cdqxvV7&yJw;WK+HtWKojq z4~S9HV(=}9HN7z;G@@$uCvXL1wh<-|HJc3(ToV8Sy#i&(+7D?q0)IJn@cqI5rjHXCu8<#aZb^~tC27W4b(g46<@3hL@nM~6QMX6)T| zhm2yO&#<%Wtf|p=sXO}TUDyp#`&YbI|0Jy+;*XNXk-Py40)pjNjHS~_D_347EI@V3 z;2y>KbLhZ<5w)wCyrS(KYpNi4^cQEc%{M+|iinwv+O^uDKaJ`>4);nWP(8YH1a}^q2rswyd@9vXVJ377D)8E}@>2}IJ+ zg5a_&f{hY;9?o9BK(QQ@e^7`4#bp3=1Ley5N9dz+t8for;mg6)=+j4_eNL+R$KR027K22?0M54%(H(+_Mp$ycuE zLyL*o2MosAh)r9`H|kEnc;3r+6v zTB@imlbBuNRxcxAIM9T`wp(-D`yi+wu4!e8vK~@z-bV}Lm%y%11mtM5M_WXu?=>4P zAgW56)lG$kh2Znu({lOf#l^DghyrtsX`(Dr9&rtU#w;I}r>3y0KRVrI4aZht%a5OX z`>;EM`YNZ(gFHlOhseWod}hR869C!>Z{EARgeC6H&HYIrtUfnXKU7U+Dy~SGQHHxE z?egVBa+*`6H!&g;Z$QM91r6JmBt)TBTD(Ft@2S*04*Rk3@hHAwI3!?@@z*#kXgw;F z7%~@#wV80ti7esm4oQ#)Su{E}HhAd80KmyABX$Y>kdCKMcg(w-6^d^{gcI8IQaw}y zRT*)oSBJ!#dsAo7jJ?cE?OLUyGldy2jr2C7m!=ICO301S(ALJNkQNR(8PuCt2K-X` zbsRy!B+3CE05roEdAp`YLUf$>0aqD|z$JoL&>?o!pd-MqF!TYmzL{PO{pl8yh%yfd z%HQ>0vyc12cMC@|R65n=wv%4iv4c&rrWBT&Aux$tXN;Z}TL6Tw`P zuieF>lv_(bzQIQCn6K4@_9c6mSpvP~NutDGCH3#q!MB6GRO)>XsrC%E32Yn5LMW}4 z6gzWOtb1~QPB8>3bUaK4@l2up9?jQp8toti_n^2+o{H4a3n_nx?}>*CMT?V^!V|Cp3Fe$Nq!!0bPZk@Dbe1;fjlYATiEa)3)2@4hMsU1@vpE zbIY};l;X&Lkf+FM1qHJo5q1NO+g8SqZxBISy26y09bsYmTI!WyrJK#o!T%n`R_Y(< za^0_Kc@4Wys>;;!kIH&)cwj939<~?nj;a}MTLdo3qXFv)jH&e z32oTv;8oHAFF;85O8CsgYVwTdej3VWuyb-kBLWhYFd)-cMVR@tT~H>Hm^kFZle2Pg z8UUOjL;@cKPhZuCvKd9=^oxzQbv4wvSD1M4 z`gIsi1Kx8hvw8k~o@r?4U0mzoQZ3kP4xU@Xal_RjQJAK9IoAgd@i!#pdwN!&9D$UU z>G?#yfvLD8;x|D8%WYZ)F{M3icOiCK)U{3YmJlp_G!Yc#d)F%}0sx$#w+K3VR7F*_ zx%rZrdwu&B_HPBi5qIWo>{_MlIKXx_*7~T+{o|OnSpKm#OMy>Ec}lrz7%fOK_<{0$ z0*<3&f)T%mz!WmC9AfM&nNp!ouomUM+Olws1;qgj^74$E1#(8k#277LB!G#WGlDk% z`=mP9mk8W^MkCo(TwI(!=4*$84n$-vew|w&&NGn11VeaBPENHAN z|MD4uf5-q96%^&-VXvXg$ODY)PWFIthd+~>qTI$N1vyX|lxMzO;gydd3Dkh`6>7}v z>}<|wn+N{)7FFf{9|Z`>ps&Tf{WU(`h~t#=1GbW`F_P#scDv{+K1;eS zFa-|0!;Kp^AmJnQpe`lik&E4^vb=_86BGUXJC^O^^vQqY3xXA7Ndw+v1cB2c#cbxL zD>_+9)5m@nG3~dWunq|pKh=gVSoA^^EpaLEzlEV6N@2F2nqir3pkpHK$T3})4Cx%5i>*YfVNCeO}UdbWbTj$j$8~Q^z3WabZzVwi4n-X zb`5*P647?d)NpAL)ZkK=wK1GqsgolqDOpZuA)IGx*VfT50inNLS!uti_jG=4u1R#% z5;-t$fPv$dth{bT{@*7-<|MXag>lG-$ks1VykXHte<5MAj0b->_Sgt~wpk7rBUph6}NgcDj52(XmL zOc){Ii8JWav9U4jYfk)9Q@fbh8kNp&HdrvmMb`=ZoGkafKo0Sq0LBu?R&!=swnTa1 zGC;`4o4zyen&7urx7r&TJkiV~JUhHZXf_2A3AyOOwc`${b zGnFS`$?;pWbJ$oe1#=&pF$4?=KR8FK969T`)Td8BweBB@=6i5ueHShkrOfRt`7Zoe z!+YiA6GD{K)pvt8(8@wFw)>sD-M<&GdYe89y+s7AyKG6o6eZga8Illbk97(pcq@}g zP=aTI&d|CE0yfsFS)e9bezW08Bu5}0=t>_IKA(lD5Bw!B8v)%yyHHSito*}=56Ed; zy^yma35qGK!Vg_!UEx>=Z;)Y)Y0;QZ;W`d`a{qH(9oa?Af!YZ}Wx>*CR(XejmY}G18$x3S6AkSoQ}%&2QVbSnawu-*CaHb=29A z;80}dpp_We0&QmB>K#NJ?Uo%x4F$fZH<$m#iav3PmCcQfrjvWTy}dyWK@=jZGL`~S zI3RlIV&NOi@81^yEP|l?0SLINWO?OKHV;mKI8=A=LxML5?tOw8U%~UKa9pF(ZVw)d zTXhO;ASlJ3#>a04p$t7BSXoOXGE+;I^%Ai3Mai%-IC;SjeAiYI{ zS+V(b?WtM_RlaV#$!&4C-%(jv8T|tHK20GHnUyvEJAyGB4Y>|Qhvfowc#ku&^yYg0L zK# zA*Q&C-N^)7%;#h+U$ZmR8RO$8gl(Tg9}o4O9~wJ67m=GciODIrKrRs%Eqt;6fFD4} zHAdHpo^G)5II0wr=HbBTxW0X*`E~t>3#>a1VcHLhKc;3y#O}e5AK7>C{;<4y!RRBq z`d)sVy5$T;_?d{4eV2UBLsb6#Ly&TtysaSzl2)_tcOti$u^#=DWB5_O)?`^5V*YfC zEtU)KDeUEo*w{uV!Jq$rw{U1o)I9}^Oru{HM;?#AOYb^`hLKMoW#7U~_p#P$^J~ok zYwUY0{22=zqZA%qo{y`j(A+0E>Z!Bk`3buqw*3rn$0w>**{=WPH&oeRbeJ=;%GNt}hq3;;u^6y)A0}SE@mqKi+(5 zkCzvRiqY|11^q8M#eV|~+j~XWB_lNcbe+>ypFuN&2IUZdy?A!G&aTsW)NfB{x$dXX z^*n!d^4oq7zkZKMG0d2mnW->G;o%N@NW8}N67n0C*Acgtf zq*gwPjM&MLlh$9iT3OW{Tsh+3#&Y(g1s7oDR*5y*y1ISM&G~p%v1HmHb!ZlTpR%k5 z>axj+2}v*x<5#kGI9Gau+xDnYjNt=#6L0o@Xy`8b?I*sT;4Q&!V+@tq49r8xa_s~) zVb5O-$<)SCOr}!_sHPah)&O5*9gYj^y490~mxLc=yN?uT#5?)^lWSzey}jQ%_?Oh3nP zx?maOi^Idd-Yd?oSO*8hUI50%@Mzqu)_O?g3*mm;efxkDq#Am`BTD~Wp1`gB+sl?i-vT%| zLef>)*DQ^R&UrE=VDPDAU*|RqF3ksb$8Q@z-uyI=O5d7n-d12>$dP^p6Ez{`KpE7L zoQ{jt;Z|HWzQ){LNwfxH0{>KKzT2`~bMv8q(xgDvGBC5-&aivQwtZkQoj3j{Nz$9c zoGrAW-90^V9|MUv4$OBliD!Dv!=WX_JJR(PR-# zqZ4y6j621SIK)^|QZj?d8-ipo;$yEep!IqUhnP{<$eBx;z9jJ5K- z72ofKH|$t$B)HNgO7zlny1icxk-?llpM{e^MO)lm(o|nCzn*7KK;iUUE&? zl^e}nh-8Y_B>eU{SeN>uvs2xr3PH#Z;9ka1I*Z>w*nf!|dA8D6 z=J0k)OV*ymgaqD;Y;k*}ic8(@Upm=@*)F7Dr{yq71c#y`J+qSyZCH#e)b5R0vYqUQ zyFYJt8!qq!KTg~P?O{ObGd_#zx)-Y*LfedLW(|pysv6nuZex>N(oliuzh3rYy_mm$ zUPN2ZJz*Cb?n*`K4aTOG-@NJfs&Z(y6JyPK0gzW+fNiEPjr{LA{P|&>_a0#xza#%s zNs??^|)^77Tt2Hia5=c!#?RpMyWml*16VUSE`n$>W@yoRJ&x zyhrYinwCnob#!bkDbnk*R^~3P-?dRf3ENK4GDIoWe!+=gVTj2`2NtaqDtu5KKu}33Gesk(2i$Mb z!p3+ytItk!Mn|(dF7)g^74tX{tPS`Jbhwc(?|&>aW!xobl7wJltxpZ1mBaL(PIa%- z=gwUuKJoShMVdjzc6Ms2p9^FHlyLP1X;h2i9Il!m7!?jNb7$~0?!mri@s8oKXx1-N z^nATFfZ*O-h~rGi9|s4w?tO|4RZKuO$W=ZH6UKx!$mt;YzeV6~nQz4U=a|EYsZz%| zG4t6j+)QlmBZ*n4n6?RBV;AQw)XSkdt7G#&_&hgeq`0~xWW(CEpOGRuUS2JHyQ`CB~3`&#?vXgO;?aF;x4!PwNU-;v{E7iX8$`kj%K{B0J)2p%^TGu9q_rRBeA z)CC4vQ0(!6tE_&8-+3T!l_&THmBSPd!KHvA-%mSpVmjwUVh^5u5wd0c!F ze^qdO+AxA#r(p|bs?SDwmF=_njoJVSWQYqr$(4Ei{{2lGjWS18*xB2&J8YeL7lySw zsvc20qVQ?-9l^GZte6~a7Tx_5K{!q5Jb{`|Z7^*HM0wuHF6iI6U~D*dN|SMw@5@g+ zU28vt_^}spjG=W1d7wst z_tPx6iqdLN-TJrZ^Ue?spLO%^5wGh0Q*X}xX{U31*K=mI@zIqBmQpSoo-()=7ZVfl zNYj-kXN3W1ulOz{AVN5tmalOP-+cVygx&O(=tYm-`g}!L*#Y53-zCSf(Q4b_2o@2U z_Z|HQ;Z&RKrT#g$(X2GUS6 zjw!6((@UiEr*<#Qh?dk{*QubA7EXUYyTyA|+T;Tf&g?h)1h|ZYl zcjv*M5_>iMjrD;34fCn#>4+drSEmT*BLJyK{las0vNB89@kwhd_qOxXO25M$=7F*V z7;U6lt@*p=R8IU?ZlE(=l$TX-3-ubn4ycXx#a`H9WrYk;$Zz(&OtIL#dlr7?J_MtT zI&B8b56P>-c)*g3RUfqu(Co0}p2};s(@_Bj_!BjU^6s3!hoAR$%rO?GIZA`5{}SfR zcW@&Y7Z+n|t70bCO>}A(u5PxM`?_+`*W-4qsvfn@e6=Z#NqFXy2D^}V1EEdH1*mxQ;+u2p>~pt$J&aS zGomK^eAN|dMh^GwyM1tFhW4MDa6pCl`HGRhP&m664UfqTgqw*xSfr4#jo(fPUfl7? z$sN|#4=1_>x~!*pag|N(GGi(Qoo``-erc9V=O&_cVq+^lcnl{4l|*ZRA!D%Qy4dkz zrIitTl0DB`v`{!|r6D|7y?Tp73*D5t`WK`3Ha@MBl?D{CtHOkmb|F&>U3e)MEtvjpp4p5$NYELZ? zBsl(gdd?@?QYbAt>Wd5tzHA9zwvWh&ih7d;eHH2gW-6Mv&oIU@`PS|xq_qe+z{oOS zPxZT9&!e%-2|#O^P1=ySc7qgXJr`KSltu_flCi&4E9chy*ud7X18?g080On3Rdg`Bb+Jx_ zBaEUP260bq*x8o2UByi^5#-hi34(Tr*IefR?jQA9#m9MImfT%1`@66P&qR95Ca zDmqluXdMBuGe&TQapc)3<&B{$m1q&ZVRwgSi$9AY9tL4v^G(E0R1%)R3O32H>1tfy YZ(MSc98v97#Dag8<~z(vP23~@9~u<4(f|Me diff --git a/docs/diagrams/ArchitectureDiagram.puml b/docs/diagrams/ArchitectureDiagram.puml index f0bf1cca79..5735b78785 100644 --- a/docs/diagrams/ArchitectureDiagram.puml +++ b/docs/diagrams/ArchitectureDiagram.puml @@ -8,15 +8,17 @@ component Command component Manager component Object component Storage -component Commons +component Main } database FileSystem User --> UI UI ..> Object -UI ..> Parser -UI --> Manager -UI --> Storage +Main --> UI +Main ..>Command +Main --> Manager +Main --> Storage +Main ..> Object Parser ..> Command Parser ..> Object Command --> Object @@ -26,7 +28,8 @@ Command ..> Storage Manager --> Object Manager <..> Storage Storage ..> Object -UI --> Command +Storage ..> Parser Storage --> FileSystem + @enduml \ No newline at end of file diff --git a/docs/diagrams/mainComponent.png b/docs/diagrams/mainComponent.png new file mode 100644 index 0000000000000000000000000000000000000000..d88c05e1b29e20a82136464989827346ecee1742 GIT binary patch literal 20504 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 z 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 Ui +ClinicEase --> Storage +ClinicEase --> ManagementSystem +ClinicEase ..> Command +@enduml \ No newline at end of file diff --git a/docs/diagrams/storageComponent.png b/docs/diagrams/storageComponent.png index 32ce5b15f1fd79d7da1ea722fe3cf2ea6bae5ecc..933445b2396b00241f4cdbb2cb9315596f1c6504 100644 GIT binary patch delta 24163 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 P!N0=?j~*yApwa&YnU@s^ diff --git a/docs/diagrams/storageComponent.puml b/docs/diagrams/storageComponent.puml index 1103a6389b..f80c830cca 100644 --- a/docs/diagrams/storageComponent.puml +++ b/docs/diagrams/storageComponent.puml @@ -33,11 +33,11 @@ package "Storage" { class ManagementSystem } - Storage --> Patient - Storage --> Appointment - Storage --> Prescription - Storage --> Parser - Storage --> ManagementSystem + Storage ..> Patient + Storage ..> Appointment + Storage ..> Prescription + Storage ..> Parser + Storage <..> ManagementSystem } @enduml \ No newline at end of file diff --git a/docs/diagrams/uiComponent.png b/docs/diagrams/uiComponent.png new file mode 100644 index 0000000000000000000000000000000000000000..652c88665579fdd7890372ba260d254928354ffa GIT binary patch literal 61281 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/uiComponent.puml b/docs/diagrams/uiComponent.puml new file mode 100644 index 0000000000..0fe5680e73 --- /dev/null +++ b/docs/diagrams/uiComponent.puml @@ -0,0 +1,31 @@ +@startuml +skinparam classAttributeIconSize 0 + +package "UI Component" { + class UI { + - Scanner sc + + Ui() + + showWelcome(): void + + showBye(): void + + showLine(): void + + readCommand(): String + + showError(message: String): void + + showHelp(): void + + showPatientAdded(patients: List): void + + showPatientDeleted(removedPatient: Patient, nric: String): void + + showPatientViewed(matchedPatient: Patient, nric: String): void + + showPatientList(patients: List): void + + showPatientHistory(patient: Patient): void + + showAppointmentAdded(appointments: List): void + + showAppointmentDeleted(appointments: List, removedAppointment: Appointment, apptId: String): void + + showAppointmentMarked(appointments: List, markedAppointment: Appointment, apptId: String): void + + showAppointmentUnmarked(appointments: List, markedAppointment: Appointment, apptId: String): void + + showAppointmentList(appointments: List): void + + showAppointmentsFound(appointments: List, nric: String): void + } + +} + +UI ..> Object +Main --> UI +@enduml \ No newline at end of file From d410087f54f135e729dfad7a3972aec71975654a Mon Sep 17 00:00:00 2001 From: judHoka Date: Mon, 7 Apr 2025 14:20:44 +0800 Subject: [PATCH 159/203] Updated some component of design architecture --- docs/DeveloperGuide.md | 16 +++------------- docs/diagrams/mainComponent.png | Bin 20504 -> 17856 bytes docs/diagrams/mainComponent.puml | 6 +++++- docs/diagrams/storageComponent.png | Bin 47978 -> 36838 bytes docs/diagrams/storageComponent.puml | 5 +++-- docs/diagrams/uiComponent.png | Bin 61281 -> 58859 bytes docs/diagrams/uiComponent.puml | 4 +++- 7 files changed, 14 insertions(+), 17 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7b4cdc4b57..572e9a42da 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -128,8 +128,8 @@ The `Storage` class handles: #### Structure -All methods are defined within a **single `Storage` class** with static methods like `savePatients()`, `loadAppointments()`, etc. -Initialization is done through the constructor `Storage(String directory)`, which sets the correct file paths. +- All methods are defined within a **single `Storage` class** with static methods like `savePatients()`, `loadAppointments()`, etc. +- Initialization is done through the constructor `Storage(String directory)`, which sets the correct file paths. #### Dependencies @@ -138,19 +138,9 @@ Initialization is done through the constructor `Storage(String directory)`, whic - **Parser**: Converts text from the file back into model objects. - **ManagementSystem**: Required to link appointments to patients during data loading. -#### Design Considerations - -- Implements **centralised file handling**, keeping storage logic simple and manageable. -- Ensures **robust error handling** by throwing `UnloadedStorageException` if I/O operations fail or if initialization is not completed. -- Separates file paths by type for modular persistence and ease of maintenance. - > **Note:** `Storage` should be initialised before calling any static methods that rely on file paths. Otherwise, `UnloadedStorageException` will be thrown. -### Remarks - -- The `Storage` component is **stateless**, which means all its methods are static and operate on input data. -- It must be initialized with a file directory path before any load/save operations can be performed. -- All file paths are determined at runtime and stored as static fields internally. +
    ## Design & implementation diff --git a/docs/diagrams/mainComponent.png b/docs/diagrams/mainComponent.png index d88c05e1b29e20a82136464989827346ecee1742..e23265c2886c4a7bf00b64f3bf7442509df04ad9 100644 GIT binary patch literal 17856 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 Rk5W0Oa7RVvm6U1l{{=1|F9iSq literal 20504 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 z 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 Ui +ClinicEase --> UI ClinicEase --> Storage ClinicEase --> ManagementSystem ClinicEase ..> Command + +hide circle @enduml \ No newline at end of file diff --git a/docs/diagrams/storageComponent.png b/docs/diagrams/storageComponent.png index 933445b2396b00241f4cdbb2cb9315596f1c6504..7fb06e5bcbaf8c8e1ffa355b22a2eba507eaf0e8 100644 GIT binary patch literal 36838 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 Qw#*~CS_Ya=)$MWrAH@(@kN^Mx literal 47978 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 diff --git a/docs/diagrams/storageComponent.puml b/docs/diagrams/storageComponent.puml index f80c830cca..760805bc1d 100644 --- a/docs/diagrams/storageComponent.puml +++ b/docs/diagrams/storageComponent.puml @@ -2,7 +2,7 @@ skinparam componentStyle rectangle hide circle -package "Storage" { +package "Storage Component" { class Storage { - directoryPath : String @@ -22,6 +22,8 @@ package "Storage" { + savePrescriptionHtml(prescription : Prescription, patient : Patient) : void } + } + package "Objects" { class Patient class Appointment @@ -38,6 +40,5 @@ package "Storage" { Storage ..> Prescription Storage ..> Parser Storage <..> ManagementSystem -} @enduml \ No newline at end of file diff --git a/docs/diagrams/uiComponent.png b/docs/diagrams/uiComponent.png index 652c88665579fdd7890372ba260d254928354ffa..10ef43302e185ad4c780925ef95df04d6045befd 100644 GIT binary patch literal 58859 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
    Ayx* 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 aR(#%*`qp{ZYX24Zw_8I`y;#*QAswOs literal 61281 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 diff --git a/docs/diagrams/uiComponent.puml b/docs/diagrams/uiComponent.puml index 0fe5680e73..3a7c15bfb4 100644 --- a/docs/diagrams/uiComponent.puml +++ b/docs/diagrams/uiComponent.puml @@ -28,4 +28,6 @@ package "UI Component" { UI ..> Object Main --> UI -@enduml \ No newline at end of file + +hide circle +@enduml From b01aa272d40c37bef1c9176b5e7963bf0f36ae0d Mon Sep 17 00:00:00 2001 From: dylancmznus Date: Mon, 7 Apr 2025 19:56:58 +0800 Subject: [PATCH 160/203] Updated DG with manager and object components --- docs/DeveloperGuide.md | 109 ++++++++++++++++++++++++++++ docs/diagrams/managerComponent.png | Bin 0 -> 69755 bytes docs/diagrams/managerComponent.puml | 44 +++++++++++ docs/diagrams/objectComponent.png | Bin 0 -> 103987 bytes docs/diagrams/objectComponent.puml | 89 +++++++++++++++++++++++ 5 files changed, 242 insertions(+) create mode 100644 docs/diagrams/managerComponent.png create mode 100644 docs/diagrams/managerComponent.puml create mode 100644 docs/diagrams/objectComponent.png create mode 100644 docs/diagrams/objectComponent.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 572e9a42da..31ad76b84e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -106,6 +106,115 @@ The `Main` component is the **entry point** of the application.
    +### Manager Component + +**API**: [`ManagementSystem.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/manager/ManagementSystem.java) + +![Manager Component](diagrams/managerComponent.png) + +The `ManagementSystem` class in manager component acts as the central coordinator, responsible for managing features for **Patient**, **Appointment**, and **Prescription** entities. It provides methods to add, remove, and retrieve these objects, ensuring business logic is applied and maintaining the integrity of the system’s data. + +#### Responsibilities + +- Manages instances of **Patient**, **Appointment**, and **Prescription** objects. +- Provides centralized methods for adding, removing, and retrieving from **Patients**, **Appointments**, and **Prescriptions**. +- Links **Appointments** and **Prescriptions** to their respective **Patients**. +- Ensures consistency of data, validating changes before committing them to the system. +- Handles business logic related to managing patients, their appointments, and prescriptions. + +#### Key Features + +- Provides **methods** for managing **Patients**, **Appointments**, and **Prescriptions**. +- Ensures relationships between **Patients**, **Appointments**, and **Prescriptions** are properly maintained. +- Handles validation logic to ensure that the data is accurate and consistent (e.g., cannot add duplicate appointments or prescriptions). +- Can interact with **Storage** to persist changes made to patients, appointments, and prescriptions. + +#### Structure + +- The core functionality is provided through a **single class** (ManagementSystem), where all methods for interacting with the system’s data are defined. +- Utilizes **arraylists** to store and manage **Patient**, **Appointment**, and **Prescription** objects. +- The **ManagementSystem** class contains methods like `addPatient()`, `removePatient()`, `getPatient()`, etc., and primarily serve to manage the logic behind those operations. + +
    + +### Objects Component + +![Object Component](diagrams/objectComponent.png) + + +The **Objects** component defines the objects used by the **Manager** component, which are **Patient**, **Appointment**, and **Prescription**. These objects encompass the data and behavior specific to their respective classes. + +--- + +#### Patient Class + +**API**: [`Patient.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/manager/Patient.java) + +The `Patient` class represents a patient, including personal details, appointments, and prescriptions. + +##### Responsibilities + +- Encapsulates the **patient’s personal data** (e.g., name, contact information). +- Manages associated **appointments** and **prescriptions** for the patient. + +##### Key Features + +- Stores **personal details** like name, gender, and contact information. +- Can hold **appointments** and **prescriptions** for the patient. +- Provides methods for managing appointments and prescriptions directly tied to the patient. + +--- + +#### Appointment Class + +**API**: [`Appointment.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/manager/Appointment.java) + +The `Appointment` class represents an appointment, typically linked to a patient and a date and time. It contains details such as the appointment time, description and status. + +##### Responsibilities + +- Represents an **appointment** between a **patient** and a **doctor**. +- Stores information about the **date**, **time**, and **status** of the appointment. +- Allows updating the **status** of the appointment as completed. + +##### Key Features + +- Holds **appointment-related data**, including date, time, and status. +- Links to a **Patient** and optionally to a **Doctor**. +- Provides functionality to mark it as done. + +##### Dependencies + +- **Model**: Dependent on the **Patient** class for representing relationships with appointments. +- **ManagementSystem**: The **ManagementSystem** interacts with this class to manage appointments for patients. + +--- + +#### Prescription Class + +**API**: [`Prescription.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/manager/Prescription.java) + +The `Prescription` class represents a prescription, typically linked to a patient and a doctor. It contains the prescribed medications and dosage instructions. + +##### Responsibilities + +- Represents a **prescription** issued by a **doctor** for a **patient**. +- Stores information about **medicines**, **dosage**, and **doctor notes**. +- Allows updates to the **dosage** or addition of new medications. + +##### Key Features + +- Holds **prescription-related data**, including medicine names, dosage, and additional instructions. +- Links to a **Patient** to ensure the prescription is tied to the correct patient. +- Provides methods to update the **dosage** or add new medicines. + +##### Dependencies + +- **Model**: Dependent on the **Patient** class to represent which patient the prescription is associated with. +- **ManagementSystem**: The **ManagementSystem** interacts with this class to manage prescriptions and ensure they are associated with the correct patient. + +
    + ### Storage Component **API** : [`Storage.java`](https://github.com/AY2425S2-CS2113-T11b-4/tp/blob/master/src/main/java/storage/Storage.java) diff --git a/docs/diagrams/managerComponent.png b/docs/diagrams/managerComponent.png new file mode 100644 index 0000000000000000000000000000000000000000..410201dd3fd4272262d24d8224150ec1d875b8ec GIT binary patch literal 69755 zcmdSBbyQVhw>>NpQiAlMq`M9w(%m2}h}5A$k(Q8BkUoGQoq`Ht0iuLR9O)KN0V!!z z8YHBC>-fgKcYN>f8+VNFuWt;;K=GWtpZ&yIbIm!|jx*HPJWtF(eCEuV^V(W!#%Io) zy>R9XE)L;Y_>E{GgDL#r_fx;-=iuoTC zB=KWJzx<+dxF&7xoFbL7imbeGdgz`bK}N)Az4d*6t$sT|F{I8cM<<_0)QC}7jNk37 zV2RG8tI)xo)m+|F_W7m@1os`&ZY?v+2tNAwlCs1t_37Ctg<$Sr@xVb&4eGVDcDw?j ztWt7`9%JFRUwAj{y3$X)OuE|f1s~_sKRC=hesR6nKGh|swD_acN6|5k`t$5Ieb(jL zkG7kl8)#|sQ`;GC+dcoFf78&~@ELP>_f2E*=xSS-y7x#rHx)I{pBJa#O9Dyx%MZ^6j@h0CY4pnhy*cXQm>SD^&Q9`+Y)D}X^gM&Qqo!P4a@i+x3}rQM`aR6X zk-e99kiwSAbGBAe0uDsuUX1yP7v4-M&9&PxftV1dKdhOgY+~BqPU+oO9F=RR8y8e^ ztG8x^RV%YX`S862s;x@w2ZA;crgsA}kBMq{bXxE(;)=EKI$xx2GAHQe0U8~yu8v~cRnmoHbpO#Z4j`(4mbd}2tgZj^RLt&RkKQn!)NkirkH z3;c-qVqP6qQzZ6(m7bw^;h*;mG1w2EEs7{oBONKXWs&h){*H-MtVi6U3Dv7th?#Xp>U?)rq?8 zk5MH3A77Z4celU0IpQ%F~5 z&z|}H7<#Ig{pL!pWYftXfrS_{=3=ku#!z>~{qK>sVFypQd3ipUE+#R{PRPy%E@rzF zs|2pqElvFPAcspCW3Ne2iVE4A3~(EI5_J4~#2`-!({XFOx~;XXnbTesoxLe~4fOZ|P>;x4VR6jd$*{;%WMoE_TH7S-A~c%xDf4%H1Ff$#(18 zTbMzAVvVj;F5A%GSKVf+1{CI$dT2>WL*MORXsvjmnS3!{HX!4V8abay$rJNdCO+dQ z`#(wx1!Y5mewLNSNhT=_$#O^`_=Gwa(G|@I+b5u5| z(D!i9=|sT-n9O`GGtoejU6kvLM%?K+@kw)MMGQqyahP8An21eGw0`SKA@o>@gjP`L z!G(*nSva@^7b3LYwZxDQ?>|zGbZ$+#bn`1rf47Y;>|-YE#>EguXMK0-$)L{_Kr>$U zfEf>qU}LXe)_bmmY_TubCFkFB>D9RN+N#bcSMpY`=IHy|0{%fW zAERnm5lj8~4i3kEejCp;-@_GY+@D?O$!sCi7%WyVl#1Ri9*4B{b31>?M_dQ zuRb?*8?P4PDc*!bgJIG&WM7xW`)}L-<@I;`w|{! zU|_U(ksmv5A&*^^MqXRPzHuI-(0FzIon(jRPfbnDrqh$djE1l;r3NhDvZZ~w^OdC+ zd$S$J_>JM?Zbb zdTj`u1|Vke=Qd_qU|3ygd?qjv-I*dH1e4n=dpc>nnAhcvfB03SNx5`0dSPEBUzES` z`Pt@IOHU&O_{&R+D&s8pFPQg2xgcW(&rgqVes3@KB@F2mDp=oPhj^G0f!#Oz#}b_d z^1;HkjVn{$x_Jtr-`1_~@X`re!R|=+9F{2(Ph*kw@4c#j{~p@<{DCOtzbDNAQ%myi zfb_qNb^qyOcn&{5mlaM}>*Y#bflWq@-DERVi4Zci|8F7lKV9ZOMAm(^Q*sE#)Yyo* zuf_qP*Z6;i-v8xw5DFpta0n(AB|lo!ddDZO(zxvI)fkDFc`}?HsTi7Wps>OGJ9lHPO=E&>Y=>lCD5Cpxt8V}cG_sA9`u}ft* z5pi!i{`XAz3oGsFqm#pR2;#q{8tQ{%d>COv>+td;0&pRA_dMhoP&_>_fbW^XT&EeD zBG(9L1+O(<9k2C%44;1S_tQiq?Wc4xd>udh&TZ9D9QH_|mvGkA03V*b8uD`qCM5Y&gv=n}_q$|>JpDTT8u_x2> z>r0C@os_PUE4dH~<^4K3DfD0Ces~n`=S&#LD?WLz1qm>RfzrL*VS?I<@p5rknIBFqR zl%k7*h^@iq>;Z_OWP|)LxFOBAv(9%(>S$%G$~f%D5Z7#^+i*#~%xxVVDL$Irm9dt% zyoIyrKkOil3H79=Dn}9&(ObXw6TR)fJ|*weoffpcXx$iMp>uMw*EGBcnP_ zY_)&5-Xu=clOgo@g`f8G*v)v_0XCG{{DHD zO#03aFK&?&!;_pbMj4sK_&*GlxV!_}E20dP!L*x@eJHix*w zKI%^6a~km-kmu=x`S|)d2F|orP`&@^6SWii#6(E(I^}O1yV&a=ywHBgZ4{fn1Het@&UB<*ulKl$t#prd#s>iD4Z(HoZm;d+SlY>F#0 z(lXgWc+ z6AceS!2GqKW%Wu7OIRReLj%R*v@L)*#}qsWd}3h^N{VEGz{|1Z*;`V^)(2n*FmT;>g z75tUC-PQ5OOuELW+lr@={EyfH@;&_k=sUcXDB8P0H=Vytv+8-IdvES#a<{lQLLyuZ z!Fx$>o@()S4|s8g?-Nmtu8ovWvv@~{`YjuleXa4dRS5h2#oRXh_;wnzsdnAYg@r>7 zeI%ijqd8>qeW~DG_ol(FUXF`fSKq>E+%h_mO_q)$4vN`~k$>7MQy99N{lcmaADdUw z9!0Q~3s+QSJt-}?bE6}P*~mM>duv|XLJ|TfX@8*U#Lz=Rg2rkIE?TC?yL(Ni)?X90 z7W)oYss@Homgr73dswb5gZw7$+1j{JywgD$~<9^HG0gW)^atq?@C8Ka79ecre;q#HhZ%4zql zBS*8%!tvSF7a2@p-<$981|Mj39|Ruld)qTmke;RE3t(%iFnw($y**^9LVM>>bK;ub z5!>15GqET{t^iEqf-3$TtV;R~*xxgAJ3od2+6B9q@2yXJYVbr1R^PH5bHZ!!^b^~L zLMFwh6xE4$hnQdn|7#J{AUb*NK)E z5~jBX0wh#Am7&w2dqy~_eCyIsh2DLdQFtx0<%MY(rBnH$Lt0s$%-1y(U06(!CWsV1Ny2*0NHi+AZ95Q}&{Ze%@v#drwoJVQ_ zGeJNHZw1$B=FCJ5yf6~vjOt^=~3b7@GHy9*B|2cWQv?Z>d9(o z)rPH|VZAd082Nx>&C(bLKT=8OdS|wHX;6LG)_fOiq3)VeF_-=$2unIa2+RhPH3B0Q zesY9ME_cDnmSpS~CpULV*zun=;|1=&sh;uz`Yvh`nRfcy_H=uJHunhpU(OlI|ndktYWO z;gpCdvOHH@d}1N;mMe)#`$Tc-cP3>|_9L~T5U{iYYs}q!e{(u#5{i>}yvDOb)F4}o z%Xo7(L8L@CGYQ2N#Go*uyY7hpKG*$_R{1aX=+Z)>-~rS5uXd+!Xacr}jgjdd9(H?Y zc@Ro2t9LijgEhAvdCh$6%e@=`CjyGR;`^x|@Km*_@9eGRv#Am+86@*wPQd=UIKrEb z{ZvszWFX!0FWxc&XnwGyc$y7a9&$@v0PnrOlQR)f8FJu*HwR09luOwqcQF4jTg(X? zr-NfCN%2~&pYZMxj91?}>`*+JNhQDtA+*%fiYK-^lRJ338?^uI{Ak*rP531E)C1GZ zllUf_=I9((sztrO5SPr4{6nT%$3qWU zKaXfhN958K<@OOsnLlX zr+IB$^(*Tq!*63OSLW$Z+EXclZ*Oh_QuE`(#J)uIB0IlRSh_Huvuaq|0{Fg5o|X|c;HXA`tQ zLxGmL{j)b;cBH}5XzlzzZaV7?mpgYc@R93aG1RK3$9vP0^)w4p&3~`jb_Hk%AWrE1 zc)pJJS^r*!4*+I%5tu1BTA#zenyfj=yo1PHKHD#VSN zRkDP?qmD10IEKOhPkIdgiKhayMXgSBAEuo*o{|u%C=1`;KfeHEts{mrr7Rt8y%0bJ zG+J_E;v|G`c(BPsYOXk##8eT*qYd24#sC+AL75d?AFbqApyJl^qScUa87N?u@_KY2 z1!d~;vTJ)5yLx+;J zmO9?!+rPdt%lILqpwa+zd>ueYA}UWdzytomp@Ghl50=z0BZl}H45#xvqa=WInCCD0 z`7|LS_g+sjMHs)~rE@hn#C12A={nn)3&8r&xOU$$`sHRFaz`V19}I zpwcV3(UXedCm+ga85w)-T|0uje^m#np>|*8n9^@rcwT>Y-0Wiy*Xlii%gYqDhPucQ z?r?>pc?z2<;M8tC)=bXv`D0)(3NWiSFTcO%H6U2=+f+RI63PTJt;??WD73YkjdSYtT>H_&H8p&k zIWK;b*iJS^V7w4gUaUXaOT|CGwyp<8>`h|mlHX_m89=K;NO;;y;?BMMn;k4wnGeNo zLq4>q^WkCvJTx{@=POPeZT9ZQRf-DM$A;8A|5))kD31_U6CpZY_bAAjZg3zFpP+=& z4PB9Cr~sm_hZYSWzLUiF29#>FSDR(#I@ialG=BoM*|Utt*b;pn(iKaR;yBQ%-Kks& zt}RgHsd3Dv7D{!hTpWp9rGw6 zZJ6cBa(=*6C2)@zm%`ADOE=9NBaM(si^|>fT7G_ScVg^{snj@u(fMg&AkRhP+?NA* z$XwtgmHM7JKyS{^C>7WepI(@Y2sHCPxuPx#2eyljf^=dAip6T+Ti=*puLy9L%6zi% z&L~1Xfp#XHgA`ajxIMBw1qfN;j~px%1RnZi9XR33MKQc?pPy08vIXOqTjM>xR%yRK zDLxxGpQ33KvZ>x9`A!YjI0(wSXK5BoMYvF~B-2^(3VgZ23+}uji(WLbDV|U`Ry3WY@Ewg?@de63Ei_=@<{y_0KulDdE2yZ~j zyyCKdt=ioJ9>vkph!nd_ZG`PPmu@;+qcD=vZ9x#o0_COVPmTy0XSGa)k!ZQ zQ#jgCg~x*0=dG#Ddq2MOISykb_Ybo#V1igzChO^fuVmTt4-;Oo*u-}L{@``y7ho_X z=TgDv%c0_{y?IpC5vH<}M%RQ;$+!#OD57G990B>ljtL2Rxw^itonS5)vK z7rUl}ptk$=E+G*zCj_gUoZ#IRsG6Tqkh*ZVTuk_nNhTOCZ`i#K{6Oxd zo80wil-fVJ%i~L>3ZZ`t!{P8|B%?x34wj(gOEtC53S&rXqt{R4zQXWw7s8End^bA+ z_Z-=iq^vo>B`)1*+WI+<%GzoA<=3ZphfOwojS7 zMrY}v+&K4UXD(Us`mV000Y-`6kXxqCu7#lIBDD+pjds4wr7yiCh@K2lyzjuzZf(wY zJp|0gxx%Vp=epG((v$R1D&*56Wp}EeieJD|xllv(Tl-;(T#Q)V8<;LNxqr~B=T9zu zQiZUh7&c+?=JqeMrBg@LjRor{R@-v1(;06QCiy$mJs0Os-x8_y3f#n@0SN1|+@!Wq z0cysltFcVcCrO0f(SlzscFl2j*QX8Qsv?Rfr~x|I1I5f|P#_0Vl7_BE5>s6G>gVKn z+@c{!vqaSMhvo4;F<3kp9yGn)uxA5_#&@yzV55axHaw2g;$DS1Y>VA*H`kcseKaAN z|5GvhkC5Q6)COR-L_hye9KeKB!EDJ}-*~z-krUTT;2WGgfSUfJ0QY~t96#c87P15+ zVc$#*>M+$uNUhxh)=z0&?GJ0SCPv_*E~dznHsGi7sLfo}x zI5%uxeYm%73kMoD>-uEEhKE%MFV-#b5k>q0FH8ByC)Tt_n0DK+k(kKl)IL-_#shY3!yuWXx6 z;AG6TC+3PeM0ed;4KVr+Gvqo7zf4pTV?%2tEj%Cm252>F{L2gTo_isnV@$)c^rO8s z)?R?zCswIPv8|NfmOv+7s2}vW4~wrb9^c+}QFD(<(SQaP8~fe^p>A|PmV(q>4MLW^ zy*<>@hA=1y3bB|~z-CYmKpw>6LX{}uOYWnF8CyL7eCm9h`~f`h>1GH5lDYSGdnSg( zo;v5UXVPjt&>F2~Ib3`a(FG%Lgn;0^bmKE@Dg5eOA06IulhS^u`lLBJW-}yjeiekH z!z}ARFL=#HkDo`K=Gnj~U{vLIK$1HH(DkLQ@YbXG4K!aDR6fH45DBimztucsBrP%b zwh)!Y#m628c}p}HumZLi$;T`XEkU7hx9nkeD?3PA?2&i&XJR^%S;B#ebF|j%q@{ifkRgV5n3n{vBfZvap zTrzI`X|Aq)i(nlltRx|beZZ?V_itFV(F$OIe>@r>2jw*4;VnWD#ONIYVaf!Gd1^IA zvm>rDO_osVvPX^pS^8!>t`#vjs^IZm2vSq=nF2UgVmxlkR~ zOx@8<;_B6T$bJ4^tS<6_u@N1acCO?r^yilhUG#O2GMGCmu6Uuw26=81kYDWG{R{r= ze`Wi=UI929A>qM_R#gP1B{8SFj#|AkwF-rzHE&lAWQzjmY7L4k?FE$;MlMzf)FT*TvT~rRVf$VYBHRrp5m8d* zEz^6+ho~KdRi|}eOZn*R{D}#E3eap2JVQ;HL$%igq0aq+7R7FMS2#dM!d#dI)O*95 z_6m*$A8^!-Ud{_5Ku6V~Ij2FZ8kw&H@c=;BMtxxFJD%n~QJc~o zt7CFbs!o~V9FzagxfKpYN_BjA^lQ5>DA@TwIQO>&E#SxfdV0BX1d4_(PO1pjUgOyE zMBWnL3p6#{(bB@^uk)ny+|(F^3KJqWd>{Fyl!7oqn5B#C4S3I6l&4)aOA>vcz<9;T z4iMp1CCD71hr3RZWgNAB`X|7YBc6Eo>}oAj-or2Axr}baHK*q3GDlkZtxeD$+S}}! zfpdaT1N2|LOTBNi_+PdF5BKDPxdeCymOFqG-H7c|q;j8ppB~oU-pjD${$Gx*uH`I_|y>u?NJj8d#rV0x#r2UyKkW? zj%)}~qjVh8gllUQsYGSr^+--bNEF*X$ZR@N-)Y${W|H!1mJa!_k1e_pYDmK52oi$C zPgHzwS4K|MUKn3&+yqSLi_a3gB3c~Z`e%toy)HKvfpLX864;9c(RNFol?S&8+)Z*M z+@R8H*^Q?W7;VSYxc|EQke7rN!sZ%e1_L>7h^s5C)nDGUBxocu*vY(lkU3Q(c?@i7 znh1bZ7&H+v0V5(GwDkhnfTUF*z=mD`ek5@F0J4Q^(Q@(2tpp=+Bs-bJ^tu@G8RXJi z{;VH4BD}%!;H;-2+z-0?m6R_~`Y8Naeq3obfl9t*tcMsjfo%qZkcT*=NeB}G7dyh%;E1!Mzdl$Hw2KwmJ)OH~lu9-N!Ng3FxC z=YUe+x2i>kc|#>sVVfl_a2KTn+voAhWh!MnteEeYYJ#d;Zicydg-Qfvp7Le^XdJ-q zUZ9CO*;dZ-)K+iPeEUgIJCWg1{DHD5ayT!E%3@bG3r6AGpEvd;2j^-Aosd4bQPRYm zxccuii)^FbUvYgf)?5}qJG&lpVy>x#K5)+Jf7G#F zOvu{`vW%yH-x8p;%a_>1Mn6>r`&1olZ+gO+chX4JlmLb;HLA@B zQP)qb2VzeX07*g>(PRCblV8B><;Kx%zJGtD2;k!c{eQ%k-Ufsk%_7w&^j04Q0e zCBWtsEaQ4pHcQM&=iXU-N7;~bA0Hk3pk658vd3!?smpabRs9W1qk%?_bPKKYT`gG5DX~(lrwAyK%yCVCIA=U zxFuh}?JAtf%>Pu!>4c}cJ*+jP~Fvz-j zG%6N3G4rn{h@v2ETDgB;vnawyxYH><90@$wn{59@Un0 z!&-02H!f6+m7}XTp>(rS2#avJSQApjJfNu=)W!||w z$Ea~?iCJ%3)+zG``{YUo0L{*gJtOJ@w6}onTlq+xLtP5+1jFHfLeLJZJ$N{f5V&v1 z&?QM_s4%42a<-DrwAe=j)%Z4O+gb0)kzCr+SPPH*UtgQUt-dgBZNLwNeah1CL>3kHUwBd z6>!_KBe7Pcv>??)kcozHE9>NCCNFnz4mTfTcCh<#0-muT{H0zWe781y1fPlaW0bPq()*?fLI<}pHt zBbC^k3bz%PkW6Ax^avtq2QDl_^44{$;E|(>Ut=zXPG}(8;^N}UuD^R8>$hAcbhtFD zn-4fAteJ_e9r6$ud<)3j9l^Pflo>7FRczv zI+@IuP+0X!MlN^)_q56BC^*3h1mWYD9Xl`T?>NQqEO8=n>KOFhG1huofcO=#0sar4myod4>ycB8uom>xd?*(Z*n+jTD zF5^JnbCnin?S?2H!D)*j%qpfy0D#ZTmj@(l!6I6Ukad~h^$t)46(pt*vZtGD`IA`` zFOG~#@cLVk76-OwwCw-MpEN;wIrCjkPoZV<>f!lO<}w}e;1LRoPH&!c3zQ35zyEwx z`?9J9TVf8k;l2M_uZH|2J$o1E1RB9>7cQl%bB-Kom2ivCgn)bGWm-%@PDSstSenZ- z{XI*RXqdvB?p7sW7OFqsIRM#3os*+SxX{ag%!U?Uz;cpgrmKb?NX4U!cg=n`xdohA5QLQnF&u9!My`nkaZy*>SPGIF;KU%>U2vBG{VZs zL!A8b0~tMJ+P=iaUU?+0cYn8!i7^@vA2$K*2rxTeiFjMyb4pHN{^{k(<*5c)V$FA5 z4|x*2$*ohxY8PXc!N$qnKSt}eBX_AJ2#DzZuP^sA2e=Ta<~k@3E?cu_s0)`(UzqiM z28QJ90#y736sJpx*;E=g#^}Gp0`0U?8L;xeF|w(0PAq%Os}q=7j;hU?d070#&HGuT zt-DQwy-90}eBcIaDo50)#ZOQahy|jHB+?-z%Yn5888H*&Kk%d!_Nz}=Q#I%*0}6*P z7dQ|Fq2e9U*n*7~keTocOPBtt5#)?{^7KMt)7qQ;>MV~NT zCSdyP`;mqS(BVskErbNtsart(B87@sxRqa)$$3mjz5Qy%@HrD}s#3&&-l$$67c>RC zSUdC?ua4J0Pm_!gSu{E0JBANI zfHf?Q{%3cUQ3DCFC3}b3;r{fMOFbt|I3HF3U9@jekPb9zGq*t4$P~1g<)_9dE#)29 z(%1g*1wAWnXg)L;sz9}wJZAq(T348Se>vktDr9l~1VdYVTwIE|Y(eQFCCAfZFFcuN zmx?Jhklz) z|NYqn5FatDhRdGbojbsW3R}N_0>Zs@Z9CAj>0jmWTgpB4KZfXb(m>-oYAGc zXz9&j?d6QUZDs=*V@a$vGRz2L$2SiEuk_SUVClLg~-GaHLd^8PoR@&9bk zPWpC!fYCv-@uuL>vkY`nL04R#zj|01oo;EM*A;NDvP| zZH7NmBpmqwC|+NyRH+U>SjYr}w&2tAE#;>7?z066;tGT`9nmPQSZJr@+k}$Fp?r+{N0!P5UDb%I{HhHm=i+ z4fQ*V*`Q@Zn}gH12@*Wrpucn?+vW8PU`zW!^$cn!0Mpe9w%4;y064gT`}FY4xqfGt zz8o5j%8#g${Gdj@fGGncFZpAo)cuUZiH4STi!iWVfrWGSvfs++pb?ih;k35E3Rit7 z4E3)Bzne=OxHG6(cYfk&cRu@BygAVB{GHxvAibhMB3}4V$#44X(_1$a4g_%emW?6O zk~e2t&igfOd5jvS=g!;MWz_AHu3N3$lXOc9h5#@wi5bt9h~P96BD0O ztXV%?+W{*pDZM73Q0<9hKrW0Kp>S-Ou={_Qm0%e-*;vS1v zTxAK}p?H1-reA!&(_=gbC@jHt@NgA4e}i1fMA`c)eAx=2GMe6xWd=T;@2xd-l0gw? zXQXoJ0z4IirT}i9*QEF9l~_9x8C}-=Jvw3NzP3hE4(+5%)_u<)r?ox$~UUwgw4JTJM1oKO?CKZ-ULr z~+J(NhKE*0&oW-j|JI$p#Gy?yPBlbIj_OO0Q44sT>L}Y;8bEUc)=@X6)Ku zq~7|VD4>t5z>mFW+I|kWpd~2#|c$ z;4mHu>^QqfUS{JKsfqsmWWa|HR+}b#td)>}5l`57AL60Cv2+UhbDB6_iFtMYurTs~ zkZ3VEn6LLT86`E^+%`0w{(;Kb2tf7MH#46g)6f)_=of2Sq*;2-l+%T`93%C0>PY9) z&23VWtz?6U=cCi`nQ}hjKIr*etWM&5)k9_R9*+w3XFfzha-6S6or96o54I!}cn+@H@m9yn~4hx#5gW6|T#zS>iD15Z^79QnUR>G#dRNs!~DNR%wUn^ks!nfVr_ z=A5HlU4_n;@O>>S4Z9DFXZ0;tEq(JFiPzW_yrmJ_1@RbZvgK%HSJ8^PNK7sq8ML z)JS8m`1)nyN(JZNaTnw7MMD6tfB@o-TFgrd55#Cy@O-9FmAmnocj-->6A8fxd+GUE z9cDS)xpVhz#9XT2p`hZ+Dj;Q$=p?0WgI>=Pv>#+mV|tu+ij37yZamHlYsF0XPnDO1 zd4R0mO(XdXZ2?fq<~S*pqP!HntP$$Zs1i?=Cqg=-8FN($dtORmSUWRrfC+kmL%c=H zd#G;)m<#3fvF2Kb{43HUNvzG#NC~S00z-{H;h~p_V=%bG^YRmt@~C#Qq?a6kW(Ru< zA;l9hFP_K88JVDE#M9zjAdXMUQK8PfD071^API;zf+jA$9?4cj0uV7!sXa*6Kn9-m z9<3Ac)~N76kjcsRgi+>YkTJHd-W;>xDNcnZI5`n3eUDFIh1`~yt;t#cQEXsTjrw#| zP=9!TBW;NKypB^I2fu^DJO_9BM(3Ntt0BHi_paH&;pyEALOx;=&_M~(xn$lZz;(vj z89In9{cDxXiEi$@Uc62A1424re7D41r?v^X?XbreemP9hn7=SP-(*ug_WiMw$R$LJ z9Tz9UOhvxZ-N5%~f741(7^mP(WoVJEF~NYYGcXLG_DhTGp?#m=`M*vve%RPmZGuEj z0A#^*EhOatt-T-corpNvsoZx6XAMtHzjc%kkr9gP_1G9Eh}$gV+QV(10B^1LQeH=K zG_VlJg2dhqQ*Bf7Pt=}X>O-Fv2i zOKaB7ufMJ{bz2lipY!W9A7cM}r)66_OdFw{-y$j zr}`lm$blbt)OgkhLMA`!0mjlrCf`|&D<5yrFkc_!d!PtV?<`Zd&B#a&w zsd7K3V}>}w!=1Jg904I28hvI$f;`4_-Sa5&CgXx%K3$G5S^xT5Kd{hr3fcV%y;cYr6aKey5}HwfW;h*8%ap8 zX$a7}%@HYl^p%K;``Sqa#$mf(c70>?lfq(haw|QwYjgerRF+`7ur*U@gxnobPTBN#fJI2)mMF=qyQlhcP6ic2w_-%hJUgl4k6! zsBD8^(h^Ex?hO9Vo%`CP!v56qP->@ui-UQ&j zcH3-X{H(VjbnCiKJ)FC@nPq4{b~<+VXUKNnWwSFFul`#R5twKr@5KjvH02)+kWj0& zP4-NF#ODf;pixm)TX>q_vlMp*L)b382)Z zG>6(CME=gsqb*C%2B$GwocS>ax>ZsH@~(2%Fz{>)g4}xnU_9*35E3}$rc^@)J_-7{ z@kpAYFX!^>u!wtO_KcHnRxa_P&vJ8jM=yngGu$WEY25x#B)O{&R2b<1bM^0Alv&sB z0u{q&^~RBiGFRHy88DPG9&Th3d5U@)v(XcuO^^6uktPq;cHBc+P5b;I`?K#c;*le2!@CX8SN%y1opLIOdY=V9ZI$U zUKzL|j6=LS%!*s;;Nw=yR#!_Z2PFmI>?OVjcT-Qi3caYr7@63oF;!;?qkTQ7s7ZVL z1zlOf^=;-7P=`bW#>(MRW{sn>=Tuc=@}`+g);KBn5X#>(+7cvekM%Aby#rolTjk4} zeAy#=Dr#_t#FzFTw9%|t3mPq(w^8AZeYYx@@#npNcCk=Vu)Yu^9*VtBM7N>8sxIvK zjyW5TPw0zt!FII2URpBa58XDIHYFN*n9H@3N)*;-Ux8KDPPp!4F0B@=Of^`3{AzjT z6??beJA=HLKi5r_&|7vI`7i9+CB$zmUC(G16b+u~K*Uc^{K15(OEBH>H>i~;peUsx zRR`&K5{j|e*EDFgA~1O3;hiI6f)?tVpsWK)yzn|j4*PC{O_sh)^!l0H%bvmjYn0}K z&9}bYERPCH;nVht(jmwc38!m5*3iq=D>uvx7GXV3iAYcKo^b z&J)|G$Mv$&@UzwTbC`)ANvGoV_qtS(YAf^1?d3}~ibgd-=cdH+1Zw%V8Bc_&96HFF z2sn(93^&{5`)ZdWohRy@J_ZaC`*(R{v(oP!X_*C}ijlAo8@6%&`sNXIYtBE$YswFP z-=w2pMI1`Z6(l-O45Nc{yaygS-af}o40f)}3GpzgQUMIfQp~hmp=^LKkdp;X-Ap(U zGY4~#27m8F=hJ1?ccZ!f>JpHSjk1IbPDSpWzh`;qh0RDJ-2C)Vg7ElxD;Gznio54#L^Pw{ebtOB?W!6 z2Y8AG5|(p>eP@ndzbp-^Tsia2vmhI%p#0NidT=O^xnXCilzxwCrN9ST-s|& zWS5&f*8`F*c8`aFH9lDIkB9?(-=Tz)FN3P?9B0VeSrUz9^|zoo_F~64vm_1cRy56? z;EsWZg#{i$2k$Da<)ed(;K7%vNt=RKKquk8@8ldfOK5+A@&nHH@?Z_v2C#`WVL9&~ zvsf5Jq&Og@P5Dk1qU-2O>_gfRhGpuBuT8em@5Mfs=Bs)ALJr1Pin^w-hhTGqZUP4f z2ci0HX`lH=jB-s`FQF!Fe$(_r^I8jD^#8o{X0A(*B&!jdKAMIif+C)RbWC!f?w=cS zUAVtCW)87X@jRNd4%Zr1Ah~EyPxhg01xi_1h9mvj4D{5BfaBnc7k%NKpL`dmuw3(h zTP3?@oJ-|9dBCsX-E;eb4)!VD2wL;FMV;eqAijn_qhaqdaTBP8i1z-6igRS7ZLkT5 zz3WtQIfTt3#Hkk9|6Cb)Wo};+lMQZ6v`K&+Sq@&1u zYgnXG(8OL8K|$76OBdak<1G^8weC1ke@;6!0XY6rC_LZm-uiz#{{N4Llm9?G{_i?f z{=a>3FArsvh<$IzS||~8C?r}+@k>Eh-2u=>KgK~zn>_sJGudu^gZ!(t-@{KYvqhuV zr}8i8jR-M4<<;4mU!x<{n*!<&ctyHuFu&6-u!12M;wx}-uMZLD`dgp{2HX8tcM}h_ zw>AlNf_G;75|HO0eaU*y;*Gz%@#PzIs@F#=o@bE2`sA#lT*)0KDji~8OjN+@UO=R( z)twvu5ahdrhVQ%p^$nt~_lWOzrj0mG


    ---- ### Adding an appointment: `add-appointment` Adds a new appointment to the list of appointment. diff --git a/docs/team/judhoka.md b/docs/team/judhoka.md index c3bd747970..d30a78d2fa 100644 --- a/docs/team/judhoka.md +++ b/docs/team/judhoka.md @@ -2,98 +2,114 @@ ## Project: ClinicEase -**ClinicEase** is a Command-Line Interface (CLI) based clinic management application designed to streamline the handling of patient records, appointment tracking, and medical history storage. The system simplifies daily administrative workflows while ensuring reliability and user-friendliness. +**ClinicEase** is a CLI-based clinic management system that allows users to manage patient records, appointments, and prescriptions efficiently. The application streamlines administrative workflows in clinics by offering reliable, user-friendly, and persistent command-line interactions. + +My main contribution in features was to design and implement patient related features (`add-patient`, `delete-patient`, etc...) to ensure that users can store patient data properly with their respective credentials. I also mainly contributed in creating the storage system for the entire system to ensure that data is properly kept and saved. --- -### Code Contributed +## Code Contributed + +**Code Dashboard Link**: [Click here to see my code contribution](https://nus-cs2113-ay2425s2.github.io/tp-dashboard/?search=judhoka&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2025-02-21) -- **Code Dashboard Link**: [Click the link to see my code contribution]() +--- ## Features Implemented + + ### `add-patient` -- Registers a new patient using their NRIC, name, birthdate, gender, phone number, and address. -- Prevents duplicate entries by checking for existing NRICs. -- Example: `add-patient n/John Doe ic/S1234567A dob/01-01-1990 g/M p/98765432 a/123 Main St` +- Allows users to register a new patient by specifying fields such as name, NRIC, date of birth, gender, phone number, and address. +- Includes validation to prevent duplicate NRIC entries, ensuring each patient is uniquely identified. +- Example: + `add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St #diabetic #followup` ### `delete-patient` -- Deletes a patient's information from the system using their NRIC. -- Verifies the NRIC exists before deletion. -- Example: `delete-patient ic/S1234567A` +- Enables the removal of a patient using their NRIC. +- Validates whether the NRIC exists in the system before attempting deletion, and provides informative error messages if not found. +- Upon successful deletion, confirms the action and removes any associated appointments and prescription references. ### `list-patient` -- Lists all current patients in a formatted and numbered list. -- Improves usability by including separators for readability. +- Displays all patients currently stored in the system in a numbered and neatly formatted list. +- Includes name, NRIC, and other key attributes in a concise format. +- Improves usability with consistent dividers and spacing for readability. +- Helpful in providing an overview of all registered patients before performing operations like `delete-patient` or `view-patient`. + +### `view-patient` +- Shows full details of a selected patient, including: + - Name, NRIC, date of birth, gender, phone number, and address. + - Optionally, linked appointments and prescriptions (if supported by system design). +- Supports lookup by NRIC (e.g., `view-patient ic/S1234567A`), with input validation and out-of-bounds handling. +- Designed to be clear and informative, acting as a one-stop overview of a patient's data. --- -## Command Parsing +## Parser Integration -- Implemented parsing logic for: - - `add-patient` - - `delete-patient` - - `list-patient` -- Used consistent prefixes (`n/`, `ic/`, `dob/`, `g/`, `p/`, `a/`) for structured input. -- Added validation and exception handling for malformed or incomplete inputs. +- Developed parser logic for all implemented commands and storage system. +- Handled command recognition, parameter extraction, and error messaging. +- Validated argument formats and threw custom exceptions like `InvalidInputFormatException`. --- -## Persistent Storage +## Storage System -- Built the file storage system for: - - Saving and loading patients - - Saving and loading appointments -- Used serialization to ensure data persists across sessions. -- Automatically syncs after adding or deleting entries. +- Designed and implemented the file-based persistent `Storage` class. +- Saved and loaded: + - Patient data from `patient_data.txt` + - Appointment data from `appointment_data.txt` + - Prescription data from `prescription_data.txt` +- Linked appointments to patients during data load. +- Generated HTML versions of prescriptions for viewing and printing. +- Ensured initialization safety via `UnloadedStorageException`. --- -## Unit Testing +## Exception Handling -- Created JUnit test cases for: - - `addPatient_Success` - - `deletePatient_Success` - - `addPatient_IncompleteDetails` -- Verified both valid and invalid inputs. -- Used `ByteArrayOutputStream` to capture and assert printed outputs. +- Designed exception handling framework with custom messages. +- Threw descriptive exceptions when: + - File paths were missing. + - Data parsing failed. + - Commands were malformed or incomplete. +- Used try-catch in the main loop to ensure graceful error handling. --- -## Exception Handling +## Testing -- Ensured invalid input commands are safely rejected. -- Gave clear feedback to users for: - - Duplicate NRICs - - Deleting non-existent patients - - Incomplete command inputs +- Wrote JUnit test cases for parser logic, patient model, and storage. +- Threw various types of exceptions (e.g, `UnloadedStorageException`) if data writing fails, allowing the system to safely abort the operation. +- Manually tested combinations of valid and invalid inputs. --- ## User Guide (UG) -- Designed and authored sections on: - - Adding patients - - Deleting patients - - Listing patients -- Structured the UG to be browsable and beginner-friendly. -- Included command format, usage examples, and error notes. +- Contributed to documentation for all implemented commands. +- Provided consistent format, expected outputs, and usage examples. +- Documented edge cases and failure scenarios for better UX. --- ## Developer Guide (DG) -- Documented feature-specific implementation details for patient commands. -- Wrote sequence diagrams for: - - `add-patient` - - `delete-patient` -- Helped standardize the Feature section format across the DG for consistency. +- Authored complete component sections: + - Architecture + - `UI` component + - `Storage` component + - `Main` component +- Explained design considerations, structure, and responsibilities. +- Created and updated UML diagrams (Architecture, Class, and Sequence). +- Maintained consistency in formatting, phrasing, and layout across the DG. --- ## Community Involvement -- Reviewed PRs related to appointment and patient logic. -- Provided feedback on command parsing patterns and error messaging. -- Collaborated with teammates on refining UG/DG formats. -- Ensured consistent coding style and naming conventions across related modules. +- Reviewed teammate pull requests, particularly those related to parser, patient, and appointment logic. +- Proposed improvements for error messaging and user experience. +- Ensured coding style consistency (naming, spacing, error format). +- Participated in team sync-ups to align features, naming conventions, and architecture decisions. + +--- From 5b304813e52726efc4df9a0fc45f2e7023906e7b Mon Sep 17 00:00:00 2001 From: judHoka Date: Tue, 8 Apr 2025 12:18:00 +0800 Subject: [PATCH 188/203] Updated PPP and UG some more --- docs/UserGuide.md | 31 ++++++++++++++++++++++++++++++- docs/team/judhoka.md | 12 +++++------- test-data/appointment_data.txt | 2 -- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 308a474606..85d418e763 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -11,6 +11,7 @@ ClinicEase is an application designed to assist doctors in managing patient reco - [Viewing help: `help`](#viewing-help-help) - Managing Patients - [Adding a new patient: `add-patient`](#adding-a-new-patient--add-patient) + - [Deleting a patient: `delete-patient`](#deleting-a-patient--delete-patient) - [Viewing patient details: `view-patient`](#viewing-patient-details-view-patient) - [Listing all patients: `list-patient`](#listing-all-patients-list-patient) - [Editing a specified patient: `edit-patient`](#editing-a-specified-patient-edit-patient) @@ -77,7 +78,35 @@ Here are some feature that the product provides: ### Viewing help: `help` Shows all available commands of the application. -Format: `help` +Format & Example of Usage: + +`help` + +Expected output: +
    ----------------------------------------------------------------------------------------------------
    +These are the available commands:
    +Patient: 
    +- add-patient n/NAME ic/NRIC dob/BIRTHDATE g/GENDER p/PHONE a/ADDRESS
    +- delete-patient NRIC
    +- edit-patient ic/NRIC [n/NAME] [dob/BIRTHDATE] [g/GENDER] [a/ADDRESS] [p/PHONE]
    +- list-patient
    +- view-patient NRIC
    +- store-history n/NAME ic/NRIC h/MEDICAL_HISTORY
    +- view-history NRIC or view-history NAME
    +- edit-history ic/NRIC old/OLD_TEXT new/NEW_TEXT
    +Appointment: 
    +- add-appointment ic/NRIC dt/DATE t/TIME dsc/DESCRIPTION
    +- delete-appointment APPOINTMENT_ID
    +- list-appointment
    +- mark-appointment APPOINTMENT_ID
    +- unmark-appointment APPOINTMENT_ID
    +- sort-appointment byDate or sort-appointment byId
    +- find-appointment PATIENT_NRIC
    +Prescription: 
    +- add-prescription ic/PATIENT_ID s/SYMPTOMS m/MEDICINES [nt/NOTES]
    +- view-all-prescriptions PATIENT_ID
    +- view-prescription PRESCRIPTION_ID
    +----------------------------------------------------------------------------------------------------

    diff --git a/docs/team/judhoka.md b/docs/team/judhoka.md index d30a78d2fa..158b46ba71 100644 --- a/docs/team/judhoka.md +++ b/docs/team/judhoka.md @@ -16,26 +16,24 @@ My main contribution in features was to design and implement patient related fea ## Features Implemented - - -### `add-patient` +### [`add-patient`](../UserGuide.md/#adding-a-new-patient--add-patient) - Allows users to register a new patient by specifying fields such as name, NRIC, date of birth, gender, phone number, and address. - Includes validation to prevent duplicate NRIC entries, ensuring each patient is uniquely identified. - Example: `add-patient n/John Doe ic/S1234567A dob/1990-01-01 g/M p/98765432 a/123 Main St #diabetic #followup` -### `delete-patient` +### [`delete-patient`](../UserGuide.md/#deleting-a-patient--delete-patient) - Enables the removal of a patient using their NRIC. - Validates whether the NRIC exists in the system before attempting deletion, and provides informative error messages if not found. - Upon successful deletion, confirms the action and removes any associated appointments and prescription references. -### `list-patient` +### [`list-patient`](../UserGuide.md/#listing-all-patients-list-patient) - Displays all patients currently stored in the system in a numbered and neatly formatted list. - Includes name, NRIC, and other key attributes in a concise format. - Improves usability with consistent dividers and spacing for readability. - Helpful in providing an overview of all registered patients before performing operations like `delete-patient` or `view-patient`. -### `view-patient` +### [`view-patient`](../UserGuide.md/#viewing-patient-details-view-patient) - Shows full details of a selected patient, including: - Name, NRIC, date of birth, gender, phone number, and address. - Optionally, linked appointments and prescriptions (if supported by system design). @@ -107,7 +105,7 @@ My main contribution in features was to design and implement patient related fea ## Community Involvement -- Reviewed teammate pull requests, particularly those related to parser, patient, and appointment logic. +- Reviewed teammate pull requests, particularly those related to parser, patient, appointment and storage system. - Proposed improvements for error messaging and user experience. - Ensured coding style consistency (naming, spacing, error format). - Participated in team sync-ups to align features, naming conventions, and architecture decisions. diff --git a/test-data/appointment_data.txt b/test-data/appointment_data.txt index 122e2d65e1..e69de29bb2 100644 --- a/test-data/appointment_data.txt +++ b/test-data/appointment_data.txt @@ -1,2 +0,0 @@ -countId:130 -129|true|S9876543Z|2025-04-10 3:00 pm|Dental Checkup From 3b819f308944efb793a8edca23478df9ef8d72a0 Mon Sep 17 00:00:00 2001 From: judHoka Date: Tue, 8 Apr 2025 12:22:56 +0800 Subject: [PATCH 189/203] Reformatted all code --- src/main/java/ClinicEase.java | 4 +- .../java/command/AddAppointmentCommand.java | 6 +- .../java/command/AddPrescriptionCommand.java | 4 +- src/main/java/command/Command.java | 8 +- .../command/DeleteAppointmentCommand.java | 2 +- src/main/java/command/EditPatientCommand.java | 4 +- src/main/java/command/ExitCommand.java | 2 +- .../java/command/FindAppointmentCommand.java | 4 +- src/main/java/command/HelpCommand.java | 2 +- .../java/command/ListAppointmentCommand.java | 2 +- .../java/command/MarkApppointmentCommand.java | 2 +- .../java/command/SortAppointmentCommand.java | 6 +- .../java/command/StoreMedHistoryCommand.java | 2 +- .../command/UnmarkAppointmentCommand.java | 2 +- .../command/ViewAllPrescriptionsCommand.java | 16 +- src/main/java/command/ViewPatientCommand.java | 2 +- .../java/command/ViewPrescriptionCommand.java | 18 +- .../DuplicatePatientIDException.java | 2 +- .../InvalidInputFormatException.java | 2 +- .../exception/UnknownCommandException.java | 4 +- .../exception/UnloadedStorageException.java | 6 +- src/main/java/manager/Appointment.java | 12 +- src/main/java/manager/ManagementSystem.java | 78 ++-- src/main/java/manager/Prescription.java | 216 +++++------ src/main/java/miscellaneous/Parser.java | 20 +- src/main/java/miscellaneous/Ui.java | 4 +- src/main/java/storage/Storage.java | 32 +- src/main/java/storage/Storage.java.bak | 344 ------------------ .../command/AddPrescriptionCommandTest.java | 36 +- .../command/ListAppointmentCommandTest.java | 10 +- .../command/SortAppointmentCommandTest.java | 4 +- .../ViewAllPrescriptionsCommandTest.java | 42 +-- .../command/ViewPrescriptionCommandTest.java | 34 +- .../ManagementSystemPrescriptionTest.java | 58 +-- src/test/java/manager/PrescriptionTest.java | 1 + .../miscellaneous/ParserPrescriptionTest.java | 46 +-- 36 files changed, 350 insertions(+), 687 deletions(-) delete mode 100644 src/main/java/storage/Storage.java.bak diff --git a/src/main/java/ClinicEase.java b/src/main/java/ClinicEase.java index a7b8ee69a5..c496629116 100644 --- a/src/main/java/ClinicEase.java +++ b/src/main/java/ClinicEase.java @@ -20,7 +20,7 @@ * Main class of the ClinicEase application, responsible for initializing * components and driving the command execution loop. * ClinicEase is a desktop application designed for clinic management, - * providing a command-line interface for managing patients, appointments, + * providing a command-line interface for managing patients, appointments, * and prescriptions. */ public class ClinicEase { @@ -56,7 +56,7 @@ public ClinicEase(String filePath) { /** * Starts the application's main execution loop. - * Displays welcome message, continuously reads user commands, + * Displays welcome message, continuously reads user commands, * executes them until an exit command is received. * Handles exceptions by displaying appropriate error messages. */ diff --git a/src/main/java/command/AddAppointmentCommand.java b/src/main/java/command/AddAppointmentCommand.java index 27f7292dec..27153080f7 100644 --- a/src/main/java/command/AddAppointmentCommand.java +++ b/src/main/java/command/AddAppointmentCommand.java @@ -36,9 +36,9 @@ public Appointment getAppointment() { * Executes the command to add the appointment to the appointment list in management system. * * @param manager The management system that stores the appointment. - * @param ui The user interface for displaying messages. - * @throws UnloadedStorageException If the storage component is not properly loaded. - * @throws PatientNotFoundException If the patient associated with the appointment is not found. + * @param ui The user interface for displaying messages. + * @throws UnloadedStorageException If the storage component is not properly loaded. + * @throws PatientNotFoundException If the patient associated with the appointment is not found. * @throws AppointmentClashException If the appointment time conflicts with an existing appointment. */ @Override diff --git a/src/main/java/command/AddPrescriptionCommand.java b/src/main/java/command/AddPrescriptionCommand.java index dfdffd3773..4c1e0accaf 100644 --- a/src/main/java/command/AddPrescriptionCommand.java +++ b/src/main/java/command/AddPrescriptionCommand.java @@ -7,7 +7,7 @@ /** * Command to add a new prescription to the system. - * Handles the creation of a new prescription and displays + * Handles the creation of a new prescription and displays * feedback about the operation to the user. */ //@@author Basudeb2005 @@ -29,7 +29,7 @@ public AddPrescriptionCommand(Prescription prescription) { * Shows error message if the patient ID doesn't exist. * * @param manager The management system that handles the data - * @param ui The user interface to display results + * @param ui The user interface to display results * @throws UnloadedStorageException If there was an error saving to storage */ @Override diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index d79351198c..f3f69db48f 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -20,11 +20,11 @@ public abstract class Command { * Each subclass must implement this method with its specific behavior. * * @param manager The management system that provides operations on data - * @param ui The user interface to display results + * @param ui The user interface to display results * @throws DuplicatePatientIDException If a patient with the same ID already exists - * @throws UnloadedStorageException If there was an error with storage operations - * @throws PatientNotFoundException If a requested patient was not found - * @throws AppointmentClashException If an appointment conflicts with existing ones + * @throws UnloadedStorageException If there was an error with storage operations + * @throws PatientNotFoundException If a requested patient was not found + * @throws AppointmentClashException If an appointment conflicts with existing ones * @throws InvalidInputFormatException If the input format is invalid */ public abstract void execute(ManagementSystem manager, Ui ui) diff --git a/src/main/java/command/DeleteAppointmentCommand.java b/src/main/java/command/DeleteAppointmentCommand.java index f106e2a8bb..a81525ac22 100644 --- a/src/main/java/command/DeleteAppointmentCommand.java +++ b/src/main/java/command/DeleteAppointmentCommand.java @@ -34,7 +34,7 @@ public String getApptId() { * Executes the command to delete the appointment from the management system. * * @param manager The management system that contains the appointment. - * @param ui The user interface for displaying messages. + * @param ui The user interface for displaying messages. * @throws UnloadedStorageException If the storage component is not properly loaded. */ @Override diff --git a/src/main/java/command/EditPatientCommand.java b/src/main/java/command/EditPatientCommand.java index ff53680ed9..6554cc33fc 100644 --- a/src/main/java/command/EditPatientCommand.java +++ b/src/main/java/command/EditPatientCommand.java @@ -25,8 +25,8 @@ public EditPatientCommand(String[] details) { * * @param manager The ManagementSystem that manages patient data. * @param ui The UI used to show error or success messages. - * @throws UnloadedStorageException If editing the patient data fails when saving to storage. - * @throws PatientNotFoundException If no patient with the specified NRIC is found. + * @throws UnloadedStorageException If editing the patient data fails when saving to storage. + * @throws PatientNotFoundException If no patient with the specified NRIC is found. * @throws InvalidInputFormatException If the provided date is invalid or if newDob is after the current date. */ @Override diff --git a/src/main/java/command/ExitCommand.java b/src/main/java/command/ExitCommand.java index 48adf7ea1d..1bc842b02b 100644 --- a/src/main/java/command/ExitCommand.java +++ b/src/main/java/command/ExitCommand.java @@ -13,7 +13,7 @@ public class ExitCommand extends Command { * Executes the exit command by displaying the goodbye message. * * @param manager The management system (unused in this command). - * @param ui The user interface used to display the goodbye message. + * @param ui The user interface used to display the goodbye message. */ @Override public void execute(ManagementSystem manager, Ui ui) { diff --git a/src/main/java/command/FindAppointmentCommand.java b/src/main/java/command/FindAppointmentCommand.java index fb0849fa4d..681bca638e 100644 --- a/src/main/java/command/FindAppointmentCommand.java +++ b/src/main/java/command/FindAppointmentCommand.java @@ -1,6 +1,7 @@ package command; import java.util.List; + import manager.Appointment; import manager.ManagementSystem; import miscellaneous.Ui; @@ -13,7 +14,6 @@ *

    This command follows the Command pattern, which encapsulates the appointment search * functionality to allow for consistent execution without directly manipulating the system's components. *

    - * */ public class FindAppointmentCommand extends Command { protected String nric; @@ -33,7 +33,7 @@ public FindAppointmentCommand(String nric) { * and displays the results using Ui. * * @param manager ManagementSystem responsible for handling appointment data - * @param ui Ui responsible for displaying the list of appointments + * @param ui Ui responsible for displaying the list of appointments */ @Override public void execute(ManagementSystem manager, Ui ui) { diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 323c730fbe..55fe86576e 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -11,7 +11,7 @@ public class HelpCommand extends Command { * Executes the help command by displaying the help message. * * @param manager The management system (unused in this command). - * @param ui The user interface used to display all available commands of the application. + * @param ui The user interface used to display all available commands of the application. */ @Override public void execute(ManagementSystem manager, Ui ui) { diff --git a/src/main/java/command/ListAppointmentCommand.java b/src/main/java/command/ListAppointmentCommand.java index fbcfddff0c..acffb8f40d 100644 --- a/src/main/java/command/ListAppointmentCommand.java +++ b/src/main/java/command/ListAppointmentCommand.java @@ -12,7 +12,7 @@ public class ListAppointmentCommand extends Command { * Executes the list appointments command by displaying all appointments. * * @param manager The management system containing the appointment list. - * @param ui The user interface for displaying the appointment list. + * @param ui The user interface for displaying the appointment list. */ @Override public void execute(ManagementSystem manager, Ui ui) { diff --git a/src/main/java/command/MarkApppointmentCommand.java b/src/main/java/command/MarkApppointmentCommand.java index 2c285f61ee..b3b9a6b0de 100644 --- a/src/main/java/command/MarkApppointmentCommand.java +++ b/src/main/java/command/MarkApppointmentCommand.java @@ -31,7 +31,7 @@ public MarkApppointmentCommand(String apptId) { * displays the updated appointment list and confirmation via the Ui. * * @param manager the ManagementSystem responsible for managing appointments - * @param ui the Ui responsible for displaying results to the user + * @param ui the Ui responsible for displaying results to the user * @throws UnloadedStorageException if the storage system was not initialized when the command was executed */ @Override diff --git a/src/main/java/command/SortAppointmentCommand.java b/src/main/java/command/SortAppointmentCommand.java index 638a0e4241..35326cca96 100644 --- a/src/main/java/command/SortAppointmentCommand.java +++ b/src/main/java/command/SortAppointmentCommand.java @@ -27,12 +27,12 @@ public SortAppointmentCommand(String type) { * Executes the command to sort appointments in the management system. * * @param manager The management system containing the appointments. - * @param ui The user interface for displaying the sorted appointments. + * @param ui The user interface for displaying the sorted appointments. * @throws DuplicatePatientIDException If duplicate patient IDs are encountered. - * @throws UnloadedStorageException If the storage component is not properly loaded. + * @throws UnloadedStorageException If the storage component is not properly loaded. */ @Override - public void execute (ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, + public void execute(ManagementSystem manager, Ui ui) throws DuplicatePatientIDException, UnloadedStorageException { if (type.equals("date")) { List sortedApptByDateTime = manager.sortAppointmentsByDateTime(manager.getAppointments()); diff --git a/src/main/java/command/StoreMedHistoryCommand.java b/src/main/java/command/StoreMedHistoryCommand.java index 8c832777c5..84060f4e59 100644 --- a/src/main/java/command/StoreMedHistoryCommand.java +++ b/src/main/java/command/StoreMedHistoryCommand.java @@ -36,7 +36,7 @@ public StoreMedHistoryCommand(String[] details) { * Executes the command to store the given medical history for the specified patient. * * @param manager The ManagementSystem that manages patient and appointment data. - * @param ui The Ui used to display success or error messages. + * @param ui The Ui used to display success or error messages. * @throws UnloadedStorageException if saving to storage fails due to uninitialized storage. * @throws PatientNotFoundException if the patient with the given NRIC is not found. */ diff --git a/src/main/java/command/UnmarkAppointmentCommand.java b/src/main/java/command/UnmarkAppointmentCommand.java index 6dea2243fe..669513e5a5 100644 --- a/src/main/java/command/UnmarkAppointmentCommand.java +++ b/src/main/java/command/UnmarkAppointmentCommand.java @@ -31,7 +31,7 @@ public UnmarkAppointmentCommand(String apptId) { * displays the updated list and confirmation via the Ui. * * @param manager the ManagementSystem responsible for managing appointments - * @param ui the Ui responsible for displaying results to the user + * @param ui the Ui responsible for displaying results to the user * @throws UnloadedStorageException if the storage system was not initialized when the command was executed */ @Override diff --git a/src/main/java/command/ViewAllPrescriptionsCommand.java b/src/main/java/command/ViewAllPrescriptionsCommand.java index 232900ca25..d4322b8614 100644 --- a/src/main/java/command/ViewAllPrescriptionsCommand.java +++ b/src/main/java/command/ViewAllPrescriptionsCommand.java @@ -31,7 +31,7 @@ public ViewAllPrescriptionsCommand(String patientId) { * Shows an appropriate message if no prescriptions exist or if the patient is not found. * * @param manager The management system that handles the data - * @param ui The user interface to display results + * @param ui The user interface to display results * @throws UnloadedStorageException If there was an error with storage operations */ @Override @@ -43,33 +43,33 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep } List prescriptions = manager.getPrescriptionsForPatient(patientId); - + ui.showLine(); if (prescriptions.isEmpty()) { System.out.println("No prescriptions found for patient " + patient.getName() + " (" + patientId + ")."); } else { System.out.println("Prescriptions for patient " + patient.getName() + " (" + patientId + "):"); System.out.println(""); - + for (Prescription prescription : prescriptions) { System.out.println("Prescription ID: " + prescription.getPrescriptionId()); System.out.println("Date: " + prescription.getTimestamp().format( - java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); - + java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); + System.out.println("Symptoms:"); for (String symptom : prescription.getSymptoms()) { System.out.println("- " + symptom); } - + System.out.println("Medicines:"); for (String medicine : prescription.getMedicines()) { System.out.println("- " + medicine); } - + System.out.println("Notes: " + prescription.getNotes()); System.out.println(""); } - + System.out.println("Total prescriptions: " + prescriptions.size()); System.out.println("Use 'view-prescription PRESCRIPTION_ID' to view details and generate HTML."); } diff --git a/src/main/java/command/ViewPatientCommand.java b/src/main/java/command/ViewPatientCommand.java index fa0b4d6ba9..b203e996e8 100644 --- a/src/main/java/command/ViewPatientCommand.java +++ b/src/main/java/command/ViewPatientCommand.java @@ -34,7 +34,7 @@ public ViewPatientCommand(String nric) { * displays the details using Ui. * * @param manager the {@link ManagementSystem} responsible for handling patient data - * @param ui the {@link Ui} responsible for displaying the patient information + * @param ui the {@link Ui} responsible for displaying the patient information * @throws AssertionError if the manager or ui instances are null * @throws AssertionError if no patient is found for the given NRIC */ diff --git a/src/main/java/command/ViewPrescriptionCommand.java b/src/main/java/command/ViewPrescriptionCommand.java index fdb778beb2..2e790f8a37 100644 --- a/src/main/java/command/ViewPrescriptionCommand.java +++ b/src/main/java/command/ViewPrescriptionCommand.java @@ -33,7 +33,7 @@ public ViewPrescriptionCommand(String prescriptionId) { * Also generates an HTML file for printing the prescription. * * @param manager The management system that handles the data - * @param ui The user interface to display results + * @param ui The user interface to display results * @throws UnloadedStorageException If there was an error with storage operations */ @Override @@ -45,22 +45,22 @@ public void execute(ManagementSystem manager, Ui ui) throws UnloadedStorageExcep } Patient patient = manager.viewPatient(prescription.getPatientId()); - + ui.showLine(); System.out.println("Prescription details:"); System.out.println(prescription.toString()); System.out.println(""); - + // Generate HTML file Storage.savePrescriptionHtml(prescription, patient); - - String fileName = "prescription_" + prescription.getPatientId() + "_" + + String fileName = "prescription_" + prescription.getPatientId() + "_" + prescription.getPrescriptionId().split("-")[1] + ".html"; - String filePath = new File("").getAbsolutePath() - + File.separator + "data" - + File.separator + "prescriptions" + String filePath = new File("").getAbsolutePath() + + File.separator + "data" + + File.separator + "prescriptions" + File.separator + fileName; - + System.out.println("Prescription HTML file generated at: " + filePath); System.out.println("Open this file in a web browser to view and print the prescription."); ui.showLine(); diff --git a/src/main/java/exception/DuplicatePatientIDException.java b/src/main/java/exception/DuplicatePatientIDException.java index eb8f0dee20..4c77b3e51f 100644 --- a/src/main/java/exception/DuplicatePatientIDException.java +++ b/src/main/java/exception/DuplicatePatientIDException.java @@ -6,7 +6,7 @@ * exists in the system. */ public class DuplicatePatientIDException extends Exception { - + /** * Constructs a DuplicatePatientIDException with the specified detail message. * diff --git a/src/main/java/exception/InvalidInputFormatException.java b/src/main/java/exception/InvalidInputFormatException.java index 828c2f4803..e80dd8ab57 100644 --- a/src/main/java/exception/InvalidInputFormatException.java +++ b/src/main/java/exception/InvalidInputFormatException.java @@ -12,7 +12,7 @@ public class InvalidInputFormatException extends Exception { * * @param message The detail message explaining the correct input format */ - public InvalidInputFormatException (String message) { + public InvalidInputFormatException(String message) { super(message); } } diff --git a/src/main/java/exception/UnknownCommandException.java b/src/main/java/exception/UnknownCommandException.java index a37d9f51c4..b03f5c4ba9 100644 --- a/src/main/java/exception/UnknownCommandException.java +++ b/src/main/java/exception/UnknownCommandException.java @@ -5,14 +5,14 @@ * This exception is thrown when the user enters a command that is not recognized * by the application. */ -public class UnknownCommandException extends Exception{ +public class UnknownCommandException extends Exception { /** * Constructs an UnknownCommandException with the specified message. * * @param message The message indicating the command is invalid/unknown. */ - public UnknownCommandException (String message) { + public UnknownCommandException(String message) { super(message); } diff --git a/src/main/java/exception/UnloadedStorageException.java b/src/main/java/exception/UnloadedStorageException.java index 21ec7ea6be..5cf0875aba 100644 --- a/src/main/java/exception/UnloadedStorageException.java +++ b/src/main/java/exception/UnloadedStorageException.java @@ -5,14 +5,14 @@ * This exception is thrown when the system fails to load or save data to/from storage, * typically due to file system issues or corrupt data. */ -public class UnloadedStorageException extends Exception{ - +public class UnloadedStorageException extends Exception { + /** * Constructs an UnloadedStorageException with the specified detail message. * * @param message The detail message explaining the storage failure */ - public UnloadedStorageException (String message) { + public UnloadedStorageException(String message) { super(message); } diff --git a/src/main/java/manager/Appointment.java b/src/main/java/manager/Appointment.java index dacbe22831..31cea2865d 100644 --- a/src/main/java/manager/Appointment.java +++ b/src/main/java/manager/Appointment.java @@ -25,15 +25,15 @@ public class Appointment { /** * Constructs a new Appointment with auto-generated ID. * - * @param nric The NRIC of the patient for this appointment - * @param dateTime The date and time of the appointment + * @param nric The NRIC of the patient for this appointment + * @param dateTime The date and time of the appointment * @param description The description of the appointment */ public Appointment(String nric, LocalDateTime dateTime, String description) { assert nric != null && !nric.isBlank() : "NRIC cannot be null or blank"; assert dateTime != null : "DateTime cannot be null"; assert description != null && !description.isBlank() : "Description cannot be null or blank"; - + this.id = "A" + runningId++; this.nric = nric; this.dateTime = dateTime; @@ -44,9 +44,9 @@ public Appointment(String nric, LocalDateTime dateTime, String description) { /** * Constructs an Appointment with a specific ID (used for loading from storage). * - * @param id The predefined ID for the appointment - * @param nric The NRIC of the patient - * @param dateTime The date and time of the appointment + * @param id The predefined ID for the appointment + * @param nric The NRIC of the patient + * @param dateTime The date and time of the appointment * @param description The description of the appointment */ public Appointment(String id, String nric, LocalDateTime dateTime, String description) { diff --git a/src/main/java/manager/ManagementSystem.java b/src/main/java/manager/ManagementSystem.java index 8b54754aa7..3a1b39b0ba 100644 --- a/src/main/java/manager/ManagementSystem.java +++ b/src/main/java/manager/ManagementSystem.java @@ -29,8 +29,8 @@ public class ManagementSystem { /** * Constructs a ManagementSystem with patients and appointments but no prescriptions. - * - * @param loadedPatients The list of patients to initialize with + * + * @param loadedPatients The list of patients to initialize with * @param loadedAppointments The list of appointments to initialize with */ public ManagementSystem(List loadedPatients, List loadedAppointments) { @@ -43,9 +43,9 @@ public ManagementSystem(List loadedPatients, List loadedAp /** * Constructs a ManagementSystem with patients, appointments, and prescriptions. - * - * @param loadedPatients The list of patients to initialize with - * @param loadedAppointments The list of appointments to initialize with + * + * @param loadedPatients The list of patients to initialize with + * @param loadedAppointments The list of appointments to initialize with * @param loadedPrescriptions The list of prescriptions to initialize with */ public ManagementSystem(List loadedPatients, List loadedAppointments, @@ -94,7 +94,7 @@ public List getAppointments() { * * @param patient The patient to add * @throws DuplicatePatientIDException If a patient with the same NRIC already exists - * @throws UnloadedStorageException If there was an error saving to storage + * @throws UnloadedStorageException If there was an error saving to storage */ public void addPatient(Patient patient) throws DuplicatePatientIDException, UnloadedStorageException { assert patient != null : "Patient cannot be null"; @@ -122,7 +122,7 @@ public void addPatient(Patient patient) throws DuplicatePatientIDException, Unlo public Patient deletePatient(String nric) throws UnloadedStorageException { assert nric != null && !nric.isBlank() : "NRIC must not be null or blank"; assert patients != null : "Patient list cannot be null"; - + for (Patient patient : patients) { if (patient.getId().equals(nric)) { patients.remove(patient); @@ -137,6 +137,7 @@ public Patient deletePatient(String nric) throws UnloadedStorageException { } //@@author dylancmznus + /** * Retrieves the patient object that matches the specified NRIC. * @@ -166,12 +167,12 @@ public Patient viewPatient(String nric) { * Updates only the fields that are provided (non-null). * Saves changes to storage after successful update. * - * @param nric The NRIC of the patient to edit (cannot be changed) - * @param newName New name for the patient, or null to keep unchanged - * @param newDob New date of birth, or null to keep unchanged - * @param newGender New gender, or null to keep unchanged + * @param nric The NRIC of the patient to edit (cannot be changed) + * @param newName New name for the patient, or null to keep unchanged + * @param newDob New date of birth, or null to keep unchanged + * @param newGender New gender, or null to keep unchanged * @param newAddress New address, or null to keep unchanged - * @param newPhone New phone number, or null to keep unchanged + * @param newPhone New phone number, or null to keep unchanged * @throws UnloadedStorageException If there was an error saving to storage * @throws PatientNotFoundException If no patient with the given NRIC exists */ @@ -221,7 +222,7 @@ public void editPatient(String nric, String newName, String newDob, String newGe * If an entry already exists in the patient's history, it will not be duplicated. * Saves the updated patient list to storage. * - * @param nric The NRIC of the patient + * @param nric The NRIC of the patient * @param medHistory Comma-separated medical history entries to add * @throws PatientNotFoundException If no patient with the given NRIC exists * @throws UnloadedStorageException If there was an error saving to storage @@ -295,8 +296,8 @@ public void viewMedicalHistoryByName(String name) { /** * Edits a specific medical history entry for a patient. * Replaces the old history text with new text if the old text is found. - * - * @param nric The patient's unique identifier + * + * @param nric The patient's unique identifier * @param oldHistory The existing history text to be replaced * @param newHistory The new history text to replace it with * @throws UnloadedStorageException If there was an error saving to storage @@ -363,14 +364,15 @@ private List findPatientsByName(String name) { } //@@author chwenyee + /** * Adds a new appointment to the system. * Checks for appointment clashes (within 1 hour) and verifies the patient exists. * Saves the updated appointment list to storage after successful addition. * * @param appointment The appointment to add - * @throws UnloadedStorageException If there was an error saving to storage - * @throws PatientNotFoundException If the patient associated with the appointment doesn't exist + * @throws UnloadedStorageException If there was an error saving to storage + * @throws PatientNotFoundException If the patient associated with the appointment doesn't exist * @throws AppointmentClashException If the appointment clashes with an existing appointment */ public void addAppointment(Appointment appointment) throws UnloadedStorageException, PatientNotFoundException, @@ -379,7 +381,7 @@ public void addAppointment(Appointment appointment) throws UnloadedStorageExcept assert patients != null : "Patient list cannot be null"; // Check if there is any scheduled appointment in the list clashing with this newly-added one - for (Appointment appointmentInList : appointments) { + for (Appointment appointmentInList : appointments) { long timeDiff = Math.abs(Duration.between(appointmentInList.getDateTime(), appointment.getDateTime()).toMinutes()); if (timeDiff < 60) { @@ -409,7 +411,7 @@ public void addAppointment(Appointment appointment) throws UnloadedStorageExcept public Appointment deleteAppointment(String apptId) throws UnloadedStorageException { assert apptId != null && !apptId.isBlank() : "Appointment ID cannot be null or blank"; assert appointments != null : "Appointment list cannot be null"; - + for (Appointment appointment : appointments) { if (appointment.getId().equalsIgnoreCase(apptId)) { appointments.remove(appointment); @@ -507,6 +509,7 @@ public List findAppointmentsByNric(String nric) { } //@@author Basudeb2005 + /** * Gets all prescriptions stored in the system. * @@ -517,6 +520,7 @@ public List getPrescriptions() { } //@@author Basudeb2005 + /** * Adds a new prescription to the system. * Verifies the patient exists before adding the prescription. @@ -528,11 +532,11 @@ public List getPrescriptions() { * @throws IllegalArgumentException If the patient doesn't exist or maximum prescriptions reached * @throws UnloadedStorageException If there was an error saving to storage */ - public Prescription addPrescription(Prescription prescription) + public Prescription addPrescription(Prescription prescription) throws IllegalArgumentException, UnloadedStorageException { assert prescription != null : "Prescription cannot be null"; assert patients != null : "Patient list cannot be null"; - + Patient patient = findPatientByNric(prescription.getPatientId()); if (patient == null) { throw new IllegalArgumentException("Patient with NRIC: " + prescription.getPatientId() + " not found"); @@ -545,29 +549,29 @@ public Prescription addPrescription(Prescription prescription) prescriptionCount++; } } - + // Check for maximum prescription limit final int MAX_PRESCRIPTIONS_PER_PATIENT = 100; // Reasonable upper limit if (prescriptionCount > MAX_PRESCRIPTIONS_PER_PATIENT) { - throw new IllegalArgumentException("Maximum number of prescriptions (" + - MAX_PRESCRIPTIONS_PER_PATIENT + - ") reached for patient: " + prescription.getPatientId()); + throw new IllegalArgumentException("Maximum number of prescriptions (" + + MAX_PRESCRIPTIONS_PER_PATIENT + + ") reached for patient: " + prescription.getPatientId()); } - + String prescriptionId = prescription.getPatientId() + "-" + prescriptionCount; - + // Create a new prescription with updated ID Prescription newPrescription = new Prescription( - prescription.getPatientId(), - prescriptionId, - prescription.getTimestamp(), - prescription.getSymptoms(), - prescription.getMedicines(), - prescription.getNotes() + prescription.getPatientId(), + prescriptionId, + prescription.getTimestamp(), + prescription.getSymptoms(), + prescription.getMedicines(), + prescription.getNotes() ); - + prescriptions.add(newPrescription); - + try { Storage.savePrescriptions(prescriptions); } catch (UnloadedStorageException e) { @@ -575,11 +579,12 @@ public Prescription addPrescription(Prescription prescription) prescriptions.remove(newPrescription); throw e; // Re-throw to notify the caller } - + return newPrescription; } //@@author Basudeb2005 + /** * Retrieves all prescriptions for a specific patient. * Filters the complete prescription list to find those matching the provided patient ID. @@ -598,6 +603,7 @@ public List getPrescriptionsForPatient(String patientId) { } //@@author Basudeb2005 + /** * Finds a specific prescription by its unique identifier. * diff --git a/src/main/java/manager/Prescription.java b/src/main/java/manager/Prescription.java index cd22e21c31..b85a650d4c 100644 --- a/src/main/java/manager/Prescription.java +++ b/src/main/java/manager/Prescription.java @@ -14,22 +14,22 @@ //@@author Basudeb2005 public class Prescription { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - + private final String patientId; private final LocalDateTime timestamp; private final String prescriptionId; private final List symptoms; private final List medicines; private final String notes; - + /** * Constructs a new Prescription with the current timestamp. * This constructor is used when creating a new prescription in the system. * * @param patientId The ID of the patient this prescription is for - * @param symptoms List of patient symptoms + * @param symptoms List of patient symptoms * @param medicines List of prescribed medicines - * @param notes Additional instructions or notes for the patient + * @param notes Additional instructions or notes for the patient */ public Prescription(String patientId, List symptoms, List medicines, String notes) { this.patientId = patientId; @@ -39,20 +39,20 @@ public Prescription(String patientId, List symptoms, List medici this.medicines = new ArrayList<>(medicines); this.notes = notes; } - + /** * Constructs a Prescription with specified prescriptionId and timestamp. * This constructor is primarily used when loading prescriptions from storage. * - * @param patientId The ID of the patient this prescription is for + * @param patientId The ID of the patient this prescription is for * @param prescriptionId The unique identifier for this prescription - * @param timestamp The date and time when the prescription was created - * @param symptoms List of patient symptoms - * @param medicines List of prescribed medicines - * @param notes Additional instructions or notes for the patient + * @param timestamp The date and time when the prescription was created + * @param symptoms List of patient symptoms + * @param medicines List of prescribed medicines + * @param notes Additional instructions or notes for the patient */ - public Prescription(String patientId, String prescriptionId, LocalDateTime timestamp, - List symptoms, List medicines, String notes) { + public Prescription(String patientId, String prescriptionId, LocalDateTime timestamp, + List symptoms, List medicines, String notes) { this.patientId = patientId; this.timestamp = timestamp; this.prescriptionId = prescriptionId; @@ -60,7 +60,7 @@ public Prescription(String patientId, String prescriptionId, LocalDateTime times this.medicines = new ArrayList<>(medicines); this.notes = notes; } - + /** * Gets the patient ID associated with this prescription. * @@ -69,7 +69,7 @@ public Prescription(String patientId, String prescriptionId, LocalDateTime times public String getPatientId() { return patientId; } - + /** * Gets the unique identifier for this prescription. * @@ -78,7 +78,7 @@ public String getPatientId() { public String getPrescriptionId() { return prescriptionId; } - + /** * Gets the timestamp when this prescription was created. * @@ -87,7 +87,7 @@ public String getPrescriptionId() { public LocalDateTime getTimestamp() { return timestamp; } - + /** * Gets the list of symptoms recorded for this prescription. * @@ -96,7 +96,7 @@ public LocalDateTime getTimestamp() { public List getSymptoms() { return symptoms; } - + /** * Gets the list of medicines prescribed. * @@ -105,7 +105,7 @@ public List getSymptoms() { public List getMedicines() { return medicines; } - + /** * Gets any additional notes or instructions for this prescription. * @@ -114,7 +114,7 @@ public List getMedicines() { public String getNotes() { return notes; } - + /** * Returns a string representation of the prescription with formatted details. * Includes prescription ID, timestamp, patient ID, and lists of symptoms and medicines. @@ -127,22 +127,22 @@ public String toString() { for (String symptom : symptoms) { symptomsStr.append("- ").append(symptom).append("\n"); } - + StringBuilder medicinesStr = new StringBuilder(); for (String medicine : medicines) { medicinesStr.append("- ").append(medicine).append("\n"); } - + return String.format( - "Prescription [%s] (%s)\n" - + "Patient ID: %s\n" - + "Symptoms: \n%s" - + "Medicines: \n%s" - + "Notes: %s", - prescriptionId, timestamp.format(DATE_TIME_FORMATTER), - patientId, symptomsStr.toString(), medicinesStr.toString(), notes); + "Prescription [%s] (%s)\n" + + "Patient ID: %s\n" + + "Symptoms: \n%s" + + "Medicines: \n%s" + + "Notes: %s", + prescriptionId, timestamp.format(DATE_TIME_FORMATTER), + patientId, symptomsStr.toString(), medicinesStr.toString(), notes); } - + /** * Converts the prescription to a storage-friendly string format. * Uses pipe-delimited format to store all prescription attributes. @@ -150,15 +150,15 @@ public String toString() { * @return A string representation suitable for file storage */ public String toFileFormat() { - return String.join("|", - prescriptionId, - patientId, - timestamp.format(DATE_TIME_FORMATTER), - String.join(",", symptoms), - String.join(",", medicines), - notes); + return String.join("|", + prescriptionId, + patientId, + timestamp.format(DATE_TIME_FORMATTER), + String.join(",", symptoms), + String.join(",", medicines), + notes); } - + /** * Creates a Prescription object from a storage file entry. * Parses the pipe-delimited string from storage into a Prescription object. @@ -168,23 +168,23 @@ public String toFileFormat() { */ public static Prescription fromFileFormat(String fileEntry) { String[] parts = fileEntry.split("\\|"); - + // Check if we have sufficient parts to create a valid prescription if (parts.length < 5) { System.out.println("Warning: Invalid prescription format: " + fileEntry); return null; } - + String prescriptionId = parts[0]; String patientId = parts[1]; LocalDateTime timestamp = LocalDateTime.parse(parts[2], DATE_TIME_FORMATTER); List symptoms = parts[3].isEmpty() ? new ArrayList<>() : Arrays.asList(parts[3].split(",")); List medicines = parts[4].isEmpty() ? new ArrayList<>() : Arrays.asList(parts[4].split(",")); String notes = parts.length > 5 ? parts[5] : ""; // Default to empty string if notes aren't provided - + return new Prescription(patientId, prescriptionId, timestamp, symptoms, medicines, notes); } - + /** * Generates a formatted HTML document for the prescription. * Creates a professional-looking prescription that can be printed. @@ -196,91 +196,91 @@ public static Prescription fromFileFormat(String fileEntry) { public String generateHtml(Patient patient) { StringBuilder html = new StringBuilder(); html.append("\n") - .append("\n") - .append("\n") - .append(" \n") - .append(" \n") - .append(" Prescription ").append(prescriptionId).append("\n") - .append(" \n") - .append("\n") - .append("\n") - .append("
    \n") - .append("
    \n") - .append("

    ClinicEase Medical Prescription

    \n") - .append("

    Prescription ID: ").append(prescriptionId).append("

    \n") - .append("

    Date: ").append(timestamp.format(DATE_TIME_FORMATTER)).append("

    \n") - .append("
    \n"); - + .append("\n") + .append("\n") + .append(" \n") + .append(" \n") + .append(" Prescription ").append(prescriptionId).append("\n") + .append(" \n") + .append("\n") + .append("\n") + .append("
    \n") + .append("
    \n") + .append("

    ClinicEase Medical Prescription

    \n") + .append("

    Prescription ID: ").append(prescriptionId).append("

    \n") + .append("

    Date: ").append(timestamp.format(DATE_TIME_FORMATTER)).append("

    \n") + .append("
    \n"); + if (patient != null) { html.append("
    \n") - .append("

    Patient Information

    \n") - .append(" \n") - .append(" \n") - .append(" \n") - .append(" \n") - .append(" \n") - .append(" \n") - .append("
    Patient ID:").append(patient.getId()).append("
    Name:").append(patient.getName()).append("
    Gender:").append(patient.getGender()).append("
    Date of Birth:").append(patient.getDob()).append("
    Contact:").append(patient.getContactInfo()).append("
    \n") - .append("
    \n"); + .append("

    Patient Information

    \n") + .append(" \n") + .append(" \n") + .append(" \n") + .append(" \n") + .append(" \n") + .append(" \n") + .append("
    Patient ID:").append(patient.getId()).append("
    Name:").append(patient.getName()).append("
    Gender:").append(patient.getGender()).append("
    Date of Birth:").append(patient.getDob()).append("
    Contact:").append(patient.getContactInfo()).append("
    \n") + .append("
    \n"); } else { html.append("
    \n") - .append("

    Patient Information

    \n") - .append(" \n") - .append(" \n") - .append("
    Patient ID:").append(patientId).append("
    \n") - .append("
    \n"); + .append("

    Patient Information

    \n") + .append(" \n") + .append(" \n") + .append("
    Patient ID:").append(patientId).append("
    \n") + .append("
    \n"); } - + html.append("
    \n") - .append("

    Symptoms

    \n") - .append("
      \n"); - + .append("

      Symptoms

      \n") + .append("
        \n"); + for (String symptom : symptoms) { html.append("
      • ").append(symptom).append("
      • \n"); } - + html.append("
      \n") - .append("
    \n") - .append("
    \n") - .append("

    Prescribed Medications

    \n") - .append("
      \n"); - + .append("
    \n") + .append("
    \n") + .append("

    Prescribed Medications

    \n") + .append("
      \n"); + for (String medicine : medicines) { html.append("
    • ").append(medicine).append("
    • \n"); } - + html.append("
    \n") - .append("
    \n"); - + .append(" \n"); + if (notes != null && !notes.isEmpty()) { html.append("
    \n") - .append("

    Special Instructions

    \n") - .append("

    ").append(notes).append("

    \n") - .append("
    \n"); + .append("

    Special Instructions

    \n") + .append("

    ").append(notes).append("

    \n") + .append(" \n"); } - + html.append("
    \n") - .append("

    This prescription was generated by ClinicEase System

    \n") - .append(" \n") - .append("
    \n") - .append(" \n") - .append("\n") - .append("\n"); - + .append("

    This prescription was generated by ClinicEase System

    \n") + .append(" \n") + .append(" \n") + .append(" \n") + .append("\n") + .append("\n"); + return html.toString(); } } diff --git a/src/main/java/miscellaneous/Parser.java b/src/main/java/miscellaneous/Parser.java index 033a732006..b21b700741 100644 --- a/src/main/java/miscellaneous/Parser.java +++ b/src/main/java/miscellaneous/Parser.java @@ -51,14 +51,14 @@ public class Parser { * @param userInput The full command string entered by the user * @return A Command object for execution * @throws InvalidInputFormatException If user input format is invalid - * @throws UnknownCommandException If command is not recognized + * @throws UnknownCommandException If command is not recognized */ public static Command parse(String userInput) throws InvalidInputFormatException, UnknownCommandException { // Handle empty input if (userInput == null || userInput.trim().isEmpty()) { throw new InvalidInputFormatException("Please enter a command."); } - + // Split into two parts to extract the command keyword and its detail String[] parts = userInput.split(" ", 2); String commandWord = parts[0].toLowerCase(); @@ -236,7 +236,7 @@ private static Appointment parseAddAppointment(String input) throws InvalidInput LocalDateTime now = LocalDateTime.now(); if (dateTime.isBefore(now)) { throw new InvalidInputFormatException - ("The appointment date/time cannot be before the current date/time"); + ("The appointment date/time cannot be before the current date/time"); } return new Appointment(nric.trim(), dateTime, desc.trim()); @@ -296,7 +296,7 @@ private static String parseFindAppointment(String input) throws InvalidInputForm /** * Extracts parameter values from command strings. * - * @param input The string containing parameters + * @param input The string containing parameters * @param prefix The parameter prefix to extract (e.g. "ic/") * @return The extracted value or null if not found */ @@ -325,8 +325,8 @@ private static String extractValue(String input, String prefix) { start += prefix.length(); String[] possible = { - "n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", - "dsc/", "h/", "old/", "new/", "s/", "m/", "nt/" + "n/", "ic/", "dob/", "g/", "p/", "a/", "dt/", "t/", + "dsc/", "h/", "old/", "new/", "s/", "m/", "nt/" }; int end = input.length(); @@ -340,7 +340,7 @@ private static String extractValue(String input, String prefix) { for (int i = start; i <= lowerInput.length() - lowerP.length(); i++) { boolean isNextParamPrefixMatch = lowerInput.startsWith(lowerP, i); // Check if the character before the prefix is blank space in input to have a valid input format - boolean isNextParamAtValidPosition = (i == 0) + boolean isNextParamAtValidPosition = (i == 0) || Character.isWhitespace(input.charAt(i - 1)); if (isNextParamPrefixMatch && isNextParamAtValidPosition) { if (i < end) { @@ -411,8 +411,8 @@ public static Patient parseLoadPatient(String line) throws InvalidInputFormatExc String address = tokens[4]; String contact = tokens[5]; List medHistory = isHistoryNonpresent ? new ArrayList<>() : Arrays.stream(tokens[6].split(",")) - .map(String::trim) - .collect(Collectors.toList()); + .map(String::trim) + .collect(Collectors.toList()); return new Patient(id, name, dobStr, gender, address, contact, medHistory); } @@ -461,7 +461,7 @@ public static Appointment parseLoadAppointment(String line) { */ public static Prescription parseAddPrescription(String input) throws InvalidInputFormatException { String temp = input.replaceFirst("(?i)add-prescription\\s*", ""); - + String patientId = extractValue(temp, "ic/"); String symptoms = extractValue(temp, "s/"); String medicines = extractValue(temp, "m/"); diff --git a/src/main/java/miscellaneous/Ui.java b/src/main/java/miscellaneous/Ui.java index 6957291881..ff5d8d991c 100644 --- a/src/main/java/miscellaneous/Ui.java +++ b/src/main/java/miscellaneous/Ui.java @@ -120,7 +120,7 @@ public void showPatientList(List patients) { return; } - System.out.println("-".repeat(42)+ "Patient Details" + "-".repeat(42)); + System.out.println("-".repeat(42) + "Patient Details" + "-".repeat(42)); int count = 1; for (Patient p : patients) { @@ -206,7 +206,7 @@ public void showAppointmentList(List appointments) { return; } - System.out.println("-".repeat(43)+ "Appointments" + "-".repeat(45)); + System.out.println("-".repeat(43) + "Appointments" + "-".repeat(45)); int count = 1; for (Appointment a : appointments) { System.out.println(count + ". " + a); diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 2aa4b3bd90..6870a4ba7d 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -17,7 +17,7 @@ /** * Handles data persistence for the clinic management system. - * Provides methods for saving and loading patients, appointments, prescriptions, + * Provides methods for saving and loading patients, appointments, prescriptions, * and generating HTML prescription documents. */ public class Storage { @@ -48,7 +48,7 @@ public Storage(String directory) { * * @param patientList The list of patients to save * @throws UnloadedStorageException If the storage was not properly initialized - * or if there was an error saving to file + * or if there was an error saving to file */ public static void savePatients(List patientList) throws UnloadedStorageException { if (directoryPath == null || patientFilePath == null) { @@ -76,7 +76,7 @@ public static void savePatients(List patientList) throws UnloadedStorag * * @return A list of Patient objects loaded from file * @throws UnloadedStorageException If there was an error reading from the file - * or if the data could not be properly parsed + * or if the data could not be properly parsed */ public static List loadPatients() throws UnloadedStorageException { List patients = new ArrayList<>(); @@ -106,7 +106,7 @@ public static List loadPatients() throws UnloadedStorageException { * * @param appointmentList The list of appointments to save * @throws UnloadedStorageException If the storage was not properly initialized - * or if there was an error saving to file + * or if there was an error saving to file */ public static void saveAppointments(List appointmentList) throws UnloadedStorageException { if (directoryPath == null || appointmentFilePath == null) { @@ -139,7 +139,7 @@ public static void saveAppointments(List appointmentList) throws Un * @param system The management system used to find patients for appointment association * @return A list of Appointment objects loaded from file * @throws UnloadedStorageException If there was an error reading from the file - * or if the data could not be properly parsed + * or if the data could not be properly parsed */ public static List loadAppointments(ManagementSystem system) throws UnloadedStorageException { List appointments = new ArrayList<>(); @@ -191,8 +191,8 @@ public static List loadAppointments(ManagementSystem system) throws * Writes each prescription in the list to the prescription file in a formatted string. * * @param prescriptionList The list of prescriptions to save - * @throws UnloadedStorageException If the storage was not properly initialized - * or if there was an error saving to file + * @throws UnloadedStorageException If the storage was not properly initialized + * or if there was an error saving to file */ public static void savePrescriptions(List prescriptionList) throws UnloadedStorageException { if (directoryPath == null || prescriptionFilePath == null) { @@ -237,7 +237,7 @@ public static void savePrescriptions(List prescriptionList) throws * * @return A list of Prescription objects loaded from file * @throws UnloadedStorageException If there was an error reading from the file - * or if the data could not be properly parsed + * or if the data could not be properly parsed */ public static List loadPrescriptions() throws UnloadedStorageException { List prescriptions = new ArrayList<>(); @@ -262,16 +262,16 @@ public static List loadPrescriptions() throws UnloadedStorageExcep } } catch (Exception e) { // Log the error but continue processing other prescriptions - System.out.println("Warning: Error parsing prescription at line " + lineNumber + - ": " + e.getMessage()); + System.out.println("Warning: Error parsing prescription at line " + lineNumber + + ": " + e.getMessage()); } } } - + // If no prescriptions were loaded but file exists and has content, this is suspicious if (prescriptions.isEmpty() && lineNumber > 0) { - System.out.println("Warning: No valid prescriptions were loaded from file with " + - lineNumber + " lines"); + System.out.println("Warning: No valid prescriptions were loaded from file with " + + lineNumber + " lines"); } } catch (Exception e) { throw new UnloadedStorageException("Unable to load prescription data: " + e.getMessage()); @@ -285,11 +285,11 @@ public static List loadPrescriptions() throws UnloadedStorageExcep * Creates a formatted HTML file that can be viewed in a browser and printed. * * @param prescription The prescription to generate HTML for - * @param patient The patient associated with the prescription, may be null + * @param patient The patient associated with the prescription, may be null * @throws UnloadedStorageException If the storage was not properly initialized - * or if there was an error writing the HTML file + * or if there was an error writing the HTML file */ - public static void savePrescriptionHtml(Prescription prescription, Patient patient) + public static void savePrescriptionHtml(Prescription prescription, Patient patient) throws UnloadedStorageException { if (directoryPath == null || prescriptionDirPath == null) { throw new UnloadedStorageException("Storage not initialized with a directory!"); diff --git a/src/main/java/storage/Storage.java.bak b/src/main/java/storage/Storage.java.bak deleted file mode 100644 index a77287cf21..0000000000 --- a/src/main/java/storage/Storage.java.bak +++ /dev/null @@ -1,344 +0,0 @@ -package storage; - -import exception.UnloadedStorageException; -import manager.Appointment; -import manager.Patient; -import manager.Prescription; -import miscellaneous.Parser; -import manager.ManagementSystem; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -/** -<<<<<<< HEAD - * Handles saving and loading of patient, appointment, and prescription data - * to and from the local file system. -======= - * Handles data persistence for the clinic management system. - * Provides methods for saving and loading patients, appointments, prescriptions, - * and generating HTML prescription documents. ->>>>>>> AddJavaDoc - */ -public class Storage { - private static String directoryPath; - private static String patientFilePath; - private static String appointmentFilePath; - private static String prescriptionFilePath; - private static String prescriptionDirPath; - private static Patient patients; - - /** -<<<<<<< HEAD - * Initializes storage paths based on a given directory. - * - * @param directory The directory to store data files in. -======= - * Constructs a Storage object with specified directory. - * Initializes file paths for patients, appointments, and prescriptions. - * - * @param directory The root directory for storage files ->>>>>>> AddJavaDoc - */ - public Storage(String directory) { - directoryPath = directory; - patientFilePath = directory + File.separator + "patient_data.txt"; - appointmentFilePath = directory + File.separator + "appointment_data.txt"; - prescriptionFilePath = directory + File.separator + "prescription_data.txt"; - prescriptionDirPath = directory + File.separator + "prescriptions"; - } - - /** -<<<<<<< HEAD - * Saves a list of patients to file. - * - * @param patientList The list of patients to save. - * @throws UnloadedStorageException If storage is not initialized. -======= - * Saves patients to file storage. - * Writes each patient in the list to the patient file in a formatted string. - * - * @param patientList The list of patients to save - * @throws UnloadedStorageException If the storage was not properly initialized - * or if there was an error saving to file ->>>>>>> AddJavaDoc - */ - public static void savePatients(List patientList) throws UnloadedStorageException { - if (directoryPath == null || patientFilePath == null) { - throw new UnloadedStorageException("Storage not initialized with a directory!"); - } - - File dir = new File(directoryPath); - if (!dir.exists()) { - dir.mkdirs(); - } - - try (BufferedWriter writer = new BufferedWriter(new FileWriter(patientFilePath))) { - for (Patient patient : patientList) { - writer.write(patient.toFileFormat()); - writer.newLine(); - } - } catch (IOException e) { - throw new UnloadedStorageException("Unable to save the patient!"); - } - } - - /** -<<<<<<< HEAD - * Loads patients from file. - * - * @return A list of patients. - * @throws UnloadedStorageException If patient data cannot be loaded. -======= - * Loads patients from file storage. - * Reads and parses patient data from the patient file. - * - * @return A list of Patient objects loaded from file - * @throws UnloadedStorageException If there was an error reading from the file - * or if the data could not be properly parsed ->>>>>>> AddJavaDoc - */ - public static List loadPatients() throws UnloadedStorageException { - List patients = new ArrayList<>(); - File file = new File(patientFilePath); - if (!file.exists()) { - return patients; - } - - try (Scanner scanner = new Scanner(file)) { - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - Patient patient = Parser.parseLoadPatient(line); - if (patient != null) { - patients.add(patient); - } - } - } catch (Exception e) { - throw new UnloadedStorageException("Unable to load patient data!"); - } - - return patients; - } - - /** -<<<<<<< HEAD - * Saves a list of appointments to file. - * - * @param appointmentList The list of appointments to save. - * @throws UnloadedStorageException If storage is not initialized. -======= - * Saves appointments to file storage. - * Writes the running ID counter and each appointment in the list to the appointment file. - * - * @param appointmentList The list of appointments to save - * @throws UnloadedStorageException If the storage was not properly initialized - * or if there was an error saving to file ->>>>>>> AddJavaDoc - */ - public static void saveAppointments(List appointmentList) throws UnloadedStorageException { - if (directoryPath == null || appointmentFilePath == null) { - throw new UnloadedStorageException("Storage not initialized with a directory!"); - } - - File dir = new File(directoryPath); - if (!dir.exists()) { - dir.mkdirs(); - } - - try (BufferedWriter writer = new BufferedWriter(new FileWriter(appointmentFilePath))) { - writer.write("countId:" + Appointment.getRunningId()); - writer.newLine(); - - for (Appointment appointment : appointmentList) { - writer.write(appointment.toFileFormat()); - writer.newLine(); - } - } catch (IOException e) { - throw new UnloadedStorageException("Unable to save the appointment!"); - } - } - - /** -<<<<<<< HEAD - * Loads appointments from file and links them to their corresponding patients. - * - * @param system The management system containing the patient list. - * @return A list of appointments. - * @throws UnloadedStorageException If appointment data cannot be loaded. -======= - * Loads appointments from file storage. - * Reads and parses appointment data from the appointment file. - * Also adds appointments to their respective patients. - * - * @param system The management system used to find patients for appointment association - * @return A list of Appointment objects loaded from file - * @throws UnloadedStorageException If there was an error reading from the file - * or if the data could not be properly parsed ->>>>>>> AddJavaDoc - */ - public static List loadAppointments(ManagementSystem system) throws UnloadedStorageException { - List appointments = new ArrayList<>(); - File file = new File(appointmentFilePath); - - if (!file.exists()) { - return appointments; - } - - try (Scanner scanner = new Scanner(file)) { - int countId = 100; - - if (scanner.hasNextLine()) { - String firstLine = scanner.nextLine(); - if (firstLine.startsWith("countId:")) { - String[] parts = firstLine.split(":"); - if (parts.length == 2) { - countId = Integer.parseInt(parts[1].trim()); - } - } - } - - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - if (!line.trim().isEmpty()) { - Appointment appointment = Parser.parseLoadAppointment(line); - if (appointment != null) { - appointments.add(appointment); - - Patient patient = system.findPatientByNric(appointment.getNric()); - if (patient != null) { - patient.addAppointment(appointment); - } - } - } - } - - Appointment.setRunningId(countId); - - } catch (Exception e) { - throw new UnloadedStorageException("Unable to load appointment data!"); - } - - return appointments; - } - - /** -<<<<<<< HEAD - * Saves a list of prescriptions to file. - * - * @param prescriptionList The list of prescriptions to save. - * @throws UnloadedStorageException If storage is not initialized. -======= - * Saves prescriptions to file storage. - * Writes each prescription in the list to the prescription file in a formatted string. - * - * @param prescriptionList The list of prescriptions to save - * @throws UnloadedStorageException If the storage was not properly initialized - * or if there was an error saving to file ->>>>>>> AddJavaDoc - */ - public static void savePrescriptions(List prescriptionList) throws UnloadedStorageException { - if (directoryPath == null || prescriptionFilePath == null) { - throw new UnloadedStorageException("Storage not initialized with a directory!"); - } - - File dir = new File(directoryPath); - if (!dir.exists()) { - dir.mkdirs(); - } - - try (BufferedWriter writer = new BufferedWriter(new FileWriter(prescriptionFilePath))) { - for (Prescription prescription : prescriptionList) { - writer.write(prescription.toFileFormat()); - writer.newLine(); - } - } catch (IOException e) { - throw new UnloadedStorageException("Unable to save prescriptions!"); - } - } - - /** -<<<<<<< HEAD - * Loads prescriptions from file. - * - * @return A list of prescriptions. - * @throws UnloadedStorageException If prescription data cannot be loaded. -======= - * Loads prescriptions from file storage. - * Reads and parses prescription data from the prescription file. - * - * @return A list of Prescription objects loaded from file - * @throws UnloadedStorageException If there was an error reading from the file - * or if the data could not be properly parsed ->>>>>>> AddJavaDoc - */ - public static List loadPrescriptions() throws UnloadedStorageException { - List prescriptions = new ArrayList<>(); - File file = new File(prescriptionFilePath); - - if (!file.exists()) { - return prescriptions; - } - - try (Scanner scanner = new Scanner(file)) { - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - if (!line.trim().isEmpty()) { - Prescription prescription = Prescription.fromFileFormat(line); - if (prescription != null) { - prescriptions.add(prescription); - } - } - } - } catch (Exception e) { - throw new UnloadedStorageException("Unable to load prescription data: " + e.getMessage()); - } - - return prescriptions; - } - - /** -<<<<<<< HEAD - * Generates and saves a prescription HTML file. - * - * @param prescription The prescription to convert to HTML. - * @param patient The patient associated with the prescription. - * @throws UnloadedStorageException If storage is not initialized or HTML file cannot be written. - */ - public static void savePrescriptionHtml(Prescription prescription, Patient patient) -======= - * Generates and saves an HTML representation of a prescription. - * Creates a formatted HTML file that can be viewed in a browser and printed. - * - * @param prescription The prescription to generate HTML for - * @param patient The patient associated with the prescription, may be null - * @throws UnloadedStorageException If the storage was not properly initialized - * or if there was an error writing the HTML file - */ - public static void savePrescriptionHtml(Prescription prescription, Patient patient) ->>>>>>> AddJavaDoc - throws UnloadedStorageException { - if (directoryPath == null || prescriptionDirPath == null) { - throw new UnloadedStorageException("Storage not initialized with a directory!"); - } - - File dir = new File(prescriptionDirPath); - if (!dir.exists()) { - dir.mkdirs(); - } - - String fileName = "prescription_" + prescription.getPatientId() + "_" - + prescription.getPrescriptionId().split("-")[1] + ".html"; - String filePath = prescriptionDirPath + File.separator + fileName; - - try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { - writer.write(prescription.generateHtml(patient)); - } catch (IOException e) { - throw new UnloadedStorageException("Unable to generate HTML prescription: " + e.getMessage()); - } - } -} diff --git a/src/test/java/command/AddPrescriptionCommandTest.java b/src/test/java/command/AddPrescriptionCommandTest.java index cf6a3823a1..d91c479bd9 100644 --- a/src/test/java/command/AddPrescriptionCommandTest.java +++ b/src/test/java/command/AddPrescriptionCommandTest.java @@ -19,40 +19,40 @@ //@@author Basudeb2005 public class AddPrescriptionCommandTest { - + private ManagementSystem system; private Ui ui; private ByteArrayOutputStream outputStream; private PrintStream originalOut; - + @BeforeEach public void setUp() { // Save original System.out originalOut = System.out; - + // Redirect System.out to capture output outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); - + try { // Initialize Storage with temp directory new Storage(System.getProperty("java.io.tmpdir") + File.separator + "clinicease_test"); - + // Initialize system and UI system = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); ui = new Ui(); - + // Add a test patient Patient patient = new Patient( - "S1234567A", "John Doe", "1990-01-01", "M", - "123 Main St", "98765432", new ArrayList<>() + "S1234567A", "John Doe", "1990-01-01", "M", + "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(patient); } catch (Exception e) { Assertions.fail("Failed to set up test: " + e.getMessage()); } } - + @Test public void execute_validPrescription_success() { // Create prescription and command @@ -60,11 +60,11 @@ public void execute_validPrescription_success() { List medicines = Arrays.asList("Paracetamol", "Cough syrup"); Prescription prescription = new Prescription("S1234567A", symptoms, medicines, "Take after meals"); AddPrescriptionCommand command = new AddPrescriptionCommand(prescription); - + try { // Execute command command.execute(system, ui); - + // Verify command output indicates success String output = outputStream.toString(); Assertions.assertTrue(output.contains("Successfully added prescription")); @@ -72,7 +72,7 @@ public void execute_validPrescription_success() { Assertions.assertTrue(output.contains("Fever")); Assertions.assertTrue(output.contains("Paracetamol")); Assertions.assertTrue(output.contains("Take after meals")); - + // Verify prescription was added to the system Assertions.assertEquals(1, system.getPrescriptions().size()); Assertions.assertNotNull(system.getPrescriptionById("S1234567A-1")); @@ -80,7 +80,7 @@ public void execute_validPrescription_success() { Assertions.fail("Should not throw exception for a valid prescription: " + e.getMessage()); } } - + @Test public void execute_nonExistentPatient_showsError() { // Create prescription for non-existent patient and command @@ -88,23 +88,23 @@ public void execute_nonExistentPatient_showsError() { List medicines = Arrays.asList("Paracetamol"); Prescription prescription = new Prescription("NONEXISTENT", symptoms, medicines, ""); AddPrescriptionCommand command = new AddPrescriptionCommand(prescription); - + try { // Execute command command.execute(system, ui); - + // Verify command output indicates error String output = outputStream.toString(); Assertions.assertTrue(output.contains("Failed to add prescription")); Assertions.assertTrue(output.contains("Patient with NRIC: NONEXISTENT not found")); - + // Verify no prescription was added to the system Assertions.assertEquals(0, system.getPrescriptions().size()); } catch (UnloadedStorageException e) { Assertions.fail("Should handle patient not found gracefully: " + e.getMessage()); } } - + @Test public void isExit_returnsFalse() { // Create command @@ -112,7 +112,7 @@ public void isExit_returnsFalse() { List medicines = Arrays.asList("Paracetamol"); Prescription prescription = new Prescription("S1234567A", symptoms, medicines, ""); AddPrescriptionCommand command = new AddPrescriptionCommand(prescription); - + // Verify isExit returns false Assertions.assertFalse(command.isExit()); } diff --git a/src/test/java/command/ListAppointmentCommandTest.java b/src/test/java/command/ListAppointmentCommandTest.java index 8ec89035b5..7ff8eef237 100644 --- a/src/test/java/command/ListAppointmentCommandTest.java +++ b/src/test/java/command/ListAppointmentCommandTest.java @@ -50,9 +50,9 @@ void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDE List patients = List.of( new Patient("S1234567D", "Billy", "1990-10-01", "M", "124 High St", "81234567", new ArrayList<>()), - new Patient("S2345678D", "James" , "1980-12-31", + new Patient("S2345678D", "James", "1980-12-31", "M", "133 Main St", "81229312", new ArrayList<>()), - new Patient("S3456789D", "William" , "1970-08-21", + new Patient("S3456789D", "William", "1970-08-21", "M", "17 Cornelia St", "81009214", new ArrayList<>()) ); manager.addPatient(patients.get(0)); @@ -60,9 +60,9 @@ void execute_always_requestsAppointmentsFromManager() throws DuplicatePatientIDE manager.addPatient(patients.get(2)); List appointments = List.of( - new Appointment("S1234567D", dateTime1 , "Checkup"), - new Appointment("S2345678D", dateTime2 , "CT scan"), - new Appointment("S3456789D", dateTime3 , "Consultation") + new Appointment("S1234567D", dateTime1, "Checkup"), + new Appointment("S2345678D", dateTime2, "CT scan"), + new Appointment("S3456789D", dateTime3, "Consultation") ); manager.addAppointment(appointments.get(0)); manager.addAppointment(appointments.get(1)); diff --git a/src/test/java/command/SortAppointmentCommandTest.java b/src/test/java/command/SortAppointmentCommandTest.java index 903d711f46..f73e9457f1 100644 --- a/src/test/java/command/SortAppointmentCommandTest.java +++ b/src/test/java/command/SortAppointmentCommandTest.java @@ -44,9 +44,9 @@ void setUp() throws UnloadedStorageException, DuplicatePatientIDException, Patie List patients = List.of( new Patient("S1234567D", "Billy", "1990-10-01", "M", "124 High St", "81234567", new ArrayList<>()), - new Patient("S2345678D", "James" , "1980-12-31", + new Patient("S2345678D", "James", "1980-12-31", "M", "133 Main St", "81229312", new ArrayList<>()), - new Patient("S3456789D", "William" , "1970-08-20", + new Patient("S3456789D", "William", "1970-08-20", "M", "17 Cornelia St", "81009214", new ArrayList<>()) ); manager.addPatient(patients.get(0)); diff --git a/src/test/java/command/ViewAllPrescriptionsCommandTest.java b/src/test/java/command/ViewAllPrescriptionsCommandTest.java index 9b678c4889..376099dde5 100644 --- a/src/test/java/command/ViewAllPrescriptionsCommandTest.java +++ b/src/test/java/command/ViewAllPrescriptionsCommandTest.java @@ -19,41 +19,41 @@ //@@author Basudeb2005 public class ViewAllPrescriptionsCommandTest { - + private ManagementSystem system; private Ui ui; private ByteArrayOutputStream outputStream; private Patient testPatient; private PrintStream originalOut; - + @BeforeEach public void setUp() { // Save original System.out originalOut = System.out; - + // Redirect System.out to capture output outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); - + try { // Initialize Storage with temp directory new Storage(System.getProperty("java.io.tmpdir") + File.separator + "clinicease_test"); - + // Initialize system and UI system = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); ui = new Ui(); - + // Add a test patient testPatient = new Patient( - "S1234567A", "John Doe", "1990-01-01", "M", - "123 Main St", "98765432", new ArrayList<>() + "S1234567A", "John Doe", "1990-01-01", "M", + "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(testPatient); } catch (Exception e) { Assertions.fail("Failed to set up test: " + e.getMessage()); } } - + @Test public void execute_patientWithPrescriptions_success() { try { @@ -61,17 +61,17 @@ public void execute_patientWithPrescriptions_success() { List symptoms1 = Arrays.asList("Fever", "Cough"); List medicines1 = Arrays.asList("Paracetamol", "Cough syrup"); system.addPrescription(new Prescription(testPatient.getId(), symptoms1, medicines1, "Take after meals")); - + List symptoms2 = Arrays.asList("Headache"); List medicines2 = Arrays.asList("Ibuprofen"); system.addPrescription(new Prescription(testPatient.getId(), symptoms2, medicines2, "Take with water")); - + // Create command ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand(testPatient.getId()); - + // Execute command command.execute(system, ui); - + // Verify command output String output = outputStream.toString(); Assertions.assertTrue(output.contains("Prescriptions for patient John Doe")); @@ -87,16 +87,16 @@ public void execute_patientWithPrescriptions_success() { Assertions.fail("Should not throw exception: " + e.getMessage()); } } - + @Test public void execute_patientWithNoPrescriptions_showsMessage() { try { // Create command for patient with no prescriptions ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand(testPatient.getId()); - + // Execute command command.execute(system, ui); - + // Verify command output String output = outputStream.toString(); Assertions.assertTrue(output.contains("No prescriptions found for patient John Doe")); @@ -104,16 +104,16 @@ public void execute_patientWithNoPrescriptions_showsMessage() { Assertions.fail("Should not throw exception for patient with no prescriptions: " + e.getMessage()); } } - + @Test public void execute_nonExistentPatient_showsError() { // Create command for non-existent patient ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand("NONEXISTENT"); - + try { // Execute command command.execute(system, ui); - + // Verify command output indicates error String output = outputStream.toString(); Assertions.assertTrue(output.contains("Patient with ID NONEXISTENT not found")); @@ -121,12 +121,12 @@ public void execute_nonExistentPatient_showsError() { Assertions.fail("Should handle patient not found gracefully: " + e.getMessage()); } } - + @Test public void isExit_returnsFalse() { // Create command ViewAllPrescriptionsCommand command = new ViewAllPrescriptionsCommand("S1234567A"); - + // Verify isExit returns false Assertions.assertFalse(command.isExit()); } diff --git a/src/test/java/command/ViewPrescriptionCommandTest.java b/src/test/java/command/ViewPrescriptionCommandTest.java index e919beee52..8be31acc59 100644 --- a/src/test/java/command/ViewPrescriptionCommandTest.java +++ b/src/test/java/command/ViewPrescriptionCommandTest.java @@ -19,37 +19,37 @@ //@@author Basudeb2005 public class ViewPrescriptionCommandTest { - + private ManagementSystem system; private Ui ui; private ByteArrayOutputStream outputStream; private Prescription testPrescription; private PrintStream originalOut; - + @BeforeEach public void setUp() { // Save original System.out originalOut = System.out; - + // Redirect System.out to capture output outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); - + try { // Initialize Storage with temp directory new Storage(System.getProperty("java.io.tmpdir") + File.separator + "clinicease_test"); - + // Initialize system and UI system = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); ui = new Ui(); - + // Add a test patient Patient patient = new Patient( - "S1234567A", "John Doe", "1990-10-01", "M", - "123 Main St", "98765432", new ArrayList<>() + "S1234567A", "John Doe", "1990-10-01", "M", + "123 Main St", "98765432", new ArrayList<>() ); system.addPatient(patient); - + // Add a test prescription List symptoms = Arrays.asList("Fever", "Cough"); List medicines = Arrays.asList("Paracetamol", "Cough syrup"); @@ -59,16 +59,16 @@ public void setUp() { Assertions.fail("Failed to set up test: " + e.getMessage()); } } - + @Test public void execute_existingPrescription_success() { // Create command for existing prescription ViewPrescriptionCommand command = new ViewPrescriptionCommand(testPrescription.getPrescriptionId()); - + try { // Execute command command.execute(system, ui); - + // Verify command output String output = outputStream.toString(); Assertions.assertTrue(output.contains("Prescription details")); @@ -81,16 +81,16 @@ public void execute_existingPrescription_success() { Assertions.fail("Should not throw exception for an existing prescription: " + e.getMessage()); } } - + @Test public void execute_nonExistentPrescription_showsError() { // Create command for non-existent prescription ViewPrescriptionCommand command = new ViewPrescriptionCommand("NONEXISTENT-ID"); - + try { // Execute command command.execute(system, ui); - + // Verify command output indicates error String output = outputStream.toString(); Assertions.assertTrue(output.contains("Prescription with ID NONEXISTENT-ID not found")); @@ -98,12 +98,12 @@ public void execute_nonExistentPrescription_showsError() { Assertions.fail("Should handle prescription not found gracefully: " + e.getMessage()); } } - + @Test public void isExit_returnsFalse() { // Create command ViewPrescriptionCommand command = new ViewPrescriptionCommand("S1234567A-1"); - + // Verify isExit returns false Assertions.assertFalse(command.isExit()); } diff --git a/src/test/java/manager/ManagementSystemPrescriptionTest.java b/src/test/java/manager/ManagementSystemPrescriptionTest.java index 638a293617..da3ba2cb67 100644 --- a/src/test/java/manager/ManagementSystemPrescriptionTest.java +++ b/src/test/java/manager/ManagementSystemPrescriptionTest.java @@ -12,43 +12,43 @@ //@@author Basudeb2005 public class ManagementSystemPrescriptionTest { - + private ManagementSystem system; private Patient testPatient; - + @BeforeEach public void setUp() { // Create a temporary directory for Storage try { // Initialize Storage with temp directory new Storage(System.getProperty("java.io.tmpdir") + File.separator + "clinicease_test"); - + // Initialize system with empty lists system = new ManagementSystem(new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); - + // Add a test patient testPatient = new Patient( - "S1234567A", "John Doe", "1990-01-01", "M", - "123 Main St", "98765432", new ArrayList<>() + "S1234567A", "John Doe", "1990-01-01", "M", + "123 Main St", "98765432", new ArrayList<>() ); - + system.addPatient(testPatient); } catch (Exception e) { Assertions.fail("Failed to set up test: " + e.getMessage()); } } - + @Test public void addPrescription_validPrescription_success() { // Create a prescription for an existing patient List symptoms = Arrays.asList("Fever", "Cough"); List medicines = Arrays.asList("Paracetamol", "Cough syrup"); Prescription prescription = new Prescription(testPatient.getId(), symptoms, medicines, "Take after meals"); - + try { // Add prescription Prescription addedPrescription = system.addPrescription(prescription); - + // Verify prescription was added with correct attributes Assertions.assertNotNull(addedPrescription); Assertions.assertEquals(testPatient.getId() + "-1", addedPrescription.getPrescriptionId()); @@ -56,29 +56,29 @@ public void addPrescription_validPrescription_success() { Assertions.assertEquals(symptoms, addedPrescription.getSymptoms()); Assertions.assertEquals(medicines, addedPrescription.getMedicines()); Assertions.assertEquals("Take after meals", addedPrescription.getNotes()); - + // Verify it was added to the system's list Assertions.assertEquals(1, system.getPrescriptions().size()); } catch (Exception e) { Assertions.fail("Should not throw exception for a valid prescription: " + e.getMessage()); } } - + @Test public void addPrescription_nonExistentPatient_throwsException() { // Create a prescription with non-existent patient ID List symptoms = Arrays.asList("Fever"); List medicines = Arrays.asList("Paracetamol"); Prescription prescription = new Prescription("NONEXISTENT", symptoms, medicines, ""); - + // Try to add prescription - should throw IllegalArgumentException Exception exception = Assertions.assertThrows(IllegalArgumentException.class, () -> { system.addPrescription(prescription); }); - + Assertions.assertTrue(exception.getMessage().contains("Patient with NRIC: NONEXISTENT not found")); } - + @Test public void getPrescriptionsForPatient_multipleExistingPrescriptions_returnsAllPrescriptions() { try { @@ -86,17 +86,17 @@ public void getPrescriptionsForPatient_multipleExistingPrescriptions_returnsAllP List symptoms1 = Arrays.asList("Fever"); List medicines1 = Arrays.asList("Paracetamol"); Prescription prescription1 = new Prescription(testPatient.getId(), symptoms1, medicines1, ""); - + List symptoms2 = Arrays.asList("Headache"); List medicines2 = Arrays.asList("Ibuprofen"); Prescription prescription2 = new Prescription(testPatient.getId(), symptoms2, medicines2, ""); - + system.addPrescription(prescription1); system.addPrescription(prescription2); - + // Get prescriptions for patient List results = system.getPrescriptionsForPatient(testPatient.getId()); - + // Verify both prescriptions are returned Assertions.assertEquals(2, results.size()); Assertions.assertTrue(results.get(0).getSymptoms().contains("Fever")); @@ -105,25 +105,25 @@ public void getPrescriptionsForPatient_multipleExistingPrescriptions_returnsAllP Assertions.fail("Should not throw exception: " + e.getMessage()); } } - + @Test public void getPrescriptionsForPatient_noExistingPrescriptions_returnsEmptyList() { // Get prescriptions for patient with no prescriptions List results = system.getPrescriptionsForPatient(testPatient.getId()); - + // Verify empty list is returned Assertions.assertTrue(results.isEmpty()); } - + @Test public void getPrescriptionsForPatient_nonExistentPatient_returnsEmptyList() { // Get prescriptions for non-existent patient ID List results = system.getPrescriptionsForPatient("NONEXISTENT"); - + // Verify empty list is returned Assertions.assertTrue(results.isEmpty()); } - + @Test public void getPrescriptionById_existingPrescription_returnsPrescription() { try { @@ -131,12 +131,12 @@ public void getPrescriptionById_existingPrescription_returnsPrescription() { List symptoms = Arrays.asList("Fever"); List medicines = Arrays.asList("Paracetamol"); Prescription added = system.addPrescription( - new Prescription(testPatient.getId(), symptoms, medicines, "") + new Prescription(testPatient.getId(), symptoms, medicines, "") ); - + // Get prescription by ID Prescription result = system.getPrescriptionById(added.getPrescriptionId()); - + // Verify prescription is returned Assertions.assertNotNull(result); Assertions.assertEquals(added.getPrescriptionId(), result.getPrescriptionId()); @@ -147,12 +147,12 @@ public void getPrescriptionById_existingPrescription_returnsPrescription() { Assertions.fail("Should not throw exception: " + e.getMessage()); } } - + @Test public void getPrescriptionById_nonExistentPrescription_returnsNull() { // Get prescription with non-existent ID Prescription result = system.getPrescriptionById("NON-EXISTENT-ID"); - + // Verify null is returned Assertions.assertNull(result); } diff --git a/src/test/java/manager/PrescriptionTest.java b/src/test/java/manager/PrescriptionTest.java index 513fdc16de..bae62be536 100644 --- a/src/test/java/manager/PrescriptionTest.java +++ b/src/test/java/manager/PrescriptionTest.java @@ -3,6 +3,7 @@ import exception.InvalidInputFormatException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; + import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; diff --git a/src/test/java/miscellaneous/ParserPrescriptionTest.java b/src/test/java/miscellaneous/ParserPrescriptionTest.java index a59642a053..e044cb808a 100644 --- a/src/test/java/miscellaneous/ParserPrescriptionTest.java +++ b/src/test/java/miscellaneous/ParserPrescriptionTest.java @@ -14,103 +14,103 @@ public class ParserPrescriptionTest { public void parseAddPrescription_validInput_success() throws InvalidInputFormatException { // Valid input with all fields including optional notes String input = "add-prescription ic/S1234567A s/Fever, Cough m/Paracetamol, Cough syrup nt/Take after meals"; - + Prescription prescription = Parser.parseAddPrescription(input); - + // Verify all fields are correctly parsed Assertions.assertEquals("S1234567A", prescription.getPatientId()); List symptoms = prescription.getSymptoms(); Assertions.assertEquals(2, symptoms.size()); Assertions.assertTrue(symptoms.contains("Fever")); Assertions.assertTrue(symptoms.contains("Cough")); - + List medicines = prescription.getMedicines(); Assertions.assertEquals(2, medicines.size()); Assertions.assertTrue(medicines.contains("Paracetamol")); Assertions.assertTrue(medicines.contains("Cough syrup")); - + Assertions.assertEquals("Take after meals", prescription.getNotes()); } - + @Test public void parseAddPrescription_missingPatientId_throwsException() { // Missing the required ic/ parameter String input = "add-prescription s/Fever m/Paracetamol nt/Take after meals"; - + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseAddPrescription(input); }); } - + @Test public void parseAddPrescription_missingSymptoms_throwsException() { // Missing the required s/ parameter String input = "add-prescription ic/S1234567A m/Paracetamol nt/Take after meals"; - + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseAddPrescription(input); }); } - + @Test public void parseAddPrescription_missingMedicines_throwsException() { // Missing the required m/ parameter String input = "add-prescription ic/S1234567A s/Fever nt/Take after meals"; - + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseAddPrescription(input); }); } - + @Test public void parseAddPrescription_noOptionalNotes_success() throws InvalidInputFormatException { // Valid input with only required fields String input = "add-prescription ic/S1234567A s/Fever m/Paracetamol"; - + Prescription prescription = Parser.parseAddPrescription(input); - + // Verify required fields are parsed and optional field is empty Assertions.assertEquals("S1234567A", prescription.getPatientId()); Assertions.assertEquals(1, prescription.getSymptoms().size()); Assertions.assertEquals(1, prescription.getMedicines().size()); Assertions.assertEquals("", prescription.getNotes()); } - + @Test public void parseViewAllPrescriptions_validInput_success() throws InvalidInputFormatException { // Valid command format String input = "view-all-prescriptions S1234567A"; - + String patientId = Parser.parseViewAllPrescriptions(input); - + Assertions.assertEquals("S1234567A", patientId); } - + @Test public void parseViewAllPrescriptions_missingPatientId_throwsException() { // Command without patient ID - needs to be shorter than 22 characters String input = "view-all-prescriptions"; - + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseViewAllPrescriptions(input); }); } - + @Test public void parseViewPrescription_validInput_success() throws InvalidInputFormatException { // Valid command format String input = "view-prescription S1234567A-1"; - + String prescriptionId = Parser.parseViewPrescription(input); - + Assertions.assertEquals("S1234567A-1", prescriptionId); } - + @Test public void parseViewPrescription_missingPrescriptionId_throwsException() { // Command without prescription ID - needs to be shorter than 17 characters String input = "view-prescription"; - + Assertions.assertThrows(InvalidInputFormatException.class, () -> { Parser.parseViewPrescription(input); }); From fcd4c94cc023dfa7450ea3d69700301ceb364649 Mon Sep 17 00:00:00 2001 From: judHoka Date: Tue, 8 Apr 2025 12:29:51 +0800 Subject: [PATCH 190/203] Checkstyle fixes --- src/main/java/manager/Prescription.java | 3 ++- src/main/java/miscellaneous/Parser.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/manager/Prescription.java b/src/main/java/manager/Prescription.java index b85a650d4c..de2b54344c 100644 --- a/src/main/java/manager/Prescription.java +++ b/src/main/java/manager/Prescription.java @@ -203,7 +203,8 @@ public String generateHtml(Patient patient) { .append(" Prescription ").append(prescriptionId).append("\n") .append(" - - -
    -
    -

    ClinicEase Medical Prescription

    -

    Prescription ID: S1234567A-1

    -

    Date: 2025-04-08 03:53

    -
    -
    -

    Patient Information

    - - - - - - -
    Patient ID:S1234567A
    Name:John Doe
    Gender:M
    Date of Birth:1990-05-15
    Contact:98765432
    -
    -
    -

    Symptoms

    -
      -
    • headache
    • -
    • fever
    • -
    -
    -
    -

    Prescribed Medications

    -
      -
    • paracetamol
    • -
    • ibuprofen
    • -
    -
    -
    -

    Special Instructions

    -

    Take twice daily after meals

    -
    - -
    - - diff --git a/data/prescriptions/prescription_S1234567A_2.html b/data/prescriptions/prescription_S1234567A_2.html deleted file mode 100644 index db9b513134..0000000000 --- a/data/prescriptions/prescription_S1234567A_2.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - Prescription S1234567A-2 - - - -
    -
    -

    ClinicEase Medical Prescription

    -

    Prescription ID: S1234567A-2

    -

    Date: 2025-04-08 03:55

    -
    -
    -

    Patient Information

    - - - - - - -
    Patient ID:S1234567A
    Name:John Doe
    Gender:M
    Date of Birth:1990-05-15
    Contact:98765432
    -
    -
    -

    Symptoms

    -
      -
    • sore throat
    • -
    • cough
    • -
    -
    -
    -

    Prescribed Medications

    -
      -
    • lozenges
    • -
    • cough syrup
    • -
    -
    -
    -

    Special Instructions

    -

    Take every 6 hours

    -
    - -
    - - From 04c4d7ec451e1273755383c2b82bfba782a22c44 Mon Sep 17 00:00:00 2001 From: Wen Yee <141599443+chwenyee@users.noreply.github.com> Date: Tue, 8 Apr 2025 13:10:14 +0800 Subject: [PATCH 198/203] Update UserGuide.md --- docs/UserGuide.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 85d418e763..5fde9d370e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -53,6 +53,7 @@ ClinicEase is an application designed to assist doctors in managing patient reco - `bye`: Exits the app. 6. Refer to the Features below for details of each command. +
    --- ## Features Here are some feature that the product provides: @@ -229,6 +230,7 @@ Edit-patient command executed. ----------------------------------------------------------------------------------------------------