diff --git a/src/main/java/com/github/prominence/carrepair/CarRepairApplication.java b/src/main/java/com/github/prominence/carrepair/CarRepairApplication.java index 9640902..3ae0d8e 100644 --- a/src/main/java/com/github/prominence/carrepair/CarRepairApplication.java +++ b/src/main/java/com/github/prominence/carrepair/CarRepairApplication.java @@ -19,4 +19,5 @@ public class CarRepairApplication { // TODO: DTO // TODO: i18n // TODO: tests -// TODO: big data \ No newline at end of file +// TODO: big data +// TODO: add autocomplete \ No newline at end of file diff --git a/src/main/java/com/github/prominence/carrepair/controller/OrderController.java b/src/main/java/com/github/prominence/carrepair/controller/OrderController.java new file mode 100644 index 0000000..1e99d98 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/controller/OrderController.java @@ -0,0 +1,106 @@ +package com.github.prominence.carrepair.controller; + +import com.github.prominence.carrepair.enums.OrderStatus; +import com.github.prominence.carrepair.model.Order; +import com.github.prominence.carrepair.service.ClientService; +import com.github.prominence.carrepair.service.MechanicService; +import com.github.prominence.carrepair.service.OrderService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Optional; + +@Controller +@RequestMapping(value = "/order") +public class OrderController { + + private OrderService orderService; + private ClientService clientService; + private MechanicService mechanicService; + + public OrderController(OrderService orderService, ClientService clientService, MechanicService mechanicService) { + this.orderService = orderService; + this.clientService = clientService; + this.mechanicService = mechanicService; + } + + @GetMapping + public String index(ModelMap modelMap) { + Page orderList = orderService.findAll((Pageable) modelMap.get("pagination")); + + modelMap.addAttribute("orderList", orderList.getContent()); + modelMap.addAttribute("totalPages", orderList.getTotalPages()); + + return "order/index"; + } + + @GetMapping(value = "/create") + public String create(Model model) { + model.addAttribute("order", new Order()); + model.addAttribute("clientIdsList", clientService.getAllClientIds()); + model.addAttribute("mechanicIdsList", mechanicService.getAllMechanicIds()); + model.addAttribute("orderStatuses", new OrderStatus[] { OrderStatus.SCHEDULED, OrderStatus.DONE, OrderStatus.ACCEPTED }); + + return "order/edit"; + } + + @GetMapping(value = "/edit/{id}") + public String edit(@PathVariable Long id, Model model) { + Optional orderOptional = orderService.findById(id); + if (orderOptional.isPresent()) { + model.addAttribute("order", orderOptional.get()); + model.addAttribute("clientIdsList", clientService.getAllClientIds()); + model.addAttribute("mechanicIdsList", mechanicService.getAllMechanicIds()); + model.addAttribute("orderStatuses", new OrderStatus[] { OrderStatus.SCHEDULED, OrderStatus.DONE, OrderStatus.ACCEPTED }); + return "order/edit"; + } else { + // TODO: need to show warning + return "redirect:/order"; + } + } + + @PostMapping(value = "/update/{id}") + public String update(@Valid Order order, BindingResult bindingResult, @PathVariable long id, Model model) { + if (bindingResult.hasErrors()) { + order.setId(id); // why should we do this? + model.addAttribute("clientIdsList", clientService.getAllClientIds()); + model.addAttribute("mechanicIdsList", mechanicService.getAllMechanicIds()); + model.addAttribute("orderStatuses", new OrderStatus[] { OrderStatus.SCHEDULED, OrderStatus.DONE, OrderStatus.ACCEPTED }); + return "order/edit"; + } + + orderService.save(order); + return "redirect:/order"; + } + + @PostMapping(value = "/create") + public String save(@Valid Order order, BindingResult bindingResult, Model model) { + if (bindingResult.hasErrors()) { + model.addAttribute("clientIdsList", clientService.getAllClientIds()); + model.addAttribute("mechanicIdsList", mechanicService.getAllMechanicIds()); + model.addAttribute("orderStatuses", new OrderStatus[] { OrderStatus.SCHEDULED, OrderStatus.DONE, OrderStatus.ACCEPTED }); + return "order/edit"; + } + + orderService.save(order); + return "redirect:/order"; + } + + @DeleteMapping(value = "/delete/{id}") + public ResponseEntity delete(@PathVariable Long id) { + boolean deleteSuccess = orderService.deleteOrderById(id); + + if (deleteSuccess) { + return ResponseEntity.ok().build(); + } else { + return ResponseEntity.notFound().build(); + } + } +} diff --git a/src/main/java/com/github/prominence/carrepair/controller/advice/GlobalInfoAdvice.java b/src/main/java/com/github/prominence/carrepair/controller/advice/GlobalInfoAdvice.java index 5818eef..2333e77 100644 --- a/src/main/java/com/github/prominence/carrepair/controller/advice/GlobalInfoAdvice.java +++ b/src/main/java/com/github/prominence/carrepair/controller/advice/GlobalInfoAdvice.java @@ -1,6 +1,8 @@ package com.github.prominence.carrepair.controller.advice; -import com.github.prominence.carrepair.service.CarRepairService; +import com.github.prominence.carrepair.service.ClientService; +import com.github.prominence.carrepair.service.MechanicService; +import com.github.prominence.carrepair.service.OrderService; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ModelAttribute; @@ -8,16 +10,20 @@ import org.springframework.web.bind.annotation.ModelAttribute; @ControllerAdvice public class GlobalInfoAdvice { - private final CarRepairService carRepairService; + private final ClientService clientService; + private final MechanicService mechanicService; + private final OrderService orderService; - public GlobalInfoAdvice(CarRepairService carRepairService) { - this.carRepairService = carRepairService; + public GlobalInfoAdvice(ClientService clientService, MechanicService mechanicService, OrderService orderService) { + this.clientService = clientService; + this.mechanicService = mechanicService; + this.orderService = orderService; } @ModelAttribute("globalInfo") public void addBadgeInfo(Model model) { - model.addAttribute("clientsCount", carRepairService.getClientCount()); - model.addAttribute("mechanicsCount", carRepairService.getMechanicCount()); - model.addAttribute("ordersCount", carRepairService.getOrderCount()); + model.addAttribute("clientsCount", clientService.getClientCount()); + model.addAttribute("mechanicsCount", mechanicService.getMechanicCount()); + model.addAttribute("ordersCount", orderService.getOrderCount()); } } diff --git a/src/main/java/com/github/prominence/carrepair/demo/DemoDataPopulator.java b/src/main/java/com/github/prominence/carrepair/demo/DemoDataPopulator.java index 9e1d929..a4f093e 100644 --- a/src/main/java/com/github/prominence/carrepair/demo/DemoDataPopulator.java +++ b/src/main/java/com/github/prominence/carrepair/demo/DemoDataPopulator.java @@ -1,22 +1,31 @@ package com.github.prominence.carrepair.demo; import com.github.javafaker.Faker; +import com.github.prominence.carrepair.enums.OrderStatus; import com.github.prominence.carrepair.model.Client; import com.github.prominence.carrepair.model.Mechanic; +import com.github.prominence.carrepair.model.Order; import com.github.prominence.carrepair.service.ClientService; import com.github.prominence.carrepair.service.MechanicService; +import com.github.prominence.carrepair.service.OrderService; +import org.apache.commons.lang3.RandomUtils; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Bean; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; @Component public class DemoDataPopulator { - private static final int COUNT = 10; + private static final int COUNT = 100; private Faker faker = new Faker(); @@ -32,9 +41,7 @@ public class DemoDataPopulator { return client; }).limit(COUNT).collect(Collectors.toList()); - return args -> { - demoClientList.forEach(clientService::save); - }; + return args -> demoClientList.forEach(clientService::save); } @Bean @@ -49,9 +56,46 @@ public class DemoDataPopulator { return mechanic; }).limit(COUNT).collect(Collectors.toList()); - return args -> { - demoMechanicList.forEach(mechanicService::save); - }; + return args -> demoMechanicList.forEach(mechanicService::save); + } + + @Bean + public CommandLineRunner orderDemoData(OrderService orderService, ClientService clientService, MechanicService mechanicService) { + final OrderStatus[] orderStatuses = OrderStatus.values(); + long mechanicsCount = mechanicService.getMechanicCount(); + long clientsCount = clientService.getClientCount(); + + List demoOrderList = Stream.generate(() -> { + Order order = new Order(); + order.setOrderStatus(orderStatuses[RandomUtils.nextInt(0, 3)]); + order.setDescription(faker.lorem().characters(10, 1024)); + order.setTotalPrice(BigDecimal.valueOf(faker.number().randomDouble(4, 100, 9999))); + order.setCreatedOn(LocalDateTime.ofInstant(faker.date().past(5, TimeUnit.DAYS).toInstant(), ZoneId.systemDefault())); + + if (order.getOrderStatus() == OrderStatus.ACCEPTED) { + order.setFinishedOn(LocalDateTime.ofInstant(faker.date().future(10, TimeUnit.DAYS).toInstant(), ZoneId.systemDefault())); + } + + final List clientListSlice = clientService.findAll(getRandomPageable(clientsCount)).getContent(); + final Client randomClient = clientListSlice.get(RandomUtils.nextInt(0, clientListSlice.size())); + order.setClient(randomClient); + + final List mechanicListSlise = mechanicService.findAll(getRandomPageable(mechanicsCount)).getContent(); + final Mechanic randomMechanic = mechanicListSlise.get(RandomUtils.nextInt(0, mechanicListSlise.size())); + order.setMechanic(randomMechanic); + + System.out.println(order); // demo output + return order; + }).limit(COUNT).collect(Collectors.toList()); + + return args -> demoOrderList.forEach(orderService::save); + } + + private Pageable getRandomPageable(long totalRecords) { + final int size = 10; + final int totalPages = (int) (totalRecords / size); + + return PageRequest.of(RandomUtils.nextInt(0, totalPages), size); } } diff --git a/src/main/java/com/github/prominence/carrepair/formatter/CustomDateTimeFormatter.java b/src/main/java/com/github/prominence/carrepair/formatter/CustomDateTimeFormatter.java new file mode 100644 index 0000000..5f2ff72 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/formatter/CustomDateTimeFormatter.java @@ -0,0 +1,22 @@ +package com.github.prominence.carrepair.formatter; + +import org.springframework.format.Formatter; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +@Component +public class CustomDateTimeFormatter implements Formatter { + @Override + public LocalDateTime parse(String text, Locale locale) throws ParseException { + return LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + + @Override + public String print(LocalDateTime object, Locale locale) { + return object.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } +} diff --git a/src/main/java/com/github/prominence/carrepair/formatter/OrderStatusFormatter.java b/src/main/java/com/github/prominence/carrepair/formatter/OrderStatusFormatter.java new file mode 100644 index 0000000..aa2b7ac --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/formatter/OrderStatusFormatter.java @@ -0,0 +1,22 @@ +package com.github.prominence.carrepair.formatter; + +import com.github.prominence.carrepair.enums.OrderStatus; +import org.apache.commons.lang3.StringUtils; +import org.springframework.format.Formatter; +import org.springframework.stereotype.Component; + +import java.text.ParseException; +import java.util.Locale; + +@Component +public class OrderStatusFormatter implements Formatter { + @Override + public OrderStatus parse(String text, Locale locale) throws ParseException { + return OrderStatus.valueOf(text.toUpperCase()); + } + + @Override + public String print(OrderStatus object, Locale locale) { + return StringUtils.capitalize(object.toString().toLowerCase()); + } +} diff --git a/src/main/java/com/github/prominence/carrepair/model/Order.java b/src/main/java/com/github/prominence/carrepair/model/Order.java index d5d5312..a352c9d 100644 --- a/src/main/java/com/github/prominence/carrepair/model/Order.java +++ b/src/main/java/com/github/prominence/carrepair/model/Order.java @@ -3,9 +3,12 @@ package com.github.prominence.carrepair.model; import com.github.prominence.carrepair.enums.OrderStatus; import javax.persistence.*; +import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Objects; @Entity @Table(name = "orders") @@ -16,13 +19,14 @@ public class Order { private long id; @NotNull + @Size(max = 1024) private String description; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.EAGER) // change to LAZY after DTO implementation @JoinColumn(name = "client_id", nullable = false) private Client client; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.EAGER) // change to LAZY after DTO implementation @JoinColumn(name = "mechanic_id", nullable = false) private Mechanic mechanic; @@ -33,6 +37,7 @@ public class Order { @Column(name = "finishedOn") private LocalDateTime finishedOn; + @Min(value = 0) @Column(name = "totalPrice") private BigDecimal totalPrice; @@ -116,4 +121,38 @@ public class Order { public void setOrderStatus(OrderStatus orderStatus) { this.orderStatus = orderStatus.toString(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Order)) return false; + Order order = (Order) o; + return id == order.id && + Objects.equals(description, order.description) && + Objects.equals(client, order.client) && + Objects.equals(mechanic, order.mechanic) && + Objects.equals(createdOn, order.createdOn) && + Objects.equals(finishedOn, order.finishedOn) && + Objects.equals(totalPrice, order.totalPrice) && + Objects.equals(orderStatus, order.orderStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, description, client, mechanic, createdOn, finishedOn, totalPrice, orderStatus); + } + + @Override + public String toString() { + return "Order{" + + "id=" + id + + ", description='" + description + '\'' + + ", client=" + client + + ", mechanic=" + mechanic + + ", createdOn=" + createdOn + + ", finishedOn=" + finishedOn + + ", totalPrice=" + totalPrice + + ", orderStatus='" + orderStatus + '\'' + + '}'; + } } diff --git a/src/main/java/com/github/prominence/carrepair/repository/ClientRepository.java b/src/main/java/com/github/prominence/carrepair/repository/ClientRepository.java index fc48478..22d4fe7 100644 --- a/src/main/java/com/github/prominence/carrepair/repository/ClientRepository.java +++ b/src/main/java/com/github/prominence/carrepair/repository/ClientRepository.java @@ -2,9 +2,14 @@ package com.github.prominence.carrepair.repository; import com.github.prominence.carrepair.model.Client; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface ClientRepository extends JpaRepository { + @Query(value = "select c.id from Client c") + public List findAllClientIds(); } diff --git a/src/main/java/com/github/prominence/carrepair/repository/MechanicRepository.java b/src/main/java/com/github/prominence/carrepair/repository/MechanicRepository.java index 0d6b0dd..e023f3f 100644 --- a/src/main/java/com/github/prominence/carrepair/repository/MechanicRepository.java +++ b/src/main/java/com/github/prominence/carrepair/repository/MechanicRepository.java @@ -2,8 +2,14 @@ package com.github.prominence.carrepair.repository; import com.github.prominence.carrepair.model.Mechanic; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface MechanicRepository extends JpaRepository { + + @Query(value = "select m.id from Mechanic m") + public List findAllMechanicIds(); } diff --git a/src/main/java/com/github/prominence/carrepair/service/CarRepairService.java b/src/main/java/com/github/prominence/carrepair/service/CarRepairService.java deleted file mode 100644 index c0b8cc7..0000000 --- a/src/main/java/com/github/prominence/carrepair/service/CarRepairService.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.prominence.carrepair.service; - -import com.github.prominence.carrepair.repository.ClientRepository; -import com.github.prominence.carrepair.repository.MechanicRepository; -import com.github.prominence.carrepair.repository.OrderRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class CarRepairService { - - private ClientRepository clientRepository; - private MechanicRepository mechanicRepository; - private OrderRepository orderRepository; - - @Autowired - public CarRepairService(ClientRepository clientRepository, MechanicRepository mechanicRepository, OrderRepository orderRepository) { - this.clientRepository = clientRepository; - this.mechanicRepository = mechanicRepository; - this.orderRepository = orderRepository; - } - - public long getClientCount() { - return clientRepository.count(); - } - - public long getMechanicCount() { - return mechanicRepository.count(); - } - - public long getOrderCount() { - return orderRepository.count(); - } -} diff --git a/src/main/java/com/github/prominence/carrepair/service/ClientService.java b/src/main/java/com/github/prominence/carrepair/service/ClientService.java index 6fa19b9..f367a03 100644 --- a/src/main/java/com/github/prominence/carrepair/service/ClientService.java +++ b/src/main/java/com/github/prominence/carrepair/service/ClientService.java @@ -6,6 +6,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; @Service @@ -37,4 +38,12 @@ public class ClientService { return false; } } + + public long getClientCount() { + return clientRepository.count(); + } + + public List getAllClientIds() { + return clientRepository.findAllClientIds(); + } } diff --git a/src/main/java/com/github/prominence/carrepair/service/MechanicService.java b/src/main/java/com/github/prominence/carrepair/service/MechanicService.java index ab5caf9..0ba76b7 100644 --- a/src/main/java/com/github/prominence/carrepair/service/MechanicService.java +++ b/src/main/java/com/github/prominence/carrepair/service/MechanicService.java @@ -58,4 +58,12 @@ public class MechanicService { return statistics; } + + public long getMechanicCount() { + return mechanicRepository.count(); + } + + public List getAllMechanicIds() { + return mechanicRepository.findAllMechanicIds(); + } } diff --git a/src/main/java/com/github/prominence/carrepair/service/OrderService.java b/src/main/java/com/github/prominence/carrepair/service/OrderService.java new file mode 100644 index 0000000..f87f2c0 --- /dev/null +++ b/src/main/java/com/github/prominence/carrepair/service/OrderService.java @@ -0,0 +1,44 @@ +package com.github.prominence.carrepair.service; + +import com.github.prominence.carrepair.model.Order; +import com.github.prominence.carrepair.repository.OrderRepository; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class OrderService { + + private OrderRepository orderRepository; + + public OrderService(OrderRepository orderRepository) { + this.orderRepository = orderRepository; + } + + public Page findAll(Pageable pageable) { + return orderRepository.findAll(pageable); + } + + public Optional findById(Long id) { + return orderRepository.findById(id); + } + + public Order save(Order client) { + return orderRepository.save(client); + } + + public boolean deleteOrderById(Long id) { + try { + orderRepository.deleteById(id); + return true; + } catch (Exception e) { + return false; + } + } + + public long getOrderCount() { + return orderRepository.count(); + } +} diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index b629f23..20d903e 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -8,6 +8,7 @@ home.requirements.label = Requirements client.title = Clients mechanic.title = Mechanics +order.title = Orders firstName.label = First Name middleName.label = Middle Name @@ -16,6 +17,12 @@ phoneNo.label = Phone No hourlyPayment.label = Hourly Payment status.label = Status amount.label = Amount +client.label = Client +mechanic.label = Mechanic +description.label = Description +createdOn.label = Created On +finishedOn.label = Finished On +totalPrice.label = Total Price showStatistics.button = Statistics diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index b629f23..20d903e 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -8,6 +8,7 @@ home.requirements.label = Requirements client.title = Clients mechanic.title = Mechanics +order.title = Orders firstName.label = First Name middleName.label = Middle Name @@ -16,6 +17,12 @@ phoneNo.label = Phone No hourlyPayment.label = Hourly Payment status.label = Status amount.label = Amount +client.label = Client +mechanic.label = Mechanic +description.label = Description +createdOn.label = Created On +finishedOn.label = Finished On +totalPrice.label = Total Price showStatistics.button = Statistics diff --git a/src/main/resources/messages_ru.properties b/src/main/resources/messages_ru.properties index 153a256..94f0837 100644 --- a/src/main/resources/messages_ru.properties +++ b/src/main/resources/messages_ru.properties @@ -8,6 +8,7 @@ home.requirements.label = Требования client.title = Клиенты mechanic.title = Механики +order.title = Заказы firstName.label = Имя middleName.label = Отчество @@ -16,6 +17,12 @@ phoneNo.label = Номер телефона hourlyPayment.label = Почасовая оплата status.label = Статус amount.label = Количество +client.label = Клиент +mechanic.label = Механик +description.label = Описание +createdOn.label = Дата создания +finishedOn.label = Дата окончания +totalPrice.label = Итоговая цена showStatistics.button = Статистика diff --git a/src/main/resources/static/css/main.css b/src/main/resources/static/css/main.css index 01e225a..5d91a51 100644 --- a/src/main/resources/static/css/main.css +++ b/src/main/resources/static/css/main.css @@ -3,4 +3,12 @@ body { .fieldError { border: 1px solid red; +} + +.word-breakable { + word-break: break-all; +} + +.btn-group { + display: flex; } \ No newline at end of file diff --git a/src/main/resources/templates/common.html b/src/main/resources/templates/common.html index bfbe2b3..91a954a 100644 --- a/src/main/resources/templates/common.html +++ b/src/main/resources/templates/common.html @@ -16,5 +16,9 @@
  • + + + + \ No newline at end of file diff --git a/src/main/resources/templates/main.html b/src/main/resources/templates/main.html index 1dd389d..8478c76 100644 --- a/src/main/resources/templates/main.html +++ b/src/main/resources/templates/main.html @@ -21,7 +21,7 @@ diff --git a/src/main/resources/templates/mechanic/edit.html b/src/main/resources/templates/mechanic/edit.html index 659ebf6..6096e2e 100644 --- a/src/main/resources/templates/mechanic/edit.html +++ b/src/main/resources/templates/mechanic/edit.html @@ -33,7 +33,7 @@
    - +
    diff --git a/src/main/resources/templates/order/edit.html b/src/main/resources/templates/order/edit.html new file mode 100644 index 0000000..c989af8 --- /dev/null +++ b/src/main/resources/templates/order/edit.html @@ -0,0 +1,77 @@ + + + + + + +
    +

    + +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/resources/templates/order/index.html b/src/main/resources/templates/order/index.html new file mode 100644 index 0000000..54b89f9 --- /dev/null +++ b/src/main/resources/templates/order/index.html @@ -0,0 +1,67 @@ + + + + + + + + +
    +

    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
     
    +
    + + +
    +
    +
    +
    + + + \ No newline at end of file