我有一个发票的图形覆盖功能。
public class ARInvoiceEntry_Extension : PXGraphExtension<ARInvoiceEntry>
在一个事件处理程序中,我更新了 TaxZoneID
,工作正常。但是,税金没有得到更新或重新计算。我已经尝试了上述方法 此处
cache.SetValueExt<SOOrder.taxZoneID>(order, branchLoc.VTaxZoneID);
但这对我不起作用。我试过在 _FieldUpdating
, _FieldUpdated
乃至 ARInvoice_RowPersisting(PXCache cache, PXRowPersistingEventArgs e, PXRowPersisting InvokeBaseHandler)
事件。有什么办法可以解决这个问题吗?税区和税率已经在数据库中(我们没有使用 Avatax)。
--- 编辑 1 ---
以下是更新TaxZoneID的代码。
namespace PX.Objects.AR
{
public class ARInvoiceEntry_Extension : PXGraphExtension<ARInvoiceEntry>
{
#region Event Handlers
protected void ARShippingAddress_PostalCode_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e, PXFieldUpdated del)
{
// PXTrace.WriteInformation("ARShippingAddress_PostalCode_FieldUpdated");
ARShippingAddress row = e.Row as ARShippingAddress;
if (row != null) {
if (DoChangeTaxZone(row)) {
var invoice = Base.Document.Current;
if (invoice != null) {
invoice.TaxZoneID = GetTaxZoneId(row);
sender.SetValueExt<ARInvoice.taxZoneID>(invoice, invoice.TaxZoneID);
}
}
}
if (del != null)
{
del(sender, e);
}
}
#endregion
private bool DoChangeTaxZone(ARShippingAddress row)
{
// logic ...
return true;
}
private string GetTaxZoneId(ARShippingAddress row)
{
// logic ...
return "TAX-ZONE-ID";
}
}
}
当你使用典型的方法与税收记录进行编程交互时,税收总额将无法正确刷新。税务DAC属性默认情况下不会重新计算总数以提高性能。
要强制刷新税务属性,你需要改变税务计算模式。
税务计算模式 NoCalc
不重新计算总数。这是默认模式。
将税务计算模式设置为 ManualCalc
是需要刷新更新税额的。
代码示例更新税额字段,可以适应更新税区。
ARInvoiceEntry invoiceMaint = PXGraph.CreateInstance<ARInvoiceEntry>();
TX.TaxAttribute.SetTaxCalc<ARTran.taxCategoryID>(invoiceMaint.Transaction.Cache, null, TX.TaxCalc.ManualCalc);
invoiceMaint.CurrentDocument.Current = invoiceMaint.Document.Search<ARInvoice.refNbr>("AR005452", ARDocType.Invoice).FirstOrDefault();
invoiceMaint.Taxes.Select();
invoiceMaint.Taxes.Current = invoiceMaint.Taxes.Search<ARTaxTran.taxID>("CAGST").FirstOrDefault();
invoiceMaint.Taxes.Cache.SetValueExt<ARTaxTran.curyTaxAmt>(invoiceMaint.Taxes.Current, 3);
invoiceMaint.Taxes.Update(invoiceMaint.Taxes.Current);
invoiceMaint.SelectTimeStamp();
invoiceMaint.Save.Press();