使用Acumatica API更新和删除付款方式

使用Acumatica API更新和删除付款方式,acumatica,Acumatica,感谢上的帖子,我能够使用API成功地创建一个新的支付方法。但我不知道如何更新或删除现有的付款方式。似乎没有任何类型的键字段。我已经用API更新和删除了联系人和位置,但是联系人有联系人ID,位置有LocationID。似乎没有PaymentMethodID。我想“卡号/账号”字段可能就是这样,但我没能做到。我注意到,我可以用相同的卡号保存两种付款方式,因此,如果仍然使用该字段,将生成相同的密钥 这是我试图更新的代码。这主要是我链接到的另一篇文章中Chris的代码,但试图为更新添加一个额外的关键字段

感谢上的帖子,我能够使用API成功地创建一个新的支付方法。但我不知道如何更新或删除现有的付款方式。似乎没有任何类型的键字段。我已经用API更新和删除了联系人和位置,但是联系人有联系人ID,位置有LocationID。似乎没有PaymentMethodID。我想“卡号/账号”字段可能就是这样,但我没能做到。我注意到,我可以用相同的卡号保存两种付款方式,因此,如果仍然使用该字段,将生成相同的密钥

这是我试图更新的代码。这主要是我链接到的另一篇文章中Chris的代码,但试图为更新添加一个额外的关键字段

Public Function UpdateCreditCard(ByVal customerID As String, ByVal existingAcctNum As String, ByVal paymentMethodCode As String, ByVal CCNum As String, ByVal expiration As String, ByVal nameOnCard As String, ByVal active As Boolean)
    Dim paymentMethod As AR303010Content = m_context.AR303010GetSchema()
    m_context.AR303010Clear()

    ' main level fields
    Dim customerVal As Value = CreateValue(paymentMethod.PaymentMethodSelection.Customer, customerID)
    Dim paymentMethodCodeVal As Value = CreateValue(paymentMethod.PaymentMethodSelection.PaymentMethod, paymentMethodCode)

    ' inner level fields
    Dim ccNumName As Value = CreateValue(paymentMethod.PaymentMethodDetails.Description, "CCDNUM")
    Dim ccNumValue As Value = CreateValue(paymentMethod.PaymentMethodDetails.Value, CCNum, True)

    Dim ccExpName As Value = CreateValue(paymentMethod.PaymentMethodDetails.Description, "EXPDATE")
    Dim ccExpValue As Value = CreateValue(paymentMethod.PaymentMethodDetails.Value, expiration, True)

    Dim ccNameName As Value = CreateValue(paymentMethod.PaymentMethodDetails.Description, "NAMEONCC")
    Dim ccNameValue As Value = CreateValue(paymentMethod.PaymentMethodDetails.Value, nameOnCard, True)

    Dim saveCommands() As Command
    If existingAcctNum = "" Then
        ' new credit card
        saveCommands = {customerVal, paymentMethod.Actions.Insert, paymentMethodCodeVal, ccNumName, ccNumValue, ccExpName, ccExpValue, ccNameName, ccNameValue, paymentMethod.Actions.Save}
    Else
        ' existing credit card, only allow update of Active or expiration based on "description"
        Dim descriptionVal As Value = CreateValue(paymentMethod.PaymentMethodDetails.Description, existingAcctNum)
        Dim activeVal As Value = CreateValue(paymentMethod.PaymentMethodSelection.Active, active.ToString())
        saveCommands = {customerVal, descriptionVal, ccExpName, ccExpValue, activeVal, paymentMethod.Actions.Save}
    End If
    Dim updateResult As AR303010Content() = m_context.AR303010Submit(saveCommands)

    Return ""
End Function

另一个令人困惑的地方是,我真的想让用户更新的两个字段要么是到期日期,要么是卡是否处于活动状态。但活动标志是列表中可从客户屏幕访问的字段之一,过期日期是仅可从付款方式屏幕访问的字段。如果这是两个不同的API调用,那么我是否需要在每个API调用中使用不同的键字段?

此屏幕很难通过web服务使用,原因有几个:

  • 屏幕上没有可用于查找付款方式的唯一键。内部键是一个名为PMInstanceID的字段,虽然从技术上讲,您可以通过web服务命令引用它,但使用它并不明显
  • 在Acumatica中,一旦记录了使用此付款方式的一笔交易,付款方式详细信息即被锁定。这意味着要对其进行修改,您需要创建一个新的付款方式,并将旧的付款方式设置为非活动
  • 屏幕中有一个bug,只有通过web服务使用时才会出现,这与上面的项目有关。加载付款方式时,如果有任何交易,系统将禁用付款方式详细信息,但如果没有,则无法重新启用。从web浏览器使用Acumatica时,这从来都不是问题,因为在每次往返之间,字段会自动重新启用。但是,当通过web服务自动化此屏幕时,实际上是在一次往返中执行所有操作。该问题已报告,不久将得到解决(JIRA内部参考号为AC-54456)
  • 也就是说,我们可以使用一些东西使这个屏幕与其他屏幕一样易于从web服务使用,并克服其局限性。通过创建定制项目,我们可以将PMInstanceID字段(这里称为令牌ID字段)添加到屏幕中。您可以将此令牌存储在您的系统上,并将其用于未来的支付方式操作。在同一定制项目中,我们还可以始终启用付款方式详细信息,允许您更新现有卡的到期日期。这样做还可以解决上面提到的bug,系统不允许您向系统添加任何新的支付方式。自定义包含两个部分:

  • 重写
    CustomerPaymentMethod
    DAC以使PMInstanceID字段可从UI访问。这是通过将PXUIField属性附加到PMInstanceID字段来完成的:
    [PXUIField(DisplayName=“Token ID”,Visibility=PXUIVisibility.SelectorVisible)]
    。之后,可以使用布局编辑器将该字段添加到屏幕中
  • 处理所选的
    CustomerPaymentMethod\u row事件以强制始终启用付款方式详细信息。我们还使用此事件处理程序在添加新的付款方式时隐藏令牌ID字段,因为在保存付款方式之前,此字段将显示
    int.MinValue
    。事件的完整代码如下所示:

    protected void CustomerPaymentMethod_RowSelected(PXCache cache, PXRowSelectedEventArgs e, PXRowSelected InvokeBaseHandler)
    {
      if(InvokeBaseHandler != null)
        InvokeBaseHandler(cache, e);
    
      // Force the payment method details to always be enabled to facilitate working via web services
      PXUIFieldAttribute.SetEnabled(Base.Details.Cache, null, true);
    
      // When adding a new method, field will have a temporary value corresponding to int.MinValue - don't show it
      PXUIFieldAttribute.SetVisible<CustomerPaymentMethod.pMInstanceID>(cache, e.Row, cache.GetStatus(e.Row) != PXEntryStatus.Inserted);
    }
    
    我将这3个函数包装到一个类中,实际使用变得非常简单:

        var paymentMethodManager = new PaymentMethodManager(context);
        int tokenID = paymentMethodManager.AddCreditCard("ABARTENDE", "MASTERCARD", "5111111111111118", "122016", "123", "John Doe");
        paymentMethodManager.UpdateCreditCardExpirationDate("ABARTENDE", "MASTERCARD", tokenID, "032017");
        paymentMethodManager.MakeCardInactive("ABARTENDE", "MASTERCARD", tokenID);
    
    到目前为止,无法删除现有的付款方式,您必须将其设置为非活动状态。我已经提出了这个增强的要求,它可能会在将来出现

    注意:我已将此答案中使用的所有代码放在GitHub上

        var paymentMethodManager = new PaymentMethodManager(context);
        int tokenID = paymentMethodManager.AddCreditCard("ABARTENDE", "MASTERCARD", "5111111111111118", "122016", "123", "John Doe");
        paymentMethodManager.UpdateCreditCardExpirationDate("ABARTENDE", "MASTERCARD", tokenID, "032017");
        paymentMethodManager.MakeCardInactive("ABARTENDE", "MASTERCARD", tokenID);