Aller au contenu

Onboarding (scope)

IN SCOPE

Questions (17 screens)

# Question Input type Data source Mandatory Format
Q1 Register (email + password + first name + last name) 4 text inputs — creates the candidate account User entry Yes Grouped
Q2 Gender Single select: Man / Woman / Non-binary / Other (free text) / Prefer not to say Static Yes Solo (privacy)
Q3 Date of birth Date picker User entry Yes Solo (privacy)
Q4 Nationality Searchable select DB (nationalities table, seeded) Yes Solo (privacy)
Q5 City of residence Autocomplete GeoNames (cities table) Yes Solo (privacy)
Q6 Career snapshot: Current status + Market positioning 2 single selects Static Yes Grouped
Q7 Target job titles ROME autocomplete, up to 3 entries; domain-based chip suggestions ROME (rome_job_appellations) Yes Solo
Q8 Languages Skill catalogue select + CEFR proficiency per language + flag emoji DB (skills table, category = 'language') Yes Solo
Q9 Expertise Gateway → type selector (Academic degree / Self-taught), multiple entries, accordion User entry No (gateway) Solo
Q11 Experience + inline skills Gateway → type selector (5 types), multiple entries, accordion. Inline skill suggestions (tech + knowledge only) after each entry with ROME code. User entry + ROME + GeoNames + skills catalogue No (gateway) Solo
Q12 Skills review (technical) Top 5 + Your Skills + Suggestions for targets + Search bar (catalogue, categories=competence,knowledge) skills catalogue (ROME-linked + full) Yes (min 1) Solo
Q13 Soft skills All soft skills from ROME catalogue (category=soft_skill) as chips. Top 3 designation. skills catalogue (category=soft_skill) Yes (min 1) Solo
Q14 Preferred work cities Multi-entry (max 4): city (GeoNames autocomplete) + preference level + isOpenToRelocation toggle GeoNames (cities table) Yes Solo
Q15 Work preferences Work modes (multi) + Company size (single) + Sectors (multi, opt.) + Culture values (multi, opt.) Static + DB (culture_values table) Yes (modes + size) Solo
Q16 Logistics: Availability + Salary Single select + number input (brut euros) Static + User entry Yes Grouped
Q17 Professional profile Textarea (free text, 500 chars soft guidance) User entry Yes Solo
Q18 Profile photo Image picker (camera or gallery) User upload No (Skip) Solo

Progress bar and section labels

No step counter. Bar advances proportionally. Section labels:

Section label Questions
Account Q1
Personal Q2–Q5
Career Q6–Q7
Background Q8–Q10
Skills Q12–Q13
Preferences Q14–Q16
Profile Q17–Q18

Q7 — Target job titles

  • ROME-based autocomplete; up to 3 selections.
  • After the first selection, up to 5 related titles from the same ROME domain are suggested as chips below the input. Tapping a chip adds it (subject to the 3-title cap).
  • A "+ Add another target role" button is visible when fewer than 3 titles are selected.

Q10 gateway screen — "My expertise"

Displayed after Q9 (Languages). Two options presented as full-width cards (tap target ≥ 44pt on mobile). "I'll complete it later" is visually de-emphasised.

Option Outcome
Add my expertise Opens the expertise type selector (Academic degree / Self-taught experience)
I'll complete it later Sets Q10 completion flag. Advances to Q11 gateway.

Q10 — Expertise type selector

Two entry types available. Both types can coexist in the same accordion, in any order.

Q10 — Academic degree form (multiple entries, accordion)

Sub-field Type Mandatory
Highest education level Single select (Lycée / Bac / Bac+2 / Bac+3 / Bac+4 / Bac+5 / Bac+8 / Other) Yes
Field of study Single select with emojis (static list) Yes
Diploma name Text input Yes
Institution name Text input Yes
Year of obtention Year dropdown Yes

Q10 — Self-taught experience form (multiple entries, accordion)

Sub-field Type Mandatory
Domain of expertise Text input Yes
How did you learn? Multi-select: Online courses / Personal projects / Books / Mentoring / Open source contributions / Other Yes (min. 1)
Year of completion Year picker Yes
Describe your learning journey Textarea No

Each completed entry collapses into a summary card with a type badge. Additional entries can be added via "+ Add another".

Q11 gateway screen — "My experience"

Displayed after Q10 (or its gateway). Two options presented as full-width cards. "I'll complete it later" is visually de-emphasised. The first entry is prompted as "Start with your current or most recent position".

Option Outcome
Add my experience Opens the experience type selector
I'll complete it later Sets Q11 completion flag. Advances to Q12.

Q11 — Experience type selector

Five entry types available. Multiple types can coexist in the same accordion.

Type Description
Professional role Salaried role in a company
Internship Same fields as Professional role — "Contract type" pre-set to "Internship"
Freelance Freelance mission — specific sub-fields (mission title, client name, key deliverables)
Personal project Autonomous project — standalone type
Volunteer work Role in a non-profit or community organisation

Q11 — Professional role form (multiple entries, accordion)

Sub-field Type Mandatory
Job title ROME autocomplete (same catalogue as Q7) — catalogue selection required Yes
Company name Text input Yes
Sector Single select (Sector enum) Yes
City Autocomplete (GeoNames) — hidden if Remote is checked No
Remote Checkbox — when checked, city is hidden and cityId = null No
Start date Month + year picker Yes
End date Month + year picker, or "Current" toggle Yes
Contract type Single select (ContractType enum) Yes
Key responsibilities Textarea No

Note — Internship: uses the same form as Professional role. "Contract type" is pre-set to "Internship" and remains visible (can be overridden). Note — First entry: the "Current" toggle is active by default on the first entry.

Q11 — Freelance form (multiple entries, accordion)

Sub-field Type Mandatory
Job title / Mission title ROME autocomplete (same catalogue as Q7) — catalogue selection required Yes
Client name Text input Yes
Sector Single select (Sector enum) Yes
City Autocomplete (GeoNames) — hidden if Remote is checked No
Remote Checkbox No
Start date Month + year picker Yes
End date Month + year picker, or "Current" toggle Yes
Key deliverables Textarea No

Q11 — Personal project form (multiple entries, accordion)

Sub-field Type Mandatory
Project name Text input Yes
Domain Text input Yes
Description Textarea Yes
Start date Month + year picker No
End date Month + year picker No
Link URL input No

Q11 — Volunteer work form (multiple entries, accordion)

Sub-field Type Mandatory
Role Text input Yes
Organisation Text input Yes
City Autocomplete (GeoNames) — hidden if Remote is checked No
Remote Checkbox No
Start date Month + year picker Yes
End date Month + year picker, or "Current" toggle Yes
Description Textarea No

Each completed entry collapses into a summary card with a type badge. Additional entries can be added via "+ Add another", selecting the type for each new entry.

Q11 — Inline skills after experience

After each experience entry with a ROME code (Professional role, Internship, Freelance), a skill selection section appears. Only technical and knowledge skills are shown (categories=competence,knowledge — no soft skills). - "Recommended" (open by default): skills at the intersection of this experience ROME AND any target job ROME codes. Accent color chips. - "Other skills for [Job Title]" (accordion, closed): remaining skills from this ROME code. - No pre-selection — candidate actively selects. Skills are saved as passport_skills. - No search bar during experience entry — search is on Q12 review only.

Q12 — Skills review (technical + knowledge only)

Soft skills (category = 'soft_skill') are excluded — they have their own screen (Q13). - Search bar (sticky): queries skills catalogue with categories=competence,knowledge. "Skill not found" message if no match. - Top Skills (X/5): starred technical skills, displayed prominently. Tap ★ to toggle. Max 5. Toast if already 5. - Your Skills (count): all selected technical/knowledge skills as chips with ★ toggle and × remove. - Suggested for your target roles: skills from target job ROME codes not yet selected. - No hard cap on total skills. - Incentive banner (if experiences skipped): "Add your work experience to unlock personalized skill suggestions" with link to Q11 gateway. - Message: "Your experience may include skills we haven't suggested — search here to add them."

Q13 — Soft skills

Dedicated screen for human qualities (savoir-être). "Vos qualités humaines". - All soft skills from ROME catalogue (GET /v1/skills?categories=soft_skill, ~30-50 items) displayed as selectable chips. - No search bar — finite browsable list. - No per-experience suggestions — soft skills are personal traits, not job-specific. - Top 3 designation — same star pattern as Q12 but max 3. - Mandatory: at least 1 soft skill required. - On the Passport: displayed as a separate section "🤝 Top 3 qualities" alongside "⚡ Top 5 skills".

Q14 — Preferred cities

Multi-entry (max 4): city (GeoNames autocomplete) + preference level (preferred / acceptable). - isOpenToRelocation toggle: "I'm open to relocating for work" — boolean, stored on Passport. - At least 1 city required.

Q15 — Work preferences

Single screen with four sub-sections. Work modes (multi-select — mandatory, min. 1): Full remote / Hybrid / On-site / Flexible Company size (single select — mandatory): Startup (< 10) / Small (10–50) / Medium (50–250) / Large (250–1 000) / Enterprise (1 000+) / No preference Target sectors (multi-select — optional, max. 5): Sector enum values Professional values (multi-select — optional, max. 5): controlled vocabulary from culture_values table (GET /v1/culture-values) The Continue button is enabled once work modes (min. 1) and company size are filled.

Q16 — Logistics (grouped)

Two fields on one screen: Availability (single select — mandatory): Now / < 2 weeks / < 1 month / < 2 months / < 3 months / 6+ months Minimum expected salary (number input — mandatory): free input in euros brut. No brut/net toggle.

Q17 — Professional profile

  • Textarea: free-text self-description (placeholder: "Describe yourself professionally: your motivations, work personality, what drives you…")
  • Soft guidance: 500 characters (counter turns orange then red, no hard block)
  • No tags — profile tags removed (overlap with soft skills Q13 and culture values Q15)

Q18 — Profile photo

Optional. The candidate can upload a photo from their camera or gallery (image picker). The photo is stored and displayed on the Employment Passport. If skipped, a default avatar is shown. A Skip link is displayed alongside the Continue button.

Reusable Q10/Q11 components

The gateway screens, type selectors, and all entry forms are implemented as reusable components. When instantiated outside of onboarding (e.g. in a completion flow), the "I'll complete it later" option is not rendered.

Privacy toggles (Q2, Q3, Q4, Q5)

Each of these questions displays a "Hide this information on my Employment Passport" checkbox below the answer field. Default state: unchecked (visible).

Save strategy

Answers are saved locally on the device at each step (Zustand store keyed by step id, not index — reordering questions does not break saved data). Q1 (Register) is the only API call before Finish — it creates the account and returns a JWT stored locally. The full dataset is synced to the backend in a single request when the candidate taps Finish, authenticated with the Q1 JWT. If the candidate exits and returns before completing, answers are restored from local storage.

Config-driven question order

The question sequence is defined in a TypeScript configuration array (onboarding/config/steps.ts). Each step has an id, a component, a section label, and optional dependsOn constraints. Reordering = moving lines in the array. Adding = new component + new entry. Removing = delete entry. The register step is fixed (always first). skills_review depends on target_jobs and experience_gateway being completed. soft_skills depends on skills_review.

Computed fields (not asked during onboarding)

  • Seniority level: computed at scoring time from total professional experience years (employment + freelance + internship, overlapping periods merged). Thresholds: 0–2 → junior, 2–5 → mid, 5–10 → senior, 10+ → executive. Returns 'junior' by default (never null).
  • Current job: extracted from the experience with is_current = true. No dedicated question — absorbed into Q11.
  • is_reconverting: ROME distance between current job domain and target jobs domains. Different domain = reconversion. Computed at sync time, stored on Passport.
  • hasExperiences: nullable boolean — null = skipped, false = "I have none", true = has entries. Used for UX nudging only, not for matching.
  • hasQualifications: nullable boolean — same semantics as hasExperiences.

Static data seeding

All reference data lives in the database, seeded via Symfony fixtures or SQL files, served to the frontend via standard API Platform GET collection endpoints.

Data Source Method
Cities GeoNames cities1000 (~167K cities, all countries) Offline import → cities table (pg_trgm index)
Nationalities ISO 3166-1 (~250 entries) SQL seed in migration
Job titles ROME referential (France Travail) Offline extraction → seed
Skills ROME 4.0 + WonderWork custom skills Offline extraction → seed
Languages ~40 common languages with ISO 639-1 codes SQL seed in migration (skills table, category = 'language')
Culture values WonderWork-defined (~15 values) SQL seed in migration
Sectors ~26 values PHP enum (Sector) — no DB table
Education levels 8 French system values PHP enum (EducationLevel) — no DB table
Contract types 6 standard French types PHP enum (ContractType) — no DB table

Passport reveal screen

  • Displayed after the backend confirms Employment Passport generation (triggered by Finish)
  • A fake generation loader plays for a short duration, then the Employment Passport is revealed on screen (transition light → dark — intentional "wow" moment where the purple premium world appears)
  • After the reveal sequence, the frontend calls GET /v1/me/passport to display the real passport data
  • The candidate is then automatically transitioned to the "Verify your email" screen — no interaction required
  • No CTA to the dashboard is available on this screen

Loading states

  • Q1 Register: spinner on Continue during POST /v1/auth/register. Double-submit prevention. Rate limited: 5/IP/hour.
  • Target roles autocomplete (Q7) and experience job title autocomplete (Q11): suggestions appear after a 300 ms debounce — field remains editable during fetch.
  • City autocomplete (Q5, Q14, Q11 experience city): GeoNames suggestions appear after a 300 ms debounce.
  • "Finish" CTA: spinner + disabled state on tap, for the duration of the in-flight backend sync request. Double-submit prevention: CTA remains disabled until the API confirms passport creation or returns an error.
  • Passport reveal screen: intentional UI animation — fake generation loader plays after backend confirms creation. Not a real loading state.
  • Step navigation (Continue / Back): synchronous — answers saved locally at each step, no API call between steps (except Q1).

Empty states

  • Q12 skills search with no result: "Skill not found" message displayed (AC36). No custom skill entry allowed.
  • Q12 skills review with no experiences: incentive banner displayed (AC38).
  • Q7 target roles: "+ Add another target role" button hidden when 3 titles are already selected (AC15).

Pagination

N/A — step-by-step flow, no paginated lists.

Feedback

  • No toast — the passport reveal screen followed by automatic transition to "Verify your email" serves as completion confirmation (AC45).
  • Error on "Finish" backend sync: error message displayed, CTA re-enabled, candidate can retry.