MypageCancelFormWeb.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org"
  4. xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  5. layout:decorator="web/common/layout/MypageLayoutWeb">
  6. <!--
  7. *******************************************************************************
  8. * @source : MypageCancelFormWeb.html
  9. * @desc : 마이페이지 > 취소신청 Page
  10. *============================================================================
  11. * STYLE24
  12. * Copyright(C) 2021 TSIT, All rights reserved.
  13. *============================================================================
  14. * VER DATE AUTHOR DESCRIPTION
  15. * === =========== ========== =============================================
  16. * 1.0 2021.03.19 card007 최초 작성
  17. *******************************************************************************
  18. -->
  19. <body>
  20. <th:block layout:fragment="content">
  21. <div class="content myOrderView">
  22. <div class="cont_body">
  23. <!-- CONT-BODY -->
  24. <div class="lnb">
  25. <div class="lnb_tit">
  26. <h2>마이페이지</h2>
  27. </div>
  28. <div class="lnb_list">
  29. <ul id="mypageLnbList"></ul>
  30. </div>
  31. </div>
  32. <div class="cont">
  33. <form id="cancelForm">
  34. <input type="hidden" name="accountNo" th:value="${oneData.accountNo}"/>
  35. <input type="hidden" name="accountNm" th:value="${oneData.accountNm}"/>
  36. <input type="hidden" name="bankCd" th:value="${oneData.bankCd}"/>
  37. <div class="sec_head">
  38. <h3 class="subH1">주문취소</h3>
  39. <span class="order_number">주문번호&nbsp;:&nbsp;<em th:text="${oneData.ordNo}"></em></span>
  40. </div>
  41. <div class="sec_body">
  42. <div class="part_goods">
  43. <div class="goods_head">
  44. <p th:unless="${oneData.giftPackYn == 'Y'}">주문일 <span th:text="${oneData.ordDt}"></span></p>
  45. <p th:if="${oneData.giftPackYn == 'Y'}">선물일 <span th:text="${oneData.ordDt}"></span></p>
  46. </div>
  47. <div class="goods_cont">
  48. <th:block th:if="${cancelList.cancelList}" th:each="cancel, status : ${cancelList.cancelList}" th:with="imageUrl=${@environment.getProperty('upload.goods.view')}">
  49. <!-- 주문상품 -->
  50. <div class="goods_info">
  51. <div class="order_desc">
  52. <div class="goods_box">
  53. <div class="gd_item">
  54. <a href="javascript:void(0)" th:attr="goodsCd=${cancel.goodsCd}, optCd1=${cancel.goodsType == 'G056_N' ? cancel.optCd1 : ''}, ithrCd='IN21_03'" onclick="fnGoToGoodsDetail(this)">
  55. <span class="thumb">
  56. <img th:src="${imageUrl + '/' + cancel.sysImgNm + '?RS=100'}" width="100%" alt="">
  57. </span>
  58. <p>
  59. <span class="brand" th:text="${cancel.brandNm}"></span>
  60. <span class="tag primary" th:if="${cancel.shotDelvYn == 'Y'}">총알배송</span>
  61. <span class="tag" th:if="${cancel.shotDelvYn == 'N' and cancel.selfGoodsYn == 'Y'}">STYLE24 일반배송</span>
  62. <span class="tag" th:if="${cancel.selfGoodsYn == 'N'}">업체직배송</span>
  63. </p>
  64. <p>
  65. <span class="name" th:text="${cancel.goodsNm}"></span>
  66. </p>
  67. </a>
  68. </div>
  69. <div class="gd_opt">
  70. <div class="option_wrap">
  71. <span class="title sr-only">주문 옵션</span>
  72. <span class="option" th:if="${cancel.goodsType == 'G056_S'}" th:each="option, status : ${cancel.colorNmArr}" th:text="|${cancel.itemNmArr[status.index]} / ${option} / ${cancel.optCd2Arr[status.index]}|"></span>
  73. <span class="option" th:unless="${cancel.goodsType == 'G056_S'}" th:text="|${cancel.colorNm} / ${cancel.optCd2}|"></span>
  74. </div>
  75. </div>
  76. <div class="gd_calc">
  77. <p>
  78. <span class="count"><em th:text="${cancel.ordQty - cancel.cnclRtnQty}"></em>개</span>
  79. </p>
  80. <p>
  81. <span class="price_org" th:if="${(cancel.ordAmt - cancel.cnclRtnAmt) > (cancel.realOrdAmt + cancel.pntDcAmt + cancel.gfcdUseAmt)}"><em th:text="${#numbers.formatInteger(cancel.ordAmt - cancel.cnclRtnAmt, 1, 'COMMA')}"></em>원</span>
  82. <span class="price_sale"><em th:text="${#numbers.formatInteger(cancel.realOrdAmt + cancel.pntDcAmt + cancel.gfcdUseAmt, 1, 'COMMA')}"></em>원</span>
  83. </p>
  84. </div>
  85. </div>
  86. <div class="button_box">
  87. <div class="count_modify">
  88. <span class="txt">수량</span>
  89. <form class="form_wrap">
  90. <div class="form_field">
  91. <div class="select_custom select_count">
  92. <div class="combo">
  93. <input type="hidden" name="chgQty" value="0" th:attr="ordDtlNo=${cancel.ordDtlNo}, ordCanChgQty=${cancel.ordCanChgQty}"/>
  94. <div class="select">선택</div>
  95. <ul class="list">
  96. <li class="selected" qty="0" onclick="fnChangeCancelQty(this);">선택</li>
  97. <li th:if="${cancel.ordCanChgQty > 0}" th:each="num : ${#numbers.sequence(1,cancel.ordCanChgQty)}" th:attr="qty=${num}" th:text="${num}" onclick="fnChangeCancelQty(this);"></li>
  98. </ul>
  99. </div>
  100. </div>
  101. </div>
  102. </form>
  103. </div>
  104. </div>
  105. </div>
  106. <div class="order_text">
  107. <p>취소하실 수량을 선택하신 후 주문 취소를 하실 수 있습니다.</p>
  108. </div>
  109. </div>
  110. <!-- //주문상품 -->
  111. </th:block>
  112. </div>
  113. </div>
  114. <h4 class="subH3">환불정보</h4>
  115. <div class="tbl type6">
  116. <table>
  117. <colgroup>
  118. <col width="50%">
  119. <col width="50%">
  120. </colgroup>
  121. <tr>
  122. <td>
  123. <dl>
  124. <div>
  125. <dt>환불 예정 금액</dt>
  126. <dd>
  127. <div class="price">
  128. <span class="return_total_price"><em id="returnAmt">0</em>원</span>
  129. </div>
  130. </dd>
  131. </div>
  132. <div class="include_item"> <!-- 할인항목 표기 class명 include_item -->
  133. <dt>상품 취소 금액</dt>
  134. <dd><em id="goodsCancelAmt">0</em>원</dd>
  135. </div>
  136. <div class="include_item">
  137. <dt>배송비</dt>
  138. <dd><em id="deliveryFee">0</em>원</dd>
  139. </div>
  140. <div class="include_item">
  141. <dt>할인 금액 차감</dt>
  142. <dd><em id="deductDcAmt">0</em>원</dd>
  143. </div>
  144. </dl>
  145. </td>
  146. <td>
  147. <dl>
  148. <div>
  149. <dt>환불 수단</dt>
  150. <dd th:if="${paymentInfo.pgGb == 'KCP'}" th:text="${paymentInfo.payMeansNm}"></dd>
  151. <dd th:if="${paymentInfo.pgGb == 'NAVER'}" th:text="|네이버페이|"></dd>
  152. <dd th:if="${paymentInfo.pgGb == 'KAKAO'}" th:text="|카카오페이|"></dd>
  153. <dd th:if="${paymentInfo.pgGb == 'PAYCO'}" th:text="|PAYCO|"></dd>
  154. </div>
  155. <div>
  156. <dt>결제 금액 환불</dt>
  157. <dd>
  158. <em id="refundPayAmt">0</em>원
  159. </dd>
  160. </div>
  161. <div>
  162. <dt>포인트 환불</dt>
  163. <dd>
  164. <em id="refundPoint">0</em>P
  165. </dd>
  166. </div>
  167. <div>
  168. <dt>상품권 환불</dt>
  169. <dd>
  170. <em id="refundGiftCard">0</em>원
  171. </dd>
  172. </div>
  173. </dl>
  174. </td>
  175. </tr>
  176. </table>
  177. </div>
  178. <div class="txt_info">
  179. <ul>
  180. <li>
  181. 카드사로 결제 취소 요청이 전달된 후 환불까지는 평일 기준 3 ~7일이 소요될 수 있습니다.
  182. </li>
  183. </ul>
  184. </div>
  185. <div class="info_footer_area" id="addDeliveryFee" style="display:none">
  186. <p>
  187. <span id="addPayCost">2,500원</span> 배송비 추가 결제가 필요합니다.
  188. <input type="hidden" name="addPayCost"/>
  189. </p>
  190. </div>
  191. <div class="btn_footer_area">
  192. <button type="button" class="btn btn_default btn_md" onclick="cfnGoToPage(_PAGE_MYPAGE_ORDER_LIST);"><span>취소</span></button>
  193. <button type="button" id="btn_refund_pop" class="btn btn_dark btn_md" onclick="fnCancel();"><span>주문 취소</span></button>
  194. </div>
  195. </div>
  196. </form>
  197. </div>
  198. <!-- // CONT-BODY -->
  199. </div>
  200. <!-- 환불계좌 등록 팝업 -->
  201. <div class="modal fade refund_pop" id="refundPop" tabindex="-1" role="dialog" aria-labelledby="refundLabel" aria-hidden="true">
  202. <div class="modal-dialog" role="document">
  203. <div class="modal-content"></div>
  204. </div>
  205. <a href="#close-modal" rel="modal:close" id="refundPop_close" class="close-modal">Close</a>
  206. <a href="#close-modal" rel="modal:close" class="close-modal ">Close</a>
  207. </div>
  208. <!-- //환불계좌 등록 팝업 -->
  209. </div>
  210. <script src="/ux/plugins/gaga/gaga.paging.js"></script>
  211. <script th:inline="javascript">
  212. let cancelList = [[${cancelList}]];
  213. let oneData = [[${oneData}]];
  214. let paymentInfo = [[${paymentInfo}]];
  215. var isLogin = [[${isLogin}]];
  216. let addPayCost = 0;
  217. $(document).ready(function() {
  218. // 마이페이지 LNB 설정
  219. fnSetMypageLnbList(2);
  220. // 마이페이지 location 설정
  221. fnSetMypageLocation('취소/반품/교환 내역', '_PAGE_MYPAGE_CRE_LIST', '취소 신청');
  222. // 셀렉트박스 활성화
  223. $(".myOrderView .part_goods .select_custom.select_count").each(function() {
  224. new sCombo(this);
  225. });
  226. });
  227. // 취소 처리
  228. var fnCancel = function() {
  229. // 취소수량 설정
  230. //fnChangeCancelQty();
  231. // 주문상세번호 및 취소 수량 설정
  232. let ordDtlNoArr = [];
  233. let cnclRtnReqQtyArr = [];
  234. let chkQty = 0;
  235. $.each($('#cancelForm input[name=chgQty]'), function(idx, item) {
  236. let chgQty = $(item).val();
  237. let ordDtlNo = $(item).attr('ordDtlNo');
  238. ordDtlNoArr.push(Number(ordDtlNo));
  239. cnclRtnReqQtyArr.push(Number(chgQty));
  240. chkQty += chgQty;
  241. });
  242. // 취소 수량 체크
  243. if (chkQty == 0) {
  244. mcxDialog.alert('취소하실 상품의 수량을 선택해주세요.');
  245. return false;
  246. }
  247. // 환불계좌 체크
  248. let accountNo = $('#cancelForm input[name=accountNo]').val();
  249. let accountNm = $('#cancelForm input[name=accountNm]').val();
  250. let bankCd = $('#cancelForm input[name=bankCd]').val();
  251. if (paymentInfo.payMeans == 'G014_20' && paymentInfo.payStat == 'G016_30' && (gagajf.isNull(accountNo) || gagajf.isNull(accountNm) || gagajf.isNull(bankCd))) {
  252. let data = {};
  253. data.ordNo = oneData.ordNo;
  254. data.accountNm = oneData.accountNm;
  255. let jsonData = JSON.stringify(data);
  256. $.ajax( {
  257. type : "POST",
  258. url : '/mypage/refund/account/register/popup/form',
  259. data : jsonData,
  260. dataType : 'html',
  261. beforeSend : function(xhr, settings) {
  262. xhr.setRequestHeader("AJAX" , "true");
  263. xhr.setRequestHeader('Accept' , 'application/json');
  264. xhr.setRequestHeader('Content-Type' , 'application/json');
  265. },
  266. success : function(result) {
  267. $("#refundPop .modal-dialog .modal-content").html(result);
  268. $("#refundPop").modal("show");
  269. }
  270. });
  271. return false;
  272. }
  273. // 취소요청 데이터 설정
  274. let url = '/mypage/cancel';
  275. // 취소 처리
  276. let data = {};
  277. data.ordNo = oneData.ordNo;
  278. data.chgReason = 'G686_10';
  279. data.chgReasonNm = '고객변심';
  280. data.accountNo = accountNo;
  281. data.accountNm = accountNm;
  282. data.bankCd = bankCd;
  283. data.isCustomer = true;
  284. data.reqGbn = 'cnclComplete';
  285. data.pgTid = paymentInfo.pgTid;
  286. data.payAmt = paymentInfo.payAmt;
  287. data.ordDtlNoArr = ordDtlNoArr;
  288. data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
  289. let jsonData = JSON.stringify(data);
  290. // 취소 처리 가능 여부 조회
  291. gagajf.ajaxJsonSubmit('/mypage/wms/cancel/available', jsonData, function(result) {
  292. if (result.cancelYn == 'Y') {
  293. // 취소 처리
  294. gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
  295. cfnGoToPage(_PAGE_MYPAGE_CRE_LIST);
  296. }, true);
  297. } else {
  298. mcxDialog.alert('이미 배송처리 되어 취소 처리에 실패 하였습니다.');
  299. }
  300. });
  301. }
  302. // 취소 수량 변경 이벤트 처리
  303. var fnChangeCancelQty = function(param) {
  304. let url = '/mypage/cancel/refund/amt/calculate';
  305. if (param != null) {
  306. $(param).parent().parent().find('input[name=chgQty]').val($(param).attr('qty'));
  307. }
  308. // 취소 수량 설정
  309. let cnclRtnReqQtyArr = [];
  310. let ordDtlNoArr = [];
  311. let ordCanChgQtyArr = [];
  312. $.each($('#cancelForm input[name=chgQty]'), function(idx, item) {
  313. let chgQty = $(item).val();
  314. let ordDtlNo = $(item).attr('ordDtlNo');
  315. let ordCanChgQty = $(item).attr('ordCanChgQty');
  316. cnclRtnReqQtyArr.push(Number(chgQty));
  317. ordDtlNoArr.push(Number(ordDtlNo));
  318. ordCanChgQtyArr.push(Number(ordCanChgQty));
  319. });
  320. let data = {};
  321. data.ordNo = oneData.ordNo;
  322. data.ordDtlNoArr = ordDtlNoArr;
  323. data.cnclRtnReqQtyArr = cnclRtnReqQtyArr;
  324. let jsonData = JSON.stringify(data);
  325. gagajf.ajaxJsonSubmit(url, jsonData, function (result) {
  326. let refundPoint = Number(result.spanPntDcAmt); // 환불 포인트 금액
  327. let refundGiftCard = Number(result.spanGfcdUseAmt); // 환불 상품권 금액
  328. let spanCnclRtnAmt = Number(result.spanCnclRtnAmt); // 환불 상품 금액
  329. let spanCpnDcAmt = Number(result.spanCpnDcAmt); // 쿠폰 할인 차감 금액
  330. let spanTmtbDcAmt = Number(result.spanTmtbDcAmt); // 다다익선 할인 차감 금액
  331. let spanPrePntDcAmt = Number(result.spanPrePntDcAmt); // 선포인트 할인 차감 금액
  332. let sumDeliveryFee = Number(result.sumDeliveryFee); // 원주문배송비
  333. let spanTotDeliveryFee = Number(result.spanTotDeliveryFee); // 추가배송비 (무료배송비 허들 깨져서 발생한 배송비)
  334. let spanRefundAmt = Number(result.spanRefundAmt); // 환불 예정 금액
  335. let goodsCancelAmt = spanCnclRtnAmt; // 상품취소금액
  336. let deliveryFee = sumDeliveryFee - spanTotDeliveryFee; // 배송비 (마지막 취소 시 돌려줘야할 원주문 배송비 - 추가배송비)
  337. let deductDcAmt = 0 - spanCpnDcAmt - spanTmtbDcAmt - spanPrePntDcAmt; // 할인금액 차감 (쿠폰+다다익선+선포인트)
  338. let refundPayAmt = spanRefundAmt; // 결제금액 환불 (환불상품금액 - 할인차감금액 - 배송비)
  339. let returnAmt = refundPayAmt + refundPoint + refundGiftCard; // 환불예정금액
  340. // 추가배송비 영역 설정
  341. if (refundPayAmt < 0) {
  342. //refundPayAmt = spanRefundAmt;
  343. //$('#addDeliveryFee').css('display', '');
  344. //$('#addPayCost').text(spanTotDeliveryFee.addComma() + '원');
  345. addPayCost = spanTotDeliveryFee;
  346. } else {
  347. addPayCost = 0;
  348. }
  349. // 금액 설정
  350. $('#returnAmt').text(returnAmt.addComma());
  351. $('#goodsCancelAmt').text(goodsCancelAmt.addComma());
  352. $('#deliveryFee').text(deliveryFee.addComma());
  353. $('#deductDcAmt').text(deductDcAmt.addComma());
  354. $('#refundPayAmt').text(refundPayAmt.addComma());
  355. $('#refundPoint').text(refundPoint.addComma());
  356. $('#refundGiftCard').text(refundGiftCard.addComma());
  357. });
  358. }
  359. // 환불계좌 등록 콜백 처리
  360. var fnRegisterAccountCallback = function(result) {
  361. // 환불계좌 정보 설정
  362. $('#cancelForm input[name=accountNo]').val(result.accountNo);
  363. $('#cancelForm input[name=accountNm]').val(result.accountNm);
  364. $('#cancelForm input[name=bankCd]').val(result.bankCd);
  365. // 취소처리
  366. fnCancel();
  367. }
  368. </script>
  369. </th:block>
  370. </body>
  371. </html>