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