View Javadoc
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); // start over!!
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  }