From f46f26f2e43ee7e705ef0badb65f5d0f2dbac9c2 Mon Sep 17 00:00:00 2001 From: William Li <52115161+Trollermaner@users.noreply.github.com> Date: Sat, 30 Dec 2023 21:07:43 -0500 Subject: [PATCH] added Sponsorship fund email flow --- backend/emails/emails.js | 67 ++++++++++++++++++++- backend/models/constants.js | 2 +- backend/service/sponsorshipfunds.service.js | 22 ++++++- 3 files changed, 87 insertions(+), 4 deletions(-) diff --git a/backend/emails/emails.js b/backend/emails/emails.js index 73440e4..8b12c7c 100644 --- a/backend/emails/emails.js +++ b/backend/emails/emails.js @@ -15,7 +15,7 @@ const currencyFormatter = new Intl.NumberFormat('en-CA', { }) const getEmailToSection = async (reporter_id, recipients) => { - const emailToSet = new Set(['jw4he@watonomous.ca', 'v2zheng@watonomous.ca']) + const emailToSet = new Set(['william.li@watonomous.ca']) if (recipients.includes(EMAIL_RECIPIENTS.admin)) { // TODO: use ADMIN_IDENTIFIERS (rename to ADMIN_EMAILS) after migrating to new onboarding data @@ -86,6 +86,24 @@ const getUPRTicketInfoHTML = async (upr) => { ` } +const getSFTicketInfoHTML = async (sf) => { + const reporter = await getUserByUID(sf.reporter_id) + return ` +
+ Ticket Code: ${sf.code}
+ Sponsorship Fund: ${sf.name}
+ Allocated Funding: ${sf.funding_allocation}
+ Funding Spent: ${sf.funding_spent}
+ ${sf.proposal_url? `Proposal URL: ${sf.proposal_url}
` : ``}
+ ${sf.presentation_url? `Presentation URL: ${sf.presentation_url}
` : ``}
+ Status: ${sf.status}
+ Reporter: ${reporter.displayName} <${reporter.email}>
+ Created: ${new Date(sf.createdAt).toDateString()}
+ Claim Deadline: ${new Date(sf.claim_deadline).toDateString()}
+
View the ticket here: @@ -255,6 +273,50 @@ const sendEmailPPRReimbursedToReporter = async (ppr) => { }) } +const sendEmailSFReimbursementRequestToCoordinator = async (sf) => { + const Subject = `[Action Needed] Submit Reimbursement Request ${sf.codename}` + const HTMLPart = getMainMessageHTML(`Claim has been submitted for ${sf.codename}! Please review it and submit a reimbursement request. Visit the ticket link below to confirm you have submitted the reimbursement request.`) + + (await getSFTicketInfoHTML(sf)) + getTicketLinkHTML(sf.path) + const To = await getEmailToSection(sf.reporter_id, [ + EMAIL_RECIPIENTS.coordinator, + ]) + await sendEmail({ + Subject, + HTMLPart, + To, + }) +} + +const sendEmailSFConfirmReimbursementSubmitToCoordinator = async (sf) => { + const Subject = `[Action Needed] Confirm Reimbursement Received ${sf.codename}` + const HTMLPart = getMainMessageHTML(`Please visit the ticket link below to confirm you have received the reimbursement for ${sf.codename}.`) + + (await getSFTicketInfoHTML(sf)) + getTicketLinkHTML(sf.path) + const To = await getEmailToSection(sf.reporter_id, [ + EMAIL_RECIPIENTS.coordinator, + ]) + await sendEmail({ + Subject, + HTMLPart, + To, + }) +} + +const sendEmailSFReimbursementReceivedToTeam = async (sf) => { + const Subject = `[Reimbursed] ${sf.codename}` + const HTMLPart = getMainMessageHTML(`${sf.codename} has been reimbursed.`) + + (await getSFTicketInfoHTML(sf)) + getTicketLinkHTML(sf.path) + const To = await getEmailToSection(sf.reporter_id, [ + EMAIL_RECIPIENTS.finance, + EMAIL_RECIPIENTS.coordinator, + EMAIL_RECIPIENTS.team_captain, + ]) + await sendEmail({ + Subject, + HTMLPart, + To, + }) +} + const PurchaseRequestInvalidated = (purchaseRequestDetails) => { const { issue, reporter } = purchaseRequestDetails @@ -584,6 +646,9 @@ module.exports = { sendEmailPPRCreatedToApprovers, sendEmailPPRPurchasedAndReceiptsSubmittedToCoordinator, sendEmailPPRReimbursedToReporter, + sendEmailSFReimbursementRequestToCoordinator, + sendEmailSFConfirmReimbursementSubmitToCoordinator, + sendEmailSFReimbursementReceivedToTeam, PurchaseRequestInvalidated, PersonalPurchaseApproved, UWFinancePurchaseApproved, diff --git a/backend/models/constants.js b/backend/models/constants.js index b28a442..834901d 100644 --- a/backend/models/constants.js +++ b/backend/models/constants.js @@ -46,7 +46,7 @@ const TICKET_ENDPOINTS = Object.freeze({ UPR: '/uwfinancepurchases', }) -const ADMIN_IDENTIFIERS = ['drayside', 'v2zheng', 'jw4he'] +const ADMIN_IDENTIFIERS = ['drayside', 'v2zheng', 'jw4he', 'william.li'] const TEAM_CAPTAIN_TITLES = ['Team Captain'] const DIRECTOR_TITLES = ['Director'] diff --git a/backend/service/sponsorshipfunds.service.js b/backend/service/sponsorshipfunds.service.js index 3ab1bde..e07f079 100644 --- a/backend/service/sponsorshipfunds.service.js +++ b/backend/service/sponsorshipfunds.service.js @@ -6,6 +6,7 @@ const { getAnnotatedUWFinancePurchasesByIdList, getAnnotatedSponsorshipFundsByIdList, } = require('./annotatedGetters') +const { sendEmailSFReimbursementRequestToCoordinator, sendEmailSFConfirmReimbursementSubmitToCoordinator, sendEmailSFReimbursementReceivedToTeam } = require('../emails/emails') const getAllSponsorshipFunds = () => { return getAnnotatedSponsorshipFundsByIdList() @@ -49,10 +50,27 @@ const createSponsorshipFund = (body) => { return newSponsorshipFund.save() } -const updateSponsorshipFund = (id, body) => { - return SponsorshipFund.findByIdAndUpdate(id, body, { +const updateSponsorshipFund = async (id, body) => { + const newSponsorshipFund = await SponsorshipFund.findByIdAndUpdate(id, body, { new: true, }) + + const annotatedSponsorshipFund = await getSponsorshipFund(id) + const status = annotatedSponsorshipFund.status + + if (status === "CLAIM_SUBMITTED") { + sendEmailSFReimbursementRequestToCoordinator(annotatedSponsorshipFund) + } + + if (status === "SUBMITTED_TO_SF") { + sendEmailSFConfirmReimbursementSubmitToCoordinator(annotatedSponsorshipFund) + } + + if (status === "REIMBURSED") { + sendEmailSFReimbursementReceivedToTeam(annotatedSponsorshipFund) + } + + return newSponsorshipFund } const deleteSponsorshipFund = async (id) => {