Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CCAP-567] - Refactor address validation flow for parentHome, parentMailing, providerResponseService, providerMailing addresses #1236

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
2dc074f
[CCAP-567] - create a new Address Utility and move address logic into it
analoo Feb 28, 2025
68c2060
templatize address screen for parent-home-address
analoo Feb 28, 2025
2d8511a
rename parent-confirm-address to reduce ambiguity between two parent …
analoo Feb 28, 2025
24fa30f
[CCAP-567] - Implements confirm-parent-home-address screen
analoo Mar 1, 2025
17915d1
[CCAP-567] - Save Validated home address back to home address and ski…
analoo Mar 6, 2025
c783360
Rename unvalidated zip code to reflect that there is no such thing an…
analoo Mar 6, 2025
032de8e
Use new templates and logic for parent mailing address
analoo Mar 6, 2025
cb0c429
Remove Mailing address preparers which relied on there being two sour…
analoo Mar 6, 2025
e45bdfc
Update the parent-info-review screen to correctly reflect the address…
analoo Mar 6, 2025
cfcc96c
Scaffolds tests to be added in Address Journey
analoo Mar 6, 2025
98e0b78
Journey tests for address confirmation in family flow
analoo Mar 6, 2025
1e6fcca
[CCAP-567] - tests address validation
analoo Mar 6, 2025
592999e
Cleans up formatting and labels addressGroupInputPrefix accurately
analoo Mar 6, 2025
e91f1f6
Implement new mailing logic for providerResponseService and providerM…
analoo Mar 6, 2025
c971bb0
Fix failing tests in provider flow
analoo Mar 7, 2025
625aa9d
rename confirm-address to confirm-service-address
analoo Mar 7, 2025
1efb293
If mailing address matches service or home address, leave it out of a…
analoo Mar 7, 2025
a59b971
These tests feel like overkill
analoo Mar 7, 2025
ace14f0
Keeps only address happy path in journey test since address journey i…
analoo Mar 7, 2025
e8fbdfa
Respond to Marcs feedback about abstract classes, remove outdated tes…
analoo Mar 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/main/java/org/ilgcc/app/inputs/Gcc.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public class Gcc extends FlowInputs {
@NotBlank(message = "{errors.provide-zip}")
private String parentHomeZipCode;

private String organizationId;
private String useSuggestedParentHomeAddress;

// parent-mailing-address
private Boolean parentMailingAddressSameAsHomeAddress;
Expand All @@ -86,7 +86,7 @@ public class Gcc extends FlowInputs {
private String parentMailingState;
@NotBlank(message = "{errors.provide-zip}")
private String parentMailingZipCode;
private String useSuggestedParentAddress;
private String useSuggestedParentMailingAddress;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updates the input name to be in a standard format: https://docs.google.com/spreadsheets/d/1HTZKQnu7dtTPVPnetwvGoFxPzbxl0iSek7j1a9x5ci8/edit?gid=0#gid=0

This standard naming convention makes it possible to templatetize a lot of the address input and confirmation process.

private String parentConfirmSuggestedAddress;
// parent-comm-preference
@NotBlank(message = "{errors.invalid-communication-preference}")
Expand All @@ -98,6 +98,8 @@ public class Gcc extends FlowInputs {
@Email(regexp = RegexUtils.EMAIL_REGEX, message = "{errors.invalid-email}")
private String parentContactEmail;

private String organizationId;

// parent-has-a-partner
private String parentHasPartner;
private String parentHasQualifyingPartner;
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/org/ilgcc/app/pdf/ApplicationPreparer.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.ilgcc.app.pdf;

import static java.util.Collections.emptyList;
import static org.ilgcc.app.utils.SubmissionUtilities.formatToStringFromLocalDate;

import formflow.library.data.Submission;
Expand Down Expand Up @@ -52,6 +53,22 @@ public Map<String, SubmissionField> prepareSubmissionFields(Submission submissio
results.put("partnerFullName",
new SingleField("partnerFullName", String.format("%s, %s", partnerLastName, partnerFirstName), null));

List<String> mailingAddressFields = List.of(
"parentMailingStreetAddress1",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PDF content says (Only include mailing address if different from above)
Screenshot 2025-03-07 at 11 51 13 AM

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logic overrides the mapped values for these fields

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great. I feel like Carl mentioned this as a bug somewhere, not sure if it got filed or just was in the context of "things that are kind of wrong for addresses"

"parentMailingStreetAddress2",
"parentMailingCity",
"parentMailingState",
"parentMailingZipCode");

List sameAddress = (List) inputData.getOrDefault("parentMailingAddressSameAsHomeAddress[]", emptyList());

if (sameAddress.contains("yes")) {
for (String fieldName : mailingAddressFields) {
results.put(fieldName,
new SingleField(fieldName, "", null));
}
}

String rentalIncome = inputData.getOrDefault("unearnedIncomeRental", "").toString();
String dividendIncome = inputData.getOrDefault("unearnedIncomeDividends", "").toString();
String unemploymentIncome = inputData.getOrDefault("unearnedIncomeUnemployment", "").toString();
Expand Down
42 changes: 0 additions & 42 deletions src/main/java/org/ilgcc/app/pdf/MailingAddressPreparer.java

This file was deleted.

69 changes: 25 additions & 44 deletions src/main/java/org/ilgcc/app/pdf/ProviderApplicationPreparer.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.ilgcc.app.pdf;

import static java.util.Collections.emptyList;
import static org.ilgcc.app.utils.SubmissionUtilities.formatToStringFromLocalDate;
import static org.ilgcc.app.utils.SubmissionUtilities.hasNotChosenProvider;
import static org.ilgcc.app.utils.SubmissionUtilities.hasProviderResponse;
Expand All @@ -12,13 +13,13 @@
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.ilgcc.app.submission.actions.FormatSubmittedAtDate;
import org.ilgcc.app.utils.ProviderSubmissionUtilities;
import org.ilgcc.app.utils.SubmissionUtilities;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

Expand Down Expand Up @@ -47,7 +48,7 @@ private Map<String, SubmissionField> prepareProviderResponse() {

Map<String, Object> providerInputData = providerSubmission.getInputData();

List<String> providerFields = List.of(
List<String> providerFields = new ArrayList<>(Arrays.asList(
"providerResponseProviderNumber",
"providerResponseFirstName",
"providerResponseLastName",
Expand All @@ -57,8 +58,26 @@ private Map<String, SubmissionField> prepareProviderResponse() {
"providerConviction",
"providerConvictionExplanation",
"providerIdentityCheckDateOfBirthDate",
"providerTaxIdEIN"
);
"providerTaxIdEIN",
"providerResponseServiceStreetAddress1",
"providerResponseServiceStreetAddress2",
"providerResponseServiceCity",
"providerResponseServiceState",
"providerResponseServiceZipCode"
));

List<String> mailingAddressFields = List.of(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we are NOT using the same address, it maps the mailing address fields
Screenshot 2025-03-07 at 11 52 25 AM

"providerMailingStreetAddress1",
"providerMailingStreetAddress2",
"providerMailingCity",
"providerMailingState",
"providerMailingZipCode");

List sameAddress = (List) providerInputData.getOrDefault("providerMailingAddressSameAsServiceAddress[]", emptyList());

if (sameAddress.isEmpty()) {
providerFields.addAll(mailingAddressFields);
};

for (String fieldName : providerFields) {
results.put(fieldName,
Expand All @@ -69,8 +88,6 @@ private Map<String, SubmissionField> prepareProviderResponse() {
new HashMap<String, String>());
results.put("clientResponseConfirmationCode", new SingleField("clientResponseConfirmationCode",
(String) client.getOrDefault("clientResponseConfirmationCode", ""), null));
results.putAll(prepareProviderAddressData(providerInputData));
results.putAll(prepareProviderMailingAddressData(providerInputData));

results.put("providerLicenseNumber",
new SingleField("providerLicenseNumber", providerLicense(providerInputData), null));
Expand Down Expand Up @@ -122,45 +139,9 @@ private Map<String, SubmissionField> prepareNoProviderData(String shortCode) {
return results;
}

private Map<String, SubmissionField> prepareProviderAddressData(Map<String, Object> inputData) {
var results = new HashMap<String, SubmissionField>();

Map<String, String> providerAddressMapped = SubmissionUtilities.getAddress(inputData, "providerResponseService");
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

previously getAddress was checking for validated data and we no longer have to do that so we can map directly with the input field names

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love to see code deleted! ❤️


results.put("providerResponseServiceStreetAddress1", new SingleField("providerResponseServiceStreetAddress1",
providerAddressMapped.get("address1"), null));
results.put("providerResponseServiceStreetAddress2", new SingleField("providerResponseServiceStreetAddress2",
providerAddressMapped.get("address2"), null));
results.put("providerResponseServiceCity",
new SingleField("providerResponseServiceCity", providerAddressMapped.get("city"), null));
results.put("providerResponseServiceState",
new SingleField("providerResponseServiceState", providerAddressMapped.get("state"), null));
results.put("providerResponseServiceZipCode",
new SingleField("providerResponseServiceZipCode", providerAddressMapped.get("zipCode"), null));

return results;
}

private Map<String, SubmissionField> prepareProviderMailingAddressData(Map<String, Object> inputData) {
var results = new HashMap<String, SubmissionField>();
Map<String, String> mailingAddressMapped = SubmissionUtilities.getAddress(inputData, "providerMailing");

results.put("providerMailingStreetAddress1", new SingleField("providerMailingStreetAddress1",
mailingAddressMapped.get("address1"), null));
results.put("providerMailingStreetAddress2", new SingleField("providerMailingStreetAddress2",
mailingAddressMapped.get("address2"), null));
results.put("providerMailingCity",
new SingleField("providerMailingCity", mailingAddressMapped.get("city"), null));
results.put("providerMailingState",
new SingleField("providerMailingState", mailingAddressMapped.get("state"), null));
results.put("providerMailingZipCode",
new SingleField("providerMailingZipCode", mailingAddressMapped.get("zipCode"), null));

return results;
}

private String providerSignature(Map<String, Object> providerInputData) {
String providerSignature = (String) providerInputData.getOrDefault("providerSignedName", "");
String providerSignature = (String) providerInputData.getOrDefault("providerSignedName", "");
if (!providerSignature.isEmpty()) {
return providerSignature;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package org.ilgcc.app.submission.actions;

import static formflow.library.inputs.FieldNameMarkers.UNVALIDATED_FIELD_MARKER_VALIDATED;
import static org.ilgcc.app.utils.AddressUtilities.hasMatchingCity;
import static org.ilgcc.app.utils.AddressUtilities.hasMatchingState;
import static org.ilgcc.app.utils.AddressUtilities.hasMatchingStreetAddress;
import static org.ilgcc.app.utils.AddressUtilities.hasMatchingZipCode;
import static org.ilgcc.app.utils.AddressUtilities.suggestedAddressKey;
import static org.ilgcc.app.utils.AddressUtilities.useSuggestedAddressKey;

import formflow.library.config.submission.Action;
import formflow.library.data.FormSubmission;
import formflow.library.data.Submission;
import formflow.library.data.SubmissionRepositoryService;
import java.util.Map;

abstract class SaveValidatedAddress implements Action {

private final SubmissionRepositoryService submissionRepositoryService;
private final String addressGroupInputPrefix;

public SaveValidatedAddress(SubmissionRepositoryService submissionRepositoryService, String addressGroupInputPrefix) {
this.submissionRepositoryService = submissionRepositoryService;
this.addressGroupInputPrefix = addressGroupInputPrefix;
}

@Override
public void run(FormSubmission formSubmission, Submission submission) {
boolean useValidatedAddress = formSubmission.getFormData()
.getOrDefault(useSuggestedAddressKey(suggestedAddressKey, addressGroupInputPrefix), "false").equals("true");

if (useValidatedAddress) {
Map<String, Object> inputData = submission.getInputData();
if (!hasMatchingStreetAddress(inputData, addressGroupInputPrefix)) {
String addressKey = addressGroupInputPrefix + "StreetAddress1";
submission = updateValue(submission, addressKey);
submission.getInputData().put(addressGroupInputPrefix + "StreetAddress2", "");
}

if (!hasMatchingCity(inputData, addressGroupInputPrefix)) {
String addressKey = addressGroupInputPrefix + "City";
submission = updateValue(submission, addressKey);
}

if (!hasMatchingZipCode(inputData, addressGroupInputPrefix)) {
String addressKey = addressGroupInputPrefix + "ZipCode";
String addressValidatedKey = addressKey + UNVALIDATED_FIELD_MARKER_VALIDATED;
String zipCodeValue = (String) submission.getInputData().getOrDefault(addressValidatedKey, "");
if (!zipCodeValue.isBlank() && zipCodeValue.length() >= 5) {
submission.getInputData().put(addressKey, zipCodeValue.substring(0, 5));
}
}

if (!hasMatchingState(inputData, addressGroupInputPrefix)) {
String addressKey = addressGroupInputPrefix + "State";
submission = updateValue(submission, addressKey);

}

submissionRepositoryService.save(submission);
}
}

private Submission updateValue(Submission submission, String key) {
String addressValidatedKey = key + UNVALIDATED_FIELD_MARKER_VALIDATED;
submission.getInputData().put(key, submission.getInputData().get(addressValidatedKey));
return submission;
}
}


Loading