public override IEnumerable <ValidationResult> Validate(TriodionRuleCreateEditModel model)
        {
            var errors = ValidateDayRule(model);

            if (model.DaysFromEaster < -363 ||
                model.DaysFromEaster > 363)
            {
                errors.Add(new ValidationResult("Количество дней от Пасхи должно варьироваться в пределах одного календарного года (-364..364)", new List <string>()
                {
                    "DayWorships"
                }));
            }

            //проверяем на уникальность DaysFromEaster
            TriodionRule found = null;

            if (model.Mode == ModelMode.Create)
            {
                //если объект создается, Id = Id версии Устава,
                //значит ищем TriodionRule с таким же DaysFromEaster
                found = DbContext.Set <TriodionRule>()
                        .FirstOrDefault(c => c.DaysFromEaster == model.DaysFromEaster &&
                                        c.TypiconVersion.TypiconId == model.Id &&
                                        c.TypiconVersion.BDate == null &&
                                        c.TypiconVersion.EDate == null);
            }
            else
            {
                //Edit
                //сначала находим сам редактируемый объект
                found = DbContext.Set <TriodionRule>().FirstOrDefault(c => c.Id == model.Id);

                if (found?.DaysFromEaster == model.DaysFromEaster)
                {
                    //если значения DaysFromEaster найденного объекта и редактируемой модели равны,
                    //значит ошибки нет
                    found = null;
                }
                else if (found != null)
                {
                    //ищем дальше
                    found = DbContext.Set <TriodionRule>()
                            .FirstOrDefault(c => c.TypiconVersionId == found.TypiconVersionId &&
                                            c.DaysFromEaster == model.DaysFromEaster);
                }
            }
            if (found != null)
            {
                errors.Add(new ValidationResult("В Уставе уже есть Правило Триоди с заданным значением Количества дней от Пасхи", new List <string>()
                {
                    "DaysFromEaster"
                }));
            }

            return(errors);
        }
예제 #2
0
        public void CheckMenology_False()
        {
            DayRule rule         = new TriodionRule();
            var     modifiedRule = new ModifiedRule()
            {
                DayRule = rule
            };

            Assert.IsFalse(TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule.DayRule));
        }
예제 #3
0
        public TriodionRule FindTriodionRule(int daysFromEaster)
        {
            TriodionRule result = (TriodionRule)ChildElements.AsQueryable().
                                  FirstOrDefault(c => ((c is TriodionRule) && ((c as TriodionRule).Day.DaysFromEaster == daysFromEaster)));

            if (result == null)
            {
                foreach (TypiconFolder folder in Folders)
                {
                    result = folder.FindTriodionRule(daysFromEaster);
                    if (result != null)
                    {
                        return(result);
                    }
                }
            }

            return(result);
        }
예제 #4
0
        private void MigrateTriodionDaysAndRules(TypiconVersion typiconEntity)
        {
            Console.WriteLine("MigrateTriodionDaysAndRules()");

            Timer timer = new Timer();

            timer.Start();

            //TypiconFolderEntity folder = new TypiconFolderEntity() { Name = "Триодь" };

            //typiconEntity.RulesFolder.AddFolder(folder);

            foreach (ScheduleDBDataSet.TriodionRow row in _sh.DataSet.Triodion.Rows)
            {
                //CreateItemTextRequest req = new CreateItemTextRequest();
                //req.Text = row.Name;
                //req.Name = "Name1";
                //req.Style.IsBold = row.IsNameBold;
                //ItemTextCollection itemTextCol = XmlHelper.CreateItemTextCollection(req);

                DayWorship dayWorship = new DayWorship()
                {
                    WorshipName = new ItemTextStyled()
                };
                dayWorship.WorshipName.IsBold = row.IsNameBold;
                dayWorship.WorshipName.AddOrUpdate(DEFAULT_LANGUAGE, row.Name);

                //DayWorship dayWorship = new DayWorship()
                //{
                //    WorshipName = new ItemFakeText() { StringExpression = row.Name }
                //};

                TriodionDay day = new TriodionDay()
                {
                    //Name = row.Name,
                    //DayName = itemTextCol,
                    DaysFromEaster = (int)row.DayFromEaster,
                };

                day.AppendDayService(dayWorship);
                //day.Sign = _dbContext.Set<Sign>().Get(c => c.Id == row.SignID);

                _dbContext.Set <TriodionDay>().Add(day);

                string folderPath = Path.Combine(FOLDER_PATH, TYPICON_NAME, "Triodion");

                FileReader fileReader = new FileReader(folderPath);

                TriodionRule rule = new TriodionRule()
                {
                    //Name = day.Name,
                    DaysFromEaster   = day.DaysFromEaster,
                    TypiconVersionId = typiconEntity.Id,
                    //Owner = typiconEntity,
                    //IsAddition = true,
                    Template          = typiconEntity.Signs.First(c => c.SignName.FirstOrDefault(DEFAULT_LANGUAGE).Text == row.ServiceSignsRow.Name),
                    RuleDefinition    = fileReader.Read(row.DayFromEaster.ToString()),
                    ModRuleDefinition = fileReader.Read(row.DayFromEaster.ToString(), "mod")
                };
                rule.DayRuleWorships = new List <DayRuleWorship>()
                {
                    new DayRuleWorship()
                    {
                        DayRule = rule, DayWorship = dayWorship, Order = 1
                    }
                };

                //folder.AddRule(rule);
                typiconEntity.TriodionRules.Add(rule);
            }

            timer.Stop();
            Console.WriteLine(timer.GetStringValue());

            //_unitOfWork.Commit();
        }
예제 #5
0
        private void MigrateTriodionDaysAndRules(TypiconEntity typiconEntity)
        {
            Console.WriteLine("MigrateTriodionDaysAndRules()");

            Timer timer = new Timer();

            timer.Start();

            //TypiconFolderEntity folder = new TypiconFolderEntity() { Name = "Триодь" };

            //typiconEntity.RulesFolder.AddFolder(folder);

            foreach (ScheduleDBDataSet.TriodionRow row in _sh.DataSet.Triodion.Rows)
            {
                //CreateItemTextRequest req = new CreateItemTextRequest();
                //req.Text = row.Name;
                //req.Name = "Name1";
                //req.Style.IsBold = row.IsNameBold;
                //ItemTextCollection itemTextCol = XmlHelper.CreateItemTextCollection(req);

                DayWorship dayWorship = new DayWorship()
                {
                    WorshipName = new ItemTextStyled()
                };
                dayWorship.WorshipName.Style.IsBold = row.IsNameBold;
                dayWorship.WorshipName.AddElement("cs-ru", row.Name);

                //DayWorship dayWorship = new DayWorship()
                //{
                //    WorshipName = new ItemFakeText() { StringExpression = row.Name }
                //};

                TriodionDay day = new TriodionDay()
                {
                    //Name = row.Name,
                    //DayName = itemTextCol,
                    DaysFromEaster = (int)row.DayFromEaster,
                };

                day.AppendDayService(dayWorship);
                //day.Sign = _unitOfWork.Repository<Sign>().Get(c => c.Id == row.SignID);

                _unitOfWork.Repository <TriodionDay>().Insert(day);

                string folderPath = Path.Combine(Properties.Settings.Default.FolderPath, typiconEntity.Name, "Triodion");

                FileReader fileReader = new FileReader(folderPath);

                TriodionRule rule = new TriodionRule()
                {
                    //Name = day.Name,
                    DaysFromEaster = day.DaysFromEaster,
                    Owner          = typiconEntity,
                    //IsAddition = true,
                    Template       = typiconEntity.Signs.First(c => c.SignName["cs-ru"] == row.ServiceSignsRow.Name),
                    RuleDefinition = fileReader.Read(row.DayFromEaster.ToString()),
                };
                rule.DayRuleWorships = new List <DayRuleWorship>()
                {
                    new DayRuleWorship()
                    {
                        DayRule = rule, DayWorship = dayWorship
                    }
                };

                //folder.AddRule(rule);
                typiconEntity.TriodionRules.Add(rule);
            }

            timer.Stop();
            Console.WriteLine(timer.GetStringValue());

            //_unitOfWork.Commit();
        }
예제 #6
0
        /// <summary>
        /// Из трех правил выбирает главное и составляет коллекцию богослужебных текстов.
        /// Считаем, что ModifiedRule не является ДОПОЛНЕНИЕМ
        /// </summary>
        /// <param name="modifiedRule"></param>
        /// <param name="menologyRule"></param>
        /// <param name="triodionRule"></param>
        /// <returns>Правило для обработки, список текстов богослужений</returns>
        private (DayRule MajorRule, IEnumerable <DayWorship> Menologies, IEnumerable <DayWorship> Triodions, bool ModifiedIsUsed) CalculatePriorities(ModifiedRule modifiedRule, MenologyRule menologyRule, TriodionRule triodionRule)
        {
            //Приоритет Минеи
            IDayRule menologyToCompare = SetValues(menologyRule
                                                   , out int menologyPriority
                                                   , TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule?.DayRule));

            //Приоритет Триоди
            IDayRule triodionToCompare = SetValues(triodionRule
                                                   , out int triodionPriority
                                                   , TypeEqualsOrSubclassOf <TriodionRule> .Is(modifiedRule?.DayRule));

            IDayRule SetValues(DayRule dr, out int p, bool typeEqualsOrSubclassOf)
            {
                IDayRule r = null;

                p = int.MaxValue;

                if (typeEqualsOrSubclassOf)
                {
                    r = modifiedRule;//.DayRule;
                    p = modifiedRule.Priority;
                }
                else if (dr != null)
                {
                    r = dr;
                    p = dr.Template.Priority;
                }

                return(r);
            };

            IDayRule majorRule  = null;
            var      menologies = new List <DayWorship>();
            var      triodions  = new List <DayWorship>();

            int result = menologyPriority - triodionPriority;

            //сравниваем
            switch (result)
            {
            case 1:
            case 0:
                //senior Triodion, junior Menology
                majorRule = triodionToCompare;

                menologies.AddRange(menologyToCompare.DayWorships);
                triodions.AddRange(triodionToCompare.DayWorships);
                break;

            case -1:
                //senior Menology, junior Triodion
                majorRule = menologyToCompare;

                menologies.AddRange(menologyToCompare.DayWorships);
                triodions.AddRange(triodionToCompare.DayWorships);
                break;

            default:
                if (result < -1)
                {
                    //только Минея
                    majorRule = menologyToCompare;

                    menologies.AddRange(menologyToCompare.DayWorships);
                }
                else
                {
                    //только Триодь
                    majorRule = triodionToCompare;

                    triodions.AddRange(triodionToCompare.DayWorships);
                }
                break;
            }

            //Вводим переменную для того, чтобы затем обнулить ссылку на ModifiedRule
            bool modifiedRuleIsUsed = false;

            //если это измененное правило, то возвращаем правило, на которое оно указывает
            if (majorRule is ModifiedRule mr)
            {
                majorRule = mr.DayRule;

                modifiedRuleIsUsed = true;
            }

            return(majorRule as DayRule, menologies, triodions, modifiedRuleIsUsed);
        }
예제 #7
0
        public void IsTwoSaints_Test()
        {
            ServiceSequenceHandler handler = new ServiceSequenceHandler()
            {
                Settings = new RuleHandlerSettings()
                {
                    Date = DateTime.Today
                }
            };

            string folderPath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData");
            var    reader     = new FileReader(folderPath);
            string xml        = reader.Read("IsTwoSaints_Simple.xml");

            //Ektenis element = RuleFactory.CreateElement(xml) as Ektenis;


            //Минея - попразднество, 1 святой
            MenologyRule rule = TypiconVersion.GetMenologyRule(new DateTime(2017, 09, 28));

            rule.RuleDefinition = xml;

            handler.Settings.Menologies = rule.DayWorships.ToList();

            rule.GetRule <ExecContainer>(Serializer).Interpret(handler);

            var model = handler.ActualWorshipChildElements;

            //EktenisViewModel model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel;

            Assert.AreEqual(1, model.Count);

            //Триодь, Минея - 1 святой
            rule = TypiconVersion.GetMenologyRule(new DateTime(2017, 3, 16));
            rule.RuleDefinition = xml;

            TriodionRule triodRule = TypiconVersion.GetTriodionRule(-20);

            handler.Settings.Menologies = rule.DayWorships.ToList();
            handler.Settings.Triodions  = triodRule.DayWorships.ToList();

            handler.ClearResult();
            rule.GetRule <ExecContainer>(Serializer).Interpret(handler);

            model = handler.ActualWorshipChildElements;

            //model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel;

            Assert.AreEqual(1, model.Count);

            //а теперь находим правило НЕ праздничное, 2 святых
            rule = TypiconVersion.GetMenologyRule(new DateTime(2017, 5, 31));
            rule.RuleDefinition = xml;

            handler.Settings.Menologies = rule.DayWorships.ToList();

            handler.ClearResult();
            rule.GetRule <ExecContainer>(Serializer).Interpret(handler);

            model = handler.ActualWorshipChildElements;

            //model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel;

            Assert.AreEqual(2, model.Count);
        }
예제 #8
0
        public void IsTwoSaints_Test()
        {
            EFUnitOfWork _unitOfWork = new EFUnitOfWork();
            //BookStorage.Instance = BookStorageFactory.Create();
            GetTypiconEntityResponse resp          = new TypiconEntityService(_unitOfWork).GetTypiconEntity(1);
            TypiconEntity            typiconEntity = resp.TypiconEntity;

            ServiceSequenceHandler handler = new ServiceSequenceHandler()
            {
                Settings = new RuleHandlerSettings()
                {
                    Language = LanguageSettingsFactory.Create("cs-ru"), Date = DateTime.Today
                }
            };

            string     folderPath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"TestData");
            FileReader reader     = new FileReader(folderPath);
            string     xml        = reader.Read("IsTwoSaints_Simple.xml");

            //Ektenis element = RuleFactory.CreateElement(xml) as Ektenis;


            //Минея - попразднество, 1 святой
            MenologyRule rule = typiconEntity.GetMenologyRule(new DateTime(2017, 09, 28));

            rule.RuleDefinition = xml;

            handler.Settings.Rule        = rule;
            handler.Settings.DayWorships = rule.DayWorships;

            rule.GetRule(TestRuleSerializer.Root).Interpret(handler);

            var model = handler.GetResult();

            //EktenisViewModel model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel;

            Assert.AreEqual(1, model.FirstOrDefault()?.Count);

            //Триодь, Минея - 1 святой
            rule = typiconEntity.GetMenologyRule(new DateTime(2017, 3, 16));
            rule.RuleDefinition = xml;

            TriodionRule triodRule = typiconEntity.GetTriodionRule(-20);

            rule.DayWorships.AddRange(triodRule.DayWorships);

            handler.Settings.Rule        = rule;
            handler.Settings.DayWorships = rule.DayWorships;

            handler.ClearResult();
            rule.GetRule(TestRuleSerializer.Root).Interpret(handler);

            model = handler.GetResult();

            //model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel;

            Assert.AreEqual(1, model.FirstOrDefault()?.Count);

            //а теперь находим правило НЕ праздничное, 2 святых
            rule = typiconEntity.GetMenologyRule(new DateTime(2017, 5, 31));
            rule.RuleDefinition = xml;

            handler.Settings.Rule        = rule;
            handler.Settings.DayWorships = rule.DayWorships;

            handler.ClearResult();
            rule.GetRule(TestRuleSerializer.Root).Interpret(handler);

            model = handler.GetResult();

            //model = rule.GetRule<EktenisRule>(TestRuleSerializer.Root).CreateViewModel(handler) as EktenisViewModel;

            Assert.AreEqual(2, model.FirstOrDefault()?.Count);
        }
        /// <summary>
        /// Из трех правил выбирает главное и составляет коллекцию богослужебных текстов.
        /// Считаем, что ModifiedRule не является ДОПОЛНЕНИЕМ
        /// </summary>
        /// <param name="modifiedRule"></param>
        /// <param name="menologyRule"></param>
        /// <param name="triodionRule"></param>
        /// <returns>Правило для обработки, список текстов богослужений</returns>
        private (DayRule, IEnumerable <DayWorship>) CalculatePriorities(ModifiedRule modifiedRule, MenologyRule menologyRule, TriodionRule triodionRule)
        {
            //Приоритет Минеи
            IDayRule menologyToCompare = SetValues(menologyRule, out int menologyPriority, typeof(MenologyRule));
            //Приоритет Триоди
            IDayRule triodionToCompare = SetValues(triodionRule, out int triodionPriority, typeof(TriodionRule));

            IDayRule SetValues(DayRule dr, out int p, Type t)
            {
                IDayRule r = null;

                p = int.MaxValue;
                if (modifiedRule?.RuleEntity.GetType().Equals(t) == true)
                {
                    r = modifiedRule;
                    p = modifiedRule.Priority;
                }
                else if (dr != null)
                {
                    r = dr;
                    p = dr.Template.Priority;
                }

                return(r);
            };

            var rulesList = new List <IDayRule>();

            int result = menologyPriority - triodionPriority;

            //сравниваем
            switch (result)
            {
            case 1:
            case 0:
                //senior Triodion, junior Menology
                rulesList.Add(triodionToCompare);
                rulesList.Add(menologyToCompare);
                break;

            case -1:
                //senior Menology, junior Triodion
                rulesList.Add(menologyToCompare);
                rulesList.Add(triodionToCompare);
                break;

            default:
                if (result < -1)
                {
                    //только Минея
                    rulesList.Add(menologyToCompare);
                }
                else
                {
                    //только Триодь
                    rulesList.Add(triodionToCompare);
                }
                break;
            }

            //формируем список текстов
            List <DayWorship> dayWorships = new List <DayWorship>();

            rulesList.ForEach(c => dayWorships.AddRange(c.DayWorships));

            //находим главное правило
            var rule = rulesList.First();

            //если это измененное правило, то возвращаем правило, на которое оно указывает
            if (rule is ModifiedRule)
            {
                rule = (rule as ModifiedRule).RuleEntity;
            }

            return(rule as DayRule, dayWorships);
        }