private void TrySetModifier( bool isModifierValid, out bool hasModifier, out PriceChangerEnum sign, out decimal percents, ScheduleDay priceModifier) { if (isModifierValid) { hasModifier = true; sign = priceModifier.PriceChangerSign; percents = priceModifier.PriceModifier; } else { hasModifier = false; sign = PriceChangerEnum.None; percents = 0m; } var hourEntities = priceModifier.Hours .Where(x => x.IsActive) .OrderBy(x => x.StartFromHour) .ThenBy(x => x.StartFromMinutes); foreach (var hour in hourEntities) { var startTime = new DateTime( DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, hour.StartFromHour, hour.StartFromMinutes, 0).ToUniversalTime(); var endTime = new DateTime( DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, hour.EndAtHour, hour.EndAtMinutes, 0).ToUniversalTime(); bool inTime = DateTime.UtcNow >= startTime && DateTime.UtcNow <= endTime; bool hasHourModifier = hour.PriceChangerSign != PriceChangerEnum.None && hour.PriceModifier > 0; if (hour.IsActive && inTime && hasHourModifier) { hasModifier = true; sign = hour.PriceChangerSign; percents = hour.PriceModifier; break; } } }
public decimal GetPricePerGame( IServiceProvider serviceProvider, IList <ScheduleDay> egmPriceModifiers, EGM game) { if (egmPriceModifiers == null || !egmPriceModifiers.Any()) { return(game.PricePerGame); } bool hasModifier = false; //ScheduleDay modifier; PriceChangerEnum sign = PriceChangerEnum.None; decimal percents = 0m; // get modifier foreach (var priceModifier in egmPriceModifiers) { bool isModifierValid = priceModifier.PriceChangerSign != PriceChangerEnum.None && priceModifier.PriceModifier > 0; if (priceModifier.IsActive && priceModifier.IsDateRange) { if (DateTime.UtcNow >= priceModifier.From && DateTime.UtcNow <= priceModifier.To) { TrySetModifier(isModifierValid, out hasModifier, out sign, out percents, priceModifier); } if (hasModifier) { break; } } else if (priceModifier.IsActive) { var currentDay = (int)DateTime.UtcNow.DayOfWeek; if (currentDay == 0) { currentDay = 7; } if (currentDay == priceModifier.DayOfWeek) { TrySetModifier(isModifierValid, out hasModifier, out sign, out percents, priceModifier); if (hasModifier) { break; } } } } // modified price per game var pricePerGame = game.PricePerGame; if (hasModifier) { if (sign == PriceChangerEnum.Add) { pricePerGame += ((pricePerGame / 100) * percents); } else if (sign == PriceChangerEnum.Subtract) { pricePerGame -= ((pricePerGame / 100) * percents); } } return(pricePerGame); }