diff --git a/cypress/integration/birth.spec.ts b/cypress/integration/birth.spec.ts index 8b7df746d..b07fc1346 100644 --- a/cypress/integration/birth.spec.ts +++ b/cypress/integration/birth.spec.ts @@ -9,7 +9,7 @@ * Copyright (C) The OpenCRVS Authors located at https://github.com/opencrvs/opencrvs-core/blob/master/AUTHORS. */ -import faker from "@faker-js/faker" +import faker from '@faker-js/faker' context('Birth Integration Test', () => { beforeEach(() => { @@ -30,7 +30,18 @@ context('Birth Integration Test', () => { cy.login('fieldWorker') cy.createPin() cy.verifyLandingPageVisible() - cy.enterMaximumInput({ informantType, motherDoB, motherFirstNames, motherFamilyName, fatherDoB, fatherFirstNames, fatherFamilyName, informantFirstNames, informantFamilyName, informantDoB }) + cy.enterMaximumInput({ + informantType, + motherDoB, + motherFirstNames, + motherFamilyName, + fatherDoB, + fatherFirstNames, + fatherFamilyName, + informantFirstNames, + informantFamilyName, + informantDoB + }) cy.submitDeclaration() cy.logout() }) @@ -81,7 +92,18 @@ context('Birth Integration Test', () => { cy.login('registrar') cy.createPin() cy.verifyLandingPageVisible() - cy.enterMaximumInput({ informantType, motherDoB, motherFirstNames, motherFamilyName, fatherDoB, fatherFirstNames, fatherFamilyName, informantFirstNames, informantFamilyName, informantDoB }) + cy.enterMaximumInput({ + informantType, + motherDoB, + motherFirstNames, + motherFamilyName, + fatherDoB, + fatherFirstNames, + fatherFamilyName, + informantFirstNames, + informantFamilyName, + informantDoB + }) //register declaration cy.get('#registerDeclarationBtn').click() cy.get('#submit_confirm').click() diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index b959de2dc..ed2643901 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -306,13 +306,14 @@ Cypress.Commands.add('declareDeclarationWithMinimumInput', () => { ) cy.get('#childBirthDate-yyyy').type('2018') cy.selectOption('#placeOfBirth', 'Private_Home', 'Residential address') - cy.selectOption('#country', 'Farajaland', 'Farajaland') - cy.selectOption('#state', 'Pualula', 'Pualula') - cy.selectOption('#district', 'Embe', 'Embe') + cy.selectOption('#countryPlaceofbirth', 'Farajaland', 'Farajaland') + cy.selectOption('#statePlaceofbirth', 'Pualula', 'Pualula') + cy.selectOption('#districtPlaceofbirth', 'Embe', 'Embe') cy.goToNextFormSection() // SELECT INFORMANT cy.selectOption('#informantType', 'Mother', 'Mother') + cy.wait(500) cy.get('#registrationPhone').type('07' + getRandomNumbers(8)) cy.goToNextFormSection() @@ -323,9 +324,9 @@ Cypress.Commands.add('declareDeclarationWithMinimumInput', () => { cy.get('#motherBirthDate-dd').type('23') cy.get('#motherBirthDate-mm').type('10') cy.get('#motherBirthDate-yyyy').type('1969') - cy.selectOption('#countryPrimary-form-input', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') + cy.selectOption('#countryPrimaryMother', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryMother', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryMother', 'Embe', 'Embe') cy.goToNextFormSection() // FATHER DETAILS @@ -474,21 +475,21 @@ Cypress.Commands.add('enterMaximumInput', (options) => { cy.selectOption('#birthType', 'Single', 'Single') cy.get('#weightAtBirth').type('1.5') cy.selectOption('#placeOfBirth', 'Private_Home', 'Residential address') - cy.selectOption('#country', 'Farajaland', 'Farajaland') + cy.selectOption('#countryPlaceofbirth', 'Farajaland', 'Farajaland') cy.selectOption( - '#state', + '#statePlaceofbirth', options?.eventLocationLevel1 || 'Pualula', options?.eventLocationLevel1 || 'Pualula' ) cy.selectOption( - '#district', + '#districtPlaceofbirth', options?.eventLocationLevel2 || 'Embe', options?.eventLocationLevel2 || 'Embe' ) - cy.get('#cityUrbanOption').type('My city') - cy.get('#addressLine3UrbanOption').type('My residential area') - cy.get('#addressLine2UrbanOption').type('My street') - cy.get('#numberUrbanOption').type('40') + cy.get('#cityPlaceofbirth').type('My city') + cy.get('#addressLine1UrbanOptionPlaceofbirth').type('My residential area') + cy.get('#addressLine2UrbanOptionPlaceofbirth').type('My street') + cy.get('#addressLine3UrbanOptionPlaceofbirth').type('40') cy.goToNextFormSection() // SELECT INFORMANT @@ -497,6 +498,7 @@ Cypress.Commands.add('enterMaximumInput', (options) => { options?.informantType || 'Grandfather', options?.informantType || 'Grandfather' ) + cy.wait(500) cy.get('#registrationPhone').type('07' + getRandomNumbers(8)) cy.get('#registrationEmail').type('axonishere@gmail.com') @@ -510,12 +512,11 @@ Cypress.Commands.add('enterMaximumInput', (options) => { cy.get('#informantBirthDate-yyyy').type(informantDoBSplit.yyyy || '1975') cy.selectOption('#nationality', 'Farajaland', 'Farajaland') cy.get('#informantID').type(getRandomNumbers(10)) - cy.selectOption('#countryPrimary-form-input', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') - cy.goToNextFormSection() + cy.selectOption('#countryPrimaryInformant', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryInformant', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryInformant', 'Embe', 'Embe') } - + cy.goToNextFormSection() // MOTHER DETAILS cy.get('#iD').type(getRandomNumbers(10)) cy.get('#motherBirthDate-dd').type(motherDoBSplit?.dd || '23') @@ -530,14 +531,14 @@ Cypress.Commands.add('enterMaximumInput', (options) => { cy.get('#multipleBirth').type('2') cy.get('#occupation').type('Lawyer') cy.selectOption('#educationalAttainment', 'PRIMARY_ISCED_1', 'Primary') - cy.selectOption('#countryPrimary-form-input', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') - cy.get('#cityUrbanOptionPrimary').type('My town') - cy.get('#addressLine3UrbanOptionPrimary').type('My residental area') - - cy.get('#addressLine2UrbanOptionPrimary').type('My street') - cy.get('#numberUrbanOptionPrimary').type('40') + cy.selectOption('#countryPrimaryMother', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryMother', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryMother', 'Embe', 'Embe') + cy.get('#cityPrimaryMother').type('My town') + cy.get('#addressLine1UrbanOptionPrimaryMother').type('My residental area') + + cy.get('#addressLine2UrbanOptionPrimaryMother').type('My street') + cy.get('#addressLine3UrbanOptionPrimaryMother').type('40') cy.goToNextFormSection() // FATHER DETAILS @@ -552,13 +553,13 @@ Cypress.Commands.add('enterMaximumInput', (options) => { cy.get('#occupation').type('Lawyer') cy.selectOption('#educationalAttainment', 'PRIMARY_ISCED_1', 'Primary') cy.get('#primaryAddressSameAsOtherPrimary_false').click() - cy.selectOption('#countryPrimary', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') - cy.get('#cityUrbanOptionPrimary').type('My town') - cy.get('#addressLine3UrbanOptionPrimary').type('My residential area') - cy.get('#addressLine2UrbanOptionPrimary').type('My street') - cy.get('#numberUrbanOptionPrimary').type('40') + cy.selectOption('#countryPrimaryFather', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryFather', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryFather', 'Embe', 'Embe') + cy.get('#cityPrimaryFather').type('My town') + cy.get('#addressLine1UrbanOptionPrimaryFather').type('My residential area') + cy.get('#addressLine2UrbanOptionPrimaryFather').type('My street') + cy.get('#addressLine2UrbanOptionPrimaryFather').type('40') cy.goToNextFormSection() // DOCUMENTS @@ -611,9 +612,9 @@ Cypress.Commands.add('declareDeathDeclarationWithMinimumInput', (options) => { cy.get('#deceasedBirthDate-mm').type('06') cy.get('#deceasedBirthDate-yyyy').type('1988') cy.selectOption('#gender', 'Male', 'Male') - cy.selectOption('#countryPrimary', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') + cy.selectOption('#countryPrimaryDeceased', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryDeceased', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryDeceased', 'Embe', 'Embe') cy.goToNextFormSection() // EVENT DETAILS @@ -624,6 +625,7 @@ Cypress.Commands.add('declareDeathDeclarationWithMinimumInput', (options) => { // MANNER OF DEATH cy.selectOption('#mannerOfDeath', '', 'Natural causes') cy.get('#causeOfDeathEstablished').click() + cy.wait(500) cy.selectOption('#causeOfDeathMethod', '', 'Physician') cy.selectOption('#placeOfDeath', '', "Deceased's usual place of residence") @@ -634,6 +636,7 @@ Cypress.Commands.add('declareDeathDeclarationWithMinimumInput', (options) => { options?.informantType || 'Spouse', options?.informantType || 'Spouse' ) + cy.wait(500) cy.get('#informantID').type('9123456781') cy.get('#informantBirthDate-dd').type('16') cy.get('#informantBirthDate-mm').type('06') @@ -708,14 +711,14 @@ Cypress.Commands.add('enterDeathMaximumInput', (options) => { options?.deceasedGender || 'Male', options?.deceasedGender || 'Male' ) - cy.selectOption('#countryPrimary', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') - cy.get('#cityUrbanOptionPrimary').type('My town') - cy.get('#addressLine3UrbanOptionPrimary').type('My residential area') - cy.get('#addressLine2UrbanOptionPrimary').type('My street') - cy.get('#numberUrbanOptionPrimary').type('40') - cy.get('#postcodePrimary').type('9000') + cy.selectOption('#countryPrimaryDeceased', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryDeceased', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryDeceased', 'Embe', 'Embe') + cy.get('#cityPrimaryDeceased').type('My town') + cy.get('#addressLine1UrbanOptionPrimaryDeceased').type('My residential area') + cy.get('#addressLine2UrbanOptionPrimaryDeceased').type('My street') + cy.get('#addressLine3UrbanOptionPrimaryDeceased').type('40') + cy.get('#postalCodePrimaryDeceased').type('9000') cy.goToNextFormSection() // EVENT DETAILS cy.get('#deathDate-dd').type('18') @@ -725,25 +728,26 @@ Cypress.Commands.add('enterDeathMaximumInput', (options) => { // CAUSE OF DEATH DETAILS cy.selectOption('#mannerOfDeath', '', 'Homicide') cy.get('#causeOfDeathEstablished').click() + cy.wait(500) cy.selectOption('#causeOfDeathMethod', '', 'Physician') cy.selectOption('#placeOfDeath', '', 'Other') - cy.selectOption('#country', 'Farajaland', 'Farajaland') + cy.selectOption('#countryPlaceofdeath', 'Farajaland', 'Farajaland') cy.selectOption( - '#state', + '#statePlaceofdeath', options?.eventLocationLevel1 || 'Pualula', options?.eventLocationLevel1 || 'Pualula' ) cy.selectOption( - '#district', + '#districtPlaceofdeath', options?.eventLocationLevel2 || 'Embe', options?.eventLocationLevel2 || 'Embe' ) - cy.get('#cityUrbanOption').type('My city') - cy.get('#addressLine3UrbanOption').type('My residential area') - cy.get('#addressLine2UrbanOption').type('My street') - cy.get('#numberUrbanOption').type('40') - cy.get('#postalCode').type('9000') + cy.get('#cityPlaceofdeath').type('My city') + cy.get('#addressLine1UrbanOptionPlaceofdeath').type('My residential area') + cy.get('#addressLine2UrbanOptionPlaceofdeath').type('My street') + cy.get('#addressLine3UrbanOptionPlaceofdeath').type('40') + cy.get('#postalCodePlaceofdeath').type('9000') cy.goToNextFormSection() // INFORMANT DETAILS @@ -752,6 +756,7 @@ Cypress.Commands.add('enterDeathMaximumInput', (options) => { options?.informantType || 'Spouse', options?.informantType || 'Spouse' ) + cy.wait(500) cy.get('#registrationPhone').type('07' + getRandomNumbers(8)) cy.get('#registrationEmail').type('axonishere@gmail.com') cy.get('#firstNamesEng').type(options?.informantFirstNames || 'Alom') @@ -762,11 +767,11 @@ Cypress.Commands.add('enterDeathMaximumInput', (options) => { cy.selectOption('#nationality', 'Farajaland', 'Farajaland') cy.get('#informantID').type(getRandomNumbers(10)) cy.get('#primaryAddressSameAsOtherPrimary_false').click() - cy.selectOption('#countryPrimary-form-input', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') - cy.get('#cityUrbanOptionPrimary').type('My town') - cy.get('#postcodePrimary').type('9000') + cy.selectOption('#countryPrimaryInformant', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryInformant', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryInformant', 'Embe', 'Embe') + cy.get('#cityPrimaryInformant').type('My town') + cy.get('#postalCodePrimaryInformant').type('9000') cy.goToNextFormSection() cy.goToNextFormSection() }) @@ -792,17 +797,18 @@ Cypress.Commands.add('someoneElseJourney', () => { cy.selectOption('#birthType', 'Single', 'Single') cy.get('#weightAtBirth').type('1.5') cy.selectOption('#placeOfBirth', 'Private_Home', 'Residential address') - cy.selectOption('#country', 'Farajaland', 'Farajaland') - cy.selectOption('#state', 'Pualula', 'Pualula') - cy.selectOption('#district', 'Embe', 'Embe') - cy.get('#cityUrbanOption').type('My city') - cy.get('#addressLine3UrbanOption').type('My residential area') - cy.get('#addressLine2UrbanOption').type('My street') - cy.get('#numberUrbanOption').type('40') + cy.selectOption('#countryPlaceofbirth', 'Farajaland', 'Farajaland') + cy.selectOption('#statePlaceofbirth', 'Pualula', 'Pualula') + cy.selectOption('#districtPlaceofbirth', 'Embe', 'Embe') + cy.get('#cityPlaceofbirth').type('My city') + cy.get('#addressLine1UrbanOptionPlaceofbirth').type('My residential area') + cy.get('#addressLine2UrbanOptionPlaceofbirth').type('My street') + cy.get('#addressLine3UrbanOptionPlaceofbirth').type('40') cy.goToNextFormSection() // SELECT INFORMANT cy.selectOption('#informantType', 'Someone else', 'Someone else') + cy.wait(500) cy.get('#otherInformantType').type('Someone else') cy.get('#registrationPhone').type('07' + getRandomNumbers(8)) cy.get('#registrationEmail').type('axonishere@gmail.com') @@ -815,9 +821,9 @@ Cypress.Commands.add('someoneElseJourney', () => { cy.get('#informantBirthDate-yyyy').type('1975') cy.selectOption('#nationality', 'Farajaland', 'Farajaland') cy.get('#informantID').type('1234567111') - cy.selectOption('#countryPrimary-form-input', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') + cy.selectOption('#countryPrimaryInformant', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryInformant', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryInformant', 'Embe', 'Embe') cy.goToNextFormSection() // MOTHER DETAILS @@ -828,9 +834,9 @@ Cypress.Commands.add('someoneElseJourney', () => { cy.get('#motherBirthDate-yyyy').type('1975') cy.get('#firstNamesEng').type('Agnes') cy.get('#familyNameEng').type('Aktar') - cy.selectOption('#countryPrimary-form-input', 'Farajaland', 'Farajaland') - cy.selectOption('#statePrimary', 'Pualula', 'Pualula') - cy.selectOption('#districtPrimary', 'Embe', 'Embe') + cy.selectOption('#countryPrimaryMother', 'Farajaland', 'Farajaland') + cy.selectOption('#statePrimaryMother', 'Pualula', 'Pualula') + cy.selectOption('#districtPrimaryMother', 'Embe', 'Embe') cy.goToNextFormSection() // FATHER DETAILS diff --git a/package.json b/package.json index ad4f2e258..ac851cc56 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,8 @@ "@octokit/core": "4.2.1", "@types/bcryptjs": "^2.4.2", "@types/google-libphonenumber": "^7.4.23", + "@types/hapi__inert": "5.2.1", "@types/handlebars": "^4.1.0", - "@types/hapi__inert": "^5.2.3", "@types/jsonwebtoken": "^8.5.8", "@types/libsodium-wrappers": "^0.7.10", "@types/react-intl": "^3.0.0", @@ -74,7 +74,7 @@ "@types/code": "^4.0.3", "@types/csv2json": "^1.4.0", "@types/dotenv": "^6.1.0", - "@types/fhir": "^0.0.30", + "@types/fhir": "0.0.30", "@types/geojson": "^7946.0.4", "@types/hapi-pino": "^6.3.0", "@types/hapi__boom": "^9.0.1", diff --git a/src/api/application/application-config-default.ts b/src/api/application/application-config-default.ts index 32e310e94..48acc7379 100644 --- a/src/api/application/application-config-default.ts +++ b/src/api/application/application-config-default.ts @@ -45,7 +45,7 @@ export const defaultApplicationConfig = { MARRIAGE_REGISTRATION: true, DATE_OF_BIRTH_UNKNOWN: false, INFORMANT_SIGNATURE: true, - INFORMANT_SIGNATURE_REQUIRED: true, + INFORMANT_SIGNATURE_REQUIRED: false, USER_NOTIFICATION_DELIVERY_METHOD: 'email', // or 'sms', or '' ... You can use 'sms' for WhatsApp INFORMANT_NOTIFICATION_DELIVERY_METHOD: 'email', // or 'sms', or '' ... You can use 'sms' for WhatsApp SIGNATURE_REQUIRED_FOR_ROLES: ['LOCAL_REGISTRAR', 'NATIONAL_REGISTRAR'] diff --git a/src/api/content/client/client.json b/src/api/content/client/client.json index be76e9c21..5d0c9a654 100644 --- a/src/api/content/client/client.json +++ b/src/api/content/client/client.json @@ -22,6 +22,7 @@ "buttons.continue": "Continue", "buttons.delete": "Delete", "buttons.deleteDeclaration": "Delete declaration", + "buttons.printDeclaration": "Print declaration", "buttons.drafts": "Drafts", "buttons.edit": "Edit", "buttons.editRecord": "No, make correction", @@ -500,6 +501,7 @@ "correction.reason.additionalComment": "Comments", "correction.reason.clericalError": "Myself or an agent made a mistake (Clerical error)", "correction.reason.error": "Reason for change", + "correction.reason.other": "Other", "correction.reason.judicialOrder": "Requested to do so by the court (Judicial order)", "correction.reason.materialError": "Informant provided incorrect information (Material error)", "correction.reason.materialOmission": "Informant did not provide this information (Material omission)", @@ -1599,6 +1601,11 @@ "print.certificate.toast.message": "Certificate is ready to print", "print.certificate.userReviewed": "The informant has reviewed and confirmed that the information on the certificate is correct.", "print.certificate.noPayment": "No payment required", + "print.declaration.civilRegistrationOffice": "Civil registration office", + "print.declaration.header.title": "Civil Registration Centre", + "print.declaration.informantAttestation": "I attest to having received this {eventType, select, birth{birth} death{death} marriage{marriage} other{}} declaration", + "print.declaration.placeOfDeclaration": "Place of declaration", + "print.declaration.warning.declarationDetails": "To be completed by office", "record.certificate.collector": "Printed on collection", "record.certificate.collectedInAdvance": "Printed in advance by", "recordAudit.archive.confirmation.body": "This will archive the record and remove it from your workspace", @@ -1631,7 +1638,10 @@ "recordAudit.regAction.assigned": "Assigned", "recordAudit.regAction.downloaded": "Retrieved", "recordAudit.regAction.reinstated": "Reinstated to {regStatus, select, validated{ready for review} in_progress{in progress} declared{ready for review} rejected{requires updates} other{}}", - "recordAudit.regAction.requestedCorrection": "Corrected record", + "recordAudit.regAction.requestedCorrection": "Correction requested", + "recordAudit.regAction.approvedCorrection": "Correction approved", + "recordAudit.regAction.rejectedCorrection": "Correction rejected", + "recordAudit.regAction.corrected": "Record corrected", "recordAudit.regAction.unassigned": "Unassigned", "recordAudit.regAction.viewed": "Viewed", "recordAudit.regAction.markedAsDuplicate": "Marked as a duplicate", @@ -1719,7 +1729,7 @@ "register.form.missingFieldsDescription": "The following information will be submitted for validation. Please\n make sure all required details have been filled in correctly. There\n are {numberOfErrors} missing mandatory fields in your form:", "register.form.modal.areYouReadyToSubmit": "Are you ready to submit?", "register.form.modal.desc.saveDeclarationConfirm": "All inputted data will be kept secure for future editing. Are you ready to save any changes to this declaration form?", - "register.form.modal.desc.validateConfirmation": "This declaration will be sent to the registrar for approval.", + "register.form.modal.desc.validateConfirmation": "This declaration will be sent for approval prior to registration.", "register.form.modal.submitDescription": "By clicking “Submit” you confirm that the informant has read and reviewed the information and understands that this information will be shared with Civil Registration authorities.", "register.form.modal.title.saveDeclarationConfirm": "Save & exit?", "register.form.modal.title.deleteDeclarationConfirm": "Delete draft?", @@ -1775,6 +1785,7 @@ "review.actions.desc.regConfInComp": "Please add mandatory information before registering.", "review.actions.description.confirmComplete": "The informant will receive an {deliveryMethod} with a registration number that they can use to collect the certificate.", "review.actions.description.confirmInComplete": "The informant will receive an {deliveryMethod} with a tracking ID that they can use to provide the additional mandatory information required for registration.", + "review.actions.description.hasError": "Please ensure all fields are either empty or have a valid value in them.", "review.actions.description": "By clicking register, you confirm that the information entered is correct and the vital event can be registered. ", "review.actions.title.declarationStatus": "Declaration {completeDeclaration, select, true {complete} other {incomplete}}", "review.actions.title.registerActionTitle": "Register event", @@ -2047,7 +2058,7 @@ "userSetup.waiting": "Setting up your account", "validate.complete.declaration.action.description": "The informant will receive an with a registration number that they can use to collect the certificate.", "validate.complete.declaration.action.title": "Declaration complete", - "validate.declaration.action.modal.description": "This declaration will be sent to the registrar for approval.", + "validate.declaration.action.modal.description": "This declaration will be sent for approval prior to registration.", "review.inputs.informantsSignature": "Signature of informant", "review.signature.description": "I, the undersigned, hereby declare that the particulars in this form are true and correct to the best of my knowledge.", "review.signature.input.description": "By signing this document with an electronic signature, I agree that such signature will be valid as handwritten signatures to the extent allowed by the laws of Farajaland.", @@ -2057,7 +2068,6 @@ "review.inputs.witnessTwoSignature": "Signature of Witness 2", "review.inputs.terms": "We, the undersigned declare under penalty of perjury under the laws of Farajaland that the forgoing information is true and correct to the best of our knowledge and belief. We further declare that no legal objections to the marriage is known and hereby apply for a certificate of marriage", "review.signature.clear": "Clear", - "review.signature.open": "Sign", "review.signature.delete": "Delete", "validate.declaration.action.modal.title": "Send for approval?", @@ -2128,6 +2138,7 @@ "buttons.continue": "Continuer", "buttons.delete": "Supprimer", "buttons.deleteDeclaration": "Supprimer la déclaration", + "buttons.printDeclaration": "Imprimer la déclaration", "buttons.drafts": "Brouillons", "buttons.edit": "Modifier", "buttons.editRecord": "Non, faites la correction", @@ -2610,6 +2621,7 @@ "correction.reason.materialError": "L'informateur a fourni des informations incorrectes (erreur matérielle)", "correction.reason.materialOmission": "L'informateur n'a pas fourni cette information (Omission matérielle)", "correction.reason.reasonForChange": "Motif de la correction", + "correction.reason.other": "Autre", "correction.reason.title": "Quelle était la raison de la correction ?", "correction.request": "Correction demandée", "correction.summary.addComments": "Ajouter des commentaires", @@ -3701,6 +3713,11 @@ "print.certificate.signature.person1": "UP Secrétaire Kylian Mbappe", "print.certificate.signature.person2": "Registrar local Antoine Griezmann", "print.certificate.noPayment": "Aucun paiement requis", + "print.declaration.civilRegistrationOffice": "Bureau d'état civil", + "print.declaration.header.title": "Centre d’Etat Civil", + "print.declaration.informantAttestation": "J’atteste avoir reçu cetter déclaration de {eventType, select, birth{naissance} death{décès} marriage{mariage} other{}}", + "print.declaration.placeOfDeclaration": "Lieu de déclaration", + "print.declaration.warning.declarationDetails": "Partie réservée à l’officier d’état civil", "record.certificate.collector": "Contrôle d'identité", "record.certificate.collectedInAdvance": "Imprimé à l'avance par", "recordAudit.archive.confirmation.body": "Cela supprimera la déclaration de la file d'attente et changera son statut en archive. Pour annuler ce changement, vous devrez rechercher la déclaration.", @@ -3733,7 +3750,10 @@ "recordAudit.regAction.assigned": "Assigné", "recordAudit.regAction.downloaded": "Consulté sur", "recordAudit.regAction.reinstated": "Réintégré à {regStatus, select, validated{prêt pour la révision} in_progress{en cours} declared{prêt pour la révision} rejected{nécessite des mises à jour} other{}}", - "recordAudit.regAction.requestedCorrection": "Enregistrement corrigé", + "recordAudit.regAction.requestedCorrection": "Correction demandée", + "recordAudit.regAction.approvedCorrection": "Correction approuvée", + "recordAudit.regAction.rejectedCorrection": "Correction rejetée", + "recordAudit.regAction.corrected": "Enregistrement corrigé", "recordAudit.regAction.unassigned": "Non assigné", "recordAudit.regAction.viewed": "Vu", "recordAudit.regAction.markedAsDuplicate": "Marqué comme un doublon", @@ -3821,7 +3841,7 @@ "register.form.missingFieldsDescription": "Les informations suivantes seront soumises pour validation. Veuillez vous assurer que tous les détails requis ont été remplis correctement. Il y a {numberOfErrors} de champs obligatoires manquants dans votre formulaire :", "register.form.modal.areYouReadyToSubmit": "Êtes-vous prêt à soumettre ?", "register.form.modal.desc.saveDeclarationConfirm": "Toutes les données saisies seront conservées en toute sécurité pour de futures modifications. Êtes-vous prêt à enregistrer les modifications apportées à ce formulaire de déclaration?", - "register.form.modal.desc.validateConfirmation": "Cette déclaration sera envoyée à l'officier d'état civil pour qu'il l'approuve.", + "register.form.modal.desc.validateConfirmation": "Cette déclaration sera envoyée pour approbation avant l'enregistrement.", "register.form.modal.submitDescription": "En cliquant sur Soumettre, vous confirmez que l'informateur a lu et revu les informations et qu'il comprend que ces informations seront partagées avec les autorités de l'état civil.", "register.form.modal.title.saveDeclarationConfirm": "Enregistrer et quitter?", "register.form.modal.title.submitConfirmation": "{completeDeclaration, select, true {Envoyer une déclaration pour examen ?} other {Envoyer une déclaration incomplète ?}}", @@ -3877,6 +3897,7 @@ "review.actions.desc.regConfInComp": "Des informations obligatoires sont manquantes. Veuillez ajouter ces informations afin de pouvoir terminer le processus d'enregistrement.", "review.actions.description.confirmComplete": "En envoyant cette déclaration pour examen, vous confirmez que les informations ont été examinées par l'informateur et qu'il sait qu'il recevra un {deliveryMethod} avec un identifiant de suivi et des détails sur la manière de récupérer l'acte de naissance.", "review.actions.description.confirmInComplete": "En envoyant cette déclaration {deliveryMethod}omplète, vous créez un enregistrement numérique. Nous informons l'informateur qu'il recevra un {deliveryMethod} avec un identifiant de suivi. Il en aura besoin pour compléter la déclaration dans un bureau d'enregistrement dans les 30 jours. L'informateur devra fournir toutes les informations obligatoires avant que la naissance puisse être enregistrée.", + "review.actions.description.hasError": "Veuillez vous assurer que tous les champs sont vides ou qu'ils contiennent une valeur valide.", "review.actions.description": "En vous enregistrant, vous confirmez que vous avez examiné cette déclaration et que vous êtes convaincu qu'elle remplit les conditions requises pour l'enregistrement.", "review.actions.title.declarationStatus": "Déclaration {completeDeclaration, select, true {complet} other {incomplet}}", "review.actions.title.registerActionTitle": "Enregistrer l'événement", @@ -4149,7 +4170,7 @@ "userSetup.waiting": "Configuration de votre compte", "validate.complete.declaration.action.description": "En envoyant pour approbation, vous confirmez que la déclaration est prête à être approuvée.", "validate.complete.declaration.action.title": "Envoyer pour approbation ou rejeter ?", - "validate.declaration.action.modal.description": "Cette déclaration sera envoyée à l'officier d'état civil pour l'enregistrement.", + "validate.declaration.action.modal.description": "Cette déclaration sera envoyée pour approbation avant l'enregistrement.", "review.inputs.informantsSignature": "Signature de l'informateur", "review.signature.description": "Je soussigné(e) déclare par la présente que les informations contenues dans ce formulaire sont, à ma connaissance, vraies et correctes.", "review.signature.input.description": "En signant ce document avec une signature électronique, j'accepte que cette signature soit valable comme les signatures manuscrites dans la mesure où les lois du Farajaland le permettent.", diff --git a/src/api/content/client/descriptions.json b/src/api/content/client/descriptions.json index 49eaa9733..0d42e8c5b 100644 --- a/src/api/content/client/descriptions.json +++ b/src/api/content/client/descriptions.json @@ -1045,6 +1045,7 @@ "misc.title.declarationStatus": "Title for review action component", "review.actions.description.confirmComplete": "Description for review action component when complete declaration", "review.actions.description.confirmInComplete": "Description for review action component when incomplete declaration", + "review.actions.description.hasError": "Description for review action component when declaration has errors on fields", "review.actions.title.declarationStatus": "Title for review action component", "review.form.section.review.name": "Form section name for Review", "review.form.section.review.title": "Form section title for Review", diff --git a/src/api/notification/email-service.ts b/src/api/notification/email-service.ts index 088014d80..7b8c64361 100644 --- a/src/api/notification/email-service.ts +++ b/src/api/notification/email-service.ts @@ -106,6 +106,17 @@ type UsernameUpdateVariables = { countryLogo: string } +type ApproveCorrectionVariables = { + firstNames: string + lastName: string + event: string + trackingId: string + applicationName: string + countryLogo: string +} + +type RejectCorrectionVariables = ApproveCorrectionVariables & { reason: string } + type DeclarationCommonVariables = { trackingId: string crvsOffice: string @@ -176,6 +187,20 @@ const templates = { subject: 'Account username updated', template: readOtherTemplate('username-updated') }, + 'correction-approved': { + type: 'correction-approved', + subject: 'Correction request approved', + template: readOtherTemplate( + 'correction-approved' + ) + }, + 'correction-rejected': { + type: 'correction-rejected', + subject: 'Correction request rejected', + template: readOtherTemplate( + 'correction-rejected' + ) + }, birthInProgressNotification: { type: 'birthInProgressNotification', subject: 'Birth declaration in progress', diff --git a/src/api/notification/email-templates/birth/registration.html b/src/api/notification/email-templates/birth/registration.html index bb6e08623..0f1e52e5f 100644 --- a/src/api/notification/email-templates/birth/registration.html +++ b/src/api/notification/email-templates/birth/registration.html @@ -43,7 +43,7 @@

Birth registration completed

Congratulations, the birth of {{name}} has been registered.

- Your birth registration numnber (BRN) is: {{registrationNumber}} + Your birth registration number (BRN) is: {{registrationNumber}}

Please visit {{crvsOffice}} with your ID to collect your birth certificate. Your registration tracking ID is @@ -58,4 +58,4 @@

Birth registration completed

This is an automated message. Please do not reply to this email. - \ No newline at end of file + diff --git a/src/api/notification/email-templates/birth/rejection.html b/src/api/notification/email-templates/birth/rejection.html index 4bfb7372e..8f6d0bc1e 100644 --- a/src/api/notification/email-templates/birth/rejection.html +++ b/src/api/notification/email-templates/birth/rejection.html @@ -40,7 +40,7 @@

Birth declaration requires changes

Hello {{informantName}},

- Your birth declaration for {{name}} is requires updates. Please visit {{crvsOffice}} to complete your + Your birth declaration for {{name}} requires updates. Please visit {{crvsOffice}} to complete your declaration with your supporting documents.

@@ -55,4 +55,4 @@

Birth declaration requires changes

This is an automated message. Please do not reply to this email. - \ No newline at end of file + diff --git a/src/api/notification/email-templates/death/registration.html b/src/api/notification/email-templates/death/registration.html index 524b7e247..83e900fae 100644 --- a/src/api/notification/email-templates/death/registration.html +++ b/src/api/notification/email-templates/death/registration.html @@ -43,7 +43,7 @@

Death registration completed

Congratulations, the death of {{name}} has been registered.

- Your death registration numnber (DRN) is: {{registrationNumber}} + Your death registration number (DRN) is: {{registrationNumber}}

Please visit {{crvsOffice}} with your ID to collect your death certificate. Your registration tracking ID is @@ -58,4 +58,4 @@

Death registration completed

This is an automated message. Please do not reply to this email. - \ No newline at end of file + diff --git a/src/api/notification/email-templates/death/rejection.html b/src/api/notification/email-templates/death/rejection.html index ebeb208f7..2d293a8ce 100644 --- a/src/api/notification/email-templates/death/rejection.html +++ b/src/api/notification/email-templates/death/rejection.html @@ -40,7 +40,7 @@

Death declaration requires changes

Hello {{informantName}},

- Your death declaration for {{name}} is requires updates. Please visit {{crvsOffice}} to complete your + Your death declaration for {{name}} requires updates. Please visit {{crvsOffice}} to complete your declaration with your supporting documents.

@@ -55,4 +55,4 @@

Death declaration requires changes

This is an automated message. Please do not reply to this email. - \ No newline at end of file + diff --git a/src/api/notification/email-templates/marriage/registration.html b/src/api/notification/email-templates/marriage/registration.html index 997abf164..91e2a8df7 100644 --- a/src/api/notification/email-templates/marriage/registration.html +++ b/src/api/notification/email-templates/marriage/registration.html @@ -43,7 +43,7 @@

Marriage registration completed

Congratulations, the marriage of {{groomName}} and {{birdeName}} has been registered.

- Your marriage registration numnber (MRN) is: {{registrationNumber}} + Your marriage registration number (MRN) is: {{registrationNumber}}

Please visit {{crvsOffice}} with your ID to collect your marriage certificate. Your registration tracking ID is @@ -58,4 +58,4 @@

Marriage registration completed

This is an automated message. Please do not reply to this email. - \ No newline at end of file + diff --git a/src/api/notification/email-templates/marriage/rejection.html b/src/api/notification/email-templates/marriage/rejection.html index d8c8c6a17..bfee2ce5e 100644 --- a/src/api/notification/email-templates/marriage/rejection.html +++ b/src/api/notification/email-templates/marriage/rejection.html @@ -40,7 +40,7 @@

Marriage declaration requires changes

Hello {{informantName}},

- Your marriage declaration for {{groomName}} and {{brideName}} is requires updates. Please visit {{crvsOffice}} + Your marriage declaration for {{groomName}} and {{brideName}} requires updates. Please visit {{crvsOffice}} to complete your declaration with your supporting documents.

@@ -55,4 +55,4 @@

Marriage declaration requires changes

This is an automated message. Please do not reply to this email. - \ No newline at end of file + diff --git a/src/api/notification/email-templates/other/correction-approved.html b/src/api/notification/email-templates/other/correction-approved.html new file mode 100644 index 000000000..848ae8da9 --- /dev/null +++ b/src/api/notification/email-templates/other/correction-approved.html @@ -0,0 +1,45 @@ + + + + + + + + + country_logo +

Correction approved

+

+ Dear {{firstNames}} {{lastName}}

+ + Your request to correct the {{event}} record {{trackingId}} has been + approved.

+

+ +

+ Best regards,
+ {{applicationName}} Team +

+ + diff --git a/src/api/notification/email-templates/other/correction-rejected.html b/src/api/notification/email-templates/other/correction-rejected.html new file mode 100644 index 000000000..fb8f4bd3a --- /dev/null +++ b/src/api/notification/email-templates/other/correction-rejected.html @@ -0,0 +1,50 @@ + + + + + + + + + country_logo +

Correction rejected

+

+ Dear {{firstNames}} {{lastName}}

+ + Unfortunately your request to correct the {{event}} record {{trackingId}} + has been rejected.

+

+ +

+ Reason for rejection:
+ {{reason}} +

+ +

+ Best regards,
+ {{applicationName}} Team +

+ + diff --git a/src/form/addresses/address-fields.ts b/src/form/addresses/address-fields.ts index 5e7780ea1..40193ec53 100644 --- a/src/form/addresses/address-fields.ts +++ b/src/form/addresses/address-fields.ts @@ -73,12 +73,21 @@ export const getXAddressSameAsY = ( // A select field that uses the loaded administrative location levels from Humdata // We recommend that you do not edit this function -export function getAddressLocationSelect( - section: string, - location: string, - useCase: string, - locationIndex?: number -): SerializedFormField { +export function getAddressLocationSelect({ + section, + location, + useCase, + fhirLineArrayPosition, + isLowestAdministrativeLevel +}: { + section: string + location: string + useCase: string + /** Position where the location gets mapped into within a fhir.Address line-array */ + fhirLineArrayPosition?: number + /** If the structure the smallest possible level. Allows saving fhir.Address.partOf */ + isLowestAdministrativeLevel?: boolean +}): SerializedFormField { const fieldName = `${location}${sentenceCase(useCase)}${sentenceCase( section )}` @@ -113,14 +122,15 @@ export function getAddressLocationSelect( useCase as EventLocationAddressCases ) : getAddressConditionals(section, location, useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'SELECT_WITH_DYNAMIC_OPTIONS', + type: 'SELECT_WITH_DYNAMIC_OPTIONS', location, useCase, fieldName, - locationIndex - ) + fhirLineArrayPosition, + isLowestAdministrativeLevel + }) } } @@ -132,35 +142,78 @@ function getAdminLevelSelects( ): SerializedFormField[] { switch (ADMIN_LEVELS) { case 1: - return [getAddressLocationSelect(section, 'state', useCase)] + return [ + getAddressLocationSelect({ + section, + location: 'state', + useCase, + isLowestAdministrativeLevel: true + }) + ] case 2: return [ - getAddressLocationSelect(section, 'state', useCase), - getAddressLocationSelect(section, 'district', useCase) + getAddressLocationSelect({ section, location: 'state', useCase }), + getAddressLocationSelect({ + section, + location: 'district', + useCase, + isLowestAdministrativeLevel: true + }) ] case 3: return [ - getAddressLocationSelect(section, 'state', useCase), - getAddressLocationSelect(section, 'district', useCase), - getAddressLocationSelect(section, 'locationLevel3', useCase, 10) + getAddressLocationSelect({ section, location: 'state', useCase }), + getAddressLocationSelect({ section, location: 'district', useCase }), + getAddressLocationSelect({ + section, + location: 'locationLevel3', + useCase, + fhirLineArrayPosition: 10, + isLowestAdministrativeLevel: true + }) ] case 4: return [ - getAddressLocationSelect(section, 'state', useCase), - getAddressLocationSelect(section, 'district', useCase), - getAddressLocationSelect(section, 'locationLevel3', useCase, 10), - getAddressLocationSelect(section, 'locationLevel4', useCase, 11) + getAddressLocationSelect({ section, location: 'state', useCase }), + getAddressLocationSelect({ section, location: 'district', useCase }), + getAddressLocationSelect({ + section, + location: 'locationLevel3', + useCase, + fhirLineArrayPosition: 10 + }), + getAddressLocationSelect({ + section, + location: 'locationLevel4', + useCase, + fhirLineArrayPosition: 11, + isLowestAdministrativeLevel: true + }) ] case 5: return [ - getAddressLocationSelect(section, 'state', useCase), - getAddressLocationSelect(section, 'district', useCase), - getAddressLocationSelect(section, 'locationLevel3', useCase, 10), - getAddressLocationSelect(section, 'locationLevel4', useCase, 11), - getAddressLocationSelect(section, 'locationLevel5', useCase, 12) + getAddressLocationSelect({ section, location: 'state', useCase }), + getAddressLocationSelect({ section, location: 'district', useCase }), + getAddressLocationSelect({ + section, + location: 'locationLevel3', + useCase, + fhirLineArrayPosition: 10 + }), + getAddressLocationSelect({ + section, + location: 'locationLevel4', + useCase, + fhirLineArrayPosition: 11 + }), + getAddressLocationSelect({ + section, + location: 'locationLevel5', + useCase, + fhirLineArrayPosition: 12, + isLowestAdministrativeLevel: true + }) ] - default: - return [getAddressLocationSelect(section, 'state', useCase)] } } @@ -231,13 +284,13 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'country', useCase) : getAddressConditionals(section, 'country', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'SELECT_WITH_OPTIONS', - 'country', // Maps form value to FHIR prop. Use empty string for FHIR Address line index + type: 'SELECT_WITH_OPTIONS', + location: 'country', useCase, - `country${sentenceCase(useCase)}${sentenceCase(section)}` - ) + fieldName: `country${sentenceCase(useCase)}${sentenceCase(section)}` + }) }, // Required // Select fields are added for each administrative location level from Humdata ...getAdminLevelSelects(section, useCase), // Required @@ -261,14 +314,14 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'ruralOrUrban', useCase) : getAddressConditionals(section, 'ruralOrUrban', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'RADIO_GROUP', - '', // No FHIR prop exists for this custom address prop. Use empty string for FHIR Address line index + type: 'RADIO_GROUP', + location: '', useCase, - `country${sentenceCase(useCase)}${sentenceCase(section)}`, - 5 // The selected index in the FHIR Address line array to store this value - ) + fieldName: `country${sentenceCase(useCase)}${sentenceCase(section)}`, + fhirLineArrayPosition: 5 // The selected index in the FHIR Address line array to store this value + }) }, { name: `city${sentenceCase(useCase)}${sentenceCase(section)}`, @@ -288,13 +341,13 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'urban', useCase) : getAddressConditionals(section, 'urban', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - 'city', + type: 'TEXT', + location: 'city', useCase, - `city${sentenceCase(useCase)}${sentenceCase(section)}` - ) + fieldName: `city${sentenceCase(useCase)}${sentenceCase(section)}` + }) }, { name: `addressLine1UrbanOption${sentenceCase(useCase)}${sentenceCase( @@ -316,16 +369,16 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'urban', useCase) : getAddressConditionals(section, 'urban', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - '', + type: 'TEXT', + location: '', useCase, - `addressLine1UrbanOption${sentenceCase(useCase)}${sentenceCase( - section - )}`, - 2 - ) + fieldName: `addressLine1UrbanOption${sentenceCase( + useCase + )}${sentenceCase(section)}`, + fhirLineArrayPosition: 2 + }) }, { name: `addressLine2UrbanOption${sentenceCase(useCase)}${sentenceCase( @@ -347,16 +400,16 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'urban', useCase) : getAddressConditionals(section, 'urban', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - '', + type: 'TEXT', + location: '', useCase, - `addressLine2UrbanOption${sentenceCase(useCase)}${sentenceCase( - section - )}`, - 1 - ) + fieldName: `addressLine2UrbanOption${sentenceCase( + useCase + )}${sentenceCase(section)}`, + fhirLineArrayPosition: 1 + }) }, { name: `addressLine3UrbanOption${sentenceCase(useCase)}${sentenceCase( @@ -378,16 +431,16 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'urban', useCase) : getAddressConditionals(section, 'urban', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - '', + type: 'TEXT', + location: '', useCase, - `addressLine3UrbanOption${sentenceCase(useCase)}${sentenceCase( - section - )}`, - 0 - ) + fieldName: `addressLine3UrbanOption${sentenceCase( + useCase + )}${sentenceCase(section)}`, + fhirLineArrayPosition: 0 + }) }, { name: `postalCode${sentenceCase(useCase)}${sentenceCase(section)}`, @@ -407,13 +460,13 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'urban', useCase) : getAddressConditionals(section, 'urban', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - 'postalCode', + type: 'TEXT', + location: 'postalCode', useCase, - `postalCode${sentenceCase(useCase)}${sentenceCase(section)}` - ) + fieldName: `postalCode${sentenceCase(useCase)}${sentenceCase(section)}` + }) }, { name: `addressLine1RuralOption${sentenceCase(useCase)}${sentenceCase( @@ -435,16 +488,16 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'rural', useCase) : getAddressConditionals(section, 'rural', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - '', + type: 'TEXT', + location: '', useCase, - `addressLine1RuralOption${sentenceCase(useCase)}${sentenceCase( - section - )}`, - 4 - ) + fieldName: `addressLine1RuralOption${sentenceCase( + useCase + )}${sentenceCase(section)}`, + fhirLineArrayPosition: 4 + }) }, // INTERNATIONAL ADDRESSES ARE SUPPLIED BECAUSE INFORMANTS & CITIZENS MAY LIVE ABROAD & REGISTER AN EVENT AT ONE OF YOUR FOREIGN EMBASSIES // SOMETIMES THIS IS ALSO REQUIRED FOR DIPLOMATIC REASONS OR FOR MILITARY FORCES @@ -468,13 +521,15 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'international', useCase) : getAddressConditionals(section, 'international', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - 'state', + type: 'TEXT', + location: 'state', useCase, - `internationalState${sentenceCase(useCase)}${sentenceCase(section)}` - ) + fieldName: `internationalState${sentenceCase(useCase)}${sentenceCase( + section + )}` + }) }, { name: `internationalDistrict${sentenceCase(useCase)}${sentenceCase( @@ -496,13 +551,15 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'international', useCase) : getAddressConditionals(section, 'international', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - 'district', + type: 'TEXT', + location: 'district', useCase, - `internationalDistrict${sentenceCase(useCase)}${sentenceCase(section)}` - ) + fieldName: `internationalDistrict${sentenceCase(useCase)}${sentenceCase( + section + )}` + }) }, { name: `internationalCity${sentenceCase(useCase)}${sentenceCase(section)}`, @@ -522,13 +579,15 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'international', useCase) : getAddressConditionals(section, 'international', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - 'city', + type: 'TEXT', + location: 'city', useCase, - `internationalCity${sentenceCase(useCase)}${sentenceCase(section)}` - ) + fieldName: `internationalCity${sentenceCase(useCase)}${sentenceCase( + section + )}` + }) }, { name: `internationalAddressLine1${sentenceCase(useCase)}${sentenceCase( @@ -550,16 +609,16 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'international', useCase) : getAddressConditionals(section, 'international', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - '', + type: 'TEXT', + location: '', useCase, - `internationalAddressLine1${sentenceCase(useCase)}${sentenceCase( - section - )}`, - 6 - ) + fieldName: `internationalAddressLine1${sentenceCase( + useCase + )}${sentenceCase(section)}`, + fhirLineArrayPosition: 6 + }) }, { name: `internationalAddressLine2${sentenceCase(useCase)}${sentenceCase( @@ -581,16 +640,16 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'international', useCase) : getAddressConditionals(section, 'international', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - '', + type: 'TEXT', + location: '', useCase, - `internationalAddressLine2${sentenceCase(useCase)}${sentenceCase( - section - )}`, - 7 - ) + fieldName: `internationalAddressLine2${sentenceCase( + useCase + )}${sentenceCase(section)}`, + fhirLineArrayPosition: 7 + }) }, { name: `internationalAddressLine3${sentenceCase(useCase)}${sentenceCase( @@ -612,16 +671,16 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'international', useCase) : getAddressConditionals(section, 'international', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - '', + type: 'TEXT', + location: '', useCase, - `internationalAddressLine3${sentenceCase(useCase)}${sentenceCase( - section - )}`, - 8 - ) + fieldName: `internationalAddressLine3${sentenceCase( + useCase + )}${sentenceCase(section)}`, + fhirLineArrayPosition: 8 + }) }, { name: `internationalPostalCode${sentenceCase(useCase)}${sentenceCase( @@ -643,15 +702,15 @@ export function getAddressFields( conditionals: isUseCaseForPlaceOfEvent(useCase) ? getPlaceOfEventConditionals(section, 'international', useCase) : getAddressConditionals(section, 'international', useCase), - mapping: getMapping( + mapping: getMapping({ section, - 'TEXT', - 'postalCode', + type: 'TEXT', + location: 'postalCode', useCase, - `internationalPostalCode${sentenceCase(useCase)}${sentenceCase( - section - )}` - ) + fieldName: `internationalPostalCode${sentenceCase( + useCase + )}${sentenceCase(section)}` + }) } ] } diff --git a/src/form/addresses/index.ts b/src/form/addresses/index.ts index 01c6a17cc..ca63ae060 100644 --- a/src/form/addresses/index.ts +++ b/src/form/addresses/index.ts @@ -24,6 +24,7 @@ import { AddressCases, AddressCopyConfigCases, AddressSubsections, + AdministrativeLevel, EventLocationAddressCases, IAddressConfiguration } from '../types/types' @@ -34,7 +35,7 @@ import { // THEREFORE OUR ADMIN_LEVELS PROPERTY IS 2. // YOU CAN SET UP TO 5 SUPPORTED ADMINISTRATIVE LEVELS. -export const ADMIN_LEVELS: Number = 2 +export const ADMIN_LEVELS: AdministrativeLevel = 2 // ADDRESSES TAKE UP A LOT OF REPEATED CODE IN THE FORMS, MAKING THE BIRTH, MARRIAGE AND DEATH FORM CODE LONG AND DIFFICULT TO READ // THEREFORE WE DECORATE THE ADDRESSES DYNAMICALLY TO SECTIONS OF THE FORM USING THIS CONFIGURATION CONSTANT diff --git a/src/form/birth/index.ts b/src/form/birth/index.ts index 63b2d554b..b56f9a84c 100644 --- a/src/form/birth/index.ts +++ b/src/form/birth/index.ts @@ -59,7 +59,9 @@ import { fatherFirstNameConditionals, fatherFamilyNameConditionals, informantNotMotherOrFather, - detailsExistConditional + detailsExistConditional, + ageOfIndividualConditionals, + ageOfParentsConditionals } from '../common/default-validation-conditionals' import { getNationalIDValidators, @@ -248,7 +250,8 @@ export const birthForm: ISerializedForm = { formMessageDescriptors.ageOfInformant, exactDateOfBirthUnknownConditional.concat( hideIfInformantMotherOrFather - ) + ), + ageOfIndividualConditionals ), getNationality( certificateHandlebars.informantNationality, @@ -319,7 +322,10 @@ export const birthForm: ISerializedForm = { exactDateOfBirthUnknown(detailsExistConditional), getAgeOfIndividualInYears( formMessageDescriptors.ageOfMother, - exactDateOfBirthUnknownConditional.concat(detailsExistConditional) + exactDateOfBirthUnknownConditional.concat( + detailsExistConditional + ), + ageOfParentsConditionals ), getNationality( certificateHandlebars.motherNationality, @@ -395,7 +401,10 @@ export const birthForm: ISerializedForm = { exactDateOfBirthUnknown(detailsExistConditional), getAgeOfIndividualInYears( formMessageDescriptors.ageOfFather, - exactDateOfBirthUnknownConditional.concat(detailsExistConditional) + exactDateOfBirthUnknownConditional.concat( + detailsExistConditional + ), + ageOfParentsConditionals ), getNationality( certificateHandlebars.fatherNationality, diff --git a/src/form/common/common-optional-fields.ts b/src/form/common/common-optional-fields.ts index ac02b523b..932682981 100644 --- a/src/form/common/common-optional-fields.ts +++ b/src/form/common/common-optional-fields.ts @@ -17,6 +17,7 @@ import { } from './select-options' import { certificateHandlebars } from '../birth/certificate-handlebars' import { getFieldMapping } from '@countryconfig/utils/mapping/field-mapping-utils' +import { Validator } from '../types/validators' const exactDobConditional: Conditional[] = [ { @@ -53,27 +54,15 @@ export const exactDateOfBirthUnknown = ( export const getAgeOfIndividualInYears = ( label: MessageDescriptor, - conditionals: Conditional[] + conditionals: Conditional[], + validators: Validator[] ): SerializedFormField => ({ name: 'ageOfIndividualInYears', type: 'NUMBER', label, required: true, initialValue: '', - validator: [ - { - operation: 'range', - parameters: [12, 120] - }, - { - operation: 'maxLength', - parameters: [3] - }, - { - operation: 'isValidParentsBirthDate', - parameters: [10, true] - } - ], + validator: validators, conditionals, postfix: 'years', inputFieldWidth: '78px' diff --git a/src/form/common/default-validation-conditionals.ts b/src/form/common/default-validation-conditionals.ts index 896e0b2da..ebd96232f 100644 --- a/src/form/common/default-validation-conditionals.ts +++ b/src/form/common/default-validation-conditionals.ts @@ -230,6 +230,47 @@ export const brideOrGroomBirthDateValidators = (spouseType: string) => [ } ] +export const brideOrGroomAgeValidators = [ + { + operation: 'range', + parameters: [18, 120] + }, + { + operation: 'maxLength', + parameters: [3] + } +] satisfies Validator[] + +export const ageOfIndividualConditionals: Validator[] = [ + { + operation: 'range', + parameters: [12, 120] + }, + { + operation: 'maxLength', + parameters: [3] + } +] + +export const ageOfParentsConditionals = [ + ...ageOfIndividualConditionals, + { + operation: 'isValidParentsBirthDate', + parameters: [10, true] + } +] satisfies Validator[] + +export const ageOfDeceasedConditionals = [ + { + operation: 'range', + parameters: [0, 120] + }, + { + operation: 'maxLength', + parameters: [3] + } +] satisfies Validator[] + export const exactDateOfBirthUnknownConditional = [ { action: 'hide', @@ -286,10 +327,6 @@ export function getNationalIDValidators(configCase: string): Validator[] { { operation: 'duplicateIDNumber', parameters: ['bride.iD'] - }, - { - operation: 'duplicateIDNumber', - parameters: ['informant.informantID'] } ] } else if (configCase === 'bride') { @@ -301,10 +338,6 @@ export function getNationalIDValidators(configCase: string): Validator[] { { operation: 'duplicateIDNumber', parameters: ['groom.iD'] - }, - { - operation: 'duplicateIDNumber', - parameters: ['informant.informantID'] } ] } else { diff --git a/src/form/death/index.ts b/src/form/death/index.ts index 8b30ea5bc..04df309e2 100644 --- a/src/form/death/index.ts +++ b/src/form/death/index.ts @@ -15,8 +15,8 @@ import { getMaritalStatus, registrationEmail, registrationPhone, - divider, - getOccupation + divider + // getOccupation } from '../common/common-optional-fields' import { getGender, @@ -44,6 +44,8 @@ import { hideIfNidIntegrationEnabled, informantBirthDateConditionals, informantFamilyNameConditionals, + ageOfIndividualConditionals, + ageOfDeceasedConditionals, informantFirstNameConditionals, exactDateOfBirthUnknownConditional, isValidBirthDate /*, @@ -192,8 +194,9 @@ export const deathForm = { ), // Required field., exactDateOfBirthUnknown([]), getAgeOfIndividualInYears( - formMessageDescriptors.ageOfInformant, - exactDateOfBirthUnknownConditional + formMessageDescriptors.ageOfDeceased, + exactDateOfBirthUnknownConditional, + ageOfDeceasedConditionals ), getNationality(certificateHandlebars.deceasedNationality, []), getNationalID( @@ -274,7 +277,8 @@ export const deathForm = { exactDateOfBirthUnknown([]), getAgeOfIndividualInYears( formMessageDescriptors.ageOfInformant, - exactDateOfBirthUnknownConditional + exactDateOfBirthUnknownConditional, + ageOfIndividualConditionals ), getNationality(certificateHandlebars.informantNationality, []), getNationalID( diff --git a/src/form/marriage/index.ts b/src/form/marriage/index.ts index 36d1e3525..ff9b820b6 100644 --- a/src/form/marriage/index.ts +++ b/src/form/marriage/index.ts @@ -41,6 +41,8 @@ import { } from './required-fields' import { Event, ISerializedForm } from '../types/types' import { + ageOfIndividualConditionals, + brideOrGroomAgeValidators, exactDateOfBirthUnknownConditional, getNationalIDValidators } from '../common/default-validation-conditionals' @@ -128,7 +130,8 @@ export const marriageForm: ISerializedForm = { formMessageDescriptors.ageOfInformant, exactDateOfBirthUnknownConditional.concat( hideIfInformantBrideOrGroom - ) + ), + ageOfIndividualConditionals ), getNationality( certificateHandlebars.informantNationality, @@ -183,7 +186,8 @@ export const marriageForm: ISerializedForm = { exactDateOfBirthUnknown([]), getAgeOfIndividualInYears( formMessageDescriptors.ageOfGroom, - exactDateOfBirthUnknownConditional + exactDateOfBirthUnknownConditional, + brideOrGroomAgeValidators ), getNationality(certificateHandlebars.groomNationality, []), // Required field getNationalID( @@ -230,12 +234,11 @@ export const marriageForm: ISerializedForm = { certificateHandlebars.brideBirthDate ), // Required field exactDateOfBirthUnknown([]), - getAgeOfIndividualInYears(formMessageDescriptors.ageOfBride, [ - { - action: 'hide', - expression: '!values.exactDateOfBirthUnknown' - } - ]), + getAgeOfIndividualInYears( + formMessageDescriptors.ageOfBride, + exactDateOfBirthUnknownConditional, + brideOrGroomAgeValidators + ), getNationality(certificateHandlebars.brideNationality, []), // Required field getNationalID( 'iD', diff --git a/src/form/types/types.ts b/src/form/types/types.ts index ecc6351f3..45fe3dfb6 100644 --- a/src/form/types/types.ts +++ b/src/form/types/types.ts @@ -68,6 +68,7 @@ type IAddressLineMapper = { transformedFieldName?: string useCase?: string lineNumber?: number + isLowestAdministrativeLevel?: boolean } export type IQueryMapper = { @@ -930,3 +931,5 @@ export type AllowedAddressConfigurations = { yComparisonSection?: string conditionalCase?: string } + +export type AdministrativeLevel = 1 | 2 | 3 | 4 | 5 diff --git a/src/form/types/validators.ts b/src/form/types/validators.ts index bac46155b..34a690775 100644 --- a/src/form/types/validators.ts +++ b/src/form/types/validators.ts @@ -11,7 +11,7 @@ import * as customValidators from '../common/custom-validation-conditionals/custom-validators' -/** Validators that are built in to core. You can create your own ones, or override these ones in `src/features/config/form/validators.ts` */ +/** Validators that are built in to core. You can create your own ones, or override these ones in the custom validators file imported above */ type CoreValidator = | 'requiredBasic' | 'requiredSymbol' diff --git a/src/utils/address-utils.ts b/src/utils/address-utils.ts index 38e0c4213..c839b5d43 100644 --- a/src/utils/address-utils.ts +++ b/src/utils/address-utils.ts @@ -668,21 +668,21 @@ function getTemplateMapping( location: string, useCase: string, fieldName: string, - locationIndex?: number + fhirLineArrayPosition?: number ): IHandlebarTemplates { return isUseCaseForPlaceOfEvent(useCase) - ? locationIndex + ? fhirLineArrayPosition ? { fieldName, operation: 'eventLocationAddressLineTemplateTransformer', - parameters: [locationIndex, fieldName, location] + parameters: [fhirLineArrayPosition, fieldName, location] } : { fieldName, operation: 'eventLocationAddressFHIRPropertyTemplateTransformer', parameters: [location] } - : locationIndex + : fhirLineArrayPosition ? { fieldName, operation: 'addressLineTemplateTransformer', @@ -690,7 +690,7 @@ function getTemplateMapping( useCase.toUpperCase() === 'PRIMARY' ? AddressCases.PRIMARY_ADDRESS : AddressCases.SECONDARY_ADDRESS, - locationIndex, + fhirLineArrayPosition, fieldName, location ] @@ -708,27 +708,40 @@ function getTemplateMapping( } // You should never need to edit this function. If there is a bug here raise an issue in [Github](https://github.com/opencrvs/opencrvs-farajaland) -function getMutationMapping( - type: - | 'TEXT' - | 'RADIO_GROUP' - | 'SELECT_WITH_OPTIONS' - | 'SELECT_WITH_DYNAMIC_OPTIONS', - location: string, - useCase: string, - locationIndex?: number -): IMutationMapper { +function getMutationMapping({ + location, + useCase, + fhirLineArrayPosition, + isLowestAdministrativeLevel +}: { + location: string + useCase: string + fhirLineArrayPosition?: number + isLowestAdministrativeLevel?: boolean +}): IMutationMapper { return isUseCaseForPlaceOfEvent(useCase) - ? locationIndex || locationIndex === 0 + ? fhirLineArrayPosition || fhirLineArrayPosition === 0 ? { operation: 'eventLocationMutationTransformer', - parameters: [{ useCase, lineNumber: locationIndex }] + parameters: [ + { + useCase, + lineNumber: fhirLineArrayPosition, + isLowestAdministrativeLevel + } + ] } : { operation: 'eventLocationMutationTransformer', - parameters: [{ useCase, transformedFieldName: location }] + parameters: [ + { + useCase, + transformedFieldName: location, + isLowestAdministrativeLevel + } + ] } - : locationIndex || locationIndex === 0 + : fhirLineArrayPosition || fhirLineArrayPosition === 0 ? { operation: 'addressMutationTransformer', parameters: [ @@ -737,7 +750,8 @@ function getMutationMapping( useCase.toUpperCase() === 'PRIMARY' ? AddressCases.PRIMARY_ADDRESS : AddressCases.SECONDARY_ADDRESS, - lineNumber: locationIndex + lineNumber: fhirLineArrayPosition, + isLowestAdministrativeLevel } ] } @@ -749,7 +763,8 @@ function getMutationMapping( useCase.toUpperCase() === 'PRIMARY' ? AddressCases.PRIMARY_ADDRESS : AddressCases.SECONDARY_ADDRESS, - transformedFieldName: location + transformedFieldName: location, + isLowestAdministrativeLevel } ] } @@ -766,7 +781,7 @@ function getQueryMapping( location: string, useCase: string, fieldName: string, - locationIndex?: number + fhirLineArrayPosition?: number ): IQueryMapper { return isUseCaseForPlaceOfEvent(useCase) ? { @@ -789,7 +804,10 @@ function getQueryMapping( fieldName === `internationalCity${sentenceCase(useCase)}${sentenceCase(section)}` ? [ - { transformedFieldName: location, lineNumber: locationIndex }, + { + transformedFieldName: location, + lineNumber: fhirLineArrayPosition + }, { fieldsToIgnoreForLocalAddress: [ `internationalDistrict${sentenceCase( @@ -814,9 +832,9 @@ function getQueryMapping( ] } ] - : [{ lineNumber: locationIndex }] + : [{ lineNumber: fhirLineArrayPosition }] } - : locationIndex || locationIndex === 0 + : fhirLineArrayPosition || fhirLineArrayPosition === 0 ? { operation: 'addressQueryTransformer', parameters: [ @@ -825,7 +843,7 @@ function getQueryMapping( useCase.toUpperCase() === 'PRIMARY' ? AddressCases.PRIMARY_ADDRESS : AddressCases.SECONDARY_ADDRESS, - lineNumber: locationIndex + lineNumber: fhirLineArrayPosition } ] } @@ -844,42 +862,66 @@ function getQueryMapping( } // You should never need to edit this function. If there is a bug here raise an issue in [Github](https://github.com/opencrvs/opencrvs-farajaland) -export function getMapping( - section: string, +export function getMapping({ + section, + type, + location, + useCase, + fieldName, + fhirLineArrayPosition, + isLowestAdministrativeLevel +}: { + section: string type: | 'TEXT' | 'RADIO_GROUP' | 'SELECT_WITH_OPTIONS' - | 'SELECT_WITH_DYNAMIC_OPTIONS', - location: string, // used to filter offline locations and for FHIR props - use empty string for address lines - useCase: string, - fieldName: string, - locationIndex?: number -): IFormFieldMapping { + | 'SELECT_WITH_DYNAMIC_OPTIONS' + location: string + useCase: string + fieldName: string + fhirLineArrayPosition?: number + isLowestAdministrativeLevel?: boolean +}): IFormFieldMapping { if (type !== 'RADIO_GROUP') { return { - template: getTemplateMapping(location, useCase, fieldName, locationIndex), - mutation: getMutationMapping(type, location, useCase, locationIndex), + template: getTemplateMapping( + location, + useCase, + fieldName, + fhirLineArrayPosition + ), + mutation: getMutationMapping({ + location, + useCase, + fhirLineArrayPosition, + isLowestAdministrativeLevel + }), query: getQueryMapping( section, type, location, useCase, fieldName, - locationIndex + fhirLineArrayPosition ) } } else { // Radio Groups in addresses have no need for certificate template return { - mutation: getMutationMapping(type, location, useCase, locationIndex), + mutation: getMutationMapping({ + location, + useCase, + fhirLineArrayPosition, + isLowestAdministrativeLevel + }), query: getQueryMapping( section, type, location, useCase, fieldName, - locationIndex + fhirLineArrayPosition ) } } diff --git a/yarn.lock b/yarn.lock index 2a4134e1b..a206df6db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -518,6 +518,14 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.19.3", "@babel/compat-data@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747" @@ -589,6 +597,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -635,6 +653,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" @@ -643,20 +666,20 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.18.9": version "7.18.9" @@ -756,16 +779,33 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" @@ -803,6 +843,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.18.10", "@babel/parser@^7.19.6": version "7.19.6" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" @@ -813,6 +862,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-proposal-class-properties@^7.0.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" @@ -1121,35 +1175,28 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc" - integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.6" - "@babel/types" "^7.19.4" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" - integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.4" - "@babel/types" "^7.21.4" +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" @@ -1171,6 +1218,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1375,6 +1431,11 @@ resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-6.3.1.tgz#1ae963dd40405450a2945408cba553e1afa3e0fb" integrity sha512-8YXBE2ZcU/pImVOHX7MWrSR/X5up7t6rPWZlk34RwZEcdr3ua6X+32pSd6XuOQRN+vbuvYNfA6iey8NbrjuMFQ== +"@fastify/busboy@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" + integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + "@formatjs/ecma402-abstract@1.16.0": version "1.16.0" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.16.0.tgz#15a0baa8401880d4010eb93440d996e896ca251c" @@ -2078,9 +2139,9 @@ integrity sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ== "@hapi/hapi@^20.0.1": - version "20.2.2" - resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-20.2.2.tgz#5810efbf5c0aad367932e86d4066d82ac817e98c" - integrity sha512-crhU6TIKt7QsksWLYctDBAXogk9PYAm7UzdpETyuBHC2pCa6/+B5NykiOVLG/3FCIgHo/raPVtan8bYtByHORQ== + version "20.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-20.3.0.tgz#1d620005afeebcb2c8170352286a4664b0107c15" + integrity sha512-zvPSRvaQyF3S6Nev9aiAzko2/hIFZmNSJNcs07qdVaVAvj8dGJSV4fVUuQSnufYJAGiSau+U5LxMLhx79se5WA== dependencies: "@hapi/accept" "^5.0.1" "@hapi/ammo" "^5.0.1" @@ -2095,9 +2156,9 @@ "@hapi/podium" "^4.1.1" "@hapi/shot" "^5.0.5" "@hapi/somever" "^3.0.0" - "@hapi/statehood" "^7.0.4" - "@hapi/subtext" "^7.0.3" - "@hapi/teamwork" "^5.1.1" + "@hapi/statehood" "^7.0.3" + "@hapi/subtext" "^7.1.0" + "@hapi/teamwork" "^5.1.0" "@hapi/topo" "^5.0.0" "@hapi/validate" "^1.1.1" @@ -2164,10 +2225,10 @@ "@hapi/hoek" "^9.0.4" "@hapi/vise" "^4.0.0" -"@hapi/pez@^5.0.1": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-5.0.3.tgz#b75446e6fef8cbb16816573ab7da1b0522e7a2a1" - integrity sha512-mpikYRJjtrbJgdDHG/H9ySqYqwJ+QU/D7FXsYciS9P7NYBXE2ayKDAy3H0ou6CohOCaxPuTV4SZ0D936+VomHA== +"@hapi/pez@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-5.1.0.tgz#c03a5e01f8be01cfabc4c0017631e619586321c1" + integrity sha512-YfB0btnkLB3lb6Ry/1KifnMPBm5ZPfaAHWFskzOMAgDgXgcBgA+zjpIynyEiBfWEz22DBT8o1e2tAaBdlt8zbw== dependencies: "@hapi/b64" "5.x.x" "@hapi/boom" "9.x.x" @@ -2200,7 +2261,7 @@ "@hapi/bounce" "2.x.x" "@hapi/hoek" "9.x.x" -"@hapi/statehood@^7.0.4": +"@hapi/statehood@^7.0.3": version "7.0.4" resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-7.0.4.tgz#6acb9d0817b5c657089356f7d9fd60af0bce4f41" integrity sha512-Fia6atroOVmc5+2bNOxF6Zv9vpbNAjEXNcUbWXavDqhnJDlchwUUwKS5LCi5mGtCTxRhUKKHwuxuBZJkmLZ7fw== @@ -2213,20 +2274,20 @@ "@hapi/iron" "6.x.x" "@hapi/validate" "1.x.x" -"@hapi/subtext@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-7.0.4.tgz#aa46e4b45aad8115938334d5a3620a17b3b33ee5" - integrity sha512-Y72moHhbRuO8kwBHFEnCRw7oOnhNh4Pl+aonxAze18jkyMpE4Gwz4lNID7ei8vd3lpXC2rKdkxXJgtfY+WttRw== +"@hapi/subtext@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-7.1.0.tgz#b4d1ea2aeab1923ac130a24e75921e38fab5b15b" + integrity sha512-n94cU6hlvsNRIpXaROzBNEJGwxC+HA69q769pChzej84On8vsU14guHDub7Pphr/pqn5b93zV3IkMPDU5AUiXA== dependencies: "@hapi/boom" "9.x.x" "@hapi/bourne" "2.x.x" "@hapi/content" "^5.0.2" "@hapi/file" "2.x.x" "@hapi/hoek" "9.x.x" - "@hapi/pez" "^5.0.1" + "@hapi/pez" "^5.1.0" "@hapi/wreck" "17.x.x" -"@hapi/teamwork@5.x.x", "@hapi/teamwork@^5.1.1": +"@hapi/teamwork@5.x.x", "@hapi/teamwork@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.1.tgz#4d2ba3cac19118a36c44bf49a3a47674de52e4e4" integrity sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg== @@ -3216,9 +3277,9 @@ "@babel/types" "^7.3.0" "@types/bcryptjs@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" - integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== + version "2.4.5" + resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.5.tgz#15473cc012f825b3435b189376f645bdd2fc9f11" + integrity sha512-tOF6TivOIvq+TWQm78335CMdyVJhpBG3NUdWQDAp95ax4E2rSKbws/ELHLk5EBoucwx/tHt3/hhLOHwWJgVrSw== "@types/chalk@^2.2.0": version "2.2.0" @@ -3233,9 +3294,9 @@ integrity sha512-sgZtDIS22MwVDYhWaHWYCm3MWdfMFtBxUPHLl0EJq6nxayz/J3WVuXaewLSqINxWyRgvzhYMvjf1h8K/jj+1OA== "@types/csv2json@^1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/csv2json/-/csv2json-1.4.2.tgz#85cecacd75ab5e9e8861bf5c134a9dfe526ed5e3" - integrity sha512-yLN7biRYCmhY/8HrlSkY2kCzYQkoWW4J6AxtuTWuyixM5h57zYhZpc7n0Fx98LTtOl9/mRM26fsVfqjZAzH27A== + version "1.4.4" + resolved "https://registry.yarnpkg.com/@types/csv2json/-/csv2json-1.4.4.tgz#c855ed7e07d859db0345d72856444b807c2fa962" + integrity sha512-td6M5wwVO5sowevjZmUuEQgVEmZTOLborta1qdnlByhG22ZEJzT/KMXbFKnOkrStxhPX5pf2PVsD7lA3ApXwTA== dependencies: "@types/pumpify" "*" @@ -3247,9 +3308,9 @@ "@types/node" "*" "@types/duplexify@*": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.1.tgz#5685721cf7dc4a21b6f0e8a8efbec6b4d2fbafad" - integrity sha512-n0zoEj/fMdMOvqbHxmqnza/kXyoGgJmEpsXjpP+gEqE1Ye4yNqc7xWipKnUoMpWhMuzJQSfK2gMrwlElly7OGQ== + version "3.6.3" + resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.3.tgz#42b1716c5d52a42ba9072696c0d33ca0a9bffd6d" + integrity sha512-KE0Yb3JraglJMB53+A/RMXbd9w//pQfiSqkrsoAxKcNOEIe1EHfEgbvoi2lkk2AvhhJtplugJSB2Mptc3DZMNA== dependencies: "@types/node" "*" @@ -3258,25 +3319,25 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== -"@types/fhir@^0.0.30": +"@types/fhir@0.0.30": version "0.0.30" resolved "https://registry.yarnpkg.com/@types/fhir/-/fhir-0.0.30.tgz#a0aec3b2d7dd2a7584474dac446ede5f9a4d7a13" integrity sha512-vDU62tUFeAYBVQThiWAfGd6D25TiLLDDS5pV19vim52FLpwWTBliLMvotbF4D/U+BmjxBKIuHGZgFnoh/HtV5g== "@types/geojson@^7946.0.4": - version "7946.0.10" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" - integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== + version "7946.0.12" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.12.tgz#0307536218d32e6b970bccd1d148b9c4e5b6f10d" + integrity sha512-uK2z1ZHJyC0nQRbuovXFt4mzXDwf27vQeUWNhfKGwRcWW429GOhP8HxUHlM6TLH4bzmlv/HlEjpvJh3JfmGsAA== "@types/google-libphonenumber@^7.4.23": - version "7.4.23" - resolved "https://registry.yarnpkg.com/@types/google-libphonenumber/-/google-libphonenumber-7.4.23.tgz#c44c9125d45f042943694d605fd8d8d796cafc3b" - integrity sha512-C3ydakLTQa8HxtYf9ge4q6uT9krDX8smSIxmmW3oACFi5g5vv6T068PRExF7UyWbWpuYiDG8Nm24q2X5XhcZWw== + version "7.4.29" + resolved "https://registry.yarnpkg.com/@types/google-libphonenumber/-/google-libphonenumber-7.4.29.tgz#161545a4168c85b768e32154019fbaa4d95af6f4" + integrity sha512-TT2y23IbEQ+RzmFNvJGIEf/uXmGwRaztKWYv471KzblNFP6qLh8hKKTQY63tIhQFYL1+YvWS+OB17zo42gf2aA== "@types/graceful-fs@^4.1.2": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" + integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== dependencies: "@types/node" "*" @@ -3322,10 +3383,10 @@ "@types/node" "*" joi "^17.3.0" -"@types/hapi__inert@^5.2.3": - version "5.2.3" - resolved "https://registry.yarnpkg.com/@types/hapi__inert/-/hapi__inert-5.2.3.tgz#f586eb240d5997c9968d1b4e8b37679517045ca1" - integrity sha512-I1mWQrEc7oMqGtofT0rwBgRBCBurz0wNzbq8QZsHWR+aXM0bk1j9GA6zwyGIeO53PNl2C1c2kpXlc084xCV+Tg== +"@types/hapi__inert@5.2.1": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@types/hapi__inert/-/hapi__inert-5.2.1.tgz#cce395e7470a969f63cf57d561da230218b8b2bb" + integrity sha512-pFvXfN9bTGgR6jkgKseXmu5/eHVGVEsGh0LKHCkcezEqZZMJV9YabREVLa6kcYEQMIDQzQSwSakSnemCFiSnOg== dependencies: "@types/hapi__hapi" "*" @@ -3430,32 +3491,34 @@ integrity sha512-KeAKtlObirLJk/na6jHBFEdTDjDfFS6Vcr0eG2FjiHKn3Nw8axJFfIu0Y9TpwaauRldQBj/pZm/MHtK76r6OWg== "@types/lodash@^4.14.117": - version "4.14.186" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.186.tgz#862e5514dd7bd66ada6c70ee5fce844b06c8ee97" - integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== + version "4.14.200" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149" + integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q== "@types/mime-db@*": - version "1.43.1" - resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.43.1.tgz#c2a0522453bb9b6e84ee48b7eef765d19bcd519e" - integrity sha512-kGZJY+R+WnR5Rk+RPHUMERtb2qBRViIHCBdtUrY+NmwuGb8pQdfTqQiCKPrxpdoycl8KWm2DLdkpoSdt479XoQ== + version "1.43.3" + resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.43.3.tgz#f7bec64a9a62ddded3371e82862c0516539710e8" + integrity sha512-vg0UsF1p1Qi/8iCARoie7F/Ng92zo7tQlL+sqE15GonkKVl55n/0vB6jSbrYTgDO0PSx9pKfGG1iZg9gJum3wA== "@types/mime-types@^2.1.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.1.tgz#d9ba43490fa3a3df958759adf69396c3532cf2c1" - integrity sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw== + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.3.tgz#0688436864f87a0c8e33ca12be60cd791cc24b36" + integrity sha512-bvxCbHeeS7quxS7uOJShyoOQj/BfLabhF6mk9Rmr+2MRfW8W1yxyyL/0GTxLFTHen41GrIw4K3D4DrLouhb8vg== "@types/node-fetch@^2.6.2": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" - integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== + version "2.6.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.7.tgz#a1abe2ce24228b58ad97f99480fdcf9bbc6ab16d" + integrity sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg== dependencies: "@types/node" "*" - form-data "^3.0.0" + form-data "^4.0.0" "@types/node@*": - version "18.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.6.tgz#4f91b0b30d405fdf76e0029b11ef5df6a0da4261" - integrity sha512-j3CEDa2vd96K0AXF8Wur7UucACvnjkk8hYyQAHhUNciabZLDl9nfAEVUSwmh245OOZV15bRA3Y590Gi5jUcDJg== + version "20.8.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.8.tgz#adee050b422061ad5255fc38ff71b2bb96ea2a0e" + integrity sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ== + dependencies: + undici-types "~5.25.1" "@types/node@^10.12.5": version "10.17.60" @@ -3503,9 +3566,9 @@ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/pumpify@*": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@types/pumpify/-/pumpify-1.4.1.tgz#5a0650f39a3f8f077c7e544d0c5ae2899b28394c" - integrity sha512-l7u/Dnh1OG9T7VH6TvulR0g8oE8hgIW5409mSUKi8Vxw2+JV18aTa06Sv5bvNjrD0zbsB/cuZ/iTFQgFNfzIuw== + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/pumpify/-/pumpify-1.4.3.tgz#cf8b1abc4b2b58ed1cce28a8f9ca604fef0b7bcd" + integrity sha512-ie6+WgKnjXYFA37OdIfI72b+RSQ4lIlOwcp38SYr16xJo6qOGAovvVR4j2UuBohgkAGiYWRwMNCfxdRGQloEyw== dependencies: "@types/duplexify" "*" "@types/node" "*" @@ -3557,14 +3620,14 @@ integrity sha512-vhHkPKxl0cudrbxr5Dog1HVgUGXtmyYP95qy1da/h5gFEzIqDMN/+SjJAS7/6DEAdeI+AJQX8zrdWXL3wP4FRA== "@types/uuid@^3.4.4": - version "3.4.10" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.10.tgz#637d3c8431f112edf6728ac9bdfadfe029540f48" - integrity sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A== + version "3.4.12" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.12.tgz#dea044ba4db9acdf1e8deab39995c9b4cfe07ab6" + integrity sha512-4mZWvs9415R6KNlPUZaMDgpnNpFZrO7yZoFfVc6phuOpnUlU06KGu4+83e857jfWkYBMNVZF/1HDoG/aEbePow== "@types/webidl-conversions@*": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.1.tgz#2b9a2062b39a7272343c185cdb884f2e52188f75" - integrity sha512-8hKOnOan+Uu+NgMaCouhg3cT9x5fFZ92Jwf+uDLXLu/MFRbXxlWwGeQY7KVHkeSft6RvY+tdxklUBuyY9eIEKg== + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.2.tgz#d703e2bf61d8b77a7669adcd8fdf98108155d594" + integrity sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ== "@types/whatwg-url@^8.2.1": version "8.2.2" @@ -5853,6 +5916,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -6035,9 +6107,9 @@ globby@^11.0.3, globby@^11.1.0: slash "^3.0.0" google-libphonenumber@^3.2.32: - version "3.2.32" - resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.32.tgz#63c48a9c247b64a3bc2eec21bdf3fcfbf2e148c0" - integrity sha512-mcNgakausov/B/eTgVeX8qc8IwWjRrupk9UzZZ/QDEvdh5fAjE7Aa211bkZpZj42zKkeS6MTT8avHUwjcLxuGQ== + version "3.2.33" + resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.33.tgz#948b877914eb7f35fc6d311220472bf9bd6b27d4" + integrity sha512-1QKCvAlfq8zY1mviORI9lDzM3I/hwm9+h0CwYBTLq59DBbSHMd5zBOLqHZFiBLicRpwIz46Nynvbywj1XApKvA== graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" @@ -6102,9 +6174,9 @@ graphql-ws@^5.4.1: integrity sha512-4EiZ3/UXYcjm+xFGP544/yW1+DVI8ZpKASFbzrV5EDTFWJp0ZvLl4Dy2fSZAzz9imKp5pZMIcjB0x/H69Pv/6w== graphql@^16.3.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" - integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== + version "16.8.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" + integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== growly@^1.3.0: version "1.3.0" @@ -10081,12 +10153,17 @@ underscore@>1.4.4: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + undici@^5.10.0: - version "5.19.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.19.1.tgz#92b1fd3ab2c089b5a6bd3e579dcda8f1934ebf6d" - integrity sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A== + version "5.26.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79" + integrity sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw== dependencies: - busboy "^1.6.0" + "@fastify/busboy" "^2.0.0" union-value@^1.0.0: version "1.0.1" @@ -10554,6 +10631,6 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zod@^3.17.3: - version "3.19.1" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.19.1.tgz#112f074a97b50bfc4772d4ad1576814bd8ac4473" - integrity sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA== + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==