You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
4.6KB

  1. import { Box, Step, StepLabel, Stepper } from "@mui/material";
  2. import { HTParking } from "api/custom/hello-techno";
  3. import { createReceiptIssuingOrder } from "api/custom/hello-techno/receipt-issuing-order";
  4. import { PageID, TabID } from "codes/page";
  5. import useAPICall from "hooks/useAPICall";
  6. import useDashboard from "hooks/useDashBoard";
  7. import useSnackbarCustom from "hooks/useSnackbarCustom";
  8. import { useEffect, useMemo, useState } from "react";
  9. import { CreateContextProvider } from "./contexts/CreateContext";
  10. import useConfirm, { ConfirmDataProps } from "./hooks/useConfirm";
  11. import useCreate from "./hooks/useCreate";
  12. import useInputReceiptStep from "./hooks/useInputReceiptStep";
  13. import useInputSMSSendAddress from "./hooks/useInputSMSSendAddress";
  14. import useParkingList from "./hooks/useParkingList";
  15. export default function ReceiptIssuingOrderCreate() {
  16. const { setHeaderTitle, setTabs } = useDashboard(
  17. PageID.DASHBOARD_RECEIPT_ISSUING_ORDER_CREATE_CUSTOM_HELLO_TECHNO,
  18. TabID.NONE
  19. );
  20. useEffect(() => {
  21. setHeaderTitle("領収証発行依頼作成");
  22. setTabs(null);
  23. }, []);
  24. return (
  25. <CreateContextProvider>
  26. <Create />
  27. </CreateContextProvider>
  28. );
  29. }
  30. function Create() {
  31. const { parking, adjustData } = useCreate();
  32. const { success, error } = useSnackbarCustom();
  33. const [mode, setMode] = useState<
  34. "parking_select" | "input_receipt" | "input_address" | "confirm" | "done"
  35. >("parking_select");
  36. const step = useMemo(() => {
  37. switch (mode) {
  38. case "parking_select":
  39. return 0;
  40. case "input_receipt":
  41. return 1;
  42. case "input_address":
  43. return 2;
  44. case "confirm":
  45. return 3;
  46. case "done":
  47. return 4;
  48. }
  49. }, [mode]);
  50. const getConfimData = (): ConfirmDataProps => {
  51. return {
  52. customerName: parking?.customer_name ?? "XXXXXXXXXXXX",
  53. parkingName: parking?.parking_name ?? "XXXXXXXXXXXXXXX",
  54. adjustSeqNo: adjustData ? String(adjustData.adjust_seq_no) : "",
  55. amount: inputReceiptStep.values("amount"),
  56. date: inputReceiptStep.values("date"),
  57. address: inputSMSSendAddress.values("address"),
  58. memo: inputReceiptStep.values("memo"),
  59. };
  60. };
  61. const getFormData = () => {
  62. return {
  63. ...parking,
  64. ...inputReceiptStep.values(),
  65. ...inputSMSSendAddress.values(),
  66. };
  67. };
  68. const selectParkingStep = useParkingList({
  69. onNext: (parking: HTParking) => {
  70. inputReceiptStep.init();
  71. setMode("input_receipt");
  72. },
  73. });
  74. const inputReceiptStep = useInputReceiptStep({
  75. onNext: () => {
  76. setMode("input_address");
  77. },
  78. onPrev: () => {
  79. setMode("parking_select");
  80. },
  81. });
  82. const inputSMSSendAddress = useInputSMSSendAddress({
  83. onNext: () => {
  84. confirm.setData(getConfimData());
  85. setMode("confirm");
  86. },
  87. onPrev: () => {
  88. setMode("input_receipt");
  89. },
  90. });
  91. const confirm = useConfirm({
  92. onNext: () => {
  93. send();
  94. },
  95. onPrev: () => {
  96. setMode("input_address");
  97. },
  98. });
  99. const createAPI = useAPICall({
  100. apiMethod: createReceiptIssuingOrder,
  101. backDrop: true,
  102. onSuccess: () => {
  103. setMode("done");
  104. success("成功しました");
  105. },
  106. onFailed: () => {
  107. error("失敗しました");
  108. },
  109. });
  110. const send = () => {
  111. const { callAPI, makeSendData } = createAPI;
  112. const formData = getFormData();
  113. const sendData = makeSendData({
  114. customer_code: formData.customer_code ?? "",
  115. parking_management_code: formData.parking_management_code ?? "",
  116. adjust_seq_no: adjustData?.adjust_seq_no,
  117. receipt_use_date: formData.date,
  118. receipt_amount: formData.amount,
  119. tax_amount: formData.tax_amount,
  120. sms_phone_number: formData.address,
  121. memo: formData.memo,
  122. });
  123. callAPI(sendData);
  124. };
  125. return (
  126. <Box sx={{ p: 1, m: 1 }}>
  127. <Stepper activeStep={step}>
  128. <Step>
  129. <StepLabel>駐車場選択</StepLabel>
  130. </Step>
  131. <Step>
  132. <StepLabel>領収証情報入力</StepLabel>
  133. </Step>
  134. <Step>
  135. <StepLabel>SMS送信先入力</StepLabel>
  136. </Step>
  137. <Step>
  138. <StepLabel>確認</StepLabel>
  139. </Step>
  140. <Step>
  141. <StepLabel>完了</StepLabel>
  142. </Step>
  143. </Stepper>
  144. {mode === "parking_select" && selectParkingStep.element}
  145. {mode === "input_receipt" && inputReceiptStep.element}
  146. {mode === "input_address" && inputSMSSendAddress.element}
  147. {mode === "confirm" && confirm.element}
  148. {mode === "done" && <Box sx={{ p: 1, py: 3, m: 1 }}>受付しました。</Box>}
  149. </Box>
  150. );
  151. }