Skip to content

Commit

Permalink
Add back in expedited flag to PDF and tweak some fields.
Browse files Browse the repository at this point in the history
Adds 'isMinimumApplication' field to track if an app used the minimum
flow
  • Loading branch information
bseeger committed May 10, 2024
1 parent 69a5a23 commit b01fb8f
Show file tree
Hide file tree
Showing 11 changed files with 263 additions and 173 deletions.
4 changes: 2 additions & 2 deletions src/main/java/org/mdbenefits/app/inputs/MdBenefitsFlow.java
Original file line number Diff line number Diff line change
Expand Up @@ -333,8 +333,8 @@ public class MdBenefitsFlow extends FlowInputs {
// Expedited Snap Start
private String isApplyingForExpeditedSnap;

// Minimum App flow
private String usedMinimumApplicationFlow;
// Minimum App marker
private String isMinimumApplication;

// Household Money on Hand
private String householdMoneyOnHandLessThan100;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,19 @@ public Map<String, SubmissionField> prepareSubmissionFields(Submission submissio
results.put("applicantSex", new SingleField("applicantSex", "", null));
}


prepareCitizenshipStatus(inputData, results);

prepareRaceEthnicityInfo(inputData, results);
}

// Is this a minimum application? If so, the applicant is applying, but didn't go through
// many pages, including the one to indicate if they are applying. But the assumption with a minimum
// app is that they are applying
if (inputData.getOrDefault("isMinimumApplication", "false").toString().equalsIgnoreCase("true")) {
results.put("isApplicantApplying",
new SingleField("isApplicantApplying", "Yes", null));
}

results.put("applicantMailingAddressFull",
new SingleField("applicantMailingAddressFull", formatMailingAddress(inputData), null));

Expand All @@ -65,14 +72,14 @@ public String formatMailingAddress(Map<String, Object> inputData) {
mailingAddressFull = "";
return mailingAddressFull;
}

if (inputData.getOrDefault("useSuggestedAddress", "false").equals("true")) {
mailingAddressFull = String.format("%s, %s, %s %s",
inputData.get("mailingAddressStreetAddress1_validated"),
inputData.get("mailingAddressCity_validated"),
inputData.get("mailingAddressState_validated"),
inputData.get("mailingAddressZipCode_validated"));

return mailingAddressFull;
}

Expand All @@ -96,7 +103,7 @@ public String formatMailingAddress(Map<String, Object> inputData) {
}

private void prepareCitizenshipStatus(Map<String, Object> inputData, Map<String, SubmissionField> results) {
String citizenshipStatus = (String) inputData.getOrDefault("applicantCitizenshipStatus","");
String citizenshipStatus = (String) inputData.getOrDefault("applicantCitizenshipStatus", "");

if (!citizenshipStatus.isBlank()) {
var status = citizenshipStatus.equals(CitizenshipStatus.US_CITIZEN.name()) ? "Yes" : "No";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,23 @@ public class HouseholdPregnancyAndDisabilityPreparer implements SubmissionFieldP
public Map<String, SubmissionField> prepareSubmissionFields(Submission submission, PdfMap pdfMap) {
Map<String, SubmissionField> results = new HashMap<>();

var inputData = submission.getInputData();

if (inputData.getOrDefault("isMinimumApplication", "false").toString().equalsIgnoreCase("true")) {
// they used the minimum app flow, don't assert anything about pregnancy / disability
// since we didn't collect it
return results;
}

ArrayList<String> householdMembersPregnant = new ArrayList<String>();
ArrayList<String> householdMembersWithDisability = new ArrayList<String>();

var inputData = submission.getInputData();
// only looking for a yes here, so it doesn't matter if we default to "No" in the case of this being unset
if (inputData.getOrDefault("isApplicantPregnant", "No").toString().equalsIgnoreCase("Yes")) {
householdMembersPregnant.add(SubmissionUtilities.applicantFullNameFormatted(submission));
}

// only looking for a yes here, so it doesn't matter if we default to "No" in the case of this being unset
if (inputData.getOrDefault("applicantHasDisability", "No").toString().equalsIgnoreCase("Yes")) {
householdMembersWithDisability.add(SubmissionUtilities.applicantFullNameFormatted(submission));
}
Expand All @@ -42,27 +51,27 @@ public Map<String, SubmissionField> prepareSubmissionFields(Submission submissio
}

results.put("householdHasDisability",
new SingleField("householdHasDisability", !householdMembersWithDisability.isEmpty() ? "Yes" : "No", null));
new SingleField("householdHasDisability", !householdMembersWithDisability.isEmpty() ? "Yes" : "No", null));
results.put("householdHasPregnancy",
new SingleField("householdHasPregnancy", !householdMembersPregnant.isEmpty() ? "Yes" : "No", null));
new SingleField("householdHasPregnancy", !householdMembersPregnant.isEmpty() ? "Yes" : "No", null));

if (!householdMembersWithDisability.isEmpty()) {
results.put("householdHasDisabilitySeeCover",
new SingleField("householdHasDisabilitySeeCover", "See cover page", null));
new SingleField("householdHasDisabilitySeeCover", "See cover page", null));
for (int i = 0; (i < 5 && i < householdMembersWithDisability.size()); i++) {
var index = i + 1;
results.put("householdDisabilityName" + index,
new SingleField("householdDisabilityName" + index, householdMembersWithDisability.get(i), null));
new SingleField("householdDisabilityName" + index, householdMembersWithDisability.get(i), null));
}
}

if (!householdMembersPregnant.isEmpty()) {
results.put("householdHasPregnancySeeCover",
new SingleField("householdHasPregnancySeeCover", "See cover page", null));
new SingleField("householdHasPregnancySeeCover", "See cover page", null));
for (int i = 0; (i < 5 && i < householdMembersPregnant.size()); i++) {
var index = i + 1;
results.put("householdPregnancyName" + index,
new SingleField("householdPregnancyName" + index, householdMembersPregnant.get(i), null));
new SingleField("householdPregnancyName" + index, householdMembersPregnant.get(i), null));
}
}

Expand All @@ -72,7 +81,7 @@ public Map<String, SubmissionField> prepareSubmissionFields(Submission submissio

private List<String> householdMembersWithCondition(List<Map<String, Object>> householdSubflow, String fieldName) {
return householdSubflow.stream()
.filter(hhMember -> "yes".equalsIgnoreCase(String.valueOf(hhMember.get(fieldName))))
.map(hhMember -> SubmissionUtilities.householdMemberFullNameFormatted(hhMember)).toList();
.filter(hhMember -> "yes".equalsIgnoreCase(String.valueOf(hhMember.get(fieldName))))
.map(hhMember -> SubmissionUtilities.householdMemberFullNameFormatted(hhMember)).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,30 +17,35 @@
@Slf4j
@Component
public class CheckExpeditedSnapEligibility implements Action {

@Override
public void run(Submission submission) {
Map<String, Object> inputData = submission.getInputData();
if (inputData.getOrDefault("isApplyingForExpeditedSnap", "false").toString().equals("true")) {

BigDecimal moneyOnHandAmount = convertToBigDecimal(
inputData.getOrDefault("expeditedMoneyOnHandAmount", "0").toString());
inputData.getOrDefault("expeditedMoneyOnHandAmount", "0").toString());
BigDecimal householdIncomeAmount = convertToBigDecimal(
inputData.getOrDefault("householdIncomeLast30Days", "0").toString());
inputData.getOrDefault("householdIncomeLast30Days", "0").toString());

boolean isMigrantOrSeasonalFarmWorker = inputData.getOrDefault("migrantOrSeasonalFarmWorkerInd", "false").toString().equals("true");
boolean isBelowMoneyOnHandThreshhold = inputData.getOrDefault("householdMoneyOnHandLessThan100", "false").toString().equals("true");
boolean isMigrantOrSeasonalFarmWorker = inputData.getOrDefault("migrantOrSeasonalFarmWorkerInd", "false").toString()
.equals("true");
boolean isBelowMoneyOnHandThreshhold = inputData.getOrDefault("householdMoneyOnHandLessThan100", "false").toString()
.equals("true");
boolean isBelowIncomeThreshhold = inputData.getOrDefault("incomeLessThan150", "false").toString().equals("true");

boolean isEligibleByIncomeAndCashOnHandLessThanExpenses =
householdIncomeAmount.add(moneyOnHandAmount).compareTo(calculateUtilitiesExpenses(inputData)) <= 0;
householdIncomeAmount.add(moneyOnHandAmount).compareTo(calculateUtilitiesExpenses(inputData)) <= 0;

boolean isEligibleForExpeditedSnap =
(isBelowMoneyOnHandThreshhold && isBelowIncomeThreshhold) || (
isMigrantOrSeasonalFarmWorker && isBelowMoneyOnHandThreshhold)
|| calculateUtilitiesExpenses(inputData).compareTo(BigDecimal.ZERO) > 0 && isEligibleByIncomeAndCashOnHandLessThanExpenses;
(isBelowMoneyOnHandThreshhold && isBelowIncomeThreshhold) || (
isMigrantOrSeasonalFarmWorker && isBelowMoneyOnHandThreshhold)
|| calculateUtilitiesExpenses(inputData).compareTo(BigDecimal.ZERO) > 0
&& isEligibleByIncomeAndCashOnHandLessThanExpenses;
submission.getInputData().put("isEligibleForExpeditedSnap", String.valueOf(isEligibleForExpeditedSnap));
}
}

private BigDecimal calculateUtilitiesExpenses(Map<String, Object> inputData) {
List<String> allExpenses = new java.util.ArrayList<>();
if (!isNoneOfAboveSelection(inputData.get("householdHomeExpenses[]"))) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.mdbenefits.app.submission.actions;

import formflow.library.config.submission.Action;
import formflow.library.data.FormSubmission;
import formflow.library.data.Submission;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
* Action that will unset the minimum flow flag, if it was set.
*/
@Component
@Slf4j
public class UnsetMinimumFlowFlag implements Action {

private static final String MINIMAL_FLOW_FLAG = "isMinimumApplication";

@Override
public void run(FormSubmission formSubmission, Submission submission) {
formSubmission.getFormData().put(MINIMAL_FLOW_FLAG, "false");
}
}
2 changes: 2 additions & 0 deletions src/main/resources/flows-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ flow:
nextScreens:
- name: applicantApplying
applicantApplying:
# if they come through here, it's not a minimum flow, so clear the flag
onPostAction: UnsetMinimumFlowFlag
nextScreens:
- name: applicantCitizenship
condition: IsApplicantApplyingForSelf
Expand Down
Binary file modified src/main/resources/pdfs/9701.pdf
Binary file not shown.
153 changes: 76 additions & 77 deletions src/main/resources/templates/mdBenefitsFlow/contactInfoReview.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,92 +11,91 @@
<th:block th:replace="~{fragments/icons :: docWithMagnifyingGlass}"></th:block>
<th:block
th:replace="~{fragments/cardHeader :: cardHeader(header=#{review-contact-info.header})}"/>
<th:block
th:replace="~{fragments/form :: form(action=${formAction}, content=~{::reviewContent})}">
<th:block th:ref="reviewContent">
<div class="form-card__content">
<b th:text="#{review-contact-info.name}"></b>
<div class="spacing-above-15">
<p th:text="${fieldData.firstName} + ' ' + ${fieldData.lastName}"></p>
</div>
<hr class="spacing-below-35 spacing-above-10">
<b th:text="#{review-contact-info.birthdate}"></b>
<div class="spacing-above-10">
<p th:text="${T(org.mdbenefits.app.utils.SubmissionUtilities).getFormattedBirthdate(fieldData)}"></p>
</div>
<b th:text="#{review-contact-info.mailing-address}"></b>
<div class="spacing-above-10"
th:if="${fieldData.getOrDefault('useSuggestedAddress', 'false').equals('false')}">
<th:block th:text="${fieldData.mailingAddressStreetAddress1}"></th:block>
<br>
<div
th:if="${fieldData.mailingAddressStreetAddress2 != null && !fieldData.mailingAddressStreetAddress2.trim().isEmpty()}">
<th:block th:text="${fieldData.mailingAddressStreetAddress2}"></th:block>
<br>
</div>
<th:block
th:text="${fieldData.mailingAddressCity} + ', ' + ${fieldData.mailingAddressState}"></th:block>
<br>
<th:block th:text="${fieldData.mailingAddressZipCode}"></th:block>
<br>
</div>
<div class="spacing-above-15"
th:if="${fieldData.getOrDefault('useSuggestedAddress', 'false').equals('true')}">
<th:block th:text="${fieldData.mailingAddressStreetAddress1_validated}"></th:block>
<br>
<th:block
th:text="${fieldData.mailingAddressCity_validated} + ', ' + ${fieldData.mailingAddressState_validated}"></th:block>
<br>
<th:block th:text="${fieldData.mailingAddressZipCode_validated}"></th:block>
<th:block th:ref="reviewContent">
<div class="form-card__content">
<b th:text="#{review-contact-info.name}"></b>
<div class="spacing-above-15">
<p th:text="${fieldData.firstName} + ' ' + ${fieldData.lastName}"></p>
</div>
<hr class="spacing-below-35 spacing-above-10">
<b th:text="#{review-contact-info.birthdate}"></b>
<div class="spacing-above-10">
<p th:text="${T(org.mdbenefits.app.utils.SubmissionUtilities).getFormattedBirthdate(fieldData)}"></p>
</div>
<b th:text="#{review-contact-info.mailing-address}"></b>
<div class="spacing-above-10"
th:if="${fieldData.getOrDefault('useSuggestedAddress', 'false').equals('false')}">
<th:block th:text="${fieldData.mailingAddressStreetAddress1}"></th:block>
<br>
<div
th:if="${fieldData.mailingAddressStreetAddress2 != null && !fieldData.mailingAddressStreetAddress2.trim().isEmpty()}">
<th:block th:text="${fieldData.mailingAddressStreetAddress2}"></th:block>
<br>
</div>
<hr class="spacing-below-25 spacing-above-25">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.cell-phone-number}"></b>
<p class="spacing-below-5 spacing-above-10"
th:text="${fieldData.getOrDefault('cellPhoneNumber', '')}"></p>
</div>

<hr class="spacing-below-35 spacing-above-35">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.get-text-messages}"></b>
<div class="spacing-above-10">
<p th:text=
"${fieldData.textingCellNumberIsOkay.equals('true') ? #messages.msg('general.inputs.yes') : #messages.msg('general.inputs.no')}"></p>
</div>
</div>
<th:block
th:text="${fieldData.mailingAddressCity} + ', ' + ${fieldData.mailingAddressState}"></th:block>
<br>
<th:block th:text="${fieldData.mailingAddressZipCode}"></th:block>
<br>
</div>
<div class="spacing-above-15"
th:if="${fieldData.getOrDefault('useSuggestedAddress', 'false').equals('true')}">
<th:block th:text="${fieldData.mailingAddressStreetAddress1_validated}"></th:block>
<br>
<th:block
th:text="${fieldData.mailingAddressCity_validated} + ', ' + ${fieldData.mailingAddressState_validated}"></th:block>
<br>
<th:block th:text="${fieldData.mailingAddressZipCode_validated}"></th:block>
<br>
</div>
<hr class="spacing-below-25 spacing-above-25">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.cell-phone-number}"></b>
<p class="spacing-below-5 spacing-above-10"
th:text="${fieldData.getOrDefault('cellPhoneNumber', '')}"></p>
</div>

<hr class="spacing-below-35 spacing-above-35">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.home-phone-number}"></b>
<p class="spacing-below-5 spacing-above-10"
th:text="${fieldData.getOrDefault('homePhoneNumber', '--')}"></p>
<hr class="spacing-below-35 spacing-above-35">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.get-text-messages}"></b>
<div class="spacing-above-10">
<p th:text=
"${fieldData.textingCellNumberIsOkay.equals('true') ? #messages.msg('general.inputs.yes') : #messages.msg('general.inputs.no')}"></p>
</div>
</div>

<hr class="spacing-below-35 spacing-above-35">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.work-phone-number}"></b>
<p class="spacing-below-5 spacing-above-10"
th:text="${fieldData.getOrDefault('workPhoneNumber', '--')}"></p>
</div>
<hr class="spacing-below-35 spacing-above-35">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.home-phone-number}"></b>
<p class="spacing-below-5 spacing-above-10"
th:text="${fieldData.getOrDefault('homePhoneNumber', '--')}"></p>
</div>

<hr class="spacing-below-35 spacing-above-35">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.email-address}"></b>
<p class="spacing-below-5 spacing-above-10"
th:text="${fieldData.getOrDefault('emailAddress', '--')}"></p>
</div>
<hr class="spacing-below-35 spacing-above-35">
<div class="spacing-above-15">
<b th:text="#{review-contact-info.work-phone-number}"></b>
<p class="spacing-below-5 spacing-above-10"
th:text="${fieldData.getOrDefault('workPhoneNumber', '--')}"></p>
</div>

<hr class="spacing-below-35 spacing-above-35">
<div class="form-card__footer">
<th:block th:replace="~{fragments/inputs/submitButton :: submitButton(
text=#{review-contact-info.this-looks-correct})}"/>
<a class="button button--secondary" th:text="#{review-contact-info.edit}"
th:href="'/flow/' + ${flow} + '/personalInfo'"></a>
<div><a th:text="#{review-contact-info.submit-incomplete}"
th:href="'/flow/' + ${flow} + '/expeditedSnapStart'"></a></div>
<div class="spacing-above-15">
<b th:text="#{review-contact-info.email-address}"></b>
<p class="spacing-below-5 spacing-above-10"
th:text="${fieldData.getOrDefault('emailAddress', '--')}"></p>
</div>
</th:block>
</div>
<hr class="spacing-below-35 spacing-above-35">
<div class="form-card__footer">
<th:block th:replace="~{fragments/continueButton :: continue(
text=#{review-contact-info.this-looks-correct})}"/>

<a class="button button--secondary" th:text="#{review-contact-info.edit}"
th:href="'/flow/' + ${flow} + '/personalInfo'"></a>

<div><a th:text="#{review-contact-info.submit-incomplete}"
th:href="'/flow/' + ${flow} + '/expeditedSnapStart'"></a></div>
</div>
</th:block>
</main>
</div>
Expand Down
Loading

0 comments on commit b01fb8f

Please sign in to comment.