Example #1
0
            /// <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);
            }
Example #2
0
            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);
            }