Skip to content

Commit

Permalink
Merge pull request #38 from h4ow3i/v1.2-TrackHours
Browse files Browse the repository at this point in the history
V1.2 track employee working hours
  • Loading branch information
jxunze authored Mar 17, 2024
2 parents fdcf269 + fbd404a commit 0890c8c
Show file tree
Hide file tree
Showing 22 changed files with 350 additions and 77 deletions.
1 change: 1 addition & 0 deletions src/main/java/seedu/address/logic/Messages.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class Messages {
public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!";
public static final String MESSAGE_DUPLICATE_FIELDS =
"Multiple values specified for the following single-valued field(s): ";
public static final String MESSAGE_INVALID_HOURS_WORKED = "Hours clocked can only contain numbers and no spaces.";

/**
* Returns an error message indicating the duplicate prefixes.
Expand Down
11 changes: 5 additions & 6 deletions src/main/java/seedu/address/logic/commands/AddCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_LASTNAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SEX;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;

import seedu.address.commons.util.ToStringBuilder;
import seedu.address.logic.Messages;
Expand All @@ -31,18 +30,18 @@ public class AddCommand extends Command {
+ PREFIX_PHONE + "PHONE "
+ PREFIX_SEX + "SEX "
+ PREFIX_EMPLOYMENTTYPE + "EMPLOYMENT TYPE "
+ "[" + PREFIX_ADDRESS + "ADDRESS] "
+ "[" + PREFIX_BANKDETAILS + "BANK DETAILS] "
+ "[" + PREFIX_TAG + "TAG]...\n"
+ PREFIX_ADDRESS + "ADDRESS "
+ PREFIX_BANKDETAILS + "BANK DETAILS \n"
// + PREFIX_TAG + "TAG...\n"
+ "Example: " + COMMAND_WORD + " "
+ PREFIX_FIRSTNAME + "John "
+ PREFIX_LASTNAME + "Doe "
+ PREFIX_PHONE + "98765432 "
+ PREFIX_SEX + "m "
+ PREFIX_EMPLOYMENTTYPE + "ft "
+ PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 "
+ PREFIX_TAG + "friends "
+ PREFIX_TAG + "owesMoney";
+ PREFIX_BANKDETAILS + "0495858505";
// + PREFIX_TAG + "owesMoney";

public static final String MESSAGE_SUCCESS = "New person added: %1$s";
public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the address book";
Expand Down
32 changes: 23 additions & 9 deletions src/main/java/seedu/address/logic/commands/EditCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.person.Sex;
import seedu.address.model.person.WorkHours;
import seedu.address.model.tag.Tag;

/**
Expand Down Expand Up @@ -79,18 +80,19 @@ public EditCommand(Phone number, EditPersonDescriptor editPersonDescriptor) {
*/
private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {
assert personToEdit != null;

Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());
Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());
Set<Tag> updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());
Name updatedFirstName = editPersonDescriptor.getFirstName().orElse(personToEdit.getFirstName());
Name updatedLastName = editPersonDescriptor.getLastName().orElse(personToEdit.getLastName());
Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone());
Sex updatedSex = editPersonDescriptor.getSex().orElse(personToEdit.getSex());
EmploymentType updatedEmploymentType = editPersonDescriptor.getEmploymentType()
.orElse(personToEdit.getEmploymentType());
Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());
BankDetails updatedBankDetails = editPersonDescriptor.getBankDetails().orElse(personToEdit.getBankDetails());
WorkHours updatedWorkHours = editPersonDescriptor.getHoursWorked().orElse(personToEdit.getWorkHours());
Set<Tag> updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());

return new Person(updatedFirstName, updatedLastName, updatedPhone, updatedSex, updatedEmploymentType,
updatedAddress, updatedBankDetails, updatedTags);
updatedAddress, updatedBankDetails, updatedWorkHours, updatedTags);
}

@Override
Expand Down Expand Up @@ -159,6 +161,7 @@ public static class EditPersonDescriptor {
private Sex sex;
private EmploymentType employmentType;
private BankDetails bankDetails;
private WorkHours hoursWorked;

public EditPersonDescriptor() {
}
Expand All @@ -171,11 +174,12 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) {
setFirstName(toCopy.firstName);
setLastName(toCopy.lastName);
setPhone(toCopy.phone);
setAddress(toCopy.address);
setTags(toCopy.tags);
setEmploymentType(toCopy.employmentType);
setSex(toCopy.sex);
setAddress(toCopy.address);
setBankDetails(toCopy.bankDetails);
setHoursWorked(toCopy.hoursWorked);
}

/**
Expand Down Expand Up @@ -238,6 +242,14 @@ public void setAddress(Address address) {
this.address = address;
}

public Optional<WorkHours> getHoursWorked() {
return Optional.ofNullable(hoursWorked);
}

public void setHoursWorked(WorkHours hoursWorked) {
this.hoursWorked = hoursWorked;
}

/**
* Returns an unmodifiable tag set, which throws {@code UnsupportedOperationException}
* if modification is attempted.
Expand Down Expand Up @@ -270,11 +282,12 @@ public boolean equals(Object other) {
return Objects.equals(firstName, otherEditPersonDescriptor.firstName)
&& Objects.equals(lastName, otherEditPersonDescriptor.lastName)
&& Objects.equals(phone, otherEditPersonDescriptor.phone)
&& Objects.equals(address, otherEditPersonDescriptor.address)
&& Objects.equals(tags, otherEditPersonDescriptor.tags)
&& Objects.equals(sex, otherEditPersonDescriptor.sex)
&& Objects.equals(employmentType, otherEditPersonDescriptor.employmentType)
&& Objects.equals(bankDetails, otherEditPersonDescriptor.bankDetails);
&& Objects.equals(address, otherEditPersonDescriptor.address)
&& Objects.equals(bankDetails, otherEditPersonDescriptor.bankDetails)
&& Objects.equals(hoursWorked, otherEditPersonDescriptor.hoursWorked);
}

@Override
Expand All @@ -283,10 +296,11 @@ public String toString() {
.add("firstName", firstName)
.add("lastName", lastName)
.add("phone", phone)
.add("address", address)
.add("sex", sex)
.add("employmentType", employmentType)
.add("address", address)
.add("bankDetails", bankDetails)
.add("hoursWorked", hoursWorked)
.add("tags", tags)
.toString();
}
Expand Down
77 changes: 77 additions & 0 deletions src/main/java/seedu/address/logic/commands/HoursCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;

import seedu.address.commons.util.ToStringBuilder;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.person.WorkHours;

/**
* Adds work hours to a person in the address book.
*/
public class HoursCommand extends Command {

public static final String COMMAND_WORD = "hours";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds work hours to a person in the address book. "
+ "Parameters: <Phone> <Hours>\n"
+ "Example: " + COMMAND_WORD + " 98765432 5";

public static final String MESSAGE_SUCCESS = "%1$s has worked %2$d hours this week";
public static final String MESSAGE_PERSON_NOT_FOUND = "The person with phone number: %1$s does not exist";

private final Phone phoneNumber;
private final WorkHours hoursWorked;

/**
* Creates an HoursCommand to add work hours to the person with the specified phone number.
*/
public HoursCommand(Phone phoneNumber, WorkHours hoursWorked) {
requireNonNull(phoneNumber);
this.phoneNumber = phoneNumber;
this.hoursWorked = hoursWorked;
}

@Override
public CommandResult execute(Model model) throws CommandException {
requireNonNull(model);

Person personToUpdate = model.getPersonByPhoneNumber(phoneNumber);
if (personToUpdate == null) {
throw new CommandException(String.format(MESSAGE_PERSON_NOT_FOUND, phoneNumber));
}

personToUpdate.setHoursWorked(hoursWorked);
model.updatePerson(personToUpdate);

return new CommandResult(String.format(MESSAGE_SUCCESS, personToUpdate.getName(),
hoursWorked.getHoursWorked()));

}

@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}

if (!(other instanceof HoursCommand)) {
return false;
}

HoursCommand otherCommand = (HoursCommand) other;
return phoneNumber.equals(otherCommand.phoneNumber)
&& hoursWorked == otherCommand.hoursWorked;
}

@Override
public String toString() {
return new ToStringBuilder(this)
.add("phoneNumber", phoneNumber)
.add("hoursWorked", hoursWorked)
.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.person.Sex;
import seedu.address.model.person.WorkHours;
import seedu.address.model.tag.Tag;


/**
* Parses input arguments and creates a new AddCommand object
*/
Expand Down Expand Up @@ -71,8 +71,7 @@ public AddCommand parse(String args) throws ParseException {
Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));

Person person = new Person(firstName, lastName, phone, sex, employmentType, address,
bankDetails,
tagList);
bankDetails, new WorkHours(), tagList);

return new AddCommand(person);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import seedu.address.logic.commands.ExitCommand;
import seedu.address.logic.commands.FindCommand;
import seedu.address.logic.commands.HelpCommand;
import seedu.address.logic.commands.HoursCommand;
import seedu.address.logic.commands.ListCommand;
import seedu.address.logic.parser.exceptions.ParseException;

Expand Down Expand Up @@ -77,6 +78,9 @@ public Command parseCommand(String userInput) throws ParseException {
case HelpCommand.COMMAND_WORD:
return new HelpCommand();

case HoursCommand.COMMAND_WORD:
return new HoursCommandParser().parse(arguments);

default:
logger.finer("This user input caused a ParseException: " + userInput);
throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
Expand Down
1 change: 1 addition & 0 deletions src/main/java/seedu/address/logic/parser/CliSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ public class CliSyntax {
public static final Prefix PREFIX_ADDRESS = new Prefix("-a ");
public static final Prefix PREFIX_BANKDETAILS = new Prefix("-b ");
public static final Prefix PREFIX_TAG = new Prefix("-t ");
public static final Prefix PREFIX_HOURS = new Prefix("-hours");

}
31 changes: 31 additions & 0 deletions src/main/java/seedu/address/logic/parser/HoursCommandParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package seedu.address.logic.parser;

import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;

import seedu.address.logic.commands.HoursCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.Phone;
import seedu.address.model.person.WorkHours;

/**
* Parses input arguments and creates a new HoursCommand object
*/
public class HoursCommandParser implements Parser<HoursCommand> {

/**
* Parses the given {@code String} of arguments in the context of the HoursCommand
* and returns a HoursCommand object for execution.
*
* @throws ParseException if the user input does not conform the expected format
*/
public HoursCommand parse(String args) throws ParseException {
String[] tokens = args.trim().split("\\s+");
if (tokens.length != 2) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, HoursCommand.MESSAGE_USAGE));
}
Phone phoneNumber = ParserUtil.parsePhone(tokens[0]);
WorkHours hoursWorked;
hoursWorked = ParserUtil.parseWorkHours(tokens[1]);
return new HoursCommand(phoneNumber, hoursWorked);
}
}
23 changes: 23 additions & 0 deletions src/main/java/seedu/address/logic/parser/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
import seedu.address.model.person.Sex;
import seedu.address.model.person.WorkHours;
import seedu.address.model.tag.Tag;

/**
Expand Down Expand Up @@ -154,4 +155,26 @@ public static Set<Tag> parseTags(Collection<String> tags) throws ParseException
}
return tagSet;
}

/**
* Parses a string representation of work hours into a WorkHours object.
*
* @param workHours A string representing the number of work hours.
* @return A WorkHours object representing the parsed work hours.
* @throws ParseException if the work hours string is invalid or cannot be parsed.
*/
public static WorkHours parseWorkHours(String workHours) throws ParseException {
requireNonNull(workHours);
String trimmedWorkHours = workHours.trim();
try {
int hours = Integer.parseInt(trimmedWorkHours);
if (hours < 0) {
throw new ParseException("Work hours cannot be negative");
}
return new WorkHours(hours);
} catch (NumberFormatException e) {
throw new ParseException(WorkHours.MESSAGE_CONSTRAINTS);
}
}

}
13 changes: 13 additions & 0 deletions src/main/java/seedu/address/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import javafx.collections.ObservableList;
import seedu.address.commons.core.GuiSettings;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;

/**
* The API of the Model component.
Expand Down Expand Up @@ -84,4 +85,16 @@ public interface Model {
* @throws NullPointerException if {@code predicate} is null.
*/
void updateFilteredPersonList(Predicate<Person> predicate);

/**
* Returns a person with the given phone number.
* Returns {@code null} if no person with the given phone number is found.
*/
Person getPersonByPhoneNumber(Phone phoneNumber);

/**
* Updates the details of the specified person in the address book with the details of the updated person.
* @param personToUpdate The person to be updated.
*/
void updatePerson(Person personToUpdate);
}
18 changes: 18 additions & 0 deletions src/main/java/seedu/address/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import seedu.address.commons.core.GuiSettings;
import seedu.address.commons.core.LogsCenter;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;

/**
* Represents the in-memory model of the address book data.
Expand Down Expand Up @@ -145,4 +146,21 @@ public boolean equals(Object other) {
&& filteredPersons.equals(otherModelManager.filteredPersons);
}

@Override
public Person getPersonByPhoneNumber(Phone phoneNumber) {
requireNonNull(phoneNumber);
for (Person person : addressBook.getPersonList()) {
if (person.getPhone().equals(phoneNumber)) {
return person;
}
}
return null; // Return null if the person is not found
}

@Override
public void updatePerson(Person personToUpdate) {
requireNonNull(personToUpdate);
addressBook.setPerson(personToUpdate, personToUpdate);
}

}
Loading

0 comments on commit 0890c8c

Please sign in to comment.