Действие Acumatica Override Calculate для графика ARFinChargesApplyMaint - PullRequest
0 голосов
/ 31 марта 2020

Необходимо переопределить действие «Рассчитать просроченные платежи» (AR507000). Собирался попытаться переопределить весь CalculateFinancialCharges, но это казалось пугающим (даже не уверен, если это возможно). В своем классе расширений я просто хочу выполнить некоторую постобработку: если после выполнения базовых вычислений logi c строки, найденные в ARFinChargeRecords, будут запрашивать пользователя. Если они ответят «да», выполните итерацию по ARFinChargeRecords и обновите FinChargeAmt: текущим балансом счета * .02

Я очень новичок в разработке Acumatica и прошел все курсы T. Это моя первая реальная проблема, которую нужно решить, и мне не повезло. Похоже, Base.calculate сам звонит? Я попытался использовать пример переопределения действия деблокирования счета-фактуры, но это выглядит как-то иначе.

Вот то, что у меня есть в классе расширений, но пока ничего не получалось. var row1 = строка только для целей останова / отладки:

    public PXAction<ARFinChargesApplyMaint.ARFinChargesApplyParameters> Calculate;
    [PXButton]
    [PXUIField(DisplayName = "Calculate")]
    protected void calculate()
    {
        Base.calculate.Press();

        //int iCachedData = 0;
        //foreach (var row in Base.ARFinChargeRecords.Cache.Cached)
        //{
        //    iCachedData++;
        //    yield return row;
        //}

        //if (iCachedData > 0)
        //{
            if (Base.ARSetup.Ask("Apply Special Calculation (Percent Of Open Balance)", MessageButtons.YesNo) == WebDialogResult.Yes)
            {
                foreach (var row in Base.ARFinChargeRecords.Cache.Cached) {

                  var row1 = row;

                }

                // update FinChargeAmount with Balance * .02
                // Base.ARFinChargeRecords
                // Base.ARInvoices.
            }
        // }
    }

1 Ответ

0 голосов
/ 02 апреля 2020

Calculate действие может быть отменено. Ниже приведено готовое действие Calculate

out-of-box Calculate action

Оно должно быть переопределено, как показано ниже (без каких-либо пользовательских логинов c):

public class ARFinChargesApplyMaintPXExt : PXGraphExtension<ARFinChargesApplyMaint>
{
    [PXOverride]
    public virtual IEnumerable Calculate(PXAdapter adapter)
    {
        Base.calculate.Press(adapter);

        return adapter.Get();
    }
} 

Готовое действие Calculate запускает асинхронную операцию (через PXLongOperation.StartOperation), создает новый экземпляр Graph для ARFinChargesApplyMaint и вызывает метод CalculateFinancialCharges (который генерирует строки, отображаемые в сетка)

С учетом вышеприведенных наблюдений возможный подход для удовлетворения ваших требований:

  1. Добавить подтверждение и сохранить значение подтверждения (Да / Нет) в скрытом настраиваемом поле DA C работать с представлением фильтра (ARFinChargesApplyMaint.ARFinChargesApplyParameters) перед вызовом Base.calculate.Press(adapter).
  2. Переопределить виртуальный метод CalculateFinancialCharges и добавить RowInserted обработчик событий для ARFinChargesApplyMaint.ARFinChargesDetails DA C, чтобы изменить логи c для поля FinChargeAmt.

Ниже приведен код для справки

using System;
using PX.Data;
using System.Collections;
using PX.Objects.AR;

namespace DemoPkg
{
    public class ARFinChargesApplyMaintPXExt : PXGraphExtension<ARFinChargesApplyMaint>
    {
        [PXOverride]
        public virtual IEnumerable Calculate(PXAdapter adapter)
        {
            WebDialogResult result = adapter.View.Ask(Base.Filter.Current, "Confirmation",
                                                      "Apply Special Calculation (Percent Of Open Balance)?",
                                                      MessageButtons.YesNo, MessageIcon.Question);
            ARFinChargesApplyMaint.ARFinChargesApplyParameters filterData = Base.Filter.Current;
            ARFinChargesApplyParametersPXExt filterDataExt = PXCache<ARFinChargesApplyMaint.ARFinChargesApplyParameters>.GetExtension<ARFinChargesApplyParametersPXExt>(filterData);
            filterDataExt.UsrReCalcFinChargeAmt = (result == WebDialogResult.Yes);
            Base.Filter.Update(filterData);

            Base.calculate.Press(adapter);

            return adapter.Get();
        }

        [PXOverride]
        public virtual void CalculateFinancialCharges(ARFinChargesApplyMaint.ARFinChargesApplyParameters filter, Action<ARFinChargesApplyMaint.ARFinChargesApplyParameters> BaseInvoke)
        {
            ARFinChargesApplyParametersPXExt filterDataExt = PXCache<ARFinChargesApplyMaint.ARFinChargesApplyParameters>.GetExtension<ARFinChargesApplyParametersPXExt>(filter);
            if (filterDataExt.UsrReCalcFinChargeAmt.GetValueOrDefault(false))
            {
                Base.RowInserted.AddHandler<ARFinChargesApplyMaint.ARFinChargesDetails>((sender, e) =>
                {
                    ARFinChargesApplyMaint.ARFinChargesDetails data = (ARFinChargesApplyMaint.ARFinChargesDetails)e.Row;
                    data.FinChargeAmt = 600.00m; // your custom calculated value
                });
            }
            BaseInvoke(filter);
        }
    }

    public sealed class ARFinChargesApplyParametersPXExt : PXCacheExtension<ARFinChargesApplyMaint.ARFinChargesApplyParameters>
    {
        #region UsrReCalcFinChargeAmt
        public abstract class usrReCalcFinChargeAmt : PX.Data.BQL.BqlBool.Field<usrReCalcFinChargeAmt> { }

        [PXDBBool]
        [PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
        [PXUIField(DisplayName = "Recalc Amount", Visibility = PXUIVisibility.Invisible)]
        public bool? UsrReCalcFinChargeAmt { get; set; }
        #endregion
    }
}

Ниже приведены справочные статьи, которые можно найти в Руководстве по настройке Acumatica

Переопределить метод делегата действия

Изменение BL C Виртуальные методы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...