处理收银员支付模式的最佳方式是什么

本文关键字:最佳 方式 是什么 模式 收银员 处理 | 更新日期: 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);

然后我可以轻松移动我的付款列表,甚至可以在网格中显示它......

这是我的问题(是的,最后(:

  1. 我尝试使用 ENUM 是错误的,因为它不是真正的静态(如月(。?

  2. 我如何设法显示付款类型的名称,基于它可能从一个系统/客户更改的事实(信用卡名称由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_01020304,而是为每个不同的键布局设置一些代码以映射到正确的支付类型。

例如
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
    }
}