Как отключить расчет скидки экрана заказа клиента - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть изменение в заказе на продажу, для которого необходимо обновить цену за единицу строки заказа на продажу с использованием производного значения.Это работает хорошо, и новая цена за единицу появляется после выбора элемента и выполнения моего кода в событии SOLine_RowUpdating.Однако после выбора количества SOLine_RowUpdating выполняется снова, и после этого система рассчитывает скидки, как обычно.Поскольку у меня есть своя собственная цена, которую нельзя сбрасывать со счетов, я бы хотел переоценить или отменить этот стандартный расчет скидок и просто оставить свою цену как есть.Вот код SOLine_RowUpdating, и он работает хорошо.

protected virtual void SOLine_RowUpdating(PXCache sender, PXRowUpdatingEventArgs e)
 {
   if (e.NewRow == null) {return; }

  Customer customer = Base.customer.Current;
  if (customer == null) return;

  SOLine soLine = (SOLine)e.NewRow;
  int BAAccountID = Convert.ToInt32(customer.BAccountID);
  int lCompanyID = PX.Data.Update.PXInstanceHelper.CurrentCompany;
  int lInventoryID = Convert.ToInt32(soLine.InventoryID);

  LookupPriceAndDiscountDetails(BAAccountID, lCompanyID, lInventoryID);  // My own code
  sender.SetValueExt<SOLine.curyUnitPrice>(soLine, gdNewUnitPrice);      //New price is in gdNewUnitPrice

  Base.Transactions.Cache.RaiseRowUpdated(soLine, soLine);
  Base.Transactions.View.RequestRefresh();
}

После большого количества исследований я нашел этот метод, предложенный различными сообщениями, который должен убирать / отменять скидки, и фактически я могу найти его встандартное событие PX.Objects.SO.SOOrderEntry Row_Updated, но когда я пробую его в своем расширении графа, оно не обновляется и не очищается, так как в значениях soline (cache) по-прежнему отображаются номера скидок.Я должен пропустить что-то простое.

Любые идеи, оцененные на данный момент ...

protected void SOLine_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
  SOLine row = e.Row as SOLine;
  DiscountEngine<SOLine>.ClearDiscount(sender,row);
  // RecalculateDiscounts(sender, row);  // ? (Maybe this) 
}

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Чтобы сделать это проще, вы можете просто отключить вызов RecalculateDiscounts, используя следующее расширение графика:

public class SOOrderEntryExtension : PXGraphExtension<SOOrderEntry>
{
    [PXOverride]
    public virtual void RecalculateDiscounts(PXCache sender, SOLine line, Action<PXCache, SOLine> del)
    {
        // if no discounts wanted, just return

        // else call the base/standard Acumatica calc discounts on sales order...
        if (del != null)
        {
            del(sender, line);
        }
    }
}

Вы также можете написать свою собственную логику ценообразования, используя расширение графика в ARSalesPriceMaint:

public class ARSalesPriceMaintExtension : PXGraphExtension<ARSalesPriceMaint>
{
    [PXOverride]
    public virtual decimal? CalculateSalesPriceInt(PXCache sender, string custPriceClass, int? customerID, int? inventoryID, int? siteID, CurrencyInfo currencyinfo, decimal? quantity, string UOM, DateTime date, bool alwaysFromBaseCurrency,
        Func<PXCache, string, int?, int?, int?, CurrencyInfo, decimal?, string, DateTime, bool, decimal?> del)
    {
        //run your custom price logic here and return

        // or return the base/standard Acumatica price logic...
        return del?.Invoke(sender, custPriceClass, customerID, inventoryID, siteID, currencyinfo, quantity, UOM, date, alwaysFromBaseCurrency);
    }
}

Таким образом, вам не нужно бороться с событиями, но переопределить вызовы, которые используются событиями, чтобы установить скидки и цену в заказе на продажу.Я также считаю, что расширение ARSalesPRiceMaint будет переопределять другие экраны, используя логику ценообразования, которая помогает уменьшить дублирование кода на разных экранах ввода заказов.

0 голосов
/ 05 декабря 2018

Вы на правильном пути.Еще несколько комментариев.1. Acumatica всегда будет выполнять базовое событие SOLine_RowUpdated и затем будет выполнять ваш SOLine_RowUpdated 2. Если вы хотите контролировать поток выполнения событий SOLine_RowUpdated, вы можете сделать что-то вроде этого:

protected void SOLine_RowUpdated(PXCache cache, PXRowUpdatedEventArgs e, PXRowUpdated del)
{
    //some code
    //del or pointer to basic method can be called like this:
   del(cache, e);
}
del будет указателем на метод SOLine_RowUpdated

У вас будут следующие параметры:

a.Не называйте del вообще (я не рекомендую вам этот подход, потому что в базовом методе много сотрудников, а не только расчет скидки)

b.позвоните del и затем удалите информацию о скидках

c.В случае, если ваш метод ClearDiscount не очистит информацию о скидках, это может быть связано с тем, что он пытается достичь этого с помощью простого присвоения, возможно, вы можете попробовать вместо этого метод SetValueExt.

Еще один момент, о котором следует помнить.По умолчанию Acumatica вызывает базовый метод RowUpdated, а затем вызывает ваш метод, поэтому вам не нужно использовать делегат.Я бы порекомендовал вам начинать с SetValueExt в вашем расширении графа RowUpdated вместо простого назначения.

...