private static ElectionResultsResponse GetResults(Turnout electionTurnout, Ballot ballot, List <CandidateResult> candidates) { ElectionResultsResponse results = new ElectionResultsResponse(); results.NullVotes = electionTurnout.NullVotes; results.TotalVotes = electionTurnout.TotalVotes; results.ValidVotes = electionTurnout.ValidVotes; results.EligibleVoters = electionTurnout.EligibleVoters; results.TotalSeats = electionTurnout.TotalSeats; results.VotesByMail = electionTurnout.VotesByMail != 0 ? electionTurnout.VotesByMail : (int?)null; if (ballot.BallotType == BallotType.Referendum) { if (results.ValidVotes == 0) { results.ValidVotes = results.TotalVotes - results.ValidVotes; } results.Candidates = new List <CandidateResponse> { new CandidateResponse { Name = "DA", ShortName = "DA", Votes = candidates.FirstOrDefault().YesVotes, }, new CandidateResponse { Name = "NU", ShortName = "NU", Votes = candidates.FirstOrDefault().NoVotes, } }; } else { results.Candidates = candidates.Select(c => new CandidateResponse { ShortName = c.ShortName, Name = GetCandidateName(c), Votes = c.Votes, PartyColor = GetPartyColor(c), PartyLogo = c.Party?.LogoUrl, Seats = c.TotalSeats, SeatsGained = c.SeatsGained }).OrderByDescending(c => c.Votes).ToList(); } return(results); }
public static ElectionResultsResponse PopulateElectionResults(Turnout electionTurnout, Ballot ballot, List <CandidateResult> candidates, List <Party> parties) { ElectionResultsResponse results = new ElectionResultsResponse(); if (candidates == null) { results.Candidates = new List <CandidateResponse>(); results.TotalVotes = 0; results.EligibleVoters = 0; results.NullVotes = 0; results.ValidVotes = 0; return(results); } results.NullVotes = electionTurnout.NullVotes; results.CountedVotes = electionTurnout.CountedVotes; results.TotalVotes = electionTurnout.TotalVotes; results.ValidVotes = electionTurnout.ValidVotes; results.EligibleVoters = electionTurnout.EligibleVoters; results.TotalSeats = candidates.Sum(c => c.Seats1 + c.Seats2); results.VotesByMail = electionTurnout.VotesByMail != 0 ? electionTurnout.VotesByMail : (int?)null; if (ballot.BallotType == BallotType.Referendum) { if (results.ValidVotes == 0) { results.ValidVotes = results.TotalVotes - results.ValidVotes; } results.Candidates = new List <CandidateResponse> { new CandidateResponse { Name = "DA", ShortName = "DA", Votes = candidates.FirstOrDefault().YesVotes, }, new CandidateResponse { Name = "NU", ShortName = "NU", Votes = candidates.FirstOrDefault().NoVotes, }, new CandidateResponse { Name = "NU AU VOTAT", ShortName = "NU AU VOTAT", Votes = (results.EligibleVoters - results.TotalVotes).GetValueOrDefault(), } }; } else { var colors = new List <string>(); var logos = new List <string>(); foreach (var candidate in candidates) { var matchingParty = parties.GetMatchingParty(candidate.ShortName) ?? parties.FirstOrDefault(p => p.Name.ContainsString(candidate.Name)); if (matchingParty != null) { colors.Add(matchingParty.Color); logos.Add(matchingParty.LogoUrl); } else { colors.Add(null); logos.Add(null); } } results.Candidates = candidates.Select(c => new CandidateResponse { ShortName = c.GetCandidateShortName(ballot), Name = c.GetCandidateName(ballot), Votes = c.Votes, PartyColor = c.GetPartyColor(), PartyLogo = c.Party?.LogoUrl, Seats = c.TotalSeats != 0 ? c.TotalSeats : c.Seats1 + c.Seats2, TotalSeats = c.TotalSeats != 0 ? c.TotalSeats : c.Seats1 + c.Seats2 }).ToList(); for (var i = 0; i < results.Candidates.Count; i++) { var candidate = results.Candidates[i]; if (candidate.PartyColor.IsEmpty()) { candidate.PartyColor = colors[i] ?? Consts.IndependentCandidateColor; } if (candidate.PartyLogo.IsEmpty()) { candidate.PartyLogo = logos[i]; } } } results.Candidates = results.Candidates.OrderByDescending(c => c.Votes).ToList(); if (ballot.BallotType == BallotType.Referendum) { results.Candidates = results.Candidates.OrderForReferendum(ballot.Election); } return(results); }
public async Task <Result <ElectionResponse> > GetBallotResults(ElectionResultsQuery query) { using (var dbContext = _serviceProvider.CreateScope().ServiceProvider.GetService <ApplicationDbContext>()) { var ballot = dbContext.Ballots .AsNoTracking() .Include(b => b.Election) .FirstOrDefault(e => e.BallotId == query.BallotId); if (query.CountyId != null && query.CountyId.Value.IsCapitalCity() && query.Division == ElectionDivision.County && ballot.Date.Year == 2020) { BallotType ballotType = ballot.BallotType; if (ballot.BallotType == BallotType.Mayor) { ballotType = BallotType.CountyCouncilPresident; } if (ballot.BallotType == BallotType.LocalCouncil) { ballotType = BallotType.CountyCouncil; } ballot = dbContext.Ballots .AsNoTracking() .Include(b => b.Election) .FirstOrDefault(e => e.ElectionId == ballot.ElectionId && e.BallotType == ballotType); } if (ballot == null) { throw new Exception($"No results found for ballot id {query.BallotId}"); } var electionResponse = new ElectionResponse(); var divisionTurnout = await GetDivisionTurnout(query, dbContext, ballot); var electionInfo = await GetCandidatesFromDb(query, ballot, dbContext); if (electionInfo.TotalVotes > 0) { divisionTurnout = new Turnout { EligibleVoters = divisionTurnout.EligibleVoters, CountedVotes = electionInfo.TotalVotes, TotalVotes = divisionTurnout.TotalVotes, ValidVotes = electionInfo.ValidVotes, NullVotes = electionInfo.NullVotes }; } ElectionResultsResponse results; if (divisionTurnout == null) { results = new ElectionResultsResponse { TotalVotes = 0, EligibleVoters = 0, NullVotes = 0, ValidVotes = 0, Candidates = new List <CandidateResponse>() }; } else { var parties = await _partiesRepository.GetAllParties(); results = ResultsProcessor.PopulateElectionResults(divisionTurnout, ballot, electionInfo.Candidates, parties.ToList()); } electionResponse.Aggregated = electionInfo.Aggregated; electionResponse.Results = results; electionResponse.Observation = await dbContext.Observations.FirstOrDefaultAsync(o => o.BallotId == ballot.BallotId); if (divisionTurnout != null) { electionResponse.Turnout = new ElectionTurnout { TotalVotes = divisionTurnout.TotalVotes, EligibleVoters = divisionTurnout.EligibleVoters, }; if (query.Division == ElectionDivision.Diaspora || query.Division == ElectionDivision.Diaspora_Country) { electionResponse.Turnout.EligibleVoters = electionResponse.Turnout.TotalVotes; } } electionResponse.Scope = await CreateElectionScope(dbContext, query); electionResponse.Meta = CreateElectionMeta(ballot); electionResponse.ElectionNews = await GetElectionNews(dbContext, ballot.BallotId, ballot.ElectionId); return(electionResponse); } }