Skip to Content
Aviation ERP · Odoo 18

One source of truth for billable flight hours and crew pay

Zulu-time leg timestamps drive flight hours, block hours, contract hours and crew allowances — computed, not argued over.

Team built — near-even split · ~3,500 LOC
Odoo 18 Python

The problem a client brought us

“We bill flight hours by hand, and 'how many hours was that really' turns into a dispute more often than we'd like. Crew allowance payouts have the same problem when legs overlap the same day.”

Before and after

Recorded on every leg

  • Wheels up / down
  • Chocks off / on
  • Agreed additional minutes

What billing and crew pay read

Billable contract hours

What we found and built

Every leg stores Zulu-time wheels-up/down and chocks-off/on timestamps, from which flight hours and block hours — two genuinely different aviation quantities — are computed separately and rolled into billable contract hours automatically.

  • Crew allowance calendar-day deduplication, so a crew member flying two legs on the same day is paid once, not twice
  • Batch confirmation that processes everything it can and reports aggregated failure reasons, instead of blocking 200 records because one is incomplete

Result

Billing and crew pay both trace back to the same source of truth — no more arguing over the number.

The pattern behind it

Process what you can, explain the rest

Failing on record 3 of 200 rolls the whole batch back and tells the user nothing useful. We process everything that can be processed and report the reasons for the rest, counted.

How we think about problems

Recognise any of this?

Most of our work starts with a message that sounds a lot like this one did.