Skip to content

Commit df9fff4

Browse files
authored
feat(public): add flow for criminal record certificates (#55)
* fix(public): only honour returnTo when explicitly supplied Check-answers return navigation should not be inferred from the next step when the query parameter is absent. * feat(public): add previous residence countries and criminal record triage Adds a locked-Spain previous residence country step, a conditional criminal-record certificate status step, country-name localisation, triage assessments, and result/handover output. * fix(public): make commonCountryCodes type read-only
1 parent 6395de7 commit df9fff4

28 files changed

Lines changed: 1354 additions & 21 deletions

apps/public/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@
2121
"test:watch": "node --env-file=../../.env.test ./node_modules/vitest/vitest.mjs"
2222
},
2323
"dependencies": {
24-
"@primer-paso/ui": "workspace:*",
25-
"@primer-paso/certificate": "workspace:*",
26-
"@primer-paso/db": "workspace:*",
2724
"@fontsource-variable/inter": "^5.2.8",
2825
"@internationalized/date": "^3.12.1",
2926
"@lucide/svelte": "^1.14.0",
27+
"@primer-paso/certificate": "workspace:*",
28+
"@primer-paso/db": "workspace:*",
29+
"@primer-paso/ui": "workspace:*",
3030
"bits-ui": "^2.18.1",
3131
"clsx": "^2.1.1",
3232
"fuse.js": "^7.1.0",
33+
"i18n-iso-countries": "^7.14.0",
3334
"pdf-lib": "^1.17.1",
3435
"qrcode": "^1.5.4",
3536
"tailwind-merge": "^3.5.0",

apps/public/src/lib/content/ar.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,52 @@ export const ar = {
257257
'steps.identity_documents.options.travel_document': 'وثيقة سفر',
258258
'steps.identity_documents.options.no_identity_documents_now': 'ليست لدي الآن أي وثائق هوية معي',
259259
'steps.identity_documents.options.prefer_not_to_say': 'أفضل عدم الإجابة',
260+
'steps.previous_residence_countries.title': 'في أي بلدان عشت خلال السنوات الخمس الماضية؟',
261+
'steps.previous_residence_countries.body': 'أضف أي بلد آخر عشت فيه خلال هذه الفترة.',
262+
'steps.previous_residence_countries.hint':
263+
'ستحتاج عادةً إلى شهادات سوابق جنائية من البلدان المحددة خارج إسبانيا.',
264+
'steps.previous_residence_countries.error': 'يجب أن تبقى إسبانيا محددة.',
265+
'steps.previous_residence_countries.check_answers_label':
266+
'البلدان التي عشت فيها خلال السنوات الخمس الماضية',
267+
'steps.previous_residence_countries.search_label': 'البحث في كل البلدان',
268+
'steps.previous_residence_countries.spain_locked_label': 'إسبانيا',
269+
'steps.previous_residence_countries.spain_locked_hint': 'مدرجة مسبقاً ولا يمكن إزالتها.',
270+
'steps.previous_residence_countries.common_countries_label': 'بلدان شائعة',
271+
'steps.previous_residence_countries.all_other_countries': 'كل البلدان الأخرى',
272+
'steps.previous_residence_countries.search_results': 'نتائج البحث',
273+
'steps.criminal_record_certificates.title': 'ما حالة كل شهادة سوابق جنائية؟',
274+
'steps.criminal_record_certificates.body':
275+
'أخبرنا إذا كانت الشهادة معك بالفعل، أو طلبتها وتنتظرها، أو لم تطلبها بعد، أو لست متأكداً.',
276+
'steps.criminal_record_certificates.hint': 'إذا طلبت شهادة، فاحتفظ بإثبات الطلب.',
277+
'steps.criminal_record_certificates.error': 'أجب عن أسئلة الشهادة لكل بلد.',
278+
'steps.criminal_record_certificates.check_answers_label': 'حالة شهادة السوابق الجنائية',
279+
'steps.criminal_record_certificates.check_answers.entry': '{country}: {status}',
280+
'steps.criminal_record_certificates.options.already_have': 'الشهادة معي بالفعل',
281+
'steps.criminal_record_certificates.options.requested_waiting': 'طلبتها وأنا أنتظرها',
282+
'steps.criminal_record_certificates.options.not_requested_yet': 'لم أطلبها بعد',
283+
'steps.criminal_record_certificates.options.not_sure': 'لست متأكداً',
284+
'results.criminal_records.title': 'جاهزية شهادات السوابق الجنائية',
285+
'results.criminal_records.intro':
286+
'تتحقق الإدارة من السجل الجنائي في إسبانيا. وبالنسبة إلى البلدان الأخرى التي عشت فيها خلال الفترة ذات الصلة، ستحتاج عادةً إلى شهادة سوابق جنائية.',
287+
'results.criminal_records.status.already_have': 'قلت إن هذه الشهادة معك بالفعل.',
288+
'results.criminal_records.status.requested_waiting': 'قلت إنك طلبت هذه الشهادة وما زلت تنتظرها.',
289+
'results.criminal_records.status.not_requested_yet': 'قلت إن هذه الشهادة لم تُطلب بعد.',
290+
'results.criminal_records.status.not_sure': 'لست متأكداً بشأن هذه الشهادة.',
291+
'results.criminal_records.status.unknown': 'معلومات البلد ناقصة أو غير واضحة.',
292+
'results.criminal_records.next_actions.request_criminal_record_certificate_today':
293+
'اطلب هذه الشهادة في أقرب وقت ممكن.',
294+
'results.criminal_records.next_actions.save_certificate_request_proof':
295+
'احتفظ بإثبات أن الشهادة قد طُلبت.',
296+
'results.criminal_records.next_actions.wait_until_one_month_then_prepare_fallback':
297+
'إذا مر شهر ولم تصل الشهادة، فحضّر معلومات الخيار البديل قبل طلب المساعدة.',
298+
'results.criminal_records.next_actions.ask_specialist_about_criminal_record_certificate':
299+
'اطلب من مختص أو منظمة مسجلة مراجعة هذا قبل التقديم.',
300+
'results.criminal_records.status_label': 'الحالة',
301+
'results.criminal_records.next_action_label': 'الإجراء التالي',
302+
'pages.handover.criminal_records.title': 'جاهزية شهادات السوابق الجنائية',
303+
'pages.handover.criminal_records.country': 'البلد',
304+
'pages.handover.criminal_records.status': 'الحالة',
305+
'pages.handover.criminal_records.next_actions': 'الإجراءات التالية',
260306
'steps.evidence_before_cutoff.title':
261307
'هل لديك أي مستندات يمكن أن تساعد في إثبات أنك كنت تعيش بالفعل في إسبانيا قبل يناير 2026؟',
262308
'steps.evidence_before_cutoff.check_answers_label': 'مستندات قد تُظهر الإقامة قبل يناير 2026',

apps/public/src/lib/content/en.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,58 @@ export const en = {
269269
'steps.identity_documents.options.no_identity_documents_now':
270270
'I do not have any identity documents with me now',
271271
'steps.identity_documents.options.prefer_not_to_say': 'Prefer not to say',
272+
'steps.previous_residence_countries.title':
273+
'In which countries have you lived during the last five years?',
274+
'steps.previous_residence_countries.body':
275+
'Add any other country where you have lived during this period.',
276+
'steps.previous_residence_countries.hint':
277+
'You will usually need criminal-record certificates from the selected countries outside Spain.',
278+
'steps.previous_residence_countries.error': 'Spain must stay selected.',
279+
'steps.previous_residence_countries.check_answers_label':
280+
'Countries lived in during the last five years',
281+
'steps.previous_residence_countries.search_label': 'Search all countries',
282+
'steps.previous_residence_countries.spain_locked_label': 'Spain',
283+
'steps.previous_residence_countries.spain_locked_hint': 'Already included. Cannot be removed.',
284+
'steps.previous_residence_countries.common_countries_label': 'Common countries',
285+
'steps.previous_residence_countries.all_other_countries': 'All other countries',
286+
'steps.previous_residence_countries.search_results': 'Search results',
287+
'steps.criminal_record_certificates.title':
288+
'What is the status of each criminal-record certificate?',
289+
'steps.criminal_record_certificates.body':
290+
'Tell us whether you already have the certificate, have requested it, have not requested it yet, or are not sure.',
291+
'steps.criminal_record_certificates.hint':
292+
'If you requested a certificate, keep proof of the request.',
293+
'steps.criminal_record_certificates.error': 'Answer the certificate questions for each country.',
294+
'steps.criminal_record_certificates.check_answers_label': 'Criminal-record certificate status',
295+
'steps.criminal_record_certificates.check_answers.entry': '{country}: {status}',
296+
'steps.criminal_record_certificates.options.already_have': 'I already have it',
297+
'steps.criminal_record_certificates.options.requested_waiting': 'I requested it and am waiting',
298+
'steps.criminal_record_certificates.options.not_requested_yet': 'I have not requested it yet',
299+
'steps.criminal_record_certificates.options.not_sure': 'I am not sure',
300+
'results.criminal_records.title': 'Criminal-record certificate readiness',
301+
'results.criminal_records.intro':
302+
'Spanish criminal records are checked by the administration. For other countries where you lived during the relevant period, you will usually need a criminal-record certificate.',
303+
'results.criminal_records.status.already_have': 'You said you already have this certificate.',
304+
'results.criminal_records.status.requested_waiting':
305+
'You said you requested this certificate and are waiting.',
306+
'results.criminal_records.status.not_requested_yet':
307+
'You said this certificate has not been requested yet.',
308+
'results.criminal_records.status.not_sure': 'You are not sure about this certificate.',
309+
'results.criminal_records.status.unknown': 'The country information is missing or unclear.',
310+
'results.criminal_records.next_actions.request_criminal_record_certificate_today':
311+
'Request this certificate as soon as possible.',
312+
'results.criminal_records.next_actions.save_certificate_request_proof':
313+
'Keep proof that the certificate was requested.',
314+
'results.criminal_records.next_actions.wait_until_one_month_then_prepare_fallback':
315+
'If one month passes and it has not arrived, prepare the fallback information before seeking help.',
316+
'results.criminal_records.next_actions.ask_specialist_about_criminal_record_certificate':
317+
'Ask a specialist or registered organisation to review this before submitting.',
318+
'results.criminal_records.status_label': 'Status',
319+
'results.criminal_records.next_action_label': 'Next action',
320+
'pages.handover.criminal_records.title': 'Criminal-record certificate readiness',
321+
'pages.handover.criminal_records.country': 'Country',
322+
'pages.handover.criminal_records.status': 'Status',
323+
'pages.handover.criminal_records.next_actions': 'Next actions',
272324
'steps.evidence_before_cutoff.title':
273325
'Do you have any documents that could help show you were already living in Spain before January 2026?',
274326
'steps.evidence_before_cutoff.check_answers_label':

apps/public/src/lib/content/es.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,60 @@ export const es = {
280280
'steps.identity_documents.options.no_identity_documents_now':
281281
'No tengo documentos de identidad conmigo ahora',
282282
'steps.identity_documents.options.prefer_not_to_say': 'Prefiero no decirlo',
283+
'steps.previous_residence_countries.title':
284+
'¿En qué países has vivido durante los últimos cinco años?',
285+
'steps.previous_residence_countries.body':
286+
'Agrega cualquier otro país donde hayas vivido durante este periodo.',
287+
'steps.previous_residence_countries.hint':
288+
'Normalmente necesitarás certificados de antecedentes penales de los países seleccionados fuera de España.',
289+
'steps.previous_residence_countries.error': 'España debe permanecer seleccionada.',
290+
'steps.previous_residence_countries.check_answers_label':
291+
'Países donde viviste durante los últimos cinco años',
292+
'steps.previous_residence_countries.search_label': 'Buscar en todos los países',
293+
'steps.previous_residence_countries.spain_locked_label': 'España',
294+
'steps.previous_residence_countries.spain_locked_hint': 'Ya incluida. No se puede quitar.',
295+
'steps.previous_residence_countries.common_countries_label': 'Países comunes',
296+
'steps.previous_residence_countries.all_other_countries': 'Todos los demás países',
297+
'steps.previous_residence_countries.search_results': 'Resultados de búsqueda',
298+
'steps.criminal_record_certificates.title':
299+
'¿Cuál es el estado de cada certificado de antecedentes penales?',
300+
'steps.criminal_record_certificates.body':
301+
'Indica si ya tienes el certificado, si lo solicitaste y estás esperando, si todavía no lo has solicitado o si no estás seguro/a.',
302+
'steps.criminal_record_certificates.hint':
303+
'Si solicitaste un certificado, guarda el comprobante de la solicitud.',
304+
'steps.criminal_record_certificates.error':
305+
'Responde las preguntas sobre el certificado para cada país.',
306+
'steps.criminal_record_certificates.check_answers_label':
307+
'Estado del certificado de antecedentes penales',
308+
'steps.criminal_record_certificates.check_answers.entry': '{country}: {status}',
309+
'steps.criminal_record_certificates.options.already_have': 'Ya lo tengo',
310+
'steps.criminal_record_certificates.options.requested_waiting': 'Lo solicité y estoy esperando',
311+
'steps.criminal_record_certificates.options.not_requested_yet': 'Todavía no lo he solicitado',
312+
'steps.criminal_record_certificates.options.not_sure': 'No estoy seguro/a',
313+
'results.criminal_records.title': 'Preparación de certificados de antecedentes penales',
314+
'results.criminal_records.intro':
315+
'Los antecedentes penales en España los revisa la administración. Para otros países donde viviste durante el periodo relevante, normalmente necesitarás un certificado de antecedentes penales.',
316+
'results.criminal_records.status.already_have': 'Indicaste que ya tienes este certificado.',
317+
'results.criminal_records.status.requested_waiting':
318+
'Indicaste que solicitaste este certificado y estás esperando.',
319+
'results.criminal_records.status.not_requested_yet':
320+
'Indicaste que este certificado todavía no se ha solicitado.',
321+
'results.criminal_records.status.not_sure': 'No estás seguro/a sobre este certificado.',
322+
'results.criminal_records.status.unknown': 'La información del país falta o no está clara.',
323+
'results.criminal_records.next_actions.request_criminal_record_certificate_today':
324+
'Solicita este certificado lo antes posible.',
325+
'results.criminal_records.next_actions.save_certificate_request_proof':
326+
'Guarda el comprobante de que solicitaste el certificado.',
327+
'results.criminal_records.next_actions.wait_until_one_month_then_prepare_fallback':
328+
'Si pasa un mes y no ha llegado, prepara la información alternativa antes de pedir ayuda.',
329+
'results.criminal_records.next_actions.ask_specialist_about_criminal_record_certificate':
330+
'Pide a un/a especialista u organización registrada que revise esto antes de presentar la solicitud.',
331+
'results.criminal_records.status_label': 'Estado',
332+
'results.criminal_records.next_action_label': 'Siguiente acción',
333+
'pages.handover.criminal_records.title': 'Preparación de certificados de antecedentes penales',
334+
'pages.handover.criminal_records.country': 'País',
335+
'pages.handover.criminal_records.status': 'Estado',
336+
'pages.handover.criminal_records.next_actions': 'Siguientes acciones',
283337
'steps.evidence_before_cutoff.title':
284338
'¿Tienes algún documento que pueda ayudar a mostrar que ya vivías en España antes de enero de 2026?',
285339
'steps.evidence_before_cutoff.check_answers_label':

apps/public/src/lib/content/fr.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,63 @@ export const fr = {
291291
'steps.identity_documents.options.no_identity_documents_now':
292292
'Je n’ai pas de document d’identité avec moi en ce moment',
293293
'steps.identity_documents.options.prefer_not_to_say': 'Je préfère ne pas le dire',
294+
'steps.previous_residence_countries.title':
295+
'Dans quels pays avez-vous vécu au cours des cinq dernières années ?',
296+
'steps.previous_residence_countries.body':
297+
'Ajoutez tout autre pays où vous avez vécu pendant cette période.',
298+
'steps.previous_residence_countries.hint':
299+
'Vous aurez généralement besoin de certificats de casier judiciaire des pays sélectionnés hors Espagne.',
300+
'steps.previous_residence_countries.error': 'L’Espagne doit rester sélectionnée.',
301+
'steps.previous_residence_countries.check_answers_label':
302+
'Pays où vous avez vécu au cours des cinq dernières années',
303+
'steps.previous_residence_countries.search_label': 'Rechercher tous les pays',
304+
'steps.previous_residence_countries.spain_locked_label': 'Espagne',
305+
'steps.previous_residence_countries.spain_locked_hint':
306+
'Déjà incluse. Ne peut pas être supprimée.',
307+
'steps.previous_residence_countries.common_countries_label': 'Pays fréquents',
308+
'steps.previous_residence_countries.all_other_countries': 'Tous les autres pays',
309+
'steps.previous_residence_countries.search_results': 'Résultats de recherche',
310+
'steps.criminal_record_certificates.title':
311+
'Quel est le statut de chaque certificat de casier judiciaire ?',
312+
'steps.criminal_record_certificates.body':
313+
'Indiquez si vous avez déjà le certificat, si vous l’avez demandé et l’attendez, si vous ne l’avez pas encore demandé, ou si vous n’êtes pas sûr·e.',
314+
'steps.criminal_record_certificates.hint':
315+
'Si vous avez demandé un certificat, gardez une preuve de la demande.',
316+
'steps.criminal_record_certificates.error':
317+
'Répondez aux questions sur le certificat pour chaque pays.',
318+
'steps.criminal_record_certificates.check_answers_label':
319+
'Statut du certificat de casier judiciaire',
320+
'steps.criminal_record_certificates.check_answers.entry': '{country}: {status}',
321+
'steps.criminal_record_certificates.options.already_have': 'Je l’ai déjà',
322+
'steps.criminal_record_certificates.options.requested_waiting': 'Je l’ai demandé et je l’attends',
323+
'steps.criminal_record_certificates.options.not_requested_yet': 'Je ne l’ai pas encore demandé',
324+
'steps.criminal_record_certificates.options.not_sure': 'Je ne suis pas sûr·e',
325+
'results.criminal_records.title': 'Préparation des certificats de casier judiciaire',
326+
'results.criminal_records.intro':
327+
'Les antécédents pénaux en Espagne sont vérifiés par l’administration. Pour les autres pays où vous avez vécu pendant la période pertinente, vous aurez généralement besoin d’un certificat de casier judiciaire.',
328+
'results.criminal_records.status.already_have':
329+
'Vous avez indiqué que vous avez déjà ce certificat.',
330+
'results.criminal_records.status.requested_waiting':
331+
'Vous avez indiqué que vous avez demandé ce certificat et que vous l’attendez.',
332+
'results.criminal_records.status.not_requested_yet':
333+
'Vous avez indiqué que ce certificat n’a pas encore été demandé.',
334+
'results.criminal_records.status.not_sure': 'Vous n’êtes pas sûr·e concernant ce certificat.',
335+
'results.criminal_records.status.unknown':
336+
'Les informations sur le pays sont manquantes ou peu claires.',
337+
'results.criminal_records.next_actions.request_criminal_record_certificate_today':
338+
'Demandez ce certificat dès que possible.',
339+
'results.criminal_records.next_actions.save_certificate_request_proof':
340+
'Gardez la preuve que le certificat a été demandé.',
341+
'results.criminal_records.next_actions.wait_until_one_month_then_prepare_fallback':
342+
'Si un mois passe et que le certificat n’est pas arrivé, préparez les informations pour l’alternative avant de demander de l’aide.',
343+
'results.criminal_records.next_actions.ask_specialist_about_criminal_record_certificate':
344+
'Demandez à un·e spécialiste ou à une organisation enregistrée d’examiner cela avant le dépôt.',
345+
'results.criminal_records.status_label': 'Statut',
346+
'results.criminal_records.next_action_label': 'Prochaine action',
347+
'pages.handover.criminal_records.title': 'Préparation des certificats de casier judiciaire',
348+
'pages.handover.criminal_records.country': 'Pays',
349+
'pages.handover.criminal_records.status': 'Statut',
350+
'pages.handover.criminal_records.next_actions': 'Prochaines actions',
294351
'steps.evidence_before_cutoff.title':
295352
'Avez-vous des documents pouvant aider à montrer que vous viviez déjà en Espagne avant janvier 2026 ?',
296353
'steps.evidence_before_cutoff.check_answers_label':

0 commit comments

Comments
 (0)