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



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

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



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

def day_in_study(date = nil)
  ((date || Date.current) - start_date).to_i + 1
end

#discontinueObject



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

def discontinue
  return false unless valid?

  update_columns(end_date: Date.current - 1.day, is_complete: true)
end

#end_date_americanObject



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

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

#flag_completeObject



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

def flag_complete
  self.is_complete = true
  self.end_date = Date.yesterday

  save validate: false
end

#incomplete_tasksObject



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

def incomplete_tasks
  available_task_statuses
    .incomplete_by_day(day_in_study)
end

#incomplete_tasks_todayObject



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

def incomplete_tasks_today
  available_task_statuses
    .incomplete_on_day(day_in_study)
end

#learning_tasksObject



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

def learning_tasks
  tasks.learning
end

#length_of_studyObject



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

def length_of_study
  end_date - start_date + 1
end

#lessons_readObject



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

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

#lessons_read_for_day(time) ⇒ Object



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

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

#lessons_read_for_weekObject



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

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

#logins_by_week(week_number) ⇒ Object



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

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



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

def logins_today
   = ParticipantLoginEvent.arel_table
  participant
    .
    .where([:created_at]
               .gteq(Date.current.beginning_of_day))
    .where([:created_at]
               .lt(Date.current.end_of_day))
end

#ordered_task_statusesObject



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

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

#start_date_americanObject



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

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

#week_end_day(week_number) ⇒ Object



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

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

#week_in_study(date = nil) ⇒ Object



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

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



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

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

#withdrawObject



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

def withdraw
  return false unless valid?

  update_column(:end_date, Date.current - 1.day)
end