Skip to content

Commit

Permalink
Email templates - withdraw CHIP SPA, New Waiver, Response to Waiver R…
Browse files Browse the repository at this point in the history
…AI (#463)

* add withdraw chip spa package emails for cms and state

* add 1915(b) Initial waiver emails

* add 1915b rai response emails

* fix 90 day lookup and withdraw chip spa template

* consolidate 90days lookup

* replace withdraw request confirmation with withdraw confirmation email

* add withdraw 1915b waiver email

* add notificationMetadata to the kafka event

* refactor notificationMetaData to its own schema so it can be included on multiple action types

* add notificationmetadata to rai response package action

* fix merge error and simplify addtion of notificationMetadata to kafka message
  • Loading branch information
bflynn-cms authored Mar 28, 2024
1 parent eaeea81 commit 33f513d
Show file tree
Hide file tree
Showing 9 changed files with 413 additions and 62 deletions.
8 changes: 2 additions & 6 deletions src/packages/shared-types/action-types/new-submission.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { z } from "zod";
import { attachmentSchema } from "../attachments";
import { notificationMetadataSchema } from "../notification-metadata";

// This is the event schema for ne submissions from our system
export const onemacSchema = z.object({
Expand All @@ -13,12 +14,7 @@ export const onemacSchema = z.object({
submitterEmail: z.string(),
attachments: z.array(attachmentSchema).nullish(),
raiWithdrawEnabled: z.boolean().default(false),
notificationMetadata: z
.object({
proposedEffectiveDate: z.number().nullish(),
submissionDate: z.number().nullish(),
})
.nullish(),
notificationMetadata: notificationMetadataSchema.nullish(),
// these are specific to TEs... should be broken into its own schema
statusDate: z.number().optional(),
submissionDate: z.number().optional(),
Expand Down
2 changes: 2 additions & 0 deletions src/packages/shared-types/action-types/respond-to-rai.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { z } from "zod";
import { attachmentSchema } from "../attachments";
import { notificationMetadataSchema } from "../notification-metadata";

export const raiResponseSchema = z.object({
id: z.string(),
Expand All @@ -11,5 +12,6 @@ export const raiResponseSchema = z.object({
additionalInformation: z.string().nullable().default(null),
submitterName: z.string(),
submitterEmail: z.string(),
notificationMetadata: notificationMetadataSchema.nullish(),
});
export type RaiResponse = z.infer<typeof raiResponseSchema>;
9 changes: 9 additions & 0 deletions src/packages/shared-types/notification-metadata.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { z } from "zod";

// This is addiitonal notification metadata needed for email
export const notificationMetadataSchema = z.object({
proposedEffectiveDate: z.number().nullish(),
submissionDate: z.number().nullish(),
});

export type NotificationMetadata = z.infer<typeof notificationMetadataSchema>;
8 changes: 7 additions & 1 deletion src/services/api/handlers/packageActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import {
import { produceMessage } from "../libs/kafka";
import { response } from "../libs/handler";
import { SEATOOL_STATUS } from "shared-types/statusHelper";
import { formatSeatoolDate, seaToolFriendlyTimestamp } from "shared-utils";
import { formatSeatoolDate, seaToolFriendlyTimestamp, getNextBusinessDayTimestamp } from "shared-utils";
import { buildStatusMemoQuery } from "../libs/statusMemo";

const TOPIC_NAME = process.env.topicName as string;
Expand Down Expand Up @@ -171,6 +171,9 @@ export async function withdrawRai(body: RaiWithdraw, document: any) {
JSON.stringify({
...result.data,
actionType: Action.WITHDRAW_RAI,
notificationMetadata: {
submissionDate: getNextBusinessDayTimestamp()
},
}),
);

Expand Down Expand Up @@ -273,6 +276,9 @@ export async function respondToRai(body: RaiResponse, document: any) {
...result.data,
responseDate: today,
actionType: Action.RESPOND_TO_RAI,
notificationMetadata: {
submissionDate: getNextBusinessDayTimestamp()
},
}),
);

Expand Down
4 changes: 2 additions & 2 deletions src/services/api/handlers/submit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,8 @@ export const submit = async (event: APIGatewayEvent) => {
// ${subTypeIdsInsert}

// data for emails
body.notificationMetadata = {
submissionDate,
eventBody.data.notificationMetadata = {
submissionDate: submissionDate,
proposedEffectiveDate: body.proposedEffectiveDate,
};

Expand Down
64 changes: 58 additions & 6 deletions src/services/email/libs/bundle-lib.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const getBundleFromEvent = (configKey, stage) => {
switch (configKey) {
case "new-submission-medicaid-spa":
return {
"dataList": ["osgEmail", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysDateNice", "additionalInformation", "formattedFileList", "textFileList"],
"dataList": ["osgEmail", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysDate", "additionalInformation", "formattedFileList", "textFileList"],
"emailCommands": [{
"Template": `new-submission-medicaid-spa-cms_${stage}`,
"ToAddresses": ["osgEmail"],
Expand All @@ -13,10 +13,47 @@ const getBundleFromEvent = (configKey, stage) => {
},
]
};
case "new-submission-1915b":
return {
"dataList": ["osgEmail", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "authority", "proposedEffectiveDateNice", "ninetyDaysDate", "additionalInformation", "formattedFileList", "textFileList"],
"emailCommands": [{
"Template": `new-submission-1915b-cms_${stage}`,
"ToAddresses": ["osgEmail"],
},
{
"Template": `new-submission-1915b-state_${stage}`,
"ToAddresses": ["submitter"],
},
]
};
case "respond-to-rai-1915b":
return {
"lookupList": ["osInsights"],
"dataList": ["osgEmail", "cpoc", "srt", "dmcoEmail", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "authority", "ninetyDaysDate", "additionalInformation", "formattedFileList", "textFileList"],
"emailCommands": [{
"Template": `respond-to-rai-1915b-cms_${stage}`,
"ToAddresses": ["osgEmail", "cpoc", "srt", "dmcoEmail"]
},
{
"Template": `respond-to-rai-1915b-state_${stage}`,
"ToAddresses": ["submitter"],
},
]
};
case "withdraw-package-1915b":
return {
"lookupList": ["osInsights","cognito"],
"dataList": ["allState", "id", "submitterName"],
"emailCommands": [
{
"Template": `withdraw-package-1915b-state_${stage}`,
"ToAddresses": ["allState"],
}],
};
case "respond-to-rai-medicaid-spa":
return {
"lookupList": ["osInsights"],
"dataList": ["osgEmail", "cpoc", "srt", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysLookupNice", "additionalInformation", "formattedFileList", "textFileList"],
"dataList": ["osgEmail", "cpoc", "srt", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysDate", "additionalInformation", "formattedFileList", "textFileList"],
"emailCommands": [{
"Template": `respond-to-rai-medicaid-spa-cms_${stage}`,
"ToAddresses": ["osgEmail", "cpoc", "srt"],
Expand Down Expand Up @@ -56,7 +93,7 @@ const getBundleFromEvent = (configKey, stage) => {
};
case "new-submission-chip-spa":
return {
"dataList": ["osgEmail", "chipInbox", "chipCcList", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysDateNice", "additionalInformation", "formattedFileList", "textFileList"],
"dataList": ["osgEmail", "chipInbox", "chipCcList", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysDate", "additionalInformation", "formattedFileList", "textFileList"],
"emailCommands": [{
"Template": `new-submission-chip-spa-cms_${stage}`,
"ToAddresses": ["osgEmail", "chipInbox"],
Expand All @@ -71,7 +108,7 @@ const getBundleFromEvent = (configKey, stage) => {
case "respond-to-rai-chip-spa":
return {
"lookupList": ["osInsights"],
"dataList": ["osgEmail", "chipInbox", "chipCcList", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysLookupNice", "additionalInformation", "formattedFileList", "textFileList"],
"dataList": ["osgEmail", "chipInbox", "chipCcList", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysDate", "additionalInformation", "formattedFileList", "textFileList"],
"emailCommands": [{
"Template": `respond-to-rai-chip-spa-cms_${stage}`,
"ToAddresses": ["osgEmail", "chipInbox"],
Expand All @@ -98,6 +135,20 @@ const getBundleFromEvent = (configKey, stage) => {
},
]
};
case "withdraw-package-chip-spa":
return {
"lookupList": ["osInsights","cognito"],
"dataList": ["chipInbox", "cpoc", "srt", "chipCcList", "allState", "id", "territory", "submitterName", "submitterEmail", "additionalInformation"],
"emailCommands": [{
"Template": `withdraw-package-chip-spa-cms_${stage}`,
"ToAddresses": ["chipInbox", "cpoc", "srt"],
"CcAddresses": ["chipCcList"]
},
{
"Template": `withdraw-package-chip-spa-state_${stage}`,
"ToAddresses": ["allState"],
}],
};
default:
return { message: `no bundle defined for configKey ${configKey}`};
}
Expand All @@ -106,9 +157,10 @@ const getBundleFromEvent = (configKey, stage) => {
const buildKeyFromRecord = (record) => {
if (record?.origin !== "micro" || !record?.authority) return;

const actionType = record?.actionType ? record.actionType : "new-submission";
const actionType = record?.actionType ?? "new-submission";

const authority = record.authority.toLowerCase().replace(/\s+/g, "-");
//replace spaces from authority with hyphens and remove parentheses
const authority = record.authority.toLowerCase().replace(/\s+/g, "-").replace(/[()]/g, "");

return `${actionType}-${authority}`;
};
Expand Down
15 changes: 7 additions & 8 deletions src/services/email/libs/data-lib.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,11 @@ const formatDateFromTimestamp = (timestamp) => {

};

function formatNinetyDaysDate(emailBundle) {
if (!emailBundle?.notificationMetadata?.submissionDate) return "Pending";
return DateTime.fromMillis(emailBundle.notificationMetadata.submissionDate)
function formatNinetyDaysDate(data, lookupValues) {
if (lookupValues?.ninetyDaysDate)
return formatDateFromTimestamp(lookupValues?.ninetyDaysDate);
if (!data?.notificationMetadata?.submissionDate) return "Pending";
return DateTime.fromMillis(data.notificationMetadata.submissionDate)
.plus({ days: 90 })
.toFormat("DDDD '@ 11:59pm ET'");

Expand All @@ -57,9 +59,6 @@ export const buildEmailData = async (bundle, data) => {
case "proposedEffectiveDateNice":
returnObject["proposedEffectiveDateNice"] = formatDateFromTimestamp(data?.notificationMetadata?.proposedEffectiveDate);
break;
case "ninetyDaysLookup":
returnObject["ninetyDaysDateNice"] = formatDateFromTimestamp(lookupValues?.ninetyDaysDateLookup);
break;
case "applicationEndpoint":
returnObject["applicationEndpoint"] = process.env.applicationEndpoint;
break;
Expand All @@ -69,8 +68,8 @@ export const buildEmailData = async (bundle, data) => {
case "textFileList":
returnObject["textFileList"] = formatAttachments("text", data.attachments);
break;
case "ninetyDaysDateNice":
returnObject["ninetyDaysDateNice"] = formatNinetyDaysDate(data);
case "ninetyDaysDate":
returnObject["ninetyDaysDate"] = formatNinetyDaysDate(data, lookupValues);
break;
case "submitter":
returnObject["submitter"] = (data.submitterEmail === "[email protected]") ? "\"George's Substitute\" <[email protected]>" : `"${data.submitterName}" <${data.submitterEmail}>`;
Expand Down
2 changes: 1 addition & 1 deletion src/services/email/libs/os-lib.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const getOsInsightData = async (id) => {
console.log("Insights Item: ", JSON.stringify(osInsightsItem, null, 4));
returnData.cpoc = osInsightsItem?._source?.LEAD_ANALYST ? buildEmailsToSend(osInsightsItem?._source?.LEAD_ANALYST, osInsightsItem?._source?.STATE_PLAN.LEAD_ANALYST_ID) : "'CPOC Substitute' <[email protected]>";
returnData.srt = osInsightsItem?._source?.ACTION_OFFICERS ? buildEmailsToSend(osInsightsItem?._source?.ACTION_OFFICERS) : "'SRT Substitute' <[email protected]>";
returnData.ninetyDaysLookup = osInsightsItem?._source?.STATE_PLAN.ALERT_90_DAYS_DATE;
returnData.ninetyDaysDate = osInsightsItem?._source?.STATE_PLAN.ALERT_90_DAYS_DATE;

// const osChangeLogItem = await os.search(process.env.osDomain, "changelog", {
// from: 0,
Expand Down
Loading

0 comments on commit 33f513d

Please sign in to comment.