Принудительный пересчет налогов при обновлении TaxZoneID внутри обработчика событий - PullRequest
0 голосов
/ 07 мая 2020

У меня есть переопределение графика для счетов-фактур

public class ARInvoiceEntry_Extension : PXGraphExtension<ARInvoiceEntry>

и в одном из обработчиков событий я обновляю TaxZoneID, который отлично работает. Однако налоги не обновляются и не пересчитываются. Я пробовал подход, упомянутый здесь

cache.SetValueExt<SOOrder.taxZoneID>(order, branchLoc.VTaxZoneID);

, но это не работает для меня. Я пробовал это в событиях _FieldUpdating, _FieldUpdated и даже ARInvoice_RowPersisting(PXCache cache, PXRowPersistingEventArgs e, PXRowPersisting InvokeBaseHandler). Есть идеи, почему это не работает? TaxZone и ставки уже находятся в базе данных (мы не используем 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";
        }
    }
}


1 Ответ

1 голос
/ 08 мая 2020

Когда вы программно взаимодействуете с налоговыми записями, используя стандартные методы, общая сумма налога не будет обновляться должным образом на sh. Атрибут Tax DA C не пересчитывает итоговые суммы по умолчанию для повышения производительности.

Чтобы принудительно обновить атрибут налога sh, вам нужно изменить режим c налога.

Налоговая калькуляция c Режим NoCalc не пересчитывает итоги. Это режим "по умолчанию".

Установка для режима c налога ManualCalc необходима для обновления sh обновленного налога.

Пример кода для обновления поля суммы налога, вы можете адаптировать его для обновления налога зона.

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(); 
...