using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
using SPC.Kiosk.Base;
using SPC.Kiosk.Common;
using SPC.Kiosk.Popup.Model;
using SPC.Kiosk.Payments;
namespace SPC.Kiosk.Popup.ViewModel
{
///
/// HappyPointUsing.xaml에 대한 ViewModel
///
public class VmHappyPointCoupon : PopupViewModelBase
{
#region [ Members ]
private enum ProcessingType
{
SingleCoupon,
CouponUsing
}
private ProcessingType ProcessType { get; set; } = ProcessingType.SingleCoupon;
private List happyAppCoupons = new List();
///
/// Happy App Coupons
///
public List HappyAppCoupons
{
get { return happyAppCoupons; }
set { happyAppCoupons = value; PropertyChange("HappyAppCoupons"); }
}
private string titileImage;
///
/// Barcode Scan Image
///
public string TitileImage
{
get { return titileImage; }
set { titileImage = value; PropertyChange("TitileImage"); }
}
private List headerText;
///
/// Top Header Text (first Grid)
///
public List HeaderText
{
get { return headerText; }
set { headerText = value; PropertyChange("HeaderText"); }
}
private List scanGuidText;
///
/// Second Header Text (first Grid)
///
public List ScanGuidText
{
get { return scanGuidText; }
set { scanGuidText = value; PropertyChange("ScanGuidText"); }
}
private List infoGuid1Text;
///
/// Bootom first infomation text (first Grid)
///
public List InfoGuid1Text
{
get { return infoGuid1Text; }
set { infoGuid1Text = value; PropertyChange("InfoGuid1Text"); }
}
private List infoGuid2Text;
///
/// Bottom second infomation text (first Grid)
///
public List InfoGuid2Text
{
get { return infoGuid2Text; }
set { infoGuid2Text = value; PropertyChange("InfoGuid2Text"); }
}
private string processingGIF;
///
/// Processing GIF
///
public string ProcessingGIF
{
get { return processingGIF; }
set { processingGIF = value; PropertyChange("ProcessingGIF"); }
}
private string errorImage;
///
/// Error Icon
///
public string ErrorImage
{
get { return errorImage; }
set { errorImage = value; PropertyChange("ErrorImage"); }
}
private string successImage;
///
/// Sucess Icon
///
public string SuccessImage
{
get { return successImage; }
set { successImage = value; PropertyChange("SuccessImage"); }
}
public bool couponStartVisible = false;
///
/// 인증 시작 화면 Visible
///
public bool CouponStartVisible
{
get { return couponStartVisible; }
set { couponStartVisible = value; PropertyChange("CouponStartVisible"); }
}
public bool couponUsingVisible = false;
///
/// Point Using Window Visible
///
public bool CouponUsingVisible
{
get { return couponUsingVisible; }
set { couponUsingVisible = value; PropertyChange("CouponUsingVisible"); }
}
public bool processingVisible = false;
///
/// 처리 진행 화면 Visible
///
public bool ProcessingVisible
{
get { return processingVisible; }
set { processingVisible = value; PropertyChange("ProcessingVisible"); }
}
public bool processingErrorVisible = false;
///
/// 인증 오류 화면 Visible
///
public bool ProcessingErrorVisible
{
get { return processingErrorVisible; }
set { processingErrorVisible = value; PropertyChange("ProcessingErrorVisible"); }
}
public bool couponSuccessVisible = false;
///
/// 인증 완료 화면 Visible
///
public bool CouponSuccessVisible
{
get { return couponSuccessVisible; }
set { couponSuccessVisible = value; PropertyChange("CouponSuccessVisible"); }
}
private List pointPadGuidText;
///
/// Point Pad Input Guide Text
///
public List PointPadGuidText
{
get { return pointPadGuidText; }
set { pointPadGuidText = value; PropertyChange("PointPadGuidText"); }
}
private List totalPayHeaderText;
///
/// Payments Total Header Text
///
public List TotalPayHeaderText
{
get { return totalPayHeaderText; }
set { totalPayHeaderText = value; PropertyChange("TotalPayHeaderText"); }
}
private List queryPointsHeaderText;
///
/// Member Point Header Text
///
public List QueryPointsHeaderText
{
get { return queryPointsHeaderText; }
set { queryPointsHeaderText = value; PropertyChange("QueryPointsHeaderText"); }
}
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 List errorGuide;
///
/// Error Guide Text
///
public List ErrorGuide
{
get { return errorGuide; }
set { errorGuide = value; PropertyChange("ErrorGuide"); }
}
private List successText;
///
/// Sucess Guide Text
///
public List SuccessText
{
get { return successText; }
set { successText = value; PropertyChange("SuccessText"); }
}
private double payments;
///
/// Payments Total
///
public double Payments
{
get { return payments; }
set { payments = value; PropertyChange("Payments"); }
}
private List errorText;
///
/// 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 Barcoe 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 List cancelButtonText;
///
/// Cancel Button Text
///
public List CancelButtonText
{
get { return cancelButtonText; }
set { cancelButtonText = value; PropertyChange("CancelButtonText"); }
}
private double cancelButtonWidth = 270d;
///
/// Cancel Button Width
///
public double CancelButtonWidth
{
get { return cancelButtonWidth; }
set { cancelButtonWidth = value; PropertyChange("CancelButtonWidth"); }
}
private double okButtonWidth = 270d;
///
/// OK Button Width
///
public double OKButtonWidth
{
get { return okButtonWidth; }
set { okButtonWidth = value; PropertyChange("OKButtonWidth"); }
}
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 HappyCouponWindowType happyCouponWindow = HappyCouponWindowType.CouponStart;
///
/// Current View Window
///
public HappyCouponWindowType HappyCouponWindow
{
get { return happyCouponWindow; }
set { happyCouponWindow = value; PropertyChange("HappyCouponWindow"); }
}
private double popupWidth = 1300;
///
/// Popup Whidth (For Calculate OK Button Width)
///
public double PopupWidth
{
get { return popupWidth; }
set { popupWidth = value; PropertyChange("PopupWidth"); }
}
private M_HappyPointReturn happyPointReturn;
///
/// HappyPoint 인증 정보
///
public M_HappyPointReturn HappyPointReturn
{
get { return happyPointReturn; }
set { happyPointReturn = value; PropertyChange("HappyPointReturn"); }
}
///
/// OK Click Command
///
public ICommand OkCommand { get; protected set; }
///
/// Cancel Click Command
///
public ICommand CancelCommand { get; protected set; }
///
/// Coupon Selectd
///
public ICommand CouponCommand { get; protected set; }
private bool ProcessStart = false;
private posHappyPoint posHappyPoint = null;
private Task ProcessTask = null;
private string certifyKey = string.Empty;
#endregion Members
#region [ Ctor ]
///
/// Ctor
///
public VmHappyPointCoupon()
{
OkCommand = new Command(OkCommandHandler);
CancelCommand = new Command(CancelCommandHandler);
CouponCommand = new Command(CouponCommandHandler);
this.PropertyChanged += VmHappyPointCoupon_PropertyChanged;
TitileImage = ResourceManager.GetNximagePathAdd("img_gif_barcode_happy.gif", CommonValue.PBdesignImagesPath);
ProcessingGIF = ResourceManager.GetNximagePathAdd("ic_alert_ing2.gif", CommonValue.PBdesignImagesPath);
ErrorImage = ResourceManager.GetNximagePathAdd("ic_alert_error.png", CommonValue.PBdesignImagesPath);
SuccessImage = ResourceManager.GetNximagePathAdd("ic_alert_check.png", CommonValue.PBdesignImagesPath);
ErrorText = new List();
OkButtonText = Languages.GetMessages("BTN0024");
CancelButtonText = Languages.GetMessages("BTN0033");
HeaderText = Languages.GetMessages("LBL0133");
ProcessingMessageText = Languages.GetMessages("LBL0087");
ProcessingGuide = Languages.GetMessages("LBL0028");
ErrorGuide = Languages.GetMessages("LBL0028");
posHappyPoint = new posHappyPoint();
}
public new void Dispose()
{
TitileImage = string.Empty;
ProcessingGIF = string.Empty;
ErrorImage = string.Empty;
this.PropertyChanged -= VmHappyPointCoupon_PropertyChanged;
if (ProcessTask != null)
{
ProcessTask.Dispose();
ProcessTask = null;
}
if (posHappyPoint != null)
{
HappyPointRemoveEvents();
posHappyPoint.Dispose();
posHappyPoint = null;
}
base.Dispose();
}
#endregion Ctor
#region [ Methods ]
private void TestDelay()
{
Thread.Sleep(3000);
}
private void HappyPointCreateEvents()
{
if (posHappyPoint != null)
{
posHappyPoint.ReadStart += PosHappyPoint_ReadStart;
posHappyPoint.ReadEnd += PosHappyPoint_ReadEnd;
posHappyPoint.ErrorEvent += PosHappyPoint_ErrorEvent;
posHappyPoint.ErrorMessageEvent += PosHappyPoint_ErrorMessageEvent;
}
}
private void HappyPointRemoveEvents()
{
if (posHappyPoint != null)
{
posHappyPoint.ReadStart -= PosHappyPoint_ReadStart;
posHappyPoint.ReadEnd -= PosHappyPoint_ReadEnd;
posHappyPoint.ErrorEvent -= PosHappyPoint_ErrorEvent;
posHappyPoint.ErrorMessageEvent -= PosHappyPoint_ErrorMessageEvent;
}
}
private void DoSingleCouponCertify()
{
HappyPointCreateEvents();
var processTask = new Task(() => posHappyPoint.StartCouponProcessing(certifyKey,Payments));
processTask.Start();
processTask.Wait();
HappyPointRemoveEvents();
if (posHappyPoint.ProcessOK)
{
HappyCouponWindow = HappyCouponWindowType.CouponSuccess;
}
else
{
HappyCouponWindow = HappyCouponWindowType.ProcessingError;
}
processTask = null;
TimerEnabled = true;
ProcessStart = false;
}
#endregion Methods
#region [ Event Handlers ]
private void CouponCommandHandler(object obj)
{
if (obj is M_HappyCoupon selectCoupon)
{
//var newHappyAppCoupons = HappyAppCoupons;
//var selectNumber = selectCoupon.Number;
//var selectItem = newHappyAppCoupons.Find(r => r.Number.Equals(selectNumber));
//if (selectCoupon.IsUsed)
//{
// certifyKey = string.Empty;
// selectItem.IsUsed = false;
//}
//else
//{
// if (newHappyAppCoupons.Where(r => r.IsUsed).Count().Equals(0))
// {
// certifyKey = selectItem.Number;
// selectItem.IsUsed = true;
// }
//}
//HappyAppCoupons = newHappyAppCoupons;
if (selectCoupon.IsUsed) certifyKey = selectCoupon.Number;
OKButtonEnabled = HappyAppCoupons.Where(r => r.IsUsed).Count() > 0;
}
}
private void CancelCommandHandler(object obj)
{
TimerEnabled = false;
ReturnValue = new M_PopupReturn
{
OKAnswer = false,
TimeOut = false,
ReturnLanguage = ShowLanguageType,
PopupArgs = HappyPointReturn is M_HappyPointReturn && HappyPointReturn.ReservePoint
? HappyPointReturn
: null
};
CanWindowClose = true;
}
private void OkCommandHandler(object obj)
{
switch (HappyCouponWindow)
{
case HappyCouponWindowType.CouponUsing:
HappyCouponWindow = HappyCouponWindowType.Processing;
break;
case HappyCouponWindowType.ProcessingError:
switch (ProcessType)
{
case ProcessingType.SingleCoupon:
HappyCouponWindow = HappyCouponWindowType.CouponStart;
break;
case ProcessingType.CouponUsing:
HappyCouponWindow = HappyCouponWindowType.CouponUsing;
break;
}
break;
case HappyCouponWindowType.CouponSuccess:
if (ProcessTask != null) ProcessTask.Wait();
CanWindowClose = true;
break;
}
}
private void PosHappyPoint_ErrorMessageEvent(string ErrorString)
{
ErrorText = new List
{
new M_Language
{
Type = SupportLanguageType.ko,
LanguageData = ErrorString.Replace("\n"," ").Replace("\r","")
},
};
IsErrorBlink = true;
HappyCouponWindow = HappyCouponWindowType.ProcessingError;
}
private void PosHappyPoint_ErrorEvent(posHappyPoint.ErrorCode _errorCode)
{
//TODO: 공통에 에러 메세지 등록 필요
//ErrorText = Languages.GetMessages(_errorCode.ToString());
ErrorText = new List
{
new M_Language
{
Type = SupportLanguageType.ko,
LanguageData = _errorCode.ToString()
},
};
IsErrorBlink = true;
HappyCouponWindow = HappyCouponWindowType.ProcessingError;
}
private void PosHappyPoint_ReadStart(object sender)
{
TimerEnabled = false;
ProcessStart = true;
}
private void PosHappyPoint_ReadEnd(object sender)
{
ProcessStart = false;
try
{
if (sender is posHappyPoint getPosposHappyPoint)
{
if (getPosposHappyPoint.ProcessOK)
{
ReturnValue = new M_PopupReturn
{
OKAnswer = true,
TimeOut = false,
ReturnLanguage = ShowLanguageType,
PopupArgs = getPosposHappyPoint.UsedCoupon
};
}
}
}
catch
{
throw;
}
finally
{
TimerEnabled = true;
}
}
private void VmHappyPointCoupon_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
try
{
switch (e.PropertyName)
{
case "IsTimeout":
if (IsTimeout)
{
switch (HappyCouponWindow)
{
case HappyCouponWindowType.CouponStart:
case HappyCouponWindowType.CouponUsing:
case HappyCouponWindowType.ProcessingError:
ReturnValue = new M_PopupReturn
{
OKAnswer = false,
TimeOut = true,
ReturnLanguage = ShowLanguageType,
PopupArgs = null
};
break;
}
if (ProcessTask != null) ProcessTask.Wait();
CanWindowClose = true;
}
break;
case "HappyPointReturn":
if (HappyPointReturn is M_HappyPointReturn
&& HappyPointReturn.MyHappyCoupons is List)
{
HappyAppCoupons = HappyPointReturn.MyHappyCoupons;
}
break;
case "HappyCouponWindow":
CouponStartVisible = false;
CouponUsingVisible = false;
ProcessingVisible = false;
ProcessingErrorVisible = false;
CouponSuccessVisible = false;
switch (HappyCouponWindow)
{
case HappyCouponWindowType.CouponStart:
CouponStartVisible = true;
break;
case HappyCouponWindowType.CouponUsing:
CouponUsingVisible = true;
break;
case HappyCouponWindowType.Processing:
ProcessingVisible = true;
break;
case HappyCouponWindowType.ProcessingError:
ProcessingErrorVisible = true;
break;
case HappyCouponWindowType.CouponSuccess:
CouponSuccessVisible = true;
break;
}
break;
case "CouponStartVisible":
if (CouponStartVisible)
{
ScanGuidText = Languages.GetMessages("LBL0051");
InfoGuid1Text = new List();
InfoGuid2Text = new List();
ProcessType = ProcessingType.SingleCoupon;
CancelButtonWidth = PopupWidth;
OKButtonWidth = 0d;
OKButtonEnabled = false;
CancelButtonText = Languages.GetMessages("BTN0033");
TimeOutSeconds = CommonValue.TimeOutSeconds;
}
break;
case "CouponUsingVisible":
if (CouponUsingVisible)
{
ScanGuidText = Languages.GetMessages("LBL0062");
InfoGuid1Text = new List();
InfoGuid2Text = Languages.GetMessages("LBL0016");
ProcessType = ProcessingType.CouponUsing;
CancelButtonWidth = PopupWidth / 2;
OKButtonWidth = PopupWidth / 2;
OKButtonEnabled = false;
OkButtonText = Languages.GetMessages("BTN0024");
CancelButtonText = Languages.GetMessages("BTN0033");
TimeOutSeconds = CommonValue.TimeOutSeconds;
}
break;
case "ProcessingVisible":
if (ProcessingVisible)
{
ScanGuidText = new List();
InfoGuid1Text = new List();
InfoGuid2Text = new List();
CancelButtonWidth = 0d;
OKButtonWidth = 0d;
if (ProcessTask != null) ProcessTask.Wait();
ProcessTask = new Task(DoSingleCouponCertify);
ProcessTask.Start();
}
break;
case "ProcessingErrorVisible":
if (ProcessingErrorVisible)
{
ScanGuidText = Languages.GetMessages("LBL0077");
InfoGuid1Text = new List();
InfoGuid2Text = new List();
CancelButtonWidth = PopupWidth / 2;
OKButtonWidth = PopupWidth / 2;
OKButtonEnabled = true;
OkButtonText = Languages.GetMessages("BTN0007");
CancelButtonText = Languages.GetMessages("BTN0033");
TimeOutSeconds = 10d;
}
break;
case "CouponSuccessVisible":
if (CouponSuccessVisible)
{
ScanGuidText = new List();
SuccessText = Languages.GetMessages("LBL0093");
InfoGuid1Text = new List();
InfoGuid2Text = new List();
CancelButtonWidth = 0d;
OkButtonText = Languages.GetMessages("BTN0039");
OKButtonWidth = PopupWidth;
OKButtonEnabled = true;
TimeOutSeconds = 5d;
}
break;
case "ReadBarCode":
if (!ProcessStart)
{
switch (ReadBarCode.Length)
{
case 11:
case 12:
certifyKey = ReadBarCode.Substring(0, 11);
FormatedBarCode = ReadBarCode.GetEncriptCardNo();
HappyCouponWindow = HappyCouponWindowType.Processing;
break;
default:
FormatedBarCode = string.Empty;
OKButtonEnabled = false;
break;
}
}
break;
}
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this, "VmHappyPointCoupon_PropertyChanged()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
}
#endregion Event Handlers
}
}