Odoo Payroll (Attendance-Based)
Budget: $30 – $250 USD
Project: Odoo Enterprise v18 on Odoo.sh — Attendance-based payroll with daily cap
Apps: Payroll, Attendances
Work week: Sunday–Friday (Saturday off)
Daily windows: e.g., 07:30–11:00 & 12:00–15:30 (= 7h/day)
Contracts: Hourly
Goal
Payroll must be generated from Attendances (not from Working Schedule).
For each scheduled day:
Pay min(attended_inside_schedule, 7:00) that day.
Do not pay time outside the scheduled windows (early/late/overtime).
Do not carry over extra hours from a long day to cover a short day.
Result: Payslip total = sum over all scheduled days of min(attended_inside_schedule, 7:00).
Why we need help
We’re unsure if our current config is correct. In v18, salary-rule Python is sandboxed, so a pure rule solution can’t read per-day work entries. We need an expert to audit and implement a robust v18 solution.
Acceptable solutions (pick one and propose)
A) Config/Studio: If v18 supports mapping to split attendances vs. schedule into paid vs unpaid work entries per day, implement this cleanly (no manual month-end edits).
B) Small custom module (preferred if A isn’t possible):
Split each day’s attendance against the employee’s resource calendar:
Inside schedule → paid Attendance (WORK100) up to 7h/day.
Outside schedule or beyond 7h/day → Extra Hours (Unpaid) work entry type.
(Optional) Create Absence (Unpaid) entries when attended hours < 7h on a scheduled day so shortfall is explicit.
Payslip should naturally pay hourly_rate × sum(paid Attendance hours).
Must be upgrade-safe (no core monkey-patch), v18-compatible, and deployable on Odoo.sh.
Acceptance test (we’ll verify on our data)
Employee sample (July 2025):
Days > 7h (e.g., 06-Jul = 16:42) → pay 7:00
Days < 7h (e.g., 10-Jul = 04:40) → pay 4:40
No carry-over between days.
Expected paid total = 65:02 hours; payslip shows correct gross at the employee’s hourly rate.
Work Entries (grouped by Type) should show:
Attendance (paid) = inside-schedule, per day ≤ 7h
Extra Hours (Unpaid) = outside schedule / beyond daily cap
(If implemented) Absence (Unpaid) = visible shortfall on under-7h days
Deliverables
Config or installable module (and/or Studio) that achieves the above in v18.
README: how it works, config steps, how to run future months on Odoo.sh.
Deployment via Odoo.sh branch/PR; no core changes.
(Nice to have) Small test or demo script for regeneration on a staging database.
Access & environment
Odoo.sh project (we’ll invite you as a collaborator).
Staging branch for development & demo before merging.
Please include in your proposal
Your exact approach for v18 (Config vs Module) in 3–5 steps.
Timeline (target 1–3 days) & fixed price.
2–3 relevant Odoo Payroll/Attendances refs.
Any assumptions/risks (DST/timezone handling, multi-company, etc.).
Apps: Payroll, Attendances
Work week: Sunday–Friday (Saturday off)
Daily windows: e.g., 07:30–11:00 & 12:00–15:30 (= 7h/day)
Contracts: Hourly
Goal
Payroll must be generated from Attendances (not from Working Schedule).
For each scheduled day:
Pay min(attended_inside_schedule, 7:00) that day.
Do not pay time outside the scheduled windows (early/late/overtime).
Do not carry over extra hours from a long day to cover a short day.
Result: Payslip total = sum over all scheduled days of min(attended_inside_schedule, 7:00).
Why we need help
We’re unsure if our current config is correct. In v18, salary-rule Python is sandboxed, so a pure rule solution can’t read per-day work entries. We need an expert to audit and implement a robust v18 solution.
Acceptable solutions (pick one and propose)
A) Config/Studio: If v18 supports mapping to split attendances vs. schedule into paid vs unpaid work entries per day, implement this cleanly (no manual month-end edits).
B) Small custom module (preferred if A isn’t possible):
Split each day’s attendance against the employee’s resource calendar:
Inside schedule → paid Attendance (WORK100) up to 7h/day.
Outside schedule or beyond 7h/day → Extra Hours (Unpaid) work entry type.
(Optional) Create Absence (Unpaid) entries when attended hours < 7h on a scheduled day so shortfall is explicit.
Payslip should naturally pay hourly_rate × sum(paid Attendance hours).
Must be upgrade-safe (no core monkey-patch), v18-compatible, and deployable on Odoo.sh.
Acceptance test (we’ll verify on our data)
Employee sample (July 2025):
Days > 7h (e.g., 06-Jul = 16:42) → pay 7:00
Days < 7h (e.g., 10-Jul = 04:40) → pay 4:40
No carry-over between days.
Expected paid total = 65:02 hours; payslip shows correct gross at the employee’s hourly rate.
Work Entries (grouped by Type) should show:
Attendance (paid) = inside-schedule, per day ≤ 7h
Extra Hours (Unpaid) = outside schedule / beyond daily cap
(If implemented) Absence (Unpaid) = visible shortfall on under-7h days
Deliverables
Config or installable module (and/or Studio) that achieves the above in v18.
README: how it works, config steps, how to run future months on Odoo.sh.
Deployment via Odoo.sh branch/PR; no core changes.
(Nice to have) Small test or demo script for regeneration on a staging database.
Access & environment
Odoo.sh project (we’ll invite you as a collaborator).
Staging branch for development & demo before merging.
Please include in your proposal
Your exact approach for v18 (Config vs Module) in 3–5 steps.
Timeline (target 1–3 days) & fixed price.
2–3 relevant Odoo Payroll/Attendances refs.
Any assumptions/risks (DST/timezone handling, multi-company, etc.).