Beispiel #1
0
        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);
        }
Beispiel #2
0
        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()));
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 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);
 }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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;
     }
 }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        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);
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
        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);
            }
        }