Skip to Content
Odoo Menu
  • Sign in
  • Try it free
  • Apps
    Finance
    • Accounting
    • Invoicing
    • Expenses
    • Spreadsheet (BI)
    • Documents
    • Sign
    Sales
    • CRM
    • Sales
    • POS Shop
    • POS Restaurant
    • Subscriptions
    • Rental
    Websites
    • Website Builder
    • eCommerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Supply Chain
    • Inventory
    • Manufacturing
    • PLM
    • Purchase
    • Maintenance
    • Quality
    Human Resources
    • Employees
    • Recruitment
    • Time Off
    • Appraisals
    • Referrals
    • Fleet
    Marketing
    • Social Marketing
    • Email Marketing
    • SMS Marketing
    • Events
    • Marketing Automation
    • Surveys
    Services
    • Project
    • Timesheets
    • Field Service
    • Helpdesk
    • Planning
    • Appointments
    Productivity
    • Discuss
    • Approvals
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industries
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Restaurant
    • Fast Food
    • Guest House
    • Beverage Distributor
    • Hotel
    Real Estate
    • Real Estate Agency
    • Architecture Firm
    • Construction
    • Property Management
    • Gardening
    • Property Owner Association
    Consulting
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Manufacturing
    • Textile
    • Metal
    • Furnitures
    • Food
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Others
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Community
    Learn
    • Tutorials
    • Documentation
    • Certifications
    • Training
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Download
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Events
    • Translations
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
      • Get a Tailored Demo
    • Implementation Services
    • Customer References
    • Support
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +32 2 290 34 90
    • Get a Tailored Demo
  • Pricing
  • Help
  1. APPS
  2. Platform
  3. EH HR Approval Engine v 16.0
  4. Sales Conditions FAQ

EH HR Approval Engine

by ERP Heritage
Odoo
v 16.0 Third Party 20
Download for v 16.0 Deploy on Odoo.sh
Apps purchases are linked to your Odoo account, please sign in or sign up first.
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Discuss (mail)
• Employees (hr)
Community Apps Dependencies Show
• EH HR Platform Core
• EH HR Workflow Engine
• EH HR Compatibility
Lines of code 1688
Technical Name eh_hr_engine_approval
LicenseLGPL-3
Versions 16.0 17.0 18.0 19.0
You bought this module and need support? Click here!
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Discuss (mail)
• Employees (hr)
Community Apps Dependencies Show
• EH HR Platform Core
• EH HR Workflow Engine
• EH HR Compatibility
Lines of code 1688
Technical Name eh_hr_engine_approval
LicenseLGPL-3
Versions 16.0 17.0 18.0 19.0
ERP Heritage · HR Platform
ERP Heritage . HR Platform

EH HR Approval Engine

Reusable N-step approval chains, defined as data, that any HR document can submit into.

Free · LGPL-3Odoo 16 CommunityLGPL-3v1.0.0
Serial and parallel chains
Conditional policy strategy
Dynamic approver routing
Self-approval blocked
Overdue escalation

Why this module

EH HR Approval Engine

Config over code

A chain is a data record, not a deploy

Chains live on eh.hr.approval.chain with ordered steps on eh.hr.approval.step. Adding a step, choosing serial against any-of against all-of, or pointing a step at the line manager is editing data in the Approval Chains screen, not writing a new state machine in Python for every document type that needs sign-off.

Segregation of duties

Nobody approves their own request

The subject employee, the record's own user, and the real submitter captured before the engine's sudo are all blocked from deciding, even if they hold an approver group. The rule is enforced in decide() and re-enforced by an api.constrains on the decision, so it holds on direct ORM and sudo create paths too.

One engine, every document

Inherit one mixin and submit

A model inherits eh.hr.approvable.mixin, sets an approval chain code, and gains action_submit_for_approval. The engine opens the request, resolves approvers per step, advances on each decision, and on approval or rejection fires the follow-up workflow transition back into eh_hr_engine_workflow.

Day in the life

A leave request that routes itself and refuses self-approval

An employee submits a document that inherits the approvable mixin. The engine captures who submitted it, opens a request against the configured chain, and resolves the first step to the employee's line manager. The manager opens the request and approves; the engine counts only authorized, non-subject decisions, advances to the HR officer step, and waits. If that step sits longer than its escalation window, the hourly cron notifies the step approvers and HR admins once and flags the request so it is not re-notified every run. When the final step approves, the engine fires the approve transition on the source document; if anyone rejects, it attempts the refuse transition. Every decision is written to the decision log, and the whole request is mail.thread tracked. The submitter, who also happens to be an officer, cannot approve their own request at any point.

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.

Self-approval

The subject employee's user, the record's user_id, and the real submitter (captured before sudo, since create_uid resolves to OdooBot on the engine path) are all forbidden from deciding, even with an approver group.

Constraint defense

An api.constrains on eh.hr.approval.decision re-validates authorization and the self-approval block on every create, so a direct ORM or sudo'd write cannot bypass the interactive decide() check.

Idempotent escalation

The cron escalates an overdue step once: it sets an escalated flag and timestamp so approvers are not re-notified each hourly run, and the flag resets only when the request advances to a new step. escalation_hours of 0 disables escalation entirely.

Conditional fail-closed

A conditional chain with no policy_code, or whose policy DSL raises, never auto-advances and stays pending. The safe default is to require explicit human action rather than silently approve.

Multi-company scoping

company_id is stored on chains, steps, requests and decisions, sourced from the chain, and global record rules restrict every model to the user's allowed companies so one company's officer cannot read another's approvals.

Team read isolation

A self-service employee sees only requests they raised or are the subject of; a team manager sees their own team's requests; an HR officer keeps the company-wide view, via OR-combined non-global record rules.

all-of completion

The all-of strategy advances a step only when the approving users together cover every approver group required by that step, not merely when one member of each has voted by name.

Safe rejection

On rejection the engine attempts the refuse workflow transition; if no such transition exists from the record's current state it leaves the record untouched and the rejected request state stands as the audit record.

What is inside

Built to do the job, end to end.

  • Five models. eh.hr.approval.chain (code, strategy, optional policy code, company, steps), eh.hr.approval.step (sequence, approver groups, dynamic approver, escalation hours), eh.hr.approval.request (state, current step, decisions, escalation bookkeeping, submitter), eh.hr.approval.decision (approve or reject, user, comment), and the eh.hr.approvable.mixin consumer models inherit.
  • The engine surface. An eh.hr.approval.engine exposed both as a registered service for Python callers and as an AbstractModel for ORM and view callers. open_request creates a pending request and back-links the record; advance re-evaluates the current step after each decision and either moves on, closes as approved or rejected, or stays pending.
  • Four strategies. Serial steps in order, parallel any-of where one approver suffices, parallel all-of where the approving users must cover every required group, and conditional where a named eh.hr.policy DSL decides when the step is satisfied using the approval count and the subject employee.
  • Dynamic approver resolution. Per step you can route to the employee's line manager, the department manager, any HR officer, or none, in addition to static approver groups. Approvers are resolved from the subject employee at runtime, so the chain follows the org structure without naming people.
  • Escalation cron. An hourly ir.cron, with the Odoo 16 numbercall and doall fields omitted, escalates steps past their escalation window: it posts to the request chatter, notifies through the notification engine when that module is present, and flags the request so it escalates once per step.
  • Security and access. ir.model.access rows give HR admins full control of chains and steps, officers read and decision rights, and self-service employees read-only request visibility. Global per-company rules plus self, team-manager and officer read rules scope who sees which requests and decisions.
  • Tests in the box. Negative-first authorization tests prove non-approvers, subjects, and delegated submitters are blocked on both the interactive and direct-create paths, that cross-company reads are denied, and that a genuine approver advances the chain. Separate tests cover the conditional strategy and overdue, fresh, and zero-hour escalation.

Honest about the edges

What this does not do, so nothing surprises you.

  • Delegation is dynamic approver routing to the line manager, department manager or HR officer resolved from the org structure. There is no per-user out-of-office delegate field where one approver hands their queue to a named substitute.
  • The shipped UI is the Approval Chains configuration form (HR admin) and a read-only Approval Requests list (HR officer). There is no end-user one-click inbox screen wired into a menu in this module; approvals are recorded by calling decide on the request or by the workflow engine driving the chain.
  • Escalation notifies the current step's approvers and HR admins and flags the request. It does not automatically reassign or auto-approve the step; a human decision is still required to advance.
  • The conditional strategy depends on the policy engine (eh_hr_engine_policy) being installed and a policy code being configured. Without a configured policy the conditional chain never auto-advances.
  • This is a platform engine, not a standalone app. It depends on eh_hr_core and eh_hr_engine_workflow and is meant to be driven by approvable HR documents rather than used on its own.
  • Notification-engine delivery on escalation is optional. If eh_hr_engine_notification is not installed the engine falls back to posting on the request chatter only.
Search

odoo 16 hr approval, approval workflow odoo community, multi step approval chain, employee approval engine, hr sign-off workflow, dynamic approver line manager, approval escalation odoo, self approval prevention, segregation of duties hr, conditional approval policy, multi company hr approvals, approval audit trail odoo

ERP Heritage

Production-grade Odoo accounting, built to an engineering bar and documented honestly. Support: info@erpheritage.com.au
Developed by Odoo Consultant Melbourne

v1.0.0 · LGPL-3 · Odoo 16 Community

Please log in to comment on this module

  • The author can leave a single reply to each comment.
  • This section is meant to ask simple questions or leave a rating. Every report of a problem experienced while using the module should be addressed to the author directly (refer to the following point).
  • If you want to start a discussion with the author, please use the developer contact information. They can usually be found in the description.
Community
  • Tutorials
  • Documentation
  • Forum
Open Source
  • Download
  • Github
  • Runbot
  • Translations
Services
  • Odoo.sh Hosting
  • Support
  • Upgrade
  • Custom Developments
  • Education
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Brand Assets
  • Contact us
  • Jobs
  • Events
  • Podcast
  • Blog
  • Customers
  • Legal • Privacy
  • Security

Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

Website made with