diff --git a/infrastructure/postgres/setup-analytics.sh b/infrastructure/postgres/setup-analytics.sh index 0d09144c3d..97bcb0f484 100644 --- a/infrastructure/postgres/setup-analytics.sh +++ b/infrastructure/postgres/setup-analytics.sh @@ -85,6 +85,8 @@ CREATE TABLE IF NOT EXISTS analytics.event_actions ( UNIQUE (id, event_id) ); +ALTER TABLE analytics.event_actions ADD COLUMN IF NOT EXISTS custom_action_type TEXT; + CREATE TABLE IF NOT EXISTS analytics.location_levels ( id text PRIMARY KEY, level int NOT NULL, diff --git a/package.json b/package.json index 43378084a4..d9fcea32e1 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@hapi/boom": "^9.1.1", "@hapi/hapi": "^20.0.1", "@hapi/inert": "^6.0.3", - "@opencrvs/toolkit": "1.9.0-rc.79b0f42", + "@opencrvs/toolkit": "1.9.0-rc.8476ac9", "@types/chalk": "^2.2.0", "@types/csv2json": "^1.4.0", "@types/fhir": "^0.0.30", @@ -114,7 +114,7 @@ "tsconfig-paths": "^3.8.0", "typescript": "^5.1.6", "uuid": "^11.1.0", - "zod": "^3.24.1" + "zod": "^4.1.12" }, "lint-staged": { "src/**/*.{ts,graphql}": [ diff --git a/src/api/custom-event/handler.ts b/src/api/custom-event/handler.ts index e575d75d1e..df488f2118 100644 --- a/src/api/custom-event/handler.ts +++ b/src/api/custom-event/handler.ts @@ -24,6 +24,13 @@ export function getCustomEventsHandler( .code(200) } +export async function onCustomActionHandler( + request: ActionConfirmationRequest, + h: Hapi.ResponseToolkit +) { + return h.response().code(200) +} + export async function onAnyActionHandler( request: ActionConfirmationRequest, h: Hapi.ResponseToolkit @@ -33,6 +40,7 @@ export async function onAnyActionHandler( const token = request.auth.artifacts.token as string const event = request.payload + await sendInformantNotification({ event, token }) return h.response().code(200) diff --git a/src/api/notification/informantNotification.ts b/src/api/notification/informantNotification.ts index 3cbe401def..e08c51df1f 100644 --- a/src/api/notification/informantNotification.ts +++ b/src/api/notification/informantNotification.ts @@ -26,8 +26,6 @@ import { InformantType as BirthInformantType } from '@countryconfig/form/v2/birt import { InformantTemplateType } from './sms-service' import { generateFailureLog, NotificationParams, notify } from './handler' import { InformantType as DeathInformantType } from '@countryconfig/form/v2/death/forms/pages/informant' -import { birthEvent } from '@countryconfig/form/v2/birth' -import { deathEvent } from '@countryconfig/form/v2/death' const resolveName = (name: FieldUpdateValue) => { const nameObj = { @@ -77,18 +75,6 @@ function getInformant(eventType: string, declaration: Record) { throw new Error('Invalid event type') } -function getEventConfig(eventType: string) { - if (eventType === Event.Birth) { - return birthEvent - } - - if (eventType === Event.Death) { - return deathEvent - } - - throw new Error('Invalid event type') -} - async function getNotificationParams( event: EventDocument, token: string, diff --git a/src/data-seeding/roles/roles.ts b/src/data-seeding/roles/roles.ts index 68e0189520..ec9ae77975 100644 --- a/src/data-seeding/roles/roles.ts +++ b/src/data-seeding/roles/roles.ts @@ -221,7 +221,8 @@ export const roles: Role[] = [ 'record.register[event=birth|death|tennis-club-membership]', 'record.registered.print-certified-copies[event=birth|death|tennis-club-membership]', 'record.registered.correct[event=birth|death|tennis-club-membership]', - 'record.unassign-others[event=birth|death|tennis-club-membership]' + 'record.unassign-others[event=birth|death|tennis-club-membership]', + 'record.custom-action[event=birth,customActionType=Approve]' ] }, { diff --git a/src/form/tennis-club-membership.ts b/src/form/tennis-club-membership.ts index 845562aa2a..7fc0b1845b 100644 --- a/src/form/tennis-club-membership.ts +++ b/src/form/tennis-club-membership.ts @@ -908,8 +908,7 @@ export const tennisClubMembershipEvent = defineConfig({ description: 'This is shown as the action name anywhere the user can trigger the action from', id: 'event.tennis-club-membership.action.validate.label' - }, - review: TENNIS_CLUB_DECLARATION_REVIEW + } }, { type: ActionType.REGISTER, @@ -918,8 +917,7 @@ export const tennisClubMembershipEvent = defineConfig({ description: 'This is shown as the action name anywhere the user can trigger the action from', id: 'event.tennis-club-membership.action.register.label' - }, - review: TENNIS_CLUB_DECLARATION_REVIEW + } }, { type: ActionType.PRINT_CERTIFICATE, diff --git a/src/form/v2/birth/index.ts b/src/form/v2/birth/index.ts index 3a86a57433..8c04d1339b 100644 --- a/src/form/v2/birth/index.ts +++ b/src/form/v2/birth/index.ts @@ -10,9 +10,11 @@ */ import { ActionType, + and, ConditionalType, defineConfig, - field + field, + not } from '@opencrvs/toolkit/events' import { BIRTH_DECLARATION_FORM, @@ -24,6 +26,7 @@ import { BIRTH_CERTIFICATE_COLLECTOR_FORM } from './forms/printForm' import { PlaceOfBirth } from './forms/pages/child' import { CORRECTION_FORM } from './forms/correctionForm' import { dedupConfig } from './dedupConfig' +import { applicationConfig } from '@countryconfig/api/application/application-config' export const birthEvent = defineConfig({ id: Event.Birth, @@ -45,6 +48,17 @@ export const birthEvent = defineConfig({ description: 'This is a fallback title if actual title resolves to empty string' }, + flags: [ + { + id: 'approval-required-for-late-registration', + label: { + id: 'event.birth.flag.approval-required-for-late-registration', + defaultMessage: 'Approval required for late registration', + description: 'Flag label for approval required for late registration' + }, + requiresAction: true + } + ], summary: { fields: [ { @@ -188,6 +202,47 @@ export const birthEvent = defineConfig({ id: 'event.birth.action.detect-duplicate.label' }, query: dedupConfig + }, + flags: [ + { + id: 'approval-required-for-late-registration', + operation: 'add', + conditional: and( + not( + field('child.dob') + .isAfter() + .days(applicationConfig.BIRTH.LATE_REGISTRATION_TARGET) + .inPast() + ), + field('child.dob').isBefore().now() + ) + } + ] + }, + { + type: ActionType.CUSTOM, + customActionType: 'Approve', + label: { + defaultMessage: 'Approve', + description: + 'This is shown as the action name anywhere the user can trigger the action from', + id: 'event.birth.action.approve.label' + }, + supportingCopy: { + defaultMessage: + 'This birth has been registered late. You are now approving it for further validation and registration.', + description: 'This is the confirmation text for the approve action', + id: 'event.birth.action.approve.confirmationText' + }, + form: [], + flags: [ + { id: 'approval-required-for-late-registration', operation: 'remove' } + ], + auditHistoryLabel: { + defaultMessage: 'Approved', + description: + 'The label to show in audit history for the approve action', + id: 'event.birth.action.approve.audit-history-label' } }, { @@ -198,7 +253,6 @@ export const birthEvent = defineConfig({ 'This is shown as the action name anywhere the user can trigger the action from', id: 'event.birth.action.validate.label' }, - review: BIRTH_DECLARATION_REVIEW, deduplication: { id: 'birth-deduplication', label: { @@ -218,7 +272,6 @@ export const birthEvent = defineConfig({ 'This is shown as the action name anywhere the user can trigger the action from', id: 'event.birth.action.register.label' }, - review: BIRTH_DECLARATION_REVIEW, deduplication: { id: 'birth-deduplication', label: { diff --git a/src/form/v2/death/index.ts b/src/form/v2/death/index.ts index f8d10b782d..1880a27e7b 100644 --- a/src/form/v2/death/index.ts +++ b/src/form/v2/death/index.ts @@ -201,7 +201,6 @@ export const deathEvent = defineConfig({ 'This is shown as the action name anywhere the user can trigger the action from', id: 'event.death.action.validate.label' }, - review: DEATH_DECLARATION_REVIEW, deduplication: { id: 'death-deduplication', label: { @@ -221,7 +220,6 @@ export const deathEvent = defineConfig({ 'This is shown as the action name anywhere the user can trigger the action from', id: 'event.death.action.register.label' }, - review: DEATH_DECLARATION_REVIEW, deduplication: { id: 'death-deduplication', label: { diff --git a/src/index.ts b/src/index.ts index 3a128999f7..acc411894e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -58,9 +58,9 @@ import { fontsHandler } from './api/fonts/handler' import { recordNotificationHandler } from './api/record-notification/handler' import { getCustomEventsHandler, - onAnyActionHandler + onAnyActionHandler, + onCustomActionHandler } from '@countryconfig/api/custom-event/handler' -import { readFileSync } from 'fs' import { ActionDocument, ActionStatus, @@ -92,7 +92,7 @@ export interface ITokenPayload { export default function getPlugins() { const plugins: any[] = [inert, JWT] - if (process.env.NODE_ENV === 'production') { + if (process.env.NODE_ENV !== 'test') { plugins.push({ plugin: Pino, options: { @@ -641,6 +641,16 @@ export async function createServer() { } }) + server.route({ + method: 'POST', + path: `/trigger/events/{event}/actions/${ActionType.CUSTOM}`, + handler: onCustomActionHandler, + options: { + tags: ['api', 'events'], + description: 'Receives notifications on event custom action' + } + }) + server.route({ method: 'POST', path: '/trigger/events/{event}/actions/{action}', @@ -748,9 +758,9 @@ export async function createServer() { await syncLocationLevels() await syncLocationStatistics() - const logMsg = `Server successfully started on ${COUNTRY_CONFIG_HOST}:${COUNTRY_CONFIG_PORT}` - logger.info(logMsg) - server.log('info', logMsg) + logger.info( + `Server successfully started on ${COUNTRY_CONFIG_HOST}:${COUNTRY_CONFIG_PORT}` + ) } return { server, start, stop } diff --git a/src/logger.ts b/src/logger.ts index 55a694bce0..5526689551 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -19,6 +19,11 @@ export const logger = ] }) : pino({ + serializers: { + req: () => undefined, + res: () => undefined, + responseTime: () => undefined + }, transport: { target: 'pino-pretty', options: { diff --git a/src/translations/client.csv b/src/translations/client.csv index 090501110b..cd0699f6e6 100644 --- a/src/translations/client.csv +++ b/src/translations/client.csv @@ -352,6 +352,7 @@ constants.phoneNumber,Phone label,Phone number,Numéro de téléphone constants.policeOfficer,The description for Police Officer type,Police Officer,Agent de police constants.reason,Label for Reason the declaration was rejected,Reason,Raison constants.record,Label for header table header Record,Record,Dossier +constants.audit,Label for the audit header,Audit,Audit constants.refresh,label for refresh,refresh,Rafraîchir constants.registered,A label for registered,Registered,Enregistré constants.registered.status,A label for registered,Registered,Enregistré @@ -795,7 +796,7 @@ errors.somethingWentWrong,Error toast message for general errors,Something went event.action.declare.form.section.person.field.age.error,Error message for invalid age,Age must be between 12 and 120,L'auteur doit avoir entre 12 et 120 ans event.action.notAvailableForEvent,Shown when user tries to perform an action that is not available for the event,The action you're trying to perform is not available for this event anymore,L'action que vous essayez d'effectuer n'est plus disponible pour cet événement event.action.outbox-retry.label,Label for retry button for outbox,Retry,Réessayer -event.action.review-correction.label,Label for review correction button in dropdown menu,Review,Revoir +event.action.review-correction.label,Label for review correction button in dropdown menu,Review correction request,Revoir la demande de correction event.birth.action.archive.label,Label for archive record button in dropdown menu,Archive,Aarchiver event.birth.action.certificate.form.section.collectPayment.data.label,Title for the data section,Payment details,Détails du paiement event.birth.action.certificate.form.section.collectPayment.fee.label,Title for the data entry,Fee,Frais @@ -854,12 +855,14 @@ event.birth.action.declare.form.section.person.field.nid.label,This is the label event.birth.action.declare.form.section.person.field.occupation.label,This is the label for the field,Occupation,Profession event.birth.action.declare.form.section.person.field.passport.label,This is the label for the field,ID Number,Numéro d'identification event.birth.action.declare.label,This is shown as the action name anywhere the user can trigger the action from,Declare,Declare +event.birth.action.reject.label,This is the label for the reject action,Reject,Rejeter event.birth.action.delete.label,Label for delete button in dropdown menu,Delete,Supprimer event.birth.action.form.section.collector.other.field.name.label,This is the label for the name field of OTHER collector,Collector's name,Nom du collecteur event.birth.action.mark-as-duplicate.label,Label for review potential duplicate button in dropdown menu,Review,Revoir -event.birth.action.register.label,Label for review record button in dropdown menu,Review,Revoir +event.birth.action.register.label,Label for review record button in dropdown menu,Register,Enregistrer event.birth.action.request-correction.label,This is shown as the action name anywhere the user can trigger the action from,Correct record,Enregistrement correct -event.birth.action.validate.label,This is shown as the action name anywhere the user can trigger the action from,Review,Revoir +event.birth.action.validate.label,This is shown as the action name anywhere the user can trigger the action from,Validate,Valider +event.birth.action.approve.confirmationText,This is the confirmation text for the approve action,This birth has been registered late. You are now approving it for further validation and registration.,Cette naissance a été enregistrée en retard. Vous l'approuvez maintenant pour une validation et un enregistrement supplémentaires. event.birth.label,This is what this event is referred as in the system,Birth,Naissance event.birth.summary.child.dob.empty,Label for date of birth not available,No date of birth,Pas de date de naissance event.birth.summary.child.placeOfBirth.empty,Label for place of birth not available,No place of birth,Pas de lieu de naissance @@ -1109,7 +1112,9 @@ event.tennis-club-membership.summary.field.recommender.firstname.empty,Shown whe event.tennis-club-membership.summary.field.recommender.firstname.label,Label for the recommender's first name field,Recommender's First Name,Recommender's First Name event.tennis-club-membership.summary.field.recommender.id.empty,Shown when the recommender id is missing in summary,Recommender's id missing,Recommender's id missing event.tennis-club-membership.summary.field.recommender.id.label,Label for the recommender's ID field,Recommender's ID,Recommender's ID -events.history.status,Events status history,"{status, select, Requested {Waiting for external validation} other {{action, select, CREATE {Declaration started} NOTIFY {Sent incomplete} VALIDATE {Sent for approval} DRAFT {Draft} DECLARE {Sent for review} REGISTER {Registered} PRINT_CERTIFICATE {Certified} REJECT {Rejected} ARCHIVE {Archived} DUPLICATE_DETECTED {Flagged as potential duplicate} MARKED_AS_DUPLICATE {Marked as a duplicate} MARK_AS_NOT_DUPLICATE {Marked not a duplicate} CORRECTED {Record corrected} REQUEST_CORRECTION {Correction requested} APPROVE_CORRECTION {Correction approved} REJECT_CORRECTION {Correction rejected} READ {Viewed} ASSIGN {Assigned} UNASSIGN {Unassigned} UPDATE {Updated} other {Unknown}}}}","{status, select, Requested {En attente de validation externe} other {{action, select, CREATE {Déclaration commencée} NOTIFY {Envoyé incomplet} VALIDATE {Envoyé pour approbation} DRAFT {Brouillon} DECLARE {Envoyé pour révision} REGISTER {Enregistré} PRINT_CERTIFICATE {Certifié} REJECT {Rejeté} ARCHIVE {Archivé} DUPLICATE_DETECTED {Marqué comme doublon} MARKED_AS_DUPLICATE {Marqué comme doublon} MARK_AS_NOT_DUPLICATE {Marqué comme non en doublon} CORRECTED {Enregistrement corrigé} REQUEST_CORRECTION {Correction demandée} APPROVE_CORRECTION {Correction approuvée} REJECT_CORRECTION {Correction refusée} READ {Consulté} ASSIGN {Attribué} UNASSIGN {Désattribué} UPDATE {Mis à jour} other {Inconnu}}}}" +events.overview.tabs.record,Title of the Record tab,Record,Enregistrement +events.overview.tabs.audit,Title of the Audit tab,Audit,Audit +events.history.status,Events status history,"{status, select, Requested {Waiting for external validation} other {{action, select, CREATE {Declaration started} NOTIFY {Notified} VALIDATE {Sent for approval} DRAFT {Draft} DECLARE {Sent for review} REGISTER {Registered} PRINT_CERTIFICATE {Certified} REJECT {Rejected} ARCHIVE {Archived} DUPLICATE_DETECTED {Flagged as potential duplicate} MARKED_AS_DUPLICATE {Marked as a duplicate} MARK_AS_NOT_DUPLICATE {Marked not a duplicate} CORRECTED {Record corrected} REQUEST_CORRECTION {Correction requested} APPROVE_CORRECTION {Correction approved} REJECT_CORRECTION {Correction rejected} READ {Viewed} ASSIGN {Assigned} UNASSIGN {Unassigned} UPDATE {Updated} other {Unknown}}}}","{status, select, Requested {En attente de validation externe} other {{action, select, CREATE {Déclaration commencée} NOTIFY {Envoyé incomplet} VALIDATE {Envoyé pour approbation} DRAFT {Brouillon} DECLARE {Envoyé pour révision} REGISTER {Enregistré} PRINT_CERTIFICATE {Certifié} REJECT {Rejeté} ARCHIVE {Archivé} DUPLICATE_DETECTED {Marqué comme doublon} MARKED_AS_DUPLICATE {Marqué comme doublon} MARK_AS_NOT_DUPLICATE {Marqué comme non en doublon} CORRECTED {Enregistrement corrigé} REQUEST_CORRECTION {Correction demandée} APPROVE_CORRECTION {Correction approuvée} REJECT_CORRECTION {Correction refusée} READ {Consulté} ASSIGN {Attribué} UNASSIGN {Désattribué} UPDATE {Mis à jour} other {Inconnu}}}}" events.outbox.processingAction,Message in outbox when processing action,"{action, select, DECLARE {Sending} REGISTER {Registering} VALIDATE {Sending for approval} NOTIFY {Sending} REJECT {Sending for updates} ARCHIVE {Archiving} PRINT_CERTIFICATE {Certifying} REQUEST_CORRECTION {Requesting correction} APPROVE_CORRECTION {Approving correction} REJECT_CORRECTION {Rejecting correction} ASSIGN {Assigning} UNASSIGN {Unassigning} other {processing action}}","{action, select, DECLARE {Envoi} REGISTER {Enregistrement} VALIDATE {Envoi pour approbation} NOTIFY {Envoi} REJECT {Envoi pour mise à jour} ARCHIVE {Archivage} PRINT_CERTIFICATE {Certification} REQUEST_CORRECTION {Demande de correction} APPROVE_CORRECTION {Approbation de la correction} REJECT_CORRECTION {Rejet de la correction} ASSIGN {Attribution} UNASSIGN {Désattribution} other {action en cours}}" events.outbox.waitingForAction,Message in outbox when waiting for action,"Waiting to {action, select, DECLARE {send} CREATE {send} REGISTER {register} VALIDATE {send for approval} NOTIFY {send} REJECT {send for updates} ARCHIVE {archive} PRINT_CERTIFICATE {certify} REQUEST_CORRECTION {request correction} APPROVE_CORRECTION {approve correction} REJECT_CORRECTION {reject correction} ASSIGN {assign} UNASSIGN {unassign} other {action}}","En attente de {action, select, DECLARE {l'envoi} CREATE {l'envoi} REGISTER {l'enregistrement} VALIDATE {l'envoi pour approbation} NOTIFY {l'envoi} REJECT {l'envoi pour mise à jour} ARCHIVE {l'archivage} PRINT_CERTIFICATE {la certification} REQUEST_CORRECTION {la demande de correction} APPROVE_CORRECTION {l'approbation de la correction} REJECT_CORRECTION {le rejet de la correction} ASSIGN {l'attribution} UNASSIGN {la désattribution} other {l'action}}" events.status,Dynamic event status,"{status, select, OUTBOX {Syncing..} CREATED {Draft} VALIDATED {Validated} DRAFT {Draft} DECLARED {Declared} REGISTERED {Registered} CERTIFIED {Certified} REJECTED {Rejected} ARCHIVED {Archived} MARKED_AS_DUPLICATE {Marked as a duplicate} MARK_AS_NOT_DUPLICATE {Marked not a duplicate} NOTIFIED {In progress} other {Unknown}}","{status, select, OUTBOX {Synchronisation..} CREATED {Brouillon} VALIDATED {Validé} DRAFT {Brouillon} DECLARED {Déclaré} REGISTERED {Enregistré} CERTIFIED {Certifié} REJECTED {Nécessite une mise à jour} ARCHIVED {Archivé} MARKED_AS_DUPLICATE {Marqué comme doublon} MARK_AS_NOT_DUPLICATE {Marqué comme non en doublon} NOTIFIED {Notifié} other {Inconnu}}" @@ -1737,7 +1742,7 @@ printAction.title,The title for print action,Print certificate,Imprimer le certi record-corrected.summary.section.title,Corrections section title,Correction(s),Correction(s) record.certificate.collectedInAdvance,Table column header showing collector info in record audit,Printed in advance by,Imprimé à l'avance par record.certificate.collector,Table column header showing collector info in record audit,Printed on collection,Contrôle d'identité -recordAudit.archive.confirmation.body,Confirmation body for archiving a declaration,This will archive the record and remove it from your workspace,"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." +recordAudit.archive.confirmation.body,Confirmation body for archiving a declaration,This will remove the declaration from the workqueue and change the status to Archive. To revert this change you will need to search for the declaration.,"Cela supprimera la déclaration de la file d'attente et changera son statut en Archivé. Pour annuler ce changement, vous devrez rechercher la déclaration." recordAudit.archive.confirmation.title,Confirmation title for archiving a declaration,Archive declaration?,Archiver la déclaration ? recordAudit.archive.status,Archived status,Archived,Archivé recordAudit.contact,Contact for record audit,Contact,Contact @@ -1948,7 +1953,7 @@ review.register.confirmModal.cancel,The label for modal cancel button when regis review.register.confirmModal.confirm,The label for modal confirm button when registering,Register,Enregistrer review.register.confirmModal.description,The description for review action modal when registering,‎, review.register.confirmModal.title,The title for review action modal when registering,Register the {event}?,Enregistrer cet {event}? -review.register.description.complete,The description for registration action when form is complete,"By clicking register, you confirm that the information entered is correct and the event can be registered.","En cliquant sur enregistrer, vous confirmez que les informations saisies sont correctes et que l'événement peut être enregistré." +review.register.description.complete,The description for registration action when form is complete,"By clicking 'Confirm', you confirm that the information entered is correct and the event can be registered.","En cliquant sur enregistrer, vous confirmez que les informations saisies sont correctes et que l'événement peut être enregistré." review.register.reject,The label for reject button of review action,Reject,Rejeter review.register.title,The title shown when reviewing a record to register,Register event,Enregistrer l'événement review.rej.form.reasons.missSupDoc,Label for rejection option missing supporting doc,Missing supporting documents,Documents justificatifs manquants @@ -1972,7 +1977,7 @@ review.validate.confirmModal.cancel,The label for modal cancel button when valid review.validate.confirmModal.confirm,The label for modal confirm button when validating,Confirm,Confirmer review.validate.confirmModal.description,The description for review action modal when validating,This declaration will be sent for approval prior to registration.,Cette déclaration sera envoyée pour approbation avant l'enregistrement. review.validate.confirmModal.title,The title for review action modal when validating,Send for approval?,Envoyer pour approbation ? -review.validate.description.complete,The description for validate action when form is complete,The informant will receive an email with a registration number that they can use to collect the certificate,L'informateur recevra un e-mail avec un numéro d'enregistrement qu'il pourra utiliser pour récupérer le certificat. +review.validate.description.complete,The description for validate action when form is complete,The informant will receive an email with a registration number that they can use to collect the certificate.,L'informateur recevra un e-mail avec un numéro d'enregistrement qu'il pourra utiliser pour récupérer le certificat. review.validate.description.incomplete,The description for validate action when form is complete,Please add mandatory information before sending for approval,Veuillez ajouter les informations obligatoires avant d'envoyer pour approbation. review.validate.reject,The label for reject button of review action,Reject,Rejeter review.validate.title,The title shown when reviewing a record to validate,Send for approval,Envoyer pour approbation @@ -2159,6 +2164,7 @@ user.profile.roleType,Title for roleType field,Role,Rôle/Type user.profile.sectionTitle.audit,Title for audit section,History,Historique user.profile.startDate,Title for startDate field,Start date,Date de début user.profile.userName,Title for userName field,Username,Nom d'utilisateur +user.avatar,Aria label for user avatar button,User avatar,Avatar utilisateur userRole.communityLeader,Name for user role Community Leader,Community Leader,Leader communautaire userRole.fieldAgent,Name for user role Field Agent,Field Agent,Agent de terrain userRole.healthcareWorker,Name for user role Healthcare Worker,Healthcare Worker,Personnel de santé diff --git a/yarn.lock b/yarn.lock index 9764b23b84..b60325ce32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -834,10 +834,10 @@ dependencies: "@octokit/openapi-types" "^18.0.0" -"@opencrvs/toolkit@1.9.0-rc.79b0f42": - version "1.9.0-rc.79b0f42" - resolved "https://registry.yarnpkg.com/@opencrvs/toolkit/-/toolkit-1.9.0-rc.79b0f42.tgz#da8d286fe9caf1670c3edf558a93c7c543452bfc" - integrity sha512-To1EXWuAZt4Tkx6nQ58lIw/cIummQxI3hpf+/WRXmtWX8vU+CRRoA363f/8dELbhTct9eAe5YFf6jUbMCC1hng== +"@opencrvs/toolkit@1.9.0-rc.8476ac9": + version "1.9.0-rc.8476ac9" + resolved "https://registry.yarnpkg.com/@opencrvs/toolkit/-/toolkit-1.9.0-rc.8476ac9.tgz#6794f0e137dc7dd2bd61f42478a79fddfe963902" + integrity sha512-Aqj5E+p+5iMhBjtH007JG7osgd5zCv60GZ2ltcGirAv7C89PWXFeTRumOUpXGMNCdhN2prfIRq32P3ZpXQxXHg== dependencies: "@trpc/client" "11.4.3" "@trpc/server" "11.4.3" @@ -846,7 +846,7 @@ object-hash "^3.0.0" superjson "1.9.0-0" uuid "^9.0.0" - zod-openapi "^4.2.4" + zod-openapi "^5.4.3" "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -5817,12 +5817,12 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zod-openapi@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/zod-openapi/-/zod-openapi-4.2.4.tgz#44a0ec81ace6d64d705c8e4232095fac313359cf" - integrity sha512-tsrQpbpqFCXqVXUzi3TPwFhuMtLN3oNZobOtYnK6/5VkXsNdnIgyNr4r8no4wmYluaxzN3F7iS+8xCW8BmMQ8g== +zod-openapi@^5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/zod-openapi/-/zod-openapi-5.4.3.tgz#ec886fac181b778bc2e9ccc3462c470543f23e26" + integrity sha512-6kJ/gJdvHZtuxjYHoMtkl2PixCwRuZ/s79dVkEr7arHvZGXfx7Cvh53X3HfJ5h9FzGelXOXlnyjwfX0sKEPByw== -zod@^3.24.1: - version "3.24.1" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee" - integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== +zod@^4.1.12: + version "4.1.12" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.12.tgz#64f1ea53d00eab91853195653b5af9eee68970f0" + integrity sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==