Skip to content

Commit

Permalink
[CCAP-643] family email provider agrees to care (#1152)
Browse files Browse the repository at this point in the history
  • Loading branch information
enyia21 authored Feb 14, 2025
1 parent 11d79a0 commit 622388a
Show file tree
Hide file tree
Showing 13 changed files with 213 additions and 26 deletions.
2 changes: 1 addition & 1 deletion src/main/java/org/ilgcc/app/email/EmailConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public class EmailConstants {
@Getter
public enum EmailType {
FAMILY_CONFIRMATION_EMAIL("Family Confirmation Email"), FAMILY_CONFIRMATION_EMAIL_NO_PROVIDER(
"No Provider Family Confirmation Email");
"No Provider Family Confirmation Email"), PROVIDER_AGREES_TO_CARE_FAMILY_EMAIL("Provider Agrees to Care Family Email");

private final String description;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package org.ilgcc.app.submission.actions;

import formflow.library.config.submission.Action;
import formflow.library.data.FormSubmission;
import formflow.library.data.Submission;
import formflow.library.data.SubmissionRepositoryService;
import jakarta.servlet.http.HttpSession;
import java.util.Optional;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -22,9 +20,10 @@ public class FindApplicationData implements Action {
@Override
public void run(Submission providerSubmission) {
Optional<UUID> clientID = ProviderSubmissionUtilities.getClientId(providerSubmission);
if(clientID != null && clientID.isPresent()){
if(clientID.isPresent()){
Optional<Submission> clientSubmission = submissionRepositoryService.findById(clientID.get());
providerSubmission.getInputData().put("clientResponse", ProviderSubmissionUtilities.getApplicantSubmissionForProviderResponse(clientSubmission));

providerSubmission.getInputData().put("clientResponseChildren", ProviderSubmissionUtilities.getChildrenDataForProviderResponse(clientSubmission.get()));
submissionRepositoryService.save(providerSubmission);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class FormatChildrenWhoNeedCareNames implements Action {
@Override
public void run(Submission providerSubmission) {
Optional<UUID> clientID = ProviderSubmissionUtilities.getClientId(providerSubmission);
if (clientID != null && clientID.isPresent()) {
if (clientID.isPresent()) {
Submission clientSubmission = submissionRepositoryService.findById(clientID.get()).get();
String formattedChildrenNames = ProviderSubmissionUtilities.formatChildNamesAsCommaSeperatedList(clientSubmission);
providerSubmission.getInputData().put("childrenWhoNeedCareNames", formattedChildrenNames);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public void run(Submission familySubmission) {
String subject = messageSource.getMessage("email.family-confirmation.subject", new Object[]{familySubmissionShortCode},
locale);

String senderName = messageSource.getMessage("email.sender-name", null, locale);
String senderName = messageSource.getMessage("email.general.sender-name", null, locale);

sendEmailJob.enqueueSendEmailJob(familyEmail, senderName, subject,
EmailConstants.EmailType.FAMILY_CONFIRMATION_EMAIL.getDescription(),
Expand All @@ -72,8 +72,8 @@ private Content createFamilyConfirmationEmailBody(Submission familySubmission, S
locale);
String p6 = messageSource.getMessage("email.family-confirmation.p6", null, locale);
String p7 = messageSource.getMessage("email.family-confirmation.p7", null, locale);
String p8 = messageSource.getMessage("email.family-confirmation.p8", null, locale);
String p9 = messageSource.getMessage("email.footer", null, locale);
String p8 = messageSource.getMessage("email.general.footer.automated-response", null, locale);
String p9 = messageSource.getMessage("email.general.footer.cfa", null, locale);
return new Content("text/html", p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package org.ilgcc.app.submission.actions;

import com.sendgrid.helpers.mail.objects.Content;
import formflow.library.config.submission.Action;
import formflow.library.data.FormSubmission;
import formflow.library.data.Submission;
import formflow.library.data.SubmissionRepositoryService;
import java.util.Locale;
import java.util.Optional;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.ilgcc.app.email.EmailConstants;
import org.ilgcc.app.utils.ProviderSubmissionUtilities;
import org.ilgcc.jobs.SendEmailJob;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class SendProviderAgreesToCareFamilyConfirmationEmail implements Action {

private final SendEmailJob sendEmailJob;
private final MessageSource messageSource;
private final SubmissionRepositoryService submissionRepositoryService;

public SendProviderAgreesToCareFamilyConfirmationEmail(SendEmailJob sendEmailJob, MessageSource messageSource, SubmissionRepositoryService submissionRepositoryService) {
this.sendEmailJob = sendEmailJob;
this.messageSource = messageSource;
this.submissionRepositoryService = submissionRepositoryService;
}

@Override
public void run(FormSubmission formSubmission, Submission providerSubmission) {
//Check if provider agrees to care
String providerAgreesToCare = (String) formSubmission.getFormData().getOrDefault("providerResponseAgreeToCare", "false");
if (providerAgreesToCare.equals("false")){
return;
}
//Check that the provider response to the family email was sent.
String providerResponseFamilyConfirmationEmailSent = (String) providerSubmission.getInputData()
.getOrDefault("providerResponseFamilyConfirmationEmailSent", "false");
if (providerResponseFamilyConfirmationEmailSent.equals("true")) {
log.warn("Provider agrees to care confirmation email has already been sent for submission with ID: {}", providerSubmission.getId());
return;
}
Optional<UUID> familySubmissionId = ProviderSubmissionUtilities.getClientId(providerSubmission);
if (familySubmissionId.isEmpty()) {
log.warn("No family submission is associated with the provider submission with ID: {}", providerSubmission.getId());
return;
}
Optional<Submission> familySubmissionOptional = submissionRepositoryService.findById(familySubmissionId.get());

if (familySubmissionOptional.isEmpty()) {
log.warn("No family submission is associated with the familSubmissionID: {}", providerSubmission.getId());
return;
}
Submission familySubmission = familySubmissionOptional.get();
String familyEmailAddress = (String) familySubmission.getInputData().getOrDefault("parentContactEmail", "");
if (familyEmailAddress.isEmpty()) {
log.warn("No parentContactEmail was found to send confirmation email about the provider agreeing to care for the provider submission with ID: {}",
providerSubmission.getId());
return;
}

String familySubmissionConfirmationId = familySubmission.getShortCode();

Locale locale =
providerSubmission.getInputData().getOrDefault("languageRead", "English").equals("Spanish") ? Locale.forLanguageTag(
"es") : Locale.ENGLISH;

String senderName = messageSource.getMessage("email.general.sender-name", null, locale);

String subject = messageSource.getMessage("email.response-email-for-family.provider-agrees.subject", null, locale);
Content body = createProviderResponseConfirmationEmailBody(providerSubmission, familySubmission, familySubmissionConfirmationId, locale);

sendEmailJob.enqueueSendEmailJob(familyEmailAddress, senderName, subject,
EmailConstants.EmailType.PROVIDER_AGREES_TO_CARE_FAMILY_EMAIL.getDescription(),
body, providerSubmission);
providerSubmission.getInputData().put("providerResponseFamilyConfirmationEmailSent", "true");
submissionRepositoryService.save(providerSubmission);
}

private Content createProviderResponseConfirmationEmailBody(Submission providerSubmission, Submission familySubmission,String confirmationCode, Locale locale) {
String providerName = ProviderSubmissionUtilities.getProviderResponseName(providerSubmission);
String ccrrName = familySubmission.getInputData().get("ccrrName").toString();
String ccrrPhoneNumber = (String) familySubmission.getInputData().getOrDefault("ccrrPhoneNumber", "");

String p1 = messageSource.getMessage("email.response-email-for-family.provider-agrees.p1", null, locale);
String p2 = providerName.isBlank() ? messageSource.getMessage("email.response-email-for-family.provider-agrees.p2-no-provider-name", new Object[]{ccrrName}, locale) : messageSource.getMessage("email.response-email-for-family.provider-agrees.p2-has-provider-name", new Object[]{providerName, ccrrName}, locale);
String p3 = messageSource.getMessage("email.response-email-for-family.provider-agrees.p3",
new Object[]{
ProviderSubmissionUtilities.getChildrenInitialsFromApplication(familySubmission),
ProviderSubmissionUtilities.getCCAPStartDateFromProviderOrFamilyChildcareStartDate(familySubmission, providerSubmission)
}, locale);
String p4 = messageSource.getMessage("email.response-email-for-family.provider-agrees.p4", new Object[]{confirmationCode}, locale);
String p5 = messageSource.getMessage("email.response-email-for-family.provider-agrees.p5", new Object[]{ccrrName, ccrrPhoneNumber}, locale);
String p6 = messageSource.getMessage("email.general.footer.automated-response", null, locale);
String p7 = messageSource.getMessage("email.general.footer.cfa", null, locale);
return new Content("text/html", p1 + p2 + p3 + p4 + p5 + p6 + p7);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public void run(Submission submission) {
final Optional<String> organizationId = applicationRouterService.getOrganizationIdByZipCode(unvalidatedZip);

if (organizationId.isPresent()) {
saveOrganizationIdAndName(submission, organizationId.get());
saveOrganizationIdAndNameAndPhoneNumber(submission, organizationId.get());
saveCountyFromZip(submission, unvalidatedZip);
return;
} else {
Expand All @@ -65,7 +65,7 @@ public void run(Submission submission) {

if (zipCode.isPresent()) {
Optional<String> organizationId = applicationRouterService.getOrganizationIdByZipCode(zipCode.get().getValue());
saveOrganizationIdAndName(submission, organizationId.get());
saveOrganizationIdAndNameAndPhoneNumber(submission, organizationId.get());
saveCounty(submission, applicationCounty);
return;
}
Expand All @@ -75,7 +75,7 @@ public void run(Submission submission) {
final String applicationZipCode = (String) submission.getInputData().get(APPLICATION_ZIPCODE_INPUT_NAME);
final Optional<String> organizationId = applicationRouterService.getOrganizationIdByZipCode(applicationZipCode);
if (organizationId.isPresent()) {
saveOrganizationIdAndName(submission, organizationId.get());
saveOrganizationIdAndNameAndPhoneNumber(submission, organizationId.get());
saveCountyFromZip(submission, applicationZipCode);
return;
}
Expand All @@ -84,9 +84,10 @@ public void run(Submission submission) {
log.info("Could not assign a caseload number to this application");
}

private void saveOrganizationIdAndName(Submission submission, String organizationId) {
private void saveOrganizationIdAndNameAndPhoneNumber(Submission submission, String organizationId) {
submission.getInputData().put(ORGANIZATION_ID_INPUT, organizationId);
submission.getInputData().put("ccrrName", CCRR.findCCRRNameByOrganizationalId(organizationId));
submission.getInputData().put("ccrrPhoneNumber", CCRR.findCCRRPhoneNumberByOrganizationId(organizationId));
submissionRepositoryService.save(submission);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,12 @@ public class SetProviderCareStartDate implements Action {
@Override
public void run(Submission providerSubmission) {
Optional<UUID> clientID = ProviderSubmissionUtilities.getClientId(providerSubmission);
if (clientID != null && clientID.isPresent()) {
if (clientID.isPresent()) {
Optional<Submission> clientSubmission = submissionRepositoryService.findById(clientID.get());
if (clientSubmission.isEmpty()) {
log.warn("No client submission found for this id: {}", clientID.get());
return;
}
Optional<LocalDate> earliestDate = getEarliestChildCCAPDate(clientSubmission.get());
if(earliestDate.isPresent()){
providerSubmission.getInputData().put("providerCareStartDay", earliestDate.get().getDayOfMonth());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public UploadProviderSubmissionToS3(PdfService pdfService, CloudFileRepository c
@Override
public void run(Submission providerSubmission) {
var clientId = ProviderSubmissionUtilities.getClientId(providerSubmission);
if (clientId != null && clientId.isPresent()) {
if (clientId.isPresent()) {
Optional<Submission> familySubmissionOptional = submissionRepositoryService.findById(clientId.get());
if (familySubmissionOptional.isPresent()) {
log.info("Provider submitted response for client ID {}, enqueuing transfer of documents.", clientId.get());
Expand Down
15 changes: 11 additions & 4 deletions src/main/java/org/ilgcc/app/submission/router/CCRR.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@ public class CCRR {
protected final String SDA;
protected final String caseloadCode;
protected final String slug;
protected final String phoneNumber;


public static final CCRR FOUR_C = new CCRR("4C: Community Coordinated Child Care", "56522729391679", "2", "BB",
"4c-ccap-apps");
public static final CCRR PROJECT_CHILD = new CCRR("Project CHILD", "59522729391675", "15", "QQ", "project-child-ccap-apps");
"4c-ccap-apps", "(815) 758-8149 x225");
public static final CCRR PROJECT_CHILD = new CCRR("Project CHILD", "59522729391675", "15", "QQ", "project-child-ccap-apps", "(618) 244-2210");
public static final CCRR ILLINOIS_ACTION = new CCRR("Illinois Action for Children", "47522729391670", "6", "GG",
"illinois-action-for-children-ccap-apps");
"illinois-action-for-children-ccap-apps", "(312) 823-1100");

private static final Map<String, CCRR> CCRR_MAP_BY_CASELOAD = new HashMap<>();
private static final Map<String, CCRR> CCRR_MAP_BY_ORGANIZATIONAL_ID = new HashMap<>();
Expand All @@ -37,12 +38,13 @@ public class CCRR {
}
}

public CCRR(String name, String organizationId, String SDA, String caseloadCode, String slug) {
public CCRR(String name, String organizationId, String SDA, String caseloadCode, String slug, String phoneNumber) {
this.name = name;
this.organizationId = organizationId;
this.SDA = SDA;
this.caseloadCode = caseloadCode;
this.slug = slug;
this.phoneNumber = phoneNumber;
}

private static List<CCRR> values() {
Expand Down Expand Up @@ -73,4 +75,9 @@ public static String getCCRRSlugByOrganizationId(String organizationId) {
final Optional<CCRR> ccrr = findCCRRByOrganizationalId(organizationId);
return ccrr.isPresent() ? ccrr.get().slug : "";
}

public static String findCCRRPhoneNumberByOrganizationId(String organizationId) {
final Optional<CCRR> ccrr = findCCRRByOrganizationalId(organizationId);
return ccrr.isPresent() ? ccrr.get().phoneNumber : "";
}
}
35 changes: 32 additions & 3 deletions src/main/java/org/ilgcc/app/utils/DateUtilities.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatter;

public class DateUtilities {

private final static String FULL_DATE_INPUT = "MM/dd/yyyy";
private final static String FULL_DATE_FORMAT_OUTPUT_PATTER = "MMMM dd, yyyy";
private final static String MONTH_YEAR_INPUT = "MM/yyyy";
private final static String MONTH_YEAR_OUTPUT_PATTERN = "MMMM yyyy";
public static String getFormattedDateFromMonthDateYearInputs(String prefix, Map<String, Object> data) {
String month = (String) data.get(prefix + "Month");
String day = (String) data.get(prefix + "Day");
Expand All @@ -36,7 +39,7 @@ public static String formatDateStringFromMonthDayYear(String month, String day,

public static boolean isDateInvalid(String date) {
try {
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy");
org.joda.time.format.DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy");

dtf.parseDateTime(date);
} catch (Exception e) {
Expand Down Expand Up @@ -77,4 +80,30 @@ public static String getEarliestDate(String dateString1, String dateString2) {
Optional<LocalDate> childcareStartDate = DateUtilities.parseStringDate(dateString2);
return earliestDate.get().isBefore(childcareStartDate.get()) ? dateString1 : dateString2;
}

public static String convertDateToFullWordMonthPattern(String dateStr){
String fullDatePattern = "(\\d{1,2})/(\\d{1,2})/(\\d{4})";
Pattern fullDateRegex = Pattern.compile(fullDatePattern);
Matcher fullDateMatcher = fullDateRegex.matcher(dateStr);

if (fullDateMatcher.matches()) {
return replaceMonthIntegerWithWord(dateStr, FULL_DATE_INPUT, FULL_DATE_FORMAT_OUTPUT_PATTER);
}

String MonthYearDatePattern = "(\\d{1,2})/(\\d{4})";
Pattern MonthYearRegex = Pattern.compile(MonthYearDatePattern);
Matcher MonthYearMatcher = MonthYearRegex.matcher(dateStr);
if (MonthYearMatcher.matches()) {
return replaceMonthIntegerWithWord(dateStr, MONTH_YEAR_INPUT, MONTH_YEAR_OUTPUT_PATTERN);
}
return "";
}

public static String replaceMonthIntegerWithWord(String dateStr, String inputFormat, String outputFormat) {
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputFormat);
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputFormat);

LocalDate date = LocalDate.parse(dateStr, inputFormatter);
return date.format(outputFormatter);
}
}
Loading

0 comments on commit 622388a

Please sign in to comment.