This is the SRD for Assignment 1 (lesson A14). Everything you need to configure is on this page. If something is not written here, the answer is "not required"; do not invent it.
An individual applies for a residence permit, pays a fixed 5,000 RWF, and an officer of one fixed office approves, rejects or asks for a correction. The applicant receives the decision by SMS and email. There is no certificate in Assignment 1. Everything is available in English, Kinyarwanda and French.
| Item | Value |
|---|---|
| Workflow pattern | Apply → Pay → Officer approval (with Reject and Request for Action) |
| Lessons that cover it | A4 (overview), A5 and A6 (form), A7 (pricing), A8 and A9 (workflow), A10 (translations), A11 to A13 (testing) |
| Not in scope | Certificates (Assignment 2), dynamic pricing, several approval levels, integrations, officer forms, appointments |
| Item | English | Kinyarwanda | French |
|---|---|---|---|
| Service name | [Your first name] - Residence Permit Request |
[Your first name] - Gusaba uruhushya rwo gutura |
[Your first name] - Demande de permis de résidence |
| Summary | Apply for a one-year residence permit. Pay 5,000 RWF; an officer reviews your application and you receive the decision by SMS and email. | Saba uruhushya rwo gutura rw'umwaka umwe. Wishyura 5,000 RWF; umukozi abishinzwe asuzuma ubusabe bwawe, maze ukamenyeshwa icyemezo mu butumwa bugufi no kuri imeri. | Demandez un permis de résidence d'un an. Payez 5 000 RWF ; un agent examine votre demande et vous recevez la décision par SMS et par e-mail. |
| Setting | Value |
|---|---|
| Category | Immigration and Emigration |
| Who can apply | Individual: on. Business: off. At least one must be on (A4). |
| Organization | The training organization your trainer gives you |
| Languages | English, Kinyarwanda, French (all three required) |
Keys are given exactly. Use them as written: the pricing, the workflow and the notifications read answers by key (A5: "keys are forever").
How "required" and "visible when" are configured (wiki: Form configuration · Rules):
"required": false, "defaultRequired": true and the expression "props.required": "!(field?.props?.hideField || field?.hide) && field?.props?.defaultRequired". This means a hidden field is never required.expressions.hide rule. The table gives the condition for being visible; the hide rule is its negation. Example: Visible when livesInRwanda = YES → "hide": "model?.livesInRwanda !== 'YES'".| Section (key) | Block (key) | Block description shown to the applicant |
|---|---|---|
Applicant details (applicantDetailsSection) |
Personal information (personalInfoBlock) |
none |
Additional information (additionalInfoSection) |
Employment details (employmentBlock) |
This information relates to the employer that will provide proof of employment. It increases your eligibility for the residence permit. |
Residence details (residenceBlock) |
none |
| # | Key | Label (EN) | Type | Required | Validation and error message (EN) | Options (value: label) | Visible when |
|---|---|---|---|---|---|---|---|
| 1 | firstName |
First Name | input | Yes | Max length 50. "First name is required." | always | |
| 2 | lastName |
Last Name | input | No | Max length 50 | always | |
| 3 | gender |
Gender | radio | Yes | "Gender is required." | MALE: Male · FEMALE: Female |
always |
| 4 | dateOfBirth |
Date of Birth | customdatepicker | Yes | addRemoveTimeMaxDate: "-18:y". Messages: required "Date of birth is required."; maxDate "You must be at least 18 years old." |
always | |
| 5 | civilStatus |
Civil Status | customdropdown (static) | Yes | "Civil status is required." | MARRIED: Married · SINGLE: Single · DIVORCED: Divorced · WIDOWED: Widowed |
always |
| 6 | nationality |
Nationality | customdropdown (admin dataset COUNTRY) |
Yes | "Nationality is required." | Countries (dataset) | always |
| 7 | idNumber |
ID or Passport Number | input | Yes | Pattern ^[A-Za-z0-9]{5,20}$. Messages: required "ID or passport number is required."; pattern "Use 5 to 20 letters or digits, without spaces." |
always | |
| 8 | email |
Email Address | input (email) | Yes | Email format. Messages: required "Email address is required."; email "Enter a valid email address." | always | |
| 9 | phoneNumber |
Phone Number | customphonenumber | No | Phone format (widget) | always | |
| 10 | employer |
Employer | input | Yes | Max length 100. "Employer is required." | always | |
| 11 | contractType |
Contract Type | radio | Yes | "Contract type is required." | FULL_TIME: Full time · PART_TIME: Part time |
always |
| 12 | contractStartDate |
Contract Start Date | customdatepicker | Yes | "Start date is required." | always | |
| 13 | contractEndDate |
Contract End Date | customdatepicker | No | Must be after the start date (compareDateFields on the root, contractStartDate before contractEndDate): "The end date must be after the start date." |
always | |
| 14 | livesInRwanda |
Do you live in Rwanda? | radio | Yes | "Please answer this question." | YES: Yes · NO: No |
always |
| 15 | residenceLocation |
Residence Address | Location widget (customcascadingdropdowns), levels PROVINCE → DISTRICT → SECTOR → CELL → VILLAGE |
Yes, all levels | "Select your province, district, sector, cell and village." | Rwanda locations (central reference data) | livesInRwanda = YES |
| 16 | countryOfResidence |
Country of Residence | customdropdown (admin dataset COUNTRY) |
Yes | "Country is required." | Countries | livesInRwanda = NO |
| 17 | cityOfResidence |
City | input | Yes | Max length 60. "City is required." | livesInRwanda = NO |
Placeholders (EN): First Name "Enter your first name"; Last Name "Enter your last name"; Date of Birth "Select a date"; Civil Status "Select civil status"; Nationality "Select a country"; ID or Passport Number "Enter your ID or passport number"; Email "Enter your email address"; Phone "Enter your phone number"; Employer "Enter your employer's name"; dates "Select a date"; Country "Select a country"; City "Enter your city".
Attachments: none.
| Setting | Value |
|---|---|
| Type | Paid, fixed |
| Price | 5,000 |
| Currency | RWF |
| Payment expiration time | 120 hours (5 days) |
| Payment account | Fixed: GOR-CG-RWF |
| Service payment code | Fixed: RRA-4ed26a32b0 |
| Payment merchant | GOR |
| State code | State name EN | RW | FR | Applicant sees (A12) |
|---|---|---|---|---|
NEW |
New | Gishya | Nouveau | (start) |
PAYMENT_PENDING |
Payment Pending | Gutegereza kwishyura | Paiement en attente | Pending payment |
PAYMENT_EXPIRED |
Payment Expired | Igihe cyo kwishyura cyarangiye | Paiement expiré | Payment expired |
PENDING_ASSIGN_OFFICE |
Submitted | Byoherejwe | Soumis | Submitted for Processing |
PENDING_OFFICER_PROCESSING |
Under Review | Birimo gusuzumwa | En cours d'examen | Submitted for Processing |
PENDING_RESUBMISSION |
Action Required | Bisaba gukosorwa | Action requise | Action required |
APPROVED |
Approved | Byemejwe | Approuvé | Request Approved |
REJECTED |
Rejected | Byanzwe | Rejeté | Rejected |
Breaking actions run inside the transition (if one fails, nothing moves). Non-breaking actions run afterwards from a queue (B7).
| # | Start state | Event | Who fires it | End state (endStateOne) | endStateTwo | Breaking action | Non-breaking action |
|---|---|---|---|---|---|---|---|
| T1 | NEW | APPLY | ROLE_CITIZEN, ROLE_AGENT |
PAYMENT_PENDING | PENDING_ASSIGN_OFFICE (only used if the price is 0, which cannot happen at 5,000; keep it as a safety net) | BILL_ID_GENERATION (args null) |
NOTIFICATION N1 |
| T2 | PAYMENT_PENDING | PAY | system authorised | PENDING_ASSIGN_OFFICE | NOTIFICATION N2 | ||
| T3 | PAYMENT_PENDING | EXPIRE_PAYMENT | system authorised | PAYMENT_EXPIRED | NOTIFICATION N3 | ||
| T4 | PAYMENT_EXPIRED | PAY | system authorised | PENDING_ASSIGN_OFFICE | NOTIFICATION N2 (a late payment still counts) | ||
| T5 | PENDING_ASSIGN_OFFICE | ASSIGN_OFFICE | system authorised; fired by the state's nextEvent ASSIGN_OFFICE | PENDING_OFFICER_PROCESSING | OFFICE_ASSIGNMENT (section 5) |
||
| T6 | PENDING_OFFICER_PROCESSING | APPROVE | ROLE_OFFICER |
APPROVED | NOTIFICATION N4 (no attachment) | ||
| T7 | PENDING_OFFICER_PROCESSING | REJECT | ROLE_OFFICER |
REJECTED | NOTIFICATION N5 | ||
| T8 | PENDING_OFFICER_PROCESSING | REQUEST_FOR_ACTION | ROLE_OFFICER |
PENDING_RESUBMISSION | NOTIFICATION N6 | ||
| T9 | PENDING_RESUBMISSION | SUBMIT_RFA | ROLE_CITIZEN, ROLE_AGENT |
PENDING_OFFICER_PROCESSING | NOTIFICATION N7 |
The editor warns "System event PAY … is never triggered" for T2, T3 and T4. That warning is expected (A9).
Event display names for the officer: APPROVE "Approve" / "Emeza" / "Approuver"; REJECT "Reject" / "Hakana" / "Rejeter"; REQUEST_FOR_ACTION "Request for action" / "Saba gukosora" / "Demander une correction".
| Setting | Value |
|---|---|
| Type | CODE_FIXED_OFFICE |
| Level | LEVEL_1. Set the level first: the office picker lists only the offices of the chosen level. |
| Office | The LEVEL_1 office of your training organization. Your trainer tells you which office it is; select it in the office picker, which fills in its officeId. |
| Before testing | Check that the office has at least one active officer with an officer profile (A13 gotcha). |
None. Approve runs immediately. Reject and Request for Action ask the officer for a comment (A13).
None in Assignment 1. You design your first certificate in Assignment 2, after lesson B9.
Type: STATIC, with the text per language (en, rw, fr). Every placeholder carries !"": without it, a missing value stops the message, and because the action is non-breaking, the message is lost silently.
Placeholders used: applicantName, serviceName, applicationNumber, billReferenceNumber, paymentExpiration (yyyy-MM-dd HH:mm), price, currency, comment (the officer's comment).
| Lang | SMS | Email subject | Email body |
|---|---|---|---|
| EN | Dear ${applicantName!""}, your application for ${serviceName!""} was submitted. Bill number: ${billReferenceNumber!""}. Amount: ${price!""} ${currency!""}. Pay before ${paymentExpiration!""}. Irembo support: 9099. | Application submitted | Dear ${applicantName!""}, Your application for ${serviceName!""} was submitted. Bill number: ${billReferenceNumber!""} Amount: ${price!""} ${currency!""} Pay before: ${paymentExpiration!""} Thank you for using Irembo. For support, call 9099 or write to support@irembo.com. If you received this email by mistake, please ignore it. |
| RW | Muraho ${applicantName!""}, ubusabe bwanyu bwa ${serviceName!""} bwakiriwe. Nimero yo kwishyura: ${billReferenceNumber!""}. Amafaranga: ${price!""} ${currency!""}. Mwishyure mbere ya ${paymentExpiration!""}. Ubufasha: 9099. | Ubusabe bwakiriwe | Muraho ${applicantName!""}, Ubusabe bwanyu bwa ${serviceName!""} bwakiriwe. Nimero yo kwishyura: ${billReferenceNumber!""} Amafaranga: ${price!""} ${currency!""} Mwishyure mbere ya: ${paymentExpiration!""} Murakoze gukoresha Irembo. Ku bufasha, hamagara 9099 cyangwa wandikire support@irembo.com. Niba iyi imeri yakugezeho ku bw'impanuka, uyirengagize. |
| FR | Bonjour ${applicantName!""}, votre demande de ${serviceName!""} a été soumise. Numéro de facture : ${billReferenceNumber!""}. Montant : ${price!""} ${currency!""}. Payez avant le ${paymentExpiration!""}. Assistance Irembo : 9099. | Demande soumise | Bonjour ${applicantName!""}, Votre demande de ${serviceName!""} a été soumise. Numéro de facture : ${billReferenceNumber!""} Montant : ${price!""} ${currency!""} À payer avant le : ${paymentExpiration!""} Merci d'utiliser Irembo. Pour toute assistance, appelez le 9099 ou écrivez à support@irembo.com. Si vous avez reçu cet e-mail par erreur, veuillez l'ignorer. |
| Lang | SMS | Email subject | Email body |
|---|---|---|---|
| EN | Dear ${applicantName!""}, we received your payment for ${serviceName!""}. Application number: ${applicationNumber!""}. An officer will review it. | Payment received | Dear ${applicantName!""}, We received your payment of ${price!""} ${currency!""} for ${serviceName!""}. Application number: ${applicationNumber!""} Status: Submitted for processing. An officer will review your application. For support, call 9099. |
| RW | Muraho ${applicantName!""}, twakiriye ubwishyu bwanyu bwa ${serviceName!""}. Nimero y'ubusabe: ${applicationNumber!""}. Umukozi abishinzwe azabusuzuma. | Ubwishyu bwakiriwe | Muraho ${applicantName!""}, Twakiriye ubwishyu bwanyu bwa ${price!""} ${currency!""} kuri ${serviceName!""}. Nimero y'ubusabe: ${applicationNumber!""} Aho bigeze: Byoherejwe gusuzumwa. Umukozi abishinzwe azasuzuma ubusabe bwanyu. Ku bufasha, hamagara 9099. |
| FR | Bonjour ${applicantName!""}, nous avons reçu votre paiement pour ${serviceName!""}. Numéro de demande : ${applicationNumber!""}. Un agent va l'examiner. | Paiement reçu | Bonjour ${applicantName!""}, Nous avons reçu votre paiement de ${price!""} ${currency!""} pour ${serviceName!""}. Numéro de demande : ${applicationNumber!""} Statut : soumis pour traitement. Un agent va examiner votre demande. Pour toute assistance, appelez le 9099. |
| Lang | SMS | Email subject | Email body |
|---|---|---|---|
| EN | Dear ${applicantName!""}, the bill ${billReferenceNumber!""} for ${serviceName!""} has expired. You can still pay it; otherwise apply again. Support: 9099. | Payment expired | Dear ${applicantName!""}, The payment period for your application for ${serviceName!""} (bill ${billReferenceNumber!""}) has ended. You can still pay the bill; otherwise, submit a new application. For support, call 9099. |
| RW | Muraho ${applicantName!""}, igihe cyo kwishyura ${billReferenceNumber!""} kuri ${serviceName!""} cyarangiye. Mushobora kwishyura; bitabaye ibyo mwongere musabe. Ubufasha: 9099. | Igihe cyo kwishyura cyarangiye | Muraho ${applicantName!""}, Igihe cyo kwishyura ubusabe bwanyu bwa ${serviceName!""} (nimero ${billReferenceNumber!""}) cyarangiye. Mushobora kwishyura; bitabaye ibyo, mwongere musabe. Ku bufasha, hamagara 9099. |
| FR | Bonjour ${applicantName!""}, la facture ${billReferenceNumber!""} pour ${serviceName!""} a expiré. Vous pouvez encore la payer ; sinon, faites une nouvelle demande. Assistance : 9099. | Paiement expiré | Bonjour ${applicantName!""}, Le délai de paiement de votre demande de ${serviceName!""} (facture ${billReferenceNumber!""}) est dépassé. Vous pouvez encore payer la facture ; sinon, soumettez une nouvelle demande. Pour toute assistance, appelez le 9099. |
| Lang | SMS | Email subject | Email body |
|---|---|---|---|
| EN | Dear ${applicantName!""}, your application ${applicationNumber!""} for ${serviceName!""} is approved. You can see its status on Irembo. Support: 9099. | Application approved | Dear ${applicantName!""}, Your application ${applicationNumber!""} for ${serviceName!""} is approved. The office will contact you about the next steps. You can follow the status of your application in your Irembo account. For support, call 9099. |
| RW | Muraho ${applicantName!""}, ubusabe bwanyu ${applicationNumber!""} bwa ${serviceName!""} bwemejwe. Mushobora kureba aho bugeze kuri Irembo. Ubufasha: 9099. | Ubusabe bwemejwe | Muraho ${applicantName!""}, Ubusabe bwanyu ${applicationNumber!""} bwa ${serviceName!""} bwemejwe. Ibiro bibishinzwe bizabamenyesha ibikurikiraho. Mushobora gukurikirana aho ubusabe bwanyu bugeze kuri konti yanyu ya Irembo. Ku bufasha, hamagara 9099. |
| FR | Bonjour ${applicantName!""}, votre demande ${applicationNumber!""} de ${serviceName!""} est approuvée. Vous pouvez en suivre le statut sur Irembo. Assistance : 9099. | Demande approuvée | Bonjour ${applicantName!""}, Votre demande ${applicationNumber!""} de ${serviceName!""} est approuvée. Le bureau vous contactera pour la suite. Vous pouvez suivre le statut de votre demande depuis votre compte Irembo. Pour toute assistance, appelez le 9099. |
| Lang | SMS | Email subject | Email body |
|---|---|---|---|
| EN | Dear ${applicantName!""}, your application ${applicationNumber!""} for ${serviceName!""} was rejected. Reason: $ | Application rejected | Dear ${applicantName!""}, Your application ${applicationNumber!""} for ${serviceName!""} was rejected. Reason: ${comment!""} For support, call 9099. |
| RW | Muraho ${applicantName!""}, ubusabe bwanyu ${applicationNumber!""} bwa ${serviceName!""} bwanzwe. Impamvu: $ | Ubusabe bwanzwe | Muraho ${applicantName!""}, Ubusabe bwanyu ${applicationNumber!""} bwa ${serviceName!""} bwanzwe. Impamvu: ${comment!""} Ku bufasha, hamagara 9099. |
| FR | Bonjour ${applicantName!""}, votre demande ${applicationNumber!""} de ${serviceName!""} a été rejetée. Motif : $ | Demande rejetée | Bonjour ${applicantName!""}, Votre demande ${applicationNumber!""} de ${serviceName!""} a été rejetée. Motif : ${comment!""} Pour toute assistance, appelez le 9099. |
| Lang | SMS | Email subject | Email body |
|---|---|---|---|
| EN | Dear ${applicantName!""}, your application ${applicationNumber!""} needs a correction: ${comment!""}. Log in to Irembo to update and resubmit it. | Action required on your application | Dear ${applicantName!""}, The officer reviewing your application ${applicationNumber!""} for {comment!""} Log in to Irembo, open the application, update it and resubmit it. You will not pay again. For support, call 9099. |
| RW | Muraho ${applicantName!""}, ubusabe bwanyu ${applicationNumber!""} bukeneye gukosorwa: ${comment!""}. Injira kuri Irembo ubukosore maze mwongere mubwohereze. | Ubusabe bwanyu bukeneye gukosorwa | Muraho ${applicantName!""}, Umukozi usuzuma ubusabe bwanyu ${applicationNumber!""} bwa {comment!""} Injira kuri Irembo, fungura ubusabe, ubukosore maze mwongere mubwohereze. Ntimuzongera kwishyura. Ku bufasha, hamagara 9099. |
| FR | Bonjour ${applicantName!""}, votre demande ${applicationNumber!""} doit être corrigée : ${comment!""}. Connectez-vous à Irembo pour la modifier et la soumettre à nouveau. | Action requise sur votre demande | Bonjour ${applicantName!""}, L'agent qui examine votre demande ${applicationNumber!""} de {comment!""} Connectez-vous à Irembo, ouvrez la demande, modifiez-la et soumettez-la à nouveau. Vous ne paierez pas une seconde fois. Pour toute assistance, appelez le 9099. |
| Lang | SMS | Email subject | Email body |
|---|---|---|---|
| EN | Dear ${applicantName!""}, your corrected application ${applicationNumber!""} was resubmitted and will be reviewed again. | Application resubmitted | Dear ${applicantName!""}, Your corrected application ${applicationNumber!""} for ${serviceName!""} was resubmitted. An officer will review it again. For support, call 9099. |
| RW | Muraho ${applicantName!""}, ubusabe bwanyu bwakosowe ${applicationNumber!""} bwongeye koherezwa kandi buzongera gusuzumwa. | Ubusabe bwongeye koherezwa | Muraho ${applicantName!""}, Ubusabe bwanyu bwakosowe ${applicationNumber!""} bwa ${serviceName!""} bwongeye koherezwa. Umukozi abishinzwe azongera abusuzume. Ku bufasha, hamagara 9099. |
| FR | Bonjour ${applicantName!""}, votre demande corrigée ${applicationNumber!""} a été soumise à nouveau et sera réexaminée. | Demande soumise à nouveau | Bonjour ${applicantName!""}, Votre demande corrigée ${applicationNumber!""} de ${serviceName!""} a été soumise à nouveau. Un agent va la réexaminer. Pour toute assistance, appelez le 9099. |
Leave every Condition empty, so that every step always shows. The Condition field is JavaScript, and free text such as "After payment" hides the step.
| # | Title EN / RW / FR | Description EN | RW | FR |
|---|---|---|---|---|
| 1 | Pay / Kwishyura / Payer | Pay 5,000 RWF with your bill number using any method under "Payment options". | Ishyura 5,000 RWF ukoresheje nimero yo kwishyura, unyuze mu buryo buri muri "Uburyo bwo kwishyura". | Payez 5 000 RWF avec votre numéro de facture, par l'un des moyens indiqués sous « Options de paiement ». |
| 2 | Review / Isuzuma / Examen | An officer reviews your application. If something must be corrected, you receive an SMS and an email. | Umukozi abishinzwe asuzuma ubusabe bwawe. Niba hari icyo gukosora, uhabwa ubutumwa bugufi na imeri. | Un agent examine votre demande. Si une correction est nécessaire, vous recevez un SMS et un e-mail. |
| 3 | Decision / Icyemezo / Décision | When the officer approves or rejects your application, you receive an SMS and an email. If it is approved, the office contacts you about the next steps. You can see the status on Irembo at any time. | Iyo umukozi abishinzwe yemeje cyangwa yanze ubusabe bwawe, uhabwa ubutumwa bugufi na imeri. Iyo bwemejwe, ibiro bibishinzwe bikumenyesha ibikurikiraho. Ushobora kureba aho ubusabe bwawe bugeze kuri Irembo igihe cyose. | Lorsque l'agent approuve ou rejette votre demande, vous recevez un SMS et un e-mail. Si elle est approuvée, le bureau vous contacte pour la suite. Vous pouvez consulter le statut sur Irembo à tout moment. |
1 working day after payment (wizard: processing time 1, unit DAYS).
| Key | English | Kinyarwanda | French |
|---|---|---|---|
| applicantDetailsSection | Applicant details | Umwirondoro w'usaba | Informations du demandeur |
| personalInfoBlock | Personal information | Amakuru bwite | Informations personnelles |
| additionalInfoSection | Additional information | Andi makuru | Informations complémentaires |
| employmentBlock | Employment details | Amakuru y'akazi | Informations sur l'emploi |
| residenceBlock | Residence details | Aho utuye | Lieu de résidence |
| firstName | First Name | Izina bwite | Prénom |
| lastName | Last Name | Izina ry'umuryango | Nom de famille |
| gender | Gender (Male / Female) | Igitsina (Gabo / Gore) | Sexe (Homme / Femme) |
| dateOfBirth | Date of Birth | Itariki y'amavuko | Date de naissance |
| civilStatus | Civil Status (Married / Single / Divorced / Widowed) | Irangamimerere (Arubatse / Ingaragu / Yatandukanye n'uwo bashakanye / Umupfakazi) | État civil (Marié(e) / Célibataire / Divorcé(e) / Veuf (veuve)) |
| nationality | Nationality | Ubwenegihugu | Nationalité |
| idNumber | ID or Passport Number | Nimero y'indangamuntu cyangwa ya pasiporo | Numéro de carte d'identité ou de passeport |
| Email Address | Imeri | Adresse e-mail | |
| phoneNumber | Phone Number | Nimero ya telefoni | Numéro de téléphone |
| employer | Employer | Umukoresha | Employeur |
| contractType | Contract Type (Full time / Part time) | Ubwoko bw'amasezerano (Igihe cyose / Igihe gito) | Type de contrat (Temps plein / Temps partiel) |
| contractStartDate | Contract Start Date | Itariki amasezerano atangiriraho | Date de début du contrat |
| contractEndDate | Contract End Date | Itariki amasezerano arangiriraho | Date de fin du contrat |
| livesInRwanda | Do you live in Rwanda? (Yes / No) | Utuye mu Rwanda? (Yego / Oya) | Vivez-vous au Rwanda ? (Oui / Non) |
| residenceLocation | Residence Address (Province, District, Sector, Cell, Village) | Aho utuye (Intara, Akarere, Umurenge, Akagari, Umudugudu) | Adresse de résidence (Province, District, Secteur, Cellule, Village) |
| countryOfResidence | Country of Residence | Igihugu utuyemo | Pays de résidence |
| cityOfResidence | City | Umujyi | Ville |
Error messages:
| English | Kinyarwanda | French |
|---|---|---|
| This field is required. | Iki gice kigomba kuzuzwa. | Ce champ est obligatoire. |
| You must be at least 18 years old. | Ugomba kuba ufite nibura imyaka 18. | Vous devez avoir au moins 18 ans. |
| Use 5 to 20 letters or digits, without spaces. | Koresha inyuguti cyangwa imibare iri hagati ya 5 na 20, nta mwanya. | Utilisez 5 à 20 lettres ou chiffres, sans espace. |
| Enter a valid email address. | Andika imeri nyayo. | Saisissez une adresse e-mail valide. |
| The end date must be after the start date. | Itariki yo kurangiza igomba kuba nyuma y'itariki yo gutangira. | La date de fin doit être postérieure à la date de début. |
Use synthetic data only. Never type a real person's ID.
| Case | Input | Expected |
|---|---|---|
| TC1 Happy path | Test Applicant, FEMALE, born 01/01/1990, SINGLE, Kenya, idNumber TST12345, email learner.test@example.com, Employer "Training Ltd", FULL_TIME, start 01/09/2026, lives in Rwanda YES, any village |
Bill of 5,000 RWF (N1) → pay on staging → N2 → officer sees it in the inbox → Approve → APPROVED, N4 received (no attachment) |
| TC2 Age | Date of birth less than 18 years ago | The date cannot be selected / "You must be at least 18 years old." |
| TC3 Conditional fields | livesInRwanda NO | The address is hidden; Country and City are shown and required |
| TC4 Dates | End date before start date | "The end date must be after the start date." |
| TC5 Reject | TC1, then the officer clicks Reject with a comment | REJECTED, N5 contains the comment |
| TC6 Correction loop | TC1, then Request for Action → applicant edits and resubmits | PENDING_RESUBMISSION (N6) → PENDING_OFFICER_PROCESSING (N7), same office |
| TC7 Expiry (optional) | Do not pay | After 120 h: PAYMENT_EXPIRED (N3). Waiting 120 h is not required for the review. |
| TC8 Languages | Switch the portal to Kinyarwanda and French | No raw translation key and no English text left |
Submit for review (A14): the change request name, the application numbers of TC1 and of TC5 or TC6, and confirmation of TC8.
Apply → (Payment pending) → Pay → (Submitted) → office assigned → (Under review) → Approve / Reject / Request for action → (Action required) → Resubmit.