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. Attendances
  3. Attended Face Capture v 18.0
  4. Sales Conditions FAQ

Attended Face Capture

by ERP Heritage https://www.erpheritage.com.au/
Odoo
v 18.0 Third Party 40
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 • Attendances (hr_attendance)
• Discuss (mail)
• Employees (hr)
Community Apps Dependencies Show
• Attendance Suite Base
• EH HR Platform Core
• Face Kiosk Attendance
• EH HR Compatibility
Lines of code 4541
Technical Name eh_hr_face_liveness
LicenseLGPL-3
Websitehttps://www.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 • Attendances (hr_attendance)
• Discuss (mail)
• Employees (hr)
Community Apps Dependencies Show
• Attendance Suite Base
• EH HR Platform Core
• Face Kiosk Attendance
• EH HR Compatibility
Lines of code 4541
Technical Name eh_hr_face_liveness
LicenseLGPL-3
Websitehttps://www.erpheritage.com.au/
Versions 16.0 17.0 18.0 19.0
ERP Heritage · HR Platform
ERP Heritage Attendance Suite

Attended Face Capture

An attended-capture prompt in front of the face match that logs every check-in attempt for attendance audit.

Free · LGPL-3Odoo 18 Communityv1.0.0v1.0.0
Attended prompt
Client-asserted, logged
Every attempt logged
Per-company toggle
Retention sweep

Why this module

Attended Face Capture

Honest by design

Records what the kiosk reports, and says so

The outcome is computed in the browser and stored as client-asserted. Every record, the model help text, and the settings page state plainly that the server does not verify it. No inflated anti-spoofing claim to walk back later.

Audit-grade record

One write-once row per attempt

Each check-in attempt writes an attended-capture record with outcome, timestamp, device, site, duration, and prompt shown. Views are read-only, no group can edit, and only admins can delete. A matching kiosk event row is logged alongside, so the audit trail is consistent.

Operationally tidy

Per-company control and a self-cleaning log

Toggle the prompt, prompted blink count, timeout, and retention per company. A daily cron sweeps rows past the company horizon in capped batches, so the log stays queryable in Odoo instead of growing into a side spreadsheet.

Day in the life

Please blink slowly twice. A moment later, the day starts.

A worker steps up to the kiosk. The welcome screen hands off to an attended prompt that asks them to blink slowly. The browser runs face-api.js, counts blinks from the eye aspect ratio, and reports an outcome to the server, which records it as reported. On a reported pass the kiosk continues into face match; on a fail or timeout it shows a polite retry screen. Every attempt, pass, fail, or aborted, lands in the attended-capture log, so a fortnightly review can spot the depot with a spike of failed attempts. The server keeps an honest record of what the kiosk reported and never claims to have checked it.

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.

Client-asserted outcome

The browser computes pass, fail, or aborted; the server stores it verbatim with client_asserted set to true and all fields read-only. Nothing in the server claims the result was verified, so a recorded pass is never presented as proof of a real person.

Device-token gated

Both the config and log endpoints require a valid X-EH-Kiosk-Token tied to an active kiosk terminal. Unknown or missing tokens return 401, and company, site, and device are taken from the terminal record, not from the request body, so a caller cannot spoof which company a record lands in.

Rate limited

Config and log calls each pass through the shared rate limiter at 120 hits per scope, keyed by token or client IP, returning 429 when over budget. A noisy or looping kiosk cannot flood the audit log.

Input whitelist

The log endpoint rejects any outcome outside passed, failed, or aborted with a 400, rejects malformed JSON bodies with a 400, and truncates prompt and fail-reason text to 255 characters before storing.

Multi-company scoping

A global record rule restricts attended-capture records to the user's allowed companies, and each record carries a required company taken from the kiosk device. The retention cron loops company by company using each company's own horizon.

Cron isolation

The daily retention sweep deletes in capped batches (default 2000 rows per run) and reports progress through the cron commit-progress hook, so it cannot starve other jobs or run unbounded on a large backlog.

Write-once audit

Access rules grant read to managers and auditors and unlink only to admins; no role can write or create records through the UI. Records are created only by the kiosk endpoint, keeping the audit trail tamper-resistant.

What is inside

Built to do the job, end to end.

  • Attended-capture record. The eh.hr.liveness.check model stores one read-only row per attempt: outcome, recorded-on timestamp, prompt shown, duration in ms, blinks reported, fail reason, kiosk device, site, optional employee, and company. A computed reference summarises outcome, employee, and time.
  • Two kiosk endpoints. A config endpoint returns the per-company enabled flag, prompted blink count, and timeout for the calling device, and a log endpoint records the reported outcome. Both authenticate by kiosk device token and are rate limited.
  • Browser blink prompt. A script injected into the kiosk shell adds a quick-check screen and a fail screen, runs blink detection from the face-api.js 68-point landmark model using eye aspect ratio, and posts the result. If the model is not loaded or the camera is denied, it reports a failed or aborted outcome rather than blocking the kiosk.
  • Per-company settings. Settings on the company and the Attendance configuration page expose the attended-capture toggle, prompted blinks, capture prompt timeout in milliseconds, and retention days, defaulting to two blinks, an 8000 ms timeout, and a 180-day horizon.
  • Retention cron and audit. A daily ir.cron runs the retention sweep per company in capped batches, and every logged attempt also writes a kiosk event (liveness pass or fail) referencing the capture record, with the client IP, for a consistent attendance audit trail.

Honest about the edges

What this does not do, so nothing surprises you.

  • Not an anti-spoofing or server-verified liveness control. The outcome is computed entirely in the browser and recorded as reported. A printed photo or a screen held to the camera is not detected, and anyone who controls the kiosk device can report any outcome.
  • Blink detection depends on the face-api.js library and its 68-landmark model being loaded by the kiosk; if the model is absent or the camera is denied, the attempt is recorded as failed or aborted and does not block check-in.
  • The employee link on a record is optional and only set later by the kiosk after the subsequent face match identifies the worker; an attended-capture record on its own is not tied to a person.
  • This module records and audits attempts; it does not perform the face match itself, which is handled by the face kiosk it depends on.
  • Requires the ERP Heritage attendance base, face kiosk, and HR core modules; it extends the existing kiosk and is not a standalone attendance system.
  • Targets Odoo 18 Community.
Search

attended face capture, face kiosk check-in audit, kiosk attendance audit, hr attendance face capture, blink prompt kiosk, Odoo 18 face attendance, kiosk check-in log, attendance dispute resolution, client-asserted capture record, per-company attendance retention

ERP Heritage

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

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