Skip to content

Commit

Permalink
Merge branch 'main' into dependabot/gradle/io.github.bonigarcia-webdr…
Browse files Browse the repository at this point in the history
…ivermanager-5.8.0
  • Loading branch information
lkemperman-cfa committed May 3, 2024
2 parents 10efd34 + 64990e8 commit 1c49176
Show file tree
Hide file tree
Showing 45 changed files with 2,444 additions and 1,661 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ repositories {
}

def profile = props.getProperty('SPRING_PROFILES_ACTIVE')
def formFlowLibraryVersion = '1.2.0'
def formFlowLibraryVersion = '1.3.0'
def useLocalLibrary = System.getenv('USE_LOCAL_LIBRARY')

dependencies {
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/org/ladocuploader/app/FileExportController.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,22 @@ ResponseEntity<?> downloadWicCsv(

return handleCsvGeneration(encodedFlow, encodedSubmissionId, httpSession, locale, CsvType.WIC_APPLICATION);
}

@GetMapping("{flow}/jefferson-ece/{submissionId}")
ResponseEntity<?> downloadJeffersonEceCsv(
@PathVariable String flow,
@PathVariable String submissionId,
HttpSession httpSession,
Locale locale
) throws IOException, CsvRequiredFieldEmptyException, CsvDataTypeMismatchException {

String encodedFlow = UriComponentsBuilder.fromPath(flow).build().toUriString();
String encodedSubmissionId = UriComponentsBuilder.fromPath(submissionId).build().toUriString();

log.info("GET downloadCSV Jefferson ECE");

return handleCsvGeneration(encodedFlow, encodedSubmissionId, httpSession, locale, CsvType.JEFFERSON_ECE);
}


protected static void throwNotFoundError(String flow, String message) {
Expand Down
14 changes: 4 additions & 10 deletions src/main/java/org/ladocuploader/app/cli/SubmissionTransfer.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.ladocuploader.app.data.enums.TransmissionStatus;
import org.ladocuploader.app.data.enums.TransmissionType;
import org.ladocuploader.app.submission.StringEncryptor;
import org.ladocuploader.app.utils.SubmissionUtilities;
import org.slf4j.MDC;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.domain.Sort;
Expand Down Expand Up @@ -217,17 +218,10 @@ private void packageUploadedDocuments(String batchIndex, ZipOutputStream zos, St
return;
}
log.info("Number of uploaded docs to transfer: %s".formatted(userFiles.size()));
Map<String, Integer> filenameDuplicates = new HashMap<>();
int fileCount = 0;
for (UserFile userFile : userFiles) {
// Account for files of the same name
String docUploadFilename = userFile.getOriginalName();
filenameDuplicates.putIfAbsent(docUploadFilename, 0);
filenameDuplicates.computeIfPresent(docUploadFilename, (s, i) -> i + 1);
Integer filecount = filenameDuplicates.get(docUploadFilename);
if (filecount > 1) {
docUploadFilename = "%s_%s".formatted(filecount, docUploadFilename);
}

fileCount += 1;
String docUploadFilename = SubmissionUtilities.createFileNameForUploadedDocument(submission, userFile, fileCount, userFiles.size());
ZipEntry docEntry = new ZipEntry(batchIndex + "/" + subfolder + "/" + docUploadFilename);
docEntry.setSize(userFile.getFilesize().longValue());
zos.putNextEntry(docEntry);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.ladocuploader.app.data.TransmissionRepository;
import org.ladocuploader.app.data.enums.TransmissionStatus;
import org.ladocuploader.app.data.enums.TransmissionType;
import org.ladocuploader.app.utils.SubmissionUtilities;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.domain.Sort;
import org.springframework.scheduling.annotation.Scheduled;
Expand Down Expand Up @@ -54,7 +55,7 @@ public class TransmitterCommands {

private final String successfulSubmissionKey = "success";

private final List<TransmissionType> transmissionTypes = List.of(TransmissionType.ECE);
private final List<TransmissionType> transmissionTypes = List.of(TransmissionType.ECE, TransmissionType.WIC);

private final long TWO_HOURS = 2L;

Expand Down Expand Up @@ -234,7 +235,8 @@ private Map<String, Object> zipFiles(List<Submission> submissions, String zipFil
fileCount += 1;
String fileName = userFile.getOriginalName();
log.info("filename is: " + fileName);
ZipEntry docEntry = new ZipEntry(subfolder + String.format("%02d", fileCount) + "_" + userFile.getOriginalName().replaceAll("[/:\\\\]", "_"));
String formattedFileName = SubmissionUtilities.createFileNameForUploadedDocument(submission, userFile, fileCount, userFiles.size());
ZipEntry docEntry = new ZipEntry(subfolder + formattedFileName);
docEntry.setSize(userFile.getFilesize().longValue());
zos.putNextEntry(docEntry);
CloudFile docFile = fileRepository.get(userFile.getRepositoryPath());
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/org/ladocuploader/app/csv/CsvGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.ladocuploader.app.csv.enums.CsvType;
import org.ladocuploader.app.csv.model.BaseCsvModel;
import org.ladocuploader.app.csv.model.ECEApplicationCsvModel;
import org.ladocuploader.app.csv.model.JeffersonCsvModel;
import org.ladocuploader.app.csv.model.ParentGuardianCsvModel;
import org.ladocuploader.app.csv.model.StudentCsvModel;
import org.ladocuploader.app.csv.model.RelationshipCsvModel;
Expand Down Expand Up @@ -119,6 +120,20 @@ public CsvDocument generateWICApplicationCsvData(List<Submission> submissionList
}
return generateCsv(CsvType.WIC_APPLICATION, WICApplicationCsvModel.class, applicationList);
}

public CsvDocument generateJeffersionApplicationCsvData(List<Submission> submissionList)
throws CsvRequiredFieldEmptyException, CsvDataTypeMismatchException, IOException {

List<BaseCsvModel> applicationList = new ArrayList<>();

for (Submission submission : submissionList) {
if(isEceEligibleAndInterested(submission)) {
BaseCsvModel application = JeffersonCsvModel.generateModel(submission);
applicationList.add(application);
}
}
return generateCsv(CsvType.JEFFERSON_ECE, JeffersonCsvModel.class, applicationList);
}

private CsvDocument generateCsv(CsvType csvType, Class classType, List<BaseCsvModel> objects) throws CsvRequiredFieldEmptyException, CsvDataTypeMismatchException, IOException {
CsvDocument csv = new CsvDocument(csvType);
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/ladocuploader/app/csv/CsvService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.ladocuploader.app.csv;


import static org.ladocuploader.app.csv.enums.CsvType.JEFFERSON_ECE;
import static org.ladocuploader.app.csv.enums.CsvType.PARENT_GUARDIAN;
import static org.ladocuploader.app.csv.enums.CsvType.RELATIONSHIP;
import static org.ladocuploader.app.csv.enums.CsvType.STUDENT;
Expand Down Expand Up @@ -49,6 +50,7 @@ public CsvDocument generateCsvFormattedData(List<Submission> submissionList, Csv
case PARENT_GUARDIAN -> csvGenerator.generateParentGuardianCsvData(submissionList);
case ECE_APPLICATION -> csvGenerator.generateECEApplicationCsvData(submissionList);
case WIC_APPLICATION -> csvGenerator.generateWICApplicationCsvData(submissionList);
case JEFFERSON_ECE -> csvGenerator.generateJeffersionApplicationCsvData(submissionList);
default -> {
log.warn("Unknown CSV Type requested: {}", csvType.name());
yield null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ protected Object convert(String value) {
@Override
protected String convertToWrite(Object value) {
Map<String, Integer> dateMap = (Map) value;
if (dateMap.get("year") == null || dateMap.get("month") == null || dateMap.get("day") == null) {
return "";
}
return String.format("%04d-%02d-%02d",
dateMap.get("year"),
dateMap.get("month"),
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/ladocuploader/app/csv/enums/CsvType.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public enum CsvType {
STUDENT("Student", "student.csv"),
RELATIONSHIP("Relationship", "relationship.csv"),
ECE_APPLICATION("ECE Application", "application.csv"),
JEFFERSON_ECE("Jefferson ECE", "jefferson_ece.csv"),
WIC_APPLICATION("WIC Application", "application.csv");

private final String name;
Expand Down
178 changes: 178 additions & 0 deletions src/main/java/org/ladocuploader/app/csv/model/JeffersonCsvModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
package org.ladocuploader.app.csv.model;

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

import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvCustomBindByName;
import formflow.library.data.Submission;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.ladocuploader.app.csv.CsvBindByNameOrder;
import org.ladocuploader.app.csv.converters.AddressStreetConverter;
import org.ladocuploader.app.csv.converters.HouseholdBirthDateConverter;
import org.ladocuploader.app.csv.converters.PhoneNumberConverter;
import org.ladocuploader.app.utils.HouseholdUtilities;
import org.ladocuploader.app.utils.IncomeCalculator;
import org.ladocuploader.app.utils.SubmissionUtilities;

@Getter
@Setter
@JsonTypeName("jefferson")
@Slf4j
@CsvBindByNameOrder({"cfa_reference","Are you currently pregnant and planning to apply for your unborn child? *","First Name","Last Name","Gender","Birthdate","Race","Street Address","Street Address 2","City","State","Zip Code","Applicant First Name","Applicant Last Name","Cell Phone", "Main Phone","Work Phone","Email","Total Household Number","Applicant Gross Income","Do any of the child's legal guardians (who live in your household) have a disability?","How many of the child's legal guardians (who live in your household) are either working, in school, in a training program, or seeking work?"})
public class JeffersonCsvModel extends BaseCsvModel {

@CsvBindByName(column="cfa_reference")
private String id;

@CsvBindByName(column="Are you currently pregnant and planning to apply for your unborn child? *")
private String pregnant;

@CsvBindByName(column="First Name")
private String childFirstName;

@CsvBindByName(column="Last Name")
private String childLastName;

@CsvBindByName(column="Gender")
private String childGender;

@CsvCustomBindByName(column="Birthdate", converter= HouseholdBirthDateConverter.class)
private Map<String, Integer> childBirthDate = new HashMap<>();

@CsvBindByName(column="Race")
private String childRace;

@CsvBindByName(column="Street Address")
private String homeAddressStreet;

@CsvBindByName(column="Street Address 2")
private String homeAddressStreet2;

@CsvBindByName(column="City")
private String homeAddressCity;

@CsvBindByName(column="State")
private String homeAddressState;

@CsvBindByName(column="Zip Code")
private String homeAddressZipCode;

@CsvBindByName(column="Applicant First Name")
private String firstName;

@CsvBindByName(column="Applicant Last Name")
private String lastName;

@CsvCustomBindByName(column="Cell Phone", converter = PhoneNumberConverter.class)
private String cellPhoneNumber;

@CsvCustomBindByName(column="Main Phone", converter = PhoneNumberConverter.class)
private String phoneNumber;

@CsvCustomBindByName(column="Work Phone", converter = PhoneNumberConverter.class)
private String workPhoneNumber;

@CsvBindByName(column="Email")
private String emailAddress;

@CsvBindByName(column="Total Household Number")
private String totalHouseholdNumber;

@CsvBindByName(column="Applicant Gross Income")
private String applicantGrossIncome;

@CsvBindByName(column="Do any of the child's legal guardians (who live in your household) have a disability?")
private String disability;

@CsvBindByName(column="How many of the child's legal guardians (who live in your household) are either working, in school, in a training program, or seeking work?")
private String guardiansWorking;


@JsonSetter(value="memberBirthDay")
private void setMemberBirthDay(final String day) {
try {
if (day != null) {
childBirthDate.put("day", Integer.valueOf(day));
}
} catch (NumberFormatException e) {
log.error("JSON Mapping: Unable to set member birth day, as value '{}' is bad.", day);
}
}

@JsonSetter(value="memberBirthMonth")
private void setMemberBirthMonth(final String month) {
try {
if (month != null) {
childBirthDate.put("month", Integer.valueOf(month));
}
} catch (NumberFormatException e) {
log.error("JSON Mapping: Unable to set member birth month, as value '{}' is bad.", month);
}
}

@JsonSetter(value="memberBirthYear")
private void setMemberBirthYear(final String year) {
try {
if (year != null) {
childBirthDate.put("year", Integer.valueOf(year));
}
} catch (NumberFormatException e) {
log.error("JSON Mapping: Unable to set member birth year, as value '{}' is bad.", year);
}
}

public static BaseCsvModel generateModel(Submission submission){
Map<String, Object> inputData = submission.getInputData();
Map<String, Object> jeffersonDataMap = new HashMap<>();

jeffersonDataMap.put("id", submission.getId());
boolean hasPregnancy = "true".equals(inputData.getOrDefault("pregnancyInd", "false"));
jeffersonDataMap.put("pregnant", hasPregnancy ? "Yes" : "No");

List<Map<String, Object>> householdList = (List) inputData.getOrDefault("household", List.of());
householdList.stream().filter(HouseholdUtilities::isMemberCutoffEligible).findFirst().ifPresent(member -> {
jeffersonDataMap.put("childFirstName", member.get("householdMemberFirstName"));
jeffersonDataMap.put("childLastName", member.get("householdMemberLastName"));
jeffersonDataMap.put("childGender", member.get("householdMemberSex"));
jeffersonDataMap.put("memberBirthDay", member.get("householdMemberBirthDay"));
jeffersonDataMap.put("memberBirthMonth", member.get("householdMemberBirthMonth"));
jeffersonDataMap.put("memberBirthYear", member.get("householdMemberBirthYear"));
if (submission.getInputData().containsKey("householdMemberRace_wildcard_" + member.get("uuid") + "[]")) {
jeffersonDataMap.put("childRace", String.join(", ", (List) submission.getInputData().get("householdMemberRace_wildcard_" + member.get("uuid") + "[]")));
}
});

jeffersonDataMap.put("homeAddressStreet", inputData.get("homeAddressStreetAddress1"));
jeffersonDataMap.put("homeAddressStreet2", inputData.getOrDefault("homeAddressStreetAddress2", ""));
jeffersonDataMap.put("homeAddressCity", inputData.get("homeAddressCity"));
jeffersonDataMap.put("homeAddressState", inputData.get("homeAddressState"));
jeffersonDataMap.put("homeAddressZipCode", inputData.get("homeAddressZipCode"));
jeffersonDataMap.put("firstName", inputData.get("firstName"));
jeffersonDataMap.put("lastName", inputData.get("lastName"));
jeffersonDataMap.put("cellPhoneNumber", inputData.getOrDefault("cellPhoneNumber", ""));
jeffersonDataMap.put("phoneNumber", inputData.getOrDefault("phoneNumber", ""));
jeffersonDataMap.put("workPhoneNumber", inputData.getOrDefault("workPhoneNumber", ""));
jeffersonDataMap.put("emailAddress", inputData.getOrDefault("emailAddress", ""));
jeffersonDataMap.put("totalHouseholdNumber", householdList.size() + 1); // +1 for the applicant

IncomeCalculator incomeCalculator = new IncomeCalculator(submission);

jeffersonDataMap.put("applicantGrossIncome", formatMoney(incomeCalculator.applicantTotalFutureEarnedIncome()));
if (inputData.containsKey("guardiansHaveDisabilityInd")) {
boolean guardianHasDisability = "true".equals(inputData.get("guardiansHaveDisabilityInd"));
jeffersonDataMap.put("disability", guardianHasDisability ? "Yes" : "No");
}
jeffersonDataMap.put("guardiansWorking", inputData.getOrDefault("adultsWorking", ""));
JeffersonCsvModel jeffersonModel = mapper.convertValue(jeffersonDataMap, JeffersonCsvModel.class);
jeffersonModel.setSubmissionId(submission.getId());
return jeffersonModel;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -446,8 +446,14 @@ public class LaDigitalAssister extends FlowInputs {

private String continueAssociateDocType;

private String continueDocOwner;

@NotBlank(message = "{doc-type.select-a-type}")
@DynamicField
private String docType;

@NotBlank(message = "{document-who.please-select}")
@DynamicField
private String documentOwner;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.ladocuploader.app.submission.conditions;

import formflow.library.data.Submission;
import org.springframework.stereotype.Component;

@Component
public class ContinueDocOwner extends BasicCondition {

@Override
public Boolean run(Submission submission) {
return run(submission, "continueDocOwner", "true");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.ladocuploader.app.submission.conditions;

import static org.ladocuploader.app.submission.actions.SetExperimentGroups.ExperimentGroup.APPLY;
import static org.ladocuploader.app.utils.SubmissionUtilities.ECE_CUTOFF_DATE;
import static org.ladocuploader.app.utils.SubmissionUtilities.hasChildBornAfterCutoff;
import static org.ladocuploader.app.utils.SubmissionUtilities.hasHouseholdPregnancy;
import static org.ladocuploader.app.utils.SubmissionUtilities.inExperimentGroup;
import static org.ladocuploader.app.utils.SubmissionUtilities.isJeffersonParish;
import static org.ladocuploader.app.utils.SubmissionUtilities.isOrleansParish;

import formflow.library.config.submission.Condition;
import formflow.library.data.Submission;
import org.springframework.stereotype.Component;

@Component
public class EligibleForEceApplyJefferson implements Condition {

@Override
public Boolean run(Submission submission) {
return isJeffersonParish(submission)
&& inExperimentGroup(APPLY.name(), submission)
&& (hasChildBornAfterCutoff(submission, ECE_CUTOFF_DATE) || hasHouseholdPregnancy(submission));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import static org.ladocuploader.app.utils.SubmissionUtilities.*;

@Component
public class EligibleForEceApply implements Condition {
public class EligibleForEceApplyNola implements Condition {

@Override
public Boolean run(Submission submission) {
Expand Down
Loading

0 comments on commit 1c49176

Please sign in to comment.