using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Text; using System.Windows.Input; using System.Windows.Threading; using System.Reflection; using SPC.Kiosk.Base; using SPC.Kiosk.Common; using SPC.Kiosk.Popup.Model; using SPC.Kiosk.Payments; using System.Windows; using System.Threading.Tasks; using System.Threading; namespace SPC.Kiosk.Popup.ViewModel { /// /// OkCashBagCertify.xaml에 대한 ViewModel /// public class VmOkCashBagCertify : PopupViewModelBase { #region [ Members ] private List headerText; /// /// Top Header Text /// public List HeaderText { get { return headerText; } set { headerText = value; PropertyChange("HeaderText"); } } private List scanGuidText; /// /// Second Sub Header Text /// public List ScanGuidText { get { return scanGuidText; } set { scanGuidText = value; PropertyChange("ScanGuidText"); } } private string processingGIF; /// /// Processing GIF /// public string ProcessingGIF { get { return processingGIF; } set { processingGIF = value; PropertyChange("ProcessingGIF"); } } private List infoGuid1Text; /// /// Bootom first infomation text /// public List InfoGuid1Text { get { return infoGuid1Text; } set { infoGuid1Text = value; PropertyChange("InfoGuid1Text"); } } private List infoGuid2Text; /// /// Bottom second infomation text /// public List InfoGuid2Text { get { return infoGuid2Text; } set { infoGuid2Text = value; PropertyChange("InfoGuid2Text"); } } public bool certifyStartVisible = false; /// /// 인증 시작 화면 Visible /// public bool CertifyStartVisible { get { return certifyStartVisible; } set { certifyStartVisible = value; PropertyChange("CertifyStartVisible"); } } public bool certifyProcessingVisible = false; /// /// 인증 진행 화면 Visible /// public bool CertifyProcessingVisible { get { return certifyProcessingVisible; } set { certifyProcessingVisible = value; PropertyChange("CertifyProcessingVisible"); } } public bool processingErrorVisible = false; /// /// 인증 오류 화면 Visible /// public bool ProcessingErrorVisible { get { return processingErrorVisible; } set { processingErrorVisible = value; PropertyChange("ProcessingErrorVisible"); } } public bool certifySuccessVisible = false; /// /// 인증 완료 화면 Visible /// public bool CertifySuccessVisible { get { return certifySuccessVisible; } set { certifySuccessVisible = value; PropertyChange("CertifySuccessVisible"); } } private bool showPhoneInput = false; /// /// Show Phone Input /// public bool ShowPhoneInput { get { return showPhoneInput; } set { showPhoneInput = value; PropertyChange("ShowPhoneInput"); } } private List processingMessageText; /// /// Number Pad Input Guide Text /// public List ProcessingMessageText { get { return processingMessageText; } set { processingMessageText = value; PropertyChange("ProcessingMessageText"); } } private List processingGuide; /// /// Processing Guide Text /// public List ProcessingGuide { get { return processingGuide; } set { processingGuide = value; PropertyChange("ProcessingGuide"); } } private string errorImage; /// /// Error Icon /// public string ErrorImage { get { return errorImage; } set { errorImage = value; PropertyChange("ErrorImage"); } } private List errorGuide; /// /// Error Guide Text /// public List ErrorGuide { get { return errorGuide; } set { errorGuide = value; PropertyChange("ErrorGuide"); } } private List numPadGuidText; /// /// Number Pad Input Guide Text /// public List NumPadGuidText { get { return numPadGuidText; } set { numPadGuidText = value; PropertyChange("NumPadGuidText"); } } private List numPadCancelText; /// /// Number Pad Cancel Button Text /// public List NumPadCancelText { get { return numPadCancelText; } set { numPadCancelText = value; PropertyChange("NumPadCancelText"); } } private List errorText; /// /// Process Error Text /// public List ErrorText { get { return errorText; } set { errorText = value; PropertyChange("ErrorText"); } } private bool isErrorBlink = false; /// /// Is Error Text Blink /// public bool IsErrorBlink { get { return isErrorBlink; } set { isErrorBlink = value; PropertyChange("IsErrorBlink"); } } private string formatedBarCode; /// /// Read Barcode Formated Text /// public string FormatedBarCode { get { return formatedBarCode; } set { formatedBarCode = value; PropertyChange("FormatedBarCode"); } } private string readBarCode; /// /// Read Barcode /// public string ReadBarCode { get { return readBarCode; } set { readBarCode = value; PropertyChange("ReadBarCode"); } } private string inputNumbers = string.Empty; /// /// Number Pad Input Number /// public string InputNumbers { get { return inputNumbers; } set { inputNumbers = value; PropertyChange("InputNumbers"); } } private string memberPointsText = string.Empty; /// /// Number Pad Input Number /// public string MemberPointsText { get { return memberPointsText; } set { memberPointsText = value; PropertyChange("MemberPointsText"); } } private double cancelButtonWidth = 650d; /// /// Cancel Button Width /// public double CancelButtonWidth { get { return cancelButtonWidth; } set { cancelButtonWidth = value; PropertyChange("CancelButtonWidth"); } } private List cancelButtonText; /// /// Cancel Button Text /// public List CancelButtonText { get { return cancelButtonText; } set { cancelButtonText = value; PropertyChange("CancelButtonText"); } } private List okButtonText; /// /// Ok Button Text /// public List OkButtonText { get { return okButtonText; } set { okButtonText = value; PropertyChange("OkButtonText"); } } public bool oKButtonEnabled = false; /// /// OK Button enabled /// public bool OKButtonEnabled { get { return oKButtonEnabled; } set { oKButtonEnabled = value; PropertyChange("OKButtonEnabled"); } } private double okButtonWidth = 650d; /// /// OK Button Width /// public double OKButtonWidth { get { return okButtonWidth; } set { okButtonWidth = value; PropertyChange("OKButtonWidth"); } } public int numPadMaxLength; /// /// Number Pad Input Maxlength /// public int NumPadMaxLength { get { return numPadMaxLength; } set { numPadMaxLength = value; PropertyChange("NumPadMaxLength"); } } private List memberPointsHeaderText; /// /// Cancel Button Text /// public List MemberPointsHeaderText { get { return memberPointsHeaderText; } set { memberPointsHeaderText = value; PropertyChange("MemberPointsHeaderText"); } } private CertifyWindowType certifyWindow = CertifyWindowType.CertifyStart; /// /// Current View Window /// public CertifyWindowType CertifyWindow { get { return certifyWindow; } set { certifyWindow = value; PropertyChange("CertifyWindow"); } } private double popupWidth = 1300; /// /// Popup Whidth (For Calculate OK Button Width) /// public double PopupWidth { get { return popupWidth; } set { popupWidth = value; PropertyChange("PopupWidth"); } } /// /// OK CashBag 인증 정보 /// public M_OkCashBagReturn OkCashBagReturn { get; set; } /// /// OK Click Command /// public ICommand OkCommand { get; protected set; } /// /// Cancel Click Command /// public ICommand CancelCommand { get; protected set; } private bool MemberProcessStart = false; private posOkCashBag posOkCashBag = null; private Task ProcessTask = null; private CancellationTokenSource TokenSource; private string certifyKey = string.Empty; /// /// 바코드스캔 Image /// public string BarcodeScanImage { get; set; } = ResourceManager.GetNximagePathAdd("img_gif_barcode.gif", CommonValue.PBdesignImagesPath); #endregion #region [ Ctor ] /// /// Ctor /// public VmOkCashBagCertify() { OkCommand = new Command(OkCommandHandler); CancelCommand = new Command(CancelCommandHandler); this.PropertyChanged += VmHappyPointCertify_PropertyChanged; HeaderText = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = "OK 캐시백 회원인증" }, new M_Language { Type = SupportLanguageType.en, LanguageData = "enOK 캐시백 회원인증" }, }; ProcessingMessageText = Languages.GetMessages("LBL0087"); ProcessingGuide = Languages.GetMessages("LBL0140"); ErrorImage = ResourceManager.GetNximagePathAdd("ic_alert_error.png", CommonValue.PBdesignImagesPath); ErrorGuide = Languages.GetMessages("LBL0140"); ErrorText = new List(); NumPadMaxLength = 11; NumPadGuidText = Languages.GetMessages("MobileNumberMessage"); NumPadCancelText = Languages.GetMessages("CommonClear"); ProcessingGIF = ResourceManager.GetNximagePathAdd("ic_alert_ing2.gif", CommonValue.PBdesignImagesPath); ShowLanguageType = CommonValue.CommonLanguageType; posOkCashBag = new posOkCashBag(); CertifyWindow = CertifyWindowType.CertifyStart; } ~VmOkCashBagCertify() { this.PropertyChanged -= VmHappyPointCertify_PropertyChanged; if (ProcessTask != null) { ProcessTask.Dispose(); ProcessTask = null; } if (posOkCashBag != null) { CashBagRemoveEvents(); posOkCashBag.Dispose(); posOkCashBag = null; } } #endregion Ctor #region [ Method ] private void InitError() { LastAccessTime = DateTime.Now; ErrorText = new List(); IsErrorBlink = false; } private void CashBagCreateEvents() { if (posOkCashBag != null) { posOkCashBag.ReadStart += PosOkCashBag_ReadStart; posOkCashBag.ReadEnd += PosOkCashBag_ReadEnd; posOkCashBag.ErrorEvent += PosOkCashBag_ErrorEvent; posOkCashBag.ErrorMessageEvent += PosOkCashBag_ErrorMessageEvent; } } private void CashBagRemoveEvents() { if (posOkCashBag != null) { posOkCashBag.ReadStart -= PosOkCashBag_ReadStart; posOkCashBag.ReadEnd -= PosOkCashBag_ReadEnd; posOkCashBag.ErrorEvent -= PosOkCashBag_ErrorEvent; posOkCashBag.ErrorMessageEvent -= PosOkCashBag_ErrorMessageEvent; } } private void DoOkCashBagCertify() { if (posOkCashBag != null) { this.CashBagCreateEvents(); var processTask = new Task(() => posOkCashBag.StartCertifyProcessing(certifyKey)); TokenSource = new CancellationTokenSource(); processTask.Start(); processTask.Wait(); if (posOkCashBag.ProcessOK) { CertifyWindow = CertifyWindowType.CertifySuccess; } else { CertifyWindow = CertifyWindowType.ProcessingError; } CashBagRemoveEvents(); TokenSource.Dispose(); processTask = null; TokenSource = null; } } private void DoBarCodeOkCashBagCertify() { InputNumbers = string.Empty; FormatedBarCode = ReadBarCode.GetEncriptCardNo(); certifyKey = ReadBarCode; CertifyWindow = CertifyWindowType.CertifyProcessing; } #endregion Method #region [ Event Handlers ] private void PosOkCashBag_ErrorMessageEvent(string ErrorString) { ErrorText = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = ErrorString.Replace("\n"," ").Replace("\r","") }, }; IsErrorBlink = true; CertifyWindow = CertifyWindowType.ProcessingError; } private void PosOkCashBag_ErrorEvent(posOkCashBag.ErrorCode _errorCode) { //TODO: 공통에 에러 메세지 등록 필요 //ErrorText = Languages.GetMessages(_errorCode.ToString()); ErrorText = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = _errorCode.ToString() }, }; IsErrorBlink = true; CertifyWindow = CertifyWindowType.ProcessingError; } private void PosOkCashBag_ReadStart(object sender) { MemberProcessStart = true; TimerEnabled = false; } private void PosOkCashBag_ReadEnd(object sender) { if (sender is posHappyPoint getPosposHappyPoint) { if (getPosposHappyPoint.ProcessOK) { OkCashBagReturn = new M_OkCashBagReturn { MemberName = getPosposHappyPoint.MemberName, MemberCode = getPosposHappyPoint.CertifyKey, MemberPoint = getPosposHappyPoint.MemberPoint, NeedPassword = getPosposHappyPoint.NeedPassword, ReservePoint = getPosposHappyPoint.CanReservePoint, }; ReturnValue = new M_PopupReturn { OKAnswer = true, TimeOut = false, ReturnLanguage = ShowLanguageType, PopupArgs = OkCashBagReturn }; MemberPointsText = string.Format("{0} Points", OkCashBagReturn.MemberPoint.ToString("#,##0")); CertifyWindow = CertifyWindowType.CertifySuccess; } } TimerEnabled = true; MemberProcessStart = false; } private void CancelCommandHandler(object obj) { TimerEnabled = false; ReturnValue = new M_PopupReturn { OKAnswer = false, TimeOut = false, ReturnLanguage = ShowLanguageType, PopupArgs = null }; CanWindowClose = true; } private void OkCommandHandler(object obj) { switch (CertifyWindow) { case CertifyWindowType.CertifyStart: certifyKey = InputNumbers; CertifyWindow = CertifyWindowType.CertifyProcessing; break; case CertifyWindowType.ProcessingError: CertifyWindow = CertifyWindowType.CertifyStart; break; case CertifyWindowType.CertifySuccess: if (ProcessTask != null) ProcessTask.Wait(); CanWindowClose = true; break; } } private void VmHappyPointCertify_PropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case "IsTimeout": if (IsTimeout) { switch (CertifyWindow) { case CertifyWindowType.CertifyStart: case CertifyWindowType.ProcessingError: ReturnValue = new M_PopupReturn { OKAnswer = false, TimeOut = true, ReturnLanguage = ShowLanguageType, PopupArgs = null }; break; } if (ProcessTask != null) ProcessTask.Wait(); CanWindowClose = true; } break; case "InputNumbers": if (InputNumbers.Length > 0) { InitError(); ReadBarCode = string.Empty; } OKButtonEnabled = InputNumbers.Length.Equals(10) || InputNumbers.Length.Equals(11); break; case "ReadBarCode": if (!MemberProcessStart) { InitError(); switch (ReadBarCode.Length) { case 17: readBarCode = ReadBarCode.Substring(0, 16); DoBarCodeOkCashBagCertify(); break; case 16: DoBarCodeOkCashBagCertify(); break; default: FormatedBarCode = string.Empty; OKButtonEnabled = false; break; } } break; case "CertifyWindow": CertifyStartVisible = false; CertifyProcessingVisible = false; ProcessingErrorVisible = false; CertifySuccessVisible = false; switch (CertifyWindow) { case CertifyWindowType.CertifyStart: CertifyStartVisible = true; break; case CertifyWindowType.CertifyProcessing: CertifyProcessingVisible = true; break; case CertifyWindowType.ProcessingError: ProcessingErrorVisible = true; break; case CertifyWindowType.CertifySuccess: CertifySuccessVisible = true; break; } break; case "CertifyStartVisible": if (CertifyStartVisible) { ScanGuidText = Languages.GetMessages("LBL0082"); InfoGuid1Text = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = "* 인증시 OK 캐시백 포인트가 적립됩니다." }, new M_Language { Type = SupportLanguageType.en, LanguageData = "en* 인증시OK 캐시백 포인트가 적립됩니다." }, }; InfoGuid2Text = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = "* 수집된 개인정보는 활용 후 자동 폐기 됩니다." }, new M_Language { Type = SupportLanguageType.en, LanguageData = "en* 수집된 개인정보는 활용 후 자동 폐기 됩니다." }, }; CancelButtonWidth = PopupWidth; OKButtonWidth = 0d; OKButtonEnabled = false; //OkButtonText = Languages.GetMessages("CommonYes"); //CancelButtonText = Languages.GetMessages("CommonNo"); OkButtonText = Languages.GetMessages("CommonOK"); CancelButtonText = Languages.GetMessages("CommonCancel"); TimeOutSeconds = CommonValue.TimeOutSeconds; } break; case "CertifyProcessingVisible": if (CertifyProcessingVisible) { ScanGuidText = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = "인증 처리 진행 중입니다." }, new M_Language { Type = SupportLanguageType.en, LanguageData = "en인증 처리 진행 중입니다." }, }; //InfoGuid1Text = new List // { // new M_Language // { // Type = SupportLanguageType.ko, // LanguageData = "* 화면 상태가 지속되면 직원을 호출 하세요." // }, // new M_Language // { // Type = SupportLanguageType.en, // LanguageData = "en* 화면 상태가 지속되면 직원을 호출 하세요." // }, // }; InfoGuid2Text = new List(); if (ProcessTask != null) ProcessTask.Wait(); ProcessTask = new Task(DoOkCashBagCertify); ProcessTask.Start(); //if (ProcessTask != null) //{ // ProcessTask.Dispose(); // ProcessTask = null; //} //ProcessTask = new Task(DoOkCashBagCertify); //ProcessTask.Start(); } break; case "ProcessingErrorVisible": if (ProcessingErrorVisible) { ScanGuidText = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = "인증 처리중 오류가 발생 했습니다." }, new M_Language { Type = SupportLanguageType.en, LanguageData = "en인증 처리중 오류가 발생 했습니다." }, }; InfoGuid1Text = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = "* 10초간 입력이 없으면 취소 처리됩니다." }, new M_Language { Type = SupportLanguageType.en, LanguageData = "en* 10초간 입력이 없으면 취소 처리됩니다." }, }; InfoGuid2Text = new List(); CancelButtonWidth = PopupWidth / 2; OKButtonWidth = PopupWidth / 2; OKButtonEnabled = true; OkButtonText = Languages.GetMessages("CommonRetry"); CancelButtonText = Languages.GetMessages("CommonCancel"); TimeOutSeconds = 10d; } break; case "CertifySuccessVisible": if (CertifySuccessVisible) { ScanGuidText = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = "인증 처리가 완료 되었습니다." }, new M_Language { Type = SupportLanguageType.en, LanguageData = "en인증 처리가 완료 되었습니다." }, }; InfoGuid1Text = new List { new M_Language { Type = SupportLanguageType.ko, LanguageData = "* 사용 가능 포인트를 확인하세요." }, new M_Language { Type = SupportLanguageType.en, LanguageData = "en* 사용 가능 포인트를 확인하세요." }, }; InfoGuid2Text = new List(); CancelButtonWidth = 0d; OkButtonText = Languages.GetMessages("CommonOK"); OKButtonWidth = PopupWidth; OKButtonEnabled = true; TimeOutSeconds = 5d; } break; } } #endregion Event Handlers } }