/// <summary> /// данные о имени пвп должны быть назначенны зарание /// </summary> /// <param name="connection"></param> /// <param name="candidat"></param> /// <param name="setCcToData"></param> /// <returns></returns> public List <CandidatOut> RegisterCandidate(IDbConnection connection, CandidatOut candidat, Action <int> setCcToData) { candidat.ValidateRegistrate(); var ccModel = _storeService.BalanceCalcResultCc(connection, candidat.UserId, REGISTER_CANDIDATE_CC_PRICE); List <CandidatOut> candidates = null; var hasError = false; candidates = _officerCandidatRepository.GetRegistredOfficerCandidatesByTopPvp(connection, MAX_CANDIDATES_COUNT); var minPvp = candidates.Min(i => i.PvpPoint); if (candidates.Count == 0 || candidates.Min(i => i.PvpPoint) < candidat.PvpPoint) { if (_isExistCandidate(connection, candidat.UserId)) { throw new Exception(Error.CantRegisterCandidatAlreadyExist); } _createAndSaveNewCandidate(connection, candidat, false); if (candidates.Count == MAX_CANDIDATES_COUNT) { var idx = candidates.FindLastIndex(i => i.PvpPoint == minPvp); candidates.RemoveAt(idx); } candidates.Add(candidat); } else { hasError = true; } if (hasError) { throw new Exception(Error.CantRegisterCandidatNotEnoughPvP); } // todo переместить в один коннекшен var newBalance = _storeService.AddOrUpdateBalance(connection, ccModel); setCcToData(newBalance.Quantity); return(candidates.OrderByDescending(i => i.PvpPoint).ToList()); }