Skip to content

Commit 470471a

Browse files
authored
Merge pull request #90 from YingxuH/link-transactions
Link transactions with product and customer
2 parents 56a01ba + 21b7fa0 commit 470471a

File tree

10 files changed

+144
-56
lines changed

10 files changed

+144
-56
lines changed

src/main/java/seedu/address/logic/commands/transaction/AddTransactionCommand.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import seedu.address.logic.commands.exceptions.CommandException;
1414
import seedu.address.model.Model;
1515
import seedu.address.model.transaction.Transaction;
16+
import seedu.address.model.transaction.TransactionFactory;
1617

1718
/**
1819
* Adds a transaction to the system.
@@ -30,8 +31,8 @@ public class AddTransactionCommand extends Command {
3031
+ "[" + PREFIX_MONEY + "MONEY] "
3132
+ "[" + PREFIX_TRANS_DESCIPTION + "DESCRIPTION] \n"
3233
+ "Example: " + COMMAND_WORD + " "
33-
+ PREFIX_CUSTOMER + "Bob "
34-
+ PREFIX_PRODUCT + "WaterMelon "
34+
+ PREFIX_CUSTOMER + "1 "
35+
+ PREFIX_PRODUCT + "1 "
3536
+ PREFIX_DATETIME + "2020-02-20 10:00 "
3637
+ PREFIX_QUANTITY + "30 "
3738
+ PREFIX_MONEY + "30 "
@@ -40,17 +41,19 @@ public class AddTransactionCommand extends Command {
4041
public static final String MESSAGE_SUCCESS = "New transaction added: %1$s";
4142
public static final String MESSAGE_DUPLICATE_TRANSACTION = "This transaction already exists in the address book";
4243

43-
private final Transaction toAdd;
44+
private final TransactionFactory transactionFactory;
4445

45-
public AddTransactionCommand(Transaction transaction) {
46-
requireNonNull(transaction);
47-
toAdd = transaction;
46+
public AddTransactionCommand(TransactionFactory transactionFactory) {
47+
requireNonNull(transactionFactory);
48+
this.transactionFactory = transactionFactory;
4849
}
4950

5051
@Override
5152
public CommandResult execute(Model model) throws CommandException {
5253
requireNonNull(model);
5354

55+
Transaction toAdd = transactionFactory.createTransaction(model);
56+
5457
if (model.hasTransaction(toAdd)) {
5558
throw new CommandException(MESSAGE_DUPLICATE_TRANSACTION);
5659
}

src/main/java/seedu/address/logic/commands/transaction/EditTransactionCommand.java

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import seedu.address.logic.commands.CommandResult;
2020
import seedu.address.logic.commands.exceptions.CommandException;
2121
import seedu.address.model.Model;
22+
import seedu.address.model.customer.Customer;
23+
import seedu.address.model.product.Product;
2224
import seedu.address.model.transaction.DateTime;
2325
import seedu.address.model.transaction.Money;
2426
import seedu.address.model.transaction.Transaction;
@@ -80,7 +82,7 @@ public CommandResult execute(Model model) throws CommandException {
8082
}
8183

8284
Transaction transactionToEdit = lastShownList.get(index.getZeroBased());
83-
Transaction editedTransaction = createEditedTransaction(transactionToEdit, editTransactionDescriptor);
85+
Transaction editedTransaction = createEditedTransaction(transactionToEdit, editTransactionDescriptor, model);
8486

8587
if (!transactionToEdit.isSameTransaction(editedTransaction) && model.hasTransaction(editedTransaction)) {
8688
throw new CommandException(MESSAGE_DUPLICATE_TRANSACTION);
@@ -96,11 +98,27 @@ public CommandResult execute(Model model) throws CommandException {
9698
* edited with {@code editTransactionDescriptor}.
9799
*/
98100
private static Transaction createEditedTransaction(Transaction transactionToEdit,
99-
EditTransactionDescriptor editTransactionDescriptor) {
101+
EditTransactionDescriptor editTransactionDescriptor,
102+
Model model) {
100103
assert transactionToEdit != null;
101104

102-
String updatedCustomer = editTransactionDescriptor.getCustomer().orElse(transactionToEdit.getCustomer());
103-
String updatedProduct = editTransactionDescriptor.getProduct().orElse(transactionToEdit.getProduct());
105+
106+
Customer updatedCustomer;
107+
if (editTransactionDescriptor.getCustomerIndex().isPresent()) {
108+
Index updatedCustomerIndex = editTransactionDescriptor.getCustomerIndex().get();
109+
updatedCustomer = model.getFilteredCustomerList().get(updatedCustomerIndex.getZeroBased());
110+
} else {
111+
updatedCustomer = transactionToEdit.getCustomer();
112+
}
113+
114+
Product updatedProduct;
115+
if (editTransactionDescriptor.getProductIndex().isPresent()) {
116+
Index updatedProductIndex = editTransactionDescriptor.getProductIndex().get();
117+
updatedProduct = model.getFilteredProductList().get(updatedProductIndex.getZeroBased());
118+
} else {
119+
updatedProduct = transactionToEdit.getProduct();
120+
}
121+
104122
DateTime updatedDateTime = editTransactionDescriptor.getDateTime().orElse(transactionToEdit.getDateTime());
105123
Quantity updatedQuantity = editTransactionDescriptor.getQuantity().orElse(transactionToEdit.getQuantity());
106124
Money updatedMoney = editTransactionDescriptor.getMoney().orElse(transactionToEdit.getMoney());
@@ -134,8 +152,8 @@ public boolean equals(Object other) {
134152
* corresponding field value of the transaction.
135153
*/
136154
public static class EditTransactionDescriptor {
137-
private String customer;
138-
private String product;
155+
private Index customerIndex;
156+
private Index productIndex;
139157
private DateTime dateTime;
140158
private Quantity quantity;
141159
private Money money;
@@ -148,8 +166,8 @@ public EditTransactionDescriptor() {}
148166
* A defensive copy of {@code tags} is used internally.
149167
*/
150168
public EditTransactionDescriptor(EditTransactionDescriptor toCopy) {
151-
setCustomer(toCopy.customer);
152-
setProduct(toCopy.product);
169+
setCustomerIndex(toCopy.customerIndex);
170+
setProductIndex(toCopy.productIndex);
153171
setDateTime(toCopy.dateTime);
154172
setQuantity(toCopy.quantity);
155173
setMoney(toCopy.money);
@@ -160,16 +178,16 @@ public EditTransactionDescriptor(EditTransactionDescriptor toCopy) {
160178
* Returns true if at least one field is edited.
161179
*/
162180
public boolean isAnyFieldEdited() {
163-
return CollectionUtil.isAnyNonNull(customer, product, dateTime, quantity,
181+
return CollectionUtil.isAnyNonNull(customerIndex, productIndex, dateTime, quantity,
164182
money, description);
165183
}
166184

167-
public void setCustomer(String customer) {
168-
this.customer = customer;
185+
public void setCustomerIndex(Index customer) {
186+
this.customerIndex = customerIndex;
169187
}
170188

171-
public void setProduct(String product) {
172-
this.product = product;
189+
public void setProductIndex(Index product) {
190+
this.productIndex = productIndex;
173191
}
174192

175193
public void setDateTime(DateTime dateTime) {
@@ -188,12 +206,12 @@ public void setDescription(Description description) {
188206
this.description = description;
189207
}
190208

191-
public Optional<String> getCustomer() {
192-
return Optional.ofNullable(customer);
209+
public Optional<Index> getCustomerIndex() {
210+
return Optional.ofNullable(customerIndex);
193211
}
194212

195-
public Optional<String> getProduct() {
196-
return Optional.ofNullable(product);
213+
public Optional<Index> getProductIndex() {
214+
return Optional.ofNullable(productIndex);
197215
}
198216

199217
public Optional<DateTime> getDateTime() {
@@ -227,8 +245,8 @@ public boolean equals(Object other) {
227245
// state check
228246
EditTransactionDescriptor e = (EditTransactionDescriptor) other;
229247

230-
return getCustomer().equals(e.getCustomer())
231-
&& getProduct().equals(e.getProduct())
248+
return getCustomerIndex().equals(e.getCustomerIndex())
249+
&& getProductIndex().equals(e.getProductIndex())
232250
&& getDateTime().equals(e.getDateTime())
233251
&& getQuantity().equals(e.getQuantity())
234252
&& getMoney().equals(e.getMoney())

src/main/java/seedu/address/logic/parser/transaction/AddTransactionCommandParser.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.util.stream.Stream;
1313

14+
import seedu.address.commons.core.index.Index;
1415
import seedu.address.logic.commands.transaction.AddTransactionCommand;
1516
import seedu.address.logic.parser.ArgumentMultimap;
1617
import seedu.address.logic.parser.ArgumentTokenizer;
@@ -20,7 +21,7 @@
2021
import seedu.address.logic.parser.exceptions.ParseException;
2122
import seedu.address.model.transaction.DateTime;
2223
import seedu.address.model.transaction.Money;
23-
import seedu.address.model.transaction.Transaction;
24+
import seedu.address.model.transaction.TransactionFactory;
2425
import seedu.address.model.util.Description;
2526
import seedu.address.model.util.Quantity;
2627

@@ -42,8 +43,8 @@ public AddTransactionCommand parse(String args) throws ParseException {
4243
AddTransactionCommand.MESSAGE_USAGE));
4344
}
4445

45-
String customer = ParserUtil.parseCustomer(argMultimap.getValue(PREFIX_CUSTOMER).get());
46-
String product = ParserUtil.parseProduct(argMultimap.getValue(PREFIX_PRODUCT).get());
46+
Index customerIndex = ParserUtil.parseIndex(argMultimap.getValue(PREFIX_CUSTOMER).get());
47+
Index productIndex = ParserUtil.parseIndex(argMultimap.getValue(PREFIX_PRODUCT).get());
4748
DateTime dateTime = ParserUtil.parseDateTime(argMultimap.getValue(PREFIX_DATETIME).get());
4849
Quantity quantity = ParserUtil.parseQuantity(argMultimap.getValue(PREFIX_QUANTITY).get());
4950
Money money = ParserUtil.parseMoney(argMultimap.getValue(PREFIX_MONEY).get());
@@ -54,9 +55,10 @@ public AddTransactionCommand parse(String args) throws ParseException {
5455
} else {
5556
transDescription = new Description(DEFAULT_VALUE);
5657
}
57-
Transaction transaction = new Transaction(customer, product, dateTime, quantity, money, transDescription);
58+
TransactionFactory transactionFactory = new TransactionFactory(customerIndex, productIndex, dateTime,
59+
quantity, money, transDescription);
5860

59-
return new AddTransactionCommand(transaction);
61+
return new AddTransactionCommand(transactionFactory);
6062
}
6163

6264
/**

src/main/java/seedu/address/logic/parser/transaction/EditTransactionCommandParser.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@ public EditTransactionCommand parse(String args) throws ParseException {
4444

4545
EditTransactionDescriptor editTransactionDescriptor = new EditTransactionDescriptor();
4646
if (argMultimap.getValue(PREFIX_CUSTOMER).isPresent()) {
47-
editTransactionDescriptor.setCustomer(ParserUtil
48-
.parseCustomer(argMultimap.getValue(PREFIX_CUSTOMER).get()));
47+
editTransactionDescriptor.setCustomerIndex(ParserUtil
48+
.parseIndex(argMultimap.getValue(PREFIX_CUSTOMER).get())
49+
);
4950
}
5051
if (argMultimap.getValue(PREFIX_PRODUCT).isPresent()) {
51-
editTransactionDescriptor.setProduct(
52-
ParserUtil.parseProduct(argMultimap.getValue(PREFIX_PRODUCT).get())
52+
editTransactionDescriptor.setProductIndex(
53+
ParserUtil.parseIndex(argMultimap.getValue(PREFIX_PRODUCT).get())
5354
);
5455
}
5556
if (argMultimap.getValue(PREFIX_DATETIME).isPresent()) {

src/main/java/seedu/address/model/transaction/CustomerContainsKeywordPredicate.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ public CustomerContainsKeywordPredicate(List<String> keywords) {
1818
@Override
1919
public boolean test(Transaction transaction) {
2020
return keywords.stream()
21-
.anyMatch(keyword -> StringUtil.containsWordIgnoreCase(transaction.getCustomer(), keyword));
21+
.anyMatch(keyword ->
22+
StringUtil.containsWordIgnoreCase(transaction.getCustomer().getName().toString(), keyword));
2223
}
2324

2425
@Override

src/main/java/seedu/address/model/transaction/ProductContainsKeywordPredicate.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ public ProductContainsKeywordPredicate(List<String> keywords) {
1818
@Override
1919
public boolean test(Transaction transaction) {
2020
return keywords.stream()
21-
.anyMatch(keyword -> StringUtil.containsWordIgnoreCase(transaction.getProduct(), keyword));
21+
.anyMatch(keyword ->
22+
StringUtil.containsWordIgnoreCase(transaction.getProduct().getDescription().value, keyword));
2223
}
2324

2425
@Override

src/main/java/seedu/address/model/transaction/Transaction.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package seedu.address.model.transaction;
22

3+
import seedu.address.model.customer.Customer;
4+
import seedu.address.model.product.Product;
35
import seedu.address.model.util.Description;
46
import seedu.address.model.util.Quantity;
57

@@ -9,15 +11,15 @@
911
*/
1012
public class Transaction {
1113

12-
private final String customer;
13-
private final String product;
14+
private final Customer customer;
15+
private final Product product;
1416
private final DateTime dateTime;
1517
private final Quantity quantity;
1618
private final Money money;
1719
private final Description description;
1820

1921

20-
public Transaction(String customer, String product, DateTime dateTime,
22+
public Transaction(Customer customer, Product product, DateTime dateTime,
2123
Quantity quantity, Money money, Description description) {
2224
this.customer = customer;
2325
this.product = product;
@@ -27,11 +29,11 @@ public Transaction(String customer, String product, DateTime dateTime,
2729
this.description = description;
2830
}
2931

30-
public String getCustomer() {
32+
public Customer getCustomer() {
3133
return customer;
3234
}
3335

34-
public String getProduct() {
36+
public Product getProduct() {
3537
return product;
3638
}
3739

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package seedu.address.model.transaction;
2+
3+
import seedu.address.commons.core.index.Index;
4+
import seedu.address.model.Model;
5+
import seedu.address.model.customer.Customer;
6+
import seedu.address.model.product.Product;
7+
import seedu.address.model.util.Description;
8+
import seedu.address.model.util.Quantity;
9+
10+
/**
11+
* Creates a transaction with the customer and product index.
12+
*/
13+
public class TransactionFactory {
14+
private final Index customerIndex;
15+
private final Index productIndex;
16+
private final DateTime dateTime;
17+
private final Quantity quantity;
18+
private final Money money;
19+
private final Description description;
20+
21+
public TransactionFactory(Index customerIndex, Index productIndex, DateTime dateTime,
22+
Quantity quantity, Money money, Description description) {
23+
this.customerIndex = customerIndex;
24+
this.productIndex = productIndex;
25+
this.quantity = quantity;
26+
this.money = money;
27+
this.dateTime = dateTime;
28+
this.description = description;
29+
}
30+
31+
/**
32+
* Creates a transaction with the found product and customer.
33+
* @param model the model manager.
34+
* @return created transaction.
35+
*/
36+
public Transaction createTransaction(Model model) {
37+
Customer customer = model.getFilteredCustomerList().get(customerIndex.getZeroBased());
38+
Product product = model.getFilteredProductList().get(productIndex.getZeroBased());
39+
40+
return new Transaction(customer, product, dateTime, quantity, money, description);
41+
}
42+
43+
@Override
44+
public boolean equals(Object other) {
45+
if (other == this) {
46+
return true;
47+
}
48+
49+
if (!(other instanceof TransactionFactory)) {
50+
return false;
51+
}
52+
53+
TransactionFactory otherTransactionFactory = (TransactionFactory) other;
54+
return otherTransactionFactory.customerIndex.equals(customerIndex)
55+
&& otherTransactionFactory.productIndex.equals(productIndex)
56+
&& otherTransactionFactory.dateTime.equals(dateTime)
57+
&& otherTransactionFactory.quantity.equals(quantity)
58+
&& otherTransactionFactory.money.equals(money)
59+
&& otherTransactionFactory.description.equals(description);
60+
}
61+
}

0 commit comments

Comments
 (0)