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

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

/*-----------------------------------------------------------------------------------------------*/
// 설      명 : 티머니/캐시비
// 작  성  자 : 
// 변경  이력 : 
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.Service
{
    class TMoney : PaymentBase, IPaymentUs
    {
        private ISignPadUs m_cDeviceSignPad = null;                                 // 서명패드
        /// <summary>
        /// 지불 직전취소 여부(true:취소, false:반품)
        /// </summary>
        private bool bPayLastCancel = false;        

        public TMoney()
        {
            m_cDeviceSignPad = (ISignPadUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_SIGNPAD);
        }

        #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
            {
               
            }
            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 SetPayment 결제 등록
        /// <summary>
        /// 결제 등록 
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string SetPayment(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;
            string sPosMenuKey = "";                            // 메뉴키
            string sInPutType = "";                             // 입력구분
            string sInPutData = "";                             // 입력데이터
            string sCardData = "";                              // 카드데이터
            double nPayAmt = 0;                                 // 대상금액
            string sApprDate = "";                              // 승인일자
            string sApprNo = "";                                // 승인번호
            string sCardType = "";                              // 카드타입 (T:티머니, E:캐시비)
            double nDCAmt = 0;                                  // 할인금액
            double nBalanceAmt = 0;                             // 잔액

            try
            {
                sPosMenuKey = aParam[0];                        // 메뉴키
                sInPutType = aParam[1];                         // 입력구분
                sInPutData = aParam[2];                         // 입력데이터
                sCardData = aParam[3];                          // 카드데이터
                nPayAmt = CmUtil.DoubleParse(aParam[4]);        // 대상금액
                sApprDate = aParam[5];                          // 승인일자
                sApprNo = aParam[6];                            // 승인번호
                sCardType = aParam[7];                          // 카드타입 (T:티머니, E:캐시비)
                nDCAmt = CmUtil.DoubleParse(aParam[8]);         // 할인금액
                nBalanceAmt = CmUtil.DoubleParse(aParam[9]);    // 잔액

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

                m_cPayItem.PAY_WAY_CD = ItemConst.TR_ITEM_ID.MOBILECASH_ITEM ;
                m_cPayItem.PAY_DTL_CD_01 = (sCardType == "T") ? ItemConst.TR_ITEM_ID.MOBILECASH.T_MONEY : ItemConst.TR_ITEM_ID.MOBILECASH.CASHBEE;

                sRet = ExecuteIrt(PosConst.CANCEL_DIV.NORMAL, sCardType, sInPutType, sInPutData, sCardData, nPayAmt, sApprDate, sApprNo, nDCAmt, nBalanceAmt);
                if (sRet != UserCom.RST_OK) return sRet;

                // 결제 아이템 추가
                ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);     // 결제 내역 받아 오기
                m_cPayItem.SEQ = alPayItem.Count + 1;
                alPayItem.Add(m_cPayItem);

                m_cDataService.UpdatePluAmount();       // 상품 합계금액 계산(거래해더)
                m_cDataService.UpdatePayAmount();       // 결제 금액 재 계산 처리

                //WinManager.ConfirmMessage(sPointType + " " + MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0067));
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                   System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            finally
            {
                //여전법 대응!
                //////////////////////////////////////////////////////////////////////////////////
                CmUtil.ZeroFillClear(ref sInPutData);
                CmUtil.ZeroFillClear(ref sCardData);
                CmUtil.ZeroFillClear(ref aParam);
                //////////////////////////////////////////////////////////////////////////////////
            }
            return sRet;
        }
        #endregion

        #region CancelPayment 결제 취소
        /// <summary>
        /// 결제 취소
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string CancelPayment(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;
            string sInPutType = "";                      // 입력구분
            string sInPutData = "";                      // 입력데이터
            string sCardData = "";                       // 카드데이터
            double nPayAmt = 0;                          // 대상금액
            string sApprDate = "";                       // 승인일자
            string sApprNo = "";                         // 승인번호
            string sCardType = "";                       // 카드타입 (T:티머니, E:캐시비)
            double nDCAmt = 0;                           // 할인금액

            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];

                sInPutType = m_cPayItem.OCCUR_ENTRY_05;          // 입력구분
                sInPutData = m_cPayItem.OCCUR_ENTRY_01;          // 입력데이터
                sCardData = m_cPayItem.OCCUR_ENTRY_22;           // 카드데이터
                nPayAmt = m_cPayItem.AMT_ENTRY_01;               // 대상금액
                sApprDate = m_cPayItem.OCCUR_ENTRY_03 + m_cPayItem.OCCUR_ENTRY_04;           // 승인일자
                sApprNo = m_cPayItem.OCCUR_ENTRY_02;             // 승인번호
                sCardType = m_cPayItem.OCCUR_ENTRY_12;           // 카드타입 (T:티머니, E:캐시비)
                nDCAmt = m_cPayItem.AMT_ENTRY_02;                // 할인금액

                bPayLastCancel = true;
                sRet = ExecuteIrt(PosConst.CANCEL_DIV.CANCEL, sCardType, sInPutType, sInPutData, sCardData, nPayAmt, sApprDate, sApprNo, nDCAmt, 0);
                if (sRet != UserCom.RST_OK) return sRet;

                m_cPayItem.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;

                m_cDataService.UpdatePluAmount();       // 상품 합계금액 계산(거래해더)
                m_cDataService.UpdatePayAmount();       // 결제 금액 재 계산 처리

                //WinManager.ConfirmMessage(sPointType + " " + MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0068));

                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);
            }
            finally
            {
                //여전법 대응!
                //////////////////////////////////////////////////////////////////////////////////
                CmUtil.ZeroFillClear(ref sInPutData);
                CmUtil.ZeroFillClear(ref sCardData);
                CmUtil.ZeroFillClear(ref aParam);
                //////////////////////////////////////////////////////////////////////////////////
            }
            return sRet;
        }
        #endregion

        #region RefundPayment 결제 반품
        /// <summary>
        /// 결제 반품
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string RefundPayment(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;
            string sInPutType = "";                      // 입력구분
            string sInPutData = "";                      // 입력데이터
            string sCardData = "";                       // 카드데이터
            double nPayAmt = 0;                          // 대상금액
            string sApprDate = "";                       // 승인일자
            string sApprNo = "";                         // 승인번호
            string sCardType = "";                       // 카드타입 (T:티머니, E:캐시비)
            double nDCAmt = 0;                           // 할인금액
            try
            {
                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
                {
                    sInPutType = m_cPayItem.OCCUR_ENTRY_05;          // 입력구분
                    sInPutData = m_cPayItem.OCCUR_ENTRY_01;          // 입력데이터
                    sCardData = m_cPayItem.OCCUR_ENTRY_22;           // 카드데이터
                    nPayAmt = m_cPayItem.AMT_ENTRY_01;               // 대상금액
                    sApprDate = m_cPayItem.OCCUR_ENTRY_03 + m_cPayItem.OCCUR_ENTRY_04;           // 승인일자
                    sApprNo = m_cPayItem.OCCUR_ENTRY_02;             // 승인번호
                    sCardType = m_cPayItem.OCCUR_ENTRY_12;           // 카드타입 (T:티머니, E:캐시비)
                    nDCAmt = m_cPayItem.AMT_ENTRY_02;                // 할인금액

                    bPayLastCancel = false;
                    sRet = ExecuteIrt(PosConst.CANCEL_DIV.CANCEL, sCardType, sInPutType, sInPutData, sCardData, nPayAmt, sApprDate, sApprNo, nDCAmt, 0);
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                   System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            finally
            {
                //여전법 대응!
                //////////////////////////////////////////////////////////////////////////////////
                CmUtil.ZeroFillClear(ref sInPutData);
                CmUtil.ZeroFillClear(ref sCardData);
                CmUtil.ZeroFillClear(ref aParam);
                //////////////////////////////////////////////////////////////////////////////////
            }
            return sRet;
        }
        #endregion

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

        #region 조회 실행
        /// <summary>
        /// 조회 실행
        /// </summary>
        public string ExecuteIrt(string sTradeDiv, string sCardType, string sInPutType, string sInPutData, string sCardData, double nPayAmt, string sApprDate, string sApprNo, double nDCAmt, double nBalanceAmt)
        {
            string sRet = UserCom.RST_ERR;
            string sRcvRfData = "";
            string sRcvTranSend = "";
            string[] aParam = new string[5];
            string sCashRefund = "";

            try
            {
                // 연습모드이면 연습 데이터 설정
                if (m_cPosStatus.Base.TrainingFlag == "1" || m_cPosStatus.Mst.TestStorYn == "1") return SetTrainingData(sCardType, sInPutType, sInPutData, sCardData, nPayAmt, sApprDate, sApprNo, nDCAmt, sCashRefund);


                // 승인업체 코드 조회
                string sVanCD = PosMstManager.GetMstPayDc(m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01, PosMst.MST_PAY_DC.DATA.APPR_VEND_CD);
                if (sVanCD == "")
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0563);
                    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, sTradeDiv, "S", sCardData, nPayAmt.ToString(), "", "", "", "", "", "" });

                // 승인요청
                sRet = ExecuteTMoneyAppr(sTradeDiv, sCardType, nPayAmt.ToString(), sApprDate, ref sRcvRfData, ref sRcvTranSend, ref sCashRefund, sCardData, nBalanceAmt);
                if (sRet != UserCom.RST_OK)
                {
                    //// 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R"
                    //                                        , sCardData, nPayAmt.ToString()
                    //                                        , "", "", ""
                    //                                        , sRet
                    //                                        , ""
                    //                                        , sRcvRfData });

                    return sRet;
                }

                if (sTradeDiv == PosConst.CANCEL_DIV.NORMAL)
                {
                    if (CmUtil.MidH(sRcvRfData, 0, 1) == "T")
                    {
                        // 티머니
                        aParam[0] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 43, 10)).ToString();                         // 승인금액
                        aParam[1] = CmUtil.MidH(sRcvRfData, 128, 14);                                                       // 승인일시
                        aParam[2] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 33, 10)).ToString();                         // 거래후잔액
                        aParam[3] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 118, 10)).ToString();                        // 거래전잔액
                        aParam[4] = CmUtil.DoubleParse(CmUtil.MidH(sRcvTranSend, 45, 12)).ToString();                       // 거래고유번호
                    }
                    else
                    {
                        // 캐시비
                        aParam[0] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 74, 10)).ToString();                         // 승인금액
                        aParam[1] = CmUtil.MidH(sRcvRfData, 50, 14);                                                        // 승인일시
                        aParam[2] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 84, 10)).ToString();                         // 거래후잔액
                        aParam[3] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 64, 10)).ToString();                         // 거래전잔액
                        aParam[4] = CmUtil.DoubleParse(CmUtil.MidH(sRcvTranSend, 45, 12)).ToString();                       // 거래고유번호
                    }
                }
                else
                {
                    aParam[0] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 81, 10)).ToString();                             // 승인금액
                    aParam[1] = CmUtil.LeftH(DateTime.Now.ToString("yyyy"), 2) + CmUtil.MidH(sRcvRfData, 1, 10);            // 승인일시
                    aParam[2] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 71, 10)).ToString();                             // 거래후잔액
                    aParam[3] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 61, 10)).ToString();                             // 거래전잔액
                    aParam[4] = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 1, 10)).ToString();                              // 거래고유번호
                }

                // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R"
                                                            , sCardData, nPayAmt.ToString()
                                                            , aParam[4], CmUtil.MidH(aParam[1], 0, 8), CmUtil.MidH(aParam[1], 8, 6)
                                                            , sRet
                                                            , ""
                                                            , sRcvRfData });
                // 2017.05.02 취소시 aParam[0] 값 설정 안됨.
                m_cPayItem.PAY_AMT = nPayAmt;       // CmUtil.DoubleParse(aParam[0]); 

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

                m_cPayItem.AMT_ENTRY_01 = m_cPayItem.PAY_AMT;                                                           // 사용포인트
                m_cPayItem.AMT_ENTRY_02 = nDCAmt;                                                                       // 캠페인할인
                m_cPayItem.AMT_ENTRY_03 = CmUtil.DoubleParse(aParam[3]);                                                // 거래전잔액
                m_cPayItem.AMT_ENTRY_04 = CmUtil.DoubleParse(aParam[2]);                                                // 거래후잔액
                m_cPayItem.AMT_ENTRY_05 = 0;
                m_cPayItem.AMT_ENTRY_06 = 0;                                                                            // 현금환불시 금액
                if (sCashRefund == "1")
                    m_cPayItem.AMT_ENTRY_06 = m_cPayItem.PAY_AMT;                                                       // 현금환불시 금액
 
                m_cPayItem.OCCUR_ENTRY_01 = CmUtil.LeftH(sInPutData, 6);                                                // 카드번호
                m_cPayItem.OCCUR_ENTRY_02 = aParam[4].Trim();                                                           // 승인번호
                m_cPayItem.OCCUR_ENTRY_03 = CmUtil.MidH(aParam[1], 0, 8);                                               // 승인일자
                m_cPayItem.OCCUR_ENTRY_04 = CmUtil.MidH(aParam[1], 8, 6);                                               // 승인시간
                m_cPayItem.OCCUR_ENTRY_05 = sInPutType;                                                                 // 입력 구분
                m_cPayItem.OCCUR_ENTRY_06 = sApprNo;                                                                    // 원승인번호
                m_cPayItem.OCCUR_ENTRY_07 = sApprDate;                                                                  // 원승인일자
                m_cPayItem.OCCUR_ENTRY_08 = ItemConst.PAY_APP_DIV.NORMAL;                                               // 승인구분
                m_cPayItem.OCCUR_ENTRY_10 = m_cPosStatus.Base.TradeNo;                                                  // 거래번호
                m_cPayItem.OCCUR_ENTRY_11 = m_cPosStatus.Base.MsgSeqNo;                                                 // 전문번호
                m_cPayItem.OCCUR_ENTRY_12 = sCardType;                                                                  // 카드구분 (T:티머니, E:캐시비)
                m_cPayItem.OCCUR_ENTRY_13 = sCashRefund;                                                                // 현금환불 여부 (1:현금환불)
                m_cPayItem.OCCUR_ENTRY_16 = sVanCD;                                                                     // VAN 구분
                m_cPayItem.OCCUR_ENTRY_20 = (sCardType == "T" ? MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0415) : MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0416));   // 결제수단명

                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);
            }
            finally
            {
                //여전법 대응!
                //////////////////////////////////////////////////////////////////////////////////
                CmUtil.ZeroFillClear(ref sInPutData);
                CmUtil.ZeroFillClear(ref sCardData);
                CmUtil.ZeroFillClear(ref aParam);
                CmUtil.ZeroFillClear(ref sRcvRfData);
                CmUtil.ZeroFillClear(ref sRcvTranSend);
                //////////////////////////////////////////////////////////////////////////////////
            }
            return sRet;
        }

        /// <summary>
        /// 연습 데이터 설정
        /// </summary>
        public string SetTrainingData(string sCardType, string sInPutType, string sInPutData, string sCardData, double nPayAmt, string sApprDate, string sApprNo, double nDCAmt, string sCashRefund)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                string sVanCD = PosMstManager.GetMstPayDc(m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01, PosMst.MST_PAY_DC.DATA.APPR_VEND_CD);    // 승인업체 코드 조회
                if (sVanCD == "")
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0563);
                    return sRet;
                }

                // 연습모드이면 연습 데이터 설정
                m_cPayItem.PAY_AMT = nPayAmt;
                
                m_cPayItem.PAY_DTL_CD_02 = "";          // 캠페인코드
                m_cPayItem.PAY_DTL_CD_03 = "0";         // 할인금액 아이템 적용여부
                m_cPayItem.PAY_DTL_CD_05 = PosConst.PAY_DC_TYPE.PAY;         // 할인결제구분 (1:결제, 2:할인)

                m_cPayItem.AMT_ENTRY_01 = nPayAmt;      // 사용포인트
                m_cPayItem.AMT_ENTRY_02 = nDCAmt;       // 캠페인할인
                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.OCCUR_ENTRY_01 = CmUtil.LeftH(sInPutData, 6);                                                // 카드번호
                m_cPayItem.OCCUR_ENTRY_02 = "99999999";                         // 승인번호
                m_cPayItem.OCCUR_ENTRY_03 = DateTime.Now.ToString("yyyyMMdd");    // 승인일자
                m_cPayItem.OCCUR_ENTRY_04 = DateTime.Now.ToString("HHmmss");      // 승인시간
                m_cPayItem.OCCUR_ENTRY_05 = sInPutType;         // 입력 구분
                m_cPayItem.OCCUR_ENTRY_06 = sApprNo;            // 원승인번호
                m_cPayItem.OCCUR_ENTRY_07 = sApprDate;          // 원승인일자
                m_cPayItem.OCCUR_ENTRY_08 = ItemConst.PAY_APP_DIV.COMPULSION;   //승인구분
                m_cPayItem.OCCUR_ENTRY_10 = m_cPosStatus.Base.TradeNo;                                                  // 거래번호
                m_cPayItem.OCCUR_ENTRY_11 = m_cPosStatus.Base.MsgSeqNo;                                                 // 전문번호
                m_cPayItem.OCCUR_ENTRY_12 = sCardType;                                                                  // 카드구분 (T:티머니, E:캐시비)
                m_cPayItem.OCCUR_ENTRY_13 = sCashRefund;                                                                // 현금환불 여부 (1:현금환불)
                m_cPayItem.OCCUR_ENTRY_16 = sVanCD;                                                                     // VAN 구분
                m_cPayItem.OCCUR_ENTRY_20 = (sCardType == "T" ? MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0415) : MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0416));   // 결제수단명

                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);
            }
            finally
            {
                //여전법 대응!
                //////////////////////////////////////////////////////////////////////////////////
                CmUtil.ZeroFillClear(ref sInPutData);
                CmUtil.ZeroFillClear(ref sCardData); 
                //////////////////////////////////////////////////////////////////////////////////
            }
            return sRet;
        }
        #endregion

        #region 교통카드 승인
        /// <summary>
        ///  교통카드 승인
        /// </summary>
        /// <returns></returns>
        private string ExecuteTMoneyAppr(string sTradeDiv, string sCardType, string sAmount, string sOrgDateTime, ref string sRcvRfData, ref string sRcvTranSend, ref string sCashRefund, string sCardData, double nBalanceAmt)
        {
            string sRet = UserCom.RST_ERR;
            byte[] rep_van_array = new byte[2049];
            int iResult = -1; 
            string sRcvData = ""; 

            try
            {
                string sApprID = PosMstManager.GetMstVan(m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01, PosMst.MST_VAN.DATA.APPR_ID);
                string sBizNm = PosMstManager.GetMstVan(m_cPayItem.PAY_WAY_CD, m_cPayItem.PAY_DTL_CD_01, PosMst.MST_VAN.DATA.CMP_APPR_ID);

                string sMsg1 = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0356);
                string sMsg2 = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0357);
                string sMsg3 = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0358);
                sCashRefund = "0";

                if (sTradeDiv == PosConst.CANCEL_DIV.NORMAL)
                {
                    #region 1.정상 승인 요청
                    // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sAmount, "", "", "", "", "", "TMoneyApprove" });

                    // 정상
                    iResult = m_cDeviceSignPad.TMoneyApprove(sApprID, sCardType, CmUtil.DoubleParse(sAmount).ToString(), sMsg1, sMsg2, sMsg3, ref sRcvRfData);

                    // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sAmount, "", "", "", iResult.ToString(), "", sRcvRfData });

                    if (iResult < 0 && iResult != -2144)    // 응답 -2144시 지불재거래
                    {
                        WinManager.ErrorMessage(LF_TmoneyErrorMsg(iResult));
                        return sRet;
                    }
                    else if (iResult >= 0)
                    {
                        // 교통카드 지불 정상 처리
                        #region 1.1.승인금액 체크
                        string sApprAmount = "0";
                        string sApprDateTime = "0";

                        if (CmUtil.MidH(sRcvRfData, 0, 1) == "T")
                        {
                            // 티머니
                            sApprAmount = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 43, 10)).ToString();
                            sApprDateTime = CmUtil.MidH(sRcvRfData, 128, 14);
                        }
                        else
                        {
                            // 캐시비
                            sApprAmount = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 74, 10)).ToString();
                            sApprDateTime = CmUtil.MidH(sRcvRfData, 50, 14);
                        }
                        #endregion

                        #region 1.2.승인 이력 전송
                        // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sApprAmount, "", "", "", "", "", "TMoneyUploadTran" });

                        // 정상 승인 이력 전송
                        iResult = m_cDeviceSignPad.TMoneyUploadTran(sApprID, sBizNm, m_cPosStatus.Base.MsgSeqNo, m_cPosStatus.Base.TradeNo, "", "", "", sRcvRfData, ref sRcvTranSend);

                        // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sApprAmount, "", "", "", iResult.ToString(), "", sRcvTranSend });
                        #endregion

                        #region 1.3.승인 이력 전송 오류시 직전취소
                        if (iResult < 0 || CmUtil.MidH(sRcvTranSend, 0, 1) == "X")
                        {
                            string sErrorMsg = LF_TmoneyErrorMsg(iResult);
                            if (iResult > 0) sErrorMsg = CmUtil.MidH(sRcvTranSend, 11, 30).Trim();

                            // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sApprAmount, "", "", "", "", "", "TMoneyApproveCancel" });

                            // 직전취소
                            int iResult2 = m_cDeviceSignPad.TMoneyApproveCancel(sApprID, sCardType, sMsg1, sMsg2, sMsg3, sApprAmount, sApprDateTime, m_cPosStatus.Base.TradeNo, ref sRcvRfData);

                            // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sApprAmount, "", "", "", iResult2.ToString(), "", sRcvRfData });

                            if (iResult2 > 0)
                            {
                                // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sApprAmount, "", "", "", "", "", "TMoneyUploadTran" });

                                // 직전취소 승인 이력 전송
                                int iResult3 = m_cDeviceSignPad.TMoneyUploadTran(sApprID, sBizNm, m_cPosStatus.Base.MsgSeqNo, m_cPosStatus.Base.TradeNo, sApprAmount, sApprDateTime, m_cPosStatus.Base.TradeNo, sRcvRfData, ref sRcvTranSend);

                                // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sApprAmount, "", "", "", iResult3.ToString(), "", sRcvTranSend });

                                WinManager.ErrorMessage(sErrorMsg);
                                return sRet;
                            }
                        }
                        #endregion
                    }
                    
                    #region 1.4.거래후 잔액체크후 틀린경우 지불재거래
                    // 거래후 잔액체크
                    iResult = LF_TMoneyCardInfo(sTradeDiv, sCardData, sAmount, nBalanceAmt, "Y", ref sRcvData);
                    if (iResult == -3001)   // 카드번호 다름(다시한번 읽어 봄)
                    {
                        iResult = LF_TMoneyCardInfo(sTradeDiv, sCardData, sAmount, nBalanceAmt, "Y", ref sRcvData);
                    }
                    
                    // 지불 재거래
                    if (iResult == -2144)
                    {
                        iResult = LF_TMoneyApprovRe(sTradeDiv, sCardData, sAmount, sApprID, sCardType, ref sRcvRfData);

                        if (iResult < 0) return sRet;

                        #region 1.5.승인금액 체크
                        string sApprAmount = "0";
                        string sApprDateTime = "0";

                        if (CmUtil.MidH(sRcvRfData, 0, 1) == "T")
                        {
                            // 티머니
                            sApprAmount = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 43, 10)).ToString();
                            sApprDateTime = CmUtil.MidH(sRcvRfData, 128, 14);
                        }
                        else
                        {
                            // 캐시비
                            sApprAmount = CmUtil.DoubleParse(CmUtil.MidH(sRcvRfData, 74, 10)).ToString();
                            sApprDateTime = CmUtil.MidH(sRcvRfData, 50, 14);
                        }
                        #endregion

                        #region 1.6.승인 이력 전송
                        // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sApprAmount, "", "", "", "", "", "TMoneyUploadTran" });

                        // 정상 승인 이력 전송
                        iResult = m_cDeviceSignPad.TMoneyUploadTran(sApprID, sBizNm, m_cPosStatus.Base.MsgSeqNo, m_cPosStatus.Base.TradeNo, "", "", "", sRcvRfData, ref sRcvTranSend);

                        // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sApprAmount, "", "", "", iResult.ToString(), "", sRcvTranSend });
                        #endregion

                        #region 1.7.승인 이력 전송 오류시 직전취소
                        if (iResult < 0 || CmUtil.MidH(sRcvTranSend, 0, 1) == "X")
                        {
                            string sErrorMsg = LF_TmoneyErrorMsg(iResult);
                            if (iResult > 0) sErrorMsg = CmUtil.MidH(sRcvTranSend, 11, 30).Trim();

                            // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sApprAmount, "", "", "", "", "", "TMoneyApproveCancel" });

                            // 직전취소
                            int iResult2 = m_cDeviceSignPad.TMoneyApproveCancel(sApprID, sCardType, sMsg1, sMsg2, sMsg3, sApprAmount, sApprDateTime, m_cPosStatus.Base.TradeNo, ref sRcvRfData);

                            // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sApprAmount, "", "", "", iResult2.ToString(), "", sRcvRfData });

                            if (iResult2 > 0)
                            {
                                // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sApprAmount, "", "", "", "", "", "TMoneyUploadTran" });

                                // 직전취소 승인 이력 전송
                                int iResult3 = m_cDeviceSignPad.TMoneyUploadTran(sApprID, sBizNm, m_cPosStatus.Base.MsgSeqNo, m_cPosStatus.Base.TradeNo, sApprAmount, sApprDateTime, m_cPosStatus.Base.TradeNo, sRcvRfData, ref sRcvTranSend);

                                // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sApprAmount, "", "", "", iResult3.ToString(), "", sRcvTranSend });

                                WinManager.ErrorMessage(sErrorMsg);
                                return sRet;
                            }
                        }
                        #endregion
                    }
                    #endregion
                    #endregion

                    return UserCom.RST_OK;
                }
                else
                {
                    #region 2.취소 승인 요청
                    // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sAmount, "", "", "", "", "", "TMoneyVoidCharge" });

                    // 취소
                    string sOrgTradeNo = (m_cTrnStatus.Head.OrgTradeNo.Trim() == "") ? m_cTrnStatus.Head.TradeNo : m_cTrnStatus.Head.OrgTradeNo;
                    iResult = m_cDeviceSignPad.TMoneyVoidCharge(sApprID, sBizNm, m_cPosStatus.Base.MsgSeqNo, sCardType, sMsg1, sMsg2, sMsg3, m_cPosStatus.Base.TradeNo, sAmount, sOrgDateTime, sOrgTradeNo, ref sRcvRfData);

                    // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sAmount, "", "", "", iResult.ToString(), "", sRcvRfData });

                    if (iResult > 0)
                    {
                        //// 직전취소
                        //iResult = m_cDeviceSignPad.TMoneyApproveCancel(sApprID, sCardType, sMsg1, sMsg2, sMsg3, sAmount, sOrgDateTime, m_cPosStatus.Base.TradeNo, ref sRcvRfData);
                        //// 직전취소 승인 이력 전송
                        //iResult = m_cDeviceSignPad.TMoneyUploadTran(sApprID, sBizNm, m_cPosStatus.Base.MsgSeqNo, m_cPosStatus.Base.TradeNo, sAmount, sOrgDateTime, m_cPosStatus.Base.TradeNo, sRcvRfData, ref sRcvTranSend);
                    }
                    else
                    {
                        if (bPayLastCancel == false)        // 반품모드 일때
                        {
                            string sMssage = string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0366), (sCardType == "T" ? MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0415) : MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0416)));

                            if (WinManager.QuestionMessage(sMssage) == false) return sRet;

                            #region 2.1 취소승인 오류시 현금환불
                            // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sAmount, "", "", "", "", "", "TMoneyCashVoid" });

                            // 현금환불
                            iResult = m_cDeviceSignPad.TMoneyCashVoid(sApprID, sCardType, sMsg1, sMsg2, sMsg3, m_cPosStatus.Base.TradeNo, sAmount, sOrgDateTime, sOrgTradeNo, ref sRcvRfData);

                            // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sAmount, "", "", "", iResult.ToString(), "", sRcvRfData });
                            #endregion

                            #region 2.2 현금환불 정상인 경우 승인이력 전송
                            if (iResult > 0)
                            {
                                // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sAmount, "", "", "", "", "", "TMoneyUploadTran" });

                                // 현금환불 승인 이력 전송
                                int iResult2 = m_cDeviceSignPad.TMoneyUploadTran(sApprID, sBizNm, m_cPosStatus.Base.MsgSeqNo, m_cPosStatus.Base.TradeNo, sAmount, sOrgDateTime, m_cPosStatus.Base.TradeNo, sRcvRfData, ref sRcvTranSend);
                                sCashRefund = "1";

                                // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sAmount, "", "", "", iResult2.ToString(), "", sRcvTranSend });
                            }
                            #endregion
                        }
                    }
                    #endregion
                }

                if (iResult > 0)
                    sRet = UserCom.RST_OK;
                else
                    WinManager.ErrorMessage(LF_TmoneyErrorMsg(iResult));
            }            
            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>
        /// <param name="sTradeDiv"></param>
        /// <param name="sCardData"></param>
        /// <param name="sAmount"></param>
        /// <param name="sApprID"></param>
        /// <param name="sCardType"></param>
        /// <param name="sRcvRfData"></param>
        /// <returns></returns>
        private int LF_TMoneyApprovRe(string sTradeDiv, string sCardData, string sAmount, string sApprID, string sCardType, ref string sRcvRfData)
        {
            int iReTryCnt = 0; 
            int iResult = -1;

            string sMsg1 = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0356);
            string sMsg2 = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0357);
            string sMsg3 = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0358);

            try
            {
                iReTryCnt = 0;
            Re_TMoneyApprove_TMoneyApproveRe:
                // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sAmount, "", "", "", "", "", "TMoneyApproveRe" });

                // 지불재거래 
                iResult = m_cDeviceSignPad.TMoneyApproveRe(sApprID, sCardType, CmUtil.DoubleParse(sAmount).ToString(), sMsg1, sMsg2, sMsg3, ref sRcvRfData);

                // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sAmount, "", "", "", iResult.ToString(), "", sRcvRfData });
                if (iResult < 0)
                {
                    if (iReTryCnt > 1)
                    {
                        // 거래 중 오류가 발생하였습니다. 재시도 하시겠습니까?
                        string sErrMsg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0692) + "\n" + LF_TmoneyErrorMsg(iResult);

                        if (WinManager.QuestionMessage(sErrMsg) == true)
                        {
                            iReTryCnt = 0;
                            goto Re_TMoneyApprove_TMoneyApproveRe;
                        }
                        else
                        {
                            WinManager.ErrorMessage((sCardType == "T" ? POS_MESSAGE.ERROR.MSG_0694 : POS_MESSAGE.ERROR.MSG_0693));
                            return iResult;
                        }
                    }

                    // 3회 재시도
                    iReTryCnt++;
                    goto Re_TMoneyApprove_TMoneyApproveRe;
                }
            }
            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 iResult;
        }
        #endregion 

        #region 교통카드 잔액조회
        /// <summary>
        /// 교통카드 잔액조회
        /// </summary>
        /// <param name="sTradeDiv"></param>
        /// <param name="sCardData"></param>
        /// <param name="sAmount"></param>
        /// <param name="nBalanceAmt"></param>
        /// <returns></returns>
        private int LF_TMoneyCardInfo(string sTradeDiv, string sCardData, string sAmount, double nBalanceAmt, string sBeep, ref string sRcvData)
        { 
            string sCardNo = "";
            double nBalanceAmtCheck = 0;
            int iResult = -1; 

            try
            {
                // 거래후 잔액체크
                sRcvData = "";
                sCardNo = "";
                nBalanceAmtCheck = 0;

                // 요청 - 승인로그 저장   (판매구분, [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, sTradeDiv, "S", sCardData, sAmount, "", "", "", "", "", "TMoneyInfo" });
                //#20170919 T머니 잔액조회 호출시 첫번째 파라미터 값 변경. " " -> "0" start
                //기존
                //iResult = m_cDeviceSignPad.TMoneyInfo(" ", ref sRcvData, sBeep);
                //변경
                iResult = m_cDeviceSignPad.TMoneyInfo("0", ref sRcvData, sBeep);
                //#20170919 T머니 잔액조회 호출시 첫번째 파라미터 값 변경. " " -> "0" end
                // 응답 - 승인로그 저장   (판매구분, [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, sTradeDiv, "R", sCardData, sAmount, "", "", "", iResult.ToString(), "", sRcvData });

                if (iResult >= 0 && sRcvData.Length > 10)
                {
                    nBalanceAmtCheck = CmUtil.DoubleParse(CmUtil.MidH(sRcvData, 1, 10));
                    sCardNo = CmUtil.MidH(sRcvData, 11, 16);

                    if (sCardData.Trim() != sCardNo.Trim())
                    {
                        // 카드번호가 다릅니다.
                        WinManager.ErrorMessage(LF_TmoneyErrorMsg(-3001));
                        iResult = -3001;
                    }
                    else if (CmUtil.DoubleSubtraction(nBalanceAmt, CmUtil.DoubleParse(sAmount)) != nBalanceAmtCheck)
                    {
                        // 거래후 잔액이 이전조회시 잔액이 아닌경우 지불 재거래 요청
                        iResult = -2144;
                    }
                }
                else
                {
                    WinManager.ErrorMessage(LF_TmoneyErrorMsg(iResult));
                    return -1;
                }
            }
            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 iResult;
        }
        #endregion 

        #region 교통카드 오류 메시지 정의
        /// <summary>
        /// 교통카드 오류 메시지 정의
        /// </summary>
        /// <param name="iResCD"></param>
        /// <returns></returns>
        private string LF_TmoneyErrorMsg(int iResult)
        {
            string sMsg = "정의되지 않은 오류가 발생했습니다.";
            try
            {
                switch (iResult)
                {
                    case -81: sMsg = "싸인패드 포트 오류"; break;
                    case -82: sMsg = "싸인패드 포트 오류"; break;
                    case -83: sMsg = "싸인패드 통신 오류"; break;
                    case -84: sMsg = "싸인패드 사용자 취소"; break;
                    case -85: sMsg = "싸인패드 타임아웃 오류"; break;
                    case -86: sMsg = "싸인패드 오픈 오류"; break;
                    case -87: sMsg = "싸인패드 초기화 오류"; break;
                    case -88: sMsg = "싸인패드 요청 오류"; break;
                    case -89: sMsg = "싸인패드 통신 오류"; break;
                    case -200: sMsg = "지원하지 않는 응답코드"; break;
                    case -201: sMsg = "교통카드 개시거래 통신 거절"; break;
                    case -202: sMsg = "운영정보 다운로드 통신 거절"; break;
                    case -203: sMsg = "운영정보 다운로드 서버 응답 오류"; break;
                    case -204: sMsg = "티머니 운영정보 싸인패드 통신 거절"; break;
                    case -205: sMsg = "티머니 운영정보 싸인패드 통신 오류"; break;
                    case -206: sMsg = "운영정보 다운로드 결과 응답 거절"; break;
                    case -207: sMsg = "운영정보 다운로드 오류"; break;
                    case -208: sMsg = "후불교통카드 SAM 등록 오류"; break;
                    case -209: sMsg = "후불교통카드 SAM 재등록 오류"; break;
                    case -210: sMsg = "후불교통카드 SAM 등록 카드타입 오류"; break;
                    case -211: sMsg = "후불교통카드 SAM 재등록 거절"; break;
                    case -212: sMsg = "후불교통카드 SAM 등록 거절"; break;
                    case -213: sMsg = "후불교통카드 SAM 등록 거절"; break;
                    case -214: sMsg = "후불결제거래 응답 오류(STX)"; break;
                    case -215: sMsg = "후불결제거래 응답 오류(ETX)"; break;
                    case -216: sMsg = "선불결제거래 서버 오류 (선불카드 차감됨)"; break;
                    case -217: sMsg = "선불결제거래 서버 거절 (선불카드 차감됨)"; break;
                    case -218: sMsg = "선불결제취소거래 서버 오류 (선불카드 증액됨)"; break;
                    case -219: sMsg = "선불결제취소거래 서버 거절 (선불카드 증액됨)"; break;
                    case -220: sMsg = "T머니 반품충전 오류 (시작 서버 통신 오류)"; break;
                    case -221: sMsg = "T머니 반품충전 오류 (시작 서버 통신 거절)"; break;
                    case -222: sMsg = "T머니 반품충전 오류 (시작 서버 통신 에러)"; break;
                    case -223: sMsg = "T머니 반품충전 오류 (완료 서버 통신 에러)"; break;
                    case -224: sMsg = "T머니 반품충전 오류 (완료 서버 거절, 올림 성공)"; break;
                    case -225: sMsg = "T머니 반품충전 오류 (완료 서버 거절, 올림 실패)"; break;
                    case -226: sMsg = "지원하지 않는 거래"; break;
                    case -227: sMsg = "카드구분 오류"; break;
                    case -2140: sMsg = "RC_APDU_ERROR IC카드 APDU 응답 오류"; break;
                    case -2141: sMsg = "RC_INVALID_CONDITION 거래 조건이 맞지 않음"; break;
                    case -2144: sMsg = "RC_REQ_REPURCHASE 재거래 요청"; break;
                    case -2145: sMsg = "RC_REQ_RECOVERY 취소(오류복구) 요청"; break;
                    case -2148: sMsg = "RC_INVALID_CA_KEY CA KEY 오류"; break;
                    case -2149: sMsg = "RC_INVALID_PARAM 명령/파라메터 오류"; break;
                    case -2150: sMsg = "RC_INVALID_CARD 지원하지 않는 카드"; break;
                    case -2153: sMsg = "RC_SAMBAL_ERROR SAM 잔액 부족 오류"; break;
                    case -2154: sMsg = "RC_BAL_ERROR 잔액 부족 오류"; break;
                    case -2155: sMsg = "RC_ CARD_ERROR 카드 인식 오류"; break;
                    case -2156: sMsg = "RC_NOEXIST_LOG 마지막 거래내역 없음"; break;
                    case -2157: sMsg = "RC_SAM_ERROR SAM카드 응답 오류"; break;
                    case -2158: sMsg = "RC_CARD_NOTLOG 거래내역 조회 에러"; break;
                    case -2159: sMsg = "RC_CARD_NOTCOMMAND 처리불가 기능"; break;
                    case -2192: sMsg = "RC_REGIST_TMK_ERR TMK 처리 에러"; break;
                    case -2193: sMsg = "RC_TMKVER_DIFF TMK 버전 오류(개시 거래 요청)"; break;
                    case -2195: sMsg = "RC_CASH_INVALID_PIN 비밀번호 오류"; break;
                    case -2196: sMsg = "RC_PIN_BLOCK 비밀번호 잠김"; break;
                    case -2198: sMsg = "RC_CASH_ACCOUNT_ERROR 계좌정보 오류"; break;
                    case -2204: sMsg = "RC_REVERSAL 망 취소(호스트 승인 후 카드 거절)"; break;
                    case -2205: sMsg = "RC_CANCEL 단말기나 POS가 취소 시"; break;
                    case -2206: sMsg = "RC_DECLINE 카드 거래 거절"; break;
                    case -2207: sMsg = "RC_FALLBACK IC EMV 거래 FALLBACK"; break;
                    case -2238: sMsg = "RC_OTHER_CARD 다른 Application 카드"; break;
                    case -2242: sMsg = "RC_NO_CARD 카드가 존재하지 않음"; break;
                    case -2243: sMsg = "RC_MORE_CARD 여러장의 카드가 입력됨"; break;
                    case -2245: sMsg = "RC_NOT_ACCEPT 지원되지 않는 카드"; break;
                    case -2246: sMsg = "RC_NO_SAM 동글에 SAM 없음"; break;
                    case -2247: sMsg = "RC_PAYONSAM_AUTH_ERROR PayON SAM등록 오류<Payon 서비break;스>";break;
                    case -2248: sMsg = "RC_INVALID_DATA 요청 Message의 DATA 오류"; break;
                    case -2249: sMsg = "RC_PAYONSAM_DIFF_ERROR 등록된 PayON SAM과 서로 상이 <Payon 서비스>"; break;
                    case -2250: sMsg = "RC_IDTR 사용 불가 카드 (캐시비 적용에 따라 추가 됨)"; break;
                    case -2251: sMsg = "EMV IC 오류 코드 Fallback 메시지 전달 응답 코드"; break;
                    case -2255: sMsg = "RC_FAILURE 실패"; break;
                    case -3001: sMsg = "카드번호가 틀립니다. 원거래 카드를 놓아주십시오"; break;
                }
            }
            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 sMsg;
        }
        #endregion 
    }
}
