diff --git a/app/controllers/manage/questionnaires_controller.rb b/app/controllers/manage/questionnaires_controller.rb index 4edb31cc0..5a8cdeca1 100644 --- a/app/controllers/manage/questionnaires_controller.rb +++ b/app/controllers/manage/questionnaires_controller.rb @@ -96,6 +96,13 @@ def check_in end def destroy + if @questionnaire.is_bus_captain + admins = User.where(role: :admin) + admins.each do |user| + AdminMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later + end + end + @questionnaire.destroy respond_with(:manage, @questionnaire) end diff --git a/app/controllers/questionnaires_controller.rb b/app/controllers/questionnaires_controller.rb index 190acbac9..d1ffae79e 100644 --- a/app/controllers/questionnaires_controller.rb +++ b/app/controllers/questionnaires_controller.rb @@ -94,8 +94,14 @@ def update # DELETE /apply # DELETE /apply.json def destroy - @questionnaire.destroy + if @questionnaire.is_bus_captain + admins = User.where(role: :admin) + admins.each do |user| + AdminMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later + end + end + @questionnaire.destroy respond_to do |format| format.html { redirect_to questionnaires_url } format.json { head :no_content } diff --git a/app/controllers/rsvps_controller.rb b/app/controllers/rsvps_controller.rb index 32cfc9881..0fabed740 100644 --- a/app/controllers/rsvps_controller.rb +++ b/app/controllers/rsvps_controller.rb @@ -43,6 +43,10 @@ def deny # rubocop:disable CyclomaticComplexity # rubocop:disable PerceivedComplexity def update + # save to check if bus status changes after rsvp + bus = @questionnaire.bus_list_id + acc_status = @questionnaire.acc_status + unless @questionnaire.update_attributes(params.require(:questionnaire).permit(:agreement_accepted, :phone)) flash[:alert] = @questionnaire.errors.full_messages.join(", ") redirect_to rsvp_path @@ -58,6 +62,17 @@ def update update_acc_status update_bus_list + bus_after_rsvp = @questionnaire.bus_list_id + acc_status_after_rsvp = @questionnaire.acc_status + + if bus != nil && (acc_status != acc_status_after_rsvp || bus != bus_after_rsvp) && @questionnaire.is_bus_captain == true + @questionnaire.is_bus_captain = false + admins = User.where(role: :admin) + admins.each do |user| + AdminMailer.bus_captain_left(@questionnaire.bus_list_id, @questionnaire.user_id, user.id).deliver_later + end + end + unless @questionnaire.save flash[:alert] = @questionnaire.errors.full_message.join(", ") redirect_to rsvp_path diff --git a/app/mailers/admin_mailer.rb b/app/mailers/admin_mailer.rb index 2fd2d8bb6..df85345bb 100644 --- a/app/mailers/admin_mailer.rb +++ b/app/mailers/admin_mailer.rb @@ -42,6 +42,17 @@ def weekly_report(user_id) ) end + def bus_captain_left(bus_list_id, former_captain_id, user_id) + @bus_route = BusList.find_by_id(bus_list_id) + @former_captain = User.find_by_id(former_captain_id) + @user = User.find_by_id(user_id) + + mail( + to: pretty_email(@user.full_name, @user.email), + subject: "Bus Captain Left Bus Route: " + @bus_route.name, + ) + end + private def report_metric(query_base, new_query_field) diff --git a/app/views/admin_mailer/bus_captain_left.html.haml b/app/views/admin_mailer/bus_captain_left.html.haml new file mode 100644 index 000000000..7df0d04e8 --- /dev/null +++ b/app/views/admin_mailer/bus_captain_left.html.haml @@ -0,0 +1 @@ +%p Alert #{@former_captain.full_name} (#{@former_captain.email}) is no longer a bus captain for #{@bus_route.name} diff --git a/test/controllers/manage/questionnaires_controller_test.rb b/test/controllers/manage/questionnaires_controller_test.rb index 210c0dbc2..9c1e2ac27 100644 --- a/test/controllers/manage/questionnaires_controller_test.rb +++ b/test/controllers/manage/questionnaires_controller_test.rb @@ -281,11 +281,21 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase assert_redirected_to manage_questionnaire_path(assigns(:questionnaire)) end - should "destroy questionnaire" do - assert_difference("Questionnaire.count", -1) do - delete :destroy, params: { id: @questionnaire } + context "destroy questionnaire" do + should "if bus captain, notify admins that bus captain has been removed" do + @user = create(:admin) + @questionnaire.update_attribute(:is_bus_captain, true) + assert_difference('enqueued_jobs.size', User.where(role: :admin).size) do + delete :destroy, params: { id: @questionnaire } + end + end + + should "user destroy questionnaire" do + assert_difference('Questionnaire.count', -1) do + delete :destroy, params: { id: @questionnaire } + end + assert_redirected_to manage_questionnaires_path end - assert_redirected_to manage_questionnaires_path end should "check in the questionnaire" do diff --git a/test/controllers/questionnaires_controller_test.rb b/test/controllers/questionnaires_controller_test.rb index 53260735c..4a02ce4eb 100644 --- a/test/controllers/questionnaires_controller_test.rb +++ b/test/controllers/questionnaires_controller_test.rb @@ -165,12 +165,22 @@ class QuestionnairesControllerTest < ActionController::TestCase assert_redirected_to questionnaires_path end - should "destroy questionnaire" do - assert_difference('Questionnaire.count', -1) do - delete :destroy + context "destroy questionnaire" do + should "if bus captain, notify admins that bus captain has been removed" do + @admin = create(:admin) + @questionnaire.update_attribute(:is_bus_captain, true) + assert_difference('enqueued_jobs.size', User.where(role: :admin).size) do + delete :destroy + end end - assert_redirected_to questionnaires_path + should "user destroy questionnaire" do + assert_difference('Questionnaire.count', -1) do + delete :destroy + end + + assert_redirected_to questionnaires_path + end end context "with invalid questionnaire params" do diff --git a/test/controllers/rsvps_controller_test.rb b/test/controllers/rsvps_controller_test.rb index 77a15dbe7..47f84a46b 100644 --- a/test/controllers/rsvps_controller_test.rb +++ b/test/controllers/rsvps_controller_test.rb @@ -243,5 +243,38 @@ class RsvpsControllerTest < ActionController::TestCase assert_match /select a RSVP status/, flash[:alert] assert_redirected_to rsvp_path end + + should "if bus captain leaves a bus, notify admins that bus captain has been removed" do + @admin = create(:admin) + @questionnaire.update_attribute(:is_bus_captain, true) + @questionnaire.update_attribute(:acc_status, "rsvp_confirmed") + + bus_list1 = create(:bus_list, capacity: 1) + bus_list2 = create(:bus_list, capacity: 2) + patch :update, params: { + questionnaire: { + acc_status: "rsvp_confirmed", + phone: "(123) 456-7890", + bus_list_id: bus_list1.id + } + } + + assert_difference('enqueued_jobs.size', User.where(role: :admin).size) do + patch :update, params: { + questionnaire: { + acc_status: "rsvp_confirmed", + phone: "(123) 456-7890", + bus_list_id: bus_list2.id + } + } + end + end + + should "not queue bus_captain_left email if questionnaire is not a bus captain" do + @questionnaire.update_attribute(:is_bus_captain, false) + assert_difference('enqueued_jobs.size', 0) do + patch :update, params: { questionnaire: { acc_status: "rsvp_confirmed" } } + end + end end end