| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 2027 |
| Technical Name |
eh_hr_attendance_payroll_export |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 2027 |
| Technical Name |
eh_hr_attendance_payroll_export |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Versions | 16.0 17.0 18.0 19.0 |
Payroll Export for Attendance
Turn captured attendance into the exact CSV your payroll vendor's bulk import expects, with a full audit trail of every file you generate.
Why this module
Payroll Export for Attendance
Five formats, one wizard
Generic, Xero Payroll, KeyPay, Employment Hero, and MYOB each get the column layout their bulk import expects. Pick a provider, pick a date range, and the file is shaped for that vendor with no manual reformatting.
CSV files, not live connectors
This module does not hold API credentials or push data to any vendor. It generates the file and you upload it through the vendor's own portal. Nothing leaves the database except the CSV you choose to send.
Every export is recorded
Each committed run stores the provider, date range, row and employee counts, total hours, the file bytes, and who generated it. Re-download any past export from its run record. Auditors get read-only access.
Day in the life
Pay run Tuesday, four formats, no spreadsheet surgery
Payroll opens the export wizard, picks the fortnight, and runs a dry-run first. The preview shows 142 rows across 38 employees and 1,216 hours, plus the first lines of the file, so a wrong date range is caught before anything is saved. Split shifts on the same day are already summed into one row per employee per day. Happy with the numbers, they untick dry-run and commit. The run is saved with their name and a timestamp, the CSV downloads, and they upload it through the payroll vendor portal. Three weeks later an auditor asks what was sent in the last cycle: the run record is still there, read-only, and the exact file re-downloads in one click.
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.
Multiple attendances on the same day for one employee are aggregated into a single row, with hours summed and the earliest check-in and latest check-out carried through. Verified by test.
A row with no check-out is excluded by default so half-shifts do not skew totals. Turn on the include-open option and elapsed hours are clamped to the date_to cutoff rather than running open-ended.
Exports are scoped to the selected company by the attendance domain, and the run model carries a per-company record rule so one company's export history is never visible to another.
MYOB Card ID falls back to work email when no external reference is set on the employee, and Xero falls back to employee name when no email is present, so a partially keyed roster still produces a usable file.
Analytic and project carry-through is gated on the attendance jobcost field existing. Without the upstream field the export still runs and simply leaves those columns blank instead of failing.
A dry-run computes counts, totals, and a preview but never creates a run record. Only a committed run writes to the audit log, verified by test.
A constraint rejects a date_to earlier than date_from before any rows are gathered, so an inverted range cannot produce a misleading empty file.
What is inside
Built to do the job, end to end.
- Five provider exporters. Generic CSV, Xero Payroll, KeyPay, Employment Hero, and MYOB AccountRight or Essentials. Each is a focused function that writes that vendor's header and column order. Files are UTF-8 with a byte-order mark so spreadsheet tools open them cleanly. Adding a future vendor is one function plus one selection entry.
- Aggregating wizard. The export wizard gathers attendance in the date range, buckets rows to one entry per employee per day, sums hours, and tracks earliest in and latest out. An optional employee filter narrows the set, and an empty filter means every employee in the company.
- Run audit model. Committed exports are stored as eh.hr.payroll.export.run records ordered newest first, with mail.thread tracking on provider and dates. Fields are read-only, the manager group cannot delete runs, and an auditor group gets read-only visibility.
- Dry-run preview. On by default. Shows the provider, date range, row and employee counts, total hours, and the first lines of the generated file without writing a run, so the operator confirms the shape before committing.
- Retention settings. Each company sets a default provider and a past-export retention horizon in days, defaulting to 730 to cover two financial years. A retention-sweep method trims runs older than the horizon in batches, scoped per company.
- Company scoping and security. A record rule keeps run history per company, and access rights split manager, admin, and auditor so file history stays read-only for review while remaining editable for administration.
Honest about the edges
What this does not do, so nothing surprises you.
- CSV files only. There are no live API connectors and no credentials are stored. The operator uploads each generated file through the vendor's own portal once per pay cycle.
- Provider column layouts reflect each vendor's documented bulk-import shape. Vendors revise their import templates over time, so confirm the current format in your account before a first production run and use the dry-run preview to verify columns.
- Employee matching relies on the identifiers you maintain: work email for Generic, Xero, KeyPay, and Employment Hero, and an external reference (falling back to email) for MYOB. Keep those fields populated for clean matches.
- The retention horizon and a batch retention-sweep method are included, but this build does not ship a registered automatic schedule for the sweep, so retention trimming is not run unattended out of the box.
- Hours come straight from attendance check-in and check-out. The module does not interpret overtime, penalty rates, leave, or pay categories. It exports worked hours and leaves rate and category logic to the payroll system.
- Analytic and project columns are populated only when the attendance jobcost field from the wider attendance suite is present.
- Built and validated for Odoo 16 Community alongside the ERP Heritage attendance base.
payroll export odoo 16, attendance to payroll csv, xero timesheet export odoo, keypay timesheet import, employment hero timesheet export, myob accountright timesheet import, hr_attendance payroll export, timesheet csv export odoo, generic payroll csv exporter, multi company attendance export, payroll export audit trail, dry run payroll preview odoo, split shift aggregation payroll, odoo community payroll export, vendor neutral payroll csv
Please log in to comment on this module