Skip to main content

People Review — legacy technical guide

Legacy implementation​

All paths in this section are relative to smartmobility-legacy.

Path / symbolResponsibility
src/Company/ReviewBundle/Resources/config/routing.ymlReview campaign, form, collective review and PDF route definitions.
src/Company/ReviewBundle/Controller/DefaultController.php — indexActionOrganization-bound campaign listing; role-based broad visibility; reviewer campaign membership and employee list scope.
src/Company/ReviewBundle/Services/UsersRelationsReview.phpResolves selected employee relationships; direct-manager relation; reviewer and campaign-admin predicates.
src/Company/ReviewBundle/Controller/ReviewAssessmentController.php — indexAction, assessmentcollectiveActionIndividual questionnaire preparation and collective review.
src/Company/ReviewBundle/Controller/ReviewPDFController.php — indexActionIndividual PDF authorization and generation through Knp Snappy.
src/Company/ReviewBundle/Resources/views/pdf/pdf.html.twigQuestion rendering, including question.managerpermission display condition.
src/Main/ConfigBundle/Entity/Assessment.phpQuestionnaire type mapping, including People Review.

Data and employee-scope resolution​

Review owns the campaign; ReviewUser associates a reviewed user and assessment context; ReviewReviewer records reviewer participation, including isAdmin and isCreator. Questionnaire answers use the existing assessment entities such as AssessmentAnswer rather than the nextgen custom-assessment model.

UsersRelationsReview::getRelatedUsersIds intersects the campaign's reviewed users with UserCompanyHierarchicalRelationship rows whose relationship IDs are selected in campaign visibility and whose related user is the current reviewer. getCollaboratorsIdsOfReviewByManager adds direct reports when hasManagerRelation finds the school relationship marker. isReviewAdmin checks a matching ReviewReviewer with isAdmin = 1.

DefaultController::indexAction binds list queries to the current setting. The broad branch handles missing legacy permission objects or review_all; campaign admins also receive all campaign user IDs in the selected-campaign path. Other reviewers receive relation-derived IDs, with their own ID added when can_review_himself applies. The list without broad rights is based on reviewer membership.

Authorization differences between surfaces​

SurfaceInspected conditionConsequence for documentation
Campaign/employee listreview_all, campaign-admin or relationship-derived IDsSupports the documented ordinary-reviewer versus campaign-admin population.
Individual formCampaign-setting match; self-review condition; out-of-scope branch also checks reviewer/admin/master status and nonempty relation listNot equivalent to a strict unconditional relationship allowlist. Do not claim the list proves direct-form isolation.
Collective reviewMaster-admin, campaign-admin or review_all branchOrdinary reviewer membership alone does not establish collective access.
Individual PDFreview_all or campaign reviewer check, with a separate missing-permission branchDoes not repeat the list's per-employee relationship intersection in this method. PDF scope must be validated independently.

These are Verified in code observations of specific methods, not a production exploit finding or a claim that all middleware/security layers have been audited. The legacy visibility guidance describes the intended relation-limited journey. The method-level differences remain unresolved; do not silently promote that intended rule into a universal endpoint guarantee.

Creation side effect — Verified in code: DefaultController::newAction initializes a default name, draft status and direct-manager visibility, then persists and flushes before redirecting to the information form. Visiting the creation route creates a record; it is not a read-only form preview. This was also observed during inspection.

Forms and PDF flow​

A campaign selects a People Review Assessment template. Individual answers feed matrix/collective questions; linked 1-to-1 questions retrieve associated interview data. The PDF template renders supported question families and hides question blocks when managerpermission is zero. The PDF visibility guidance documents per-question output visibility; mapping every editor option to persistence was not fully traced. PDF display is not an authorization rule for on-screen answers.

Selected routes from the routing file, relative to the bundle mount:

RoutePurpose
/r/review/saveAssessmentSave questionnaire response through the legacy controller.
/r/collectivereview/{id}Collective review.
/r/supportpdf/{id}Individual PDF support.
/r/review/actions/unlockpreparationPreparation unlock action.

This is a route inventory, not a complete validated API contract. Do not infer HTTP verbs or an external integration guarantee from the path alone.

Last updated on 3 November 2026