在 REST 中执行 SalesOrderAddInvoice 操作 API

Execute SalesOrderAddInvoice Action in REST API

如何在销售订单屏幕上的 Acumatica AddInvoice 操作中通过 REST API 执行? 我使用的是默认端点版本 20.200.001,并且该操作使用参数进行映射 endpoint version

在 UI 我可以通过对话框添加发票。 但是,在邮递员上,我试图将此参数发送到 POST 请求,但我收到错误响应。

这是我的要求:

{
"entity": {"OrderType":{"value":"CM"}, "OrderNbr":{"value":"CC00000013"}},
"parameters":{
    "DocumentType": {"value": "Invoice"},
    "ReferenceNbr":{"value": "CC00000010"}
}}

这是回复信息:

"exceptionMessage": "SalesOrder.Details[0].Allocations[0].Qty: Item '754502039173  
            0' in invoice 'CC00000010' lot/serial number '000001' quantity returned is greater than quantity invoiced. SalesOrder.Details[0].OrderQty: The return quantity exceeds the quantity available for return for the related invoice line CC00000010, 754502039173.

减少当前行或发票行存在的另一个 return 单据或单据 CC00000011 的对应行中的数量。 \n插入 'Sales Order Line' 记录引发了至少一个错误。请检查错误。"

如何指定准确的发票行和 lot/serial nbr。和产品的数量,就像我在 UI 上做的一样? add invoice dialog

我已经尝试在操作上添加 Detail[] 部分,但错误提示不支持此类参数。

希望你能帮帮我。

当前端点版本不支持。 您可以做的是使用一些自定义来调整考虑到已经退回的项目的行的数量,这样它就不会失败,而是调整退回的数量。例如

//SOOrderEntryExtension 
[PXOverride]
public virtual IEnumerable AddInvoice(PXAdapter adapter, Func<PXAdapter, IEnumerable> baseDelegate)
{
  var result = baseDelegate.Invoke(adapter);
  if (Base.IsContractBasedAPI && Base.Document.Current.Behavior == SOBehavior.RM)
  {
    foreach (SOLine line in Base.Transactions.Select().Where(line => ((SOLine)line).InvoiceNbr != null))
    {
      if (Base.Transactions.Cache.GetStatus(line) != PXEntryStatus.Inserted)
        continue;

      PXSelectBase<SOLine> selectReturnSOLines = new PXSelectJoin<SOLine,
        LeftJoin<SOOrder, On<SOOrder.orderType, Equal<SOLine.orderType>, And<SOOrder.orderNbr, Equal<SOLine.orderNbr>>>>,
        Where<SOLine.invoiceType, Equal<Required<SOLine.invoiceType>>,
        And<SOLine.invoiceNbr, Equal<Required<SOLine.invoiceNbr>>,
        And<SOLine.invoiceLineNbr, Equal<Required<SOLine.invoiceLineNbr>>,
        And<Where<SOLine.behavior, Equal<SOOrderTypeConstants.rmaOrder>,
        Or<SOLine.behavior, Equal<SOOrderTypeConstants.creditMemo>, And<SOOrder.cancelled, Equal<False>>>>>>>>>(Base);

      var returnSOLines = selectReturnSOLines.Select(line.InvoiceType, line.InvoiceNbr, line.InvoiceLineNbr).RowCast<SOLine>().Where(_ => _.OrderNbr != line.OrderNbr || _.OrderType != line.OrderType || _.LineNbr != line.LineNbr);

      SOLine copy = (SOLine)Base.Transactions.Cache.CreateCopy(line);
      foreach (var otherline in returnSOLines)
      {
        copy.OrderQty -= otherline.OrderQty;
      }
      if (copy.OrderQty > 0)
      {
        Base.Transactions.Cache.RaiseExceptionHandling<SOLine.orderQty>(line, line.OrderQty, null);
        Base.Transactions.Update(copy);
      }
      else
      {
        Base.Transactions.Cache.RaiseExceptionHandling<SOLine.orderQty>(line, line.OrderQty, null);
        Base.Transactions.Delete(copy);
      }
    }
  }
  return result;
}