using System;
using System.Collections;
using System.Text;

using Cosmos.UserFrame;
using Cosmos.ServiceProvider;
using Cosmos.Common;
using Cosmos.CommonManager;
using System.Data;

using Newtonsoft.Json;
/*-----------------------------------------------------------------------------------------------*/
// 설      명 : 상품권
// 작  성  자 : 
// 변경  이력 : 
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.Service
{
    class GiftApp : PaymentBase, IPaymentUs
    {

        private string m_sPosMenuKey = "";

        public GiftApp()
        {
        }

        #region SearchPayment 결제 조회
        /// <summary>
        /// 결제 조회
        /// </summary>
        /// <param name="aParam"></param>
        /// <param name="aRet"></param>
        /// <returns></returns>
        public string SearchPayment(string[] aParam, ref string[] aRet)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                m_cPayItem = new Column.TR_PAYMENT.DATA();                  // 결과 저장 변수 생성

                string sPosMenuKey = aParam[0];                             // 메뉴키
                m_cPayItem.PAY_WAY_CD = aParam[1];                          // 결제 그룹코드
                m_cPayItem.PAY_DTL_CD_01 = aParam[2];                       // 결제 상세코드
                string sTranType = aParam[3];                               // 조회구분 (10:승인, 20:조회, 30:망취소)
                string sWcc = aParam[4];                                    // 입력구분 (0:자동, 1:수기)
                string sGiftNo = aParam[5];                                 // 상품권 번호
                double nGiftAmt = CmUtil.DoubleParse(aParam[6]);            // 상품권 금액
                string sAppNo = aParam[7];                                  // 승인번호
                string sAppDate = aParam[8];                                // 승인일자
                string sAppTime = aParam[9];                                // 승인시간
                string sBrandCD = aParam[10];                               // 고정브랜드코드
                string sGiftType = aParam[11];                              // 권종

                m_sPosMenuKey = sPosMenuKey;

                sRet = ExecuteIrt(PosConst.CANCEL_DIV.NORMAL, sTranType, sBrandCD, sWcc, sGiftNo, nGiftAmt, sAppNo, sAppDate, sAppTime, "", "", sGiftType);
                if (sRet != UserCom.RST_OK) return sRet;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                   System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        #endregion

        #region GetPayment 결제 정보 획득
        /// <summary>
        /// 결제 정보 획득
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public object GetPayment(string[] aParam)
        {
            return m_cPayItem;
        }
        #endregion

        #region SetMenualPayment
        public string SetMenualPayment(string[] aParam)
        {
            throw new NotImplementedException();
        }
        #endregion

        #region SetPayment 결제 등록
        /// <summary>
        /// 결제 등록
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string SetPayment(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                m_cPayItem = new Column.TR_PAYMENT.DATA();                  // 결과 저장 변수 생성

                string sPosMenuKey = aParam[0];                             // 메뉴키
                m_cPayItem.PAY_WAY_CD = aParam[1];                          // 결제 그룹코드
                m_cPayItem.PAY_DTL_CD_01 = aParam[2];                       // 결제 상세코드
                string sTranType = aParam[3];                               // 조회구분 (10:승인, 20:조회, 30:망취소)
                string sWcc = aParam[4];                                    // 입력구분 (0:자동, 1:수기)
                string sGiftNo = aParam[5];                                 // 상품권 번호
                double nGiftAmt = CmUtil.DoubleParse(aParam[6]);            // 상품권 금액
                string sAppNo = aParam[7];                                  // 승인번호
                string sAppDate = aParam[8];                                // 승인일자
                string sAppTime = aParam[9];                                // 승인시간
                string sBrandCD = aParam[10];                               // 고정브랜드코드
                string sGiftType = aParam[11];                              // 상품권권종

                sRet = ExecuteIrt(PosConst.CANCEL_DIV.NORMAL, sTranType, sBrandCD, sWcc, sGiftNo, nGiftAmt, sAppNo, sAppDate, sAppTime, sAppNo, sAppDate, sGiftType); 
                if (sRet != UserCom.RST_OK) return sRet;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                   System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        #endregion

        #region 결제 취소
        /// <summary>
        /// 결제 취소
        /// </summary>
        /// <returns></returns>
        public string CancelPayment(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return sRet;

                int nPayRow = CmUtil.IntParse(aParam[0]); // 취소할 행번호

                // 결제 내역 받아 오기
                ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                m_cPayItem = (Column.TR_PAYMENT.DATA)alPayItem[nPayRow];

                string sTranType = ItemConst.GIFT_APPROVE_DIV.CANCEL;                                                   // 조회구분 (10: 승인, 20:조회, 30:망취소)
                string sWcc = m_cPayItem.OCCUR_ENTRY_05;                                                                // 입력구분
                string sGiftNo = m_cPayItem.OCCUR_ENTRY_01;                                                             // 입력데이터 
                double nGiftAmt = m_cPayItem.AMT_ENTRY_01;                                                              // 대상금액
                string sAppDate = m_cPayItem.OCCUR_ENTRY_03;                                                            // 승인일자
                string sAppNo = m_cPayItem.OCCUR_ENTRY_02;                                                              // 승인번호
                string sAppTime = "";                                                                                   // 승인시간
                string sBrandCD = m_cPayItem.OCCUR_ENTRY_17;                                                            // 고정브랜드코드
                string sGiftType = m_cPayItem.OCCUR_ENTRY_18;                                                           // 상품권권종

                sRet = ExecuteIrt(PosConst.CANCEL_DIV.CANCEL, sTranType, sBrandCD, sWcc, sGiftNo, nGiftAmt, sAppNo, sAppDate, sAppTime, sAppNo, sAppDate, sGiftType);
                if (sRet != UserCom.RST_OK) return sRet;

                m_cPayItem.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;
                m_cDataService.UpdatePluAmount();                                       // 상품 합계금액 계산(거래해더)
                m_cDataService.UpdatePayAmount();                                       // 결제 금액 재 계산 처리
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        #endregion

        #region 결제 반품
        /// <summary>
        /// 결제 반품
        /// </summary>
        /// <returns></returns>
        public string RefundPayment(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                //if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return sRet;

                int nPayRow = CmUtil.IntParse(aParam[0]); // 취소할 행번호

                // 결제 내역 받아 오기
                ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                m_cPayItem = (Column.TR_PAYMENT.DATA)alPayItem[nPayRow];

                if (m_cPayItem.OCCUR_ENTRY_08.ToString() != ItemConst.PAY_APP_DIV.NORMAL)
                {
                    //임의 등록 이면 승인 없이 데이터 처리
                    //WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0240));
                    m_cPayItem.OCCUR_ENTRY_06 = m_cPayItem.OCCUR_ENTRY_02;
                    m_cPayItem.OCCUR_ENTRY_07 = m_cPayItem.OCCUR_ENTRY_03;

                    sRet = UserCom.RST_OK;
                }
                else
                {
                    string sTranType = ItemConst.GIFT_APPROVE_DIV.CANCEL;                                                   // 조회구분 (10: 승인, 20:조회, 30:망취소)
                    string sWcc = m_cPayItem.OCCUR_ENTRY_05;                                                                // 입력구분
                    string sGiftNo = m_cPayItem.OCCUR_ENTRY_01;                                                             // 입력데이터 
                    double nGiftAmt = m_cPayItem.AMT_ENTRY_01;                                                              // 대상금액
                    string sAppDate = m_cPayItem.OCCUR_ENTRY_03;                                                            // 승인일자
                    string sAppNo = m_cPayItem.OCCUR_ENTRY_02;                                                              // 승인번호
                    string sAppTime = "";                                                                                   // 승인시간
                    string sBrandCD = m_cPayItem.OCCUR_ENTRY_17;                                                           // 고정브랜드코드
                    string sGiftType = m_cPayItem.OCCUR_ENTRY_18;                                                           // 상품권권종

                    sRet = ExecuteIrt(PosConst.CANCEL_DIV.CANCEL_SUBTOT, sTranType, sBrandCD, sWcc, sGiftNo, nGiftAmt, sAppNo, sAppDate, sAppTime, sAppNo, sAppDate, sGiftType);
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        #endregion

        #region 조회 실행
        /// <summary>
        /// 조회 실행
        /// </summary>
        public string ExecuteIrt(string sTradeDiv, string sTranType, string sInqFlag, string sWcc, string sGiftNo, double nGiftAmt, string sAppNo, string sAppDate, string sAppTime, string sOrgAppNo, string sOrgAppDate,string sGiftType)
        {
            string sRet = UserCom.RST_ERR;
            Hashtable htRecvData = new Hashtable(); 
            try
            {
                // 연습모드이면 연습 데이터 설정
                if (m_cPosStatus.Base.TrainingFlag == "1" || m_cPosStatus.Mst.TestStorYn == "1" ) return SetTrainingData(sTranType, sInqFlag, sWcc, sGiftNo, nGiftAmt, sAppNo, sAppDate, sAppTime, sOrgAppNo, sOrgAppDate, sGiftType);

                // 조회
                sRet = ExecuteHostIrt(sTradeDiv, sTranType, sInqFlag, sWcc, sGiftNo, nGiftAmt, sAppNo, sAppDate, sAppTime, sOrgAppNo, sOrgAppDate, sGiftType, ref htRecvData);
                if (sRet != UserCom.RST_OK) return sRet;

                // 결제구분 (1:결제, 2:할인)
                DataRow dr = PosMstManager.GetMstPayDc(new string[] { m_cPosStatus.Base.CmpCd, m_cPosStatus.Base.StoreNo, m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01 });
                 
                m_cPayItem.PAY_DTL_CD_01 = string.Format("{0:00}", CmUtil.DoubleParse(htRecvData[Column.IQ_GIFT_APP_RSP.DATA.INQ_FLAG].ToString()));                 // 결제 상세코드

                m_cPayItem.PAY_AMT = CmUtil.DoubleParse(htRecvData[Column.IQ_GIFT_APP_RSP.DATA.GIFT_AMT].ToString());

                m_cPayItem.PAY_DTL_CD_02 = "";                                                                          // 캠페인코드
                m_cPayItem.PAY_DTL_CD_03 = "0";                                                                         // 할인금액 아이템 적용 여부 (0:미적용, 1:적용)
                m_cPayItem.PAY_DTL_CD_04 = "";                                                                          // 상품코드
                m_cPayItem.PAY_DTL_CD_05 = PosConst.PAY_DC_TYPE.PAY;                                                    // 할인결제구분 (1:결제, 2:할인)

                m_cPayItem.QTY_ENTRY_01 = 0;                                                                            // 수량
                m_cPayItem.QTY_ENTRY_02 = 0;    
                m_cPayItem.QTY_ENTRY_03 = 0;
                m_cPayItem.QTY_ENTRY_04 = 0;
                m_cPayItem.QTY_ENTRY_05 = 0;

                m_cPayItem.AMT_ENTRY_01 = CmUtil.DoubleParse(htRecvData[Column.IQ_GIFT_APP_RSP.DATA.GIFT_AMT].ToString()); // 받은돈
                m_cPayItem.AMT_ENTRY_02 = 0;                                                                            // 거스름
                m_cPayItem.AMT_ENTRY_03 = 0;                                                                            // 
                m_cPayItem.AMT_ENTRY_04 = 0;
                m_cPayItem.AMT_ENTRY_05 = 0;
                m_cPayItem.AMT_ENTRY_08 = 0;
                m_cPayItem.AMT_ENTRY_09 = 0;
                m_cPayItem.AMT_ENTRY_10 = 0;

                m_cPayItem.OCCUR_ENTRY_01 = sGiftNo;                                                                    // 카드번호
                m_cPayItem.OCCUR_ENTRY_02 = htRecvData[Column.IQ_GIFT_APP_RSP.DATA.APPROVE_NO].ToString();              // 승인번호
                m_cPayItem.OCCUR_ENTRY_03 = htRecvData[Column.IQ_GIFT_APP_RSP.DATA.APPROVE_DATE].ToString().Substring(0, 8);    // 승인일자
                m_cPayItem.OCCUR_ENTRY_04 = htRecvData[Column.IQ_GIFT_APP_RSP.DATA.APPROVE_DATE].ToString().Substring(8, 6);    // 승인시간
                m_cPayItem.OCCUR_ENTRY_05 = sWcc;                                                                       // 입력 구분
                m_cPayItem.OCCUR_ENTRY_06 = sOrgAppNo;                                                                  // 원승인번호
                m_cPayItem.OCCUR_ENTRY_07 = sOrgAppDate;                                                                // 원승인일자
                m_cPayItem.OCCUR_ENTRY_08 = ItemConst.PAY_APP_DIV.NORMAL;                                               // 승인구분
                m_cPayItem.OCCUR_ENTRY_11 = htRecvData[Column.IQ_GIFT_APP_RSP.DATA.MESSAGE2].ToString();                // 상품권명칭
                m_cPayItem.OCCUR_ENTRY_12 = "";                                                                         //  
                m_cPayItem.OCCUR_ENTRY_13 = htRecvData[Column.IQ_GIFT_APP_RSP.DATA.INQ_FLAG].ToString();                // 승인서버구분
                m_cPayItem.OCCUR_ENTRY_15 = sGiftType;                                                                  // 권종
                m_cPayItem.OCCUR_ENTRY_16 = CmUtil.GetDataRowStr(dr, PosMst.MST_PAY_DC.DATA.APPR_VEND_CD);              // VAN 구분
                m_cPayItem.OCCUR_ENTRY_17 = sInqFlag;                                                                   // 고정브랜드코드
                m_cPayItem.OCCUR_ENTRY_20 = GetPayDtlCdToPayDtlName(m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01);   // 결제수단명
                m_cPayItem.OCCUR_ENTRY_22 = "";
                m_cPayItem.BILLSPR_NO = m_cTrnStatus.Sale.BillSplitNo;                                                  // 빌분리 번호

                sRet = UserCom.RST_OK;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }

        /// <summary>
        /// 연습 데이터 설정
        /// </summary>
        public string SetTrainingData(string sInqFlag, string sTranType, string sWcc, string sGiftNo, double nGiftAmt, string sAppNo, string sAppDate, string sAppTime, string sOrgAppNo, string sOrgAppDate, string sGiftType)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                // 연습모드이면 연습 데이터 설정

                // 결제구분 (1:결제, 2:할인)
                DataRow dr = PosMstManager.GetMstPayDc(new string[] { m_cPosStatus.Base.CmpCd, m_cPosStatus.Base.StoreNo, m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01 });

                m_cPayItem.PAY_AMT = nGiftAmt;

                m_cPayItem.PAY_DTL_CD_02 = "";                                                                          // 캠페인코드
                m_cPayItem.PAY_DTL_CD_03 = "1";                                                                         // 할인금액 아이템 적용 여부 (0:미적용, 1:적용)
                m_cPayItem.PAY_DTL_CD_04 = "";                                                                          // 상품코드
                m_cPayItem.PAY_DTL_CD_05 = PosConst.PAY_DC_TYPE.PAY;                                                    // 할인결제구분 (1:결제, 2:할인)

                m_cPayItem.QTY_ENTRY_01 = 0;                                                                            // 수량
                m_cPayItem.QTY_ENTRY_02 = 0;
                m_cPayItem.QTY_ENTRY_03 = 0;
                m_cPayItem.QTY_ENTRY_04 = 0;
                m_cPayItem.QTY_ENTRY_05 = 0;

                m_cPayItem.AMT_ENTRY_01 = nGiftAmt;                                                                     // 받은돈
                m_cPayItem.AMT_ENTRY_02 = 0;                                                                            // 거스름돈
                m_cPayItem.AMT_ENTRY_03 = 0;                                                           
                m_cPayItem.AMT_ENTRY_04 = 0;
                m_cPayItem.AMT_ENTRY_05 = 0;
                m_cPayItem.AMT_ENTRY_08 = 0;
                m_cPayItem.AMT_ENTRY_09 = 0;
                m_cPayItem.AMT_ENTRY_10 = 0;

                m_cPayItem.OCCUR_ENTRY_01 = sGiftNo;                                                                    // 카드번호
                m_cPayItem.OCCUR_ENTRY_02 = sAppNo;                                                                     // 승인번호
                m_cPayItem.OCCUR_ENTRY_03 = sAppDate;                                                                   // 승인일자
                m_cPayItem.OCCUR_ENTRY_04 = sAppTime;                                                                   // 승인시간
                m_cPayItem.OCCUR_ENTRY_05 = sWcc;                                                                       // 입력 구분
                m_cPayItem.OCCUR_ENTRY_06 = sOrgAppNo;                                                                  // 원승인번호
                m_cPayItem.OCCUR_ENTRY_07 = sOrgAppDate;                                                                // 원승인일자
                m_cPayItem.OCCUR_ENTRY_08 = ItemConst.PAY_APP_DIV.NORMAL;                                               // 승인구분
                m_cPayItem.OCCUR_ENTRY_13 = sInqFlag;                                                                   // 승인서버구분
                m_cPayItem.OCCUR_ENTRY_15 = sGiftType;                                                                  // 권종
                m_cPayItem.OCCUR_ENTRY_16 = CmUtil.GetDataRowStr(dr, PosMst.MST_PAY_DC.DATA.APPR_VEND_CD);              // VAN 구분
                m_cPayItem.OCCUR_ENTRY_17 = sInqFlag;                                                                   // 고정브랜드코드
                m_cPayItem.OCCUR_ENTRY_20 = GetPayDtlCdToPayDtlName(m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01);   // 결제수단명
                m_cPayItem.OCCUR_ENTRY_22 = "";

                m_cPayItem.CANCEL_DIV = ItemConst.PAY_CANCEL_DIV.NORMAL;                                                // 취소여부
                m_cPayItem.BILLSPR_NO = m_cTrnStatus.Sale.BillSplitNo;                                                  // 빌분리 번호

                sRet = UserCom.RST_OK;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        #endregion

        #region Host 조회 실행
        /// <summary>
        /// Host 조회 실행
        /// </summary>
        public string ExecuteHostIrt(string sTradeDiv, string sTranType, string sInqFlag, string sWcc, string sGiftNo, double nGiftAmt, string sAppNo, string sAppDate, string sAppTime, string sOrgAppNo, string sOrgAppDate, string sGiftType, ref Hashtable htRecvData)
        {
            int iRecvTimeOut = 10000;
            string sAppr_PAth = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                if (m_cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.GIFT_ITEM ) return null;
            Re_Try:
                Hashtable htSendData = new Hashtable();

                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.INQ_TYPE, ItemConst.IRT_INQ_TYPE.GIFT_APPROVE_INQ); 
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.DEAL_TYPE, sTranType); 
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.INQ_FLAG, sInqFlag);                
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.STOR_CD, m_cPosStatus.Base.StoreNo);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.SALE_DT, m_cPosStatus.Base.SaleDate);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.POS_NO, m_cPosStatus.Base.PosNo);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.REG_NO, m_cPosStatus.Base.TradeNo);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.OP_NO, m_cPosStatus.Base.CashierNo);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.WCC, sWcc);

                // 승인처리 경로
                sAppr_PAth = ItemConst.GIFT_APPROVE_PATH.STORE;
                if (sTranType == ItemConst.GIFT_APPROVE_DIV.NET_CANCEL)
                    sAppr_PAth = ItemConst.GIFT_APPROVE_PATH.NET_CANCEL;
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.APPR_PATH, sAppr_PAth);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.GIFT_NO, sGiftNo);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.GIFTVRTY, sGiftType);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.ORG_SALE_DT, sOrgAppDate);
                htSendData.Add(Column.IQ_GIFT_APP_REQ.DATA.ORG_APPROVE_NO, sOrgAppNo);

                // 요청 - 승인로그 저장   (판매구분, [0]결제수단, [1]결제상세코드, [2]전문구분, [3]요청구분, [4]카드번호, [5]결제금액, [6]승인번호, [7]승인일자, [8]승인시간, [9]응답상태값, [10]응답메시지, [11]전문)
                m_cDataCommon.SetSaleApprLog(sTradeDiv, new string[] { m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01, sTranType, "S", sGiftNo, nGiftAmt.ToString(), "", "", "", "", "", JsonConvert.SerializeObject(htSendData) });

                // 승인요청
                sRet = m_cDataCommon.ExecutePosIrt(ItemConst.COMM_MSG_TYPE.POSIRT, m_cPosStatus.Base.CommSvrIp, (int)m_cPosStatus.Base.PayInqPort, iRecvTimeOut, htSendData, ref htRecvData);

                if (sRet != UserCom.RST_OK)
                {
                    WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0207));

                    sRet = UserCom.RST_ERR;
                    return sRet;
                }
                 
                // 응답 - 승인로그 저장   (판매구분, [0]결제수단, [1]결제상세코드, [2]전문구분, [3]요청구분, [4]카드번호, [5]결제금액, [6]승인번호, [7]승인일자, [8]승인시간, [9]응답상태값, [10]응답메시지, [11]전문)
                m_cDataCommon.SetSaleApprLog(sTradeDiv, new string[] { m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01, sTranType, "R"
                                                            , sGiftNo, nGiftAmt.ToString()
                                                            , htRecvData[Column.IQ_GIFT_APP_RSP.DATA.APPROVE_NO].ToString(), CmUtil.MidH(htRecvData[Column.IQ_GIFT_APP_RSP.DATA.APPROVE_DATE].ToString(), 0, 8),  CmUtil.MidH(htRecvData[Column.IQ_GIFT_APP_RSP.DATA.APPROVE_DATE].ToString(), 8, 6)
                                                            , htRecvData[Column.IQ_GIFT_APP_RSP.DATA.RES_CD].ToString()
                                                            , htRecvData[Column.IQ_GIFT_APP_RSP.DATA.MESSAGE1] + "\n\r" + htRecvData[Column.IQ_GIFT_APP_RSP.DATA.MESSAGE2]
                                                            , JsonConvert.SerializeObject(htRecvData) });

                if (htRecvData[Column.IQ_GIFT_APP_RSP.DATA.RES_CD].ToString() != "0000")
                {
                    if (m_sPosMenuKey == PosKey.MENU_KEY.GIFT_CARD_SCH)
                    {
                        if (htRecvData[Column.IQ_GIFT_APP_RSP.DATA.RES_CD].ToString() == "9999" && sInqFlag.Trim() != "0")
                        {
                            if (m_cPosStatus.Mst.CorpDiv == ItemConst.CORP_DIV.PC && m_cPosStatus.Mst.CntryDiv == ItemConst.CNTRY_DIV.KR)
                            {
                                // PCKR이 아닌경우 공용상품권 재조회 시도
                                sInqFlag = "0";
                                goto Re_Try;
                            }
                        }
                    }

                    WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0207) + " (" + htRecvData[Column.IQ_GIFT_APP_RSP.DATA.RES_CD].ToString() + ")" + "\n\r" + htRecvData[Column.IQ_GIFT_APP_RSP.DATA.MESSAGE1] + "\n\r" + htRecvData[Column.IQ_GIFT_APP_RSP.DATA.MESSAGE2]);

                    sRet = UserCom.RST_ERR;
                    return sRet;
                }

                sRet = UserCom.RST_OK;
                return sRet;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        #endregion
    }
}
