//#20180329 프린터 간헐적 미출력 증상 수정 start
//출력 할때 마다 open, close 하는 부분 한번만 하도록 수정
//#define PRT_OPENCLOSE   //적용시 주석 해제
//#20180329 프린터 간헐적 미출력 증상 수정 end

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Data;

using Cosmos.BaseFrame;
using Cosmos.UserFrame;
using Cosmos.ServiceProvider;
using Cosmos.Common;
using Cosmos.CommonManager;
using System.Windows.Forms;

using Newtonsoft.Json;

namespace Cosmos.Win
{
    /// <summary>
    /// 판매화면(상품등록) 모듈 클래스
    /// </summary>
    public class SaleMainProcess
    {
        private SManager sManager = new SManager();                                 // 이 객체를 통해 업무 Service 호출
        private StateServer StateObject = (StateServer)StateServer.GetInstance();   // StateObject : StateServer Object (객체)
        private PosStatus m_cPosStatus = new PosStatus();                           // 기본정보 참조
        private TranStatus m_cTrnStatus = new TranStatus();                         // 거래정보 참조
        private DeviceStatus m_cDevStatus = new DeviceStatus();                     // 장치정보 참조 

        private IDatabaseSQL m_cSqlDbService = null;                                // 데이터베이스 관리
        private IDataProcessUs m_cDataService = null;                               // 거래데이터 합계금액 계산 및 관리
        private ISalePluItemUs m_cPluService = null;                                // 판매 등록 관리
        private IMasterUs m_cMstService = null;                                     // 마스터 인터페이스
        private ICustDisplayUs m_cCustDisplay = null;                               // 고객디스플레이 관리
        private IDataCommonUs m_cDataCommon = null;                                 // POS 공통함수 인터페이스
        private ISaleCompleteUs m_cSaleComplete = null;                             // 거래 완료처리
        private IMasterUs m_cMstPayDcService = null;                                // 결제,할인 마스터
        private ITableUs m_cTableSvr = null;                                        // 테이블 서비스 관리
        private IServiceUs m_cOrderSheetSvr = null;                                 // 주방 주문서 

        private INetworkHttp m_cNetworkHttp = null;

        //#20171227 인천공항 포스연동 start, phj
        private IAirPortTran m_cAirPortTran = null;
        //#20171227 인천공항 포스연동 end, phj

        /// <summary>
        /// 세트상품 그룹 마스터
        /// </summary>
        public DataTable m_dtSetMenuGroup = new DataTable();
        /// <summary>
        ///  세트상품 상세 마스터
        /// </summary>
        public DataTable m_dtSetMenuDetail = new DataTable();

        ///// <summary>
        ///// 강제 부가메뉴 그룹 마스터
        ///// </summary>
        //public DataTable m_dtForceSubMenuGroup = new DataTable();                        
        ///// <summary>
        ///// 강제 부가메뉴 상세 마스터
        ///// </summary>
        //public DataTable m_dtForceSubMenuDetail = new DataTable();       

        private ICashdrawerUs m_cCashDrawer = null;//170811 dkshin 돈통 열리는 시점 변경(현금영수증 전)

        /// <summary>
        /// 생성자
        /// </summary>
        public SaleMainProcess()
        {
            m_cPosStatus = (PosStatus)StateObject.POS;
            m_cTrnStatus = (TranStatus)StateObject.TRAN;
            m_cDevStatus = (DeviceStatus)StateObject.DEVICE;

            m_cSqlDbService = (IDatabaseSQL)sManager.InitServiceInstance(ServiceLists.AGENT_DATABASE.DLL, ServiceLists.AGENT_DATABASE.DATABASE_MSSQL);
            m_cDataService = (IDataProcessUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_SERVICE);
            m_cPluService = (ISalePluItemUs)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.SALE_PLU_ITEM);
            m_cMstService = (IMasterUs)sManager.InitServiceInstance(ServiceLists.ASV_MASTER.DLL, ServiceLists.ASV_MASTER.POS_MASTER);
            m_cCustDisplay = (ICustDisplayUs)sManager.InitServiceInstance(ServiceLists.ASV_CUSTDISPLAY.DLL, ServiceLists.ASV_CUSTDISPLAY.CUST_DISPLAY);
            m_cDataCommon = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON);
            m_cSaleComplete = (ISaleCompleteUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.SALE_COMPLETE);
            m_cMstPayDcService = (IMasterUs)sManager.InitServiceInstance(ServiceLists.ASV_MASTER.DLL, ServiceLists.ASV_MASTER.PAY_DC_MASTER);
            m_cTableSvr = (ITableUs)sManager.InitServiceInstance(ServiceLists.BSV_TABLE.DLL, ServiceLists.BSV_TABLE.TABLE_SERVICE);
            m_cOrderSheetSvr = (IServiceUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.POS_RECEIPT_ORDERSHEET);
            m_cCashDrawer = (ICashdrawerUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_CASHDRAWER);

            //#20171227 인천공항 포스연동 start, phj            
            m_cAirPortTran = (IAirPortTran)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.AIRPORT_TRAN);
            //#20171227 인천공항 포스연동 end, phj

            m_cNetworkHttp = (INetworkHttp)sManager.InitServiceInstance(ServiceLists.AGENT_NETWORK.DLL, ServiceLists.AGENT_NETWORK.NETWORK_HTTP);
        }

        /// <summary>
        /// 판매 기능키 처리
        /// </summary>
        /// <param name="sMenuKey">기능키</param>
        /// <param name="sInPutData">입력데이터</param>
        /// <param name="sSelRow">선택그리드행</param>
        /// <param name="sEtcData">기타</param>
        /// <returns></returns>
        //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 start
        //기존
        //public bool ExecuteSaleMainProcess(string sMenuKey, string sInPutData, string sSelRow, string sEtcData)
        //변경
        public bool ExecuteSaleMainProcess(string sMenuKey, string sInPutData, string sSelRow, string sEtcData, bool sMenuKeyAuth = false)
        //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 end
        {
            bool bRet = false;
            try
            {
                m_cPosStatus.Sale.ScreenSaverTime = "";    //화면보호기 대기시간 설정

                //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 start
                //기존
                //if (WinBasic.CheckMenuKeyAuth(sMenuKey) == false) return false;      // 기능키 판매원 권한 체크
                //변경

                if (sMenuKeyAuth == false)
                {
                    if (WinBasic.CheckMenuKeyAuth(sMenuKey) == false) return false;      // 기능키 판매원 권한 체크
                }

                //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 end

                //string sMngAuth = PosMstManager.GetMstPicAuth(m_cPosStatus.Base.CashierNo + sMenuKey);

                //switch (sMngAuth)
                //{
                //    case PosConst.MNG_AUTH_DIV.NON_PERMISSION:
                //        WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0308), MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0505), false);
                //        return false;
                //    case PosConst.MNG_AUTH_DIV.PERMISSION:
                //        break;
                //    case PosConst.MNG_AUTH_DIV.SUPERVISOR:
                //        if (WinBasic.ShowForm(new string[] { FormManager.FORM_LOG_ON, PosKey.MENU_KEY.REGISTER_ADMIN }) == UserCom.RST_ERR) return false;
                //        //string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_CASHIER_INPUT, "Supervisor" });
                //        //if (sRet != UserCom.RST_OK)
                //        //{
                //        //    return false;
                //        //}
                //        break;
                //}

                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_WAIT)            // 판매대기 모드
                {
                    if (WaitSaleDataCheck(sMenuKey) == false)
                        return false;

                    switch (sMenuKey)
                    {
                        case PosKey.MENU_KEY.REGISTER_PLU_ITEM:         // 상품등록
                            bRet = RegisterPluItem(sSelRow, sEtcData, sInPutData);
                            break;
                        case PosKey.MENU_KEY.GIFT_SALE:
                        case PosKey.MENU_KEY.PREPAID_CARD:
                            RegisterSellGift(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.RETURN_ITEM:
                            RegisterReturnItem();
                            break;
                        case PosKey.MENU_KEY.TRADE_STOP:                //거래중지
                            bRet = TradeStop();
                            break;
                        case PosKey.MENU_KEY.SALE_LOSS:                 //판매로스
                            bRet = RegSaleLosss(sSelRow);
                            break;
                        case PosKey.MENU_KEY.ORDER_COMPLETED:           //주문완료
                            bRet = OrderCompleted();
                            break;
                        case PosKey.MENU_KEY.SEARCH:                    //상품 조회
                            bRet = ItemSearch();
                            break;
                        case PosKey.MENU_KEY.HOLD_DEAL:                 //보류
                            bRet = HoldDeal();
                            break;
                        case PosKey.MENU_KEY.CASH_APPROVAL_LATER:       //사후 현금영수증
                            {
                                PayCashbill(sMenuKey);
                                break;
                            }
                        case PosKey.MENU_KEY.LAST_DEAL_PRINT:           //직전영수증 출력
                            bRet = LastDealPrint();
                            break;
                        case PosKey.MENU_KEY.RESERVATIONS_REGISTER:     //예약등록
                            {
                                RegSaleReservations();
                                break;
                            }
                        case PosKey.MENU_KEY.RESERVATION_COMPLETED:     //예약완료
                            {
                                RegSaleReservedFinish();
                                break;
                            }
                        case PosKey.MENU_KEY.RECEIPT_REPRINT:           //영수증 재발행
                            {
                                SaleReReceiptRePrint();
                                break;
                            }
                        case PosKey.MENU_KEY.HP_GIFT_CHARGED:           //해피 기프트 충전
                            {
                                PayHappyGift(PosKey.MENU_KEY.HP_GIFT_CHARGED);
                                break;
                            }
                        case PosKey.MENU_KEY.RETURN_RECEIPT:            //영수증 반품
                            SaleRefundReceipt();
                            break;
                        case PosKey.MENU_KEY.HPP_APPROVAL_LATER:        // 추후적립
                            HappyPointAfterSave();
                            break;
                        case PosKey.MENU_KEY.HAPPY_ORDERS:              // 해피오더
                            HappyOrder();
                            break;
                        case PosKey.MENU_KEY.HP_REGULAR_CUST:           // 단골매장등록
                            HappyPointRegularCust();
                            break;
                        case PosKey.MENU_KEY.EXCHANGE:                  // 환전
                            OpenManualCashdrawer();
                            break;
                        case PosKey.MENU_KEY.HAPPY_BUZ_SEARCH:          // 해피버즈 현황 조회
                            HappyBuzzSearch();
                            break;
                        case PosKey.MENU_KEY.CHECK_SEARCH:              // 수표조회
                            PayCheck(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.GIFT_CARD_SCH:             // 상품권조회
                            PayGiftSearch(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.MOBILE_COUPON_SCH:         // 모바일쿠폰조회
                            PayMobileCouponSearch(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.ONLINE_COUPONS_SCH:	    // 온라인쿠폰조회(중국)
                            PayOnLineCoupon(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.BRITHDAY_CANDLE:	        // 생일초계산
                            BrithDayCandle(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.ORDER_EXIT:                // 주문종료
                            bRet = OrderCancelExit();
                            break;
                        case PosKey.MENU_KEY.EDIT_CUST_CNT:             // 고객수 수정
                            bRet = EditCustCnt();
                            break;
                        //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 start
                        //기존
                        /*
                        //17.05.18 dkshin 쇼킹박스 추가
                        case PosKey.MENU_KEY.SHOCKING_BOX:             // 쇼킹박스 상품 불러오기
                            bRet = ShockingBox(sEtcData);
                            break;
                        */

                        //변경
                        case PosKey.MENU_KEY.SHOCKING_BOX:
                        case PosKey.MENU_KEY.ITEMINFO_PRINT:
                            bRet = ShockingBox(sMenuKey, sEtcData);
                            break;
                        //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 end
                        //20171013 dkshin 해피기프트(신) IC/RF 충전 및 승인
                        case PosKey.MENU_KEY.HAPPY_GIFTCARD_CHARGE:    // 해피기프트(신) 충전
                            //HappyGiftCardRecharge(sMenuKey);
                            HappyGiftNewRecharge(sMenuKey);
                            break;
                        // 지움 버튼 클릭 시 오류POP-UP 수정(2017.07.10)
                        case PosKey.MENU_KEY.CLEAR:                     // 지움
                        // 키보드 화살표 키 클릭 시 오류POP-UP 수정(2017.07.14)
                        case PosKey.MENU_KEY.SCANKEY_UP_ARROW:
                        case PosKey.MENU_KEY.SCANKEY_DOWN_ARROW:
                            bRet = true;
                            break;
                        //#20171227, 예약증 양식 출력 Start
                        case PosKey.MENU_KEY.RESERVATION_FORM_PRINT:    // 예약증 양식 출력
                            bRet = ReservationFormPrint();
                            break;
                        //#20171227, 예약증 양식 출력 End

                        //#14341 PB서대문행복-판매화면 [관리]-조회에서 교통카드 조회 기능 사용불가 start
                        case PosKey.MENU_KEY.TMONEY_SEARCH:         //교통카드 잔액조회
                            PayTMoneyCashBee(new string[] { FormManager.FORM_PAY_TMONEY, PosKey.MENU_KEY.T_MONEY, "", "S" });
                            break;
                        //#14341 PB서대문행복-판매화면 [관리]-조회에서 교통카드 조회 기능 사용불가 end

                        //#20180413 웰컴카드 신규기능 추가 start,phj
                        case PosKey.MENU_KEY.WELCOMECARD_ISSUE:                // 웰컴카드 발급화면
                            bRet = WelcomeCard_Issue(sMenuKey, "1");
                            break;

                        case PosKey.MENU_KEY.WELCOMECARD_HPAPP_REGISTER:       // 해피앱 고객등록
                            bRet = WelcomeCard_Issue(sMenuKey, "1");
                            break;
                        //#20180413 웰컴카드 신규기능 추가 end,phj

                        //*********************************************************************
                        // (2017.11.01) 해피포인트 제휴할인 선리딩 처리를 위한 기능키 클릭 처리
                        //---------------------------------------------------------------------
                        // - 만약 해피포인트 및 제휴할인 카드가 등록되어 있을 경우
                        //   등록된 역순으로 취소 처리한다.
                        //*********************************************************************
                        #region 해피포인트 제휴할인 선리딩 처리를 위한 기능키 클릭 처리
                        case PosKey.MENU_KEY.COOPERATION_CARD_CANCEL:
                            //*** MoonSeokWoo 2017.12.12 Add
                            //폼 획득
                            frmSaleMain fSalMain = (frmSaleMain)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                            //*** MoonSeokWoo 2017.12.12 End

                            // 만약 해피포인트 카드 번호 및 제휴할인 카드 번호가 존재할 경우 -----
                            if (m_cPosStatus.Sale.strHappyPointCardNo != "" || m_cPosStatus.Sale.strMobileUnityCardNo != "")
                            {
                                if (m_cPosStatus.Sale.strPriorReading_Title[1] != null && m_cPosStatus.Sale.strPriorReading_Title[1] != "")
                                {
                                    // 만약 리딩 타이틀 배열 변수에 1번째 리딩 항목이 존재할 경우 -----
                                    if (m_cPosStatus.Sale.strPriorReading_Title[1] == "HPC")
                                    {
                                        // 해피포인트 카드 변수 클리어 -----
                                        m_cPosStatus.Sale.strHappyPointCardNo = "";

                                        //#15169 임직원 해피App 바코드리딩 시 자동할인적용 개선요청 start
                                        m_cPosStatus.Sale.strEmpInfo = "";
                                        //#15169 임직원 해피App 바코드리딩 시 자동할인적용 개선요청 end
                                    }
                                    else { m_cPosStatus.Sale.strMobileUnityCardNo = ""; }

                                    fSalMain.AllianceCardInit(false
                                        , m_cPosStatus.Sale.strPriorReading_Title[1] == "HPC" ? MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0789) : m_cPosStatus.Sale.strPriorReading_Title[1]
                                        , m_cPosStatus.Sale.strPriorReading_Title[1] == "HPC" ? true : false);
                                    m_cPosStatus.Sale.strPriorReading_Title[1] = "";
                                }
                                else if (m_cPosStatus.Sale.strPriorReading_Title[0] != null && m_cPosStatus.Sale.strPriorReading_Title[0] != "")
                                {
                                    // 만약 리딩 타이틀 배열 변수에 0번째 리딩 항목이 존재할 경우 -----
                                    if (m_cPosStatus.Sale.strPriorReading_Title[0] == "HPC")
                                    {
                                        // 해피포인트 카드 변수 클리어 -----
                                        m_cPosStatus.Sale.strHappyPointCardNo = "";

                                        //#15169 임직원 해피App 바코드리딩 시 자동할인적용 개선요청 start
                                        m_cPosStatus.Sale.strEmpInfo = "";
                                        //#15169 임직원 해피App 바코드리딩 시 자동할인적용 개선요청 end
                                    }
                                    else { m_cPosStatus.Sale.strMobileUnityCardNo = ""; }
                                    fSalMain.AllianceCardInit(false
                                        , m_cPosStatus.Sale.strPriorReading_Title[0] == "HPC" ? MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0789) : m_cPosStatus.Sale.strPriorReading_Title[0]
                                        , m_cPosStatus.Sale.strPriorReading_Title[0] == "HPC" ? true : false);

                                    m_cPosStatus.Sale.strPriorReading_Title[0] = "";
                                }
                            }

                            break;
                        #endregion
                        default:
                            //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 start
                            //기존
                            /*
                            if (WinSale.ExecuteBinessRun(sMenuKey) == UserCom.RST_IGNORE)
                            {
                                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0020);    // 판매 대기중에 처리 할수 없는 기능 입니다.
                            }
                            */
                            //변경

                            if (WinSale.ExecuteBinessRun(sMenuKey, sMenuKeyAuth) == UserCom.RST_IGNORE)
                            {
                                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0020);    // 판매 대기중에 처리 할수 없는 기능 입니다.
                            }

                            //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 end
                            break;
                    }
                }
                else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING)       // 상품등록 중 모드
                {
                    //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 start
                    if (m_cTrnStatus.Head.ShockingBoxStat == "1" && m_cTrnStatus.Head.ShockingBoxTradeKind == ItemConst.TRAN_KIND.HPO_LOG.LANDOM_BOX
                        && sMenuKey != PosKey.MENU_KEY.TRADE_STOP)
                    {
                        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0054));
                        return bRet;
                    }
                    //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 end

                    switch (sMenuKey)
                    {
                        case PosKey.MENU_KEY.REGISTER_PLU_ITEM:         // 상품등록
                            bRet = RegisterPluItem(sSelRow, sEtcData, sInPutData);
                            break;
                        case PosKey.MENU_KEY.CANCEL_ITEM:               // 지정취소
                            bRet = CancelPluItem(sSelRow);
                            break;
                        case PosKey.MENU_KEY.QUANTITY:                  // 수량변경
                        case PosKey.MENU_KEY.QTY_PLUS:
                        case PosKey.MENU_KEY.QTY_MINUS:
                            bRet = QtyChangePluItem(sMenuKey, sSelRow, sInPutData);
                            break;
                        case PosKey.MENU_KEY.ADD_MENU:                  // 부가메뉴
                            bRet = RegisterChoiceSubMenu(sSelRow);
                            break;
                        case PosKey.MENU_KEY.FLAVOR:                    // 플레이버
                            bRet = RegisterFlavourMenu("");
                            break;
                        case PosKey.MENU_KEY.PAYMENTS:                  // 결제
                            bRet = RegisterPayment("", "");
                            break;
                        case PosKey.MENU_KEY.CASH:                      // 현금
                        case PosKey.MENU_KEY.CREDIT_CARD:               // 신용카드
                        case PosKey.MENU_KEY.WECHATPAY:	                //위챗페이
                        case PosKey.MENU_KEY.WECHATPAY_BAIRONG:	        //샤오청쉬 위챗페이-바이롱;girak.kim;2017.09.11.001                            
                        case PosKey.MENU_KEY.XIAOCHENGXU_GIFTCARD:      //샤오청쉬 기프트카드;girak.kim;2017.09.11.001                            
                            bRet = RegisterPayment(sMenuKey, sInPutData);
                            break;
                        case PosKey.MENU_KEY.ITEM_DC_AMT:               //단품 금액 할인
                        case PosKey.MENU_KEY.ITEM_DC_RATE:              //단품 율   할인
                        case PosKey.MENU_KEY.FREE_DC:                   //서비스(무료)
                        case PosKey.MENU_KEY.ELOVE_DC:                  //환경사랑DC
                        case PosKey.MENU_KEY.ITEM_CHAGE_CPN:            //제품교환권
                        case PosKey.MENU_KEY.IN_EMP_DC:                 //입점매장직원할인(단품)
                            bRet = RegisterItemDc(sMenuKey, sSelRow, sInPutData);
                            break;
                        case PosKey.MENU_KEY.TRADE_STOP:                //거래중지
                            bRet = TradeStop();
                            break;
                        case PosKey.MENU_KEY.NOTAX:                     //NO TAX
                            bRet = ItemNoTax(sSelRow);
                            break;
                        //#Rhee, 20180212 ALL NO TAX 기능 추가 Start
                        case PosKey.MENU_KEY.ALL_NOTAX:                 //ALL NO TAX
                            bRet = ItemAllNoTax();
                            break;
                        //#Rhee, 20180212 ALL NO TAX 기능 추가 End
                        case PosKey.MENU_KEY.ORDER_COMPLETED:           //주문완료
                            bRet = OrderCompleted();
                            break;
                        case PosKey.MENU_KEY.ITEM_MEMO:                 //상품메모
                            bRet = ItemMmeo(false);
                            break;
                        case PosKey.MENU_KEY.SEARCH:                    //상품 조회
                            bRet = ItemSearch();
                            break;
                        case PosKey.MENU_KEY.HOLD_DEAL:                 //보류
                            bRet = HoldDeal();
                            break;
                        case PosKey.MENU_KEY.TAKE_IN_OUT:               //TAKE_IN_OUT
                            bRet = SetTakeInOut();
                            break;
                        case PosKey.MENU_KEY.BUNDLE_ITEM:               //묶음상품/쇼킹박스
                            bRet = BundleiTem(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.DUTCH_PAY:                 //더치페이
                            bRet = DutchPay(sMenuKey, "0");
                            break;
                        case PosKey.MENU_KEY.DUTCH_PAY_AMT:             //더치페이(금액)
                            bRet = DutchPayAmt(sMenuKey, "0");
                            break;
                        case PosKey.MENU_KEY.SET_MENU_CHANGE:           // 세트메뉴 상품 변경
                            bRet = SetMenuItemChange(sSelRow);
                            break;
                        case PosKey.MENU_KEY.FIRE_KEY:                  // FIRE KEY
                            bRet = ItemMmeo(true);
                            break;
                        case PosKey.MENU_KEY.EXCHANGE:                  // 환전
                            OpenManualCashdrawer();
                            break;
                        case PosKey.MENU_KEY.HAPPY_BUZ_SEARCH:          // 해피버즈 현황 조회
                            HappyBuzzSearch();
                            break;
                        case PosKey.MENU_KEY.CHECK_SEARCH:              // 수표조회
                            PayCheck(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.GIFT_CARD_SCH:             // 상품권조회
                            PayGiftSearch(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.MOBILE_COUPON_SCH:         // 모바일쿠폰조회
                            PayMobileCouponSearch(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.ONLINE_COUPONS_SCH:	    //온라인쿠폰조회(중국)
                            PayOnLineCoupon(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.ORDER_PRINT:               // 주문내역서 출력
                            bRet = OrderBillPrint();
                            break;
                        case PosKey.MENU_KEY.CUSTOMER_CLAIMS_LIST:      // 고객 불만 등록
                        case PosKey.MENU_KEY.REG_PVC:                   // PVC상자재고
                        case PosKey.MENU_KEY.POS_ETC_RECEIPT:           // 간이영수증
                        case PosKey.MENU_KEY.RECEIPT_REPRINT:           // 영수증 재발행
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0021);    // 상품 등록중에 처리 할수 없는 기능 입니다
                            break;
                        case PosKey.MENU_KEY.BRITHDAY_CANDLE:	        // 생일초계산
                            BrithDayCandle(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.ORDER_EXIT:                // 주문종료
                            bRet = OrderCancelExit();
                            break;
                        case PosKey.MENU_KEY.MULTI_DCITEM:             // 선택 아이템 할인
                            MultiItemDc(sMenuKey);
                            break;
                        case PosKey.MENU_KEY.EDIT_CUST_CNT:             // 고객수 수정
                            bRet = EditCustCnt();
                            break;
                        case PosKey.MENU_KEY.SALE_LOSS:                 //판매로스
                            bRet = RegSaleLosss(sSelRow);
                            break;
                        //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 start
                        //기존
                        /*
                        //17.05.18 dkshin 쇼킹박스 추가
                        case PosKey.MENU_KEY.SHOCKING_BOX:
                            bRet = ShockingBox(sEtcData);
                            break;
                        */

                        //변경
                        case PosKey.MENU_KEY.SHOCKING_BOX:
                        case PosKey.MENU_KEY.ITEMINFO_PRINT:
                            bRet = ShockingBox(sMenuKey, sEtcData);
                            break;
                        //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 end

                        // 지움 버튼 클릭 시 오류POP-UP 수정(2017.07.10)
                        case PosKey.MENU_KEY.CLEAR:                     // 지움
                        // 화살표 키 클릭 시 오류POP-UP 수정(2017.07.14)
                        case PosKey.MENU_KEY.SCANKEY_UP_ARROW:
                        case PosKey.MENU_KEY.SCANKEY_DOWN_ARROW:
                            bRet = true;
                            break;
                        //#20171227, 예약증 양식 출력 Start
                        case PosKey.MENU_KEY.RESERVATION_FORM_PRINT:    // 예약증 양식 출력
                            bRet = ReservationFormPrint();
                            break;
                        //#20171227, 예약증 양식 출력 End

                        //#14341 PB서대문행복-판매화면 [관리]-조회에서 교통카드 조회 기능 사용불가 start
                        case PosKey.MENU_KEY.TMONEY_SEARCH:         //교통카드 잔액조회
                            PayTMoneyCashBee(new string[] { FormManager.FORM_PAY_TMONEY, PosKey.MENU_KEY.T_MONEY, "", "S" });
                            break;
                        //#14341 PB서대문행복-판매화면 [관리]-조회에서 교통카드 조회 기능 사용불가 end

                        //#20180413 웰컴카드 신규기능 추가 start,phj
                        case PosKey.MENU_KEY.WELCOMECARD_ISSUE:                // 웰컴카드 발급
                            bRet = WelcomeCard_Issue(sMenuKey, "1");
                            break;

                        case PosKey.MENU_KEY.WELCOMECARD_HPAPP_REGISTER:       // 웰컴카드 해피앱 고객등록
                            bRet = WelcomeCard_Issue(sMenuKey, "1");
                            break;
                        //#20180413 웰컴카드 신규기능 추가 end,phj

                        //*********************************************************************
                        // (2017.11.01) 해피포인트 제휴할인 선리딩 처리를 위한 기능키 클릭 처리
                        //---------------------------------------------------------------------
                        // - 만약 해피포인트 및 제휴할인 카드가 등록되어 있을 경우
                        //   등록된 역순으로 취소 처리한다.
                        //*********************************************************************
                        #region 해피포인트 제휴할인 선리딩 처리를 위한 기능키 클릭 처리
                        case PosKey.MENU_KEY.COOPERATION_CARD_CANCEL:

                            // 만약 해피포인트 카드 번호 및 제휴할인 카드 번호가 존재할 경우 -----
                            if (m_cPosStatus.Sale.strHappyPointCardNo != "" || m_cPosStatus.Sale.strMobileUnityCardNo != "")
                            {
                                if (m_cPosStatus.Sale.strPriorReading_Title[1] != null && m_cPosStatus.Sale.strPriorReading_Title[1] != "")
                                {
                                    // 만약 리딩 타이틀 배열 변수에 1번째 리딩 항목이 존재할 경우 -----
                                    if (m_cPosStatus.Sale.strPriorReading_Title[1] == "HPC")
                                    {
                                        // 해피포인트 카드 변수 클리어 -----
                                        m_cPosStatus.Sale.strHappyPointCardNo = "";

                                        //#15169 임직원 해피App 바코드리딩 시 자동할인적용 개선요청 start
                                        m_cPosStatus.Sale.strEmpInfo = "";
                                        //#15169 임직원 해피App 바코드리딩 시 자동할인적용 개선요청 end
                                    }
                                    else { m_cPosStatus.Sale.strMobileUnityCardNo = ""; }
                                    m_cPosStatus.Sale.strPriorReading_Title[1] = "";
                                }
                                else if (m_cPosStatus.Sale.strPriorReading_Title[0] != null && m_cPosStatus.Sale.strPriorReading_Title[0] != "")
                                {
                                    // 만약 리딩 타이틀 배열 변수에 0번째 리딩 항목이 존재할 경우 -----
                                    if (m_cPosStatus.Sale.strPriorReading_Title[0] == "HPC")
                                    {
                                        // 해피포인트 카드 변수 클리어 -----
                                        m_cPosStatus.Sale.strHappyPointCardNo = "";

                                        //#15169 임직원 해피App 바코드리딩 시 자동할인적용 개선요청 start
                                        m_cPosStatus.Sale.strEmpInfo = "";
                                        //#15169 임직원 해피App 바코드리딩 시 자동할인적용 개선요청 end
                                    }
                                    else { m_cPosStatus.Sale.strMobileUnityCardNo = ""; }
                                    m_cPosStatus.Sale.strPriorReading_Title[0] = "";
                                }
                            }

                            break;
                        #endregion
                            //#Rhee, 20180130 단품 할인 전체 취소 추가 Start
                            case PosKey.MENU_KEY.DISCOUNT_CANCEL:               //단품 금액 할인 전체 취소
                            bRet = RegisterItemDcCancel(sMenuKey, ItemConst.PLU_DC_DIV.POS_DC, ItemConst.PLU_DC_TYPE.DC_ITEM);
                            break;
                            //#Rhee, 20180130 단품 할인 전체 취소 추가 End
                        default:
                            //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 start
                            //기존
                            /*
                            if (WinSale.ExecuteBinessRun(sMenuKey) == UserCom.RST_IGNORE)
                            {
                                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0021);    // 상품 등록중에 처리 할수 없는 기능 입니다
                            }
                            */
                            //변경

                            if (WinSale.ExecuteBinessRun(sMenuKey, sMenuKeyAuth) == UserCom.RST_IGNORE)
                            {
                                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0021);    // 상품 등록중에 처리 할수 없는 기능 입니다
                            }

                            //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 end
                            break;
                    }
                }
                else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_SET)       // 세트메뉴 등록 중 모드
                {
                    switch (sMenuKey)
                    {
                        case PosKey.MENU_KEY.REGISTER_PLU_ITEM:         // 상품등록
                            bRet = RegisterPluItem(sSelRow, sEtcData, sInPutData);
                            break;
                        case PosKey.MENU_KEY.EXCHANGE:                  // 환전
                            OpenManualCashdrawer();
                            break;
                        case PosKey.MENU_KEY.TRADE_STOP:                // 거래중지
                            bRet = TradeStop();
                            break;
                        case PosKey.MENU_KEY.ORDER_EXIT:                // 주문종료
                            bRet = OrderCancelExit();
                            break;
                        // 지움 버튼 클릭 시 오류POP-UP 수정(2017.07.10)
                        case PosKey.MENU_KEY.CLEAR:                     // 지움
                            bRet = true;
                            break;
                        default:
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0023);    // 세트메뉴 등록중에 처리 할수 없는 기능 입니다
                            //if (WinSale.ExecuteBinessRun(sMenuKey) == UserCom.RST_IGNORE)
                            //{
                            //    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0023);    // 세트메뉴 등록중에 처리 할수 없는 기능 입니다
                            //}
                            break;
                    }
                }
                else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_OPT || m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_SET_OPT)       // 부가메뉴 등록 중 모드
                {
                    switch (sMenuKey)
                    {
                        //#2017122 #13238 LG 은평_은평_부가메뉴 입력 안되는 증상 start, phj
                        //기존
                        /*
                        #if false               //grayber@20171213 부가메뉴 등록중 일때 동작 개선 start
                        //case PosKey.MENU_KEY.REGISTER_PLU_ITEM:         // 상품등록
                        //    bRet = RegisterPluItem(sSelRow, sEtcData, sInPutData);
                        //    break;
                        #endif                  //grayber@20171213 부가메뉴 등록중 일때 동작 개선 end
                        */
                        //변경
                        case PosKey.MENU_KEY.REGISTER_PLU_ITEM:         // 상품등록
                            bRet = RegisterPluItem(sSelRow, sEtcData, sInPutData);
                            break;
                        //#2017122 #13238 LG 은평_은평_부가메뉴 입력 안되는 증상 end, phj

                        case PosKey.MENU_KEY.CANCEL_ITEM:               // 지정취소
                            bRet = CancelPluItem(sSelRow);
                            break;
                        case PosKey.MENU_KEY.QUANTITY:                  // 수량변경
                        case PosKey.MENU_KEY.QTY_PLUS:
                        case PosKey.MENU_KEY.QTY_MINUS:
                            bRet = QtyChangePluItem(sMenuKey, sSelRow, sInPutData);
                            break;
                        case PosKey.MENU_KEY.EXCHANGE:                  // 환전
                            OpenManualCashdrawer();
                            break;
                        case PosKey.MENU_KEY.TRADE_STOP:                // 거래중지
                            bRet = TradeStop();
                            break;
                        case PosKey.MENU_KEY.ORDER_COMPLETED:           // 주문완료
                            if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_OPT)
                            {
                                bRet = OrderCompleted();
                            }
                            else
                            {
                                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0022);      // 부가메뉴 등록 중 처리 할 수 없는 기능 입니다.
                            }
                            break;
                        case PosKey.MENU_KEY.ORDER_EXIT:                // 주문종료
                            bRet = OrderCancelExit();
                            break;
                        // 지움 버튼 클릭 시 오류POP-UP 수정(2017.07.10)
                        case PosKey.MENU_KEY.CLEAR:                     // 지움
                            bRet = true;
                            break;
                        default:
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0022);      // 부가메뉴 등록 중 처리 할 수 없는 기능 입니다.
                            break;
                    }
                }
                //else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_FLAVOUR)       // 플레이버 등록 중 모드
                //{
                //    switch (sMenuKey)
                //    {
                //        case PosKey.MENU_KEY.REGISTER_PLU_ITEM:         // 상품등록
                //            bRet = RegisterPluItem(sSelRow, sEtcData, sInPutData);
                //            break;
                //        case PosKey.MENU_KEY.CANCEL_ITEM:               // 지정취소
                //            bRet = CancelPluItem(sSelRow);
                //            break;
                //        case PosKey.MENU_KEY.QUANTITY:                  // 수량변경
                //        case PosKey.MENU_KEY.QTY_PLUS:
                //        case PosKey.MENU_KEY.QTY_MINUS:
                //            bRet = QtyChangePluItem(sMenuKey, sSelRow, sInPutData);
                //            break;
                //        default:
                //            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0033);      // 플레이버 등록 중 처리 할 수 없는 기능 입니다.
                //            break;
                //    }
                //}
                else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.PAY_WAIT)         // 결제대기 중 모드
                {
                    if (m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.TABLE_GROUP_PAY)
                    {
                        switch (sMenuKey)
                        {
                            case PosKey.MENU_KEY.CASH:                      // 현금
                            case PosKey.MENU_KEY.CREDIT_CARD:               // 신용카드
                            case PosKey.MENU_KEY.WECHATPAY:	                //위챗페이
                                bRet = RegisterPayment(sMenuKey, sInPutData);
                                break;
                            case PosKey.MENU_KEY.PAYMENTS:                  // 결제
                                bRet = RegisterPayment("", "");
                                break;
                            case PosKey.MENU_KEY.EXCHANGE:                  // 환전
                                OpenManualCashdrawer();
                                break;
                            case PosKey.MENU_KEY.HAPPY_BUZ_SEARCH:          // 해피버즈 현황 조회
                                HappyBuzzSearch();
                                break;
                            case PosKey.MENU_KEY.CHECK_SEARCH:              // 수표조회
                                PayCheck(sMenuKey);
                                break;
                            case PosKey.MENU_KEY.DUTCH_PAY:                 // 더치페이
                                bRet = DutchPay(sMenuKey, "0");
                                break;
                            case PosKey.MENU_KEY.DUTCH_PAY_AMT:             // 더치페이(금액)
                                bRet = DutchPayAmt(sMenuKey, "0");
                                break;
                            case PosKey.MENU_KEY.BRITHDAY_CANDLE:	        // 생일초계산
                                BrithDayCandle(sMenuKey);
                                break;
                            case PosKey.MENU_KEY.ITEM_DC_AMT:               // 단품 금액 할인
                            case PosKey.MENU_KEY.ITEM_DC_RATE:              // 단품 율   할인
                            case PosKey.MENU_KEY.FREE_DC:                   // 서비스(무료)
                            case PosKey.MENU_KEY.ELOVE_DC:                  // 환경사랑DC
                            case PosKey.MENU_KEY.ITEM_CHAGE_CPN:            // 제품교환권
                            case PosKey.MENU_KEY.IN_EMP_DC:                 // 입점매장직원할인(단품)
                                bRet = RegisterItemDc(sMenuKey, sSelRow, sInPutData);
                                break;
                            case PosKey.MENU_KEY.ORDER_EXIT:                // 주문종료
                                bRet = OrderCancelExit();
                                break;

                            //#20180413 웰컴카드 신규기능 추가 start,phj
                            case PosKey.MENU_KEY.WELCOMECARD_ISSUE:         // 웰컴카드 발급화면
                                bRet = WelcomeCard_Issue(sMenuKey, "2");
                                break;

                            case PosKey.MENU_KEY.WELCOMECARD_HPAPP_REGISTER:// 웰컴카드 해피앱 고객등록
                                bRet = WelcomeCard_Issue(sMenuKey, "2");
                                break;
                            //#20180413 웰컴카드 신규기능 추가 end,phj

                            //#20180202 인천공항 VIP 라운지 기능미사용으로 주석처리 start,phj
                            /*
                            // grayber@20180115 인천공항 VIP 라운지 start - 결제 대기중 메뉴키 기능 추가
                            case PosKey.MENU_KEY.AIRPORT_VIP_LOUNGE:
                                bRet = RegisterPayment("", "");
                                break;
                            // grayber@20180115 인천공항 VIP 라운지 end
                            */
                            //#20180202 인천공항 VIP 라운지 기능미사용으로 주석처리 end,phj

                            //grayber@20180208 코레일 마일리지 입력 start - 메뉴키 기능 추가
                            case PosKey.MENU_KEY.KORAIL_MILEAGE:
                                bRet = RegisterPayment("", "");
                                break;
                            //grayber@20180208 코레일 마일리지 입력 end

                            default:
                                //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 start
                                //기존
                                /*
                                if (WinSale.ExecuteBinessRun(sMenuKey) == UserCom.RST_IGNORE)
                                {
                                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0112);
                                }
                                */
                                //변경

                                if (WinSale.ExecuteBinessRun(sMenuKey, sMenuKeyAuth) == UserCom.RST_IGNORE)
                                {
                                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0112);
                                }

                                //#20171117 통제, 슈퍼바이저 로그인창 여러번 표시 되는 현상 수정 end
                                break;
                        }
                    }
                }
                else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.PAY_DOING)        // 결제 중 모드
                {

                }
            }
            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
            {
                m_cPosStatus.Sale.ScreenSaverTime = DateTime.Now.ToString("yyyyMMddHHmmss");    //화면보호기 대기시간 설정
            }
            return bRet;
        }

        /// <summary>
        /// 상품 등록 처리
        /// </summary>
        /// <param name="sSelRow">선택행</param>
        /// <param name="sInPutTypeCode">(0:수입력, 1:메뉴, 2:스켄) + (메뉴코드,스캔코드)</param>
        /// <param name="sInPutData">입력데이터</param>
        /// <returns></returns>
        public bool RegisterPluItem(string sSelRow, string sInPutTypeCode, string sInPutData)
        {
            bool bRet = false;
            try
            {
                //17.05.18 dkshin 쇼킹박스 추가
                //if( m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.LOG.SHOCKING_BOX )
                if (m_cTrnStatus.Head.ShockingBoxStat == "1")
                {
                    WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0698));
                    return bRet;
                }

                // 판매화면
                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                if (sInPutTypeCode != "")
                {

                    if (m_cPosStatus.Mst.CorpDiv == ItemConst.CORP_DIV.BR)
                    {
                        // grayber@20180108 [BR] 바코드 18자리 인식 추가 start 
                        //기존
                        //BR, DD
                        //if (sInPutTypeCode.Length == 17 && CmUtil.RightH(sInPutTypeCode, 6) == "N9999X")
                        //{
                        //    //WEB 호출!
                        //    WinBasic.ShowWebPos(PosKey.MENU_KEY.ORDER_REG, sInPutTypeCode.Substring(1));
                        //    return true;
                        //}

                        // 변경
                        if ((sInPutTypeCode.Length == (1 + 16)
                                || sInPutTypeCode.Length == (1 + 18))
                            && CmUtil.RightH(sInPutTypeCode, 6) == "N9999X"
                            )
                        {
                            //WEB 호출!
                            WinBasic.ShowWebPos(PosKey.MENU_KEY.ORDER_REG, sInPutTypeCode.Substring(1));
                            return true;
                        }
                        // grayber@20180108 [BR] 바코드 18자리 인식 추가 end

                    }

                    // 상품등록 처리
                    string nStat = m_cPluService.SetItemCode(sSelRow, sInPutTypeCode, sInPutData);
                    if (nStat != UserCom.RST_OK) return false;

                    // 판매모드 변경
                    if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_WAIT)
                    {
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                        //cFormSaleMain.DisplayInit(false, true);

                        //#20180110 첫번째 제품 선택시 POS MOT에 등록한 TTL or WAV 재생 start
                        //#13753 POS MOT음성 기능 추가 개발요청 start,phj
                        //기존
                        //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT309), "1") == "2")
                        //변경 

                        //#20180214 마스터 수신 시 포스에서 설정한 MOT 값 변경안되도록 수정  start,phj
                        //기존
                        /*
                        if ((m_cTrnStatus.Head.CmpCd == "PCKR" && m_cPosStatus.Mst.DrtFrcsDiv == "10") && //PCKR이고 직영일 때! 
                             m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE ||
                             CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT309), "1") == "2")
                        */
                        //변경
                        //if (m_cTrnStatus.Head.CmpCd == "PCKR" &&
                        //    //#13753 POS MOT음성 기능 추가 개발요청 - 20180222 음성MOT 옵션처리 start,phj
                        //    PosMstManager.GetPosOption(POS_OPTION.OPT331) == "1" &&
                        //    //#13753 POS MOT음성 기능 추가 개발요청 - 20180222 음성MOT 옵션처리 end,phj
                        //    (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE && CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT309), "1") == "2"))
                        ////#20180214 마스터 수신 시 포스에서 설정한 MOT 값 변경안되도록 수정  end,phj

                        ////#13753 POS MOT음성 기능 추가 개발요청 end,phj
                        //{
                        //    frmSaleMain fSalMain = (frmSaleMain)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                        //    fSalMain.SetPlayMotMsg(PosConst.MOT_MSG_TYPE.DSP_SCN_MSG, PosKey.MENU_KEY.FIRSTPLU_INPUT, "");
                        //}
                        //#20180110 첫번째 제품 선택시 POS MOT에 등록한 TTL or WAV 재생 end

                        //#20181016 메모리 사용량 로그남기기 start
                        //20181108 주석처리
                        //m_cDataCommon.MemoryCheckLog();
                        //#20181016 메모리 사용량 로그남기기 end
                    }
                    //#20170926 포스 화면 구성 A안 사용시 후불 매장인 경우 제품 추가하면 기능키가 변경 안됨 start
                    //else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING)
                    //{
                    //    cFormSaleMain.DisplayInit(false, true);
                    //}
                    //#20170926 포스 화면 구성 A안 사용시 후불 매장인 경우 제품 추가하면 기능키가 변경 안됨 end

                    //// 상품 아이템 
                    //ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                    //Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[alPluItem.Count - 1];

                    ////if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE && cPluItem.CANCEL_DIV != "1" && cPluItem.CANCEL_DIV_MAIN != "1")
                    //if ((m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.PREPAID
                    //    || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.GIFT || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS)
                    //    && cPluItem.CANCEL_DIV != "1" && cPluItem.CANCEL_DIV_MAIN != "1")
                    //{
                    //    if ((cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.NORMAL || cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_MAIN ||
                    //        cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.GIFT || cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.PREPAID )
                    //        && cPluItem.OPEN_ITEM_DIV == "1" && (cPluItem.SALE_PRC == 1 || cPluItem.SALE_PRC == 0))    //2017-03-27 안차장요청으로 추가 0원
                    //    {
                    //        while (true)
                    //        {
                    //            // 상품단가 입력 처리
                    //            string sPrice = WinBasic.ShowForm(new string[] { FormManager.FORM_USER_INPUT_DATA, PosConst.FRM_INPUT_DATA.PRICE });
                    //            if (sPrice != UserCom.RST_ERR)
                    //            {
                    //                double nPrice = CmUtil.MathRounds(m_cDataService.DoubleParse(sPrice), m_cPosStatus.Mst.DcRudDwLocMethd, CmUtil.IntParse(m_cPosStatus.Mst.DcRudDwLoc));

                    //                if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS)
                    //                {
                    //                    // 상품 단가 적용
                    //                    cPluItem.SALE_PRC = m_cDataService.DoubleParse(sPrice);
                    //                    m_cDataService.UpdatePluItemAmount(cPluItem);
                    //                    // 상품 판매가 계산
                    //                    m_cPluService.ItemAmountExeccute(true, true);
                    //                    break;
                    //                }
                    //                else
                    //                {
                    //                    if (nPrice > 0 && nPrice == CmUtil.DoubleParse(sPrice))
                    //                    {
                    //                        // 상품 단가 적용
                    //                        cPluItem.SALE_PRC = nPrice;
                    //                        m_cDataService.UpdatePluItemAmount(cPluItem);
                    //                        // 상품 판매가 계산
                    //                        m_cPluService.ItemAmountExeccute(true, true);
                    //                        break;
                    //                    }
                    //                }
                    //            }
                    //            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0538);
                    //        }
                    //    }
                    //}

                    //// 강제 부가메뉴 등록 처리 사용안함 해피스테이션
                    //RegisterForceSubMenu();
                }

                // 세트상품 체크 및 등록 처리
                //RegisterSetMenu();

                // 상품등록 내역 화면 표시((0:LastItem, 1::OldFocus))  -사용안함 해피스테이션
                //if (sInPutTypeCode.StartsWith(PosConst.SALE_PLU_INPUT_TYPE.FLAVOUR))
                //    cFormSaleMain.DisplayItem(1, false);
                //else
                //{
                //    RegisterFlavourMenu("FLAVOUR"); // 플레이버 화면 표시
                //    cFormSaleMain.DisplayItem(0, false);
                //}

                return true;
            }
            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 bRet;
        }

        /// <summary>
        /// 강제 부가메뉴 등록 처리
        /// </summary>
        /// <returns></returns>
        public bool RegisterForceSubMenu()
        {
            bool bRet = false;
            try
            {
                if (m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.NORMAL.SALE && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.ETC.LOSS) return false;
                if (m_cTrnStatus.Sale.SubMenuPopUpYn != "1") return false;

                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING || m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_SET)
                {
                    // 상품 아이템 
                    ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                    // 상품 정보
                    int nSelRow = alPluItem.Count - 1;
                    Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[nSelRow];

                    if ((cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.NORMAL || cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_DETL))      // 부가메뉴 포함 여부
                    {
                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                        // 강제 부가메뉴 화면 표시
                        if (cFormSaleMain.LoadSubMenuDisplay(cPluItem.SUB_SHOP_CD, cPluItem.M_CLSS) == true)
                        {
                            if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_SET)
                                m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING_SET_OPT;
                            else
                                m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING_OPT;

                            //20160911 SBSEO 추가 부가 메뉴일때도 부모코드 입력!
                            m_cTrnStatus.Sale.SubMenuMainCode = cPluItem.ITEM_PLU_CD;

                        }
                    }
                }
                //else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_SET_OPT)
                //{
                //    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING_SET;
                //}
                return true;
            }
            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 bRet;
        }

        /// <summary>
        /// 세트메뉴 등록 처리
        /// </summary>
        /// <returns></returns>
        public bool RegisterSetMenu()
        {
            bool bRet = false;
            try
            {
                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING)
                {
                    // 상품 아이템 
                    ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                    // 상품 정보
                    int nSelRow = alPluItem.Count - 1;
                    Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[nSelRow];

                    if (cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_MAIN)
                    {
                        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                        // 세트메뉴 그룹 로딩
                        m_dtSetMenuGroup = m_cPluService.SearchMenuMaster(PosMst.MST_ITEM_SET.TABLE_NAME, cPluItem.SUB_SHOP_CD, cPluItem.ITEM_PLU_CD);
                        if (m_dtSetMenuGroup == null || m_dtSetMenuGroup.Rows.Count <= 0)
                        {
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0028); // 세트 상품 마스터가 없습니다
                            return false;
                        }

                        // 세트메뉴 그룹 상세 로딩
                        m_dtSetMenuDetail = m_cPluService.SearchMenuMaster(PosMst.MST_ITEM_SET_GRP.TABLE_NAME, cPluItem.SUB_SHOP_CD, cPluItem.ITEM_PLU_CD);

                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING_SET;
                        m_cTrnStatus.Sale.SetPluGroupPos = 0;
                        m_cTrnStatus.Sale.SetPluGroupCnt = 0;
                        m_cTrnStatus.Sale.SetPluSetMainCode = cPluItem.ITEM_PLU_CD;
                    }
                }

                // 세트 상품 등록 처리
                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_SET)
                {
                    for (int z = 0; z < 100; z++)       // 마스터 이상으로 인한 무한루프 방지
                    {
                        if (m_cTrnStatus.Sale.SetPluGroupPos >= m_dtSetMenuGroup.Rows.Count)
                        {
                            m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                            m_cTrnStatus.Sale.SetPluGroupPos = 0;
                            return true;
                        }

                        DataRow dr = m_dtSetMenuGroup.Rows[(int)m_cTrnStatus.Sale.SetPluGroupPos];

                        m_cTrnStatus.Sale.SetPluGroupCnt = m_cTrnStatus.Sale.SetPluGroupCnt + 1;
                        if (m_cTrnStatus.Sale.SetPluGroupCnt >= CmUtil.GetDataRowLong(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_QTY))
                        {
                            m_cTrnStatus.Sale.SetPluGroupPos = m_cTrnStatus.Sale.SetPluGroupPos + 1;
                            m_cTrnStatus.Sale.SetPluGroupCnt = 0;
                        }
                        // 자식상품구분 ==> 0:상품, 1:부가상품그룹코드, 2:상품+그룹
                        if (CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_DIV) == "0")
                        {
                            m_cTrnStatus.Sale.SetPluUpSalePrc = 0;
                            m_cTrnStatus.Sale.SetPluSetGroupCode = "";
                            // 상품 등록 처리
                            RegisterPluItem("", PosConst.SALE_PLU_INPUT_TYPE.MENUKEY + CmUtil.RPadH(CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SUB_STOR_CD), 10) + CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_CD), "");
                        }
                        else if (CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_DIV) == "1")
                        {
                            // 판매화면
                            IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                            // 세트메뉴 화면 표시
                            if (cFormSaleMain.LoadSetMenuDisplay(
                                CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_CD), CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_GRPNM)) == false)
                            {
                                continue;
                            }
                            m_cTrnStatus.Sale.SetPluSetGroupCode = CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_CD);
                        }
                        else if (CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_DIV) == "2")
                        {
                            m_cTrnStatus.Sale.SetPluUpSalePrc = 0;
                            m_cTrnStatus.Sale.SetPluSetGroupCode = CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_GRP_CD);
                            // 상품 등록 처리
                            RegisterPluItem("", PosConst.SALE_PLU_INPUT_TYPE.MENUKEY + CmUtil.RPadH(CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SUB_STOR_CD), 10) + CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM_SET.DATA.SET_ITEM_CD), "");
                        }
                        break;
                    }
                }

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

                m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                m_cTrnStatus.Sale.SetPluGroupPos = 0;
            }
            return bRet;
        }

        /// <summary>
        /// 선택 부가메뉴 등록 처리
        /// </summary>
        /// <returns></returns>
        public bool RegisterChoiceSubMenu(string sSelRow)
        {
            bool bRet = false;
            try
            {
                if (m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.NORMAL.SALE && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.ETC.LOSS
                    && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_REG) return true;

                if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_DOING) return false;

                // 상품 아이템 
                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[CmUtil.IntParse(sSelRow)];

                if (cPluItem.CANCEL_DIV == "1" || cPluItem.CANCEL_DIV_MAIN == "1")
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0017);      // 취소한 상품 입니다
                    return false;
                }

                if (cPluItem.ORDER_OK_FLAG != PosConst.PLU_ORDER_OK_FLAG.ORDER_ING)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0027);      // 주문완료 후 변경 할 수 없습니다
                    return false;
                }

                if ((cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.NORMAL && cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.SET_DETL))
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0026);      // 부가메뉴를 등록 할 수 없는 상품입니다
                    return false;
                }

                // 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                // 부가메뉴 화면 표시
                bRet = cFormSaleMain.LoadSubMenuDisplay(cPluItem.SUB_SHOP_CD, cPluItem.M_CLSS);
            }
            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 bRet;
        }

        /// <summary>
        /// 플레이버 등록 처리
        /// </summary>
        /// <param name="sSelRow">선택행</param>
        /// <returns></returns>
        public bool RegisterFlavourMenu(string sSelRow)
        {
            bool bRet = false;
            try
            {
                if (m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.NORMAL.SALE && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.ETC.LOSS) return false;

                if (sSelRow != "")
                {
                    // 상품 아이템 
                    ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                    Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[alPluItem.Count - 1];

                    if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING && cPluItem.FLAVOUR_DIV == ItemConst.PLU_FLAVOUR_DIV.FLAVOUR_OWN)
                    {
                        if (cPluItem.FLAVOUR_QTY <= 2)
                        {
                            // 판매화면
                            IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                            // 플레이버 화면 표시
                            cFormSaleMain.LoadFlavourMaster(m_cTrnStatus.Sale.SubStoreCode);
                        }
                    }
                    else
                    {
                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                        cFormSaleMain.LoadFlavourMaster("");
                    }
                }
                else
                {
                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    // 플레이버 화면 표시
                    cFormSaleMain.LoadFlavourMaster(m_cTrnStatus.Sale.SubStoreCode);
                }

                return true;
            }
            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 bRet;
        }

        /// <summary>
        /// 지정 취소 처리
        /// </summary>
        /// <param name="sSelRow">선택행</param>
        /// <returns></returns>
        public bool CancelPluItem(string sSelRow)
        {
            bool bRet = false;
            try
            {
                //17.05.18 dkshin 쇼킹박스 추가
                //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.LOG.SHOCKING_BOX)
                //if (m_cTrnStatus.Head.ShockingBoxStat == "1")
                //{
                //    WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0698));
                //    return bRet;
                //}
                //// 판매화면
                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                // 지정취소 처리
                string nStat = m_cPluService.SetCancelItem(sSelRow);
                if (nStat != UserCom.RST_OK) return false;

                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (alPluItem.Count <= 0)
                {
                    //#20170828 해피포인트 적립 제외 버튼 추가 phj, start 
                    //선택된 상품이 모두 취소 되었을 때 0으로 초기화 
                    m_cTrnStatus.Head.HP_EXCLUDE_YN = "0";
                    //#20170828 해피포인트 적립 제외 버튼 추가 phj, end

                    // 판매모드 변경
                    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_WAIT;
                    //cFormSaleMain.DisplayInit(false, true);
                }

                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                //cFormSaleMain.DisplayItem(1, false);

                return true;
            }
            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 bRet;
        }

        /// <summary>
        /// 수량변경 처리
        /// </summary>
        /// <param name="sSelRow">선택행</param>
        /// <returns></returns>
        public bool QtyChangePluItem(string sMenuKey, string sSelRow, string sNewQty)
        {
            bool bRet = false;
            try
            {
                // 판매 화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                // 상품 아이템 
                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                // 상품 정보
                int nSelRow = CmUtil.IntParse(sSelRow);
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[nSelRow];

                switch (sMenuKey)
                {
                    case PosKey.MENU_KEY.QTY_PLUS:
                        sNewQty = (cPluItem.SALE_QTY + 1).ToString();
                        break;
                    case PosKey.MENU_KEY.QTY_MINUS:
                        sNewQty = (cPluItem.SALE_QTY - 1).ToString();
                        break;
                }

                // 수량변경 처리
                string nStat = m_cPluService.SetQtyChangeItem(sSelRow, sNewQty);
                if (nStat != UserCom.RST_OK) return false;

                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayItem(1, false);

                return true;
            }
            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 bRet;
        }

        /// <summary>
        /// 결제 등록 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <param name="sInPutData"></param>
        /// <returns></returns>
        public bool RegisterPayment(string sMenuKey, string sInPutData)
        {
            bool bRet = false;
            try
            {
                //#20181016 메모리 사용량 로그남기기 start
                //20181108 주석처리
                //m_cDataCommon.MemoryCheckLog();
                //#20181016 메모리 사용량 로그남기기 end

                m_cPosStatus.Sale.ScreenSaverTime = "";    //화면보호기 대기시간 설정

                //if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_DOING) return false; 
                if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_DOING && m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.PAY_WAIT) return false;

                //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 start
                if (m_cTrnStatus.Head.ShockingBoxStat == "1" && m_cTrnStatus.Head.ShockingBoxTradeKind == ItemConst.TRAN_KIND.HPO_LOG.LANDOM_BOX)
                {
                    WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0054));
                    return bRet;
                }
                //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 end

                // 선불 판매 일때 고객 이름 체크 하기! (중국인 경우 제외)
                if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.PREPAID && PosMstManager.GetPosOption(POS_OPTION.OPT046) != "1")
                {
                    if (m_cTrnStatus.Head.PpCardCustNm == "")
                    {
                        string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_SAL_PREPAID_CUST });
                        if (sRet != UserCom.RST_OK)
                        {
                            return false;
                        }
                    }
                }

                // 상품 등록 여부 체크
                bool bSaleItemExist = false;
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                foreach (Column.TR_PLU.DATA cPluItem in aSaleItem)
                {
                    if (cPluItem.CANCEL_DIV != PosConst.CANCEL_DIV.CANCEL && cPluItem.CANCEL_DIV_MAIN != PosConst.CANCEL_DIV.CANCEL)
                    {
                        bSaleItemExist = true;
                        break;
                    }
                }
                if (bSaleItemExist == false)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0396);
                    return false;
                }

                // 영업일자 체크
                if (CmUtil.LongParse(m_cPosStatus.Base.SaleDate) < CmUtil.LongParse(System.DateTime.Now.ToString("yyyyMMdd")))
                {
                    if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                    {
                        WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                        return false;
                    }
                }

                // 예약 완료 거래시에는 적용 하지 말자!
                if (m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE)
                {
                    // 상품 할인 및 사은품 캠페인 처리
                    ICampaignUs cCampaignMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                    cCampaignMain.ExecuteCampaignPluHappyPoint("", true, PosConst.SALE_PLU_INPUT_TYPE.FREEGIFT, "", "", "");  // 상품 캠페인 계산
                }
                m_cTrnStatus.Sale.SubTotalCancelDiv = true; //결제 전후 취소 처리 체크 플래그

                //결제 고객 등록 체크
                SetPayGuest("1");

                // 판매모드 변경
                m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.PAY_WAIT;


                //낱개 반품 이나 판매 로스 일경우 결제 버튼 클릭시 현금 자동 결제 2016-12-05 문성진대리 요청 사항!
                if ((m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE) ||
                    (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS))
                {
                    #region
                    //현금 처리!
                    IPaymentUs m_cPaymentUs = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.CASH);

                    string sRet = "";

                    if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE)
                    {
                        //낱개반품
                        sRet = m_cPaymentUs.SetPayment(new string[] { m_cTrnStatus.Sale.RemainPayAmt.ToString(), "0" });
                    }
                    else
                    {
                        //LOSS
                        sRet = m_cPaymentUs.SetPayment(new string[] { "0", "0" });
                    }

                    if (sRet != UserCom.RST_OK)
                    {
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                        return false;
                    }

                    CheckSaleComplete();

                    if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_WAIT)
                    {
                        // 결제 내역 받아 오기
                        ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                        m_cPaymentUs.CancelPayment(new string[] { (alPayItem.Count - 1).ToString() });
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                        return false;
                    }
                    #endregion
                    return true;
                }

                //중국일때 Take In/Out 선택!
                if (m_cPosStatus.Mst.CntryDiv == ItemConst.CNTRY_DIV.CN && CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT304), "1") == "1")
                {
                    SetChinaTakeInOut();
                }
                //2018.01.25.002;미국 서부(남가주, 북가주) 일 경우 Take In/Out 사용 처리;girak.kim;Start
                else if(    m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)
                         && CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT304), "1") == "1" 
                         && CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT330), "1") == "1"
                         //&& (m_cPosStatus.Base.BrandCd.ToUpper().Equals(PosConst.MST_BRAND_CODE.PC_UC) || m_cPosStatus.Base.BrandCd.ToUpper().Equals(PosConst.MST_BRAND_CODE.PC_US))
                       )
                {
                    SetUSTakeInOut();//Take In/Out 결과 상관 없이 무조건 결제창은 띄움
                }
                //2018.01.25.002;미국 서부(남가주, 북가주) 일 경우 Take In/Out 사용 처리;girak.kim;End

                //KDS 부가 정보 사용 여부 [고객명/VIP 구분](0:사용안함, 1:사용함) - 쒝쒝버거용
                if (CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT027), "0") == "1")
                {
                    SetKdsData();
                }

                //#16232 환경부 1회용컵 사용줄이기 관련 테이크인아웃 설정 start
                #region 제조음료 Take In/Out 설정 기능
                //정상 판매인 경우에만 동작
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE)
                {
                    //제조음료 포함 여부 체크
                    bool bProdTakeInOutItemYN = false;
                    bProdTakeInOutItemYN = ChkProdItemTakeInOutYN();

                    //제조음료 Take In/Out 사용여부 체크(ini에 설정이 안된 경우 공통코드 체크)
                    bool bProdTakeInOutUse = false;
                    bProdTakeInOutUse = ChkProdItemTakeInUse();

                    //제조음료 Take In/Out 선택 창 표시
                    if (bProdTakeInOutItemYN == true && bProdTakeInOutUse == true)
                    {
                        SetProdTakeInOut();
                    }
                }
                #endregion 제조음료 Take In/Out 설정 기능
                //#16232 환경부 1회용컵 사용줄이기 관련 테이크인아웃 설정 end

                // 판매화면(상품등록=>결제대기)
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                cFormSaleMain.ChangeSalePayMode(false);
                cFormSaleMain.ChangeShowPayBtn(false);

                if (sMenuKey != "") PayMainProc(sMenuKey, sInPutData);

                cFormSaleMain.SetTopMot(PosKey.MENU_KEY.PAY_MAIN_MENU);

                if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_WAIT) cFormSaleMain.ChangeShowPayBtn(true);

                return true;
            }
            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
            {
                m_cPosStatus.Sale.ScreenSaverTime = DateTime.Now.ToString("yyyyMMddHHmmss");    //화면보호기 대기시간 설정
            }
            return bRet;
        }

        /// <summary>
        /// 중국 Take In/Out 일괄 설정(중국)
        /// </summary>
        private void SetChinaTakeInOut()
        {
            try
            {
                string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_ETC_SELECT_BTN, PosKey.MENU_KEY.TAKE_IN_OUT, "" });

                if (sRet == "1")    //TAKE IN
                {
                    SetItemTakeInOutAll("0");
                }
                else if (sRet == "2")    //TAKE OUT
                {
                    SetItemTakeInOutAll("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);
            }
        }

        private bool SetUSTakeInOut()
        {
            bool bRet = false;
            bRet = SetTakeInOut();
            return bRet;
        }
        /// <summary>
        /// Take In/Out 메세지 상품 일괄 적용(중국)
        /// </summary>
        /// <param name="sTakeInOut"></param>
        private void SetItemTakeInOutAll(string sTakeInOut)
        {
            try
            {
                // 상품정보
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                for (int iRow = 0; iRow < aSaleItem.Count; iRow++)
                {

                    Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iRow];

                    if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cSaleItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL)
                    {
                        continue;   // 지정취소
                    }
                    else
                    {
                        // 상품 마스터 조회
                        DataTable dtDataInfo = m_cDataCommon.SearchItemCode(cSaleItem.SUB_SHOP_CD, cSaleItem.ITEM_PLU_CD, "");
                        if (dtDataInfo == null || dtDataInfo.Rows.Count == 0)
                        {
                            //스킵!!
                        }
                        else
                        {
                            cSaleItem.TAKE_IN_OUT_DIV = sTakeInOut;

                            DataRow drPlu = dtDataInfo.Rows[0];

                            if (cSaleItem.TAKE_IN_OUT_DIV == PosConst.TAKE_IN_OUT_DIV.TAKE_IN)
                            {
                                cSaleItem.SALE_PRC = CmUtil.GetDataRowDouble(drPlu, PosMst.MST_ITEM.DATA.TAKE_IN_SALE_AMT);

                                //#20171113 Take IN/OUT 선택시 세율코드 변경 안되는 현상 수정 start
                                //cSaleItem.TAXRATE_CD = cSaleItem.ITEM_TAKE_IN_VAT_CD;
                                //#20171113 Take IN/OUT 선택시 세율코드 변경 안되는 현상 수정 end
                            }
                            else
                            {
                                cSaleItem.SALE_PRC = CmUtil.GetDataRowDouble(drPlu, PosMst.MST_ITEM.DATA.TAKE_OUT_SALE_AMT);

                                //#20171113 Take IN/OUT 선택시 세율코드 변경 안되는 현상 수정 start
                                //cSaleItem.TAXRATE_CD = cSaleItem.ITEM_TAKE_OUT_VAT_CD;
                                //#20171113 Take IN/OUT 선택시 세율코드 변경 안되는 현상 수정 end
                            }

                            cSaleItem.SALE_AMT = CmUtil.DoubleMultiplication(cSaleItem.SALE_PRC, cSaleItem.SALE_QTY);
                        }
                    }
                }

                m_cPluService.ItemAmountExeccute(true, true);

                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                cFormSaleMain.DisplayItem(1, false);

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


        /// <summary>
        /// KDS 부가 정보 사용 - 쒝쒝버거용
        /// </summary>
        private void SetKdsData()
        {
            try
            {
                string sMsg = string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0652), m_cPosStatus.Global.NumericTOCurrency(m_cTrnStatus.Sale.RemainPayAmt) + m_cPosStatus.Global.m_stCultureMaster.strCurrencyName);

                string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_ETC_SELECT_BTN, PosKey.MENU_KEY.SET_KDS_DATA, sMsg });

                string[] aRecvData = sRet.Split(new string[] { "|" }, StringSplitOptions.None);

                m_cTrnStatus.Head.PackTradeDiv = aRecvData[0];
                m_cTrnStatus.Head.VipTy = aRecvData[1];

                //#20171113 Take IN/OUT 선택시 세율코드 변경 안되는 현상 수정 start
                /*
                if (m_cTrnStatus.Head.PackTradeDiv == "1")
                {
                    SetItemTakeInOutAll("0");
                }
                else if (m_cTrnStatus.Head.PackTradeDiv == "2")
                {
                    SetItemTakeInOutAll("1");
                }
                */
                //#20171113 Take IN/OUT 선택시 세율코드 변경 안되는 현상 수정 end


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

        /// <summary>
        /// 결제 고객 등록
        /// </summary>
        public void SetPayGuest(string sChkFalg)
        {
            try
            {
                if (PosMstManager.GetPosOption(POS_OPTION.OPT004) == sChkFalg)
                {
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT033) == "1") //결제 고객
                    {
                        string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_SAL_AGE, "PAY" });
                        if (sRet != UserCom.RST_ERR)
                        {
                            m_cTrnStatus.Head.PayGndrDiv = CmUtil.MidH(sRet, 0, 1);
                            m_cTrnStatus.Head.PayAge = CmUtil.LongParse(CmUtil.MidH(sRet, 1, 2));
                        }
                    }
                    else if (PosMstManager.GetPosOption(POS_OPTION.OPT033) == "2")    //고객수
                    {
                        string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_SAL_AGE, "" });
                    }
                    else
                    {
                        //미사용
                    }
                }

            }
            catch (Exception ex)
            {

                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                      System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }

        }


        /// <summary>
        /// 단품 아이템 할인 적용
        /// </summary>
        /// <param name="sFuncKey"></param>
        /// <param name="InputData"></param>
        /// <returns></returns>
        public bool RegisterItemDc(string sFuncKey, string sSelRow, string InData)
        {
            bool bRet = false;
            try
            {
                //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 start
                if (m_cTrnStatus.Head.ShockingBoxStat == "1" && m_cTrnStatus.Head.ShockingBoxTradeKind == ItemConst.TRAN_KIND.HPO_LOG.LANDOM_BOX)
                {
                    WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0054));
                    return bRet;
                }
                //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 end

                // 판매 화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                string sDcType = string.Empty;
                string sDcCode = string.Empty;

                if (sFuncKey == PosKey.MENU_KEY.ELOVE_DC)
                {
                    //환경사랑DC만 단독 처리로 분리
                    if (EnvironmentLoveCheck(sSelRow) == false)
                        return false;
                }
                else
                {
                    // 중복 불가 체크!
                    //if (m_cDataCommon.PayDcDuplicationCheck(sFuncKey) == false) return false;

                    switch (sFuncKey)
                    {
                        case PosKey.MENU_KEY.ITEM_DC_AMT:                       //임의 할인 금액
                            sDcType = PosConst.ITEM_DC_DIV_POS_DC.AMT;
                            sDcCode = ItemConst.PLU_DC_DIV.POS_DC; // ItemConst.TR_ITEM_ID.USER_DC.RANDOMLY;
                            break;
                        case PosKey.MENU_KEY.ITEM_DC_RATE:                      //임의 할인 율
                            sDcType = PosConst.ITEM_DC_DIV_POS_DC.RATE;
                            sDcCode = ItemConst.PLU_DC_DIV.POS_DC; //ItemConst.TR_ITEM_ID.USER_DC.RANDOMLY;
                            break;
                        case PosKey.MENU_KEY.FREE_DC:                           //서비스
                            sDcType = PosConst.ITEM_DC_DIV_POS_DC.FREE;
                            sDcCode = ItemConst.PLU_DC_DIV.FREE; //ItemConst.TR_ITEM_ID.USER_DC.SERVICE;
                            break;
                        case PosKey.MENU_KEY.IN_EMP_DC:                         //입점 건물 직원 할인
                            // 화면 호출
                            //입력 값 확인 - 없으면 RETURN
                            sDcType = PosConst.ITEM_DC_DIV_POS_DC.RATE;
                            sDcCode = ItemConst.PLU_DC_DIV.IN_EMP_DC; // ItemConst.TR_ITEM_ID.USER_DC.IN_EMP_DC;
                            break;
                        case PosKey.MENU_KEY.ITEM_CHAGE_CPN:                    //제품교환권
                            sDcType = PosConst.ITEM_DC_DIV_POS_DC.FREE;
                            sDcCode = ItemConst.PLU_DC_DIV.ITEM_CHAGE_CPN_DC; //ItemConst.TR_ITEM_ID.USER_DC.ITEM_CHAGE_CPN;
                            break;
                        //case PosKey.MENU_KEY.ELOVE_DC:                          //환경사랑DC

                        //    if (EnvironmentLoveCheck(ref sSelRow, ref InData) == false)
                        //        return false;
                        //    else
                        //        return true;

                        ////sDcType = PosConst.ITEM_DC_DIV_POS_DC.AMT;
                        ////sDcCode = ItemConst.TR_ITEM_ID.USER_DC.ELOVE;
                        ////break;
                    }

                    // 상품할인 처리
                    string nStat = m_cPluService.SetDcItem(sSelRow, sDcType, sDcCode, InData);
                    if (nStat != UserCom.RST_OK) return false;
                }

                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayItem(1, false);

                return true;
            }
            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 bRet;
        }

        //#Rhee, 20180130 단품 할인 전체 취소 추가 Start
        /// <summary>
        /// 단품 아이템 할인 적용 전체 취소
        /// </summary>
        /// <param name="sFuncKey"></param>
        /// <param name="sDcDiv"></param>
        /// <param name="sDcType"></param>
        /// <returns></returns>
        public bool RegisterItemDcCancel(string sFuncKey, string sDcDiv, string sDcType)
        {
            bool bRet = false;
            try
            {
                // 판매 화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);              

                // 상품할인 처리
                string nStat = m_cPluService.SetDcCancelItem(sDcDiv, sDcType);
                if (nStat != UserCom.RST_OK) return false;

                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayItem(1, false);

                return true;
            }
            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 bRet;
        }
        //#Rhee, 20180130 단품 할인 전체 취소 추가 End

        /// <summary>
        /// 환경사랑DC 체크
        /// </summary>
        /// <param name="sSelRow"></param>
        /// <param name="sDcAmt"></param>
        /// <returns></returns>
        private bool EnvironmentLoveCheck(string sSelRow)
        {

            bool bRet = false, bAlready = false;
            double dDcAmt = 0;
            //string m_DC_ELOVE = ItemConst.TR_ITEM_ID.USER_DC_ITEM + ItemConst.TR_ITEM_ID.USER_DC.ELOVE;

            Column.TR_PLU.DATA cPluItem = null;

            try
            {

                long lInPutQty = 0;
                //int nSelRow = 0;

                //// Step 1.마지막 아이템 체크
                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                //for (int iRow = 0; iRow < alPluItem.Count; iRow++)
                //{
                //    cPluItem = (Column.TR_PLU.DATA)alPluItem[iRow];

                //    if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cPluItem.EXCEP_DC_DIV == m_DC_ELOVE)
                //    {
                //        bAlready = true;
                //        break;
                //    }
                //}

                // 동일 할인 체크
                cPluItem = (Column.TR_PLU.DATA)alPluItem[CmUtil.IntParse(sSelRow)];
                if (cPluItem.EXCEP_DC_DIV == ItemConst.PLU_DC_DIV.ELOVE_DC) bAlready = true;

                if (bAlready == true)
                {
                    if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0053) == false)    // 등록된 할인을 취소 하시겠습니까?
                        return bRet;

                    dDcAmt = 0;
                }
                else
                {
                    //마지막 강제 셋팅 - 오페이션이 바끼면(마지막처리아니면) 주석으로 처리해야함!
                    //nSelRow = alPluItem.Count - 1;
                    //sSelRow = nSelRow.ToString();
                    //cPluItem = (Column.TR_PLU.DATA)alPluItem[nSelRow];

                    // 취소 상품은 할인 불가
                    if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cPluItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0017);      // 취소한 상품 입니다
                        return bRet;
                    }

                    //// 세트 자식은 할인 불가
                    //if (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.NORMAL && cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.SET_MAIN)
                    //{
                    //    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0050);      // 할인 적용 불가능한 상품 입니다.
                    //    return bRet;
                    //}

                    // 할인 허용 여부 
                    if (cPluItem.DC_PRMT_YN == "1" || cPluItem.FREE_GIFT_YN == "1" || cPluItem.SALE_PRC == 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0050);      // 할인 적용 불가능한 상품 입니다.
                        return bRet;
                    }

                    // 할인 등록 여부 체크
                    if (m_cDataService.GetPluDiscountAmount(false, false, false, false, false, false, false, false, true, CmUtil.IntParse(sSelRow)) > 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0063);      // 기존 할인 취소 후 등록 하세요.
                        return bRet;
                    }


                    // Step 3.수량 체크 -> 1 이상이면 입력 받는 화면 호출
                    if (cPluItem.SALE_QTY > 1)
                    {
                        string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_USER_INPUT_DATA, "ELOVE" });
                        if (sRet == UserCom.RST_ERR)
                        {
                            return bRet;
                        }

                        lInPutQty = CmUtil.LongParse(sRet);
                    }
                    else
                    {
                        lInPutQty = cPluItem.SALE_QTY;
                    }

                    // Step 4.입력수량과 현재 등록 수량 체크 크면 에러
                    if (cPluItem.SALE_QTY < lInPutQty || lInPutQty == 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0075);
                        return bRet;
                    }

                    //적용 대상 금액 체크
                    if (cPluItem.BILL_AMT == 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0601);    //할인 적용 대상 금액이 없습니다.
                        return bRet;
                    }


                    // Step 5.할인 금액 가져오기
                    DataTable dt = m_cMstPayDcService.Select(new string[] { PosMst.MST_PAY_DC.TABLE_NAME, ItemConst.TR_ITEM_ID.USER_DC_ITEM, ItemConst.TR_ITEM_ID.USER_DC.ELOVE });

                    if (dt == null || dt.Rows.Count <= 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0377);      // 할인 정보 마스터가 없습니다. 관리자에 문의 하세요.
                        return bRet;
                    }
                    foreach (DataRow dr in dt.Rows)
                    {

                        //할인 방법         DC_APPLY_TRGT
                        //적용 대상         PAY_DC_METHD 1:율, 2:금액
                        //적용 금액         PAY_DC_VAL

                        string sAppyTrgt = CmUtil.GetDataRowStr(dr, PosMst.MST_PAY_DC.DATA.DC_APPLY_TRGT);
                        string sDcMethd = CmUtil.GetDataRowStr(dr, PosMst.MST_PAY_DC.DATA.PAY_DC_METHD);
                        double dPayDcVal = CmUtil.GetDataRowDouble(dr, PosMst.MST_PAY_DC.DATA.PAY_DC_VAL);

                        if (sDcMethd == "1")
                        {
                            double dtmp = CmUtil.MathRounds(CmUtil.MathAmtPercent(cPluItem.SALE_AMT, dPayDcVal), m_cPosStatus.Mst.DcRudDwLocMethd, CmUtil.IntParse(m_cPosStatus.Mst.DcRudDwLoc));

                            dDcAmt = CmUtil.DoubleMultiplication(dtmp, lInPutQty);
                        }
                        else
                        {
                            dDcAmt = CmUtil.DoubleMultiplication(dPayDcVal, lInPutQty);
                        }
                        break;
                    }
                }

                if (cPluItem.BILL_AMT < dDcAmt)
                {
                    string sMsg = string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0602), cPluItem.BILL_AMT, dDcAmt);
                    WinManager.ErrorMessage(sMsg);    //할인 적용 대상 금액이 없습니다.
                    return bRet;
                }

                cPluItem.EXCEP_DC_AMT = dDcAmt;
                cPluItem.EXCEP_DC_DIV = dDcAmt > 0 ? ItemConst.PLU_DC_DIV.ELOVE_DC : "0000";

                m_cDataService.UpdatePluItemAmount(cPluItem);

                // 상품 판매가 계산
                m_cPluService.ItemAmountExeccute(true, true);

                bRet = true;

            }
            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 bRet;
        }


        /// <summary>
        /// 상품권 판매
        /// </summary>
        /// <returns></returns>
        public bool RegisterSellGift(string sFuncKey)
        {
            bool bRet = false;
            try
            {
                // 상품권, 선불 카드 셋팅
                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_WAIT)
                {

                    string sTableName = string.Empty;
                    string sItemType = string.Empty;
                    string sItemName = string.Empty;

                    if (sFuncKey == PosKey.MENU_KEY.GIFT_SALE)
                    {
                        sTableName = PosMst.MST_GIFT_PREPAID.TABLE_NAME_GIFT;
                        sItemType = PosConst.ITEM_TYPE.GIFT;
                        sItemName = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0083);
                    }
                    else
                    {
                        sTableName = PosMst.MST_GIFT_PREPAID.TABLE_NAME_PREPAID;
                        sItemType = PosConst.ITEM_TYPE.PREPAID;
                        sItemName = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0095);
                    }

                    m_dtSetMenuDetail = null;

                    // 선불카드 판매 - 중국 (별도 입력 처리)
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT046) == "1")
                    {
                    }
                    else
                    {
                        //대상 조회
                        m_dtSetMenuDetail = m_cPluService.SearchMenuMaster(sTableName, "", sItemType);

                        if (m_dtSetMenuDetail == null || m_dtSetMenuDetail.Rows.Count == 0)
                        {
                            // 등록 할 수 있는 상품권/선불카드가 없습니다.
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0304);
                            return bRet;
                        }
                    }
                    //m_cTrnStatus.Sale.SetPluGroupPos = 0;

                    //메뉴 화면 표시
                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    cFormSaleMain.LoadSetMenuDisplay(sFuncKey, sItemName, true);

                    //현재 상태 변경, 거래모드 변경
                    if (sItemType == PosConst.ITEM_TYPE.GIFT)
                    {
                        //m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_GIFT;
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.CHARGESALE.GIFT;

                    }
                    else
                    {
                        //m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_PREPAID;
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.CHARGESALE.PREPAID;
                    }

                    //선불카드 판매일경우 카드 번호 입력 로직 필요!
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT046) == "1")
                    {
                        // 선불카드 판매 - 중국
                        frmSalePreCard_China fForm = (frmSalePreCard_China)FormManager.GetForm(FormManager.FORM_SALE_PRECARD);
                        if (fForm == null)
                        {
                            fForm = new frmSalePreCard_China();
                            FormManager.AddForm(FormManager.FORM_SALE_PRECARD, fForm);
                        }

                        if (fForm.ShowDialog() != DialogResult.OK)
                        {
                            TradeStop();
                            return false;
                        }

                        DataTable dtPreCard = fForm.GetPripadItem;

                        if (dtPreCard != null && dtPreCard.Rows.Count > 0)
                        {
                            foreach (DataRow dr in dtPreCard.Rows)
                            {
                                // 상품 등록 처리
                                if (RegisterPluItem("", PosConst.SALE_PLU_INPUT_TYPE.MENUKEY + CmUtil.RPadH(m_cPosStatus.Base.StoreNo, 10) + CmUtil.GetDataRowStr(dr, "iTemCD"), CmUtil.GetDataRowStr(dr, "CardNo")) == true)
                                {
                                    // 선불카드권종 추가(2017.06.27)
                                    ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                                    Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[alPluItem.Count - 1];
                                    cPluItem.SLACK_FIELD = CmUtil.GetDataRowStr(dr, "PreKind");
                                }
                                //RegisterPluItem("", PosConst.SALE_PLU_INPUT_TYPE.MENUKEY + CmUtil.RPadH(m_cPosStatus.Base.StoreNo, 10) + CmUtil.GetDataRowStr(dr, "iTemCD"), CmUtil.GetDataRowStr(dr, "CardNo"));
                            }
                        }
                    }
                }

                return true;
            }
            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 bRet;
        }

        /// <summary>
        /// 거래 취소
        /// </summary>
        /// <returns></returns>
        private bool TradeStop()
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                //// 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_WAIT)
                {

                    // 거래 취소 확인 메세지!
                    if (WinManager.QuestionMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0261)) == true)
                    {
                        // 선불카드 판매 - 중국인 경우
                        if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.PREPAID && PosMstManager.GetPosOption(POS_OPTION.OPT046) == "1")
                        {
                            // 취소요청
                            IPaymentUs m_cSalePreCard = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.SALEPRECARD);
                            ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                            foreach (Column.TR_PLU.DATA cPluItem in alPluItem)
                            {
                                if (cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.PREPAID)
                                {
                                    if (cPluItem.CANCEL_DIV != "1")
                                    {
                                        // 취소 요청
                                        sRet = m_cSalePreCard.CancelPayment(new string[] { "1", cPluItem.SALE_GIFT_NO, "0" });

                                        if (sRet != UserCom.RST_OK)
                                        {
                                            return false;
                                        }
                                    }

                                    if (cPluItem.CANCEL_DIV != "1")
                                    {
                                        cPluItem.CANCEL_DIV = "1";
                                        cPluItem.CANCEL_DATE = DateTime.Now.ToString("yyyyMMddHHmmss");
                                    }
                                }
                            }
                        }


                        // 원거래 종류 백업
                        m_cTrnStatus.Head.OrgTradeKind = m_cTrnStatus.Head.TradeKind;

                        //상품권 or 선불카드 승인 내역 확인 및 취소 처리 로직 필요!                            
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.LOG.STOP;

                        // 보류 후 거래 중지라면 로그 남기기!
                        if (m_cTrnStatus.Head.HoldStat != "")
                            m_cTrnStatus.Head.HoldStat = ItemConst.HOLD_STAT_CD.CANCEL;

                        //17.05.18 dkshin 쇼킹박스 추가
                        //쇼킹상품 취소 처리 로직 필요!  
                        if (m_cTrnStatus.Head.ShockingBoxStat == "1")
                        {
                            IHoldDeal m_cHoldDeal = (IHoldDeal)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.HOLD_DEAL);
                            //m_cHoldDeal.UpdateHoldDeal(m_cTrnStatus.Head.SaleDate, m_cTrnStatus.Head.PosNo, m_cTrnStatus.Head.RegNo, "0", 0, 0);
                            m_cHoldDeal.UpdateShockingBOX();
                            m_cTrnStatus.Head.ShockingBoxStat = "0";
                        }

                        // 테이블 거래 완료 처리
                        sRet = m_cTableSvr.CompleteSaleOrder();

                        // 거래 완료 처리
                        sRet = m_cSaleComplete.PosSaleExecute(new string[] { });
                        if (sRet != UserCom.RST_OK) return false;

                        // 판매상태 변경
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_WAIT;
                    }
                    else
                    {
                        return false;
                    }

                    //// 거래 완료 후 초기화 처리
                    cFormSaleMain.DisplayInit(true, true);
                    //// 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                    cFormSaleMain.DisplayItem(0, true);
                }
                else
                {
                    if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL || m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.NORMAL.SALE)
                    {
                        m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.NORMAL.SALE;
                        m_cTrnStatus.Head.NonSaleRsnCd = "0";

                        //// 거래 완료 후 초기화 처리
                        cFormSaleMain.DisplayInit(true, true);
                    }
                }

                if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT)
                {
                    cFormSaleMain.SaleMainExit();
                }
            }
            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 true;
        }

        /// <summary>
        /// 거래 보류
        /// </summary>
        /// <returns></returns>
        private bool HoldDeal()
        {
            try
            {

                //정상 거래 인지 체크
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL
                    && (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS))
                {

                    ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                    if (aSaleItem.Count > 0)
                    {
                        // 영업일자 체크
                        if (CmUtil.LongParse(m_cPosStatus.Base.SaleDate) < CmUtil.LongParse(System.DateTime.Now.ToString("yyyyMMdd")))
                        {
                            if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                            {
                                WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                                return false;
                            }
                        }

                        int iMaxCnt = CmUtil.IntParse(PosMstManager.GetPosOption(POS_OPTION.OPT017));

                        if (iMaxCnt > 0)
                        {
                            //거래 건수 체크
                            IHoldDeal m_cHoldDeal = (IHoldDeal)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.HOLD_DEAL);
                            DataTable dt = m_cHoldDeal.SearchHoldDealList(m_cPosStatus.Base.SaleDate);

                            if (dt == null || dt.Rows.Count == 0)
                            {
                                //처리 없음
                            }
                            else
                            {
                                if (iMaxCnt < dt.Rows.Count)
                                {
                                    // 보류로 가능 횟수가 초과 되었습니다.
                                    WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0637));
                                    return false;
                                }
                            }
                        }

                        // 보류로 저장 하시겠습니까?
                        if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0527) == true)
                        {

                            //ICampaignUs cCampaignMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                            ////캠페인 초기화
                            //cCampaignMain.ClearCampaignAmt();
                            //m_cDataService.UpdatePluAmount();

                            //#20170920 보류 처리시 임의할인 내역 유지 되도록 수정 start
                            //기존
                            //m_cPluService.ItemDcAllClear(true);
                            //변경
                            m_cPluService.ItemDcAllClear(true, false, false);
                            //#20170920 보류 처리시 임의할인 내역 유지 되도록 수정 end

                            //보류 저장
                            m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.LOG.HOLD_DEAL;

                            if (m_cTrnStatus.Head.HoldStat == ItemConst.HOLD_STAT_CD.LOAD)
                            {
                                m_cTrnStatus.Head.HoldStat = ItemConst.HOLD_STAT_CD.REHOLD;
                            }
                            else
                            {
                                m_cTrnStatus.Head.HoldStat = ItemConst.HOLD_STAT_CD.HOLD;
                            }

                            // 테이블 거래 완료 처리
                            string sRet = m_cTableSvr.CompleteSaleOrder();

                            // 거래 완료 처리
                            sRet = m_cSaleComplete.PosSaleExecute(new string[] { });
                            if (sRet != UserCom.RST_OK) return false;

                            // 판매상태 변경
                            m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_WAIT;

                            // 판매화면
                            IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                            // 거래 완료 후 초기화 처리
                            cFormSaleMain.DisplayInit(true, true);
                            // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                            cFormSaleMain.DisplayItem(0, true);
                        }
                    }
                    else
                    {
                        // 보류 불러오기
                        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                        //거래 건수 체크
                        IHoldDeal m_cHoldDeal = (IHoldDeal)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.HOLD_DEAL);
                        DataTable dt = m_cHoldDeal.SearchHoldDealList(m_cPosStatus.Base.SaleDate);
                        if (dt == null || dt.Rows.Count == 0)
                        {
                            // 거래내역이 존재하지 않습니다.
                            WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0269));
                            return false;
                        }
                        else if (dt.Rows.Count == 1)
                        {
                            // 내역 불러오기를 하시겠습니까?
                            if (WinManager.QuestionMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0254)) == true)
                            {
                                DataRow dr = dt.Rows[0];

                                m_cHoldDeal.LoadLocalTranPlu(dr["SALE_DT"].ToString(), dr["POS_NO"].ToString(), dr["REG_NO"].ToString());
                                m_cHoldDeal.UpdateHoldDeal(dr["SALE_DT"].ToString(), dr["POS_NO"].ToString(), dr["REG_NO"].ToString(), "1", 0, 0);

                                m_cTrnStatus.Head.HoldOrgRegNo = dr["REG_NO"].ToString();
                                m_cTrnStatus.Head.HoldStat = ItemConst.HOLD_STAT_CD.LOAD;
                            }
                            else
                            {
                                return false;
                            }
                        }
                        else
                        {
                            string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_SAL_HOLD });
                        }


                        // 상품 내역 불러오기
                        ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                        if (alPluItem.Count > 0)
                        {
                            Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[0];
                            if (CmUtil.LongParse(cPluItem.NONSALES_RSN_CD) != 0)     // 로스거래 이면(비매출사유코드가 있으면)
                            {
                                // 비매출 사유명 설정
                                DataTable dtNoSaleRsnCd = m_cDataCommon.SeletCommonCode(PosConst.COMMON_CODE_GROUP.S0001, "");
                                foreach (Column.TR_PLU.DATA cLossPluItem in alPluItem)
                                {
                                    if (dtNoSaleRsnCd != null && dtNoSaleRsnCd.Rows.Count > 0)
                                    {
                                        foreach (DataRow dr in dtNoSaleRsnCd.Rows)
                                        {
                                            if (cLossPluItem.NONSALES_RSN_CD == CmUtil.GetDataRowStr(dr, PosMst.MST_COMMON.DATA.CMM_CD))
                                            {
                                                cLossPluItem.NONSALES_RSN_NM = CmUtil.GetDataRowStr(dr, PosMst.MST_COMMON.DATA.CD_NM);

                                                m_cTrnStatus.Head.NonSaleRsnCd = cPluItem.NONSALES_RSN_CD;
                                                m_cTrnStatus.Head.LossTitle = cPluItem.NONSALES_RSN_NM;
                                                break;
                                            }
                                        }
                                    }
                                }
                                m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.ETC.LOSS;
                            }

                            // 상품 판매가 재계산
                            m_cPluService.ItemAmountExeccute(true, true);

                            // 판매화면
                            IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                            // 판매모드 변경
                            m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                            cFormSaleMain.DisplayInit(false, true);

                            // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                            cFormSaleMain.DisplayItem(0, false);

                        }
                    }

                }
                else
                {
                    //판매 거래에서만 가능합니다.
                }

            }
            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 true;
        }


        /// <summary>
        /// 낱개 반품 셋팅
        /// </summary>
        /// <returns></returns>
        private bool RegisterReturnItem()
        {
            bool bRet = false;
            try
            {
                // 낱개 반품 셋팅
                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_WAIT)
                {

                    if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND)    //상품 등록되어 있지 않고 낱개 반품 다시 눌렀을때! 원복
                    {
                        m_cTrnStatus.Head.RtnReasonCd = "";       // 선택된 사유코드
                        m_cTrnStatus.Head.RtnReasonMemo = "";     // 선택된 사유명

                        m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.NORMAL.SALE;
                    }
                    else
                    {
                        // 반품 사유코드 등록
                        frmSelReasonCode fForm = (frmSelReasonCode)FormManager.GetForm(FormManager.FORM_REASON_CODE);
                        if (fForm == null)
                        {
                            fForm = new frmSelReasonCode();
                            FormManager.AddForm(FormManager.FORM_REASON_CODE, fForm);
                        }

                        fForm.ReasonGroup = PosConst.COMMON_CODE_GROUP.Z0008;    // 사유 그룹코드
                        if (fForm.ShowDialog() != DialogResult.OK)
                        {
                            return false;
                        }
                        m_cTrnStatus.Head.RtnReasonCd = fForm.ReasonCode;       // 선택된 사유코드
                        m_cTrnStatus.Head.RtnReasonMemo = fForm.ReasonName;     // 선택된 사유명

                        m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.REFUND;
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.NORMAL.SALE;
                    }
                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                    cFormSaleMain.DisplayInit(false, true);
                    bRet = true;
                }
            }
            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 bRet;

        }

        /// <summary>
        /// 상품 No Tax
        /// </summary>
        /// <param name="sSelRow"></param>
        /// <returns></returns>
        private bool ItemNoTax(string sSelRow)
        {

            bool bRet = false;

            try
            {
                // 판매 화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                // 상품할인 처리
                string nStat = m_cPluService.SetNoTaxItem(sSelRow);
                if (nStat != UserCom.RST_OK) return false;

                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayItem(1, false);
            }
            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 bRet;

        }

        //#Rhee, 20180212 전체상품 No Tax 추가 Start
        /// <summary>
        /// 상품 No Tax
        /// </summary>
        /// <returns></returns>
        private bool ItemAllNoTax()
        {

            bool bRet = false;

            try
            {
                // 판매 화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                string nStat = string.Empty;

                // 상품할인 처리
                nStat = m_cPluService.SetAllNoTaxItem();

                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayItem(1, false);
            }
            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 bRet;

        }
        //#Rhee, 20180212 전체상품 No Tax 추가 End

        /// <summary>
        /// 판매로스 셋팅
        /// </summary>
        /// <returns></returns>
        private bool RegSaleLosss(string sSelRow)
        {
            bool bRet = false;
            try
            {
                // 판매LOSS 셋팅
                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_WAIT)
                {
                    string sLossCode = string.Empty;
                    sLossCode = WinBasic.ShowForm(new string[] { FormManager.FORM_MENU_SUB, PosKey.MENU_KEY.SALE_LOSS });
                    //코드 받아 오기

                    if (sLossCode != UserCom.RST_ERR)
                    {

                        string[] saRuleSplit = sLossCode.Split(new string[] { "~^(" }, StringSplitOptions.None);

                        m_cTrnStatus.Head.NonSaleRsnCd = saRuleSplit[0];

                        if (CmUtil.LenH(saRuleSplit[1]) > 8)
                        {
                            m_cTrnStatus.Head.LossTitle = CmUtil.MidH(saRuleSplit[1], 0, 8).Trim();
                        }
                        else
                        {
                            m_cTrnStatus.Head.LossTitle = saRuleSplit[1].Trim();
                        }

                        m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.ETC.LOSS;

                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                        cFormSaleMain.DisplayInit(false, true);
                        bRet = true;
                    }
                }
                else if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING)
                {

                    //1. 로스거래인지 체크
                    if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS)
                    {
                        //2. 선택한 상품 체크
                        int nSelRow = CmUtil.IntParse(sSelRow);

                        // 상품 내역 불러오기
                        ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                        if (alPluItem.Count > 0)
                        {
                            Column.TR_PLU.DATA cItem = (Column.TR_PLU.DATA)alPluItem[nSelRow];

                            if (cItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL)
                            {
                                //취소 건은 처리 없음!
                            }
                            else
                            {

                                //3. 폼을 호출 해서 코드 받고

                                string sLossCode = string.Empty;
                                sLossCode = WinBasic.ShowForm(new string[] { FormManager.FORM_MENU_SUB, PosKey.MENU_KEY.SALE_LOSS });
                                //코드 받아 오기

                                if (sLossCode != UserCom.RST_ERR)
                                {
                                    //4. 아이템에 저장 하고

                                    string[] saRuleSplit = sLossCode.Split(new string[] { "~^(" }, StringSplitOptions.None);

                                    cItem.NONSALES_RSN_CD = saRuleSplit[0];

                                    if (CmUtil.LenH(saRuleSplit[1]) > 8)
                                    {
                                        cItem.NONSALES_RSN_NM = CmUtil.MidH(saRuleSplit[1], 0, 8).Trim();
                                    }
                                    else
                                    {
                                        cItem.NONSALES_RSN_NM = saRuleSplit[1].Trim();
                                    }

                                    m_cTrnStatus.Head.NonSaleRsnCd = cItem.NONSALES_RSN_CD;
                                    m_cTrnStatus.Head.LossTitle = cItem.NONSALES_RSN_NM;

                                    // 판매화면
                                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                                    cFormSaleMain.DisplayItem(1, false);


                                    bRet = true;
                                }
                                //5. 완료
                            }
                        }
                        else
                        {
                            //등록된 상품이 없어 처리 할께 없다.
                        }
                    }
                    else
                    {
                        // 로스거래가 아니므로 무시한다.
                    }
                }
                else
                {
                    // 처리 가능한 상태가 아님!
                }

            }
            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 bRet;
        }

        private bool OrderCompleted()
        {
            bool bRet = false;
            try
            {
                if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT)
                {

                    // 영업일자 체크
                    if (CmUtil.LongParse(m_cPosStatus.Base.SaleDate) < CmUtil.LongParse(System.DateTime.Now.ToString("yyyyMMdd")))
                    {
                        if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                        {
                            WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                            return false;
                        }
                    }

                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                    // 테이블 판매모드 
                    if (m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.NO_ORDER_SALE)
                    {
                        if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_WAIT)
                        {
                            // 후불테이블의 일반판매모드 일때는 주문을 완료 할 수 없습니다. 
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0054);
                            return false;
                        }

                        // 모든 거래 데이터 삭제
                        m_cDataService.DeleteTranItem();
                        // 거래정보 초기화
                        m_cTrnStatus.ClearAll();
                        // 판매화면 종료
                        cFormSaleMain.SaleMainExit();

                        return true;
                    }

                    if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_WAIT || m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING
                        || m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_OPT)
                    {
                        bool bSaleAble = false;

                        ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                        foreach (Column.TR_PLU.DATA cPluItem in alPluItem)
                        {
                            if (cPluItem.ORDER_OK_FLAG != PosConst.PLU_ORDER_OK_FLAG.ORDER_ING || cPluItem.CANCEL_DIV != PosConst.CANCEL_DIV.CANCEL)
                            {
                                bSaleAble = true;
                                break;
                            }
                        }

                        if (bSaleAble == false)
                        {
                            // 모든 거래 데이터 삭제
                            m_cDataService.DeleteTranItem();
                            // 거래정보 초기화
                            m_cTrnStatus.ClearAll();
                            // 판매화면 종료
                            cFormSaleMain.SaleMainExit();

                            return true;
                        }

                        // 일괄취소 확인 
                        var isTradeStop = true;
                        foreach (Column.TR_PLU.DATA cPluItem in alPluItem)
                        {
                            if (cPluItem.CANCEL_DIV != PosConst.CANCEL_DIV.CANCEL && cPluItem.CANCEL_DIV_MAIN != PosConst.CANCEL_DIV.CANCEL)
                            {
                                isTradeStop = false;
                                break;
                            }
                        }
                        if (isTradeStop)
                        {
                            return this.TradeStop();
                        }

                        if ((m_cTrnStatus.Head.TradeKind).Substring(0, 1) != ItemConst.TRAN_KIND.NORMAL.DELIMITER)
                        {
                            // 거래 완료 처리
                        }
                        else
                        {
                            if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return false;

                            m_cTrnStatus.Sale.MenualOrderValue = string.Empty;

                            SetPayGuest("4");

                            // Add, 2017.01.18
                            // 주방프린터 수동출력 처리  0:자동 1:수동(프린터선택) 2:수동(상품선택)
                            MenualOrderKtchProcess();

                            // 주문내역 완료 처리
                            string sReturn = m_cTableSvr.CompleteMenuOrder();
                            if (sReturn != UserCom.RST_OK)
                            {
                                if (WinManager.QuestionMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0088)) == false)
                                    return false;
                            }

                            // 모든 거래 데이터 삭제
                            m_cDataService.DeleteTranItem();
                            // 거래정보 초기화
                            m_cTrnStatus.ClearAll();
                            // 판매화면 종료
                            cFormSaleMain.SaleMainExit();
                        }

                        bRet = true;
                    }
                }
            }
            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 bRet;
        }

        /// <summary>
        /// 주문 종료(거래 저장없이 주문완료)
        /// </summary>
        /// <returns></returns>
        private bool OrderCancelExit()
        {
            bool bRet = false;
            try
            {
                if (m_cPosStatus.Base.PosType != PosConst.POS_TYPE.DEFERRED_PAYMENT) return false;

                // 영업일자 체크
                if (CmUtil.LongParse(m_cPosStatus.Base.SaleDate) < CmUtil.LongParse(System.DateTime.Now.ToString("yyyyMMdd")))
                {
                    if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                    {
                        WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                        return false;
                    }
                }

                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                foreach (Column.TR_PLU.DATA cPluItem in alPluItem)
                {
                    if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_ING || cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD)
                    {
                        if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0675) == false) return false;

                        break;
                    }
                }

                // 모든 거래 데이터 삭제
                m_cDataService.DeleteTranItem();
                // 거래정보 초기화
                m_cTrnStatus.ClearAll();
                // 판매화면 종료
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                cFormSaleMain.SaleMainExit();

                return true;
            }
            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 bRet;
        }

        private bool HappyOrderWeb()
        {
            bool bRet = false;
            try
            {
                string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_WEB_HAPPY_ORDER, PosKey.MENU_KEY.WEB_HP_ORD });
                if (sRet == UserCom.RST_OK)
                {
                    bRet = true;
                }
            }
            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 bRet;
        }

        private bool HappyOrder()
        {
            bool bRet = false;
            try
            {
                string sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_HPORD, "01" });
                if (sRet == UserCom.RST_OK)
                {
                    // 거래 초기화
                    m_cDataService.InitTranHeader();

                    // 판매중 모드 설정
                    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;

                    m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
                    m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.FORIGN.O2O;

                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    cFormSaleMain.DisplayInit(true, false);
                    // 상품등록 내역 표시
                    cFormSaleMain.DisplayItem(0, false);

                    bRet = true;
                }
            }
            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 bRet;
        }

        private bool ItemMmeo(bool bIsFireKey)
        {
            bool bRet = false;
            try
            {
                // 후불에서만 사용 가능
                if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.PRE_PAYMENT)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0631);
                    return bRet;
                }

                // 주방프린트 사용(0 : 미사용, 1 : 사용)
                if (PosMstManager.GetPosOption(POS_OPTION.OPT506) != "1")
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0414);
                    return bRet;
                }

                // 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                int iSelectedRow = cFormSaleMain.GetSelectedIndexOnSaleItemGrid();

                ArrayList alSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alSaleItem[iSelectedRow];

                // 취소상품 메모 불가 
                if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cPluItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0017);
                    return bRet;
                }

                // 부가메뉴는 메모 불가 
                if (cPluItem.SUBPRC_MENU_KEY_DIV != "0")
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0665);
                    return bRet;
                }
                // 출력대상 상품 확인 
                var cnt = m_cTableSvr.GetKtchDiveceCount(cPluItem.ORDER_OK_FLAG, m_cPosStatus.Sale.SelectFloorCd, m_cPosStatus.Sale.SelectTableNo, cPluItem.SUB_SHOP_CD + cPluItem.ITEM_PLU_CD);
                if (cnt <= 0)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0666);
                    return bRet;
                }

                // FIRE KEY는 한번에 하나씩만.. 
                if (bIsFireKey)
                {
                    if (cPluItem.ITEM_MEMO_1 == "FIRE KEY") return true;
                }

                //string sRet = WinTable.ShowForm(new string[] { FormManager.FORM_ETC_TABLE_MEMO, (bIsFireKey == false ? "1" : "9"), iSelectedRow.ToString() });
                string msgId = bIsFireKey == false ? PosConst.KPS_ORD_MSG_ID.ITEM_MEMO : PosConst.KPS_ORD_MSG_ID.FIRE_KEY;
                string sRet = WinTable.ShowForm(new string[] { FormManager.FORM_ETC_TABLE_MEMO, msgId, iSelectedRow.ToString() });
                if (sRet == UserCom.RST_OK)
                {
                    bRet = true;

                    if (bIsFireKey)
                    {
                        //ArrayList alSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                        Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)alSaleItem[iSelectedRow];
                        cSaleItem.FIRE_KEY = true;
                    }

                    cFormSaleMain.DisplayItem(1, false);
                }
            }
            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 bRet;
        }

        /// <summary>
        /// 세트메뉴 상품 변경 처리
        /// </summary>
        /// <param name="sSelRow">선택행</param>
        /// <returns></returns>
        public bool SetMenuItemChange(string sSelRow)
        {
            bool bRet = false;
            try
            {
                // 상품 아이템 
                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                // 상품 정보
                int nSelRow = CmUtil.IntParse(sSelRow);
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[nSelRow];

                // 취소 상품은 변경 불가
                if (cPluItem.CANCEL_DIV == "1" || cPluItem.CANCEL_DIV_MAIN == "1")
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0017);
                    return false;
                }
                if (cPluItem.ORDER_OK_FLAG != PosConst.PLU_ORDER_OK_FLAG.ORDER_ING)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0027);
                    return false;
                }
                if (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.SET_DETL)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0307);
                    return false;
                }
                if (cPluItem.SET_PLU_SET_GROUP_CODE == "")
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0307);
                    return false;
                }

                // 세트메뉴 상품 변경 등록
                frmSetMenuChg fForm = (frmSetMenuChg)FormManager.GetForm(FormManager.FORM_SET_MENU_CHANGE);
                if (fForm == null)
                {
                    fForm = new frmSetMenuChg();
                    FormManager.AddForm(FormManager.FORM_SET_MENU_CHANGE, fForm);
                }

                fForm.SetSelectRow = sSelRow;
                if (fForm.ShowDialog() == DialogResult.OK)
                {
                    // 판매 화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                    cFormSaleMain.DisplayItem(1, false);
                }

                return true;
            }
            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 bRet;
        }

        #region 주석
        ///// <summary>
        ///// 
        ///// </summary>
        ///// <returns></returns>
        //public bool PayDcDuplicationCheck(string sPayGrpCode, string sPayCode)
        //{
        //    bool bRet = true;

        //    try
        //    {
        //        int iCpn = 1;       //할인(캠페인)
        //        int iDcTelecom = 1; //할인(통신사)
        //        int iDcPnt = 1;     //할인(포인트)
        //        int iDcCpn = 1;     //할인(쿠폰)
        //        int iDcEmp = 1;     //할인(직원)
        //        int iDcUser = 1;    //할인(임의)

        //        int iPayNrl = 1;    //결제(일반)
        //        int iPayMobile = 1; //결제(모바일)
        //        int iPayPnt = 1;    //결제(포인트)


        //        int[,] aCheckPoint = new int[9, 2];

        //        for (int iRow = 0; iRow < aCheckPoint.GetLength(0) ; iRow++)
        //        {
        //            aCheckPoint[iRow, 0] = 1;
        //            aCheckPoint[iRow, 1] = 0;
        //        }


        //        /////////////////////////////////////
        //        // 할인
        //        /////////////////////////////////////
        //        //캠페인

        //        ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

        //        for (int iRow = 0; iRow < alPluItem.Count; iRow++)
        //        {
        //            Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)alPluItem[iRow];

        //            if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.NORMAL)
        //            {
        //                if (cPluItem.CPN_DC_AMT > 0)
        //                {
        //                    //aCheckPoint[0, 0] = 0;
        //                    aCheckPoint[0, 1] = 1;  //있음!
        //                }
        //                if (cPluItem.ITEM_DC_AMT > 0)
        //                {
        //                    if(sPayGrpCode == ItemConst.TR_ITEM_ID.USER_DC_ITEM)
        //                    {
        //                        //같은 그룹에 결제/할인 수단이 등록되어 있어 처리 할 수 없습니다.
        //                        return false;
        //                    }

        //                    aCheckPoint[1, 0] = 0;
        //                    aCheckPoint[1, 1] = 1;  //있음!
        //                }

        //            }

        //        }


        //        //할인 체크
        //        ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);

        //        StringBuilder sbSQL = new StringBuilder();
        //        sbSQL.Length=0;

        //        for (int iRow = 0; alPayItem.Count > iRow; iRow++)
        //        {

        //            Column.TR_PAYMENT.DATA clPayItem = (Column.TR_PAYMENT.DATA)alPayItem[iRow];

        //            if(clPayItem.CANCEL_DIV == PosConst.CANCEL_DIV.NORMAL)
        //            {
        //                if(clPayItem.PAY_WAY_CD == sPayGrpCode)
        //                {
        //                    //같은 그룹에 결제/할인 수단이 등록되어 있어 처리 할 수 없습니다.
        //                    return false;
        //                }
        //                else
        //                {
        //                    if(sbSQL.Length == 0 )
        //                    {
        //                        sbSQL.Append("'");
        //                    }
        //                    else
        //                    {
        //                        sbSQL.Append(",'");

        //                    }
        //                    sbSQL.Append(clPayItem.PAY_WAY_CD);
        //                    sbSQL.Append(clPayItem.PAY_DTL_CD_01);
        //                    sbSQL.Append("'");

        //                    //등록 된 자기 자신 등록 유무 넣기

        //                    switch (sPayGrpCode)
        //                    {
        //                        case ItemConst.TR_ITEM_ID.PAY_ITEM:
        //                        case ItemConst.TR_ITEM_ID.CASH_ITEM:
        //                        case ItemConst.TR_ITEM_ID.CHECK_ITEM:
        //                        case ItemConst.TR_ITEM_ID.CREDIT_ITEM:
        //                        case ItemConst.TR_ITEM_ID.CREDITCARD_ITEM:
        //                        case ItemConst.TR_ITEM_ID.EMP_PAY_ITEM:
        //                        case ItemConst.TR_ITEM_ID.FOREIGNEX_ITEM:
        //                        case ItemConst.TR_ITEM_ID.GIFT_ITEM:
        //                        case ItemConst.TR_ITEM_ID.MOBILECASH_ITEM:
        //                        case ItemConst.TR_ITEM_ID.MOBILECON_ITEM:
        //                        case ItemConst.TR_ITEM_ID.PAYETC_ITEM:
        //                        case ItemConst.TR_ITEM_ID.POINT_ITEM:
        //                        case ItemConst.TR_ITEM_ID.PPCARD_ITEM:
        //                        case ItemConst.TR_ITEM_ID.RESERVATION_ITEM:
        //                            {
        //                                break;
        //                            }
        //                        case ItemConst.TR_ITEM_ID.COUPON_ITEM:
        //                            {
        //                                aCheckPoint[4, 1] = 1;  //있음!
        //                                break;
        //                            }
        //                        case ItemConst.TR_ITEM_ID.MOBILE_COM_POINT:
        //                            {
        //                                aCheckPoint[2, 1] = 1;  //있음!
        //                                break;
        //                            }
        //                        case ItemConst.TR_ITEM_ID.EMP_DC_ITEM:
        //                            {
        //                                aCheckPoint[5, 1] = 1;  //있음!
        //                                break;
        //                            }
        //                    }

        //                }

        //            }

        //        }

        //        DataTable dt = m_cMstPayDcService.Select(new string[] { PosMst.MST_PAY_DC.TABLE_NAME_GROUPBY, sbSQL.ToString(), PosConst.PAY_DC_TYPE.DC });

        //        if(dt == null || dt.Rows.Count <= 0)
        //        {
        //            //내역 없음!
        //        }
        //        else
        //        {
        //            foreach (DataRow dr in dt.Rows)
        //            {
        //                //할인

        //                aCheckPoint[0, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.CPI_DUP_YN);
        //                aCheckPoint[1, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_GNRL_DUP_YN);
        //                aCheckPoint[2, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_TELECOM_DUP_YN);
        //                aCheckPoint[3, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_POINT_DUP_YN);
        //                aCheckPoint[4, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_CPN_DUP_YN);
        //                aCheckPoint[5, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_EMP_DC_DUP_YN);

        //                //결제
        //                aCheckPoint[6, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.PAY_GNRL_DUP_YN);
        //                aCheckPoint[7, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.PAY_MOBILE_DUP_YN);
        //                aCheckPoint[8, 0] = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.PAY_POINT_DUP_YN);

        //                break;
        //            }
        //        }

        //        if (sPayGrpCode == "" && sPayCode == "")
        //        {
        //            //두개 코드가 공백이면 캠페인 경우이고 캠페인 중복 가능 여부만 체크 하면됨!
        //            if (aCheckPoint[0, 0] != 1)
        //                bRet = false;
        //            else
        //                bRet = true;
        //        }
        //        else
        //        {

        //            //캠페인 외 중복 체크 

        //            dt = m_cMstPayDcService.Select(new string[] { PosMst.MST_PAY_DC.TABLE_NAME_GROUPBY, sPayGrpCode, sPayCode });

        //            //현재 등록 결제 수단과 등록된 결제 중복 체크 로직!

        //            if (dt == null || dt.Rows.Count <= 0)
        //            {
        //                //등록 정보 없음
        //                return false;
        //            }
        //            else
        //            {
        //                foreach (DataRow dr in dt.Rows)
        //                {
        //                    //할인

        //                    if (CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_TELECOM_DUP_YN) == 1 && aCheckPoint[2, 0] == 1)
        //                    {
        //                        //통신사 중복!!

        //                    }




        //                    iDcPnt = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_POINT_DUP_YN);
        //                    iDcCpn = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_CPN_DUP_YN);
        //                    iDcEmp = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.DC_EMP_DC_DUP_YN);

        //                    //결제
        //                    iPayNrl = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.PAY_GNRL_DUP_YN);
        //                    iPayMobile = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.PAY_MOBILE_DUP_YN);
        //                    iPayPnt = CmUtil.GetDataRowInt(dr, PosMst.MST_PAY_DC.DATA.PAY_POINT_DUP_YN);

        //                    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 bRet;

        //}
        #endregion

        //#20171227 인천공항 포스연동 start, phj
        #region 인천공항 데이터 전송!!!!
        private void IncheonAireport(string sMenuKey)
        {
            if (PosMstManager.GetPosOption(POS_OPTION.OPT512) != "1")
            {
                WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0765);
                return;
            }

            string sRet = UserCom.RST_ERR;

            try
            {
                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                     System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                     "IncheonAirport Button Click Start ");

                //#20171227 인천공항 포스연동 start, phj - #20180313
                //기존
                //if (m_cAirPortTran.IncheonAireportClose(sMenuKey, "Y") == UserCom.RST_OK)
                
                //변경
                sRet = m_cAirPortTran.IncheonAireportClose(sMenuKey, "Y");
                if (sRet == UserCom.RST_OK)
                //#20171227 인천공항 포스연동 end, phj - #20180313
                {
                    //#20180119 로직변경 start,phj
                    //기존
                    /*
                    // 팝업
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_INCHEONAIRPORT, sMenuKey });
                    if (sRet != UserCom.RST_OK) { return; }
                    */
                    //#20180119 로직변경 end,phj

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

                    // 결제체크 
                    CheckSaleComplete();
                }

                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                     System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                     "IncheonAirport Button Click End [" + sRet.ToString() + "]");
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion
        //#20171227 인천공항 포스연동 end, phj

        //#20171227 인천공항 포스연동 start, phj
        #region 인천공항 결제완료처리
        private string IncheonAireportPayClose(string sMenuKey)
        {
            if (PosMstManager.GetPosOption(POS_OPTION.OPT512) != "1")
            {
                //WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0765);
                //인천공항이 아닌데, 혹시 이 함수 탔을 경우 대비.
                return UserCom.RST_OK;
            }

            string sRet = UserCom.RST_ERR;
            try
            {
                //#20171227 인천공항 포스연동 start, phj - #20180313
                //위치이동
                //기존
                /*
                //#20180119 로직변경 start,phj
                bool bCashPayCheck = false;

                ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                for (int iRow = 0; iRow < alPayItem.Count; iRow++)
                {
                    Column.TR_PAYMENT.DATA cPayItem = (Column.TR_PAYMENT.DATA)alPayItem[iRow];

                    if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.CASH_ITEM && cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.CASH.CASH_PAY)
                    {
                        //#20171227 인천공항 포스연동 start, phj - #20180313
                        if (cPayItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                        //#20171227 인천공항 포스연동 end, phj - #20180313
                        bCashPayCheck = true;
                        break;
                    }
                }
                if (bCashPayCheck == true)
                {
                    sRet = UserCom.RST_OK;
                    return sRet;
                }
                //#20180119 로직변경 start,phj
                */
                //#20171227 인천공항 포스연동 end, phj - #20180313



                string sCloseRet = m_cAirPortTran.IncheonAireportClose(sMenuKey, "N");

                //if (sCloseRet == UserCom.RST_ERR)
                if (sCloseRet == UserCom.RST_OK)
                {
                    //#20180119 로직변경 start,phj
                    //기존
                    /*
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_INCHEONAIRPORT, sMenuKey });
                    if (sRet != UserCom.RST_OK)
                    {
                        //WinManager.ConfirmMessage("통합POS에서 결제내역을 가져오는데 실패하였습니다.");
                        return sRet;
                    }
                    */
                    //#20180119 로직변경 end,phj 


                    sRet = UserCom.RST_OK;

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

                //#20180119 로직변경 start,phj 
                //기존
                /*
                else if (sCloseRet == UserCom.RST_IGNORE)
                {
                    // 예를들어) 
                    // spc 결제완료 -> 통합포스 일괄취소 -> 인천공항포스 버튼 클릭 -> y 루틴 타고, 결제완료되는 시점에 n 루틴타면 두번 등록되는 현상 방지 
                    sRet = UserCom.RST_OK;
                }
                */
                //#20180119 로직변경 end,phj


                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
        //#20171227 인천공항 포스연동 end, phj

        //#20170828 해피포인트 적립 제외 버튼 추가 phj, start
        private void HappyPoint_SaveExclude(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                //#20180103 해피포인트 적립 제외 버튼 선택 취소 기능 start
                //기존
                //m_cTrnStatus.Head.HP_EXCLUDE_YN = "1";
                //변경

                if (m_cTrnStatus.Head.HP_EXCLUDE_YN == "1")
                {
                    m_cTrnStatus.Head.HP_EXCLUDE_YN = "0";
                }
                else
                {
                    m_cTrnStatus.Head.HP_EXCLUDE_YN = "1";
                }

                //#20180103 해피포인트 적립 제외 버튼 선택 취소 기능 end

                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                cFormSaleMain.DisplayPayment();           // 결제등록정보 화면표시

                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);
            }
        }
        //#20170828 해피포인트 적립 제외 버튼 추가 phj, end


        #region PayMainProc 결제 메인 기능 처리
        /// <summary>
        /// 결제 메인 기능 처리
        /// </summary>
        /// <param name="sFuncCode"></param>
        public void PayMainProc(string sFuncCode, string sInputData)
        {
            string sRet;

            try
            {
                if (WinBasic.CheckMenuKeyAuth(sFuncCode) == false) return;      // 기능키 판매원 권한 체크
                //string sMngAuth = PosMstManager.GetMstPicAuth(m_cPosStatus.Base.CashierNo + sFuncCode);

                //switch (sMngAuth)
                //{
                //    case PosConst.MNG_AUTH_DIV.NON_PERMISSION:
                //        WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0308), MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0505), false);
                //        return;
                //    case PosConst.MNG_AUTH_DIV.PERMISSION:
                //        break;
                //    case PosConst.MNG_AUTH_DIV.SUPERVISOR:
                //        if (WinBasic.ShowForm(new string[] { FormManager.FORM_LOG_ON, PosKey.MENU_KEY.REGISTER_ADMIN }) == UserCom.RST_ERR) return;
                //        //sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_CASHIER_INPUT, "Supervisor" });
                //        //if (sRet != UserCom.RST_OK)
                //        //{
                //        //    return;
                //        //}
                //        break;
                //}

                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.PAY_WAIT || m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.PAY_DOING)        // 결제 모드                
                {
                    //키유효성 체크
                    if (m_cDataCommon.FunctionKeyValidity(sFuncCode) == false)
                    {
                        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0054));
                        return;
                    }

                    // 결제할인 마스터의 결제할인 중복 가능 여부 체크
                    if (m_cDataCommon.PayDcDuplicationCheck(sFuncCode) == false) return;

                    SetPayMainTopMot(sFuncCode);    //MOT 변경!

                    SerialMsrToEmul();              // MSR변환프로그램 체크

                    switch (sFuncCode)
                    {
                        //#20170828 해피포인트 적립 제외 버튼 추가 phj, start
                        case PosKey.MENU_KEY.HAPPY_SAVE_EXCLUDE:
                            HappyPoint_SaveExclude(sFuncCode);
                            break;
                        //#20170828 해피포인트 적립 제외 버튼 추가 phj, end

                        //#20171227 인천공항 포스연동 start, phj
                        case PosKey.MENU_KEY.INCHEON_AIRPORT:
                            IncheonAireport(sFuncCode);
                            break;
                        //#20171227 인천공항 포스연동 end, phj

                        //#20180413 웰컴카드 신규기능 추가 start,phj
                        case PosKey.MENU_KEY.WELCOMECARD_ISSUE:// 웰컴카드 발급
                            WelcomeCard_Issue(sFuncCode, "2");
                            break;

                        case PosKey.MENU_KEY.WELCOMECARD_HPAPP_REGISTER:// 웰컴카드 해피앱 고객등록
                            WelcomeCard_Issue(sFuncCode, "2");
                            break;
                        //#20180413 웰컴카드 신규기능 추가 end,phj

                        case PosKey.MENU_KEY.HAPPY_POINT:               //해피포인트 적립
                        case PosKey.MENU_KEY.HAPPY_POINT_SAVE_CHINA:    //해피포인트 적립-중국
                            PayHappyPoint(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.OKCASHBACK_SAVE:       //OCB포인트 적립
                            PayOkCashbackSave(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.SKT:                   // SKT
                        case PosKey.MENU_KEY.KT:	                // KT            
                        case PosKey.MENU_KEY.KT_VIP:	            // KT_VIP            
                        //#20180413 웰컴카드 신규기능 추가 start,phj
                        case PosKey.MENU_KEY.WELCOMECARD_DC:
                        //#20180413 웰컴카드 신규기능 추가 end,phj 
                        case PosKey.MENU_KEY.LGT:	                // LGT     
                            PayPointMobileCom(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.PAY_OTHER_DC:	        //기타할인
                            sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_MENU_SUB, sFuncCode });
                            if (sRet != UserCom.RST_ERR)
                            {
                                PayMainProc(sRet, sInputData);      // 선택된 업무 실행
                            }
                            break;
                        case PosKey.MENU_KEY.HAPPY_DC_COUPON:	    //해피쿠폰할인
                            PayHappyPointCouopn(sFuncCode, "0");
                            break;
                        case PosKey.MENU_KEY.SPC_EMPLOYEE_DC:	    //SPC임직원할인
                        case PosKey.MENU_KEY.SPC_EMPLOYEE_DC_PAY:	//SPC임직원할인(결제)
                            SPCEmployeeDC(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.SPC_EMPLOYEE_DC_CHINA:	//SPC임직원할인-중국
                            SPCEmployeeDC_China(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.SEVERANCE_DC:	        //세브란스할인
                            SeveranceDC(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.DC_COUPONS:	        //쿠폰할인
                            CouponDC(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.PAY_INSTOR_DC:	        //입점매장직원할인
                        case PosKey.MENU_KEY.PAY_INSTOR_DC_5:
                            iNStorDC(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.PAY_INSTOR_PAY:	    // 기타결제
                            iNStorDC(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.TOTAL_DC_AMT:	        // 전체금액할인
                        case PosKey.MENU_KEY.TOTAL_DC_RATE:	        // 전체%할인
                        case PosKey.MENU_KEY.TOTAL_ADDDC_AMT:	    // 추가금액할인
                            TotalDC(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.KAIST_DC:	            // 카이스트할인(2017.05.15)
                        case PosKey.MENU_KEY.HPORDER_REVDC:	        // 해피오더사전예약할인(2017.05.15)
                            PayDcMstToDc(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.CAKE_VOUCHERS:	        //케익교환권
                            CakeChange(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.CASH:	                //현금
                            PayCash(sFuncCode, sInputData);
                            break;
                        case PosKey.MENU_KEY.CREDIT_CARD:	        //신용카드
                            PayCreditCard(sFuncCode, sInputData);
                            break;
                        case PosKey.MENU_KEY.OTHER_PAYMENTS:	    //기타결제
                            sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_MENU_SUB, sFuncCode });
                            if (sRet != UserCom.RST_ERR)
                            {
                                // -------------------------------------------------------------------------------------------
                                // 세브란스 직원식 상품 체크
                                // -------------------------------------------------------------------------------------------
                                string sMenuKey = sRet;
                                sRet = SeveranceiTemCheck(sMenuKey);
                                if (sRet != UserCom.RST_OK) return;
                                // -------------------------------------------------------------------------------------------

                                PayMainProc(sMenuKey, sInputData);   // 선택된 업무 실행
                            }
                            break;
                        case PosKey.MENU_KEY.MOBILE_COUPON:	        //모바일 쿠폰
                            PayMobileCoupon(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.CHECK_CASH:	        //수표
                        case PosKey.MENU_KEY.CHECK_SEARCH:	        //수표 조회
                            PayCheck(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.GIFT_CARD:	            //상품권
                            PayGift(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.MEAL_TICKET:	        //식권
                            PayMealTicket(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.STORE_COUPON:	        //매장쿠폰
                            break;
                        case PosKey.MENU_KEY.HAPPY_POINT_USE:	    //해피포인트 사용
                        case PosKey.MENU_KEY.HAPPY_POINT_USE_CHINA:	//해피포인트 사용 -중국
                        case PosKey.MENU_KEY.OLIBANK:	            //OLIBANK
                        case PosKey.MENU_KEY.OKCASHBACK:	        //OCB
                        case PosKey.MENU_KEY.BLUE_MEMBERS:	        //블루 멤버스
                        case PosKey.MENU_KEY.RED_MEMBERS:	        //레드 멤버스
                            PayPointMemberUse(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.SAMSUNG_POINTS:	    //삼성포인트
                            PaySamSungPoint(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.WOORIMORE_POINTS:	    //우리모아포인트
                            PaySamSungPoint(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.HYUNDAI_M_POINTS:	    //현대M포인트
                            PaySamSungPoint(sFuncCode);
                            break;
                        //*** MoonSeokWoo 2017.12.12 Add
                        case PosKey.MENU_KEY.SHINHANCARD_POINT:	    //신한포인트
                            PaySamSungPoint(sFuncCode);
                            break;
                        //*** MoonSeokWoo 2017.12.12 End
                        case PosKey.MENU_KEY.BALANCE_VOUCHER:	    //잔액교환권
                            PayExchangeTicket(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.FOREIGN_CURRENCY:	    //외화
                            PayForeign(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.ALIPAY:	            //알리페이                      
                            PayAliPay(PosKey.MENU_KEY.ALIPAY);
                            break;
                        case PosKey.MENU_KEY.WECHATPAY:	            //위챗페이
                            WeChatPay(PosKey.MENU_KEY.WECHATPAY);
                            break;
                        case PosKey.MENU_KEY.WECHATPAY_BAIRONG:	            //샤오청쉬 위챗페이-바이롱;girak.kim;2017.09.11.001
                            WeChatPay_BaiRong(PosKey.MENU_KEY.WECHATPAY_BAIRONG);
                            break;
                        case PosKey.MENU_KEY.XIAOCHENGXU_GIFTCARD:	            //샤오청쉬 기프트카드;girak.kim;2017.09.11.001
                            XiaoChengxu_GiftCard(PosKey.MENU_KEY.XIAOCHENGXU_GIFTCARD);
                            break;

                        case PosKey.MENU_KEY.SMILE_PAY:	            //스마일페이                      
                            SmilePay(PosKey.MENU_KEY.SMILE_PAY);
                            break;
                        case PosKey.MENU_KEY.T_PAY:                 // T페이 
                            PayTPay();
                            break;
                        case PosKey.MENU_KEY.SEVERANCE_PAYMENTS:	//세브란스결제
                            SeveranceDC(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.SPC_EMPLOYEES_PAY:	    //SPC임직원결제
                            SPCEmployeeDC(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.T_MONEY:	            //T-MONEY
                            PayTMoneyCashBee(new string[] { FormManager.FORM_PAY_TMONEY, sFuncCode, "", "" });
                            break;
                        case PosKey.MENU_KEY.CASHBEE:	            //캐시비
                            PayTMoneyCashBee(new string[] { FormManager.FORM_PAY_TMONEY, sFuncCode, "", "" });
                            break;
                        case PosKey.MENU_KEY.TMONEY_SEARCH:         //교통카드 잔액조회
                            PayTMoneyCashBee(new string[] { FormManager.FORM_PAY_TMONEY, PosKey.MENU_KEY.T_MONEY, "", "S" });
                            break;
                        case PosKey.MENU_KEY.PREPAID_CARDS_HPJOY:   //선불카드(해피조이)
                            PayPrepaidCard_China(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.HP_GIFT_CHARGED:       //선불카드(해피조이) 충전
                            PayHappyGift(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.CREDIT_CUSTOMER:	    //외상
                            PaySaleOnCustomer(sFuncCode);
                            break;
                        // Rhee, 2017/09/22 딜리버리 외매(선매) 추가 -- START
                        case PosKey.MENU_KEY.CREDIT_DELIVERY:	    //외상 - 딜리버리(외매)
                            PaySaleOnCustomer(sFuncCode);
                            break;
                        // Rhee, 2017/09/22 딜리버리 외매(선매) 추가 -- END
                        case PosKey.MENU_KEY.ONLINE_COUPONS:	    //온라인 쿠폰(중국)
                            PayOnLineCoupon(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.PREPAID_CARDS:	        //선불카드
                            PayPrepaidCard(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.HAPPY_GIFTCARD:	    //해피기프트 사용              
                            PayHappyGift(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.RESERVATION:	        //예약
                            RegPayReservations();
                            break;
                        case PosKey.MENU_KEY.SERVICE_CHARGE:	    //Service Charge
                            RegServiceChrge(sFuncCode);
                            break;
                        //case PosKey.MENU_KEY.PAYMENT_CANCELED:	    //결제 취소
                        //    break;
                        //case PosKey.MENU_KEY.ADDITIONAL_ORDERS:	    //추가주문
                        //    break;
                        case PosKey.MENU_KEY.ESC_PREVIOUS:	        //이전						                    
                            break;
                        case PosKey.MENU_KEY.SAMSUNG_SFC:           //삼성카드 제휴할인 SFC
                            PaySamsungFamilyCard(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.BUNDLE_ITEM:           //묶음상품/쇼킹박스
                            BundleiTem(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.OURHOME:               //아워홈
                            PayOurHome(PosKey.MENU_KEY.OURHOME);
                            break;
                        case PosKey.MENU_KEY.ORDER_CALLCENTER:      // 배달(콜센터)
                        case PosKey.MENU_KEY.ORDER_BAEMIN:          // 배달(배달의민족)
                        case PosKey.MENU_KEY.ORDER_YOGIYO:          // 배달(요기요)(2017.05.15)
                            PayOrderDelivery(sFuncCode);
                            break;
                        case PosKey.MENU_KEY.VIP_POINT:             // 베트남 신용카드(VIP POINT) - 프리픽스 캠페인 적용
                            PayVipPoint(sFuncCode);
                            break;
                        //#20170731, 해피기프트카드(코나머니) 개발 Start, srlee
                        case PosKey.MENU_KEY.HPGIFTCARD:            // 해피기프트카드(코나머니)
                            PayHappyGiftCard(sFuncCode);
                            break;
                        //#20170731, 해피기프트카드(코나머니) 개발 End, srlee
                        // 제휴카드(통합) 할인 처리(2017.08.29) -- START
                        case PosKey.MENU_KEY.MOBILE_UNITY:
                            PayPointMobileUnity(sFuncCode);
                            break;
                        // 제휴카드(통합) 할인 처리(2017.08.29) -- END
                        //#20180202 인천공항 VIP 라운지 기능미사용으로 주석처리 start,phj
                        /*
                        case PosKey.MENU_KEY.AIRPORT_VIP_LOUNGE:
                            PayInCheonVipLounge(sFuncCode, sInputData);
                            break;
                        */
                        //#20180202 인천공항 VIP 라운지 기능미사용으로 주석처리 end,phj

                        //grayber@20180208 코레일 마일리지 입력 start - 메뉴키 기능 추가
                        case PosKey.MENU_KEY.KORAIL_MILEAGE:
                            PayKorailMileage(sFuncCode, sInputData);
                            break;
                        //grayber@20180208 코레일 마일리지 입력 end

                        default:
                            if (WinSale.ExecuteBinessRun(sFuncCode) == UserCom.RST_IGNORE)
                            {
                                //
                            }
                            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);
            }
        }

        #endregion

        #region  PayHappyPoint  해피포인트 적립 카드 등록
        /// <summary>
        /// 해피포인트 적립 카드 등록
        /// </summary>       
        private void PayHappyPoint(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // 포인트카드 등록 여부 체크(포인트 카드는 한장만 등록 가능)
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                    // 해피포인트 - 중국   
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA) return;
                    // 해피포인트 - 한국
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT) return;
                    // OKCASHBACK
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE) return;
                }

                if (m_cTrnStatus.Sale.RecvedPayAmt > 0)
                {
                    // 모바일쿠폰 등록 후 해피포인트 등록 처리(2017.08.28) -- START
                    ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                    foreach (Column.TR_PAYMENT.DATA cPayItem in alPayItem)
                    {
                        if (cPayItem.CANCEL_DIV != PosConst.CANCEL_DIV.NORMAL) continue;
                        if (cPayItem.PAY_DTL_CD_05 != PosConst.PAY_DC_TYPE.PAY) continue;       // 할인결제구분 (1:결제, 2:할인)

                        if (cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.MOBILECON_ITEM)
                        {
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0392);
                            return;
                        }
                    }

                    // OLD
                    //WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0392);
                    //return;
                    // 모바일쿠폰 등록 후 해피포인트 등록 처리(2017.08.28) -- END
                }

                if (PosMstManager.GetPosOption(POS_OPTION.OPT316) == "0")   // 해피포인트 업무 사용 여부(0:사용안함, 1:사용함(한국), 2:사용함(중국))
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0364);
                    return;
                }

                // 해피포인트 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_HAPPY_POINT, sMenuKey, "0" });

                if (sRet != UserCom.RST_OK) return;

                //#20180413 웰컴카드 신규기능 추가 start,phj
                //-----------------------------------------------------------------
                // 해피앱 고객이고 HP회원번호 존재하고 HP웰컴카드 번호가 존재 시 
                // 웰컴카드 할인적용 할 것인지 안내팝업 오픈!!
                //-----------------------------------------------------------------

                if (PosMstManager.GetPosOption(POS_OPTION.OPT516) == "1")
                {
                    string m_HPWccCard = "";
                    string m_HPCustNo = "";
                    bool bWccInfoCheck = false;
                    bool bMobileDcCheck = false;

                    #region 웰컴카드 할인조건이 되는지 체크!
                    ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                    foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                    {
                        if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;
                        if (cEtcItem.ETC_WAY_CD != ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 != ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT) continue;

                        //#20180607 해피 조회 응답에 웰컴카드 번호만 내려오면 무조건 제휴할인 적용 start
                        //if (cEtcItem.OCCUR_ENTRY_12 != "Y") continue; //해피앱여부
                        //if (cEtcItem.OCCUR_ENTRY_10 == "") continue;  //HP회원번호
                        //#20180607 해피 조회 응답에 웰컴카드 번호만 내려오면 무조건 제휴할인 적용 end

                        //HP회원번호
                        m_HPCustNo = CmUtil.MidH(cEtcItem.OCCUR_ENTRY_10, 0, 10).Trim();
                        //HP웰컴카드
                        m_HPWccCard = cEtcItem.OCCUR_ENTRY_19;
                        
                        //#20180607 해피 조회 응답에 웰컴카드 번호만 내려오면 무조건 제휴할인 적용 start
                        //기존
                        //if (m_HPCustNo != "" && m_HPWccCard != "") { bWccInfoCheck = true; }
                        //변경
                        if (m_HPWccCard != "") { bWccInfoCheck = true; }
                        //#20180607 해피 조회 응답에 웰컴카드 번호만 내려오면 무조건 제휴할인 적용 end

                        break;
                    }
                    #endregion

                    #region 제휴할인 적용된 건이 있는지 체크!
                    if (bWccInfoCheck == true)
                    {
                        ArrayList alPays = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                        for (int iRow = 0; iRow < alPays.Count; iRow++)
                        {
                            Column.TR_PAYMENT.DATA cPayItem = (Column.TR_PAYMENT.DATA)alPays[iRow];
                            if (cPayItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;
                            if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.MOBILE_COM_POINT)
                            {
                                bMobileDcCheck = true;
                                break;
                            }
                        }
                    }
                    #endregion

                    #region 웰컴카드 할인적용!
                    if (bWccInfoCheck == true && bMobileDcCheck == false)
                    {
                        //if (WinManager.QuestionMessage("웰컴할인 적용 하시겠습니까?") == true)
                        //if (WinManager.QuestionMessage(MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1139)) == true)
                        if (WinManager.QuestionMessage(MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1139), MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1138)) == true)
                        {
                            frmPntMobileUnity frmPntMobileUnity = new frmPntMobileUnity("Initial");
                            string _strCardDiv = frmPntMobileUnity.SelectMobileUnityKind(m_HPWccCard);

                            m_cPosStatus.Sale.strMobileUnityCardNo = m_HPWccCard; // 웰컴카드번호!
                            m_cPosStatus.Sale.strHappyPointCardNo_Title = _strCardDiv; // 웰컴카드구분자!

                            //--------------------------------------
                            // 제휴카드 상태바 표시을 위한 배열 설정
                            //--------------------------------------
                            #region 제휴카드 상태바 표시를 위한 배열 설정
                            if (m_cPosStatus.Sale.strPriorReading_Title[0] == null || m_cPosStatus.Sale.strPriorReading_Title[0] == "")
                            {
                                //--------------------------------------------------------
                                // 만약 첫번째로 리딩된 해피포인트 및 제휴카드가 없을 경우
                                // -> 그대로 입력한다.
                                //--------------------------------------------------------
                                m_cPosStatus.Sale.strPriorReading_Title[0] = m_cPosStatus.Sale.strHappyPointCardNo_Title;
                            }
                            else if (m_cPosStatus.Sale.strPriorReading_Title[1] == null || m_cPosStatus.Sale.strPriorReading_Title[1] == "")
                            {
                                //-------------------------------------------------------------------
                                // 만약 두번째로 리딩된 해피포인트 및 제휴카드가 없을 경우
                                // -> 두번째에 해피포인트를 입력한다.
                                // 단, 첫번째로 리딩된 제휴카드가 있을 경우 이전 제휴카드를 치환한다.
                                //-------------------------------------------------------------------
                                if (m_cPosStatus.Sale.strPriorReading_Title[0] != "HPC")
                                {
                                    m_cPosStatus.Sale.strPriorReading_Title[0] = m_cPosStatus.Sale.strHappyPointCardNo_Title;
                                }
                                else
                                {
                                    m_cPosStatus.Sale.strPriorReading_Title[1] = m_cPosStatus.Sale.strHappyPointCardNo_Title;
                                }
                            }
                            else
                            {
                                //----------------------------------------------------------------
                                // 만약 첫번째, 두번째로 리딩한 해피포인트 및 제휴카드가 있을 경우
                                // 이전 제휴카드를 치환한다.
                                //----------------------------------------------------------------
                                if (m_cPosStatus.Sale.strPriorReading_Title[0] != "HPC")
                                {
                                    m_cPosStatus.Sale.strPriorReading_Title[0] = m_cPosStatus.Sale.strHappyPointCardNo_Title;
                                }
                                else
                                {
                                    m_cPosStatus.Sale.strPriorReading_Title[1] = m_cPosStatus.Sale.strHappyPointCardNo_Title;
                                }
                            }
                            #endregion

                            //if (pnlPayMainBack.Visible == true)
                            //{
                            //    #region '해피포인트' 및 '제휴할인 카드' 화면을 표시한다.
                            //    #region 만약 제휴할인 카드 값이 설정되어 있을 경우 제휴할인 카드 화면을 표시한다.
                            //    if (m_cPosStatus.Sale.strMobileUnityCardNo != "")
                            //    {
                            //        // 제휴할인 카드(00292) 화면 표시 -----
                            //        fSalMain.PayComFuncion(PosKey.MENU_KEY.MOBILE_UNITY, "2");
                            //    }
                            //    #endregion
                            //    #endregion
                            //}

                            if (m_cPosStatus.Sale.strMobileUnityCardNo != "")
                            {
                                if ((m_cTrnStatus.Sale.RemainPayAmt == 0 && PosMstManager.GetPosOption(POS_OPTION.OPT322) == "1") ||
                                    (m_cTrnStatus.Sale.RemainPayAmt == 0 && m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.PAY_DOING))
                                {
                                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0569);
                                    return;
                                }

                                //키유효성 체크
                                if (m_cDataCommon.FunctionKeyValidity(PosKey.MENU_KEY.MOBILE_UNITY) == false)
                                {
                                    WinManager.ConfirmMessage("(" + PosKey.MENU_KEY.MOBILE_UNITY + ") " + MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0054));
                                    return;
                                }

                                // 제휴할인 카드(00292) 화면 표시 -----
                                PayMainProc(PosKey.MENU_KEY.MOBILE_UNITY, "2");
                            }
                        }
                    }
                    #endregion
                } 
                //#20180413 웰컴카드 신규기능 추가 end,phj

                // 디지털메뉴보드 I/F
                //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 start
                //기존
                //if (m_cPosStatus.Base.DmbIf == "1")
                //변경
                //if (m_cPosStatus.Base.DmbIf == "1" &&
                //    PosMstManager.GetPosOption(POS_OPTION.OPT554) != "1")
                ////#16569 파스쿠찌 드라이브 스루 기능 개발 요청 end
                //{
                //    ArrayList alTrEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                //    foreach (Column.TR_ETC.DATA cEtcItem in alTrEtc)
                //    {
                //        if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                //        if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                //        {
                //            //#20180821 해피포인트 고객이름 마스킹 start
                //            if (cEtcItem.HP_CUST_NAME != "") { cEtcItem.HP_CUST_NAME = m_cDataCommon.NameMasking(cEtcItem.HP_CUST_NAME); }
                //            //#20180821 해피포인트 고객이름 마스킹 end

                //            // 디지털메뉴보드 I/F
                //            IDataServiceUs cDigitalMenuBoard = (IDataServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_BASIC.DLL, ServiceLists.BSV_BASIC.DMB_IF);
                            
                //            // 포인트조회
                //            cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.POINT_INFO    // 전문 구분
                //                                               , "HPC"                                  // POINT_DIV
                //                                               , cEtcItem.OCCUR_ENTRY_12                // APP_DIV (Y:HPC APP, N:그 외)
                //                                               , "1"                                    // DIV(1:조회, 2:적립, 3:할인, 4:사용 ...)
                //                                               , ""                                     // AMOUNT(포인트사용금액)
                //                                               , ""                                     // POINT(적립,할인,사용포인트)
                //                                               , ""                                     // R_POINT(잔여포인트)
                //                                               , ""                                     // 
                //                                               , cEtcItem.OCCUR_ENTRY_01                // CARD_NO(마스킹 된 카드 번호)
                //                                               , cEtcItem.HP_CUST_NAME                  // CUST_NAME(고객명)
                //                                               , "" });                                 // CAMPAIGN_INFO
                //            break;
                //        }
                //    }
                //}



                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                //cFormSaleMain.DisplayItem(0, false);

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region  PayOkCashbackSave  OKCASHBACK 적립 카드 등록
        /// <summary>
        /// OKCASHBACK 적립 카드 등록
        /// </summary>       
        private void PayOkCashbackSave(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // 포인트카드 등록 여부 체크(포인트 카드는 한장만 등록 가능)
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                    // 해피포인트 - 중국   
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA) return;
                    // 해피포인트 - 한국
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT) return;
                    // OKCASHBACK
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE) return;
                }

                if (m_cTrnStatus.Sale.RecvedPayAmt > 0)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0392);
                    return;
                }

                // OCB 적립 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_OCB_SAVE, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                //cFormSaleMain.DisplayItem(0, false);

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region PayPointMobileCom 통신사 할인 처리
        /// <summary>
        /// 통신사 할인 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void PayPointMobileCom(string sMenuKey)
        {
            double nDestAmt = 0;
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                if (m_cPosStatus.Mst.CorpDiv == ItemConst.CORP_DIV.PC)
                {
                    ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                    foreach (Column.TR_PAYMENT.DATA cPayItem in alPayItem)
                    {
                        if (cPayItem.CANCEL_DIV != PosConst.CANCEL_DIV.NORMAL) continue;

                        //#20171012 해피포인트 사용 후 통신사 할인 중복 가능 start
                        //기존
                        //if (cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.MOBILECON_ITEM)     // 통신사할인 모바일쿠폰과 중복 가능
                        //변경
                        if ((cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.MOBILECON_ITEM) &&
                            ((cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.POINT_ITEM) || (cPayItem.PAY_DTL_CD_01 != ItemConst.TR_ITEM_ID.POINT_USE.HAPPY_POINT)))
                        //#20171012 해피포인트 사용 후 통신사 할인 중복 가능 end
                        {
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0392);
                            return;
                        }
                    }
                }
                else
                {
                    if (m_cTrnStatus.Sale.RecvedPayAmt > 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0392);
                        return;
                    }
                }

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                if (sMenuKey == PosKey.MENU_KEY.KT_VIP)
                {
                    // KTVIP는 BR만 사용 가능
                    if (m_cPosStatus.Mst.CorpDiv != ItemConst.CORP_DIV.BR)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0364);
                        return;
                    }

                    // 브랜드 코드 체크
                    if (m_cPosStatus.Base.BrandCd != PosConst.MST_BRAND_CODE.BR_BR && m_cPosStatus.Base.BrandCd != PosConst.MST_BRAND_CODE.BR_DD)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0364);
                        return;
                    }

                    // 통신사 VIP 증정 대상 금액 획득
                    nDestAmt = m_cDataCommon.SrarchTermCoopCmpDcItem(ItemConst.TR_ITEM_ID.MOBILE_COM_POINT, ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_KT_VIP, "");
                    if (nDestAmt <= 0)
                    {
                        //#11155_[DD] KT 더블할인 프로모션 개발 요청_hs
                        //if (m_cPosStatus.Base.BrandCd == PosConst.MST_BRAND_CODE.BR_BR)
                        //{
                        // KT멤버십 더블할인 체크
                        nDestAmt = m_cDataCommon.SrarchTermCoopCmpDcItem(ItemConst.TR_ITEM_ID.MOBILE_COM_POINT, ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_KT_DOUBLE, "");
                        sMenuKey = PosKey.MENU_KEY.KT_DOUBLE;
                        //}
                        if (nDestAmt <= 0)
                        {
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0154);
                            return;
                        }
                    }
                }
                else
                {
                    // 통신사 할인 대상 상품 체크
                    nDestAmt = m_cDataService.GetPluTagetAmount(sMenuKey);
                    if (nDestAmt < 0)
                    {
                        // 캠페인 중복 불가(캠페인과 통신사 할인 중 선택)
                        ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                        double nCampAmt = 0;
                        foreach (Column.TR_PLU.DATA cPluItem in aSaleItem)
                        {
                            if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cPluItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;      // 지정취소
                            if (cPluItem.BILLSPR_NO != m_cTrnStatus.Sale.BillSplitNo) continue;                                                             // 빌분리번호

                            nCampAmt = CmUtil.DoubleAdd(nCampAmt, cPluItem.CPI_DC_AMT);
                        }
                        string sMessage = string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0370), m_cPosStatus.Global.NumericTOCurrency(nCampAmt));
                        if (WinManager.QuestionMessage(sMessage) == false) return;

                        // 캠페인 취소 처리
                        ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                        cCampaingMain.ClearCampaignAmt();

                        // 상품 합계금액 계산(거래해더)
                        m_cDataService.UpdatePluAmount();

                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                        cFormSaleMain.DisplayItem(1, false);
                        cFormSaleMain.DisplayPayment();           // 결제등록정보 화면표시
                    }
                    else if (nDestAmt == 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0134);
                        return;
                    }
                }

                // 통신사 할인 화면
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_MOBILE_COM, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        #endregion

        #region SPCEmployeeDC SPC 임직원 할인 처리
        /// <summary>
        ///  SPC 임직원 할인 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void SPCEmployeeDC(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                //// SPC 임직원 할인 등록 여부 체크
                //ArrayList alPayment = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                //foreach (Column.TR_PAYMENT.DATA cPayItem in alPayment)
                //{
                //    if (cPayItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                //    // SPC 임직원 할인
                //    if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.EMP_DC_ITEM) return;
                //}

                if (sMenuKey == PosKey.MENU_KEY.SPC_EMPLOYEES_PAY)
                {
                    // SPC 임직원 결제화면 
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_EMP, sMenuKey });
                    if (sRet != UserCom.RST_OK) return;
                }
                else
                {
                    // SPC 임직원 할인 화면 
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_DC_EMP, sMenuKey });
                    if (sRet != UserCom.RST_OK) return;

                    //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    //cFormSaleMain.DisplayItem(0, false);
                }

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region SPCEmployeeDC SPC 임직원 할인 - 중국 처리
        /// <summary>
        ///  SPC 임직원 할인 - 중국 처리 
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void SPCEmployeeDC_China(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // SPC 임직원 할인 - 중국 화면 
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_DC_EMP_CHINA, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region TotalDC 전체 할인 처리
        /// <summary>
        ///  전체 할인 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void TotalDC(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // 전체 금액/% 할인
                if (sMenuKey == PosKey.MENU_KEY.TOTAL_DC_RATE || sMenuKey == PosKey.MENU_KEY.TOTAL_DC_AMT)
                {
                    if (m_cTrnStatus.Sale.RecvedPayAmt > 0)
                    {
                        // 임의 할인 중복 등록 체크(받은금액이 있으면 결제할인 안됨)
                        WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0112);
                        return;
                    }
                }

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                // 임의 할인 중복 등록 불가 체크
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                for (int iRow = 0; iRow < aSaleItem.Count; iRow++)
                {
                    Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iRow];
                    if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cSaleItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;// 지정취소

                    if (sMenuKey == PosKey.MENU_KEY.TOTAL_DC_AMT || sMenuKey == PosKey.MENU_KEY.TOTAL_DC_RATE)
                    {
                        if (cSaleItem.ITEM_DC_AMT > 0)
                        {
                            if (cSaleItem.DC_DIV != ItemConst.PLU_DC_DIV.NORMAL
                                && cSaleItem.DC_DIV != ItemConst.PLU_DC_DIV.IN_DC_TOTAMT && cSaleItem.DC_DIV != ItemConst.PLU_DC_DIV.IN_DC_TOTRATE)
                            {
                                WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0113);  // 기존 할인을 취소후 시도하여 주시기 바랍니다.
                                return;
                            }
                        }
                    }
                    else if (sMenuKey == PosKey.MENU_KEY.TOTAL_ADDDC_AMT)
                    {
                        if (cSaleItem.ETC_DC_AMT > 0)
                        {
                            if (cSaleItem.ETC_DC_DIV != ItemConst.PLU_DC_DIV.NORMAL && cSaleItem.ETC_DC_DIV != ItemConst.PLU_DC_DIV.IN_DC_ADDAMT)
                            {
                                WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0113);  // 기존 할인을 취소후 시도하여 주시기 바랍니다.
                                return;
                            }
                        }
                    }
                }

                // 전체 할인 화면
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_DC_TOTAL, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                //cFormSaleMain.DisplayItem(0, false);    

                CheckSaleComplete();                    // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region PayDcMstToDc 결제할인 마스터 참조 할인 처리
        /// <summary>
        ///  결제할인 마스터 참조 할인 처리(카이스트할인, 해피오더사전예약할인)(2017.05.15)
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void PayDcMstToDc(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                if (sMenuKey == PosKey.MENU_KEY.KAIST_DC)   // 카이스트 할인     
                {
                    if (m_cTrnStatus.Sale.RecvedPayAmt > 0)
                    {
                        // 임의 할인 중복 등록 체크(받은금액이 있으면 결제할인 안됨)
                        WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0112);
                        return;
                    }
                }

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                // 임의 할인 중복 등록 불가 체크
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                for (int iRow = 0; iRow < aSaleItem.Count; iRow++)
                {
                    Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iRow];
                    if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cSaleItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;// 지정취소

                    if (sMenuKey == PosKey.MENU_KEY.KAIST_DC)    //카이스트 할인 
                    {
                        if (cSaleItem.ITEM_DC_AMT > 0)
                        {
                            if (cSaleItem.DC_DIV != ItemConst.PLU_DC_DIV.KAIST_DC)   // 카이스트 할인
                            {
                                WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0113);  // 기존 할인을 취소후 시도하여 주시기 바랍니다.
                                return;
                            }
                        }
                    }
                    else if (sMenuKey == PosKey.MENU_KEY.HPORDER_REVDC)       // 해피오더사전예약할인
                    {
                        if (cSaleItem.ETC_DC_AMT > 0)
                        {
                            if (cSaleItem.ETC_DC_DIV != ItemConst.PLU_DC_DIV.HPORDER_REVDC)  // 해피오더사전예약할인
                            {
                                WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0113);  // 기존 할인을 취소후 시도하여 주시기 바랍니다.
                                return;
                            }
                        }
                    }
                }

                // 카이스트 할인, 해피오더사전예약할인(2017.05.15)
                IPaymentUs cPaySvr = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.PAYDCMST_TO_DC);

                sRet = cPaySvr.SetPayment(new string[] { sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();                    // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region CouponDC 쿠폰할인 처리
        /// <summary>
        ///  쿠폰할인 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void CouponDC(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                if (sMenuKey == PosKey.MENU_KEY.DC_COUPONS)
                {
                    // 쿠폰할인 화면
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_DC_COUPON, sMenuKey });
                }
                else if (sMenuKey == PosKey.MENU_KEY.PAY_INSTOR_DC)
                {
                    // 입점매장직원할인 화면
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_INSTOR_DC, sMenuKey });
                }
                else if (sMenuKey == PosKey.MENU_KEY.PAY_INSTOR_PAY)
                {
                    // 기타결제 화면
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_INSTOR_PAY, sMenuKey });
                }
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region iNStorDC 입점매장직원할인 처리
        /// <summary>
        ///  입점매장직원할인 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void iNStorDC(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                if (sMenuKey == PosKey.MENU_KEY.PAY_INSTOR_DC || sMenuKey == PosKey.MENU_KEY.PAY_INSTOR_DC_5)
                {
                    // 입점매장직원할인 화면
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_INSTOR_DC, sMenuKey });
                }
                else if (sMenuKey == PosKey.MENU_KEY.PAY_INSTOR_PAY)
                {
                    // 기타결제
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_INSTOR_PAY, sMenuKey });
                }
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region CakeChange 케익교환권 할인 처리
        /// <summary>
        ///  케익교환권 할인 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void CakeChange(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // 케익교환권 할인 화면
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_DC_CAKE_VOUCHERS, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region SeveranceDC 세브란스병원 임직원 할인 처리
        /// <summary>
        ///  세브란스병원 임직원 할인 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void SeveranceDC(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                if (sMenuKey == PosKey.MENU_KEY.SEVERANCE_PAYMENTS)
                {
                    // 세브란스병원 임직원 결제 화면
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_SEVERANCE, sMenuKey });
                }
                else if (sMenuKey == PosKey.MENU_KEY.SEVERANCE_DC)
                {
                    // 세브란스병원 임직원 할인 화면
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_SEVERANCE_DC, sMenuKey });
                }
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region PayPointMemberUse OK CashBack/ OIL BANK/ BLUE / RED 포인트 사용
        /// <summary>
        /// OK CashBack/ OIL BANK/ BLUE / RED 포인트 사용  
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <param name="sAppType"></param>
        /// <param name="iPaycnt"></param>
        private void PayPointMemberUse(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);

                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        if (!sMenuKey.Equals(PosKey.MENU_KEY.OKCASHBACK))
                        {
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                            return;
                        }
                    }
                }

                if (sMenuKey == PosKey.MENU_KEY.HAPPY_POINT_USE || sMenuKey == PosKey.MENU_KEY.HAPPY_POINT_USE_CHINA)
                {
                    // 해피포인트 사용
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_HAPPY_POINT_USE, sMenuKey });
                }
                else
                {
                    // 제휴 포인트 사용
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_MEMBERS_USE, sMenuKey });
                }
                if (sRet != UserCom.RST_OK) return;

                // 디지털메뉴보드 I/F
                //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 start
                //기존
                //if (m_cPosStatus.Base.DmbIf == "1")
                //변경
                //if (m_cPosStatus.Base.DmbIf == "1" &&
                //    PosMstManager.GetPosOption(POS_OPTION.OPT554) != "1")
                ////#16569 파스쿠찌 드라이브 스루 기능 개발 요청 end
                //{
                //    ArrayList alTrPay = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                //    Column.TR_PAYMENT.DATA cPayItem = (Column.TR_PAYMENT.DATA)alTrPay[alTrPay.Count - 1];

                //    if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.POINT_ITEM && cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.POINT_USE.HAPPY_POINT)
                //    {
                //        // 디지털메뉴보드 I/F
                //        IDataServiceUs cDigitalMenuBoard = (IDataServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_BASIC.DLL, ServiceLists.BSV_BASIC.DMB_IF);
                //        // 포인트조회
                //        cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.POINT_INFO    // 전문 구분
                //                                                , "HPC"                                  // POINT_DIV
                //                                                , cPayItem.OCCUR_ENTRY_12                // APP_DIV (Y:HPC APP, N:그 외)
                //                                                , "4"                                    // DIV(1:조회, 2:적립, 3:할인, 4:사용 ...)
                //                                                , cPayItem.PAY_AMT.ToString()            // AMOUNT(포인트사용금액)
                //                                                , cPayItem.AMT_ENTRY_01.ToString()       // POINT(적립,할인,사용포인트)
                //                                                , cPayItem.AMT_ENTRY_05.ToString()       // R_POINT(잔여포인트)
                //                                                , ""                                     // 
                //                                                , cPayItem.OCCUR_ENTRY_01                // CARD_NO(마스킹 된 카드 번호)
                //                                                , ""                                     // CUST_NAME(고객명)
                //                                                , "" });                                 // CAMPAIGN_INFO
                //    }
                //}

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region PayAliPay 알리페이
        /// <summary>
        /// 알리페이  
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <param name="sAppType"></param>
        /// <param name="iPaycnt"></param>
        private void PayAliPay(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;


                // 알리페이
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_ALIPAY, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region WeChatPay 위챗페이
        /// <summary>
        /// 위챗페이  
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <param name="sAppType"></param>
        /// <param name="iPaycnt"></param>
        private void WeChatPay(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;


                // 위챗페이
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_WECHATPAY, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region #20170911.001, 중국 위쳇 페이 바이롱과 연동 개발 Start, girak.kim
        /// <summary>
        /// 위챗페이  -  바이롱 
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <param name="sAppType"></param>
        /// <param name="iPaycnt"></param>
        //  girak.kim; 2017.09.11.001
        private void WeChatPay_BaiRong(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;


                // 위챗페이
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_WECHATPAY_BAIRONG, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion


        #region #20170911.001, 중국 샤오청쉬 기프트카드 바이롱과 연동 개발 Start, girak.kim
        /// <summary>
        /// 중국 샤오청쉬 기프트카드  -  바이롱 
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <param name="sAppType"></param>
        /// <param name="iPaycnt"></param>
        //  girak.kim; 2017.09.11.001
        private void XiaoChengxu_GiftCard(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;


                // 위챗페이
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_XIAOCHENGXU_GIFTCARD, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion



        #region SmilePay 스마일페이
        /// <summary>
        /// 스마일페이  
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <param name="sAppType"></param>
        /// <param name="iPaycnt"></param>
        private void SmilePay(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;


                // 스마일페이
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_SMILEPAY, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region  PayHappyPointCouopn  해피포인트 쿠폰
        /// <summary>
        /// 해피포인트 쿠폰
        /// </summary>       
        private void PayHappyPointCouopn(string sMenukey, string sSelRow)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                // 해피포인트 쿠폰 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_HPCOUPON, sMenukey, sSelRow });
                if (sRet != UserCom.RST_OK) return;

                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);    // 판매화면
                //cFormSaleMain.DisplayItem(1, false);        // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        /// <summary>
        /// T 페이 
        /// </summary>
        private void PayTPay()
        {
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                #region 통신사(SKT) 할인 가능여부 체크

                // 통신사(SKT) 할인 대상금액
                var destAmt = 0.0;

                // 받은금액이 있으면 통신사(SKT) 할인불가(통합결제 불가)
                if (m_cTrnStatus.Sale.RecvedPayAmt > 0) destAmt = -1;

                // 결제할인 마스터의 결제할인 중복 가능 여부 체크, 중복이 불가능 하면, 할인불가 (통합결제 불가)
                var payWayCd = m_cDataCommon.GetMenuKeyToPayWayCd(PosKey.MENU_KEY.SKT);
                var payDtlCd = m_cDataCommon.GetMenuKeyToPayDtlCd(PosKey.MENU_KEY.SKT);
                if (m_cDataCommon.PayDcDuplicationCheck(payWayCd, payDtlCd, false) == false) destAmt = -1;

                // SKT 할인 미사용 매장이면(기능키 확인), 할인불가(통합결제 불가)
                //DataTable dt = m_cDataCommon.SeletFuncKeyGroup(PosKey.MENU_KEY.PAY_DC_MENU);
                DataTable dt = m_cDataCommon.SeletFuncKeyGroup("");
                if (dt == null || dt.Rows.Count == 0)
                {
                    destAmt = -1;
                }
                else
                {
                    DataRow[] dr = dt.Select("FUNC_ID = '" + PosKey.MENU_KEY.SKT + "'");
                    destAmt = (dr == null || dr.Length == 0) ? -1 : 0;
                }

                // 통신사 할인 대상 상품 체크
                if (destAmt == 0)
                {
                    // 할인대상금액 조회 
                    destAmt = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.SKT);
                    if (destAmt < 0)
                    {
                        // 캠페인 중복 불가(캠페인과 통신사 할인 중 선택)
                        ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                        double nCampAmt = 0;
                        foreach (Column.TR_PLU.DATA cPluItem in aSaleItem)
                        {
                            if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cPluItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;      // 지정취소
                            if (cPluItem.BILLSPR_NO != m_cTrnStatus.Sale.BillSplitNo) continue;                                                             // 빌분리번호

                            nCampAmt = CmUtil.DoubleAdd(nCampAmt, cPluItem.CPI_DC_AMT);
                        }
                        string sMessage = string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0370), m_cPosStatus.Global.NumericTOCurrency(nCampAmt));
                        if (WinManager.QuestionMessage(sMessage) == false) return;

                        // 캠페인 취소 처리
                        ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                        cCampaingMain.ClearCampaignAmt();

                        // 상품 합계금액 계산(거래해더)
                        m_cDataService.UpdatePluAmount();

                        // 결제등록정보 화면표시
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                        cFormSaleMain.DisplayPayment();

                        // 할인대상금액 재 조회 
                        destAmt = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.SKT);
                    }
                }

                // OCB 적립 후 SKT 할인 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        destAmt = 0;
                    }
                }
                #endregion

                // T 페이
                string sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_TPAY, PosKey.MENU_KEY.T_PAY, destAmt.ToString() });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 현금 결제 처리
        /// </summary>
        private void PayCash(string sMenuKey, string sInputData)
        {
            try
            {
                //#20171227 인천공항 포스연동 start, phj
                if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1")
                {
                    //WinManager.ConfirmMessage("인천공항 연동POS 입니다. 사용할 수 없습니다.");
                    WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0745);
                    return;
                }
                //#20171227 인천공항 포스연동 end, phj

                string sRet = UserCom.RST_ERR;

                // -------------------------------------------------------------------------------------------
                // 세브란스 직원식 상품 체크
                // -------------------------------------------------------------------------------------------
                sRet = SeveranceiTemCheck(sMenuKey);
                if (sRet != UserCom.RST_OK) return;
                // -------------------------------------------------------------------------------------------

                //기존소스
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) start
                // 돈통 오픈 처리
                //m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리                    
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) end

                //#2018.01.25.001;미국과 그 외 국가의 경우 현금 결제 시 돈통 열리는 시점이 다르게 처리;girak.kim
                if (!m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                // 현금 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_CASH, sMenuKey, sInputData });
                if (sRet != UserCom.RST_OK) return;

                //#2018.01.25.001;미국의 경우 현금 결제 시 돈통 열리는 시점이 현금 결제 후 돈통 열리게 처리;girak.kim
                if (m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        //170811 dkshin 돈통 오픈 처리 시점 변경(현금영수증 전)
        #region 거래 완료 돈통 열림 체크
        /// <summary>
        /// 거래 완료 돈통 열림 체크
        /// </summary>
        /// <returns></returns>
        private bool FinishTradeOpenDrawer()
        {
            return FinishTradeOpenDrawer(false);
        }

        /// <summary>
        /// 거래 완료 돈통 열림 체크
        /// </summary>
        /// <returns></returns>
        private bool FinishTradeOpenDrawer(bool bDutchPay)
        {

            bool bOpenDrawer = false;

            try
            {
                if (m_cPosStatus.Base.TrainingFlag != "1")  //연습모드가 아니면...
                {
                    // 판매완료시 돈통열림 설정(0:안열림, 1:현금성거래만, 2:전체열림)
                    string sOpt = CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT021), "1");

                    //UserLog.WriteLogFile(UserCom.LOG_DEBUG, UserCom.WARNING_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    //    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "sOpt : " + sOpt);


                    if (sOpt == "1")    //현금성 거래만
                    {
                        ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                        foreach (Column.TR_PAYMENT.DATA cPayItem in alPayItem)
                        {
                            if (cPayItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;

                            if (bDutchPay == true)  //더치페이 체크
                            {
                                if (cPayItem.DutchPayPrtDiv == "1") continue;
                            }

                            switch (cPayItem.PAY_WAY_CD)
                            {
                                case ItemConst.TR_ITEM_ID.CASH_ITEM:        //현금
                                case ItemConst.TR_ITEM_ID.GIFT_ITEM:        //상품권
                                case ItemConst.TR_ITEM_ID.CHECK_ITEM:       //수표
                                case ItemConst.TR_ITEM_ID.FOREIGNEX_ITEM:	//외환
                                case ItemConst.TR_ITEM_ID.PAYETC_ITEM:	    //기타(잔액교환권, 식권)
                                    bOpenDrawer = true;
                                    break;
                            }
                            if (bOpenDrawer == true) break;
                        }
                    }
                    else if (sOpt == "2")    //전체열림
                    {
                        bOpenDrawer = true;
                    }
                }

            }
            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 bOpenDrawer;
        }

        #endregion
        /// <summary>
        /// 묶음상품/쇼킹박스
        /// </summary>
        private bool BundleiTem(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_SAL_BUNDLE_ITEM, sMenuKey });
                if (sRet != UserCom.RST_OK) return false;

                // 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                //// 판매모드 변경
                //m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                //cFormSaleMain.DisplayInit(false, true);

                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayItem(0, false);

            }
            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 true;
        }


        /// <summary>
        /// 더치페이
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <returns></returns>
        public bool DutchPay(string sMenuKey, string ReFlag)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

                // 영업일자 체크
                if (CmUtil.LongParse(m_cPosStatus.Base.SaleDate) < CmUtil.LongParse(System.DateTime.Now.ToString("yyyyMMdd")))
                {
                    if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                    {
                        DutchItemClear();
                        WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                        return false;
                    }
                }

                ICampaignUs cCampaignMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                //캠페인 초기화
                cCampaignMain.ClearCampaignAmt();
                m_cDataService.UpdatePluAmount();

                sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_DUTCH_PAY, sMenuKey, ReFlag });
                if (sRet != UserCom.RST_OK)
                {
                    DutchItemClear();
                    return false;
                }
                else
                {
                    m_cPosStatus.Sale.DutchPayFlg = "1";

                    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;

                    RegisterPayment("", "");

                    // 판매모드 변경
                    //m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.PAY_WAIT;

                    //// 판매화면
                    //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    //cFormSaleMain.ChangeSalePayMode(false);

                    //화면 초기화
                }
            }
            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 true;
        }

        /// <summary>
        /// 더치페이중 중지 상품 처리
        /// </summary>
        private void DutchItemClear()
        {
            try
            {
                // 상품 내역 불러오기
                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (alPluItem.Count > 0)
                {

                    ICampaignUs cCampaignMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);

                    //상품 캠페인 재적용
                    ICampaignUs m_cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                    cCampaignMain.ExecuteCampaignPluHappyPoint("", true, "", "", "", "");  // 상품 캠페인 계산
                    m_cDataService.UpdatePluAmount();

                    // 상품 판매가 재계산
                    m_cPluService.ItemAmountExeccute(true, true);

                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                    // 판매모드 변경
                    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                    cFormSaleMain.DisplayInit(true, true);

                    // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                    cFormSaleMain.DisplayItem(0, false);

                }

                m_cPosStatus.Sale.DutchPayFlg = "";
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }


        /// <summary>
        /// 더치페이(금액)
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <returns></returns>
        private bool DutchPayAmt(string sMenuKey, string ReFlag)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

                if (m_cPosStatus.Sale.DutchPayFlg == "2")
                {
                    if (WinManager.QuestionMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0295)) == true)
                    {
                        m_cPosStatus.Sale.DutchPayFlg = "";
                        m_cTrnStatus.Head.AmtDutchPayYn = "";
                    }
                    return true;
                }

                m_cTrnStatus.Head.AmtDutchPayYn = "1";

                m_cPosStatus.Sale.DutchPayFlg = "2";

                RegisterPayment("", "");



                //if (ReFlag == "0")
                //{
                //    m_cTrnStatus.Sale.DutchPayTotAmt = m_cTrnStatus.Head.NetSaleAmt;
                //}


                //sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_DUTCH_PAY_AMT, sMenuKey, ReFlag });
                //if (sRet == UserCom.ERROR) return false;

                //m_cPosStatus.Sale.DutchPayFlg = "2";

                //m_cTrnStatus.Sale.BillSplitNo = m_cTrnStatus.Sale.BillSplitNo + 1;  //빌분리번호

                //// 총수량, 총매출액
                //m_cTrnStatus.Head.TotSaleAmt=m_cDataService.DoubleParse(sRet);
                //// 총 할인 금액
                //m_cTrnStatus.Head.TotDcAmt=0;
                //// 받은금액 표시
                //m_cTrnStatus.Sale.RecvedPayAmt=0;
                //// 순매출액 표시 처리
                //m_cTrnStatus.Sale.RemainPayAmt = m_cDataService.DoubleParse(sRet);
                //// 넷 세일
                //m_cTrnStatus.Head.NetSaleAmt = m_cDataService.DoubleParse(sRet);

                //// 판매모드 변경
                //m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.PAY_WAIT;

                //// 판매화면
                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                //cFormSaleMain.ChangeSalePayMode(false);

                ////화면 초기화

            }
            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 true;
        }


        /// <summary>
        /// 수표 조회/결제 처리
        /// </summary>
        private void PayCheck(string sMenuKey)
        {
            //#20171227 인천공항 포스연동 start, phj
            if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1")
            {
                //WinManager.ConfirmMessage("인천공항 연동POS 입니다. 사용할 수 없습니다.");
                WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0745);
                return;
            }
            //#20171227 인천공항 포스연동 end, phj
            try
            {
                string sRet = UserCom.RST_ERR;

                // 수표 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_CHECK, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 상품권 조회
        /// </summary>
        private void PayGiftSearch(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

                // 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_GIFT_SCH, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 모바일쿠폰 조회
        /// </summary>
        private void PayMobileCouponSearch(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

                // 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_MOBILE_COUPON_SCH, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        //#20170926 일반할인 존재하고 모바일 쿠폰 사용 시 팝업 오픈 start
        private bool DC_Check(ref bool pPopup)
        {
            bool bValue = false;
            pPopup = false;

            try
            {
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                for (int iRow = 0; iRow < aSaleItem.Count; iRow++)
                {
                    Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iRow];

                    if (cSaleItem.CANCEL_DIV != "0") continue;

                    //if (cSaleItem.DC_DIV != ItemConst.PLU_DC_DIV.NORMAL) continue;// POS 할인 구분
                    //if (cSaleItem.DC_TYPE != ItemConst.PLU_DC_TYPE.NORMAL) continue;// 할인 유형(0:없음, 1:소계, 2:상품)
                    //if (cSaleItem.DC_RATE != ItemConst.PLU_DC_DIV.NORMAL) continue;// POS 할인 율
                    //if (cSaleItem.ITEM_DC_AMT != ItemConst.PLU_DC_DIV.NORMAL) continue;// POS 단품 할인 금액

                    /*
                    if ((cSaleItem.DC_RATE > 0) || (cSaleItem.ITEM_DC_AMT > 0) || (cSaleItem.SUM_DC_AMT >= 0))
                    {
                        pPopup = true;
                    }
                 
                    if (cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.NORMAL) continue;// POS 할인 구분 
                    if (cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.POS_DC) continue;// 임의할인 
                    if (cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.IN_DC_TOTAMT) continue; // 전체금액할인
                    if (cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.IN_DC_TOTRATE) continue;// 전체%할인  
                    */

                    if ((cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.NORMAL) || (cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.POS_DC) ||
                       (cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.IN_DC_TOTAMT) || (cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.IN_DC_TOTRATE))
                    {

                        if ((cSaleItem.DC_RATE > 0) || (cSaleItem.ITEM_DC_AMT > 0) || (cSaleItem.SUM_DC_AMT > 0))
                        {
                            pPopup = true;
                        }

                        continue;
                    }


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

                bValue = false;
            }

            return bValue;
        }
        //#20170926 일반할인 존재하고 모바일 쿠폰 사용 시 팝업 오픈 end

        /// <summary>
        /// 모바일쿠폰/결제 처리
        /// </summary>
        private void PayMobileCoupon(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                //#20170926 일반할인 존재하고 모바일 쿠폰 사용 시 팝업 오픈 start

                //할인 존재 시 모바일 쿠폰 사용 못함. (일반할인제외)
                bool bPopup = false;
                if (DC_Check(ref bPopup) == true) return;

                //일반할인 (%할인, 금액 할인) 존재 시 아래 팝업 오픈. 
                if (bPopup == true)
                {
                    if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0737) != true) return;
                }

                //#20170926 일반할인 존재하고 모바일 쿠폰 사용 시 팝업 오픈 end

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_MOBILE_COUPON, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 아워홈
        /// </summary>
        private void PayOurHome(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_OURHOME, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 해피 기프트
        /// </summary>
        private void PayHappyGift(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                if (sMenuKey == PosKey.MENU_KEY.HP_GIFT_CHARGED)
                // 충전
                {
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_SAL_HP_GIFT_CHARGED, sMenuKey, "" });

                }
                else if (sMenuKey == PosKey.MENU_KEY.HAPPY_GIFTCARD)
                {
                    // 사용
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_HAPPY_GIFTCARD, sMenuKey, "" });
                }
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 잔액교환권
        /// </summary>
        private void PayExchangeTicket(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                //기존 소스
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) start
                // 돈통 오픈 처리
                //m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) end

                //#2018.01.25.001;미국과 그 외 국가의 경우 현금 결제 시 돈통 열리는 시점이 다르게 처리;girak.kim
                if (!m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리


                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_BALANCE_VOUCHER, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                //#2018.01.25.001;미국의 경우 현금 결제 시 돈통 열리는 시점이 현금 결제 후 돈통 열리게 처리;girak.kim
                if (m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 외상
        /// </summary>
        private void PaySaleOnCustomer(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                //#20171016 스퀘어 점포일 때 실점포 코드로 넘기기 start, phj

                //판매 제품이 서로 다른 브랜드 일 때, 선불결제 못함.
                if (m_cPosStatus.Mst.ComplexShopType == "2")  // 0:단독매장,1:복합매장구성점포,2:복합매장점포
                {
                    if (OtherItem_DuplicateCheck() == false) return;
                }

                //#20171016 스퀘어 점포일 때 실점포 코드로 넘기기 end, phj

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_CREDIT_CUSTOMER, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 외화
        /// </summary>
        private void PayForeign(string sMenuKey)
        {
            //#20171227 인천공항 포스연동 start, phj
            if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1")
            {
                //WinManager.ConfirmMessage("인천공항 연동POS 입니다. 사용할 수 없습니다.");
                WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0745);
                return;
            }
            //#20171227 인천공항 포스연동 end, phj

            try
            {
                string sRet = UserCom.RST_ERR;

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

                // 사용여부 체크!
                if (CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT305), "0") == "0")
                {
                    WinManager.ErrorMessage(string.Format("{0}({1})", MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0414), POS_OPTION.OPT305));
                    return;
                }

                //기존소스
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) start
                // 돈통 오픈 처리
                //m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) end

                //#2018.01.25.001;미국과 그 외 국가의 경우 현금 결제 시 돈통 열리는 시점이 다르게 처리;girak.kim
                if (!m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_FOREIGN_CURRENCY, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                //#2018.01.25.001;미국의 경우 현금 결제 시 돈통 열리는 시점이 현금 결제 후 돈통 열리게 처리;girak.kim
                if (m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 티머니/캐시비
        /// </summary>
        private void PayTMoneyCashBee(string[] aPara)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                sRet = WinPay.ShowForm(aPara);
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 선불카드
        /// </summary>
        private void PayPrepaidCard(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

                //#20171016 스퀘어 점포일 때 실점포 코드로 넘기기 start, phj

                //판매 제품이 서로 다른 브랜드 일 때, 선불결제 못함.
                if (m_cPosStatus.Mst.ComplexShopType == "2")  // 0:단독매장,1:복합매장구성점포,2:복합매장점포
                {
                    if (OtherItem_DuplicateCheck() == false) return;
                }

                //#20171016 스퀘어 점포일 때 실점포 코드로 넘기기 end, phj

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

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_PREPAID_CARDS, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 선불카드 - 중국
        /// </summary>
        private void PayPrepaidCard_China(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_HPJOY, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        /// <summary>
        /// 삼성포인트
        /// </summary>
        private void PaySamSungPoint(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                // 캠페인 중복 불가(2017.06.05) => 캠페인 적용시 제휴포인트 사용 업무 불가 처리 요청
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                foreach (Column.TR_PLU.DATA cPluItem in aSaleItem)
                {
                    if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cPluItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;      // 지정취소
                    if (cPluItem.BILLSPR_NO != m_cTrnStatus.Sale.BillSplitNo) continue;                                                             // 빌분리번호

                    if (cPluItem.CPI_DC_AMT > 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0192);
                        return;
                    }
                }

                //#16745 신용카드 포인트 결제 시 해피포인트 취소되는 현상 확인요청 start
                //신한포인트는 통신사 할인과 중복 가능 하도록 수정
                //기존
                #region 기존
                /*
                // 통신사 제휴 할인 불가(2017.08.28)
                ArrayList aPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                foreach (Column.TR_PAYMENT.DATA cPayItem in aPayItem)
                {
                    if (cPayItem.CANCEL_DIV != PosConst.CANCEL_DIV.NORMAL) continue;
                    if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.MOBILE_COM_POINT &&
                        (cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_SKT ||
                         cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_KTF ||
                         cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_LGT ||
                         cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_KT_DOUBLE ||
                         //#20180413 웰컴카드 신규기능 추가 start,phj
                         cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.WELCOMECARD || 
                         //#20180413 웰컴카드 신규기능 추가 end,phj 
                         cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_KT_VIP))
                    {

                        // 이미할인이 등록되어 있습니다.
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0669);
                        return;
                    }
                }
                */
                #endregion 기존
                //변경
                #region 변경
                // 통신사 제휴 할인 불가(2017.08.28)
                if (sMenuKey != PosKey.MENU_KEY.SHINHANCARD_POINT)
                {
                    ArrayList aPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                    foreach (Column.TR_PAYMENT.DATA cPayItem in aPayItem)
                    {
                        if (cPayItem.CANCEL_DIV != PosConst.CANCEL_DIV.NORMAL) continue;
                        if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.MOBILE_COM_POINT &&
                            (cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_SKT ||
                             cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_KTF ||
                             cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_LGT ||
                             cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_KT_DOUBLE ||
                            //#20180413 웰컴카드 신규기능 추가 start,phj
                             cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.WELCOMECARD ||
                            //#20180413 웰컴카드 신규기능 추가 end,phj 
                             cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.MOBILE_COM.MOBILE_KT_VIP))
                        {

                            // 이미할인이 등록되어 있습니다.
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0669);
                            return;
                        }
                    }
                }
                #endregion 변경
                //#16745 신용카드 포인트 결제 시 해피포인트 취소되는 현상 확인요청 end

                //#14505 PB 신월곰달래 - 해피포인트 등록 후 현대M포인트 진입안되도록 수정요청 start,phj
                //카드 포인트 사용창 진입시 해피포인트 등록이 된 상태이면 안내 메세지 팝업 (예, 아니오)
                bool bHPCheck = false;
                ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                    {
                        bHPCheck = true;
                        break;
                    }
                }

                //#16745 신용카드 포인트 결제 시 해피포인트 취소되는 현상 확인요청 start
                //신한포인트는 해피포인트 적립과 중복 가능 하도록 수정
                if (sMenuKey == PosKey.MENU_KEY.SHINHANCARD_POINT)
                {
                    bHPCheck = false;
                }
                //#16745 신용카드 포인트 결제 시 해피포인트 취소되는 현상 확인요청 end

                if (bHPCheck == true)
                {
                    //#20180410 메세지 오류 수정 start,phj
                    //기존
                    //if (WinManager.QuestionMessage(POS_MESSAGE.GUIDE.MSG_0014) == false)
                    //변경
                    if (WinManager.QuestionMessage(MessageManager.GetGuideMessage(POS_MESSAGE.GUIDE.MSG_0014)) == false)
                    //#20180410 메세지 오류 수정 end,phj
                    {
                        return;
                    }
                }
                //#14505 PB 신월곰달래 - 해피포인트 등록 후 현대M포인트 진입안되도록 수정요청 end,phj


                if (sMenuKey == PosKey.MENU_KEY.SAMSUNG_POINTS)
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_SAMSUNG_POINT, sMenuKey });
                else if (sMenuKey == PosKey.MENU_KEY.WOORIMORE_POINTS)
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_WOORIMORE_POINT, sMenuKey });
                else if (sMenuKey == PosKey.MENU_KEY.HYUNDAI_M_POINTS)
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_HYUNDAI_M_POINT, sMenuKey });
                //*** MoonSeokWoo 2017.12.12 Add
                else if (sMenuKey == PosKey.MENU_KEY.SHINHANCARD_POINT)
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_SINHANCARD_POINT, sMenuKey });
                //*** MoonSeokWoo 2017.12.12 End

                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 신용카드 결제 처리
        /// </summary>
        private void PayCreditCard(string sMenuKey, string sInputData)
        {
            //#20171227 인천공항 포스연동 start, phj
            if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1")
            {
                //WinManager.ConfirmMessage("인천공항 연동POS 입니다. 사용할 수 없습니다.");
                WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0745);
                return;
            }
            //#20171227 인천공항 포스연동 end, phj
            try
            {
                string sRet = UserCom.RST_ERR;

                // -------------------------------------------------------------------------------------------
                // 세브란스 직원식 상품 체크
                // -------------------------------------------------------------------------------------------
                sRet = SeveranceiTemCheck(sMenuKey);
                if (sRet != UserCom.RST_OK) return;
                // -------------------------------------------------------------------------------------------

                // 신용카드 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_CREDITCARD, sMenuKey, "", "", sInputData });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 현금 영수증 발행
        /// </summary>
        private bool PayCashbill(string sMenukey)
        {
            double dCashBillAmt = 0;
            string sRet = UserCom.RST_ERR;

            //#20171227 인천공항 포스연동 start, phj
            if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1")
            {
                //WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0745);
                return true;
            }
            //#20171227 인천공항 포스연동 end, phj

            try
            {
                if (m_cPosStatus.Mst.CntryDiv != ItemConst.CNTRY_DIV.KR) return true;           // 한국에서만 가능(2017.05.26)

                if (PosMstManager.GetPosOption(POS_OPTION.OPT315) == "0") return true;           // 현금영수증 업무 사용 여부(0:사용안함, 1:사용함)

                if (sMenukey == PosKey.MENU_KEY.CASH_APPROVAL)
                {
                    //반품일경우
                    if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND) return true;

                    ////일반판매, 예약완료가 아닐 경우
                    //if ((m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE) != true) return;

                    dCashBillAmt = m_cDataService.GetCashAmt();

                    if (dCashBillAmt > 0)
                    {
                        //부가세 계산
                        double dTax = m_cDataService.GetPaymentAmtVAT(dCashBillAmt);

                        // 현금 화면 진행
                        sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_CASH_APPROVAL, sMenukey, dCashBillAmt.ToString(), dTax.ToString() });
                        if (sRet != UserCom.RST_OK) return false;

                    }
                }
                else
                {
                    // 수동 승인(거래후 현금수증)
                    // 거래구분 설정 => 거래후
                    m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
                    m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.AFTER.CASH_RECEIPT;

                    // 원거래 정보 설정
                    m_cTrnStatus.Head.OrgSaleDate = "";
                    m_cTrnStatus.Head.OrgPosNo = "";
                    m_cTrnStatus.Head.OrgTradeNo = "";

                    // 현금 화면 진행
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_CASH_APPROVAL, sMenukey, "0", "0" });
                    if (sRet == UserCom.RST_OK)
                    {
                        // 거래 완료 처리
                        sRet = m_cSaleComplete.PosSaleExecute(new string[] { });
                    }

                    ////사용변수 초기화                        
                    m_cDataService.TranComplete();

                    m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
                    m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.NORMAL.SALE;

                }
                return true;
            }
            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 false;
        }


        /// <summary>
        /// 삼성카드 제휴할인
        /// </summary>
        private void PaySamsungFamilyCard(string sMenuKey)
        {
            try
            {

                string sRet = UserCom.RST_ERR;

                ArrayList aPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);

                foreach (Column.TR_PAYMENT.DATA cPayItem in aPayItem)
                {

                    if (cPayItem.CANCEL_DIV != PosConst.CANCEL_DIV.NORMAL) continue;

                    if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.EMP_DC_ITEM && cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.EMP_DC.SAMSUNGCARD)
                    {

                        // 이미할인이 등록되어 있습니다.
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0669);
                        return;
                    }
                }

                if (m_cDataCommon.PayDcDuplicationCheck(ItemConst.TR_ITEM_ID.EMP_DC_ITEM, ItemConst.TR_ITEM_ID.EMP_DC.SAMSUNGCARD, true) == false) return;

                // 신용카드 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_SAMSUNG_SFC, sMenuKey });
                if (sRet == UserCom.ERROR) return;

                //승인 요청 처리


                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 식권 처리
        /// </summary>
        private void PayMealTicket(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                //기존 소스
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) start
                // 돈통 오픈 처리
                //m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) end

                //#2018.01.25.001;미국과 그 외 국가의 경우 현금 결제 시 돈통 열리는 시점이 다르게 처리;girak.kim
                if (!m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_MEAL_TICKET, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                //#2018.01.25.001;미국의 경우 현금 결제 시 돈통 열리는 시점이 현금 결제 후 돈통 열리게 처리;girak.kim
                if (m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 상품권 처리
        /// </summary>
        private void PayGift(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                //기존소스
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) start
                // 돈통 오픈 처리
                //m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) end

                //#2018.01.25.001;미국과 그 외 국가의 경우 현금 결제 시 돈통 열리는 시점이 다르게 처리;girak.kim
                if (!m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_GIFT, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                //#2018.01.25.001;미국의 경우 현금 결제 시 돈통 열리는 시점이 현금 결제 후 돈통 열리게 처리;girak.kim
                if (m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS)) m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        //#20180202 인천공항 VIP 라운지 기능미사용으로 주석처리 start,phj
        /*
        // grayber@20180115 인천공항 VIP 라운지 start - VIP 라운지 폼 실행
        /// <summary>
        /// 인천공항 VIP 라인지 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        /// <param name="sInputData"></param>
        /// <returns></returns>
        private string PayInCheonVipLounge(string sMenuKey, string sInputData)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                // grayber@20180116 VIP 라운지 옵션 처리 부분 제거 및 돈통 오픈 주석 처리 start

                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) start
                // 돈통 오픈 처리
                //m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리
                //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) end
                
                // grayber@20180116 VIP 라운지 옵션 처리 부분 제거 및 돈통 오픈 주석 처리 end

                // 현금 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_AIRPORT_VIP_LOUNGE, sMenuKey, sInputData });
                if (sRet != UserCom.RST_OK) return UserCom.RST_ERR;

                CheckSaleComplete();        // 결제완료 체크
            }
            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;
        }
        // grayber@20180115 인천공항 VIP 라운지 end
        */
        //#20180202 인천공항 VIP 라운지 기능미사용으로 주석처리 end,phj

        //grayber@20180208 코레일 마일리지 입력 start - 폼 실행 추가
        private string PayKorailMileage(string sMenuKey, string sInputData)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                // 코레일 마일리지 입력 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_KORAIL_MILEAGE, sMenuKey, sInputData });
                if (sRet != UserCom.RST_OK) return UserCom.RST_ERR;

                CheckSaleComplete();        // 결제완료 체크
            }
            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;
        }
        //grayber@20180208 코레일 마일리지 입력 end

        // <summary>
        /// 결제 완료 체크
        /// </summary>
        public string CheckSaleComplete()
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                // 적립 예정 포인트 계산
                ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                {
                    #region
                    if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;

                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                    {
                        // 해피포인트 기본적립 대상 금액 획득
                        m_cTrnStatus.Head.AftSavePoint = cEtcItem.AMT_ENTRY_08 = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.HAPPY_POINT);
                        // 캠페인(해피포인트 적립) 설정 처리
                        ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                        cCampaingMain.ExecuteCampaignHappyPointSave(PosConst.CAMPAIGN_PAY_KEY.HP_SAVE, null);

                        // 적립예정포인트
                        cEtcItem.ETC_AMT = (long)CmUtil.MathRounds(CmUtil.MathAmtPercent(cEtcItem.AMT_ENTRY_08, m_cPosStatus.Mst.HpyPntAccumRate), PosConst.MATH_ROUND.CEILING, 0);
                        //cEtcItem.ETC_AMT = m_cDataCommon.ExecTermCoopCmpPayDc(cEtcItem.ETC_WAY_CD, cEtcItem.ETC_DTL_CD_01, "", cEtcItem.AMT_ENTRY_08);  // 적립예정 포인트
                        if (m_cTrnStatus.Head.AftSaveAddInfo != "")
                        {
                            if (m_cTrnStatus.Head.AftSaveAddInfo.Substring(25).StartsWith("N") == true) cEtcItem.ETC_AMT = 0;
                        }
                    }
                    // 해피포인트 예상적립 포인트 계산 중국 추가(2017.06.23) 
                    else if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA)
                    {
                        // 해피포인트 기본적립 대상 금액 획득
                        m_cTrnStatus.Head.AftSavePoint = cEtcItem.AMT_ENTRY_08 = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.HAPPY_POINT_SAVE_CHINA);
                        // 캠페인(해피포인트 적립) 설정 처리
                        ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                        cCampaingMain.ExecuteCampaignHappyPointSave(PosConst.CAMPAIGN_PAY_KEY.HP_SAVE, null);

                        // 적립예정포인트
                        cEtcItem.ETC_AMT = CmUtil.MathRounds(CmUtil.MathAmtPercent(cEtcItem.AMT_ENTRY_08, m_cPosStatus.Mst.HpyPntAccumRate), PosConst.MATH_ROUND.CEILING, 2);
                        if (m_cTrnStatus.Head.AftSaveAddInfo != "")
                        {
                            if (m_cTrnStatus.Head.AftSaveAddInfo.Substring(25).StartsWith("N") == true) cEtcItem.ETC_AMT = 0;
                        }
                    }
                    #endregion
                }

                // 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                cFormSaleMain.DisplayItem(1, false);    // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayPayment();         // 결제등록정보 화면표시

                //더치페이 금액 체크!
                if (m_cPosStatus.Sale.DutchPayFlg == "2")
                {
                    // 결제 금액 계산 처리
                    ArrayList alPayment = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);

                    if (alPayment.Count > 0)
                    {
                        int iRow = alPayment.Count - 1;
                        Column.TR_PAYMENT.DATA cPayItem = (Column.TR_PAYMENT.DATA)alPayment[iRow];
                        if (cPayItem.CANCEL_DIV == PosConst.CANCEL_DIV.NORMAL && cPayItem.PAY_DTL_CD_05 == PosConst.PAY_DC_TYPE.PAY)
                            m_cSaleComplete.DutchPayReceiptPrint(new string[] { "" });  //금액 더치페이 영수증 출력! - 결제일 경우!
                    }
                }

                sRet = UserCom.RST_OK;
                // 결제 완료 체크
                //#Rhee, 20171222 결제금액이 0원이고 미국 예약등록이면 0원으로도 결제가능하게 추가 start
                // 기존
                //if (m_cTrnStatus.Sale.RemainPayAmt == 0)
                // 변경
                if ((m_cTrnStatus.Sale.RemainPayAmt == 0) || ((m_cTrnStatus.Sale.RemainPayAmt > 0) &&
                    (m_cPosStatus.Base.CmpCd.Equals("PCUS") && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_REG)))
                //#Rhee, 20171222 결제금액이 0원이고 미국 예약등록이면 0원으로도 결제가능하게 추가 end
                {

                    //#20171227 인천공항 포스연동 start, phj
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1")
                    {
                        sRet = IncheonAireportPayClose(PosKey.MENU_KEY.INCHEON_AIRPORT);
                        if (sRet == UserCom.RST_ERR) return sRet;
                    }
                    //#20171227 인천공항 포스연동 end, phj

                    //#Rhee, 20180212 거스름돈 안내 팝업 start
                    if( (m_cPosStatus.Base.CmpCd.Equals("PCUS") && (m_cPosStatus.Sale.ChangeCashAmt > 0)))
                    {
                        string sMsg = string.Format(MessageManager.GetGuideMessage(POS_MESSAGE.GUIDE.MSG_0013), Convert.ToString(m_cPosStatus.Sale.PayRecvedAmt), Convert.ToString(m_cPosStatus.Sale.ChangeCashAmt));
                        WinManager.ConfirmMessage(sMsg, MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0212));
                    }
                    //#Rhee, 20180212 거스름돈 안내 팝업 start

                    //낱개 반품 이나 판매 로스 일경우 결제 버튼 클릭시 현금 자동 결제 2016-12-05 문성진대리 요청 사항!
                    if ((m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE) ||
                        (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS))
                    {
                        // 결제완료 처리
                        sRet = ExecuteSaleComplete();
                    }
                    else if (PosMstManager.GetPosOption(POS_OPTION.OPT322) != "1")
                    {
                        // 결제완료 처리
                        sRet = ExecuteSaleComplete();
                    }
                }

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

        //결제완료 체크(키오스크 사용) (해피스테이션)
        public string CheckSaleComplete(bool kiosk)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                // 적립 예정 포인트 계산
                ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                {
                    #region
                    if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;

                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                    {
                        // 해피포인트 기본적립 대상 금액 획득
                        m_cTrnStatus.Head.AftSavePoint = cEtcItem.AMT_ENTRY_08 = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.HAPPY_POINT);
                        // 캠페인(해피포인트 적립) 설정 처리
                        ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                        cCampaingMain.ExecuteCampaignHappyPointSave(PosConst.CAMPAIGN_PAY_KEY.HP_SAVE, null);

                        // 적립예정포인트
                        cEtcItem.ETC_AMT = (long)CmUtil.MathRounds(CmUtil.MathAmtPercent(cEtcItem.AMT_ENTRY_08, m_cPosStatus.Mst.HpyPntAccumRate), PosConst.MATH_ROUND.CEILING, 0);
                        //cEtcItem.ETC_AMT = m_cDataCommon.ExecTermCoopCmpPayDc(cEtcItem.ETC_WAY_CD, cEtcItem.ETC_DTL_CD_01, "", cEtcItem.AMT_ENTRY_08);  // 적립예정 포인트
                        if (m_cTrnStatus.Head.AftSaveAddInfo != "")
                        {
                            if (m_cTrnStatus.Head.AftSaveAddInfo.Substring(25).StartsWith("N") == true) cEtcItem.ETC_AMT = 0;
                        }
                    }
                    // 해피포인트 예상적립 포인트 계산 중국 추가(2017.06.23) 
                    else if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA)
                    {
                        // 해피포인트 기본적립 대상 금액 획득
                        m_cTrnStatus.Head.AftSavePoint = cEtcItem.AMT_ENTRY_08 = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.HAPPY_POINT_SAVE_CHINA);
                        // 캠페인(해피포인트 적립) 설정 처리
                        ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                        cCampaingMain.ExecuteCampaignHappyPointSave(PosConst.CAMPAIGN_PAY_KEY.HP_SAVE, null);

                        // 적립예정포인트
                        cEtcItem.ETC_AMT = CmUtil.MathRounds(CmUtil.MathAmtPercent(cEtcItem.AMT_ENTRY_08, m_cPosStatus.Mst.HpyPntAccumRate), PosConst.MATH_ROUND.CEILING, 2);
                        if (m_cTrnStatus.Head.AftSaveAddInfo != "")
                        {
                            if (m_cTrnStatus.Head.AftSaveAddInfo.Substring(25).StartsWith("N") == true) cEtcItem.ETC_AMT = 0;
                        }
                    }
                    #endregion
                }

                // 판매화면 사용안함(해피스테이션)
                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                //cFormSaleMain.DisplayItem(1, false);    // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                //cFormSaleMain.DisplayPayment();         // 결제등록정보 화면표시

                //더치페이 금액 체크! 사용안함(해피스테이션)
                //if (m_cPosStatus.Sale.DutchPayFlg == "2")
                //{
                //    // 결제 금액 계산 처리
                //    ArrayList alPayment = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);

                //    if (alPayment.Count > 0)
                //    {
                //        int iRow = alPayment.Count - 1;
                //        Column.TR_PAYMENT.DATA cPayItem = (Column.TR_PAYMENT.DATA)alPayment[iRow];
                //        if (cPayItem.CANCEL_DIV == PosConst.CANCEL_DIV.NORMAL && cPayItem.PAY_DTL_CD_05 == PosConst.PAY_DC_TYPE.PAY)
                //            m_cSaleComplete.DutchPayReceiptPrint(new string[] { "" });  //금액 더치페이 영수증 출력! - 결제일 경우!
                //    }
                //}

                sRet = UserCom.RST_OK;
                // 결제 완료 체크
                //#Rhee, 20171222 결제금액이 0원이고 미국 예약등록이면 0원으로도 결제가능하게 추가 start
                // 기존
                //if (m_cTrnStatus.Sale.RemainPayAmt == 0)
                // 변경
                if ((m_cTrnStatus.Sale.RemainPayAmt == 0) || ((m_cTrnStatus.Sale.RemainPayAmt > 0) &&
                    (m_cPosStatus.Base.CmpCd.Equals("PCUS") && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_REG)))
                //#Rhee, 20171222 결제금액이 0원이고 미국 예약등록이면 0원으로도 결제가능하게 추가 end
                {

                    //#20171227 인천공항 포스연동 start, phj
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1")
                    {
                        sRet = IncheonAireportPayClose(PosKey.MENU_KEY.INCHEON_AIRPORT);
                        if (sRet == UserCom.RST_ERR) return sRet;
                    }
                    //#20171227 인천공항 포스연동 end, phj

                    //#Rhee, 20180212 거스름돈 안내 팝업 start
                    if ((m_cPosStatus.Base.CmpCd.Equals("PCUS") && (m_cPosStatus.Sale.ChangeCashAmt > 0)))
                    {
                        string sMsg = string.Format(MessageManager.GetGuideMessage(POS_MESSAGE.GUIDE.MSG_0013), Convert.ToString(m_cPosStatus.Sale.PayRecvedAmt), Convert.ToString(m_cPosStatus.Sale.ChangeCashAmt));
                        WinManager.ConfirmMessage(sMsg, MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0212));
                    }
                    //#Rhee, 20180212 거스름돈 안내 팝업 start

                    //낱개 반품 이나 판매 로스 일경우 결제 버튼 클릭시 현금 자동 결제 2016-12-05 문성진대리 요청 사항!
                    if ((m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE) ||
                        (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS))
                    {
                        // 결제완료 처리
                        sRet = ExecuteSaleComplete(true);
                    }
                    else if (PosMstManager.GetPosOption(POS_OPTION.OPT322) != "1")
                    {
                        // 결제완료 처리
                        sRet = ExecuteSaleComplete(true);
                    }
                }
                else // 거래금액과 상품금액 차이로(RemainAmt에 금액존재) 거래완료가 안된 경우 리턴 ERR로..2019.04.17
                {
                    return UserCom.ERROR;
                }

                //if (kiosk)
                //{
                //    // 결제완료 처리
                //    //sRet = ExecuteSaleComplete(true);
                //    m_cTrnStatus.Head.OrderNo = m_cTableSvr.GetOrderNoForDb();
                //}


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

        // <summary>
        /// 결제 완료 처리
        /// </summary>
        public string ExecuteSaleComplete()
        {
            string sRet = UserCom.RST_ERR;

            string sDucthFloor = "";        //더치페이 후불용 층 백업
            string sDucthTableNo = "";      //더치페이 후불용 테이블 번호 백업
            string sHpSaveCompleteMsg = "";
            try
            {
                if (m_cPosStatus.Sale.DutchPayFlg == "2") m_cPosStatus.Sale.DutchPayFlg = "";

                // 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);


                if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_END)
                {
                    // 판매상태 변경
                    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_END;

                    // 주문번호(대기번호) 등록
                    if (SetOrderNo() == false)
                    {
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.PAY_DOING;
                        cFormSaleMain.DisplayPayment();         // 결제등록정보 화면표시
                        return sRet;
                    }

                    //일반판매, 예약완료가 아닐 경우
                    if ((m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE) != true)
                    {
                        //적립, 현금 영수증 안함!
                    }
                    else
                    {
                        #region
                        //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) start
                        //170811 dkshin 돈통 오픈 처리 시점 변경(현금영수증 전)
                        // 돈통 오픈 처리
                        /*
                        if (FinishTradeOpenDrawer() == true)
                        {
                            UserLog.WriteLogFile(UserCom.LOG_IOS, UserCom.WARNING_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name, "OpenCashDrawer");

                            m_cCashDrawer.OpenCashDrawer(); // 돈통 OPEN 처리
                        }
                        */
                        //#20170830 해당 기능키 선택시 돈통 오픈 (현금, 상품권, 수표, 식권, 잔액교환권) end

                        // 현금 영수증 발행
                        if (PayCashbill(PosKey.MENU_KEY.CASH_APPROVAL) == false)
                        {
                            m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.PAY_DOING;
                            m_cTrnStatus.Head.OrderNo = "";
                            cFormSaleMain.DisplayPayment();         // 결제등록정보 화면표시
                            return sRet;
                        }

                        // 해피포인트 적립 완료 처리
                        CompleteHappyPointSave();

                        //// 현금 영수증 발행
                        //PayCashbill(PosKey.MENU_KEY.CASH_APPROVAL);

                        // 결제 고객 등록 체크
                        SetPayGuest("2");

                        cFormSaleMain.DisplayPayment();           // 결제등록정보 화면표시

                        //#13173 PB 부산수안_해피쿠폰 할인 후 대상금액 '0'원으로 표시되는 증상 start, phj
                        /*
                        // 추후적립 초기화 
                        Column.TR_ETC.DATA cEtcItemHP = null;
                        ArrayList alTrEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                        foreach (Column.TR_ETC.DATA cEtcItem in alTrEtc)
                        {
                            if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                            if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM
                                && (cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT || cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA))
                            {
                                // 해피포인트 적립 완료시 추후적립 정보 초기화
                                m_cTrnStatus.Head.AftSavePoint = 0;
                                m_cTrnStatus.Head.AftSaveAddInfo = "";
                                break;
                            }
                        }
                        // 추가적립의 추후적립 불가시 초기화
                        if (m_cTrnStatus.Head.AftSaveAddDiv != "1") m_cTrnStatus.Head.AftSaveAddInfo = "";
                        // 1000원 이하 추후적립 안함.
                        if (m_cTrnStatus.Head.AftSavePoint < 1000 && m_cTrnStatus.Head.AftSaveAddInfo == "")
                        {
                            m_cTrnStatus.Head.AftSavePoint = 0;
                            m_cTrnStatus.Head.AftSaveAddInfo = "";
                        }
                        */
                        //#13173 PB 부산수안_해피쿠폰 할인 후 대상금액 '0'원으로 표시되는 증상 end, phj


                        // 해피포인트 적립 완료 안내 메시지 추출
                        ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                        foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                        {
                            if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;

                            if ((cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                                || (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA))
                            {
                                //#20180821 해피포인트 고객이름 마스킹 start
                                if (cEtcItem.HP_CUST_NAME != "") { cEtcItem.HP_CUST_NAME = m_cDataCommon.NameMasking(cEtcItem.HP_CUST_NAME); } 
                                //#20180821 해피포인트 고객이름 마스킹 end

                                sHpSaveCompleteMsg = string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0690), 
                                                                   cEtcItem.HP_CUST_NAME, 
                                                                   m_cPosStatus.Global.NumericTOCurrency(cEtcItem.ETC_AMT));
                            }
                        }

                        // #20170616, 해피앱 스탬프 Start
                        //20171025 dkshin 전문 영수증번호 전거래의 영수증번호로 중복등록되는 문제 수정-> 거래 완료(PosSaleExecute) 후 처리
                        /*IHappyAppStamp m_cHappyAppStamp = (IHappyAppStamp)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.HPAPP_STAMP);
                        m_cTrnStatus.Sale.HappyAppMemNo = m_cHappyAppStamp.CheckHappyAppStamp();
                        if (m_cPosStatus.Base.TrainingFlag == "0" &&                  // 운영모드
                            PosMstManager.GetPosOption(POS_OPTION.OPT327) == "1" &&   // 해피앱 스탬프 사용
                            m_cTrnStatus.Sale.HappyAppMemNo != "")                    // 해피앱 회원번호 존재(해피앱 고객) 
                        {
                            // 해피앱 스탬프 등록
                            m_cHappyAppStamp.SetHappyAppStamp();
                        }
                        */
                        // #20170616, 해피앱 스탬프 End

                        #endregion
                    }

                    //상품권 판매 or 선불카드 판매 경우!
                    if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.REFUND
                        && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.CHARGESALE.PREPAID && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.CHARGESALE.GIFT)
                    {
                        #region
                        // 영수 캠페인 실행
                        ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                        cCampaingMain.ExecuteCampaignPrint(new string[] { });

                        if (m_cPosStatus.Mst.CntryDiv == ItemConst.CNTRY_DIV.CN)
                        {
                            // 온라인쿠폰 발행(중국) 실행
                            IPaymentUs cOnLineCpn = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.ONLINE_COUPON_PRT);
                            cOnLineCpn.SetPayment(new string[] { });
                        }
                        #endregion
                    }

                    //// 주문번호 등록
                    //SetOrderNo();

                    // Add, 2017.01.24
                    // 주방프린터 수동출력 처리  0:자동 1:수동(프린터선택) 2:수동(상품선택)
                    //주방프린터는 자동으로 처리함 (해피스테이션)
                    //MenualOrderKtchProcess();
                   
                    // 테이블 거래 완료 처리
                    sRet = m_cTableSvr.CompleteSaleOrder();
                }

                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // 더치페이면....
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                ArrayList ctmpSaleItem = new ArrayList();
                if (m_cPosStatus.Sale.DutchPayFlg == "1")
                {
                    #region
                    //1.상품백업
                    ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                    for (int iRow = 0; iRow < aSaleItem.Count; iRow++)
                    {
                        Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iRow];

                        cSaleItem.ORG_ITEM_SEQ = iRow;

                        ctmpSaleItem.Add(cSaleItem.Clone());
                    }

                    sDucthFloor = m_cTrnStatus.Head.FloorCd;
                    sDucthTableNo = m_cTrnStatus.Head.TableNo;
                    m_cPosStatus.Sale.PayingDutchFlag = "1";
                    #endregion
                }

                //결제완료 시점에 현금영수증 승인버튼 누르면 음성 플레이 되는 기능 --> 무조건 결제완료 시점에 플레이 되도록 수정! - #20180212 start,phj
                if ((m_cTrnStatus.Head.CmpCd == "PCKR") &&
                    //#13753 POS MOT음성 기능 추가 개발요청 - 20180222 음성MOT 옵션처리 start,phj
                    (PosMstManager.GetPosOption(POS_OPTION.OPT331) == "1") &&
                    //#13753 POS MOT음성 기능 추가 개발요청 - 20180222 음성MOT 옵션처리 end,phj
                    (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE && CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT309), "1") == "2"))
                {
                    frmSaleMain fMain = (frmSaleMain)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    fMain.SetPlayMotMsg(PosConst.MOT_MSG_TYPE.DSP_SCN_MSG, PosKey.MENU_KEY.PHRASE_RECEIPT_INPUT, "");
                }
                //결제완료 시점에 현금영수증 승인버튼 누르면 음성 플레이 되는 기능 --> 무조건 결제완료 시점에 플레이 되도록 수정! - #20180212 end,phj

                ((Form)cFormSaleMain).Refresh();
                // ##########거래 완료 처리########## //
                sRet = m_cSaleComplete.PosSaleExecute(new string[] { });
                if (sRet != UserCom.RST_OK) return sRet;

                // 판매상태 변경
                m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_WAIT;

                // 거래 완료 후 초기화 처리
                cFormSaleMain.DisplayInit(false, true);
                //cFormSaleMain.DisplayInit(true, true);
                frmSaleMain fSalMain = (frmSaleMain)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                fSalMain.SubPriorReadingVarClear(true);
                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayItem(0, true);
                // 상품등록 화면 표시
                cFormSaleMain.ChangeSalePayMode(true);

                // 거래완료 로그 출력
                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()"
                        , "SaleDate : " + m_cPosStatus.Base.SaleDate + ", StoreNo : " + m_cPosStatus.Base.StoreNo + ", PosNo : " + m_cPosStatus.Base.PosNo + ", TranNo : " + m_cPosStatus.Base.TradeNo);

                // 해피포인트 적립 완료 안내메시지 표시
                if (sHpSaveCompleteMsg != "") WinSale.ShowForm(new string[] { FormManager.FORM_HP_SAVE_COMPLETE_MSG, MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0108), sHpSaveCompleteMsg });

                //현금 알림 체크
                if (CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT310), "0") != "0")
                {
                    if (m_cPosStatus.Mst.CashAlarmAmt > m_cDataService.DoubleParse(PosMstManager.GetPosOption(POS_OPTION.OPT310)))
                    {
                        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0325));
                    }
                }

                //#20180605 해피오더 개선 start - 20180618
                m_cPosStatus.Sale.bPayCompleteYN = true;
                //#20180605 해피오더 개선 end - 20180618

                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // 더치페이면....
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                if (m_cPosStatus.Sale.DutchPayFlg == "1")
                {
                    #region
                    ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                    for (int iRow = 0; iRow < ctmpSaleItem.Count; iRow++)
                    {
                        #region
                        Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)ctmpSaleItem[iRow];

                        cSaleItem.CANCEL_DIV = cSaleItem.DUTCH_PAY_CAN_DIV;
                        cSaleItem.CANCEL_DIV_MAIN = cSaleItem.DUTCH_PAY_MAIN_CAN_DIV;
                        cSaleItem.DUTCH_PAY_CAN_DIV = "";
                        cSaleItem.DUTCH_PAY_MAIN_CAN_DIV = "";

                        if (cSaleItem.DUTCH_PAY_SELQTY == cSaleItem.DUTCH_PAY_TOTQTY)
                        {
                            cSaleItem.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;
                            cSaleItem.CANCEL_DIV_MAIN = PosConst.CANCEL_DIV.CANCEL;
                        }
                        else
                        {
                            cSaleItem.SALE_QTY = cSaleItem.DUTCH_PAY_TOTQTY - cSaleItem.DUTCH_PAY_SELQTY;
                        }

                        if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.NORMAL)
                        {
                            aSaleItem.Add(cSaleItem.Clone());
                        }
                        #endregion
                    }

                    if (aSaleItem.Count > 0)
                    {

                        m_cTrnStatus.Head.FloorCd = sDucthFloor;
                        m_cTrnStatus.Head.TableNo = sDucthTableNo;

                        m_cPluService.ItemDcAllClear(true);

                        m_cPluService.ItemAmountExeccute(true, true);
                        //더치페이 호출!
                        DutchPay("", "1");
                    }
                    else
                    {
                        m_cPosStatus.Sale.DutchPayFlg = "";
                        m_cPosStatus.Sale.PayingDutchFlag = "";
                    }
                    #endregion
                }

                if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT && m_cPosStatus.Sale.DutchPayFlg == "")
                {
                    //테이블 서비스 이면 판매화면 종료 처리
                    cFormSaleMain.SaleMainExit();
                }

                //#20181016 메모리 사용량 로그남기기 start
                //20181108 주석처리
                //m_cDataCommon.MemoryCheckLog();
                //#20181016 메모리 사용량 로그남기기 end

                //if (m_cPosStatus.Base.DmbIf == "1")
                //{
                //    // 디지털메뉴보드 I/F
                //    IDataServiceUs cDigitalMenuBoard = (IDataServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_BASIC.DLL, ServiceLists.BSV_BASIC.DMB_IF);

                //    // 판매완료 
                //    //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 start
                //    //기존
                //    //cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.SALE_END });
                //    //변경

                //    if (PosMstManager.GetPosOption(POS_OPTION.OPT554) != "1")
                //    {
                //        cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.SALE_END });
                //    }

                //    cDigitalMenuBoard = null;
                //    //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 end
                //}

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

        //kiosk용 거래완료처리 2019.04.17(해피스테이션)
        public string ExecuteSaleComplete(bool kiosk)
        {
            string sRet = UserCom.RST_ERR;

            string sHpSaveCompleteMsg = "";
            try
            {
                if (m_cPosStatus.Sale.DutchPayFlg == "2") m_cPosStatus.Sale.DutchPayFlg = "";


                if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_END)
                {
                    // 판매상태 변경
                    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_END;

                    // 주문번호(대기번호) 등록

                    if (string.IsNullOrEmpty(m_cTrnStatus.Head.OrderNo))
                    { 
                        if (SetOrderNo() == false)
                        {
                            m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.PAY_DOING;
                            return sRet;
                        }
                    }

                    //일반판매, 예약완료가 아닐 경우
                    if ((m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE) != true)
                    {
                        //적립, 현금 영수증 안함!
                    }
                    else
                    {
                        #region
                        
                        // 현금 영수증 발행
                        //해피스테이션에서는 중복 처리됨 2019.05.10
                        //if (PayCashbill(PosKey.MENU_KEY.CASH_APPROVAL) == false)
                        //{
                        //    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.PAY_DOING;
                        //    m_cTrnStatus.Head.OrderNo = "";
                        //    return sRet;
                        //}

                        // 해피포인트 적립 완료 처리
                        CompleteHappyPointSave();

                        //// 현금 영수증 발행
                        //PayCashbill(PosKey.MENU_KEY.CASH_APPROVAL);

                        // 결제 고객 등록 체크
                        //SetPayGuest("2");


                        // 해피포인트 적립 완료 안내 메시지 추출 --필요없음(해피스테이션)
                        //ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                        //foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                        //{
                        //    if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;

                        //    if ((cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                        //        || (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA))
                        //    {
                        //        //#20180821 해피포인트 고객이름 마스킹 start
                        //        if (cEtcItem.HP_CUST_NAME != "") { cEtcItem.HP_CUST_NAME = m_cDataCommon.NameMasking(cEtcItem.HP_CUST_NAME); }
                        //        //#20180821 해피포인트 고객이름 마스킹 end

                        //        sHpSaveCompleteMsg = string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0690),
                        //                                           cEtcItem.HP_CUST_NAME,
                        //                                           m_cPosStatus.Global.NumericTOCurrency(cEtcItem.ETC_AMT));
                        //    }
                        //}

                        #endregion
                    }

                    //상품권 판매 or 선불카드 판매 경우!(상품권 /선불 카드 없음 (해피스테이션)
                    //if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.REFUND
                    //    && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.CHARGESALE.PREPAID && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.CHARGESALE.GIFT)
                    //{
                    //    #region
                    //    // 영수 캠페인 실행
                    //    ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                    //    cCampaingMain.ExecuteCampaignPrint(new string[] { });

                    //    if (m_cPosStatus.Mst.CntryDiv == ItemConst.CNTRY_DIV.CN)
                    //    {
                    //        // 온라인쿠폰 발행(중국) 실행
                    //        IPaymentUs cOnLineCpn = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.ONLINE_COUPON_PRT);
                    //        cOnLineCpn.SetPayment(new string[] { });
                    //    }
                    //    #endregion
                    //}

                   // KtchOrderSheetToBillPrint();
                    
                    
                    // 테이블 거래 완료 처리
                    sRet = m_cTableSvr.CompleteSaleOrder();
                }

                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // 더치페이면....없음(해피스테이션
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                //ArrayList ctmpSaleItem = new ArrayList();
                //if (m_cPosStatus.Sale.DutchPayFlg == "1")
                //{
                //    #region
                //    //1.상품백업
                //    ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                //    for (int iRow = 0; iRow < aSaleItem.Count; iRow++)
                //    {
                //        Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iRow];

                //        cSaleItem.ORG_ITEM_SEQ = iRow;

                //        ctmpSaleItem.Add(cSaleItem.Clone());
                //    }

                //    sDucthFloor = m_cTrnStatus.Head.FloorCd;
                //    sDucthTableNo = m_cTrnStatus.Head.TableNo;
                //    m_cPosStatus.Sale.PayingDutchFlag = "1";
                //    #endregion
                //}


                //폼호출 안함..(해피스테이션)
                //결제완료 시점에 현금영수증 승인버튼 누르면 음성 플레이 되는 기능 --> 무조건 결제완료 시점에 플레이 되도록 수정! - #20180212 start,phj
                //if ((m_cTrnStatus.Head.CmpCd == "PCKR") &&
                //    //#13753 POS MOT음성 기능 추가 개발요청 - 20180222 음성MOT 옵션처리 start,phj
                //    (PosMstManager.GetPosOption(POS_OPTION.OPT331) == "1") &&
                //    //#13753 POS MOT음성 기능 추가 개발요청 - 20180222 음성MOT 옵션처리 end,phj
                //    (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE && CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT309), "1") == "2"))
                //{
                //    frmSaleMain fMain = (frmSaleMain)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                //    fMain.SetPlayMotMsg(PosConst.MOT_MSG_TYPE.DSP_SCN_MSG, PosKey.MENU_KEY.PHRASE_RECEIPT_INPUT, "");
                //}


                #region 비회원 적립예상포인트 구하기 2019.05.16

                //비회원 적립예상포인트 구하기 2019.05.16
                // 해피포인트 기본적립 대상 금액 획득

                //var chkHappy = false;
                //ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                //foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                //{
                //    if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;

                //    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                //    {
                //        if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                //        {
                //            chkHappy = true;
                //            break;
                //        }
                //    }
                //}
                //if (!chkHappy)
                //{
                //    var AfterSavePoint = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.HAPPY_POINT);

                //    // 캠페인(해피포인트 적립) 설정 처리
                //    ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                //    cCampaingMain.ExecuteCampaignHappyPointSave(PosConst.CAMPAIGN_PAY_KEY.HP_SAVE, null);

                //    // 적립예정포인트
                //    m_cTrnStatus.Head.SavingHpPoint = (long)CmUtil.MathRounds(CmUtil.MathAmtPercent(AfterSavePoint, m_cPosStatus.Mst.HpyPntAccumRate), PosConst.MATH_ROUND.CEILING, 0);
                //}
                #endregion








                // ##########거래 완료 처리########## //
                sRet = m_cSaleComplete.PosSaleExecute(new string[] { });
                if (sRet != UserCom.RST_OK) return sRet;

                // 판매상태 변경
                m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_WAIT;

                
                // 거래완료 로그 출력
                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()"
                        , "SaleDate : " + m_cPosStatus.Base.SaleDate + ", StoreNo : " + m_cPosStatus.Base.StoreNo + ", PosNo : " + m_cPosStatus.Base.PosNo + ", TranNo : " + m_cPosStatus.Base.TradeNo);

                // 해피포인트 적립 완료 안내메시지 표시(해피스테이션에서 막음 2019.04.22)
                //if (sHpSaveCompleteMsg != "") WinSale.ShowForm(new string[] { FormManager.FORM_HP_SAVE_COMPLETE_MSG, MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0108), sHpSaveCompleteMsg });

                //현금 알림 체크(현금 사용안함 (해피스테이션)
                //if (CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT310), "0") != "0")
                //{
                //    if (m_cPosStatus.Mst.CashAlarmAmt > m_cDataService.DoubleParse(PosMstManager.GetPosOption(POS_OPTION.OPT310)))
                //    {
                //        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0325));
                //    }
                //}

                //#20180605 해피오더 개선 start - 20180618
                m_cPosStatus.Sale.bPayCompleteYN = true;
                //#20180605 해피오더 개선 end - 20180618

                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // 더치페이면....더치페이 없음(해피스테이션)
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                //if (m_cPosStatus.Sale.DutchPayFlg == "1")
                //{
                //    #region
                //    ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                //    for (int iRow = 0; iRow < ctmpSaleItem.Count; iRow++)
                //    {
                //        #region
                //        Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)ctmpSaleItem[iRow];

                //        cSaleItem.CANCEL_DIV = cSaleItem.DUTCH_PAY_CAN_DIV;
                //        cSaleItem.CANCEL_DIV_MAIN = cSaleItem.DUTCH_PAY_MAIN_CAN_DIV;
                //        cSaleItem.DUTCH_PAY_CAN_DIV = "";
                //        cSaleItem.DUTCH_PAY_MAIN_CAN_DIV = "";

                //        if (cSaleItem.DUTCH_PAY_SELQTY == cSaleItem.DUTCH_PAY_TOTQTY)
                //        {
                //            cSaleItem.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;
                //            cSaleItem.CANCEL_DIV_MAIN = PosConst.CANCEL_DIV.CANCEL;
                //        }
                //        else
                //        {
                //            cSaleItem.SALE_QTY = cSaleItem.DUTCH_PAY_TOTQTY - cSaleItem.DUTCH_PAY_SELQTY;
                //        }

                //        if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.NORMAL)
                //        {
                //            aSaleItem.Add(cSaleItem.Clone());
                //        }
                //        #endregion
                //    }

                //    if (aSaleItem.Count > 0)
                //    {

                //        m_cTrnStatus.Head.FloorCd = sDucthFloor;
                //        m_cTrnStatus.Head.TableNo = sDucthTableNo;

                //        m_cPluService.ItemDcAllClear(true);

                //        m_cPluService.ItemAmountExeccute(true, true);
                //        //더치페이 호출!
                //        DutchPay("", "1");
                //    }
                //    else
                //    {
                //        m_cPosStatus.Sale.DutchPayFlg = "";
                //        m_cPosStatus.Sale.PayingDutchFlag = "";
                //    }
                //    #endregion
                //}

                //테이블 서비스 없음(해피스테이션)
                //if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT && m_cPosStatus.Sale.DutchPayFlg == "")
                //{
                //    //테이블 서비스 이면 판매화면 종료 처리
                //    cFormSaleMain.SaleMainExit();
                //}

                //#20181016 메모리 사용량 로그남기기 start
                //20181108 주석처리
                //m_cDataCommon.MemoryCheckLog();
                //#20181016 메모리 사용량 로그남기기 end



               


                if (m_cPosStatus.Base.DmbIf == "1")
                {
                    //// 디지털메뉴보드 I/F
                    //IDataServiceUs cDigitalMenuBoard = (IDataServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_BASIC.DLL, ServiceLists.BSV_BASIC.DMB_IF);

                    //if (PosMstManager.GetPosOption(POS_OPTION.OPT554) != "1")
                    //{
                    //    cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.SALE_END });
                    //}

                    //cDigitalMenuBoard = null;

                    try
                    {
                        var sUrl = m_cPosStatus.Base.DmbSvrIp;
                        var sWorkType = "/api/ods";
                        Hashtable htRequest = new Hashtable();
                        Hashtable htDummy = new Hashtable();


                        string nowDate = DateTime.Now.ToString("yyyymmdd");
                        string nowTime = DateTime.Now.ToString("HHmmss");




                        htRequest.Add("cmpCode", m_cPosStatus.Base.CmpCd);
                        htRequest.Add("brandCode",m_cPosStatus.Base.BrandCd);
                        htRequest.Add("storeCode", m_cPosStatus.Base.StoreNo);
                        htRequest.Add("deviceCode", "");
                        htRequest.Add("saleDiv", "");
                        htRequest.Add("saleDt", nowDate);
                        htRequest.Add("saleTm", nowTime);
                        htRequest.Add("soldDt", "");
                        htRequest.Add("soldTm", "");
                        htRequest.Add("saleResult", "");
                        htRequest.Add("posNo", "");
                        htRequest.Add("billNo", "");
                        htRequest.Add("beforeBillNo", "");

                        htRequest.Add("takeDiv", "");
                        htRequest.Add("waitNo", m_cTrnStatus.Head.OrderNo);
                        htRequest.Add("totalPrice", "");
                        htRequest.Add("totalSalePrice", "");
                        htRequest.Add("totalService", "");
                        htRequest.Add("totalVat", "");
                        htRequest.Add("totalEnr", "");
                        htRequest.Add("itemName", "");
                        htRequest.Add("itemCount", "");
                        htRequest.Add("payType", "");

                        htRequest.Add("payAmount", "");
                        htRequest.Add("payPointUse", "");
                        htRequest.Add("payPointSave", "");
                        htRequest.Add("saleItemList", htDummy);
                        htRequest.Add("salePayList", htDummy);

                        Hashtable htResponse = null;
                        Hashtable[] htReturn = null;
                        int iRet = 0;

                        string sResp = string.Empty;
                        if ((iRet = m_cNetworkHttp.HttpJsonPOST_SendReceive(sUrl, sWorkType, htRequest, ref htResponse, ref sResp)) == BaseCom.OK)
                        {
                            htReturn = JsonConvert.DeserializeObject<Hashtable[]>(sResp);
                        }
                    }
                    catch (Exception ex)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR,
                                             System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,      // Project Name (프로젝트명)
                                             System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +  // Class Name (Class Name (클래스명))
                                             System.Reflection.MethodBase.GetCurrentMethod().Name + "()",                // Function Name (Function Name (함수명))
                                             ex.Message);
                    }


                }
                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>
        /// <returns></returns>
        private bool GetDutchPayRemain()
        {
            bool bRet = false;
            double dAvancePay = 0;


            try
            {
                // 결제 금액 계산 처리
                ArrayList alPayment = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                for (int iRow = 0; iRow < alPayment.Count; iRow++)
                {
                    Column.TR_PAYMENT.DATA cPayItem = (Column.TR_PAYMENT.DATA)alPayment[iRow];

                    if (cPayItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cPayItem.PAY_DTL_CD_05 != "" && cPayItem.PAY_DTL_CD_05 != "1") continue;

                    // 받은금액 계산 처리
                    dAvancePay += cPayItem.PAY_AMT;
                }

                // 받을금액
                if (m_cTrnStatus.Sale.DutchPayTotAmt > dAvancePay)
                {
                    bRet = true;
                }

            }
            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 bRet;
        }


        /// <summary>
        /// 주문번호등록
        /// </summary>
        /// 2019-04-17 - 1997fx11 : 대기번호 출력 참조.
        public bool SetOrderNo()
        {
            // grayber@20180110 전자영수증 주문(대기)번호표 출력 start - string 선언 이동
            // 선언 이동
            string sRet = "";       // grayber@20180110 string 선언 이동
            // grayber@20180110 전자영수증 주문(대기)번호표 출력 end 
            try
            {
                //정상 && 일반 거래 일때만 처리! => 로스거래 주방출력 함(2017.05.25)
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL
                    && (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS))
                {
                    // Add, 2017.04.11, 후불-판매모드는 주문번호 자동채번 처리 (점별일련번호)
                    if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT)
                    {
                        if (m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.NO_ORDER_SALE || string.IsNullOrWhiteSpace(m_cTrnStatus.Head.OrderNo))
                            m_cTrnStatus.Head.OrderNo = m_cTableSvr.GetOrderNoForDb();

                        // 후불일 경우에도 판매모드에서는 대기번호 자동체번 안함(2017.05.24)
                        if (m_cPosStatus.Sale.EtcOperateMode != PosConst.ETC_OPERATION_MODE.NO_ORDER_SALE)
                            return true;
                    }

                    if (PosMstManager.GetPosOption(POS_OPTION.OPT008) == "1") //대기번호 사용여부
                    {
                        // 자동채번일 경우!
                        if (PosMstManager.GetPosOption(POS_OPTION.OPT042) == "1")
                        {
                            m_cTrnStatus.Head.OrderNo = m_cDataCommon.GetWaitNoForDb();
                        }
                        else
                        {   
                            //sCardNo = GetHappyAppNo();

                            // Add, 2017.04.25, KPS => 주방출력 대상 상품이 존재 할 때만 대기번호 입력 
                            //                  KDS => 무조건 대기번호 입력 
                            var isGetOrderNo = false;
                            if (PosMstManager.GetPosOption(POS_OPTION.OPT027) == "1" || PosMstManager.GetPosOption(POS_OPTION.OPT507) == "1")
                            {
                                // KDS => 무조건 대기번호 입력 
                                isGetOrderNo = true;
                            }
                            //#20181024 대기(주문)번호표 출력 start
                            /*
                            else if (PosMstManager.GetPosOption(POS_OPTION.OPT432) == "1")
                            {
                                // 대기(주문)번호표 출력여부 => 무조건 대기번호 입력
                                isGetOrderNo = true;
                            }
                            */
                            //#20181024 대기(주문)번호표 출력 end
                            else
                            {
                                // KPS => 주방출력 대상 상품이 존재 할 때만 대기번호 입력 
                                isGetOrderNo = IsExistKtchItem();
                            }

                            //isGetOrderNo = true; //지우자!!!!

                            // Mod, 2017.04.25, KPS => 주방출력 대상 상품이 존재 할 때만 대기번호 입력 
                            if (isGetOrderNo)
                            {
                                if (m_cTrnStatus.Sale.HappyBuzzMemNo != "" && m_cPosStatus.Mst.HappyBuzzUseYn == "1")
                                {
                                    //해피버즈 처리!
                                    sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_HAPPY_BUZZ, PosKey.MENU_KEY.HAPPY_BUZ_REG, m_cTrnStatus.Sale.HappyBuzzMemNo });
                                    if (sRet != UserCom.RST_ERR)
                                    {
                                        m_cTrnStatus.Head.OrderNo = sRet;
                                    }
                                    else
                                    {
                                        //실패시 일반 받기!
                                        sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_USER_INPUT_DATA, PosConst.FRM_INPUT_DATA.ORDERNO });
                                        if (sRet != UserCom.RST_ERR)
                                        {
                                            //m_cTrnStatus.Head.OrderNo = sRet;
                                            var tmp = sRet.Split('|');
                                            if (tmp.Length > 0) m_cTrnStatus.Head.OrderNo = tmp[0];
                                            if (tmp.Length > 1) m_cTrnStatus.Sale.MenualOrderMemo = tmp[1];
                                        }
                                        else
                                            return false;
                                    }
                                }
                                else
                                {
                                    sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_USER_INPUT_DATA, PosConst.FRM_INPUT_DATA.ORDERNO });
                                    if (sRet != UserCom.RST_ERR)
                                    {
                                        //m_cTrnStatus.Head.OrderNo = sRet;
                                        var tmp = sRet.Split('|');
                                        if (tmp.Length > 0) m_cTrnStatus.Head.OrderNo = tmp[0];
                                        if (tmp.Length > 1) m_cTrnStatus.Sale.MenualOrderMemo = tmp[1];
                                    }
                                    else
                                        return false;
                                }
                            }
                            // grayber@20180110 전자영수증 주문(대기)번호표 출력 start - 주문(대기번호) 입력 창 처리
                            // 추가

                            // grayber@20180122 전자영수증 주문(대기)번호표 출력 start - 브랜드구분을 회사구분으로 변경, if -> else if 변경
                            //if (m_cPosStatus.Base.BrandDiv.Equals(ItemConst.CORP_DIV.BR) == true )    // 기존
                            else if (m_cPosStatus.Mst.CorpDiv.Equals(ItemConst.CORP_DIV.BR) == true )   // 변경
                            // grayber@20180122 전자영수증 주문(대기)번호표 출력 start
                            {
                                sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_USER_INPUT_DATA, PosConst.FRM_INPUT_DATA.ORDERNO });
                                if (sRet != UserCom.RST_ERR)
                                {
                                    //m_cTrnStatus.Head.OrderNo = sRet;
                                    var tmp = sRet.Split('|');
                                    if (tmp.Length > 0) m_cTrnStatus.Head.OrderNo = tmp[0];
                                    if (tmp.Length > 1) m_cTrnStatus.Sale.MenualOrderMemo = tmp[1];
                                }
                                else
                                    return false;
                            }
                            // grayber@20180110 전자영수증 주문(대기)번호표 출력 end
                        }
                    }

                    //else if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT && m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.NO_ORDER_SALE)
                    //{ 
                    //    // 후불-판매모드 일때 
                    //    //m_cTrnStatus.Head.OrderNo = m_cDataCommon.GetWaitNoForDb();
                    //    m_cTrnStatus.Head.OrderNo = m_cTrnStatus.Head.TradeNo;
                    //}
                }
                return true;
            }
            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 false;
        }

        /// <summary>
        /// 주방출력(KPS) 대상 상품 존재여부
        /// </summary>
        /// <returns></returns>
        private bool IsExistKtchItem()
        {
            try
            {
                // 일반주문 일때
                var lstktchItems = new List<string>();
                var pluItems = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                foreach (Column.TR_PLU.DATA item in pluItems)
                {
                    if (item.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) continue;

                    if (string.IsNullOrWhiteSpace(m_cTrnStatus.Head.FloorCd) == false)
                        lstktchItems.Add(string.Format("'{0}{1}{2}'", m_cTrnStatus.Head.FloorCd, item.SUB_SHOP_CD, item.ITEM_PLU_CD));
                    lstktchItems.Add(string.Format("'{0}{1}{2}'", "999", item.SUB_SHOP_CD, item.ITEM_PLU_CD));
                }
                if (lstktchItems.Count == 0) return false;

                var fmt = "SELECT A.SUB_STOR_CD, A.ITEM_CD, COUNT(B.KTCH_SYS_CD) KTCH_CNT \n"
                        + "  FROM MST_KTCH_DEVICE_ITEM A WITH(NOLOCK) \n"
                        + "     , MST_KTCH_DEVICE      B WITH(NOLOCK) \n"
                        + " WHERE A.CMP_CD = B.CMP_CD AND A.STOR_CD = B.STOR_CD \n"
                        + "   AND CASE WHEN A.KTCH_SYS_CD = '99' THEN '1' ELSE A.SUB_STOR_CD + A.KTCH_SYS_CD END \n"
                        + "     = CASE WHEN A.KTCH_SYS_CD = '99' THEN '1' ELSE B.SUB_STOR_CD + B.KTCH_SYS_CD END \n"
                        + "   AND A.CMP_CD       = '{0}'             \n"
                        + "   AND A.STOR_CD      = '{1}'             \n"
                        + "   AND A.FLOOR_CD + A.SUB_STOR_CD + A.ITEM_CD IN ({2}) \n"
                        + "   AND A.USE_YN       = '{3}'             \n"
                        + "   AND B.USE_YN       = '{3}'             \n"
                        + "   AND B.KTCH_SYS_DIV = '" + PosConst.KTCH_SYS_DIV.KPS + "' \n"
                        + "   AND B.KTCH_SYS_CD <> '99'              \n"
                        + " GROUP BY A.SUB_STOR_CD, A.ITEM_CD "
                        ;
                var sql = string.Format(fmt, m_cPosStatus.Base.CmpCd
                                           , m_cPosStatus.Base.StoreNo
                                           , string.Join(",", lstktchItems.ToArray())
                                           , PosConst.MST_USE_YN.YES);
                DataTable dt = m_cMstService.Select(new string[] { sql });
                if (dt == null || dt.Rows.Count == 0) return false;

                return true;
            }
            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 false;
            }
        }

        private string GetHappyAppNo()
        {

            string sCardNo = "";

            try
            {
                ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                {
                    if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.BILLSPR_NO != m_cTrnStatus.Sale.BillSplitNo) continue;
                    if (cEtcItem.ETC_WAY_CD != ItemConst.TR_ITEM_ID.ETC_INFO_ITEM || cEtcItem.ETC_DTL_CD_01 != ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT) continue;
                    if (cEtcItem.OCCUR_ENTRY_12 == "Y")
                    {
                        sCardNo = cEtcItem.CanFiller3;
                    }
                    break;
                }

                if (sCardNo == "")
                {
                    ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                    foreach (Column.TR_PAYMENT.DATA cPayItem in alPayItem)
                    {
                        if (cPayItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;
                        if (cPayItem.BILLSPR_NO != m_cTrnStatus.Sale.BillSplitNo) continue;
                        if (cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.POINT_ITEM || cPayItem.PAY_DTL_CD_01 != ItemConst.TR_ITEM_ID.POINT_USE.HAPPY_POINT) continue;
                        if (cPayItem.OCCUR_ENTRY_12 == "Y")
                        {
                            sCardNo = cPayItem.CanFiller3;
                        }
                        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 sCardNo;

        }



        /// <summary>
        /// 해피포인트/OCB 적립 완료 처리
        /// </summary>
        public void CompleteHappyPointSave()
        {
            string sRet;
            try
            {
                // 반품모드
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND) return;
                // 상품권 판매 or 선불카드 판매
                if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.PREPAID || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.GIFT) return;

                ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // OKCASHBACK 포인트 적립 처리
                ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                    // OKCASHBACK 적립
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {

                        if (cEtcItem.OCCUR_ENTRY_08 == ItemConst.PAY_APP_DIV.CAT_TERMINAL)
                        {
                            // OCB 적립 완료시 추후적립 정보 초기화
                            m_cTrnStatus.Head.AftSavePoint = 0;
                            m_cTrnStatus.Head.AftSaveAddInfo = "";
                            return;
                        }

                        // OCB 포인트 적립 완료 처리
                        IPaymentExpUs cOcbPntSave = (IPaymentExpUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.PNT_OCB_SAVE);
                        sRet = cOcbPntSave.CompletePayment(new string[] { });
                        if (sRet == UserCom.RST_OK)
                        {
                            // OCB 적립 완료시 추후적립 정보 초기화
                            m_cTrnStatus.Head.AftSavePoint = 0;
                            m_cTrnStatus.Head.AftSaveAddInfo = "";

                            return;
                        }
                    }
                }

                ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // 해피 포인트 적립 처리
                ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                if (PosMstManager.GetPosOption(POS_OPTION.OPT316) == "0") return;           // 해피포인트 업무 사용 여부(0:사용안함, 1:사용함(한국), 2:사용함(중국))

                // 해피포인트 카드 등록 여부 체크
                Column.TR_ETC.DATA cEtcItemHP = null;

                ArrayList alTrEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alTrEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM
                        && (cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT || cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA))
                    {
                        cEtcItemHP = cEtcItem;
                        break;
                    }
                }

                ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // 해피포인트 적립 금액 계산
                ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // 해피포인트 기본적립 대상 금액 획득
                if (PosMstManager.GetPosOption(POS_OPTION.OPT316) == "2")           // 해피포인트 업무 사용 여부(0:사용안함, 1:사용함(한국), 2:사용함(중국))
                {
                    m_cTrnStatus.Head.AftSavePoint = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.HAPPY_POINT_SAVE_CHINA);

                    // 캠페인(해피포인트 적립) 설정 처리
                    //ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                    //cCampaingMain.ExecuteCampaignHappyPointSave(PosConst.CAMPAIGN_PAY_KEY.HP_SAVE, null);
                    if (m_cTrnStatus.Head.AftSavePoint < 1 && m_cTrnStatus.Head.AftSaveAddInfo == "")
                    {
                        if (cEtcItemHP != null) cEtcItemHP.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;
                    }
                    else
                    {
                        IPaymentUs cHappyPoint = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.POINTHAPPYPOINT_SAVE_CHINA);

                        if (cEtcItemHP != null && PosMstManager.GetPosOption(POS_OPTION.OPT030) == "1")   //  HP 자동적립 처리(0:사용안함, 1:사용함)
                        {
                            // 해피포인트 적립 완료 처리
                            sRet = cHappyPoint.SetPayment(new string[] { PosKey.MENU_KEY.HAPPY_POINT_SAVE_CHINA, cEtcItemHP.OCCUR_ENTRY_05, cEtcItemHP.OCCUR_ENTRY_01, m_cTrnStatus.Head.AftSavePoint.ToString(), "1" });
                            if (sRet != UserCom.RST_OK)
                            {
                                ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);     // 기타 내역 받아 오기
                                foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                                {
                                    if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;

                                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                                    {
                                        cEtcItem.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;
                                    }
                                }
                            }
                        }
                        else
                        {
                            // 거래완료시 HP미등록 적립화면 사용여부(0:사용안함, 1:사용함)(2017.06.05)
                            //해피스테이션 삭제 2019.04.22
                            //if (cEtcItemHP != null || PosMstManager.GetPosOption(POS_OPTION.OPT047) != "0")
                            //{
                            //    // 해피포인트 카드 등록 화면 진행
                            //    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_HAPPY_POINT, PosKey.MENU_KEY.HAPPY_POINT, "1" });
                            //}
                        }
                    }

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    // 적립 완료 후 처리
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //// 스템프 캠페인 미적용 정보 삭제
                    //cCampaingMain.SetCampaignHappyStampInfo("", "", "");

                    // 적립 완료 시 추후 적립 정보 삭제
                    cEtcItemHP = null;
                    foreach (Column.TR_ETC.DATA cEtcItem in alTrEtc)
                    {
                        if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                        if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM
                            && (cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT || cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA))
                        {
                            // 해피포인트 적립 완료시 추후적립 정보 초기화
                            m_cTrnStatus.Head.AftSavePoint = 0;
                            m_cTrnStatus.Head.AftSaveAddInfo = "";

                            cEtcItemHP = cEtcItem;
                            break;
                        }
                    }
                    // 추가적립의 추후적립 불가시 초기화
                    if (m_cTrnStatus.Head.AftSaveAddDiv != "1") m_cTrnStatus.Head.AftSaveAddInfo = "";
                    // 1원 이하 추후적립 안함.
                    if (m_cTrnStatus.Head.AftSavePoint < 1 && m_cTrnStatus.Head.AftSaveAddInfo == "")
                    {
                        m_cTrnStatus.Head.AftSavePoint = 0;
                        m_cTrnStatus.Head.AftSaveAddInfo = "";
                    }
                }
                else
                {
                    m_cTrnStatus.Head.AftSavePoint = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.HAPPY_POINT);

                    // 캠페인(해피포인트 적립) 설정 처리
                    ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                    cCampaingMain.ExecuteCampaignHappyPointSave(PosConst.CAMPAIGN_PAY_KEY.HP_SAVE, null);

                    // 적립 대상금액 없음
                    if (m_cTrnStatus.Head.AftSavePoint < 1000 && m_cTrnStatus.Head.AftSaveAddInfo == "")
                    {
                        if (cEtcItemHP != null) cEtcItemHP.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;
                    }
                    else
                    {
                        IPaymentExpUs cHappyPoint = (IPaymentExpUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.POINTHAPPYPOINT);
                        //MoonSeokWoo 2017.11.15 Edit
                        //자동적립이고 HP 추가 적립 화면 사용을 하는 경우 HP 등록이 되어 있으면 추가 적립화면 체크가 되어 있어도 자동적립 , 
                        //자동적립이고 HP 추가 적립 화면 사용을 하는 경우 HP 등록이 되어 있지 않으면 추가 적립 화면 활성화
                        //if (cEtcItemHP != null && PosMstManager.GetPosOption(POS_OPTION.OPT030) == "1")   //  HP 자동적립 처리(0:사용안함, 1:사용함)
                        if (PosMstManager.GetPosOption(POS_OPTION.OPT030) == "1")   //  HP 자동적립 처리(0:사용안함, 1:사용함)
                        {
                            if (PosMstManager.GetPosOption(POS_OPTION.OPT047) != "0" && cEtcItemHP == null)
                            {
                                //sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_HAPPY_POINT, PosKey.MENU_KEY.HAPPY_POINT, "1" });
                            }
                            //MoonSeokWoo 2017.11.15 Edit
                            //else if (cEtcItemHP != null && PosMstManager.GetPosOption(POS_OPTION.OPT047) == "0")
                            else if (cEtcItemHP != null)
                            {
                                // 해피포인트 적립 완료 처리
                                sRet = cHappyPoint.CompletePayment(new string[] { });
                                if (sRet != UserCom.RST_OK)
                                {
                                    ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);     // 기타 내역 받아 오기
                                    foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                                    {
                                        if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;

                                        if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                                        {
                                            cEtcItem.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            // 거래완료시 HP미등록 적립화면 사용여부(0:사용안함, 1:사용함)(2017.06.05)
                            //해피스테이션 삭제 2019.04.22
                            //if (PosMstManager.GetPosOption(POS_OPTION.OPT047) != "0")
                            //{
                            //    // 해피포인트 카드 등록 화면 진행
                            //    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_HAPPY_POINT, PosKey.MENU_KEY.HAPPY_POINT, "1" });
                            //}
                        }
                    }

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    // 적립 완료 후 처리
                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    // 스템프 캠페인 미적용 정보 삭제
                    cCampaingMain.SetCampaignHappyStampInfo("", "", "");

                    // 적립 완료 시 추후 적립 정보 삭제
                    cEtcItemHP = null;
                    foreach (Column.TR_ETC.DATA cEtcItem in alTrEtc)
                    {
                        if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                        if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM
                            && (cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT || cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.POINT_SAVE_CHINA))
                        {
                            // 해피포인트 적립 완료시 추후적립 정보 초기화
                            m_cTrnStatus.Head.AftSavePoint = 0;
                            m_cTrnStatus.Head.AftSaveAddInfo = "";

                            cEtcItemHP = cEtcItem;
                            break;
                        }
                    }
                    // 추가적립의 추후적립 불가시 초기화
                    if (m_cTrnStatus.Head.AftSaveAddDiv != "1") m_cTrnStatus.Head.AftSaveAddInfo = "";
                    // 1000원 이하 추후적립 안함.
                    if (m_cTrnStatus.Head.AftSavePoint < 1000 && m_cTrnStatus.Head.AftSaveAddInfo == "")
                    {
                        m_cTrnStatus.Head.AftSavePoint = 0;
                        m_cTrnStatus.Head.AftSaveAddInfo = "";
                    }
                }

                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                // 디지털메뉴보드 I/F
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 start
                //기존
                //if (m_cPosStatus.Base.DmbIf == "1")
                //변경
                //if (m_cPosStatus.Base.DmbIf == "1" &&
                //    PosMstManager.GetPosOption(POS_OPTION.OPT554) != "1")
                ////#16569 파스쿠찌 드라이브 스루 기능 개발 요청 end
                //{
                //    if (cEtcItemHP != null)
                //    {
                //        // 디지털메뉴보드 I/F
                //        IDataServiceUs cDigitalMenuBoard = (IDataServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_BASIC.DLL, ServiceLists.BSV_BASIC.DMB_IF);
                //        // 포인트적립
                //        cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.POINT_INFO        // 전문 구분
                //                                               , "HPC"                                  // POINT_DIV
                //                                               , cEtcItemHP.OCCUR_ENTRY_12              // APP_DIV (Y:HPC APP, N:그 외)
                //                                               , "2"                                    // DIV(1:조회, 2:적립, 3:할인, 4:사용 ...)
                //                                               , ""                                     // AMOUNT(포인트사용금액)
                //                                               , cEtcItemHP.AMT_ENTRY_01.ToString()     // POINT(적립,할인,사용포인트)
                //                                               , cEtcItemHP.AMT_ENTRY_05.ToString()     // R_POINT(잔여포인트)
                //                                               , ""                                     // 
                //                                               , cEtcItemHP.OCCUR_ENTRY_01              // CARD_NO(마스킹 된 카드 번호)
                //                                               , ""                                     // CUST_NAME(고객명)
                //                                               , "" });                                 // CAMPAIGN_INFO
                //    }
                //}
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                      System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        ///// <summary>
        ///// 해피포인트 적립 완료 처리
        ///// </summary>
        //public void CompleteHappyPointSave()
        //{
        //    string sRet;
        //    try
        //    {
        //        if (PosMstManager.GetPosOption(POS_OPTION.OPT316) == "0") return;           // 해피포인트 업무 사용 여부(0:사용안함, 1:사용함)

        //        if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND) return;

        //        // 상품권 판매 or 선불카드 판매 경우!
        //        if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.PREPAID || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.GIFT) return;

        //        IPaymentExpUs cHappyPoint = (IPaymentExpUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.POINTHAPPYPOINT);

        //        // 해피포인트 카드 등록 여부 체크
        //        Column.TR_ETC.DATA cEtcItemHP = null;
        //        ArrayList alTrEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
        //        foreach (Column.TR_ETC.DATA cEtcItem in alTrEtc)
        //        {
        //            if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

        //            if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
        //            {
        //                cEtcItemHP = cEtcItem;
        //                break;
        //            }
        //        }

        //        if (cEtcItemHP == null)
        //        {
        //            // 해피포인트 사용 해피포포인트 적립 처리
        //            ArrayList alPayment = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
        //            foreach (Column.TR_PAYMENT.DATA cPayItem in alPayment)
        //            {
        //                if (cPayItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
        //                if (cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.POINT_ITEM || cPayItem.PAY_DTL_CD_01 != ItemConst.TR_ITEM_ID.POINT_USE.HAPPY_POINT) continue;

        //                // 해피포인트 조회
        //                string[] saRecvdData = null;
        //                sRet = cHappyPoint.SearchPayment(new string[] { cPayItem.OCCUR_ENTRY_05, cPayItem.OCCUR_ENTRY_01, cPayItem.CanFiller1, "0" }, ref saRecvdData);
        //                if (sRet == UserCom.RST_OK)
        //                {
        //                    // 해피포인트 카드 등록 처리
        //                    sRet = cHappyPoint.SetPayment(new string[] { cPayItem.OCCUR_ENTRY_05, cPayItem.OCCUR_ENTRY_01, cPayItem.CanFiller1, "0", cPayItem.OCCUR_ENTRY_23 });
        //                    if (sRet == UserCom.RST_OK)
        //                    {
        //                        cEtcItemHP = (Column.TR_ETC.DATA)cHappyPoint.GetPayment(new string[] { });
        //                        break;
        //                    }
        //                }
        //            }
        //        }

        //        // 해피포인트 카드가 등록되어 있지 않다면 제휴 카드 체크
        //        bool bCoopCardExist = false;
        //        if (cEtcItemHP == null)
        //        {
        //            // 제휴카드 해피포포인트 적립 처리
        //            ArrayList alPayment = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
        //            foreach (Column.TR_PAYMENT.DATA cPayItem in alPayment)
        //            {
        //                if (cPayItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
        //                if (cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.CREDITCARD_ITEM || cPayItem.PAY_DTL_CD_01 != ItemConst.TR_ITEM_ID.CREDITCARD.CREDIT_CARD) continue;

        //                // 제휴카드 체크
        //                if (cPayItem.PAY_DTL_CD_03 != "M")
        //                {
        //                    // 해피포인트 제휴카드 체크
        //                    DataTable dtCardInfo = m_cMstPayDcService.Select(new string[] { PosMst.MST_CARD_PREFIX.TABLE_NAME, cPayItem.OCCUR_ENTRY_01.Substring(0, 6), "H" });
        //                    if (dtCardInfo != null && dtCardInfo.Rows.Count > 0)
        //                    {
        //                        foreach (DataRow dr in dtCardInfo.Rows)
        //                        {
        //                            int nLoc = CmUtil.GetDataRowInt(dr, PosMst.MST_CARD_PREFIX.DATA.LOC);
        //                            string sCheckValue = CmUtil.GetDataRowStr(dr, PosMst.MST_CARD_PREFIX.DATA.CHECK_VAL).Trim();
        //                            if (nLoc >= 33 && sCheckValue != "")
        //                            {
        //                                if (cPayItem.OCCUR_ENTRY_23 != "" && cPayItem.OCCUR_ENTRY_23.Substring(33 - nLoc).StartsWith(sCheckValue) == true)
        //                                {
        //                                    bCoopCardExist = true;
        //                                }
        //                            }
        //                            else
        //                            {
        //                                bCoopCardExist = true;
        //                            }
        //                            if ( bCoopCardExist == true ) break;
        //                        }
        //                    }
        //                }

        //                // 마이원카드 이거나 제휴카드 이면 
        //                if (cPayItem.PAY_DTL_CD_03 == "M" || bCoopCardExist == true)
        //                {
        //                    // 해피포인트 조회
        //                    string[] saRecvdData = null;
        //                    sRet = cHappyPoint.SearchPayment(new string[] { cPayItem.OCCUR_ENTRY_05, cPayItem.OCCUR_ENTRY_01, cPayItem.CanFiller1, "0" }, ref saRecvdData);
        //                    if (sRet == UserCom.RST_OK)
        //                    {
        //                        // 해피포인트 카드 등록 처리
        //                        sRet = cHappyPoint.SetPayment(new string[] { cPayItem.OCCUR_ENTRY_05, cPayItem.OCCUR_ENTRY_01, cPayItem.CanFiller1, "0", cPayItem.OCCUR_ENTRY_23 });
        //                        if (sRet == UserCom.RST_OK) cEtcItemHP = (Column.TR_ETC.DATA)cHappyPoint.GetPayment(new string[] { });
        //                    }
        //                }
        //            }
        //        }

        //        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //        // 해피포인트 적립 금액 계산
        //        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //        // 해피포인트 기본적립 대상 금액 획득
        //        m_cTrnStatus.Head.AftSavePoint = m_cDataService.GetPluTagetAmount(PosKey.MENU_KEY.HAPPY_POINT);

        //        if (cEtcItemHP == null)
        //        {
        //            //if (m_cTrnStatus.Head.AftSavePoint == 0 && m_cTrnStatus.Head.AftSaveAddInfo == "") return;          // 적립 대상금액 없음

        //            if (PosMstManager.GetPosOption(POS_OPTION.OPT029) != "0")   //  HP 적립확인 처리(0:사용안함, 1:사용함)
        //            {
        //                // 해피포인트 카드 등록 화면 진행
        //                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_HAPPY_POINT, PosKey.MENU_KEY.HAPPY_POINT, "1" });
        //            }
        //        }
        //        else
        //        {
        //            // 캠페인(해피포인트 적립) 설정 처리
        //            ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
        //            cCampaingMain.ExecuteCampaignHappyPointSave(PosConst.CAMPAIGN_PAY_KEY.HP_SAVE, null);

        //            if (m_cTrnStatus.Head.AftSavePoint == 0 && cEtcItemHP.HP_ADD_ACCUME == "")                          // 적립 대상금액 없음
        //            {
        //                cEtcItemHP.CANCEL_DIV = PosConst.CANCEL_DIV.CANCEL;
        //                return;
        //            }

        //            if (PosMstManager.GetPosOption(POS_OPTION.OPT030) != "1")   //  HP 자동적립 처리(0:사용안함, 1:사용함)
        //            {
        //                // 해피포인트 카드 등록 화면 진행
        //                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_HAPPY_POINT, PosKey.MENU_KEY.HAPPY_POINT, "1" });
        //            }
        //            else
        //            {
        //                // 해피포인트 적립 완료 처리
        //                sRet = cHappyPoint.CompletePayment(new string[] { });
        //            }
        //        }    
        //    }
        //    catch (Exception ex)
        //    {
        //        WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
        //              System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
        //    }
        //}

        private bool ItemSearch()
        {
            bool bRet = false;
            try
            {

                //충전, 판매 거래 경우 아닌 경우 만 사용 가능!
                if (m_cTrnStatus.Head.TradeKind.StartsWith(ItemConst.TRAN_KIND.CHARGESALE.DELIMITER) == true)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0364);
                }
                else
                {
                    string sLossCode = string.Empty;
                    sLossCode = WinBasic.ShowForm(new string[] { FormManager.FORM_SAL_ITEM_SEARCH });
                    //코드 받아 오기

                    if (sLossCode != UserCom.RST_ERR)
                    {

                        string[] aParam = sLossCode.Split(new string[] { "^" }, StringSplitOptions.None);
                        if (aParam.Length > 0)
                        {
                            for (int iRow = 0; iRow < aParam.Length; iRow++)
                            {
                                if (string.IsNullOrEmpty(aParam[iRow]) == false)
                                    RegisterPluItem("", PosConst.SALE_PLU_INPUT_TYPE.MENUKEY + aParam[iRow], "");
                            }
                        }

                    }
                }

            }
            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 bRet;
        }

        /// <summary>
        /// 직전 영수증 발행
        /// </summary>
        /// <returns></returns>
        private bool LastDealPrint()
        {
            bool bRet = false;
            try
            {
                string sRet = m_cSaleComplete.PosSaleLastRePrint(new string[] { });
                if (sRet == UserCom.RST_OK)
                {
                    bRet = true;
                }
                else
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0003);
                }
            }
            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 bRet;
        }
        /// <summary>
        /// 예약 등록
        /// </summary>
        /// <returns></returns>
        private bool RegSaleReservations()
        {
            bool bRet = false;
            try
            {
                // 판매LOSS 셋팅
                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_WAIT)
                {
                    string sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_RESERVATION_REG });
                    if (sRet != UserCom.RST_OK) return false;

                    ArrayList alReservedCustInfo = (ArrayList)StateObject.GetItemObject(Column.TR_RESERV_INFO.ITEM);

                    if (alReservedCustInfo.Count == 0)
                    {
                        //에러 
                        return false;
                    }
                    else
                    {
                        Column.TR_RESERV_INFO.DATA clReservedCustInfo = (Column.TR_RESERV_INFO.DATA)alReservedCustInfo[0];

                        m_cTrnStatus.Head.ReserveNo = clReservedCustInfo.RESERV_NO;
                        m_cTrnStatus.Head.ReserveYmd = clReservedCustInfo.RESERV_DT;
                    }

                    m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
                    m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_REG;

                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                    cFormSaleMain.DisplayInit(false, true);
                    bRet = true;
                }

            }
            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 bRet;
        }


        /// <summary>
        /// 예약 결제 등록
        /// </summary>
        /// <returns></returns>
        private void RegPayReservations()
        {
            try
            {
                string sRet = UserCom.RST_ERR;

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

                //예약 완료일때는 등록 할 수 없음
                if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE)
                {
                    //예약 완료 거래에서는 등록 할 수 없습니다
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0639);
                    return;
                }

                IPaymentUs m_ReservedPay = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.RESERVED_PAY);

                sRet = m_ReservedPay.SetPayment(new string[] { m_cTrnStatus.Sale.RemainPayAmt.ToString() });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크

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

            }
        }

        /// <summary>
        /// 예약 결제 완료
        /// </summary>
        /// <returns></returns>
        private bool RegSaleReservedFinish()
        {
            bool bRet = false;
            try
            {
                //정상 거래 인지 체크
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE)
                {
                    string sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_RESERVATION_FNS });

                    if (sRet != UserCom.RST_OK)
                    {
                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                        // 판매모드 변경
                        cFormSaleMain.DisplayInit(false, true);
                        return false;
                    }

                    // 상품 내역 불러오기
                    ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                    if (alPluItem.Count > 0)
                    {
                        // 상품 판매가 재계산
                        m_cPluService.ItemAmountExeccute(false, false);

                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                        // 판매모드 변경
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                        cFormSaleMain.DisplayInit(false, true);

                        // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                        cFormSaleMain.DisplayItem(0, false);

                        m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE;

                        m_cDataService.UpdatePayAmount();

                        ExecuteSaleMainProcess(PosKey.MENU_KEY.PAYMENTS, "", "", "");

                    }
                }
                else
                {
                    //판매 거래에서만 가능합니다.
                }


            }
            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 bRet;
        }

        /// <summary>
        /// TakeInOut
        /// </summary>
        /// <returns></returns>
        private bool SetTakeInOut()
        {
            try
            {

                if (CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT304), "1") == "0")
                {
                    //해당 기능은 POS 옵션에서 미사용으로 되어 있습니다.
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0414);
                    return false;
                }

                //Take In/Out
                string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_SAL_TAKE_IN_OUT });
                if (sRet.Equals(UserCom.RST_OK))
                {
                    ISalePluItemUs m_cPluService = (ISalePluItemUs)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.SALE_PLU_ITEM);

                    m_cPluService.ItemAmountExeccute(true, true);

                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                    //m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;

                    //cFormSaleMain.DisplayInit(false, true);

                    cFormSaleMain.DisplayItem(1, false);


                    //cFormSaleMain.DisplayItem(0, false);
                }

            }
            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 true;
        }

        /// <summary>
        /// 영수증 재발행
        /// </summary>
        /// <returns></returns>
        private bool SaleReReceiptRePrint()
        {
            try
            {
                // 영수증 재발행 시 프린터 데몬 Stop / Start(2017.09.04)

                //#20180329 프린터 간헐적 미출력 증상 수정 start
                //출력 할때 마다 open, close 하는 부분 한번만 하도록 수정
                //기존
                /*
                if (m_cPosStatus.Base.OlePosPrinterController == PosConst.POS_DEVICE_CONTROLLER.RS232)
                {
                    IPosPrinterUs cPrinterDaemon = (IPosPrinterUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_POSPRINTER);
                    cPrinterDaemon.StopPrinterDaemon();
                    System.Threading.Thread.Sleep(300);
                    cPrinterDaemon.StartPrinterDaemon();
                }
                */
                //변경
                #if(PRT_OPENCLOSE)   //프린터 포트 동작 변경시
                #else
                //#20180530 영수증 재발행시 프린터 데몬 stop 기능 주석 start
                /*
                if (m_cPosStatus.Base.OlePosPrinterController == PosConst.POS_DEVICE_CONTROLLER.RS232)
                {
                    IPosPrinterUs cPrinterDaemon = (IPosPrinterUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_POSPRINTER);
                    cPrinterDaemon.StopPrinterDaemon();
                    System.Threading.Thread.Sleep(300);
                    cPrinterDaemon.StartPrinterDaemon();
                }
                */
                //#20180530 영수증 재발행시 프린터 데몬 stop 기능 주석 end
                #endif
                //#20180329 프린터 간헐적 미출력 증상 수정 end

                // string sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_RECEIPT_REPRINT, "SALE" });
                var arg = m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.MENU_EXECUTE ? "" : "SALE";
                string sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_RECEIPT_REPRINT, arg });

                if (m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.MENU_EXECUTE) return true;

                if (sRet != UserCom.RST_OK)
                {
                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    // 판매모드 변경
                    cFormSaleMain.DisplayInit(false, true);
                    return false;
                }

                // 상품 내역 불러오기
                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (alPluItem.Count > 0)
                {
                    // 상품 판매가 재계산
                    m_cPluService.ItemAmountExeccute(true, true);

                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                    // 판매모드 변경
                    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                    cFormSaleMain.DisplayInit(false, true);

                    // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                    cFormSaleMain.DisplayItem(0, false);
                }
                return true;


            }
            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 true;
        }

        /// <summary>
        /// 교통카드 조회
        /// </summary>
        private void SchTMoney(string sMenuKey)
        {
            try
            {
                string sRet = UserCom.RST_ERR;

                // 신용카드 화면 진행
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_TMONEY_SEARCH, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                //승인 요청 처리


                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 영수증 반품
        /// </summary>
        /// <returns></returns>
        private bool SaleRefundReceipt()
        {
            try
            {
                string sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_RETURN_RECEIPT });

                if (m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.MENU_EXECUTE) return true;

                if (sRet != UserCom.RST_OK)
                {
                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    // 판매모드 변경
                    cFormSaleMain.DisplayInit(false, true);
                    return false;
                }

                // 상품 내역 불러오기
                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (alPluItem.Count > 0)
                {
                    // 상품 판매가 재계산
                    m_cPluService.ItemAmountExeccute(true, true);

                    // 판매화면
                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                    // 판매모드 변경
                    m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                    cFormSaleMain.DisplayInit(false, true);

                    // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                    cFormSaleMain.DisplayItem(0, false);
                }
                return true;
            }
            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 false;
        }


        /// <summary>
        /// 수정 고객수 
        /// </summary>
        /// <returns></returns>
        private bool EditCustCnt()
        {
            bool bRet = false;

            try
            {
                // 고객수 입력
                if (PosMstManager.GetPosOption(POS_OPTION.OPT004) == "0")
                {
                    //옵션 미사용
                    WinManager.ErrorMessage(string.Format("{0}({1})", MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0414), POS_OPTION.OPT004));
                }
                else if (PosMstManager.GetPosOption(POS_OPTION.OPT033) != "2" && PosMstManager.GetPosOption(POS_OPTION.OPT033) != "3")
                {
                    //옵션 미사용
                    WinManager.ErrorMessage(string.Format("{0}({1})", MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0414), POS_OPTION.OPT033));
                }
                else
                {
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT033) == "2")      //상세고객수
                    {
                        string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_SAL_AGE, "" });
                    }
                    else if (PosMstManager.GetPosOption(POS_OPTION.OPT033) == "3")      //고객수 
                    {
                        string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_USER_INPUT_DATA, PosConst.FRM_INPUT_DATA.GUEST_CNT });

                        if (sRet != UserCom.RST_ERR)
                        {
                            m_cTrnStatus.Head.CustCnt = CmUtil.IntParse(sRet);
                        }
                    }

                    bRet = true;
                }
            }
            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 bRet;
        }



        #region  세브란스 직원식 상품 등록 체크
        /// <summary>
        /// 세브란스 직원식 상품 등록 체크
        /// </summary>
        /// <param name="sFuncCode"></param>
        /// <returns></returns>
        public string SeveranceiTemCheck(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                // -------------------------------------------------------------------------------------------
                if (sMenuKey != PosKey.MENU_KEY.SEVERANCE_PAYMENTS && sMenuKey != PosKey.MENU_KEY.OTHER_PAYMENTS)
                {
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT034) == "1") //세브란스 일 경우
                    {
                        ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                        m_cTrnStatus.Sale.SetSeveranceiTemUse = false;
                        for (int iLoop = 0; iLoop < aSaleItem.Count; iLoop++)
                        {
                            Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iLoop];

                            if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cSaleItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue; // 지정취소

                            if (cSaleItem.SEVERANCE_MENU_DIV == "1" && cSaleItem.NONSALES_RSN_CD == "0")
                            {
                                // 세브란스 직원식 상품 존재 여부
                                m_cTrnStatus.Sale.SetSeveranceiTemUse = true;
                                break;
                            }
                        }

                        if (m_cTrnStatus.Sale.SetSeveranceiTemUse == true && m_cTrnStatus.Sale.SetSeveranceNormalPay != true)
                        {
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0265);
                            return sRet;
                        }
                    }
                }

                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

        /// <summary>
        /// 해피포인트 추후 적립
        /// </summary>
        /// <returns></returns>
        private bool HappyPointAfterSave()
        {
            try
            {
                string sRet = WinSale.ShowForm(new string[] { FormManager.FORM_SAL_HPP_APPROVAL_LATER });
                if (sRet != UserCom.RST_OK) return false;

                return true;
            }
            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 false;
        }

        /// <summary>
        /// 단골매장등록
        /// </summary>
        /// <returns></returns>
        private bool HappyPointRegularCust()
        {
            try
            {
                string sRet = WinPay.ShowForm(new string[] { FormManager.FORM_HPP_REGULAR_CUST });
                if (sRet != UserCom.RST_OK) return false;

                return true;
            }
            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 false;
        }

        /// <summary>
        /// 배달(콜센터, 배달의민족) 등록 처리
        /// </summary>
        /// <returns></returns>
        private void PayOrderDelivery(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;
                if (m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.NORMAL.SALE) return;

                IPaymentUs cPaySvr = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.SALEDELIVERY);

                sRet = cPaySvr.SetPayment(new string[] { sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                //cFormSaleMain.DisplayItem(1, false);

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                      System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 수동 돈통 오픈
        /// </summary>
        private void OpenManualCashdrawer()
        {
            try
            {
                if (m_cPosStatus.Base.TrainingFlag == "1")  //연습모드이면...
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0491);
                }
                else
                {
                    m_cSaleComplete.OpenManualCashdrawer();
                }


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

        /// <summary>
        /// 해피포인트 현황 조회
        /// </summary>
        private void HappyBuzzSearch()
        {
            try
            {
                WinBasic.ShowForm(new string[] { FormManager.FORM_HAPPY_BUZZ, PosKey.MENU_KEY.HAPPY_BUZ_SEARCH, "" });
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                      System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 온라인쿠폰(중국)
        /// </summary>
        private void PayOnLineCoupon(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                if (sMenuKey == PosKey.MENU_KEY.ONLINE_COUPONS)
                {
                    // 온라인쿠폰 등록
                    sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_ONLINE_COUPON, sMenuKey });
                    if (sRet != UserCom.RST_OK) return;

                    //// 판매화면
                    //IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                    //cFormSaleMain.DisplayItem(1, false);    // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)

                    CheckSaleComplete();        // 결제완료 체크
                }
                else
                {
                    // 온라인쿠폰 조회
                    sRet = WinSale.ShowForm(new string[] { FormManager.FORM_PAY_ONLINE_COUPON_SCH, sMenuKey });
                    if (sRet != UserCom.RST_OK) return;
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 수동주방출력처리 
        /// </summary>
        /// <remarks> 
        /// 주방프린터 수동출력 처리  0:자동 1:수동(프린터선택) 2:수동(상품선택)
        /// </remarks>
        public void MenualOrderKtchProcess()
        {
            try
            {
                //#20171020 log 추가 
                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                    "주방프린트사용여부 : " + PosMstManager.GetPosOption(POS_OPTION.OPT506));

                // 주방프린트 사용(0 : 미사용, 1 : 사용)
                if (PosMstManager.GetPosOption(POS_OPTION.OPT506) != "1") return;

                string arg = string.Empty;
                switch (PosMstManager.GetPosOption(POS_OPTION.OPT425))
                {
                    case "1": arg = FormManager.FORM_MENUAL_ORDER_KPS; break;
                    case "2": arg = FormManager.FORM_MENUAL_ORDER_ITEM; break;
                    default: return;
                }
                WinBasic.ShowForm(new string[] { arg });
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                            System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                            ex.Message);
            }
        }

        /// <summary>
        /// 주문내역서 출력
        /// </summary>
        /// <returns></returns>
        private bool OrderBillPrint()
        {
            try
            {
                ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (alPluItem.Count == 0) return false;

                // 주문 내역서 출력 처리
                ISaleCompleteUs cSaleComplete = (ISaleCompleteUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.SALE_COMPLETE);
                string sReturn = cSaleComplete.ExecuteOrderBillReceipt();

                return true;
            }
            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 false;
        }


        /// <summary>
        /// ServiceCharge 등록
        /// </summary>
        /// <returns></returns>
        private bool RegServiceChrge(string sFuncCode)
        {
            try
            {

                if (m_cPosStatus.Mst.SeriveFreeApplyDiv != ItemConst.SERVICE_CHARGE_APPLY_DIV.NONE)
                {
                    //점포 마스터에 봉사료 적용대상 구분이 적용 안함으로 되어 있어야 사용 가능합니다.
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0629);
                    return false;
                }

                string sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_SERVICE_CHARGE, sFuncCode });
                if (sRet != UserCom.RST_OK) return false;

                m_cDataService.UpdatePluAmount(true);

                // 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                cFormSaleMain.DisplayPayment();           // 결제등록정보 화면표시

                return true;
            }
            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 false;
        }

        /// <summary>
        /// 주방주문서 영수증프린터 출력 
        /// </summary>
        public void KtchOrderSheetToBillPrint()
        {
            try
            {
                // 주방장치 출력여부 확인 
                if (PosMstManager.GetPosOption(POS_OPTION.OPT506) != "1") return;

                // 영수증프린터 사용여부 확인 
                if (m_cDevStatus.Printer.UseYn == false) return;

                // Mod, 2017.04.10, 
                // KPS 데몬실행여부 확인 
                //if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT &&
                //    m_cPosStatus.Base.PosCommunicationType != PosConst.MAIN_POS_DIV.MAIN_POS) return;

                // 주방프린터 오류코드 취득 및 초기화 
                //잠시주석 2019.04.25
                string ktchErrorCode = m_cPosStatus.Sale.KtchPrintErrorCode;
                //if (string.IsNullOrWhiteSpace(ktchErrorCode)) return;
                m_cPosStatus.Sale.KtchPrintErrorCode = string.Empty;

                string ret = UserCom.RST_ERR;

                // 주방프린터와 영수증프린터가 동일장치의 경우 주문서 출력 
                ret = m_cOrderSheetSvr.Execute(new string[] { "ORDER_SHEET" });
                if (ktchErrorCode.StartsWith("XXXX"))
                {
                    if (ret != UserCom.RST_OK) m_cPosStatus.Sale.KtchPrintErrorCode = ktchErrorCode;
                    return;
                }

                // 주방프린터 오류 시 영수증프린터에 주문서 출력
                var msg = MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0642);
                var tmp = ktchErrorCode.Split('|');
                if (tmp.Length >= 3)
                {
                    var err = string.Empty;
                    //switch (tmp[0])
                    //{
                    //    case "0001": err = "(Printer open failed)"; break;
                    //    case "0002": err = "(Printer open failed)"; break;
                    //    case "0003": err = "(Printer power off)"; break;
                    //    case "0004": err = "(No paper)"; break;
                    //    case "0005": err = "(Printer cover open)"; break;
                    //}
                    msg += string.Format("\n#Kitchen Printer No. [{0}] {1} {2})", tmp[1], tmp[2], err);
                }
                // 주방프린터 에러 시 팝업 띄우지 않고 메인에서 무조건 출력(20170520)
                //if (WinManager.QuestionMessage(msg) == false)
                //{
                //    WinManager.ConfirmMessage(POS_MESSAGE.ERROR.MSG_0643);
                //    m_cOrderSheetSvr.Execute(new string[] { "CANCEL_BILLPRT" });
                //    return;
                //}
                ret = m_cOrderSheetSvr.Execute(new string[] { "ORDER_REPRINT" });
                if (ret != UserCom.RST_OK)
                {
                    m_cPosStatus.Sale.KtchPrintErrorCode = ktchErrorCode;
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                            System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                            ex.Message);
            }
        }

        /// <summary>
        /// 베트남 신용카드(VIP POINT) - 프리픽스 캠페인 적용
        /// </summary>
        /// <returns></returns>
        private bool PayVipPoint(string sFuncCode)
        {
            try
            {
                string sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_VIP_POINT, sFuncCode });
                if (sRet != UserCom.RST_OK) return false;

                CheckSaleComplete();        // 결제완료 체크

                return true;
            }
            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 false;
        }

        /// <summary>
        /// 선택 상품 할인
        /// </summary>
        /// <returns></returns>
        private bool MultiItemDc(string sFuncCode)
        {
            try
            {
                string sRet = WinPay.ShowForm(new string[] { FormManager.FORM_MULTI_DCITEM, sFuncCode });
                //if (sRet != UserCom.RST_OK) return false;

                // 상품 판매가 재계산
                m_cPluService.ItemAmountExeccute(true, true);

                // 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                cFormSaleMain.DisplayItem(0, false);

                return true;
            }
            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 false;
        }


        /// <summary>
        /// 판매 대기중 기능키 판매일자 체크
        /// </summary>
        /// <returns></returns>
        private bool WaitSaleDataCheck(string sMenuKey)
        {
            try
            {
                bool bTradeCheck = false;

                switch (sMenuKey)
                {
                    //체크
                    case PosKey.MENU_KEY.GIFT_SALE:					// 상품권판매
                    case PosKey.MENU_KEY.PREPAID_CARD:				// 선불카드판매
                    case PosKey.MENU_KEY.RETURN_ITEM:				// 낱개반품
                    case PosKey.MENU_KEY.SALE_LOSS:                 // 판매로스
                    case PosKey.MENU_KEY.CASH_APPROVAL_LATER:       // 사후 현금영수증
                    case PosKey.MENU_KEY.LAST_DEAL_PRINT:           // 직전영수증 출력
                    case PosKey.MENU_KEY.RESERVATIONS_REGISTER:     // 예약등록
                    case PosKey.MENU_KEY.RESERVATION_COMPLETED:     // 예약완료
                    case PosKey.MENU_KEY.HP_GIFT_CHARGED:           // 해피 기프트 충전
                    case PosKey.MENU_KEY.RETURN_RECEIPT:            // 영수증 반품
                    case PosKey.MENU_KEY.HPP_APPROVAL_LATER:        // 추후적립
                    case PosKey.MENU_KEY.HAPPY_ORDERS:              // 해피오더
                    case PosKey.MENU_KEY.HP_REGULAR_CUST:           // 단골매장등록
                    case PosKey.MENU_KEY.ORDER_COMPLETED:           // 주문완료
                        bTradeCheck = true;
                        break;
                }

                if (bTradeCheck == true)
                {
                    // 영업일자 체크
                    if (CmUtil.LongParse(m_cPosStatus.Base.SaleDate) < CmUtil.LongParse(System.DateTime.Now.ToString("yyyyMMdd")))
                    {
                        //#13342 개점/마감시간 허용 시간 제한 start, phj
                        //기존
                        /*
                        if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                        {
                            WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                            return false;
                        } 
                        */

                        //변경
                        IDataCommonUs m_cMstCmm = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON);
                        string sOpenTime = string.Empty;
                        sOpenTime = m_cMstCmm.MstCmmSearch("T0032", "1"); //POS 개점 필수시간

                        if (sOpenTime != "")
                        {
                            if (CmUtil.LongParse(System.DateTime.Now.ToString("HHMM")) > CmUtil.LongParse(sOpenTime))
                            {
                                WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                                return false;
                            }
                        }
                        else
                        {
                            if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                            {
                                WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                                return false;
                            }
                        }
                        //#13342 개점/마감시간 허용 시간 제한 end, phj
                    }
                }
            }
            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 true;
        }

        /// <summary>
        /// 생일초 계산
        /// </summary>
        /// <param name="sFuncCode"></param>
        /// <returns></returns>
        private bool BrithDayCandle(string sFuncCode)
        {
            try
            {
                string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_BRITHDAY_CANDLE, sFuncCode });
                if (sRet != UserCom.RST_OK) return false;

                return true;
            }
            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 false;
        }

        /// <summary>
        /// 결제 상단 MOT 변경
        /// </summary>
        /// <param name="sFuncCode"></param>
        private void SetPayMainTopMot(string sFuncCode)
        {
            try
            {
                // 판매화면
                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);
                cFormSaleMain.SetTopMot(sFuncCode);
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        #region 시리얼 변환 프로그램 체크
        /// <summary>
        /// 시리얼 변환 프로그램 체크
        /// </summary>
        private void SerialMsrToEmul()
        {
            try
            {
                //#20171019 IC리더기 사용시 O2MSR 실행 안하도록 수정 start
                //기존
                //if (m_cDevStatus.Msr.UseYn == true && m_cPosStatus.Base.OlePosMsrController == "2")
                //변경
                if (m_cDevStatus.Msr.UseYn == true && m_cPosStatus.Base.OlePosMsrController == "2" && m_cDevStatus.ICReader.UseYn == false)
                //#20171019 IC리더기 사용시 O2MSR 실행 안하도록 수정 end
                {
                    System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName(PosConst.MSR_SERIAL_EMULATOR.APP_PROCESS);
                    if (p.GetLength(0) > 0) return;

                    string strappname = BaseCom.NxBinPath + PosConst.MSR_SERIAL_EMULATOR.APP_FILE;
                    System.Diagnostics.Process.Start(strappname);
                }
            }
            catch (Exception ex)
            {
                UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 start
        //기존
        /*
        //17.05.18 dkshin 쇼킹박스 추가
        /// <summary>
        /// 쇼킹박스 - 영수증 출력
        /// </summary>
        //private ISaleReceipt m_cTradeDeal = null;
        private bool ShockingBox(string sInPutData)
        */
        //변경
        private bool ShockingBox(string sMenuKey, string sInPutData)
        //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 end
        {
            try
            {
                //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 start

                #region 기존
                /*

                //쇼킹박스 영수증 출력
                //m_cTradeDeal.PrintReceipt("test");
                //sPrtData = string.Format("{0:#,##0}", m_cTrnStatus.Sale.RemainPayAmt);

                if (sInPutData != string.Empty)
                {//쇼킹박스 상품 불러오기

                    IHoldDeal m_cHoldDeal = (IHoldDeal)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.HOLD_DEAL);
                    DataTable dt = m_cHoldDeal.SearchShockingBoxDealList(sInPutData);
                    if (dt == null || dt.Rows.Count == 0)
                    {
                        // 거래내역이 존재하지 않습니다.
                        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0269));
                        return false;
                    }
                    else
                    {
                        DataRow dr = dt.Rows[0];

                        //m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.LOG.SHOCKING_BOX;
                        m_cHoldDeal.LoadLocalTranPlu(dr["SALE_DT"].ToString(), dr["POS_NO"].ToString(), dr["REG_NO"].ToString());
                        m_cHoldDeal.UpdateHoldDeal(dr["SALE_DT"].ToString(), dr["POS_NO"].ToString(), dr["REG_NO"].ToString(), "1", 0, 0);

                        // 상품 판매가 재계산
                        m_cPluService.ItemAmountExeccute(true, true);



                        // 쇼킹박스건 결제인지 체크하기 위해 설정
                        //m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.LOG.SHOCKING_BOX;
                        m_cTrnStatus.Head.ShockingBoxStat = "1";//0:쇼킹박스 완성 1:쇼킹방스불러오기
                        m_cTrnStatus.Head.ShockingBoxBarcodeData = dr["SALE_DT"].ToString() + dr["REG_NO"].ToString();

                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                        // 판매모드 변경
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                        cFormSaleMain.DisplayInit(false, true);

                        // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                        cFormSaleMain.DisplayItem(0, false);
                    }
                }
                else// 쇼킹박스 처리
                {
                    //정상 거래 인지 체크
                    if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL
                        && (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS))
                    {
                        // 영업일자 체크
                        if (CmUtil.LongParse(m_cPosStatus.Base.SaleDate) < CmUtil.LongParse(System.DateTime.Now.ToString("yyyyMMdd")))
                        {
                            if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                            {
                                WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                                return false;
                            }
                        }

                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.LOG.SHOCKING_BOX;
                        m_cTrnStatus.Head.ShockingBoxStat = "0";

                        // 쇼킹박스 처리
                        string sRet = m_cSaleComplete.PosShockingBoxExecute();
                        if (sRet != UserCom.RST_OK) return false;

                        // 판매상태 변경
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_WAIT;

                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                        // 거래 완료 후 초기화 처리
                        cFormSaleMain.DisplayInit(true, true);
                        // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                        cFormSaleMain.DisplayItem(0, true);
                    }
                }
                */
                #endregion  기존

                #region 변경
                string sTradeKind = "";
                string sTrade_Stat = "";
                string sSale_dt = "";
                string sPos_no = "";
                string sReg_no = "";
                string sOrg_Bill_PosNo = "";
                string sOrg_Bill_Dt = "";
                string sOrg_Bill_No = "";
                string sShockingBoxBarcodeData = "";
                string sShockingBoxTradeKind = "";

                if (sMenuKey == PosKey.MENU_KEY.ITEMINFO_PRINT)
                {
                    // 상품정보출력(해피오더 랜덤박스)
                    sTradeKind = ItemConst.TRAN_KIND.HPO_LOG.LANDOM_BOX;
                }
                else if (sMenuKey == PosKey.MENU_KEY.SHOCKING_BOX)
                {
                    // 쇼킹박스 
                    sTradeKind = ItemConst.TRAN_KIND.LOG.SHOCKING_BOX;
                }

                IHoldDeal m_cHoldDeal = (IHoldDeal)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.HOLD_DEAL);

                if (sInPutData != string.Empty)
                {
                    DataTable dt = m_cHoldDeal.SearchShockingBoxDealList(sInPutData, sTradeKind, "0");
                    if (dt == null || dt.Rows.Count == 0)
                    {
                        // 거래내역이 존재하지 않습니다.
                        WinManager.ConfirmMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0269));
                        return false;
                    }
                    else
                    {
                        DataRow dr = dt.Rows[0];

                        sTrade_Stat = dr["TRADE_STAT"].ToString();
                        sSale_dt = dr["SALE_DT"].ToString();
                        sPos_no = dr["POS_NO"].ToString();
                        sReg_no = dr["REG_NO"].ToString();

                        m_cHoldDeal.LoadLocalTranPlu(sSale_dt, sPos_no, sReg_no);
                        m_cHoldDeal.UpdateHoldDeal(sSale_dt, sPos_no, sReg_no, "1", 0, 0);

                        // 상품 판매가 재계산
                        m_cPluService.ItemAmountExeccute(true, true);

                        // 쇼킹박스건 결제인지 체크하기 위해 설정 
                        m_cTrnStatus.Head.ShockingBoxStat = "1";//0:쇼킹박스 완성 1:쇼킹방스불러오기
                        m_cTrnStatus.Head.ShockingBoxBarcodeData = sSale_dt + sReg_no;
                        m_cTrnStatus.Head.ShockingBoxTradeKind = sTradeKind;

                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                        // 판매모드 변경
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_DOING;
                        cFormSaleMain.DisplayInit(false, true);

                        // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                        cFormSaleMain.DisplayItem(0, false);
                    }
                }
                else// 쇼킹박스 처리
                {
                    //정상 거래 인지 체크
                    if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL
                        && (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS))
                    {
                        // 영업일자 체크
                        if (CmUtil.LongParse(m_cPosStatus.Base.SaleDate) < CmUtil.LongParse(System.DateTime.Now.ToString("yyyyMMdd")))
                        {
                            if (CmUtil.LongParse(System.DateTime.Now.ToString("HH")) > 5)
                            {
                                WinManager.ErrorMessage(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0184));
                                return false;
                            }
                        }


                        sShockingBoxBarcodeData = m_cTrnStatus.Head.ShockingBoxBarcodeData; // 리딩한 바코드번호 
                        sShockingBoxTradeKind = m_cTrnStatus.Head.ShockingBoxTradeKind; // 리딩한 거래종별 

                        m_cTrnStatus.Head.TradeKind = sTradeKind; // 거래종별 
                        m_cTrnStatus.Head.ShockingBoxStat = "0"; //상태

                        // 쇼킹박스 처리
                        string sRet = m_cSaleComplete.PosShockingBoxExecute();
                        if (sRet != UserCom.RST_OK) return false;

                        // 판매상태 변경
                        m_cPosStatus.Sale.SaleFlow = PosConst.SALE_FLOW.SALE_WAIT;

                        // 판매화면
                        IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                        // 거래 완료 후 초기화 처리
                        cFormSaleMain.DisplayInit(true, true);

                        // 상품등록 내역 화면 표시(0:LastItem, 1::OldFocus)
                        cFormSaleMain.DisplayItem(0, true);

                        //
                        DataTable dt = m_cHoldDeal.SearchShockingBoxDealList(sShockingBoxBarcodeData, sShockingBoxTradeKind, "1");
                        if (dt != null && dt.Rows.Count > 0)
                        {
                            DataRow dr = dt.Rows[0];
                            sTrade_Stat = dr["TRADE_STAT"].ToString();
                            sSale_dt = dr["SALE_DT"].ToString();
                            sPos_no = dr["POS_NO"].ToString();
                            sReg_no = dr["REG_NO"].ToString();
                            sOrg_Bill_PosNo = dr["ORG_BILL_POSNO"].ToString();
                            sOrg_Bill_Dt = dr["ORG_BILLDT"].ToString();
                            sOrg_Bill_No = dr["ORG_BILL_NO"].ToString();

                            // 쇼킹박스 불러오면 trade_stat 1로 변경 -> 쇼킹박스 기능키 클릭하면 
                            // 이 전에 읽어왔던 쇼킹박스건이 trade_stat 0으로 업데이트 안되고 1로 남아있기 때문에 
                            // 다시 바코드 리딩 했을 때 읽어올 수 가 없었음. 
                            // 그렇기 때문에 이 전에 리딩했던번호 trade_stat 0으로 업데이트.
                            // (trade_stat 1 이고 매출처리가 안된 것)
                            if (sTrade_Stat == "1" && (sOrg_Bill_PosNo == "" && sOrg_Bill_Dt == "" && sOrg_Bill_No == ""))
                            {
                                m_cHoldDeal.UpdateHoldDeal(sSale_dt, sPos_no, sReg_no, "0", 0, 0);
                            }
                        }
                    }
                }
                #endregion  변경

                //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 end
            }
            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 true;
        }
        //#20170731, 해피기프트카드(코나머니) 개발 Start, srlee
        #region 해피기프트카드(코나머니)
        /// <summary>
        /// 해피기프트카드(코나머니)  
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void PayHappyGiftCard(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                // 해피기프트카드(코나머니)
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_HPGIFTCARD, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion
        //#20170731, 해피기프트카드(코나머니) 개발 End, srlee

        //20171013 dkshin 해피기프트(신) IC/RF 충전 및 승인
        #region 해피기프트(신) 충전
        /// <summary>
        /// 해피기프트(신) 충전
        /// </summary>
        /// <param name="sMenuKey"></param>
        //private void HappyGiftCardRecharge(string sMenuKey)
        private void HappyGiftNewRecharge(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;

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

                // 해피기프트(신) 충전
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_SAL_HP_GIFT_NEW_CHARGED, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        #region PayPointMobileUnity 제휴카드(통합) 할인 처리(2017.08.29) -- START
        /// <summary>
        /// 제휴카드(통합) 할인 처리
        /// </summary>
        /// <param name="sMenuKey"></param>
        private void PayPointMobileUnity(string sMenuKey)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return;

                if (m_cPosStatus.Mst.CorpDiv == ItemConst.CORP_DIV.PC)
                {
                    ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                    foreach (Column.TR_PAYMENT.DATA cPayItem in alPayItem)
                    {
                        if (cPayItem.CANCEL_DIV != PosConst.CANCEL_DIV.NORMAL) continue;

                        //#20171012 해피포인트 사용 후 통신사 할인 중복 가능 start
                        //기존
                        //if (cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.MOBILECON_ITEM)     // 통신사할인 모바일쿠폰과 중복 가능
                        //변경
                        if ((cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.MOBILECON_ITEM) &&
                            ((cPayItem.PAY_WAY_CD != ItemConst.TR_ITEM_ID.POINT_ITEM) || (cPayItem.PAY_DTL_CD_01 != ItemConst.TR_ITEM_ID.POINT_USE.HAPPY_POINT)))
                        //#20171012 해피포인트 사용 후 통신사 할인 중복 가능 end
                        {
                            ///////////////////////////////////////
                            //#20180618_웰컴카드 수정_grayber
                            // 기존
                            //WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0392);
                            // 변경
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0792);
                            ///////////////////////////////////////
                            return;
                        }
                    }
                }
                else
                {
                    if (m_cTrnStatus.Sale.RecvedPayAmt > 0)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0392);
                        return;
                    }
                }

                // OCB 적립 후 불가
                ArrayList alEtc = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtc)
                {
                    if (cEtcItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.OCB_SAVE)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0555);
                        return;
                    }
                }

                // 제휴카드(통합) 할인 처리
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_PAY_POINT_MOBILE_UNITY, sMenuKey });
                if (sRet != UserCom.RST_OK) return;

                CheckSaleComplete();        // 결제완료 체크
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        #endregion

        //#20171016 스퀘어 점포일 때 실점포 코드로 넘기기 start, phj
        #region (복합매장)에서 외상, 선불카드 일 때 여러 점포의 제품을 찍었다면 사용하지 못하도록 팝업 오픈.

        private bool OtherItem_DuplicateCheck()
        {
            bool bResult = true;
            string sFrtShopCD = string.Empty;
            ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

            for (int iRow = 0; aSaleItem.Count > iRow; iRow++)
            {
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)aSaleItem[iRow];
                if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                if (sFrtShopCD == string.Empty)
                {
                    sFrtShopCD = cPluItem.SUB_SHOP_CD;
                }

                if (sFrtShopCD != cPluItem.SUB_SHOP_CD)
                {
                    bResult = false;
                    break;
                }
            }

            if (bResult == false)
            {
                //한 종류의 브랜드 제품만 선택 시 사용할 수 있습니다.
                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0738);
            }

            return bResult;
        }

        #endregion
        //#20171016 스퀘어 점포일 때 실점포 코드로 넘기기 end, phj    

        //#20171227, 예약증 양식 출력 Start
        /// <summary>
        /// 예약증 양식 출력
        /// </summary>
        /// <param name="sFuncCode"></param>
        /// <returns></returns>
        private bool ReservationFormPrint()
        {
            try
            {
                string sRet = m_cSaleComplete.ExecuteReservationForm();
                if (sRet != UserCom.RST_OK) return false;

                return true;
            }
            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 false;
        }
        //#20171227, 예약증 양식 출력 End

        //#20180413 웰컴카드 신규기능 추가 start,phj
        private bool WelcomeCard_Issue(string sMenuKey, string sOpenKey)
        {
            string sRet = UserCom.RST_ERR;

            if (PosMstManager.GetPosOption(POS_OPTION.OPT516) != "1")
            {
                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0790);
                return false;
            }

            try
            {                
                if (m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.NORMAL) return false;
                sRet = WinPay.ShowForm(new string[] { FormManager.FORM_WELCOMECARD_ISSUE, sMenuKey, sOpenKey }); //sOpenKey 1: 영업메뉴, 2: 결제화면
                if (sRet != UserCom.RST_OK) return false;

                //CheckSaleComplete();        // 결제완료 체크

                return true;
            }
            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 false;
            }
        }
        //#20180413 웰컴카드 신규기능 추가 end,phj

        //#15884 해피오더 실시간 추가재고 등록메뉴 및 알람기능 개발 start
        private void HappyOrder_AddInventory_Menu(string sFuncCode)
        {
            try
            {
                WinBasic.ShowWebPos(sFuncCode);
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." +
                                            System.Reflection.MethodBase.GetCurrentMethod().Name + "()",
                                            ex.Message);
            }
        }
        //#15884 해피오더 실시간 추가재고 등록메뉴 및 알람기능 개발 end

        //#16232 환경부 1회용컵 사용줄이기 관련 테이크인아웃 설정 start
        #region 제조음료 포함 여부 체크
        /// <summary>
        /// 제조음료 포함 여부 체크
        /// </summary>
        /// <returns></returns>
        public bool ChkProdItemTakeInOutYN()
        {
            bool bRet = false;
            string sQuery = "";

            try
            {
                // 상품정보
                ArrayList xSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                for (int iRow = 0; iRow < xSaleItem.Count; iRow++)
                {
                    Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)xSaleItem[iRow];

                    //Take In/Out 부가상품으로 추가된 상품들 일괄 삭제 처리
                    if (cSaleItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.OPT_MENU &&
                       (cSaleItem.ITEM_PLU_CD == "9901" || cSaleItem.ITEM_PLU_CD == "9902"))
                    {
                        xSaleItem.RemoveAt(iRow);
                        //삭제된 경우 for문에서 나가지 않도록 row '-' 처리
                        iRow--;
                    }
                }

                // 상품정보
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                for (int iRow = 0; iRow < aSaleItem.Count; iRow++)
                {
                    Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iRow];

                    //결제창 진입 전 설정된 Take In/Out 관련 설정값 초기화
                    //cSaleItem.PROD_TAKEINOUT_YN = "0";
                    //cSaleItem.PROD_TAKEINOUT_DIV = "";

                    if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cSaleItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL)
                    {
                        continue;   // 지정취소
                    }
                    else
                    {
                        //공통코드에서 해당 상품이 TakeIn/Out 선택이 필요한 상품인지 대분류 + 중분류로 체크
                        sQuery = "SELECT * FROM POSMST..MST_CMM \n";
                        sQuery += " WHERE CMP_CD       = '" + m_cPosStatus.Base.CmpCd + "' \n";
                        sQuery += "   AND CMM_GRP_CD   = 'S0110' \n";
                        sQuery += "   AND SALES_ORG_CD = '" + m_cPosStatus.Base.BrandCd + "' \n";
                        sQuery += "   AND '" + cSaleItem.M_CLSS + "' LIKE (CHAR_VAL_TITLE_VAL_01 + CHAR_VAL_TITLE_VAL_02) + '%' \n";
                        sQuery += "   AND USE_YN       = '" + PosConst.MST_USE_YN.YES + "'\n";

                        DataTable dtTakeInOutInfo = m_cMstService.Select(new string[] { sQuery });

                        if (dtTakeInOutInfo != null && dtTakeInOutInfo.Rows.Count > 0)
                        {
                            cSaleItem.PROD_TAKEINOUT_YN = "1";
                            bRet = true;
                            //break;
                        }
                        else
                        {
                            cSaleItem.PROD_TAKEINOUT_YN = "0";
                        }
                    }
                }

                IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                cFormSaleMain.DisplayItem(1, false);

            }
            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 bRet;
        }
        #endregion 제조음료 포함 여부 체크

        #region 제조음료 Take In/Out 사용여부 체크
        /// <summary>
        /// 제조음료 Take In/Out 사용여부 체크
        /// </summary>
        /// <returns></returns>
        public bool ChkProdItemTakeInUse()
        {
            bool sRet = false;
            string sQuery = "";
            string sCmmTakeInOutUse = "";
            string sCmmTakeInOutDiv = "";

            try
            {
                //환경설정 정보가 없으면 공통코드의 기본값으로 설정
                if (m_cPosStatus.Base.ProdTakeInOutUse.Trim() == "" || m_cPosStatus.Base.ProdTakeInOutDiv.Trim() == "")
                {
                    //공통코드의 해당 영업조직 기본값 가져오기
                    sQuery += "SELECT TOP 1 * FROM POSMST..MST_CMM \n";
                    sQuery += " WHERE CMP_CD       = '" + m_cPosStatus.Base.CmpCd + "' \n";
                    sQuery += "   AND CMM_GRP_CD   = 'T0040' \n";
                    sQuery += "   AND SALES_ORG_CD = '" + m_cPosStatus.Base.BrandCd + "' \n";
                    sQuery += "   AND USE_YN       = '" + PosConst.MST_USE_YN.YES + "'\n";

                    DataTable dtTakeInOutInfo = m_cMstService.Select(new string[] { sQuery });

                    if (dtTakeInOutInfo != null && dtTakeInOutInfo.Rows.Count > 0)
                    {
                        DataRow drData = dtTakeInOutInfo.Rows[0];

                        sCmmTakeInOutUse = CmUtil.GetDataRowStr(drData, PosMst.MST_COMMON.DATA.CHAR_VAL_TITLE_VAL_01);
                        sCmmTakeInOutDiv = CmUtil.GetDataRowStr(drData, PosMst.MST_COMMON.DATA.CHAR_VAL_TITLE_VAL_02);
                    }

                    //Take In/Out 사용여부
                    if (m_cPosStatus.Base.ProdTakeInOutUse.Trim() == "")
                    {
                        m_cPosStatus.Base.ProdTakeInOutUse = sCmmTakeInOutUse;
                    }
                    //Take In/Out 기본값
                    if (m_cPosStatus.Base.ProdTakeInOutDiv.Trim() == "")
                    {
                        m_cPosStatus.Base.ProdTakeInOutDiv = sCmmTakeInOutDiv;
                    }
                }

                if (m_cPosStatus.Base.ProdTakeInOutUse == "1")
                {
                    sRet = true;
                }
                else
                {
                    sRet = false;
                }
            }
            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 제조음료 Take In/Out 사용여부 체크

        #region 제조음료 Take In/Out 창 표시
        /// <summary>
        /// 제조음료 Take In/Out 창 표시
        /// </summary>
        /// <returns></returns>
        private bool SetProdTakeInOut()
        {
            try
            {
                //Take In/Out
                string sRet = WinBasic.ShowForm(new string[] { FormManager.FORM_SAL_TAKE_IN_OUT_PROD });
                if (sRet.Equals(UserCom.RST_OK))
                {
                    ISalePluItemUs m_cPluService = (ISalePluItemUs)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.SALE_PLU_ITEM);

                    m_cPluService.ItemAmountExeccute(true, true);

                    IFormSaleMainUs cFormSaleMain = (IFormSaleMainUs)FormManager.GetForm(FormManager.FORM_SAL_MAIN);

                    cFormSaleMain.DisplayItem(1, false);
                }
            }
            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 true;
        }
        #endregion 제조음료 Take In/Out 창 표시
        //#16232 환경부 1회용컵 사용줄이기 관련 테이크인아웃 설정 end

    }
}
