EH HR Appraisal
Weighted-goal performance reviews with 360 feedback, on the audited HR Platform workflow engine.
Why this module
EH HR Appraisal
Stands on the platform engines
The appraisal model owns no state-machine, approval, or audit code of its own. It composes the shared workflow, audit, and company-scope mixins, so transitions, the tamper-evident log, and multi-company safety behave exactly like every module beside it.
Only finalised input counts
The goal score is a true weighted average of rating times weight over total weight, and the 360 score averages only feedback marked submitted. Drafts a rater is still editing never move the number, so the figure reflects locked-in input, not work in progress.
Workflow steps are data
Draft, in progress, completed, and cancelled and the transitions between them come from a workflow definition, not hard-coded Python. Each transition is gated to the HR manager group, and final states refuse any further move.
Day in the life
An annual review cycle, start to close
HR builds an Annual Review template once with weighted goals like Delivery and Teamwork. At cycle start, the generate-for-period service opens one draft appraisal per active employee, skipping anyone who already has one for that exact period, so a re-run creates nothing. A manager opens an appraisal, applies the template to drop the goals in, rates each one, and the weighted goal score computes live. Peers, the manager, the employee, and direct reports add 360 feedback; the average updates only as each entry is submitted. The manager starts the review, sets an overall rating and written assessment, and completes it. Every state change and every edit to the tracked fields lands in the hash-chained audit log, and once completed the record is final and cannot be transitioned again.
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 whole-company generator guards each employee with a search_count on employee plus exact date_from and date_to before creating, so re-running the same period opens zero duplicates and the call returns the count actually created.
Completed and cancelled are marked is_final in the workflow definition. The engine refuses any further transition from a final state, even one a misconfigured definition declares, so a closed appraisal cannot be silently reopened.
Start, complete, and cancel are each restricted to the HR manager group. A user outside the allowed groups, and not an admin, is rejected with a clear error rather than advancing the record.
The 360 score and feedback count include only rows where submitted is ticked. A rating of 5 left in draft is ignored until the rater finalises it, so the headline number never leaks unfinished input.
State, employee, manager, dates, and overall rating changes append to an append-only log where each row hashes the previous row. A Postgres transaction-scoped advisory lock serialises appends so concurrent writes cannot fork the chain, and verify_chain walks it to catch any after-the-fact edit.
Every appraisal carries a required company_id defaulting to the active company. Writing a record into a company the user does not belong to is refused, and any audited cross-company override is recorded with the full affected record id list.
A database CHECK constraint enforces date_to on or after date_from, and a goal or feedback rating is constrained to 0 through 5 at the database level, so bad ranges are rejected by Postgres, not just the UI.
Applying a template creates its goal lines on the appraisal without clearing goals already entered, so a template can top up a partly filled review instead of overwriting a manager's work.
What is inside
Built to do the job, end to end.
- Models this module adds. eh.hr.appraisal, eh.hr.appraisal.goal, eh.hr.appraisal.feedback, eh.hr.appraisal.template, and eh.hr.appraisal.template.goal. The appraisal record composes the workflow, audited, and company-aware mixins plus mail.thread.
- Scoring and feedback. A stored weighted goal score over goal rating and weight, a stored 360 feedback score and count across self, manager, peer, direct report, and external raters, plus a 1 to 5 overall rating and separate employee and manager written assessments.
- Workflow and generation. A data-defined draft to in progress to completed or cancelled workflow with manager-gated transitions and final-state locking, a yearly APR sequence, and a registered service that opens one appraisal per employee for a period, idempotently and optionally scoped to a company.
- Built on. eh_hr_core, eh_hr_compat, eh_hr_engine_workflow, and standard Odoo hr. It contributes views, a Talent menu, and per-role access rules for admin, manager, and self-service employee groups.
Honest about the edges
What this does not do, so nothing surprises you.
- The whole-company appraisal generator is a service method invoked by a caller or another module, not a scheduled job. This module ships no cron, so opening a cycle is a deliberate action rather than an automatic one.
- The workflow defines no approval-gated transition, so this module does not route appraisals through an approval chain. Start, complete, and cancel advance directly, gated by the HR manager group.
- 360 feedback rows are entered against the appraisal and do not enforce one entry per rater or invite raters through a portal. Identity and de-duplication of raters are left to the people running the cycle.
- The overall rating is set by the reviewer and is independent of the computed goal and feedback scores. The module surfaces both figures but does not auto-derive the overall rating from them.
- It targets Odoo 18 Community and depends on the EH HR Platform core, compatibility, and workflow engine modules, which install alongside it.
Odoo 18 appraisal, Odoo performance review, employee appraisal Odoo Community, weighted goal scoring, 360 degree feedback Odoo, performance management Odoo, appraisal template, review cycle generator, self assessment manager review, HR audit trail, multi-company HR Odoo, Odoo 18 Community HR, goal setting and rating, workflow driven appraisal, ERP Heritage HR Platform
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