package catering.order; import org.springframework.data.util.Streamable; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; import java.util.Optional; @Controller public class OrderController { private final CustomOrderRepository orderRepository; private final CustomCart cart; public OrderController(CustomOrderRepository orderRepository, CustomCart cart) { this.orderRepository = orderRepository; this.cart = cart; } @GetMapping("/orders") public String orders(Model model) { model.addAttribute("orders", orderRepository.getOrders()); model.addAttribute("total", orderRepository.getOrders().size()); return "orders"; } @GetMapping("/event") public String event(Model model) { model.addAttribute("orderType", cart.getOrderType()); model.addAttribute("items", cart.getProucts()); model.addAttribute("productForm", new ProductForm()); return "event"; } @PostMapping("/orders/remove") public String removeOrder(@RequestParam int orderID) { orderRepository.removeOrder(orderID); return "redirect:/orders"; } @PostMapping("/event/addProduct") public String addProduct(@ModelAttribute ProductForm productForm, Model model) { cart.addProduct(productForm.getProduct(), productForm.getNumber()); model.addAttribute("orderType", cart.getOrderType()); model.addAttribute("items", cart.getProucts()); model.addAttribute("productForm", new ProductForm()); return "redirect:/event"; } @PostMapping("/event/checkout") public String checkout(Model model) { CustomOrder myOrder = new CustomOrder( cart.getOrderType(), LocalDateTime.MIN, LocalDateTime.MAX, cart.getProucts(), false, Double.MAX_VALUE ); orderRepository.addOrder(myOrder); model.addAttribute("orders", orderRepository.getOrders()); model.addAttribute("total", orderRepository.getOrders().size()); cart.resetCart(); return "redirect:/orders"; } @PostMapping("/event/changeOrderType") public String changeOrderType(@RequestParam(name = "orderType") Optional optionalOrderType, Model model) { String orderType = optionalOrderType.orElse("FOO"); switch (orderType) { case "RaK": cart.setOrderType(CustomOrder.OrderType.RENT_A_COOK); break; case "EK": cart.setOrderType(CustomOrder.OrderType.EVENT_CATERING); break; case "SN": cart.setOrderType(CustomOrder.OrderType.SUSHI_NIGHT); break; default: } return "redirect:/event"; } @GetMapping("/orders/calender") public String calender(Model model) { LocalDate startDate = LocalDate.now(); ArrayList>> weeksOfMonth = new ArrayList>>(4); for (int i = 0; i < 4; i++) { ArrayList datesOfTheWeek = new ArrayList(7); LocalDate startOfWeek = startDate.plusDays(7*i); LocalDate endOfWeekDate = startOfWeek.plusDays(6); for (LocalDate date = startOfWeek; !date.isAfter(endOfWeekDate); date = date.plusDays(1)) { datesOfTheWeek.add(date); } ArrayList> week_to_add_to_month = new ArrayList>(7); for (LocalDate date : datesOfTheWeek) { ArrayList x = new ArrayList(2); x.add(Integer.toString(date.getDayOfMonth())); week_to_add_to_month.add(x); } //datesOfTheWeek.clear(); weeksOfMonth.add(week_to_add_to_month); } LocalDate endDate = startDate.plusDays(27); // get orders_in_next_month (in future sorted by endDate) Iterable orders_in_next_month = this.orderRepository.getOrders().stream().filter(e -> !e.getFinish().toLocalDate().isBefore(startDate) && // end is not before today !e.getStart().toLocalDate().isAfter(endDate)).toList(); for (CustomOrder order : orders_in_next_month) { int start_index_inclusive = Math.max(order.getStart().toLocalDate().compareTo(startDate),0); int end_index_exclusive = Math.min(order.getFinish().toLocalDate().compareTo(startDate), 27) + 1; for (int i = start_index_inclusive; i < end_index_exclusive; i++) { weeksOfMonth.get((int) i/7).get(Math.floorMod(i,7)).add(Integer.toString(order.getId())); } } // for (List> orders_in_next_week : orders_in_next_month) { // orders_in_next_weeks.stream().filter(e -> // e.start.toLocalDate().isEqual(calender_day) || // start day // e.end.toLocalDate().isEqual(calender_day) || // end day // e.start.toLocalDate().isBefore(calender_day) && end.toLocalDate().isAfter(calender_day) // day in between start and end // ).toList().count(); // } // calendar header with names of week LocalDate endOfWeekDate = startDate.plusDays(6); ArrayList dayNames = new ArrayList(7); for (LocalDate date = startDate; !date.isAfter(endOfWeekDate); date = date.plusDays(1)) { dayNames.add(date.getDayOfWeek().toString()); } model.addAttribute("weeksOfMonth", weeksOfMonth); model.addAttribute("dayNames", dayNames); return "orders_calender"; } }