浏览代码

Merge remote-tracking branch 'origin/xodud1202' into order

card007 5 年之前
父节点
当前提交
35dabe3ea8

+ 78 - 1
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -9,10 +9,12 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.kcp.J_PP_CLI_N;
 import com.style24.core.biz.dao.TscOrderDao;
 import com.style24.core.biz.service.TscKakaoPayService;
 import com.style24.core.biz.service.TscKcpService;
@@ -22,6 +24,7 @@ import com.style24.front.biz.dao.TsfOrderDao;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.KakaoPay;
 import com.style24.persistence.domain.NaverPay;
 import com.style24.persistence.domain.Order;
@@ -60,6 +63,9 @@ public class TsfOrderService {
 	@Autowired
 	private TsfCartService cartService;
 
+	@Autowired
+	private Environment env;
+
 	/**
 	 * 마이페이지 주문 정보 조회
 	 *
@@ -605,5 +611,76 @@ public class TsfOrderService {
 		return resultStr;
 		
 	}
-	
+
+	/**
+	 * KCP 현금영수증 신청
+	 * param.setTradeTime("20210422200347");	// 결제시각 : YYYYMMDDHH24MISS 형식
+	 * param.setOrdPhnno("01011111111");		// 현금영수증 대상 휴대폰번호
+	 * param.setUsGfcdAmt(10000);				// 현금영수증 신청 금액
+	 * param.setOrdNo(211);						// 주문번호
+	 * param.setGoodsNm("보라색 원피스");		// 상품명 (“7. 현금영수증 매출전표 연동” 을 통해 고객이 직접 전표를 확인코자 한다면 상품명을 넘겨주지 않았을 경우 구매자 인증 시 인증오류가 발생할 수 있습니다.)
+	 * param.setOrdNm("구매자");				// 구매자명
+	 * param.setOrdEmail("xxxx@xxxx.com");		// 구매자이메일 (“7. 현금영수증 매출전표 연동” 을 통해 고객이 직접 전표를 확인코자 한다면 메일주소를 넘겨주지 않았을 경우 구매자 인증 시 인증오류가 발생할 수 있습니다.)
+	 * @param param
+	 * @return
+	 */
+	public GiftCard kcpCashReceiptsRequest(GiftCard param) {
+		GiftCard result = new GiftCard();
+		String cust_ip = TsfSession.getInfo().getIpAddr();
+		String reqTx = "pay";		// 현금영수증 신청
+		String txCd = "07010000";	// 현금영수증 등록 요청
+		String ordPhnno = "";
+		if(!StringUtils.isEmpty(param.getOrdPhnno())) {
+			ordPhnno = param.getOrdPhnno().replaceAll("-", "");
+		}
+
+		J_PP_CLI_N c_PayPlus = new J_PP_CLI_N();
+		c_PayPlus.mf_init( "", env.getProperty("pg.kcp.gw.url"), env.getProperty("pg.kcp.gw.port"), Integer.parseInt(env.getProperty("pg.kcp.tx.mode")), env.getProperty("pg.kcp.log.dir") );
+		c_PayPlus.mf_init_set();
+
+		int rcpt_data_set   = c_PayPlus.mf_add_set( "rcpt_data" ) ;
+		int ordr_data_set   = c_PayPlus.mf_add_set( "ordr_data" ) ;
+		int corp_data_set   = c_PayPlus.mf_add_set( "corp_data" ) ;
+
+		// 현금영수증 정보
+		c_PayPlus.mf_set_us( rcpt_data_set, "user_type", "PG01") ;
+		c_PayPlus.mf_set_us( rcpt_data_set, "trad_time", param.getTradeTime()) ;
+		c_PayPlus.mf_set_us( rcpt_data_set, "tr_code"  , "0") ;							// 0 : 소득공제용(개인), 1 : 지출증빙용(기업)
+		c_PayPlus.mf_set_us( rcpt_data_set, "id_info"  , ordPhnno) ;							// 발급 대상이 개인인 경우에는 주민번호, 휴대폰번호,현금영수증 카드를 세팅하며, 기업인 경우에는 대상 사업자 번호를 입력. 자진발급으로 등록 시, “0100001234” 으로 입력.
+		c_PayPlus.mf_set_us( rcpt_data_set, "amt_tot"  , param.getUsGfcdAmt() + "") ;	// 현금영수증 금액 (공급가액 + 부가가치세 + 봉사료)
+		//c_PayPlus.mf_set_us( rcpt_data_set, "amt_sup"  , amt_sup   ) ;		// 공급가액
+		//c_PayPlus.mf_set_us( rcpt_data_set, "amt_svc"  , amt_svc   ) ;		// 봉사료
+		//c_PayPlus.mf_set_us( rcpt_data_set, "amt_tax"  , amt_tax   ) ;		// 부가가치세 (공급가액의 10%)
+		c_PayPlus.mf_set_us( rcpt_data_set, "pay_type" , "PAXX") ;		// 무슨 값인지 알 수 없음.
+
+		// 주문 정보
+		c_PayPlus.mf_set_us( ordr_data_set, "ordr_idxx", param.getOrdNo() + "") ;		// 주문번호
+		c_PayPlus.mf_set_us( ordr_data_set, "good_name", param.getGoodsNm());				// 상품명
+		c_PayPlus.mf_set_us( ordr_data_set, "buyr_name", param.getOrdNm());
+		c_PayPlus.mf_set_us( ordr_data_set, "buyr_tel1", ordPhnno);
+		c_PayPlus.mf_set_us( ordr_data_set, "buyr_mail", param.getOrdEmail());
+		// c_PayPlus.mf_set_us( ordr_data_set, "comment"  , comment);		// 비고 (ex - 여유 파라미터)
+
+		// 가맹점 정보
+		c_PayPlus.mf_set_us( corp_data_set, "corp_type", "0");		// 사업장 구분 (직접 판매 : 0, 입점몰 판매 : 1)
+
+		// 실행
+		c_PayPlus.mf_do_tx(env.getProperty("pg.kcp.site.cd"), "", txCd, cust_ip, param.getOrdNo() + "", env.getProperty("pg.kcp.log.dir"), "0");
+
+		// 결과
+		result.setResultCd(c_PayPlus.m_res_cd);
+		result.setResultMsg(c_PayPlus.m_res_msg);
+		result.setOrdNo(param.getOrdNo());
+		result.setUsGfcdAmt(param.getUsGfcdAmt());
+		if("0000".equals(result.getResultCd())) {
+			result.setTradeNo(c_PayPlus.mf_get_res("cash_no"));
+			result.setAuthNo(c_PayPlus.mf_get_res("receipt_no"));
+
+			// 성공시 TB_GIFTCARD_RECEIPT INSERT
+		}
+
+		// 성공이든 실패이든 로그성 데이터 TB_GIFTCARD_RECEIPT_API INSERT
+
+		return result;
+	}
 }

+ 16 - 0
src/main/java/com/style24/front/biz/web/TsfCartController.java

@@ -27,12 +27,15 @@ import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
+import com.style24.core.support.util.CryptoUtils;
 import com.style24.front.biz.service.TsfCartService;
 import com.style24.front.biz.service.TsfCouponService;
+import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Order;
@@ -64,6 +67,9 @@ public class TsfCartController extends TsfBaseController {
 	@Autowired
 	private TscOrderService coreOrderService;
 
+	@Autowired
+	private TsfOrderService orderService;
+
 	@Autowired
 	private Environment env;
 
@@ -148,6 +154,16 @@ public class TsfCartController extends TsfBaseController {
 		model.addAttribute("order", order);
 		model.addAttribute("IMG_PATH", env.getProperty("upload.goods.view"));
 
+		GiftCard temp = new GiftCard();
+		temp.setTradeTime("20210422200347");	// 결제시각 : YYYYMMDDHH24MISS 형식
+		temp.setOrdPhnno("01011111111");		// 현금영수증 대상 휴대폰번호
+		temp.setUsGfcdAmt(10000);				// 현금영수증 신청 금액
+		temp.setOrdNo(211);						// 주문번호
+		temp.setGoodsNm("보라색 원피스");		// 상품명 (“7. 현금영수증 매출전표 연동” 을 통해 고객이 직접 전표를 확인코자 한다면 상품명을 넘겨주지 않았을 경우 구매자 인증 시 인증오류가 발생할 수 있습니다.)
+		temp.setOrdNm("구매자");				// 구매자명
+		temp.setOrdEmail("xxxx@xxxx.com");		// 구매자이메일 (“7. 현금영수증 매출전표 연동” 을 통해 고객이 직접 전표를 확인코자 한다면 메일주소를 넘겨주지 않았을 경우 구매자 인증 시 인증오류가 발생할 수 있습니다.)
+		orderService.kcpCashReceiptsRequest(temp);
+
 		return super.getDeviceViewName("cart/CartListAjaxForm");
 	}
 

+ 22 - 6
src/main/resources/config/application-dev.yml

@@ -63,9 +63,25 @@ mail:
 
 # PG
 pg:
-    nicepay:
-        merchantId: nictest00m
-        merchantKey: 33F49GnCMS1mFYlGXisbUDzVf2ATWCl9k3R++d5hDd3Frmuos/XLx8XhXpe+LDYAbpGKZYSwtlyyLOtS/8aD7A==
-        log.path: /home/app/logs/nicepay
-        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
-        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp
+    kcp:
+        log.dir: /WIDE/workspace/files/data/style24/logs/front
+        gw:
+            url: testpaygw.kcp.co.kr
+            port: 8090
+        js.url: https://testpay.kcp.co.kr/plugin/payplus_web.jsp
+        server: false
+        site:
+            cd: T0000
+            key: 3grptw1.zW0GSo4PQdaGvsF__
+            name: ISTYLE TEST
+        log.level: 3
+        module.type: 01
+        tx.mode: 0
+        receipt.url : https://testadmin8.kcp.co.kr/assist/bill.BillActionNew.do
+
+# 네이버페이 API
+naverPay:
+    apiUrl: https://dev.apis.naver.com/
+    payUrl:
+        web : test-pay.naver.com
+        mob : test-m.pay.naver.com

+ 16 - 7
src/main/resources/config/application-locp.yml

@@ -64,13 +64,22 @@ mail:
 
 # PG
 pg:
-    nicepay:
-        merchantId: wivismallm
-        merchantKey: pXTdML8rIaOVCeXQQsyRp1uCfTSTT/n80BV4LCqa+/yJM64MYIqeBCIQdH1rKhJRwSOsdCxVPa1V6hRxkkdJxg==
-        cancelPwd: wivis@2020
-        log.path: /WIDE/workspace/logs/wivis
-        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
-        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp
+    kcp:
+        log.dir: /WIDE/workspace/files/data/style24/logs/front
+        gw:
+            url: paygw.kcp.co.kr
+            port: 8090
+        user.type: PGNW
+        js.url: https://pay.kcp.co.kr/plugin/payplus_web.jsp
+        server: true
+        site:
+            cd: U3476
+            key: 4aVa--.Xz8Fc78nwYPsrmmY__
+            name: ISTYLE
+        log.level: 3
+        module.type: 01
+        tx.mode: 0
+        receipt.url : https://admin8.kcp.co.kr/assist/bill.BillActionNew.do
 
 # 네이버페이 API
 naverPay:

+ 1 - 1
src/main/resources/config/application-run.yml

@@ -64,7 +64,7 @@ mail:
 # PG
 pg:
     kcp:
-        log.dir: /WIDE/workspace/files/data/style24/logs/front
+        log.dir: E:/Run/Payplus
         gw:
             url: paygw.kcp.co.kr
             port: 8090

+ 20 - 6
src/main/webapp/WEB-INF/views/mob/cart/CartListAjaxFormMob.html

@@ -704,7 +704,7 @@
 				setLoginInfo();
 
 				if([[${!order.shotCanYn.equals('Y') or order.shotCartList.size() < 1}]]) {
-					//$(".shotDelvSelect").hide();
+					$(".shotDelvSelect").hide();
 				}
 
 				$("#cartListForm .area_salecoupon .coupon_box").hide();
@@ -1020,11 +1020,11 @@
 						let message = info.goodsNm + " 상품은 구매 할 수 없습니다. 제외하고 계속 주문하시겠습니까?";
 						fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn);
 					} else if (info.soldoutYn == "Y") {		// 품절
-						if (info.goodsStat == "G008_70" || info.ordCanQty < info.minOrdQty) {		// 상품 상태가 품절이거나 주문 가능 수량이 최소주문수량보다 적을경우
+						if (info.goodsStat == "G008_70") {		// 상품 상태가 품절이거나 주문 가능 수량이 최소주문수량보다 적을경우
 							let message = info.goodsNm + " 상품은 품절입니다. 제외하고 계속 주문하시겠습니까?";
 							fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn)
-						} else if (info.goodsQty < info.ordCanQty) {		// 주문 가능 수량이 0일경우
-							let message = info.goodsNm + "의 " + info.colorNm + " 옵션이 품절되었습니다. 제외하고 계속 주문하시겠습니까?";
+						} else if (info.goodsQty < info.ordCanQty || info.ordCanQty < info.minOrdQty) {		// 주문 가능 수량이 0일경우
+							let message = info.goodsNm + "의 " + info.colorNm + "/" + info.optCd2 + "이 품절되었습니다. 제외하고 계속 주문하시겠습니까?";
 							fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn)
 						} else if (listIndex < list.length) {
 							// 혹시 else일 경우
@@ -1076,8 +1076,13 @@
 						if (index == 1) { //button1 일때 처리문
 							orderFlag = false; return false;
 						} else {	//button2 일때 처리문
-							fnCheckOffCartSqArr(cartSqArr, info.cartSq);
-							fnOrderValidation(list, listIndex, cartSqArr, allYn);
+							if(cartSqArr.length > 1) {
+								fnCheckOffCartSqArr(cartSqArr, cartSq);
+								fnOrderValidation(list, listIndex, cartSqArr, allYn);
+							} else {
+								mcxDialog.alert("주문 가능한 상품이 없습니다.");
+								orderFlag = false; return false;
+							}
 						}
 					}
 				});
@@ -1092,10 +1097,19 @@
 				});
 
 				// 장바구니 선택된것 삭제 > cartSq 0으로 변경
+				let cartSqLength = 0;
 				for (let i = 0; i < cartSqArr.length; i++) {
 					if (cartSqArr[i] == cartSq) {
 						cartSqArr[i] = 0;
 					}
+					if(cartSqArr[i] > 0) {
+						cartSqLength++;
+					}
+				}
+
+				if(cartSqLength < 1) {
+					mcxDialog.alert("주문 가능한 상품이 없습니다.");
+					orderFlag = false; return false;
 				}
 			}
 

+ 20 - 6
src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html

@@ -560,7 +560,7 @@
 			setLoginInfo();
 
 			if([[${!order.shotCanYn.equals('Y') or order.shotCartList.size() < 1}]]) {
-				//$(".shotDelvSelect").hide();
+				$(".shotDelvSelect").hide();
 			}
 
 			$("#cartListForm .area_salecoupon .coupon_box").hide();
@@ -1020,11 +1020,11 @@
 					let message = info.goodsNm + " 상품은 구매 할 수 없습니다. 제외하고 계속 주문하시겠습니까?";
 					fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn);
 				} else if (info.soldoutYn == "Y") {		// 품절
-					if (info.goodsStat == "G008_70" || info.ordCanQty < info.minOrdQty) {		// 상품 상태가 품절이거나 주문 가능 수량이 최소주문수량보다 적을경우
+					if (info.goodsStat == "G008_70") {		// 상품 상태가 품절이거나 주문 가능 수량이 최소주문수량보다 적을경우
 						let message = info.goodsNm + " 상품은 품절입니다. 제외하고 계속 주문하시겠습니까?";
 						fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn)
-					} else if (info.goodsQty < info.ordCanQty) {		// 주문 가능 수량이 0일경우
-						let message = info.goodsNm + "의 " + info.colorNm + " 옵션이 품절되었습니다. 제외하고 계속 주문하시겠습니까?";
+					} else if (info.goodsQty < info.ordCanQty || info.ordCanQty < info.minOrdQty) {		// 주문 가능 수량이 0일경우
+						let message = info.goodsNm + "의 " + info.colorNm + "/" + info.optCd2 + "이 품절되었습니다. 제외하고 계속 주문하시겠습니까?";
 						fnRemoveCartSqConfirm(message, cartSqArr, info.cartSq, list, listIndex, allYn)
 					} else if (listIndex < list.length) {
 						// 혹시 else일 경우
@@ -1078,8 +1078,13 @@
 					if (index == 1) { //button1 일때 처리문
 						orderFlag = false; return false;
 					} else {	//button2 일때 처리문
-						fnCheckOffCartSqArr(cartSqArr, info.cartSq);
-						fnOrderValidation(list, listIndex, cartSqArr, allYn);
+						if(cartSqArr.length > 1) {
+							fnCheckOffCartSqArr(cartSqArr, cartSq);
+							fnOrderValidation(list, listIndex, cartSqArr, allYn);
+						} else {
+							mcxDialog.alert("주문 가능한 상품이 없습니다.");
+							orderFlag = false; return false;
+						}
 					}
 				}
 			});
@@ -1095,10 +1100,19 @@
 			});
 
 			// 장바구니 선택된것 삭제 > cartSq 0으로 변경
+			let cartSqLength = 0;
 			for (let i = 0; i < cartSqArr.length; i++) {
 				if (cartSqArr[i] == cartSq) {
 					cartSqArr[i] = 0;
 				}
+				if(cartSqArr[i] > 0) {
+					cartSqLength++;
+				}
+			}
+
+			if(cartSqLength < 1) {
+				mcxDialog.alert("주문 가능한 상품이 없습니다.");
+				orderFlag = false; return false;
 			}
 		}