Exemple #1
0
    private void SetOtherActivitiesToSkip(RecommendationNotification recommendation)
    {
        foreach (RecommendationNotification notification in RecommendationList)
        {
            if (recommendation == notification ||
                recommendation.State == RecommendationState.Recommended)
            {
                continue;
            }

            recommendation.State = RecommendationState.Skip;
        }
    }
Exemple #2
0
    private void OnCheckRecommendFlagSuccess(string json, BaseCardData baseCard)
    {
        if (json.Contains("false"))
        {
            RecommendationNotification recommendation = GetRecommendation(baseCard);
            if (null == recommendation)
            {
                throw new NullReferenceException("RecommendationController.OnCheckRecommendFlagSuccess - can't get card: " +
                                                 baseCard.title);
            }

            recommendation.State = RecommendationState.NeedToShow;
        }
    }
Exemple #3
0
    public void OnDismissedCard(BaseCardData baseCard)
    {
        _currentlyShowing = false;

        if (baseCard == null)
        {
            return;
        }

        RecommendationNotification recommendation = GetRecommendation(baseCard);

        if (recommendation != null)
        {
            recommendation.State = RecommendationState.Skip;
        }
    }
Exemple #4
0
    public void OnRecommendButton(BaseCardData baseCard)
    {
        Debug.Log("RecommendationController.OnRecommendButton - OK");

        RecommendationNotification recommendation = GetRecommendation(baseCard);

        if (null == recommendation)
        {
            throw new NullReferenceException("RecommendationController.OnRecommendButton - can't get card: " +
                                             baseCard.title);
        }

        recommendation.State = RecommendationState.Recommended;
        _currentlyShowing    = false;
        ITTGoogleAnalytics.Instance.googleAnalytics.LogEvent(new EventHitBuilder()
                                                             .SetEventCategory("Notification - Recommendation")
                                                             .SetEventAction("Click - Recommend Button")
                                                             .SetEventLabel("User clicked recommend button for card id: " + baseCard.id + " " + baseCard.title));

        ITTDataCache.Instance.RetrieveProfileActivityID((Int64)baseCard.id, OnRetrieveProfileActivitySuccess, OnRetrieveProfileActivityFailure);
    }
Exemple #5
0
    private void OnCheckRecommendFlagSuccessFillData(string json, BaseCardData baseCard, int counter)
    {
        //Debug.Log("NotificationManager.OnCheckRecommendFlagSuccess -  Activity: " + baseCard.nid + " name: " + baseCard.title);

        if ("{\"result\":[]}" == json)
        {
            return;
        }

        RecommendationNotification recommendation = GetRecommendation(baseCard);

        if (recommendation == null)
        {
            throw new NullReferenceException(
                      "RecommendationController.OnCheckRecommendFlagSuccessFillData - cann't find activities: " + baseCard.title);
        }

        if (json.Contains("false"))
        {
            if (recommendation.State != RecommendationState.Skip &&
                recommendation.State != RecommendationState.NeedToShow)
            {
                recommendation.State = RecommendationState.NeedToShow;
            }
        }
        else
        {
            recommendation.State = RecommendationState.Recommended;
        }

        int lastIndex = historyCardList.Count - 1;

        if (baseCard.id == historyCardList[lastIndex].id)
        {
            GetCardAndShowIt();
        }
    }
Exemple #6
0
    private void CheckAndAddData(List <BaseCardData> baseCard)
    {
        Debug.Log("RecommendationController.CheckAndAddData - OK");

        foreach (BaseCardData baseCardData in baseCard)
        {
            if (RecommendationList.Any(card => card.ActivitiesName == baseCardData.title && card.Nid == baseCardData.id))
            {
                continue;
            }

            RecommendationNotification recommendation =
                new RecommendationNotification(baseCardData.title, (Int64)baseCardData.id,
                                               RecommendationState.NeedToShow,
                                               baseCardData.dateTime);
            RecommendationList.Add(recommendation);
        }

        if (null != RecommendationList)
        {
            // Update data cache
            ITTDataCache.Instance.Data.UpdateDataEntry((int)DataCacheIndices.RECOMMENDATIONS, RecommendationList.ToArray(), false);
        }
    }
Exemple #7
0
    private void GetCardAndShowIt()
    {
        //Debug.Log("RecommendationController.GetCardAndShowIt - trying to get neccesary card for reccomendation: ");

        RecommendationNotification recommendation = null;

        double   minMinutes = double.MaxValue;
        DateTime now        = DateTime.UtcNow;

        foreach (RecommendationNotification notification in RecommendationList)
        {
            //Debug.Log("RecommendationController.GetCardAndShowIt - min minutes:" + minMinutes);
            string nState = Enum.GetName(typeof(RecommendationState), notification.State);

            if (notification.Date < now && now.Subtract(notification.Date).TotalMinutes < minMinutes &&
                notification.State == RecommendationState.NeedToShow)
            {
                minMinutes     = now.Subtract(notification.Date).TotalMinutes;
                recommendation = notification;
                break;

                //Debug.Log("RecommendationController.GetCardAndShowIt - recommendation" + recommendation);
            }
        }
        if (recommendation != null)
        {
            //Debug.Log("RecommendationController.GetCardAndShowIt - card title:" + recommendation.ActivitiesName + " date:" +
            //		  recommendation.Date);

            AddRecommendationToView(GetBaseCardData(recommendation));
        }
        else
        {
            Debug.Log("RecommendationController.GetCardAndShowIt - Cann't find the card:");
        }
    }
Exemple #8
0
 private BaseCardData GetBaseCardData(RecommendationNotification notification)
 {
     return(historyCardList.FirstOrDefault(baseCard => baseCard.id == notification.Nid));
 }
	private void CheckAndAddData(List<BaseCardData> baseCard)
	{
		Debug.Log("RecommendationController.CheckAndAddData - OK");

		foreach (BaseCardData baseCardData in baseCard)
		{
			if (RecommendationList.Any(card => card.ActivitiesName == baseCardData.title && card.Nid == baseCardData.id))
			{
				continue;
			}

			RecommendationNotification recommendation =
				new RecommendationNotification(baseCardData.title, (Int64)baseCardData.id,
				                               RecommendationState.NeedToShow,
				                               baseCardData.dateTime);
			RecommendationList.Add(recommendation);

		}

		if (null != RecommendationList)
		{
			// Update data cache
			ITTDataCache.Instance.Data.UpdateDataEntry((int)DataCacheIndices.RECOMMENDATIONS, RecommendationList.ToArray(), false);
		}
	}
	private BaseCardData GetBaseCardData(RecommendationNotification notification)
	{
		return historyCardList.FirstOrDefault(baseCard => baseCard.id == notification.Nid);
	}
	private void SetOtherActivitiesToSkip(RecommendationNotification recommendation)
	{
		foreach (RecommendationNotification notification in RecommendationList)
		{
			if (recommendation == notification ||
			    recommendation.State == RecommendationState.Recommended)
				continue;

			recommendation.State = RecommendationState.Skip;
		}
	}
Exemple #12
0
        public void Execute()
        {
            if (ApplicationDbContext.options != null && !isRunning)
            {
                isRunning = true;
                ApplicationDbContext appDbContext = new ApplicationDbContext(ApplicationDbContext.options);

                try
                {
                    // Load relevant constants from Configration file (appSettings)
                    int    minQuestionsRecommend = ConfigurationManager.Instance.GetValue("MIN_QUESTIONS_RECOMMEND", Consts.MIN_QUESTIONS_RECOMMEND);
                    double maxQuestionRank       = ConfigurationManager.Instance.GetValue("MAX_QUESTION_RANK", Consts.MAX_QUESTION_RANK);
                    double minDaysAfterRejected  = ConfigurationManager.Instance.GetValue("NUM_DAYS_AFTER_REJECTED", Consts.NUM_DAYS_AFTER_REJECTED);

                    // Load relevant candidates (which enabled to send their resume) and solved at least MIN_QUESTIONS_RECOMMEND
                    IEnumerable <CandidateUser> candidates = appDbContext.Set <CandidateUser>()
                                                             .Include("Questions.Question")
                                                             .Where(c => c.AllowSendResume &&
                                                                    c.Questions.Where(q => q.IsDone).Count() >= minQuestionsRecommend);

                    // Load relevant recruiters (which enabled to receive notifications)
                    Dictionary <string, RecruiterUser> recruiters = appDbContext.Set <RecruiterUser>()
                                                                    .Include(r => r.Identity)
                                                                    .Where(r => r.ReceiveNotifications).ToDictionary(r => r.IdentityId, r => r);

                    // Load only OPEN positions which created by recruiters who enabled notifications
                    IEnumerable <Position> positions = appDbContext.Set <Position>()
                                                       .Include(p => p.PositionSkills)
                                                       .Where(p => p.Status == (int)PositionStatus.Opened && recruiters.ContainsKey(p.CreatedBy));


                    // Load recommendations which is relevant to filter users

                    /*
                     * It is uses in order to prevent from sending recommendations to recruiters
                     * about candidates which sent a recommendation already
                     */
                    var recommendations = appDbContext.Set <RecommendationNotification>()
                                          .Where(r => !(r.Approved == false && r.DateResponded.Value.AddDays(minDaysAfterRejected) < DateTime.Now))
                                          .ToLookup(r => r.PositionId, r => r);


                    foreach (Position position in positions)
                    {
                        IEnumerable <PositionSkill> positionSkills = position.PositionSkills;
                        Dictionary <int, double>    matchingNumbersOfCandidates = new Dictionary <int, double>();

                        foreach (CandidateUser candidate in candidates)
                        {
                            bool skipToNextCandidate = false;
                            //if(recommendations.Contains(position.Id))
                            //{

                            //}
                            foreach (RecommendationNotification recommendation in recommendations[position.Id])
                            {
                                if (recommendation.CandidateId == candidate.Id)
                                {
                                    skipToNextCandidate = true;
                                    break;
                                }
                            }
                            if (skipToNextCandidate)
                            {
                                continue;
                            }

                            double matchingNumber = 0;
                            foreach (PositionSkill positionSkill in positionSkills)
                            {
                                double skillGrade       = 0;
                                double maxTotalRank     = 0;
                                double totalRank        = 0;
                                double sumQuestionsRank = 0;

                                // Load questions which done by the candidate, and has at least one skill of this position
                                var relevantQuestions = candidate.Questions.Where(cq => cq.IsDone && cq.Question.Rank > 0);
                                var questionsWithAtLeastOneRelevantSkill = new List <CandidateQuestion>();

                                foreach (CandidateQuestion cq in relevantQuestions)
                                {
                                    if (Utils.ConvertStringIdsToList(cq.Question.TestedSkills).Contains(positionSkill.Id))
                                    {
                                        questionsWithAtLeastOneRelevantSkill.Add(cq);
                                    }
                                }
                                relevantQuestions = questionsWithAtLeastOneRelevantSkill;

                                maxTotalRank = relevantQuestions.Count() * maxQuestionRank;

                                if (maxTotalRank > 0)
                                {
                                    foreach (var relevantQuestion in relevantQuestions)
                                    {
                                        sumQuestionsRank += relevantQuestion.Question.Rank / maxQuestionRank;
                                        totalRank        += relevantQuestion.Question.Rank;
                                    }

                                    skillGrade      = sumQuestionsRank * (totalRank / maxTotalRank) * positionSkill.SkillWeight;
                                    matchingNumber += skillGrade;
                                }
                            }
                            if (matchingNumber > 0)
                            {
                                matchingNumbersOfCandidates.Add(candidate.Id, matchingNumber);
                            }
                        }

                        // Getting the recommended candidate which his matching number is the heighest
                        double max         = 0;
                        int    candidateId = -1;
                        foreach (var matchingNumber in matchingNumbersOfCandidates)
                        {
                            if (matchingNumber.Value > max)
                            {
                                max         = matchingNumber.Value;
                                candidateId = matchingNumber.Key;
                            }
                        }

                        if (candidateId != -1 && recruiters.ContainsKey(position.CreatedBy))
                        {
                            RecruiterUser relevantRecruiter = recruiters[position.CreatedBy];

                            // Update recommentdation table
                            Notification notificiation = new Notification()
                            {
                                Type        = (int)NotificationType.Recommendation,
                                DateCreated = DateTime.Now,
                                IsViewed    = false,
                                Recipent    = relevantRecruiter.IdentityId,
                            };

                            RecommendationNotification recommendation = new RecommendationNotification()
                            {
                                Approved     = null,
                                Notification = notificiation,
                                CandidateId  = candidateId,
                                PositionId   = position.Id,
                            };
                            var otherDbContext = new ApplicationDbContext(ApplicationDbContext.options);
                            new RecommendationNotificationsRepository(otherDbContext).Add(recommendation);
                            otherDbContext.SaveChanges();


                            var genericNotificationToClient = new GenericNotification()
                            {
                                NotificationId = recommendation.Notification.Id,
                                Type           = recommendation.Notification.Type,
                                DateCreated    = recommendation.Notification.DateCreated,
                                IsViewed       = recommendation.Notification.IsViewed,
                                Approved       = recommendation.Approved,
                                CandidateId    = recommendation.CandidateId,
                            };

                            // Send the recommendation
                            NotificationsHub.Notify(relevantRecruiter.Identity.Email, genericNotificationToClient);
                        }

                        //double maxMatchingNumber = matchingNumbersOfCandidates.Values.Max();
                        //int candidateId = matchingNumbersOfCandidates.Where((key, value) => value == maxMatchingNumber).First().Key;
                    }
                }
                catch (Exception)
                {
                    // TODO: write to log
                }
                finally
                {
                    isRunning = false;
                }
            }
        }