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
  • Loading branch information
bseeger committed May 10, 2024
1 parent 69a5a23 commit d208142
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.get("isMinimumApplication").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

0 comments on commit d208142

Please sign in to comment.