using System;
using System.Text;
using System.Collections;
using System.Windows.Forms;

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

/*-----------------------------------------------------------------------------------------------*/
// 설      명 : 거래데이터 생성
// 작  성  자 : 
// 변경  이력 : 
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.Service
{
    class MakeTranLog : IServiceUs, IMakeAccADMT
    {
        private SManager sManager = new SManager();                                 // 이 객체를 통해 업무 Service 호출
        private StateServer StateObject = (StateServer)StateServer.GetInstance();   // StateObject : StateServer Object (객체)
        private PosStatus m_cPosStatus = null;                                      // 기본정보 참조
        private TranStatus m_cTrnStatus = null;                                     // 거래정보 참조
        
        private IDataCommonUs m_cDataCommSrv = null;
        private IDatabaseSQL m_cSqlDbService = null;                                // 데이터베이스 관리

        /// <summary>
        /// 트란데이터
        /// </summary>
        private string m_sTranData;

        public MakeTranLog()
        {
            m_cPosStatus = (PosStatus)StateObject.POS;      //POS 기본정보
            m_cTrnStatus = (TranStatus)StateObject.TRAN;    //POS 거래정보
            m_cDataCommSrv = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON);
            m_cSqlDbService = (IDatabaseSQL)sManager.InitServiceInstance(ServiceLists.AGENT_DATABASE.DLL, ServiceLists.AGENT_DATABASE.DATABASE_MSSQL);
        }

        #region 거래데이터 생성
        /// <summary>
        /// 거래데이터 생성 
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string Execute(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                m_sTranData = "";
                StringBuilder sb = new StringBuilder();
                
               
                m_sTranData = sb.ToString();

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

        //#region 거래번호 증가 체크
        ///// <summary>
        ///// 
        ///// </summary>
        ///// <returns></returns>
        //public bool TradeNoAddCheck()
        //{

        //    bool bRet = true;

        //    try
        //    {
        //        if (m_cTrnStatus.Head.TrainModeYn == "0"&& 
        //            (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_REG ||
        //            m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.FORIGN.O2O || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.FORIGN.SHOPPINGMALL || // m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.CHARGE || 
        //            m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.GIFT || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.PREPAID || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.CHARGESALE.REFUND || 
        //            m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.STATEMENT.ADJUSTMENT || // m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.STATEMENT.CLOSING_MONEY || 
        //            m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.STATEMENT.MIDDLE_ADJUSTMENT))
        //        {
        //            //증가!
        //        }
        //        else
        //        {
        //            //미증가!
        //            bRet = 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 거래 데이터 저장 처리
        /// <summary>
        /// 거래 데이터 저장 처리
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string SaveTranExecute(string[] aParam)
        {
            string sRet = UserCom.RST_ERR;
            try
            {
                if (m_cDataCommSrv.TradeNoAddCheck("") == true)
                {
                    m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource, m_cPosStatus.Base.LocalDbCatalog, m_cPosStatus.Base.LocalDbUserID, m_cPosStatus.Base.LocalDbPassword);
                    m_cSqlDbService.Begin();

                    //17.05.18 dkshin 쇼킹박스 추가
                    //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.LOG.SHOCKING_BOX && m_cTrnStatus.Head.ShockingBoxStat == "1")
                    //    m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.NORMAL.SALE;

                    sRet = SaveEtcItem();                       // 기타정보 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveEtcItem");

                        return sRet;
                    }

                    sRet = SaveCampaignItem();                  // 캠페인정보 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveCampaignItem");

                        return sRet;
                    }

                    sRet = SaveSignItem(aParam[0]);             // 사인데이터 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveSignItem");

                        return sRet;
                    }

                    sRet = SaveDpstWthdr();                     // 입출금정보 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveDpstWthdr");

                        return sRet;
                    }

                    sRet = SavePluItem();                       // 상품정보 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SavePluItem");

                        return sRet;
                    }

                    sRet = SavePaymentItem();                   // 결제정보 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SavePaymentItem");

                        return sRet;
                    }

                    sRet = SaveTranReservInfo(aParam[0]);       // 트란예약 고객 정보 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveTranReservInfo");

                        return sRet;
                    }

                    sRet = SaveGuestCnt();                      // 고객수정보 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveGuestCnt");

                        return sRet;
                    }

                    DataTable dtReturn = null;
                    sRet = SaveAccADMT(m_cTrnStatus.Head.TradeKind, m_cPosStatus.Base.SaleDate, ref dtReturn, "0");     // 정산지 저장
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveAccADMT");

                        return sRet;
                    }
                    //#Rhee, 20180116 미국 예약등록으로 결제완료이면 전송안되게 SEND_YN = '1' 변경 start 
                    // 기존(Rhee)
                    ////#20180131 인천공항 통합POS 사용유무가 사용이면 SEND_YN을 A로 설정 start
                    ////TR_SALE_HEADER, TR_SALE_JOURNAL
                    ////기존
                    //sRet = SaveTranHeader(aParam[0]);           // 트란해더 저장
                    ////변경
                    ///*
                    //if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1")
                    //{
                    //    sRet = SaveTranHeader("A");           // 트란해더 저장
                    //}
                    //else
                    //{
                    //    sRet = SaveTranHeader(aParam[0]);           // 트란해더 저장
                    //}
                    //*/
                    ////#20180131 인천공항 통합POS 사용유무가 사용이면 SEND_YN을 A로 설정 end

                    // 변경(Rhee)
                    if ((m_cPosStatus.Base.CmpCd.Equals("PCUS") && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE) && (m_cTrnStatus.Head.TradeDiv == "0"))
                    {
                        m_cTrnStatus.Head.TradeKind = ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_PICKUP;             // 픽업모드로 변경
                        sRet = SaveTranHeader("1");           // 트란해더 저장
                    }
                    //#20180131 인천공항 통합POS 사용유무가 사용이면 SEND_YN을 A로 설정 start
                    else if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1" 
                        //grayber@20180228 [BRKR] 인천공항 SEND_YN 매출전송유무 'A' 제거
                        && m_cPosStatus.Mst.CorpDiv.Equals(ItemConst.CORP_DIV.BR) != true
                        //grayber@20180228 [BRKR] 인천공항 SEND_YN 매출전송유무 'A' 제거
                        )
                    {
                        sRet = SaveTranHeader("A");           // 트란해더 저장
                    }
                    //#20180131 인천공항 통합POS 사용유무가 사용이면 SEND_YN을 A로 설정 end
                    else
                    {
                        sRet = SaveTranHeader(aParam[0]);           // 트란해더 저장
                    }
                    
                    //#Rhee, 20180116 미국 예약등록으로 결제완료이면 전송안되게 SEND_YN = '1' 변경 end

                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveTranHeader");

                        return sRet;
                    }

                    if (aParam[0] != "1")       // 거래데이터 복구시 주방출력 안함(2017.05.24)
                    {
                        sRet = SaveKtchOrdMsg();                    // 주방 데이터 저장
                        if (sRet != UserCom.RST_OK)
                        {
                            UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveKtchOrdMsg");

                            return sRet;
                        }
                    }

                    //17.05.18 dkshin 쇼킹박스 추가
                    //쇼킹박스 결제 영수증 번호 update(반품시 필요!)
                    if (m_cTrnStatus.Head.ShockingBoxStat == "1")
                    {
                        sRet = UpdateShockingBoxTradeNo();
                        if (sRet != UserCom.RST_OK)
                        {
                            UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => UpdateShockingBoxTradeNo");

                            return sRet;
                        }
                    }

                    //2017-06-02 dkshin 해피앱 추후적립
                    if (m_cPosStatus.Mst.CntryDiv == ItemConst.CNTRY_DIV.KR)
                    {
                        if (m_cTrnStatus.Head.AftSavePoint > 0)
                        {
                            //#20170809 해피포인트 업무 미사용시 해피앱 추후적립 기능 적용 안되도록 수정 start
                            //기존
                            //sRet = SaveHPAppAfter();
                            //변경

                            //#20180509 해피앱 추후적립 사용여부 옵션 처리 start
                            //기존
                            //if (PosMstManager.GetPosOption(POS_OPTION.OPT316) != "0")   // 해피포인트 업무 사용 여부(0:사용안함, 1:사용함(한국), 2:사용함(중국))
                            //변경
                            if (PosMstManager.GetPosOption(POS_OPTION.OPT316) == "1" &&     // 해피포인트 업무 사용 여부(0:사용안함, 1:사용함(한국), 2:사용함(중국))
                                PosMstManager.GetPosOption(POS_OPTION.OPT515) == "1")       // 해피앱 추후적립 사용 여부(0:사용안함, 1:사용함)
                            //#20180509 해피앱 추후적립 사용여부 옵션 처리 end
                            {
                                //#20181023 반품 건에도 해피앱추후적립 데이터 생성되는 현상 막기 start
                                //기존
                                //sRet = SaveHPAppAfter();
                                
                                //변경
                                //일반          TradeDiv 0 && org_info == "" && TradeKind 00
                                //일반반품      TradeDiv 1 && org_info != "" && TradeKind 00
                                //낱개반품      TradeDiv 1 && org_info == "" && TradeKind 00
                                //낱개반품반품  TradeDiv 0 && org_info != "" && TradeKind 00
                                //로스          TradeDiv 0 && org_info == "" && TradeKind 50
                                //로스반품      TradeDiv 1 && org_info != "" && TradeKind 50
                                string org_info = m_cTrnStatus.Head.OrgSaleDate + m_cTrnStatus.Head.OrgPosNo + m_cTrnStatus.Head.OrgTradeNo;

                                if ((m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE) &&
                                    (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL && org_info == ""))
                                {
                                    sRet = SaveHPAppAfter();
                                }
                                //#20181023 반품 건에도 해피앱추후적립 데이터 생성되는 현상 막기 end

                                if (sRet != UserCom.RST_OK)
                                {
                                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveHPAppAfter");

                                    return sRet;
                                }
                            }
                            //#20170809 해피포인트 업무 미사용시 해피앱 추후적립 기능 적용 안되도록 수정 end
                        }
                    }

                    m_cSqlDbService.Commit();
                }
                else
                {
                    EtcSaveDataMain(aParam[0]);
                }

                // 보류 로그 남기기!
                if (m_cTrnStatus.Head.HoldStat != "")
                    SaveHoldLog(m_cTrnStatus.Head.HoldStat, m_cTrnStatus.Head.HoldOrgRegNo, 0, 0);


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

        #region 트란해더 저장 처리
        /// <summary>
        /// 트란해더 저장 처리
        /// </summary>
        /// <returns></returns>
        public string SaveTranHeader(string sSendYN)
        {
            string sQuery = "";
            string sRet = UserCom.RST_ERR;
            
            try
            {
                sQuery += " INSERT INTO POSLOG..TR_SALE_HEADER ( ";
                sQuery += "   CMP_CD ,STOR_CD ,SALE_DT ,POS_NO, TRADE_NO ,TRADE_DIV ,TRAIN_MODE_YN ,TRADE_KINDPER ,SYS_DT ,ORD_TIME ";
                sQuery += "  ,PAY_TIME ,PIC_NO ,ORD_PIC_NO ,STOR_OWN_PART_TIME_DIV ,ORG_BILL_POSNO ,ORG_BILLDT ,ORG_BILL_NO ,RTN_RSN_CD ,RTN_RSN_MEMO ,NONSALES_RSN_CD ";
                sQuery += "  ,RESERV_NO ,RESERV_DT ,CUST_NO ,ORD_DIV ,FLOOR_CD ,TBL_NO ,GUESTFLOOR ,FRGNR_DIV ,CUSTCNT ,PAY_GNDR_DIV ";
                sQuery += "  ,PAY_AGE ,MAN_CMPNPSN_CNT ,WOMAN_CMPNPSN_CNT ,QTY ,TOTSALE_AMT ,TOTDC_AMT ,NET_SALE_AMT ,ITEM_DC_AMT ,CPI_DC_AMT,COOP_CARD_DC_AMT ";
                sQuery += "  ,POINT_DC_AMT ,CPN_DC_AMT ,EMP_DC_AMT ,SET_DC_AMT ,ETC_AMT ,EXCEP_DC_AMT ,TOT_VAT ,SVC_FEE_AMT ,SVC_FEE_VAT ,ETC_VAT  ";
                sQuery += "  ,AF_ACCUM_POINT_AMT ,AF_ACCUM_POINT_INFO ,PPCARD_CUSTNM ,AMT_DUTCHPAY_YN ,BILLSPR_CNT ,ORDER_NO ,SLACK_FIELD ,MID_CLOSE_SEQ ,PPCARD_CUSTID ,PACK_TRADE_DIV  ";
                
                //#20170828 해피포인트 적립 제외 버튼 추가 phj, start
                //기존
                //sQuery += "  ,SEND_YN ,OUT_SEND_YN ,REG_DATE ,UPD_DATE ,VIP_TY";
                //변경
                sQuery += "  ,SEND_YN ,OUT_SEND_YN ,REG_DATE ,UPD_DATE ,VIP_TY, HP_EXCLUDE_YN";
                //#20170828 해피포인트 적립 제외 버튼 추가 phj, END

                sQuery += " ) VALUES ( ";
                sQuery += "  '{0}',  '{1}',   '{2}',  '{3}',  '{4}',  '{5}',  '{6}',  '{7}',   '{8}',  '{9}', ";
                sQuery += " '{10}', '{11}',  '{12}', '{13}', '{14}', '{15}', '{16}', '{17}', N'{18}', '{19}', ";
                sQuery += " '{20}', '{21}',  '{22}', '{23}', '{24}', '{25}', '{26}', '{27}',  '{28}', '{29}', ";
                sQuery += " '{30}', '{31}',  '{32}', '{33}', '{34}', '{35}', '{36}', '{37}',  '{38}', '{39}', ";
                sQuery += " '{40}', '{41}',  '{42}', '{43}', '{44}', '{45}', '{46}', '{47}',  '{48}', '{49}', ";
                sQuery += " '{50}', '{51}', N'{52}', '{53}', '{54}', '{55}', '{56}', '{57}',  '{58}', '{59}', ";
                
                //#20170828 해피포인트 적립 제외 버튼 추가 phj, start
                //기존
                //sQuery += " '{60}', '{61}',  '{62}', '{63}', '{64}'  ) ";
                //변경
                sQuery += " '{60}', '{61}',  '{62}', '{63}', '{64}', '{65}' ) ";
                //#20170828 해피포인트 적립 제외 버튼 추가 phj, END
                
                string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

                // 주문시간
                if (m_cTrnStatus.Head.OrderHms.Trim() == "") m_cTrnStatus.Head.OrderHms = m_cTrnStatus.Head.PayHms;

                sQuery = string.Format(sQuery
                    , m_cTrnStatus.Head.CmpCd           // CMP_CD
                    , m_cTrnStatus.Head.StoreCd         // STOR_CD
                    , m_cTrnStatus.Head.SaleDate        // SALE_DT
                    , m_cTrnStatus.Head.PosNo           // POS_NO
                    , m_cTrnStatus.Head.TradeNo         // TRADE_NO
                    , m_cTrnStatus.Head.TradeDiv        // TRADE_DIV
                    , m_cTrnStatus.Head.TrainModeYn     // TRAIN_MODE_YN
                    , m_cTrnStatus.Head.TradeKind       // TRADE_KINDPER
                    , m_cTrnStatus.Head.SysYmd          // SYS_DT
                    , m_cTrnStatus.Head.OrderHms        // ORD_TIME
                    , m_cTrnStatus.Head.PayHms          // PAY_TIME
                    , m_cTrnStatus.Head.CashierId       // PIC_NO
                    , m_cTrnStatus.Head.OrderPicNo      // ORD_PIC_NO
                    , m_cTrnStatus.Head.OwnPartDiv      // STOR_OWN_PART_TIME_DIV
                    , m_cTrnStatus.Head.OrgPosNo        // ORG_BILL_POSNO
                    , m_cTrnStatus.Head.OrgSaleDate     // ORG_BILLDT
                    , m_cTrnStatus.Head.OrgTradeNo      // ORG_BILL_NO
                    , m_cTrnStatus.Head.RtnReasonCd     // RTN_RSN_CD
                    , m_cTrnStatus.Head.RtnReasonMemo   // RTN_RSN_MEMO
                    , m_cTrnStatus.Head.NonSaleRsnCd =="" ? "0": m_cTrnStatus.Head.NonSaleRsnCd    // NONSALES_RSN_CD
                    , m_cTrnStatus.Head.ReserveNo       // RESERV_NO
                    , m_cTrnStatus.Head.ReserveYmd      // RESERV_DT
                    , m_cTrnStatus.Head.MemberCustNo    // CUST_NO
                    , m_cTrnStatus.Head.OrderFlag       // ORD_DIV
                    , m_cTrnStatus.Head.FloorCd         // FLOOR_CD
                    , m_cTrnStatus.Head.TableNo         // TBL_NO
                    , m_cTrnStatus.Head.CustFloor       // GUESTFLOOR
                    , m_cTrnStatus.Head.ForeignFlag     // FRGNR_DIV
                    , m_cTrnStatus.Head.CustCnt         // CUSTCNT
                    , m_cTrnStatus.Head.PayGndrDiv      // PAY_GNDR_DIV
                    , m_cTrnStatus.Head.PayAge          // PAY_AGE
                    , m_cTrnStatus.Head.ManCmpnpsnCnt   // MAN_CMPNPSN_CNT
                    , m_cTrnStatus.Head.WomanCmpnpsnCnt // WOMAN_CMPNPSN_CNT
                    , m_cTrnStatus.Head.TotQty          // QTY
                    , m_cTrnStatus.Head.TotSaleAmt      // TOTSALE_AMT
                    , m_cTrnStatus.Head.TotDcAmt        // TOTDC_AMT
                    , m_cTrnStatus.Head.NetSaleAmt      // NET_SALE_AMT
                    , m_cTrnStatus.Head.ItemDcAmt       // ITEM_DC_AMT
                    , m_cTrnStatus.Head.CpiDcAmt        // CPI_DC_AMT
                    , m_cTrnStatus.Head.CoopCardDcAmt   // COOP_CARD_DC_AMT
                    , m_cTrnStatus.Head.PointDcAmt      // POINT_DC_AMT
                    , m_cTrnStatus.Head.CpnDcAmt        // CPN_DC_AMT
                    , m_cTrnStatus.Head.EmpDcAmt        // EMP_DC_AMT
                    , m_cTrnStatus.Head.SetDcAmt        // SET_DC_AMT
                    , m_cTrnStatus.Head.EtcDcAmt        // ETC_AMT

                    , m_cTrnStatus.Head.ExcepDcAmt      // EXCEP_DC_AMT

                    , m_cTrnStatus.Head.TotVatAmt       // TOT_VAT
                    , m_cTrnStatus.Head.SvcFeeAmt       // SVC_FEE_AMT
                    , m_cTrnStatus.Head.SvcFeeVat       // SVC_FEE_VAT
                    , m_cTrnStatus.Head.EtcVatAmt       // ETC_VAT
                    , m_cTrnStatus.Head.AftSavePoint    // AF_ACCUM_POINT_AMT
                    , m_cTrnStatus.Head.AftSaveAddInfo  // AF_ACCUM_POINT_INFO
                    , m_cTrnStatus.Head.PpCardCustNm     // PPCARD_CUSTNM
                    , m_cTrnStatus.Head.AmtDutchPayYn   // AMT_DUTCHPAY_YN
                    , m_cTrnStatus.Head.BillSplitCnt    // BILLSPR_CNT
                    , m_cTrnStatus.Head.OrderNo         // ORDER_NO
                    , ""                                // SLACK_FIELD
                    , m_cTrnStatus.Head.MidCloseSeq     // MID_CLOSE_SEQ
                    , m_cTrnStatus.Head.PpCardCustId    // PPCARD_CUSTID
                    , m_cTrnStatus.Head.PackTradeDiv    // PACK_TRADE_DIV
                    , sSendYN                           // SEND_YN
                    , '0'                               // OUT_SEND_YN
                    , sRegDateTime                      // REG_DATE
                    , sRegDateTime                      // UPD_DATE
                    , m_cTrnStatus.Head.VipTy           // VIP_TY

                    //#20170828 해피포인트 적립 제외 버튼 추가 phj, start
                    , m_cTrnStatus.Head.HP_EXCLUDE_YN   // HP_EXCLUDE_YN
                    //#20170828 해피포인트 적립 제외 버튼 추가 phj, END
                    );


                if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sQuery }) == UserCom.OK) return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 상품 저장 처리
        /// <summary>
        /// 상품 저장 처리
        /// </summary>
        /// <returns></returns>
        public string SavePluItem()
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;
            int iSeq = 1;

            //#20170926 매출 생성시 부가상품인 경우 서브점포코드 안들어가는 현상 수정 start
            string sSubStorCd = "";
            //#20170926 매출 생성시 부가상품인 경우 서브점포코드 안들어가는 현상 수정 end

            //#20180118 KDS 부가 정보 사용시 TAKE IN / TAKE OUT 선택값 TR_SALE_DETAIL.TAKE_IN_OUT_DIV 값 설정 start
            string sTakeInOutDiv = "";
            //#20180118 KDS 부가 정보 사용시 TAKE IN / TAKE OUT 선택값 TR_SALE_DETAIL.TAKE_IN_OUT_DIV 값 설정 end

            try
            {
                //#20171227 거래데이터 저장 오류 관련 로그추가 start
                /*
                UserLog.WriteLogFile(UserCom.LOG_DEBUG,
                                 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 (함수명))
                                 "SavePluItem STEP 1");
                */
                //#20171227 거래데이터 저장 오류 관련 로그추가 end

                // 상품정보
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (aSaleItem.Count == 0) return UserCom.RST_OK;

                //#20171227 거래데이터 저장 오류 관련 로그추가 start
                /*
                UserLog.WriteLogFile(UserCom.LOG_DEBUG,
                                 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 (함수명))
                                 "SavePluItem STEP 2");
                */
                //#20171227 거래데이터 저장 오류 관련 로그추가 end

                sQuery += " INSERT INTO POSLOG..TR_SALE_DETAIL ( ";
                sQuery += "  CMP_CD ,STOR_CD ,SALE_DT ,POS_NO , TRADE_NO ,SEQ ,ORD_TIME ,FLOOR_CD ,TBL_NO ,SUB_SHOP_CD ";
                sQuery += " ,ITEM_PLU_CD ,ITEM_DIV ,SALE_QTY ,SALE_PRC ,SALE_AMT ,FLAVOUR_DIV ,FLAVOUR_WEIGHT ,ITEM_INPUT_DIV ,ITEM_BAR_CD ,TAKE_IN_OUT_DIV ";
                sQuery += " ,ITEM_TAX_DIV ,TAX_AMT_INCLUDE_YN, TAXRATE_CD, APPLY_TAX_AMT, SVC_FEE_AMT ,SVC_FEE_VAT ,NONSALES_RSN_CD, SVC_TAXREATE_CD, BILL_AMT ,DC_DIV ";
                sQuery += " ,DC_TYPE ,DC_RATE ,ITEM_DC_AMT ,SUM_DC_AMT ,CPI_DC_QTY ,CPI_DC_AMT ,COOP_CARD_DC_DIV ,COOP_CARD_DC_AMT ,POINT_DC_DIV ,POINT_DC_AMT ";
                sQuery += " ,CPN_DC_DIV ,CPN_DC_AMT ,EMP_DC_DIV ,EMP_DC_AMT ,SET_DC_AMT ,ETC_DC_DIV ,ETC_DC_AMT ,EXCEP_DC_DIV ,EXCEP_DC_AMT ,PACK_DIV ";
                sQuery += " ,SUBPRC_MENU_KEY_DIV ,SET_MENU_CD ,CPI_PRESENT_DIV ,BILLSPR_NO ,SALE_GIFT_NO ,CPN_NO ,SLACK_FIELD ,DISPO_ITEM_DIV ,CANCEL_DIV ,REG_DATE";
                //#20180903 해피오더 매출 생성 시 tr_sale_detail에 구분자 추가 start
                //기존
                //sQuery += " ,UPD_DATE, NOTAX_DIV ";
                //변경
                sQuery += " ,UPD_DATE, NOTAX_DIV, HPO_REG_YN ";
                //#20180903 해피오더 매출 생성 시 tr_sale_detail에 구분자 추가 end

                sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', ";
                sQuery += " '{10}','{11}', '{12}', '{13}', '{14}', '{15}', '{16}', '{17}', '{18}', '{19}', ";
                sQuery += " '{20}','{21}', '{22}', '{23}', '{24}', '{25}', '{26}', '{27}', '{28}', '{29}', ";
                sQuery += " '{30}','{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}', '{38}', '{39}',";
                sQuery += " '{40}','{41}', '{42}', '{43}', '{44}', '{45}', '{46}', '{47}', '{48}', '{49}', ";
                sQuery += " '{50}','{51}', '{52}', '{53}', '{54}', '{55}', '{56}', '{57}', '{58}', '{59}', ";
                //#20180903 해피오더 매출 생성 시 tr_sale_detail에 구분자 추가 start
                //기존
                //sQuery += " '{60}','{61}' )";
                //변경
                sQuery += " '{60}','{61}','{62}' )";
                //#20180903 해피오더 매출 생성 시 tr_sale_detail에 구분자 추가 end

                string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

                //#20180118 KDS 부가 정보 사용시 TAKE IN / TAKE OUT 선택값 TR_SALE_DETAIL.TAKE_IN_OUT_DIV 값 설정 start
                //KDS 부가 정보 사용 여부 [고객명/VIP 구분](0:사용안함, 1:사용함) - 쒝쒝버거용
                
                if (CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT027), "0") == "1")
                {
                    if (m_cTrnStatus.Head.PackTradeDiv == "1")
                    {
                        sTakeInOutDiv = PosConst.TAKE_IN_OUT_DIV.TAKE_IN;
                    }
                    else if (m_cTrnStatus.Head.PackTradeDiv == "2")
                    {
                        sTakeInOutDiv = PosConst.TAKE_IN_OUT_DIV.TAKE_OUT;
                    }
                }
                
                //#20180118 KDS 부가 정보 사용시 TAKE IN / TAKE OUT 선택값 TR_SALE_DETAIL.TAKE_IN_OUT_DIV 값 설정 end


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

                    if (cSaleItem.CANCEL_DIV == "1" || cSaleItem.CANCEL_DIV_MAIN == "1") cSaleItem.CANCEL_DIV = "1";

                    if (cSaleItem.CANCEL_DIV == "1" && m_cPosStatus.Sale.DutchPayFlg == "1" && (cSaleItem.DUTCH_PAY_CAN_DIV != "1" || cSaleItem.DUTCH_PAY_MAIN_CAN_DIV != "1"))
                    {
                        continue;
                    }

                    // 취소 소계 전후 체크
                    string sCanDiv = cSaleItem.CANCEL_DIV;
                    if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL)
                    {
                        sCanDiv = m_cTrnStatus.Sale.SubTotalCancelDiv == true ? PosConst.CANCEL_DIV.CANCEL_SUBTOT : PosConst.CANCEL_DIV.CANCEL;
                    }

                    // 주문시간
                    if (cSaleItem.ORD_TIME.Trim() == "") cSaleItem.ORD_TIME = m_cTrnStatus.Head.PayHms;

                    //#20170926 매출 생성시 부가상품인 경우 서브점포코드 안들어가는 현상 수정 start
                    //서브 점포 코드가 없으면 직전 서브 점포 코드로 셋팅
                    if ((cSaleItem.SUB_SHOP_CD.Trim() == "") && (cSaleItem.ITEM_DIV == "3"))
                    {
                        cSaleItem.SUB_SHOP_CD = sSubStorCd;
                    }
                    else
                    {
                        sSubStorCd = cSaleItem.SUB_SHOP_CD;
                    }
                    //#20170926 매출 생성시 부가상품인 경우 서브점포코드 안들어가는 현상 수정 end
                    
                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        //, m_cTrnStatus.Head.RegNo       // REG_NO
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , iSeq++ //iRow + 1                      // SEQ
                        , cSaleItem.ORD_TIME            // ORD_TIME
                        , cSaleItem.FLOOR_CD            // FLOOR_CD
                        , cSaleItem.TBL_NO              // TBL_NO
                        , cSaleItem.SUB_SHOP_CD         // SUB_SHOP_CD
                        , cSaleItem.ITEM_PLU_CD         // ITEM_PLU_CD
                        , cSaleItem.ITEM_DIV            // ITEM_DIV
                        , cSaleItem.SALE_QTY            // SALE_QTY
                        , cSaleItem.SALE_PRC            // SALE_PRC
                        , cSaleItem.SALE_AMT            // SALE_AMT
                        , cSaleItem.FLAVOUR_DIV         // FLAVOUR_DIV
                        , cSaleItem.FLAVOUR_STOCK      // FLAVOUR_STOCK
                        , cSaleItem.ITEM_INPUT_DIV      // ITEM_INPUT_DIV
                        , cSaleItem.ITEM_BAR_CD         // ITEM_BAR_CD

                        //#20180118 KDS 부가 정보 사용시 TAKE IN / TAKE OUT 선택값 TR_SALE_DETAIL.TAKE_IN_OUT_DIV 값 설정 start
                        //기존
                        //, cSaleItem.TAKE_IN_OUT_DIV     // TAKE_IN_OUT_DIV
                        //변경
                        , sTakeInOutDiv == "" ? cSaleItem.TAKE_IN_OUT_DIV : sTakeInOutDiv      // TAKE_IN_OUT_DIV
                        //#20180118 KDS 부가 정보 사용시 TAKE IN / TAKE OUT 선택값 TR_SALE_DETAIL.TAKE_IN_OUT_DIV 값 설정 end

                        , cSaleItem.ITEM_TAX_DIV        // ITEM_TAX_DIV
                        , cSaleItem.TAX_AMT_INCLUDE_YN  // TAX_AMT_INCLUDE_YN
                        , cSaleItem.TAXRATE_CD          // TAXRATE_CD
                        , cSaleItem.APPLY_TAX_AMT       // APPLY_TAX_AMT
                        , cSaleItem.SVC_FEE_AMT         // SVC_FEE_AMT
                        , cSaleItem.SVC_FEE_VAT         // SVC_FEE_VAT
                        , cSaleItem.NONSALES_RSN_CD == "" ? "0" : cSaleItem.NONSALES_RSN_CD      // NONSALES_RSN_CD
                        , cSaleItem.SVC_TAXREATE_CD     //SVC_TAXREATE_CD
                        , cSaleItem.BILL_AMT            // BILL_AMT
                        , cSaleItem.DC_DIV
                        , cSaleItem.DC_TYPE
                        , cSaleItem.DC_RATE
                        , cSaleItem.ITEM_DC_AMT
                        , cSaleItem.SUM_DC_AMT
                        , cSaleItem.CPI_DC_QTY
                        , cSaleItem.CPI_DC_AMT
                        , cSaleItem.COOP_CARD_DC_DIV
                        , cSaleItem.COOP_CARD_DC_AMT
                        , cSaleItem.POINT_DC_DIV
                        , cSaleItem.POINT_DC_AMT
                        , cSaleItem.CPN_DC_DIV
                        , cSaleItem.CPN_DC_AMT
                        , cSaleItem.EMP_DC_DIV
                        , cSaleItem.EMP_DC_AMT
                        , cSaleItem.SET_DC_AMT
                        , cSaleItem.ETC_DC_DIV
                        , cSaleItem.ETC_DC_AMT
                        , cSaleItem.EXCEP_DC_DIV
                        , cSaleItem.EXCEP_DC_AMT
                        , cSaleItem.PACK_DIV
                        , cSaleItem.SUBPRC_MENU_KEY_DIV
                        , cSaleItem.SET_MENU_CD == "" ? cSaleItem.SUB_MENU_MAIN_CD : cSaleItem.SET_MENU_CD 
                        , cSaleItem.CPI_PRESENT_DIV
                        , cSaleItem.BILLSPR_NO  
                        , cSaleItem.SALE_GIFT_NO
                        , cSaleItem.CPN_NO
                        , cSaleItem.SLACK_FIELD         // 선불카드권종(2017.06.27)
                        , cSaleItem.DISPO_ITEM_DIV
                        , sCanDiv
                        , sRegDateTime                  // REG_DATE
                        , sRegDateTime                  // UPD_DATE
                        , cSaleItem.NOTAX_DIV
                        //#20180903 해피오더 매출 생성 시 tr_sale_detail에 구분자 추가 start
                        , cSaleItem.HPO_REG_YN
                        //#20180903 해피오더 매출 생성 시 tr_sale_detail에 구분자 추가 end
                        );

                    //#20171227 거래데이터 저장 오류 관련 로그추가 start
                    /*
                    UserLog.WriteLogFile(UserCom.LOG_DEBUG,
                                     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 (함수명))
                                     "SavePluItem STEP 3 -> " + sSQL);
                    */
                    //#20171227 거래데이터 저장 오류 관련 로그추가 end

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 결제 저장 처리
        /// <summary>
        /// 결제 저장 처리
        /// </summary>
        /// <returns></returns>
        public string SavePaymentItem()
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                // 결제정보
                ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                if (alPayItem.Count == 0) return UserCom.RST_OK;

                sQuery += " INSERT INTO POSLOG..TR_SALE_PAY ( ";
                sQuery += "    CMP_CD, STOR_CD, SALE_DT, POS_NO, TRADE_NO, SEQ,  PAY_WAY_CD, PAY_AMT, PAY_DTL_CD_01, PAY_DTL_CD_02";
                sQuery += "  , PAY_DTL_CD_03, PAY_DTL_CD_04, PAY_DTL_CD_05, QTY_ENTRY_01, QTY_ENTRY_02, QTY_ENTRY_03, QTY_ENTRY_04, QTY_ENTRY_05, AMT_ENTRY_01, AMT_ENTRY_02";
                sQuery += "  , AMT_ENTRY_03, AMT_ENTRY_04, AMT_ENTRY_05, AMT_ENTRY_06, AMT_ENTRY_07, AMT_ENTRY_08, AMT_ENTRY_09,AMT_ENTRY_10, OCCUR_ENTRY_01, OCCUR_ENTRY_02";
                sQuery += "  , OCCUR_ENTRY_03, OCCUR_ENTRY_04, OCCUR_ENTRY_05, OCCUR_ENTRY_06, OCCUR_ENTRY_07, OCCUR_ENTRY_08, OCCUR_ENTRY_09, OCCUR_ENTRY_10, OCCUR_ENTRY_11, OCCUR_ENTRY_12";
                sQuery += "  , OCCUR_ENTRY_13, OCCUR_ENTRY_14, OCCUR_ENTRY_15, OCCUR_ENTRY_16, OCCUR_ENTRY_17, OCCUR_ENTRY_18, OCCUR_ENTRY_19, OCCUR_ENTRY_20, OCCUR_ENTRY_21, OCCUR_ENTRY_22"; 
                sQuery += "  , OCCUR_ENTRY_23, OCCUR_ENTRY_24, OCCUR_ENTRY_25, BILLSPR_NO, CANCEL_DIV, REG_DATE, UPD_DATE ";
                sQuery += " ) VALUES ( ";
                sQuery += "   '{0}',   '{1}',   '{2}',   '{3}',   '{4}',   '{5}',   '{6}',   '{7}',   '{8}',   '{9}', ";
                sQuery += "  '{10}',  '{11}',  '{12}',  '{13}',  '{14}',  '{15}',  '{16}',  '{17}',  '{18}',  '{19}', ";
                sQuery += "  '{20}',  '{21}',  '{22}',  '{23}',  '{24}',  '{25}',  '{26}',  '{27}', N'{28}', N'{29}', ";
                sQuery += " N'{30}', N'{31}', N'{32}', N'{33}', N'{34}', N'{35}', N'{36}', N'{37}', N'{38}', N'{39}', ";
                sQuery += " N'{40}', N'{41}', N'{42}', N'{43}', N'{44}', N'{45}', N'{46}', N'{47}', N'{48}', N'{49}', ";
                sQuery += " N'{50}', N'{51}', N'{52}',  '{53}',  '{54}',  '{55}',  '{56}' )";

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

                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        //, m_cTrnStatus.Head.RegNo      // REG_NO
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , iRow + 1 // SEQ
                        , cPayItem.PAY_WAY_CD   // PAY_WAY_CD
                        , cPayItem.PAY_AMT   // PAY_AMT
                        , cPayItem.PAY_DTL_CD_01   // PAY_DTL_CD_01
                        , cPayItem.PAY_DTL_CD_02   // PAY_DTL_CD_02
                        , cPayItem.PAY_DTL_CD_03   // PAY_DTL_CD_03
                        , cPayItem.PAY_DTL_CD_04   // PAY_DTL_CD_04
                        , cPayItem.PAY_DTL_CD_05   // PAY_DTL_CD_05
                        , cPayItem.QTY_ENTRY_01   // QTY_ENTRY_01
                        , cPayItem.QTY_ENTRY_02   // QTY_ENTRY_02
                        , cPayItem.QTY_ENTRY_03   // QTY_ENTRY_03
                        , cPayItem.QTY_ENTRY_04   // QTY_ENTRY_04
                        , cPayItem.QTY_ENTRY_05   // QTY_ENTRY_05
                        , cPayItem.AMT_ENTRY_01   // AMT_ENTRY_01
                        , cPayItem.AMT_ENTRY_02   // AMT_ENTRY_02
                        , cPayItem.AMT_ENTRY_03   // AMT_ENTRY_03
                        , cPayItem.AMT_ENTRY_04   // AMT_ENTRY_04
                        , cPayItem.AMT_ENTRY_05   // AMT_ENTRY_05
                        , cPayItem.AMT_ENTRY_06   // AMT_ENTRY_06
                        , cPayItem.AMT_ENTRY_07   // AMT_ENTRY_07
                        , cPayItem.AMT_ENTRY_08   // AMT_ENTRY_08
                        , cPayItem.AMT_ENTRY_09   // AMT_ENTRY_09
                        , cPayItem.AMT_ENTRY_10   // AMT_ENTRY_10
                        , cPayItem.OCCUR_ENTRY_01   // OCCUR_ENTRY_01
                        , cPayItem.OCCUR_ENTRY_02   // OCCUR_ENTRY_02
                        , cPayItem.OCCUR_ENTRY_03   // OCCUR_ENTRY_03
                        , cPayItem.OCCUR_ENTRY_04   // OCCUR_ENTRY_04
                        , cPayItem.OCCUR_ENTRY_05   // OCCUR_ENTRY_05
                        , cPayItem.OCCUR_ENTRY_06   // OCCUR_ENTRY_06
                        , cPayItem.OCCUR_ENTRY_07   // OCCUR_ENTRY_07
                        , cPayItem.OCCUR_ENTRY_08   // OCCUR_ENTRY_08
                        , cPayItem.OCCUR_ENTRY_09   // OCCUR_ENTRY_09
                        , cPayItem.OCCUR_ENTRY_10   // OCCUR_ENTRY_10
                        , cPayItem.OCCUR_ENTRY_11   // OCCUR_ENTRY_11
                        , cPayItem.OCCUR_ENTRY_12   // OCCUR_ENTRY_12
                        , cPayItem.OCCUR_ENTRY_13   // OCCUR_ENTRY_13
                        , cPayItem.OCCUR_ENTRY_14   // OCCUR_ENTRY_14
                        , cPayItem.OCCUR_ENTRY_15   // OCCUR_ENTRY_15
                        , cPayItem.OCCUR_ENTRY_16   // OCCUR_ENTRY_16
                        , cPayItem.OCCUR_ENTRY_17   // OCCUR_ENTRY_17
                        , cPayItem.OCCUR_ENTRY_18   // OCCUR_ENTRY_18
                        , cPayItem.OCCUR_ENTRY_19   // OCCUR_ENTRY_19
                        , cPayItem.OCCUR_ENTRY_20   // OCCUR_ENTRY_20
                        , cPayItem.OCCUR_ENTRY_21   // OCCUR_ENTRY_21
                        , cPayItem.OCCUR_ENTRY_22   // OCCUR_ENTRY_22
                        , cPayItem.OCCUR_ENTRY_23   // OCCUR_ENTRY_23
                        , cPayItem.OCCUR_ENTRY_24   // OCCUR_ENTRY_24
                        , cPayItem.OCCUR_ENTRY_25   // OCCUR_ENTRY_25
                        , cPayItem.BILLSPR_NO   // BILLSPR_NO
                        , cPayItem.CANCEL_DIV   // CANCEL_DIV
                        , DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }

                    //현금 알리 저장!
                    AddCashAlarm(cPayItem.PAY_WAY_CD, cPayItem.PAY_DTL_CD_01, cPayItem.PAY_AMT, cPayItem.AMT_ENTRY_02);
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 기타 수단코드 저장
        /// <summary>
        /// 기타 수단코드 저장
        /// </summary>
        /// <returns></returns>
        public string SaveEtcItem()
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                if (alEtcItem.Count == 0) return UserCom.RST_OK;

                sQuery += " INSERT INTO POSLOG..TR_SALE_ETC ( ";
                sQuery += "    CMP_CD, STOR_CD, SALE_DT, POS_NO, TRADE_NO, SEQ,  ETC_WAY_CD, ETC_AMT, ETC_DTL_CD_01, ETC_DTL_CD_02 ";
                sQuery += "  , ETC_DTL_CD_03, ETC_DTL_CD_04, ETC_DTL_CD_05, QTY_ENTRY_01, QTY_ENTRY_02, QTY_ENTRY_03, QTY_ENTRY_04, QTY_ENTRY_05, AMT_ENTRY_01, AMT_ENTRY_02 ";
                sQuery += "  , AMT_ENTRY_03, AMT_ENTRY_04, AMT_ENTRY_05, AMT_ENTRY_06, AMT_ENTRY_07, AMT_ENTRY_08, AMT_ENTRY_09, AMT_ENTRY_10, OCCUR_ENTRY_01, OCCUR_ENTRY_02 ";
                sQuery += "  , OCCUR_ENTRY_03, OCCUR_ENTRY_04, OCCUR_ENTRY_05, OCCUR_ENTRY_06, OCCUR_ENTRY_07, OCCUR_ENTRY_08, OCCUR_ENTRY_09, OCCUR_ENTRY_10, OCCUR_ENTRY_11, OCCUR_ENTRY_12 ";
                sQuery += "  , OCCUR_ENTRY_13, OCCUR_ENTRY_14, OCCUR_ENTRY_15, OCCUR_ENTRY_16, OCCUR_ENTRY_17, OCCUR_ENTRY_18, OCCUR_ENTRY_19,OCCUR_ENTRY_20, OCCUR_ENTRY_21, OCCUR_ENTRY_22 ";
                sQuery += "  , OCCUR_ENTRY_23, OCCUR_ENTRY_24, OCCUR_ENTRY_25, BILLSPR_NO, CANCEL_DIV, REG_DATE, UPD_DATE ";
                sQuery += " ) VALUES ( ";
                sQuery += "   '{0}',  '{1}',   '{2}',   '{3}',   '{4}',   '{5}',   '{6}',   '{7}',   '{8}' ,   '{9}', ";
                sQuery += "  '{10}', '{11}',  '{12}',  '{13}',  '{14}',  '{15}',  '{16}',  '{17}',  '{18}' ,  '{19}', ";
                sQuery += "  '{20}', '{21}',  '{22}',  '{23}',  '{24}',  '{25}',  '{26}',  '{27}', N'{28}' , N'{29}', ";
                sQuery += " N'{30}',N'{31}', N'{32}', N'{33}', N'{34}', N'{35}', N'{36}', N'{37}', N'{38}' , N'{39}', ";
                sQuery += " N'{40}',N'{41}', N'{42}', N'{43}', N'{44}', N'{45}', N'{46}', N'{47}', N'{48}' , N'{49}', ";
                sQuery += " N'{50}',N'{51}', N'{52}',  '{53}',  '{54}',  '{55}',  '{56}' )";

                for (int iRow = 0; iRow < alEtcItem.Count; iRow++)
                {
                    Column.TR_ETC.DATA cEtcItem = (Column.TR_ETC.DATA)alEtcItem[iRow];

                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        //, m_cTrnStatus.Head.RegNo      // REG_NO
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , iRow + 1 // SEQ
                        , cEtcItem.ETC_WAY_CD   // ETC_WAY_CD
                        , cEtcItem.ETC_AMT   // ETC_AMT
                        , cEtcItem.ETC_DTL_CD_01   // ETC_DTL_CD_01
                        , cEtcItem.ETC_DTL_CD_02   // ETC_DTL_CD_02
                        , cEtcItem.ETC_DTL_CD_03   // ETC_DTL_CD_03
                        , cEtcItem.ETC_DTL_CD_04   // ETC_DTL_CD_04
                        , cEtcItem.ETC_DTL_CD_05   // ETC_DTL_CD_05
                        , cEtcItem.QTY_ENTRY_01   // QTY_ENTRY_01
                        , cEtcItem.QTY_ENTRY_02   // QTY_ENTRY_02
                        , cEtcItem.QTY_ENTRY_03   // QTY_ENTRY_03
                        , cEtcItem.QTY_ENTRY_04   // QTY_ENTRY_04
                        , cEtcItem.QTY_ENTRY_05   // QTY_ENTRY_05
                        , cEtcItem.AMT_ENTRY_01   // AMT_ENTRY_01
                        , cEtcItem.AMT_ENTRY_02   // AMT_ENTRY_02
                        , cEtcItem.AMT_ENTRY_03   // AMT_ENTRY_03
                        , cEtcItem.AMT_ENTRY_04   // AMT_ENTRY_04
                        , cEtcItem.AMT_ENTRY_05   // AMT_ENTRY_05
                        , cEtcItem.AMT_ENTRY_06   // AMT_ENTRY_06
                        , cEtcItem.AMT_ENTRY_07   // AMT_ENTRY_07
                        , cEtcItem.AMT_ENTRY_08   // AMT_ENTRY_08
                        , cEtcItem.AMT_ENTRY_09   // AMT_ENTRY_09
                        , cEtcItem.AMT_ENTRY_10   // AMT_ENTRY_10
                        , cEtcItem.OCCUR_ENTRY_01   // OCCUR_ENTRY_01
                        , cEtcItem.OCCUR_ENTRY_02   // OCCUR_ENTRY_02
                        , cEtcItem.OCCUR_ENTRY_03   // OCCUR_ENTRY_03
                        , cEtcItem.OCCUR_ENTRY_04   // OCCUR_ENTRY_04
                        , cEtcItem.OCCUR_ENTRY_05   // OCCUR_ENTRY_05
                        , cEtcItem.OCCUR_ENTRY_06   // OCCUR_ENTRY_06
                        , cEtcItem.OCCUR_ENTRY_07   // OCCUR_ENTRY_07
                        , cEtcItem.OCCUR_ENTRY_08   // OCCUR_ENTRY_08
                        , cEtcItem.OCCUR_ENTRY_09   // OCCUR_ENTRY_09
                        , cEtcItem.OCCUR_ENTRY_10   // OCCUR_ENTRY_10
                        , cEtcItem.OCCUR_ENTRY_11   // OCCUR_ENTRY_11
                        , cEtcItem.OCCUR_ENTRY_12   // OCCUR_ENTRY_12
                        , cEtcItem.OCCUR_ENTRY_13   // OCCUR_ENTRY_13
                        , cEtcItem.OCCUR_ENTRY_14   // OCCUR_ENTRY_14
                        , cEtcItem.OCCUR_ENTRY_15   // OCCUR_ENTRY_15
                        , cEtcItem.OCCUR_ENTRY_16   // OCCUR_ENTRY_16
                        , cEtcItem.OCCUR_ENTRY_17   // OCCUR_ENTRY_17
                        , cEtcItem.OCCUR_ENTRY_18   // OCCUR_ENTRY_18
                        , cEtcItem.OCCUR_ENTRY_19   // OCCUR_ENTRY_19
                        , cEtcItem.OCCUR_ENTRY_20   // OCCUR_ENTRY_20
                        , cEtcItem.OCCUR_ENTRY_21   // OCCUR_ENTRY_21
                        , cEtcItem.OCCUR_ENTRY_22   // OCCUR_ENTRY_22
                        , cEtcItem.OCCUR_ENTRY_23   // OCCUR_ENTRY_23
                        , cEtcItem.OCCUR_ENTRY_24   // OCCUR_ENTRY_24
                        , cEtcItem.OCCUR_ENTRY_25   // OCCUR_ENTRY_25
                        , cEtcItem.BILLSPR_NO   // BILLSPR_NO
                        , cEtcItem.CANCEL_DIV   // CANCEL_DIV
                        , DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 캠페인 정보 저장
        /// <summary>
        /// 캠페인 정보 저장
        /// </summary>
        /// <returns></returns>
        public string SaveCampaignItem()
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                // 상품 정보
                ArrayList alTrSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (alTrSaleItem.Count == 0) return UserCom.RST_OK;

                // 캠페인 정보
                ArrayList alTrCpiItem = (ArrayList)StateObject.GetItemObject(Column.TR_SALE_CPI_RSLT.ITEM);

                // 상품 캠페인 정보
                for (int i = 0; i < alTrSaleItem.Count; i++ )
                {
                    Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)alTrSaleItem[i];

                    if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cSaleItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;// 지정취소
                    if (cSaleItem.alTrSaleCpi == null) continue;

                    foreach (Column.TR_SALE_CPI_RSLT.DATA cTrPluCpi in cSaleItem.alTrSaleCpi)
                    {
                        if (cTrPluCpi.PAY_DC_DIV == PosConst.PAY_DC_TYPE.PAY) continue;                 // 할인결제구분 (1:결제, 2:할인) 

                        if (cTrPluCpi.DC_SUM_AMT <= 0 && cTrPluCpi.DC_QTY <= 0) continue;

                        Column.TR_SALE_CPI_RSLT.DATA cTrSaleCpi = new Column.TR_SALE_CPI_RSLT.DATA();

                        // 캠페인 실적 정보 설정
                        cTrSaleCpi.NMTAX_SEQ = i + 1;
                        cTrSaleCpi.CPI_CD = cTrPluCpi.CPI_CD;
                        cTrSaleCpi.ITEM_APPLY_METHD = cTrPluCpi.ITEM_APPLY_METHD;
                        cTrSaleCpi.SUB_SHOP_CD = cTrPluCpi.SUB_SHOP_CD;
                        cTrSaleCpi.ITEM_PLU_CD = cTrPluCpi.ITEM_PLU_CD;
                        cTrSaleCpi.DC_QTY = cTrPluCpi.DC_QTY;
                        cTrSaleCpi.DC_PRC = cTrPluCpi.DC_PRC;
                        cTrSaleCpi.DC_SUM_AMT = cTrPluCpi.DC_SUM_AMT;
                        cTrSaleCpi.CPI_CUST_BNFT_TYPE = cTrPluCpi.CPI_CUST_BNFT_TYPE;
                        cTrSaleCpi.LTTR_NMPLAT_NO = cTrPluCpi.LTTR_NMPLAT_NO;
                        cTrSaleCpi.TRGT_CUST_TYPE = cTrPluCpi.TRGT_CUST_TYPE;
                        cTrSaleCpi.BILLSPR_NO = cTrPluCpi.BILLSPR_NO;
                        cTrSaleCpi.SLACK_FIELD = cTrPluCpi.SLACK_FIELD;
                        cTrSaleCpi.CANCEL_DIV = cTrPluCpi.CANCEL_DIV;
                        cTrSaleCpi.ACCUM_POINT = cTrPluCpi.ACCUM_POINT;
                        cTrSaleCpi.CUST_PAY_TYPE = cTrPluCpi.CUST_PAY_TYPE;
                        cTrSaleCpi.PRESENT_DIV = cTrPluCpi.PRESENT_DIV;
                        
                        alTrCpiItem.Add(cTrSaleCpi); 
                    }
                }
                if (alTrCpiItem.Count == 0) return UserCom.RST_OK;

                sQuery += " INSERT INTO POSLOG..TR_SALE_CPI_RSLT ( ";
                sQuery += " CMP_CD, STOR_CD, SALE_DT, POS_NO, TRADE_NO, SEQ,  CPI_TYPE, NMTAX_SEQ, CPI_CD, ";
                sQuery += " SUB_SHOP_CD, ITEM_PLU_CD, DC_QTY, DC_PRC, DC_SUM_AMT, CPI_DIV, PAYMNT_DIV, ACCUM_POINT, LTTR_NMPLAT_NO, CPI_CUST_DIV, ";
                sQuery += " BILLSPR_NO, SLACK_FIELD, CANCEL_DIV, REG_DATE, UPD_DATE ";
                sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";
                sQuery += " '{10}','{11}', '{12}', '{13}', '{14}', '{15}', '{16}', '{17}', '{18}' , '{19}', ";
                sQuery += " '{20}','{21}', '{22}', '{23}' )";

                // 기타 캠페인 정보
                for(int i = 0; i < alTrCpiItem.Count ; i++)
                {
                    Column.TR_SALE_CPI_RSLT.DATA cTrSaleCpi = (Column.TR_SALE_CPI_RSLT.DATA)alTrCpiItem[i];
                    if (cTrSaleCpi.CANCEL_DIV == "1") continue;

                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        //, m_cTrnStatus.Head.RegNo       // REG_NO
                        , i + 1                         // SEQ
                        , cTrSaleCpi.ITEM_APPLY_METHD           // CPI_TYPE
                        , cTrSaleCpi.NMTAX_SEQ          // NMTAX_SEQ
                        , cTrSaleCpi.CPI_CD             // CPI_CD
                        , cTrSaleCpi.SUB_SHOP_CD        // SUB_SHOP_CD
                        , cTrSaleCpi.ITEM_PLU_CD        // ITEM_PLU_CD
                        , cTrSaleCpi.DC_QTY             // DC_QTY
                        , cTrSaleCpi.DC_PRC             // DC_PRC
                        , cTrSaleCpi.DC_SUM_AMT         // DC_SUM_AMT
                        , cTrSaleCpi.CPI_CUST_BNFT_TYPE            // CPI_DIV
                        , cTrSaleCpi.CUST_PAY_TYPE         // PAYMNT_DIV
                        , cTrSaleCpi.ACCUM_POINT        // ACCUM_POINT
                        , cTrSaleCpi.LTTR_NMPLAT_NO     // LTTR_NMPLAT_NO
                        , cTrSaleCpi.TRGT_CUST_TYPE       // CPI_CUST_DIV                
                        , cTrSaleCpi.BILLSPR_NO         // BILLSPR_NO
                        , cTrSaleCpi.SLACK_FIELD        // SLACK_FIELD
                        , "0"   // CANCEL_DIV
                        , DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 사인데이터 저장
        /// <summary>
        /// 사인데이터 저장
        /// </summary>
        /// <returns></returns>
        public string SaveSignItem(string sSendYN)
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                ArrayList alSignItem = (ArrayList)StateObject.GetItemObject(Column.TR_SIGN.ITEM);
                if (alSignItem.Count == 0) return UserCom.RST_OK;

                sQuery += " INSERT INTO POSLOG.dbo.TR_SALE_SIGN_LOG( ";
                sQuery += "  CMP_CD,SALE_DT,STOR_CD,POS_NO,TRADE_NO,SEQ,PAY_SEQ,SIGN_TIME,SIGN_DATA ";
                sQuery += " ,SEND_YN,REG_DATE,UPD_DATE ";
                sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";
                sQuery += " '{10}','{11}' )";

                for (int iRow = 0; iRow < alSignItem.Count; iRow++)
                {
                    Column.TR_SIGN.DATA cSignItem = (Column.TR_SIGN.DATA)alSignItem[iRow];

                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        //, m_cTrnStatus.Head.RegNo      // REG_NO
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , iRow + 1 // SEQ
                        , cSignItem.PAY_SEQ
                        , cSignItem.SIGN_TIME
                        , cSignItem.SIGN_DATA
                        , sSendYN
                        , DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 입출금 저장
        /// <summary>
        /// 입출금 저장
        /// </summary>
        /// <returns></returns>
        public string SaveDpstWthdr()
        {
            string sReturn = UserCom.RST_ERR;
            string sQuery = string.Empty;
            string sInsQuery = string.Empty;

            try
            {
                // 입출금 정보
                ArrayList aSaleDpstWthdr = (ArrayList)StateObject.GetItemObject(Column.SALE_DPST_WTHDR.ITEM);
                if (aSaleDpstWthdr.Count == 0) return UserCom.RST_OK;

                if (m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource,
                                                          m_cPosStatus.Base.LocalDbCatalog,
                                                          m_cPosStatus.Base.LocalDbUserID,
                                                          m_cPosStatus.Base.LocalDbPassword) == true)
                {
                    sInsQuery += " INSERT INTO POSLOG..ETC_SALE_DPST_WTHDR ( ";
                    sInsQuery += " CMP_CD ,SALE_DT ,STOR_CD ,POS_NO ,REG_NO, SEQ ,TRADE_NO ,DPST_WTHDR_TYPE ,DPST_WTHDR_ACC_CD, DPST_WTHDR_CD, DPST_WTHDR_QTY, DPST_WTHDR_AMT ";
                    sInsQuery += ",DPST_WTHDR_NM ,CUST_NO, STOR_PAY_TYPE, ETC_REASON, SLACK_FIELD_01 ,SLACK_FIELD_02 ,SLACK_FIELD_03 ,SLACK_FIELD_04 ,SLACK_FIELD_05 ";
                    sInsQuery += ",REG_DATE ,UPD_DATE ";
                    sInsQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', {5}, '{6}', '{7}', '{8}' , '{9}', ";
                    sInsQuery += " {10},'{11}', N'{12}', '{13}', '{14}', N'{15}', '{16}', '{17}', '{18}', '{19}', '{20}', '{21}', '{22}' )";
                }

                for (int iRow = 0; iRow < aSaleDpstWthdr.Count; iRow++)
                {
                    Column.SALE_DPST_WTHDR.DATA cSaleDpstWthdr = (Column.SALE_DPST_WTHDR.DATA)aSaleDpstWthdr[iRow];

                    // 준비금 합계는 저장하지 않는다.
                    if (cSaleDpstWthdr.DPST_WTHDR_CD == PosConst.FRM_ACC_REMONEY_CODE.TOTAL_REMONEY) continue;

                    string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

                    sQuery = string.Format(sInsQuery
                                          , m_cTrnStatus.Head.CmpCd
                                          , m_cTrnStatus.Head.SaleDate
                                          , m_cTrnStatus.Head.StoreCd
                                          , m_cTrnStatus.Head.PosNo
                                          , m_cTrnStatus.Head.RegNo
                                          , iRow + 1                           // SEQ
                                          , m_cTrnStatus.Head.TradeNo          // 거래번호
                                          , cSaleDpstWthdr.DPST_WTHDR_TYPE     // 입출금유형
                                          , cSaleDpstWthdr.DPST_WTHDR_ACC_CD   // 입출금 계정
                                          , cSaleDpstWthdr.DPST_WTHDR_CD       // 입출금 코드
                                          , cSaleDpstWthdr.DPST_WTHDR_QTY      // 입출금 수량
                                          , cSaleDpstWthdr.DPST_WTHDR_AMT      // 입출금 금액
                                          , cSaleDpstWthdr.DPST_WTHDR_NM       // 입출금 명
                                          , cSaleDpstWthdr.CUST_NO             // 고객번호
                                          , cSaleDpstWthdr.STOR_PAY_TYPE        // 점포결제유형
                                          , cSaleDpstWthdr.ETC_REASON           // 기타사유
                                          , cSaleDpstWthdr.SLACK_FIELD_01      // 여유필드01
                                          , cSaleDpstWthdr.SLACK_FIELD_02      // 여유필드02
                                          , cSaleDpstWthdr.SLACK_FIELD_03      // 여유필드03
                                          , cSaleDpstWthdr.SLACK_FIELD_04      // 여유필드04
                                          , cSaleDpstWthdr.SLACK_FIELD_05      // 여유필드05
                                          , sRegDateTime                       // REG_DATE
                                          , sRegDateTime                       // UPD_DATE
                                          );

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sQuery }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sReturn;
                    }
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sReturn;
        }
        #endregion 

        #region 기타 데이터 저장 처리
        /// <summary>
        /// 기타 데이터 저장 처리
        /// </summary>
        /// <returns></returns>
        public string EtcSaveDataMain(string sSendYN)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource, m_cPosStatus.Base.LocalDbCatalog, m_cPosStatus.Base.LocalDbUserID, m_cPosStatus.Base.LocalDbPassword);
                m_cSqlDbService.Begin();

                sRet = SaveDpstWthdr();                         // 입출금정보(준비금) 저장
                if (sRet != UserCom.RST_OK)
                {
                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveDpstWthdr");

                    return sRet;
                }

                sRet = SaveEtcPluItem();                        // 상품정보 저장
                if (sRet != UserCom.RST_OK)
                {
                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveEtcPluItem");

                    return sRet;
                }

                sRet = SaveEtcPaymentItem();                    // 결제정보 저장
                if (sRet != UserCom.RST_OK)
                {
                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveEtcPaymentItem");

                    return sRet;
                }

                sRet = SaveEtcEtcItem();                        // 기타정보 저장
                if (sRet != UserCom.RST_OK)
                {
                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveEtcEtcItem");

                    return sRet;
                }

                sRet = SaveEtcHeader(sSendYN);                  // 트란해더 저장
                if (sRet != UserCom.RST_OK)
                {
                    UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveEtcHeader");

                    return sRet;
                }

                if (sSendYN != "1")       // 거래데이터 복구시 주방출력 안함(2017.05.24)
                {
                    sRet = SaveKtchOrdMsg();                        // 주방 데이터 저장                                      // Add, 2017.03.06, 주방출력 연습모드 적용
                    if (sRet != UserCom.RST_OK)
                    {
                        UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                            System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "Fail => SaveKtchOrdMsg");

                        return sRet;
                    }
                }


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

            return sRet;
        }
        #endregion 

        #region 기타 해더 저장 처리
        /// <summary>
        /// 기타 해더 저장 처리
        /// </summary>
        /// <returns></returns>
        public string SaveEtcHeader(string sSendYN)
        {
            string sQuery = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                sQuery += " INSERT INTO POSLOG..ETC_SALE_HEADER ( ";
                sQuery += " CMP_CD ,STOR_CD ,SALE_DT ,POS_NO, REG_NO ,TRADE_NO ,TRADE_DIV ,TRAIN_MODE_YN ,TRADE_KINDPER ,SYS_DT ";
                sQuery += " ,ORD_TIME ,PAY_TIME ,PIC_NO ,ORD_PIC_NO ,STOR_OWN_PART_TIME_DIV ,ORG_BILL_POSNO ,ORG_BILLDT ,ORG_BILL_NO ,RTN_RSN_CD ,RTN_RSN_MEMO ";
                sQuery += " ,NONSALES_RSN_CD ,RESERV_NO ,RESERV_DT ,CUST_NO ,ORD_DIV ,FLOOR_CD ,TBL_NO ,GUESTFLOOR ,FRGNR_DIV ,CUSTCNT ";
                sQuery += " ,PAY_GNDR_DIV ,PAY_AGE ,MAN_CMPNPSN_CNT ,WOMAN_CMPNPSN_CNT ,QTY ,TOTSALE_AMT ,TOTDC_AMT ,NET_SALE_AMT ,ITEM_DC_AMT ,CPI_DC_AMT ";
                sQuery += " ,COOP_CARD_DC_AMT,POINT_DC_AMT,CPN_DC_AMT,EMP_DC_AMT,SET_DC_AMT ,ETC_AMT ,EXCEP_DC_AMT ,TOT_VAT ,SVC_FEE_AMT ,SVC_FEE_VAT   ";
                sQuery += " ,ETC_VAT, AF_ACCUM_POINT_AMT ,AF_ACCUM_POINT_INFO, PPCARD_CUSTNM, AMT_DUTCHPAY_YN ,BILLSPR_CNT ,ORDER_NO,SLACK_FIELD,MID_CLOSE_SEQ,PPCARD_CUSTID ";
                
                //#20170828 해피포인트 적립 제외 버튼 추가 phj, start
                //기존
                //sQuery += " ,PACK_TRADE_DIV,TRADE_STAT, SEND_YN ,REG_DATE ,UPD_DATE ,VIP_TY";
                //변경
                sQuery += " ,PACK_TRADE_DIV,TRADE_STAT, SEND_YN ,REG_DATE ,UPD_DATE ,VIP_TY ,HP_EXCLUDE_YN";
                //#20170828 해피포인트 적립 제외 버튼 추가 phj, end

                sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";
                sQuery += " '{10}','{11}', '{12}', '{13}', '{14}', '{15}', '{16}', '{17}', '{18}' , N'{19}', ";
                sQuery += " '{20}','{21}', '{22}', '{23}', '{24}', '{25}', '{26}', '{27}', '{28}' , '{29}', ";
                sQuery += " '{30}','{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}', '{38}' , '{39}', ";
                sQuery += " '{40}','{41}', '{42}', '{43}', '{44}', '{45}', '{46}', '{47}', '{48}' , '{49}', ";
                sQuery += " '{50}','{51}', '{52}',N'{53}', '{54}', '{55}', '{56}', '{57}', '{58}' , '{59}', ";
                

                //#20170828 해피포인트 적립 제외 버튼 추가 phj, start
                //기존
                //sQuery += " '{60}','{61}', '{62}', '{63}', '{64}', '{65}' ) ";
                //변경
                sQuery += " '{60}','{61}', '{62}', '{63}', '{64}', '{65}', '{66}' ) ";
                //#20170828 해피포인트 적립 제외 버튼 추가 phj, end


                string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
                // 주문시간
                if (m_cTrnStatus.Head.OrderHms.Trim() == "") m_cTrnStatus.Head.OrderHms = m_cTrnStatus.Head.PayHms;

                sQuery = string.Format(sQuery
                    , m_cTrnStatus.Head.CmpCd           // CMP_CD
                    , m_cTrnStatus.Head.StoreCd         // STOR_CD
                    , m_cTrnStatus.Head.SaleDate        // SALE_DT
                    , m_cTrnStatus.Head.PosNo           // POS_NO
                    , m_cTrnStatus.Head.RegNo           // REG_NO
                    , m_cTrnStatus.Head.TradeNo         // TRADE_NO
                    , m_cTrnStatus.Head.TradeDiv        // TRADE_DIV
                    , m_cTrnStatus.Head.TrainModeYn     // TRAIN_MODE_YN
                    , m_cTrnStatus.Head.TradeKind       // TRADE_KINDPER
                    , m_cTrnStatus.Head.SysYmd          // SYS_DT
                    , m_cTrnStatus.Head.OrderHms        // ORD_TIME
                    , m_cTrnStatus.Head.PayHms          // PAY_TIME
                    , m_cTrnStatus.Head.CashierId       // PIC_NO
                    , m_cTrnStatus.Head.OrderPicNo      // ORD_PIC_NO
                    , m_cTrnStatus.Head.OwnPartDiv      // STOR_OWN_PART_TIME_DIV
                    , m_cTrnStatus.Head.OrgPosNo        // ORG_BILL_POSNO
                    , m_cTrnStatus.Head.OrgSaleDate     // ORG_BILLDT
                    , m_cTrnStatus.Head.OrgTradeNo      // ORG_BILL_NO
                    , m_cTrnStatus.Head.RtnReasonCd     // RTN_RSN_CD
                    , m_cTrnStatus.Head.RtnReasonMemo   // RTN_RSN_MEMO
                    , m_cTrnStatus.Head.NonSaleRsnCd =="" ? "0": m_cTrnStatus.Head.NonSaleRsnCd    // NONSALES_RSN_CD
                    , m_cTrnStatus.Head.ReserveNo       // RESERV_NO
                    , m_cTrnStatus.Head.ReserveYmd      // RESERV_DT
                    , m_cTrnStatus.Head.MemberCustNo    // CUST_NO
                    , m_cTrnStatus.Head.OrderFlag       // ORD_DIV
                    , m_cTrnStatus.Head.FloorCd         // FLOOR_CD
                    , m_cTrnStatus.Head.TableNo         // TBL_NO
                    , m_cTrnStatus.Head.CustFloor       // GUESTFLOOR
                    , m_cTrnStatus.Head.ForeignFlag     // FRGNR_DIV
                    , m_cTrnStatus.Head.CustCnt         // CUSTCNT
                    , m_cTrnStatus.Head.PayGndrDiv      // PAY_GNDR_DIV
                    , m_cTrnStatus.Head.PayAge          // PAY_AGE
                    , m_cTrnStatus.Head.ManCmpnpsnCnt   // MAN_CMPNPSN_CNT
                    , m_cTrnStatus.Head.WomanCmpnpsnCnt // WOMAN_CMPNPSN_CNT
                    , m_cTrnStatus.Head.TotQty          // QTY
                    , m_cTrnStatus.Head.TotSaleAmt      // TOTSALE_AMT
                    , m_cTrnStatus.Head.TotDcAmt        // TOTDC_AMT
                    , m_cTrnStatus.Head.NetSaleAmt      // NET_SALE_AMT
                    , m_cTrnStatus.Head.ItemDcAmt       // ITEM_DC_AMT
                    , m_cTrnStatus.Head.CpiDcAmt        // CPI_DC_AMT

                    , m_cTrnStatus.Head.CoopCardDcAmt   // COOP_CARD_DC_AMT
                    , m_cTrnStatus.Head.PointDcAmt      // POINT_DC_AMT
                    , m_cTrnStatus.Head.CpnDcAmt        // CPN_DC_AMT
                    , m_cTrnStatus.Head.EmpDcAmt        // EMP_DC_AMT

                    , m_cTrnStatus.Head.SetDcAmt        // SET_DC_AMT
                    , m_cTrnStatus.Head.EtcDcAmt        // ETC_AMT

                    , m_cTrnStatus.Head.ExcepDcAmt      // EXCEP_DC_AMT

                    , m_cTrnStatus.Head.TotVatAmt       // TOT_VAT
                    , m_cTrnStatus.Head.SvcFeeAmt       // SVC_FEE_AMT
                    , m_cTrnStatus.Head.SvcFeeVat       // SVC_FEE_VAT
                    , m_cTrnStatus.Head.EtcVatAmt       // ETC_VAT
                    , m_cTrnStatus.Head.AftSavePoint    // AF_ACCUM_POINT_AMT

                    , m_cTrnStatus.Head.AftSaveAddInfo // AF_ACCUM_POINT_INFO
                    , m_cTrnStatus.Head.PpCardCustNm     // PPCARD_CUSTNM


                    , m_cTrnStatus.Head.AmtDutchPayYn   // AMT_DUTCHPAY_YN
                    , m_cTrnStatus.Head.BillSplitCnt    // BILLSPR_CNT
                    , m_cTrnStatus.Head.OrderNo         // ORDER_NO
                    , ""                                // SLACK_FIELD

                    , m_cTrnStatus.Head.MidCloseSeq     // MID_CLOSE_SEQ
                    , m_cTrnStatus.Head.PpCardCustId    // PPCARD_CUSTID
                    , m_cTrnStatus.Head.PackTradeDiv    // PACK_TRADE_DIV
                    , "0"                               // TRADE_STAT
                    , sSendYN                           // SEND_YN
                    , sRegDateTime                      // REG_DATE
                    , sRegDateTime                      // UPD_DATE
                    , m_cTrnStatus.Head.VipTy           // VIP_TY

                    //#20170828 해피포인트 적립 제외 버튼 추가 phj, start
                    , m_cTrnStatus.Head.HP_EXCLUDE_YN   // HP_EXCLUDE_YN
                    //#20170828 해피포인트 적립 제외 버튼 추가 phj, end
                    );

                if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sQuery }) == UserCom.OK) return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 기타 상품 저장 처리
        /// <summary>
        /// 기타 상품 저장 처리
        /// </summary>
        /// <returns></returns>
        public string SaveEtcPluItem()
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                // 상품정보
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (aSaleItem.Count == 0) return UserCom.RST_OK;

                sQuery = "";
                sQuery += " INSERT INTO POSLOG..ETC_SALE_DETAIL ( ";
                sQuery += " CMP_CD ,STOR_CD ,SALE_DT ,POS_NO ,REG_NO ,SEQ ,TRADE_NO ,ORD_TIME ,FLOOR_CD ,TBL_NO ";
                sQuery += " ,SUB_SHOP_CD ,ITEM_PLU_CD ,ITEM_DIV ,SALE_QTY ,SALE_PRC ,SALE_AMT ,FLAVOUR_DIV ,FLAVOUR_WEIGHT ,ITEM_INPUT_DIV, ITEM_BAR_CD ";
                sQuery += " ,TAKE_IN_OUT_DIV ,ITEM_TAX_DIV ,TAX_AMT_INCLUDE_YN, TAXRATE_CD, APPLY_TAX_AMT ,SVC_FEE_AMT ,SVC_FEE_VAT ,NONSALES_RSN_CD, SVC_TAXREATE_CD, BILL_AMT ";
                sQuery += " ,DC_DIV ,DC_TYPE ,DC_RATE ,ITEM_DC_AMT ,SUM_DC_AMT ,CPI_DC_QTY ,CPI_DC_AMT ,COOP_CARD_DC_DIV ,COOP_CARD_DC_AMT ,POINT_DC_DIV  ";
                sQuery += " ,POINT_DC_AMT ,CPN_DC_DIV ,CPN_DC_AMT ,EMP_DC_DIV ,EMP_DC_AMT ,SET_DC_AMT ,ETC_DC_DIV ,ETC_DC_AMT ,EXCEP_DC_DIV ,EXCEP_DC_AMT  ";
                sQuery += " ,PACK_DIV ,SET_MENU_CD ,SUBPRC_MENU_KEY_DIV ,CPI_PRESENT_DIV ,BILLSPR_NO ,SALE_GIFT_NO ,CPN_NO ,SLACK_FIELD ,DISPO_ITEM_DIV ,CANCEL_DIV ";
                sQuery += " ,REG_DATE ,UPD_DATE ,NOTAX_DIV";
                sQuery += " ) VALUES ( ";
                sQuery += "  '{0}', '{1}',  '{2}',  '{3}',  '{4}',  '{5}',  '{6}',  '{7}',  '{8}',  '{9}', ";
                sQuery += " '{10}','{11}', '{12}', '{13}', '{14}', '{15}', '{16}', '{17}', '{18}', '{19}', ";
                sQuery += " '{20}','{21}', '{22}', '{23}', '{24}', '{25}', '{26}', '{27}', '{28}', '{29}', ";
                sQuery += " '{30}','{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}', '{38}', '{39}',";
                sQuery += " '{40}','{41}', '{42}', '{43}', '{44}', '{45}', '{46}', '{47}', '{48}', '{49}', ";
                sQuery += " '{50}','{51}', '{52}', '{53}', '{54}', '{55}', '{56}', '{57}', '{58}', '{59}', ";
                sQuery += " '{60}','{61}', '{62}'  )";

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

                    if (cSaleItem.CANCEL_DIV == "1" || cSaleItem.CANCEL_DIV_MAIN == "1") cSaleItem.CANCEL_DIV = "1";


                    //취소 소계 전후 체크
                    string sCanDiv = cSaleItem.CANCEL_DIV;

                    if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL)
                    {
                        sCanDiv = m_cTrnStatus.Sale.SubTotalCancelDiv == true ? PosConst.CANCEL_DIV.CANCEL_SUBTOT : PosConst.CANCEL_DIV.CANCEL;
                    }

                    string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
                    // 주문시간
                    if (cSaleItem.ORD_TIME.Trim() == "") cSaleItem.ORD_TIME = m_cTrnStatus.Head.PayHms;

                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        , m_cTrnStatus.Head.RegNo       // REG_NO
                        , iRow + 1                      // SEQ
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , cSaleItem.ORD_TIME            // ORD_TIME
                        , cSaleItem.FLOOR_CD            // FLOOR_CD
                        , cSaleItem.TBL_NO              // TBL_NO
                        , cSaleItem.SUB_SHOP_CD         // SUB_SHOP_CD
                        , cSaleItem.ITEM_PLU_CD         // ITEM_PLU_CD
                        , cSaleItem.ITEM_DIV            // ITEM_DIV
                        , cSaleItem.SALE_QTY            // SALE_QTY
                        , cSaleItem.SALE_PRC            // SALE_PRC
                        , cSaleItem.SALE_AMT            // SALE_AMT
                        , cSaleItem.FLAVOUR_DIV         // FLAVOUR_DIV
                        , cSaleItem.FLAVOUR_STOCK      // FLAVOUR_STOCK
                        , cSaleItem.ITEM_INPUT_DIV      // ITEM_INPUT_DIV
                        , cSaleItem.ITEM_BAR_CD         // ITEM_BAR_CD
                        , cSaleItem.TAKE_IN_OUT_DIV     // TAKE_IN_OUT_DIV
                        , cSaleItem.ITEM_TAX_DIV        // ITEM_TAX_DIV
                        , cSaleItem.TAX_AMT_INCLUDE_YN  // TAX_AMT_INCLUDE_YN
                        , cSaleItem.TAXRATE_CD          // TAXRATE_CD
                        , cSaleItem.APPLY_TAX_AMT       // APPLY_TAX_AMT
                        , cSaleItem.SVC_FEE_AMT         // SVC_FEE_AMT
                        , cSaleItem.SVC_FEE_VAT         // SVC_FEE_VAT
                        , cSaleItem.NONSALES_RSN_CD == "" ? "0" : cSaleItem.NONSALES_RSN_CD     // NONSALES_RSN_CD
                        , cSaleItem.SVC_TAXREATE_CD     //SVC_TAXREATE_CD
                        , cSaleItem.BILL_AMT            // BILL_AMT
                        , cSaleItem.DC_DIV
                        , cSaleItem.DC_TYPE
                        , cSaleItem.DC_RATE
                        , cSaleItem.ITEM_DC_AMT
                        , cSaleItem.SUM_DC_AMT
                        , cSaleItem.CPI_DC_QTY
                        , cSaleItem.CPI_DC_AMT
                        , cSaleItem.COOP_CARD_DC_DIV
                        , cSaleItem.COOP_CARD_DC_AMT
                        , cSaleItem.POINT_DC_DIV
                        , cSaleItem.POINT_DC_AMT
                        , cSaleItem.CPN_DC_DIV
                        , cSaleItem.CPN_DC_AMT
                        , cSaleItem.EMP_DC_DIV
                        , cSaleItem.EMP_DC_AMT
                        , cSaleItem.SET_DC_AMT
                        , cSaleItem.ETC_DC_DIV
                        , cSaleItem.ETC_DC_AMT

                        , cSaleItem.EXCEP_DC_DIV
                        , cSaleItem.EXCEP_DC_AMT

                        , cSaleItem.PACK_DIV
                        , cSaleItem.SET_MENU_CD == "" ? cSaleItem.SUB_MENU_MAIN_CD : cSaleItem.SET_MENU_CD
                        , cSaleItem.SUBPRC_MENU_KEY_DIV
                        , cSaleItem.CPI_PRESENT_DIV
                        , cSaleItem.BILLSPR_NO
                        , cSaleItem.SALE_GIFT_NO
                        , cSaleItem.CPN_NO
                        , cSaleItem.SLACK_FIELD         // 선불카드권종(2017.06.27)
                        , cSaleItem.DISPO_ITEM_DIV
                        , sCanDiv
                        , sRegDateTime                  // REG_DATE
                        , sRegDateTime                  // UPD_DATE
                        , cSaleItem.NOTAX_DIV
                        );

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 기타 결제 저장 처리
        /// <summary>
        /// 기타 결제 저장 처리
        /// </summary>
        /// <returns></returns>
        public string SaveEtcPaymentItem()
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                // 결제정보
                ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                if (alPayItem.Count == 0) return UserCom.RST_OK;

                sQuery += " INSERT INTO POSLOG..ETC_SALE_PAY ( ";
                sQuery += " CMP_CD, STOR_CD, SALE_DT, POS_NO, REG_NO, TRADE_NO, SEQ,  PAY_WAY_CD, PAY_AMT, PAY_DTL_CD_01,";
                sQuery += "  PAY_DTL_CD_02, PAY_DTL_CD_03, PAY_DTL_CD_04, PAY_DTL_CD_05, QTY_ENTRY_01, QTY_ENTRY_02, QTY_ENTRY_03, QTY_ENTRY_04,QTY_ENTRY_05, AMT_ENTRY_01, ";
                sQuery += "  AMT_ENTRY_02, AMT_ENTRY_03, AMT_ENTRY_04, AMT_ENTRY_05, AMT_ENTRY_06, AMT_ENTRY_07, AMT_ENTRY_08, AMT_ENTRY_09,AMT_ENTRY_10, OCCUR_ENTRY_01, ";
                sQuery += "  OCCUR_ENTRY_02, OCCUR_ENTRY_03, OCCUR_ENTRY_04, OCCUR_ENTRY_05, OCCUR_ENTRY_06, OCCUR_ENTRY_07, OCCUR_ENTRY_08, OCCUR_ENTRY_09, OCCUR_ENTRY_10, OCCUR_ENTRY_11, ";
                sQuery += "  OCCUR_ENTRY_12, OCCUR_ENTRY_13, OCCUR_ENTRY_14, OCCUR_ENTRY_15, OCCUR_ENTRY_16, OCCUR_ENTRY_17, OCCUR_ENTRY_18, OCCUR_ENTRY_19,OCCUR_ENTRY_20, OCCUR_ENTRY_21, ";
                sQuery += "  OCCUR_ENTRY_22, OCCUR_ENTRY_23, OCCUR_ENTRY_24, OCCUR_ENTRY_25, BILLSPR_NO, CANCEL_DIV, REG_DATE, UPD_DATE ";
                sQuery += " ) VALUES ( ";
                sQuery += "   '{0}',  '{1}',   '{2}',   '{3}',   '{4}',   '{5}',   '{6}',   '{7}',   '{8}' ,   '{9}', ";
                sQuery += "  '{10}', '{11}',  '{12}',  '{13}',  '{14}',  '{15}',  '{16}',  '{17}',  '{18}' ,  '{19}', ";
                sQuery += "  '{20}', '{21}',  '{22}',  '{23}',  '{24}',  '{25}',  '{26}',  '{27}',  '{28}' , N'{29}', ";
                sQuery += " N'{30}',N'{31}', N'{32}', N'{33}', N'{34}', N'{35}', N'{36}', N'{37}', N'{38}' , N'{39}', ";
                sQuery += " N'{40}',N'{41}', N'{42}', N'{43}', N'{44}', N'{45}', N'{46}', N'{47}', N'{48}' , N'{49}', ";
                sQuery += " N'{50}',N'{51}', N'{52}', N'{53}',  '{54}',  '{55}',  '{56}',  '{57}' )";

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

                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        , m_cTrnStatus.Head.RegNo      // REG_NO
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , iRow + 1 // SEQ
                        , cPayItem.PAY_WAY_CD   // PAY_WAY_CD
                        , cPayItem.PAY_AMT   // PAY_AMT
                        , cPayItem.PAY_DTL_CD_01   // PAY_DTL_CD_01
                        , cPayItem.PAY_DTL_CD_02   // PAY_DTL_CD_02
                        , cPayItem.PAY_DTL_CD_03   // PAY_DTL_CD_03
                        , cPayItem.PAY_DTL_CD_04   // PAY_DTL_CD_04
                        , cPayItem.PAY_DTL_CD_05   // PAY_DTL_CD_05
                        , cPayItem.QTY_ENTRY_01   // QTY_ENTRY_01
                        , cPayItem.QTY_ENTRY_02   // QTY_ENTRY_02
                        , cPayItem.QTY_ENTRY_03   // QTY_ENTRY_03
                        , cPayItem.QTY_ENTRY_04   // QTY_ENTRY_04
                        , cPayItem.QTY_ENTRY_05   // QTY_ENTRY_05
                        , cPayItem.AMT_ENTRY_01   // AMT_ENTRY_01
                        , cPayItem.AMT_ENTRY_02   // AMT_ENTRY_02
                        , cPayItem.AMT_ENTRY_03   // AMT_ENTRY_03
                        , cPayItem.AMT_ENTRY_04   // AMT_ENTRY_04
                        , cPayItem.AMT_ENTRY_05   // AMT_ENTRY_05
                        , cPayItem.AMT_ENTRY_06   // AMT_ENTRY_06
                        , cPayItem.AMT_ENTRY_07   // AMT_ENTRY_07
                        , cPayItem.AMT_ENTRY_08   // AMT_ENTRY_08
                        , cPayItem.AMT_ENTRY_09   // AMT_ENTRY_09
                        , cPayItem.AMT_ENTRY_10   // AMT_ENTRY_10
                        , cPayItem.OCCUR_ENTRY_01   // OCCUR_ENTRY_01
                        , cPayItem.OCCUR_ENTRY_02   // OCCUR_ENTRY_02
                        , cPayItem.OCCUR_ENTRY_03   // OCCUR_ENTRY_03
                        , cPayItem.OCCUR_ENTRY_04   // OCCUR_ENTRY_04
                        , cPayItem.OCCUR_ENTRY_05   // OCCUR_ENTRY_05
                        , cPayItem.OCCUR_ENTRY_06   // OCCUR_ENTRY_06
                        , cPayItem.OCCUR_ENTRY_07   // OCCUR_ENTRY_07
                        , cPayItem.OCCUR_ENTRY_08   // OCCUR_ENTRY_08
                        , cPayItem.OCCUR_ENTRY_09   // OCCUR_ENTRY_09
                        , cPayItem.OCCUR_ENTRY_10   // OCCUR_ENTRY_10
                        , cPayItem.OCCUR_ENTRY_11   // OCCUR_ENTRY_11
                        , cPayItem.OCCUR_ENTRY_12   // OCCUR_ENTRY_12
                        , cPayItem.OCCUR_ENTRY_13   // OCCUR_ENTRY_13
                        , cPayItem.OCCUR_ENTRY_14   // OCCUR_ENTRY_14
                        , cPayItem.OCCUR_ENTRY_15   // OCCUR_ENTRY_15
                        , cPayItem.OCCUR_ENTRY_16   // OCCUR_ENTRY_16
                        , cPayItem.OCCUR_ENTRY_17   // OCCUR_ENTRY_17
                        , cPayItem.OCCUR_ENTRY_18   // OCCUR_ENTRY_18
                        , cPayItem.OCCUR_ENTRY_19   // OCCUR_ENTRY_19
                        , cPayItem.OCCUR_ENTRY_20   // OCCUR_ENTRY_20
                        , cPayItem.OCCUR_ENTRY_21   // OCCUR_ENTRY_21
                        , cPayItem.OCCUR_ENTRY_22   // OCCUR_ENTRY_22
                        , cPayItem.OCCUR_ENTRY_23   // OCCUR_ENTRY_23
                        , cPayItem.OCCUR_ENTRY_24   // OCCUR_ENTRY_24
                        , cPayItem.OCCUR_ENTRY_25   // OCCUR_ENTRY_25
                        , cPayItem.BILLSPR_NO   // BILLSPR_NO
                        , cPayItem.CANCEL_DIV   // CANCEL_DIV
                        , DateTime.Now.ToString("yyyyMMddHHmmss")
                        , DateTime.Now.ToString("yyyyMMddHHmmss"));

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 기타 기타 수단코드 저장
        /// <summary>
        /// 기타 기타 수단코드 저장
        /// </summary>
        /// <returns></returns>
        public string SaveEtcEtcItem()
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                if (alEtcItem.Count == 0) return UserCom.RST_OK;

                sQuery += " INSERT INTO POSLOG..ETC_SALE_ETC ( ";
                sQuery += " CMP_CD, STOR_CD, SALE_DT, POS_NO, REG_NO, TRADE_NO, SEQ,  ETC_WAY_CD, ETC_AMT, ETC_DTL_CD_01,";
                sQuery += "  ETC_DTL_CD_02, ETC_DTL_CD_03, ETC_DTL_CD_04, ETC_DTL_CD_05, QTY_ENTRY_01, QTY_ENTRY_02, QTY_ENTRY_03, QTY_ENTRY_04,QTY_ENTRY_05, AMT_ENTRY_01, ";
                sQuery += "  AMT_ENTRY_02, AMT_ENTRY_03, AMT_ENTRY_04, AMT_ENTRY_05, AMT_ENTRY_06, AMT_ENTRY_07, AMT_ENTRY_08, AMT_ENTRY_09,AMT_ENTRY_10, OCCUR_ENTRY_01, ";
                sQuery += "  OCCUR_ENTRY_02, OCCUR_ENTRY_03, OCCUR_ENTRY_04, OCCUR_ENTRY_05, OCCUR_ENTRY_06, OCCUR_ENTRY_07, OCCUR_ENTRY_08, OCCUR_ENTRY_09, OCCUR_ENTRY_10, OCCUR_ENTRY_11, ";
                sQuery += "  OCCUR_ENTRY_12, OCCUR_ENTRY_13, OCCUR_ENTRY_14, OCCUR_ENTRY_15, OCCUR_ENTRY_16, OCCUR_ENTRY_17, OCCUR_ENTRY_18, OCCUR_ENTRY_19,OCCUR_ENTRY_20, OCCUR_ENTRY_21, ";
                sQuery += "  OCCUR_ENTRY_22, OCCUR_ENTRY_23, OCCUR_ENTRY_24, OCCUR_ENTRY_25, BILLSPR_NO, CANCEL_DIV, REG_DATE, UPD_DATE ";
                sQuery += " ) VALUES ( ";
                sQuery += "   '{0}',  '{1}',   '{2}',   '{3}',   '{4}',   '{5}',   '{6}',   '{7}',   '{8}' ,   '{9}', ";
                sQuery += "  '{10}', '{11}',  '{12}',  '{13}',  '{14}',  '{15}',  '{16}',  '{17}',  '{18}' ,  '{19}', ";
                sQuery += "  '{20}', '{21}',  '{22}',  '{23}',  '{24}',  '{25}',  '{26}',  '{27}',  '{28}' , N'{29}', ";
                sQuery += " N'{30}',N'{31}', N'{32}', N'{33}', N'{34}', N'{35}', N'{36}', N'{37}', N'{38}' , N'{39}', ";
                sQuery += " N'{40}',N'{41}', N'{42}', N'{43}', N'{44}', N'{45}', N'{46}', N'{47}', N'{48}' , N'{49}', ";
                sQuery += " N'{50}',N'{51}', N'{52}', N'{53}',  '{54}',  '{55}',  '{56}',  '{57}' )";

                for (int iRow = 0; iRow < alEtcItem.Count; iRow++)
                {
                    Column.TR_ETC.DATA cEtcItem = (Column.TR_ETC.DATA)alEtcItem[iRow];

                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        , m_cTrnStatus.Head.RegNo      // REG_NO
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , iRow + 1 // SEQ
                        , cEtcItem.ETC_WAY_CD   // ETC_WAY_CD
                        , cEtcItem.ETC_AMT   // ETC_AMT
                        , cEtcItem.ETC_DTL_CD_01   // ETC_DTL_CD_01
                        , cEtcItem.ETC_DTL_CD_02   // ETC_DTL_CD_02
                        , cEtcItem.ETC_DTL_CD_03   // ETC_DTL_CD_03
                        , cEtcItem.ETC_DTL_CD_04   // ETC_DTL_CD_04
                        , cEtcItem.ETC_DTL_CD_05   // ETC_DTL_CD_05
                        , cEtcItem.QTY_ENTRY_01   // QTY_ENTRY_01
                        , cEtcItem.QTY_ENTRY_02   // QTY_ENTRY_02
                        , cEtcItem.QTY_ENTRY_03   // QTY_ENTRY_03
                        , cEtcItem.QTY_ENTRY_04   // QTY_ENTRY_04
                        , cEtcItem.QTY_ENTRY_05   // QTY_ENTRY_05
                        , cEtcItem.AMT_ENTRY_01   // AMT_ENTRY_01
                        , cEtcItem.AMT_ENTRY_02   // AMT_ENTRY_02
                        , cEtcItem.AMT_ENTRY_03   // AMT_ENTRY_03
                        , cEtcItem.AMT_ENTRY_04   // AMT_ENTRY_04
                        , cEtcItem.AMT_ENTRY_05   // AMT_ENTRY_05
                        , cEtcItem.AMT_ENTRY_06   // AMT_ENTRY_06
                        , cEtcItem.AMT_ENTRY_07   // AMT_ENTRY_07
                        , cEtcItem.AMT_ENTRY_08   // AMT_ENTRY_08
                        , cEtcItem.AMT_ENTRY_09   // AMT_ENTRY_09
                        , cEtcItem.AMT_ENTRY_10   // AMT_ENTRY_10
                        , cEtcItem.OCCUR_ENTRY_01   // OCCUR_ENTRY_01
                        , cEtcItem.OCCUR_ENTRY_02   // OCCUR_ENTRY_02
                        , cEtcItem.OCCUR_ENTRY_03   // OCCUR_ENTRY_03
                        , cEtcItem.OCCUR_ENTRY_04   // OCCUR_ENTRY_04
                        , cEtcItem.OCCUR_ENTRY_05   // OCCUR_ENTRY_05
                        , cEtcItem.OCCUR_ENTRY_06   // OCCUR_ENTRY_06
                        , cEtcItem.OCCUR_ENTRY_07   // OCCUR_ENTRY_07
                        , cEtcItem.OCCUR_ENTRY_08   // OCCUR_ENTRY_08
                        , cEtcItem.OCCUR_ENTRY_09   // OCCUR_ENTRY_09
                        , cEtcItem.OCCUR_ENTRY_10   // OCCUR_ENTRY_10
                        , cEtcItem.OCCUR_ENTRY_11   // OCCUR_ENTRY_11
                        , cEtcItem.OCCUR_ENTRY_12   // OCCUR_ENTRY_12
                        , cEtcItem.OCCUR_ENTRY_13   // OCCUR_ENTRY_13
                        , cEtcItem.OCCUR_ENTRY_14   // OCCUR_ENTRY_14
                        , cEtcItem.OCCUR_ENTRY_15   // OCCUR_ENTRY_15
                        , cEtcItem.OCCUR_ENTRY_16   // OCCUR_ENTRY_16
                        , cEtcItem.OCCUR_ENTRY_17   // OCCUR_ENTRY_17
                        , cEtcItem.OCCUR_ENTRY_18   // OCCUR_ENTRY_18
                        , cEtcItem.OCCUR_ENTRY_19   // OCCUR_ENTRY_19
                        , cEtcItem.OCCUR_ENTRY_20   // OCCUR_ENTRY_20
                        , cEtcItem.OCCUR_ENTRY_21   // OCCUR_ENTRY_21
                        , cEtcItem.OCCUR_ENTRY_22   // OCCUR_ENTRY_22
                        , cEtcItem.OCCUR_ENTRY_23   // OCCUR_ENTRY_23
                        , cEtcItem.OCCUR_ENTRY_24   // OCCUR_ENTRY_24
                        , cEtcItem.OCCUR_ENTRY_25   // OCCUR_ENTRY_25
                        , cEtcItem.BILLSPR_NO   // BILLSPR_NO
                        , cEtcItem.CANCEL_DIV   // CANCEL_DIV
                        , DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 예약 고객 정보
        /// <summary>
        /// 예약 고객 정보
        /// </summary>
        /// <returns></returns>
        public string SaveTranReservInfo(string sSendYN)
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                // 상품정보
                ArrayList aSaleReservInfo = (ArrayList)StateObject.GetItemObject(Column.TR_RESERV_INFO.ITEM);
                if (aSaleReservInfo.Count == 0) return UserCom.RST_OK;

                sQuery += " INSERT INTO POSLOG.dbo.TR_RESERV_INFO ( ";
                sQuery += "   CMP_CD ,SALE_DT ,STOR_CD ,POS_NO ,TRADE_NO ,RESERV_NO ,RESERV_REG_DT ,RESERV_REG_TM ,ONOFF_DIV ,CUSTNM  ";
                sQuery += "  ,CUST_PHN_NO ,RESERV_DT ,RESERV_TM ,RESERV_MEMO ,SEND_YN ,REG_DATE ,UPD_DATE) ";
                sQuery += "  VALUES( ";
                sQuery += "  '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , N'{9}', ";
                sQuery += " '{10}','{11}', '{12}', N'{13}', '{14}', '{15}', '{16}' )";


                Column.TR_RESERV_INFO.DATA cSaleReservInfo = (Column.TR_RESERV_INFO.DATA)aSaleReservInfo[0];

                string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

                sSQL = string.Format(sQuery
                    , m_cTrnStatus.Head.CmpCd       // CMP_CD
                    , m_cTrnStatus.Head.SaleDate    // SALE_DT
                    , m_cTrnStatus.Head.StoreCd     // STOR_CD
                    , m_cTrnStatus.Head.PosNo       // POS_NO
                    , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                    , cSaleReservInfo.RESERV_NO
                    , cSaleReservInfo.RESERV_REG_DT
                    , cSaleReservInfo.RESERV_REG_TM
                    , cSaleReservInfo.ONOFF_DIV
                    , cSaleReservInfo.CUSTNM
                    , cSaleReservInfo.CUST_PHN_NO
                    , cSaleReservInfo.RESERV_DT
                    , cSaleReservInfo.RESERV_TM
                    , cSaleReservInfo.RESERV_MEMO
                    , sSendYN
                    , sRegDateTime                  // REG_DATE
                    , sRegDateTime                  // UPD_DATE
                    );

                if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                {
                    m_cSqlDbService.Rollback();
                    return sRet;
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 고객수 정보
        /// <summary>
        /// 고객수 정보
        /// </summary>
        /// <returns></returns>
        public string SaveGuestCnt()
        {
            string sQuery = "";
            string sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                // 고객수 정보
                ArrayList alCuestItem = (ArrayList)StateObject.GetItemObject(Column.TR_GUEST.ITEM);
                if (alCuestItem.Count == 0) return UserCom.RST_OK;

                sQuery += " INSERT INTO POSLOG.dbo.TR_SALE_GUESTCNT ( ";
                sQuery += "   CMP_CD, STOR_CD, SALE_DT, POS_NO, TRADE_NO ";
                sQuery += "   ,MALE_10L, MALE_20L, MALE_30L, MALE_40L, MALE_50L ";
                sQuery += "   ,FMALE_10L, FMALE_20L, FMALE_30L, FMALE_40L, FMALE_50L ";
                sQuery += "   ,SEND_DIV, REG_DATE, UPD_DATE) ";
                sQuery += "  VALUES( ";
                sQuery += "   '{0}', '{1}', '{2}', '{3}', '{4}' ";
                sQuery += "  ,'{5}', '{6}', '{7}', '{8}' , '{9}' ";
                sQuery += " ,'{10}','{11}', '{12}', '{13}', '{14}' ";
                sQuery += " ,'{15}', '{16}', '{17}' )";

                Column.TR_GUEST.DATA clCuestItem = (Column.TR_GUEST.DATA)alCuestItem[0];

                string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

                sSQL = string.Format(sQuery
                    , m_cTrnStatus.Head.CmpCd       // CMP_CD
                    , m_cTrnStatus.Head.SaleDate    // SALE_DT
                    , m_cTrnStatus.Head.StoreCd     // STOR_CD
                    , m_cTrnStatus.Head.PosNo       // POS_NO
                    , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                    , clCuestItem.MALE_10L
                    , clCuestItem.MALE_20L
                    , clCuestItem.MALE_30L
                    , clCuestItem.MALE_40L
                    , clCuestItem.MALE_50L
                    , clCuestItem.FMALE_10L
                    , clCuestItem.FMALE_20L
                    , clCuestItem.FMALE_30L
                    , clCuestItem.FMALE_40L
                    , clCuestItem.FMALE_50L
                    , "0", sRegDateTime, sRegDateTime );

                if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                {
                    m_cSqlDbService.Rollback();
                    return sRet;
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
        #endregion 

        #region 지정취소 데이터 저장 처리
        /// <summary>
        /// 지정취소 데이터 저장 처리
        /// </summary>
        /// <returns></returns>
        public string ItemCancelSaveData()
        {
            string sQuery = "", sSQL = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource, m_cPosStatus.Base.LocalDbCatalog, m_cPosStatus.Base.LocalDbUserID, m_cPosStatus.Base.LocalDbPassword);
                m_cSqlDbService.Begin();

                string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");

                // 상품정보
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (aSaleItem.Count == 0) return UserCom.RST_OK;

                sQuery = "";
                sQuery += " INSERT INTO POSLOG..ETC_SALE_DETAIL ( ";
                sQuery += " CMP_CD ,STOR_CD ,SALE_DT ,POS_NO ,REG_NO ,SEQ ,TRADE_NO ,ORD_TIME ,FLOOR_CD ,TBL_NO ";
                sQuery += " ,SUB_SHOP_CD ,ITEM_PLU_CD ,ITEM_DIV ,SALE_QTY ,SALE_PRC ,SALE_AMT ,FLAVOUR_DIV ,FLAVOUR_WEIGHT ,ITEM_INPUT_DIV, ITEM_BAR_CD ";
                sQuery += " ,TAKE_IN_OUT_DIV ,ITEM_TAX_DIV ,TAX_AMT_INCLUDE_YN, TAXRATE_CD, APPLY_TAX_AMT ,SVC_FEE_AMT ,SVC_FEE_VAT ,NONSALES_RSN_CD, SVC_TAXREATE_CD, BILL_AMT ";
                sQuery += " ,DC_DIV ,DC_TYPE ,DC_RATE ,ITEM_DC_AMT ,SUM_DC_AMT ,CPI_DC_QTY ,CPI_DC_AMT ,COOP_CARD_DC_DIV ,COOP_CARD_DC_AMT ,POINT_DC_DIV  ";
                sQuery += " ,POINT_DC_AMT ,CPN_DC_DIV ,CPN_DC_AMT ,EMP_DC_DIV ,EMP_DC_AMT ,SET_DC_AMT ,ETC_DC_DIV ,ETC_DC_AMT ,EXCEP_DC_DIV ,EXCEP_DC_AMT  ";
                sQuery += " ,PACK_DIV ,SET_MENU_CD ,SUBPRC_MENU_KEY_DIV ,CPI_PRESENT_DIV ,BILLSPR_NO ,SALE_GIFT_NO ,CPN_NO ,SLACK_FIELD ,DISPO_ITEM_DIV ,CANCEL_DIV ";
                sQuery += " ,REG_DATE ,UPD_DATE ,NOTAX_DIV ";
                sQuery += " ) VALUES ( ";
                sQuery += "  '{0}', '{1}',  '{2}',  '{3}',  '{4}',  '{5}',  '{6}',  '{7}',  '{8}',  '{9}', ";
                sQuery += " '{10}','{11}', '{12}', '{13}', '{14}', '{15}', '{16}', '{17}', '{18}', '{19}', ";
                sQuery += " '{20}','{21}', '{22}', '{23}', '{24}', '{25}', '{26}', '{27}', '{28}', '{29}', ";
                sQuery += " '{30}','{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}', '{38}', '{39}',";
                sQuery += " '{40}','{41}', '{42}', '{43}', '{44}', '{45}', '{46}', '{47}', '{48}', '{49}', ";
                sQuery += " '{50}','{51}', '{52}', '{53}', '{54}', '{55}', '{56}', '{57}', '{58}', '{59}', ";
                sQuery += " '{60}','{61}', '{62}'  )";

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

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

                    //취소 소계 전후 체크
                    string sCanDiv = m_cTrnStatus.Sale.SubTotalCancelDiv == true ? PosConst.CANCEL_DIV.CANCEL_SUBTOT : PosConst.CANCEL_DIV.CANCEL;

                    nItemRow++;
                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        , m_cTrnStatus.Head.RegNo       // REG_NO
                        , nItemRow                      // SEQ
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , cSaleItem.ORD_TIME            // ORD_TIME
                        , cSaleItem.FLOOR_CD            // FLOOR_CD
                        , cSaleItem.TBL_NO              // TBL_NO
                        , cSaleItem.SUB_SHOP_CD         // SUB_SHOP_CD
                        , cSaleItem.ITEM_PLU_CD         // ITEM_PLU_CD
                        , cSaleItem.ITEM_DIV            // ITEM_DIV
                        , cSaleItem.SALE_QTY            // SALE_QTY
                        , cSaleItem.SALE_PRC            // SALE_PRC
                        , cSaleItem.SALE_AMT            // SALE_AMT
                        , cSaleItem.FLAVOUR_DIV         // FLAVOUR_DIV
                        , cSaleItem.FLAVOUR_STOCK      // FLAVOUR_STOCK
                        , cSaleItem.ITEM_INPUT_DIV      // ITEM_INPUT_DIV
                        , cSaleItem.ITEM_BAR_CD         // ITEM_BAR_CD
                        , cSaleItem.TAKE_IN_OUT_DIV     // TAKE_IN_OUT_DIV
                        , cSaleItem.ITEM_TAX_DIV        // ITEM_TAX_DIV
                        , cSaleItem.TAX_AMT_INCLUDE_YN  // TAX_AMT_INCLUDE_YN
                        , cSaleItem.TAXRATE_CD          // TAXRATE_CD
                        , cSaleItem.APPLY_TAX_AMT       // APPLY_TAX_AMT
                        , cSaleItem.SVC_FEE_AMT         // SVC_FEE_AMT
                        , cSaleItem.SVC_FEE_VAT         // SVC_FEE_VAT
                        , cSaleItem.NONSALES_RSN_CD     // NONSALES_RSN_CD
                        , cSaleItem.SVC_TAXREATE_CD     //SVC_TAXREATE_CD
                        , cSaleItem.SALE_AMT            // BILL_AMT
                        , cSaleItem.DC_DIV
                        , cSaleItem.DC_TYPE
                        , 0
                        , 0
                        , 0
                        , 0
                        , 0
                        , cSaleItem.COOP_CARD_DC_DIV
                        , 0
                        , cSaleItem.POINT_DC_DIV
                        , 0
                        , cSaleItem.CPN_DC_DIV
                        , 0
                        , cSaleItem.EMP_DC_DIV
                        , 0
                        , 0
                        , cSaleItem.ETC_DC_DIV
                        , 0
                        , cSaleItem.EXCEP_DC_DIV
                        , cSaleItem.EXCEP_DC_AMT
                        , cSaleItem.PACK_DIV
                        , cSaleItem.SET_MENU_CD == "" ? cSaleItem.SUB_MENU_MAIN_CD : cSaleItem.SET_MENU_CD
                        , cSaleItem.SUBPRC_MENU_KEY_DIV
                        , cSaleItem.CPI_PRESENT_DIV
                        , cSaleItem.BILLSPR_NO
                        , cSaleItem.SALE_GIFT_NO
                        , cSaleItem.CPN_NO
                        , ""
                        , cSaleItem.DISPO_ITEM_DIV
                        , sCanDiv
                        , sRegDateTime                  // REG_DATE
                        , sRegDateTime                  // UPD_DATE
                        , cSaleItem.NOTAX_DIV
                        );

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                    
                    nTotQty += cSaleItem.SALE_QTY;
                    nTotAmt = CmUtil.DoubleAdd(nTotAmt, cSaleItem.SALE_AMT);
                }

                sQuery = "";
                sQuery += " INSERT INTO POSLOG..ETC_SALE_HEADER ( ";
                sQuery += " CMP_CD ,STOR_CD ,SALE_DT ,POS_NO, REG_NO ,TRADE_NO ,TRADE_DIV ,TRAIN_MODE_YN ,TRADE_KINDPER ,SYS_DT ";
                sQuery += " ,ORD_TIME ,PAY_TIME ,PIC_NO ,ORD_PIC_NO ,STOR_OWN_PART_TIME_DIV ,ORG_BILL_POSNO ,ORG_BILLDT ,ORG_BILL_NO ,RTN_RSN_CD ,RTN_RSN_MEMO ";
                sQuery += " ,NONSALES_RSN_CD ,RESERV_NO ,RESERV_DT ,CUST_NO ,ORD_DIV ,FLOOR_CD ,TBL_NO ,GUESTFLOOR ,FRGNR_DIV ,CUSTCNT ";
                sQuery += " ,PAY_GNDR_DIV ,PAY_AGE ,MAN_CMPNPSN_CNT ,WOMAN_CMPNPSN_CNT ,QTY ,TOTSALE_AMT ,TOTDC_AMT ,NET_SALE_AMT ,ITEM_DC_AMT ,CPI_DC_AMT ";
                sQuery += " ,COOP_CARD_DC_AMT,POINT_DC_AMT,CPN_DC_AMT,EMP_DC_AMT,SET_DC_AMT ,ETC_AMT ,TOT_VAT ,SVC_FEE_AMT ,SVC_FEE_VAT ,ETC_VAT  ";
                sQuery += " ,AF_ACCUM_POINT_AMT ,AF_ACCUM_POINT_INFO, PPCARD_CUSTNM, AMT_DUTCHPAY_YN ,BILLSPR_CNT ,ORDER_NO,SLACK_FIELD, TRADE_STAT, SEND_YN ,REG_DATE ,UPD_DATE";
                sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";
                sQuery += " '{10}','{11}', '{12}', '{13}', '{14}', '{15}', '{16}', '{17}', '{18}' , N'{19}', ";
                sQuery += " '{20}','{21}', '{22}', '{23}', '{24}', '{25}', '{26}', '{27}', '{28}' , '{29}', ";
                sQuery += " '{30}','{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}', '{38}' , '{39}', ";
                sQuery += " '{40}','{41}', '{42}', '{43}', '{44}', '{45}', '{46}', '{47}', '{48}' , '{49}', ";
                sQuery += " '{50}','{51}', N'{52}', '{53}', '{54}', '{55}', '{56}', '{57}', '{58}' , '{59}', ";
                sQuery += " '{60}' ) ";

                sQuery = string.Format(sQuery
                    , m_cTrnStatus.Head.CmpCd           // CMP_CD
                    , m_cTrnStatus.Head.StoreCd         // STOR_CD
                    , m_cTrnStatus.Head.SaleDate        // SALE_DT
                    , m_cTrnStatus.Head.PosNo           // POS_NO
                    , m_cPosStatus.Base.RegNo           // REG_NO
                    , m_cTrnStatus.Head.TradeNo         // TRADE_NO
                    , m_cTrnStatus.Head.TradeDiv        // TRADE_DIV
                    , m_cTrnStatus.Head.TrainModeYn     // TRAIN_MODE_YN
                    , ItemConst.TRAN_KIND.LOG.ITEM_CANCEL        // TRADE_KINDPER
                    , m_cTrnStatus.Head.SysYmd          // SYS_DT
                    , m_cTrnStatus.Head.OrderHms        // ORD_TIME
                    , m_cTrnStatus.Head.PayHms          // PAY_TIME
                    , m_cTrnStatus.Head.CashierId       // PIC_NO
                    , m_cTrnStatus.Head.OrderPicNo      // ORD_PIC_NO
                    , m_cTrnStatus.Head.OwnPartDiv      // STOR_OWN_PART_TIME_DIV
                    , m_cTrnStatus.Head.OrgPosNo        // ORG_BILL_POSNO
                    , m_cTrnStatus.Head.OrgSaleDate     // ORG_BILLDT
                    , m_cTrnStatus.Head.OrgTradeNo      // ORG_BILL_NO
                    , m_cTrnStatus.Head.RtnReasonCd     // RTN_RSN_CD
                    , m_cTrnStatus.Head.RtnReasonMemo   // RTN_RSN_MEMO
                    , m_cTrnStatus.Head.NonSaleRsnCd    // NONSALES_RSN_CD
                    , m_cTrnStatus.Head.ReserveNo       // RESERV_NO
                    , m_cTrnStatus.Head.ReserveYmd      // RESERV_DT
                    , m_cTrnStatus.Head.MemberCustNo    // CUST_NO
                    , m_cTrnStatus.Head.OrderFlag       // ORD_DIV
                    , m_cTrnStatus.Head.FloorCd         // FLOOR_CD
                    , m_cTrnStatus.Head.TableNo         // TBL_NO
                    , m_cTrnStatus.Head.CustFloor       // GUESTFLOOR
                    , m_cTrnStatus.Head.ForeignFlag     // FRGNR_DIV
                    , m_cTrnStatus.Head.CustCnt         // CUSTCNT
                    , m_cTrnStatus.Head.PayGndrDiv      // PAY_GNDR_DIV
                    , m_cTrnStatus.Head.PayAge          // PAY_AGE
                    , m_cTrnStatus.Head.ManCmpnpsnCnt   // MAN_CMPNPSN_CNT
                    , m_cTrnStatus.Head.WomanCmpnpsnCnt // WOMAN_CMPNPSN_CNT
                    , nTotQty   // QTY
                    , nTotAmt   // TOTSALE_AMT
                    , 0         // TOTDC_AMT
                    , nTotAmt   // NET_SALE_AMT
                    , 0         // ITEM_DC_AMT
                    , 0         // CPI_DC_AMT
                    , 0         // COOP_CARD_DC_AMT
                    , 0         // POINT_DC_AMT
                    , 0         // CPN_DC_AMT
                    , 0         // EMP_DC_AMT
                    , 0         // SET_DC_AMT
                    , 0         // ETC_AMT
                    , 0         // TOT_VAT
                    , 0         // SVC_FEE_AMT
                    , 0         // SVC_FEE_VAT
                    , 0         // ETC_VAT
                    , m_cTrnStatus.Head.AftSavePoint    // AF_ACCUM_POINT_AMT
                    , m_cTrnStatus.Head.AftSaveAddInfo  // AF_ACCUM_POINT_INFO
                    , m_cTrnStatus.Head.PpCardCustNm    // PPCARD_CUSTNM
                    , m_cTrnStatus.Head.AmtDutchPayYn   // AMT_DUTCHPAY_YN
                    , m_cTrnStatus.Head.BillSplitCnt    // BILLSPR_CNT
                    , m_cTrnStatus.Head.OrderNo         // ORDER_NO
                    , ""                                // SLACK_FIELD
                    , "0"                               // TRADE_STAT
                    , "0"                               // SEND_YN
                    , sRegDateTime                      // REG_DATE
                    , sRegDateTime                      // UPD_DATE
                    );

                if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sQuery }) != UserCom.OK)
                {
                    m_cSqlDbService.Rollback();
                    return sRet;
                }

                m_cSqlDbService.Commit();

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

            return sRet;
        }
        #endregion 

        #region 주방 데이터 저장 처리
        /// <summary>
        /// 주방 데이터 저장 처리
        /// </summary>
        /// <returns></returns>
        public string SaveKtchOrdMsg()
        {
            var sQuery = string.Empty;
            var sSQL = string.Empty; 
            var sRet = UserCom.RST_ERR;
            var iSeq = 0;

            try
            {
                // 해피오더일 경우 상품 준비 단계에서 이미 주방 프린터로 출력 되므로 거래 완료 시에는 주방데이터 처리를 하지 않는다.
                //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.FORIGN.O2O) return UserCom.RST_OK;

                // 매출 거래가 아니면 주방 출력 안함! 20170406 => 로스거래 주방출력 함(2017.05.25)
                //if (m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.NORMAL.SALE && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.ETC.LOSS)
                //170914 dkshin 해피오더 추가 - KDS 전송 되기 위해
                //if (m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.NORMAL.SALE && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.ETC.LOSS)
                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.FORIGN.O2O)
                {
                    //거래 중지 거래 중 원거래 종류가 매출이 아니면...
                    if (!(m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.LOG.STOP && m_cTrnStatus.Head.OrgTradeKind == ItemConst.TRAN_KIND.NORMAL.SALE))
                    {
                        return UserCom.RST_OK;
                    }
                }

                // 상품정보
                ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                if (aSaleItem.Count == 0) return UserCom.RST_OK;

                // 후불판매모드 일때 주방출력
                if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT && 
                    m_cPosStatus.Sale.EtcOperateMode != PosConst.ETC_OPERATION_MODE.NO_ORDER_SALE)
                {
                    var isStop = true; 
                    foreach (Column.TR_PLU.DATA cSaleItem in aSaleItem)
                    {                        
                        if (cSaleItem.ORDER_OK_FLAG != PosConst.PLU_ORDER_OK_FLAG.ORDER_OK)
                        {
                            isStop = false; 
                            break; 
                        }
                    }
                    if (isStop) return UserCom.RST_OK;
                } 
                // 후불매장 전일자 반품 주방출력 안함.  
                if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT && 
                    m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND)
                {
                    if (m_cPosStatus.Base.SaleDate != m_cTrnStatus.Head.SaleDate) return UserCom.RST_OK;
                }

                //20161014 선불일때 PK에러로 추가함!
                if (m_cTrnStatus.Head.OrderNo == "") return UserCom.RST_OK;

                // 주방출력(KPS,KVS,KDS) 사용 옵션
                if (PosMstManager.GetPosOption(POS_OPTION.OPT506) != "1" && PosMstManager.GetPosOption(POS_OPTION.OPT027) != "1" &&
                    PosMstManager.GetPosOption(POS_OPTION.OPT507) != "1")
                {
                    return UserCom.RST_OK;
                }

                // Add, 2017.04.11, 거래번호 -> 연습모드 일때는 등록번호 치환
                var floorCd = m_cTrnStatus.Head.PosNo;
                var tableNo = m_cPosStatus.Base.TrainingFlag != ItemConst.TRAINING_FLAG.TRAINING_YES
                            ? m_cTrnStatus.Head.TradeNo
                            : m_cTrnStatus.Head.RegNo;
                var orderNo = m_cTrnStatus.Head.OrderNo;
                var orderSeq = string.Empty;
                var etcOrderFlag = string.Empty;
                
                if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT)
                {
                    var cTableSvr = (ITableUs)sManager.InitServiceInstance(ServiceLists.BSV_TABLE.DLL, ServiceLists.BSV_TABLE.TABLE_SERVICE);
                    if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND && 
                        string.IsNullOrWhiteSpace(m_cTrnStatus.Head.FloorCd + m_cTrnStatus.Head.TableNo))
                    {
                        // 후불매장 반품인데 층/테이블 번호가 없음면, 후불판매 반품 
                        etcOrderFlag = "1";
                    }
                    else if (m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.NO_ORDER_SALE)
                    {
                        orderSeq = string.Empty;
                        etcOrderFlag = "1";
                    }
                    else
                    {
                        // 후불-테이블 일때는 주문차수 발번 처리
                        floorCd = m_cTrnStatus.Head.FloorCd;
                        tableNo = m_cTrnStatus.Head.TableNo;
                    }
                }

                //20170918 dkshin 해피오더 중복 거래 완료처리 수정
                var orderTime = DateTime.Now.ToString("HHmmss");
                //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.FORIGN.O2O)
                if (m_cTrnStatus.Head.HPOrderPickupTime != "")
                {
                    m_cTrnStatus.Head.PackTradeDiv = "0";//해피오더에서 0으로 고정
                    etcOrderFlag = "2";//해피오더
                    orderTime = m_cTrnStatus.Head.HPOrderPickupTime;
                    orderTime = orderTime.Substring(5, 5) + " " + orderTime.Substring(14, 5);//ex) 03-29 17:30
                }

                if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.FORIGN.O2O)
                    etcOrderFlag = "2";//해피오더
                //

                // 일련번호
                sQuery = "SELECT ISNULL(MAX(SEQ), 0) + 1 AS NEXT_SEQ FROM POSMST..MST_KTCH_ORD_MSG "
                       + " WHERE TRAIN_MODE_YN = '{0}' AND ORD_DIV = '{1}' AND FLOOR_CD = '{2}' AND TBL_NO = '{3}' ";
                sSQL = string.Format(sQuery, m_cPosStatus.Base.TrainingFlag                                             // Add, 2017.03.06, 연습모드 
                                           , PosConst.ORDER_TYPE.NORMAL
                                           , floorCd
                                           , tableNo);
                DataTable dtReturn = null;
                if(m_cSqlDbService.DBSelect(sSQL, out dtReturn) == UserCom.OK)
                {
                    iSeq = CmUtil.GetDataRowInt(dtReturn.Rows[0], "NEXT_SEQ");
                }

                #region (주석) 복합매장 적용 이전
                //sQuery  = " INSERT INTO POSMST..MST_KTCH_ORD_MSG ";
                //sQuery += "        ( ORD_DIV, FLOOR_CD, TBL_NO, SEQ, CMP_CD, BRAND_CD, STOR_CD, POS_NO, TRADE_NO, SALE_DT, POS_TYPE, ITEM_CD, ITEM_DIV, SHTCUT_ITEMNM, SALE_QTY, PACK_DIV, SET_MENU_CD ";
                //sQuery += "        , ORD_TIME, CANCEL_DIV, SUB_MEMO_DIV, MSG1, MSG2, MSG3, MSG_REG_TIME, ORG_BILL_POSNO, ORG_BILLDT, ORG_BILL_NO ";
                //sQuery += "        , SEND_YN, SEND_CONFIRM_DIV, RESEND_YN, FILLER1, FILLER2, FILLER3, FILLER4, FILLER5, UPD_DT, REG_DT ) ";
                //sQuery += " VALUES ";
                //sQuery += "        ( '{0}', '{1}', '{2}', {3}, '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', '{10}', '{11}', '{12}', N'{13}', {14}, '{15}', '{16}' ";
                //sQuery += "        , '{17}', '{18}', '{19}', N'{20}', N'{21}', N'{22}', '{23}', '{24}', '{25}', '{26}' ";
                //sQuery += "        , '{27}', '{28}', '{29}', '{30}', '{31}', '{32}', '{33}', '{34}', '{35}', '{36}' ) ";
                
                #endregion

                #region (주석) 연습모드 적용 이전, 2017.03.06
                //sQuery = " INSERT INTO POSMST..MST_KTCH_ORD_MSG \n"
                //      + "        ( ORD_DIV, FLOOR_CD, TBL_NO, SEQ, CMP_CD, BRAND_CD, STOR_CD, SUB_STOR_CD, POS_NO, TRADE_NO, SALE_DT, POS_TYPE, ITEM_CD, ITEM_DIV, SHTCUT_ITEMNM, SALE_QTY, PACK_DIV, SET_MENU_CD \n"
                //      + "        , ORD_TIME, CANCEL_DIV, SUB_MEMO_DIV, MSG1, MSG2, MSG3, MSG_REG_TIME, ORG_BILL_POSNO, ORG_BILLDT, ORG_BILL_NO \n"
                //      + "        , SEND_YN, SEND_CONFIRM_DIV, RESEND_YN, FILLER1, FILLER2, FILLER3, FILLER4, FILLER5, UPD_DT, REG_DT ) \n"
                //      + " VALUES \n"
                //      + "        ( '{0}', '{1}', '{2}', {3}, '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', '{10}', '{11}', '{12}', '{13}', N'{14}', {15}, '{16}' \n"
                //      + "        , '{17}', '{18}', '{19}', '{20}', N'{21}', N'{22}', N'{23}', '{24}', '{25}', '{26}' \n"
                //      + "        , '{27}', '{28}', '{29}', '{30}', '{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}' ) ";
                #endregion

                #region (주석) KPS + KDS 동시사용, 2017.04.26
                //sQuery = "INSERT INTO POSMST..MST_KTCH_ORD_MSG ( \n"
                //       + "  ORD_DIV, FLOOR_CD, TBL_NO, SEQ, CMP_CD, BRAND_CD, STOR_CD, SUB_STOR_CD, POS_NO, TRADE_NO, SALE_DT, POS_TYPE, ITEM_CD, ITEM_DIV, SHTCUT_ITEMNM, SALE_QTY, PACK_DIV, SET_MENU_CD \n"
                //       + ", ORD_TIME, CANCEL_DIV, SUB_MEMO_DIV, MSG1, MSG2, MSG3, MSG_REG_TIME, ORG_BILL_POSNO, ORG_BILLDT, ORG_BILL_NO \n"
                //       + ", SEND_YN, SEND_CONFIRM_DIV, RESEND_YN, FILLER1, FILLER2, FILLER3, FILLER4, FILLER5, UPD_DT, REG_DT, TRAIN_MODE_YN \n"
                //       + ", KTCH_MSG   \n"                                                                              // Add, 2017.03.23, 주방메시지
                //       + ", ORD_PIC_NM \n"                                                                              // Add, 2017.03.28, 주문담당자
                //       + ", ORG_QTY    \n"                                                                              // Add, 2017.03.31, 이전주문수량
                //       + ", ORD_POS_NO \n"                                                                              // Add, 2017.04.10, 주문포스번호 (서브포스에서도 주방출력 처리)
                //       + ") VALUES (   \n"
                //       + "  '{0}', '{1}', '{2}', {3}, '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', '{10}', '{11}', '{12}', '{13}', N'{14}', {15}, '{16}' \n"
                //       + ", '{17}', '{18}', '{19}', '{20}', N'{21}', N'{22}', N'{23}', '{24}', '{25}', '{26}' \n"
                //       + ", '{27}', '{28}', '{29}', '{30}', '{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}', '{38}' \n"
                //       + ", N'{39}' \n"                                                                                 // Add, 2017.03.23, 주방메시지
                //       + ", N'{40}' \n"                                                                                 // Add, 2017.03.28, 주문담당자
                //       + ", 0 \n"                                                                                       // Add, 2017.03.31, 이전주문수량
                //       + ",  '{41}' \n"                                                                                 // Add, 2017.04.10, 주문포스번호 (서브포스에서도 주방출력 처리)
                //       + ")"; 
                #endregion

                sQuery = "INSERT INTO POSMST..MST_KTCH_ORD_MSG ( \n"
                       + "  ORD_DIV, FLOOR_CD, TBL_NO, SEQ, CMP_CD, BRAND_CD, STOR_CD, SUB_STOR_CD, POS_NO, TRADE_NO, SALE_DT, POS_TYPE, ITEM_CD, ITEM_DIV, SHTCUT_ITEMNM, SALE_QTY, PACK_DIV, SET_MENU_CD \n"
                       + ", ORD_TIME, CANCEL_DIV, SUB_MEMO_DIV, MSG1, MSG2, MSG3, MSG_REG_TIME, ORG_BILL_POSNO, ORG_BILLDT, ORG_BILL_NO \n"
                       + ", SEND_YN, SEND_CONFIRM_DIV, RESEND_YN, FILLER1, FILLER2, FILLER3, FILLER4, FILLER5, UPD_DT, REG_DT, TRAIN_MODE_YN \n"
                       + ", KTCH_MSG   \n"                                                                              // Add, 2017.03.23, 주방메시지
                       + ", ORD_PIC_NM \n"                                                                              // Add, 2017.03.28, 주문담당자
                       + ", ORG_QTY    \n"                                                                              // Add, 2017.03.31, 이전주문수량
                       + ", ORD_POS_NO \n"                                                                              // Add, 2017.04.10, 주문포스번호 (서브포스에서도 주방출력 처리)
                       + ", KDS_SEND_YN \n"                                                                             // Add, 2017.04.26, KDS 전송여부 
                       + ") VALUES (   \n"
                       + "  '{0}', '{1}', '{2}', {3}, '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', '{10}', '{11}', '{12}', '{13}', N'{14}', {15}, '{16}' \n"
                       + ", '{17}', '{18}', '{19}', '{20}', N'{21}', N'{22}', N'{23}', '{24}', '{25}', '{26}' \n"
                       + ", '{27}', '{28}', '{29}', '{30}', '{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}', '{38}' \n"
                       + ", N'{39}' \n"                                                                                 // Add, 2017.03.23, 주방메시지
                       + ", N'{40}' \n"                                                                                 // Add, 2017.03.28, 주문담당자
                       + ", 0       \n"                                                                                 // Add, 2017.03.31, 이전주문수량
                       + ",  '{41}' \n"                                                                                 // Add, 2017.04.10, 주문포스번호 (서브포스에서도 주방출력 처리)
                       + ",  '{42}' \n"                                                                                 // Add, 2017.04.26, KDS 전송여부 
                       + ")";

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

                    if (cSaleItem.CANCEL_DIV == "1" || cSaleItem.CANCEL_DIV_MAIN == "1") cSaleItem.CANCEL_DIV = "1";
                    if (cSaleItem.CANCEL_DIV == "1") continue;

                    if (cSaleItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) continue;

                    // Add, 2017.04.26, 후불 수량변경없이 가격변경 후 바로 결제시 
                    if (m_cPosStatus.Base.PosType == PosConst.POS_TYPE.DEFERRED_PAYMENT &&
                        cSaleItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD)
                    {
                        if (cSaleItem.ORG_QTY > 0 && cSaleItem.SALE_QTY - cSaleItem.ORG_QTY == 0)
                        {
                            continue;
                        }
                    }

                    // Add, 2017.04.12, 주문차수 
                    if (cSaleItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_ING) cSaleItem.ORDER_SEQ = orderSeq;

                    //취소 소계 전후 체크
                    string sCanDiv = cSaleItem.CANCEL_DIV;
                    if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL)
                    {
                        sCanDiv = m_cTrnStatus.Sale.SubTotalCancelDiv == true ? PosConst.CANCEL_DIV.CANCEL_SUBTOT : PosConst.CANCEL_DIV.CANCEL;
                    }

                    var itemMemoRegTime = string.Empty;
                    var temp = cSaleItem.ITEM_MEMO_1 + cSaleItem.ITEM_MEMO_2 + cSaleItem.ITEM_MEMO_3;
                    if (string.IsNullOrWhiteSpace(temp) == false) itemMemoRegTime = DateTime.Now.ToString("HHmmss");

                    // Add, 2017.01.18, 주방프린트 수동출력 사용자 선택값 
                    var menualOrderValue = string.Empty;
                    var menualMsgRegTime = string.Empty;
                    var menualOrderMemo = string.Empty;
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT425) == "1")
                    {
                        // 장치코드 또는 NOPRINT
                        menualOrderValue = string.IsNullOrWhiteSpace(m_cTrnStatus.Sale.MenualOrderValue)
                                         ? "NOPRINT" 
                                         : m_cTrnStatus.Sale.MenualOrderValue;
                    }
                    else if (PosMstManager.GetPosOption(POS_OPTION.OPT425) == "2")
                    {
                        // 선택상품코드 또는 NOPRINT
                        int idx = m_cTrnStatus.Sale.MenualOrderValue.IndexOf(iRow.ToString());
                        menualOrderValue = idx < 0 ? "NOPRINT" : "PRINT";

                        // Del, 2017.04.25, 주방메모 출력 (대기번호 입력)
                        // 주방메모 
                        //if (menualOrderValue != "NOPRINT" && string.IsNullOrWhiteSpace(m_cTrnStatus.Sale.MenualOrderMemo) == false)
                        //{
                        //    menualOrderMemo = m_cTrnStatus.Sale.MenualOrderMemo.Trim();
                        //    menualMsgRegTime = DateTime.Now.ToString("HHmmss");
                        //}
                    }

                    // Add, 2017.04.25, 주방메모 출력 (대기번호 입력)
                    if (menualOrderValue != "NOPRINT" && string.IsNullOrWhiteSpace(m_cTrnStatus.Sale.MenualOrderMemo) == false)
                    {
                        menualOrderMemo = m_cTrnStatus.Sale.MenualOrderMemo.Trim();
                        menualMsgRegTime = DateTime.Now.ToString("HHmmss");
                    }

                 

                    // INSERT INTO POSMST..MST_KTCH_ORD_MSG
                    sSQL = string.Format(sQuery
                        , PosConst.ORDER_TYPE.NORMAL                                                                    // ORD_DIV
                        //, m_cTrnStatus.Head.PosNo                                                                     // FLOOR_CD(선불POS일 경우 POS번호)
                        , floorCd                                                                                       //

                        , m_cTrnStatus.Head.TradeNo                                                                   // TBL_NO(선불POS일 경우 거래번호)
                        //, tableNo                                                                                       // Mod, 2017.03.06, 주방출력 연습모드 적용 

                        , iSeq++                                                                                        // SEQ
                        , m_cTrnStatus.Head.CmpCd                                                                       // CMP_CD
                        , m_cPosStatus.Base.BrandCd                                                                     // BRAND_CD
                        , m_cTrnStatus.Head.StoreCd                                                                     // STOR_CD
                        , cSaleItem.SUB_SHOP_CD                                                                         // SUB_STOR_CD                  // 2017.02.06, Add
                        //#20170919 ss해피오더 반품시 POS_NO 항목이 원거래포스번호가 들어가야 KDS에서 반품 처리됨. start
                        //기존
                        //, m_cTrnStatus.Head.PosNo  // POS_NO
                        //변경
                        , m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND ? m_cTrnStatus.Head.OrgPosNo : m_cTrnStatus.Head.PosNo  // POS_NO
                        //#20170919 ss해피오더 반품시 POS_NO 항목이 원거래포스번호가 들어가야 KDS에서 반품 처리됨. end
                        
                        //, m_cTrnStatus.Head.OrderNo                                                                   // TRADE_NO
                        , orderNo                                                                                       //                              // Mod, 2017.04.11

                        , m_cTrnStatus.Head.SaleDate                                                                    // SALE_DT
                        , m_cPosStatus.Base.PosType                                                                     // POS유형(0:선불, 1:후불)
                        //, cSaleItem.ITEM_PLU_CD                                                                       // ITEM_CD
                        

                        , (cSaleItem.SUBPRC_MENU_KEY_DIV == "1" || cSaleItem.SUBPRC_MENU_KEY_DIV == "2") ? cSaleItem.SUB_MENU_MAIN_CD : cSaleItem.ITEM_PLU_CD
                        , cSaleItem.ITEM_DIV                                                                            // ITEM_DIV
                        //텀블러할인 강제 적용 2019.05.08
                        , cSaleItem.EXCEP_DC_DIV.Equals("1703") ? cSaleItem.ITEM_NAME +"(텀블러)" : cSaleItem.ITEM_NAME                                                                    // SHTCUT_ITEMNM
                        , cSaleItem.SALE_QTY                                                                            // SALE_QTY
                        //, cSaleItem.PACK_DIV                                                                          // PACK_DIV
                        , m_cTrnStatus.Head.PackTradeDiv                                                                // PACK_TRADE_DIV(1:일반, 2:포장, 3:배달)
                                                                                                                        // SET_MENU_CD
                        , cSaleItem.SET_MENU_CD == "" ? cSaleItem.SUB_MENU_MAIN_CD : cSaleItem.SET_MENU_CD              
                        //, cSaleItem.ORD_TIME                                                                          // ORD_TIME
                        //20170918 dkshin 해피오더 중복 거래 완료처리 수정
                        //, DateTime.Now.ToString("HHmmss")                                              
                        , orderTime

                        , m_cTrnStatus.Head.TradeDiv                                                                    // CANCEL_DIV
                        , cSaleItem.SUBPRC_MENU_KEY_DIV                                                                 // SUB_MEMO_DIV     
                                                                  
                        , ConvertDBStr(cSaleItem.ITEM_MEMO_1)                                                           // MSG1
                        , ConvertDBStr(cSaleItem.ITEM_MEMO_2)                                                           // MSG2
                        , ConvertDBStr(cSaleItem.ITEM_MEMO_3)                                                           // MSG3
                        , itemMemoRegTime                                                                               // MSG_REG_TIME

                        , m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND ? m_cTrnStatus.Head.OrgPosNo : ""     // ORG_BILL_POSNO
                        , m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND ? m_cTrnStatus.Head.OrgSaleDate : ""  // ORG_BILLDT
                        , m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND ? m_cTrnStatus.Head.OrgTradeNo : ""   // ORG_BILL_NO
                        , "0"                                                                                           // SEND_YN
                        , "0"                                                                                           // SEND_CONFIRM_DIV
                        , "0"                                                                                           // RESEND_YN
                        , menualOrderValue                                                                              // FILLER1
                        , etcOrderFlag                                                                                  // FILLER2  // 기타주문구분 (1:후불일반판매, 2:해피오더)
                        , ""                                                                                            // FILLER3
                        , m_cTrnStatus.Head.VipTy                                                                       // FILLER4  // VIP구분     (0:일반, 1:VIP, 2:직원)
                        , ""                                                                                            // FILLER5  // 주문차수 
                        , DateTime.Now.ToString("yyyyMMddHHmmss")                                                       // UPD_DT
                        , DateTime.Now.ToString("yyyyMMddHHmmss")                                                       // REG_DT
                        , m_cPosStatus.Base.TrainingFlag                                                                // Add, 2017.03.06, 연습모드 
                        , ConvertDBStr(menualOrderMemo)                                                                 // Add, 2017.03.23, 주방메시지
                        , ConvertDBStr(m_cTrnStatus.Head.OrderPicNm)                                                    // Add, 2017.03.28, 주문담당자 
                        , m_cPosStatus.Base.PosNo                                                                       // Add, 2017.04.10, 주문포스번호 (서브포스에서도 주방출력 처리)
                        , "0"                                                                                           // Add, 2017.04.26, KDS 전송여부 
                        );

                    if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                    {
                        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 (함수명))
                                             "Insert ERROR into MST_KTCH_ORD_MSG - " + sSQL);
                        m_cSqlDbService.Rollback();
                        return sRet;
                    }
                }

                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }

        private string ConvertDBStr(string str)
        {
            return str.Replace("'", "''");
        }
        #endregion 주방 데이터 저장 처리

        #region 정산지 및 점검지 생성
        /// <summary>
        /// 정산지 및 점검지 생성
        /// </summary>
        /// <param name="sSaleDate"></param>
        /// <param name="sTableName"></param>
        /// <returns></returns>
        public string SaveAccADMT(string sKind, string sSaleDate, ref DataTable dtReturn, string sSimplePrint)
        {
            string[] sSql = new string [50];
            int iSqlIndex = 0;
            string sSql2 = "";

            string sRet = UserCom.RST_ERR;
            try
            {
                //#13559 PB 노은휴먼시아_마감에 간편출력체크하지않은 마감건도 동일하게 출력되는 증상에 대해 원인 및 확인 요청 start, phj
                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "[SaveAccADMT] Kind : " + sKind + " , SaleDate : " + sSaleDate + " , Simple print :" + sSimplePrint);
                //#13559 PB 노은휴먼시아_마감에 간편출력체크하지않은 마감건도 동일하게 출력되는 증상에 대해 원인 및 확인 요청 end, phj

                //string sKind = m_cTrnStatus.Head.TradeKind;

                //m_cDataService.SetTranBaseToHead();            //트란 헤더 정보 재설정
                if (sKind != ItemConst.TRAN_KIND.STATEMENT.CLOSING_MONEY && sKind != ItemConst.TRAN_KIND.STATEMENT.MIDDLE_ADJUSTMENT && sKind != ItemConst.TRAN_KIND.STATEMENT.ADJUSTMENT) return UserCom.RST_OK;
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND) return UserCom.RST_OK;

                // 중간정산 옵션값변경(2017.06.14) => 중간점검 사용 여부 (0:사용안함, 1: 사용함, 2:사용함[차수별])
                string sMidCloseSeq = m_cPosStatus.Base.MidCloseSeq;
                if (sKind != ItemConst.TRAN_KIND.STATEMENT.ADJUSTMENT && sMidCloseSeq != "99")
                {
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT321) != "2") sMidCloseSeq = "99";
                }

                m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource, m_cPosStatus.Base.LocalDbCatalog, m_cPosStatus.Base.LocalDbUserID, m_cPosStatus.Base.LocalDbPassword);

                // 정산 프로시져
                sSql2 = "";
                sSql2 += "EXEC POSMST..SP_ADJUSTMENT ";
                sSql2 += "  '" + m_cTrnStatus.Head.TradeDiv + "'";            // 거래구분 (0:정상, 1:반품)
                sSql2 += ", '" + m_cPosStatus.Base.CmpCd + "'";                // 회사코드
                sSql2 += ", '" + m_cPosStatus.Base.StoreNo + "'";             // 점포코드
                sSql2 += ", '" + sSaleDate + "'";            // 영업일
                sSql2 += ", '" + m_cPosStatus.Base.PosNo + "'";               // POS 번호
                sSql2 += ", '" + m_cPosStatus.Base.TradeNo + "'";             // 거래번호
                sSql2 += ", '" + sKind + "'";           // 거래종별
                sSql2 += ", '" + m_cPosStatus.Base.Country + "'";             // 문화코드
                sSql2 += ", '" + sMidCloseSeq + "'";         // 중간마감 차수
                //sSql2 += ", '" + m_cPosStatus.Base.MidCloseSeq + "'";       // 중간마감 차수
                sSql2 += ", '" + sSimplePrint + "'";                          // 간편출력 여부

                // 정산지 생성
                int iRet = m_cSqlDbService.DBSelect(sSql2, out dtReturn);

                //#13559 PB 노은휴먼시아_마감에 간편출력체크하지않은 마감건도 동일하게 출력되는 증상에 대해 원인 및 확인 요청 start, phj
                UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "[SaveAccADMT] Sql: " + sSql2);
                //#13559 PB 노은휴먼시아_마감에 간편출력체크하지않은 마감건도 동일하게 출력되는 증상에 대해 원인 및 확인 요청 end, phj


                if (iRet != UserCom.OK && iRet != UserCom.NG4)
                {
                    //return sRet;
                }
                else
                {
                    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);
                sRet = ex.Message;
                m_cSqlDbService.Rollback();
            } 
            return sRet;
        }
        #endregion 

        #region 현금 알람 금액 저장
        /// <summary>
        /// 현금 알람 저장
        /// </summary>
        /// <param name="sPayWayCd"></param>
        /// <param name="sPayCd"></param>
        /// <param name="dPayAmt"></param>
        /// <param name="dReMain"></param>
        private void AddCashAlarm(string sPayWayCd, string sPayCd, double dPayAmt, double dReMain)
        {
            try
            {
                if (CmUtil.IsNull(PosMstManager.GetPosOption(POS_OPTION.OPT310), "0") != "0")
                {
                    //매출, 예약 거래 일때만
                    if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_REG || m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.UNDECIDED.RESERVATION_COMPLETE)
                    {
                        if (sPayWayCd == ItemConst.TR_ITEM_ID.CASH_ITEM || sPayWayCd == ItemConst.TR_ITEM_ID.CHECK_ITEM)
                        {
                            //현금 수표일때 추가
                            if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL)
                            {
                                m_cPosStatus.Mst.CashAlarmAmt = CmUtil.DoubleAdd(m_cPosStatus.Mst.CashAlarmAmt, dPayAmt);
                            }
                            else
                            {
                                m_cPosStatus.Mst.CashAlarmAmt = CmUtil.DoubleSubtraction(m_cPosStatus.Mst.CashAlarmAmt, dPayAmt);
                            }
                        }
                        else if (sPayWayCd == ItemConst.TR_ITEM_ID.GIFT_ITEM || sPayWayCd == ItemConst.TR_ITEM_ID.FOREIGNEX_ITEM || (sPayWayCd == ItemConst.TR_ITEM_ID.PAYETC_ITEM && sPayWayCd == ItemConst.TR_ITEM_ID.PAYETC.MEAL_TIKET))
                        {
                            //상품권, 식권 일때 거스름 , 식권일때도 거스름 저장
                            if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL)
                            {
                                m_cPosStatus.Mst.CashAlarmAmt = CmUtil.DoubleSubtraction(m_cPosStatus.Mst.CashAlarmAmt, dReMain);
                            }
                            else
                            {
                                m_cPosStatus.Mst.CashAlarmAmt = CmUtil.DoubleAdd(m_cPosStatus.Mst.CashAlarmAmt, dReMain);
                            }
                        }                       
                    }
                }
            }
            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 기타 헤더 저장
        /// <summary>
        /// 기타 헤더 저장
        /// </summary>
        /// <returns></returns>
        public string EtcHeaderSaveData(string sTradeDiv, string sTradeKindper, string[] aParam)
        {
            string sQuery = "";
            string sRet = UserCom.RST_ERR;

            try
            {

                m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource, m_cPosStatus.Base.LocalDbCatalog, m_cPosStatus.Base.LocalDbUserID, m_cPosStatus.Base.LocalDbPassword);
                m_cSqlDbService.Begin();

                string sRegDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
                string sOrgSaleDt = aParam[0];
                string sOrgPosNo = aParam[1];
                string sOrgTradeNo = aParam[2];


                sQuery = "";
                sQuery += " INSERT INTO POSLOG..ETC_SALE_HEADER ( ";
                sQuery += "  CMP_CD ,STOR_CD ,SALE_DT ,POS_NO ,REG_NO ,TRADE_NO ,TRADE_DIV ,TRAIN_MODE_YN ,TRADE_KINDPER ,SYS_DT ";
                sQuery += " ,ORD_TIME ,PAY_TIME ,PIC_NO ,ORD_PIC_NO ,STOR_OWN_PART_TIME_DIV ,ORG_BILL_POSNO ,ORG_BILLDT ,ORG_BILL_NO ,RTN_RSN_CD ,RTN_RSN_MEMO ";
                sQuery += " ,NONSALES_RSN_CD ,RESERV_NO ,RESERV_DT ,CUST_NO ,ORD_DIV ,FLOOR_CD ,TBL_NO ,GUESTFLOOR ,FRGNR_DIV ,CUSTCNT ";
                sQuery += " ,PAY_GNDR_DIV ,PAY_AGE ,MAN_CMPNPSN_CNT ,WOMAN_CMPNPSN_CNT ,QTY ,TOTSALE_AMT ,TOTDC_AMT ,NET_SALE_AMT ,ITEM_DC_AMT ,CPI_DC_AMT ";
                sQuery += " ,COOP_CARD_DC_AMT ,POINT_DC_AMT ,CPN_DC_AMT ,EMP_DC_AMT ,SET_DC_AMT ,ETC_AMT ,TOT_VAT ,SVC_FEE_AMT ,SVC_FEE_VAT ,ETC_VAT  ";
                sQuery += " ,AF_ACCUM_POINT_AMT ,AF_ACCUM_POINT_INFO, PPCARD_CUSTNM, AMT_DUTCHPAY_YN ,BILLSPR_CNT ,ORDER_NO ,SLACK_FIELD ,MID_CLOSE_SEQ ,PPCARD_CUSTID, TRADE_STAT " ;
                sQuery += " ,PACK_TRADE_DIV ,SEND_YN ,REG_DATE ,UPD_DATE ,VIP_TY ";
                sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";
                sQuery += " '{10}','{11}', '{12}', '{13}', '{14}', '{15}', '{16}', '{17}', '{18}' , N'{19}', ";
                sQuery += " '{20}','{21}', '{22}', '{23}', '{24}', '{25}', '{26}', '{27}', '{28}' , '{29}', ";
                sQuery += " '{30}','{31}', '{32}', '{33}', '{34}', '{35}', '{36}', '{37}', '{38}' , '{39}', ";
                sQuery += " '{40}','{41}', '{42}', '{43}', '{44}', '{45}', '{46}', '{47}', '{48}' , '{49}', ";
                sQuery += " '{50}','{51}', N'{52}','{53}', '{54}', '{55}', '{56}', '{57}', '{58}' , '{59}', ";
                sQuery += " '{60}','{61}', '{62}' ,'{63}', '{64}') ";

                sQuery = string.Format(sQuery
                    , m_cTrnStatus.Head.CmpCd           // CMP_CD
                    , m_cTrnStatus.Head.StoreCd         // STOR_CD
                    , m_cTrnStatus.Head.SaleDate        // SALE_DT
                    , m_cTrnStatus.Head.PosNo           // POS_NO
                    , m_cPosStatus.Base.RegNo           // REG_NO
                    , m_cTrnStatus.Head.TradeNo         // TRADE_NO
                    , sTradeDiv                         // TRADE_DIV
                    , m_cTrnStatus.Head.TrainModeYn     // TRAIN_MODE_YN
                    , sTradeKindper                     // TRADE_KINDPER
                    , m_cTrnStatus.Head.SysYmd          // SYS_DT
                    , m_cTrnStatus.Head.OrderHms        // ORD_TIME
                    , DateTime.Now.ToString("HHmmss")   // PAY_TIME
                    , m_cTrnStatus.Head.CashierId       // PIC_NO
                    , ""                                // ORD_PIC_NO
                    , m_cTrnStatus.Head.OwnPartDiv      // STOR_OWN_PART_TIME_DIV
                    , sOrgPosNo                         // ORG_BILL_POSNO
                    , sOrgSaleDt                        // ORG_BILLDT
                    , sOrgTradeNo                       // ORG_BILL_NO
                    , ""                                // RTN_RSN_CD
                    , ""                                // RTN_RSN_MEMO
                    , "0"                               // NONSALES_RSN_CD
                    , ""                                // RESERV_NO
                    , ""                                // RESERV_DT
                    , ""                                // CUST_NO
                    , "0"                               // ORD_DIV
                    , ""                                // FLOOR_CD
                    , ""                                // TBL_NO
                    , ""                                // GUESTFLOOR
                    , ""                                // FRGNR_DIV
                    , 0                                 // CUSTCNT
                    , ""                                // PAY_GNDR_DIV
                    , 0                                 // PAY_AGE
                    , 0                                 // MAN_CMPNPSN_CNT
                    , 0                                 // WOMAN_CMPNPSN_CNT
                    , 0                                 // QTY
                    , 0                                 // TOTSALE_AMT
                    , 0                                 // TOTDC_AMT
                    , 0                                 // NET_SALE_AMT
                    , 0                                 // ITEM_DC_AMT
                    , 0                                 // CPI_DC_AMT
                    , 0                                 // COOP_CARD_DC_AMT
                    , 0                                 // POINT_DC_AMT
                    , 0                                 // CPN_DC_AMT
                    , 0                                 // EMP_DC_AMT
                    , 0                                 // SET_DC_AMT
                    , 0                                 // ETC_AMT
                    , 0                                 // TOT_VAT
                    , 0                                 // SVC_FEE_AMT
                    , 0                                 // SVC_FEE_VAT
                    , 0                                 // ETC_VAT
                    , 0                                 // AF_ACCUM_POINT_AMT
                    , ""                                // AF_ACCUM_POINT_INFO
                    , ""                                // PPCARD_CUSTNM
                    , ""                                // AMT_DUTCHPAY_YN
                    , 0                                 // BILLSPR_CNT
                    , ""                                // ORDER_NO
                    , ""                                // SLACK_FIELD
                    , m_cTrnStatus.Head.MidCloseSeq     // MID_CLOSE_SEQ
                    , ""                                // PPCARD_CUSTID
                    , "0"                               // TRADE_STAT
                    , ""                                // PACK_TRADE_DIV
                    , "0"                               // SEND_YN
                    , sRegDateTime                      // REG_DATE
                    , sRegDateTime                      // UPD_DATE
                    , ""                                // VIP_TY
                    );

                if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sQuery }) != UserCom.OK)
                {
                    m_cSqlDbService.Rollback();
                    return sRet;
                }

                m_cSqlDbService.Commit();

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

            return sRet;
        }
        #endregion 기타 헤더 저장

        #region 보류 로그 저장
        /// <summary>
        /// 보류 로그 저장
        /// </summary>
        /// <returns></returns>
        public void SaveHoldLog(string sHoldStat, string sOrgRegNo, double dQty, double dSaleAmt)
        {
            string sQuery = "";
            string sRegNo = "";

            try
            {
                // 보류 로드 상태에서 거래 완료시 치환!
                if (m_cTrnStatus.Head.HoldStat == ItemConst.HOLD_STAT_CD.LOAD && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.NORMAL.SALE)
                    sHoldStat = ItemConst.HOLD_STAT_CD.FINISH;

                if (sHoldStat == ItemConst.HOLD_STAT_CD.HOLD || sHoldStat == ItemConst.HOLD_STAT_CD.REHOLD)
                {
                    sRegNo = m_cTrnStatus.Head.RegNo;
                }
                else if (sHoldStat == ItemConst.HOLD_STAT_CD.DELETE)
                {
                    sRegNo = sOrgRegNo;
                    m_cTrnStatus.Head.HoldOrgRegNo = sRegNo;
                }
                else
                {
                    sRegNo = m_cTrnStatus.Head.HoldOrgRegNo;
                }
                    
                if (sHoldStat != ItemConst.HOLD_STAT_CD.DELETE)
                {
                    dQty = m_cTrnStatus.Head.TotQty;
                    dSaleAmt = m_cTrnStatus.Head.NetSaleAmt;
                }
                                
                //           등록 순번     ,   원등록 순번
                //1.보류면   등록 MAX +1   ,   등록 MAX +1 
                //2.삭제면   등록 MAX +1   ,   원거래순번
                //3.거래취소 등록 MAX +1   ,   원거래순번
                //4.재보류   등록 MAX +1   ,   원거래순번
                //5.결제완료 등록 MAX +1   ,   원거래순번
                
                sQuery  = " DECLARE @V_SEQ INT ";
                sQuery += " DECLARE @V_REGSEQ VARCHAR(5) ";
                sQuery += " DECLARE @V_ORGREGSEQ VARCHAR(5) ";
                sQuery += " DECLARE @V_STAT VARCHAR(3) ";
                sQuery += " SET @V_STAT = '{5}' ";
                sQuery += " SELECT @V_SEQ = ISNULL(MAX(SEQ),0) + 1 , @V_REGSEQ =  RIGHT('00000' + CONVERT(VARCHAR,ISNULL(MAX(CONVERT(INT,REG_SEQ)),0) + 1),5) ";
                sQuery += "   FROM POSLOG.dbo.ETC_HOLD_HISTORY ";
                sQuery += "  WHERE 1 = 1 AND CMP_CD   = '{0}' AND SALE_DT  = '{1}' AND STOR_CD  = '{2}' AND POS_NO   = '{3}'  ";
                sQuery += " IF @V_STAT = 'H01' ";
                sQuery += "  BEGIN ";
                sQuery += "   SET @V_ORGREGSEQ=@V_REGSEQ ";
                sQuery += "  END ";
                sQuery += " ELSE ";
                sQuery += "  BEGIN ";
                sQuery += "   SELECT @V_ORGREGSEQ = RIGHT('00000' + CONVERT(VARCHAR,ISNULL(MAX(CONVERT(INT,REG_SEQ)),0)),5) ";
                sQuery += "     FROM POSLOG.dbo.ETC_HOLD_HISTORY  ";
                sQuery += "    WHERE 1 = 1 AND CMP_CD   = '{0}' AND SALE_DT  = '{1}' AND STOR_CD  = '{2}' AND POS_NO   = '{3}'  AND REG_NO = '" + m_cTrnStatus.Head.HoldOrgRegNo + "' ";
                sQuery += "  END ";

                sQuery += " INSERT INTO POSLOG.dbo.ETC_HOLD_HISTORY ( ";
                sQuery += "     CMP_CD, SALE_DT, STOR_CD, POS_NO, REG_NO, SEQ, HOLD_STAT, SYS_DT, SYS_TM, REG_SEQ ";
                sQuery += "    ,ORG_REG_SEQ, PIC_NO, ITEM_QTY, SALE_AMT, AMT_FILLER_01, AMT_FILLER_02, STR_FILLER_01, STR_FILLER_02, SEND_YN, REG_DATE ";
                sQuery += "    ,UPD_DATE ";
                sQuery += " ) VALUES ( '{0}', '{1}',  '{2}',  '{3}',  '{4}', @V_SEQ,  '{5}',  '{6}',  '{7}',  @V_REGSEQ, ";
                sQuery += "            @V_ORGREGSEQ, '{8}' ,'{9}', '{10}', '{11}', '{12}', '{13}', N'{14}', N'{15}', '{16}', '{17}' )  ";

                string sRegDate = DateTime.Now.ToString("yyyyMMdd");
                string sRegTime = DateTime.Now.ToString("HHmmss");

                sQuery = string.Format(sQuery
                    , m_cTrnStatus.Head.CmpCd           // CMP_CD
                    , m_cTrnStatus.Head.SaleDate        // SALE_DT
                    , m_cTrnStatus.Head.StoreCd         // STOR_CD
                    , m_cTrnStatus.Head.PosNo           // POS_NO
                    , sRegNo                            // REG_NO
                    , sHoldStat                         // HOLD_STAT
                    , sRegDate                          // SYS_DT
                    , sRegTime                          // SYS_TM
                    , m_cTrnStatus.Head.CashierId       // PIC_NO
                    , dQty                              // ITEM_QTY
                    , dSaleAmt                          // SALE_AMT
                    , 0                                 // AMT_FILLER_01
                    , 0                                 // AMT_FILLER_02
                    , ""                                // STR_FILLER_01
                    , ""                                // STR_FILLER_02
                    , "0"                               // SEND_YN
                    , sRegDate + sRegTime               // REG_DATE
                    , sRegDate + sRegTime               // UPD_DATE
                    );

                m_cSqlDbService.DBExecuteNonQuery(new string[] { sQuery });

                m_cTrnStatus.Head.HoldStat = "";
                m_cTrnStatus.Head.HoldOrgRegNo = "";

            }
            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 

        //17.05.18 dkshin 쇼킹박스 추가
        public string PosShockingBoxSerch(string aParam)
        {
            string sRet = UserCom.RST_ERR;
            var sQuery = string.Empty;
            var sSQL = string.Empty;

            sQuery = "SELECT * FROM POSLOG..ETC_SALE_HEADER "
                       + "WHERE CMP_CD = '{0}' AND STOR_CD = '{1}' AND POS_NO = '{2}' AND SALE_DT + REG_NO = '{3}' ";

            sSQL = string.Format(sQuery, m_cTrnStatus.Head.CmpCd, m_cTrnStatus.Head.StoreCd, m_cTrnStatus.Head.PosNo, aParam);

            DataTable dtReturn = null;

            if (m_cSqlDbService.DBSelect(sSQL, out dtReturn) == UserCom.OK)
            {
                //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 start
                //기존
                //sRet = UserCom.RST_OK;

                //변경
                DataRow dr = dtReturn.Rows[0];
                sRet = CmUtil.GetDataRowStr(dr, "TRADE_KINDPER");
                //#15746 해피오더 '쇼킹박스' 관련 POS 시스템 개발 요청 end
            }
            return sRet;
        }

        //17.05.18 dkshin 쇼킹박스 추가
        public string UpdateShockingBoxTradeNo()
        {
            string sRet = UserCom.RST_ERR;
            var sQuery = string.Empty;
            var sSQL = string.Empty;

            try
            {
                sQuery = "UPDATE POSLOG..ETC_SALE_HEADER SET ORG_BILL_POSNO = '{0}' , ORG_BILLDT = '{1}', ORG_BILL_NO = '{2}' "
                       + "WHERE CMP_CD = '{3}' AND STOR_CD = '{4}' AND POS_NO = '{5}' AND SALE_DT + REG_NO = '{6}' ";

                sSQL = string.Format(sQuery, m_cTrnStatus.Head.PosNo, m_cTrnStatus.Head.SaleDate, m_cTrnStatus.Head.TradeNo, m_cTrnStatus.Head.CmpCd, m_cTrnStatus.Head.StoreCd, m_cTrnStatus.Head.PosNo, m_cTrnStatus.Head.ShockingBoxBarcodeData);

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

            }
            return sRet;
        }

        //2017-06-02 dkshin 해피앱 추후적립
        public string SaveHPAppAfter()
        {
            string sRet = UserCom.RST_ERR;
            string sQuery = "";
            string sSQL = "";

            try
            {
                //ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);

                //if (alEtcItem.Count == 0)
                {
                    sQuery += " INSERT INTO POSLOG..TR_HPAPP_AFTER_SAVE ( ";
                    sQuery += "    CMP_CD, SALE_DT, STOR_CD, POS_NO, TRADE_NO, BILL_BAR_CD, TMNLNO, TOT_TRADE_AMT, ACCUM_TRGT_AMT, APPR_WAY_CD, APPR_CARD_NO, ADD_ACCUM_YN, ";
                    sQuery += "    ADD_ACCUM_CD, ADD_ACCUM_HQ_ALLOT_AMT, ADD_ACCUM_STOR_ALLOT_AMT, SAVE_STATUS, SEND_YN, REG_DATE, UPD_DATE ";
                    sQuery += " ) VALUES ( ";
                    sQuery += "   '{0}',  '{1}',   '{2}',   '{3}',   '{4}',   '{5}',   '{6}',   '{7}',   '{8}' ,   '{9}', ";
                    sQuery += "  '{10}', '{11}',  '{12}',  '{13}',  '{14}',  '{15}',  '{16}',  '{17}',  '{18}' )";

                    string sVanCD = PosMstManager.GetMstPayDc(ItemConst.TR_ITEM_ID.ETC_INFO_ITEM, ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT, PosMst.MST_PAY_DC.DATA.APPR_VEND_CD);
                    string sApprID = PosMstManager.GetMstVan(sVanCD, PosMst.MST_VAN.DATA.APPR_ID);

                    
                    String sAddHpAccumeYN = "N";
                    String sAddHpAccumeCD = string.Empty;
                    double lADDBRNDSHRPT = 0;
                    if (m_cTrnStatus.Head.AftSaveAddInfo != "")
                    {
                        sAddHpAccumeYN = m_cTrnStatus.Head.AftSaveAddInfo.ToString().Substring(25, 1);
                        sAddHpAccumeCD = m_cTrnStatus.Head.AftSaveAddInfo.ToString().Substring(26, 2);

                        if (sAddHpAccumeYN == "Y")
                        {
                            lADDBRNDSHRPT = Convert.ToDouble(m_cTrnStatus.Head.AftSaveAddInfo.ToString().Substring(28, 7));
                        }
                        //lADDBRNDSHRPT = string.Format("{0:D7}", lADDBRNDSHRPT);
                    }


                    sSQL = string.Format(sQuery
                        , m_cTrnStatus.Head.CmpCd       // CMP_CD
                        , m_cTrnStatus.Head.SaleDate    // SALE_DT
                        , m_cTrnStatus.Head.StoreCd     // STOR_CD
                        , m_cTrnStatus.Head.PosNo       // POS_NO
                        , m_cTrnStatus.Head.TradeNo     // TRADE_NO
                        , m_cTrnStatus.Head.RcptBarcodeData  // BILL_BAR_CD
                        , sApprID                       // TMNLNO : 단말기 승인 ID
                        , m_cTrnStatus.Head.TotSaleAmt  // TOT_TRADE_AMT : 총거래금액
                        , m_cTrnStatus.Head.AftSavePoint// ACCUM_TRGT_AMT : 적립대상금액
                        , "01"                          // APPR_WAY_CD : 결제수단코드(01:현금,02:신용 등)
                        , "null"                        // APPR_CARD_NO : 결제카드번호

                        , sAddHpAccumeYN                // ADD_ACCUM_YN : 추가적립여부
                        , sAddHpAccumeCD                // ADD_ACCUM_CD : 추가적립코드
                        , lADDBRNDSHRPT                 // ADD_ACCUM_HQ_ALLOT_AMT : 추가적립본사부담금
                        , 0                             // ADD_ACCUM_STOR_ALLOT_AMT :추가적립점포부담금

                        , 'N'                           // SAVE_STATUS : 해피앱 적립여부 (INSERT:N(미적립),반품:R,추후적립:P,적립:Y)
                        , '0'                           // SEND_YN : TR전송 여부(0:미전송, 1: 전송, 9: 전송실패)
                        , DateTime.Now.ToString("yyyyMMddHHmmss") // REG_DATE
                        , DateTime.Now.ToString("yyyyMMddHHmmss") // UPD_DATE
                       );
                }

                if (m_cSqlDbService.DBExecuteNonQuery(new string[] { sSQL }) != UserCom.OK)
                {
                    m_cSqlDbService.Rollback();
                    return sRet;
                }
                return 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);
            }
            m_cSqlDbService.Rollback();

            return sRet;
        }
    }
}
