Skip to content

Instantly share code, notes, and snippets.

@ehlyzov
Created July 20, 2015 15:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ehlyzov/d764eeba6fda7a8b3df5 to your computer and use it in GitHub Desktop.
Save ehlyzov/d764eeba6fda7a8b3df5 to your computer and use it in GitHub Desktop.
def available_awards
# не даем, если награда уникальна и уже выдана
return [] if @award.unique? && award_exists?
# не даем, если пользователь не подходит по группе
return [] if (@award.for_group? == false) ||
(@award.group_ids & @user.group_memberships.pluck(:group_id)).any?
# не даем, если награда дневная и она уже была выдана
return [] if (@award.main_slot? || @award.bonus_slot?) && (day_count == 0)
# считаем набранные очки
measure_time("available_setc_count") {
@_count = available_sets_count
}
# не даем, если не набраны нужные очки
return [] if (@_count == 0)
# даем если очки набраны и награда дневная или награда с одним уровнем
if (@award.main_slot? || @award.bonus_slot?) || @award.award_levels.count == 1
[@award]
else
# проверяем уровни награды
# TODO
# смотрим есть ли у пользователя ачивка за данный уровень
achieve = Award::Level::Achieve.find_by(
award_level_id: @condition.award_level_id,
company_id: @award.company_id,
user_id: @user.id)
# не даем, если уже получил ачивку
return [] if achieve
# даем награду если она первого уровня и ачивки нет
return [@award] if @condition.award_level.num == 1
award_level_ids = @award.award_level_ids
# смотрим достигал ли пользователь предыдущего уровня
previous_level = award_level_ids.sort.
select{|s| s < @condition.award_level_id }
previous_level_achieves = Award::Level::Achieve.
where(["award_level_id = ?", previous_level]).
where(
company_id: @user.company_id,
user_id: @user.id
).exists?
# не даем награду если она выше первого уровня
# и предыдущий уровень не досигнут
return [] unless previous_level_achieves
# загружаем coming_award
coming_award = @user.coming_awards.find_by(award: @award)
# если пользователь достиг максимального уровня,
# удаляем все набранные ачивки и сбрасываем coming_award
# иначе создаем ачивку о достижении очередного уровня
# и обновляем текущий уровень coming_award
# после чего даем награду
if award_level_ids.max == @condition.award_level_id
Award::Level::Achieve.
joins(:award_level),
where(
award_level_id: award_level_ids,
company_id: @award.company,
user_id: @user.id
).delete_all
coming_award.update_attribute(:award_level_id, nil)
else
Award::Level::Achieve.create(
award_level_id: @condition.award_level_id,
company_id: @award.company_id,
user_id: @user.id
)
new_level_id = award_level_ids.sort.select do |id|
id > coming_award.award_level_id
end
coming_award.update_attribute(:award_level_id, new_level_id)
end
coming_award.refresh!
return [@award]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment