using System;
using System.Collections;
using System.IO;

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

/*-----------------------------------------------------------------------------------------------*/
// 설      명 : 영수증 출력 처리
// 작  성  자 : 
// 변경  이력 : 
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.Service
{
    class PosReceiptBase
    {
        protected SManager sManager = new SManager();                                   // 이 객체를 통해 업무 Service 호출
        protected StateServer StateObject = (StateServer)StateServer.GetInstance();     // StateObject : StateServer Object (객체)
        protected PosStatus m_cPosStatus;                                               // 기본정보 참조
        protected TranStatus m_cTrnStatus;                                              // 거래정보 참조
        protected DeviceStatus m_cDevStatus;                                            // 장비정보 참고

        protected IPosPrinterUs m_cPosPrinter = null;
        protected IDatabaseSQL m_cSqlDbService = null;                                  // 데이터베이스 관리
        protected IMasterUs m_cMstService = null;                                       // 마스터 인터페이스

        //private MakeTranLog m_cTranService = null;
        private IDataCommonUs m_cDataCommon = null;                                     // POS 공통함수 인터페이스

        protected static ArrayList m_aPrintBuf = new ArrayList();

        /// <summary>
        /// 출력데이터(0:RECEIPT:본영수증)
        /// </summary>
        protected static ArrayList m_aRecPrintBuf = new ArrayList();
        /// <summary>
        /// 출력데이터(9:NOJNL:부가영수증(저널 대상아님))
        /// </summary>
        protected static ArrayList m_aEtcPrintBuf = new ArrayList();

        /// <summary>
        /// 영수증 메시지 마스터 정보
        /// </summary>
        protected DataTable m_dtMstBillMsg = null;
        /// <summary>
        /// 영수증 유형 마스터 정보
        /// </summary>
        protected DataTable m_dtMstBillType = null;
        /// <summary>
        /// 설문참여 메시지 마스터 정보
        /// </summary>
        protected DataTable m_dtMstVoteMsg = null;

        /// <summary>
        /// 정렬구분('0':오른쪽, '1':가운데, '2':왼쪽)
        /// </summary>
        protected string m_sPaySortDiv;
        /// <summary>
        /// 크기구분(0:보통, 1:굵게, 2:가로확대, 3:세로확대, 4:전체확대)
        /// </summary>
        protected string m_sPaySizeDiv;

        //grayber@20180226 대기번호표 개선 start - 구분 추가
        /// <summary>
        /// 전자영수증 구분
        /// </summary>
        protected bool m_bElectRec = false;
        //grayber@20180226 대기번호표 개선 end

        public PosReceiptBase()
        {
            m_cPosStatus = (PosStatus)StateObject.POS;                              // POS 기본정보
            m_cTrnStatus = (TranStatus)StateObject.TRAN;                            // POS 거래정보
            m_cDevStatus = (DeviceStatus)StateObject.DEVICE;                        // POS 장치정보 

            m_cPosPrinter = (IPosPrinterUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_POSPRINTER);
            m_cSqlDbService = (IDatabaseSQL)sManager.InitServiceInstance(ServiceLists.AGENT_DATABASE.DLL, ServiceLists.AGENT_DATABASE.DATABASE_MSSQL);
            m_cMstService = (IMasterUs)sManager.InitServiceInstance(ServiceLists.ASV_MASTER.DLL, ServiceLists.ASV_MASTER.POS_MASTER);

            //m_cTranService = (MakeTranLog)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.MAKE_TRANLOG);
            m_cDataCommon = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON);
        }

        /// <summary>
        /// 영수증 버퍼 초기화
        /// </summary>
        /// <returns></returns>
        public void PrintBufClear()
        {
            m_aPrintBuf.Clear();

            m_aRecPrintBuf.Clear();
            m_aEtcPrintBuf.Clear();
        }

        /// <summary>
        /// 영수증 상단 영역 출력
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="bTopImg">상단이미지 출력여부</param>
        /// <param name="bStamp">명판 출력여부</param>
        /// <param name="bTopMsg">상단메시지 출력여부</param>
        /// <param name="bTopInfo">일자시간 출력여부</param>
        /// <returns></returns>
        protected bool SetTopPosPrintData(string sPrtID, bool bTopImg, bool bStamp, bool bTopMsg, bool bTopInfo)
        {
            return SetTopPosPrintData(sPrtID, bTopImg, bStamp, bTopMsg, bTopInfo, "");
        }
        protected bool SetTopPosPrintData(string sPrtID, bool bTopImg, bool bStamp, bool bTopMsg, bool bTopInfo, string sTitleName)
        {
            return SetTopPosPrintData(sPrtID, bTopImg, bStamp, bTopMsg, bTopInfo, sTitleName, false);
        }
        protected bool SetTopPosPrintData(string sPrtID, bool bTopImg, bool bStamp, bool bTopMsg, bool bTopInfo, string sTitleName, bool bDisplay)
        {
            try
            {
                // 상단 이미지 출력
                if (bTopImg == true && PosMstManager.GetPosOption(POS_OPTION.OPT409) != "0" && m_cPosStatus.Base.TextLogoMsgUseYn != "1") AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_TBM);

                // 상단 텍스트로고 출력
                if (m_cPosStatus.Base.TextLogoMsgUseYn == "1") SetTextLogoMsg(sPrtID);

                // 주문(대기)번호 출력!
                if (bTopMsg == true)
                {
                    #region
                    //#20170913 TO STAY, TO GO 정보 영수증 출력 start
                    string sPackTradeNm = "";
                    if (m_cTrnStatus.Head.PackTradeDiv != "")
                    {
                        #region
                        if (m_cTrnStatus.Head.PackTradeDiv == "1")
                        {
                            sPackTradeNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1003);
                        }
                        else if (m_cTrnStatus.Head.PackTradeDiv == "2")
                        {
                            sPackTradeNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1004);
                        }
                        else if (m_cTrnStatus.Head.PackTradeDiv == "3")
                        {
                            sPackTradeNm = MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1005);
                        }
                        #endregion

                        //AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, sPackTradeNm);
                    }
                    //#20170913 TO STAY, TO GO 정보 영수증 출력 end

                    if (PosMstManager.GetPosOption(POS_OPTION.OPT008) == "1" && m_cTrnStatus.Head.OrderNo != "")
                    {
                        #region
                        if (m_cTrnStatus.Head.IsBellUse.Equals("1"))
                        {
                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, "진동벨번호");
                        }
                        else
                        {
                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0097));
                        }
                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_BIG, PosConst.PRT_FMT.F103, m_cTrnStatus.Head.OrderNo);


                        //#20170913 TO STAY, TO GO 정보 영수증 출력 start
                        if (sPackTradeNm != "")
                        {
                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, sPackTradeNm);
                        }
                        //#20170913 TO STAY, TO GO 정보 영수증 출력 end

                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");

                        #endregion
                    }
                    else if (m_cPosStatus.Sale.EtcOperateMode == PosConst.ETC_OPERATION_MODE.NO_ORDER_SALE)
                    {
                        #region
                        // Add, 2017.03.14 => 후불-판매모드 일때는 영수증에 주문번호를 무조건 출력 한다.
                        var temp = string.IsNullOrWhiteSpace(m_cTrnStatus.Head.OrderNo) ? m_cTrnStatus.Head.TradeNo : m_cTrnStatus.Head.OrderNo;
                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0097) + ":" + temp);

                        //#20170913 TO STAY, TO GO 정보 영수증 출력 start
                        if (sPackTradeNm != "")
                        {
                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, sPackTradeNm);
                        }
                        //#20170913 TO STAY, TO GO 정보 영수증 출력 end

                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");
                        #endregion
                    }

                    #endregion
                }

                // 명판 출력
                if (bStamp == true) SetStampGuidePrintData(sPrtID, PosConst.BILL_PRT_LOC.STAMP);

                // 상단메시지 출력
                if (bTopMsg == true)
                {
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT411) != "0") SetStampGuidePrintData(sPrtID, PosConst.BILL_PRT_LOC.TOP);

                    ////주문(대기)번호 출력!
                    //if (PosMstManager.GetPosOption(POS_OPTION.OPT008) == "1" && m_cTrnStatus.Head.OrderNo != "")
                    //{
                    //    AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0097) + ":" + m_cTrnStatus.Head.OrderNo);
                    //}
                }

                // 연습모드이면 연습모드 여부 출력
                if (m_cPosStatus.Base.TrainingFlag == ItemConst.TRAINING_FLAG.TRAINING_YES) AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0033));

                #region
                //// 현금 영수증 타이틀 출력
                //ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                //foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                //{
                //    if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;
                //    if (cEtcItem.BILLSPR_NO != m_cTrnStatus.Sale.BillSplitNo) continue;

                //    if (cEtcItem.ETC_WAY_CD != ItemConst.TR_ITEM_ID.ETC_INFO_ITEM || cEtcItem.ETC_DTL_CD_01 != ItemConst.TR_ITEM_ID.ETC_INFO.CASHBILL) continue;

                //    // 소득공제, 지출증빙 타이틀 출력
                //    AddPrintData(sPrtID, bDisplay == true ? PosConst.PRT_HDR.PRT_NOR : PosConst.PRT_HDR.PRT_HOR, PosConst.PRT_FMT.F103
                //        , (cEtcItem.OCCUR_ENTRY_11 == "0" ? MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0041) : MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0042)));
                //}

                #endregion

                // 반품 타이틀 출력
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND)
                {
                    AddPrintData(sPrtID, bDisplay == true ? PosConst.PRT_HDR.PRT_NOR : PosConst.PRT_HDR.PRT_HOR, PosConst.PRT_FMT.F103, MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0002));
                }

                // grayber@20180110 전자영수증 주문(대기)번호표 출력 start - 영수증 출력 :  대기번호표 타이틀 출력
                // 개별 타이틀 정보 출력
                // 기존
                //if (sTitleName != "") AddPrintData(sPrtID, bDisplay == true ? PosConst.PRT_HDR.PRT_NOR : PosConst.PRT_HDR.PRT_HOR, PosConst.PRT_FMT.F103, sTitleName);

                // 변경
                if (sTitleName != "" &&
                    //grayber@20180226  대기번호표 조건 변경 start - 조건 단순화
                    // 기존
                    //PosMstManager.GetPosOption(POS_OPTION.OPT429).Trim().Equals("1")            // 전자영수증 발행 여부
                    //&& PosMstManager.GetPosOption(POS_OPTION.OPT008).Trim().Equals("1")         // 대기(주문) 번호 사용여부
                    //&& m_cTrnStatus.Head.OrderNo.Trim().Equals("") != true                  // 주문번호가 있으면
                    //&& m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.REFUND              // 반품이 아닐때
                    //// grayber@20180122 전자영수증 조건 추가 start - 해피앱 전자영수증 사용 여부 확인
                    //&& CheckElectronic_Receipt().Equals("Y") == true                        // 전자영수증 확인
                    //// grayber@20180122 전자영수증 조건 추가 end
                    // 변경
                    m_bElectRec == true && m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.REFUND
                //grayber@20180226  대기번호표 조건 변경 end
                )
                {
                    AddPrintData(sPrtID, bDisplay == true ? PosConst.PRT_HDR.PRT_NOR : PosConst.PRT_HDR.PRT_BGB, PosConst.PRT_FMT.F103, sTitleName);
                    AddPrintData(sPrtID, bDisplay == true ? PosConst.PRT_HDR.PRT_NOR : PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, " ");           // 공백 추가
                }
                else
                {
                    if (sTitleName.Trim().Equals("") != true) AddPrintData(sPrtID, bDisplay == true ? PosConst.PRT_HDR.PRT_NOR : PosConst.PRT_HDR.PRT_HOR, PosConst.PRT_FMT.F103, sTitleName);
                }
                // grayber@20180110 전자영수증 주문(대기)번호표 출력 end

                if (bTopInfo == true)
                {
                    #region
                    if (PosMstManager.GetPosOption(POS_OPTION.OPT401) == "1")
                    {
                        //  2019-04-16 - 1997fx11 : 판매일자 및 POS번호, 캐셔이름
                        SetBillTypeTopBtmPrintData(sPrtID, PosConst.BILL_TYPE_DIV.TOP_INFO);
                    }
                    else
                    {
                        string sCashierName = m_cPosStatus.Base.CashierName;        // 판매원명

                        //#20171107 통제관리 start, phj 
                        //기존
                        //if (m_cTrnStatus.Head.CashierId != m_cPosStatus.Base.CashierNo) sCashierName = GetCashierName(m_cTrnStatus.Head.CashierId);

                        //변경
                        if (m_cTrnStatus.Head.CashierId != m_cPosStatus.Base.CashierNo)
                        {
                            if ((m_cTrnStatus.Head.CashierId.Length) > 3)
                            {
                                sCashierName = GetCashierName(m_cTrnStatus.Head.CashierId.Substring(m_cTrnStatus.Head.StoreCd.Length, 3));
                            }
                            else
                            {
                                if (m_cTrnStatus.Head.CashierId != m_cPosStatus.Base.CashierNo) sCashierName = GetCashierName(m_cTrnStatus.Head.CashierId);
                            }
                        }
                        //#20171107 통제관리 end, phj

                        // 거래구분,일자,시간, POS번호,캐셔명
                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR,
                            (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND ? MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0002) : MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0001))
                            + " " + m_cPosStatus.Global.DateToCulture(m_cTrnStatus.Head.SysYmd) + " " + CmUtil.StrToTime(m_cTrnStatus.Head.PayHms) + " POS:" + m_cTrnStatus.Head.PosNo + "(" + CmUtil.LeftH(sCashierName, 6) + ")");
                    }
                    #endregion
                }
                return true;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return false;

        }

        /// <summary>
        /// 영수증 하단 영역 출력
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="bBtmImg">하단이미지 출력여부</param>
        /// <param name="bBtmMsg">하단메시지 출력여부</param>
        /// <param name="bBtmInfo">하단정보 출력여부</param>
        /// <param name="bBarCode">영수증바코드 출력여부</param>
        /// <param name="bAddMsg">추가메시지 출력여부</param>
        /// <returns></returns>
        protected bool SetBtmPosPrintData(string sPrtID, bool bBtmImg, bool bBtmMsg, bool bBtmInfo, bool bBarCode, bool bAddMsg)
        {
            return SetBtmPosPrintData(sPrtID, bBtmImg, bBtmMsg, bBtmInfo, bBarCode, bAddMsg, 1);
        }
        protected bool SetBtmPosPrintData(string sPrtID, bool bBtmImg, bool bBtmMsg, bool bBtmInfo, bool bBarCode, bool bAddMsg, int iPrintCnt)
        {
            string sPrintMsg = "";

            try
            {
                if (m_cPosStatus.Base.TrainingFlag == ItemConst.TRAINING_FLAG.TRAINING_YES)
                {
                    AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F103, MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0035));
                }

                // 하단 메시지 출력
                if (bBtmMsg == true && PosMstManager.GetPosOption(POS_OPTION.OPT412) != "0") SetStampGuidePrintData(sPrtID, PosConst.BILL_PRT_LOC.BOTTOM);


                //grayber@20171214 캠페인 리펀드 쿠폰 start
                // 캠페인 리펀드 출력
                if (PosMstManager.GetPosOption(POS_OPTION.OPT431).Equals("1") == true && bAddMsg == true)
                {
                    SetCpiRefundPrint(sPrtID);
                }
                //grayber@20171214 캠페인 리펀드 쿠폰 end 

                // 하단정보
                if (bBtmInfo == true && PosMstManager.GetPosOption(POS_OPTION.OPT401) == "1")
                {
                    SetBillTypeTopBtmPrintData(sPrtID, PosConst.BILL_TYPE_DIV.BTM_INFO);
                }


                //grayber@20171214 캠페인 리펀드 쿠폰 start
                // 해피앱 추후 적립 bBarCode 구분자 추가하여 주석 해제
                // 바코드가 출력시에 출력되도록 처리
                if (bBarCode == true)
                {
                    //#20170807 명판 캠페인 커팅 start
                    //#해피앱 추후적립 start, sskim
                    if (m_cPosStatus.Mst.CntryDiv == ItemConst.CNTRY_DIV.KR)
                    {
                        //#20180509 해피앱 추후적립 사용여부 옵션 처리 start
                        //기존
                        //if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL)
                        //변경
                        if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL &&
                            PosMstManager.GetPosOption(POS_OPTION.OPT515) == "1")       // 해피앱 추후적립 사용 여부(0:사용안함, 1:사용함)
                        //#20180509 해피앱 추후적립 사용여부 옵션 처리 end
                        {

                            //#17470 패션파이브 영수증 메시지 수정 요청 start
                            //기존
                            //SetHpAppAfterSavePrint(sPrtID);       // 해피앱 추후적립 문구 출력
                            //변경
                            //패션5, 라뜰리에 영업조직은 해피앱 추후적립 문구 미출력
                            if (m_cPosStatus.Base.BrandCd != "009" && m_cPosStatus.Base.BrandCd != "021")
                            {
                                SetHpAppAfterSavePrint(sPrtID);       // 해피앱 추후적립 문구 출력
                            }
                            //#17470 패션파이브 영수증 메시지 수정 요청 end
                        }
                    }
                    //#해피앱 추후적립 end, sskim
                    //#20170807 명판 캠페인 커팅 end
                }
                //grayber@20171214 캠페인 리펀드 쿠폰 end

                // 바코드 출력
                if (bBarCode == true && PosMstManager.GetPosOption(POS_OPTION.OPT403) != "0" && m_cPosStatus.Sale.DutchPayFlg != "2")  // && m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL)
                {
                    //2017-06-02 dkshin 해피앱 추후적립 - 영수증 바코드 포맷 변경
                    //string sBarData = m_cTrnStatus.Head.SaleDate + m_cTrnStatus.Head.PosNo + m_cTrnStatus.Head.PayHms;
                    //AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_BA1, sBarData);
                    string sBarData = "";
                    if (m_cTrnStatus.Head.CmpCd == "PCKR")
                    {
                        sBarData = "4";
                    }
                    else if (m_cTrnStatus.Head.CmpCd == "BRKR")
                    {
                        sBarData = "5";
                    }
                    else if (m_cTrnStatus.Head.CmpCd == "SLKR")
                    {
                        sBarData = "6";
                    }
                    //2017.11.01;중국은 7, 그 외 지역은 BarData 자리 수를 마추기 위해 9 로 추가함;girak.kim; Start 
                    else if (m_cTrnStatus.Head.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCCN))
                    {
                        sBarData = "7";
                    }
                    else if (m_cTrnStatus.Head.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCUS))
                    {
                        sBarData = "8";
                    }
                    else
                    {
                        sBarData = "9";
                    }
                    //2017.11.01;그 외 지역은 BarData 자리 수를 마추기 위해 9 로 추가함;girak.kim; End

                    sBarData += m_cTrnStatus.Head.TradeNo.ToString().Substring(4, 1);     //빌5
                    sBarData += m_cTrnStatus.Head.PosNo.ToString().Substring(0, 1);       //P1
                    sBarData += m_cTrnStatus.Head.SaleDate.ToString().Substring(0, 1);    //년1
                    sBarData += m_cTrnStatus.Head.TradeNo.ToString().Substring(3, 1);     //빌4
                    sBarData += m_cTrnStatus.Head.SaleDate.ToString().Substring(1, 1);    //년2
                    sBarData += m_cTrnStatus.Head.PosNo.ToString().Substring(1, 1);       //P2
                    sBarData += m_cTrnStatus.Head.SaleDate.ToString().Substring(2, 1);    //년3
                    //sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(2, 1);     //점3
                    sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(m_cTrnStatus.Head.StoreCd.Length - 5, 1);     //점3
                    sBarData += m_cTrnStatus.Head.SaleDate.ToString().Substring(3, 1);    //년4
                    //sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(3, 1);     //점4
                    sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(m_cTrnStatus.Head.StoreCd.Length - 4, 1);     //점4
                    sBarData += m_cTrnStatus.Head.SaleDate.ToString().Substring(4, 1);    //월1
                    sBarData += m_cTrnStatus.Head.TradeNo.ToString().Substring(2, 1);     //빌3
                    sBarData += m_cTrnStatus.Head.SaleDate.ToString().Substring(5, 1);    //월2
                    //sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(4, 1);     //점5
                    sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(m_cTrnStatus.Head.StoreCd.Length - 3, 1);     //점5
                    sBarData += m_cTrnStatus.Head.SaleDate.ToString().Substring(6, 1);    //일1
                    sBarData += m_cTrnStatus.Head.TradeNo.ToString().Substring(1, 1);     //빌2
                    sBarData += m_cTrnStatus.Head.SaleDate.ToString().Substring(7, 1);    //일2
                    //sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(5, 1);     //점6
                    sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(m_cTrnStatus.Head.StoreCd.Length - 2, 1);     //점6
                    //sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(6, 1);     //점7
                    sBarData += m_cTrnStatus.Head.StoreCd.ToString().Substring(m_cTrnStatus.Head.StoreCd.Length - 1, 1);     //점7

                    //#15456 영수증 바코드 번호표기 start
                    //기존
                    //AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_BA1, sBarData);
                    //변경
                    AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_BAR, sBarData);
                    //#15456 영수증 바코드 번호표기 end

                    m_cTrnStatus.Head.RcptBarcodeData = sBarData;
                    m_cPosStatus.Base.LastRcptBarcodeData = sBarData;

                }

                // 하단 고객용/보관용 명칭 출력
                if (m_cTrnStatus.Head.TradeKind.StartsWith(ItemConst.TRAN_KIND.NORMAL.DELIMITER) == true
                    || m_cTrnStatus.Head.TradeKind.StartsWith(ItemConst.TRAN_KIND.UNDECIDED.DELIMITER) == true
                    || m_cTrnStatus.Head.TradeKind.StartsWith(ItemConst.TRAN_KIND.FORIGN.DELIMITER) == true
                    || m_cTrnStatus.Head.TradeKind.StartsWith(ItemConst.TRAN_KIND.AFTER.DELIMITER) == true
                    || m_cTrnStatus.Head.TradeKind.StartsWith(ItemConst.TRAN_KIND.CHARGESALE.DELIMITER) == true)
                {
                    if (iPrintCnt == 1)
                    {
                        sPrintMsg = CmUtil.MidH(MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0136), 0, 42).Trim();  // 고객용
                    }
                    else //if (iPrintCnt == 2)
                    {
                        sPrintMsg = CmUtil.MidH(MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0123), 0, 42).Trim();  // 보관용
                    }
                }
                else
                {
                    sPrintMsg = CmUtil.MidH(MessageManager.GetPrintMessage(POS_MESSAGE.PRINT.MSG_0123), 0, 42).Trim();      // 보관용
                }
                if (sPrintMsg != "") AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_HOR, PosConst.PRT_FMT.F103, "[" + sPrintMsg + "]");

                // 추가 메시지 출력
                if (bAddMsg == true)
                {
                    SetCampaignPrint(sPrtID);       // 영수캠페인(포함) 데이터 출력
                    SetVotePrintData(sPrtID);       // 설문참여 메시지 
                }
                // #20180206 [BR]MST_ITEM 원산지 정보 결제완료 시 콜센터배달 결제, 배달의민족, 요기요 배달 결제일 때만 표기되도록 수정 Start, lsr
                //grayber@20180202 [BR]해피오더 고객정보 추가 + 원산지 표기 start - [BR] 분리
                //if ( m_cPosStatus.Mst.CorpDiv.Equals(ItemConst.CORP_DIV.BR) != true )
                //{
                //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.FORIGN.O2O)

                // 해피오더 영양정보 출력

                if (m_cPosStatus.Mst.CorpDiv.Equals(ItemConst.CORP_DIV.BR) != true && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.FORIGN.O2O)
                // #20180206 [BR]MST_ITEM 원산지 정보 결제완료 시 콜센터배달 결제, 배달의민족, 요기요 배달 결제일 때만 표기되도록 수정 End, lsr
                {
                    // 결제 내역 받아 오기
                    ArrayList aPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);

                    // 해피오더 주문번호 가져 오기
                    Column.TR_PAYMENT.DATA cPayItem = (Column.TR_PAYMENT.DATA)aPayItem[0];
                    string sOrderNum = cPayItem.OCCUR_ENTRY_01;
                    string sOrderDt = cPayItem.OCCUR_ENTRY_03;

                    // 해피오더 영양정보 조회
                    IHappyOrderList cHappyOrder = (IHappyOrderList)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.HAPPY_ORDER_LIST);
                    DataTable dtReturn = cHappyOrder.GetHappyOrderData(sOrderNum, sOrderDt);
                    if (dtReturn != null && dtReturn.Rows.Count > 0)
                    {
                        DataRow drData = dtReturn.Rows[0];

                        string sNutritionMsg = CmUtil.GetDataRowStr(drData, "NUTRITION_MSG");
                        //#17141 [해피오더]배달영수증 주소 추가 start
                        string sHappyOrderDeliveryInfo = CmUtil.GetDataRowStr(drData, "FILLER5");
                        //#17141 [해피오더]배달영수증 주소 추가 end


                        //#17141 [해피오더]배달영수증 주소 추가 start
                        if (sNutritionMsg != "" || sHappyOrderDeliveryInfo != "")
                        {
                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");
                        }

                        if (sNutritionMsg != "")
                        {
                            //#17141 [해피오더]배달영수증 주소 추가 end

                            //#20180323 해피오더 영수증 재발행시 원산지 정보 출력 기능 수정 start
                            //주문서 출력시 원산지 정보 출력, 재발행시 원산지 정보 미출력되도록 수정
                            //기존
                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, sNutritionMsg);
                            //변경
                            //AddPrintData(PosConst.PRT_ITEM.REC_TEMP, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, sNutritionMsg);
                            //#20180323 해피오더 영수증 재발행시 원산지 정보 출력 기능 수정 end

                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");

                            //#17141 [해피오더]배달영수증 주소 추가 start
                        }

                        if (sHappyOrderDeliveryInfo != "")
                        {
                            string[] DeliveryDataList = null;
                            DeliveryDataList = sHappyOrderDeliveryInfo.Split(new string[] { "#~" }, StringSplitOptions.None);
                            if (DeliveryDataList != null)
                            {
                                //#17533 해피오더)영수증/주문서 전화번호 항목 추가 start
                                string sRecviver = "";
                                string sRecviverAddress = "";
                                string sReceiverHp = "";
                                //#17533 해피오더)영수증/주문서 전화번호 항목 추가 end

                                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, " [배송지 정보]");
                                //고객명                                 
                                if (DeliveryDataList[0] != "")
                                {
                                    sRecviver = string.Format("{0}{1}{2}", CmUtil.LeftH(DeliveryDataList[0], 2), ((DeliveryDataList[0].Length > 2) ? new string('*', DeliveryDataList[0].Length - 2) : "*"), CmUtil.RightH(DeliveryDataList[0], 2));
                                }
                                //주소지
                                if (DeliveryDataList[1] != "")
                                {
                                    sRecviverAddress = DeliveryDataList[1].Trim();
                                }

                                //#17533 해피오더)영수증/주문서 전화번호 항목 추가 start
                                //연락처
                                if (DeliveryDataList[2] != "")
                                {
                                    //#17673 PB 안산본오우성 - 해피오더창에서 배달중 누르면 [고객센터로 연락주세요] 팝업 발생 start
                                    //기존
                                    //sReceiverHp = sReceiverHp.Substring(sReceiverHp.Length - 4, 4);
                                    //변경
                                    sReceiverHp = DeliveryDataList[2].Substring(DeliveryDataList[2].Length - 4, 4);
                                    //#17673 PB 안산본오우성 - 해피오더창에서 배달중 누르면 [고객센터로 연락주세요] 팝업 발생 end                                    
                                }
                                //#17533 해피오더)영수증/주문서 전화번호 항목 추가 end

                                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, " " + MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1189) + " : " + sRecviver);
                                //#17533 해피오더)영수증/주문서 전화번호 항목 추가 start
                                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, " " + MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_0952) + " : " + sReceiverHp);
                                //#17533 해피오더)영수증/주문서 전화번호 항목 추가 end
                                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, " " + MessageManager.GetLabelMessage(POS_MESSAGE.LABEL.MSG_1087) + " : " + sRecviverAddress);
                                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");
                            }
                        }
                        //#17141 [해피오더]배달영수증 주소 추가 end
                    }
                }
                else    // 배달결제 영양정보 출력
                {
                    // 결제 내역 받아 오기
                    ArrayList alTrPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);

                    foreach (Column.TR_PAYMENT.DATA cPayItem in alTrPayItem)
                    {
                        // #20180206 [BR]MST_ITEM 원산지 정보 결제완료 시 콜센터배달 결제, 배달의민족, 요기요 배달 결제일 때만 표기되도록 수정 Start, lsr
                        //if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.ORDER_ITEM &&
                        //    (cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.ORDER.CALLCENTER_PAY || cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.ORDER.BAEMIN_PAY))

                        // 배달(콜센터)결제 또는 배달의민족 또는 요기요배달 결제일 경우에 영양정보 & 열량정보 출력
                        if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.ORDER_ITEM &&
                            (cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.ORDER.CALLCENTER_PAY || cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.ORDER.BAEMIN_PAY || cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.ORDER.YOGIYO_PAY)
                            // grayber@20180213 배달결제 영양정보 출력 거래구분 추가 정상일때만 출력하도록 처리 start
                            // 추가
                            && m_cTrnStatus.Head.TradeDiv.Equals(ItemConst.TRAN_DIV.NORMAL) == true     // 정상 거래 건
                                                                                                        // grayber@20180213 배달결제 영양정보 출력 거래구분 추가 정상일때만 출력하도록 처리 end
                            )
                        // #20180206 [BR]MST_ITEM 원산지 정보 결제완료 시 콜센터배달 결제, 배달의민족, 요기요 배달 결제일 때만 표기되도록 수정 End, lsr
                        {
                            // 상품 내역 받아 오기
                            ArrayList alPluItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);

                            int nCnt = 0;
                            string sItemInfo = "";
                            foreach (Column.TR_PLU.DATA cPluItem in alPluItem)
                            {
                                DataTable dtData = m_cDataCommon.SearchItemCode(cPluItem.SUB_SHOP_CD, cPluItem.ITEM_PLU_CD, "");

                                if (dtData == null || dtData.Rows.Count == 0) continue;

                                DataRow dr = dtData.Rows[0];

                                // 상품의 영양정보와 열량정보가 존재하지 않으면 Skip 처리
                                if (CmUtil.StringNullEmpty(CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.ITEM_INFO)) == "" &&
                                    CmUtil.StringNullEmpty(CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.CALORY_INFO)) == "")
                                {
                                    continue;
                                }
                                // grayber@20180213 배달결제 영양정보 출력 양식 변경, 상품명 및 캐리지리턴 추가 start
                                // 기존 
                                //if (nCnt > 0)
                                //{
                                //    sItemInfo += "/";
                                //}
                                //sItemInfo += CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.ITEM_INFO) + CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.CALORY_INFO);

                                // 변경
                                sItemInfo += "- 상품명 : " + cPluItem.ITEM_NAME + "\r\n";
                                sItemInfo += CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.ITEM_INFO) + CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.CALORY_INFO) + "\r\n\r\n";
                                // grayber@20180213 배달결제 영양정보 출력 양식 변경, 상품명 및 캐리지리턴 추가 end
                                nCnt++;
                            }

                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, sItemInfo);
                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");
                            break;
                        }
                    }
                }
                // #20180206 [BR]MST_ITEM 원산지 정보 결제완료 시 콜센터배달 결제, 배달의민족, 요기요 배달 결제일 때만 표기되도록 수정 Start, lsr
                //}
                //grayber@20180202 [BR]해피오더 고객정보 추가 + 원산지 표기 end
                // #20180206 [BR]MST_ITEM 원산지 정보 결제완료 시 콜센터배달 결제, 배달의민족, 요기요 배달 결제일 때만 표기되도록 수정 End, lsr

                // 하단이미지 출력
                if (bBtmImg == true && PosMstManager.GetPosOption(POS_OPTION.OPT410) != "0") AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_BBM);

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

        }

        #region 영수 캠페인(포함) 출력 데이터 설정
        /// <summary>
        /// 영수 캠페인(포함) 출력 데이터 설정
        /// </summary>
        /// <param name="sPrtID"></param>
        /// <returns></returns>
        private bool SetCampaignPrint(string sPrtID)
        {
            try
            {
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND) return true;

                // 영수 캠페인 출력 데이터 설정
                ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                ArrayList alPrtBuf = cCampaingMain.GetCampaignPrintData(new string[] { });
                if (alPrtBuf == null || alPrtBuf.Count <= 0) return true;

                //AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");

                foreach (string sPrtData in alPrtBuf)
                {
                    AddPrintData(sPrtID, sPrtData);
                }

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

        }
        #endregion 

        /// <summary>
        /// 영수증 상단 텍스트로고 데이터 생성
        /// </summary>
        /// <param name="sPrtID"></param>
        /// <returns></returns>
        protected bool SetTextLogoMsg(string sPrtID)
        {
            try
            {
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, m_cPosStatus.Base.TextLogoMsg1);
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_VER, PosConst.PRT_FMT.F103, m_cPosStatus.Base.TextLogoMsg2);
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR);
                return true;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return false;
        }

        /// <summary>
        /// 영수증 출력 완료(커팅) 데이터 생성
        /// </summary>
        /// <param name="sPrtID"></param>
        /// <returns></returns>
        protected bool SetEndPosPrintData(string sPrtID)
        {
            try
            {
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR);
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_CUT, "");      // 영수증 커팅

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

        }

        /// <summary>
        /// 상품(정상상품) 출력 데이터 생성
        /// </summary>
        /// <param name="sPrtID"></param>
        /// <param name="sPRT_HDR"></param>
        /// <param name="sItemName"></param>
        /// <param name="nSalePrc"></param>
        /// <param name="nSaleQty"></param>
        /// <param name="nDcAmt"></param>
        /// <param name="sSaleAmt"></param>
        /// <param name="sTaxCd"></param>
        /// <returns></returns>
        protected bool SetPluItemPrintData(string sPrtID, string sPRT_HDR, string sItemName, double nSalePrc, long nSaleQty, double nDcAmt, string sSaleAmt, string sTaxCd)
        {
            try
            {
                // 영수증 제품명 두줄 출력(1 : 1줄 출력, 2 : 2줄 출력)	
                if (PosMstManager.GetPosOption(POS_OPTION.OPT414) == "2" && m_cPosStatus.Mst.CntryDiv != ItemConst.CNTRY_DIV.FR)   // 프랑스는 두줄출력 안함!
                {
                    // 상품명
                    AddPrintData(sPrtID, sPRT_HDR, sItemName);

                    // 상품 단가 출력(0 : 미 출력, 1 : 출력) 두줄출력일때만 가능
                    string sSalePrc = (PosMstManager.GetPosOption(POS_OPTION.OPT415) == "1") ? m_cPosStatus.Global.NumericTOCurrency(nSalePrc) : "";

                    // 단가, 수량, 금액
                    AddPrintData(sPrtID, sPRT_HDR, PosConst.PRT_FMT.F300, sSalePrc, nSaleQty.ToString(), sSaleAmt);
                }
                else
                {
                    if (m_cPosStatus.Mst.CntryDiv == ItemConst.CNTRY_DIV.FR)
                    {
                        // 수량, 상품명, 단가, 금액, 세금구분
                        AddPrintData(sPrtID, sPRT_HDR, PosConst.PRT_FMT.F501, sItemName, nSaleQty.ToString(),
                                            m_cPosStatus.Global.NumericTOCurrency(nSalePrc), sSaleAmt, sTaxCd);
                    }
                    else
                    {
                        // grayber@20180110 전자영수증 주문(대기)번호표 출력 start - 영수증 출력 : 제품명 , 수량 출력
                        // 기존
                        // 상품명, 수량, 금액
                        //AddPrintData(sPrtID, sPRT_HDR, PosConst.PRT_FMT.F301, sItemName, nSaleQty.ToString(), sSaleAmt);

                        // 변경
                        if (
                            //grayber@20180226  대기번호표 조건 변경 start - 조건 단순화
                            // 기존
                            //PosMstManager.GetPosOption(POS_OPTION.OPT429).Trim().Equals("1")      // 전자영수증 사용 유무
                            //&& PosMstManager.GetPosOption(POS_OPTION.OPT008).Trim().Equals("1")         // 대기(주문) 번호 사용여부
                            //&& m_cTrnStatus.Head.OrderNo.Trim().Equals("") != true                  // 주문번호가 있으면
                            //&& m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.REFUND              // 반품이 아닐때
                            //// grayber@20180122 전자영수증 조건 추가 start - 해피앱 전자영수증 사용 여부 확인
                            //&& CheckElectronic_Receipt().Equals("Y") == true                        // 전자영수증 확인
                            //// grayber@20180122 전자영수증 조건 추가 end
                            // 변경
                            m_bElectRec == true && m_cTrnStatus.Head.TradeDiv != ItemConst.TRAN_DIV.REFUND
                        //grayber@20180226  대기번호표 조건 변경 end
                        )
                        {
                            // 제품명 , 수량
                            AddPrintData(sPrtID, sPRT_HDR, PosConst.PRT_FMT.F200, sItemName, nSaleQty.ToString());
                            return true;
                        }
                        else
                        {
                            // 상품명, 수량, 금액
                            AddPrintData(sPrtID, sPRT_HDR, PosConst.PRT_FMT.F301, sItemName, nSaleQty.ToString(), sSaleAmt);
                        }
                        // grayber@20180110 전자영수증 주문(대기)번호표 출력 end
                    }
                }

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

        /// <summary>
        /// 영수증 출력 처리
        /// </summary>
        /// <param name="bRecPrt">본영수증출력여부</param>
        /// <param name="bEtcPrt">기타 출력여부</param>
        /// <returns></returns>
        public bool PrintExecute(bool bRecPrt, bool bEtcPrt, bool bSaveFile)
        {
            bool bRet = false;
            try
            {
                string CRLF = "\r\n";

                if (bSaveFile == true)
                {
                    // 최종 영수증데이터 저장
                    //WriteReceiptFile("PRT_REC.TXT", m_aPrintBuf, "");

                    WriteReceiptFile("PRT_REC.TXT", m_aRecPrintBuf, PosConst.PRT_ITEM.REC);
                    //WriteReceiptFile("PRT_ETC.TXT", m_aEtcPrintBuf, PosConst.PRT_ITEM.ETC); 
                }

                if (m_cPosStatus.Base.OlePosPrinterModel == "" || m_cPosStatus.Base.OlePosPrinterModel == "99")
                {
                    #region
                    string sPrtData = "";
                    frmPrtData fPrtData = new frmPrtData();

                    sPrtData = "";
                    for (int i = 0; i < m_aPrintBuf.Count; i++)
                    {
                        sPrtData += m_aPrintBuf[i].ToString().Substring(1) + PosConst.CRLF;
                    }
                    fPrtData.txtPrtData.Text = sPrtData;

                    sPrtData = "";
                    for (int i = 0; i < m_aRecPrintBuf.Count; i++)
                    {
                        sPrtData += m_aRecPrintBuf[i].ToString().Substring(1) + PosConst.CRLF;
                    }
                    fPrtData.txtRecPrtData.Text = sPrtData;

                    sPrtData = "";
                    for (int i = 0; i < m_aEtcPrintBuf.Count; i++)
                    {
                        sPrtData += m_aEtcPrintBuf[i].ToString().Substring(1) + PosConst.CRLF;
                    }
                    fPrtData.txtEtcPrtData.Text = sPrtData;

                    sPrtData = "";
                    // 캠페인 정보
                    ArrayList alTrCpiItem = (ArrayList)StateObject.GetItemObject(Column.TR_SALE_CPI_RSLT.ITEM);
                    foreach (Column.TR_SALE_CPI_RSLT.DATA cTrPluCpi in alTrCpiItem)
                    {
                        if (cTrPluCpi.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL) continue;

                        sPrtData += CmUtil.RPadH(cTrPluCpi.CPI_CD, 8) + CmUtil.RPadH(cTrPluCpi.ITEM_PLU_CD, 14)
                                    + CmUtil.LPadH(cTrPluCpi.DC_QTY.ToString(), 5) + CmUtil.LPadH(cTrPluCpi.DC_SUM_AMT.ToString(), 12) + CmUtil.LPadH(cTrPluCpi.ACCUM_POINT.ToString(), 12) + PosConst.CRLF;
                    }

                    fPrtData.txtCampaign.Text = sPrtData;

                    fPrtData.ShowDialog();

                    #endregion
                    return true;

                }

                // 영수증 출력버퍼 배열 사이즈 계산
                int nPrtBufSize = 0;
                if (bRecPrt == true && m_aRecPrintBuf.Count > 0) nPrtBufSize += m_aRecPrintBuf.Count;
                if (bEtcPrt == true && m_aEtcPrintBuf.Count > 0) nPrtBufSize += m_aEtcPrintBuf.Count;

                string[] aPrtBuf = new string[nPrtBufSize];

                // 영수증 출력
                int nRow = 0;
                for (int i = 0; i < m_aPrintBuf.Count; i++)
                {
                    if (bRecPrt == true
                        && (m_aPrintBuf[i].ToString().StartsWith(PosConst.PRT_ITEM.REC) == true || m_aPrintBuf[i].ToString().StartsWith(PosConst.PRT_ITEM.REC_TEMP) == true))
                    {
                        aPrtBuf[nRow] = m_aPrintBuf[i].ToString().Substring(1).TrimEnd();
                        nRow++;
                    }
                    else if (bEtcPrt == true && m_aPrintBuf[i].ToString().StartsWith(PosConst.PRT_ITEM.ETC) == true)
                    {
                        aPrtBuf[nRow] = m_aPrintBuf[i].ToString().Substring(1).TrimEnd();
                        nRow++;
                    }
                }

                #region
                //int nRow = 0;
                //if (bRecPrt == true && m_aRecPrintBuf.Count > 0)
                //{
                //    // 본영수증 출력
                //    for (int i = 0; i < m_aRecPrintBuf.Count; i++, nRow++)
                //    {
                //        aPrtBuf[nRow] = m_aRecPrintBuf[i].ToString().Substring(1).TrimEnd();
                //    }
                //}
                //if (bEtcPrt == true && m_aEtcPrintBuf.Count > 0)
                //{
                //    // 기타영수증 출력
                //    for (int i = 0; i < m_aEtcPrintBuf.Count; i++, nRow++)
                //    {
                //        aPrtBuf[nRow] = m_aEtcPrintBuf[i].ToString().Substring(1).TrimEnd();
                //    }
                //}
                #endregion
                //if (m_cDevStatus.Printer.UseYn != false) bRet = m_cPosPrinter.ReceiptPrinter(aPrtBuf);      // 영수증 출력 처리
                if (m_cDevStatus.Printer.UseYn != false) bRet = m_cPosPrinter.ReceiptPrinter(aPrtBuf, true);      // 영수증 출력 처리(해피스테이션만 사용할 꺼임)
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return bRet;
        }

        /// <summary>
        /// 저널데이터 저장
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string SaveJnlExecute(string[] aParam)
        {
            string sJnlData = "";
            string sRet = UserCom.RST_ERR;
            //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start
            string sHPC_SAVE_APPR_DT = string.Empty;
            string sHPC_SAVE_APPR_NO = string.Empty;
            string sHPC_USE_APPR_DT = string.Empty;
            string sHPC_USE_APPR_NO = string.Empty;
            //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end
            try
            {
                //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start
                //Params
                if (aParam.Length == 4)
                {
                    sHPC_SAVE_APPR_DT = aParam[0];
                    sHPC_SAVE_APPR_NO = aParam[1];
                    sHPC_USE_APPR_DT = aParam[2];
                    sHPC_USE_APPR_NO = aParam[3];
                }
                //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end

                // 저널데이터 획득
                int nRow = 0;
                for (int i = 0; i < m_aRecPrintBuf.Count; i++)
                {
                    if (m_aRecPrintBuf[i].ToString().Length > 0)
                    {
                        string sPrtHdr = m_aRecPrintBuf[i].ToString().Substring(1, 5);
                        //if (sPrtHdr == PosConst.PRT_HDR.PRT_TBM || sPrtHdr == PosConst.PRT_HDR.PRT_IMG) continue;
                        if (sPrtHdr == PosConst.PRT_HDR.PRT_IMG) continue;
                        if (m_aRecPrintBuf[i].ToString().StartsWith(PosConst.PRT_ITEM.REC) == true) sJnlData += CmUtil.RPadH(m_aRecPrintBuf[i].ToString().Substring(1), 47);

                        nRow++;
                    }
                }
                if (sJnlData == "") sJnlData = "Empty Journal Data";

                // 저널데이터 저장
                string sQuery = "";

                if (m_cDataCommon.TradeNoAddCheck("") == false)
                {
                    //string sRegNo = string.Empty;
                    //DataTable dt = null;

                    //sQuery = " SELECT ISNULL(MAX(REG_NO),0) AS REG_NO ";

                    //sQuery += " WHERE 1 = 1 ";
                    //sQuery += "   AND CMP_CD = '" + m_cPosStatus.Base.CmpCd + "'";
                    //sQuery += "   AND SALE_DT = '" + m_cPosStatus.Base.SaleDate + "'";
                    //sQuery += "   AND STOR_CD = '" + m_cPosStatus.Base.StoreNo + "'";
                    //sQuery += "   AND POS_NO = '" + m_cPosStatus.Base.PosNo + "'";

                    //int iRet = m_cSqlDbService.DBSelect(sQuery, out dt);

                    //sRegNo = dt.Rows[0]["REG_NO"].ToString();

                    sQuery += " INSERT INTO POSLOG..ETC_SALE_JOURNAL ( ";
                    sQuery += " CMP_CD, STOR_CD, SALE_DT, POS_NO, REG_NO, TRADE_NO, TRADE_DIV, TRAIN_MODE_YN, TRADE_KINDPER, SYS_DT, ";
                    sQuery += " SYS_TIME, PIC_NO, BILL_AMT, JOURNAL_DATA, SEND_YN, REG_DATE, UPD_DATE ";

                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start -- 주석 처리 (ETC_SALE_JOURNAL 이라 주석)
                    //추가
                    //sQuery += " ,HPC_SAVE_APPR_DT, HPC_SAVE_APPR_NO ,HPC_USE_APPR_DT, HPC_USE_APPR_NO";
                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end

                    sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";

                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start -- 주석 처리 (ETC_SALE_JOURNAL 이라 주석 처리)
                    // 기존
                    sQuery += " '{10}','{11}', '{12}', N'{13}', '{14}', '{15}', '{16}' )";
                    // 변경
                    //sQuery += " '{10}','{11}', '{12}', N'{13}', '{14}', '{15}', {16} ";
                    //sQuery += ", '{17}','{18}', '{19}','{20}' ";
                    //sQuery += " )";
                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end

                    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.PayHms      // SYS_TIME
                        , m_cTrnStatus.Head.CashierId   // PIC_NO
                        , m_cTrnStatus.Head.NetSaleAmt    // BILL_AMT
                        , sJnlData
                        //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start  -- 주석 처리 ETC_SALE_JOURNAL 이라 주석 처리
                        // 기존
                        , "0", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));
                    // 변경
                    //, "0", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss")
                    //, sHPC_SAVE_APPR_DT
                    //, sHPC_SAVE_APPR_NO
                    //, sHPC_USE_APPR_DT
                    //, sHPC_USE_APPR_NO
                    //);
                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end  -- 주석 처리 ETC_SALE_JOURNAL 이라 주석 처리
                }
                else
                {
                    sQuery += " INSERT INTO POSLOG..TR_SALE_JOURNAL ( ";
                    sQuery += " CMP_CD, STOR_CD, SALE_DT, POS_NO, TRADE_NO, TRADE_DIV, TRAIN_MODE_YN, TRADE_KINDPER, SYS_DT, ";
                    sQuery += " SYS_TIME, PIC_NO, BILL_AMT, JOURNAL_DATA, SEND_YN, REG_DATE, UPD_DATE ";

                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start
                    // 추가
                    sQuery += " ,HPC_SAVE_APPR_DT, HPC_SAVE_APPR_NO ,HPC_USE_APPR_DT, HPC_USE_APPR_NO";
                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end

                    sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";

                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start
                    // 기존
                    //sQuery += " '{10}','{11}', '{12}', N'{13}', '{14}', '{15}' )";
                    //변경
                    sQuery += " '{10}','{11}', '{12}', N'{13}', '{14}', '{15}' ";
                    sQuery += ", '{16}','{17}' , '{18}','{19}' ";
                    sQuery += " )";
                    //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end

                    //#20180131 인천공항 통합POS 사용유무가 사용이면 SEND_YN을 A로 설정 start
                    //TR_SALE_HEADER, TR_SALE_JOURNAL
                    //기존
                    /*
                    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.PayHms      // SYS_TIME
                        , m_cTrnStatus.Head.CashierId   // PIC_NO
                        , m_cTrnStatus.Head.NetSaleAmt    // BILL_AMT
                        , sJnlData
                        , "0", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));
                    */
                    //변경

                    if (PosMstManager.GetPosOption(POS_OPTION.OPT512) == "1"
                        //grayber@20180228 [BRKR] 인천공항 SEND_YN 매출전송유무 'A' 제거 start
                        && m_cPosStatus.Mst.CorpDiv.Equals(ItemConst.CORP_DIV.BR) != true
                        //grayber@20180228 [BRKR] 인천공항 SEND_YN 매출전송유무 'A' 제거 end
                        )
                    {
                        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.PayHms      // SYS_TIME
                            , m_cTrnStatus.Head.CashierId   // PIC_NO
                            , m_cTrnStatus.Head.NetSaleAmt    // BILL_AMT
                            , sJnlData
                            //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start
                            // 기존
                            //, "A", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));
                            // 변경
                            , "A", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss")
                            , sHPC_SAVE_APPR_DT
                            , sHPC_SAVE_APPR_NO
                            , sHPC_USE_APPR_DT
                            , sHPC_USE_APPR_NO
                            );
                        //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end


                    }
                    else
                    {
                        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.PayHms      // SYS_TIME
                            , m_cTrnStatus.Head.CashierId   // PIC_NO
                            , m_cTrnStatus.Head.NetSaleAmt    // BILL_AMT
                            , sJnlData
                            //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 start
                            // 기존
                            //, "0", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));
                            // 변경
                            , "0", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss")
                            , sHPC_SAVE_APPR_DT
                            , sHPC_SAVE_APPR_NO
                            , sHPC_USE_APPR_DT
                            , sHPC_USE_APPR_NO
                            );
                        //grayber@20180212 해피포인트 전자영수증 I/F 개선 #13924 end
                    }

                    //#20180131 인천공항 통합POS 사용유무가 사용이면 SEND_YN을 A로 설정 end

                    // 쿼리 로그, Rhee
                    if (m_cPosStatus.Base.CmpCd.ToUpper().Equals("PCCN"))
                    {
                        UserLog.WriteLogFile(UserCom.LOG_OP, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "@@SaveJnlExecute=" + sQuery);
                    }
                }
                m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource, m_cPosStatus.Base.LocalDbCatalog, m_cPosStatus.Base.LocalDbUserID, m_cPosStatus.Base.LocalDbPassword);

                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);
            }
            return sRet;
        }


        /// <summary>
        /// 저널데이터 저장 - 서버에서 조회 (복구용)
        /// </summary>
        /// <param name="aParam"></param>
        /// <returns></returns>
        public string SaveJnlDataExecute(string[] aParam)
        {
            string sJnlData = "";
            string sRet = UserCom.RST_ERR;

            try
            {
                // 저널데이터 획득
                sJnlData = aParam[0];

                // 저널데이터 저장
                string sQuery = "";

                if (m_cDataCommon.TradeNoAddCheck("") == false)
                {
                    //string sRegNo = string.Empty;
                    //DataTable dt = null;

                    //sQuery = " SELECT ISNULL(MAX(REG_NO),0) AS REG_NO ";
                    //sQuery += " FROM POSLOG..ETC_SALE_HEADER ";
                    //sQuery += " WHERE 1 = 1 ";
                    //sQuery += "   AND CMP_CD = '" + m_cPosStatus.Base.CmpCd + "'";
                    //sQuery += "   AND SALE_DT = '" + m_cPosStatus.Base.SaleDate + "'";
                    //sQuery += "   AND STOR_CD = '" + m_cPosStatus.Base.StoreNo + "'";
                    //sQuery += "   AND POS_NO = '" + m_cPosStatus.Base.PosNo + "'";

                    //int iRet = m_cSqlDbService.DBSelect(sQuery, out dt);

                    //sRegNo = dt.Rows[0]["REG_NO"].ToString();

                    sQuery += " INSERT INTO POSLOG..ETC_SALE_JOURNAL ( ";
                    sQuery += " CMP_CD, STOR_CD, SALE_DT, POS_NO, REG_NO, TRADE_NO, TRADE_DIV, TRAIN_MODE_YN, TRADE_KINDPER, SYS_DT, ";
                    sQuery += " SYS_TIME, PIC_NO, BILL_AMT, JOURNAL_DATA, SEND_YN, REG_DATE, UPD_DATE ";
                    sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";
                    sQuery += " '{10}','{11}', '{12}', N'{13}', '{14}', '{15}', '{16}' )";

                    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.PayHms      // SYS_TIME
                        , m_cTrnStatus.Head.CashierId   // PIC_NO
                        , m_cTrnStatus.Head.NetSaleAmt    // BILL_AMT
                        , sJnlData
                        , "1", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));
                }
                else
                {
                    sQuery += " INSERT INTO POSLOG..TR_SALE_JOURNAL ( ";
                    sQuery += " CMP_CD, STOR_CD, SALE_DT, POS_NO, TRADE_NO, TRADE_DIV, TRAIN_MODE_YN, TRADE_KINDPER, SYS_DT, ";
                    sQuery += " SYS_TIME, PIC_NO, BILL_AMT, JOURNAL_DATA, SEND_YN, REG_DATE, UPD_DATE ";
                    sQuery += " ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}' , '{9}', ";
                    sQuery += " '{10}','{11}', '{12}', N'{13}', '{14}', '{15}' )";

                    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.PayHms      // SYS_TIME
                        , m_cTrnStatus.Head.CashierId   // PIC_NO
                        , m_cTrnStatus.Head.NetSaleAmt    // BILL_AMT
                        , sJnlData
                        , "1", DateTime.Now.ToString("yyyyMMddHHmmss"), DateTime.Now.ToString("yyyyMMddHHmmss"));

                    // 쿼리 로그, Rhee
                    if (m_cPosStatus.Base.CmpCd.ToUpper().Equals("PCCN"))
                    {
                        UserLog.WriteLogFile(UserCom.LOG_OP, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                                        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", "@@SaveJnlDataExecute=" + sQuery);
                    }
                }
                m_cSqlDbService.SetDBConnectionString(m_cPosStatus.Base.LocalDbSource, m_cPosStatus.Base.LocalDbCatalog, m_cPosStatus.Base.LocalDbUserID, m_cPosStatus.Base.LocalDbPassword);

                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);
            }
            return sRet;
        }

        /// <summary>
        /// 명판 및 영수증 메시지 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="sPrtLoc">BILL_PRT_LOC</param>
        public bool SetStampGuidePrintData(string sPrtID, string sPrtLoc)
        {
            string sQuery = "";
            try
            {
                if (sPrtLoc == PosConst.BILL_PRT_LOC.STAMP)
                {
                    // 명판 생성
                    if (m_cPosStatus.Mst.CntryDiv == ItemConst.CNTRY_DIV.CN)
                    {
                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, m_cPosStatus.Mst.StorName);
                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, "Tel:" + m_cPosStatus.Mst.StorTelNo);
                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, m_cPosStatus.Mst.StorAddr);
                    }
                    else
                    {
                        //#15274 영수증 문구 추가 요청 start
                        if (m_cPosStatus.Mst.CompNm.Trim() != "")
                        {
                            AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, m_cPosStatus.Mst.CompNm);
                        }
                        //#15274 영수증 문구 추가 요청 end

                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, m_cPosStatus.Mst.StorName);
                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, m_cPosStatus.Mst.StorBizPsnNo + " Tel:" + m_cPosStatus.Mst.StorTelNo + " " + m_cPosStatus.Mst.StorOwnName);
                        AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, m_cPosStatus.Mst.StorAddr);
                    }
                    AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");

                    return true;
                }

                if (m_dtMstBillMsg == null)
                {
                    sQuery += " SELECT * FROM POSMST..MST_BILL_MSG ";
                    sQuery += " WHERE CMP_CD       = '" + m_cPosStatus.Base.CmpCd + "'";
                    sQuery += "   AND STOR_CD      = '" + m_cPosStatus.Base.StoreNo + "'";
                    sQuery += "   AND '" + m_cPosStatus.Base.SaleDate + "' BETWEEN PRT_START_DT AND PRT_FNSH_DT ";
                    sQuery += "   AND USE_YN  = '" + PosConst.MST_USE_YN.YES + "'";
                    // 기존
                    //sQuery += " ORDER BY 1, 2, 3, 4, 5";
                    // 변경
                    sQuery += " ORDER BY  3, 4, 5";

                    m_dtMstBillMsg = m_cMstService.Select(new string[] { sQuery });
                }
                if (m_dtMstBillMsg == null || m_dtMstBillMsg.Rows.Count == 0) return false;

                bool bExist = false;
                string sWriteDiv = "1"; // 작성자별 영수증 메시지 출력(1:본사, 2:팀, 3:점포)
                for (int i = 0; i < 3; i++)
                {
                    // 영수증 메시지 출력 우선순위 		CHAR	1	1:본부/팀/매장, 2:매장/팀/본부
                    if (i == 0)
                        sWriteDiv = (m_cPosStatus.Mst.BillMsgDupPrtRank == "1") ? "1" : "3";
                    else if (i == 1)
                        sWriteDiv = "2";
                    else
                        sWriteDiv = (m_cPosStatus.Mst.BillMsgDupPrtRank == "1") ? "3" : "1";

                    foreach (DataRow dr in m_dtMstBillMsg.Rows)
                    {
                        if (CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.PRT_START_DT) == m_cPosStatus.Base.SaleDate
                            && CmUtil.IntParse(CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.PRT_START_HOUR)) > CmUtil.IntParse(DateTime.Now.ToString("HHmmss"))) continue;

                        if (CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.PRT_LOC) != sPrtLoc) continue;
                        if (CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.WRITE_DIV) != sWriteDiv) continue;


                        // 크기구분(0:보통, 1:굵게, 2:가로확대, 3:세로확대, 4:전체확대)
                        string sPrtHead = CmUtil.GetPrtMstToPrtHeadConst(CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.EXPAND_CHAR), CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.BOLD_YN));

                        if (CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.ALIGN_TYPE) == PosConst.PRT_ALIGN_TYPE.RIGHT)
                            AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F102, CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.CHAR_ROW));
                        else if (CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.ALIGN_TYPE) == PosConst.PRT_ALIGN_TYPE.CENTER)
                            AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F103, CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.CHAR_ROW));
                        else
                            AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.CHAR_ROW));

                        bExist = true;
                    }
                    // 영수증 메시지 중복 허용 여부(1:미허용, 1:중복)
                    if (bExist == true && m_cPosStatus.Mst.BillMsgDupPrmtYn == "0") break;
                }

                if (bExist == true) AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");

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

        /// <summary>
        /// 설문참여 메시지 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        public bool SetVotePrintData(string sPrtID)
        {
            string sQuery = "";
            try
            {
                if (m_dtMstVoteMsg == null)
                {
                    sQuery += " SELECT * FROM POSMST..MST_SALESORG_SURVY_MSG ";
                    sQuery += " WHERE CMP_CD       = '" + m_cPosStatus.Base.CmpCd + "'";
                    sQuery += "   AND STOR_CD      = '" + m_cPosStatus.Base.StoreNo + "'";
                    sQuery += "   AND '" + m_cPosStatus.Base.SaleDate + "' BETWEEN APPLY_START_DT AND APPLY_FNSH_DT ";
                    sQuery += "   AND USE_YN  = '" + PosConst.MST_USE_YN.YES + "'";
                    sQuery += " ORDER BY APPLY_START_DT, PRT_SEQ";

                    m_dtMstVoteMsg = m_cMstService.Select(new string[] { sQuery });
                }
                if (m_dtMstVoteMsg == null || m_dtMstVoteMsg.Rows.Count == 0) return false;

                bool bExist = false, bVoteNoPrint = false;
                for (int i = 0; i < m_dtMstVoteMsg.Rows.Count; i++)
                {
                    DataRow dr = m_dtMstVoteMsg.Rows[i];

                    if (CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.APLY_START_DT) == m_cPosStatus.Base.SaleDate
                        && CmUtil.IntParse(CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.APPLY_START_HOUR)) > CmUtil.IntParse(DateTime.Now.ToString("HHmmss"))) continue;

                    string sDow = CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.DOW);
                    if (sDow.Length >= 7)
                    {
                        DateTime dt = new DateTime(int.Parse(m_cPosStatus.Base.SaleDate.Substring(0, 4)), int.Parse(m_cPosStatus.Base.SaleDate.Substring(4, 2)), int.Parse(m_cPosStatus.Base.SaleDate.Substring(6, 2)));

                        if (sDow.Substring((int)dt.DayOfWeek, 1) == "0") continue;
                    }

                    // 크기구분(0:보통, 1:굵게, 2:가로확대, 3:세로확대, 4:전체확대)
                    string sPrtHead = CmUtil.GetPrtMstToPrtHeadConst(CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.PRT_EXPAND_TYPE)
                                                                   , CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.BOLD_YN));

                    string sPrtData = CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.MSG_VAL);
                    if (sPrtData.StartsWith("참여코드") == true || sPrtData.StartsWith("참여 코드") == true
                        || sPrtData.StartsWith("설문참여코드") == true || sPrtData.StartsWith("설문 참여 코드") == true)
                    {
                        sPrtData += GetVoteNoPrintData();     // 설문 참여코드 생성
                        bVoteNoPrint = true;
                    }
                    if (i >= m_dtMstVoteMsg.Rows.Count - 1 && bVoteNoPrint == false)
                    {
                        if (sPrtData.Length <= 20)
                        {
                            sPrtData += GetVoteNoPrintData();          // 마지막 행에 설문 참여코드 생성
                        }
                        else
                        {
                            if (CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.ALIGN_TYPE) == PosConst.PRT_ALIGN_TYPE.RIGHT)
                                AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F102, sPrtData);
                            else if (CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.ALIGN_TYPE) == PosConst.PRT_ALIGN_TYPE.CENTER)
                                AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F103, sPrtData);
                            else
                                AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, sPrtData);

                            sPrtData = GetVoteNoPrintData();          // 마지막 행에 설문 참여코드 생성
                        }
                    }

                    if (CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.ALIGN_TYPE) == PosConst.PRT_ALIGN_TYPE.RIGHT)
                        AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F102, sPrtData);
                    else if (CmUtil.GetDataRowStr(dr, PosMst.MST_SALESORG_SURVY_MSG.DATA.ALIGN_TYPE) == PosConst.PRT_ALIGN_TYPE.CENTER)
                        AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F103, sPrtData);
                    else
                        AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, sPrtData);

                    bExist = true;
                }

                if (bExist == true) AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");

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

        /// <summary>
        /// 설문참여코드 생성
        /// </summary>
        /// <returns></returns>
        public string GetVoteNoPrintData()
        {
            string sVoteNo = "";
            try
            {
                string sStoreCd = m_cPosStatus.Base.StoreNo.PadLeft(7, '0').ToUpper();                          // 점포코드 7자리로 패딩(대문자로변환)
                string sBillNo = m_cPosStatus.Base.TradeNo.Substring(m_cPosStatus.Base.TradeNo.Length - 3, 3);  // 영수증번호 끝 3자리
                string sPosNo = m_cPosStatus.Base.PosNo.Substring(m_cPosStatus.Base.PosNo.Length - 1, 1);       // POS번호 끝 1자리
                string sSaleDate = m_cPosStatus.Base.SaleDate;

                // 체크 디지트 계산( 각 자리 별 값 곱함[234569812678957]
                int nCheckDigit =
                    (CmUtil.IntParse(sSaleDate.Substring(7, 1)) * 2) + // 1. 구매일자 2번째 자리 수
                    (CmUtil.IntParse(sSaleDate.Substring(6, 1)) * 3) + // 2. 구매일자 1번째 자리 수
                    ((CmUtil.IntParse(sBillNo.Substring(2, 1)) + 3) * 4) + // 3. 영수증 번호 3번째 자리 수 + 3 : 16진법으로
                    (GetCharToInt(sStoreCd.Substring(4, 1)) * 5) + // 4. 점포코드 5번째 자리 수
                    ((CmUtil.IntParse(sBillNo.Substring(0, 1)) + 6) * 6) + // 5. 영수증 번호 1번째 자리 수 + 6 : 16진법으로
                    (GetCharToInt(sStoreCd.Substring(5, 1)) * 9) + // 6. 점포코드 6번째 자리 수
                    (CmUtil.IntParse(sSaleDate.Substring(2, 1)) * 8) + // 7. 구매년도 1번째 자리 수
                    (CmUtil.IntParse(sSaleDate.Substring(3, 1)) * 1) + // 8. 구매년도 2번째 자리 수
                    (GetCharToInt(sStoreCd.Substring(3, 1)) * 2) + // 9. 점포코드 4번째 자리 수
                    ((CmUtil.IntParse(sBillNo.Substring(1, 1)) + 1) * 6) + //10. 영수증 번호 2번째 자리 수 + 1 : 16진법으로
                    (GetCharToInt(sStoreCd.Substring(6, 1)) * 7) + //11. 점포코드 7번째 자리 수
                    (GetCharToInt(sStoreCd.Substring(2, 1)) * 8) + //13. 점포코드 3번째 자리 수
                    ((CmUtil.IntParse(sPosNo) + 4) * 9) + //14. 포스 번호 + 4 : 16진법으로
                    (CmUtil.IntParse(sSaleDate.Substring(5, 1)) * 5) + //15. 구매월 2번째 자리 수
                    (CmUtil.IntParse(sSaleDate.Substring(4, 1)) * 7);  //17. 구매월 1번째 자리 수

                nCheckDigit = nCheckDigit % 10;         // 합계를 10로 나누어 나머지를 구한다.
                nCheckDigit = 15 - nCheckDigit;         // 15에서 나머지 값을 뺀 값을 최종 Check Digit로 정한다.

                sVoteNo = sSaleDate.Substring(7, 1) + // 1. 구매일자 2번째 자리 수
                    sSaleDate.Substring(6, 1) + // 2. 구매일자 1번째 자리 수
                    GetIntToHex(CmUtil.IntParse(sBillNo.Substring(2, 1)) + 3) + // 3. 영수증 번호 3번째 자리 수 + 3 : 16진법으로
                    sStoreCd.Substring(4, 1) + '-' + // 4. 점포코드 5번째 자리 수
                    GetIntToHex(CmUtil.IntParse(sBillNo.Substring(0, 1)) + 6) + // 5. 영수증 번호 1번째 자리 수 + 6 : 16진법으로
                    sStoreCd.Substring(5, 1) + // 6. 점포코드 6번째 자리 수
                    sSaleDate.Substring(2, 1) + // 7. 구매년도 1번째 자리 수
                    sSaleDate.Substring(3, 1) + '-' + // 8. 구매년도 2번째 자리 수
                    sStoreCd.Substring(3, 1) + // 9. 점포코드 4번째 자리 수
                    GetIntToHex(CmUtil.IntParse(sBillNo.Substring(1, 1)) + 1) + //10. 영수증 번호 2번째 자리 수 + 1 : 16진법으로
                    sStoreCd.Substring(6, 1) + //11. 점포코드 7번째 자리 수
                    GetIntToHex(nCheckDigit) + '-' + //12. CHECK DIGIT : 16진법으로
                    sStoreCd.Substring(2, 1) + //13. 점포코드 3번째 자리 수
                    GetIntToHex(CmUtil.IntParse(sPosNo) + 4) + //14. 포스 번호 + 4 : 16진법으로
                    sSaleDate.Substring(5, 1) + //15. 구매월 2번째 자리 수
                                                //영수증설문조사 오류 수정(20170508-조충연K)
                                                //m_cPosStatus.Base.BrandCd.Substring(0, 1)                 + //16. 회사코드 (P: PC, B: BRK, S:SL)
                    m_cPosStatus.Base.CmpCd.Substring(0, 1) + //16. 회사코드 (P: PC, B: BRK, S:SL)
                    sSaleDate.Substring(4, 1);                                  //17. 구매월 1번째 자리 수
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sVoteNo;
        }

        //#해피앱 추후적립 start, sskim
        /// <summary>
        /// 해피앱 추후적립 안내 메세지 출력
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        public bool SetHpAppAfterSavePrint(string sPrtID)
        {
            try
            {
                if (m_cTrnStatus.Head.AftSavePoint > 0)
                {
                    string sPrtHead = CmUtil.GetPrtMstToPrtHeadConst("0", "0");

                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, "★ 해피앱 영수증적립 서비스 안내");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, "   해피앱에서 영수증으로 포인트 적립");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, "   받으세요~");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, " ");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, "*  적립방법");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, "   해피앱 -> 포인트 거래내역(My포인트) ->");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, "   바코드 스캔 배너 -> 영수증 하단 바코드");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, "   스캔 -> 포인트 적립");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, " ");
                    AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, "(거래시간 기준 24시간내, 매장당 1일 1회)");
                    AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F100, "-");
                }

                return true;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return false;
        }
        //#해피앱 추후적립 end, sskim

        //grayber@20171214 캠페인 리펀드 쿠폰 start
        /// <summary>
        /// 캠페인 리펀드 메시지 출력 ( 상단부 Hard Coding )
        /// </summary>
        /// <param name="sPrtID"></param>
        /// <returns></returns>
        public bool SetCpiRefundPrint(string sPrtID)
        {
            bool bRes = false;

            try
            {
                if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.REFUND) return bRes;

                // 영수 캠페인 출력 데이터 설정
                ICampaignUs cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
                ArrayList alPrtBuf = cCampaingMain.GetRefundCampaignPrintData(new string[] { });

                // 캠페인 출력 데이터가 없으면 return;
                if (alPrtBuf == null || alPrtBuf.Count <= 0) return bRes;

                // 메시지 처리 (HARD Coding)
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, "★★★★★★★★★★★★★★★★★★★★★");
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, " ");
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_BLD, PosConst.PRT_FMT.F101, "   ＊ 쿠폰금액 : " + CmUtil.MathRounds(CmUtil.DoubleDivision(m_cTrnStatus.Head.NetSaleAmt, 2), PosConst.MATH_ROUND.TRANCATE, -3).ToString("#,##0") + "원");
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_BLD, PosConst.PRT_FMT.F101, "   ＊ 점 포 명 : " + m_cPosStatus.Mst.StorName);
                AddPrintData(sPrtID, PosConst.PRT_HDR.PRT_NOR, PosConst.PRT_FMT.F101, " ");

                foreach (string sPrtData in alPrtBuf)
                {
                    AddPrintData(sPrtID, sPrtData);
                }

                bRes = true;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return bRes;
        }
        //grayber@20171214 캠페인 리펀드 쿠폰 end


        /// <summary>
        /// 코드 숫자 변환(설문조사)
        /// </summary>
        /// <returns></returns>
        public int GetCharToInt(string sStr)
        {
            int nRet = 0;
            try
            {
                if (sStr == "") return nRet;

                if (CmUtil.IsNumber(sStr.Substring(0, 1)) == true)
                {
                    nRet = CmUtil.IntParse(sStr.Substring(0, 1));
                }
                else
                {
                    nRet = Convert.ToChar(sStr.Substring(0, 1));
                    nRet -= 55;
                }
            }
            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 nRet;
        }

        /// <summary>
        /// 숫자 HEX 변환(설문조사)
        /// </summary>
        /// <returns></returns>
        public string GetIntToHex(int nNum)
        {
            string sRet = "";
            try
            {
                sRet = string.Format("{0:X}", nNum);
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }

        /// <summary>
        /// 영수증 유형 마스터 로딩 처리
        /// </summary>
        /// <returns></returns>
        public bool LoadBillTypeMaster()
        {
            string sQuery = "";
            try
            {
                if (m_dtMstBillType == null)
                {
                    sQuery += " SELECT * FROM POSMST..MST_BILL_TYPE ";
                    sQuery += " WHERE CMP_CD       = '" + m_cPosStatus.Base.CmpCd + "'";
                    sQuery += "   AND STOR_CD      = '" + m_cPosStatus.Base.StoreNo + "'";
                    sQuery += "   AND BILL_TYPE_GRP_CD = '" + CmUtil.GetDataRowStr(PosMstManager.GetMstPos(), PosMst.MST_POS.DATA.BILL_TYPEGRP) + "'";
                    sQuery += "   AND USE_YN  = '" + PosConst.MST_USE_YN.YES + "'";
                    sQuery += " ORDER BY 1, 2, 3, 4, 5";

                    m_dtMstBillType = m_cMstService.Select(new string[] { sQuery });
                }
                if (m_dtMstBillType == null || m_dtMstBillType.Rows.Count == 0) return false;

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

        /// <summary>
        /// 영수증유형마스터로 상/하단 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="sBillTypeDiv">BILL_TYPE_DIV</param>
        public bool SetBillTypeTopBtmPrintData(string sPrtID, string sBillTypeDiv)
        {
            try
            {
                // 영수증 유형 마스터 로딩 처리
                if (LoadBillTypeMaster() == false) return false;

                string sCashierName = m_cPosStatus.Base.CashierName;        // 판매원명
                if (m_cTrnStatus.Head.CashierId != m_cPosStatus.Base.CashierNo) sCashierName = GetCashierName(m_cTrnStatus.Head.CashierId);

                // 2019-04-16 - 1997fx11 : 영수증 캐셔명 인쇄 
                if (string.IsNullOrEmpty(m_cTrnStatus.Head.CashierId)) { sCashierName = "KIOSK"; }

                string sOrderName = m_cTrnStatus.Head.OrderPicNm;           // 담당자명
                if (m_cTrnStatus.Head.OrderPicNo.Trim() != "" && m_cTrnStatus.Head.OrderPicNm.Trim() == "") sOrderName = GetCashierName(m_cTrnStatus.Head.OrderPicNo.Trim());

                foreach (DataRow dr in m_dtMstBillType.Rows)
                {
                    if (CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_TYPE.DATA.BILL_TYPE_DIV) != sBillTypeDiv) continue;

                    string sPrtData = CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_TYPE.DATA.BILL_TYPE_TAG);

                    //점포코드
                    sPrtData = sPrtData.Replace("<STORECODE>", m_cPosStatus.Base.StoreNo);
                    //시스템일자
                    sPrtData = sPrtData.Replace("<SYSTEMDATE>", m_cPosStatus.Global.DateToCulture(m_cTrnStatus.Head.SysYmd));
                    //시스템시간
                    sPrtData = sPrtData.Replace("<SYSTEMTIME>", CmUtil.StrToTime(m_cTrnStatus.Head.PayHms));
                    //영업일자
                    sPrtData = sPrtData.Replace("<SALEDATE>", m_cPosStatus.Global.DateToCulture(m_cTrnStatus.Head.SaleDate));
                    //포스번호
                    sPrtData = sPrtData.Replace("<POSNO>", m_cTrnStatus.Head.PosNo);
                    //판매원번호
                    sPrtData = sPrtData.Replace("<CASHIERNO>", m_cTrnStatus.Head.CashierId);
                    //판매원명
                    sPrtData = sPrtData.Replace("<CASHIERNAME>", sCashierName);  // 2019-04-16 - 1997fx11 : 영수증 캐셔명 인쇄
                    //층코드
                    sPrtData = sPrtData.Replace("<FLOORNO>", m_cTrnStatus.Head.FloorCd);
                    //층명
                    sPrtData = sPrtData.Replace("<FLOORNM>", m_cTrnStatus.Head.FloorNm);
                    //테이블코드
                    sPrtData = sPrtData.Replace("<TABLENO>", m_cTrnStatus.Head.TableNo);
                    //테이블명
                    sPrtData = sPrtData.Replace("<TABLENM>", m_cTrnStatus.Head.TableNm);
                    //객층
                    sPrtData = sPrtData.Replace("<CUSTAGE>", m_cTrnStatus.Head.CustFloor);
                    //고객수
                    sPrtData = sPrtData.Replace("<CUSTCOUNT>", m_cTrnStatus.Head.CustCnt.ToString());
                    //거래번호
                    sPrtData = sPrtData.Replace("<RECEIPTNO>", m_cTrnStatus.Head.TradeNo);
                    //주문자 사번
                    sPrtData = sPrtData.Replace("<ORDERNO>", m_cTrnStatus.Head.OrderPicNo);
                    //주문자 사명
                    sPrtData = sPrtData.Replace("<ORDERNAME>", sOrderName);
                    //주문시간
                    sPrtData = sPrtData.Replace("<ORDERTIME>", CmUtil.StrToTime(m_cTrnStatus.Head.OrderHms));
                    //주문번호
                    sPrtData = sPrtData.Replace("<ORDERNO>", m_cTrnStatus.Head.OrderNo);

                    // 크기구분(0:보통, 1:굵게, 2:가로확대, 3:세로확대, 4:전체확대)
                    string sPrtHead = CmUtil.GetPrtMstToPrtHeadConst(CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.EXPAND_CHAR), CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_MSG.DATA.BOLD_YN));

                    string sSortDiv = CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_TYPE.DATA.SORT_DIV);
                    if (sSortDiv == PosConst.PRT_ALIGN_TYPE.RIGHT)
                        AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F102, sPrtData);
                    else if (sSortDiv == PosConst.PRT_ALIGN_TYPE.CENTER)
                        AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F103, sPrtData);
                    else
                        AddPrintData(sPrtID, sPrtHead, PosConst.PRT_FMT.F101, sPrtData);
                }
                return true;
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return false;
        }

        /// <summary>
        /// 영수증유형 결제정보 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID"></param>
        /// <param name="sTypeDiv"></param>
        /// <param name="alPrtTagData"></param>
        public void SetBillTypePaymentPrintData(string sPrtID, string sTypeDiv, ArrayList alPrtTagData)
        {
            string sPrtData = "", sData1 = "", sData2 = "";

            try
            {
                // 영수증 유형 마스터 로딩 처리
                if (LoadBillTypeMaster() == false) return;

                foreach (DataRow dr in m_dtMstBillType.Rows)
                {
                    if (CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_TYPE.DATA.BILL_TYPE_DIV) != sTypeDiv) continue;

                    // 크기구분(0:보통, 1:굵게, 2:가로확대, 3:세로확대, 4:전체확대)
                    string sPrtHead = CmUtil.GetPrtMstToPrtHeadConst(CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_TYPE.DATA.SIZE_DIV), CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_TYPE.DATA.BOLD_YN));
                    // 정렬구분
                    string sSortDiv = CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_TYPE.DATA.SORT_DIV);
                    // 태그유형
                    string sTagData = CmUtil.GetDataRowStr(dr, PosMst.MST_BILL_TYPE.DATA.BILL_TYPE_TAG);

                    sData1 = ""; sData2 = "";
                    bool bExist = false;
                    foreach (string[] aTagData in alPrtTagData)
                    {
                        if (sPrtData.IndexOf(aTagData[0]) >= 0)              //태그유형
                        {
                            sData1 = aTagData[1];
                            sData2 = aTagData[2];
                            bExist = true;
                        }
                    }
                    if (bExist == true)
                    {
                        if (sData2 == "") continue;
                    }
                    else sData2 = sTagData;

                    SetBillTypePaymentPrintData(sPrtID, sPrtHead, sSortDiv, sData1.Trim() + (sData1.Length == 0 ? "" : " "), sData2.Trim());
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }
        public void SetBillTypePaymentPrintData(string sPrtID, string sPrtHead, string sSortDiv, string sData1, string sData2)
        {
            string sPrtData = "";
            try
            {
                int nFullLen = 42;
                if (sPrtHead == PosConst.PRT_HDR.PRT_HOR || sPrtHead == PosConst.PRT_HDR.PRT_BIG) nFullLen = 42 / 2;   //가로확대, 두배확대
                int nHalfLen = nFullLen / 2;

                switch (sSortDiv)
                {
                    case PosConst.PRT_ALIGN_TYPE.RIGHT: //오른쪽
                        if (UsUtil.LenH(sData1.Trim()) + UsUtil.LenH(sData2.Trim()) >= nFullLen)
                        {
                            sPrtData = sData1.Trim() + sData2.Trim();
                        }
                        else
                        {
                            sPrtData = sData1.Trim() + CmUtil.LPadH(sData2, nFullLen - UsUtil.LenH(sData1.Trim()));
                        }
                        AddPrintData(sPrtID, sPrtHead, UsUtil.LPadH(sPrtData.TrimStart(), nFullLen));
                        break;
                    case PosConst.PRT_ALIGN_TYPE.CENTER: //가운데
                        sPrtData = sData1.Trim() + sData2.Trim();
                        if (UsUtil.LenH(sPrtData) < nFullLen)
                            AddPrintData(sPrtID, sPrtHead, UsUtil.LPadH("", nHalfLen - (UsUtil.LenH(sPrtData) / 2)) + UsUtil.RPadH(sPrtData, nFullLen - (nHalfLen - (UsUtil.LenH(sPrtData) / 2))));
                        else
                            AddPrintData(sPrtID, sPrtHead, UsUtil.LPadH(sPrtData.Trim(), nFullLen));
                        break;
                    default: //왼쪽
                        sPrtData = sData1.Trim() + sData2.Trim();
                        AddPrintData(sPrtID, sPrtHead, UsUtil.RPadH(sPrtData.TrimEnd(), nFullLen));
                        break;
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 영수증 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="sPrtHead">출력형태(PosConst.PRT_HDR)</param>
        /// <param name="sPrtData"></param>
        public void AddPrintData(string sPrtID, string sPrtHead, string sPrtData)
        {
            try
            {
                sPrtData = ((sPrtData.Length == 0) ? " " : sPrtData);

                switch (sPrtID)
                {
                    case PosConst.PRT_ITEM.ETC:
                    case PosConst.PRT_ITEM.ETC_TEMP:
                        m_aEtcPrintBuf.Add(CmUtil.RPadH(sPrtID, 1) + sPrtHead + sPrtData);
                        break;
                    default:
                        m_aRecPrintBuf.Add(CmUtil.RPadH(sPrtID, 1) + sPrtHead + sPrtData);
                        break;
                }
                m_aPrintBuf.Add(CmUtil.RPadH(sPrtID, 1) + sPrtHead + sPrtData);
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        public void AddPrintData(string sPrtID, string sPrtData)
        {
            try
            {
                sPrtData = ((sPrtData.Length == 0) ? " " : sPrtData);

                switch (sPrtID)
                {
                    case PosConst.PRT_ITEM.ETC:
                        m_aEtcPrintBuf.Add(CmUtil.RPadH(sPrtID, 1) + sPrtData);
                        break;
                    default:
                        m_aRecPrintBuf.Add(CmUtil.RPadH(sPrtID, 1) + sPrtData);
                        break;
                }
                m_aPrintBuf.Add(CmUtil.RPadH(sPrtID, 1) + sPrtData);
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 영수증 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="sPrtHead">출력형태(PosConst.PRT_HDR)</param>
        /// <param name="sPrtFmt">출력포멧(PosConst.PRT_FMT)</param>
        /// <param name="sData"></param>
        public void AddPrintData(string sPrtID, string sPrtHead, string sPrtFmt, string sData)
        {
            try
            {
                string sPrtData = "";
                if (sPrtFmt == PosConst.PRT_FMT.F100 && (sData == "-" || sData == "="))    // 선귿기
                {
                    //#20170822 영수증 선귿기 실선('─') -> 점선('-')으로 변경 start
                    //기존
                    /*
                    if (sPrtHead == PosConst.PRT_HDR.PRT_BLD)
                        for (int i = 1; i <= 21; i++) sPrtData += "━";
                    else
                        for (int i = 1; i <= 21; i++) sPrtData += "─";
                    */
                    //변경
                    if (sPrtHead == PosConst.PRT_HDR.PRT_BLD)
                        for (int i = 1; i <= 42; i++) sPrtData += "-";
                    else
                        for (int i = 1; i <= 42; i++) sPrtData += "-";
                    //#20170822 영수증 선귿기 실선('─') -> 점선('-')으로 변경 end
                }
                else if (sPrtFmt == PosConst.PRT_FMT.F100)               // 선귿기
                {
                    for (int i = 1; i <= 42; i++) sPrtData += sData;
                }
                else if (sPrtFmt == PosConst.PRT_FMT.F101)          // 왼쪽정렬
                {
                    sPrtData = sData;
                }
                else if (sPrtFmt == PosConst.PRT_FMT.F102)          // 오른쪽 정렬
                {
                    sPrtData = CmUtil.LPadH(sData, 42);
                }
                else if (sPrtFmt == PosConst.PRT_FMT.F103)          // 중앙정렬
                {
                    if (sPrtHead == PosConst.PRT_HDR.PRT_HOR || sPrtHead == PosConst.PRT_HDR.PRT_BIG || sPrtHead == PosConst.PRT_HDR.PRT_HRB || sPrtHead == PosConst.PRT_HDR.PRT_BGB)
                    {
                        if (CmUtil.LenH(sData) <= 21) sPrtData = CmUtil.LPadH("", 10 - (CmUtil.LenH(sData) / 2)) + sData;
                    }
                    else
                    {
                        if (CmUtil.LenH(sData) <= 42) sPrtData = CmUtil.LPadH("", 21 - (CmUtil.LenH(sData) / 2)) + sData;
                    }
                }
                else
                {
                    sPrtData = sData;
                }
                AddPrintData(sPrtID, sPrtHead, sPrtData);

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

        /// <summary>
        /// 영수증 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="sPrtHead">출력형태(PosConst.PRT_HDR)</param>
        /// <param name="sPrtFmt">출력포멧(PosConst.PRT_FMT)</param>
        /// <param name="sData1"></param>
        public void AddPrintData(string sPrtID, string sPrtHead, string sPrtFmt, string sData1, string sData2)
        {
            string sPrtData = "";
            try
            {
                if (sPrtFmt == PosConst.PRT_FMT.F200)               // 명(31)+금액(11)
                {
                    if (sPrtHead == PosConst.PRT_HDR.PRT_HOR || sPrtHead == PosConst.PRT_HDR.PRT_BIG)
                    {
                        sPrtData = CmUtil.RPadH(sData1, 10) + CmUtil.LPadH(sData2, 11);
                    }
                    else
                    {
                        sPrtData = CmUtil.RPadH(sData1, 31) + CmUtil.LPadH(sData2, 11);
                    }

                }
                if (sPrtFmt == PosConst.PRT_FMT.F201)               // 명(31)+금액(11)
                {
                    if (sPrtHead == PosConst.PRT_HDR.PRT_HOR || sPrtHead == PosConst.PRT_HDR.PRT_BIG)
                    {
                        sPrtData = CmUtil.LPadH(sData1, 10) + CmUtil.LPadH(sData2, 11);
                    }
                    else
                    {
                        sPrtData = CmUtil.LPadH(sData1, 31) + CmUtil.LPadH(sData2, 11);
                    }

                }
                else if (sPrtFmt == PosConst.PRT_FMT.F202)          //명(20)+데이터(22)
                {
                    sPrtData = CmUtil.RPadH(sData1, 20) + CmUtil.LPadH(sData2, 22);
                }
                else if (sPrtFmt == PosConst.PRT_FMT.F203)          //명(16)+데이터(26)
                {
                    sPrtData = CmUtil.RPadH(sData1, 11) + CmUtil.RPadH(sData2, 31);
                }
                else if (sPrtFmt == PosConst.PRT_FMT.F204)          //명(20)+데이터(22)
                {
                    sPrtData = CmUtil.RPadH(sData1, 20) + " " + CmUtil.RPadH(sData2, 21);
                }
                else if (sPrtFmt == PosConst.PRT_FMT.F205)          // 명(31-우정렬)+금액(11)
                {
                    sPrtData = CmUtil.LPadH(sData1, 31) + CmUtil.LPadH(sData2, 11);
                }
                else if (sPrtFmt == PosConst.PRT_FMT.F206)          // 명(20-우정렬)+금액(12)
                {
                    sPrtData = CmUtil.RPadH(sData1, 20) + CmUtil.LPadH(sData2, 12);
                }
                //#20171227, 예약증 양식 출력 Start
                else if (sPrtFmt == PosConst.PRT_FMT.F207)          // 명(16-우정렬)+데이터(26)
                {
                    sPrtData = CmUtil.RPadH(sData1, 16) + CmUtil.RPadH(sData2, 26);
                }
                //#20171227, 예약증 양식 출력 End

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

        /// <summary>
        /// 영수증 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="sPrtHead">출력형태(PosConst.PRT_HDR)</param>
        /// <param name="sPrtFmt">출력포멧(PosConst.PRT_FMT)</param>
        /// <param name="sData1"></param>
        public void AddPrintData(string sPrtID, string sPrtHead, string sPrtFmt, string sData1, string sData2, string sData3)
        {
            string sPrtData = "";
            try
            {
                if (sPrtFmt == PosConst.PRT_FMT.F300)               // 3개=>명LPAD(26)+수량(5)+금액(11)
                {
                    sPrtData = CmUtil.LPadH(sData1, 26) + CmUtil.LPadH(sData2, 5) + CmUtil.LPadH(sData3, 11);
                }
                if (sPrtFmt == PosConst.PRT_FMT.F301)               // 3개=>명RPAD(26)+수량(5)+금액(11)
                {
                    sPrtData = CmUtil.RPadH(sData1, 26) + CmUtil.LPadH(sData2, 5) + CmUtil.LPadH(sData3, 11);
                }
                if (sPrtFmt == PosConst.PRT_FMT.F302)               // 3개(카드/승인번호용)=>명RPAD(17)+명LPAD(9)+명LPAD(16)
                {
                    // 카드/승인번호
                    //Rhee, #2017/08/28 중국 카드번호 프린트 마킹예외처리 Start
                    // 기존
                    ////sPrtData = CmUtil.RPadH(sData1, 17) + CmUtil.LPadH(sData2, 9) + CmUtil.LPadH(sData3, 16);
                    // 변경
                    // 마킹된 카드번호 16자리 출력(1234********1234), 1라인은 42Byte
                    if (m_cPosStatus.Base.CmpCd.ToUpper().Equals("PCCN"))
                    {
                        sPrtData = CmUtil.RPadH(sData1, 17) + CmUtil.LPadH(sData2, 16) + CmUtil.LPadH(sData3, 9);
                    }
                    else
                    {
                        sPrtData = CmUtil.RPadH(sData1, 17) + CmUtil.LPadH(sData2, 9) + CmUtil.LPadH(sData3, 16);
                    }

                    //Rhee, #2017/08/28 중국 카드번호 프린트 마킹예외처리 End
                }
                if (sPrtFmt == PosConst.PRT_FMT.F303)               // 3개(카드/승인번호용)=>명RPAD(17)+명LPAD(9)+명LPAD(16) 2                 // 현금반품 내역 추가 20170830 goblin6
                {
                    sPrtData = CmUtil.RPadH(sData1, 23) + CmUtil.RPadH(sData2, 8) + CmUtil.LPadH(sData3, 11);
                }
                //#20171227, 예약증 양식 출력 Start
                if (sPrtFmt == PosConst.PRT_FMT.F304)               // 3개=>명RPAD(16)+데이터RPAD(9)+데이터RPAD(17) 
                {
                    sPrtData = CmUtil.RPadH(sData1, 16) + CmUtil.RPadH(sData2, 9) + CmUtil.RPadH(sData3, 17);
                }
                //#20171227, 예약증 양식 출력 End
                else if (sPrtFmt == PosConst.PRT_FMT.F103)          // 중앙정렬
                {
                    if (sPrtHead == PosConst.PRT_HDR.PRT_HOR || sPrtHead == PosConst.PRT_HDR.PRT_BIG)
                    {
                        if (CmUtil.LenH(sData1) <= 21) sPrtData = CmUtil.LPadH("", 10 - (CmUtil.LenH(sData1) / 2)) + sData1;
                    }
                    else
                    {
                        if (CmUtil.LenH(sData1) <= 42) sPrtData = CmUtil.LPadH("", 21 - (CmUtil.LenH(sData1) / 2)) + sData1;
                    }
                }

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

        /// <summary>
        /// 영수증 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="sPrtHead">출력형태(PosConst.PRT_HDR)</param>
        /// <param name="sPrtFmt">출력포멧(PosConst.PRT_FMT)</param>
        /// <param name="sData1"></param>
        public void AddPrintData(string sPrtID, string sPrtHead, string sPrtFmt, string sData1, string sData2, string sData3, string sData4)
        {
            string sPrtData = "";
            try
            {
                if (sPrtFmt == PosConst.PRT_FMT.F401)               // 명(16)+수량(5)+할인(10)+금액(11)
                {
                    sPrtData = CmUtil.RPadH(sData1, 16) + CmUtil.LPadH(sData2, 5) + CmUtil.LPadH(sData3, 10) + CmUtil.LPadH(sData4, 11);
                }
                if (sPrtFmt == PosConst.PRT_FMT.F402)               // 명(16)+수량(5)+할인(10)+금액(11)
                {
                    sPrtData = CmUtil.LPadH(sData1, 16) + CmUtil.LPadH(sData2, 5) + CmUtil.LPadH(sData3, 10) + CmUtil.LPadH(sData4, 11);
                }
                if (sPrtFmt == PosConst.PRT_FMT.F403)               // 명(우)(2)+수량(19)+할인(10)+금액(11)
                {
                    sPrtData = CmUtil.LPadH(sData1, 2) + CmUtil.LPadH(sData2, 19) + CmUtil.LPadH(sData3, 10) + CmUtil.LPadH(sData4, 11);
                }
                if (sPrtFmt == PosConst.PRT_FMT.F404)               // 명(우)(12)+수량(7)+명(우)(12)+금액(11)
                {
                    sPrtData = CmUtil.LPadH(sData1, 12) + CmUtil.LPadH(sData2, 7) + CmUtil.LPadH(sData3, 12) + CmUtil.LPadH(sData4, 11);
                }
                if (sPrtFmt == PosConst.PRT_FMT.F405)               // 명(좌)(10)+명(좌)(15)+명(좌)(10)+명(좌)(7)
                {
                    sPrtData = CmUtil.RPadH(sData1, 10) + CmUtil.RPadH(sData2, 15) + CmUtil.RPadH(sData3, 10) + CmUtil.RPadH(sData4, 7);
                }
                //#17142 [해피오더]POS로그인 시 영수증프린터로 장부재고 자동 출력 start
                if (sPrtFmt == PosConst.PRT_FMT.F406)               // 명(좌)(14)+명(좌)(10)+명(좌)(14)+명(좌)(4)
                {
                    sPrtData = CmUtil.RPadH(sData1, 14) + CmUtil.RPadH(sData2, 10) + CmUtil.RPadH(sData3, 14) + CmUtil.LPadH(sData4, 4);
                }
                //#17142 [해피오더]POS로그인 시 영수증프린터로 장부재고 자동 출력 end

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

        /// <summary>
        /// 영수증 출력데이터 생성
        /// </summary>
        /// <param name="sPrtID">0:본영수증, 9:기타영수증</param>
        /// <param name="sPrtHead">출력형태(PosConst.PRT_HDR)</param>
        /// <param name="sPrtFmt">출력포멧(PosConst.PRT_FMT)</param>
        /// <param name="sData1"></param>
        public void AddPrintData(string sPrtID, string sPrtHead, string sPrtFmt, string sData1, string sData2, string sData3, string sData4, string sData5)
        {
            string sPrtData = "";
            try
            {
                if (sPrtFmt == PosConst.PRT_FMT.F501)               // 수량(3)+명(좌)(16)+단가(10)+금액(11)+부가세코드(2) 
                {
                    sPrtData = CmUtil.LPadH(sData2, 3) + CmUtil.RPadH(sData1, 16) + CmUtil.LPadH(sData3, 10) + CmUtil.LPadH(sData4, 11) + CmUtil.LPadH(sData5, 2);
                }
                if (sPrtFmt == PosConst.PRT_FMT.F502)               // 과세코드(4)+과세율(11)+순매출액(9)+과세금액(9)+합계(9)
                {
                    sPrtData = CmUtil.RPadH(sData1, 4) + CmUtil.RPadH(sData2, 11) + CmUtil.LPadH(sData3, 9) + CmUtil.LPadH(sData4, 9) + CmUtil.LPadH(sData5, 9);
                }

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

        /// <summary>
        /// 최근 영수증 저장
        /// </summary>
        /// <param name="sFileName"></param>
        /// <param name="alPrtData"></param>
        /// <returns></returns>
        private void WriteReceiptFile(string sFileName, ArrayList alPrtData, string sPrtItem)
        {
            try
            {
                if (File.Exists(BaseCom.NxDataPath + sFileName) == true) File.Delete(BaseCom.NxDataPath + sFileName);

                if (alPrtData.Count <= 0) return;

                FileStream fs = new FileStream(BaseCom.NxDataPath + sFileName, FileMode.Create, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);

                try
                {
                    for (int i = 0; i < alPrtData.Count; i++)
                    {
                        if (alPrtData[i].ToString().StartsWith(PosConst.PRT_ITEM.REC) || alPrtData[i].ToString().StartsWith(PosConst.PRT_ITEM.ETC))
                        {
                            sw.WriteLine(alPrtData[i].ToString());
                        }
                    }
                }
                catch (Exception ex)
                {
                    WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
                }
                finally
                {
                    sw.Close();
                    fs.Close();
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 최근 영수증 읽기
        /// </summary>
        /// <param name="sFileName"></param>
        /// <returns></returns>
        protected ArrayList ReadReceiptFile(string sFileName, ArrayList alPrtData)
        {
            try
            {
                string sFilePath = BaseCom.NxDataPath + sFileName;
                if (File.Exists(sFilePath) == false) return alPrtData;

                using (StreamReader sr = new StreamReader(sFilePath, System.Text.Encoding.Default))
                {
                    sr.BaseStream.Seek(0, SeekOrigin.Begin);
                    while (sr.Peek() >= 0)
                    {
                        string sLineData = sr.ReadLine();
                        sLineData = sLineData.Replace(PosConst.PRT_HDR.PRT_REP, PosConst.PRT_HDR.PRT_NOR);
                        alPrtData.Add(sLineData);
                    }
                }
            }
            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 alPrtData;
        }


        private string GetCashierName(string sCashierNo)
        {
            try
            {
                // 캐셔마스터 조회
                IMasterUs cService = (IMasterUs)sManager.InitServiceInstance(ServiceLists.ASV_MASTER.DLL, ServiceLists.ASV_MASTER.CASHIER_MASTER);
                DataTable dtDataInfo = cService.Select(new string[] { m_cPosStatus.Base.StoreNo, sCashierNo });
                if (dtDataInfo != null && dtDataInfo.Rows.Count > 0)
                {
                    foreach (DataRow drData in dtDataInfo.Rows)
                    {
                        return CmUtil.GetDataRowStr(drData, PosMst.MST_USER.DATA.CASHIER_NM);
                    }
                }
            }
            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 "";
        }

        //#20170918 기념일 배송 출력 start
        protected ArrayList ReadAnniversaryFile(string sFileName, ArrayList alPrtData)
        {
            try
            {
                string sFilePath = sFileName; // BaseCom.NxDataPath + sFileName;
                if (File.Exists(sFilePath) == false) return alPrtData;

                using (StreamReader sr = new StreamReader(sFilePath, System.Text.Encoding.Default))
                {
                    sr.BaseStream.Seek(0, SeekOrigin.Begin);
                    while (sr.Peek() >= 0)
                    {
                        string sLineData = sr.ReadLine();
                        sLineData = sLineData.Replace(PosConst.PRT_HDR.PRT_REP, PosConst.PRT_HDR.PRT_NOR);
                        AddPrintData(PosConst.PRT_ITEM.ETC, PosConst.PRT_HDR.PRT_NOR, sLineData.Trim());
                    }
                }
            }
            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 alPrtData;
        }
        //#20170918 기념일 배송 출력 end

        // grayber@20180122 전자영수증 조건 추가 start - 해피앱 전자영수증 사용 여부 확인 함수
        /// <summary>
        /// 해피앱 전자영수증 확인 함수
        /// </summary>
        /// <returns>전자영수증 사용 유무 (Y:N)</returns>
        public string CheckElectronic_Receipt()
        {
            string sElectronic_ReceiptYN = string.Empty;

            try
            {
                if (m_bElectRec == true)
                {
                    return sElectronic_ReceiptYN = "Y";
                }

                ArrayList alEtcItem = (ArrayList)StateObject.GetItemObject(Column.TR_ETC.ITEM);
                foreach (Column.TR_ETC.DATA cEtcItem in alEtcItem)
                {
                    if (cEtcItem.ETC_WAY_CD == ItemConst.TR_ITEM_ID.ETC_INFO_ITEM && cEtcItem.ETC_DTL_CD_01 == ItemConst.TR_ITEM_ID.ETC_INFO.SAVEPOINT)
                    {
                        if (cEtcItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;
                        if (cEtcItem.OCCUR_ENTRY_12 == "Y")
                        {
                            //해피앱 전자발행설정유무 값 
                            sElectronic_ReceiptYN = cEtcItem.OCCUR_ENTRY_23;
                            break;
                        }
                    }
                }

                if (sElectronic_ReceiptYN.Equals("Y") == true) return sElectronic_ReceiptYN;

                ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
                foreach (Column.TR_PAYMENT.DATA cPayItem in alPayItem)
                {
                    if (cPayItem.PAY_WAY_CD == ItemConst.TR_ITEM_ID.POINT_ITEM && cPayItem.PAY_DTL_CD_01 == ItemConst.TR_ITEM_ID.POINT_USE.HAPPY_POINT)
                    {
                        if (cPayItem.CANCEL_DIV == ItemConst.PAY_CANCEL_DIV.CANCEL) continue;
                        if (cPayItem.OCCUR_ENTRY_12 == "Y")
                        {
                            sElectronic_ReceiptYN = cPayItem.OCCUR_ENTRY_23;
                            break;
                        }
                    }
                }

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

                return sElectronic_ReceiptYN;
            }
        }
        // grayber@20180122 전자영수증 조건 추가 end

        //#20180202 결제영수증 발행 안해도 직전영수증 발행시 해당 영수증 출력 start

        /// <summary>
        /// 영수증 저장 처리
        /// </summary>
        public void SaveReceiptFile()
        {
            try
            {
                // 추후적립일때 직전영수증 파일 저장 안함(2017.07.21)
                if (m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.AFTER.HP_SAVE && m_cTrnStatus.Head.TradeKind != ItemConst.TRAN_KIND.AFTER.CASH_RECEIPT)
                {
                    WriteReceiptFile("PRT_REC.TXT", m_aRecPrintBuf, PosConst.PRT_ITEM.REC);
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        //#20180202 결제영수증 발행 안해도 직전영수증 발행시 해당 영수증 출력 end
    }
}
