From 369236f42c04d583dccaf0a108e57c432e079387 Mon Sep 17 00:00:00 2001 From: Tanveer Singh Date: Thu, 2 Nov 2023 11:53:56 +0800 Subject: [PATCH 1/3] Prevent editing IC --- .../address/logic/commands/EditCommand.java | 11 +++++++---- .../address/logic/parser/EditCommandParser.java | 7 ++++--- .../address/logic/commands/CommandTestUtil.java | 8 ++++---- .../address/logic/commands/EditCommandTest.java | 17 ++++++++--------- .../logic/parser/AddressBookParserTest.java | 2 +- .../seedu/address/testutil/DoctorBuilder.java | 15 ++++++++++++++- .../testutil/EditPersonDescriptorBuilder.java | 11 ++--------- .../seedu/address/testutil/PatientBuilder.java | 17 +++++++++++++++++ 8 files changed, 57 insertions(+), 31 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 968efea858f..0fa472d7d0d 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -8,7 +8,6 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_EMERGENCY_CONTACT; import static seedu.address.logic.parser.CliSyntax.PREFIX_GENDER; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; -import static seedu.address.logic.parser.CliSyntax.PREFIX_NRIC; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_REMARK; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -62,7 +61,6 @@ public class EditCommand extends Command { + "[" + PREFIX_GENDER + "GENDER] " + "[" + PREFIX_CONDITION + "CONDITION] " + "[" + PREFIX_BLOODTYPE + "BLOOD TYPE] " - + "[" + PREFIX_NRIC + "NRIC] " + "[" + PREFIX_EMERGENCY_CONTACT + "EMAIL] " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " T0123456H " @@ -73,6 +71,7 @@ public class EditCommand extends Command { public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided."; public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the address book."; public static final String MESSAGE_DOESNT_EXIST = "This person hasn't been saved"; + public static final String MESSAGE_IC_CHANGED = "You can't change a person's IC"; private static final Logger logger = LogsCenter.getLogger(EditCommand.class.getName()); private final Ic nric; private final EditPersonDescriptor editPersonDescriptor; @@ -92,6 +91,10 @@ public EditCommand(Ic nric, EditPersonDescriptor editPersonDescriptor) { @Override public CommandResult execute(Model model) throws CommandException { requireNonNull(model); + if (editPersonDescriptor.getIc().isPresent() && !(editPersonDescriptor.getIc().get().equals(nric))) { + throw new CommandException(MESSAGE_IC_CHANGED); + } + // combine doctor list and patient list Person personToEdit = getPersonToEdit(model); Person editedPerson = getEditedPerson(model, personToEdit); @@ -152,7 +155,7 @@ private static Doctor createEditedDoctor(Doctor personToEdit, EditPersonDescript Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress()); Remark updatedRemarks = editPersonDescriptor.getRemark().orElse(personToEdit.getRemark()); Gender updatedGender = editPersonDescriptor.getGender().orElse(personToEdit.getGender()); - Ic updatedIc = editPersonDescriptor.getIc().orElse(personToEdit.getIc()); + Ic updatedIc = personToEdit.getIc(); // since you can't modify ic Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); Set updatedAppointments = editPersonDescriptor.getAppointments().orElse(personToEdit.getAppointments()); @@ -175,7 +178,7 @@ private static Patient createEditedPatient(Patient personToEdit, EditPersonDescr Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress()); Remark updatedRemarks = editPersonDescriptor.getRemark().orElse(personToEdit.getRemark()); Gender updatedGender = editPersonDescriptor.getGender().orElse(personToEdit.getGender()); - Ic updatedIc = editPersonDescriptor.getIc().orElse(personToEdit.getIc()); + Ic updatedIc = personToEdit.getIc(); // since you can't modify ic Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); Set updatedAppointments = editPersonDescriptor.getAppointments().orElse(personToEdit.getAppointments()); diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index 5806ed37863..66cbb58209e 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -31,6 +31,7 @@ * Parses input arguments and creates a new EditCommand object */ public class EditCommandParser implements Parser { + public static final String CANNOT_CHANGE_IC_MESSAGE = "You cannot modify a person's IC"; private static final Logger logger = LogsCenter.getLogger(EditCommand.class); /** * Parses the given {@code String} of arguments in the context of the EditCommand @@ -57,6 +58,9 @@ public EditCommand parse(String args) throws ParseException { EditPersonDescriptor editPersonDescriptor = new EditPersonDescriptor(); + if (argMultimap.getValue(PREFIX_NRIC).isPresent()) { + editPersonDescriptor.setIc(ParserUtil.parseIc(argMultimap.getValue(PREFIX_NRIC).get())); + } if (argMultimap.getValue(PREFIX_NAME).isPresent()) { editPersonDescriptor.setName(ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get())); } @@ -72,9 +76,6 @@ public EditCommand parse(String args) throws ParseException { if (argMultimap.getValue(PREFIX_GENDER).isPresent()) { editPersonDescriptor.setGender(ParserUtil.parseGender(argMultimap.getValue(PREFIX_GENDER).get())); } - if (argMultimap.getValue(PREFIX_NRIC).isPresent()) { - editPersonDescriptor.setIc(ParserUtil.parseIc(argMultimap.getValue(PREFIX_NRIC).get())); - } if (argMultimap.getValue(PREFIX_CONDITION).isPresent()) { editPersonDescriptor.setCondition(ParserUtil.parseCondition(argMultimap.getValue(PREFIX_CONDITION).get())); } diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index dd6cd45793d..00f2adb51ae 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -132,22 +132,22 @@ public class CommandTestUtil { DESC_AMY = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY) .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY) .withBloodType(VALID_BLOODTYPE_AMY).withCondition(VALID_CONDITION_AMY) - .withGender(VALID_GENDER_FEMALE).withIc(VALID_NRIC_AMY) + .withGender(VALID_GENDER_FEMALE) .withTags(VALID_TAG_FRIEND).withBloodType(VALID_BLOODTYPE_AMY) .build(); DESC_BOB = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB) .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB) - .withGender(VALID_GENDER_MALE).withIc(VALID_NRIC_BOB) + .withGender(VALID_GENDER_MALE) .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); DESC_CHERYL = new EditPersonDescriptorBuilder().withName(VALID_NAME_CHERYL) .withPhone(VALID_PHONE_CHERYL).withEmail(VALID_EMAIL_CHERYL).withAddress(VALID_ADDRESS_CHERYL) - .withGender(VALID_GENDER_FEMALE).withIc(VALID_NRIC_CHERYL).build(); + .withGender(VALID_GENDER_FEMALE).build(); DESC_DEREK = new EditPersonDescriptorBuilder().withName(VALID_NAME_DEREK) .withPhone(VALID_PHONE_DEREK).withEmail(VALID_EMAIL_DEREK).withAddress(VALID_ADDRESS_DEREK) - .withGender(VALID_GENDER_MALE).withIc(VALID_NRIC_DEREK).build(); + .withGender(VALID_GENDER_MALE).build(); } /** diff --git a/src/test/java/seedu/address/logic/commands/EditCommandTest.java b/src/test/java/seedu/address/logic/commands/EditCommandTest.java index 7610658cf12..ec55543e717 100644 --- a/src/test/java/seedu/address/logic/commands/EditCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/EditCommandTest.java @@ -41,9 +41,9 @@ public class EditCommandTest { @Test public void execute_patientAllFieldsSpecifiedUnfilteredList_success() { - Person editedPatient = new PatientBuilder().build(); - EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(editedPatient).build(); Ic nricOfFirstPatient = model.getFilteredPatientList().get(0).getIc(); + Person editedPatient = new PatientBuilder(nricOfFirstPatient).build(); + EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(nricOfFirstPatient, editedPatient).build(); EditCommand editCommand = new EditCommand(nricOfFirstPatient, descriptor); String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPatient)); @@ -56,9 +56,9 @@ public void execute_patientAllFieldsSpecifiedUnfilteredList_success() { @Test public void execute_doctorAllFieldsSpecifiedUnfilteredList_success() { - Doctor editedDoctor = new DoctorBuilder().build(); - EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(editedDoctor).build(); Ic nricOfFirstDoctor = model.getFilteredDoctorList().get(0).getIc(); + Doctor editedDoctor = new DoctorBuilder(nricOfFirstDoctor).build(); + EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(nricOfFirstDoctor, editedDoctor).build(); EditCommand editCommand = new EditCommand(nricOfFirstDoctor, descriptor); String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedDoctor)); @@ -127,11 +127,10 @@ public void execute_duplicatePersonUnfilteredList_failure() { Ic nricOfFirstPerson = model.getFilteredPatientList().get(0).getIc(); Person firstPerson = model.getFilteredPatientList().stream().filter(p -> p.getIc().equals(nricOfFirstPerson)).findFirst().orElse(null); - EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(firstPerson).build(); + EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(nricOfFirstPerson, firstPerson).build(); Ic nricOfSecondPerson = model.getFilteredPatientList().get(1).getIc(); EditCommand editCommand = new EditCommand(nricOfSecondPerson, descriptor); - - assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); + assertCommandFailure(editCommand, model, EditCommand.MESSAGE_IC_CHANGED); } @Test @@ -142,9 +141,9 @@ public void execute_duplicatePersonFilteredList_failure() { Patient patientInList = model.getAddressBook().getPatientList().get(INDEX_SECOND_PERSON.getZeroBased()); Ic nricOfFirstPerson = model.getFilteredPatientList().get(INDEX_FIRST_PERSON.getZeroBased()).getIc(); EditCommand editCommand = new EditCommand(nricOfFirstPerson, - new EditPersonDescriptorBuilder(patientInList).build()); + new EditPersonDescriptorBuilder(patientInList.getIc(), patientInList).build()); - assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); + assertCommandFailure(editCommand, model, EditCommand.MESSAGE_IC_CHANGED); } @Test diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index ebb406370d4..6927a3376ef 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -52,7 +52,7 @@ public void parseCommand_delete() throws Exception { @Test public void parseCommand_edit() throws Exception { Patient person = new PatientBuilder().build(); - EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(person).build(); + EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder(person.getIc(), person).build(); EditCommand command = (EditCommand) parser.parseCommand(EditCommand.COMMAND_WORD + " " + person.getIc() + " " + PersonUtil.getEditPersonDescriptorDetails(descriptor)); assertEquals(new EditCommand(person.getIc(), descriptor), command); diff --git a/src/test/java/seedu/address/testutil/DoctorBuilder.java b/src/test/java/seedu/address/testutil/DoctorBuilder.java index fda34f60f9c..a9a231abdae 100644 --- a/src/test/java/seedu/address/testutil/DoctorBuilder.java +++ b/src/test/java/seedu/address/testutil/DoctorBuilder.java @@ -68,7 +68,20 @@ public DoctorBuilder(Doctor doctorToCopy) { tags = new HashSet<>(doctorToCopy.getTags()); appointments = new HashSet<>(doctorToCopy.getAppointments()); } - + /** + * Initializes the PersonBuilder with an nric. + */ + public DoctorBuilder(Ic nric) { + name = new Name(DEFAULT_NAME); + phone = new Phone(DEFAULT_PHONE); + email = new Email(DEFAULT_EMAIL); + address = new Address(DEFAULT_ADDRESS); + remark = new Remark(DEFAULT_REMARK); + gender = new Gender(DEFAULT_GENDER); + ic = nric; + tags = new HashSet<>(); + appointments = new HashSet<>(); + } /** * Sets the {@code Name} of the {@code Person} that we are building. */ diff --git a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java index 91d2800e524..8737aeb11fd 100644 --- a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java +++ b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java @@ -37,14 +37,14 @@ public EditPersonDescriptorBuilder(EditPersonDescriptor descriptor) { /** * Returns an {@code EditPersonDescriptor} with fields containing {@code person}'s details */ - public EditPersonDescriptorBuilder(Person person) { + public EditPersonDescriptorBuilder(Ic nric, Person person) { descriptor = new EditPersonDescriptor(); + descriptor.setIc(nric); descriptor.setName(person.getName()); descriptor.setPhone(person.getPhone()); descriptor.setEmail(person.getEmail()); descriptor.setAddress(person.getAddress()); descriptor.setGender(person.getGender()); - descriptor.setIc(person.getIc()); descriptor.setTags(person.getTags()); descriptor.setRemark(person.getRemark()); if (person.isPatient()) { @@ -104,13 +104,6 @@ public EditPersonDescriptorBuilder withRemark(String remark) { return this; } - /** - * Sets the {@code Ic} of the {@code EditPersonDescriptor} that we are building. - */ - public EditPersonDescriptorBuilder withIc(String ic) { - descriptor.setIc(new Ic(ic)); - return this; - } /** * Sets the {@code BloodType} of the {@code EditPersonDescriptor} that we are building. diff --git a/src/test/java/seedu/address/testutil/PatientBuilder.java b/src/test/java/seedu/address/testutil/PatientBuilder.java index cb5de5dd0b3..fd764b25cfa 100644 --- a/src/test/java/seedu/address/testutil/PatientBuilder.java +++ b/src/test/java/seedu/address/testutil/PatientBuilder.java @@ -63,6 +63,23 @@ public PatientBuilder() { tags = new HashSet<>(); appointments = new HashSet<>(); } + /** + * Initializes the PatientBuilder with an nric, + */ + public PatientBuilder(Ic nric) { + name = new Name(DEFAULT_NAME); + phone = new Phone(DEFAULT_PHONE); + emergencyContact = new Phone(DEFAULT_EMERGENCY_CONTACT); + email = new Email(DEFAULT_EMAIL); + address = new Address(DEFAULT_ADDRESS); + remark = new Remark(DEFAULT_REMARK); + gender = new Gender(DEFAULT_GENDER); + ic = nric; + condition = new Condition(DEFAULT_CONDITION); + bloodType = new BloodType(DEFAULT_BLOODTYPE); + tags = new HashSet<>(); + appointments = new HashSet<>(); + } /** * Initializes the PatientBuilder with the data of {@code patientToCopy}. From 6982e55e128888365186c00138073cffba6a31af Mon Sep 17 00:00:00 2001 From: Tanveer Singh Date: Thu, 2 Nov 2023 21:36:29 +0800 Subject: [PATCH 2/3] Add UG for find-appt --- docs/UserGuide.md | 22 +++++++++++++++++-- .../commands/FindAppointmentCommand.java | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 05a56e0c57c..82d72af5a5a 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -5,7 +5,7 @@ title: User Guide MediLink Contacts(MLC) is a **desktop app for managing patients and doctors details, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, MLC -can get your patients management tasks done faster than traditional GUI apps. +cang get your patients management tasks done faster than traditional GUI apps. ### Table of Contents @@ -145,7 +145,7 @@ Format: `new-appt pic/IC dic/IC time/yyyy-MM-dd HH:mm:ss` **:information_source: Take Note:**
- All fields are Required. -- EMAIL must follow the specified format (ie. `yyyy-MM-dd HH:mm:ss`). +- TIME must follow the specified format (ie. `yyyy-MM-dd HH:mm:ss`). - PATIENT must contain the valid IC of a Patient in the Database. - DOCTOR must contain the valid IC of a Doctor in the Database. @@ -155,6 +155,24 @@ Examples: * `new-appt pic/T0123456H dic/S9851586G time/2023-10-30T13:00:00` +### Finding an Appointment : `find-appt` + +Finds all appointments that involve a specific patient/doctor. + +Format: `find-appt IC` + +
+**:information_source: Take Note:**
+ +- All fields are Required. +- PATIENT or DOCTOR must contain the valid IC of a Patient in the Database. + +
+ +Examples: + +* `find-appt T0123456H` + ### Listing all persons : `list` Shows a list of all persons in the MediLink Contacts. diff --git a/src/main/java/seedu/address/logic/commands/FindAppointmentCommand.java b/src/main/java/seedu/address/logic/commands/FindAppointmentCommand.java index 6e470fcadbd..c48ccddb21b 100644 --- a/src/main/java/seedu/address/logic/commands/FindAppointmentCommand.java +++ b/src/main/java/seedu/address/logic/commands/FindAppointmentCommand.java @@ -27,7 +27,7 @@ public class FindAppointmentCommand extends Command { private final Predicate predicate; /** * Finds and lists all persons in address book whose attributes match the predicate. - * Keyword matching is case insensitive. + * Keyword matching is case-insensitive. */ public FindAppointmentCommand(Predicate predicate) { requireNonNull(predicate); From 8b0faace307f725218768a84d5dad6c82e62f723 Mon Sep 17 00:00:00 2001 From: Tanveer Singh Date: Thu, 2 Nov 2023 21:37:41 +0800 Subject: [PATCH 3/3] Fix mistake in UG --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 82d72af5a5a..939518d9ebe 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -165,7 +165,7 @@ Format: `find-appt IC` **:information_source: Take Note:**
- All fields are Required. -- PATIENT or DOCTOR must contain the valid IC of a Patient in the Database. +- IC must contain the valid IC of a Patient or Doctor in the Database.