mirror of
https://github.com/st-tu-dresden-praktikum/swt23w23
synced 2024-07-19 21:04:36 +02:00
Add staff functionality to CustomCart and CustomOrder
This works on #73 This also contains unit-tests for the CustomOrder.
This commit is contained in:
parent
53c40fec2f
commit
d207386d1d
|
@ -1,11 +1,15 @@
|
||||||
package catering.order;
|
package catering.order;
|
||||||
|
|
||||||
|
import catering.staff.Staff;
|
||||||
import org.salespointframework.order.Cart;
|
import org.salespointframework.order.Cart;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class CustomCart extends Cart {
|
public class CustomCart extends Cart {
|
||||||
|
private Set<Staff> staff;
|
||||||
private OrderType orderType;
|
private OrderType orderType;
|
||||||
private LocalDateTime start;
|
private LocalDateTime start;
|
||||||
private LocalDateTime finish;
|
private LocalDateTime finish;
|
||||||
|
@ -14,10 +18,37 @@ public class CustomCart extends Cart {
|
||||||
// Constructor
|
// Constructor
|
||||||
public CustomCart(OrderType orderType, LocalDateTime start, LocalDateTime finish) {
|
public CustomCart(OrderType orderType, LocalDateTime start, LocalDateTime finish) {
|
||||||
super();
|
super();
|
||||||
|
this.staff = new HashSet<>();
|
||||||
this.orderType = orderType;
|
this.orderType = orderType;
|
||||||
this.start = start;
|
this.start = start;
|
||||||
this.finish = finish;
|
this.finish = finish;
|
||||||
this.formatterPattern = "dd.MM.yyy, HH:mm 'Uhr'";
|
this.formatterPattern = "dd.MM.yyyy, HH:mm 'Uhr'";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an employee to the cart
|
||||||
|
*/
|
||||||
|
public boolean addStaff(Staff staff) {
|
||||||
|
return this.staff.add(staff);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Staff> getStaff() {
|
||||||
|
return staff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeStaff(Staff staff) {
|
||||||
|
return this.staff.remove(staff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add staff to order (analogous to cart.addItemsTo(order))
|
||||||
|
*/
|
||||||
|
public CustomOrder addStaffTo(CustomOrder order) {
|
||||||
|
for (Staff staff : this.staff) {
|
||||||
|
order.addStaff(staff);
|
||||||
|
}
|
||||||
|
|
||||||
|
return order;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OrderType getOrderType() {
|
public OrderType getOrderType() {
|
||||||
|
@ -36,6 +67,13 @@ public class CustomCart extends Cart {
|
||||||
this.start = start;
|
this.start = start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return hours between start and finish
|
||||||
|
*/
|
||||||
|
public long getDurationInHours(LocalDateTime start, LocalDateTime finish) {
|
||||||
|
return Duration.between(start, finish).getSeconds() / 3600;
|
||||||
|
}
|
||||||
|
|
||||||
public LocalDateTime getFinish() {
|
public LocalDateTime getFinish() {
|
||||||
return finish;
|
return finish;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,32 +1,73 @@
|
||||||
package catering.order;
|
package catering.order;
|
||||||
|
|
||||||
|
import catering.staff.Staff;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.GeneratedValue;
|
||||||
|
import jakarta.persistence.GenerationType;
|
||||||
|
import jakarta.persistence.OneToMany;
|
||||||
|
import org.javamoney.moneta.Money;
|
||||||
import org.salespointframework.order.Order;
|
import org.salespointframework.order.Order;
|
||||||
import org.salespointframework.payment.Cash;
|
import org.salespointframework.payment.Cash;
|
||||||
import org.salespointframework.useraccount.UserAccount;
|
import org.salespointframework.useraccount.UserAccount;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.data.annotation.Id;
|
||||||
|
|
||||||
|
import javax.money.MonetaryAmount;
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
public class CustomOrder extends Order {
|
public class CustomOrder extends Order {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
@OneToMany
|
||||||
|
private Set<Staff> staff;
|
||||||
private OrderType orderType = OrderType.SOMETHING_ELSE;
|
private OrderType orderType = OrderType.SOMETHING_ELSE;
|
||||||
private LocalDateTime start;
|
private LocalDateTime start;
|
||||||
private LocalDateTime finish;
|
private LocalDateTime finish;
|
||||||
private boolean invoiceAvailable = false;
|
private boolean invoiceAvailable = false;
|
||||||
private String formatterPattern = "dd.MM.yyy, HH:mm 'Uhr'";
|
private String formatterPattern = "dd.MM.yyyy, HH:mm 'Uhr'";
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public CustomOrder(UserAccount.UserAccountIdentifier identifier, CustomCart cart) {
|
public CustomOrder(UserAccount.UserAccountIdentifier identifier, CustomCart cart) {
|
||||||
super(identifier, Cash.CASH);
|
super(identifier, Cash.CASH);
|
||||||
|
this.staff = new HashSet<>();
|
||||||
this.orderType = cart.getOrderType();
|
this.orderType = cart.getOrderType();
|
||||||
this.start = cart.getStart();
|
this.start = cart.getStart();
|
||||||
this.finish = cart.getFinish();
|
this.finish = cart.getFinish();
|
||||||
this.formatterPattern = cart.getFormatterPattern();
|
this.formatterPattern = cart.getFormatterPattern();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CustomOrder() {} // TODO: find out, why this is mandatory
|
public CustomOrder() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function to get the amount of hours in between start and finish (analogous to CustomCart)
|
||||||
|
* @return hours between start and finish
|
||||||
|
*/
|
||||||
|
private long getDurationInHours(LocalDateTime start, LocalDateTime finish) {
|
||||||
|
return Duration.between(start, finish).getSeconds() / 3600;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an employee to the order and adds a new {@Link ChangeLine} containing the costs
|
||||||
|
*/
|
||||||
|
public boolean addStaff(Staff staff) {
|
||||||
|
MonetaryAmount cost = Money.of(12.0, "EUR")
|
||||||
|
.multiply(getDurationInHours(this.start, this.finish)); // TODO: Get salary from staff
|
||||||
|
|
||||||
|
if (this.staff.add(staff)) {
|
||||||
|
super.addChargeLine(cost, staff.getId().toString());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Staff> getStaff() {
|
||||||
|
return staff;
|
||||||
|
}
|
||||||
|
|
||||||
public OrderType getOrderType() {
|
public OrderType getOrderType() {
|
||||||
return orderType;
|
return orderType;
|
||||||
|
@ -36,26 +77,24 @@ public class CustomOrder extends Order {
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return start DateTime in a formatted manner
|
||||||
|
*/
|
||||||
public String getFormattedStart() {
|
public String getFormattedStart() {
|
||||||
return start.format(DateTimeFormatter.ofPattern(formatterPattern));
|
return start.format(DateTimeFormatter.ofPattern(formatterPattern));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStart(LocalDateTime start) {
|
|
||||||
this.start = start;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalDateTime getFinish() {
|
public LocalDateTime getFinish() {
|
||||||
return finish;
|
return finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return finish DateTime in a formatted manner
|
||||||
|
*/
|
||||||
public String getFormattedFinish() {
|
public String getFormattedFinish() {
|
||||||
return finish.format(DateTimeFormatter.ofPattern(formatterPattern));
|
return finish.format(DateTimeFormatter.ofPattern(formatterPattern));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFinish(LocalDateTime finish) {
|
|
||||||
this.finish = finish;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInvoiceAvailable() {
|
public boolean isInvoiceAvailable() {
|
||||||
return invoiceAvailable;
|
return invoiceAvailable;
|
||||||
}
|
}
|
||||||
|
|
85
src/test/java/catering/order/OrderUnitTests.java
Normal file
85
src/test/java/catering/order/OrderUnitTests.java
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
package catering.order;
|
||||||
|
|
||||||
|
import catering.staff.JobType;
|
||||||
|
import catering.staff.Staff;
|
||||||
|
import catering.staff.StaffManagement;
|
||||||
|
import org.javamoney.moneta.Money;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.salespointframework.catalog.Product;
|
||||||
|
import org.salespointframework.quantity.Quantity;
|
||||||
|
import org.salespointframework.useraccount.UserAccount;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.*;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
public class OrderUnitTests {
|
||||||
|
@Autowired
|
||||||
|
StaffManagement staffManagement;
|
||||||
|
Staff staff;
|
||||||
|
CustomOrder order;
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
staff = new Staff("Peter Muffin", JobType.COOK);
|
||||||
|
staffManagement.addStaff(staff);
|
||||||
|
|
||||||
|
order = new CustomOrder(UserAccount.UserAccountIdentifier.of("12345"),
|
||||||
|
new CustomCart(OrderType.RENT_A_COOK,
|
||||||
|
LocalDateTime.of(2023, 11, 10, 22, 0),
|
||||||
|
LocalDateTime.of(2023, 11, 11, 9, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void dateTimeFormatter() {
|
||||||
|
assertThat(order.getFormattedStart()).isEqualTo("10.11.2023, 22:00 Uhr");
|
||||||
|
assertThat(order.getFormattedFinish()).isEqualTo("11.11.2023, 09:00 Uhr");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addStaffToOrder() {
|
||||||
|
order.addStaff(staff);
|
||||||
|
|
||||||
|
// test if staff was added
|
||||||
|
assertThat(order.getStaff()).hasSize(1);
|
||||||
|
|
||||||
|
// test if ChargeLine is correct
|
||||||
|
assertThat(order.getChargeLines().stream().count()).isEqualTo(1);
|
||||||
|
assertThat(order.getChargeLines().getTotal()).isEqualTo(Money.of(11*12, "EUR"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void orderWithStaffAndProducts() {
|
||||||
|
order.addOrderLine(new Product("Brötchen (vegan)",
|
||||||
|
Money.of(0.6, "EUR")),
|
||||||
|
Quantity.of(10));
|
||||||
|
|
||||||
|
order.addStaff(staff);
|
||||||
|
|
||||||
|
// test if staff was added
|
||||||
|
assertThat(order.getStaff()).hasSize(1);
|
||||||
|
assertThat(order.getOrderLines().stream().count()).isEqualTo(1);
|
||||||
|
|
||||||
|
// test if ChargeLine is correct
|
||||||
|
assertThat(order.getChargeLines().stream().count()).isEqualTo(1);
|
||||||
|
|
||||||
|
// test if costs are correct
|
||||||
|
assertThat(order.getChargeLines().getTotal()).isEqualTo(Money.of(11*12, "EUR"));
|
||||||
|
assertThat(order.getOrderLines().getTotal()).isEqualTo(Money.of(10.0*0.6, "EUR"));
|
||||||
|
assertThat(order.getTotal()).isEqualTo(Money.of(11.0 * 12.0 + 10.0 * 0.6, "EUR"));
|
||||||
|
|
||||||
|
// test for duplication
|
||||||
|
order.addStaff(staff);
|
||||||
|
assertThat(order.getStaff()).hasSize(1);
|
||||||
|
assertThat(order.getOrderLines().stream().count()).isEqualTo(1);
|
||||||
|
assertThat(order.getChargeLines().stream().count()).isEqualTo(1);
|
||||||
|
assertThat(order.getChargeLines().getTotal()).isEqualTo(Money.of(11*12, "EUR"));
|
||||||
|
assertThat(order.getOrderLines().getTotal()).isEqualTo(Money.of(10.0*0.6, "EUR"));
|
||||||
|
assertThat(order.getTotal()).isEqualTo(Money.of(11.0 * 12.0 + 10.0 * 0.6, "EUR"));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue