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 Platform Core v 18.0
  4. Sales Conditions FAQ

EH HR Platform Core

by ERP Heritage https://erpheritage.com.au
Odoo
v 18.0 Third Party 22
Download for v 18.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 Compatibility
Lines of code 875
Technical Name eh_hr_core
LicenseLGPL-3
Websitehttps://erpheritage.com.au
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 Compatibility
Lines of code 875
Technical Name eh_hr_core
LicenseLGPL-3
Websitehttps://erpheritage.com.au
Versions 16.0 17.0 18.0 19.0
ERP Heritage · HR Platform
HR Platform Foundation

EH HR Platform Core

The dependency-light foundation every EH HR module builds on: a hash-chained audit log, strict multi-company mixins, typed per-company settings, and a clean service layer.

Free · LGPL-3Odoo 18 CommunityLGPL-3v1.0.0
Append-only audit log
SHA-256 hash chain
Advisory-lock serialized appends
Strict company scoping
Typed versioned settings

Why this module

EH HR Platform Core

Integrity

An audit trail you can actually trust

Every create, write and unlink on an audited model writes an append-only row whose SHA-256 hash chains to the row before it. A single advisory lock serializes appends so concurrent transactions cannot fork the chain, and verify_chain walks the whole log in bounded batches to find the first tampered row. It is independent of mail.thread, so it stands on its own.

Isolation

Multi-company that refuses to leak

The company-aware mixin makes company_id required, defaults it to the active company, and rejects cross-company writes even under sudo unless an explicit, audited override context is set. A global record rule isolates the audit log itself per company, so an officer in one company never reads another company's trail.

Foundation

Build features, not plumbing

A typed and versioned settings registry, runtime feature flags with percentage rollout, a restart-durable rate limiter, DST-safe timezone math, and a small service registry mean feature modules inherit a consistent spine instead of reinventing it. Models stay thin; services do the work.

Day in the life

A change happens, and the record proves it

An HR officer updates a record on an audited model. The mixin captures the before and after of the whitelisted fields, and if nothing actually changed it writes no row. If it did change, write_event takes a transaction-scoped advisory lock, reads the chain tail, hashes the previous hash together with the model, record, action, actor and payload, and appends one immutable row stamped with the owning company. Later an auditor opens the Audit Log, filters to the last 24 hours, and groups by actor. If anyone has edited history directly in the database, verify_chain returns the id of the first row whose hash no longer matches. Meanwhile a daily cron quietly vacuums closed rate-limit windows so the counter table never grows unbounded.

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.

Concurrency

Hash-chain appends are serialized by a transaction-scoped Postgres advisory lock (pg_advisory_xact_lock), so two concurrent transactions cannot read the same tail and fork the chain. The lock releases automatically on commit or rollback.

Race-safe counting

The rate limiter increments via a single atomic INSERT ... ON CONFLICT DO UPDATE ... RETURNING upsert, so two workers racing the same bucket can never both read a stale count. No in-memory dict that would die on restart or fall out of sync across workers.

Self-protection

The audit log sets _log_access = False and refuses self-audit; it has no edit, create or delete in its list view, and the company_id column is deliberately excluded from the hash material so introducing it during an upgrade never invalidates existing rows.

No-op writes

A write whose audited fields are unchanged emits no audit row, so the trail records real state transitions rather than noise from touch-only saves.

Cross-company elevation

Any write that moves records to another company is rejected unless the user is a member of that company and an explicit override is in context; the elevation itself is audited with every affected record id, not just the first.

DST correctness

Timezone day windows localize start and end of the civil date in the employee's zone before converting to UTC, so a 23-hour or 25-hour DST day is bounded correctly instead of silently dropping or double-counting an hour.

Versioned settings

Writing a setting never destroys the old value: the previous active entry is archived and linked through a superseded_by pointer, and a unique constraint guarantees exactly one active entry per company and key.

Cron isolation

Crons are declared without the legacy numbercall and doall fields that Odoo 18 carries forward from older releases, and the rate-limit garbage collector deletes only windows that closed past a cutoff, keeping the hot table small under load.

What is inside

Built to do the job, end to end.

  • Hash-chained audit log. eh.hr.audit.log is append-only with _log_access disabled. write_event takes an advisory lock, hashes prev_hash plus the event fields with SHA-256, and stores the before and after payload as JSON. verify_chain re-walks the chain with keyset pagination and per-batch cache clearing to report the first broken row.
  • Audited and company-aware mixins. eh.hr.audited.mixin emits create, write and unlink events with a configurable field whitelist. eh.hr.company.aware.mixin makes company_id required, defaults it to the active company, and refuses cross-company writes (even under sudo) unless an audited override context is present.
  • Settings registry and feature flags. eh.hr.settings.entry is a typed, per-company, versioned key/value store with get and set helpers and a one-active-entry constraint. eh.hr.feature.flag gates by company, group, date window and deterministic percentage rollout via is_enabled.
  • Rate limiter and timezone service. eh.hr.rate.limit is a fixed-window counter using an atomic SQL upsert, shared across workers and durable across restarts, vacuumed by a daily cron. The timezone service centralizes DST-safe local civil date and UTC day-window math in one place.
  • Service layer and platform mixin. A tiny register_service and locate_service registry keeps business logic in plain-Python services rather than on models. eh.hr.platform.mixin stamps a stable correlation_id on create and offers emit_platform_event, which publishes on the bus and cross-writes an audit row for replay.
  • Security model and OWL kit. Four implied access groups (Employee, Manager, Officer, Admin) plus Auditor and a UI-less Kiosk Device group, surfaced as a single access dropdown on the user form by the post-init hook. The frontend ships HrCard and HrStat OWL components, shared SCSS tokens, and a de-duplicating toast service.

Honest about the edges

What this does not do, so nothing surprises you.

  • This is a platform and developer foundation module, not a feature app. On its own it adds an Audit Log and Platform Settings screen under an HR Platform menu but no attendance, leave, payroll or recruitment surface. Its value is realized through the feature modules that depend on it.
  • The audit retention period and a redact-PII-in-exports flag are exposed as configuration values, but this module does not itself run an archival, export or redaction job; enforcing them is left to the modules and operational processes that consume those settings.
  • emit_platform_event uses the in-process Odoo bus. Clustered or cross-node delivery would require swapping in a queue or message-broker adapter; the audit cross-write still records the event regardless.
  • The OWL kit currently ships the HrCard and HrStat primitives plus a toast service and shared tokens, intended as building blocks for feature-module UIs rather than a complete component library.
  • Targets Odoo 18 Community. It depends on base, mail, hr and the companion eh_hr_compat shim and is meant to be installed as part of the EH HR suite.
Search

Odoo 18 HR platform, HR audit log, hash chain audit trail, tamper-evident audit log, multi-company HR Odoo, Odoo feature flags, rate limiting Odoo, per-company settings registry, Odoo HR framework, append-only audit log, DST-safe timezone Odoo, HR developer module, Odoo service layer, correlation id tracing, OWL component kit

ERP Heritage

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

v1.0.0 · LGPL-3 · Odoo 18 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