Я пытаюсь ввести заказ на продажу с платежом против 2019R2, который из демонстрации, которую я видел, должен работать, однако я получаю довольно бесполезное сообщение об исключении:
{
"message": "An error has occurred.",
"exceptionMessage": "Operation failed",
"exceptionType": "PX.Data.PXInvalidOperationException",
"stackTrace": " at PX.Api.ContractBased.EntityService.Put(ISystemContract systemContract, String version, String name, EntityImpl entity, CbOperationContext operationContext, Boolean throwOnError)\r\n at PX.Api.ContractBased.Soap.SoapFacadeBase.PutImpl(EntityImpl entity, Boolean throwOnValidationError)\r\n at PX.Api.ContractBased.SystemContracts.V2.RestController.PutEntity(EntityImpl entity, String select, String filter, String expand, String custom)\r\n at lambda_method(Closure , Object , Object[] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"innerException": {
"message": "An error has occurred.",
"exceptionMessage": "Exception has been thrown by the target of an invocation.",
"exceptionType": "System.Reflection.TargetInvocationException",
"stackTrace": " at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)\r\n at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)\r\n at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)\r\n at PX.Api.ContractBased.EntityExportContextBuilder.<>c__DisplayClass87_1.<FindImplementations>b__3(PXGraph graph, EntityImpl entity, EntityImpl targetEntity)\r\n at PX.Api.SyImportProcessor.SyStep.ProcessCommand(SyCommand cmd, Boolean& needCommit)\r\n at PX.Api.SyImportProcessor.ExportTableHelper.ExportTable()",
"innerException": {
"message": "An error has occurred.",
"exceptionMessage": "Inserting 'AR Payment' record raised at least one error. Please review the errors.",
"exceptionType": "PX.Data.PXOuterException",
"stackTrace": " at PX.Data.PXUIFieldAttribute.CommandPreparing(PXCache sender, PXCommandPreparingEventArgs e)\r\n at PX.Data.PXCache.OnCommandPreparing(String name, Object row, Object value, PXDBOperation operation, Type table, FieldDescription& description)\r\n at PX.Data.PXTableAttribute.PrepareParametersForInsert(PXCache sender, Object row, Type[] tables, ISqlDialect dialect, Boolean audit, List`1[] pars)\r\n at PX.Data.PXTableAttribute.PersistInserted(PXCache sender, Object row)\r\n at PX.Data.PXCache`1.PersistInserted(Object row, Boolean bypassInterceptor)\r\n at PX.Data.PXCache`1.Persist(PXDBOperation operation)\r\n at PX.Data.PXGraph.Persist(Type cacheType, PXDBOperation operation)\r\n at PX.Data.PXGraph.Persist()\r\n at PX.Objects.AR.ARPaymentEntry.Persist()\r\n at PX.Data.PXSave`1.<Handler>d__2.MoveNext()\r\n at PX.Data.PXAction`1.<Press>d__28.MoveNext()\r\n at PX.Data.PXAction`1.<Press>d__28.MoveNext()\r\n at PX.Data.PXAction`1.PressImpl(Boolean internalCall, Boolean externalCall)\r\n at PX.Data.PXAction`1.Press()\r\n at PX.Objects.EndpointAdapters.DefaultEndpointImpl18.Payments_Insert(PXGraph graph, EntityImpl entity, EntityImpl targetEntity)"
}
}
}
Следующее было сделан запрос:
{
"CashAccount" : {"value" : "MERCHANT"},
"OrderType" : {"value" : "SO"},
"CustomerID" : {"value" : "35"},
"CustomerOrder" : {"value" : "1"},
"DisableAutomaticDiscountUpdate" : {"value" : true},
"Description" : {"value" : "ecommerce order"},
"LocationID" : {"value" : "MAIN"},
"Details" : [
{
"rowNumber" : 1,
"InventoryID" : {"value" : "item1"},
"UnitPrice" : {"value" : 320.00},
"SalesAcctID" : {"value" : "40200"},
"UOM" : {"value" : "EA"},
"OrderQty" : {"value" : "1.0000"}
}
],
"BillToContactOverride" : {"value" : true},
"BillToContact" : {
"rowNumber" : 1,
"Attention" : {"value" : "Joe DiMaggio"},
"BusinessName" : {"value" : "Major League Baseball"},
"Email" : {"value" : "joe@baseball.fun"},
"Phone1" : {"value" : "877-123-4567"}
},
"BillToAddressOverride" : {"value" : true},
"BillToAddress" : {
"rowNumber" : 1,
"AddressLine1" : {"value" : "123 Main Street"},
"AddressLine2" : {"value" : "attn: team manager"},
"City" : {"value" : "Los Angeles"},
"Country" : {"value" : "US"},
"State" : {"value" : "CA"},
"PostalCode" : {"value" : "91324"}
},
"ShipToContactOverride" : {"value" : true},
"ShipToContact" : {
"rowNumber" : 1,
"Attention" : {"value" : "Joe DiMaggio"},
"BusinessName" : {"value" : "Major League Baseball"},
"Email" : {"value" : "joe@baseball.fun"},
"Phone1" : {"value" : "877-123-4567"}
},
"ShipToAddressOverride" : {"value" : true},
"ShipToAddress" : {
"rowNumber" : 1,
"AddressLine1" : {"value" : "123 Main Street"},
"AddressLine2" : {"value" : "attn: team manager"},
"City" : {"value" : "Los Angeles"},
"Country" : {"value" : "US"},
"State" : {"value" : "CA"},
"PostalCode" : {"value" : "91324"}
},
"ShipVia" : {"value" : "FEDEXGRND"},
"ShippingSettings" : {
"ShippingTerms" : {"value" : "WEBORDER"},
"ShipVia" : {"value" : "FEDEXGRND"}
},
"Status" : {"value" : "open"},
"TaxTotal" : {"value" : 24.80},
"Totals" : {
"PremiumFreight" : {"value" : 6.00},
"FreightTaxCategory" : {"value" : "FR020100"}
},
"Payments" : [{
"AppliedToOrder" : {"value" : 326.00},
"CashAccount" : {"value" : "MERCHANT"},
"PaymentAmount" : {"value" : 326.00},
"DocType" : {"value" : "Prepayment"},
"PaymentMethod" : {"value" : "CC"},
"PaymentRef" : {"value" : "12345"}
}]
}
Заказ успешно введен, когда я отправляю его, однако платеж - нет. Пробовал разные комбинации в поле Платежи. Я знаю, что есть одно предложение - получить запись заказа на продажу и использовать $ expand для получения дополнительных данных, однако добавление Payments в $ expand не работает, он возвращает пустой массив даже для заказа, в котором зарегистрированы платежи.
Я пробовал несколько комбинаций в массиве Payments, пробовал записывать несколько платежей одновременно, пробовал не применять платежи или применять только 1 доллар. Опробованные виды платежей и предоплаты. Единственное, что работает, - это если я предварительно ввожу платеж, я могу использовать ReferenceNbr этого платежа, чтобы применить сумму к заказу, однако это не то, что описано в документации или демонстрации видео, которые я видел.
У кого-нибудь есть реальный рабочий пример этого? Я бы предпочел вводить транзакции электронной торговли в одном запросе и не использовать 2 запроса для ввода заказа на продажу и оплаты.