Skip to content

Commit

Permalink
Merge pull request #5208 from sarvaiyanidhi/email-reimbursement-requests
Browse files Browse the repository at this point in the history
Email selected users when reimbursement requests are entered
  • Loading branch information
schoork authored Oct 24, 2023
2 parents bd40aa7 + f35a840 commit 03b4e10
Show file tree
Hide file tree
Showing 9 changed files with 143 additions and 4 deletions.
10 changes: 10 additions & 0 deletions app/controllers/case_contacts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ def update
if @case_contact.valid?
created_at = @case_contact.created_at.strftime("%-I:%-M %p on %m-%e-%Y")
flash[:notice] = "Case contact created at #{created_at}, was successfully updated."
send_reimbursement_email(@case_contact)
redirect_to casa_case_path(@case_contact.casa_case)
else
render :edit
Expand Down Expand Up @@ -169,6 +170,9 @@ def create_case_contact_for_every_selected_casa_case(selected_cases)
end

case_contact = @case_contact.dup

send_reimbursement_email(case_contact)

case_contact.casa_case = casa_case
if @selected_cases.count == 1 && case_contact.valid?
if current_role == "Volunteer"
Expand All @@ -181,6 +185,12 @@ def create_case_contact_for_every_selected_casa_case(selected_cases)
end
end

def send_reimbursement_email(case_contact)
if case_contact.should_send_reimbursement_email?
SupervisorMailer.reimbursement_request_email(case_contact.creator, case_contact.supervisor).deliver_later
end
end

def update_volunteer_address(volunteer = current_user)
content = create_case_contact_params.dig(:casa_case_attributes, :volunteers_attributes, "0", :address_attributes, :content)
return if content.blank?
Expand Down
9 changes: 9 additions & 0 deletions app/mailers/supervisor_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,13 @@ def weekly_digest(supervisor)
subject: "Weekly summary of volunteers' activities for the week of #{Date.today - 7.days}"
)
end

def reimbursement_request_email(volunteer, supervisor)
@volunteer = volunteer
@casa_organization = volunteer.casa_org
@supervisor = supervisor
if supervisor.receive_reimbursement_email
mail(to: @supervisor.email, subject: "New reimbursement request from #{@volunteer.display_name}")
end
end
end
8 changes: 8 additions & 0 deletions app/models/case_contact.rb
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,14 @@ def requested_followup
followups.requested.first
end

def should_send_reimbursement_email?
want_driving_reimbursement_changed? && want_driving_reimbursement? && supervisor_active?
end

def supervisor_active?
!supervisor.blank? && supervisor.active?
end

def self.options_for_sorted_by
sorted_by_params.map do |option|
[I18n.t("models.case_contact.options_for_sorted_by.#{option}"), option]
Expand Down
15 changes: 15 additions & 0 deletions app/views/supervisor_mailer/reimbursement_request_email.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<meta itemprop="name" content="Volunteer Reimbursement Request Reminder" style="font-family: Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
<style>/* Email styles need to be inline */</style>
<table width="100%" cellpadding="0" cellspacing="0" style="font-family: Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
<tr style="font-family: Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
<td class="content-block" style="font-family: Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
Hello <%= @supervisor.display_name %>,
</td>
</tr>
<tr style="font-family: Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
<td class="content-block" style="font-family: Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
<%= @volunteer.display_name %> has submitted a reimbursement request, please follow up on the reimbursements page
<%= link_to "using this link", reimbursements_url %>.
</td>
</tr>
</table>
7 changes: 7 additions & 0 deletions lib/mailers/previews/supervisor_mailer_preview.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ def weekly_digest
SupervisorMailer.weekly_digest(supervisor)
end
end

def reimbursement_request_email
volunteer = params.has_key?(:volunteer_id) ? Volunteer.find_by(id: params[:volunteer_id]) : Volunteer.last
supervisor = params.has_key?(:supervisor_id) ? Supervisor.find_by(id: params[:supervisor_id]) : Supervisor.last
supervisor.receive_reimbursement_email = true
SupervisorMailer.reimbursement_request_email(volunteer, supervisor)
end
end

# :nocov:
23 changes: 20 additions & 3 deletions spec/mailers/previews/supervisor_mailer_preview_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

RSpec.describe SupervisorMailerPreview do
let!(:supervisor) { create(:supervisor) }
let!(:volunteer) { create(:volunteer, casa_org: supervisor.casa_org, supervisor: supervisor) }

describe "#account_setup" do
context "When no ID is passed" do
Expand Down Expand Up @@ -32,21 +33,37 @@
let(:preview) { described_class.new }
let(:email) { preview.weekly_digest }

xit { expect(email.to).to eq [supervisor.email] }
it { expect(email.to).to eq [supervisor.email] }
end

context "When passed ID is valid" do
let(:preview) { described_class.new(id: supervisor.id) }
let(:email) { preview.weekly_digest }

xit { expect(email.to).to eq [supervisor.email] }
it { expect(email.to).to eq [supervisor.email] }
end

context "When passed ID is invalid" do
let(:preview) { described_class.new(id: 3500) }
let(:email) { preview.weekly_digest }

xit { expect(email.to).to eq ["missing_supervisor@example.com"] }
it { expect(email.to).to eq ["missing_supervisor@example.com"] }
end
end

describe "#reimbursement_request_email" do
context "When no ID is passed" do
let(:preview) { described_class.new }
let(:email) { preview.reimbursement_request_email }

it { expect(email.to).to eq [supervisor.email] }
end

context "When passed ID is valid" do
let(:preview) { described_class.new(volunteer_id: volunteer.id, supervisor_id: supervisor.id) }
let(:email) { preview.reimbursement_request_email }

it { expect(email.to).to eq [supervisor.email] }
end
end
end
14 changes: 14 additions & 0 deletions spec/mailers/supervisor_mailer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,18 @@
expect(email_body).to include("This invitation will expire on #{expiration_date} (two weeks).")
end
end

describe ".reimbursement_request_email" do
let(:supervisor) { create(:supervisor, receive_reimbursement_email: true) }
let(:volunteer) { create(:volunteer, supervisor: supervisor) }
let(:casa_organization) { volunteer.casa_org }

let(:mail) { SupervisorMailer.reimbursement_request_email(volunteer, supervisor) }

it "sends email reminder" do
expect(mail.subject).to eq("New reimbursement request from #{volunteer.display_name}")
expect(mail.to).to eq([supervisor.email])
expect(mail.body.encoded).to match("#{volunteer.display_name} has submitted a reimbursement request")
end
end
end
32 changes: 32 additions & 0 deletions spec/models/case_contact_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -490,4 +490,36 @@
end
end
end

describe "#should_send_reimbursement_email?" do
let(:supervisor) { create(:supervisor, receive_reimbursement_email: true) }
let(:volunteer) { create(:volunteer, supervisor: supervisor) }
let(:case_contact) { build(:case_contact, :wants_reimbursement, creator: volunteer) }

it "returns true if wants reimbursement, reimbursement changed, and has active supervisor" do
expect(case_contact.should_send_reimbursement_email?).to be true
end

it "returns false if want reimbursement not changed" do
case_contact.save
expect(case_contact.want_driving_reimbursement_changed?).to be false
expect(case_contact.should_send_reimbursement_email?).to be false
end

it "returns false if doesn't want reimbursement" do
case_contact.want_driving_reimbursement = false
expect(case_contact.should_send_reimbursement_email?).to be false
end

it "returns false if creator doesn't have supervisor" do
volunteer.supervisor_volunteer = nil
expect(case_contact.supervisor.blank?).to be true
expect(case_contact.should_send_reimbursement_email?).to be false
end

it "returns false if creator's supervisor is inactive" do
supervisor.update(active: false)
expect(case_contact.should_send_reimbursement_email?).to be false
end
end
end
29 changes: 28 additions & 1 deletion spec/requests/case_contacts_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
let(:selected_casa_case_ids) { [casa_case.id] }
let(:valid_attributes) do
attributes_for(:case_contact, :wants_reimbursement, casa_case: casa_case).merge(
creator: admin, casa_case_id: selected_casa_case_ids
casa_case_id: selected_casa_case_ids
)
end
let(:params) { {case_contact: valid_attributes} }
Expand Down Expand Up @@ -142,6 +142,33 @@
end
end

context "reimbursement mail to supervisor" do
let(:supervisor) { create(:supervisor, receive_reimbursement_email: true, casa_org: organization) }
let(:volunteer) { create(:volunteer, supervisor: supervisor, casa_org: organization) }
let!(:case_assignment) { create(:case_assignment, volunteer: volunteer, casa_case: casa_case) }

before do
sign_in volunteer
end

it "sends reimbursement request email when conditions are met" do
mailer_double = double("SupervisorMailer")
allow(SupervisorMailer).to receive(:reimbursement_request_email).and_return(mailer_double)

expect(mailer_double).to receive(:deliver_later)
request
end

it "does not send reimbursement request email when conditions are not met" do
supervisor.update(active: false)
mailer_double = double("SupervisorMailer")
allow(SupervisorMailer).to receive(:reimbursement_request_email).and_return(mailer_double)

expect(mailer_double).not_to receive(:deliver_later)
request
end
end

context "with additional expense" do
let(:params) do
{
Expand Down

0 comments on commit 03b4e10

Please sign in to comment.