analytics/lib/workers/send_trial_notifications.ex

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