protected virtual void Fill(int typiconVersionId, ModifiedYear modifiedYear) { var handler = new ModificationsRuleHandler(_dbContext, typiconVersionId, modifiedYear); //MenologyRules var menologyRules = _dbContext.GetAllMenologyRules(modifiedYear.TypiconVersionId); EachDayPerYear.Perform(modifiedYear.Year, date => { //находим правило для конкретного дня Минеи var menologyRule = menologyRules.GetMenologyRule(date); InterpretRule(menologyRule, date, handler); }); //теперь обрабатываем переходящие минейные праздники //у них не должны быть определены даты. так их и найдем var rules = menologyRules.GetAllMovableRules(); var firstJanuary = new DateTime(modifiedYear.Year, 1, 1); foreach (var a in rules) { InterpretRule(a, firstJanuary, handler); //не нашел другого способа, как только два раза вычислять изменяемые дни InterpretRule(a, firstJanuary.AddYears(1), handler); } //Triodion //найти текущую Пасху //Для каждого правила выполнять interpret(), где date = текущая Пасха. AddDays(Day.DaysFromEaster) DateTime easter = _dbContext.GetCurrentEaster(modifiedYear.Year); var triodionRules = _dbContext.GetAllTriodionRules(modifiedYear.TypiconVersionId); foreach (var triodionRule in triodionRules) { InterpretRule(triodionRule, easter.AddDays(triodionRule.DaysFromEaster), handler); } void InterpretRule(DayRule rule, DateTime dateToInterpret, ModificationsRuleHandler h) { if (rule != null) { h.ProcessingDayRule = rule; var r = _settingsFactory.CreateRecursive(new CreateRuleSettingsRequest() { TypiconVersionId = modifiedYear.TypiconVersionId, Rule = rule, Date = dateToInterpret, RuleMode = RuleMode.ModRule }); if (r.Success) { h.Settings = r.Value; //выполняем его h.Settings?.RuleContainer.Interpret(h); } } } }