Repository: AY2425S2-CS2103T-T17-2/tp
Pull request #94: Change Last Visit Command format
Author: login: Luoq1-Xu
Created: 2025-03-25T16:33:12Z | Merged: 2025-03-27T03:18:41Z

Change lastVisit command to take in 1 input which is a date `String` of format `YYYY-MM-DD`. Updated tests accordingly.

Closes #85 

Linked issue #85: Change Last Visit Command format
Change the LastVisit command to require 1 date (in the form of a YYYY-MM-DD string)

Diff:
diff --git a/src/main/java/seedu/address/logic/Messages.java b/src/main/java/seedu/address/logic/Messages.java
index b2b6afb91b5..27d4a1860c3 100644
--- a/src/main/java/seedu/address/logic/Messages.java
+++ b/src/main/java/seedu/address/logic/Messages.java
@@ -18,6 +18,10 @@ public class Messages {
     public static final String MESSAGE_PATIENTS_LISTED_OVERVIEW = "%1$d patients listed!";
     public static final String MESSAGE_DUPLICATE_FIELDS =
                 "Multiple values specified for the following single-valued field(s): ";
+    public static final String MESSAGE_INVALID_DATE_FORMAT = "Invalid date format! Date must be provided "
+            + "in the following format: YYYY-MM-DD. Example: 2025-10-02";
+    public static final String MESSAGE_INVALID_LAST_VISIT_DATE = "The date provided is invalid! Please ensure that "
+            + "the last visit date given is not in the future.";
 
     /**
      * Returns an error message indicating the duplicate prefixes.
diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java
index 25f57c67422..556d2e60768 100644
--- a/src/main/java/seedu/address/logic/commands/AddCommand.java
+++ b/src/main/java/seedu/address/logic/commands/AddCommand.java
@@ -2,11 +2,11 @@
 
 import static java.util.Objects.requireNonNull;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_VISIT;
 
 import seedu.address.commons.util.ToStringBuilder;
 import seedu.address.logic.Messages;
@@ -27,14 +27,14 @@ public class AddCommand extends Command {
             + PREFIX_PHONE + "PHONE "
             + PREFIX_EMAIL + "EMAIL "
             + PREFIX_ADDRESS + "ADDRESS "
-            + PREFIX_VISIT + "LAST_VISIT_INFO "
+            + PREFIX_DATE + "LAST_VISIT_INFO "
             + "[" + PREFIX_TAG + "TAG]...\n"
             + "Example: " + COMMAND_WORD + " "
             + PREFIX_NAME + "John Doe "
             + PREFIX_PHONE + "98765432 "
             + PREFIX_EMAIL + "johnd@example.com "
             + PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 "
-            + PREFIX_VISIT + "2025-01-01, low on xanax "
+            + PREFIX_DATE + "2025-01-01, low on xanax "
             + PREFIX_TAG + "friends "
             + PREFIX_TAG + "owesMoney";
 
diff --git a/src/main/java/seedu/address/logic/commands/DelLastVisitCommand.java b/src/main/java/seedu/address/logic/commands/DelLastVisitCommand.java
index 6422cdc3f74..6242ba97c1a 100644
--- a/src/main/java/seedu/address/logic/commands/DelLastVisitCommand.java
+++ b/src/main/java/seedu/address/logic/commands/DelLastVisitCommand.java
@@ -11,7 +11,7 @@
 import seedu.address.model.patient.Patient;
 
 /**
- * Deletes the last visit info of a patient by setting it to "NA".
+ * Deletes the last visit info of a patient by setting it to null.
  */
 public class DelLastVisitCommand extends Command {
     public static final String COMMAND_WORD = "delLastVisit";
@@ -23,16 +23,17 @@ public class DelLastVisitCommand extends Command {
             + "Parameters: INDEX (must be a positive integer) "
             + '\n'
             + "Example: " + COMMAND_WORD + " 1 ";
+    public static final String NONE = "None";
 
     private final Index index;
 
     /**
      * Creates a {@code DelLastVisitCommand}.
      *
-     * @param index The index of the patient to modify.
+     * @param ind The index of the patient to modify.
      */
-    public DelLastVisitCommand(Index index) {
-        this.index = index;
+    public DelLastVisitCommand(Index ind) {
+        index = ind;
     }
 
     /**
@@ -41,8 +42,8 @@ public DelLastVisitCommand(Index index) {
      * @param patient The newly modified patient.
      * @return The msg to send upon successful deletion.
      */
-    private String generateSuccessMessage(Patient patient) {
-        return "Last visit info successfully deleted from "
+    public String generateSuccessMessage(Patient patient) {
+        return "Last visit date successfully deleted from "
                 + patient.getName();
     }
 
diff --git a/src/main/java/seedu/address/logic/commands/LastVisitCommand.java b/src/main/java/seedu/address/logic/commands/LastVisitCommand.java
index 2689c0b0566..c11c678c14b 100644
--- a/src/main/java/seedu/address/logic/commands/LastVisitCommand.java
+++ b/src/main/java/seedu/address/logic/commands/LastVisitCommand.java
@@ -1,7 +1,7 @@
 package seedu.address.logic.commands;
 
 import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_VISIT;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
 import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PATIENTS;
 
 import java.util.List;
@@ -14,7 +14,7 @@
 import seedu.address.model.patient.Patient;
 
 /**
- * Changes the remark of an existing patient in the address book.
+ * Changes the Last Visit of an existing patient in the address book.
  */
 public class LastVisitCommand extends Command {
 
@@ -24,18 +24,16 @@ public class LastVisitCommand extends Command {
             + "by the index number used in the last patient listing. "
             + "Existing last visit will be overwritten by the input.\n"
             + "Parameters: INDEX (must be a positive integer) "
-            + PREFIX_VISIT + "[LAST VISIT]\n"
+            + PREFIX_DATE + "[LAST VISIT DATE]\n"
             + "Example: " + COMMAND_WORD + " 1 "
-            + PREFIX_VISIT + "Last visited on 5 March 2025. Followed medication schedule well.";
-
-    public static final String MESSAGE_ADD_LAST_VISIT_SUCCESS = "Added last visit to patient: %1$s";
-    public static final String MESSAGE_DELETE_LAST_VISIT_SUCCESS = "Removed last visit from patient: %1$s";
+            + PREFIX_DATE + "2025-05-01";
 
+    public static final String MESSAGE_ADD_LAST_VISIT_SUCCESS = "Set last visit of patient %1$s to %2$s";
     private final Index index;
     private final LastVisit lastVisit;
 
     /**
-     * @param index of the patient in the filtered patient list to edit the remark
+     * @param index of the patient in the filtered patient list to edit the Last Visit
      * @param lastVisit of the patient to be updated to
      */
     public LastVisitCommand(Index index, LastVisit lastVisit) {
@@ -63,11 +61,12 @@ public CommandResult execute(Model model) throws CommandException {
     }
 
     /**
-     * Generates a command execution success message based on whether the remark is added to or removed from
+     * Generates a command execution success message after setting the last visit date.
      * {@code patientToEdit}.
      */
     private String generateSuccessMessage(Patient patientToEdit) {
-        return String.format(MESSAGE_ADD_LAST_VISIT_SUCCESS, patientToEdit.getName());
+        return String.format(MESSAGE_ADD_LAST_VISIT_SUCCESS,
+                patientToEdit.getName(), lastVisit.lastVisitDate.toString());
     }
 
     @Override
diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java
index 54a9360e82c..745b78f3bf0 100644
--- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java
@@ -2,11 +2,11 @@
 
 import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_VISIT;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -37,19 +37,19 @@ public class AddCommandParser implements Parser<AddCommand> {
     public AddCommand parse(String args) throws ParseException {
         ArgumentMultimap argMultimap =
                 ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL,
-                        PREFIX_ADDRESS, PREFIX_VISIT, PREFIX_TAG);
+                        PREFIX_ADDRESS, PREFIX_DATE, PREFIX_TAG);
 
         if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)
                 || !argMultimap.getPreamble().isEmpty()) {
             throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
         }
 
-        argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_VISIT);
+        argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_DATE);
         Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());
         Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());
         Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());
         Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());
-        LastVisit lastVisit = ParserUtil.parseLastVisit(argMultimap.getValue(PREFIX_VISIT).get());
+        LastVisit lastVisit = ParserUtil.parseLastVisit(argMultimap.getValue(PREFIX_DATE).get());
         Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));
         Set<Medicine> medicines = new HashSet<>(); // Add command does not support adding medicines straight away
 
diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java
index 6026f13dc76..bc6981881eb 100644
--- a/src/main/java/seedu/address/logic/parser/CliSyntax.java
+++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java
@@ -9,7 +9,7 @@ public class CliSyntax {
     public static final Prefix PREFIX_NAME = new Prefix("n/");
     public static final Prefix PREFIX_PHONE = new Prefix("p/");
     public static final Prefix PREFIX_EMAIL = new Prefix("e/");
-    public static final Prefix PREFIX_VISIT = new Prefix("v/");
+    public static final Prefix PREFIX_DATE = new Prefix("d/");
     public static final Prefix PREFIX_ADDRESS = new Prefix("a/");
     public static final Prefix PREFIX_TAG = new Prefix("t/");
     public static final Prefix PREFIX_MEDICINE = new Prefix("m/");
diff --git a/src/main/java/seedu/address/logic/parser/LastVisitCommandParser.java b/src/main/java/seedu/address/logic/parser/LastVisitCommandParser.java
index 83dc37298cb..34e5e10c99c 100644
--- a/src/main/java/seedu/address/logic/parser/LastVisitCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/LastVisitCommandParser.java
@@ -2,10 +2,14 @@
 
 import static java.util.Objects.requireNonNull;
 import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_VISIT;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_DATE_FORMAT;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_LAST_VISIT_DATE;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeParseException;
 
 import seedu.address.commons.core.index.Index;
-import seedu.address.commons.exceptions.IllegalValueException;
 import seedu.address.logic.commands.LastVisitCommand;
 import seedu.address.logic.parser.exceptions.ParseException;
 import seedu.address.model.patient.LastVisit;
@@ -21,18 +25,37 @@ public class LastVisitCommandParser implements Parser<LastVisitCommand> {
      */
     public LastVisitCommand parse(String args) throws ParseException {
         requireNonNull(args);
-        ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_VISIT);
+        ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_DATE);
 
         Index index;
         try {
             index = ParserUtil.parseIndex(argMultimap.getPreamble());
-        } catch (IllegalValueException ive) {
+        } catch (ParseException pe) {
             throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
-                    LastVisitCommand.MESSAGE_USAGE), ive);
+                    LastVisitCommand.MESSAGE_USAGE), pe);
+        }
+
+        if (!argMultimap.getValue(PREFIX_DATE).isPresent()) {
+            throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
+                    LastVisitCommand.MESSAGE_USAGE));
+        }
+
+        String dateString = argMultimap.getValue(PREFIX_DATE).get();
+
+        LocalDate date;
+
+        // Try to parse the input string into a LocalDate
+        try {
+            date = LocalDate.parse(dateString);
+        } catch (DateTimeParseException e) {
+            throw new ParseException(MESSAGE_INVALID_DATE_FORMAT);
         }
 
-        String remark = argMultimap.getValue(PREFIX_VISIT).orElse("");
+        // Check if the date is valid
+        if (!LastVisit.isValidLastVisit(date)) {
+            throw new ParseException(MESSAGE_INVALID_LAST_VISIT_DATE);
+        }
 
-        return new LastVisitCommand(index, new LastVisit(remark));
+        return new LastVisitCommand(index, new LastVisit(date));
     }
 }
diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java
index 9bf5873e199..12ba4a2a93d 100644
--- a/src/main/java/seedu/address/logic/parser/ParserUtil.java
+++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java
@@ -1,7 +1,10 @@
 package seedu.address.logic.parser;
 
 import static java.util.Objects.requireNonNull;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_DATE_FORMAT;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeParseException;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
@@ -83,18 +86,25 @@ public static Address parseAddress(String address) throws ParseException {
     }
 
     /**
-     * Parses a {@code String lastVisit} into an {@code lastVisit}.
+     * Parses a {@code String lastVisitDate} into a {@code LastVisit}.
      * Leading and trailing whitespaces will be trimmed.
      *
-     * @throws ParseException if the given {@code lastVisit} is invalid.
+     * @throws ParseException if the given {@code lastVisitDate} is invalid.
      */
-    public static LastVisit parseLastVisit(String lastVisit) throws ParseException {
-        requireNonNull(lastVisit);
-        String trimmedLastVisit = lastVisit.trim();
-        if (!LastVisit.isValidLastVisit(trimmedLastVisit)) {
+    public static LastVisit parseLastVisit(String lastVisitDateString) throws ParseException {
+        requireNonNull(lastVisitDateString);
+        String trimmedLastVisitDate = lastVisitDateString.trim();
+        LocalDate lastVisitDate;
+        try {
+            lastVisitDate = LocalDate.parse(trimmedLastVisitDate);
+        } catch (DateTimeParseException e) {
+            throw new ParseException(MESSAGE_INVALID_DATE_FORMAT);
+        }
+
+        if (!LastVisit.isValidLastVisit(lastVisitDate)) {
             throw new ParseException(LastVisit.MESSAGE_CONSTRAINTS);
         }
-        return new LastVisit(trimmedLastVisit);
+        return new LastVisit(lastVisitDate);
     }
 
     /**
diff --git a/src/main/java/seedu/address/model/patient/LastVisit.java b/src/main/java/seedu/address/model/patient/LastVisit.java
index 501d227cdbb..acc85a6706a 100644
--- a/src/main/java/seedu/address/model/patient/LastVisit.java
+++ b/src/main/java/seedu/address/model/patient/LastVisit.java
@@ -1,37 +1,36 @@
 package seedu.address.model.patient;
 
 import static java.util.Objects.requireNonNull;
+import static seedu.address.commons.util.AppUtil.checkArgument;
+
+import java.time.LocalDate;
 
 /**
- * Represents a patient's address in the address book.
+ * Represents a patient's last visit in the address book.
+ * Can be null.
  * Guarantees: immutable; is always valid
  */
 public class LastVisit {
 
     public static final String MESSAGE_CONSTRAINTS =
-            "Last visit can take any value, and it should not be blank";
-
-    /*
-     * The first character of the address must not be a whitespace,
-     * otherwise " " (a blank string) becomes a valid input.
-     */
-    public static final String VALIDATION_REGEX = "[^\\s].*";
+            "Last visit must take in a valid date of format YYYY-MM-DD";
 
-    public final String value;
+    public final LocalDate lastVisitDate;
 
     /**
-     * Constructs an {@code Address}.
+     * Constructs an {@code LastVisit}.
      *
-     * @param remark A valid address.
+     * @param lastVisitDate a valid last visit date.
      */
-    public LastVisit(String remark) {
-        requireNonNull(remark);
-        value = remark;
+    public LastVisit(LocalDate lastVisitDate) {
+        requireNonNull(lastVisitDate);
+        checkArgument(isValidLastVisit(lastVisitDate), MESSAGE_CONSTRAINTS);
+        this.lastVisitDate = lastVisitDate;
     }
 
     @Override
     public String toString() {
-        return value;
+        return "Last visit: " + lastVisitDate;
     }
 
     @Override
@@ -46,19 +45,24 @@ public boolean equals(Object other) {
         }
 
         LastVisit otherLastVisit = (LastVisit) other;
-        return value.equals(otherLastVisit.value);
+        return lastVisitDate.equals(otherLastVisit.lastVisitDate);
     }
 
     /**
-     * Returns if a given string is a valid lastVisit.
+     * Check if date given is a valid last visit date (cannot be more recent than current date).
      */
-    public static boolean isValidLastVisit(String test) {
-        return test.matches(VALIDATION_REGEX);
+    public static boolean isValidLastVisit(LocalDate testDate) {
+        if (testDate == null) {
+            return false;
+        }
+        LocalDate currentDate = LocalDate.now();
+        // Most recent last visit date can be today, but not after.
+        return testDate.isBefore(currentDate.plusDays(1));
     }
 
     @Override
     public int hashCode() {
-        return value.hashCode();
+        return lastVisitDate.hashCode();
     }
 
 }
diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java
index 7c1b6d42dca..2253d5717f3 100644
--- a/src/main/java/seedu/address/model/util/SampleDataUtil.java
+++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java
@@ -1,5 +1,6 @@
 package seedu.address.model.util;
 
+import java.time.LocalDate;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Set;
@@ -20,11 +21,11 @@
  * Contains utility methods for populating {@code AddressBook} with sample data.
  */
 public class SampleDataUtil {
-    public static final LastVisit EMPTY_LAST_VISIT = new LastVisit("");
+    public static final LastVisit EMPTY_LAST_VISIT = new LastVisit(LocalDate.parse("1111-11-11"));
 
     public static final Set<Medicine> EMPTY_MEDICINES = Collections.emptySet();
 
-    public static Patient[] getSamplepatients() {
+    public static Patient[] getSamplePatients() {
         return new Patient[] {
             new Patient(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"),
                 new Address("Blk 30 Geylang Street 29, #06-40"), EMPTY_LAST_VISIT,
@@ -49,7 +50,7 @@ public static Patient[] getSamplepatients() {
 
     public static ReadOnlyAddressBook getSampleAddressBook() {
         AddressBook sampleAb = new AddressBook();
-        for (Patient samplePatient : getSamplepatients()) {
+        for (Patient samplePatient : getSamplePatients()) {
             sampleAb.addPatient(samplePatient);
         }
         return sampleAb;
diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPatient.java b/src/main/java/seedu/address/storage/JsonAdaptedPatient.java
index bf55c8da036..81ecef48fb2 100644
--- a/src/main/java/seedu/address/storage/JsonAdaptedPatient.java
+++ b/src/main/java/seedu/address/storage/JsonAdaptedPatient.java
@@ -9,6 +9,7 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import seedu.address.commons.exceptions.IllegalValueException;
+import seedu.address.logic.parser.ParserUtil;
 import seedu.address.model.medicine.Medicine;
 import seedu.address.model.patient.Address;
 import seedu.address.model.patient.Email;
@@ -34,7 +35,7 @@ class JsonAdaptedPatient {
     private final List<JsonAdaptedMed> meds = new ArrayList<>();
 
     /**
-     * Constructs a {@code JsonAdaptedpatient} with the given patient details.
+     * Constructs a {@code JsonAdaptedPatient} with the given patient details.
      */
     @JsonCreator
     public JsonAdaptedPatient(@JsonProperty("name") String name, @JsonProperty("phone") String phone,
@@ -64,7 +65,7 @@ public JsonAdaptedPatient(Patient source) {
         email = source.getEmail().value;
         address = source.getAddress().value;
         if (!(source.getLastVisit() == null)) {
-            lastVisit = source.getLastVisit().value;
+            lastVisit = source.getLastVisit().lastVisitDate.toString();
         } else {
             lastVisit = null;
         }
@@ -123,16 +124,9 @@ public Patient toModelType() throws IllegalValueException {
             throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);
         }
         final Address modelAddress = new Address(address);
-
-        // if (lastVisit == null) {
-        //     throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT,
-        //             LastVisit.class.getSimpleName()));
-        // }
-        // final LastVisit modelLastVisit = new LastVisit(lastVisit);
-
         final LastVisit modelLastVisit;
         if (lastVisit != null) {
-            modelLastVisit = new LastVisit(lastVisit);
+            modelLastVisit = ParserUtil.parseLastVisit(lastVisit);
         } else {
             modelLastVisit = null;
         }
diff --git a/src/main/java/seedu/address/ui/PatientCard.java b/src/main/java/seedu/address/ui/PatientCard.java
index f7d6ddaa648..77afc7087c2 100644
--- a/src/main/java/seedu/address/ui/PatientCard.java
+++ b/src/main/java/seedu/address/ui/PatientCard.java
@@ -57,7 +57,7 @@ public PatientCard(Patient patient, int displayedIndex) {
         address.setText(patient.getAddress().value);
         email.setText(patient.getEmail().value);
         if (!(patient.getLastVisit() == null)) {
-            lastVisit.setText("Last visit: " + patient.getLastVisit().value);
+            lastVisit.setText(patient.getLastVisit().toString());
         } else {
             lastVisit.setText("Last visit: ");
         }
diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicatePatientsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/duplicatePatientsAddressBook.json
index 19f698de391..75b69b48be8 100644
--- a/src/test/data/JsonSerializableAddressBookTest/duplicatePatientsAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/duplicatePatientsAddressBook.json
@@ -4,13 +4,13 @@
     "phone": "94351253",
     "email": "alice@example.com",
     "address": "123, Jurong West Ave 6, #08-111",
-    "last visit": "Last visited on 5 March 2025.",
+    "last visit": "2020-01-01",
     "tags": [ "friends" ]
   }, {
     "name": "Alice Pauline",
     "phone": "94351253",
     "email": "pauline@example.com",
     "address": "4th street",
-    "last visit": "Last visited on 5 March 2025."
+    "last visit": "2021-01-01"
   } ]
 }
diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalPatientsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalPatientsAddressBook.json
index 76953a04d31..baf4c555f93 100644
--- a/src/test/data/JsonSerializableAddressBookTest/typicalPatientsAddressBook.json
+++ b/src/test/data/JsonSerializableAddressBookTest/typicalPatientsAddressBook.json
@@ -5,7 +5,7 @@
     "phone": "94351253",
     "email": "alice@example.com",
     "address": "123, Jurong West Ave 6, #08-111",
-    "last visit": "Last visit on 5 March 2025.",
+    "last visit": "2022-01-01",
     "tags": [ "friends" ],
     "meds": [ "paracetamol" ]
   }, {
@@ -13,7 +13,7 @@
     "phone" : "98765432",
     "email" : "johnd@example.com",
     "address" : "311, Clementi Ave 2, #02-25",
-    "last visit": "Last visit on 25 February 2025.",
+    "last visit": "2025-02-25",
     "tags" : [ "owesMoney", "friends" ],
     "meds": [ "penicillin" ]
   }, {
@@ -21,35 +21,35 @@
     "phone" : "95352563",
     "email" : "heinz@example.com",
     "address" : "wall street",
-    "last visit": "1",
+    "last visit": "2021-02-01",
     "tags" : [ ]
   }, {
     "name" : "Daniel Meier",
     "phone" : "87652533",
     "email" : "cornelia@example.com",
     "address" : "10th street",
-    "last visit": "2",
+    "last visit": "2019-01-01",
     "tags" : [ "friends" ]
   }, {
     "name" : "Elle Meyer",
     "phone" : "9482224",
     "email" : "werner@example.com",
     "address" : "michegan ave",
-    "last visit": "3",
+    "last visit": "2018-01-01",
     "tags" : [ ]
   }, {
     "name" : "Fiona Kunz",
     "phone" : "9482427",
     "email" : "lydia@example.com",
     "address" : "little tokyo",
-    "last visit": "4",
+    "last visit": "2017-01-01",
     "tags" : [ ]
   }, {
     "name" : "George Best",
     "phone" : "9482442",
     "email" : "anna@example.com",
     "address" : "4th street",
-    "last visit": "5",
+    "last visit": "2016-01-01",
     "tags" : [ ]
   } ]
 }
diff --git a/src/test/java/seedu/address/logic/LogicManagerTest.java b/src/test/java/seedu/address/logic/LogicManagerTest.java
index 79d0923f4ce..4911826be92 100644
--- a/src/test/java/seedu/address/logic/LogicManagerTest.java
+++ b/src/test/java/seedu/address/logic/LogicManagerTest.java
@@ -85,7 +85,7 @@ public void execute_storageThrowsAdException_throwsCommandException() {
     }
 
     @Test
-    public void getFilteredpatientList_modifyList_throwsUnsupportedOperationException() {
+    public void getFilteredPatientList_modifyList_throwsUnsupportedOperationException() {
         assertThrows(UnsupportedOperationException.class, () -> logic.getFilteredpatientList().remove(0));
     }
 
diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
index ea9a770baf0..68d72848665 100644
--- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
+++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java
@@ -3,11 +3,11 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_VISIT;
 import static seedu.address.testutil.Assert.assertThrows;
 
 import java.util.ArrayList;
@@ -35,8 +35,8 @@ public class CommandTestUtil {
     public static final String VALID_EMAIL_BOB = "bob@example.com";
     public static final String VALID_ADDRESS_AMY = "Block 312, Amy Street 1";
     public static final String VALID_ADDRESS_BOB = "Block 123, Bobby Street 3";
-    public static final String VALID_VISIT_AMY = "Last visit on 5 March 2025.";
-    public static final String VALID_VISIT_BOB = "Last visit on 5 March 2025.";
+    public static final String VALID_LASTVISITDATE_AMY = "2025-01-01";
+    public static final String VALID_LASTVISITDATE_BOB = "2025-01-02";
     public static final String VALID_TAG_HUSBAND = "husband";
     public static final String VALID_TAG_FRIEND = "friend";
     public static final String VALID_MEDICATION_AMY = "paracetamol";
@@ -50,8 +50,8 @@ public class CommandTestUtil {
     public static final String EMAIL_DESC_BOB = " " + PREFIX_EMAIL + VALID_EMAIL_BOB;
     public static final String ADDRESS_DESC_AMY = " " + PREFIX_ADDRESS + VALID_ADDRESS_AMY;
     public static final String ADDRESS_DESC_BOB = " " + PREFIX_ADDRESS + VALID_ADDRESS_BOB;
-    public static final String LAST_VISIT_AMY = " " + PREFIX_VISIT + VALID_VISIT_AMY;
-    public static final String LAST_VISIT_BOB = " " + PREFIX_VISIT + VALID_VISIT_BOB;
+    public static final String LAST_VISIT_AMY = " " + PREFIX_DATE + VALID_LASTVISITDATE_AMY;
+    public static final String LAST_VISIT_BOB = " " + PREFIX_DATE + VALID_LASTVISITDATE_BOB;
     public static final String TAG_DESC_FRIEND = " " + PREFIX_TAG + VALID_TAG_FRIEND;
     public static final String TAG_DESC_HUSBAND = " " + PREFIX_TAG + VALID_TAG_HUSBAND;
 
@@ -59,15 +59,12 @@ public class CommandTestUtil {
     public static final String INVALID_PHONE_DESC = " " + PREFIX_PHONE + "911a"; // 'a' not allowed in phones
     public static final String INVALID_EMAIL_DESC = " " + PREFIX_EMAIL + "bob!yahoo"; // missing '@' symbol
     public static final String INVALID_ADDRESS_DESC = " " + PREFIX_ADDRESS; // empty string not allowed for addresses
-    public static final String INVALID_VISIT_DESC = " " + PREFIX_VISIT; // empty string not allowed for last visit
+    public static final String INVALID_VISIT_DESC = " " + PREFIX_DATE; // empty string not allowed for last visit
     public static final String INVALID_TAG_DESC = " " + PREFIX_TAG + "hubby*"; // '*' not allowed in tags
 
     public static final String PREAMBLE_WHITESPACE = "\t  \r  \n";
     public static final String PREAMBLE_NON_EMPTY = "NonEmptyPreamble";
 
-    public static final String VALID_REMARK_AMY = "Like skiing.";
-    public static final String VALID_REMARK_BOB = "Favourite pastime: Eating";
-
     public static final EditCommand.EditpatientDescriptor DESC_AMY;
     public static final EditCommand.EditpatientDescriptor DESC_BOB;
 
@@ -126,7 +123,7 @@ public static void assertCommandFailure(Command command, Model actualModel, Stri
      * Updates {@code model}'s filtered list to show only the patient at the given {@code targetIndex} in the
      * {@code model}'s address book.
      */
-    public static void showpatientAtIndex(Model model, Index targetIndex) {
+    public static void showPatientAtIndex(Model model, Index targetIndex) {
         assertTrue(targetIndex.getZeroBased() < model.getFilteredPatientList().size());
 
         Patient patient = model.getFilteredPatientList().get(targetIndex.getZeroBased());
diff --git a/src/test/java/seedu/address/logic/commands/DelLastVisitCommandTest.java b/src/test/java/seedu/address/logic/commands/DelLastVisitCommandTest.java
index df9c998e36f..625fba07e13 100644
--- a/src/test/java/seedu/address/logic/commands/DelLastVisitCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/DelLastVisitCommandTest.java
@@ -22,7 +22,7 @@ public void execute_onePatient_normal() {
         // version after running `delLastVisit`.
         Patient p0 = TypicalPatients.ALICE;
         p0 = new PatientBuilder(p0)
-                .withLastVisit("Meduka become Meguca")
+                .withLastVisit("2025-01-01")
                 .build();
         Patient p1 = new PatientBuilder(p0)
                 .withLastVisit(null)
diff --git a/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java b/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java
index af9fc075961..28c5e778b85 100644
--- a/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java
@@ -5,7 +5,7 @@
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;
 import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
-import static seedu.address.logic.commands.CommandTestUtil.showpatientAtIndex;
+import static seedu.address.logic.commands.CommandTestUtil.showPatientAtIndex;
 import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PATIENT;
 import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PATIENT;
 import static seedu.address.testutil.TypicalPatients.getTypicalAddressBook;
@@ -25,7 +25,7 @@
  */
 public class DeleteCommandTest {
 
-    private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
+    private final Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
 
     @Test
     public void execute_validIndexUnfilteredList_success() {
@@ -51,7 +51,7 @@ public void execute_invalidIndexUnfilteredList_throwsCommandException() {
 
     @Test
     public void execute_validIndexFilteredList_success() {
-        showpatientAtIndex(model, INDEX_FIRST_PATIENT);
+        showPatientAtIndex(model, INDEX_FIRST_PATIENT);
 
         Patient patientToDelete = model.getFilteredPatientList().get(INDEX_FIRST_PATIENT.getZeroBased());
         DeleteCommand deleteCommand = new DeleteCommand(INDEX_FIRST_PATIENT);
@@ -61,14 +61,14 @@ public void execute_validIndexFilteredList_success() {
 
         Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs());
         expectedModel.deletePatient(patientToDelete);
-        showNopatient(expectedModel);
+        showNoPatient(expectedModel);
 
         assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel);
     }
 
     @Test
     public void execute_invalidIndexFilteredList_throwsCommandException() {
-        showpatientAtIndex(model, INDEX_FIRST_PATIENT);
+        showPatientAtIndex(model, INDEX_FIRST_PATIENT);
 
         Index outOfBoundIndex = INDEX_SECOND_PATIENT;
         // ensures that outOfBoundIndex is still in bounds of address book list
@@ -112,7 +112,7 @@ public void toStringMethod() {
     /**
      * Updates {@code model}'s filtered list to show no one.
      */
-    private void showNopatient(Model model) {
+    private void showNoPatient(Model model) {
         model.updateFilteredPatientList(p -> false);
 
         assertTrue(model.getFilteredPatientList().isEmpty());
diff --git a/src/test/java/seedu/address/logic/commands/EditCommandTest.java b/src/test/java/seedu/address/logic/commands/EditCommandTest.java
index a1fdbaa7a77..5d08a57cb79 100644
--- a/src/test/java/seedu/address/logic/commands/EditCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/EditCommandTest.java
@@ -10,7 +10,7 @@
 import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;
 import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;
 import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
-import static seedu.address.logic.commands.CommandTestUtil.showpatientAtIndex;
+import static seedu.address.logic.commands.CommandTestUtil.showPatientAtIndex;
 import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PATIENT;
 import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PATIENT;
 import static seedu.address.testutil.TypicalPatients.getTypicalAddressBook;
@@ -33,7 +33,7 @@
  */
 public class EditCommandTest {
 
-    private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
+    private final Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
 
     @Test
     public void execute_allFieldsSpecifiedUnfilteredList_success() {
@@ -52,8 +52,8 @@ public void execute_allFieldsSpecifiedUnfilteredList_success() {
 
     @Test
     public void execute_someFieldsSpecifiedUnfilteredList_success() {
-        Index indexLastpatient = Index.fromOneBased(model.getFilteredPatientList().size());
-        Patient lastPatient = model.getFilteredPatientList().get(indexLastpatient.getZeroBased());
+        Index indexLastPatient = Index.fromOneBased(model.getFilteredPatientList().size());
+        Patient lastPatient = model.getFilteredPatientList().get(indexLastPatient.getZeroBased());
 
         PatientBuilder patientInList = new PatientBuilder(lastPatient);
         Patient editedPatient = patientInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)
@@ -61,7 +61,7 @@ public void execute_someFieldsSpecifiedUnfilteredList_success() {
 
         EditpatientDescriptor descriptor = new EditPatientDescriptorBuilder().withName(VALID_NAME_BOB)
                 .withPhone(VALID_PHONE_BOB).withTags(VALID_TAG_HUSBAND).build();
-        EditCommand editCommand = new EditCommand(indexLastpatient, descriptor);
+        EditCommand editCommand = new EditCommand(indexLastPatient, descriptor);
 
         String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PATIENT_SUCCESS,
                 Messages.format(editedPatient));
@@ -86,7 +86,7 @@ public void execute_noFieldSpecifiedUnfilteredList_success() {
 
     @Test
     public void execute_filteredList_success() {
-        showpatientAtIndex(model, INDEX_FIRST_PATIENT);
+        showPatientAtIndex(model, INDEX_FIRST_PATIENT);
 
         Patient patientInFilteredList = model.getFilteredPatientList().get(INDEX_FIRST_PATIENT.getZeroBased());
         Patient editedPatient = new PatientBuilder(patientInFilteredList).withName(VALID_NAME_BOB).build();
@@ -113,7 +113,7 @@ public void execute_duplicatePatientUnfilteredList_failure() {
 
     @Test
     public void execute_duplicatePatientFilteredList_failure() {
-        showpatientAtIndex(model, INDEX_FIRST_PATIENT);
+        showPatientAtIndex(model, INDEX_FIRST_PATIENT);
 
         // edit patient in filtered list into a duplicate in address book
         Patient patientInList = model.getAddressBook().getpatientList().get(INDEX_SECOND_PATIENT.getZeroBased());
@@ -138,7 +138,7 @@ public void execute_invalidPatientIndexUnfilteredList_failure() {
      */
     @Test
     public void execute_invalidPatientIndexFilteredList_failure() {
-        showpatientAtIndex(model, INDEX_FIRST_PATIENT);
+        showPatientAtIndex(model, INDEX_FIRST_PATIENT);
         Index outOfBoundIndex = INDEX_SECOND_PATIENT;
         // ensures that outOfBoundIndex is still in bounds of address book list
         assertTrue(outOfBoundIndex.getZeroBased() < model.getAddressBook().getpatientList().size());
diff --git a/src/test/java/seedu/address/logic/commands/LastVisitCommandTest.java b/src/test/java/seedu/address/logic/commands/LastVisitCommandTest.java
index 0b3698e9b55..a4f36ee1f08 100644
--- a/src/test/java/seedu/address/logic/commands/LastVisitCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/LastVisitCommandTest.java
@@ -2,15 +2,17 @@
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static seedu.address.logic.commands.CommandTestUtil.VALID_REMARK_AMY;
-import static seedu.address.logic.commands.CommandTestUtil.VALID_REMARK_BOB;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_LASTVISITDATE_AMY;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_LASTVISITDATE_BOB;
 import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure;
 import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
-import static seedu.address.logic.commands.CommandTestUtil.showpatientAtIndex;
+import static seedu.address.logic.commands.CommandTestUtil.showPatientAtIndex;
 import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PATIENT;
 import static seedu.address.testutil.TypicalIndexes.INDEX_SECOND_PATIENT;
 import static seedu.address.testutil.TypicalPatients.getTypicalAddressBook;
 
+import java.time.LocalDate;
+
 import org.junit.jupiter.api.Test;
 
 import seedu.address.commons.core.index.Index;
@@ -24,41 +26,24 @@
 import seedu.address.testutil.PatientBuilder;
 
 /**
- * Contains integration tests (interaction with the Model) and unit tests for RemarkCommand.
+ * Contains integration tests (interaction with the Model) and unit tests for LastVisitCommand.
  */
 public class LastVisitCommandTest {
 
-    private static final String REMARK_STUB = "Some remark";
+    private static final String LASTVISIT_STUB = "2025-01-01";
 
-    private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
+    private final Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
 
     @Test
     public void execute_addRemarkUnfilteredList_success() {
         Patient firstpatient = model.getFilteredPatientList().get(INDEX_FIRST_PATIENT.getZeroBased());
-        Patient editedpatient = new PatientBuilder(firstpatient).withLastVisit(REMARK_STUB).build();
-
-        LastVisitCommand lastVisitCommand = new LastVisitCommand(INDEX_FIRST_PATIENT,
-                new LastVisit(editedpatient.getLastVisit().value));
-
-        String expectedMessage = String.format(LastVisitCommand.MESSAGE_ADD_LAST_VISIT_SUCCESS,
-                editedpatient.getName());
-
-        Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
-        expectedModel.setPatient(firstpatient, editedpatient);
-
-        assertCommandSuccess(lastVisitCommand, model, expectedMessage, expectedModel);
-    }
-
-    @Test
-    public void execute_deleteRemarkUnfilteredList_success() {
-        Patient firstpatient = model.getFilteredPatientList().get(INDEX_FIRST_PATIENT.getZeroBased());
-        Patient editedpatient = new PatientBuilder(firstpatient).withLastVisit("").build();
+        Patient editedpatient = new PatientBuilder(firstpatient).withLastVisit(LASTVISIT_STUB).build();
 
         LastVisitCommand lastVisitCommand = new LastVisitCommand(INDEX_FIRST_PATIENT,
-                new LastVisit(editedpatient.getLastVisit().toString()));
+                new LastVisit(editedpatient.getLastVisit().lastVisitDate));
 
         String expectedMessage = String.format(LastVisitCommand.MESSAGE_ADD_LAST_VISIT_SUCCESS,
-                editedpatient.getName());
+                editedpatient.getName(), editedpatient.getLastVisit().lastVisitDate.toString());
 
         Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
         expectedModel.setPatient(firstpatient, editedpatient);
@@ -68,29 +53,30 @@ public void execute_deleteRemarkUnfilteredList_success() {
 
     @Test
     public void execute_filteredList_success() {
-        showpatientAtIndex(model, INDEX_FIRST_PATIENT);
+        showPatientAtIndex(model, INDEX_FIRST_PATIENT);
 
-        Patient firstpatient = model.getFilteredPatientList().get(INDEX_FIRST_PATIENT.getZeroBased());
-        Patient editedpatient = new PatientBuilder(model.getFilteredPatientList()
+        Patient firstPatient = model.getFilteredPatientList().get(INDEX_FIRST_PATIENT.getZeroBased());
+        Patient editedPatient = new PatientBuilder(model.getFilteredPatientList()
                 .get(INDEX_FIRST_PATIENT.getZeroBased()))
-                .withLastVisit(REMARK_STUB).build();
+                .withLastVisit(LASTVISIT_STUB).build();
 
         LastVisitCommand lastVisitCommand = new LastVisitCommand(INDEX_FIRST_PATIENT,
-                new LastVisit(editedpatient.getLastVisit().value));
+                new LastVisit(editedPatient.getLastVisit().lastVisitDate));
 
         String expectedMessage = String.format(LastVisitCommand.MESSAGE_ADD_LAST_VISIT_SUCCESS,
-                editedpatient.getName());
+                editedPatient.getName(), editedPatient.getLastVisit().lastVisitDate.toString());
 
         Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
-        expectedModel.setPatient(firstpatient, editedpatient);
+        expectedModel.setPatient(firstPatient, editedPatient);
 
         assertCommandSuccess(lastVisitCommand, model, expectedMessage, expectedModel);
     }
 
     @Test
-    public void execute_invalidpatientIndexUnfilteredList_failure() {
+    public void execute_invalidPatientIndexUnfilteredList_failure() {
         Index outOfBoundIndex = Index.fromOneBased(model.getFilteredPatientList().size() + 1);
-        LastVisitCommand lastVisitCommand = new LastVisitCommand(outOfBoundIndex, new LastVisit(VALID_REMARK_BOB));
+        LastVisitCommand lastVisitCommand = new LastVisitCommand(outOfBoundIndex,
+                new LastVisit(LocalDate.parse(VALID_LASTVISITDATE_BOB)));
 
         assertCommandFailure(lastVisitCommand, model, Messages.MESSAGE_INVALID_PATIENT_DISPLAYED_INDEX);
     }
@@ -100,13 +86,14 @@ public void execute_invalidpatientIndexUnfilteredList_failure() {
      * but smaller than size of address book
      */
     @Test
-    public void execute_invalidpatientIndexFilteredList_failure() {
-        showpatientAtIndex(model, INDEX_FIRST_PATIENT);
+    public void execute_invalidPatientIndexFilteredList_failure() {
+        showPatientAtIndex(model, INDEX_FIRST_PATIENT);
         Index outOfBoundIndex = INDEX_SECOND_PATIENT;
         // ensures that outOfBoundIndex is still in bounds of address book list
         assertTrue(outOfBoundIndex.getZeroBased() < model.getAddressBook().getpatientList().size());
 
-        LastVisitCommand lastVisitCommand = new LastVisitCommand(outOfBoundIndex, new LastVisit(VALID_REMARK_BOB));
+        LastVisitCommand lastVisitCommand = new LastVisitCommand(outOfBoundIndex,
+                new LastVisit(LocalDate.parse(VALID_LASTVISITDATE_BOB)));
 
         assertCommandFailure(lastVisitCommand, model, Messages.MESSAGE_INVALID_PATIENT_DISPLAYED_INDEX);
     }
@@ -114,11 +101,11 @@ public void execute_invalidpatientIndexFilteredList_failure() {
     @Test
     public void equals() {
         final LastVisitCommand standardCommand = new LastVisitCommand(INDEX_FIRST_PATIENT,
-                new LastVisit(VALID_REMARK_AMY));
+                new LastVisit(LocalDate.parse(VALID_LASTVISITDATE_AMY)));
 
         // same values -> returns true
         LastVisitCommand commandWithSameValues = new LastVisitCommand(INDEX_FIRST_PATIENT,
-                new LastVisit(VALID_REMARK_AMY));
+                new LastVisit(LocalDate.parse(VALID_LASTVISITDATE_AMY)));
         assertTrue(standardCommand.equals(commandWithSameValues));
 
         // same object -> returns true
@@ -132,10 +119,10 @@ public void equals() {
 
         // different index -> returns false
         assertFalse(standardCommand.equals(new LastVisitCommand(INDEX_SECOND_PATIENT,
-                new LastVisit(VALID_REMARK_AMY))));
+                new LastVisit(LocalDate.parse(VALID_LASTVISITDATE_AMY)))));
 
         // different remark -> returns false
         assertFalse(standardCommand.equals(new LastVisitCommand(INDEX_FIRST_PATIENT,
-                new LastVisit(VALID_REMARK_BOB))));
+                new LastVisit(LocalDate.parse(VALID_LASTVISITDATE_BOB)))));
     }
 }
diff --git a/src/test/java/seedu/address/logic/commands/ListCommandTest.java b/src/test/java/seedu/address/logic/commands/ListCommandTest.java
index d73410c5bcc..1a05bc24247 100644
--- a/src/test/java/seedu/address/logic/commands/ListCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/ListCommandTest.java
@@ -1,7 +1,7 @@
 package seedu.address.logic.commands;
 
 import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
-import static seedu.address.logic.commands.CommandTestUtil.showpatientAtIndex;
+import static seedu.address.logic.commands.CommandTestUtil.showPatientAtIndex;
 import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PATIENT;
 import static seedu.address.testutil.TypicalPatients.getTypicalAddressBook;
 
@@ -33,7 +33,7 @@ public void execute_listIsNotFiltered_showsSameList() {
 
     @Test
     public void execute_listIsFiltered_showsEverything() {
-        showpatientAtIndex(model, INDEX_FIRST_PATIENT);
+        showPatientAtIndex(model, INDEX_FIRST_PATIENT);
         assertCommandSuccess(new ListCommand(), model, ListCommand.MESSAGE_SUCCESS, expectedModel);
     }
 }
diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
index ca62f74e72c..db49987a4f7 100644
--- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
@@ -23,16 +23,16 @@
 import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_LASTVISITDATE_BOB;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND;
-import static seedu.address.logic.commands.CommandTestUtil.VALID_VISIT_BOB;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_VISIT;
 import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;
 import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;
 import static seedu.address.testutil.TypicalPatients.AMY;
@@ -51,7 +51,7 @@
 import seedu.address.testutil.PatientBuilder;
 
 public class AddCommandParserTest {
-    private AddCommandParser parser = new AddCommandParser();
+    private final AddCommandParser parser = new AddCommandParser();
 
     @Test
     public void parse_allFieldsPresent_success() {
@@ -96,14 +96,14 @@ public void parse_repeatedNonTagValue_failure() {
 
         // multiple last visits
         assertParseFailure(parser, LAST_VISIT_AMY + validExpectedpatientString,
-                Messages.getErrorMessageForDuplicatePrefixes(PREFIX_VISIT));
+                Messages.getErrorMessageForDuplicatePrefixes(PREFIX_DATE));
 
         // multiple fields repeated
         assertParseFailure(parser,
                 validExpectedpatientString + PHONE_DESC_AMY + EMAIL_DESC_AMY + NAME_DESC_AMY + ADDRESS_DESC_AMY
                         + validExpectedpatientString,
                 Messages.getErrorMessageForDuplicatePrefixes(PREFIX_NAME,
-                        PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE, PREFIX_VISIT));
+                        PREFIX_ADDRESS, PREFIX_EMAIL, PREFIX_PHONE, PREFIX_DATE));
 
         // invalid value followed by valid value
 
@@ -125,7 +125,7 @@ public void parse_repeatedNonTagValue_failure() {
 
         // invalid last visit
         assertParseFailure(parser, INVALID_VISIT_DESC + validExpectedpatientString,
-                Messages.getErrorMessageForDuplicatePrefixes(PREFIX_VISIT));
+                Messages.getErrorMessageForDuplicatePrefixes(PREFIX_DATE));
 
         // valid value followed by invalid value
 
@@ -147,7 +147,7 @@ public void parse_repeatedNonTagValue_failure() {
 
         // invalid last visit
         assertParseFailure(parser, validExpectedpatientString + INVALID_VISIT_DESC,
-                Messages.getErrorMessageForDuplicatePrefixes(PREFIX_VISIT));
+                Messages.getErrorMessageForDuplicatePrefixes(PREFIX_DATE));
     }
 
     @Test
@@ -190,7 +190,7 @@ public void parse_compulsoryFieldMissing_failure() {
 
         // all prefixes missing
         assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB
-                        + VALID_EMAIL_BOB + VALID_ADDRESS_BOB + VALID_VISIT_BOB,
+                        + VALID_EMAIL_BOB + VALID_ADDRESS_BOB + VALID_LASTVISITDATE_BOB,
                 expectedMessage);
     }
 
diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java
index 2e3ee8b69ce..6103988c5b0 100644
--- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java
@@ -61,7 +61,7 @@ public void parseCommand_edit() throws Exception {
         Patient patient = new PatientBuilder().build();
         EditpatientDescriptor descriptor = new EditPatientDescriptorBuilder(patient).build();
         EditCommand command = (EditCommand) parser.parseCommand(EditCommand.COMMAND_WORD + " "
-                + INDEX_FIRST_PATIENT.getOneBased() + " " + PatientUtil.getEditpatientDescriptorDetails(descriptor));
+                + INDEX_FIRST_PATIENT.getOneBased() + " " + PatientUtil.getEditPatientDescriptorDetails(descriptor));
         assertEquals(new EditCommand(INDEX_FIRST_PATIENT, descriptor), command);
     }
 
diff --git a/src/test/java/seedu/address/logic/parser/LastVisitCommandParserTest.java b/src/test/java/seedu/address/logic/parser/LastVisitCommandParserTest.java
index 678d026a425..3e36a3cbf79 100644
--- a/src/test/java/seedu/address/logic/parser/LastVisitCommandParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/LastVisitCommandParserTest.java
@@ -1,32 +1,37 @@
 package seedu.address.logic.parser;
 
 import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_VISIT;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_DATE_FORMAT;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_LAST_VISIT_DATE;
+import static seedu.address.logic.commands.CommandTestUtil.LAST_VISIT_AMY;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
 import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;
 import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;
 import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PATIENT;
 
+import java.time.LocalDate;
+
 import org.junit.jupiter.api.Test;
 
-import seedu.address.commons.core.index.Index;
 import seedu.address.logic.commands.LastVisitCommand;
 import seedu.address.model.patient.LastVisit;
 
 public class LastVisitCommandParserTest {
-    private LastVisitCommandParser parser = new LastVisitCommandParser();
-    private final String nonEmptyRemark = "Some remark.";
+
+    private static final String MESSAGE_INVALID_FORMAT =
+            String.format(MESSAGE_INVALID_COMMAND_FORMAT, LastVisitCommand.MESSAGE_USAGE);
+
+    private final LastVisitCommandParser parser = new LastVisitCommandParser();
+    private final String validDate = "2020-01-01";
+    private final String invalidFutureDate = "2030-01-02";
+    private final String invalidFormatDate = "2020-014-21";
 
     @Test
     public void parse_indexSpecified_success() {
-        // have remark
-        Index targetIndex = INDEX_FIRST_PATIENT;
-        String userInput = targetIndex.getOneBased() + " " + PREFIX_VISIT + nonEmptyRemark;
-        LastVisitCommand expectedCommand = new LastVisitCommand(INDEX_FIRST_PATIENT, new LastVisit(nonEmptyRemark));
-        assertParseSuccess(parser, userInput, expectedCommand);
-
-        // no remark
-        userInput = targetIndex.getOneBased() + " " + PREFIX_VISIT;
-        expectedCommand = new LastVisitCommand(INDEX_FIRST_PATIENT, new LastVisit(""));
+        // valid date given
+        String userInput = INDEX_FIRST_PATIENT.getOneBased() + " " + PREFIX_DATE + validDate;
+        LastVisitCommand expectedCommand = new LastVisitCommand(INDEX_FIRST_PATIENT,
+                new LastVisit(LocalDate.parse(validDate)));
         assertParseSuccess(parser, userInput, expectedCommand);
     }
 
@@ -38,6 +43,45 @@ public void parse_missingCompulsoryField_failure() {
         assertParseFailure(parser, LastVisitCommand.COMMAND_WORD, expectedMessage);
 
         // no index
-        assertParseFailure(parser, LastVisitCommand.COMMAND_WORD + " " + nonEmptyRemark, expectedMessage);
+        assertParseFailure(parser, LastVisitCommand.COMMAND_WORD + " " + validDate, expectedMessage);
+
+        // no prefix
+        assertParseFailure(parser, LastVisitCommand.COMMAND_WORD + " " + invalidFutureDate, expectedMessage);
+    }
+
+    @Test
+    public void parse_invalidPreamble_failure() {
+        // negative index
+        assertParseFailure(parser, "-5" + LAST_VISIT_AMY, MESSAGE_INVALID_FORMAT);
+
+        // zero index
+        assertParseFailure(parser, "0" + LAST_VISIT_AMY, MESSAGE_INVALID_FORMAT);
+
+        // invalid arguments being parsed as preamble
+        assertParseFailure(parser, "1 some random string", MESSAGE_INVALID_FORMAT);
+
+        // invalid prefix being parsed as preamble
+        assertParseFailure(parser, "1 i/ 2020-01-01", MESSAGE_INVALID_FORMAT);
     }
+
+
+    @Test
+    public void parse_invalidFutureDate_failure() {
+        // Given a future date (not valid), parsing should fail
+        String userInput = INDEX_FIRST_PATIENT.getOneBased()
+                + " " + PREFIX_DATE + invalidFutureDate;
+
+        assertParseFailure(parser, userInput, MESSAGE_INVALID_LAST_VISIT_DATE);
+    }
+
+    @Test
+    public void parse_invalidDate_failure() {
+        // Given a malformed date (like "2020-014-21"), parsing should fail
+        String userInput = INDEX_FIRST_PATIENT.getOneBased()
+                + " " + PREFIX_DATE + invalidFormatDate;
+
+        assertParseFailure(parser, userInput, MESSAGE_INVALID_DATE_FORMAT);
+    }
+
+
 }
diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
index 4da71265e7a..60bacd12842 100644
--- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
+++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
@@ -28,6 +28,8 @@ public class ParserUtilTest {
     private static final String INVALID_EMAIL = "example.com";
     private static final String INVALID_TAG = "#friend";
     private static final String INVALID_MEDICINE_NAME = "#$%panadol";
+    private static final String INVALID_FORMAT_DATE = "10-10-2020";
+    private static final String INVALID_VALUE_DATE = "2055-01-01";
 
     private static final String VALID_NAME = "Rachel Walker";
     private static final String VALID_PHONE = "123456";
@@ -220,4 +222,19 @@ public void parseMed_validValueWithWhitespace_returnsTrimmedMed() throws Excepti
         Medicine expectedMed = new Medicine(VALID_MED_1);
         assertEquals(expectedMed, ParserUtil.parseMed(medWithWhitespace));
     }
+
+    @Test
+    public void parseLastVisit_null_throwsNullPointerException() {
+        assertThrows(NullPointerException.class, () -> ParserUtil.parseLastVisit(null));
+    }
+
+    @Test
+    public void parseLastVisit_invalidDateFormat_throwsParseException() {
+        assertThrows(ParseException.class, () -> ParserUtil.parseLastVisit(INVALID_FORMAT_DATE));
+    }
+
+    @Test
+    public void parseLastVisit_invalidDateValue_throwsParseException() {
+        assertThrows(ParseException.class, () -> ParserUtil.parseLastVisit(INVALID_VALUE_DATE));
+    }
 }
diff --git a/src/test/java/seedu/address/model/patient/LastVisitTest.java b/src/test/java/seedu/address/model/patient/LastVisitTest.java
new file mode 100644
index 00000000000..f7ee332075b
--- /dev/null
+++ b/src/test/java/seedu/address/model/patient/LastVisitTest.java
@@ -0,0 +1,57 @@
+package seedu.address.model.patient;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.Assert.assertThrows;
+
+import java.time.LocalDate;
+
+import org.junit.jupiter.api.Test;
+
+public class LastVisitTest {
+
+    @Test
+    public void constructor_null_throwsNullPointerException() {
+        assertThrows(NullPointerException.class, () -> new LastVisit(null));
+    }
+
+    @Test
+    public void constructor_invalidDate_throwsIllegalArgumentException() {
+        LocalDate invalidDate = LocalDate.now().plusDays(1);
+        assertThrows(IllegalArgumentException.class, () -> new LastVisit(invalidDate));
+    }
+
+    @Test
+    public void isValidLastVisit() {
+        // null date
+        assertFalse(LastVisit.isValidLastVisit(null));
+
+        // invalid dates
+        assertFalse(LastVisit.isValidLastVisit(LocalDate.now().plusDays(1)));
+        assertFalse(LastVisit.isValidLastVisit(LocalDate.now().plusDays(1000)));
+
+        // valid dates
+        assertTrue(LastVisit.isValidLastVisit(LocalDate.now()));
+        assertTrue(LastVisit.isValidLastVisit(LocalDate.parse("2000-01-01")));
+    }
+
+    @Test
+    public void equals() {
+        LastVisit lastVisit = new LastVisit(LocalDate.parse("2000-01-01"));
+
+        // same values -> returns true
+        assertTrue(lastVisit.equals(new LastVisit(LocalDate.parse("2000-01-01"))));
+
+        // same object -> returns true
+        assertTrue(lastVisit.equals(lastVisit));
+
+        // null -> returns false
+        assertFalse(lastVisit.equals(null));
+
+        // different types -> returns false
+        assertFalse(lastVisit.equals(5));
+
+        // different values -> returns false
+        assertFalse(lastVisit.equals(new LastVisit(LocalDate.parse("2001-01-01"))));
+    }
+}
diff --git a/src/test/java/seedu/address/storage/JsonSerializableAddressBookTest.java b/src/test/java/seedu/address/storage/JsonSerializableAddressBookTest.java
index 24519545761..3bc53b3eec9 100644
--- a/src/test/java/seedu/address/storage/JsonSerializableAddressBookTest.java
+++ b/src/test/java/seedu/address/storage/JsonSerializableAddressBookTest.java
@@ -21,7 +21,7 @@ public class JsonSerializableAddressBookTest {
     private static final Path DUPLICATE_patient_FILE = TEST_DATA_FOLDER.resolve("duplicatePatientsAddressBook.json");
 
     @Test
-    public void toModelType_typicalpatientsFile_success() throws Exception {
+    public void toModelType_typicalPatientsFile_success() throws Exception {
         JsonSerializableAddressBook dataFromFile = JsonUtil.readJsonFile(TYPICAL_patientS_FILE,
                 JsonSerializableAddressBook.class).get();
         AddressBook addressBookFromFile = dataFromFile.toModelType();
@@ -30,14 +30,14 @@ public void toModelType_typicalpatientsFile_success() throws Exception {
     }
 
     @Test
-    public void toModelType_invalidpatientFile_throwsIllegalValueException() throws Exception {
+    public void toModelType_invalidPatientFile_throwsIllegalValueException() throws Exception {
         JsonSerializableAddressBook dataFromFile = JsonUtil.readJsonFile(INVALID_patient_FILE,
                 JsonSerializableAddressBook.class).get();
         assertThrows(IllegalValueException.class, dataFromFile::toModelType);
     }
 
     @Test
-    public void toModelType_duplicatepatients_throwsIllegalValueException() throws Exception {
+    public void toModelType_duplicatePatients_throwsIllegalValueException() throws Exception {
         JsonSerializableAddressBook dataFromFile = JsonUtil.readJsonFile(DUPLICATE_patient_FILE,
                 JsonSerializableAddressBook.class).get();
         assertThrows(IllegalValueException.class, JsonSerializableAddressBook.MESSAGE_DUPLICATE_PATIENT,
diff --git a/src/test/java/seedu/address/testutil/PatientBuilder.java b/src/test/java/seedu/address/testutil/PatientBuilder.java
index 3faa9a5aee9..60cb0adddcf 100644
--- a/src/test/java/seedu/address/testutil/PatientBuilder.java
+++ b/src/test/java/seedu/address/testutil/PatientBuilder.java
@@ -1,5 +1,6 @@
 package seedu.address.testutil;
 
+import java.time.LocalDate;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -22,7 +23,7 @@ public class PatientBuilder {
     public static final String DEFAULT_PHONE = "85355255";
     public static final String DEFAULT_EMAIL = "amy@gmail.com";
     public static final String DEFAULT_ADDRESS = "123, Jurong West Ave 6, #08-111";
-    public static final String DEFAULT_LAST_VISIT = "Last visit on 5 March 2025.";
+    public static final String DEFAULT_LAST_VISITDATE = "2020-01-01";
 
     private Name name;
     private Phone phone;
@@ -40,7 +41,7 @@ public PatientBuilder() {
         phone = new Phone(DEFAULT_PHONE);
         email = new Email(DEFAULT_EMAIL);
         address = new Address(DEFAULT_ADDRESS);
-        lastVisit = new LastVisit(DEFAULT_LAST_VISIT);
+        lastVisit = new LastVisit(LocalDate.parse(DEFAULT_LAST_VISITDATE));
         tags = new HashSet<>();
         medicines = new HashSet<>();
     }
@@ -118,11 +119,11 @@ public PatientBuilder withEmail(String email) {
     /**
      * Sets the {@code Last Visit} of the {@code patient} that we are building.
      */
-    public PatientBuilder withLastVisit(String visit) {
-        if (visit == null) {
+    public PatientBuilder withLastVisit(String lastVisitDate) {
+        if (lastVisitDate == null) {
             this.lastVisit = null;
         } else {
-            this.lastVisit = new LastVisit(visit);
+            this.lastVisit = new LastVisit(LocalDate.parse(lastVisitDate));
         }
         return this;
     }
diff --git a/src/test/java/seedu/address/testutil/PatientUtil.java b/src/test/java/seedu/address/testutil/PatientUtil.java
index fb3fab59560..8744893a5dc 100644
--- a/src/test/java/seedu/address/testutil/PatientUtil.java
+++ b/src/test/java/seedu/address/testutil/PatientUtil.java
@@ -1,12 +1,12 @@
 package seedu.address.testutil;
 
 import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
+import static seedu.address.logic.parser.CliSyntax.PREFIX_DATE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_MEDICINE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
-import static seedu.address.logic.parser.CliSyntax.PREFIX_VISIT;
 
 import java.util.Set;
 
@@ -24,19 +24,19 @@ public class PatientUtil {
      * Returns an add command string for adding the {@code patient}.
      */
     public static String getAddCommand(Patient patient) {
-        return AddCommand.COMMAND_WORD + " " + getpatientDetails(patient);
+        return AddCommand.COMMAND_WORD + " " + getPatientDetails(patient);
     }
 
     /**
      * Returns the part of command string for the given {@code patient}'s details.
      */
-    public static String getpatientDetails(Patient patient) {
+    public static String getPatientDetails(Patient patient) {
         StringBuilder sb = new StringBuilder();
         sb.append(PREFIX_NAME + patient.getName().fullName + " ");
         sb.append(PREFIX_PHONE + patient.getPhone().value + " ");
         sb.append(PREFIX_EMAIL + patient.getEmail().value + " ");
         sb.append(PREFIX_ADDRESS + patient.getAddress().value + " ");
-        sb.append(PREFIX_VISIT + patient.getLastVisit().value + " ");
+        sb.append(PREFIX_DATE + patient.getLastVisit().lastVisitDate.toString() + " ");
         patient.getTags().stream().forEach(
             s -> sb.append(PREFIX_TAG + s.tagName + " ")
         );
@@ -49,12 +49,13 @@ public static String getpatientDetails(Patient patient) {
     /**
      * Returns the part of command string for the given {@code EditpatientDescriptor}'s details.
      */
-    public static String getEditpatientDescriptorDetails(EditpatientDescriptor descriptor) {
+    public static String getEditPatientDescriptorDetails(EditpatientDescriptor descriptor) {
         StringBuilder sb = new StringBuilder();
         descriptor.getName().ifPresent(name -> sb.append(PREFIX_NAME).append(name.fullName).append(" "));
         descriptor.getPhone().ifPresent(phone -> sb.append(PREFIX_PHONE).append(phone.value).append(" "));
         descriptor.getEmail().ifPresent(email -> sb.append(PREFIX_EMAIL).append(email.value).append(" "));
-        descriptor.getAddress().ifPresent(address -> sb.append(PREFIX_ADDRESS).append(address.value).append(" "));
+        descriptor.getAddress().ifPresent(address -> sb.append(PREFIX_ADDRESS)
+                .append(address.value).append(" "));
         if (descriptor.getTags().isPresent()) {
             Set<Tag> tags = descriptor.getTags().get();
             if (tags.isEmpty()) {
diff --git a/src/test/java/seedu/address/testutil/TypicalPatients.java b/src/test/java/seedu/address/testutil/TypicalPatients.java
index 1d179662907..30474b1deda 100644
--- a/src/test/java/seedu/address/testutil/TypicalPatients.java
+++ b/src/test/java/seedu/address/testutil/TypicalPatients.java
@@ -4,6 +4,8 @@
 import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_LASTVISITDATE_AMY;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_LASTVISITDATE_BOB;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;
 import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY;
@@ -26,36 +28,36 @@ public class TypicalPatients {
     public static final Patient ALICE = new PatientBuilder().withName("Alice Pauline")
             .withAddress("123, Jurong West Ave 6, #08-111").withEmail("alice@example.com")
             .withPhone("94351253")
-            .withLastVisit("Last visit on 5 March 2025.")
+            .withLastVisit("2020-01-01")
             .withTags("friends")
             .withMeds("paracetamol").build();
     public static final Patient BENSON = new PatientBuilder().withName("Benson Meier")
             .withAddress("311, Clementi Ave 2, #02-25")
             .withEmail("johnd@example.com").withPhone("98765432")
-            .withLastVisit("Last visit on 25 February 2025.")
+            .withLastVisit("2020-01-01")
             .withTags("owesMoney", "friends")
             .withMeds("penicillin").build();
     public static final Patient CARL = new PatientBuilder().withName("Carl Kurz").withPhone("95352563")
             .withEmail("heinz@example.com")
             .withAddress("wall street")
-            .withLastVisit("1").build();
+            .withLastVisit("2020-01-01").build();
     public static final Patient DANIEL = new PatientBuilder().withName("Daniel Meier").withPhone("87652533")
             .withEmail("cornelia@example.com")
             .withAddress("10th street")
-            .withLastVisit("2")
+            .withLastVisit("2020-01-01")
             .withTags("friends").build();
     public static final Patient ELLE = new PatientBuilder().withName("Elle Meyer").withPhone("9482224")
             .withEmail("werner@example.com")
             .withAddress("michegan ave")
-            .withLastVisit("3").build();
+            .withLastVisit("2020-01-01").build();
     public static final Patient FIONA = new PatientBuilder().withName("Fiona Kunz").withPhone("9482427")
             .withEmail("lydia@example.com")
             .withAddress("little tokyo")
-            .withLastVisit("4").build();
+            .withLastVisit("2020-01-01").build();
     public static final Patient GEORGE = new PatientBuilder().withName("George Best").withPhone("9482442")
             .withEmail("anna@example.com")
             .withAddress("4th street")
-            .withLastVisit("5").build();
+            .withLastVisit("2020-01-01").build();
 
     // Manually added
     public static final Patient HOON = new PatientBuilder().withName("Hoon Meier").withPhone("8482424")
@@ -65,9 +67,14 @@ public class TypicalPatients {
 
     // Manually added - Patient's details found in {@code CommandTestUtil}
     public static final Patient AMY = new PatientBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)
-            .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).build();
+            .withEmail(VALID_EMAIL_AMY)
+            .withAddress(VALID_ADDRESS_AMY)
+            .withLastVisit(VALID_LASTVISITDATE_AMY)
+            .build();
     public static final Patient BOB = new PatientBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)
-            .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)
+            .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB)
+            .withLastVisit(VALID_LASTVISITDATE_BOB)
+            .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND)
             .build();
 
     public static final String KEYWORD_MATCHING_MEIER = "Meier"; // A keyword that matches MEIER
@@ -79,13 +86,13 @@ private TypicalPatients() {} // prevents instantiation
      */
     public static AddressBook getTypicalAddressBook() {
         AddressBook ab = new AddressBook();
-        for (Patient patient : getTypicalpatients()) {
+        for (Patient patient : getTypicalPatients()) {
             ab.addPatient(patient);
         }
         return ab;
     }
 
-    public static List<Patient> getTypicalpatients() {
+    public static List<Patient> getTypicalPatients() {
         return new ArrayList<>(Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));
     }
 }


Reviews:
user: login: szelingtan
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-26T12:44:35Z
user: login: szelingtan
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-26T12:52:24Z
user: login: Luoq1-Xu
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-26T12:58:52Z
user: login: Luoq1-Xu
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-26T12:58:58Z
user: login: Luoq1-Xu
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-26T14:15:40Z
user: login: Bryce-3D
body: LGTM! Just that one javadoc hasn't been updated yet
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-27T02:25:57Z

Review comments:
diff_hunk: @@ -83,18 +86,25 @@ public static Address parseAddress(String address) throws ParseException {
     }
 
     /**
-     * Parses a {@code String lastVisit} into an {@code lastVisit}.
+     * Parses a {@code String lastVisitDate} into a {@code LastVisit}.
      * Leading and trailing whitespaces will be trimmed.
      *
-     * @throws ParseException if the given {@code lastVisit} is invalid.
+     * @throws ParseException if the given {@code lastVisitDate} is invalid.
      */
-    public static LastVisit parseLastVisit(String lastVisit) throws ParseException {
-        requireNonNull(lastVisit);
-        String trimmedLastVisit = lastVisit.trim();
-        if (!LastVisit.isValidLastVisit(trimmedLastVisit)) {
+    public static LastVisit parseLastVisit(String lastVisitDateString) throws ParseException {
path: src/main/java/seedu/address/logic/parser/ParserUtil.java
user: login: szelingtan
body: Minor suggestion, might want this variable to be called trimmedLastVisitDateString to be more aligned with your above variable naming in line 94
created_at: 2025-03-26T12:44:35Z
author_association: NONE
diff_hunk: @@ -24,13 +24,11 @@ public class LastVisitCommand extends Command {
             + "by the index number used in the last patient listing. "
             + "Existing last visit will be overwritten by the input.\n"
path: src/main/java/seedu/address/logic/commands/LastVisitCommand.java
user: login: szelingtan
body: This comment concerns line 17 in this file `Changes the remark of an existing patient in the address book.` as I am unable to comment there. Perhaps, you could change the Javadoc comment from remark to last visit since we are no longer using this class to add/change remarks but to add/change last visit of our patient
created_at: 2025-03-26T12:52:23Z
author_association: NONE
diff_hunk: @@ -24,13 +24,11 @@ public class LastVisitCommand extends Command {
             + "by the index number used in the last patient listing. "
             + "Existing last visit will be overwritten by the input.\n"
path: src/main/java/seedu/address/logic/commands/LastVisitCommand.java
user: login: Luoq1-Xu
body: 😢 
created_at: 2025-03-26T12:58:52Z
author_association: COLLABORATOR
diff_hunk: @@ -24,13 +24,11 @@ public class LastVisitCommand extends Command {
             + "by the index number used in the last patient listing. "
             + "Existing last visit will be overwritten by the input.\n"
path: src/main/java/seedu/address/logic/commands/LastVisitCommand.java
user: login: Luoq1-Xu
body: good catch

created_at: 2025-03-26T12:58:58Z
author_association: COLLABORATOR
diff_hunk: @@ -83,18 +86,25 @@ public static Address parseAddress(String address) throws ParseException {
     }
 
     /**
-     * Parses a {@code String lastVisit} into an {@code lastVisit}.
+     * Parses a {@code String lastVisitDate} into a {@code LastVisit}.
      * Leading and trailing whitespaces will be trimmed.
      *
-     * @throws ParseException if the given {@code lastVisit} is invalid.
+     * @throws ParseException if the given {@code lastVisitDate} is invalid.
      */
-    public static LastVisit parseLastVisit(String lastVisit) throws ParseException {
-        requireNonNull(lastVisit);
-        String trimmedLastVisit = lastVisit.trim();
-        if (!LastVisit.isValidLastVisit(trimmedLastVisit)) {
+    public static LastVisit parseLastVisit(String lastVisitDateString) throws ParseException {
path: src/main/java/seedu/address/logic/parser/ParserUtil.java
user: login: Luoq1-Xu
body: You commented on the wrong line I cannot see which variable you are referring to (I only see line 94 and before)
created_at: 2025-03-26T14:15:39Z
author_association: COLLABORATOR
diff_hunk: @@ -24,13 +24,11 @@ public class LastVisitCommand extends Command {
             + "by the index number used in the last patient listing. "
             + "Existing last visit will be overwritten by the input.\n"
path: src/main/java/seedu/address/logic/commands/LastVisitCommand.java
user: login: Bryce-3D
body: Hi! Just bumping this since it hasn't been changed yet
created_at: 2025-03-27T02:24:15Z
author_association: COLLABORATOR

PR comments:
user: login: codecov[bot]
created_at: 2025-03-25T16:34:27Z
body: ## [Codecov](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2) Report
Attention: Patch coverage is `88.63636%` with `5 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2) | Patch % | Lines |
|---|---|---|
| [...u/address/logic/parser/LastVisitCommandParser.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Flogic%2Fparser%2FLastVisitCommandParser.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL2xvZ2ljL3BhcnNlci9MYXN0VmlzaXRDb21tYW5kUGFyc2VyLmphdmE=) | 83.33% | [1 Missing and 1 partial :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2) |
| [...in/java/seedu/address/model/patient/LastVisit.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Fmodel%2Fpatient%2FLastVisit.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL21vZGVsL3BhdGllbnQvTGFzdFZpc2l0LmphdmE=) | 90.90% | [1 Missing :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2) |
| [.../java/seedu/address/model/util/SampleDataUtil.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Fmodel%2Futil%2FSampleDataUtil.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL21vZGVsL3V0aWwvU2FtcGxlRGF0YVV0aWwuamF2YQ==) | 50.00% | [1 Missing :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2) |
| [src/main/java/seedu/address/ui/PatientCard.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Fui%2FPatientCard.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL3VpL1BhdGllbnRDYXJkLmphdmE=) | 0.00% | [1 Missing :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2) |

| [Files with missing lines](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2) | Coverage Δ | Complexity Δ | |
|---|---|---|---|
| [src/main/java/seedu/address/logic/Messages.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Flogic%2FMessages.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL2xvZ2ljL01lc3NhZ2VzLmphdmE=) | `90.00% <ø> (ø)` | `3.00 <0.00> (ø)` | |
| [.../java/seedu/address/logic/commands/AddCommand.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Flogic%2Fcommands%2FAddCommand.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL0FkZENvbW1hbmQuamF2YQ==) | `100.00% <ø> (ø)` | `8.00 <0.00> (ø)` | |
| [...du/address/logic/commands/DelLastVisitCommand.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Flogic%2Fcommands%2FDelLastVisitCommand.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL0RlbExhc3RWaXNpdENvbW1hbmQuamF2YQ==) | `76.00% <100.00%> (ø)` | `4.00 <2.00> (ø)` | |
| [...seedu/address/logic/commands/LastVisitCommand.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Flogic%2Fcommands%2FLastVisitCommand.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL0xhc3RWaXNpdENvbW1hbmQuamF2YQ==) | `100.00% <100.00%> (ø)` | `10.00 <1.00> (ø)` | |
| [...a/seedu/address/logic/parser/AddCommandParser.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Flogic%2Fparser%2FAddCommandParser.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL2xvZ2ljL3BhcnNlci9BZGRDb21tYW5kUGFyc2VyLmphdmE=) | `100.00% <100.00%> (ø)` | `5.00 <0.00> (ø)` | |
| [...ain/java/seedu/address/logic/parser/CliSyntax.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Flogic%2Fparser%2FCliSyntax.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL2xvZ2ljL3BhcnNlci9DbGlTeW50YXguamF2YQ==) | `87.50% <100.00%> (ø)` | `1.00 <0.00> (ø)` | |
| [...in/java/seedu/address/logic/parser/ParserUtil.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Flogic%2Fparser%2FParserUtil.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL2xvZ2ljL3BhcnNlci9QYXJzZXJVdGlsLmphdmE=) | `98.00% <100.00%> (+4.52%)` | `18.00 <2.00> (+1.00)` | |
| [...java/seedu/address/storage/JsonAdaptedPatient.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Fstorage%2FJsonAdaptedPatient.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL3N0b3JhZ2UvSnNvbkFkYXB0ZWRQYXRpZW50LmphdmE=) | `96.77% <100.00%> (ø)` | `13.00 <0.00> (ø)` | |
| [...in/java/seedu/address/model/patient/LastVisit.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Fmodel%2Fpatient%2FLastVisit.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL21vZGVsL3BhdGllbnQvTGFzdFZpc2l0LmphdmE=) | `94.11% <90.90%> (+32.57%)` | `7.00 <4.00> (+3.00)` | |
| [.../java/seedu/address/model/util/SampleDataUtil.java](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fseedu%2Faddress%2Fmodel%2Futil%2FSampleDataUtil.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2#diff-c3JjL21haW4vamF2YS9zZWVkdS9hZGRyZXNzL21vZGVsL3V0aWwvU2FtcGxlRGF0YVV0aWwuamF2YQ==) | `40.00% <50.00%> (ø)` | `3.00 <1.00> (ø)` | |
| ... and [2 more](https://app.codecov.io/gh/AY2425S2-CS2103T-T17-2/tp/pull/94?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-T17-2) | |

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
author_association: NONE
user: login: Bryce-3D
created_at: 2025-03-26T04:40:14Z
body: Hi! The PR name currently doesn't match the corresponding issue name. I'll just quickly change this.
author_association: COLLABORATOR
user: login: Bryce-3D
created_at: 2025-03-27T03:18:34Z
body: LGTM!
author_association: COLLABORATOR