Beispiel #1
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);
            }