EH HR Appraisal
Periodic performance reviews with weighted goals and 360 feedback, on the HR Platform workflow engine.
Why this module
EH HR Appraisal
Weighted goals, computed
Each goal carries a weight and a 0 to 5 rating. The overall goal score is a weight-weighted average, stored and recomputed when ratings or weights change, with zero total weight handled rather than dividing by zero.
360, only when submitted
Self, manager, peer, direct-report and external raters each score the same appraisal. The 360 score and count aggregate submitted feedback only, so drafts still being edited never move the number.
Composes the engines
Status, audit and company scope come from the shared HR Platform mixins, not local copies. The draft to in-progress to completed flow is a configurable workflow definition, and every captured change lands in the hash-chained audit log.
Day in the life
HR opens a review cycle and a manager closes one appraisal.
HR runs the period generator for the half-year. It opens one appraisal per active employee, sets each employee's manager from their reporting line, and skips anyone who already has an appraisal for that exact period, so a second run creates nothing. The manager opens an appraisal, applies the Annual Review template to drop in its standard goals, weights and rates each one, and collects peer and direct-report feedback. The goal score and 360 score compute as ratings land. The manager fires Start, then Complete; each transition is allowed only from the right state and only for the HR manager group, and every state move and rating change is written to the append-only audit trail. Once completed, the appraisal is final and the engine refuses any further transition.
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 generator searches for an existing appraisal on the same employee and exact date_from / date_to before creating one. Re-running the same period returns zero created, so a double-run never duplicates a review cycle.
Completed and cancelled are marked is_final in the workflow definition. The engine refuses any transition out of a final state, even one a misconfigured definition declares, so a closed appraisal cannot be silently reopened.
Start, Complete and Cancel are each defined only from their valid source state and restricted to the HR manager group. A transition from the wrong state, or by a user outside the allowed groups, raises rather than half-applying.
The goal score divides total weighted rating by total weight only when total weight is non-zero; an appraisal with no goals, or all-zero weights, scores 0.0 instead of raising a division error.
Feedback count and average are computed over feedback flagged submitted. A rater can keep editing a draft entry without distorting the aggregate, and the Submit action locks one entry into the score.
State, employee, manager, period dates and overall rating changes are captured into a sha256 hash-chained audit log. Appends are serialized by a transaction-scoped Postgres advisory lock, and verify_chain detects any row edited after the fact.
Company is required and defaults to the active company. A write that moves an appraisal into a company the user does not belong to is refused, and any permitted cross-company elevation is itself written to the audit trail.
What is inside
Built to do the job, end to end.
- Appraisal record. Employee, manager, review period, overall rating, employee and manager feedback text, plus computed goal and 360 scores. Reference numbers auto-generate from a yearly sequence (APR/<year>/nnnnn).
- Weighted goals. A goal line model with title, description, weight and a 0 to 5 rating, ordered by a drag handle. Database checks keep ratings within 0 to 5 and weights non-negative.
- 360 feedback. Per-rater entries typed as self, manager, peer, direct report or external, each with a rating, comment and a submitted flag, plus a one-click Submit action that locks the entry into the aggregate.
- Review templates. Named, archivable templates holding a reusable set of weighted goals. Apply Template copies them onto a draft appraisal and tops up existing goals rather than replacing them.
- Period generator. A platform service that opens one appraisal per active employee for a date range, scoped to a company when given, idempotent on re-run.
- Status workflow. Draft, In progress, Completed and Cancelled defined as a workflow definition with manager-gated Start, Complete and Cancel transitions and a status bar in the form.
Honest about the edges
What this does not do, so nothing surprises you.
- Goal and 360 scores are informational. The module computes them but does not auto-derive the overall rating, which the manager sets, and it does not post anything to payroll or compensation.
- The period generator opens appraisals for active employees; it is invoked on demand, not wired to a built-in scheduled cron in this module.
- Appraisal transitions (Start, Complete, Cancel) advance state directly and are gated by HR manager group; they do not route through the approval engine, so there is no multi-step sign-off ladder on the appraisal itself.
- There is no employee self-service portal view here. Self-assessment is captured through the employee feedback field and a self-typed 360 entry inside the back office.
- External raters are recorded by type for the 360 aggregate; the module does not email or collect feedback from people outside Odoo.
Odoo 19 HR appraisal, performance review Odoo Community, employee evaluation module, weighted goal scoring, 360 degree feedback Odoo, appraisal template, performance review cycle, KPI rating employee, manager assessment Odoo, HR platform workflow, periodic performance appraisal, review period generator, audited HR records, multi-company HR Odoo
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