处理收银员支付模式的最佳方式是什么
本文关键字:最佳 方式 是什么 模式 收银员 处理 | 更新日期: 2023-09-27 18:33:01
这是我想要做的:
我们有一个基于特定子系统(比如SAP(的POS系统,但需要能够切换到另一个子系统(例如MS Dynamics(。
我想创建一个新的付款窗口,用户将能够使用一种或多种付款方式(现金,借记卡,VISA等(支付发票。
所以,我想我会为现有的不同支付模式创建一个枚举(..(。 这样,就很容易从一个子系统(SAP(切换到另一个子系统(动态(,因为枚举应该是相同的:
Public enum PaymentMode
{
AccountReceivable = 0,
Cash = 1,
Debit = 2,
Check = 3,
GiftCertificate = 4,
Other_01 = 10, //depend on the sub-system...may be VISA/AMEX/MasterCard...
Other_02 = 11, //depend on the sub-system...may be VISA/AMEX/MasterCard...
Other_03 = 12, //depend on the sub-system...may be VISA/AMEX/MasterCard...
Other_04 = 13 //depend on the sub-system...may be VISA/AMEX/MasterCard...
}
另外,我有一个代表真实客户付款的类:
public class Payment
{
public PaymentMode PaymentMode {get;set;} //here is my enum.
public double dbl_Amount {get; set;}
public Datetime date_Payment {get; set;}
}
然后,有了这个,我发现将付款添加到发票中既干净又容易:
double dbl_TotalAmountToPay = 399,41;
//can accept a multi-payment for a single invoice..
List<Payment> myWholePayments = new List<Payment>();
//FIRST PAYMENT
Payment myFirstPayment = new Payment;
myFirstPayment.PaymentMode = PaymentMode.Cash;
myFirstPayment.dbl_Amount = 100;
myWholePayments.add(myFirstPayment);
//SECOND PAYMENT
Payment mySecondPayment = new Payment;
mySecondPayment.PaymentMode = PaymentMode.Other_02; //based on the name shown on the button pressed (visa/AMEX...)
mySecondPayment.dbl_Amount = 299.41;
myWholePayments.add(mySecondPayment);
然后我可以轻松移动我的付款列表,甚至可以在网格中显示它......
这是我的问题(是的,最后(:
我尝试使用 ENUM 是错误的,因为它不是真正的静态(如月(。?
我如何设法显示付款类型的名称,基于它可能从一个系统/客户更改的事实(信用卡名称由SAP系统的经理编写(。PaymentMode.Other_01可以在一个系统中命名为"VISA",在另一个系统中命名为"AMEX"。
同样的问题适用于我的翻译器(将ENUM转换为终端系统代码(。 在 SAP 中,"CASH"支付模式将为整数 0。 在 Dynamics 中,它是一个 GUID {3131-3-b;ablabla}。 我怎样才能优雅地翻译它?
今天是星期五下午...很抱歉,如果那里有任何愚蠢... :|
是的,枚举应该是"静态的",或者至少预计不会在每个实现中更改。
您应该考虑使用枚举来处理常规支付模式,并实现代码以将此含义转换为正确的后端系统。
Public enum PaymentMode
{
AccountReceivable = 0,
Cash = 1,
Debit = 2,
Check = 3,
GiftCertificate = 4,
AMEX = 5,
VISA = 6,
etc
}
翻译代码将如下所示,您将在调用目标系统之前调用该代码。
public static object GetTranslatedValueForPaymentMode(PaymentMode pm)
{
if (backendSystem == "SAP)
{
switch case (pm)
{
case PaymentMode.AMEX:
return "33"; //whatever code this is
case PaymentMode.VISA:
return "AVC"; //whatever code this is
}
}
else if (backendSystem == "GreatPains")
{
switch case (pm)
{
case PaymentMode.AMEX:
return new Guid("GKSKJDS"); //whatever code this is
case PaymentMode.VISA:
return new Guid("DADADA"); //whatever code this is
}
}
}
我想我会采用这种方法:
public enum PaymentMode
{
AccountReceivable = 0,
Cash = 1,
Debit = 2,
Check = 3,
GiftCertificate = 4,
Visa = 5,
Amex = 6,
MasterCard = 7,
Other = 20,
}
然后,不要简单地将按钮 1、2、3、4 映射到值 Other_01
、02
、03
、04
,而是为每个不同的键布局设置一些代码以映射到正确的支付类型。
public class Layout1 : LayoutBase
{
public override PaymentMode GetPaymentType(int key)
{
switch (key)
{
case 1:
return PaymentMode.Visa;
// others...
}
}
}
public class Layout2 : LayoutBase
{
public override PaymentMode GetPaymentType(int key)
{
switch (key)
{
case 1:
return PaymentMode.MasterCard;
// others...
}
}
}
对于CASH
由 GUID 或 0
表示的问题,我想说你也可以用代码来处理这个问题:
public class DynamicsLayout : LayoutBase
{
public override PaymentMode GetPaymentType(object raw)
{
if (raw is string && raw.ToString() == "{3131-3-b;ablabla}")
return PaymentMode.Cash;
// others
}
}