1 package io.extact.rms.client.console.ui.member;
2
3 import static io.extact.rms.client.console.ui.ClientConstants.*;
4 import static io.extact.rms.client.console.ui.textio.TextIoUtils.*;
5
6 import io.extact.rms.client.api.RentalReservationClientApi;
7 import io.extact.rms.client.api.dto.RentalItemClientDto;
8 import io.extact.rms.client.api.dto.ReservationClientDto;
9 import io.extact.rms.client.api.dto.UserAccountClientDto;
10 import io.extact.rms.client.api.exception.BusinessFlowClientException;
11 import io.extact.rms.client.console.ui.ClientConstants;
12 import io.extact.rms.client.console.ui.TransitionMap.RmsScreen;
13 import io.extact.rms.client.console.ui.TransitionMap.Transition;
14 import io.extact.rms.client.console.ui.textio.TextIoUtils;
15 import lombok.RequiredArgsConstructor;
16
17 @RequiredArgsConstructor
18 public class ReserveRentalItemScreen implements RmsScreen {
19
20 private final RentalReservationClientApi clientApi;
21
22 @Override
23 public Transition play(UserAccountClientDto loginUser, boolean printHeader) {
24
25 if (printHeader) {
26 printScreenHeader(loginUser, "レンタル品予約画面");
27 }
28
29
30 var items = clientApi.getAllRentalItems();
31 println(ENTRY_RESERVATION_INFORMATION);
32 items.forEach(dto ->
33 println(RENATL_ITEM_FORMAT.format(dto))
34 );
35 blankLine();
36
37
38 var selectedItem = newIntInputReader()
39 .withSelectableValues(
40 items.stream()
41 .map(RentalItemClientDto::getId)
42 .toList(),
43 SCREEN_BREAK_VALUE)
44 .read("レンタル品番号");
45 if (TextIoUtils.isBreak(selectedItem)) {
46 return Transition.MEMBER_MAIN;
47 }
48
49
50 var startDateTime = newLocalDateTimeReader()
51 .withFutureNow()
52 .read("利用開始日時(入力例-2020/04/01 09:00):");
53
54
55 var endDateTime = newLocalDateTimeReader()
56 .withFutureThan(startDateTime)
57 .read("利用終了日時(入力例-2020/04/01 18:00):");
58
59
60 var note = newStringInputReader()
61 .withMaxLength(15)
62 .withDefaultValue("")
63 .read("備考(空白可)");
64
65 blankLine();
66
67
68 try {
69 var addReservation = ReservationClientDto.ofTransient(startDateTime, endDateTime, note, selectedItem, loginUser.getId());
70 var newReservation = clientApi.addReservation(addReservation);
71 printResultInformation(newReservation);
72 return Transition.MEMBER_MAIN;
73
74 } catch (BusinessFlowClientException e) {
75 printServerError(e);
76 return play(loginUser, false);
77
78 }
79 }
80
81 private void printResultInformation(ReservationClientDto newReservation) {
82 println("***** 予約確定結果 *****");
83 printf(ClientConstants.RESERVATION_FORMAT.format(newReservation));
84 blankLine();
85 blankLine();
86 waitPressEnter();
87 }
88 }