/// <summary> /// Builds the set of pricing calculators to use to find price lines. /// </summary> /// <returns>Set of pricing calculators.</returns> private static IEnumerable <IPricingCalculator> GetPricingCalculators() { var calculators = new List <IPricingCalculator>(3); calculators.Add(TradeAgreementCalculator.CreateTradeAgreementCalculator()); calculators.Add(BasePriceCalculator.CreateBasePriceCalculator()); calculators.Add(PriceAdjustmentCalculator.CreatePriceAdjustmentCalculator()); return(calculators); }
private static void ResolveAndApplyPriceForSalesLine(SalesLine item, IEnumerable <PriceLine> itemPriceLines, ICurrencyOperations currencyAndRoundingHelper) { var agreementLine = itemPriceLines.OfType <TradeAgreementPriceLine>().FirstOrDefault(); var baseLine = itemPriceLines.OfType <BasePriceLine>().FirstOrDefault(); bool hasTradeAgreementPrice = agreementLine != null; bool hasBasePrice = baseLine != null; item.AgreementPrice = hasTradeAgreementPrice ? agreementLine.Value : 0m; item.BasePrice = hasBasePrice ? baseLine.Value : 0m; // use the trade agreement price if any, otherwise use the base price if (hasTradeAgreementPrice) { SetPriceOnSalesLine(item, item.AgreementPrice); item.TradeAgreementPriceGroup = agreementLine.CustPriceGroup; } else if (hasBasePrice) { SetPriceOnSalesLine(item, item.BasePrice); item.AgreementPrice = item.BasePrice; } else { SetPriceOnSalesLine(item, 0); } // now try to apply any price adjustments var adjustmentLines = itemPriceLines.OfType <PriceAdjustmentPriceLine>(); item.AdjustedPrice = PriceAdjustmentCalculator.CalculatePromotionPrice(adjustmentLines, item.Price); if (Math.Abs(item.AdjustedPrice) < Math.Abs(item.Price)) { SetPriceOnSalesLine(item, item.AdjustedPrice); item.TradeAgreementPriceGroup = null; } // round prices item.Price = currencyAndRoundingHelper.Round(item.Price); if (item.OriginalPrice.HasValue) { item.OriginalPrice = currencyAndRoundingHelper.Round(item.OriginalPrice.Value); } item.BasePrice = currencyAndRoundingHelper.Round(item.BasePrice); item.AgreementPrice = currencyAndRoundingHelper.Round(item.AgreementPrice); item.AdjustedPrice = currencyAndRoundingHelper.Round(item.AdjustedPrice); }