fiedl/your_platform

View on GitHub
app/models/corporation_score.rb

Summary

Maintainability
A
2 hrs
Test Coverage
class CorporationScore < TermReports::ForCorporation

  def title
    corporation.title
  end

  def fill_score_info
    self.number_of_status_changes = status_changes.count
    self.number_of_good_events = good_events.count
    self.number_of_events_with_pictures = events_with_pictures.count
    self.number_of_semester_calendars = semester_calendars.count
    self.number_of_semester_calendar_pdfs = semester_calendar_pdfs.count
    self.number_of_current_officers = current_officers.count
    self.number_of_documents = current_documents.count
    self.number_of_good_member_profiles = good_member_profiles.count
    self.number_of_current_member_profiles = current_member_profiles.count
    self.score = total_score
    self.save
    self
  end

  def scope
    corporation
  end

  def status_changes
    scope.status_groups.collect do |status_group|
      status_group.memberships.direct.where(valid_to: self.term.time_range)
    end.flatten
  end

  def good_events
    events.select do |event|
      event.public? && (event.location.to_s.length > 10)
    end
  end

  def events_with_pictures
    events.select do |event|
      event.attachments.count > 0
    end
  end

  def semester_calendars
    corporation.semester_calendars.where(term_id: term.id)
  end

  def semester_calendar_pdfs
    semester_calendars.map(&:attachments).flatten
  end

  def current_officers
    Membership.direct.where(valid_from: (term.time_range.min - 2.months)..term.time_range.max, ancestor_id: scope.officers_groups_of_self_and_descendant_groups.map(&:id))
  end

  def current_documents
    Attachment.where(created_at: term.time_range, parent_type: "Page",
        parent_id: (scope.descendant_pages.pluck(:id) + events.collect { |event| event.descendant_pages.pluck(:id) }.flatten))
  end

  def good_member_profiles
    scope.members.select { |member| member.profile_fields.count >= 27 }
  end

  def current_member_profiles
    scope.members.select { |member| member.profile_fields.where(updated_at: (term.time_range.min - 6.months)..term.time_range.max).any? }
  end

  def self.score_columns
    [:new_members_score, :status_changes_score, :events_score, :good_events_score,
      :events_with_pictures_score, :semester_calendar_score, :semester_calendar_pdf_score,
      :current_officers_score, :documents_score, :good_member_profiles_score, :current_member_profiles_score,
      :total_score]
  end

  def new_members_score
    number_of_new_members
  end

  def status_changes_score
    number_of_status_changes / 5
  end

  def events_score
    number_of_events / 6
  end

  def good_events_score
    number_of_good_events / 3
  end

  def events_with_pictures_score
    number_of_events_with_pictures / 3
  end

  def semester_calendar_score
    (number_of_semester_calendars == 1) ? 1 : 0
  end

  def semester_calendar_pdf_score
    (number_of_semester_calendar_pdfs > 0) ? 1 : 0
  end

  def current_officers_score
    number_of_current_officers / 4
  end

  def documents_score
    number_of_documents / 3
  end

  def good_member_profiles_score
    if scope.members.any?
      number_of_good_member_profiles * 5 / scope.members.count
    else
      0
    end
  end

  def current_member_profiles_score
    if scope.members.any?
      number_of_current_member_profiles * 5 / scope.members.count
    else
      0
    end
  end

  def total_score
    sum = 0
    (self.class.score_columns - [:total_score]).each { |column| sum += self.send column }
    return sum
  end

end