public async Task <ResultsEngineStatuses> Process(ITeamResultEngineContext context, IGameResults request, ResultsEngineResponse response)
        {
            var ok      = true;
            var ruleSet = await context.GetRuleSet();

            RuleSetXRule rule = await context.GetRuleSpecification(Entities.Rule.Rules.CheckMaximumGamesForHigherRankedCompetition);

            if (ruleSet.Competitions.Count > 0)
            {
                int maxGames = rule.DataInt1.Value;

                ITeamMatchModel match = await context.Fixture.GetMatch(request.MatchID);

                BowlsResults.Common.Domain.Entities.Team homeTeam = match.Data.Home;
                BowlsResults.Common.Domain.Entities.Team awayTeam = match.Data.Away;

                var statistics = await context.GetCompetitionPlayerGameStatistic(request, match);

                var competitionIDs = ruleSet.Competitions.Select(x => x.CompetitionID).ToList();
                // Get index of the competition
                var index = competitionIDs.FindIndex(x => x == context.Competition.ID);
                // Remove all other competitions to leave only higher ones
                competitionIDs.RemoveRange(index, competitionIDs.Count - index);

                var allPlayers = context.GetAllPlayersWithTeam(request, match);

                foreach (var(playerID, team) in allPlayers)
                {
                    ok &= await this.Validate(context, response, statistics, competitionIDs, maxGames, playerID);
                }
            }

            return(ResultEngineStatusMapper.MapFromBool(ok));
        }
Beispiel #2
0
        public async Task <ResultsEngineStatuses> Process(ITeamResultEngineContext context, IGameResults request, ResultsEngineResponse response)
        {
            var          ok   = true;
            RuleSetXRule rule = await context.GetRuleSpecification(Entities.Rule.Rules.CheckMaximumGamesForHigherRankedTeamPerCompetition);

            int maxGames = rule.DataInt1.Value;

            ITeamMatchModel match = await context.Fixture.GetMatch(request.MatchID);

            BowlsResults.Common.Domain.Entities.Team homeTeam = match.Data.Home;
            BowlsResults.Common.Domain.Entities.Team awayTeam = match.Data.Away;

            var statistics = await context.GetCompetitionPlayerGameStatistic(request, match);

            var teams = await this._competitionRepository.GetCompetitionTeams(context.Competition.ID);

            foreach (var gameResult in request.GameResults)
            {
                IEnumerable <int> homeIDs = GetHigherRankedTeamIDs(teams, homeTeam);
                IEnumerable <int> awayIDs = GetHigherRankedTeamIDs(teams, awayTeam);

                foreach (var playerID in gameResult.HomePlayers)
                {
                    ok &= this.Validate(context, response, statistics, homeIDs, maxGames, playerID);
                }

                foreach (var playerID in gameResult.AwayPlayers)
                {
                    ok &= this.Validate(context, response, statistics, awayIDs, maxGames, playerID);
                }
            }

            return(ResultEngineStatusMapper.MapFromBool(ok));
        }
Beispiel #3
0
        private bool Validate(ITeamResultEngineContext context, ResultsEngineResponse response, ReadOnlyCollection <CompetitionPlayerGameStatistic> statistics, int playerID, BowlsResults.Common.Domain.Entities.Team team)
        {
            var ok        = true;
            var otherClub = statistics.FirstOrDefault(x => x.PlayerID == playerID && x.Team.Club.ID != team.Club.ID);

            if (otherClub != null)
            {
                var player = context.GetPreloadedPlayer(playerID);

                response.ValidationResult.Errors.Add(new ValidationFailure($"SingleClubPlayer{playerID}", $"{player.DisplayName} has already played for {otherClub.Team.Club.Name} in this competition."));
                ok = false;
            }

            return(ok);
        }
Beispiel #4
0
        private static IEnumerable <int> GetHigherRankedTeamIDs(List <CompetitionTeam> teams, BowlsResults.Common.Domain.Entities.Team team)
        {
            var otherTeams = teams.Where(x => x.Team.Club.ID == team.Club.ID).OrderBy(x => x.Team.Suffix).ToList();
            // Get index of the team
            var index = otherTeams.FindIndex(x => x.Team.ID == team.ID);

            // Remove all other teams to leave only higher ones
            otherTeams.RemoveRange(index, otherTeams.Count - index);
            return(otherTeams.Select(x => x.Team.ID));
        }