mirror of
https://github.com/plausible/analytics.git
synced 2024-12-23 17:44:43 +03:00
Make sure only the current subcription is used in expiry notifications
This commit is contained in:
parent
78e96a6d67
commit
fef5337a64
@ -9,19 +9,30 @@ defmodule Plausible.Workers.NotifyAnnualRenewal do
|
||||
Sends a notification at most 7 days and at least 1 day before the renewal of an annual subscription
|
||||
"""
|
||||
def perform(_job) do
|
||||
current_subscriptions = from(
|
||||
s in Plausible.Billing.Subscription,
|
||||
group_by: s.user_id,
|
||||
select: %{
|
||||
user_id: s.user_id,
|
||||
inserted_at: max(s.inserted_at)
|
||||
}
|
||||
)
|
||||
|
||||
users =
|
||||
Repo.all(
|
||||
from u in Plausible.Auth.User,
|
||||
join: s in Plausible.Billing.Subscription,
|
||||
on: s.user_id == u.id,
|
||||
left_join: sent in "sent_renewal_notifications",
|
||||
on: s.user_id == sent.user_id,
|
||||
where: s.paddle_plan_id in @yearly_plans,
|
||||
where:
|
||||
s.next_bill_date > fragment("now()::date") and
|
||||
s.next_bill_date <= fragment("now()::date + INTERVAL '7 days'"),
|
||||
where: is_nil(sent.id) or sent.timestamp < fragment("now() - INTERVAL '1 month'"),
|
||||
preload: [subscription: s]
|
||||
join: cs in subquery(current_subscriptions),
|
||||
on: cs.user_id == u.id,
|
||||
join: s in Plausible.Billing.Subscription,
|
||||
on: s.inserted_at == cs.inserted_at,
|
||||
left_join: sent in "sent_renewal_notifications",
|
||||
on: s.user_id == sent.user_id,
|
||||
where: s.paddle_plan_id in @yearly_plans,
|
||||
where:
|
||||
s.next_bill_date > fragment("now()::date") and
|
||||
s.next_bill_date <= fragment("now()::date + INTERVAL '7 days'"),
|
||||
where: is_nil(sent.id) or sent.timestamp < fragment("now() - INTERVAL '1 month'"),
|
||||
preload: [subscription: s]
|
||||
)
|
||||
|
||||
for user <- users do
|
||||
|
@ -39,6 +39,26 @@ defmodule Plausible.Workers.NotifyAnnualRenewalTest do
|
||||
assert_no_emails_delivered()
|
||||
end
|
||||
|
||||
test "ignores user with old yearly subscription that's been superseded by a newer one", %{user: user} do
|
||||
insert(:subscription,
|
||||
inserted_at: Timex.shift(Timex.now(), days: -1),
|
||||
user: user,
|
||||
paddle_plan_id: @yearly_plan,
|
||||
next_bill_date: Timex.shift(Timex.today(), days: 5)
|
||||
)
|
||||
|
||||
insert(:subscription,
|
||||
inserted_at: Timex.now(),
|
||||
user: user,
|
||||
paddle_plan_id: @yearly_plan,
|
||||
next_bill_date: Timex.shift(Timex.today(), days: 30)
|
||||
)
|
||||
|
||||
NotifyAnnualRenewal.perform(nil)
|
||||
|
||||
assert_no_emails_delivered()
|
||||
end
|
||||
|
||||
test "sends renewal notification to user whose subscription is due for renewal in 7 days", %{
|
||||
user: user
|
||||
} do
|
||||
|
Loading…
Reference in New Issue
Block a user