using System; using System.Data; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Cosmos.BaseFrame; using Cosmos.UserFrame; using Cosmos.ServiceProvider; using Cosmos.Common; using Cosmos.CommonManager; using System.Threading; using System.Collections; using SPC.Kiosk.Common; using SPC.Kiosk.Popup.Model; namespace SPC.Kiosk.Payments { /// /// POS HappyPoint Approval Process /// public class posMobileHappyCoupon : IDisposable { //CommonLog.ErrorLogWrite(this, "Ctor", "Fail", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); #region [ Members ] /// /// HappyPointCertify ErrorCode /// public enum ErrorCode { MobileHappyCouponMobilePhoneNumberError, MobileHappyCouponMobileCouponNumberError, MobileHappyCouponMemInfoEncryptedCardNoError, MobileHappyCouponNotInitailzedError, MobileHappyCouponProcessingTimeOut, MobileHappyCouponTotalAmount, MobileHappyCouponCanUseCouponsIsZero, MobileHappyCouponUnknownError, } /// /// ErrorMessage Event /// /// 반환 로그 public delegate void ErrorMessageEventHandler(string ErrorString); /// /// 로그메세지 이벤트 반환용 /// public event ErrorMessageEventHandler ErrorMessageEvent; /// /// Error 반환 Event /// /// 반환 Error Code public delegate void LogErrorHandler(ErrorCode errorCode); /// /// Error Code 이벤트 반환용 /// public event LogErrorHandler ErrorEvent; /// /// IcReadStart Event /// /// public delegate void IcReadStart(object sender); /// /// IcReadStart Event 반환용 /// public event IcReadStart ReadStart; /// /// IcReadStart Event /// /// public delegate void IcReadEnd(object sender); /// /// IcReadStart Event 반환용 /// public event IcReadEnd ReadEnd; private SManager sManager = null; // 이 객체를 통해 업무 Service 호출 private StateServer StateObject = null; // StateObject : StateServer Object (객체) private PosStatus m_cPosStatus = null; // 기본정보 참조 private TranStatus m_cTrnStatus = null; // 거래정보 참조 private DeviceStatus m_cDevStatus = null; // 디바이스 관리 private IDataProcessUs m_cDataService = null; private IDataCommonUs m_cDataCommon = null; private IPaymentUs m_cMobileCoupon = null; private string mPay_DC_Type = ""; // 결제 그룹 코드 private string mPay_DC_CD = ""; // 결제 상세 코드 private string m_sPosMenuKey = PosKey.MENU_KEY.MOBILE_COUPON_HAPPYCON; // 입력값 할인 private string[] m_aRecvdData = null; /// /// 상품정보 작업용 /// private ArrayList m_aSaleItem = null; private struct ITEM_PLU_CHECK { public string sCouponNo; // 쿠폰코드 public string sVCouponNo; // 가상 쿠폰코드 public string sProductID; // 프로덕트 코드 public string iTemCD; // 상품코드 public double T_Qty; // 구매해야될 건수 public double S_Qty; // 구매한 건수 public double SALE_PRC; // 상품단가 public double SaleAmt; // 상품판매금액 public double PayAmt; // 상품결제금액 public double DCAmt; // 할인 } /// /// 입력구분 /// private string m_sInPutType = ""; /// /// 입력데이터 /// private string m_sInPutData = ""; /// /// 마스킹데이터 /// private string m_sInMaskData = ""; /// /// 카드데이터(암호화) /// private string m_sInEncData = ""; /// /// 서비스코드 /// private string m_sServiceCode = ""; /// /// 승인카드번호 /// private string m_sAppCardNo = ""; /// /// 조회 성공 여부 /// private bool m_bSearchSuccess = false; /// /// POS 초기화 필요 유무 /// public bool NeedInitModule { get; set; } /// /// 승인 수단 /// public string CertifyKey { get; set; } = string.Empty; /// /// 마스크된 회원성명 /// public string MemberName { get; protected set; } = string.Empty; public string MemberNumber { get; protected set; } = string.Empty; /// /// SPC 임직원 유무 /// public bool IsCompanyMember { get; protected set; } /// /// 적립 가능 유무 /// public bool CanReservePoint { get; protected set; } /// /// 회원 등급 /// public string MemberLevel { get; protected set; } = string.Empty; /// /// 회원 비밀번호 /// public string MemberPassword { get; protected set; } = string.Empty; /// /// HappyApp 가입 고객 /// public bool IsAppMamber { get; protected set; } = false; /// /// 단골 매장 유무 /// public bool IsFavoriteStore { get; protected set; } = false; /// /// 회원 적립 Point /// public double MemberPoint { get; protected set; } = 0d; /// /// 회원 가용 Point /// public double UseablePoint { get; protected set; } = 0d; /// /// 승인 요청 포인트 /// public double UseingPoint { get; set; } = 0d; /// /// 승인 포인트 /// public double ApprovalPoint { get; protected set; } = 0d; /// /// Point 사용시 비번 필요 유무 /// public bool NeedPassword { get; protected set; } public double Payments { get; protected set; } public long PaySEQ { get; protected set; } /// /// 인증 처리 성공 유무 /// public bool ProcessOK { get { return m_bSearchSuccess; } } /// /// Processing TimeOut /// public bool IsTimeout { set { if (value) { ErrorEvent(ErrorCode.MobileHappyCouponProcessingTimeOut); } } } public M_MobileCouponReturn CouponData { get; protected set; } #endregion #region [ Ctor && Dispose ] /// /// Ctor /// public posMobileHappyCoupon() { try { sManager = new SManager(); StateObject = (StateServer)StateServer.GetInstance(); NeedInitModule = StateObject.POS == null || StateObject.TRAN == null || StateObject.DEVICE == null; if (!NeedInitModule) { m_cPosStatus = (PosStatus)StateObject.POS; // POS 기본정보 m_cTrnStatus = (TranStatus)StateObject.TRAN; // POS 거래정보 m_cDevStatus = (DeviceStatus)StateObject.DEVICE; m_cDataService = (IDataProcessUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_SERVICE); m_cDataCommon = (IDataCommonUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_COMMON); m_cMobileCoupon = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.MOBILECOUPON_HAPPYCON); } } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "Ctor", "Fail", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } /// /// /// public void Dispose() { try { InDataToZeroFill(); sManager = null; StateObject = null; m_cPosStatus = null; // POS 기본정보 m_cTrnStatus = null; // POS 거래정보 m_cDevStatus = null; m_cDataService = null; m_cDataCommon = null; m_cMobileCoupon = null; } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "Dispose", "Fail", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } #endregion #region [ Methods ] /// /// HappyPoint 회원 조회 (16 자리이면 Mobile BarCode, 그외는 전화 번호) /// /// public void StartCertifyProcessing(string _inputString,double _payments) { try { CommonLog.InfoLogWrite(this, "StartCertifyProcessing()", "Start"); SendReadStart(); if (NeedInitModule) { Thread.Sleep(1000); //진행창 보이기 위한 딜레이 ErrorEvent(ErrorCode.MobileHappyCouponNotInitailzedError); } else { var startPorcess = false; if (_inputString.Length > 6) { startPorcess = GetPrefixToPayTypeInfo(_inputString); Payments = _payments; } else { SendErrLogEvent(ErrorCode.MobileHappyCouponMobileCouponNumberError); } //조회 전문 처리 if (startPorcess) { //SearchTxtInPut(PosConst.POS_INQ_MODE.SEARCH, "", ""); SearchTxtInPut(_inputString, _payments); } } SendReadEnd(); CommonLog.InfoLogWrite(this, "StartCertifyProcessing()", string.Format("End : Result={0}", ProcessOK ? "OK" : "Fail")); } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "StartCertifyProcessing()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } public void StartPaymentProcessing(M_MobileCouponReturn _mobileCouponReturn, double _payments) { try { CommonLog.InfoLogWrite(this, "StartPaymentProcessing()", "Start"); SendReadStart(); if (NeedInitModule) { Thread.Sleep(3000); //진행창 보이기 위한 딜레이 ErrorEvent(ErrorCode.MobileHappyCouponNotInitailzedError); } else { var startPorcess = false; if (_mobileCouponReturn is M_MobileCouponReturn && _mobileCouponReturn.VirtureCoupons.Where(r=>r.RequestPrice > 0 ).Count() > 0) { CouponData = _mobileCouponReturn; Payments = _payments; startPorcess = true; } else { SendErrLogEvent(ErrorCode.MobileHappyCouponTotalAmount); } //승인 전문 처리 if (startPorcess) { CompleteTxtInPut(); } } SendReadEnd(); CommonLog.InfoLogWrite(this, "StartPaymentProcessing()", string.Format("End : Result={0}", ProcessOK ? "OK" : "Fail")); } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "StartPaymentProcessing()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } #region Prefix에 의한 사용 Van 정보 조회 /// /// Prefix에 의한 사용 Van 정보 조회 /// /// /// private bool GetPrefixToPayTypeInfo(string sCardNo) { bool result = false; try { if (sCardNo.Length == 0) return false; // PreFix 검색 DataTable dtVanInfo = m_cDataCommon.SeletPrefixToPayTypeInfo(sCardNo); if (dtVanInfo == null || dtVanInfo.Rows.Count <= 0) { SendErrLogEvent(ErrorCode.MobileHappyCouponMobileCouponNumberError); result = false; } else { DataRow drVanInfo = dtVanInfo.Rows[0]; // 결제 그룹 코드 mPay_DC_Type = CmUtil.GetDataRowStr(drVanInfo, "PAY_DC_GRP_TYPE"); // 결제 상세 코드 mPay_DC_CD = CmUtil.GetDataRowStr(drVanInfo, "PAY_DC_CD"); result = true; } } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "GetPrefixToPayTypeInfo()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); result = false; } return result; } #endregion #region CouponData 처리용 함수 private MobileCouponType GetMobileCouponType(string _TypeCode) { MobileCouponType result = MobileCouponType.Normal; try { switch (_TypeCode) { case "0": result = MobileCouponType.Normal; break; case "1": result = MobileCouponType.NormalValue; break; case "2": result = MobileCouponType.CountLimit; break; case "3": result = MobileCouponType.ValueLimit; break; case "4": result = MobileCouponType.ValueFixed; break; default: result = MobileCouponType.Normal; break; } } catch { result = MobileCouponType.Normal; } return result; } private string GetStringMobileCouponType(MobileCouponType _Type) { string result = "0"; try { switch (_Type) { case MobileCouponType.Normal: result = "0"; break; case MobileCouponType.NormalValue: result = "1"; break; case MobileCouponType.CountLimit: result = "2"; break; case MobileCouponType.ValueLimit: result = "3"; break; case MobileCouponType.ValueFixed: result = "4"; break; default: result = "0"; break; } } catch { result = "0"; } return result; } private MobileCouponStatusType GetMobileCouponStatusType(string _TypeCode) { MobileCouponStatusType result = MobileCouponStatusType.CanNotUse; try { switch (_TypeCode) { case "Y": result = MobileCouponStatusType.CanUse; break; case "N": result = MobileCouponStatusType.CanNotUse; break; case "D": result = MobileCouponStatusType.Used; break; case "C": result = MobileCouponStatusType.Cancel; break; case "R": result = MobileCouponStatusType.Refound; break; default: result = MobileCouponStatusType.CanNotUse; break; } } catch (Exception) { result = MobileCouponStatusType.CanNotUse; } return result; } private string GetNextData(ref int _index) { string result = string.Empty; try { _index++; if (m_aRecvdData.Length > _index) { result = m_aRecvdData[_index].Trim(); } } catch (Exception) { result = string.Empty; } return result; } private bool CouponDataCreate() { bool result = false; try { int dataIndex = -1; if (m_aRecvdData is string[] && m_aRecvdData.Length > 6) { if (GetNextData(ref dataIndex).Equals("0")) { GetNextData(ref dataIndex); // [1] 버림 CouponData = new M_MobileCouponReturn { Number = GetNextData(ref dataIndex), //[2] Name = GetNextData(ref dataIndex), //[3] TotalAmount = CmUtil.LongParse(GetNextData(ref dataIndex)), //[4] IsOnlyAllUse = GetNextData(ref dataIndex).Equals("1"), //[5] }; var virtureCouponCount = CmUtil.LongParse(GetNextData(ref dataIndex)); //[6] var virtureCoupons = new List(); for (int iLoop = 0; iLoop < virtureCouponCount; iLoop++) { var aVirtureCoupon = new M_MobileCouponDetail { Number = GetNextData(ref dataIndex), Name = GetNextData(ref dataIndex), BrandCode = GetNextData(ref dataIndex), BrandName = GetNextData(ref dataIndex), Type = GetMobileCouponType(GetNextData(ref dataIndex)), Option = GetNextData(ref dataIndex).Equals("1") ? MobileCouponOptionType.ItemFixed : MobileCouponOptionType.None, ShowPrice = CmUtil.LongParse(GetNextData(ref dataIndex)), ByePrice = CmUtil.LongParse(GetNextData(ref dataIndex)), RemainPrice = CmUtil.LongParse(GetNextData(ref dataIndex)), CanUsingPrice = CmUtil.LongParse(GetNextData(ref dataIndex)), GroupNo = CmUtil.IntParse(GetNextData(ref dataIndex)), GroupLimitUsingCount = CmUtil.IntParse(GetNextData(ref dataIndex)), StartDate = CommonFunction.GetDate(GetNextData(ref dataIndex)), EndDate = CommonFunction.GetDate(GetNextData(ref dataIndex)), Status = GetMobileCouponStatusType(GetNextData(ref dataIndex)), StatusDetail = GetNextData(ref dataIndex), ItemCodeKey = GetNextData(ref dataIndex), }; var itemCount = CmUtil.IntParse(GetNextData(ref dataIndex)); var itemCodes = new List(); if (itemCount > 0) { for (int iLoop2 = 0; iLoop2 < itemCount; iLoop2++) { itemCodes.Add(GetNextData(ref dataIndex)); } } aVirtureCoupon.ItemCodes = itemCodes; virtureCoupons.Add(aVirtureCoupon); } if (virtureCoupons.Where(r => r.Status.Equals(MobileCouponStatusType.CanUse)).Count() > 0) { CouponData.VirtureCoupons = virtureCoupons.OrderBy(r => r.Status).ToList(); result = true; } else { SendErrLogEvent(ErrorCode.MobileHappyCouponCanUseCouponsIsZero); CommonLog.ErrorLogWrite(this, "CouponDataCreate()", "Not found useable Coupons", string.Format("{0} : {1}", CouponData.Name, CouponData.Number)); } } else { CommonLog.ErrorLogWrite(this, "CouponDataCreate()", "Fail !!", string.Format("{0}={1}", m_aRecvdData[0].Trim(), m_aRecvdData[1].Trim())); } } else { CommonLog.ErrorLogWrite(this, "CouponDataCreate()", "Recive Data Length Fail !!"); } } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "CouponDataCreate()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); result = false; } return result; } #endregion /// /// 조회 처리 /// /// private void SearchTxtInPut(string _inputString, double _payments) { string sCoponinfo = ""; string sInPutType = ""; string sInPutData = ""; string sInEncData = ""; try { CommonLog.DebugLogWrite(this, "SearchTxtInPut()", "Start"); // 중복체크 //if (DataGridSetting(4, ref aRet, ref aRet2, ref aRet3) != UserCom.RST_OK) return sRet; var sSearchType = PosConst.POS_INQ_MODE.SEARCH; sInPutType = m_sInPutType; sInPutData = m_sInPutData; sInEncData = m_sInEncData; if (m_sInEncData == "") { if (m_sInPutData == "") { sInPutType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_KEYIN_CP; sInPutData = _inputString; } } m_aRecvdData = null; var sRet = m_cMobileCoupon.SearchPayment(new string[] { m_sPosMenuKey, sInPutType, sInPutData, sInPutData, _payments.ToString(), "", "", "", mPay_DC_Type, mPay_DC_CD, sSearchType, sCoponinfo }, ref m_aRecvdData); if (sRet != UserCom.RST_OK) { InDataToZeroFill(); if (sRet == null || sRet.Equals(UserCom.RST_ERR)) { SendErrLogEvent(ErrorCode.MobileHappyCouponUnknownError); } else { SendErrorMessageEvent(sRet); } } else { m_bSearchSuccess = CouponDataCreate(); } CommonLog.DebugLogWrite(this, "SearchTxtInPut()", string.Format("End : Result={0}", sRet)); } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "SearchTxtInPut()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } } /// /// 사용 승인 처리 /// /// private void CompleteTxtInPut() { CommonLog.DebugLogWrite(this, "CompleteTxtInPut()", "Start"); string sProductiTem = string.Empty; string sRet = UserCom.RST_ERR; try { m_bSearchSuccess = false; var sSendData = new StringBuilder(); var sCounponIfo = new StringBuilder(); bool biTemCheck = false; // 상품정보 ArrayList aSaleItem = (ArrayList)StateObject.GetItemObject(Column.TR_PLU.ITEM); m_aSaleItem = new ArrayList(); for (int iRow = 0; iRow < aSaleItem.Count; iRow++) { Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)aSaleItem[iRow]; m_aSaleItem.Add(cSaleItem.Clone()); } var checkOK = true; sSendData.Append(CmUtil.MidH(CouponData.VirtureCoupons.Where(r => r.Status.Equals(MobileCouponStatusType.CanUse)).Sum(r2=>r2.DiscountPrice).ToString(), 0, 10)); sSendData.Append(CmUtil.MidH(CouponData.VirtureCoupons.Where(r =>r.Status.Equals(MobileCouponStatusType.CanUse)).Count().ToString(), 0, 5)); foreach (var aCoupon in CouponData.VirtureCoupons) { if (aCoupon.DiscountPrice > 0) { if (CouponData.IsOnlyAllUse) { var checkGrooup = aCoupon.GroupNo; var groupItemCount = CouponData.VirtureCoupons.Where(r => r.GroupNo.Equals(checkGrooup) && r.Status.Equals(MobileCouponStatusType.CanUse)).Count(); var usingIgtemCount = CouponData.VirtureCoupons.Where(r => r.GroupNo.Equals(checkGrooup) && r.RequestPrice > 0 && r.Status.Equals(MobileCouponStatusType.CanUse)).Count(); if (usingIgtemCount < groupItemCount) { SendErrorMessageEvent(POS_MESSAGE.ERROR.MSG_0410); checkOK = false; break; } } if (!string.IsNullOrEmpty(aCoupon.ItemCodeKey) && (aCoupon.Type.Equals(MobileCouponType.Normal) || aCoupon.Type.Equals(MobileCouponType.CountLimit) || aCoupon.Type.Equals(MobileCouponType.ValueFixed) )) { sRet = GetDCItemAmount(aCoupon.ItemCodeKey , CouponData.Number , aCoupon.Number , m_cDataService.DoubleParse(aCoupon.DiscountPrice.ToString()) , aCoupon.Option.Equals(MobileCouponOptionType.ItemFixed) ? "1" : "0", ref sProductiTem); if (sRet != UserCom.RST_OK && aCoupon.Option.Equals(MobileCouponOptionType.ItemFixed)) { SendErrorMessageEvent(sRet); checkOK = false; break; } } sSendData.Append(CmUtil.MidH(CouponData.Number, 0, 32)); //쿠폰번호 sSendData.Append(CmUtil.MidH(aCoupon.Number, 0, 32)); //가상쿠폰번호 sSendData.Append(CmUtil.MidH(aCoupon.DiscountPrice.ToString(), 0, 10)); //사용금액 sCounponIfo.Append(CmUtil.MidH(CouponData.Number, 0, 32)); //쿠폰번호 sCounponIfo.Append("|"); sCounponIfo.Append(CmUtil.MidH(aCoupon.Number, 0, 32)); //가상쿠폰번호 sCounponIfo.Append("|"); sCounponIfo.Append(GetStringMobileCouponType(aCoupon.Type)); //쿠폰종류 sCounponIfo.Append("@~"); if (aCoupon.Option.Equals(MobileCouponOptionType.ItemFixed)) biTemCheck = true; } } if (checkOK) { if (biTemCheck == true) { sSendData.Append(CmUtil.MidH(m_aSaleItem.Count.ToString(), 0, 5)); // POS 상품갯수 for (int iRow = 0; iRow < m_aSaleItem.Count; iRow++) { Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)m_aSaleItem[iRow]; if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cSaleItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;// 지정취소 sSendData.Append(CmUtil.MidH(cSaleItem.ITEM_PLU_CD, 0, 32)); // POS 상품코드 // 전문 설정 오류 수정(2017.05.22) sSendData.Append(CmUtil.MidH(cSaleItem.SALE_AMT.ToString(), 0, 10)); // POS 상품금액 //sSendData += m_cDataService.DoubleParse(CmUtil.MidH(cSaleItem.SALE_AMT.ToString(), 0, 10)); // POS 상품금액 } } else { sSendData.Append(CmUtil.MidH("0", 0, 5)); // POS 상품갯수 } string sInPutType = m_sInPutType; string sInPutData = m_sInPutData; string sInEncData = m_sInEncData; if (m_sInEncData == "") { if (m_sInPutData == "") { sInPutType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_KEYIN_CP; sInPutData = CouponData.Number; } } // 승인 처리 sRet = m_cMobileCoupon.SetPayment(new string[] { m_sPosMenuKey, sInPutType, sInPutData, sInPutData, "0", "", "", "", mPay_DC_Type, mPay_DC_CD, sSendData.ToString(), sCounponIfo.ToString(), sProductiTem }); if (sRet != UserCom.RST_OK) { InDataToZeroFill(); if (sRet == null || sRet.Equals(UserCom.RST_ERR)) { SendErrLogEvent(ErrorCode.MobileHappyCouponUnknownError); } else { SendErrorMessageEvent(sRet); } } else { CouponData.TotalUseAmount = CouponData.VirtureCoupons.Where(r => r.Status.Equals(MobileCouponStatusType.CanUse)).Sum(r2 => r2.DiscountPrice); foreach (var aCoupon in CouponData.VirtureCoupons) { if (aCoupon.DiscountPrice > 0) aCoupon.PaySEQ = FindPaySEQ(aCoupon.Number); } m_bSearchSuccess = true; } } sSendData.Remove(0, sSendData.Length); sCounponIfo.Remove(0, sCounponIfo.Length); } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "CompleteTxtInPut()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } CommonLog.DebugLogWrite(this, "CompleteTxtInPut()", "End"); } private long FindPaySEQ(string _virtureCouponNo) { var result = -1L; try { var alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM); foreach (var aitem in alPayItem) { if (aitem is Column.TR_PAYMENT.DATA aPayTem) { if (aPayTem.PAY_WAY_CD.Trim().Equals(mPay_DC_Type) && aPayTem.PAY_DTL_CD_01.Trim().Equals(mPay_DC_CD) && aPayTem.OCCUR_ENTRY_09.Trim().Equals(_virtureCouponNo)) { result = aPayTem.SEQ; break; } } } } catch { result = -1L; } return result; } #region ProductID로 등록된 상품 체크 /// /// ProductID로 등록된 상품 체크 /// /// /// /// /// /// /// public string GetDCItemAmount(string sProductID, string sCouponNo, string sVCouponNo, double nPayAmt, string sItemChgUse, ref string siTemCheck) { string sRet = UserCom.RST_ERR; double niTemSum = 0; double nQty = 0; int iMaxIndex = -1; try { // 프로덕트 id 없으면 Skip if (sProductID.Trim().Length <= 0) return sRet; // 쿠폰 List 조회 DataTable dtMemu = m_cDataCommon.SeletProductIDToItemCD(sProductID); if (dtMemu == null || dtMemu.Rows.Count <= 0) { //WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0149); return UserCom.RST_OK; } ITEM_PLU_CHECK iTemCheck = new ITEM_PLU_CHECK(); if (m_aSaleItem.Count <= 0) { return POS_MESSAGE.ERROR.MSG_0149; } foreach (DataRow dr in dtMemu.Rows) { // Product ID로 결제구분을 재설정한다. string sDC_Type = CmUtil.GetDataRowStr(dr, "PAY_DC_GRP_TYPE").Trim(); if (sDC_Type.Trim().Length > 0) mPay_DC_Type = sDC_Type.Trim(); // Product ID로 결제상세코드를 재설정한다. string sDC_CD = CmUtil.GetDataRowStr(dr, "PAY_DC_CD").Trim(); if (sDC_Type.Trim().Length > 0) mPay_DC_CD = sDC_CD.Trim(); for (int iRow = 0; iRow < m_aSaleItem.Count; iRow++) { Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)m_aSaleItem[iRow]; if (cSaleItem.CANCEL_DIV == PosConst.CANCEL_DIV.CANCEL || cSaleItem.CANCEL_DIV_MAIN == PosConst.CANCEL_DIV.CANCEL) continue;// 지정취소 if (cSaleItem.DC_DIV == ItemConst.PLU_DC_DIV.FREE) continue; // 서비스(무료) if (cSaleItem.NONSALES_RSN_CD != "0") continue; // 비매출구분 if (cSaleItem.BILLSPR_NO != m_cTrnStatus.Sale.BillSplitNo) continue; // 빌분리번호 if (cSaleItem.BILL_AMT <= 0) continue; // 영수금액 //if (cSaleItem.DC_PRMT_YN != "0") continue; // 할인가능 여부 if (CmUtil.GetDataRowStr(dr, "ITEM_CHECK_YN") == "1") { // 등록된 상품과 쿠폰마스터 상품 체크용 저장 if (CmUtil.GetDataRowStr(dr, "ITEM_CD") == cSaleItem.ITEM_PLU_CD) { // 할인 대상 iTemCD/수량 체크용 저장 nQty = CmUtil.GetDataRowDouble(dr, "QTY"); // 할인금액+결제요금액 보다 상품판매금액이 같거나 큰 경우만 if (nQty > 0 && cSaleItem.SALE_QTY > 0 && cSaleItem.BILL_AMT >= nPayAmt + CmUtil.GetDataRowDouble(dr, "DC_AMT")) { // 제일 큰 금액에 설정 if (iTemCheck.SALE_PRC == 0 || iTemCheck.SALE_PRC < cSaleItem.SALE_PRC) { iMaxIndex = iRow; iTemCheck.sCouponNo = sCouponNo.Trim(); iTemCheck.sVCouponNo = sVCouponNo.Trim(); iTemCheck.sProductID = CmUtil.GetDataRowStr(dr, "PRODUCT_CD").Trim(); iTemCheck.iTemCD = cSaleItem.ITEM_PLU_CD; iTemCheck.SALE_PRC = cSaleItem.SALE_PRC; iTemCheck.SaleAmt = cSaleItem.BILL_AMT; iTemCheck.PayAmt = nPayAmt; iTemCheck.DCAmt = CmUtil.GetDataRowDouble(dr, "DC_AMT"); // 대상 금액 sum niTemSum = CmUtil.DoubleAdd(CmUtil.GetDataRowDouble(dr, "DC_AMT"), nPayAmt); } } } } else { nQty = CmUtil.GetDataRowDouble(dr, "QTY"); // 프로덕트 코드 미설정 오류로 인한 수정(2017.05.18) //if (nQty > 0 && cSaleItem.SALE_QTY > 0 && cSaleItem.BILL_AMT >= nPayAmt + CmUtil.GetDataRowDouble(dr, "DC_AMT")) //{ // 제일 큰 금액에 설정 if (iTemCheck.SALE_PRC == 0 || iTemCheck.SALE_PRC < cSaleItem.SALE_PRC) { iMaxIndex = iRow; iTemCheck.sCouponNo = sCouponNo.Trim(); iTemCheck.sVCouponNo = sVCouponNo.Trim(); iTemCheck.sProductID = CmUtil.GetDataRowStr(dr, "PRODUCT_CD").Trim(); iTemCheck.iTemCD = cSaleItem.ITEM_PLU_CD; iTemCheck.SALE_PRC = cSaleItem.SALE_PRC; iTemCheck.SaleAmt = cSaleItem.BILL_AMT; iTemCheck.PayAmt = nPayAmt; iTemCheck.DCAmt = CmUtil.GetDataRowDouble(dr, "DC_AMT"); // 대상 금액 sum niTemSum = CmUtil.DoubleAdd(CmUtil.GetDataRowDouble(dr, "DC_AMT"), nPayAmt); } //} } } } // 적용 상품의 상품금액 변경 if (iMaxIndex > -1) { Column.TR_PLU.DATA cSaleItem = (Column.TR_PLU.DATA)m_aSaleItem[iMaxIndex]; cSaleItem.CPN_DC_DIV = mPay_DC_Type + mPay_DC_CD; cSaleItem.CPN_DC_AMT = CmUtil.DoubleAdd(cSaleItem.CPN_DC_AMT, iTemCheck.DCAmt); cSaleItem.BILL_AMT = CmUtil.DoubleSubtraction(cSaleItem.BILL_AMT, iTemCheck.DCAmt); } //// 구매수량 체크 //for (int index = 0; index < m_aSaleItem.Count; index++) //{ // if (iTemCheck.iTemCD != "") // { // if (iTemCheck.T_Qty >= 0 && iTemCheck.S_Qty != 0) // { // WinManager.ErrorMessage(POS_MESSAGE.ERROR.MSG_0160); // return sRet; // } // } //} // 금액 체크 if (niTemSum > Payments) { return POS_MESSAGE.ERROR.MSG_0160; } // 가능한 상품 미존재시 && 타상품 교환 불가시 if (niTemSum <= 0 && sItemChgUse == "1") { return POS_MESSAGE.ERROR.MSG_0160; } // 프로덕트 정보 체크용 if (!string.IsNullOrEmpty(iTemCheck.sCouponNo) && iTemCheck.sCouponNo.Trim() != "") { siTemCheck += iTemCheck.sCouponNo; siTemCheck += "!~"; siTemCheck += iTemCheck.sVCouponNo; siTemCheck += "!~"; siTemCheck += iTemCheck.sProductID; siTemCheck += "!~"; siTemCheck += iTemCheck.iTemCD; siTemCheck += "!~"; siTemCheck += iTemCheck.PayAmt; siTemCheck += "!~"; siTemCheck += iTemCheck.DCAmt; siTemCheck += "$~"; } sRet = UserCom.RST_OK; } catch (Exception ex) { CommonLog.ErrorLogWrite(this, "GetDCItemAmount()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace)); } return sRet; } #endregion #region 여전법 대응 /// /// ZeroFill 초기화 /// private void InDataToZeroFill() { try { //여전법 대응! ////////////////////////////////////////////////////////////////////////////////// CmUtil.ZeroFillClear(ref m_sInPutData); CmUtil.ZeroFillClear(ref m_sInEncData); CmUtil.ZeroFillClear(ref m_sInMaskData); ////////////////////////////////////////////////////////////////////////////////// } catch { } } #endregion 여전법 대응 private void SendErrorMessageEvent(string _errorMessageString) { try { CommonLog.ErrorLogWrite(this, "SendErrorMessageEvent()", _errorMessageString); ErrorMessageEvent(_errorMessageString); } catch { } } private void SendErrLogEvent(ErrorCode _errorCode) { try { CommonLog.DebugLogWrite(this, "SendErrLogEvent()", _errorCode.ToString()); ErrorEvent(_errorCode); } catch { } } private void SendReadStart() { try { CommonLog.DebugLogWrite(this, "SendReadStart()"); ReadStart(this); } catch { } } private void SendReadEnd() { try { CommonLog.DebugLogWrite(this, "SendReadEnd()"); ReadEnd(this); } catch { } } private void ClearCardInfo() { try { m_sInPutType = ""; // 입력구분 m_sInPutData = ""; // 입력데이터 m_sInMaskData = ""; // 마스킹 m_sInEncData = ""; // 카드데이터 m_sServiceCode = ""; // 서비스코드 m_sAppCardNo = ""; // 승인카드번호 m_bSearchSuccess = false; } catch { } } #endregion } }