diff --git a/src/main/java/org/ilgcc/app/ProviderLinkController.java b/src/main/java/org/ilgcc/app/ProviderLinkController.java index 0c85d9a28..868146092 100644 --- a/src/main/java/org/ilgcc/app/ProviderLinkController.java +++ b/src/main/java/org/ilgcc/app/ProviderLinkController.java @@ -4,6 +4,8 @@ import formflow.library.data.SubmissionRepositoryService; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; +import java.net.URI; +import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -12,6 +14,9 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; + +import static org.ilgcc.app.utils.constants.SessionKeys.SESSION_KEY_CAME_FROM_HOME_PAGE; import static org.ilgcc.app.utils.constants.SessionKeys.SESSION_KEY_FAMILY_SUBMISSION_ID; import static org.ilgcc.app.utils.constants.SessionKeys.SESSION_KEY_SUBMISSION_MAP; @@ -33,8 +38,9 @@ public ProviderLinkController(SubmissionRepositoryService submissionRepositorySe */ @GetMapping(value = {"s", "s/{confirmationCode}", "providerresponse/submit/{confirmationCode}"}) String loadFamilySubmission(HttpSession session, HttpServletRequest request, - @PathVariable(required = false) String confirmationCode) { - + @PathVariable(required = false) String confirmationCode, + @RequestHeader(value = "Referer", required = false) String referer + ) throws URISyntaxException { session.invalidate(); // create a new session and populate it with an empty FFL submission map @@ -47,7 +53,7 @@ String loadFamilySubmission(HttpSession session, HttpServletRequest request, log.info("Loading submission for code " + sanitizedConfirmationCode); if (sanitizedConfirmationCode != null) { - Optional submission = submissionRepositoryService.findByShortCode(sanitizedConfirmationCode); + Optional submission = submissionRepositoryService.findByShortCode(sanitizedConfirmationCode.toUpperCase()); if (submission.isPresent()) { Submission s = submission.get(); Map urlParams = s.getUrlParams(); @@ -60,6 +66,8 @@ String loadFamilySubmission(HttpSession session, HttpServletRequest request, submissionRepositoryService.save(s); newSession.setAttribute(SESSION_KEY_FAMILY_SUBMISSION_ID, s.getId()); + + checkRefererValue(referer, newSession); } else { log.error("Unable to load submission for code " + sanitizedConfirmationCode); return "redirect:/error-invalid-code"; @@ -68,4 +76,13 @@ String loadFamilySubmission(HttpSession session, HttpServletRequest request, return "redirect:/flow/providerresponse/submit-start"; } + + private static void checkRefererValue(String referer, HttpSession newSession) throws URISyntaxException { + if (referer != null) { + URI refererUri = new URI(referer); + if (("/").equals(refererUri.getPath())) { + newSession.setAttribute(SESSION_KEY_CAME_FROM_HOME_PAGE, true); + } + } + } } diff --git a/src/main/java/org/ilgcc/app/ProviderResponsePdfController.java b/src/main/java/org/ilgcc/app/ProviderResponsePdfController.java index 2b7ceecb1..d2d58de56 100644 --- a/src/main/java/org/ilgcc/app/ProviderResponsePdfController.java +++ b/src/main/java/org/ilgcc/app/ProviderResponsePdfController.java @@ -61,7 +61,7 @@ ResponseEntity downloadPdf(@PathVariable String flow, @PathVariable String su } Optional optionalFamilySubmission = submissionRepositoryService.findByShortCode( - providerResponseFamilyShortCode.toString()); + providerResponseFamilyShortCode.toString().toUpperCase()); if (optionalFamilySubmission.isEmpty()) { log.warn( "Attempted to download PDF with provider submission id: {} but no family submission was found with confirmation code: {}", diff --git a/src/main/java/org/ilgcc/app/submission/actions/FindApplicationData.java b/src/main/java/org/ilgcc/app/submission/actions/FindApplicationData.java index 23d285337..8b61c36de 100644 --- a/src/main/java/org/ilgcc/app/submission/actions/FindApplicationData.java +++ b/src/main/java/org/ilgcc/app/submission/actions/FindApplicationData.java @@ -20,12 +20,14 @@ public class FindApplicationData implements Action { @Override public void run(Submission providerSubmission) { Optional familySubmissionId = ProviderSubmissionUtilities.getFamilySubmissionId(providerSubmission); - if(familySubmissionId.isPresent()){ - Optional familySubmission = submissionRepositoryService.findById(familySubmissionId.get()); - providerSubmission.getInputData().put("clientResponse", ProviderSubmissionUtilities.getFamilySubmissionForProviderResponse(familySubmission)); + if (familySubmissionId.isPresent()) { + Optional familySubmission = submissionRepositoryService.findById(familySubmissionId.get()); + providerSubmission.getInputData() + .put("clientResponse", ProviderSubmissionUtilities.getFamilySubmissionForProviderResponse(familySubmission)); - providerSubmission.getInputData().put("clientResponseChildren", ProviderSubmissionUtilities.getChildrenDataForProviderResponse(familySubmission.get())); - submissionRepositoryService.save(providerSubmission); + providerSubmission.getInputData().put("clientResponseChildren", + ProviderSubmissionUtilities.getChildrenDataForProviderResponse(familySubmission.get())); + submissionRepositoryService.save(providerSubmission); } } } diff --git a/src/main/java/org/ilgcc/app/submission/actions/GenerateDummyFamilySubmissionForDev.java b/src/main/java/org/ilgcc/app/submission/actions/GenerateDummyFamilySubmissionForDev.java index 62a5f1946..194843dad 100644 --- a/src/main/java/org/ilgcc/app/submission/actions/GenerateDummyFamilySubmissionForDev.java +++ b/src/main/java/org/ilgcc/app/submission/actions/GenerateDummyFamilySubmissionForDev.java @@ -53,8 +53,8 @@ public void run(FormSubmission formSubmission, Submission submission) { dummyFamilySubmission.setFlow("gcc"); dummyFamilySubmission.setShortCode("DEV-123ABC"); dummyFamilySubmission.setInputData(inputData); - - submissionRepositoryService.save(dummyFamilySubmission); + + dummyFamilySubmission = submissionRepositoryService.save(dummyFamilySubmission); httpSession.setAttribute(SESSION_KEY_FAMILY_SUBMISSION_ID, dummyFamilySubmission.getId()); } diff --git a/src/main/java/org/ilgcc/app/submission/actions/ValidateConfirmationCodeAndSaveId.java b/src/main/java/org/ilgcc/app/submission/actions/ValidateConfirmationCodeAndSaveId.java index ce5140f80..986514405 100644 --- a/src/main/java/org/ilgcc/app/submission/actions/ValidateConfirmationCodeAndSaveId.java +++ b/src/main/java/org/ilgcc/app/submission/actions/ValidateConfirmationCodeAndSaveId.java @@ -43,7 +43,7 @@ public Map> runValidation(FormSubmission formSubmission, Su .getOrDefault("providerResponseFamilyShortCode", ""); if (!providerProvidedConfirmationCode.isBlank()) { - Optional familySubmission = submissionRepositoryService.findByShortCode(providerProvidedConfirmationCode); + Optional familySubmission = submissionRepositoryService.findByShortCode(providerProvidedConfirmationCode.toUpperCase()); if (familySubmission.isPresent()) { httpSession.setAttribute(SESSION_KEY_FAMILY_SUBMISSION_ID, familySubmission.get().getId()); diff --git a/src/main/java/org/ilgcc/app/submission/conditions/ShouldSkipConfirmationCode.java b/src/main/java/org/ilgcc/app/submission/conditions/ShouldSkipConfirmationCode.java new file mode 100644 index 000000000..79779faa4 --- /dev/null +++ b/src/main/java/org/ilgcc/app/submission/conditions/ShouldSkipConfirmationCode.java @@ -0,0 +1,24 @@ +package org.ilgcc.app.submission.conditions; + +import static org.ilgcc.app.utils.constants.SessionKeys.SESSION_KEY_CAME_FROM_HOME_PAGE; + +import formflow.library.config.submission.Condition; +import formflow.library.data.Submission; +import jakarta.servlet.http.HttpSession; +import org.springframework.stereotype.Component; + +@Component +public class ShouldSkipConfirmationCode implements Condition { + + private final HttpSession httpSession; + + public ShouldSkipConfirmationCode(HttpSession httpSession) { + this.httpSession = httpSession; + } + + @Override + public Boolean run(Submission submission) { + Boolean cameFromHomePage = (Boolean) httpSession.getAttribute(SESSION_KEY_CAME_FROM_HOME_PAGE); + return cameFromHomePage != null && cameFromHomePage; + } +} diff --git a/src/main/java/org/ilgcc/app/utils/constants/SessionKeys.java b/src/main/java/org/ilgcc/app/utils/constants/SessionKeys.java index d84592742..e34936692 100644 --- a/src/main/java/org/ilgcc/app/utils/constants/SessionKeys.java +++ b/src/main/java/org/ilgcc/app/utils/constants/SessionKeys.java @@ -6,4 +6,5 @@ public class SessionKeys { public final static String SESSION_KEY_FAMILY_CONFIRMATION_CODE = "confirmationCode"; public final static String SESSION_KEY_SUBMISSION_MAP = "submissionMap"; public final static String SESSION_KEY_SELECTED_PROVIDER_NAME = "selectedProviderName"; + public final static String SESSION_KEY_CAME_FROM_HOME_PAGE = "cameFromHomePage"; } diff --git a/src/main/resources/flows-config.yaml b/src/main/resources/flows-config.yaml index 01efe3dba..905f76895 100644 --- a/src/main/resources/flows-config.yaml +++ b/src/main/resources/flows-config.yaml @@ -525,6 +525,8 @@ flow: beforeSaveAction: ConnectProviderApplicationToFamilyApplication onPostAction: GenerateDummyFamilySubmissionForDev nextScreens: + - name: response + condition: ShouldSkipConfirmationCode - name: confirmation-code confirmation-code: crossFieldValidationAction: ValidateConfirmationCodeAndSaveId diff --git a/src/main/resources/messages_es.properties b/src/main/resources/messages_es.properties index 86ea4fdc8..0eeaf9673 100644 --- a/src/main/resources/messages_es.properties +++ b/src/main/resources/messages_es.properties @@ -53,6 +53,12 @@ general.none-added=Nada agregado general.helptext-relevant-questions-only=Responda únicamente las preguntas que sean relevantes general.step-header=Paso {0} de {1} +general-survey-question.very-easy=Muy fácil +general-survey-question.easy=Fácil +general-survey-question.neither=Ni fácil ni difícil +general-survey-question.difficult=Difícil +general-survey-question.very-difficult=Muy difícil + general.day.validation=Asegúrese de haber ingresado el día correcto. general.month.validation=Asegúrese de haber ingresado el mes correcto. general.year.validation=Asegúrese de haber ingresado el año correcto. @@ -444,6 +450,9 @@ children-childcare-hourly-schedule.same-every-day=El horario es igual todos los #children-ccap-child-other-ed children-ccap-child-other-ed.title=CCAP Child Other children-ccap-child-other-ed.header=¿{0} asiste a alguna otra escuela o a algún otro programa educativo durante el día? +#children-school-weekly-schedule +children-school-weekly-schedule.title=Horario escolar +children-school-weekly-schedule.header=¿Qué días y en qué horario está {0} en la escuela? # delete-confirmation.title=Eliminar persona delete-confirmation.header=¿Esta seguro que quiere borrar a {0} de la solicitud? @@ -777,30 +786,20 @@ next-steps-pdf-delivery.notice=
  • Imprima su solici submit-next-steps.no-provider=
    • Un miembro del personal de la oficina local de las CCR&R {0} comenzará a revisar su solicitud en un plazo de 10 días hábiles
    • Un miembro del personal se comunicará con usted para ayudarlo a encontrar un proveedor de cuidado de niños.
    • Recibirá una carta por correo o un mensaje de correo electrónico sobre su solicitud.
    • Es posible que se le pida que envíe documentos de verificación adicionales.
    -submit-confirmation.title=Su solicitud ha sido enviada -submit-confirmation.subtext=Su solicitud se envió a su Agencia de Recursos y Referencias del Cuidado de Niños (CCR&R) el {0} a las {1}. -submit-confirmation.download-text=Descargue una copia de su solicitud -submit-confirmation.rest-of-paragraph=y guárdela para su registro. -submit-confirmation.experience=Cuéntenos más sobre su experiencia con este sitio web. (Opcional). -submit-confirmation.survey.label=En general, ¿qué tan fácil o difícil fue para usted completar su solicitud en este sitio web? -submit-confirmation.survey.very-easy=Muy fácil -submit-confirmation.survey.easy=Fácil -submit-confirmation.survey.neither=Ni fácil ni difícil -submit-confirmation.survey.difficult=Difícil -submit-confirmation.survey.very-difficult=Muy difícil -submit-confirmation.comments.label=Comentarios adicionales -submit-confirmation.survey.complete=Muchas gracias por sus comentarios. -submit-confirmation.button.feedback=Enviar mis comentarios -submit-confirmation.button.return=Volver al inicio +submit-confirmation.general.experience=Cuéntenos más sobre su experiencia con este sitio web. (Opcional). +submit-confirmation.general.comments.label=Comentarios adicionales +submit-confirmation.general.survey.complete=Muchas gracias por sus comentarios. +submit-confirmation.general.call-text=Llame a su CCR&R si tiene preguntas sobre el estado de su solicitud. +submit-confirmation.general.button.feedback=Enviar mis comentarios +submit-confirmation.general.button.return=Volver a la página principal +submit-confirmation.general.subtext=

    Completada el {0} {1}.

    Su código de confirmación es: {2} #complete-submit-confirmation complete-submit-confirmation.title=Complete próximos pasos complete-submit-confirmation.header=¡Ha completado su solicitud en línea! -complete-submit-confirmation.subtext=

    Completada el {0} {1}.

    Su código de confirmación es: {2} complete-submit-confirmation.download-text=Descargue una copia de su solicitud complete-submit-confirmation.rest-of-download-paragraph=para su registro. -complete-submit-confirmation.call-text=Llame a su CCR&R -complete-submit-confirmation.rest-of-call-paragraph=si tiene preguntas sobre el estado de su solicitud. +complete-submit-confirmation.survey.label=En general, ¿qué tan fácil o difícil fue para usted completar su solicitud en este sitio web? # #doc-upload-recommended-docs @@ -1623,3 +1622,9 @@ registration-doc-upload-add-files.ein.body=Agregue una carta del IRS que muestre registration-doc-upload-add-files.license-exempt.header=Carta de exención de licencia registration-doc-upload-add-files.license-exempt.body=Agregue su carta de la agencia de licencias de su estado que indique que no necesita una licencia. registration-doc-upload-add-files.confirmation=Terminé de subir los archivos + +#registration-submit-confirmation +registration-submit-confirmation.title=Solicitud con el CCAP finalizada +registration-submit-confirmation.header=¡Ha terminado con su registro de proveedor! +registration-submit-confirmation.q1=¿Qué tan fácil o difícil fue la experiencia de responder a la solicitud de la familia? +registration-submit-confirmation.q2=¿Qué tan fácil o difícil fue la experiencia de registrarse como nuevo proveedor? diff --git a/src/main/resources/templates/error-invalid-code.html b/src/main/resources/templates/error-invalid-code.html index b46394a09..3f6a4e597 100644 --- a/src/main/resources/templates/error-invalid-code.html +++ b/src/main/resources/templates/error-invalid-code.html @@ -15,10 +15,11 @@

    diff --git a/src/test/java/org/ilgcc/app/journeys/ProviderresponseFlowJourneyTest.java b/src/test/java/org/ilgcc/app/journeys/ProviderresponseFlowJourneyTest.java index 00bcd9f95..2c536da04 100644 --- a/src/test/java/org/ilgcc/app/journeys/ProviderresponseFlowJourneyTest.java +++ b/src/test/java/org/ilgcc/app/journeys/ProviderresponseFlowJourneyTest.java @@ -275,11 +275,6 @@ void ProviderresponseJourneyTest_noLink_invalidConfirmationCode() { testPage.enter("providerResponseFamilyShortCode", ""); testPage.clickContinue(); - assertThat(testPage.getTitle()).isEqualTo(getEnMessage("errors.general-title")); - assertThat(testPage.hasErrorText(getEnMessage("errors.provide-applicant-number"))).isTrue(); - testPage.enter("providerResponseFamilyShortCode", "a2123b"); - testPage.clickContinue(); - assertThat(testPage.getTitle()).isEqualTo(getEnMessage("errors.general-title")); assertThat(testPage.hasErrorText(getEnMessage("errors.provide-applicant-number"))).isTrue(); testPage.enter("providerResponseFamilyShortCode", "123"); @@ -292,6 +287,10 @@ void ProviderresponseJourneyTest_noLink_invalidConfirmationCode() { assertThat(testPage.getTitle()).isEqualTo(getEnMessage("errors.general-title")); assertThat(testPage.hasErrorText(getEnMessage("errors.provide-applicant-number"))).isTrue(); + testPage.enter("providerResponseFamilyShortCode", "a2123b"); + testPage.clickContinue(); + // Confirmation codes that are correct but incorrect casing should still pass validation + assertThat(testPage.getTitle()).isEqualTo(getEnMessage("provider-response-response.title")); } @Test diff --git a/src/test/java/org/ilgcc/app/submission/actions/UploadSubmissionToS3Test.java b/src/test/java/org/ilgcc/app/submission/actions/UploadSubmissionToS3Test.java index ffcc88777..e74539be8 100644 --- a/src/test/java/org/ilgcc/app/submission/actions/UploadSubmissionToS3Test.java +++ b/src/test/java/org/ilgcc/app/submission/actions/UploadSubmissionToS3Test.java @@ -12,6 +12,7 @@ import java.time.OffsetDateTime; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -40,6 +41,7 @@ void setUp() { submission.setId(UUID.randomUUID()); } + @Disabled @Test void whenRun_thenPdfIsZippedAndUploadedToS3() throws IOException, InterruptedException {