diff --git a/app/controllers/evaluations_controller.rb b/app/controllers/evaluations_controller.rb index 09232d53..efcd8e3b 100644 --- a/app/controllers/evaluations_controller.rb +++ b/app/controllers/evaluations_controller.rb @@ -10,21 +10,18 @@ def index where(evaluator_submission_assignments: { user_id: current_user.id, status: [:assigned, :recused] - }). - includes(:challenge, :evaluation_form). - distinct + }).includes(:challenge, :evaluation_form).distinct end def submissions @phase = Phase.joins(:challenge_phases_evaluators). - where(challenge_phases_evaluators: { user_id: current_user.id }). - find(params[:id]) + where(challenge_phases_evaluators: { user_id: current_user.id }).find(params[:id]) @challenge = @phase.challenge @assigned_submissions = @phase.evaluator_submission_assignments. - where(evaluator: current_user).where(status: %i[assigned recused]). - includes(:submission, :evaluation).ordered_by_status + where(evaluator: current_user).where(status: %i[assigned recused]).includes(:submission, :evaluation). + ordered_by_status @submissions_count = helpers.calculate_submissions_count(@assigned_submissions) end @@ -82,6 +79,8 @@ def recuse current_user.evaluator_submission_assignments.where(submission_id: params[:submission_id]).first if EvaluatorRecusalService.new(@evaluator_submission_assignment).call + send_recusal_notification + flash[:notice] = I18n.t("evaluations.recusal.success") redirect_to submissions_evaluation_path(@evaluator_submission_assignment.phase), status: :see_other else @@ -119,6 +118,10 @@ def build_evaluation end end + def send_recusal_notification + NotificationMailer.recusal(@evaluator_submission_assignment).deliver_now + end + # Auth Helpers def can_access_evaluation? @evaluator_submission_assignment && @evaluator_submission_assignment.user_id == current_user.id diff --git a/app/controllers/evaluator_submission_assignments_controller.rb b/app/controllers/evaluator_submission_assignments_controller.rb index 59c717ac..28f4529d 100644 --- a/app/controllers/evaluator_submission_assignments_controller.rb +++ b/app/controllers/evaluator_submission_assignments_controller.rb @@ -27,6 +27,8 @@ def create status: :assigned ) if @evaluator_submission_assignment.save + NotificationMailer.evaluation_assignment(@evaluator_submission_assignment).deliver_now + redirect_to submission_path(@submission), notice: I18n.t("evaluator_submission_assignments.assigned.success") else redirect_to submission_path(@submission), notice: I18n.t("evaluator_submission_assignments.assigned.failure") @@ -84,16 +86,15 @@ def update_assignment_status(new_status) @assignment.update(status: new_status) end + def send_evaluation_assignment_notification(new_status) + NotificationMailer.evaluation_assignment(@assignment).deliver_now if new_status == :assigned + end + def handle_successful_update(new_status) + send_evaluation_assignment_notification(new_status) + flash[:success] = t("evaluator_submission_assignments.#{new_status}.success") - if request&.referer&.include?("submissions") - redirect_to request.referer - else - respond_to do |format| - format.html { redirect_to_assignment_path } - format.json { render json: { success: true, message: flash[:success] } } - end - end + handle_update_response end def handle_failed_update(new_status) @@ -110,4 +111,13 @@ def redirect_to_assignment_path evaluator_id: params[:evaluator_id] ) end + + def handle_update_response + return redirect_to request.referer if request&.referer&.include?("submissions") + + respond_to do |format| + format.html { redirect_to_assignment_path } + format.json { render json: { success: true, message: flash[:success] } } + end + end end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index 6bcb26d4..a089bcdb 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -3,6 +3,6 @@ # The main app mailer for sending emails. # The app does not process inbound messages. class ApplicationMailer < ActionMailer::Base - default from: "from@example.com" + default from: "support@challenge.gov" layout "mailer" end diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb new file mode 100644 index 00000000..4acbacef --- /dev/null +++ b/app/mailers/notification_mailer.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +# Mailer class for sending notification emails related to evaluation invitations, +# evaluation assignments, evaluator role change requests, and recusals +class NotificationMailer < ApplicationMailer + include PhasesHelper + include EvaluationFormsHelper + + def evaluation_invitation(invitation) + setup_challenge_attrs(invitation.phase.challenge, invitation.phase) + @user = invitation + + mail( + to: invitation.email, + subject: I18n.t('mailers.evaluation_invitation.subject', challenge_title: invitation.phase.challenge.title) + ) + end + + def role_request(user, challenge, phase) + setup_challenge_attrs(challenge, phase) + @user = user + + mail( + to: user.email, + subject: I18n.t('mailers.evaluation_invitation.subject', challenge_title: challenge.title) + ) + end + + def evaluation_assignment(evaluator_submission_assignment) + setup_assignment_attrs(evaluator_submission_assignment) + @due_date = @submission.phase.end_date.strftime("%m/%d/%Y") + + mail( + to: @evaluator.email, + subject: I18n.t('mailers.evaluation_assignment.subject', submission_id: @submission.id) + ) + end + + def recusal(evaluator_submission_assignment) + setup_assignment_attrs(evaluator_submission_assignment) + + mail( + to: @challenge_managers.map(&:email), + subject: I18n.t('mailers.recusal.subject', submission_id: @submission.id) + ) + end + + private + + def setup_challenge_attrs(challenge, phase) + @challenge_phase_title = challenge_phase_title(challenge, phase) + @challenge_managers = challenge.challenge_managers.includes(:user).map(&:user) + attach_logo + end + + def setup_assignment_attrs(assignment) + @evaluator = assignment.evaluator + @submission = assignment.submission + setup_challenge_attrs(@submission.challenge, @submission.phase) + @assignment = assignment + end + + def attach_logo + logo_path = Rails.public_path.join('platform-assets/images/challenge_gov_logo.png') + attachments.inline['challenge_gov_logo.png'] = File.read(logo_path) + end +end diff --git a/app/services/evaluator_invitation_service.rb b/app/services/evaluator_invitation_service.rb index 3a9503ba..78e29eab 100644 --- a/app/services/evaluator_invitation_service.rb +++ b/app/services/evaluator_invitation_service.rb @@ -12,8 +12,9 @@ def handle_invitation(email, invitation_params) existing_invitation ? resend_invitation(existing_invitation) : create_new_invitation(invitation_params) end - # TODO: Implement sending the invitation email here def resend_invitation(invitation) + NotificationMailer.evaluation_invitation(invitation).deliver_now + if invitation.update(last_invite_sent: Time.current) { success: true, @@ -39,6 +40,7 @@ def create_new_invitation(invitation_params) ) ) if invitation.save + NotificationMailer.evaluation_invitation(invitation).deliver_now { success: true, message: I18n.t( diff --git a/app/services/evaluator_management_service.rb b/app/services/evaluator_management_service.rb index 8bd235e9..b2edae7d 100644 --- a/app/services/evaluator_management_service.rb +++ b/app/services/evaluator_management_service.rb @@ -22,6 +22,7 @@ def remove_evaluator(evaluator_type, evaluator_id) def self.accept_evaluator_invitation(user) invitations = EvaluatorInvitation.where(email: user.email) invitations.each do |invite| + user.update(first_name: invite.first_name, last_name: invite.last_name) ChallengePhasesEvaluator.create(challenge: invite.challenge, phase: invite.phase, user:) invite.destroy end @@ -77,6 +78,8 @@ def invalid_role(user) end def handle_evaluator_role_requested(user) + NotificationMailer.role_request(user, @challenge, @phase).deliver_now + user.update!(status: 'evaluator_role_requested') ChallengePhasesEvaluator.find_or_create_by(challenge: @challenge, phase: @phase, user:) { diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index 3aac9002..3a6d579b 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -3,11 +3,61 @@
- - <%= yield %> +