处理casher支付模式的最佳方法是什么?

时间:2013-09-27 17:37:41

标签: c# enums payment

这是我想要做的:

我们有一个基于特定子系统的POS系统(比方说SAP),但需要能够切换到另一个系统(例如MS Dynamics)。

我想创建一个新的付款窗口,用户可以通过一种或多种付款方式(现金,借记卡,签证......)支付发票。

所以,我虽然会为存在的不同PaymentMode创建一个ENUM(..)。有了它,很容易从一个子系统(SAP)切换到另一个子系统(Dynamics),因为枚举应该是相同的:

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}。我怎样才能优雅地翻译它?

  3. 这是星期五PM ...很抱歉,如果有任何愚蠢......:|

2 个答案:

答案 0 :(得分:1)

是的,枚举应该是“静态的”,或者至少不希望每次实现都改变。

您应该考虑使用枚举来处理常规付款模式,并实现代码以将此含义转换为正确的后端系统。

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

答案 1 :(得分:0)

我想我会选择这种方法:

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,而是为每个不同的代码设置一些代码键布局以映射到正确的付款类型。 E.g。

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