diff --git a/src/main/java/seedu/address/logic/commands/EditBorrowerCommand.java b/src/main/java/seedu/address/logic/commands/EditBorrowerCommand.java index 8d0cb5573ba..038aea0d2ed 100644 --- a/src/main/java/seedu/address/logic/commands/EditBorrowerCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditBorrowerCommand.java @@ -79,7 +79,7 @@ public CommandResult execute(Model model) throws CommandException { undoCommand = new EditBorrowerCommand(getBorrowerDescriptor(borrowerToEdit)); redoCommand = this; - commandResult = new CommandResult(String.format(MESSAGE_EDIT_BORROWER_SUCCESS, editedBorrower.toFullString())); + commandResult = new CommandResult(String.format(MESSAGE_EDIT_BORROWER_SUCCESS, editedBorrower)); return commandResult; } diff --git a/src/main/java/seedu/address/logic/commands/RegisterCommand.java b/src/main/java/seedu/address/logic/commands/RegisterCommand.java index a864793028b..3dae5bb1d22 100644 --- a/src/main/java/seedu/address/logic/commands/RegisterCommand.java +++ b/src/main/java/seedu/address/logic/commands/RegisterCommand.java @@ -56,7 +56,7 @@ public CommandResult execute(Model model) throws CommandException { undoCommand = new UnregisterCommand(toAdd.getBorrowerId()); redoCommand = this; - commandResult = new CommandResult(String.format(MESSAGE_SUCCESS, toAdd.toFullString())); + commandResult = new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); return commandResult; } diff --git a/src/main/java/seedu/address/logic/commands/RenewCommand.java b/src/main/java/seedu/address/logic/commands/RenewCommand.java index 7ab740703d5..d273050b1b8 100644 --- a/src/main/java/seedu/address/logic/commands/RenewCommand.java +++ b/src/main/java/seedu/address/logic/commands/RenewCommand.java @@ -102,7 +102,7 @@ public CommandResult execute(Model model) throws CommandException { undoCommand = new UnrenewCommand(renewedBook, bookToBeRenewed, renewedLoan, loanToBeRenewed); redoCommand = this; commandResult = new CommandResult(String.format(MESSAGE_SUCCESS, renewedBook, - servingBorrower, extendedDueDate)); + servingBorrower, DateUtil.formatDate(extendedDueDate))); return commandResult; } diff --git a/src/main/java/seedu/address/logic/commands/ServeCommand.java b/src/main/java/seedu/address/logic/commands/ServeCommand.java index 606e574de38..608586dc4cc 100644 --- a/src/main/java/seedu/address/logic/commands/ServeCommand.java +++ b/src/main/java/seedu/address/logic/commands/ServeCommand.java @@ -22,6 +22,8 @@ public class ServeCommand extends ReversibleCommand { + PREFIX_BORROWER_ID + "K0001 "; public static final String MESSAGE_SUCCESS = "Currently serving Borrower: %1$s\n"; + public static final String MESSAGE_ALREADY_IN_SERVE_MODE = "Currently still in serve mode! Please enter " + + "\"done\" to exit serve mode before serving another borrower."; private final BorrowerId borrowerId; @@ -46,6 +48,10 @@ public ServeCommand (BorrowerId borrowerId) { public CommandResult execute(Model model) throws CommandException { requireNonNull(model); + if (model.isServeMode()) { + throw new CommandException(MESSAGE_ALREADY_IN_SERVE_MODE); + } + if (!model.hasBorrowerId(borrowerId)) { throw new CommandException(MESSAGE_NO_SUCH_BORROWER_ID); } diff --git a/src/main/java/seedu/address/logic/commands/UnloanCommand.java b/src/main/java/seedu/address/logic/commands/UnloanCommand.java index 91164269aba..83a9fa3f714 100644 --- a/src/main/java/seedu/address/logic/commands/UnloanCommand.java +++ b/src/main/java/seedu/address/logic/commands/UnloanCommand.java @@ -4,6 +4,7 @@ import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; +import seedu.address.commons.util.LoanSlipUtil; import seedu.address.model.Model; import seedu.address.model.book.Book; import seedu.address.model.loan.Loan; @@ -55,6 +56,8 @@ public CommandResult execute(Model model) { model.removeLoan(loanToBeRemoved); // remove Loan object from LoanRecords in model model.servingBorrowerRemoveLoan(loanToBeRemoved); // remove Loan object from Borrower's currentLoanList + LoanSlipUtil.unmountSpecificLoan(loanToBeRemoved, bookToBeUnloaned); + return new CommandResult(String.format(MESSAGE_SUCCESS, unloanedBook, model.getServingBorrower())); } diff --git a/src/main/java/seedu/address/logic/commands/UnregisterCommand.java b/src/main/java/seedu/address/logic/commands/UnregisterCommand.java index 2dcba750b28..a79b1c4dadb 100644 --- a/src/main/java/seedu/address/logic/commands/UnregisterCommand.java +++ b/src/main/java/seedu/address/logic/commands/UnregisterCommand.java @@ -54,7 +54,7 @@ public CommandResult execute(Model model) throws CommandException { undoCommand = new RegisterCommand(toUnregister); redoCommand = this; - commandResult = new CommandResult(String.format(MESSAGE_SUCCESS, toUnregister.toFullString())); + commandResult = new CommandResult(String.format(MESSAGE_SUCCESS, toUnregister)); return commandResult; } diff --git a/src/main/java/seedu/address/logic/parser/CatalogParser.java b/src/main/java/seedu/address/logic/parser/CatalogParser.java index f389398c4bc..d79fc93d3d4 100644 --- a/src/main/java/seedu/address/logic/parser/CatalogParser.java +++ b/src/main/java/seedu/address/logic/parser/CatalogParser.java @@ -25,6 +25,7 @@ import seedu.address.logic.commands.ServeCommand; import seedu.address.logic.commands.SetCommand; import seedu.address.logic.commands.UndoCommand; +import seedu.address.logic.commands.UnregisterCommand; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.logic.parser.exceptions.ParseException; @@ -85,6 +86,9 @@ public Command parseCommand(String userInput) throws ParseException, CommandExce case RegisterCommand.COMMAND_WORD: return new RegisterCommandParser().parse(arguments); + case UnregisterCommand.COMMAND_WORD: + return new UnregisterCommandParser().parse(arguments); + case ServeCommand.COMMAND_WORD: return new ServeCommandParser().parse(arguments); diff --git a/src/main/java/seedu/address/model/borrower/Email.java b/src/main/java/seedu/address/model/borrower/Email.java index 43b69041ba1..9198dcb1fab 100644 --- a/src/main/java/seedu/address/model/borrower/Email.java +++ b/src/main/java/seedu/address/model/borrower/Email.java @@ -23,9 +23,10 @@ public class Email { private static final String LOCAL_PART_REGEX = "^[\\w" + SPECIAL_CHARACTERS + "]+"; private static final String DOMAIN_FIRST_CHARACTER_REGEX = "[^\\W_]"; // alphanumeric characters except underscore private static final String DOMAIN_MIDDLE_REGEX = "[a-zA-Z0-9.-]*"; // alphanumeric, period and hyphen - private static final String DOMAIN_LAST_CHARACTER_REGEX = "[^\\W_]$"; + private static final String DOMAIN_LAST_CHARACTER_REGEX = "[^\\W_]{1,}$"; private static final String VALIDATION_REGEX = LOCAL_PART_REGEX + "@" - + DOMAIN_FIRST_CHARACTER_REGEX + DOMAIN_MIDDLE_REGEX + DOMAIN_LAST_CHARACTER_REGEX; + + DOMAIN_FIRST_CHARACTER_REGEX + DOMAIN_MIDDLE_REGEX + "\\." + + DOMAIN_LAST_CHARACTER_REGEX; public final String value; diff --git a/src/main/java/seedu/address/ui/BookCard.java b/src/main/java/seedu/address/ui/BookCard.java index b3872d850db..1a6549acbe1 100644 --- a/src/main/java/seedu/address/ui/BookCard.java +++ b/src/main/java/seedu/address/ui/BookCard.java @@ -7,6 +7,7 @@ import javafx.scene.layout.FlowPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Region; +import seedu.address.commons.util.DateUtil; import seedu.address.model.book.Book; /** @@ -57,7 +58,7 @@ public BookCard(Book book, int displayedIndex) { .forEach(tag -> genres.getChildren().add(new Label(tag.genreName))); if (book.isCurrentlyLoanedOut()) { loanStatus.setText("On Loan"); - dueDate.setText("Due: " + book.getLoan().get().getDueDate()); + dueDate.setText("Due: " + DateUtil.formatDate(book.getLoan().get().getDueDate())); renewCount.setText("Renewed: " + book.getLoan().get().getRenewCount() + " times"); } diff --git a/src/main/java/seedu/address/ui/BorrowerPanel.java b/src/main/java/seedu/address/ui/BorrowerPanel.java index e318bbff416..c7f27cfae9b 100644 --- a/src/main/java/seedu/address/ui/BorrowerPanel.java +++ b/src/main/java/seedu/address/ui/BorrowerPanel.java @@ -25,10 +25,12 @@ public class BorrowerPanel extends UiPart { @FXML private Label name; - @FXML private Label id; - + @FXML + private Label phone; + @FXML + private Label email; @FXML private Label fines; @@ -40,6 +42,8 @@ public BorrowerPanel() { super(FXML); name.setText(""); id.setText(""); + phone.setText(""); + email.setText(""); fines.setText(""); VBox.setVgrow(bookListView, Priority.ALWAYS); } @@ -54,6 +58,8 @@ public void setBorrower(Borrower borrower, ObservableList observableBookLi requireNonNull(borrower); name.setText("Borrower: " + borrower.getName().toString()); id.setText("ID: " + borrower.getBorrowerId().toString()); + phone.setText("Phone: " + borrower.getPhone().toString()); + email.setText("Email: " + borrower.getEmail().toString()); fines.setText("Fines: " + FineUtil.centsToDollarString(borrower.getOutstandingFineAmount())); bookListView.setItems(observableBookList); bookListView.setCellFactory(listView -> new BorrowerPanel.BookListViewCell()); @@ -65,6 +71,8 @@ public void setBorrower(Borrower borrower, ObservableList observableBookLi public void reset() { name.setText(""); id.setText(""); + phone.setText(""); + email.setText(""); fines.setText(""); ObservableList nullList = FXCollections.observableArrayList(new ArrayList<>()); bookListView.setItems(nullList); diff --git a/src/main/resources/view/BorrowerPanel.fxml b/src/main/resources/view/BorrowerPanel.fxml index e816ea7bda6..4a10b2daa45 100644 --- a/src/main/resources/view/BorrowerPanel.fxml +++ b/src/main/resources/view/BorrowerPanel.fxml @@ -5,25 +5,34 @@ - - - - - diff --git a/src/test/java/seedu/address/logic/commands/EditBorrowerCommandTest.java b/src/test/java/seedu/address/logic/commands/EditBorrowerCommandTest.java index 9968a029ffc..ecb436e6e36 100644 --- a/src/test/java/seedu/address/logic/commands/EditBorrowerCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/EditBorrowerCommandTest.java @@ -42,7 +42,7 @@ public void execute_allFieldsSpecified_success() throws CommandException { EditBorrowerCommand editBorrowerCommand = new EditBorrowerCommand(descriptor); String expectedMessage = String.format(EditBorrowerCommand.MESSAGE_EDIT_BORROWER_SUCCESS, - editedBorrower.toFullString()); + editedBorrower); Model expectedModel = new ModelManager( new Catalog(new Catalog()), new LoanRecords(), model.getBorrowerRecords(), new UserPrefs()); @@ -67,7 +67,7 @@ public void execute_someFieldsSpecified_success() throws CommandException { EditBorrowerCommand editCommand = new EditBorrowerCommand(descriptor); String expectedMessage = String.format(EditBorrowerCommand.MESSAGE_EDIT_BORROWER_SUCCESS, - editedBorrower.toFullString()); + editedBorrower); Model expectedModel = new ModelManager( new Catalog(), new LoanRecords(), model.getBorrowerRecords(), new UserPrefs()); @@ -86,7 +86,7 @@ public void execute_noFieldSpecified_success() throws CommandException { Borrower editedBorrower = model.getServingBorrower(); String expectedMessage = String.format(EditBorrowerCommand.MESSAGE_EDIT_BORROWER_SUCCESS, - editedBorrower.toFullString()); + editedBorrower); Model expectedModel = new ModelManager( new Catalog(), new LoanRecords(), model.getBorrowerRecords(), new UserPrefs()); diff --git a/src/test/java/seedu/address/logic/commands/RegisterCommandTest.java b/src/test/java/seedu/address/logic/commands/RegisterCommandTest.java index 73b6f5e6521..a37cbdc22d1 100644 --- a/src/test/java/seedu/address/logic/commands/RegisterCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/RegisterCommandTest.java @@ -31,7 +31,7 @@ public void execute_borrowerAcceptedByModel_addSuccessful() throws Exception { CommandResult commandResult = new RegisterCommand(validBorrower).execute(modelManager); - assertEquals(String.format(RegisterCommand.MESSAGE_SUCCESS, validBorrower.toFullString()), + assertEquals(String.format(RegisterCommand.MESSAGE_SUCCESS, validBorrower), commandResult.getFeedbackToUser()); assertEquals(Arrays.asList(validBorrower), modelManager.getBorrowerRecords().getBorrowerList()); } diff --git a/src/test/java/seedu/address/logic/commands/RenewCommandTest.java b/src/test/java/seedu/address/logic/commands/RenewCommandTest.java index 67730b33e98..45def1ffa25 100644 --- a/src/test/java/seedu/address/logic/commands/RenewCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/RenewCommandTest.java @@ -75,7 +75,7 @@ public void execute_validLoanedBook_renewSuccessful() { expectedModel.updateLoan(LOAN_7, renewedLoan); String expectedMessage = String.format(RenewCommand.MESSAGE_SUCCESS, renewedBook, - expectedModel.getServingBorrower(), extendedDueDate); + expectedModel.getServingBorrower(), DateUtil.formatDate(extendedDueDate)); assertCommandSuccess(renewCommand, actualModel, expectedMessage, expectedModel); } diff --git a/src/test/java/seedu/address/logic/commands/ServeCommandTest.java b/src/test/java/seedu/address/logic/commands/ServeCommandTest.java index 3064d7bd01f..5ef347eb671 100644 --- a/src/test/java/seedu/address/logic/commands/ServeCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ServeCommandTest.java @@ -5,6 +5,7 @@ import static seedu.address.commons.core.Messages.MESSAGE_NO_SUCH_BORROWER_ID; import static seedu.address.logic.commands.CommandTestUtil.VALID_ID_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_ID_BOB; +import static seedu.address.testutil.TypicalBorrowers.ALICE; import static seedu.address.testutil.TypicalBorrowers.BOB; import org.junit.jupiter.api.Test; @@ -43,4 +44,17 @@ public void execute_borrowerIdNotFound_throwsCommandException() { Assert.assertThrows(CommandException.class, MESSAGE_NO_SUCH_BORROWER_ID, () -> serveCommand.execute(modelManager)); } + + @Test + public void execute_alreadyInServeMode_throwsCommandException() throws CommandException { + Model modelManager = new ModelManager(); + new RegisterCommand(BOB).execute(modelManager); + new RegisterCommand(ALICE).execute(modelManager); + + new ServeCommand(ALICE.getBorrowerId()).execute(modelManager); + ServeCommand serveCommand = new ServeCommand(BOB.getBorrowerId()); + + Assert.assertThrows(CommandException.class, ServeCommand.MESSAGE_ALREADY_IN_SERVE_MODE, () -> + serveCommand.execute(modelManager)); + } } diff --git a/src/test/java/seedu/address/logic/commands/UnregisterCommandTest.java b/src/test/java/seedu/address/logic/commands/UnregisterCommandTest.java index df9ae69fa15..f2ecf510724 100644 --- a/src/test/java/seedu/address/logic/commands/UnregisterCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/UnregisterCommandTest.java @@ -32,7 +32,7 @@ public void constructor_nullBorrowerId_throwsNullPointerException() { public void execute_validSerialNumber_success() { UnregisterCommand command = new UnregisterCommand(ID_FIRST_BORROWER); - String expectedMessage = String.format(UnregisterCommand.MESSAGE_SUCCESS, ALICE.toFullString()); + String expectedMessage = String.format(UnregisterCommand.MESSAGE_SUCCESS, ALICE); ModelManager expectedModel = new ModelManager( model.getCatalog(), model.getLoanRecords(), model.getBorrowerRecords(), new UserPrefs()); diff --git a/src/test/java/seedu/address/logic/parser/CatalogParserTest.java b/src/test/java/seedu/address/logic/parser/CatalogParserTest.java index a83153aa8ef..32ca6f079f0 100644 --- a/src/test/java/seedu/address/logic/parser/CatalogParserTest.java +++ b/src/test/java/seedu/address/logic/parser/CatalogParserTest.java @@ -15,6 +15,8 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_SERIAL_NUMBER; import static seedu.address.testutil.Assert.assertThrows; +import static seedu.address.testutil.TypicalBorrowers.ID_FIRST_BORROWER; +import static seedu.address.testutil.TypicalBorrowers.getTypicalBorrowerRecords; import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_BOOK; import org.junit.jupiter.api.Test; @@ -36,6 +38,7 @@ import seedu.address.logic.commands.ReturnCommand; import seedu.address.logic.commands.ServeCommand; import seedu.address.logic.commands.SetCommand; +import seedu.address.logic.commands.UnregisterCommand; import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.BorrowerRecords; import seedu.address.model.Catalog; @@ -141,6 +144,14 @@ public void parseCommand_register() throws Exception { instanceof RegisterCommand); } + @Test + public void parseCommand_unregister() throws Exception { + BorrowerIdGenerator.setBorrowers(getTypicalBorrowerRecords()); + assertTrue(parser.parseCommand( + UnregisterCommand.COMMAND_WORD + " " + PREFIX_BORROWER_ID + ID_FIRST_BORROWER) + instanceof UnregisterCommand); + } + @Test public void parseCommand_serve() throws Exception { assertTrue(parser.parseCommand( diff --git a/src/test/java/seedu/address/model/borrower/EmailTest.java b/src/test/java/seedu/address/model/borrower/EmailTest.java index 58177466dac..05e67a5af4a 100644 --- a/src/test/java/seedu/address/model/borrower/EmailTest.java +++ b/src/test/java/seedu/address/model/borrower/EmailTest.java @@ -47,13 +47,11 @@ public void isValidEmail() { assertFalse(Email.isValidEmail("peterjack@example.com.")); // domain name ends with a period assertFalse(Email.isValidEmail("peterjack@-example.com")); // domain name starts with a hyphen assertFalse(Email.isValidEmail("peterjack@example.com-")); // domain name ends with a hyphen - + assertFalse(Email.isValidEmail("a@bc")); // no dot + assertFalse(Email.isValidEmail("peterjack@example.")); // nothing after dot // valid email assertTrue(Email.isValidEmail("PeterJack_1190@example.com")); - assertTrue(Email.isValidEmail("a@bc")); // minimal - assertTrue(Email.isValidEmail("test@localhost")); // alphabets only assertTrue(Email.isValidEmail("!#$%&'*+/=?`{|}~^.-@example.org")); // special characters local part - assertTrue(Email.isValidEmail("123@145")); // numeric local part and domain name assertTrue(Email.isValidEmail("a1+be!@example1.com")); // mixture of alphanumeric and special characters assertTrue(Email.isValidEmail("peter_jack@very-very-very-long-example.com")); // long domain name assertTrue(Email.isValidEmail("if.you.dream.it_you.can.do.it@example.com")); // long local part