Attendance Migration for Odoo 16
Move employees and punch history off any old time clock with two CSV wizards, dry run first, commit when the preview is clean.
Why this module
Attendance Migration for Odoo 16
See the outcome before you commit
Every run defaults to dry run. The wizard reports what it would create, update, or skip per row and writes nothing to the database. Fix the source CSV, re-run, and only commit once the preview is clean.
No per-vendor adapter to wait for
Columns are matched case-insensitively from the header row, and the match strategy is chosen on each run. Any old system that exports CSV is in scope. There is no live connection to the system you are leaving.
It tells you what it will not do
Face templates cannot carry across recognition models, so re-enrolment is required. Consent is not imported because it must be granted fresh at the new system. The tool is explicit about both rather than implying a clean lift and shift.
Day in the life
Cutover weekend, old clock going dark
You export employees and the last few years of punches from the outgoing system as CSV. In Odoo, the employee wizard runs dry: it matches existing people by email then name, flags new hires it would create, and resolves each default kiosk site by code. The preview shows two name collisions, so you fix the CSV and re-run until it is clean, then commit. Next the attendance wizard runs dry against the same people, parses the timestamps across the formats the old clock used, and skips a handful of rows for staff who already left. You commit, read the result log, and the punch history is now native hr.attendance with check-in and check-out intact.
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.
Employees are matched by work email then full name using case-insensitive search, so re-running the import updates the same person rather than creating a duplicate. Update mode can be turned off to skip matched rows entirely.
Only non-empty CSV cells are written on update, so a partial CSV cannot wipe existing employee data with blanks.
A bad row raises inside its own try block, is counted as an error with its message in the log, and the rest of the import keeps going. One malformed line never aborts the whole run.
An empty check_out is allowed and stored as an open attendance. A check_out that is not strictly after check_in is rejected as a row error, never written.
Timestamps are parsed across six formats including ISO with a space or a T separator and day-first slashes, so exports from different clocks land without manual reformatting.
Default kiosk sites resolve by code within the active company only, and an unknown site code is ignored rather than blocking the row.
For attendance, unmatched employees are either skipped and logged or, in strict mode, raised as an error so the operator decides whether to halt or continue.
What is inside
Built to do the job, end to end.
- Employee CSV wizard. Imports name, work email, job title, kiosk PIN, default kiosk site by code, default analytic account, and department. Departments are created when missing. Match by email, by name, or email then name, with an update-existing toggle.
- Attendance history CSV wizard. Creates hr.attendance rows from check_in and optional check_out, matching the employee by email or name. Optional analytic and project per row are mapped only when the jobcost module adds those fields to the attendance row.
- Dry run and result log. Both wizards default to dry run and produce a text result with created, updated, skipped, and error counts plus a per-row line, so you can correct the source file and re-import with confidence.
- Configurable parsing. Encoding is selectable as UTF-8, UTF-8 with BOM, or Latin-1, and the delimiter as comma, semicolon, or tab. The header row drives column mapping with case-insensitive normalisation.
- Access control. Both wizards and the Migration menu are limited to the attendance suite admin and manager groups inherited from the base module, keeping a one-time cutover task out of ordinary users' hands.
Honest about the edges
What this does not do, so nothing surprises you.
- Face templates are not migrated. Different recognition models produce incompatible embeddings, so employees must re-enrol at the new system.
- There is no live API or connector to the outgoing system. This is a one-time CSV switching tool, not an ongoing integration.
- Prior consent is not imported by design. Consent must be granted fresh at the new system after the employee reads the new privacy notice.
- Imports run interactively from the wizard. There is no scheduled or cron-driven import in this module.
- Analytic, project, and the default analytic account on the employee are only mapped when the optional jobcost module has added those fields. Without it those columns are quietly ignored.
- Requires the eh_hr_attendance_base module and standard hr_attendance. Kiosk site and PIN mapping depend on the base module's fields.
- Built and tested for Odoo 16 Community.
attendance migration odoo 16, attendance csv import, hr_attendance import, employee csv import odoo, time and attendance migration, biometric attendance switch, punch clock data migration, time clock history import, odoo 16 community attendance, import check in check out, attendance dry run import, vendor neutral attendance import
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.
Modules teams pair with this one.
Premium ERP Heritage modules that extend the same stack, each built to the same engineering bar.
Shared foundation for the ERP Heritage Employment Hero country packs
Bring Employment Hero onboarding workflows, employee goals and contractor flags into Odoo Community as real recor...
End to end French B2B and B2G electronic invoicing for the DGFiP reform, generating Factur-X PDF/A-3 with embedde...
Accept ZainCash wallet payments in Iraq at your Odoo checkout, on the ZainCash Payment Gateway v2 with OAuth2, re...
Sync Employment Hero ATS recruitment job openings into the standard Odoo Recruitment app, mapping each opening on...
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 1991 |
| Technical Name |
eh_hr_attendance_migrate |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
Please log in to comment on this module