private static ElectionMapWinner CreateElectionMapWinner(int id, Ballot ballot, CandidateResult winner, Turnout turnoutForCountry) { var electionMapWinner = new ElectionMapWinner { Id = id, Winner = new Winner() }; if (ballot.BallotType != BallotType.Referendum) { electionMapWinner.Winner.Name = winner.Name; electionMapWinner.Winner.ShortName = winner.ShortName; electionMapWinner.Winner.Votes = winner.Votes; electionMapWinner.Winner.PartyColor = winner.Party?.Color; } else { if (winner.ShortName == "DA") { electionMapWinner.Winner.Name = "DA"; electionMapWinner.Winner.ShortName = "DA"; electionMapWinner.Winner.Votes = winner.YesVotes; } else { electionMapWinner.Winner.Name = "NU"; electionMapWinner.Winner.ShortName = "NU"; electionMapWinner.Winner.Votes = winner.NoVotes; } } electionMapWinner.ValidVotes = turnoutForCountry.ValidVotes; return(electionMapWinner); }
public async Task <Result <List <ElectionMapWinner> > > GetCountyWinners(int ballotId) { var parties = await _partiesRepository.GetAllParties(); var ballot = await _dbContext.Ballots .Include(b => b.Election) .FirstOrDefaultAsync(b => b.BallotId == ballotId); if (ballot.BallotType == BallotType.Mayor || ballot.BallotType == BallotType.LocalCouncil) { var results = await _dbContext.CandidateResults .Include(c => c.Party) .Where(c => c.BallotId == ballotId && c.Division == ElectionDivision.Locality) .ToListAsync(); var list = new List <CandidateResult>(); var resultsForElection = results.GroupBy(c => c.CountyId); foreach (var countyGroup in resultsForElection) { var countyWinners = countyGroup .GroupBy(c => c.LocalityId) .Select(g => g.OrderByDescending(x => x.Votes).FirstOrDefault()).ToList(); var candidateResults = RetrieveWinners(countyWinners, ballot.BallotType); CandidateResult topResult; if (ballot.BallotType == BallotType.Mayor) { topResult = candidateResults.OrderByDescending(c => c.Votes).FirstOrDefault(); } else { topResult = candidateResults.OrderByDescending(c => c.TotalSeats).FirstOrDefault(); } list.Add(topResult); } return(list .Select(c => { var turnout = new Turnout { ValidVotes = c.Votes }; if (ballot.BallotType == BallotType.LocalCouncil) { turnout.ValidVotes = c.TotalSeats; } return CreateElectionMapWinner(c.CountyId, ballot, c, turnout); }).ToList()); } var dbWinners = await GetWinners(ballotId, null, ElectionDivision.County); if (dbWinners.Count > 0) { return(dbWinners.Select(winner => WinnerToElectionMapWinner(winner, parties)).ToList()); } _appCache.Remove(MemoryCache.CreateWinnersKey(ballotId, null, ElectionDivision.Diaspora_Country)); var winners = await AggregateCountyWinners(ballotId, parties); return(Result.Success(winners.Select(winner => WinnerToElectionMapWinner(winner, parties)).ToList())); }
private static Turnout AggregateTurnouts(List <Turnout> turnouts) { Turnout turnout = new Turnout(); turnout.EligibleVoters = turnouts.Sum(c => c.EligibleVoters); turnout.TotalVotes = turnouts.Sum(c => c.TotalVotes); turnout.ValidVotes = turnouts.Sum(c => c.ValidVotes); turnout.NullVotes = turnouts.Sum(c => c.NullVotes); return(turnout); }
private static Turnout GetTurnout(Field[] fields) { var turnout = new Turnout(); turnout.EligibleVoters = fields.FirstOrDefault(f => f.Name == "a")?.Value ?? 0; turnout.ValidVotes = fields.FirstOrDefault(f => f.Name == "c")?.Value ?? 0; turnout.NullVotes = fields.FirstOrDefault(f => f.Name == "d")?.Value ?? 0; turnout.PermanentListsVotes = fields.FirstOrDefault(f => f.Name == "b1")?.Value ?? 0; turnout.SuplimentaryVotes = fields.FirstOrDefault(f => f.Name == "b3")?.Value ?? 0; turnout.VotesByMail = fields.FirstOrDefault(f => f.Name == "b4")?.Value ?? 0; turnout.TotalVotes = turnout.ValidVotes + turnout.NullVotes; return(turnout); }
private void LinkTurnout(Turnout turnout, int y, int x) { // Look below for a Track. if (IsType <Track>(y + 1, x)) { turnout.optionDown = _hasNexts[y + 1][x] as Track; } // Look up for a Track. if (IsType <Track>(y - 1, x)) { turnout.optionUp = _hasNexts[y - 1][x] as Track; } Turnouts.Add(KeyChars[Turnouts.Count], turnout); }
private void UpdateDiaspora(Ballot ballot, IGrouping <string, CsvTurnout> diasporaTurnouts, ApplicationDbContext dbContext, List <Turnout> existingTurnouts) { var totalDiasporaVotes = 0; foreach (var csvTurnout in diasporaTurnouts.GroupBy(d => d.UAT)) { var csvTurnouts = csvTurnout.ToList(); var turnout = csvTurnouts.FirstOrDefault(); var dbCountry = FindCountry(turnout); if (dbCountry == null) { Console.WriteLine($"{turnout.UAT} not found in the database"); continue; } var countryTurnout = existingTurnouts .FirstOrDefault(t => t.Division == ElectionDivision.Diaspora_Country && t.CountryId == dbCountry.Id); if (countryTurnout == null) { countryTurnout = new Turnout { Division = ElectionDivision.Diaspora_Country, CountryId = dbCountry.Id, BallotId = ballot.BallotId }; } countryTurnout.EligibleVoters = csvTurnouts.Sum(c => c.EnrolledVoters + c.ComplementaryList); countryTurnout.TotalVotes = csvTurnouts.Sum(c => c.TotalVotes); totalDiasporaVotes += countryTurnout.TotalVotes; dbContext.Update(countryTurnout); } var diasporaTurnout = existingTurnouts .FirstOrDefault(t => t.Division == ElectionDivision.Diaspora); if (diasporaTurnout == null) { diasporaTurnout = new Turnout { Division = ElectionDivision.Diaspora, BallotId = ballot.BallotId, TotalVotes = totalDiasporaVotes }; } _appCache.Add(MemoryCache.DiasporaTurnout, diasporaTurnout, DateTimeOffset.Now.AddMinutes(120)); diasporaTurnout.TotalVotes = totalDiasporaVotes; dbContext.Update(diasporaTurnout); }
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); }
private static ElectionMapWinner CreateElectionMapWinner(int?divisionId, Ballot ballot, CandidateResult winner, Turnout turnoutForDivision) { var electionMapWinner = new ElectionMapWinner { Id = divisionId.GetValueOrDefault(), Winner = new MapWinner() }; if (ballot.BallotType != BallotType.Referendum) { electionMapWinner.Winner.Name = winner.Name; electionMapWinner.Winner.ShortName = winner.ShortName; electionMapWinner.Winner.Votes = winner.Votes; electionMapWinner.Winner.PartyColor = winner.Party?.Color ?? Consts.IndependentCandidateColor; electionMapWinner.Winner.Party = winner.Party; } else { if (string.Equals(ballot.Election.Subtitle, "Invalidat")) { electionMapWinner.Winner.Name = "NU AU VOTAT"; electionMapWinner.Winner.ShortName = "NU AU VOTAT"; electionMapWinner.Winner.Votes = turnoutForDivision.EligibleVoters - turnoutForDivision.TotalVotes; } else { if (winner.YesVotes > winner.NoVotes) { electionMapWinner.Winner.Name = "DA"; electionMapWinner.Winner.ShortName = "DA"; electionMapWinner.Winner.Votes = winner.YesVotes; } else { electionMapWinner.Winner.Name = "NU"; electionMapWinner.Winner.ShortName = "NU"; electionMapWinner.Winner.Votes = winner.NoVotes; } } } electionMapWinner.ValidVotes = turnoutForDivision.ValidVotes; return(electionMapWinner); }
private void UpdateNationalTurnout(Ballot ballot, ApplicationDbContext dbContext, List <Turnout> turnoutsForBallot, List <CsvTurnout> csvTurnouts) { var nationalTurnout = turnoutsForBallot.FirstOrDefault(t => t.Division == ElectionDivision.National); if (nationalTurnout == null) { nationalTurnout = new Turnout { Division = ElectionDivision.National, BallotId = ballot.BallotId }; } nationalTurnout.EligibleVoters = csvTurnouts.Sum(t => t.EnrolledVoters + t.ComplementaryList); nationalTurnout.TotalVotes = csvTurnouts.Sum(t => t.TotalVotes); _appCache.Add(MemoryCache.NationalTurnout, nationalTurnout, DateTimeOffset.Now.AddMinutes(120)); dbContext.Update(nationalTurnout); }
private static async Task <Turnout> RetrieveAggregatedTurnoutForCityHalls(ElectionResultsQuery query, Ballot ballot, ApplicationDbContext dbContext) { if (ballot.Election.Live && query.Division == ElectionDivision.National) { var nationalTurnout = await dbContext.Turnouts .FirstOrDefaultAsync(t => t.BallotId == ballot.BallotId && t.Division == ElectionDivision.National); return(nationalTurnout); } var turnout = new Turnout(); var queryable = dbContext.Turnouts .Where(t => t.BallotId == ballot.BallotId && t.CountyId == query.CountyId && t.Division == ElectionDivision.Locality); if (ballot.Election.Live) { if (query.Division == ElectionDivision.County) { if (ballot.BallotType != BallotType.Mayor && ballot.BallotType != BallotType.LocalCouncil) { queryable = dbContext.Turnouts .Where(t => t.BallotId == ballot.BallotId && t.Division == ElectionDivision.County); } } } var turnoutsForCounty = await queryable.ToListAsync(); turnout.BallotId = ballot.BallotId; turnout.EligibleVoters = turnoutsForCounty.Sum(c => c.EligibleVoters); turnout.TotalVotes = turnoutsForCounty.Sum(c => c.TotalVotes); turnout.ValidVotes = turnoutsForCounty.Sum(c => c.ValidVotes); turnout.NullVotes = turnoutsForCounty.Sum(c => c.NullVotes); return(turnout); }
private void UpdateCountyTurnout(Ballot ballot, IGrouping <string, CsvTurnout> county, ApplicationDbContext dbContext, List <Turnout> turnoutsForBallot) { if (county.Key == "SR") { return; } var dbCounty = _dbCounties.FirstOrDefault(c => c.ShortName == county.Key); var countyTurnout = turnoutsForBallot.FirstOrDefault(t => t.Division == ElectionDivision.County && t.CountyId == dbCounty.CountyId); if (countyTurnout == null) { countyTurnout = new Turnout { Division = ElectionDivision.County, CountyId = dbCounty.CountyId, BallotId = ballot.BallotId }; } countyTurnout.EligibleVoters = county.Sum(c => c.EnrolledVoters + c.ComplementaryList);; countyTurnout.TotalVotes = county.Sum(c => c.TotalVotes); dbContext.Update(countyTurnout); }
private void PrepareCandidates(List <CandidateResult> electionInfoCandidates, Turnout turnout, List <Party> parties) { foreach (var candidate in electionInfoCandidates) { candidate.BallotId = turnout.BallotId; candidate.Division = turnout.Division; candidate.CountryId = turnout.CountryId; candidate.CountyId = turnout.CountyId; candidate.LocalityId = turnout.LocalityId; candidate.PartyId = parties.FirstOrDefault(p => p.Name.EqualsIgnoringAccent(candidate.Name))?.Id ?? parties.FirstOrDefault(p => p.Alias.EqualsIgnoringAccent(candidate.Name))?.Id; } }
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); } }
private void UpdateResults(ApplicationDbContext dbContext, LiveElectionInfo electionInfo, Turnout turnout, List <Party> parties) { PrepareCandidates(electionInfo.Candidates, turnout, parties); if (turnout != null) { turnout.ValidVotes = electionInfo.Candidates.Sum(c => c.Votes); turnout.NullVotes = electionInfo.NullVotes; dbContext.Update(turnout); } dbContext.CandidateResults.AddRange(electionInfo.Candidates); }
private static Winner CreateWinner(int ballotId, int?countyId, CandidateResult localityWinner, Turnout turnoutForLocality, ElectionDivision division) { var winner = new Winner { BallotId = ballotId, CandidateId = localityWinner.Id, CountyId = countyId, Division = division, Name = localityWinner.Name, PartyId = localityWinner.PartyId, TurnoutId = turnoutForLocality?.Id, }; return(winner); }
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 (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 = electionInfo.EligibleVoters, CountedVotes = electionInfo.TotalVotes, TotalVotes = divisionTurnout?.TotalVotes ?? electionInfo.TotalVotes, ValidVotes = electionInfo.ValidVotes, NullVotes = electionInfo.NullVotes }; } ElectionResultsResponse results; if (divisionTurnout == null) { results = null; } else { var parties = await _partiesRepository.GetAllParties(); results = ResultsProcessor.PopulateElectionResults(divisionTurnout, ballot, electionInfo.Candidates, parties.ToList()); } 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, }; } electionResponse.Scope = await CreateElectionScope(dbContext, query); electionResponse.Meta = CreateElectionMeta(ballot); electionResponse.ElectionNews = await GetElectionNews(dbContext, ballot.BallotId, ballot.ElectionId); return(electionResponse); } }