コード例 #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);
            }
コード例 #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);
            }
コード例 #3
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);
            }
コード例 #4
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);
            }
コード例 #5
0
ファイル: Discount.cs プロジェクト: siva497/AX7v2RetailSDK
 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));
 }
コード例 #6
0
            /// <summary>
            /// Check whether discount type matches the discount calculation mode in price context.
            /// </summary>
            /// <param name="priceContext">Price context.</param>
            /// <param name="discountType">Discount type.</param>
            /// <returns>True if discount type matches the discount calculation mode.</returns>
            public static bool MatchCalculationMode(PriceContext priceContext, PeriodicDiscountOfferType discountType)
            {
                if (priceContext == null)
                {
                    throw new ArgumentNullException("priceContext");
                }

                bool match = false;
                DiscountCalculationMode filterFlag = DiscountCalculationMode.None;

                switch (discountType)
                {
                case PeriodicDiscountOfferType.Offer:
                    filterFlag = DiscountCalculationMode.CalculateOffer;
                    break;

                case PeriodicDiscountOfferType.MultipleBuy:
                    filterFlag = DiscountCalculationMode.CalculateMultipleBuy;
                    break;

                case PeriodicDiscountOfferType.MixAndMatch:
                    filterFlag = DiscountCalculationMode.CalculateMixAndMatch;
                    break;

                case PeriodicDiscountOfferType.Threshold:
                    filterFlag = DiscountCalculationMode.CalculateThreshold;
                    break;

                default:
                    break;
                }

                if (filterFlag != DiscountCalculationMode.None)
                {
                    match = (priceContext.DiscountCalculationMode & filterFlag) != DiscountCalculationMode.None;
                }

                return(match);
            }
コード例 #7
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);
                }
            }
コード例 #8
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);
            }
コード例 #9
0
ファイル: Discount.cs プロジェクト: siva497/AX7v2RetailSDK
            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));
            }
コード例 #10
0
ファイル: Discount.cs プロジェクト: siva497/AX7v2RetailSDK
            /// <summary>
            /// Calculates all of the discounts for the transactions.
            /// </summary>
            /// <param name="context">The request context.</param>
            /// <param name="transaction">The sales transaction.</param>
            /// <param name="discountCalculationMode">Discount calculation mode.</param>
            public void CalculateDiscount(RequestContext context, SalesTransaction transaction, DiscountCalculationMode discountCalculationMode)
            {
                if (transaction == null)
                {
                    throw new ArgumentNullException("transaction");
                }

                // take a snapshot of discount amount coming from previous computations, if there is any
                Dictionary <string, decimal> previousLineDiscounts = new Dictionary <string, decimal>(StringComparer.OrdinalIgnoreCase);

                // Consider calculable lines only. Ignore voided or return-by-receipt lines.
                if (transaction.PriceCalculableSalesLines.Any())
                {
                    // Consider calculable lines only. Ignore voided or return-by-receipt lines.
                    foreach (var line in transaction.PriceCalculableSalesLines)
                    {
                        // if it is zero, means this is the first time we are calculating, there is no previous state
                        if (line.DiscountAmount != 0)
                        {
                            previousLineDiscounts.Add(line.LineId, line.DiscountAmount);
                        }
                    }
                }

                var channelConfiguration = context.GetChannelConfiguration();

                var customer = GetCustomer(context, transaction.CustomerId);

                PE.PricingEngine.CalculateDiscountsForLines(
                    this.pricingDataManager,
                    transaction,
                    new ChannelCurrencyOperations(context),
                    channelConfiguration.Currency,
                    customer.LineDiscountGroup,
                    customer.MultilineDiscountGroup,
                    customer.TotalDiscountGroup,
                    false,
                    discountCalculationMode,
                    context.GetNowInChannelTimeZone());

                // check whether any discount discrepancy occurred after calculation
                if (transaction.PriceCalculableSalesLines.Any())
                {
                    // Consider calculable lines only. Ignore voided or return-by-receipt lines.
                    foreach (var line in transaction.PriceCalculableSalesLines)
                    {
                        // calculate on a clone so that we don't modify the actual sales line
                        var clonedLine = line.Clone <SalesLine>();
                        SalesTransactionTotaler.CalculateLine(context, transaction, clonedLine);

                        Discount.RaiseNotificationIfDiscountWasInvalidated(context, previousLineDiscounts, clonedLine);
                    }
                }

                transaction.IsDiscountFullyCalculated = discountCalculationMode.HasFlag(DiscountCalculationMode.CalculateAll);
            }