Esempio n. 1
0
 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);
          }
        }
      }
    }