Attendance Migration
Two vendor neutral CSV importers that move employees and attendance history into Odoo 17, with a dry run and a per row error log before anything commits.
Why this module
Attendance Migration
A weekend of manual keying becomes a payroll error noticed three cycles later
Leaving an incumbent time and attendance system usually means a one off ETL or hand keying employees and months of punches. Both are slow, and both surface the error long after the data is live. This module turns the export into a repeatable, previewable import.
Map on the wizard, dry run, read the log, then commit
Every field maps from a named CSV column on the wizard itself, so there is no per vendor adapter to write. Dry run returns a per row preview with zero writes. Commit returns the same log with created, updated, and skipped counts and a reason for every row that did not land.
It tells you plainly what cannot be carried across
Face templates from the previous vendor are mathematically incompatible with the new recogniser, so re enrolment is required at cutover. There is no live connector, and prior consent is not imported because consent belongs to the new privacy notice. Stated up front, not discovered after purchase.
Day in the life
Export. Map. Dry run. Read the log. Commit. Last quarter of attendance live by smoko.
The implementer exports two CSVs from the old system: an employees file with names, emails, kiosk PINs, departments, and a default site code; an attendance history file with check in and check out per row. They open the employee wizard, attach the file, set the encoding and delimiter to match the export, choose match by email then name, and leave dry run ticked. The log reports what would be created versus updated and flags one row with a missing name. They fix the source line, untick dry run, and run again. Then the same loop for attendance history, where one unknown employee is skipped and logged rather than aborting the run. By late morning the new database knows who is who and what they did last quarter.
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.
Dry run walks every row and produces the full preview log, but performs no create or write at all. The database is untouched until the operator unticks dry run and reruns, confirmed by tests that assert zero rows exist after a dry run.
Each row runs inside its own try block. A row with a missing name or an unparseable date is counted as an error and logged with its reason, while every other row in the file still imports. One bad line never aborts the run.
The attendance importer offers a choice: skip unknown employees and log them, or abort hard on the first unmatched row. The operator picks the posture that fits the cutover, and the count columns reflect whichever was chosen.
When updating a matched employee, empty CSV cells are skipped rather than written, so a partial column set cannot blank out existing data. Update mode itself can also be turned off to skip every matched row outright.
A check out that is not strictly after its check in is rejected at the row level with no attendance created, and several datetime layouts including ISO with a T separator and day first formats are parsed without a preconversion step.
A default site code is resolved only against kiosk sites in the active company, matching the unique per company site code constraint, so an import cannot bind an employee to a site belonging to another company.
Analytic, project, and default analytic columns are written only when the job costing module that defines those fields is installed and the named record resolves. A missing optional reference is ignored and never blocks the row.
What is inside
Built to do the job, end to end.
- Employee master importer. Matches hr.employee by work email, by full name, or email then name. Creates rows that do not exist, auto creates a department by name, and sets job title, kiosk PIN, and default kiosk site where the CSV provides them. Default analytic is set only when the job costing module that defines that employee field is installed.
- Attendance history importer. Matches employees by email then name and creates hr.attendance rows with check in and optional check out. Open attendances are allowed by leaving check out blank. Analytic and project per row are populated only when the job costing module that defines those attendance fields is present.
- Configurable parsing. Encoding (UTF-8, UTF-8 with BOM, Latin-1), delimiter (comma, semicolon, tab), and match strategy are all selected on the wizard. Headers are normalised case insensitively, so column names from different exports line up without renaming.
- Result log and counters. Every run returns a Text result that opens with DRY RUN or COMMITTED and the created, updated, skipped, and error tallies, followed by one line per row. The four counts are also exposed as integer fields on the wizard form.
- Admin scoped access. Both wizards are reachable only through a Migration menu under the attendance configuration root, restricted to the suite admin group, with create and write access granted to the attendance admin and manager groups via the shipped access rules.
Honest about the edges
What this does not do, so nothing surprises you.
- No live API connector to the previous system. This is a one time CSV switching tool, run after the incumbent system has exported its data.
- Face recognition templates cannot be migrated. Different recognisers produce incompatible embeddings, so every face must be re enrolled at cutover.
- Prior consent is not imported. Consent must be granted again at the new system against the new privacy notice.
- Default analytic on employees and analytic or project on attendance are written only when the job costing module that defines those fields is installed. There is no task column on this branch.
- Site resolution is scoped to the active company only, so a cross company import must be run per company.
- Matching is exact and case insensitive on email or name. Duplicate or near duplicate names need cleaning in the source CSV before import.
- There is no scheduled or background job. Each import is an operator driven, foreground wizard run.
attendance migration odoo, hr_attendance csv import, employee csv import odoo, time and attendance migration, biometric attendance switching tool, punch clock data migration, attendance history import, odoo 17 attendance import, T&A migration, vendor neutral attendance importer, import check in check out odoo, kiosk attendance migration
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