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.ReservationClientDto;
8   import io.extact.rms.client.api.dto.UserAccountClientDto;
9   import io.extact.rms.client.api.exception.BusinessFlowClientException;
10  import io.extact.rms.client.console.ui.ClientConstants;
11  import io.extact.rms.client.console.ui.TransitionMap.RmsScreen;
12  import io.extact.rms.client.console.ui.TransitionMap.Transition;
13  import io.extact.rms.client.console.ui.textio.TextIoUtils;
14  import lombok.RequiredArgsConstructor;
15  
16  @RequiredArgsConstructor
17  public class CancelReservationScreen implements RmsScreen {
18  
19      private final RentalReservationClientApi clientApi;
20  
21      @Override
22      public Transition play(UserAccountClientDto loginUser, boolean printHeader) {
23  
24          if (printHeader) {
25              printScreenHeader(loginUser, "レンタル品予約キャンセル画面");
26          }
27  
28          var ownReservations = clientApi.getOwnReservations();
29  
30          // キャンセル可能な予約がない場合はメニューへ戻る
31          if (ownReservations.isEmpty()) {
32              printWarningInformation(CANNOT_CANCEL_RESERVATION_INFORMATION);
33              waitPressEnter();
34              return Transition.MEMBER_MAIN;
35          }
36  
37          // キャンセル可能な予約一覧を表示
38          println(CANCEL_RESERVATION_INFORMATION);
39          ownReservations.forEach(dto ->
40              println(ClientConstants.RESERVATION_FORMAT.format(dto))
41          );
42          blankLine();
43  
44          // キャンセルする予約を選択
45          var selectedReservation = newIntInputReader()
46                  .withSelectableValues(
47                          ownReservations.stream()
48                              .map(ReservationClientDto::getId)
49                              .toList(),
50                          SCREEN_BREAK_VALUE)
51                  .read("予約番号");
52          if (TextIoUtils.isBreak(selectedReservation)) {
53              return Transition.MEMBER_MAIN;
54          }
55  
56          blankLine();
57  
58          // レンタル品の予約キャンセルの実行
59          try {
60              clientApi.cancelReservation(selectedReservation);
61              printResultInformation(selectedReservation);
62              return Transition.MEMBER_MAIN;
63  
64          } catch (BusinessFlowClientException e) {
65              printServerError(e);
66              return play(loginUser, false); // start over!!
67  
68          }
69      }
70  
71      private void printResultInformation(Integer selectedItem) {
72          println("***** 予約キャンセル確定結果 *****");
73          printf("[%s]の予約をキャンセルしました", selectedItem);
74          blankLine();
75          blankLine();
76          waitPressEnter();
77      }
78  }