Чтобы сделать это проще, вы можете просто отключить вызов 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 будет переопределять другие экраны, используя логику ценообразования, которая помогает уменьшить дублирование кода на разных экранах ввода заказов.