92 lines
2.4 KiB
Elixir
92 lines
2.4 KiB
Elixir
defmodule Plausible.Workers.SendTrialNotifications do
|
|
use Plausible.Repo
|
|
|
|
use Oban.Worker,
|
|
queue: :trial_notification_emails,
|
|
max_attempts: 1
|
|
|
|
alias Plausible.Teams
|
|
|
|
require Logger
|
|
|
|
@impl Oban.Worker
|
|
def perform(_job) do
|
|
teams =
|
|
Repo.all(
|
|
from t in Teams.Team,
|
|
inner_join: o in assoc(t, :owners),
|
|
left_join: bm in assoc(t, :billing_members),
|
|
left_join: s in assoc(t, :subscription),
|
|
where: not is_nil(t.trial_expiry_date),
|
|
where: is_nil(s.id),
|
|
order_by: t.inserted_at,
|
|
preload: [owners: o, billing_members: bm]
|
|
)
|
|
|
|
for team <- teams do
|
|
recipients = team.owners ++ team.billing_members
|
|
|
|
case Date.diff(team.trial_expiry_date, Date.utc_today()) do
|
|
7 ->
|
|
if Teams.has_active_sites?(team) do
|
|
send_one_week_reminder(recipients, team)
|
|
end
|
|
|
|
1 ->
|
|
if Teams.has_active_sites?(team) do
|
|
send_tomorrow_reminder(recipients, team)
|
|
end
|
|
|
|
0 ->
|
|
if Teams.has_active_sites?(team) do
|
|
send_today_reminder(recipients, team)
|
|
end
|
|
|
|
-1 ->
|
|
if Teams.has_active_sites?(team) do
|
|
send_over_reminder(recipients, team)
|
|
end
|
|
|
|
_ ->
|
|
nil
|
|
end
|
|
end
|
|
|
|
:ok
|
|
end
|
|
|
|
defp send_one_week_reminder(users, team) do
|
|
for user <- users do
|
|
PlausibleWeb.Email.trial_one_week_reminder(user, team)
|
|
|> Plausible.Mailer.send()
|
|
end
|
|
end
|
|
|
|
defp send_tomorrow_reminder(users, team) do
|
|
usage = Plausible.Teams.Billing.usage_cycle(team, :last_30_days)
|
|
suggested_volume = Plausible.Billing.Plans.suggest_volume(team, usage.total)
|
|
|
|
for user <- users do
|
|
PlausibleWeb.Email.trial_upgrade_email(user, team, "tomorrow", usage, suggested_volume)
|
|
|> Plausible.Mailer.send()
|
|
end
|
|
end
|
|
|
|
defp send_today_reminder(users, team) do
|
|
usage = Plausible.Teams.Billing.usage_cycle(team, :last_30_days)
|
|
suggested_volume = Plausible.Billing.Plans.suggest_volume(team, usage.total)
|
|
|
|
for user <- users do
|
|
PlausibleWeb.Email.trial_upgrade_email(user, team, "today", usage, suggested_volume)
|
|
|> Plausible.Mailer.send()
|
|
end
|
|
end
|
|
|
|
defp send_over_reminder(users, team) do
|
|
for user <- users do
|
|
PlausibleWeb.Email.trial_over_email(user, team)
|
|
|> Plausible.Mailer.send()
|
|
end
|
|
end
|
|
end
|