Skip to main content

Employee, manager and admin experience — technical guide

For maintainers tracing role selection, homepage rendering and hybrid navigation. Claims are Verified in code unless marked otherwise; local source does not prove the deployed revision. Illustrated observations are in Functional, configuration ownership in Configuration. No application screenshots are included here.

Architecture: three distinct access concepts​

Authenticated legacy User + existing role list
→ root dispatcher validates requested role
→ persists selected-role ordering
→ employee /plateforme/ | manager /company/ | platform admin /admin/

Legacy manager shell + feature/permission checks
→ embedded nextgen module route
→ nextgen session bootstrap and effective permissions
→ personal/admin space guard + module/record authorization

Legacy platform administrator (ROLE_ADMIN), tenant administrative permissions and nextgen allow-admin-space are different mechanisms. The word “admin” and an /admin suffix are insufficient to identify the mechanism: the application's base path, shell and route owner matter.

Repository / sourceResponsibility
Legacy src/Main/HomeBundle/Controller/DefaultController.php::indexActionValidates role choice, saves ordering and redirects by first role.
Legacy config/packages/security.yamlRole-based access to company, employee and platform-admin URL families.
Legacy app/Resources/views/top_layout_core_company_v3.html.twigCompany Spaces menu from existing account roles, translated/lexicon labels and active indicator.
Legacy src/Customer/HomeBundle/Controller/DefaultController.php and Resources/views/Default/index.html.twigEmployee context and old/V2 rendering selection.
Legacy app/Resources/views/homePage/V2/theme homepage templates and action/news partials.
Legacy src/Company/HomeBundle/Controller/DefaultController.phpCompany context, theme variant, activity feed, charts and actionable campaigns.
Legacy src/Admin/HomeBundle/Controller/DefaultController.php::indexActionPlatform-admin landing and allowed-platform list.
Frontend src/modules/NavigationModule/components/NavigationHeader.vueNextgen profile dropdown, space navigation and return to legacy.
Frontend src/router/{index,private-routes,guards}.tsBase-path routing, session bootstrap, space and route permission checks.
Backend src/Infrastructure/Migrations/Version20260512085559.phpRegisters the two space-access permissions.

Here “Legacy”, “Frontend” and “Backend” mean smartmobility-legacy, smartmobility-nextgen-front and smartmobility-nextgen-back. All four repositories, including aihub, were available. No AIHub dependency was traced in these navigation/home controllers; the word “suggestions” alone does not establish an AI service call.

Legacy selection and persistence​

The root dispatcher requires full authentication. A non-empty role query is accepted only if already in User::getRoles(). Otherwise it redirects back to root. For an accepted choice it places that role first, retains the other existing roles, persists and flushes the User. It then redirects by the first role: customer, company, recruiter, admin/super-admin, or fallback. Unauthenticated requests go to login.

This is a persisted preference within existing entitlements, not a role grant or merely session-local frontend state. Tests/documentation must not claim switching cannot write any account state. Concurrent tabs can display different pages but share the persisted role ordering; concurrency/conflict resolution was not established.

security.yaml protects /company with ROLE_COMPANY, /plateforme with ROLE_CUSTOMER and /admin with ROLE_ADMIN. Module/action checks remain additional layers. The visible V3 switch enumerates existing roles and marks the company space active. Its outer display condition normally requires multiple non-generic roles, with a code-defined exception; do not promise an always-visible switch for every user.

Internal browser-route inventory​

Route / requestContract and side effects
Root navigation /Authenticated redirect according to role ordering; no new permission is assigned.
Root navigation with an already-held roleValidates membership, persists ordering and redirects. This is not a read-only API.
/plateforme/Employee landing, route metadata includes home_access; controller/template conditions select content.
/company/Manager/company landing; validates user/School and loads dependent data.
/admin/Privileged legacy console, separate from standalone nextgen admin route.
/company/{baseAlias}/{feature}Hybrid wrapper, alias constrained to app/space, feature checked against AdminFeaturesEnum (or not-found).

Route mounting is in legacy config/routes.yaml and the respective HomeBundle routing files. These are internal navigation contracts, not public APIs. A harmless route example for an already authorized session is GET /company/; role-selection URLs should not be used as health checks because they persist state.

Homepage composition and data flow​

Employee​

Customer\HomeBundle\Controller\DefaultController::indexAction resolves the current employee Customer record. Non-permanent users are redirected to the employment index; missing Customer produces an empty-home branch. Resources/views/Default/index.html.twig uses display_old_version_homepage_fo to choose old content or render the homePageV2 controller fragment.

homePageV2() assembles profile completeness, skills, contacts, campaigns, news and optional widgets. theme_v2-homepage chooses home_page-v2_themev2.html.twig instead of the alternative widget layout. In the themed template, profile enhancement and job discovery are included directly; job discovery uses true or ...metiers, so it is not reliably controlled by metiers in that branch. Offers require offres and an internal/external offer flag; the partial chooses offer index/dashboard according to job_offer_theme_v2.

Alternative widget switches such as hide-profile/hide-skills suggestions and appointments must be interpreted in their actual rendering branch. Do not extrapolate them into a universal widget configuration model.

Company / manager​

Company\HomeBundle\Controller\DefaultController::indexAction validates User and School, can ensure an employment record, resolves manager schools, optionally generates activity via notification_dashboard, gets chart data and news, then chooses renderAcceuilBo() when module_acceuil_bo is enabled, otherwise renderDefaultIndex().

The newer renderer checks theme_v3-bo. Only V3 plus enable_new_neobrain_hybrid_platform invokes TodoCampaignsProvider::build(). The provider checks legacy smr_campaigns_access / smr_people_review_access, loads each permitted source through src/Service/V2/CampaignService.php, and merges normalized entries sorted by timestamp then title. Requests use actions_todo[equal]=1, source-specific date sorting and one page of up to 100 entries per source. No complete pagination across larger source populations was established.

Review dates come from end_date; People Review uses phase-1 end or phase-2 meeting date by status. Missing/unparseable dates retain timestamp zero, so “soonest first” must be qualified for undated items.

A failed source is omitted; null from both sources (failure and/or unauthorized) hides the card. At least one successful empty result yields an empty array and the empty-state rendering. Thus an empty card, a hidden card and a complete campaign inventory are different concepts. Runtime call success was not independently traced from the live zero state.

Privileged platform administration​

Admin\HomeBundle\Controller\DefaultController::indexAction loads or creates the account's Admin record, gathers its assigned Setting IDs and queries root Schools within them, ordered by fullname. This is not an unrestricted tenant catalogue inferred from ROLE_ADMIN alone.

Resources/views/Default/index.html.twig renders a local KTDatatable with platform name, type and action links. It initializes page size 10, stores table state in web storage and disables server filtering/paging. Name input searches field Name; Type searches Type with empty All plus DEMO/LIVE/TEST/INACTIVE. Client-side filtering narrows the already-loaded list; it does not expand authorization. Combined filter logic was not traced inside the table library.

The own employee/manager cards use existing-role root links. Separate platform-entry links change identity/context and must not be confused with a role-only switch. The live investigation did not enter any client context through those links. General user-search drawers are separate from the homepage platform-name input.

Nextgen spaces, session and hybrid behavior​

Frontend NavigationHeader.vue conditionally shows Personal/Admin items using allow-personal-space / allow-admin-space. switchSpace() closes the dropdown, sets adminModeEnabled and pushes AppRoute.ADMIN or PERSONAL. goToLegacy() navigates to /company. The navigation store initializes/persists adminModeEnabled in localStorage; it is a preference, not a server permission.

router/guards.ts bootstraps through /api/secure/check-session, validates the returned session structure, loads user profile, company locale, permissions and translations, and refreshes navigation. Do not expose session token values in logs, documentation or captures. Embedded authentication failure posts an auth-required message to the parent instead of forcing iframe logout navigation.

The guard rejects an unauthorized requested space by falling back to the other allowed space, or not-found if neither is allowed. Route-specific required permissions are checked separately; array metadata uses any-of logic. Backend API authorization and record visibility must still be verified per module.

Backend src/Http/Api/Routing/V2/user.yaml declares GET /user/self/permission for the authenticated user's effective rights, using getCurrentUser and findRightsByUser. The permission migration targets employee/manager presets for personal and HR/admin presets for admin. It describes registration, not today's tenant assignments.

Frontend root redirects to PERSONAL. Private /admin and /personal home routes render src/modules/Home/Home.vue, whose inspected template is an empty div. Do not document a populated standalone nextgen dashboard from the existence of those routes. Resolve URLs relative to configured APP_BASE_PATH; a bare legacy /admin/ is a different route owner.

The legacy hybrid controller validates supported feature paths and renders frame.html.twig with embedded=1&rewritePath=company. Bare admin/personal feature values redirect to company Home. CompanyNavigationExtension combines feature switches, profile conditions and SMR scopes; SmrDisplayService resolves nextgen space access through SmrVoter. The voter fails closed when permission retrieval throws, logging a failure. Theme and hybrid activation are distinct from successful scope/bootstrap resolution.

Failure modes, privacy and extension points​

SymptomWhere to inspect
Wrong initial spacePersisted legacy role order versus nextgen root redirect/local preference.
Missing menu or forbidden moduleShell display conditions, space guard, route permission, backend action and population checks separately.
Hidden/zero campaign cardV3/hybrid conditions, source access and TodoCampaignsProvider null/empty results.
Empty standalone nextgen landingHome component and actual intended module route.
Login loop or frozen iframeSession bootstrap, parent auth-required handling, base path and embedded context forwarding.
Restricted administrator listAdmin.settings relation, root School query and restored table filters/page state.

No production dashboards, retry schedule, end-to-end mobile flow or log retention policy was verified. Log sanitized route/source information rather than tokens, profile details, news content or campaign answers. Captures in the functional guide omit account identity and cross-client data.

For extensions, keep legacy role membership checks, nextgen space permissions and record authorization separate. Add route handling and navigation conditions together, respect embedded context, check locale/lexicon and specify empty/failure states. A new menu item or homepage card does not establish the destination's authorization.

Documentary evidence and limitations​

Documented in Confluence: SMR playbook, v3, 24 September 2026, describes unified navigation with split legacy/SMR permissions; working notes, v22, 8 June 2026, describe historical hybrid setup and return navigation; SMR models, v1, 13 March 2026, documents gradual module coexistence. These establish documentary context, not endpoint behavior. Supplied FAQ/methodology/onboarding references were resolved earlier in this chat and do not add a homepage API contract.

Observed in application: refer to Functional, 23 October 2026, for the three role contexts and locale-specific screenshots. Not verified: exact production commit, complete security audit, standalone nextgen home deployment, every theme/tenant branch, source pagination beyond the requested page and every operational dependency. No application repository was modified or production permissions changed.

Functional-guide evidence​

These implementation and product references support the functional guide. Local source behavior does not establish which revision or optional features are deployed. Application observations remain distinct from code and documentary evidence.

Verified in code: legacy src/Main/HomeBundle/Controller/DefaultController.php, company/customer/admin HomeBundle controllers and views; app/Resources/views/top_layout_core_company_v3.html.twig; nextgen frontend NavigationHeader.vue, router guards and Home component. Exact paths and distinctions are in Technical.

Documented in Confluence: SMR playbook, v3, 24 September 2026, describes hybrid navigation and split legacy/nextgen permissions. The provided FAQ folder and PS methodology/onboarding pages were reviewed earlier in this documentation work; they establish no homepage contract. SM redesign working notes, v22, 8 June 2026, describe historical configuration/legacy-return navigation; current labels can differ.

Last updated on 3 November 2026