using System;
using System.Text;
using System.Collections;
using System.Data;
using System.IO;

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

/*-----------------------------------------------------------------------------------------------*/
// 설      명 : 상품등록
// 작  성  자 : 
// 변경  이력 : 
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.Service
{
    /// <summary>
    /// 상품등록 클래스
    /// </summary>
    class SalePluItem : SalePluItemBase, ISalePluItemUs
    {
        /// <summary>
        /// 생성자
        /// </summary>
        public SalePluItem()
        {
            
        }

        /// <summary>
        /// 세트 메뉴 할인 마스터 로딩 처리
        /// </summary>
        public void LoadSetMenuDisMaster()
        {
            SalePluSetMenu m_cPluSetDis = (SalePluSetMenu)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.SALE_PLU_SET_MENU);
            m_cPluSetDis.LoadSetMenuDisMaster();    // 세트할인 마스터 로딩
        }


        /*
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        /// <remarks>2019-04-11 - 1997fx11 : Kiosk용 SetItemCode</remarks>
        public string SetItemCode(object oParam)
        {
            SPC.Kiosk.Common.M_BasketItem _basketItem = (SPC.Kiosk.Common.M_BasketItem)oParam;
            string sSubStoreNo = "", sItemCode = "", sScanCode = "";      //점포코드, 상품코드, 스켄코드
            string sRet = UserCom.RST_ERR;

            sSubStoreNo = m_cPosStatus.Base.StoreNo;                // 점포코드
            sItemCode = _basketItem.ItemCode;                           // 상품코드

            return "";
        }
        */


        /// <summary>
        /// 상품 등록 처리
        /// </summary>
        /// <param name="sSelRow">선택행</param>
        /// <param name="sInPutTypeCode">(0:수입력, 1:메뉴, 2:스켄, 3:플레이버) + (메뉴코드,스캔코드)</param>
        /// <param name="sInPutData">입력데이터</param>
        /// <returns></returns>
        /// 2019-04-05 - 1997fx11 : SetItemCode 관련 참조
        public string SetItemCode(string sSelRow, string sInPutTypeCode, string sInPutData)
        {
            string sSubStoreNo = "", sItemCode = "", sScanCode = "";      //점포코드, 상품코드, 스켄코드
            string sRet = UserCom.RST_ERR;

            try
            {
                string sInPutType = PosConst.SALE_PLU_INPUT_TYPE.MENUKEY;
                if (sInPutTypeCode.Length > 0) sInPutType = sInPutTypeCode.Substring(0, 1);

                if (sInPutTypeCode.StartsWith(PosConst.SALE_PLU_INPUT_TYPE.MENUKEY)
                    || sInPutTypeCode.StartsWith(PosConst.SALE_PLU_INPUT_TYPE.FLAVOUR) || sInPutTypeCode.StartsWith(PosConst.SALE_PLU_INPUT_TYPE.SUBMENU))      // 메뉴코드
                {
                    // 메뉴코드 = (점포코드(10)+상품코드) 
                    sSubStoreNo = sInPutTypeCode.Substring(1, 10).Trim();   // 점포코드
                    sItemCode = sInPutTypeCode.Substring(11);               // 상품코드
                }
                else if (sInPutTypeCode.StartsWith(PosConst.SALE_PLU_INPUT_TYPE.KEY_IN) || sInPutTypeCode.StartsWith(PosConst.SALE_PLU_INPUT_TYPE.SCANNER))     // 스캔입력 
                {
                    sSubStoreNo = m_cPosStatus.Base.StoreNo;                // 점포코드
                    sScanCode = sInPutTypeCode.Substring(1);                // 스캔코드
                }
                else
                {
                    sSubStoreNo = m_cPosStatus.Base.StoreNo;                // 점포코드
                    sItemCode = sInPutTypeCode.Substring(1);                // 상품코드
                }

                // 상품 등록 처리
                sRet = SetItemCode(sSelRow, sInPutType, sSubStoreNo, sItemCode, sScanCode, sInPutData);
                if (sRet != UserCom.RST_OK) return sRet;

                if (sInPutTypeCode.StartsWith(PosConst.SALE_PLU_INPUT_TYPE.FLAVOUR) == true)
                {
                    // 플레이버 수량 체크 => 플레이버 수량이 1 이면 플레이버 등록 수량으로 상품 수량 변경
                    Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[int.Parse(sSelRow)];

                    if (cPluItem.FLAVOUR_QTY == 1)
                    {
                        long nPlvQty = 0;
                        for (int i = int.Parse(sSelRow) + 1; i < m_alTrPluItem.Count; i++)
                        {
                            Column.TR_PLU.DATA cPlavourItem = (Column.TR_PLU.DATA)m_alTrPluItem[i];

                            if (cPlavourItem.FLAVOUR_DIV != ItemConst.PLU_FLAVOUR_DIV.FLAVOUR) break;

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

                            nPlvQty += cPlavourItem.SALE_QTY;
                        }
                        if (nPlvQty > cPluItem.SALE_QTY)
                        {
                            cPluItem.SALE_QTY = nPlvQty;
                            m_cDataService.UpdatePluItemAmount(cPluItem);
                        }
                    }
                }

                // 세트할인 처리
                //SalePluSetMenu m_cPluSetDis = (SalePluSetMenu)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.SALE_PLU_SET_MENU);
                //m_cPluSetDis.ExecuteSetMenuDiscount();

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

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


        /// <summary>
        /// 상품 지정 취소 처리
        /// </summary>
        /// <param name="sSelRow"></param>
        /// <returns></returns>
        public string SetCancelItem(string sSelRow)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                int nSelRow = int.Parse(sSelRow);

                // 상품 정보
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[nSelRow];

                //// 세트 자식은 지정취소 불가
                //if (cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_DETL)
                //{
                //    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0013);        // 지정 취소 할 수 없는 상품 입니다
                //    return sRet;
                //}

                // 부가메뉴 등록중
                //if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_OPT || m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_SET_OPT)
                //{
                //    if (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.OPT_MENU)
                //    {
                //        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0024);    // 부가메뉴만 취소 할 수 있습니다
                //        return sRet;
                //    }
                //}

                //if (cPluItem.CANCEL_DIV == "0")
                //{
                //    // ----------------------------------------------------------------------------------------------
                //    // 지정취소시 묶음할인 적용 그룹도 같이 취소
                //    // ----------------------------------------------------------------------------------------------
                //    sRet = PluiTem_DC_Cancel(cPluItem);
                //    if (sRet != UserCom.RST_OK) return sRet;
                //    // ----------------------------------------------------------------------------------------------
                //}

                //if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK)
                //{
                //    // 주문 완료된 상품은 지정취소만 가능
                //    if (cPluItem.CANCEL_DIV == "1")        // 지정취소
                //    {
                //        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0012);      // 주문완료후 지정취소 해지 불가
                //        return sRet;
                //    }

                //    cPluItem.CANCEL_DIV = "1";
                //    cPluItem.CANCEL_DATE = DateTime.Now.ToString("yyyyMMddHHmmss");
                //    cPluItem.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD;
                //}
                //else if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD)
                //{
                //    if (cPluItem.CANCEL_DIV == "1")
                //    {
                //        cPluItem.CANCEL_DIV = "0";
                //        cPluItem.CANCEL_DATE = "";
                //    }
                //    else
                //    {
                //        cPluItem.CANCEL_DIV = "1";
                //        cPluItem.CANCEL_DATE = DateTime.Now.ToString("yyyyMMddHHmmss");
                //    }
                //    //cPluItem.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_OK;
                //}
                //// 선불카드 판매 - 중국인 경우
                //else if (cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.PREPAID && PosMstManager.GetPosOption(POS_OPTION.OPT046) == "1")
                //{
                //    // 취소요청
                //    IPaymentUs m_cSalePreCard = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_SALE.DLL, ServiceLists.BSV_SALE.SALEPRECARD);
                //    if (cPluItem.CANCEL_DIV == "1")
                //    {
                //        // 정상 요청
                //        sRet = m_cSalePreCard.SetPayment(new string[] { "0", cPluItem.SALE_GIFT_NO, "0" });
                //    }
                //    else
                //    { 
                //        // 취소 요청
                //        sRet = m_cSalePreCard.CancelPayment(new string[] { "1", cPluItem.SALE_GIFT_NO, "0" });                    
                //    }
                //    if (sRet == UserCom.RST_OK)
                //    {
                //        if (cPluItem.CANCEL_DIV == "1")
                //        {
                //            cPluItem.CANCEL_DIV = "0";
                //            cPluItem.CANCEL_DATE = "";
                //        }
                //        else
                //        {
                //            cPluItem.CANCEL_DIV = "1";
                //            cPluItem.CANCEL_DATE = DateTime.Now.ToString("yyyyMMddHHmmss");
                //        }
                //    }
                //}
                //else
                //{
                //    if (cPluItem.CANCEL_DIV == "1")
                //    {
                //        cPluItem.CANCEL_DIV = "0";
                //        cPluItem.CANCEL_DATE = "";
                //    }
                //    else
                //    {
                //        cPluItem.CANCEL_DIV = "1";
                //        cPluItem.CANCEL_DATE = DateTime.Now.ToString("yyyyMMddHHmmss");
                //    }
                //}
                //m_cDataService.UpdatePluItemAmount(cPluItem);

                //if (nSelRow + 1 < m_alTrPluItem.Count)
                //{
                //    // 상위메뉴 지정취소 => 하위 메뉴 반영
                //    for (int i = nSelRow + 1; i < m_alTrPluItem.Count; i++)
                //    {
                //        Column.TR_PLU.DATA cItem = (Column.TR_PLU.DATA)m_alTrPluItem[i];

                //        if (cPluItem.FLAVOUR_DIV == ItemConst.PLU_FLAVOUR_DIV.FLAVOUR)
                //        {
                //            break;
                //        }
                //        else if (cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.NORMAL || cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_MAIN)
                //        {
                //            if ((cItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.NORMAL || cItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_MAIN)
                //                && cItem.FLAVOUR_DIV != ItemConst.PLU_FLAVOUR_DIV.FLAVOUR) break;
                //        }
                //        else
                //        {
                //            break;
                //        }
                //        cItem.CANCEL_DIV_MAIN = cPluItem.CANCEL_DIV;
                //        cItem.ORDER_OK_FLAG = cPluItem.ORDER_OK_FLAG;
                //        if (cPluItem.CANCEL_DIV == "1" && cItem.CANCEL_DIV == "0") cItem.CANCEL_DATE = DateTime.Now.ToString("yyyyMMddHHmmss");

                //        m_cDataService.UpdatePluItemAmount(cItem);
                //    }
                //}

                // 지정취소 항목 삭제
                //if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_ING && PosMstManager.GetPosOption(POS_OPTION.OPT025) == "1")
                //{
                    // 지정취소 항목삭제 일때 기타에 지정취소 데이터 저장 필요.
                    ISaleCompleteUs m_cSaleComplete = (ISaleCompleteUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.SALE_COMPLETE);
                    m_cSaleComplete.ItemCancelExecute(new string[] { });
                    
                    string sFLAVOUR_DIV = cPluItem.FLAVOUR_DIV;
                    string sITEM_DIV = cPluItem.ITEM_DIV;

                    m_alTrPluItem.RemoveAt(nSelRow);
                    while (nSelRow < m_alTrPluItem.Count)
                    {
                        Column.TR_PLU.DATA cItem = (Column.TR_PLU.DATA)m_alTrPluItem[nSelRow];

                        if (sFLAVOUR_DIV == ItemConst.PLU_FLAVOUR_DIV.FLAVOUR)
                        {
                            break;
                        }
                        else if (sITEM_DIV == ItemConst.PLU_ITEM_DIV.NORMAL || sITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_MAIN)
                        {
                            if ((cItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.NORMAL || cItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_MAIN)
                                && cItem.FLAVOUR_DIV != ItemConst.PLU_FLAVOUR_DIV.FLAVOUR) break;
                        }
                        else
                        {
                            break;
                        }

                        m_alTrPluItem.RemoveAt(nSelRow);
                    }
                //}

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

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

                //    //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 start
                //    //기존
                //    //cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.PRODUCT_REG, cPluItem.ITEM_PLU_CD, cPluItem.ITEM_NAME, "3" });
                //    //변경
                //    if (PosMstManager.GetPosOption(POS_OPTION.OPT554) != "1")
                //    {
                //        cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.PRODUCT_REG, cPluItem.ITEM_PLU_CD, cPluItem.ITEM_NAME, "3" });
                //    }
                //    //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 end
                //}

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

        /// <summary>
        /// 지정취소시 상품할인 취소처리
        /// </summary>
        /// <param name="cPluItem"></param>
        /// <returns></returns>
        private string PluiTem_DC_Cancel(Column.TR_PLU.DATA cPluItem)
        {
            string sRet = UserCom.RST_ERR; 

            try
            {
                // ----------------------------------------------------------------------------------------------
                // 현재 소계 할인 이면....
                // ----------------------------------------------------------------------------------------------
                if (cPluItem.ITEM_DC_AMT > 0)
                {
                    if (cPluItem.DC_TYPE == ItemConst.PLU_DC_TYPE.DC_SUM)
                    {
                        if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0684) == true)
                        {
                            SubTotalDcClear();
                        }
                        else
                        {
                            return sRet;
                        }
                    }
                }
                // ----------------------------------------------------------------------------------------------

                // ----------------------------------------------------------------------------------------------
                // 지정취소시 묶음할인 적용 그룹도 같이 취소
                // ----------------------------------------------------------------------------------------------
                if (cPluItem.SET_DC_AMT > 0)
                {
                    if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0685) == false)
                    {
                        return sRet;
                    }

                    int nSetDcGroupCD = cPluItem.SET_DC_GROUP_CD;
                    ArrayList alSaleItemSetDc = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM);
                    for (int i = 0; i < alSaleItemSetDc.Count; i++)
                    {
                        Column.TR_PLU.DATA cPluItemSetDc = (Column.TR_PLU.DATA)alSaleItemSetDc[i];

                        if (cPluItemSetDc.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cPluItemSetDc.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;    // 지정취소
                        if ((cPluItemSetDc.SET_DC_GROUP_CD == 0 && cPluItemSetDc.SET_DC_AMT > 0) || (cPluItemSetDc.SET_DC_GROUP_CD == nSetDcGroupCD))
                        {
                            cPluItemSetDc.SET_DC_AMT = 0;
                            cPluItemSetDc.SET_DC_GROUP_CD = 0;
                            m_cDataService.UpdatePluItemAmount(cPluItemSetDc);

                            if (cPluItemSetDc.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) cPluItemSetDc.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD;
                        }
                    }
                }
                // ----------------------------------------------------------------------------------------------

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

        /// <summary>
        /// 판매등록중 소계할인 클리어
        /// </summary>
        private void SubTotalDcClear()
        {
            try
            {
                foreach (Column.TR_PLU.DATA cPluItem in m_alTrPluItem)
                {
                    if (cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.NORMAL && cPluItem.DC_TYPE == ItemConst.PLU_DC_TYPE.DC_SUM && cPluItem.ITEM_DC_AMT > 0)
                    {

                        cPluItem.DC_TYPE = ItemConst.PLU_DC_TYPE.NORMAL;
                        cPluItem.DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;
                        cPluItem.ITEM_DC_AMT = 0;

                        m_cDataService.UpdatePluItemAmount(cPluItem);

                        if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) cPluItem.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD;
                    }
                    
                }

            }
            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="sSelRow"></param>
        /// <param name="sNewQty"></param>
        /// <returns></returns>
        public string SetQtyChangeItem(string sSelRow, string sNewQty)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                int nSelRow = CmUtil.IntParse(sSelRow);
                long nNewQty = CmUtil.LongParse(sNewQty);

                // 상품 정보
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[nSelRow];

                // 취소 상품은 수량변경 불가
                if (cPluItem.CANCEL_DIV == "1" || cPluItem.CANCEL_DIV_MAIN == "1")
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0017);      // 취소한 상품 입니다
                    return sRet;
                }

                // 세트 자식은 수량변경 불가
                if (cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_DETL || cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.GIFT || cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.PREPAID)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0014);      // 수량변경 할 수 없는 상품 입니다
                    return sRet;
                }

                // 부가메뉴 등록중
                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_OPT || m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING_SET_OPT)
                {
                    if (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.OPT_MENU)
                    {
                        WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0025);    // 부가메뉴만 변경 할 수 있습니다
                        return sRet;
                    }
                }
                if ( cPluItem.ITEM_DC_AMT > 0 || cPluItem.SET_DC_AMT > 0 || cPluItem.EXCEP_DC_AMT > 0)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0548);
                    return sRet;
                    
                }
                if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK)
                {
                    // Del, 2017.04.19, 후불 주문완료상품 수량 변경 
                    //ITableUs cTableSvr = (ITableUs)sManager.InitServiceInstance(ServiceLists.BSV_TABLE.DLL, ServiceLists.BSV_TABLE.TABLE_SERVICE);
                    //var cnt = cTableSvr.GetKtchDiveceCount(cPluItem.ORDER_OK_FLAG, m_cPosStatus.Sale.SelectFloorCd, m_cPosStatus.Sale.SelectTableNo, cPluItem.SUB_SHOP_CD + cPluItem.ITEM_PLU_CD);
                    //if (cnt > 0)
                    //{
                    //    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0015);        // 주문완료 후 수량변경 할 수 없습니다
                    //    return sRet;
                    //}
                }

                if (nNewQty <= 0)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0567);        // 수량을 입력 후 사용하세요.
                    return sRet;
                }
                else if (nNewQty > 99999)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0568);        // 입력된 수량이 너무 큽니다.
                    return sRet;
                }

                cPluItem.SALE_QTY = nNewQty;
                // 판매 loss일 경우 0원 처리
                //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS) cPluItem.ITEM_DC_AMT = cPluItem.SALE_PRC * cPluItem.SALE_QTY;

                m_cDataService.UpdatePluItemAmount(cPluItem);

                if (nSelRow + 1 < m_alTrPluItem.Count)
                {
                    // 상위메뉴 수량 => 하위 메뉴 반영
                    if (cPluItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_MAIN)
                    {
                        for (int i = nSelRow + 1; i < m_alTrPluItem.Count; i++)
                        {
                            Column.TR_PLU.DATA cItem = (Column.TR_PLU.DATA)m_alTrPluItem[i];

                            if (cItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.NORMAL || cItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_MAIN) break;

                            if (cItem.ITEM_DIV == ItemConst.PLU_ITEM_DIV.SET_DETL)
                            {
                                cItem.SALE_QTY = nNewQty;
                                // 판매 loss일 경우 0원 처리
                                //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS) cPluItem.ITEM_DC_AMT = cPluItem.SALE_PRC * cPluItem.SALE_QTY;
                            }
                            m_cDataService.UpdatePluItemAmount(cItem);
                        }
                    }
                }

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

                //if (m_cPosStatus.Base.DmbIf == "1")
                //{
                //    // 디지털메뉴보드 I/F
                //    IDataServiceUs cDigitalMenuBoard = (IDataServiceUs)sManager.InitServiceInstance(ServiceLists.BSV_BASIC.DLL, ServiceLists.BSV_BASIC.DMB_IF);
                //    // 수량변경
                //    //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 start
                //    //기존
                //    //cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.PRODUCT_REG, cPluItem.ITEM_PLU_CD, cPluItem.ITEM_NAME, "2" });
                //    //변경
                //    if (PosMstManager.GetPosOption(POS_OPTION.OPT554) != "1")
                //    {
                //        cDigitalMenuBoard.Execute(new string[] { ItemConst.DMB_IRT_ID.PRODUCT_REG, cPluItem.ITEM_PLU_CD, cPluItem.ITEM_NAME, "2" });
                //    }
                //    //#16569 파스쿠찌 드라이브 스루 기능 개발 요청 end
                //}

                if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) cPluItem.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD;

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

        /// <summary>
        /// 단품 할인 적용
        /// </summary>
        /// <param name="sSelRow"></param>
        /// <param name="sDcType">ITEM_DC_DIV_POS_DC</param>
        /// <param name="sVaule"></param>
        /// <returns></returns>
        public string SetDcItem(string sSelRow, string sDcType, string sDcCode, string sVaule)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                int nSelRow = CmUtil.IntParse(sSelRow);
                double dDcValue = CmUtil.DoubleParse(sVaule);

                // 상품 정보
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[nSelRow];

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

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

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

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

                double nBasicAmt = cPluItem.SALE_AMT;     // 기준금액

                if (sDcType == PosConst.ITEM_DC_DIV_POS_DC.FREE)        // 서비스
                {

                    // 2016-12-10 문대리 요청으로 무조건 적용!
                    //if ( cPluItem.DC_DIV != ItemConst.PLU_DC_DIV.NORMAL && cPluItem.DC_DIV != ItemConst.PLU_DC_DIV.FREE)
                    //{
                    //    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0063);      // 기존 할인 취소 후 등록 하세요.
                    //    return sRet;
                    //}


                    if (sDcCode == ItemConst.PLU_DC_DIV.FREE)   //서비스
                    {
                        if (cPluItem.DC_DIV == ItemConst.PLU_DC_DIV.FREE)
                        {
                            if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0064) == false)    // 등록된 서비스을 취소 하시겠습니까?
                                return sRet;

                            // 서비스 취소
                            cPluItem.ITEM_DC_AMT = 0;
                        }
                        else
                        {
                            // 서비스 등록
                            cPluItem.ITEM_DC_AMT = nBasicAmt;
                            cPluItem.EXCEP_DC_AMT = 0;
                            cPluItem.EXCEP_DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;
                        }
                        cPluItem.DC_DIV = (cPluItem.ITEM_DC_AMT == 0) ? ItemConst.PLU_DC_DIV.NORMAL : ItemConst.PLU_DC_DIV.FREE;
                    }
                    else if (sDcCode == ItemConst.PLU_DC_DIV.ITEM_CHAGE_CPN_DC)
                    {
                        
                        if (cPluItem.DC_DIV == ItemConst.PLU_DC_DIV.ITEM_CHAGE_CPN_DC)
                        {
                            if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0662) == false)    // 등록된 제품교환권을 취소 하시겠습니까?
                                return sRet;

                            // 제품교환권 취소
                            cPluItem.ITEM_DC_AMT = 0;
                        }
                        else
                        {
                            // 제품교환권 등록
                            cPluItem.ITEM_DC_AMT = nBasicAmt;
                            cPluItem.EXCEP_DC_AMT = 0;
                            cPluItem.EXCEP_DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;
                        }
                        cPluItem.DC_DIV = (cPluItem.ITEM_DC_AMT == 0) ? ItemConst.PLU_DC_DIV.NORMAL : ItemConst.PLU_DC_DIV.ITEM_CHAGE_CPN_DC;
                    }
                }
                else                                                     // 상품 할인
                {
                    //if (cPluItem.DC_DIV != ItemConst.PLU_DC_DIV.NORMAL && cPluItem.DC_DIV != ItemConst.PLU_DC_DIV.POS_DC)
                    //{
                    //    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0063);      // 기존 할인 취소 후 등록 하세요.
                    //    return sRet;
                    //}

                    if (dDcValue == 0)
                    {
                        if (cPluItem.DC_DIV == sDcCode)
                        {
                            if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0053) == false)    // 등록된 할인을 취소 하시겠습니까?
                                return sRet;
                        }
                        else
                        {
                            if (sDcType == PosConst.ITEM_DC_DIV_POS_DC.RATE)
                                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0051);                // 할인 율을 입력하지 않았거나 너무 큽니다
                            else
                                WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0049);                // 할인 금액을 입력하지 않았거나 너무 큽니다

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

                    nBasicAmt = CmUtil.DoubleSubtraction(nBasicAmt, cPluItem.EXCEP_DC_AMT);
                    if (sDcType == PosConst.ITEM_DC_DIV_POS_DC.RATE)
                    {
                        // 율 할인
                        if (dDcValue > 100)
                        {
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0051);                    // 할인 율을 입력하지 않았거나 너무 큽니다
                            return sRet;
                        }

                        cPluItem.DC_RATE = dDcValue;
                        double nDcAmt = CmUtil.MathRounds(CmUtil.MathAmtPercent(nBasicAmt, dDcValue), m_cPosStatus.Mst.DcRudDwLocMethd, CmUtil.IntParse(m_cPosStatus.Mst.DcRudDwLoc));
                       
                        //girak.kim, #2017/08/29 중국 상품 할인율 소숫점 둘째자리 올림 처리(그러므로 결재금액은 내림처리됨) Start
                        if (m_cPosStatus.Base.CmpCd.ToUpper().Equals(PosConst.POS_COMPANY_CODE.PCCN))
                        {
                            nDcAmt = Convert.ToDouble(Decimal.Round(Convert.ToDecimal(nDcAmt) + Convert.ToDecimal(0.05), 1));
                        }
                        //girak.kim, #2017/08/29 중국 상품 할인율 소숫점 둘째자리 올림 처리(그러므로 결재금액은 내림처리됨) End

                        if (CmUtil.DoubleAdd(cPluItem.BILL_AMT, cPluItem.ITEM_DC_AMT) < nDcAmt)
                        {
                            WinManager.ErrorMessage(string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0602), cPluItem.BILL_AMT, nDcAmt));    // 할인 대상 금액 보다 적용하려는 금액이 더 큽니다.
                            return sRet;
                        }
                        cPluItem.ITEM_DC_AMT = nDcAmt;
                    }
                    else
                    {
                        // 금액 할인
                        if (dDcValue > nBasicAmt)
                        {
                            WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0049);                    // 할인 금액을 입력하지 않았거나 너무 큽니다
                            return sRet;
                        }

                        cPluItem.DC_RATE = 0;
                        double nDcAmt = CmUtil.MathRounds(dDcValue, m_cPosStatus.Mst.DcRudDwLocMethd, CmUtil.IntParse(m_cPosStatus.Mst.DcRudDwLoc));
                        if (CmUtil.DoubleAdd(cPluItem.BILL_AMT, cPluItem.ITEM_DC_AMT) < nDcAmt)
                        {
                            WinManager.ErrorMessage(string.Format(MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0602), cPluItem.BILL_AMT, nDcAmt));    // 할인 대상 금액 보다 적용하려는 금액이 더 큽니다.
                            return sRet;
                        }
                        cPluItem.ITEM_DC_AMT = nDcAmt;
                    }
                    cPluItem.DC_DIV = (cPluItem.ITEM_DC_AMT == 0) ? ItemConst.PLU_DC_DIV.NORMAL : sDcCode;
                }


                cPluItem.DC_TYPE = (cPluItem.ITEM_DC_AMT == 0) ? ItemConst.PLU_DC_TYPE.NORMAL : ItemConst.PLU_DC_TYPE.DC_ITEM;

                m_cDataService.UpdatePluItemAmount(cPluItem);

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

                if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) cPluItem.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD;

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

        /// <summary>
        /// 단품 No Tax
        /// </summary>
        /// <param name="sSelRow"></param>
        /// <returns></returns>
        public string SetNoTaxItem(string sSelRow)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                int nSelRow = CmUtil.IntParse(sSelRow);
                
                // 상품 정보
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[nSelRow];

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

                // 세트 자식은 적용 불가
                if (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.NORMAL && cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.SET_MAIN)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0159);    //NO TAX 적용  불가 상품 입니다.
                    return sRet;
                }

                if (cPluItem.ITEM_TAX_DIV == PosConst.ITEM_TAX_DIV.FREE)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0159);    //NO TAX 적용  불가 상품 입니다.
                    return sRet;
                }

                // 사은품 및 금액이 없을 경우 체크
                if (cPluItem.FREE_GIFT_YN == "1" || cPluItem.SALE_PRC == 0)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0159);
                    return sRet;
                }

                if (cPluItem.NOTAX_DIV == PosConst.ITEM_NOTAX_DIV.YES)
                {
                    cPluItem.NOTAX_DIV = PosConst.ITEM_NOTAX_DIV.NO;
                }
                else
                {
                    cPluItem.APPLY_TAX_AMT = 0;
                    cPluItem.NOTAX_DIV = PosConst.ITEM_NOTAX_DIV.YES;
                }

                m_cDataService.UpdatePluItemAmount(cPluItem);

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

                if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) cPluItem.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD;

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

        //#Rhee, 20180212 전체상품 No Tax 추가 Start
        /// <summary>
        /// 전체상품 No Tax
        /// </summary>
        /// <returns></returns>
        public string SetAllNoTaxItem()
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                // 상품 정보
                foreach (Column.TR_PLU.DATA cPluItem in m_alTrPluItem)
                {
                    // NO TAX 적용  불가 상품 입니다.
                    if (! ((cPluItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cPluItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL)
                        || (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.NORMAL && cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.SET_MAIN)
                        || (cPluItem.ITEM_TAX_DIV == PosConst.ITEM_TAX_DIV.FREE) 
                        || (cPluItem.FREE_GIFT_YN == "1" || cPluItem.SALE_PRC == 0))
                        )
                    {
                        if (cPluItem.NOTAX_DIV == PosConst.ITEM_NOTAX_DIV.YES)
                        {
                            cPluItem.NOTAX_DIV = PosConst.ITEM_NOTAX_DIV.NO;
                        }
                        else
                        {
                            cPluItem.APPLY_TAX_AMT = 0;
                            cPluItem.NOTAX_DIV = PosConst.ITEM_NOTAX_DIV.YES;
                        }

                        m_cDataService.UpdatePluItemAmount(cPluItem);

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

                        if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) cPluItem.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD;

                        sRet = UserCom.RST_OK;
                    }  
                }                             
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        //#Rhee, 20180212 전체상품 No Tax 추가 End

        /// <summary>
        /// 세트메뉴 구성 상품 변경
        /// </summary>
        /// <param name="sSelRow"></param>
        /// <param name="sMenuCode"></param>
        /// <param name="sMenuName"></param>
        /// <param name="sMenuPrc"></param>
        /// <returns></returns>
        public string SetSetMenuItemChange(string sSelRow, string sMenuCode, string sMenuName, string sMenuPrc)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                int nSelRow = CmUtil.IntParse(sSelRow);
                
                // 상품 정보
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[CmUtil.IntParse(sSelRow)];

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

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

                if (cPluItem.ITEM_DC_AMT > 0 || cPluItem.SET_DC_AMT > 0 || cPluItem.EXCEP_DC_AMT > 0)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0548);
                    return sRet;
                }

                if (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.SET_DETL)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0307);
                    return sRet;
                }

                // 변경될 상품 조회 후 설정
                if (SetTrPluItemToMst(cPluItem, cPluItem.SUB_SHOP_CD, sMenuCode) == false) return sRet;

                cPluItem.ITEM_PLU_CD = sMenuCode;
                if (sMenuName != "")
                    cPluItem.ITEM_NAME = ">" + sMenuName;
                else
                    cPluItem.ITEM_NAME = ">" + cPluItem.ITEM_NAME;

                cPluItem.SALE_PRC = CmUtil.DoubleParse(sMenuPrc);
                // 판매 loss일 경우 0원 처리
                //if (m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS) cPluItem.ITEM_DC_AMT = cPluItem.SALE_PRC * cPluItem.SALE_QTY;

                m_cDataService.UpdatePluItemAmount(cPluItem);

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

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

        /// <summary>
        /// 상품 부가메뉴 => 부가메뉴 변경
        /// </summary>
        /// <param name="sSelRow"></param>
        /// <param name="sMenuCode"></param>
        /// <param name="sMenuKeyDiv"></param>
        /// <returns></returns>
        public string SetSubMenuItemChange(string sSelRow, string sMenuCode, string sMenuKeyDiv)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                // 상품 정보
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[CmUtil.IntParse(sSelRow)];

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

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

                if (cPluItem.ITEM_DC_AMT > 0 || cPluItem.SET_DC_AMT > 0 || cPluItem.EXCEP_DC_AMT > 0)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0548);
                    return sRet;
                }

                if (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.OPT_MENU)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0026);
                    return sRet;
                }

                // 변경될 상품 조회 후 설정
                if (SetTrPluItemToMst(cPluItem, cPluItem.SUB_SHOP_CD, sMenuCode.Substring(10)) == false) return sRet;

                cPluItem.ITEM_NAME = ">>" + cPluItem.ITEM_NAME;
                
                cPluItem.SUBPRC_MENU_KEY_DIV = sMenuKeyDiv;                     // 부가메뉴구분(1:속성,2:업차지,3:선택메뉴)
                if (sMenuKeyDiv != "2")
                    cPluItem.SALE_PRC = 0;
                else
                    cPluItem.SALE_PRC = m_cTrnStatus.Sale.SubMenuUpSalePrc;

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

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

        /// <summary>
        /// 상품 부가메뉴 => 부가메뉴구분(속성) 등록 
        /// </summary>
        /// <param name="sMemoCode"></param>
        /// <param name="sMemoName"></param>
        /// <returns></returns>
        public string SetSubMenuMemoItem(string sMemoCode, string sMemoName, string sInPutData)
        {
            int nSelRow = 0;
            bool bSumMenuAdd = false;
            string sRet = UserCom.RST_ERR;

            try
            {
                // 메뉴코드 = (점포코드(10)+상품코드) 
                string sSubStoreNo = sMemoCode.Substring(0, 10).Trim();   // 점포코드
                string sItemCode = sMemoCode.Substring(10);               // 상품코드

                nSelRow = m_alTrPluItem.Count - 1;
                if (m_cPosStatus.Sale.SaleFlow == PosConst.SALE_FLOW.SALE_DOING)
                {
                    nSelRow = (int)m_cTrnStatus.Sale.SubMenuSelectPos + 1;
                    if (nSelRow >= m_alTrPluItem.Count)
                    {
                        nSelRow = m_alTrPluItem.Count - 1;
                        bSumMenuAdd = true;
                    }
                }

                // 같은 상품 등록 여부 체크(수량증가)
                bool bQtyAdd = false;
                if (nSelRow >= 0 && sInPutData == ""
                    && (PosMstManager.GetPosOption(POS_OPTION.OPT031) == "1" || PosMstManager.GetPosOption(POS_OPTION.OPT031) == "2"))  // 수량 합산 처리(0:미합산, 1:최종상품합산, 2:전체상품합산))
                {
                    Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[nSelRow];
                    if (cPluItem.SUB_SHOP_CD == sSubStoreNo
                        && cPluItem.ITEM_PLU_CD == sItemCode
                        && cPluItem.SUBPRC_MENU_KEY_DIV == "1"    
                        && cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_ING
                        && cPluItem.CANCEL_DIV == "0" && cPluItem.DC_DIV == ItemConst.PLU_DC_DIV.NORMAL && cPluItem.SALE_QTY < 99999)
                    {
                        // 수량 증가
                        cPluItem.SALE_QTY += 1;
                        bQtyAdd = true;
                    }
                }

                if (bQtyAdd == false)
                {
                    // 상품 정보 생성
                    Column.TR_PLU.DATA cPluItem = new Column.TR_PLU.DATA();

                    cPluItem.SUB_SHOP_CD = sSubStoreNo;
                    cPluItem.ITEM_PLU_CD = sItemCode;
                    cPluItem.ITEM_DIV = ItemConst.PLU_ITEM_DIV.OPT_MENU;

                    cPluItem.SALE_QTY = 1;
                    if (sInPutData.Length > 0 && sInPutData.Length <= 5) cPluItem.SALE_QTY = CmUtil.LongParse(sInPutData);
                    cPluItem.ITEM_NAME = ">>>" + sMemoName;

                    cPluItem.SUBPRC_MENU_KEY_DIV = "1";    // 부가메뉴구분(1:속성,2:업차지,3:선택메뉴)

                    cPluItem.NONSALES_RSN_CD = m_cTrnStatus.Head.NonSaleRsnCd;
                    cPluItem.NONSALES_RSN_NM = m_cTrnStatus.Head.LossTitle;
                    
                    cPluItem.SUB_MENU_MAIN_CD = m_cTrnStatus.Sale.SubMenuMainCode;
                    if (m_cPosStatus.Sale.SaleFlow != PosConst.SALE_FLOW.SALE_DOING || bSumMenuAdd == true)
                        m_alTrPluItem.Add(cPluItem);                    // 등록 처리
                    else
                        m_alTrPluItem.Insert(nSelRow, cPluItem);        // 등록 처리
                }

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

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

        /// <summary>
        /// 상품 부가메뉴 => 부가메뉴구분(속성) 변경
        /// </summary>
        /// <param name="sMemoCode"></param>
        /// <param name="sMemoName"></param>
        /// <returns></returns>
        public string SetSubMenuMemoItemChange(string sSelRow, string sMemoCode, string sMemoName)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                // 상품 정보
                Column.TR_PLU.DATA cPluItem = (Column.TR_PLU.DATA)m_alTrPluItem[CmUtil.IntParse(sSelRow)];

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

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

                if (cPluItem.ITEM_DC_AMT > 0 || cPluItem.SET_DC_AMT > 0 || cPluItem.EXCEP_DC_AMT > 0)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0548);
                    return sRet;
                }

                if (cPluItem.ITEM_DIV != ItemConst.PLU_ITEM_DIV.OPT_MENU)
                {
                    WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0026);
                    return sRet;
                }

                cPluItem.ITEM_PLU_CD = sMemoCode.Substring(11);         // 상품코드
                cPluItem.ITEM_NAME = ">>>" + sMemoName;
                cPluItem.SALE_PRC = 0;
                cPluItem.SUBPRC_MENU_KEY_DIV = "1";                     // 부가메뉴구분(1:속성,2:업차지,3:선택메뉴)

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

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

        /// <summary>
        /// 상품마스터 이미지명 업데이터
        /// </summary>
        /// <returns></returns>
        public void UpdateMstItemImageName()
        {
            string sQuery = "", sUpdQuery = "";
            ArrayList alUpdQuery = new ArrayList();

            try
            {
                sUpdQuery  = " UPDATE POSMST..MST_ITEM SET ";
                sUpdQuery += "   SALE_IMG_FILE_NM = '{0}' ";
                sUpdQuery += "   , BTN_ITEM_IMG = '{1}' ";
                sUpdQuery += " WHERE CMP_CD = '{2}' ";
                sUpdQuery += "    AND STOR_CD = '{3}' ";
                sUpdQuery += "    AND SUB_STOR_CD  = '{4}' ";
                sUpdQuery += "    AND ITEM_CD  = '{5}' ";

                // 대상 상품 조회
                sQuery  = " SELECT A.* ";
                sQuery += " FROM POSMST..MST_ITEM A ";
                sQuery += " JOIN POSMST..MST_ITEM_KEY  B ON A.CMP_CD=B.CMP_CD AND A.STOR_CD=B.STOR_CD AND A.SUB_STOR_CD = B.SUB_STOR_CD AND A.ITEM_CD = B.ITEM_CD ";
                sQuery += " WHERE A.CMP_CD = '" + m_cPosStatus.Base.CmpCd + "' ";
                sQuery += "    AND A.STOR_CD = '" + m_cPosStatus.Base.StoreNo + "' ";
                sQuery += "    AND A.USE_YN  = '" + PosConst.MST_USE_YN.YES + "' ";

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

                foreach (DataRow dr in dtMstItem.Rows)
                {
                    string sSubStorCd = CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.SUB_STOR_CD).Trim();
                    string sItemCode = CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.ITEM_CD).Trim();
                    string sFileNameFull = CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.SALE_IMG_FILE_NM).Trim();
                    string sFileNameBtn = CmUtil.GetDataRowStr(dr, PosMst.MST_ITEM.DATA.BTN_ITEM_IMG).Trim();

                    string sNewFileNameFull = "";
                    if (File.Exists(BaseCom.NxCDPPath + PosConst.MST_IMG_PATH.ITEM + sItemCode + "_FULL.PNG") == true)
                        sNewFileNameFull = sItemCode + "_FULL.PNG";
                    else if (File.Exists(BaseCom.NxCDPPath + PosConst.MST_IMG_PATH.ITEM + sFileNameFull) == true)
                        sNewFileNameFull = sFileNameFull;

                    string sNewFileNameBtn = "";
                    if (File.Exists(BaseCom.NxCDPPath + PosConst.MST_IMG_PATH.ITEM + sItemCode + ".PNG") == true)
                        sNewFileNameBtn = sItemCode + ".PNG";
                    else if (File.Exists(BaseCom.NxCDPPath + PosConst.MST_IMG_PATH.ITEM + sFileNameBtn) == true)
                        sNewFileNameBtn = sFileNameBtn;

                    if (sFileNameFull != sNewFileNameFull || sFileNameBtn != sNewFileNameBtn)
                    {
                        sQuery = string.Format(sUpdQuery, sNewFileNameFull, sNewFileNameBtn, m_cPosStatus.Base.CmpCd, m_cPosStatus.Base.StoreNo, sSubStorCd, sItemCode);

                        alUpdQuery.Add(sQuery);   
                    }
                }

                if (alUpdQuery.Count > 0)
                {
                    string[] saQuery = new string[alUpdQuery.Count];
                    for (int i = 0; i < alUpdQuery.Count; i++)
                    {
                        saQuery[i] = (string)alUpdQuery[i];
                    }
                    m_cMstService.Update(saQuery);
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
        }

        /// <summary>
        /// 상품아이템 할인 전체 취소
        /// </summary>
        /// <returns></returns>
        //#20170920 보류 처리시 임의할인 내역 유지 되도록 수정 start
        //기존
        //public bool ItemDcAllClear(bool bCampaignClear, bool bEtcCodeClear = false)
        //변경
        public bool ItemDcAllClear(bool bCampaignClear, bool bEtcCodeClear = false, bool bNorDcClear = true)
        //#20170920 보류 처리시 임의할인 내역 유지 되도록 수정 end
        {
            bool bRet = false;

            try
            {
                if (bCampaignClear == true)
                    m_cCampaingMain.ClearCampaignAmt(); // 캠페인 취소 처리

                //상품 할인정보 초기화
                foreach (Column.TR_PLU.DATA cPluItem in m_alTrPluItem)
                {
                    //#20170920 보류 처리시 임의할인 내역 유지 되도록 수정 start
                    //기존
                    /*
                    cPluItem.DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;	            // POS      할인 구분
                    cPluItem.DC_TYPE = ItemConst.PLU_DC_TYPE.NORMAL;            // 할인     유형
                    cPluItem.DC_RATE = 0;							            // POS 할인 율
                    cPluItem.ITEM_DC_AMT = 0;						            // POS 단품 할인 금액
                    */
                    //변경
                    if (bNorDcClear == true)
                    {
                        cPluItem.DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;	            // POS      할인 구분
                        cPluItem.DC_TYPE = ItemConst.PLU_DC_TYPE.NORMAL;            // 할인     유형
                        cPluItem.DC_RATE = 0;							            // POS 할인 율
                        cPluItem.ITEM_DC_AMT = 0;						            // POS 단품 할인 금액
                    }
                    //#20170920 보류 처리시 임의할인 내역 유지 되도록 수정 end

                    cPluItem.SUM_DC_AMT = 0;						            // POS 소계 할인 금액
                    cPluItem.CPI_DC_QTY = 0;						            // 캠페인   성립 수량
                    cPluItem.CPI_DC_AMT = 0;						            // 캠페인   할인 금액
                    cPluItem.COOP_CARD_DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;	// 제휴카드 할인 구분
                    cPluItem.COOP_CARD_DC_AMT = 0;							    // 제휴카드 할인 금액
                    cPluItem.POINT_DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;	    // 포인트   할인 구분
                    cPluItem.POINT_DC_AMT = 0;						            // 포인트   할인 금액
                    cPluItem.CPN_DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;	        // 쿠폰     할인 구분
                    cPluItem.CPN_DC_AMT = 0;							        // 쿠폰     할인 금액
                    cPluItem.EMP_DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;	        // 직원     할인 구분
                    cPluItem.EMP_DC_AMT = 0;							        // 직원     할인 금액
                    cPluItem.SET_DC_AMT = 0;							        // 세트     할인 금액
                    cPluItem.SET_DC_GROUP_CD = 0;							    // 세트     세트그룹코드
                    cPluItem.ETC_DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;	        // 기타     할인 구분
                    cPluItem.ETC_DC_AMT = 0;							        // 기타     할인 금액
                    cPluItem.EXCEP_DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;	    // 예외     할인 구분
                    cPluItem.EXCEP_DC_AMT = 0;							        // 예외     할인 금액
                    cPluItem.CPI_PRESENT_DIV = "0";						        // 캠페인   증정 구분

                    if (bEtcCodeClear == true)
                    {
                        // 기타부가정보 초기화

                        //#15149 PB 오목교 - 기부내역 불러온뒤 제품추가 후 결제하면 추가한수량 합계되지않는 증상 start
                        //기존
                        cPluItem.NONSALES_RSN_CD = "0";
                        
                        //변경
                        //if (m_cTrnStatus.Head.TradeDiv == ItemConst.TRAN_DIV.NORMAL && m_cTrnStatus.Head.TradeKind == ItemConst.TRAN_KIND.ETC.LOSS)
                        //{ 
                        //    if (cPluItem.NONSALES_RSN_CD != "")
                        //    {
                        //        DataTable dt = m_cDataCommon.SeletCommonCode(PosConst.COMMON_CODE_GROUP.S0001, cPluItem.NONSALES_RSN_CD);
                        //        if (dt != null && dt.Rows.Count > 0)
                        //        {
                        //            DataRow dr = dt.Rows[0];
                        //            cPluItem.NONSALES_RSN_NM = CmUtil.GetDataRowStr(dr, PosMst.MST_COMMON.DATA.CD_NM);
                        //        }
                        //    }
                        //
                        //    m_cTrnStatus.Head.NonSaleRsnCd = cPluItem.NONSALES_RSN_CD;
                        //    m_cTrnStatus.Head.LossTitle = cPluItem.NONSALES_RSN_NM;
                        //}
                        //else
                        //{
                        //    cPluItem.NONSALES_RSN_CD = "0";
                        //}
                        //#15149 PB 오목교 - 기부내역 불러온뒤 제품추가 후 결제하면 추가한수량 합계되지않는 증상 end

                        cPluItem.PACK_DIV = "0";
                        cPluItem.CPI_PRESENT_DIV = "0";
                        cPluItem.BILLSPR_NO = 0;
                        cPluItem.SALE_GIFT_NO = "";
                        cPluItem.CPN_NO = "";
                    }
                }

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

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

            return bRet;
        }

        //#Rhee, 20180130 단품 할인 전체 취소 추가 Start
        /// <summary>
        /// 단품 할인 적용 전체 취소
        /// </summary>
        /// <param name="sDcDiv"></param>
        /// <param name="sDcType"></param>
        /// <returns></returns>
        public string SetDcCancelItem(string sDcDiv, string sDcType)
        {
            string sRet = UserCom.RST_ERR;

            try
            {
                if (WinManager.QuestionMessage(POS_MESSAGE.ERROR.MSG_0053) != false)    // 등록된 할인을 취소 하시겠습니까?
                {
                    // 상품 정보
                    foreach (Column.TR_PLU.DATA cPluItem in m_alTrPluItem)
                    {
                        if (cPluItem.DC_DIV == sDcDiv && (cPluItem.DC_TYPE == sDcType || cPluItem.DC_TYPE == "1"))
                        {
                            cPluItem.ITEM_DC_AMT = 0;
                            cPluItem.DC_RATE = 0;
                            cPluItem.DC_DIV = ItemConst.PLU_DC_DIV.NORMAL;
                            cPluItem.DC_TYPE = ItemConst.PLU_DC_TYPE.NORMAL;
                            m_cDataService.UpdatePluItemAmount(cPluItem);
                            if (cPluItem.ORDER_OK_FLAG == PosConst.PLU_ORDER_OK_FLAG.ORDER_OK) cPluItem.ORDER_OK_FLAG = PosConst.PLU_ORDER_OK_FLAG.ORDER_MOD;
                        }
                    }

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

                    sRet = UserCom.RST_OK;
                }
            }
            catch (Exception ex)
            {
                WinManager.ExceptionMessage(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
                    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex.Message);
            }
            return sRet;
        }
        //#Rhee, 20180130 단품 할인 전체 취소 추가 End
    }
}
