问题描述
如何在销售订单屏幕上的Acumatica AddInvoice Action中通过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.
减少当前行或发票行中存在的另一个退货单据CC00000011的对应行中的数量。 \ n插入“销售订单行”记录至少引发了一个错误。请检查错误。”
如何指定确切的发票行和批次/序列号。产品的数量和数量,就像我在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,null);
Base.Transactions.Delete(copy);
}
}
}
return result;
}