| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 1945 |
| Technical Name |
eh_hr_attendance_payroll_export |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Discuss (mail) • Employees (hr) |
| Community Apps Dependencies | Show |
| Lines of code | 1945 |
| Technical Name |
eh_hr_attendance_payroll_export |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
Payroll Export
A CSV exporter that closes the loop between captured attendance and the customer's payroll system. Five provider formats out of the box. Past export files kept on the run record. Re downloadable, audit ready, no live API connector to maintain.
Day in the life
Payroll Tuesday. Pick the dates, pick the format, click Generate.
The bookkeeper opens Payroll Export, picks dates 1 to 14, picks the right provider format, ticks dry run first to see the row preview. Numbers look right; the bookkeeper unticks dry run, hits Generate. The wizard creates an eh.hr.payroll.export.run record holding the file bytes, the date range, who ran it, and when. Download. Upload to the payroll portal. Done. Three weeks later when accounts ask why a worker's hours look short, the bookkeeper opens the run record from that fortnight and re downloads the same file. No spreadsheet hunt.
Overview
What this module does, in one read.
eh_hr_attendance_payroll_export turns captured attendance into the exact CSV each payroll vendor's bulk import expects.
CSV only by design; no live API connector to maintain. The wizard runs a date range, the picked provider's exporter formats the rows, the result is stored on a run record with the file bytes, generator, and timestamp. Re run a date range as many times as needed; the new run sits next to the old one in the audit list. The award engine's bucket fields flow through automatically when the engine is installed.
Provider formats
Five exporters in the box.
Generic CSV
Vendor neutral columns: employee email, date, check in, check out, hours, analytic, notes. Useful for any vendor not in the list and for internal reporting.
Xero Payroll
Timesheet CSV format with employee match by email, hours summarised by date, optional tracking category carried from analytic.
KeyPay
Timesheet bulk import format with external id fallback to email, total hours per day, optional cost centre.
Employment Hero
Same shape as KeyPay with the Employment Hero column header set, for customers on the renamed product.
MYOB
AccountRight or Essentials timesheet import with Card ID match, Job carried from analytic, day by day rows.
Need another?
Inherit eh.hr.payroll.export, register a new exporter function, slot the column header into the Selection. Customer specific formats are about a hundred lines.
Capabilities
Eight things this module gives you, with no padding.
Five provider formats
Generic CSV, Xero Payroll, KeyPay, Employment Hero, MYOB. Each format generates the file shape that vendor's bulk import expects, complete with headers, employee match field, and per row format quirks.
Dry run preview
Run the wizard with dry run ticked to see the row count and a preview of what would land in the CSV. No file is written; nothing leaves Odoo. Untick and re run to commit.
Run audit trail
Each generated export is stored on eh.hr.payroll.export.run with the provider, date range, row count, file bytes, who generated it, and when. Re run a date range; the new row sits next to the old one in the audit list.
Re downloadable past exports
The generated file lives on the run record. Open the run from the audit list, click Download, get the same bytes that the bookkeeper uploaded to the vendor on payroll Tuesday.
Optional analytic carry through
Where the target format supports it (tracking category, cost centre, job), the analytic account on the attendance row is carried through. Costs follow the worker into the payroll vendor.
No live API connector to maintain
CSV only by design. No vendor API key in your database, no token rotation, no breaking change to track. The bookkeeper uploads the file to the portal once per pay cycle.
Daily retention cron
A daily cron trims runs past the company's configured retention horizon. Older bytes leave the database without operator action; the run audit row is kept until the cutoff.
Extensible exporter table
Exporters live in a Python EXPORTERS dictionary keyed by provider code. Add a new format by writing one function and extending the wizard's Selection. About a hundred lines for a customer specific format.
Frequently asked questions
Honest answers to the questions a buyer asks.
Why CSV instead of a live API connector?
Live connectors break every time the vendor changes auth, rate limits, or column shape. A CSV that the bookkeeper uploads once per pay cycle has fewer moving parts and is easier to verify. No vendor API key lives in your Odoo.
Will it work without the award engine installed?
Yes. Without the award engine the export uses raw clocked hours. With the award engine installed the bucket fields (ordinary, OT1, OT2, effective pay hours) are also available; the exporters use them where the target format supports a breakdown.
Can I export the same date range twice?
Yes. Each run is a fresh row; nothing on hr.attendance is mutated. Re run after a correction; both runs sit in the audit list and the latest one is the one to upload.
How do I add a custom format?
Inherit eh.hr.payroll.export, register a new exporter function in the EXPORTERS dictionary, and extend the wizard's provider selection in your own module. About a hundred lines for a typical customer specific format.
What data leaves the database?
Only the CSV file the operator chooses to upload to the payroll vendor. Past export bytes stay on the run record until trimmed by the daily retention cron.
Please log in to comment on this module