public void WalkThrough(RuleNode rootNode, BulletinScreenModelBase bulletin) { var visitor = new GeneralErrorMarkerVisitor(); rootNode.Accept(visitor); SetWasntChecked(visitor); _votesFieldsWasntCheckedSetter.SetVoteFieldsThatDontHaveCorrespondingChecksSetAsWasntChecked(bulletin); }
private static RuleNode GetQuestionsParallelRule(List <Question> questions, BulletinScreenModelBase bulletin) { var questionRules = new List <RuleNode>(); questionRules.AddRange(GetQSimpleParallelRules(questions, bulletin)); questionRules.AddRange(GetQSeparateParallelRules(questions, bulletin)); questionRules.AddRange(GetQCumulativeParallelRules(questions, bulletin)); return(RuleBuilder .ParallelRootRule(questionRules.ToArray()) .GetRoot()); }
public static RuleNode BuildGraph(BulletinScreenModelBase bulletin) { return(RuleBuilder .RootRule(new PacketMustBeRegisteredRule(bulletin.PacketIsRegistered)) .AddParallelRule(bulletin.Signatures, signature => RuleBuilder.RootRule(new SignatureMustBePresentRule(signature)) .AddParallelRule(new OwnersCountSignatureWarningRule(signature, bulletin.OwnersCount), GetQuestionsParallelRule(signature.AssociatedQuestions, bulletin)) .GetRoot()) .GetRoot()); }
private static List <RuleNode> GetQSimpleParallelRules(List <Question> questions, BulletinScreenModelBase bulletin) { return(questions .OfType <QSimple>() .ToList() .Select(q => RuleBuilder .RootRuleChain(GetRuleForBaseYesNoAbstainedPoint(q.Point, bulletin, q.AmountOfStock, isQSimpWithPrivDividends: q.IsQuestionAboutPrivilegeDividends.Value && bulletin.HasPrivilegeVotes)) .AddRule(new QSimpleQSepAndHierSubQFractionDistributionRule(q.Point, () => q.AllowedVotesAmountFractions, bulletin.IsADRBulletin, () => bulletin.AdditionalMarks.HasInstructions.Value)) .AddRule(new AdrMustHaveExactVotesSpreadedForQSimple(q.Point, () => q.AmountOfStock, bulletin.IsADRBulletin)) .AddRule(new QSimpleQSepAndHierSubQWarningRule(q.Point, bulletin.AdditionalMarks, () => q.AmountOfStock)) .AddRule(new QSimplePrivilegeDividendsNoAbsWarningRule(q, bulletin.HasPrivilegeVotes)) .GetRoot() ) .ToList()); }
private static IEnumerable <RuleNode> GetQSeparateParallelRules(List <Question> questions, BulletinScreenModelBase bulletin) { return(questions .OfType <QSeparate>().ToList() .Select(qsep => RuleBuilder .RootRule(new ParallelRule(qsep.CandidatePoints.Select(cp => RuleBuilder .RootRuleChain(GetRuleForBaseYesNoAbstainedPoint(cp, bulletin, qsep.AmountOfStock)) .AddRule(new QSimpleQSepAndHierSubQFractionDistributionRule(cp, () => qsep.AllowedVotesAmountFractions, bulletin.IsADRBulletin, () => bulletin.AdditionalMarks.HasInstructions.Value)) .AddRule(new QSimpleQSepAndHierSubQWarningRule(cp, bulletin.AdditionalMarks, () => qsep.AmountOfStock)) .GetRoot()).ToList(), shouldGoFurtherDownTheGraphAnyway: true)) .AddRule(new QSeparateYesChecksShouldNotExceedPlacesCountRule(qsep, bulletin.AdditionalMarks, () => qsep.AmountOfStock)) .AddRule(new AdrMustHaveExactOrLessVotesSpreadedForQSep(qsep, () => qsep.AmountOfStock, bulletin.IsADRBulletin)) .GetRoot() )); }
private static RuleNode GetQCumulativeTableRule(BulletinScreenModelBase bulletin, QCumulative qCum, FractionLong allowedVotesAmount) { return(GetQCumulativeTableRule(qCum, bulletin.AdditionalMarks, () => bulletin.PackStatus, () => bulletin.TrustExists, () => AmountOfStockSubmitedCalculator.GetAmountOfStockSubmited(qCum, allowedVotesAmount), () => GetNumberOfChecks(qCum), () => BulletinAdditionalMarksToAdditionalChecksEnumConverter.ConvertToAdditionalChecksEnum(bulletin.AdditionalMarks), () => qCum.AdditionalMarks.YesCheckBoxField.Value ? CumYesIs.Checked : CumYesIs.NotChecked)); }
private static IEnumerable <RuleNode> GetQCumulativeParallelRules(List <Question> questions, BulletinScreenModelBase bulletin) { return (questions .OfType <QCumulative>() .Select(qCum => { var allowedVotesAmount = qCum.GetTotalPossibleVotesSum(); var result = RuleBuilder .RootRule(new QCumulativeMustHaveAtLeastOneSelectionRule(qCum)) .AddRuleChain(GetQCumulativeTableRule(bulletin, qCum, allowedVotesAmount)) .AddRule(new QCumulativeFractionDistributionRule(qCum, () => qCum.AllowedVotesAmountFractions.Select(x => x * (int)qCum.PositionsCount).ToList(), () => BulletinAdditionalMarksToAdditionalChecksEnumConverter.ConvertToAdditionalChecksEnum(bulletin.AdditionalMarks), bulletin.IsADRBulletin, () => bulletin.AdditionalMarks.HasInstructions.Value)) //todo: move calculation somewhere .AddRule(new AdrMustHaveExactVotesSpreadedWithMinimalSpredForQCum(qCum, () => allowedVotesAmount, bulletin.IsADRBulletin)) .AddRule(new QCumulativeWarningRule(qCum, bulletin.AdditionalMarks, () => allowedVotesAmount)) .GetRoot(); return result; })); }
private static RuleNode GetQSimpleQSepAndHierSubQTableRuleChain(BaseYesNoAbsPoint point, BulletinScreenModelBase bulletin, FractionLong amountOfStock, bool isQSimpWithPrivDividends = false) { var additionalMarks = bulletin.AdditionalMarks; Func <PackStatus> packStatus = () => bulletin.PackStatus; Func <NumberOfChecks> numberOfChecks = () => GetNumberOfChecks(point); Func <AdditionalChecks> additionalChecks = () => BulletinAdditionalMarksToAdditionalChecksEnumConverter.ConvertToAdditionalChecksEnum(bulletin.AdditionalMarks); Func <bool> trustExists = () => bulletin.TrustExists; Func <AmountOfStockSubmited> amountOfStockSubmited = () => AmountOfStockSubmitedCalculator.GetAmountOfStockSubmited(point, amountOfStock); Func <bool> isQSimpWithPrivDividendsFunc = () => isQSimpWithPrivDividends; return(GetQSimpleQSepAndHierSubQTableRuleChain(point, additionalMarks, packStatus, trustExists, amountOfStockSubmited, numberOfChecks, additionalChecks, isQSimpWithPrivDividendsFunc)); }
private static RuleNode GetRuleForBaseYesNoAbstainedPoint(BaseYesNoAbsPoint qsp, BulletinScreenModelBase bulletin, FractionLong amountOfStock, bool isQSimpWithPrivDividends = false) { return(RuleBuilder. RootRule(new PointShouldHaveAtLeastOneSelectionRule(qsp)) .AddRule(GetQSimpleQSepAndHierSubQTableRuleChain(qsp, bulletin, amountOfStock, isQSimpWithPrivDividends)) .GetRoot()); }
public void SetVoteFieldsThatDontHaveCorrespondingChecksSetAsWasntChecked(BulletinScreenModelBase bulletin) { bulletin .Questions .ForEach(SetVoteFieldsThatDontHaveCorrespondingChecksSetAsWasntChecked); }
public Validator(BulletinScreenModelBase bulletin) { Bulletin = bulletin; _graphRootNode = GraphProvider.BuildGraph(bulletin); }