Beispiel #1
0
            /// <summary>
            /// Create a new instance of the <see cref="PriceContext"/> class for price calculation.
            /// </summary>
            /// <param name="pricingDataManager">Pricing data manager.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="priceCalculationMode">Price calculation mode.</param>
            /// <param name="discountCalculationMode">Discount calculation mode.</param>
            /// <param name="itemIds">Item Ids.</param>
            /// <param name="catalogIds">Catalog identifiers.</param>
            /// <param name="affiliationLoyaltyTiers">Affiliation or loyalty tier identifiers.</param>
            /// <param name="customerId">Customer Id.</param>
            /// <param name="customerPriceGroup">Customer price group.</param>
            /// <param name="priceIncludesTax">Price includes tax.</param>
            /// <param name="currencyCode">Currency code.</param>
            /// <param name="activeDate">Active date.</param>
            /// <returns>A new instance of the <see cref="PriceContext"/> class.</returns>
            public static PriceContext CreatePriceContext(
                IPricingDataAccessor pricingDataManager,
                ICurrencyOperations currencyAndRoundingHelper,
                PricingCalculationMode priceCalculationMode,
                DiscountCalculationMode discountCalculationMode,
                ISet <string> itemIds,
                ISet <long> catalogIds,
                IEnumerable <AffiliationLoyaltyTier> affiliationLoyaltyTiers,
                string customerId,
                string customerPriceGroup,
                bool priceIncludesTax,
                string currencyCode,
                DateTimeOffset activeDate)
            {
                PriceContext priceContext = CreatePriceContext(
                    pricingDataManager,
                    currencyAndRoundingHelper,
                    priceCalculationMode,
                    discountCalculationMode,
                    itemIds,
                    catalogIds,
                    affiliationLoyaltyTiers,
                    customerId,
                    customerPriceGroup,
                    string.Empty,
                    string.Empty,
                    string.Empty,
                    priceIncludesTax,
                    currencyCode,
                    activeDate);

                return(priceContext);
            }
Beispiel #2
0
            /// <summary>
            /// Create a new instance of the <see cref="PriceContext"/> class.
            /// </summary>
            /// <param name="requestContext">Request context.</param>
            /// <param name="pricingDataManager">Pricing data manager.</param>
            /// <param name="priceParameters">Price parameters.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="itemIds">Item Ids.</param>
            /// <param name="catalogIds">Catalog identifiers.</param>
            /// <param name="activeDate">Active date.</param>
            /// <param name="priceCalculationMode">Price calculation mode.</param>
            /// <param name="discountCalculationMode">Discount calculation mode.</param>
            /// <returns>A new instance of the <see cref="PriceContext"/> class.</returns>
            public static PriceContext CreatePriceContext(
                RequestContext requestContext,
                IPricingDataAccessor pricingDataManager,
                PriceParameters priceParameters,
                ICurrencyOperations currencyAndRoundingHelper,
                ISet <string> itemIds,
                ISet <long> catalogIds,
                DateTimeOffset activeDate,
                PricingCalculationMode priceCalculationMode,
                DiscountCalculationMode discountCalculationMode)
            {
                if (requestContext == null)
                {
                    throw new ArgumentNullException("requestContext");
                }

                PriceContext priceContext = new PriceContext
                {
                    CurrencyAndRoundingHelper = currencyAndRoundingHelper,
                    ActiveDate              = activeDate,
                    PriceParameters         = priceParameters,
                    PriceCalculationMode    = priceCalculationMode,
                    DiscountCalculationMode = discountCalculationMode,
                };

                PriceContextHelper.InitializePriceContextOfInferredProperties(priceContext, pricingDataManager, requestContext, itemIds, catalogIds, null);

                return(priceContext);
            }
Beispiel #3
0
            /// <summary>
            /// This method will calculate the prices for the whole sales transaction.
            /// </summary>
            /// <param name="salesTransaction">Sales transaction.</param>
            /// <param name="pricingDataManager">Provides access to the pricing data to the pricing calculation.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="customerPriceGroup">Customer price group.</param>
            /// <param name="currencyCode">Current code.</param>
            /// <param name="activeDate">Active date time offset for price.</param>
            /// <remarks>Parallel processing has been disabled, but we leave parameter here for backward compatibility.</remarks>
            public static void CalculatePricesForTransaction(
                SalesTransaction salesTransaction,
                IPricingDataAccessor pricingDataManager,
                ICurrencyOperations currencyAndRoundingHelper,
                string customerPriceGroup,
                string currencyCode,
                DateTimeOffset activeDate)
            {
                if (salesTransaction == null)
                {
                    throw new ArgumentNullException("salesTransaction");
                }

                if (pricingDataManager == null)
                {
                    throw new ArgumentNullException("pricingDataManager");
                }

                if (currencyAndRoundingHelper == null)
                {
                    throw new ArgumentNullException("currencyAndRoundingHelper");
                }

                ISet <long> catalogIds = PriceContextHelper.GetCatalogIds(salesTransaction);
                IEnumerable <AffiliationLoyaltyTier> affiliationLoyaltyTiers = PriceContextHelper.GetAffiliationLoyalTierIds(salesTransaction);

                ISet <string> itemIds      = PriceContextHelper.GetItemIds(salesTransaction);
                PriceContext  priceContext = PriceContextHelper.CreatePriceContext(
                    pricingDataManager,
                    currencyAndRoundingHelper,
                    PricingCalculationMode.Transaction,
                    DiscountCalculationMode.None,
                    itemIds,
                    catalogIds,
                    affiliationLoyaltyTiers,
                    salesTransaction.CustomerId,
                    customerPriceGroup,
                    salesTransaction.IsTaxIncludedInPrice,
                    currencyCode,
                    activeDate);

                bool isDiagnosticsCollected = GetCollectDiagnostics(salesTransaction);

                if (isDiagnosticsCollected)
                {
                    priceContext.IsDiagnosticsCollected         = true;
                    priceContext.PricingEngineDiagnosticsObject = new PricingEngineDiagnosticsObject();
                }

                PricingEngine.CalculatePricesForSalesLines(salesTransaction.PriceCalculableSalesLines, priceContext, pricingDataManager);

                if (isDiagnosticsCollected)
                {
                    SetPricingEngineDiagnosticsObject(salesTransaction, priceContext.PricingEngineDiagnosticsObject);
                }
            }
Beispiel #4
0
            /// <summary>
            /// Create a new instance of the <see cref="PriceContext"/> class.
            /// </summary>
            /// <param name="requestContext">Request context.</param>
            /// <param name="pricingDataManager">Pricing data manager.</param>
            /// <param name="transaction">Current transaction.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="activeDate">Active date.</param>
            /// <param name="customerId">Customer Id.</param>
            /// <param name="customerPriceGroup">Customer price group.</param>
            /// <param name="customerLinePriceGroup">Customer line discount price group.</param>
            /// <param name="customerMultipleLinePriceGroup">Customer multiple line discount price group.</param>
            /// <param name="customerTotalPriceGroup">Customer total discount price group.</param>
            /// <param name="priceIncludesTax">Price includes tax.</param>
            /// <param name="priceCalculationMode">Price calculation mode.</param>
            /// <param name="discountCalculationMode">Discount calculation mode.</param>
            /// <param name="calculateForNewSalesLinesOnly">A flag indicating whether to calculate for new sales lines only.</param>
            /// <param name="newSalesLineIdSet">New sales line id set.</param>
            /// <returns>A new instance of the <see cref="PriceContext"/> class.</returns>
            public static PriceContext CreatePriceContext(
                RequestContext requestContext,
                IPricingDataAccessor pricingDataManager,
                SalesTransaction transaction,
                ICurrencyOperations currencyAndRoundingHelper,
                DateTimeOffset activeDate,
                string customerId,
                string customerPriceGroup,
                string customerLinePriceGroup,
                string customerMultipleLinePriceGroup,
                string customerTotalPriceGroup,
                bool priceIncludesTax,
                PricingCalculationMode priceCalculationMode,
                DiscountCalculationMode discountCalculationMode,
                bool calculateForNewSalesLinesOnly,
                HashSet <string> newSalesLineIdSet)
            {
                if (requestContext == null)
                {
                    throw new ArgumentNullException("requestContext");
                }

                PriceContext priceContext = new PriceContext
                {
                    CurrencyAndRoundingHelper = currencyAndRoundingHelper,
                    ActiveDate                     = activeDate,
                    CustomerAccount                = customerId,
                    CustomerPriceGroup             = customerPriceGroup,
                    CustomerLinePriceGroup         = customerLinePriceGroup,
                    CustomerMultipleLinePriceGroup = customerMultipleLinePriceGroup,
                    CustomerTotalPriceGroup        = customerTotalPriceGroup,
                    IsTaxInclusive                 = priceIncludesTax,
                    PriceCalculationMode           = priceCalculationMode,
                    DiscountCalculationMode        = discountCalculationMode,
                    CalculateForNewSalesLinesOnly  = calculateForNewSalesLinesOnly,
                };

                if (newSalesLineIdSet != null && newSalesLineIdSet.Count > 0)
                {
                    priceContext.NewSalesLineIdSet.AddRange(newSalesLineIdSet);
                }

                ISet <long> catalogIds = GetCatalogIds(transaction);
                IEnumerable <AffiliationLoyaltyTier> affiliationLoyaltyTiers = GetAffiliationLoyalTierIds(transaction);
                ISet <string> itemIds = GetItemIds(transaction);

                PriceContextHelper.InitializePriceContextOfInferredProperties(priceContext, pricingDataManager, requestContext, itemIds, catalogIds, affiliationLoyaltyTiers);

                return(priceContext);
            }
Beispiel #5
0
            /// <summary>
            /// Calculate the periodic discounts for the transaction.
            /// </summary>
            /// <param name="pricingDataManager">Provides data access to the calculation.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="transaction">The sales transaction.</param>
            /// <param name="customer">Customer for the transaction containing customer discount groups.</param>
            /// <param name="doesPriceIncludeTax">Does the channel have tax-inclusive prices.</param>
            /// <param name="currencyCode">Currency code to filter discounts by.</param>
            /// <param name="channelDateTime">Channel time.</param>
            internal static void GetAllPeriodicDisc(
                IPricingDataAccessor pricingDataManager,
                ICurrencyOperations currencyAndRoundingHelper,
                SalesTransaction transaction,
                Customer customer,
                bool doesPriceIncludeTax,
                string currencyCode,
                DateTimeOffset channelDateTime)
            {
                if (transaction == null)
                {
                    throw new ArgumentNullException("transaction");
                }

                // Clear all periodic, customer, standard, total discounts
                ClearDiscountLinesOfType(transaction, null);

                PriceContext priceContext = BuildPriceContext(pricingDataManager, currencyAndRoundingHelper, customer, transaction, currencyCode, channelDateTime, doesPriceIncludeTax, DiscountCalculationMode.CalculateAll);

                PricingEngine.PopulateProductIds(pricingDataManager, priceContext, transaction);

                ReadOnlyCollection <PeriodicDiscount> periodicDiscountData = GetRetailDiscounts(transaction.ActiveSalesLines, priceContext, pricingDataManager, QueryResultSettings.AllRecords);

                foreach (SalesLine salesLine in transaction.PriceCalculableSalesLines)
                {
                    ReadOnlyCollection <PeriodicDiscount> applicablePeriodicDiscounts = Discount.GetPeriodicDiscountData(periodicDiscountData, salesLine.ItemId, salesLine.InventoryDimensionId);

                    foreach (PeriodicDiscount periodicDiscount in applicablePeriodicDiscounts)
                    {
                        var discountLine = new DiscountLine
                        {
                            OfferId                   = periodicDiscount.OfferId,
                            OfferName                 = periodicDiscount.Name,
                            Percentage                = periodicDiscount.DiscountPercent,
                            Amount                    = periodicDiscount.DiscountAmount,
                            ConcurrencyMode           = periodicDiscount.ConcurrencyMode,
                            ConcurrencyModeValue      = (int)periodicDiscount.ConcurrencyMode,
                            DiscountLineType          = DiscountLineType.PeriodicDiscount,
                            DiscountLineTypeValue     = (int)DiscountLineType.PeriodicDiscount,
                            PeriodicDiscountType      = periodicDiscount.PeriodicDiscountType,
                            PeriodicDiscountTypeValue = (int)periodicDiscount.PeriodicDiscountType,
                            DiscountApplicationGroup  = salesLine.ItemId,
                            IsDiscountCodeRequired    = periodicDiscount.IsDiscountCodeRequired
                        };

                        salesLine.DiscountLines.Add(discountLine);
                    }
                }
            }
Beispiel #6
0
            /// <summary>
            /// Gets all of the periodic discount lines for the items in the transaction.
            /// </summary>
            /// <param name="pricingDataManager">Provides data access to the calculation.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="transaction">The sales transaction.</param>
            /// <param name="currencyCode">Currency code to filter discounts by.</param>
            /// <param name="activeDate">Active date in channel date time to apply discount for.</param>
            /// <param name="doesPriceIncludeTax">Does the channel have tax-inclusive prices.</param>
            /// <remarks>Each sales line will have a collection of periodic discount lines.</remarks>
            public static void GetAllPeriodicDiscountsForLines(
                IPricingDataAccessor pricingDataManager,
                ICurrencyOperations currencyAndRoundingHelper,
                SalesTransaction transaction,
                string currencyCode,
                DateTimeOffset activeDate,
                bool doesPriceIncludeTax)
            {
                if (transaction == null)
                {
                    throw new ArgumentNullException("transaction");
                }

                Customer customer = new Customer();

                customer.SetAccountNumber(transaction.CustomerId);
                Discount.GetAllPeriodicDisc(pricingDataManager, currencyAndRoundingHelper, transaction, customer, doesPriceIncludeTax, currencyCode, activeDate);
            }
Beispiel #7
0
            /// <summary>
            /// Create a new instance of the <see cref="PriceContext"/> class for price or discount calculation.
            /// </summary>
            /// <param name="pricingDataManager">Pricing data manager.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="priceCalculationMode">Price calculation mode.</param>
            /// <param name="discountCalculationMode">Discount calculation mode.</param>
            /// <param name="itemIds">Item Ids.</param>
            /// <param name="catalogIds">Catalog identifiers.</param>
            /// <param name="affiliationLoyaltyTiers">Affiliation or loyalty tier identifiers.</param>
            /// <param name="customerId">Customer Id.</param>
            /// <param name="customerPriceGroup">Customer price group.</param>
            /// <param name="customerLinePriceGroup">Customer line discount price group.</param>
            /// <param name="customerMultipleLinePriceGroup">Customer multiple line discount price group.</param>
            /// <param name="customerTotalPriceGroup">Customer total discount price group.</param>
            /// <param name="priceIncludesTax">Price includes tax.</param>
            /// <param name="currencyCode">Currency code.</param>
            /// <param name="activeDate">Active date.</param>
            /// <returns>A new instance of the <see cref="PriceContext"/> class.</returns>
            public static PriceContext CreatePriceContext(
                IPricingDataAccessor pricingDataManager,
                ICurrencyOperations currencyAndRoundingHelper,
                PricingCalculationMode priceCalculationMode,
                DiscountCalculationMode discountCalculationMode,
                ISet <string> itemIds,
                ISet <long> catalogIds,
                IEnumerable <AffiliationLoyaltyTier> affiliationLoyaltyTiers,
                string customerId,
                string customerPriceGroup,
                string customerLinePriceGroup,
                string customerMultipleLinePriceGroup,
                string customerTotalPriceGroup,
                bool priceIncludesTax,
                string currencyCode,
                DateTimeOffset activeDate)
            {
                if (pricingDataManager == null)
                {
                    throw new ArgumentNullException("pricingDataManager");
                }

                PriceContext priceContext = new PriceContext
                {
                    CurrencyAndRoundingHelper = currencyAndRoundingHelper,
                    ActiveDate                     = activeDate,
                    CurrencyCode                   = currencyCode,
                    CustomerAccount                = customerId,
                    CustomerPriceGroup             = customerPriceGroup,
                    CustomerLinePriceGroup         = customerLinePriceGroup,
                    CustomerMultipleLinePriceGroup = customerMultipleLinePriceGroup,
                    CustomerTotalPriceGroup        = customerTotalPriceGroup,
                    PriceParameters                = pricingDataManager.GetPriceParameters(),
                    IsTaxInclusive                 = priceIncludesTax,
                    PriceCalculationMode           = priceCalculationMode,
                    DiscountCalculationMode        = discountCalculationMode,
                };

                PriceContextHelper.InitializePriceContexOfAlgorithmMode(priceContext, pricingDataManager);
                PriceContextHelper.InitializePriceContexOfPriceGroups(priceContext, pricingDataManager, catalogIds, affiliationLoyaltyTiers);
                PriceContextHelper.InitializeItemCache(priceContext, pricingDataManager, itemIds);

                return(priceContext);
            }
Beispiel #8
0
 private static PriceContext BuildPriceContext(
     IPricingDataAccessor pricingDataManager,
     ICurrencyOperations currencyAndRoundingHelper,
     Customer customer,
     SalesTransaction transaction,
     string currencyCode,
     DateTimeOffset channelDateTime,
     bool doesPriceIncludeTax,
     DiscountCalculationMode discountCalculationMode)
 {
     return(BuildPriceContext(
                pricingDataManager,
                currencyAndRoundingHelper,
                customer,
                transaction,
                currencyCode,
                doesPriceIncludeTax,
                discountCalculationMode,
                channelDateTime));
 }
Beispiel #9
0
            /// <summary>
            /// Calculates all of the discount lines for the transactions.
            /// </summary>
            /// <param name="pricingDataManager">Provides data access to the calculation.</param>
            /// <param name="transaction">The sales transaction.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="currencyCode">Currency code to filter discounts by.</param>
            /// <param name="lineDiscountGroup">Optional. Line discount group Id for the customer.</param>
            /// <param name="multilineDiscountGroup">Optional. Multiline discount group Id for the customer.</param>
            /// <param name="totalDiscountGroup">Optional. Total discount group Id for the customer.</param>
            /// <param name="shouldTotalLines">True if discount lines should be totaled for each line. False if they should be left as raw discount lines.</param>
            /// <param name="calculationMode">Pricing calculation mode.</param>
            /// <param name="activeDate">Optional. Active, channel date/time to apply discount for.</param>
            /// <remarks>Each sales line will have a collection of DiscountLines and a net discount total in DiscountAmount property (if totaling is enabled).</remarks>
            public static void CalculateDiscountsForLines(
                IPricingDataAccessor pricingDataManager,
                SalesTransaction transaction,
                ICurrencyOperations currencyAndRoundingHelper,
                string currencyCode,
                string lineDiscountGroup,
                string multilineDiscountGroup,
                string totalDiscountGroup,
                bool shouldTotalLines,
                DiscountCalculationMode calculationMode,
                DateTimeOffset activeDate)
            {
                if (transaction == null)
                {
                    throw new ArgumentNullException("transaction");
                }

                Customer     customer     = InitializeCustomer(transaction, lineDiscountGroup, multilineDiscountGroup, totalDiscountGroup);
                PriceContext priceContext = Discount.BuildPriceContext(pricingDataManager, currencyAndRoundingHelper, customer, transaction, currencyCode, transaction.IsTaxIncludedInPrice, calculationMode, activeDate);

                bool isDiagnosticsCollected = GetCollectDiagnostics(transaction);

                if (isDiagnosticsCollected)
                {
                    priceContext.IsDiagnosticsCollected         = true;
                    priceContext.PricingEngineDiagnosticsObject = new PricingEngineDiagnosticsObject();
                }

                CalculateDiscountsForLines(
                    pricingDataManager,
                    transaction,
                    shouldTotalLines,
                    priceContext);

                if (isDiagnosticsCollected)
                {
                    SetPricingEngineDiagnosticsObject(transaction, priceContext.PricingEngineDiagnosticsObject);
                }
            }
Beispiel #10
0
            /// <summary>
            /// Create a new instance of the <see cref="PriceContext"/> class.
            /// </summary>
            /// <param name="requestContext">Request context.</param>
            /// <param name="pricingDataManager">Pricing data manager.</param>
            /// <param name="transaction">Current transaction.</param>
            /// <param name="priceParameters">Price parameters.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            /// <param name="activeDate">Active date.</param>
            /// <param name="customerId">Customer Id.</param>
            /// <param name="customerPriceGroup">Customer price group.</param>
            /// <param name="priceIncludesTax">Price includes tax.</param>
            /// <param name="priceCalculationMode">Price calculation mode.</param>
            /// <param name="discountCalculationMode">Discount calculation mode.</param>
            /// <returns>A new instance of the <see cref="PriceContext"/> class.</returns>
            public static PriceContext CreatePriceContext(
                RequestContext requestContext,
                IPricingDataAccessor pricingDataManager,
                SalesTransaction transaction,
                PriceParameters priceParameters,
                ICurrencyOperations currencyAndRoundingHelper,
                DateTimeOffset activeDate,
                string customerId,
                string customerPriceGroup,
                bool priceIncludesTax,
                PricingCalculationMode priceCalculationMode,
                DiscountCalculationMode discountCalculationMode)
            {
                if (requestContext == null)
                {
                    throw new ArgumentNullException("requestContext");
                }

                PriceContext priceContext = new PriceContext
                {
                    CurrencyAndRoundingHelper = currencyAndRoundingHelper,
                    ActiveDate              = activeDate,
                    CustomerAccount         = customerId,
                    CustomerPriceGroup      = customerPriceGroup,
                    IsTaxInclusive          = priceIncludesTax,
                    PriceParameters         = priceParameters,
                    PriceCalculationMode    = priceCalculationMode,
                    DiscountCalculationMode = discountCalculationMode,
                };

                ISet <long> catalogIds = GetCatalogIds(transaction);
                IEnumerable <AffiliationLoyaltyTier> affiliationLoyaltyTiers = GetAffiliationLoyalTierIds(transaction);
                ISet <string> itemIds = GetItemIds(transaction);

                PriceContextHelper.InitializePriceContextOfInferredProperties(priceContext, pricingDataManager, requestContext, itemIds, catalogIds, affiliationLoyaltyTiers);

                return(priceContext);
            }
Beispiel #11
0
            internal static PriceContext BuildPriceContext(
                IPricingDataAccessor pricingDataManager,
                ICurrencyOperations currencyAndRoundingHelper,
                Customer customer,
                SalesTransaction transaction,
                string currencyCode,
                bool doesPriceIncludeTax,
                DiscountCalculationMode discountCalculationMode,
                DateTimeOffset activeDate)
            {
                string customerAccount                = string.Empty;
                string customerPriceGroup             = string.Empty;
                string customerLinePriceGroup         = string.Empty;
                string customerMultipleLinePriceGroup = string.Empty;
                string customerTotalPriceGroup        = string.Empty;

                if (customer != null)
                {
                    if (!string.IsNullOrWhiteSpace(customer.AccountNumber))
                    {
                        customerAccount = customer.AccountNumber;
                    }

                    if (!string.IsNullOrWhiteSpace(customer.PriceGroup))
                    {
                        customerPriceGroup = customer.PriceGroup;
                    }

                    if (!string.IsNullOrWhiteSpace(customer.LineDiscountGroup))
                    {
                        customerLinePriceGroup = customer.LineDiscountGroup;
                    }

                    if (!string.IsNullOrWhiteSpace(customer.MultilineDiscountGroup))
                    {
                        customerMultipleLinePriceGroup = customer.MultilineDiscountGroup;
                    }

                    if (!string.IsNullOrWhiteSpace(customer.TotalDiscountGroup))
                    {
                        customerTotalPriceGroup = customer.TotalDiscountGroup;
                    }
                }

                ISet <string> itemIds    = PriceContextHelper.GetItemIds(transaction);
                ISet <long>   catalogIds = PriceContextHelper.GetCatalogIds(transaction);
                IEnumerable <AffiliationLoyaltyTier> affiliationLoyaltyTierIds = PriceContextHelper.GetAffiliationLoyalTierIds(transaction);

                return(PriceContextHelper.CreatePriceContext(
                           pricingDataManager,
                           currencyAndRoundingHelper,
                           PricingCalculationMode.Transaction,
                           discountCalculationMode,
                           itemIds,
                           catalogIds,
                           affiliationLoyaltyTierIds,
                           customerAccount,
                           customerPriceGroup,
                           customerLinePriceGroup,
                           customerMultipleLinePriceGroup,
                           customerTotalPriceGroup,
                           doesPriceIncludeTax,
                           currencyCode ?? string.Empty,
                           activeDate));
            }
Beispiel #12
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);
            }
Beispiel #13
0
            /// <summary>
            /// For the given item lines calculate and set their prices based on the set
            ///  of price lines provided (keyed by item line line Id).
            /// </summary>
            /// <param name="salesLines">Item lines to have their prices set.</param>
            /// <param name="priceLines">Set of price lines used to set the item line prices.</param>
            /// <param name="currencyAndRoundingHelper">Currency and rounding helper.</param>
            public static void ResolveAndApplyPriceLines(IEnumerable <SalesLine> salesLines, Dictionary <string, IEnumerable <PriceLine> > priceLines, ICurrencyOperations currencyAndRoundingHelper)
            {
                foreach (var sl in salesLines)
                {
                    IEnumerable <PriceLine> prices;
                    if (!priceLines.TryGetValue(sl.LineId, out prices))
                    {
                        prices = new PriceLine[0];
                    }

                    ResolveAndApplyPriceForSalesLine(sl, prices, currencyAndRoundingHelper);
                }
            }