Beispiel #1
0
            private static ReadOnlyCollection <PeriodicDiscount> GetRetailDiscounts(
                IEnumerable <SalesLine> salesLines,
                PriceContext priceContext,
                IPricingDataAccessor pricingDataManager,
                QueryResultSettings settings)
            {
                // don't do lookup if there aren't any price groups to search by
                HashSet <string> allPriceGroups = PriceContextHelper.GetAllPriceGroupsForDiscount(priceContext);

                if (allPriceGroups.Count == 0)
                {
                    return(new ReadOnlyCollection <PeriodicDiscount>(new PeriodicDiscount[0]));
                }

                var items = salesLines.Select(l => new ItemUnit
                {
                    ItemId = l.ItemId,
                    VariantInventoryDimensionId = l.InventoryDimensionId ?? string.Empty,
                    UnitOfMeasure = Discount.GetUnitOfMeasure(l),
                });

                ReadOnlyCollection <PeriodicDiscount> discounts =
                    pricingDataManager.ReadRetailDiscounts(items, allPriceGroups, priceContext.ActiveDate, priceContext.ActiveDate, priceContext.CurrencyCode, settings) as ReadOnlyCollection <PeriodicDiscount>;

                ReadOnlyCollection <PeriodicDiscount> validDiscounts =
                    discounts.Where(d => InternalValidationPeriod.ValidateDateAgainstValidationPeriod((DateValidationType)d.DateValidationType, d.ValidationPeriod, d.ValidFromDate, d.ValidToDate, priceContext.ActiveDate)).AsReadOnly();

                return(validDiscounts);
            }
Beispiel #2
0
            private static bool IsAdjustmentActiveOnSalesLine(
                SalesLine line,
                PriceAdjustment adjustment,
                DateTimeOffset defaultDate)
            {
                var activeDate = line.SalesDate ?? defaultDate;

                return(InternalValidationPeriod.ValidateDateAgainstValidationPeriod(
                           (DateValidationType)adjustment.DateValidationType,
                           adjustment.ValidationPeriod,
                           adjustment.ValidFromDate,
                           adjustment.ValidToDate,
                           activeDate));
            }
Beispiel #3
0
            /// <summary>
            /// Validate date against validation period.
            /// </summary>
            /// <param name="validationType">Validation type.</param>
            /// <param name="validationPeriod">Validation period.</param>
            /// <param name="startDate">Pricing start date.</param>
            /// <param name="endDate">Pricing end date.</param>
            /// <param name="dateToCheck">Date to check.</param>
            /// <returns>True if it's valid.</returns>
            public static bool ValidateDateAgainstValidationPeriod(DateValidationType validationType, ValidationPeriod validationPeriod, DateTimeOffset startDate, DateTimeOffset endDate, DateTimeOffset dateToCheck)
            {
                InternalValidationPeriod validation;
                bool promoPeriodValid = false;

                switch (validationType)
                {
                case DateValidationType.Advanced:
                    validation       = InternalValidationPeriod.CreateAdvanced(validationPeriod);
                    promoPeriodValid = validation.IsActive(dateToCheck);
                    break;

                case DateValidationType.Standard:
                    validation       = InternalValidationPeriod.CreateStandard(startDate: startDate, endDate: endDate);
                    promoPeriodValid = validation.IsActive(dateToCheck);
                    break;

                default:
                    throw new ArgumentOutOfRangeException("validationType", "Invalid Discount Validation Type: " + validationType);
                }

                return(promoPeriodValid);
            }
Beispiel #4
0
            /// <summary>
            /// For the given date/time is the validation period instance active.
            /// </summary>
            /// <param name="currentTime">Date/time to check for activity.</param>
            /// <returns>True is validation period instance is active for date/time; False otherwise.</returns>
            public bool IsActive(DateTimeOffset currentTime)
            {
                bool promoPeriodValid = false;

                if (this.ValidationType == DateValidationType.Advanced)
                {
                    if (this.Period != null)
                    {
                        promoPeriodValid = IsValidationPeriodActive(this.Period, currentTime);
                    }
                }
                else if (this.ValidationType == DateValidationType.Standard)
                {
                    promoPeriodValid = InternalValidationPeriod.IsDateWithinStartEndDate(currentTime.Date, this.StartDate, this.EndDate);
                }
                else
                {
                    string error = string.Format(CultureInfo.InvariantCulture, "The validation type '{0}' is not supported.", this.ValidationType);
                    throw new NotSupportedException(error);
                }

                return(promoPeriodValid);
            }
Beispiel #5
0
            private static bool IsValidationPeriodActive(ValidationPeriod validationPeriod, DateTimeOffset transDateTime)
            {
                if (validationPeriod == null || string.IsNullOrEmpty(validationPeriod.PeriodId))
                {
                    // If no period Id given, then it is always a valid period
                    return(true);
                }

                DateTime transDate = transDateTime.Date;
                TimeSpan transTime = transDateTime.TimeOfDay;

                // Is the discount valid within the start and end date period?
                if (InternalValidationPeriod.IsDateWithinStartEndDate(transDate, validationPeriod.ValidFrom.Date, validationPeriod.ValidTo.Date))
                {
                    bool answerFound = false;
                    bool isActive    = false;

                    // does today's configuration tell if period is active?
                    if (IsRangeDefinedForDay(validationPeriod, transDate.DayOfWeek))
                    {
                        isActive    = IsPeriodActiveForDayAndTime(validationPeriod, transDate.DayOfWeek, transTime, false);
                        answerFound = true;
                    }

                    // if we don't know or got negative result, see if yesterday will activate it (if its range ends after midnight)
                    DayOfWeek yesterday = transDate.AddDays(-1).DayOfWeek;
                    bool      lastRangeDefinedAfterMidnight =
                        IsRangeDefinedForDay(validationPeriod, yesterday) && validationPeriod.IsEndTimeAfterMidnightForDay(yesterday);

                    if ((!answerFound || isActive == false) && lastRangeDefinedAfterMidnight)
                    {
                        // if yesterday makes it active, set isActive = true
                        isActive    = IsPeriodActiveForDayAndTime(validationPeriod, yesterday, transTime, true);
                        answerFound = true;
                    }

                    // if we still don't know, try using general configuration
                    if (!answerFound)
                    {
                        var configuration = new PeriodRangeConfiguration
                        {
                            StartTime = validationPeriod.StartingTime,
                            EndTime   = validationPeriod.EndingTime,
                            IsActiveOnlyWithinBounds = validationPeriod.IsTimeBounded != 0,
                            EndsTomorrow             = validationPeriod.IsEndTimeAfterMidnight != 0
                        };

                        if ((validationPeriod.StartingTime != 0) && (validationPeriod.EndingTime != 0))
                        {
                            int currentTime = Convert.ToInt32(transTime.TotalSeconds);
                            isActive    = IsTimeActiveForConfiguration(currentTime, configuration, false);
                            answerFound = true;
                        }
                    }

                    return(answerFound ? isActive : (validationPeriod.IsTimeBounded == 1));
                }

                // not within date range, so active if not set to be within date range
                return(validationPeriod.IsTimeBounded != 1);
            }
            /// <summary>
            /// Gets list of discount lines corresponding to products.
            /// </summary>
            /// <param name="items">The collection of products.</param>
            /// <param name="priceContext">The pricing context.</param>
            /// <param name="pricingDataManager">The Pricing data manager.</param>
            /// <param name="settings">Query Settings.</param>
            /// <returns>List of discounts.</returns>
            /// <remarks>The method returns flattened list of discounts which roughly speaking means: it returns 1 line per each possible discount for every product.</remarks>
            private static ReadOnlyCollection <PeriodicDiscount> GetRetailDiscountsAndLines(
                IEnumerable <ItemUnit> items,
                PriceContext priceContext,
                IPricingDataAccessor pricingDataManager,
                QueryResultSettings settings)
            {
                // don't do lookup if there aren't any price groups to search by
                HashSet <string> allPriceGroups = PriceContextHelper.GetAllPriceGroupsForDiscount(priceContext);

                if (allPriceGroups.Count == 0)
                {
                    return(new ReadOnlyCollection <PeriodicDiscount>(new PeriodicDiscount[0]));
                }

                ReadOnlyCollection <PeriodicDiscount> discounts =
                    pricingDataManager.ReadRetailDiscounts(items, allPriceGroups, priceContext.ActiveDate, priceContext.ActiveDate, priceContext.CurrencyCode, settings) as ReadOnlyCollection <PeriodicDiscount>;

                ReadOnlyCollection <PeriodicDiscount> validDiscounts = discounts.Where(p => InternalValidationPeriod.ValidateDateAgainstValidationPeriod((DateValidationType)p.DateValidationType, p.ValidationPeriod, p.ValidFromDate, p.ValidToDate, priceContext.ActiveDate)).AsReadOnly();

                return(validDiscounts);
            }