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
|
Sends a notification at most 7 days and at least 1 day before the renewal of an annual subscription
|
||||||
"""
|
"""
|
||||||
def perform(_job) do
|
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 =
|
users =
|
||||||
Repo.all(
|
Repo.all(
|
||||||
from u in Plausible.Auth.User,
|
from u in Plausible.Auth.User,
|
||||||
join: s in Plausible.Billing.Subscription,
|
join: cs in subquery(current_subscriptions),
|
||||||
on: s.user_id == u.id,
|
on: cs.user_id == u.id,
|
||||||
left_join: sent in "sent_renewal_notifications",
|
join: s in Plausible.Billing.Subscription,
|
||||||
on: s.user_id == sent.user_id,
|
on: s.inserted_at == cs.inserted_at,
|
||||||
where: s.paddle_plan_id in @yearly_plans,
|
left_join: sent in "sent_renewal_notifications",
|
||||||
where:
|
on: s.user_id == sent.user_id,
|
||||||
s.next_bill_date > fragment("now()::date") and
|
where: s.paddle_plan_id in @yearly_plans,
|
||||||
s.next_bill_date <= fragment("now()::date + INTERVAL '7 days'"),
|
where:
|
||||||
where: is_nil(sent.id) or sent.timestamp < fragment("now() - INTERVAL '1 month'"),
|
s.next_bill_date > fragment("now()::date") and
|
||||||
preload: [subscription: s]
|
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
|
for user <- users do
|
||||||
|
@ -39,6 +39,26 @@ defmodule Plausible.Workers.NotifyAnnualRenewalTest do
|
|||||||
assert_no_emails_delivered()
|
assert_no_emails_delivered()
|
||||||
end
|
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", %{
|
test "sends renewal notification to user whose subscription is due for renewal in 7 days", %{
|
||||||
user: user
|
user: user
|
||||||
} do
|
} do
|
||||||
|
Loading…
Reference in New Issue
Block a user