public void AddVoteToDb(Vote item) { Votes.Add(item); }
/// <Summary>Convert int to Guid for InvalidReason. If vote is given, assign if different</Summary> private Guid DetermineInvalidReasonGuid(Guid invalidReasonGuid, Vote vote = null) { if (vote != null && vote.InvalidReasonGuid != invalidReasonGuid) { vote.InvalidReasonGuid = invalidReasonGuid.AsNullableGuid(); } return invalidReasonGuid; }
/// <Summary>Vote is not spoiled, so determine who this is...</Summary> private void ImportVotePerson(Ballot ballot, XmlElement voteXml, int voteNum) { var personXml = voteXml.SelectSingleNode("Person") as XmlElement; if (personXml == null) { // can't happen if XML is okay return; } Vote vote; var lastName = personXml.GetAttribute("LName"); var firstName = personXml.GetAttribute("FName"); var akaName = personXml.GetAttribute("AKAName"); // check for matches Person person; var matchedPeople = _people.Where(p => p.LastName.DefaultTo("") == lastName && p.FirstName.DefaultTo("") == firstName && p.OtherNames.DefaultTo("") == akaName).ToList(); var numMatched = matchedPeople.Count; switch (numMatched) { case 1: person = matchedPeople[0]; break; case 0: // vote is valid, but person not found! // is okay if we are loading without a community file if (lastName.HasNoContent() && firstName.HasNoContent()) { vote = new Vote { BallotGuid = ballot.BallotGuid, PositionOnBallot = voteNum, InvalidReasonGuid = IneligibleReasonEnum.Unreadable_Vote_is_blank, StatusCode = VoteHelper.VoteStatusCode.Ok }; _storeVote(vote); return; } else { person = new Person { PersonGuid = Guid.NewGuid(), ElectionGuid = _election.ElectionGuid, LastName = lastName, FirstName = firstName }; AddPerson(person); _people.Add(person); if (akaName.HasContent()) { person.OtherNames = akaName; } var bahaiId = personXml.GetAttribute("BahaiId"); if (bahaiId.HasContent()) { person.BahaiId = bahaiId; } var ineligible = personXml.GetAttribute("IneligibleToReceiveVotes").AsBoolean(); person.CanReceiveVotes = ineligible; var ineligibleReason = personXml.GetAttribute("ReasonToNotReceive").AsBoolean(); //TODO... } break; default: throw new ApplicationException("Name in Vote matches {0} {1}".FilledWith(numMatched, numMatched.Plural("person", "people"))); } // got the person vote = new Vote { BallotGuid = ballot.BallotGuid, PositionOnBallot = voteNum, PersonCombinedInfo = person.CombinedInfo, PersonGuid = person.PersonGuid, StatusCode = VoteHelper.VoteStatusCode.Ok }; _storeVote(vote); }
public JsonResult SaveVote(int personId, int voteId, int count, Guid invalidReason) { var currentElectionGuid = UserSession.CurrentElectionGuid; var isSingleName = UserSession.CurrentElection.IsSingleNameElection; if (voteId != 0) { // update existing record // find info about the existing Vote var voteInfo = Db.vVoteInfoes.SingleOrDefault(vi => vi.VoteId == voteId && vi.ElectionGuid == currentElectionGuid); if (voteInfo == null) { // problem... client has a vote number, but we didn't find... return new { Updated = false, Error = "Invalid vote id" }.AsJsonResult(); } Db.Detach(voteInfo); var rawVote = Db.Votes.Single(v => v.C_RowId == voteInfo.VoteId); voteInfo.SingleNameElectionCount = count; rawVote.SingleNameElectionCount = count; rawVote.PersonCombinedInfo = voteInfo.PersonCombinedInfo; DetermineInvalidReasonGuid(invalidReason, rawVote); Db.SaveChanges(); var ballotAnalyzer = new BallotAnalyzer(); var ballotStatusInfo = ballotAnalyzer.UpdateBallotStatus(CurrentRawBallot(), VoteInfosForCurrentBallot()); var sum = isSingleName ? Db.vVoteInfoes.Where(vi => vi.LocationId == voteInfo.LocationId).Sum(vi => vi.SingleNameElectionCount) : Db.vBallotInfoes.Count(b => b.LocationId == voteInfo.LocationId); return new { Updated = true, BallotStatus = ballotStatusInfo.Status.Value, BallotStatusText = ballotStatusInfo.Status.DisplayText, ballotStatusInfo.SpoiledCount, LocationBallotsEntered = sum }.AsJsonResult(); } var ballot = GetCurrentBallotInfo(); if (ballot == null) { return new { Updated = false, Error = "Invalid ballot" }.AsJsonResult(); } // don't have an active Ballot! // make a new Vote record var invalidReasonGuid = DetermineInvalidReasonGuid(invalidReason); var person = Db.People.SingleOrDefault(p => p.C_RowId == personId && p.ElectionGuid == currentElectionGuid); var ok = person != null || invalidReasonGuid != Guid.Empty; if (ok) { var nextVoteNum = 1 + Db.Votes.Where(v => v.BallotGuid == ballot.BallotGuid) .OrderByDescending(v => v.PositionOnBallot) .Take(1) .Select(b => b.PositionOnBallot) .SingleOrDefault(); var vote = new Vote { BallotGuid = ballot.BallotGuid, PositionOnBallot = nextVoteNum, StatusCode = VoteHelper.VoteStatusCode.Ok, SingleNameElectionCount = count }; if (person != null) { vote.PersonGuid = person.PersonGuid; vote.PersonCombinedInfo = person.CombinedInfo; vote.InvalidReasonGuid = VoteHelperLocal.IneligibleToReceiveVotes(person.IneligibleReasonGuid, person.CanReceiveVotes); } if (invalidReasonGuid != Guid.Empty) { vote.InvalidReasonGuid = invalidReasonGuid.AsNullableGuid(); } Db.Votes.Add(vote); Db.SaveChanges(); var ballotAnalyzer = new BallotAnalyzer(); var ballotStatusInfo = ballotAnalyzer.UpdateBallotStatus(CurrentRawBallot(), VoteInfosForCurrentBallot()); var sum = isSingleName ? Db.vVoteInfoes.Where(vi => vi.LocationId == ballot.LocationId).Sum(vi => vi.SingleNameElectionCount) : Db.vBallotInfoes.Count(b => b.LocationId == ballot.LocationId); return new { Updated = true, VoteId = vote.C_RowId, pos = vote.PositionOnBallot, BallotStatus = ballotStatusInfo.Status.Value, BallotStatusText = ballotStatusInfo.Status.DisplayText, ballotStatusInfo.SpoiledCount, LocationBallotsEntered = sum }.AsJsonResult(); } // don't recognize person id return new { Updated = false, Error = "Invalid person" }.AsJsonResult(); }
private void ImportVotes(Ballot ballot, XmlNodeList votesXml) { var voteNum = 0; foreach (XmlElement voteXml in votesXml) { var voteStatus = voteXml.GetAttribute("VoteStatus"); switch (voteStatus) { case "Spoiled": // 1.80 case "Ineligible": // 1.71 case "UnReadable": // 1.71 var spoiledGroup = voteXml.GetAttribute("SpoiledGroup").DefaultTo(voteStatus); var spoiledDetail = voteXml.GetAttribute("SpoiledDetail"); var ineligibleReasonGuid = MapIneligible(spoiledGroup, spoiledDetail); var vote = new Vote { BallotGuid = ballot.BallotGuid, PositionOnBallot = ++voteNum, InvalidReasonGuid = ineligibleReasonGuid, StatusCode = VoteHelper.VoteStatusCode.Ok }; _storeVote(vote); break; case "Ok": case "AddToList": case "New": default: ImportVotePerson(ballot, voteXml, ++voteNum); break; } } if (ballot.StatusCode == BallotStatusEnum.TooMany) { if (voteNum <= _election.NumberToElect) { // TallyJ v1 allowed user to choose "TooMany" and not enter too many votes... // TallyJ v2 want to see "too many" votes, so on import, add more to ensure status will be calculated as "TooMany" for (var i = _election.NumberToElect.AsInt() - voteNum; i >= 0; i--) { var vote = new Vote { BallotGuid = ballot.BallotGuid, PositionOnBallot = ++voteNum, InvalidReasonGuid = IneligibleReasonEnum.Ineligible_Other, StatusCode = VoteHelper.VoteStatusCode.Ok }; _storeVote(vote); } } } }