diff --git a/apps/backend/src/app/modules/submission/multirespondent-submission/multirespondent-submission.service.ts b/apps/backend/src/app/modules/submission/multirespondent-submission/multirespondent-submission.service.ts index 3ebe7551dd..a79ed4e9b7 100644 --- a/apps/backend/src/app/modules/submission/multirespondent-submission/multirespondent-submission.service.ts +++ b/apps/backend/src/app/modules/submission/multirespondent-submission/multirespondent-submission.service.ts @@ -68,6 +68,7 @@ import { reportSubmissionResponseTime } from '../submissions.statsd-client' import { MultirespondentSubmissionContent } from './multirespondent-submission.types' import { + extractEmailAnswersFromResponses, extractRespondentCopyEmailDatas, formatSubmittedStepTimestamp, getEmailFromResponses, @@ -524,13 +525,17 @@ const sendMrfOutcomeEmails = ({ if (isApproval) { return MailService.sendMrfApprovalEmail({ emails: destinationEmails, - formId: form._id, + formId: String(form._id), formTitle: form.title, responseId: submissionId, + submissionId, timestamp: latestSubmissionTimestamp, isRejected, formQuestionAnswers, attachments: emailAttachments, + replyTo: + extractEmailAnswersFromResponses(responses).join(', ') || + undefined, }).orElse((error) => { logger.error({ message: 'Failed to send approval email', @@ -547,12 +552,15 @@ const sendMrfOutcomeEmails = ({ return MailService.sendMrfWorkflowCompletionEmail({ emails: destinationEmails, - formId: form._id, + formId: String(form._id), formTitle: form.title, responseId: submissionId, + submissionId, timestamp: latestSubmissionTimestamp, formQuestionAnswers, attachments: emailAttachments, + replyTo: + extractEmailAnswersFromResponses(responses).join(', ') || undefined, }).orElse((error) => { logger.error({ message: 'Failed to send workflow completion email', diff --git a/apps/backend/src/app/modules/submission/multirespondent-submission/multirespondent-submission.utils.ts b/apps/backend/src/app/modules/submission/multirespondent-submission/multirespondent-submission.utils.ts index 670ce3b9be..191fbb95d3 100644 --- a/apps/backend/src/app/modules/submission/multirespondent-submission/multirespondent-submission.utils.ts +++ b/apps/backend/src/app/modules/submission/multirespondent-submission/multirespondent-submission.utils.ts @@ -109,6 +109,23 @@ export const getEmailFromResponses = ( return field.answer.value } +export const extractEmailAnswersFromResponses = ( + responses: FieldResponsesV3, +): string[] => { + if (!responses) return [] + return Object.values(responses) + .filter( + ( + response, + ): response is Extract< + FieldResponseV3, + { fieldType: BasicField.Email } + > => response.fieldType === BasicField.Email, + ) + .map((response) => response.answer.value) + .filter(Boolean) +} + const getConditionalFieldEmailRecipient = ( form_fields: FormFieldSchema[] | FormFieldDto[], fieldId: string, diff --git a/apps/backend/src/app/services/mail/mail.service.ts b/apps/backend/src/app/services/mail/mail.service.ts index 5d9ba2dcb3..fffbb263d8 100644 --- a/apps/backend/src/app/services/mail/mail.service.ts +++ b/apps/backend/src/app/services/mail/mail.service.ts @@ -1186,17 +1186,21 @@ export class MailService { formId, formTitle, responseId, + submissionId, timestamp, formQuestionAnswers, attachments, + replyTo, }: { emails: string[] formId: string formTitle: string responseId: string + submissionId?: string timestamp: string formQuestionAnswers: QuestionAnswer[] attachments?: Mail.Attachment[] + replyTo?: string }): ResultAsync => { const emailTemplateData: EmailData = { formTitle, @@ -1213,6 +1217,8 @@ export class MailService { attachments, emailType: EmailType.WorkflowCompletion, actionName: 'sendMrfWorkflowCompletionEmail', + submissionId, + replyTo, }) } @@ -1221,19 +1227,23 @@ export class MailService { formId, formTitle, responseId, + submissionId, timestamp, isRejected, formQuestionAnswers, attachments, + replyTo, }: { emails: string[] formId: string formTitle: string responseId: string + submissionId?: string timestamp: string isRejected: boolean formQuestionAnswers: QuestionAnswer[] attachments?: Mail.Attachment[] + replyTo?: string }): ResultAsync => { const outcome = isRejected ? WorkflowOutcome.NOT_APPROVED @@ -1255,6 +1265,8 @@ export class MailService { attachments, emailType: EmailType.WorkflowApproval, actionName: 'sendMrfApprovalEmail', + submissionId, + replyTo, }) }