public OperationResult DigitalSignatureVote(ClientPetitionVote vote)
        {
            OperationResult result;

            try
            {
                if (vote.PetitionID == 0)
                {
                    result = OperationResult.Fail(-2, "PetitionID was not provided.");
                    return result;
                }

                // verify:
                IVerificationRepository verificationRepository;
                switch (vote.CertificateType)
                {
                    case EntityDictionary.Certificate.Type.DPA:
                        {
                            verificationRepository = new DpaVerificationRepository();
                            break;
                        }
                    case EntityDictionary.Certificate.Type.UACrypto:
                        {
                            verificationRepository = new UaCryptoVerificationRepository();
                            break;
                        }
                    default:
                        {
                            verificationRepository = new UaCryptoVerificationRepository();
                            break;
                        }
                }

                var verificationResult = verificationRepository.Verify(vote.SignedData);
                var isVerficationSuccessfull =
                    verificationResult.Descendants("Result").SingleOrDefault() != null &&
                    verificationResult.Descendants("Result").SingleOrDefault().Value == "Success" &&
                    verificationResult.Descendants("Serial").SingleOrDefault() != null &&
                    verificationResult.Descendants("Serial").SingleOrDefault().Value.Length > 0;

                if (!isVerficationSuccessfull)
                {
                    result = OperationResult.Fail(-3, "Certificate verification failed.");
                    return result;
                }

                result = this.petitionVoteRepository.Vote(vote, verificationResult.Descendants("Serial").SingleOrDefault().Value);
            }
            catch (Exception exc)
            {
                result = OperationResult.ExceptionResult(exc);
            }

            return result;
        }
        public OperationResult Vote(ClientPetitionVote petitionVote, string certificateSerialNumber)
        {
            var vote = new PetitionVote()
            {
                PetitionID = petitionVote.PetitionID,
                Certificate = new Certificate() { SerialNumber = certificateSerialNumber },
                SignedData = petitionVote.SignedData,
                SignedHash = petitionVote.Signature
            };

            OperationResult result;

            using (var db = new EDEntities())
            {
                var certificate = db.Certificates.SingleOrDefault(c => c.SerialNumber == vote.Certificate.SerialNumber);
                if (certificate == null)
                {
                    result = OperationResult.Fail(-4, "Certificate is not registered.");
                    return result;
                }

                vote.CertificateID = certificate.ID;
                vote.PersonID = certificate.PersonID;
                vote.CreatedDate = DateTime.Now;

                vote.Petition = null;
                vote.Certificate = null;
                vote.Person = null;

                ////var votes = (from p in db.PetitionVotes
                ////			 where p.PetitionID == vote.PetitionID
                ////				&& (p.PersonID == vote.PersonID || p.CertificateID == vote.CertificateID || p.Certificate.SerialNumber == vote.Certificate.SerialNumber)
                ////			 select p);
                //var votes = db.PetitionVotes.Where(p =>
                //	p.PetitionID == vote.PetitionID &&
                //	(p.PersonID == vote.PersonID || p.CertificateID == vote.CertificateID ||
                //	 p.Certificate.SerialNumber == vote.Certificate.SerialNumber));

                //if (votes.Any())
                //{
                //	result = OperationResult.Fail(-5, "You already voted for this petition.");
                //	return result;
                //}

                db.PetitionVotes.Add(vote);
                db.SaveChanges();

                result = OperationResult.Success(1, "Agreement vote has been registered.");
            }

            return result;
        }