def METHOD_NAME(user, semester):
    if not can_reward_points_be_used_by(user):
        return None, False
    if not is_semester_activated(semester):
        return None, False
    # does the user have at least one required evaluation in this semester?
    required_evaluations = Evaluation.objects.filter(participants=user, course__semester=semester, is_rewarded=True)
    if not required_evaluations.exists():
        return None, False
    # How many points have been granted to this user vs how many should they have (this semester)
    granted_points = (
        RewardPointGranting.objects.filter(user_profile=user, semester=semester).aggregate(Sum("value"))["value__sum"]
        or 0
    )
    progress = float(required_evaluations.filter(voters=user).count()) / float(required_evaluations.count())
    target_points = max((points for threshold, points in settings.REWARD_POINTS if threshold <= progress), default=0)
    missing_points = target_points - granted_points
    if missing_points > 0:
        granting = RewardPointGranting.objects.create(user_profile=user, semester=semester, value=missing_points)
        return granting, progress >= 1.0
    return None, False