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

Generate PDF #405

Merged
merged 12 commits into from
Dec 15, 2023
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.ladocuploader.app.preparers;

import formflow.library.data.Submission;
import formflow.library.pdf.PdfMap;
import formflow.library.pdf.SingleField;
import formflow.library.pdf.SubmissionField;
import formflow.library.pdf.SubmissionFieldPreparer;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

import static org.ladocuploader.app.utils.SubmissionUtilities.PDF_EDUCATION_MAP;

@Component
public class ApplicantDetailsPreparer implements SubmissionFieldPreparer {

@Override
public Map<String, SubmissionField> prepareSubmissionFields(Submission submission, PdfMap pdfMap) {
Map<String, SubmissionField> results = new HashMap<>();

Map<String, Object> inputData = submission.getInputData();

// Convert "who does this apply to" responses to a boolean indicator
Map.of("students[]", "applicantStudentInd",
"nonCitizens[]", "applicantNonCitizenInd",
"homeless[]", "applicantHomelessInd")
.forEach((key, value) -> {
var inputs = (List<String>) inputData.getOrDefault(key, new ArrayList<>());
var ind = inputs != null && inputs.contains("you") ? "Yes" : "No";
results.put(value, new SingleField(value, ind, null));
});

// Format birthday
var birthday = Stream.of("birthMonth", "birthDay", "birthYear")
.map(inputData::get)
.reduce((e, c) -> e + "/" + c)
.get();
results.put("applicantBirthday", new SingleField("applicantBirthdayFormatted", (String) birthday, null));

var educationStatus = inputData.get("highestEducation");
results.put("highestEducation", new SingleField("highestEducationFormatted", PDF_EDUCATION_MAP.get(educationStatus), null));

return results;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package org.ladocuploader.app.preparers;

import formflow.library.data.Submission;
import formflow.library.pdf.PdfMap;
import formflow.library.pdf.SingleField;
import formflow.library.pdf.SubmissionField;
import formflow.library.pdf.SubmissionFieldPreparer;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

import static org.ladocuploader.app.utils.SubmissionUtilities.*;

@Component
public class HouseholdDetailsPreparer implements SubmissionFieldPreparer {


@Override
public Map<String, SubmissionField> prepareSubmissionFields(Submission submission, PdfMap pdfMap) {
Map<String, SubmissionField> results = new HashMap<>();

var nonCitizens = (List<String>) submission.getInputData().getOrDefault("nonCitizens[]", new ArrayList<>());
var household = (List<Map<String, Object>>) submission.getInputData().get("household");
if (household != null) {
for (int i = 0; i < household.size(); i++) {
Map<String, Object> householdMember = household.get(i);
var educationStatus = householdMember.get("householdMemberHighestEducation");
results.put("householdHighestEducation" + i, new SingleField("householdHighestEducationFormatted", PDF_EDUCATION_MAP.get(educationStatus), i + 1));

var maritalStatus = householdMember.get("householdMemberMaritalStatus");
results.put("householdMaritalStatus" + i, new SingleField("householdMaritalStatusFormatted", PDF_MARITAL_STATUS_MAP.get(maritalStatus), i + 1));

var relationshipStatus = householdMember.get("householdMemberRelationship");
results.put("householdRelationship" + i, new SingleField("householdRelationshipFormatted", PDF_RELATIONSHIP_MAP.get(relationshipStatus), i + 1));

var birthday = Stream.of("householdMemberBirthMonth", "householdMemberBirthDay", "householdMemberBirthYear")
.map(householdMember::get)
.reduce((e, c) -> e + "/" + c)
.get();
results.put("householdBirthday" + i, new SingleField("householdBirthdayFormatted", (String) birthday, i + 1));

var uuid = householdMember.get("uuid");
results.put("householdUSCitizen" + i, new SingleField("householdUSCitizenDerived", nonCitizens != null && nonCitizens.contains(uuid) ? "No" : "Yes", i + 1));
}
}
return results;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.ladocuploader.app.preparers;

import formflow.library.data.Submission;
import formflow.library.pdf.PdfMap;
import formflow.library.pdf.SingleField;
import formflow.library.pdf.SubmissionField;
import formflow.library.pdf.SubmissionFieldPreparer;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.Map;

@Component
public class MaritalStatusPreparer implements SubmissionFieldPreparer {

@Override
public Map<String, SubmissionField> prepareSubmissionFields(Submission submission, PdfMap pdfMap) {
var maritalStatus = (String) submission.getInputData().getOrDefault("maritalStatus", "");
if (maritalStatus.startsWith("Married")) {
return Map.of("maritalStatus", new SingleField("maritalStatus", "Married", null));
}
return Collections.emptyMap();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.ladocuploader.app.preparers;

import formflow.library.data.Submission;
import formflow.library.pdf.PdfMap;
import formflow.library.pdf.SingleField;
import formflow.library.pdf.SubmissionField;
import formflow.library.pdf.SubmissionFieldPreparer;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@Component
public class PersonalSituationsPreparer implements SubmissionFieldPreparer {

@Override
public Map<String, SubmissionField> prepareSubmissionFields(Submission submission, PdfMap pdfMap) {
List<String> disability = (List<String>) submission.getInputData().getOrDefault("personalSituationDisability[]", Collections.EMPTY_LIST);
boolean disabilityFlag = disability.contains("you");

var household = (List<Map<String, Object>>) submission.getInputData().get("household");
if (!disabilityFlag && household != null) {
for (Map<String, Object> member : household) {
var uuid = member.get("uuid");
if (disability.contains(uuid)) {
return Map.of("disablityInd", new SingleField("personalSituationDisablityInd", "true", null));
}
}
sree-cfa marked this conversation as resolved.
Show resolved Hide resolved
}

return Map.of("disablityInd", new SingleField("personalSituationDisablityInd", disabilityFlag ? "true" : "false", null));
}
}
51 changes: 51 additions & 0 deletions src/main/java/org/ladocuploader/app/preparers/SsnPreparer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.ladocuploader.app.preparers;

import formflow.library.data.Submission;
import formflow.library.pdf.PdfMap;
import formflow.library.pdf.SingleField;
import formflow.library.pdf.SubmissionField;
import formflow.library.pdf.SubmissionFieldPreparer;
import org.ladocuploader.app.submission.StringEncryptor;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.ladocuploader.app.utils.SubmissionUtilities.ENCRYPTED_SSNS_INPUT_NAME;

@Component
public class SsnPreparer implements SubmissionFieldPreparer {
private final StringEncryptor encryptor;

public SsnPreparer(StringEncryptor stringEncryptor) {
encryptor = stringEncryptor;
}

private StringEncryptor getEncryptor() {
return encryptor;
}

@Override
public Map<String, SubmissionField> prepareSubmissionFields(Submission submission, PdfMap pdfMap) {
Map<String, SubmissionField> results = new HashMap<>();
String encryptedSSN = (String) submission.getInputData().remove("encryptedSSN");
if (encryptedSSN != null) {
String decryptedSSN = encryptor.decrypt(encryptedSSN);
results.put("applicantSsn", new SingleField("applicantSsn", decryptedSSN, null));
}

List<Map<String, Object>> householdMembers = (List) submission.getInputData().get("household");
if(householdMembers != null) {
int i = 1;
for (Map<String, Object> hhmember : householdMembers) {
encryptedSSN = (String) hhmember.get(ENCRYPTED_SSNS_INPUT_NAME);
String decryptedSSN = encryptor.decrypt(encryptedSSN);
bseeger marked this conversation as resolved.
Show resolved Hide resolved
results.put("ssns_" + i, new SingleField("ssns_" + i, decryptedSSN, null));
i++;
}
}

return results;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ public AWSStringEncryptor(@Value("${form-flow.aws.cmk}") String keyArn, @Value("

@Override
public String decrypt(String ciphertext) {
if (ciphertext == null || ciphertext.isEmpty()) {
return "";
}

DecryptRequest decryptRequest = new DecryptRequest()
.withEncryptionAlgorithm("RSAES_OAEP_SHA_256")
.withKeyId(keyArn)
Expand All @@ -44,6 +48,10 @@ public String decrypt(String ciphertext) {

@Override
public String encrypt(String plaintext) {
if (plaintext == null || plaintext.isEmpty()) {
return "";
}

EncryptRequest req = new EncryptRequest()
.withEncryptionAlgorithm("RSAES_OAEP_SHA_256")
.withKeyId(keyArn)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,20 @@

import formflow.library.config.submission.Action;
import formflow.library.data.Submission;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import org.ladocuploader.app.submission.StringEncryptor;
import org.springframework.stereotype.Component;
import static formflow.library.inputs.FieldNameMarkers.DYNAMIC_FIELD_MARKER;

import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.LinkedHashMap;

import static org.ladocuploader.app.utils.SubmissionUtilities.ENCRYPTED_SSNS_INPUT_NAME;
import static org.ladocuploader.app.utils.SubmissionUtilities.getDecryptedSSNKeyName;

/**
*
*/
@Component
public class DecryptSSNBeforeDisplaying implements Action {
private static final String ENCRYPTED_SSNS_INPUT_NAME = "householdMemberEncryptedSSN";

private final StringEncryptor encryptor;

Expand All @@ -35,18 +34,14 @@ public void run(Submission submission) {
String decryptedSSN = getEncryptor().decrypt(encryptedSSN);
submission.getInputData().put("ssn", decryptedSSN);
}

ArrayList<LinkedHashMap> householdMembers = (ArrayList) submission.getInputData().get("household");

for (LinkedHashMap hhmember : householdMembers) {
String ssnKey = "householdMemberSsn" + DYNAMIC_FIELD_MARKER + hhmember.get("uuid");
String ssnKey = getDecryptedSSNKeyName((String) hhmember.get("uuid"));
encryptedSSN = (String) hhmember.remove(ENCRYPTED_SSNS_INPUT_NAME);
if(!encryptedSSN.isBlank()) {
String decryptedSSN = getEncryptor().decrypt(encryptedSSN);
submission.getInputData().put(ssnKey, decryptedSSN);
} else {
submission.getInputData().put(ssnKey, "");
}
String decryptedSSN = getEncryptor().decrypt(encryptedSSN);
submission.getInputData().put(ssnKey, decryptedSSN);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,17 @@

import formflow.library.config.submission.Action;
import formflow.library.data.Submission;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import org.ladocuploader.app.submission.StringEncryptor;
import org.springframework.stereotype.Component;
import static formflow.library.inputs.FieldNameMarkers.DYNAMIC_FIELD_MARKER;

import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.LinkedHashMap;

import static org.ladocuploader.app.utils.SubmissionUtilities.ENCRYPTED_SSNS_INPUT_NAME;
import static org.ladocuploader.app.utils.SubmissionUtilities.getDecryptedSSNKeyName;

@Component
public class EncryptSSNBeforeSaving implements Action {
private static final String ENCRYPTED_SSNS_INPUT_NAME = "householdMemberEncryptedSSN";

private final StringEncryptor encryptor;

Expand All @@ -30,15 +29,12 @@ public void run(Submission submission) {
}

ArrayList<LinkedHashMap> householdMembers = (ArrayList) submission.getInputData().get("household");

for (LinkedHashMap hhmember : householdMembers) {
String ssnKey = "householdMemberSsn" + DYNAMIC_FIELD_MARKER + hhmember.get("uuid");
if (householdMembers != null) {
for (LinkedHashMap hhmember : householdMembers) {
String ssnKey = getDecryptedSSNKeyName((String) hhmember.get("uuid"));
var householdMemberSsn = (String) submission.getInputData().remove(ssnKey);
if(!householdMemberSsn.isBlank()){
String encryptedSSN = encryptor.encrypt(householdMemberSsn);
hhmember.put(ENCRYPTED_SSNS_INPUT_NAME,encryptedSSN);
} else {
hhmember.put(ENCRYPTED_SSNS_INPUT_NAME, "");
String encryptedSSN = encryptor.encrypt(householdMemberSsn);
hhmember.put(ENCRYPTED_SSNS_INPUT_NAME, encryptedSSN);
}
}
}
Expand Down
Loading