Skip to main content

Self-assessment — technical guide

Scope and architecture​

For implementation and support teams tracing the standalone legacy skill self-declaration workflow. Client-facing usage and setup are in Functional and Configuration. Technical identifiers below are Verified in code; they describe the inspected checkout, not proof of the deployed version or a public integration contract.

Components and ownership​

Paths in this table are relative to smartmobility-legacy/.

ComponentResponsibility
src/Company/CampaignBundle/Controller/DefaultController.phpList/detail, draft creation, information, steps, participants and planned notifications.
src/Company/CampaignBundle/Resources/views/Default/Twig administration wizard and campaign summary.
app/Resources/views/campaign-banner.html.twigEmployee campaign banner, profile/job skill selection, rating and sharing scripts.
src/Main/ConfigBundle/Entity/User.phpCurrent assigned campaign and step-campaign selection.
src/Main/ConfigBundle/Controller/CampaignController.phpSharing/progression, completion and seen-state endpoints.
src/Service/Skills/SkillCampaignService.phpProfile/job save paths, manager history and optional profile application.
src/Service/Skills/SkillHistoryService.phpEmployee and manager assessment history persistence.
src/Twig/Skill/SkillExtension.phpJob/profile skill retrieval and grouping for Twig.
src/Command/Notifications/EmailProgramationCampaignCommand.phpDispatch of due campaign emails, independently of interactive sharing mail.

Request and data flow​

  1. newAction creates an AssessmentCampaign, status brouillon, current setting and school, and redirects to its information screen. Opening creation therefore writes data.
  2. Information save parses date/hour pairs, sets fields and the completion-time update flag, and applies the assessment-mode switch. With the switch absent, mode resets to Profile and job to null. With Job mode, it requires an active same-setting Job.
  3. Step save creates/updates CampaignSteps and order values. Enrollment creates a participant completion at the step with order_num = 1, done = 0 and seenByUser = 0.
  4. User::getCurrentCampaigns selects assigned campaigns whose start is strictly before now, end strictly after now and status is publiée. The banner further considers current step, finished state and whether feedback has been seen.
  5. Employee sharing sends skills to CampaignController::updateStepAction with stepType = 3. This saves employee values and targets the campaign's manager-assessment step. The handler's stepType parameter represents a semantic type/transition, not a CampaignSteps row ID or display order.
  6. stepType = 4 saves manager skill history and selects the matching campaign step. stepType = 5 applies profile updates when enabled, marks completion done and captures organizational information. Do not infer that this endpoint enforces a complete sequential state machine.
  7. Seen-state records acknowledgement and the employee UI opens the profile #assessment section.

Legacy route contracts​

Route composition is verified in config/routes.yaml, the campaign bundle routing file, and src/Main/ConfigBundle/Resources/config/routing/campaign.yml. These are session-bound internal routes; no stable public API, bearer-token contract or idempotency guarantee was established.

Method / pathInput and response
GET /company/campaignTenant campaign list; optional campaign ID detail route is provided by the same bundle.
GET /company/campaign/c/newPersists a draft and redirects; it is not read-only.
POST /company/campaign/c/updateForm fields: campaign, name, description, status, startdate, starthour, enddate, endhour, updateUserProfile, optionally assessmentMode, assessmentJobId. Success: {"response":"success"}.
POST /company/campaign/c/stepscampaign, allSteps collection containing type, name, description, order, deadline, notification/instructions and existing/new step ID indicator.
POST /company/campaign/c/users/{id}/add-usersusers IDs; enabled same-setting users not already enrolled are selected in batches. Explicit HTTP 401/403/400 and an end-date precondition response are present.
POST /api/campaign/updateStepXMLHttpRequest; userId, campaignId, stepType, skills. Success body uses numeric status: 200 and message: "Campaign updated". Some failures are JSON body status values rather than corresponding HTTP status codes.
POST /api/campaign/seenXMLHttpRequest; campaignUserId; returns status: "success" / "error" and message.

Illustrative form data for the employee-sharing payload; IDs are placeholders and this is not an executable request:

userId=<assigned employee ID>
campaignId=<campaign ID>
stepType=3
skills[<mode-dependent skill ID>][rating]=<selected level>
skills[<mode-dependent skill ID>][motivation]=<selected motivation>

Important ID distinction: profile-mode skill keys identify Userskill rows; job-mode keys identify Skill entities. Job-mode persistence intersects submitted skill IDs with the assessment job's skills. Do not reuse a profile-mode payload for Job mode.

Persistence and profile-write semantics​

Mappings live in src/Main/ConfigBundle/Resources/config/doctrine/.

EntityKey state and links
AssessmentCampaignName, publication status, date window, setting/school, assessment mode, optional job and update flag; links steps, completions and histories.
CampaignStepsCampaign, type, order, dates, name, description and instructions/notification.
CampaignUserCompletionUser, school, campaign and current step; updated timestamp, done, seen_by_user and completion-time organizational snapshot.
CampaignHistoryEmployee, manager, campaign; employee level/motivation, manager level and timestamps; nullable profile-skill and skill links.
UserSkillHistorySkill-change history used by the profile-mode save path.
UserskillLive employee profile level, motivation and manager level.

AutoAssessmentMode defines Profile = 1, Job = 2. Entity initialization sets mode Profile and update flag true; the mapping's database default for the update flag is false. New-object behavior, database defaults and previously migrated data must be distinguished.

Profile mode: employee rating/motivation clicks call the existing skill update route immediately. saveAllSkill also mutates profile values on sharing and calls the history service. Profile skill removal removes the entity itself. Therefore updateUserProfile = false does not isolate the live profile from this assessment.

Job mode: employee clicks do not immediately save through the profile route. Sharing stores selected job-skill history, restricted to the job's skill IDs. Blank submitted strings normalize to null in SkillCampaignService; the UI also defaults some missing row values to zero, so null and zero must not be conflated.

Final application: applySkillsToUserProfile returns early when the update flag is false. Profile mode copies employee level/motivation and then manager level when available, giving the latter precedence. Job mode updates matching existing profile skills and creates a missing one only when manager level is non-null; motivation is copied when non-null. No automatic rollback of prior changes was established.

Configuration and permissions​

  • campagneAutoDeclaration and campaign_create control the inspected legacy menu, including its empty-permission fallback. They do not prove authorization on every route.
  • auto_evaluation_with_job_skills gates the mode/job controls and update handling.
  • hide_motivation_campaign_bo_fo gates the employee motivation column; tenant skillLevel supplies the level scale.
  • Many administration page reads compare campaign setting with the current setting. Authorization is not expressed uniformly across all inspected read/write handlers. The progression handler's checks do not establish a complete tenant, subject and manager permission matrix. Treat endpoint authorization as requiring a separate review before exposing these routes to integrations. No unauthorized requests were tested.
  • Assessment data and completion snapshots are employee data. Restrict exports and support captures to authorized audiences; do not include identifiable ratings or credentials in examples or logs.

Notifications, runtime and failure modes​

updateStepAction calls MailerHandler with legacy self-assessment completion notification types after relevant transitions. Mail exceptions are caught without surfacing a failure to the caller. A successful JSON response therefore confirms neither delivery nor absence of mail failure. Planned Email records use the EmailNotification:Campaign command; actual scheduler frequency and deployed mail transport were Not verified.

Runtime dependencies include Symfony session/security and Twig, Doctrine persistence, tenant translations/feature switches, existing employee-manager links and mail processing. Dates are parsed with runtime timezone behavior; the deployed timezone was not established.

FailureInvestigation
Campaign hiddenCheck membership, stored publication value, current date window, step and seen state.
Invalid job modeInspect active job ownership and feature switch; the controller can reject an invalid required job.
Progression returns an errorInspect completion and configured semantic step types; examine response body status as well as HTTP status.
Partial save / unexpected profile changeInteractive profile writes, history writes, progression and mail occur across multiple calls/flushes; no end-to-end atomicity or rollback guarantee was established.
Missing manager relationshipsCheck the employee school/manager and customer context used by completion/mail paths.
Duplicate notificationsRetry idempotency was not established. Inspect persisted state before replaying a sharing action.

Legacy and nextgen coexistence; AIHub boundary​

The Vue nextgen ModuleConfig/Campaigns/modules/Reviews/modules/UserReview route renders a separate interview user-review form. The nextgen backend EvaluationCompletedNotificationResolver handles UserReviewType::SELF and can release evaluators after self-evaluation when isParallel is false. Those are interview semantics, not legacy AssessmentCampaign transitions.

No standalone nextgen replacement or automatic migration of this legacy skill campaign was established. No direct AIHub call was found in the traced legacy banner → progression → skill/history path; the assessment does not establish an AI-generated score. AIHub was checked for self-assessment terminology, not exhaustively audited for every downstream skill consumer.

Extension points follow the existing owners: wizard/template and controller for setup, SkillCampaignService/history service for persistence, Twig skill extension/repositories for populations, and mail handlers/command for notification changes. Preserve semantic type and mode-specific ID contracts when extending the flow.

Evidence and limitations​

Observed in application, 25 October 2026: PS Testing 2026 as Jim Carter; manager and personal spaces, legacy list, saved unpublished draft, step-type selector, empty participant page and no-notification planning state. No submission, publication, enrollment or mail scheduling was performed. The configuration guide contains full-window screenshots.

Verified in code: legacy source paths listed above; src/Enum/Assessment/AutoAssessmentMode.php; src/Main/ConfigBundle/Resources/config/doctrine/{AssessmentCampaign,CampaignUserCompletion,CampaignHistory}.orm.yml; migrations/Version20260518132457.php; nextgen frontend src/modules/ModuleConfig/Campaigns/modules/Reviews/modules/UserReview/userReview.routes.ts; nextgen backend src/Infrastructure/Persistence/Notification/Resolver/EvaluationCompletedNotificationResolver.php.

Not verified: deployed commit alignment, live job-mode submission, final manager sharing, mail delivery, authorization matrix, scheduler cadence and runtime timezone. No source application repository was modified.

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.

  • Observed in application: PS Testing 2026, Jim Carter, English UI, 25 October 2026; Manager area and Personal space; self-declaration list, draft information, step-type editor, empty participant screen and planning with no scheduled notification.
  • One documentation draft was created and named Documentation — Self-assessment — PS Testing, kept unpublished with no participants, steps or scheduled notifications. No employee assessment or manager feedback was submitted.
  • Verified in code: smartmobility-legacy/app/Resources/views/campaign-banner.html.twig, src/Main/ConfigBundle/Entity/User.php, src/Company/CampaignBundle/Controller/DefaultController.php, src/Main/ConfigBundle/Controller/CampaignController.php, src/Service/Skills/SkillCampaignService.php, and legacy campaign/profile templates.
  • Not verified: live employee submission, manager completion, mail delivery, job mode in PS Testing, and a complete role/access matrix. No personal assessment data is reproduced. Configuration values and scale labels can differ by tenant.

The following participation flow is Verified in code, in app/Resources/views/campaign-banner.html.twig; it was not completed live.

Last updated on 3 November 2026