Skip to content

Commit 93cca4e

Browse files
octoberclubclaude
authored andcommitted
Exclude students with no attendance in the past year from chaser email
Narrows the chaser target to members who attended between 3 months and 1 year ago, filtering out long-inactive students who are unlikely to re-engage. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent da53ef9 commit 93cca4e

2 files changed

Lines changed: 51 additions & 2 deletions

File tree

app/services/three_month_email_service.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,29 @@
22

33
class ThreeMonthEmailService
44
def self.send_chaser
5-
cutoff = 3.months.ago.beginning_of_day
5+
three_month_cutoff = 3.months.ago.beginning_of_day
6+
one_year_cutoff = 1.year.ago.beginning_of_day
7+
68
recent_attendee_ids = WorkshopInvitation.to_students
79
.attended
810
.joins(:workshop)
9-
.where('workshops.date_and_time >= ?', cutoff)
11+
.where('workshops.date_and_time >= ?', three_month_cutoff)
1012
.select(:member_id)
1113

14+
past_year_attendee_ids = WorkshopInvitation.to_students
15+
.attended
16+
.joins(:workshop)
17+
.where('workshops.date_and_time >= ?', one_year_cutoff)
18+
.select(:member_id)
19+
1220
members = Member.not_banned
1321
.accepted_toc
1422
.joins(:groups)
1523
.merge(Group.students)
1624
.left_joins(:member_email_deliveries)
1725
.where(member_email_deliveries: { id: nil })
1826
.where.not(id: recent_attendee_ids)
27+
.where(id: past_year_attendee_ids)
1928
.distinct
2029

2130
members.find_each do |member|

spec/services/three_month_email_service_spec.rb

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@
1717
let!(:eligible_student) do
1818
member = Fabricate(:member)
1919
Fabricate(:subscription, member: member, group: students_group)
20+
Fabricate(
21+
:workshop_invitation,
22+
member: member,
23+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 6.months.ago),
24+
role: "Student",
25+
attended: true
26+
)
2027
member
2128
end
2229

@@ -71,6 +78,19 @@
7178
member
7279
end
7380

81+
let!(:student_with_very_old_attendance) do
82+
member = Fabricate(:member)
83+
Fabricate(:subscription, member: member, group: students_group)
84+
Fabricate(
85+
:workshop_invitation,
86+
member: member,
87+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 14.months.ago),
88+
role: "Student",
89+
attended: true
90+
)
91+
member
92+
end
93+
7494
it "emails only students who have not attended in the last 3 months and were not emailed before" do
7595
expect { perform_enqueued_jobs { call } }.to change(MemberEmailDelivery, :count).by(2)
7696

@@ -102,12 +122,25 @@
102122
expect(MemberEmailDelivery.where(member: student_without_toc)).to be_empty
103123
end
104124

125+
it "does not email students who have not attended in the past year" do
126+
perform_enqueued_jobs { call }
127+
128+
expect(MemberEmailDelivery.where(member: student_with_very_old_attendance)).to be_empty
129+
end
130+
105131
it "sends only one chaser for a member with multiple student subscriptions" do
106132
member = Fabricate(:member)
107133
other_chapter = Fabricate(:chapter)
108134
other_students_group = Fabricate(:group, name: "Students", chapter: other_chapter)
109135
Fabricate(:subscription, member: member, group: students_group)
110136
Fabricate(:subscription, member: member, group: other_students_group)
137+
Fabricate(
138+
:workshop_invitation,
139+
member: member,
140+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 6.months.ago),
141+
role: "Student",
142+
attended: true
143+
)
111144

112145
perform_enqueued_jobs { call }
113146

@@ -159,6 +192,13 @@
159192
it "emails a student member who has recent attendance only as a coach" do
160193
member = Fabricate(:member)
161194
Fabricate(:subscription, member: member, group: students_group)
195+
Fabricate(
196+
:workshop_invitation,
197+
member: member,
198+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 6.months.ago),
199+
role: "Student",
200+
attended: true
201+
)
162202
Fabricate(
163203
:workshop_invitation,
164204
member: member,

0 commit comments

Comments
 (0)