Skip to content

Commit

Permalink
Couples Order and MenuItem (#197)
Browse files Browse the repository at this point in the history
- Order name in Order must now match existing MenuItem name
- Minor cosmetic fixes (hides dummy@dummy.com display in Ui)
- Abstracts out `Price` to allow calculations under `Order`
- Some Order commands `extends Command` as:
— `execute` needs access to model with different ModelEnum (Order and
MenuItem)

Known bugs:
- Editing duplicates not highligted for example order `cupcake ->
cupcake` not highlighted
  • Loading branch information
LiuMC-SG authored Mar 31, 2023
2 parents e8aa858 + f3fafe1 commit b75219e
Show file tree
Hide file tree
Showing 38 changed files with 1,040 additions and 787 deletions.
Binary file modified docs/images/Ui.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions src/main/java/trackr/logic/Logic.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import trackr.model.ReadOnlyOrderList;
import trackr.model.ReadOnlySupplierList;
import trackr.model.ReadOnlyTaskList;
import trackr.model.menu.ItemPrice;
import trackr.model.menu.MenuItem;
import trackr.model.order.Order;
import trackr.model.person.Supplier;
Expand Down Expand Up @@ -49,6 +50,12 @@ public interface Logic {
/** Returns an unmodifiable view of the filtered list of orders */
ObservableList<Order> getFilteredOrderList();

/** Returns cumulative profits */
ItemPrice getTotalProfits();

/** Returns cumulative sales/ revenue */
ItemPrice getTotalSales();

/**
* Returns the TaskList.
*
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/trackr/logic/LogicManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.IOException;
import java.nio.file.Path;
import java.util.logging.Logger;
import java.util.stream.Collectors;

import javafx.collections.ObservableList;
import trackr.commons.core.GuiSettings;
Expand All @@ -17,6 +18,8 @@
import trackr.model.ReadOnlyOrderList;
import trackr.model.ReadOnlySupplierList;
import trackr.model.ReadOnlyTaskList;
import trackr.model.menu.ItemPrice;
import trackr.model.menu.ItemProfit;
import trackr.model.menu.MenuItem;
import trackr.model.order.Order;
import trackr.model.person.Supplier;
Expand Down Expand Up @@ -99,6 +102,24 @@ public ObservableList<Order> getFilteredOrderList() {
return model.getFilteredOrderList();
}

@Override
public ItemProfit getTotalProfits() {
ObservableList<Order> allOrders = model.getFilteredOrderList();
Double total = allOrders.stream()
.map(x -> x.getTotalProfit().getValue())
.collect(Collectors.summingDouble(Double::doubleValue));
return new ItemProfit(total);
}

@Override
public ItemPrice getTotalSales() {
ObservableList<Order> allOrders = model.getFilteredOrderList();
Double total = allOrders.stream()
.map(x -> x.getTotalRevenue().getValue())
.collect(Collectors.summingDouble(Double::doubleValue));
return new ItemPrice(total);
}

@Override
public Path getTrackrFilePath() {
return model.getTrackrFilePath();
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/trackr/logic/commands/AddItemCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ public AddItemCommand(T item, ModelEnum modelEnum) {
this.modelEnum = modelEnum;
}

public T getItemToAdd() {
return toAdd;
}

@Override
public CommandResult execute(Model model) throws CommandException {
requireNonNull(model);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import trackr.model.item.ItemDescriptor;
import trackr.model.menu.ItemCost;
import trackr.model.menu.ItemName;
import trackr.model.menu.ItemPrice;
import trackr.model.menu.ItemSellingPrice;
import trackr.model.menu.MenuItem;
import trackr.model.menu.MenuItemDescriptor;

Expand Down Expand Up @@ -50,7 +50,7 @@ protected MenuItem createEditedItem(MenuItem itemToEdit, ItemDescriptor<? super

ItemName updatedItemName =
menuItemDescriptor.getItemName().orElse(itemToEdit.getItemName());
ItemPrice updatedItemPrice =
ItemSellingPrice updatedItemPrice =
menuItemDescriptor.getItemPrice().orElse(itemToEdit.getItemPrice());
ItemCost updatedItemCost =
menuItemDescriptor.getItemCost().orElse(itemToEdit.getItemCost());
Expand Down
51 changes: 47 additions & 4 deletions src/main/java/trackr/logic/commands/order/AddOrderCommand.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package trackr.logic.commands.order;

import static java.util.Objects.requireNonNull;
import static trackr.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static trackr.logic.parser.CliSyntax.PREFIX_DEADLINE;
import static trackr.logic.parser.CliSyntax.PREFIX_NAME;
Expand All @@ -8,16 +9,26 @@
import static trackr.logic.parser.CliSyntax.PREFIX_PHONE;
import static trackr.logic.parser.CliSyntax.PREFIX_STATUS;

import trackr.logic.commands.AddItemCommand;
import java.util.List;

import trackr.logic.commands.Command;
import trackr.logic.commands.CommandResult;
import trackr.logic.commands.exceptions.CommandException;
import trackr.model.Model;
import trackr.model.ModelEnum;
import trackr.model.menu.MenuItem;
import trackr.model.order.Order;

/**
* Adds an order to the order list
* Adds an order to the order list.
* May violate LSP. Does not extend AddItemCommand.
*/
public class AddOrderCommand extends AddItemCommand<Order> {
public class AddOrderCommand extends Command {
public static final String COMMAND_WORD = "add_order";
public static final String COMMAND_WORD_SHORTCUT = "add_o";
public static final String MESSAGE_NO_MENU_ITEM = "No such item in your menu.";
public static final String MESSAGE_DUPLICATE_ITEM = "This %s already exists in the %s list";
public static final String MESSAGE_SUCCESS = "New %s added: %s";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a order to the order list. "
+ "Parameters: "
Expand All @@ -37,10 +48,42 @@ public class AddOrderCommand extends AddItemCommand<Order> {
+ PREFIX_PHONE + "12345678 "
+ PREFIX_ADDRESS + "123 Smith Street ";

private final ModelEnum modelEnum;
private final Order toAdd;

/**
* Creates an AddOrderCommand to add the specified {@code Order}
*/
public AddOrderCommand(Order order) {
super(order, ModelEnum.ORDER);
requireNonNull(order);
this.modelEnum = ModelEnum.ORDER;
this.toAdd = order;
}

@Override
public CommandResult execute(Model model) throws CommandException {
requireNonNull(model);
List<MenuItem> currentMenuItems = model.getFilteredMenu();
MenuItem existingItem = currentMenuItems.stream()
.filter(item -> item.getItemName().getName()
.equals(toAdd.getOrderName().getName()))
.findAny()
.orElseThrow(() ->
new CommandException(MESSAGE_NO_MENU_ITEM));
Order validOrder = new Order(existingItem, toAdd.getOrderDeadline(), toAdd.getOrderStatus(),
toAdd.getOrderQuantity(), toAdd.getCustomer());
if (model.hasItem(validOrder, modelEnum)) {
throw new CommandException(String.format(MESSAGE_DUPLICATE_ITEM, modelEnum, validOrder));
}

model.addItem(validOrder, modelEnum);
return new CommandResult(String.format(MESSAGE_SUCCESS, modelEnum, validOrder));
}

@Override
public boolean equals(Object other) {
return other == this
|| (other instanceof AddOrderCommand
&& toAdd.equals(((AddOrderCommand) other).toAdd));
}
}
84 changes: 80 additions & 4 deletions src/main/java/trackr/logic/commands/order/EditOrderCommand.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
package trackr.logic.commands.order;

import static java.util.Objects.requireNonNull;
import static trackr.commons.util.CollectionUtil.requireAllNonNull;
import static trackr.logic.parser.CliSyntax.PREFIX_ADDRESS;
import static trackr.logic.parser.CliSyntax.PREFIX_DEADLINE;
import static trackr.logic.parser.CliSyntax.PREFIX_NAME;
import static trackr.logic.parser.CliSyntax.PREFIX_ORDERNAME;
import static trackr.logic.parser.CliSyntax.PREFIX_ORDERQUANTITY;
import static trackr.logic.parser.CliSyntax.PREFIX_PHONE;
import static trackr.logic.parser.CliSyntax.PREFIX_STATUS;
import static trackr.model.Model.PREDICATE_SHOW_ALL_ITEMS;

import java.util.List;

import trackr.commons.core.Messages;
import trackr.commons.core.index.Index;
import trackr.logic.commands.EditItemCommand;
import trackr.logic.commands.Command;
import trackr.logic.commands.CommandResult;
import trackr.logic.commands.exceptions.CommandException;
import trackr.model.Model;
import trackr.model.ModelEnum;
import trackr.model.item.ItemDescriptor;
import trackr.model.menu.MenuItem;
import trackr.model.order.Order;
import trackr.model.order.OrderDeadline;
import trackr.model.order.OrderDescriptor;
Expand All @@ -26,9 +36,14 @@
/**
* Edits the details of an existing order in the order list.
*/
public class EditOrderCommand extends EditItemCommand<Order> {
public class EditOrderCommand extends Command {
public static final String COMMAND_WORD = "edit_order";
public static final String COMMAND_WORD_SHORTCUT = "edit_o";
public static final String MESSAGE_EDIT_ITEM_SUCCESS = "Edited %s: %1$s";
public static final String MESSAGE_NO_MENU_ITEM = "No such item in your menu.";
public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided.";
public static final String MESSAGE_DUPLICATE_ITEM = "This %1$s already exists in the %1$s list.";


public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of the order identified "
+ "by the index number used in the displayed order list. "
Expand All @@ -45,13 +60,17 @@ public class EditOrderCommand extends EditItemCommand<Order> {
+ PREFIX_NAME + "Birthday Cake"
+ PREFIX_STATUS + "D";

private final Index index;
private final OrderDescriptor editOrderDescriptor;
/**
* @param index of the order in the filtered order list to edit
* @param editOrderDescriptor details to edit the order with
*/

public EditOrderCommand(Index index, OrderDescriptor editOrderDescriptor) {
super(index, editOrderDescriptor, ModelEnum.ORDER);
public EditOrderCommand(Index index, OrderDescriptor editItemDescriptor) {
requireAllNonNull(index, editItemDescriptor);
this.index = index;
this.editOrderDescriptor = editItemDescriptor;
}

protected Order createEditedItem(Order itemToEdit, ItemDescriptor<? super Order> itemDescriptor) {
Expand All @@ -75,7 +94,64 @@ protected Order createEditedItem(Order itemToEdit, ItemDescriptor<? super Order>
orderDescriptor.getCustomerAddress().orElse(itemToEdit.getCustomer().getCustomerAddress());
Customer updatedCustomer = new Customer(updatedCustomerName, updatedCustomerPhone, updatedCustomerAddress);


return new Order(updatedOrderName, updatedOrderDeadline, updatedOrderStatus,
updatedOrderQuantity, updatedCustomer);
}

/**
* Executes the command and returns the result message.
*
* @param model {@code Model} which the command should operate on
* @return feedback message of the operation result for display
* @throws CommandException If an error occurs during command execution
*/
public CommandResult execute(Model model) throws CommandException {
requireNonNull(model);
List<MenuItem> currentMenuItems = model.getFilteredMenu();
List<Order> currentOrders = model.getFilteredOrderList();

if (this.index.getZeroBased() >= currentOrders.size()) {
throw new CommandException(String.format(Messages.MESSAGE_INVALID_ITEM_DISPLAYED_INDEX,
ModelEnum.ORDER.toString()));
}

Order orderToEdit = currentOrders.get(index.getZeroBased());
Order editedOrder = createEditedItem(orderToEdit, editOrderDescriptor);
// check if edited order name exists
MenuItem existingItem = currentMenuItems.stream()
.filter(item -> item.getItemName().getName()
.equals(editedOrder.getOrderName().getName()))
.findAny()
.orElseThrow(() ->
new CommandException(MESSAGE_NO_MENU_ITEM));
Order validOrder = new Order(existingItem, editedOrder.getOrderDeadline(), editedOrder.getOrderStatus(),
editedOrder.getOrderQuantity(), editedOrder.getCustomer());
if (orderToEdit.isSameItem(validOrder) && model.hasItem(validOrder, ModelEnum.ORDER)) {
throw new CommandException(String.format(MESSAGE_DUPLICATE_ITEM, ModelEnum.ORDER.toString().toLowerCase()));
}

model.setItem(orderToEdit, editedOrder, ModelEnum.ORDER);
model.updateFilteredItemList(PREDICATE_SHOW_ALL_ITEMS, ModelEnum.ORDER);
return new CommandResult(String.format(MESSAGE_EDIT_ITEM_SUCCESS, ModelEnum.ORDER.toString().toLowerCase(),
validOrder.toString()));
}

@Override
public boolean equals(Object other) {
// short circuit if same object
if (other == this) {
return true;
}

// instanceof handles nulls
if (!(other instanceof EditOrderCommand)) {
return false;
}

// state check
EditOrderCommand e = (EditOrderCommand) other;
return index.equals(e.index)
&& editOrderDescriptor.equals(e.editOrderDescriptor);
}
}
12 changes: 6 additions & 6 deletions src/main/java/trackr/logic/parser/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import trackr.model.commons.Tag;
import trackr.model.menu.ItemCost;
import trackr.model.menu.ItemName;
import trackr.model.menu.ItemPrice;
import trackr.model.menu.ItemSellingPrice;
import trackr.model.order.OrderDeadline;
import trackr.model.order.OrderName;
import trackr.model.order.OrderQuantity;
Expand Down Expand Up @@ -229,13 +229,13 @@ public static ItemName parseItemName(String itemName) throws ParseException {
*
* @throws ParseException if the given {@code itemName} is invalid.
*/
public static ItemPrice parseItemPrice(String itemPrice) throws ParseException {
public static ItemSellingPrice parseItemPrice(String itemPrice) throws ParseException {
requireNonNull(itemPrice);
String trimmedItemPrice = itemPrice.trim();
if (!ItemPrice.isValidPrice(trimmedItemPrice)) {
throw new ParseException(ItemPrice.MESSAGE_CONSTRAINTS);
if (!ItemSellingPrice.isValidPrice(trimmedItemPrice)) {
throw new ParseException(ItemSellingPrice.MESSAGE_CONSTRAINTS);
}
return new ItemPrice(trimmedItemPrice);
return new ItemSellingPrice(trimmedItemPrice);
}

/**
Expand All @@ -247,7 +247,7 @@ public static ItemPrice parseItemPrice(String itemPrice) throws ParseException {
public static ItemCost parseItemCost(String itemCost) throws ParseException {
requireNonNull(itemCost);
String trimmedItemCost = itemCost.trim();
if (!ItemCost.isValidCost(trimmedItemCost)) {
if (!ItemCost.isValidPrice(trimmedItemCost)) {
throw new ParseException(ItemCost.MESSAGE_CONSTRAINTS);
}
return new ItemCost(trimmedItemCost);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import trackr.logic.parser.exceptions.ParseException;
import trackr.model.menu.ItemCost;
import trackr.model.menu.ItemName;
import trackr.model.menu.ItemPrice;
import trackr.model.menu.ItemSellingPrice;
import trackr.model.menu.MenuItem;

/**
Expand All @@ -41,7 +41,7 @@ public AddMenuItemCommand parse(String args) throws ParseException {
}

ItemName itemName = ParserUtil.parseItemName(argMultimap.getValue(PREFIX_NAME).get());
ItemPrice itemPrice = ParserUtil.parseItemPrice(argMultimap.getValue(PREFIX_PRICE).get());
ItemSellingPrice itemPrice = ParserUtil.parseItemPrice(argMultimap.getValue(PREFIX_PRICE).get());
ItemCost itemCost = ParserUtil.parseItemCost(argMultimap.getValue(PREFIX_COST).get());
MenuItem menuItem = new MenuItem(itemName, itemPrice, itemCost);

Expand Down
Loading

0 comments on commit b75219e

Please sign in to comment.