需要在准备发票流程

时间:2018-04-18 15:59:41

标签: acumatica

我有一个自定义到销售订单屏幕,我在其中使用RowPersisting事件将请求日期更新为保存时的当前日期。问题是,如果未执行保存,但启动了Actions.PrepareInvoice,则不使用新的请求日期(希望由RowPersisting事件设置)。我试图覆盖基本方法,如下所示(在运行准备发票流程之前,使用新的请求日期保存销售订单记录):

    public delegate IEnumerable PrepareInvoiceDelegate(PXAdapter adapter);
    [PXOverride]
    public IEnumerable PrepareInvoice(PXAdapter adapter, PrepareInvoiceDelegate baseMethod)
    {
        Base.Actions.PressSave();
        return baseMethod(adapter);
    }

但是我收到以下错误 - “错误:之前的操作还没有完成。”

如果尚未保存销售订单记录,如何确保将修改后的请求日期用于准备发票流程?

2 个答案:

答案 0 :(得分:0)

如果调用不是来自Processing Page(PrepareInvoice),则adapter.MassProcess==false方法无论如何都在调用this.Save.Press()。 以下是PrepareInvoice操作的代码。在创建发票之前,系统会调用this.Save.Press(),因此您的所有更新都会被保存并用于创建发票。

[PXUIField(DisplayName = "Prepare Invoice", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select, Visible = false), PXButton]
public virtual IEnumerable PrepareInvoice(PXAdapter adapter)
{
    List<SOOrder> list = adapter.Get<SOOrder>().ToList<SOOrder>();
    foreach (SOOrder current in list)
    {
        if (this.Document.Cache.GetStatus(current) != PXEntryStatus.Inserted)
        {
            this.Document.Cache.SetStatus(current, PXEntryStatus.Updated);
        }
    }
    if (!adapter.MassProcess)
    {
        try
        {
            this.RecalculateAvalaraTaxesSync = true;
            this.Save.Press();
        }
        finally
        {
            this.RecalculateAvalaraTaxesSync = false;
        }
    }
    PXLongOperation.StartOperation(this, delegate
    {
        DocumentList<ARInvoice, SOInvoice> documentList = new DocumentList<ARInvoice, SOInvoice>(PXGraph.CreateInstance<SOShipmentEntry>());
        SOOrderEntry.InvoiceOrder(adapter.Arguments, list, documentList, adapter.MassProcess);
        if (!adapter.MassProcess && documentList.Count > 0)
        {
            using (new PXTimeStampScope(null))
            {
                SOInvoiceEntry sOInvoiceEntry = PXGraph.CreateInstance<SOInvoiceEntry>();
                sOInvoiceEntry.Document.Current = sOInvoiceEntry.Document.Search<ARInvoice.docType, ARInvoice.refNbr>(documentList[0].DocType, documentList[0].RefNbr, new object[]
                {
                    documentList[0].DocType
                });
                throw new PXRedirectRequiredException(sOInvoiceEntry, "Invoice");
            }
        }
    });
    return list;
}

答案 1 :(得分:-1)

解决方案似乎是在图表扩展中重新创建Action方法并添加以下代码:

        if (!adapter.MassProcess)
        {
            //****Code added to update the Requested Date to today's date...
            var soorder = (SOOrder)Base.Caches[typeof(SOOrder)].Current;
            soorder.RequestDate = DateTime.Now;
            Base.Caches[typeof(SOOrder)].Update(soorder);
            //****End of code added...

            try
            {
                Base.RecalculateAvalaraTaxesSync = true;
                Base.Save.Press();
            }
            finally
            {
                Base.RecalculateAvalaraTaxesSync = false;
            }
        }