Odoo Payroll (Attendance-Based)

Job ID: 39692457

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.).
Related categories: Python Odoo