| defmodule Plausible.Workers.SendTrialNotifications do |
| @moduledoc """ |
| Job sending trial end notification emails. |
| """ |
| use Plausible.Repo |
|
|
| use Oban.Worker, |
| queue: :trial_notification_emails, |
| max_attempts: 1 |
|
|
| alias Plausible.Teams |
|
|
| @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] |
| ) |
| |> Enum.filter(&Teams.has_active_sites?/1) |
|
|
| for team <- teams do |
| recipients = team.owners ++ team.billing_members |
|
|
| case Date.diff(team.trial_expiry_date, Date.utc_today()) do |
| 7 -> |
| send_one_week_reminder(recipients, team) |
|
|
| 1 -> |
| send_tomorrow_reminder(recipients, team) |
|
|
| 0 -> |
| send_today_reminder(recipients, team) |
|
|
| -1 -> |
| send_over_reminder(recipients, team) |
|
|
| _ -> |
| 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_ending_tomorrow_email(user, team, 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_ending_today_email(user, team, 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 |
|
|