Class: Membership

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/membership.rb

Overview

The relationship of a Participant to a Group.

Constant Summary collapse

AMERICAN_DATE_FMT =
"%m/%d/%Y"

Instance Method Summary collapse

Instance Method Details

#available_task_statusesObject



54
55
56
57
58
59
60
61
# File 'app/models/membership.rb', line 54

def available_task_statuses
  @available_task_statuses ||=
    task_statuses
    .available_by_day(day_in_study)
    .not_terminated_by_day(day_in_study)
    .joins(:task, task: :bit_core_content_module)
    .by_position
end

#day_in_study(date = nil) ⇒ Object



83
84
85
# File 'app/models/membership.rb', line 83

def day_in_study(date = nil)
  ((date || Time.zone.today) - start_date).to_i + 1
end

#discontinueObject



158
159
160
161
162
# File 'app/models/membership.rb', line 158

def discontinue
  return false unless valid?

  update_columns(end_date: Time.zone.today - 1.day, is_complete: true)
end

#end_date_americanObject



95
96
97
# File 'app/models/membership.rb', line 95

def end_date_american
  end_date && end_date.strftime(AMERICAN_DATE_FMT)
end

#flag_completeObject



103
104
105
106
107
108
# File 'app/models/membership.rb', line 103

def flag_complete
  self.is_complete = true
  self.end_date = 1.day.ago

  save validate: false
end

#incomplete_tasksObject



69
70
71
72
# File 'app/models/membership.rb', line 69

def incomplete_tasks
  available_task_statuses
    .incomplete_by_day(day_in_study)
end

#incomplete_tasks_todayObject



74
75
76
77
# File 'app/models/membership.rb', line 74

def incomplete_tasks_today
  available_task_statuses
    .incomplete_on_day(day_in_study)
end

#learning_tasksObject



99
100
101
# File 'app/models/membership.rb', line 99

def learning_tasks
  tasks.learning
end

#length_of_studyObject



87
88
89
# File 'app/models/membership.rb', line 87

def length_of_study
  end_date - start_date + 1
end

#lessons_readObject



131
132
133
# File 'app/models/membership.rb', line 131

def lessons_read
  task_statuses.completed.select(&:lesson?)
end

#lessons_read_for_day(time) ⇒ Object



135
136
137
138
139
140
141
142
# File 'app/models/membership.rb', line 135

def lessons_read_for_day(time)
  task_statuses
    .completed
    .where("completed_at <= ? AND completed_at >= ?",
           time.end_of_day,
           time.beginning_of_day)
    .select(&:lesson?)
end

#lessons_read_for_weekObject



144
145
146
147
148
149
150
# File 'app/models/membership.rb', line 144

def lessons_read_for_week
  task_statuses
    .completed
    .where("completed_at >= ?", Time.current.advance(days: -7)
                                    .beginning_of_day)
    .select(&:lesson?)
end

#logins_by_week(week_number) ⇒ Object



110
111
112
113
114
115
116
117
118
119
# File 'app/models/membership.rb', line 110

def logins_by_week(week_number)
   = ParticipantLoginEvent.arel_table
  participant
    .
    .where([:created_at]
             .gteq(week_start_day(week_number)))
    .where([:created_at]
             .lt(week_end_day(week_number)))
    .count
end

#logins_todayObject



121
122
123
124
125
126
127
128
129
# File 'app/models/membership.rb', line 121

def logins_today
   = ParticipantLoginEvent.arel_table
  participant
    .
    .where([:created_at]
               .gteq(Time.zone.today.beginning_of_day))
    .where([:created_at]
               .lt(Time.zone.today.end_of_day))
end

#ordered_task_statusesObject



63
64
65
66
67
# File 'app/models/membership.rb', line 63

def ordered_task_statuses
  task_statuses
    .joins(:task)
    .order("tasks.release_day ASC")
end

#start_date_americanObject



91
92
93
# File 'app/models/membership.rb', line 91

def start_date_american
  start_date && start_date.strftime(AMERICAN_DATE_FMT)
end

#week_end_day(week_number) ⇒ Object



168
169
170
# File 'app/models/membership.rb', line 168

def week_end_day(week_number)
  start_date_with_zone + (week_number * 7).days
end

#week_in_study(date = nil) ⇒ Object



79
80
81
# File 'app/models/membership.rb', line 79

def week_in_study(date = nil)
  (day_in_study(date) / 7.0).ceil == 0 ? 1 : (day_in_study(date) / 7.0).ceil
end

#week_start_day(week_number) ⇒ Object



164
165
166
# File 'app/models/membership.rb', line 164

def week_start_day(week_number)
  start_date_with_zone + ((week_number - 1) * 7).days
end

#withdrawObject



152
153
154
155
156
# File 'app/models/membership.rb', line 152

def withdraw
  return false unless valid?

  update_column(:end_date, Time.zone.today - 1.day)
end