diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index c043b3f52..e4a9bff91 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -2,7 +2,7 @@ class EventsController < ApplicationController include AhoyTracking, TagAssignable skip_before_action :authenticate_user!, only: [ :index, :show ] skip_before_action :verify_authenticity_token, only: [ :preview ] - before_action :set_event, only: %i[ show edit update destroy preview manage copy_registration_form ] + before_action :set_event, only: %i[ show edit update destroy preview manage preview_reminder send_reminder copy_registration_form ] def index authorize! @@ -59,6 +59,43 @@ def manage end end + def preview_reminder + authorize! @event, to: :preview_reminder? + @event = @event.decorate + @event_registrations = @event.event_registrations + .includes(:payments, registrant: [ :user, :contact_methods ]) + .joins(:registrant) + .select { |r| r.registrant.preferred_email.present? } + @sample_registration = @event_registrations.first + @days_until_event = @event.start_date.present? ? (@event.start_date.to_date - Date.current).to_i : nil + + if @sample_registration + mail = EventMailer.event_registration_reminder(@sample_registration, days_until_event: @days_until_event) + @reminder_preview_html = mail.html_part&.body&.decoded + end + end + + def send_reminder + authorize! @event, to: :send_reminder? + allowed_ids = Array(params[:registration_ids]).map(&:to_i).reject(&:zero?) + registrations = @event.event_registrations + .where(id: allowed_ids) + .includes(registrant: [ :user, :contact_methods ]) + .select { |r| r.registrant.preferred_email.present? } + days_until = @event.start_date.present? ? (@event.start_date.to_date - Date.current).to_i : nil + + if registrations.empty? + redirect_to remind_event_path(@event), alert: "Please select at least one recipient." + return + end + + registrations.each do |event_registration| + EventMailer.event_registration_reminder(event_registration, days_until_event: days_until).deliver_later + end + + redirect_to manage_event_path(@event), notice: "Reminder emails are being sent to #{registrations.size} registrant#{'s' if registrations.size != 1}." + end + def create authorize! @event = Event.new(event_params) diff --git a/app/mailers/event_mailer.rb b/app/mailers/event_mailer.rb index dd839a5f6..63e2b17b7 100644 --- a/app/mailers/event_mailer.rb +++ b/app/mailers/event_mailer.rb @@ -19,6 +19,28 @@ def event_registration_confirmation(event_registration) ) end + def event_registration_reminder(event_registration, days_until_event: nil) + @event_registration = event_registration + @event = event_registration.event.decorate + @person = event_registration.registrant + @days_until_event = days_until_event + + @notification_type = "Event registration reminder" + + @time_zone = @person.user&.time_zone || Time.zone.name + @event_url = @event_registration.slug.present? ? event_url(@event, reg: @event_registration.slug) : event_url(@event) + @organization_name = ENV.fetch("ORGANIZATION_NAME", "AWBW") + @organization_website = ENV.fetch("ORGANIZATION_WEBSITE", root_url) + + subject = "Reminder: #{@event.title} – #{@event.start_date.in_time_zone(@time_zone).strftime('%B %-d, %Y')}" + mail( + to: @person.preferred_email, + from: ENV.fetch("REPLY_TO_EMAIL", "no-reply@awbw.org"), + reply_to: ENV.fetch("REPLY_TO_EMAIL", "programs@awbw.org"), + subject: "AWBW Portal: #{subject}" + ) + end + def event_registration_cancelled(event_registration) @event_registration = event_registration @event = event_registration.event.decorate diff --git a/app/policies/event_policy.rb b/app/policies/event_policy.rb index 7b1f5d2a7..8b76136db 100644 --- a/app/policies/event_policy.rb +++ b/app/policies/event_policy.rb @@ -33,6 +33,14 @@ def manage? admin? || owner? end + def preview_reminder? + manage? + end + + def send_reminder? + manage? + end + alias_rule :preview?, to: :edit? private diff --git a/app/views/event_mailer/event_registration_reminder.html.erb b/app/views/event_mailer/event_registration_reminder.html.erb new file mode 100644 index 000000000..1670c8f3c --- /dev/null +++ b/app/views/event_mailer/event_registration_reminder.html.erb @@ -0,0 +1,60 @@ +
+ Hello <%= @person.full_name %>, +
+ ++ This is a reminder that you're registered for the following <%= @organization_name %> event<%= raw(" " + (@days_until_event == 0 ? "today" : @days_until_event == 1 ? "tomorrow" : "in #{@days_until_event} days")) if @days_until_event.is_a?(Integer) %>: +
+ ++ <%= @event.pre_title %> +
+ <% end %> + ++ <% Time.use_zone(@time_zone) { %><%= @event.times(display_day: true, display_date: true) %><% } %> +
+ + <% if @event.labelled_cost.present? %> ++ <%= @event.labelled_cost %> +
+ <% end %> + + <% if @event.location.present? %> ++ <%= @event.location.name %> +
+ <% end %> + + <% if @event.videoconference_url.present? %> ++ Join us on <%= @event.decorate.videoconference_domain %> +
+ <% end %> ++ Visit the event page for updates, directions, or calendar links: +
+ ++ <% if @event_registration.persisted? && @event_registration.slug.present? %> + View registration + <% end %> + View event +
+ ++ This is an automated reminder from <%= @organization_name %>. +
diff --git a/app/views/event_mailer/event_registration_reminder.text.erb b/app/views/event_mailer/event_registration_reminder.text.erb new file mode 100644 index 000000000..8de17315c --- /dev/null +++ b/app/views/event_mailer/event_registration_reminder.text.erb @@ -0,0 +1,32 @@ +Event reminder + +Hello <%= @person.full_name %>, + +This is a reminder that you're registered for the following event<%= @days_until_event.is_a?(Integer) ? (@days_until_event == 0 ? " today" : @days_until_event == 1 ? " tomorrow" : " in #{@days_until_event} days") : "" %>: + +<% if @event.respond_to?(:pre_title) && @event.pre_title.present? %> +<%= @event.pre_title %> +<% end %><%= @event.title %> +<% Time.use_zone(@time_zone) { %><%= @event.times(display_day: true, display_date: true) %><% } %> + +<% if @event.location.present? %> +Location: <%= @event.location.name %> +<% end %> + +<% if @event.videoconference_url.present? %> +Videoconference URL: <%= @event.videoconference_url %> +<% end %> + +<% if @event.labelled_cost.present? %> +<%= @event.labelled_cost %> +<% end %> + +<% if @event_registration.slug.present? %> +View your registration: +<%= registration_ticket_url(@event_registration.slug) %> + +<% end %>View the event page: +<%= @event_url %> + +-- +This is an automated reminder from <%= @organization_name %>. diff --git a/app/views/events/manage.html.erb b/app/views/events/manage.html.erb index 1ecfe73ae..6fea00da1 100644 --- a/app/views/events/manage.html.erb +++ b/app/views/events/manage.html.erb @@ -11,6 +11,7 @@+ <%= @event.title %> +
+There are no registrants with an email address to send a reminder to.
+ <%= link_to "Back to manage", manage_event_path(@event), class: "btn btn-secondary-outline" %> + <% else %> + <%= form_with url: send_reminder_event_path(@event), method: :post, local: true do |f| %> ++ Choose who will receive this reminder: +
+| + + | +Name | +Payment status | +|
|---|---|---|---|
| + <%= check_box_tag "registration_ids[]", reg.id, true, class: "recipient-checkbox rounded border-gray-300", id: "registration_ids_#{reg.id}" %> + | +<%= person.full_name %> | +<%= person.preferred_email %> | ++ <% if @event.object.cost_cents.to_i > 0 %> + <% if reg.scholarship_recipient? && reg.successful_payments_total_cents <= 0 %> + — + <% elsif reg.paid_in_full? %> + Paid + <% else %> + <% due_cents = @event.object.cost_cents - reg.successful_payments_total_cents %> + $<%= "%.2f" % (due_cents / 100.0) %> due + <% end %> + <% else %> + — + <% end %> + | +