EH HR Appraisal
Periodic performance reviews with weighted goals, 360 feedback, and a configurable workflow on shared platform engines.
Why this module
EH HR Appraisal
Composes engines, owns no shadow logic
The appraisal record holds no private state machine, audit, or company-scope code. It composes the platform workflow, audit, and company-aware mixins, so every review inherits the same guarantees as the rest of the suite rather than a one-off reimplementation.
Weighting and 360 you can explain
The goal score is a true weighted average of goal ratings over total weight, and the 360 score averages only feedback that raters have submitted. Drafts in progress never skew the number, so a score reflects finalised input.
Gated, audited, single-company
Start, complete and cancel are restricted to the HR manager group. Terminal states refuse further transitions. Every captured change lands in an append-only hash-chained audit log, and records are pinned to one company with cross-company writes refused without an audited override.
Day in the life
An annual review cycle, start to finish
HR builds an Annual Review template with weighted goals once. A scheduled call to the generation service opens exactly one appraisal per active employee for the period, skipping anyone who already has one. Each manager hits Apply Template to pull the goals in, rates them, and collects peer and direct-report feedback on the 360 tab. The weighted goal score and submitted-only 360 score compute live. The manager starts the review, completes it when ratings are final, and the status bar locks. Every state change and rating edit is already in the audit log, scoped to that employee's company.
Edge cases
The cases most modules quietly ignore.
In the shipped code today, each one a place where a cheaper module silently does the wrong thing.
The period generation service searches for an existing appraisal on the exact employee and date range before creating, so re-running the same period adds nothing and returns a created count of zero. A test asserts the second run yields 0.
The 360 score and count include only feedback rows flagged submitted. A rater's draft sitting at rating 5 is ignored until they submit, so the aggregate never moves on unfinished input.
Once an appraisal is completed or cancelled, the workflow engine refuses any further transition out of that terminal state, even one a misconfigured definition might declare.
When a transition is gated through the approval engine, the real submitter is captured before the engine elevates to sudo, so the user who fired a gated transition cannot later approve their own request even while holding an approver group.
Appraisals are required to carry a company and are pinned to it. A write that moves a record into a company the user is not a member of is rejected even under sudo, and any permitted elevation is written to the audit log with every affected record id.
Apply Template copies the template goals in without clearing existing ones, so a template can top up a partly filled appraisal rather than overwrite work already entered.
What is inside
Built to do the job, end to end.
- Appraisal with weighted goals. Each appraisal carries an employee, manager, period, overall rating from 1 to 5, and a list of goals with a title, description, weight and 0 to 5 rating. The goal score is the weighted average, stored and recomputed when ratings or weights change. A database constraint enforces date_to on or after date_from.
- 360 feedback. A feedback model lets several raters, typed as self, manager, peer, direct report or external, score the same appraisal from 0 to 5 with a comment. A submit action locks each entry in. The appraisal exposes a submitted-only average and a count of finalised entries.
- Reusable templates. Templates hold a named, ordered set of weighted goals with descriptions. Archived templates stay on past appraisals but drop out of new ones. Apply Template, available on draft appraisals, copies the goal lines across.
- Configurable workflow. States and transitions come from a workflow definition, not hard-coded enums. The shipped flow runs draft to in progress to completed with cancel paths, rendered as a status bar, with start, complete and cancel restricted to the HR manager group.
- Period generation service. A registered service opens one appraisal per active employee for a given period and optional company, skipping anyone who already has an appraisal for that exact range, and returns how many it created.
- Audit and access. State, employee, manager, dates and overall rating are captured into an append-only hash-chained audit log on create, write and delete. Access rights separate HR admin, HR manager, and self-service employee, and records are scoped to a single company.
Honest about the edges
What this does not do, so nothing surprises you.
- The shipped appraisal workflow does not flag any transition as requiring approval, so while the platform approval and escalation engine is available, the default flow advances directly without an approval ladder.
- No cron job is bundled to auto-run the period generation service; scheduling it for a review cycle is a manual or separate configuration step.
- There is no employee portal or website self-service form; raters and employees work through standard backend access governed by the access rules.
- The module does not include a competency or skills library, a printable appraisal PDF report, or calendar reminder automation.
- Depends on the EH HR Platform engines, eh_hr_core, eh_hr_compat and eh_hr_engine_workflow, plus standard hr; it is not a standalone drop-in.
- Built and tested for Odoo 17 Community.
Odoo 17 HR appraisal, performance review Odoo, employee appraisal module, weighted goal scoring, 360 degree feedback Odoo, appraisal template, performance management Odoo 17, review workflow, KPI evaluation, HR platform appraisal, multi-company HR, audit logged HR
Need this fitted to the way you work?
ERP Heritage delivers end to end Odoo work: Odoo Implementation, Customization and Development, Integration, Migration, Consultation, Support and Training. We help teams put this module into production, shape it to their process, and keep it running.
We work with businesses across Australia (Melbourne, Sydney, Brisbane, Perth, Adelaide, Canberra) and the Middle East (Dubai, Abu Dhabi, Riyadh, Jeddah, Doha, Kuwait City, Muscat). Start a conversation at erpheritage.com.au or email info@erpheritage.com.au.
Languages
Available in 19 languages
The interface ships translated out of the box. Switch language in Odoo and the fields, menus, and messages follow.
Please log in to comment on this module