HandbookPeople & money32

Extra hours & overtime.

Schools run on hours that aren't on anyone's contract. An exam needs three invigilators on a Saturday. A teacher is absent and a colleague covers two periods. The chess club meets after the last bell. A retired physics teacher gives one guest lecture. Each of those is an extra hour, owed to a real person, priced by a rule the school decides — and each one needs to land on a payslip without anyone re-keying it into a spreadsheet. This module posts the need, invites the right people, records who actually showed up, prices the hour, and carries the approved total into the next payroll run. It also holds the period-hour-type catalogue — the multipliers that let a practical or a lab hour pay more than a theory hour for everyone, automatically.

  • 6routes
  • 7slot kinds
  • 5pay models
  • ≈18 minto read

Prologue

A note on this book and the hour#

Extra hours are where money quietly leaks. A school knows it paid its invigilators something at the end of exam week, but rarely who, for exactly how many hours, at what rate, approved by whom. The honorarium for a guest speaker gets paid from petty cash and never touches the books. The colleague who covered four periods is thanked verbally and forgotten by payroll.

YESS treats every extra hour as a first-class object with a paper trail: a slot describing the need, an assignment recording the person who filled it, a computed pay figure, an approval, and — for staff paid through payroll — a line on the payslip that traces back to the original slot. Nothing is paid that wasn't approved; nothing approved is forgotten at run time.

Every extra hour, priced by the school's own rules, carried straight into payroll.

Chapter one

A Saturday in exam week#

It is the second Saturday of end-of-term exams at Greenwood International Academy. Follow this morning end to end and the rest of the book is detail.

Thursday, the day before. The exams officer needs three invigilators for Saturday's two sessions. She opens the extra-hours hub at /dashboard/extras-hours and clicks Post a slot: kind Invigilation, three seats required, Saturday 08:00–11:00, pay model Hourly at ₦1,500/hour, funding source Payroll, minor-facing toggle on. The slot is created with status Open. She invites two teachers and — because she is short one body — a vetted retired teacher already on the guest register.

Friday. The two teachers accept their invitations from their own portals; the guest accepts hers. The slot now shows 3 / 3 seats filled.

Saturday 07:55. Each invigilator checks in. The school's configured check-in method is Manual, so the officer taps Check-in on each row as they arrive. One teacher is ten minutes late but present; the third — the guest — does not appear. At 08:15 the officer marks her No-show. The guest's reliability score drops by the school's configured penalty.

Saturday 11:05. The two who worked check out. YESS computes each one's actual hours from the gap between check-in and check-out (≈3.0 hours) and the pay (3.0 × ₦1,500 = ₦4,500). The officer opens each row and clicks Approve. Approved hourly pay funded by payroll is now queued.

Month-end. The accountant runs payroll. On the run, one action attaches every queued extra-hours total to the right staff payslip — ₦4,500 appears on each invigilator's slip as an itemised extras line, added to gross and net. The two source assignments flip to paid, stamped with the run id, and can never be double-paid.

Chapter two

The need: a slot#

A slot is a posted need for extra cover. It lives in the extras_slots table and is created from /dashboard/extras-hours. Every slot carries a kind, a date and time window, a number of seats required, a pay model, a funding source, a location, and a minor-facing flag that drives the safeguarding rules later.

The hub lists slots grouped by date, each card showing the time window, kind badge, status pill, pay label and seats filled. Filter by kind, status, or date range. Creating a slot needs the extras_hours.create or extras_hours.manage permission; new slots are inserted directly as Open.

The seven slot kinds

  1. 1

    Invigilation

    Exam supervision. These can be posted by hand, or generated automatically from an exam schedule (Chapter nine). Each generated slot is linked back to the originating exam session.

  2. 2

    Ad-hoc cover

    A colleague covers an absent teacher's period. Posted manually — there is no automatic substitution-to-slot trigger, so cover here is a deliberate, recorded act rather than a verbal favour.

  3. 3

    Extracurricular

    Clubs, sports, after-school activities — the hours a teacher gives beyond the timetable. The slot can be marked open to self-opt-in so willing staff sign themselves up.

  4. 4

    Event support

    Open days, sports days, parent evenings — the all-hands logistics hours an event consumes.

  5. 5

    Guest lecture

    An outsider or alumnus gives a one-off talk, typically paid as a fixed honorarium rather than by the hour.

  6. 6

    Exam marking

    Scripts marked outside contracted time, priced per hour or as a fixed honorarium.

  7. 7

    Other

    Anything the six named kinds don't cover. The kind is a label for reporting; the pay model and funding source do the financial work.

Pay models & funding

A slot's pay model is one of five: Hourly (rate × hours worked), Fixed honorarium (a flat amount regardless of hours), In-kind (a non-cash thank-you, described in text), Salary-inclusive (the person is already paid for this through their salary — recorded for the record, not for extra pay), and None. The system enforces a shape rule: an hourly slot must carry an hourly rate; a fixed slot must carry an honorarium amount.

The funding source says where the money comes from: Payroll, Petty cash, Event budget, Donor-funded, or School revenue. This is the single most important field for the payroll bridge — only slots funded by Payroll (and paid hourly or by honorarium) ever reach a payslip. The other funding sources are tracked here but settled through finance.

Slots grouped by date — kind badge, status pill, pay label and seats filled on every card, with kind / status / date-range filters above.

Chapter three

Who fills the slot#

A slot is filled by an assignment — one row in extras_assignments per person invited. An assignment points at exactly one of three kinds of person: a member of staff, a registered guest (an outsider), or an alumnus. The slot detail page lists every invitee with their status, computed pay, check-in and check-out times, and pay status.

To invite, open a slot from the hub and use Invite — pick a staff member or a guest. Inviting needs the extras_hours.manage permission; inviting an outsider also needs extras_hours.invite_outsider. The invited person sees the invitation in their own portal and accepts or declines it themselves.

Chapter four

From invitation to approval#

Every assignment moves through a fixed lifecycle, and every transition is a database function — not a free-text status field anyone can fudge. The states are: Invited → Accepted (or Declined) → Checked-in → Checked-out → Approved → Paid, with No-show and Disputed as side exits.

Accept / decline. The invited person responds from their portal; an admin can also record the response.

Check-in. When the person arrives they are checked in. The method is set per school — Manual (an admin taps the row), QR, Biometric, or Geofence. The check-in stamps a time and who verified it.

Check-out. At the end, check-out stamps the closing time. YESS computes actual hours as the gap between check-in and check-out, and computed pay from the slot's pay model — hours × hourly rate, or the fixed honorarium, or zero for in-kind and salary-inclusive slots.

Approve. Someone with extras_hours.approve_pay approves the checked-out assignment. Approval sets the pay status to Queued for cash-paying slots, or Waived for slots whose pay model is none, in-kind, or salary-inclusive. Queued is the moment the hour becomes payable.

No-show. If the person never arrives, an admin marks them No-show. For a registered guest this also dents their reliability score by the school's configured penalty — self-managed, not editable by hand.

Chapter five

Rate cards & the guest register#

Outsiders need two things the school controls: a rate, and a background-check status. Both live in their own surfaces.

Rate cards

Open /dashboard/extras-hours/rate-cards. A rate card is a reusable template — a named hourly rate and/or a fixed honorarium, in a currency, optionally scoped to certain slot kinds. Build "Guest lecturer — ₦25,000 honorarium" once and apply it to every guest lecture rather than typing the figure each time. Managing rate cards needs extras_hours.manage_rate_cards.

The guest register

Open /dashboard/extras-hours/guest-users. This is the register of non-staff people the school can call on — retired teachers, consultants, vendor individuals, parent volunteers, unverified alumni. Each guest carries a type, contact details, an optional default rate card, a national ID, and a background-check status: not required, pending, passed, failed, or expired.

The register also keeps a reliability score from 0 to 100, alongside counts of completed assignments and no-shows. These are auto-managed by the approve and no-show functions — a completion nudges the score up by the school's configured bonus, a no-show knocks it down by the penalty, capped at 0–100. The score is read-only by design: it is a record of behaviour, not a setting.

Chapter six

The rules the school sets#

Open /dashboard/extras-hours/settings. One settings row per school governs how the whole module behaves — this is a tools-not-policy module, so almost every behaviour is a school decision. Four cards:

Four configuration cards

  1. 1

    Pay & payroll

    Auto-attach approved hourly/honorarium hours to the next payroll preview; the default pay currency; and an approval-required-above-amount threshold so high-value extras need a second sign-off.

  2. 2

    Check-in & opt-in

    The default check-in method (QR, manual, biometric or geofence); whether staff may self-opt-in to open slots; and whether a no-show fires a notification.

  3. 3

    Safeguarding & tax

    Whether a valid background check is required before anyone fills a minor-facing slot; a tax threshold amount; and whether that threshold is read per month or per year.

  4. 4

    Reliability scoring

    The penalty subtracted from a guest's score on a no-show (default 10) and the bonus added on a completed assignment (default 1). Every guest starts at 100; the score is capped 0–100.

Chapter seven

Pricing the timetable: hour types#

The extra-hours module above prices ad-hoc hours. There is a second, quieter half of this module that prices the school's ordinary teaching hours: the period hour-type catalogue at /dashboard/hour-types.

An hour-type is a category of teaching time with a payroll multiplier. YESS seeds seven on setup — theory ×1.00, tutorial ×0.90, preparation ×0.50, online ×1.00, practical ×1.25, lab ×1.40, fieldwork ×2.00. A teacher's base hourly rate is the "theory ×1.00" benchmark; a lab period priced at ×1.40 pays 40% more for that hour, for every teacher, automatically.

Each type carries a code (a stable lookup key the timetable solver and payroll engine read — locked after creation), a name, the multiplier, a default room type, a colour, and a display order. Seeded types cannot be deleted; schools add their own. The KPI strip shows total, active, and seeded counts. Managing types needs the period_hour_types permissions.

Chapter eight

The bridge into payroll#

Two distinct pay feeds run from this module into payroll, and it is worth knowing which is which.

Feed A — extra-hours slots

When the accountant runs payroll, a preview lists every staff member with queued extras and the total owed; one action then attaches those totals to the matching payslips. Each affected payslip gains an extras total and an itemised breakdown — slot title, kind, date, hours, pay — added to gross and net salary. The source assignments flip from queued to paid, stamped with the payroll run id, so a second run can never pay them again.

Only assignments that are approved, queued, tied to a staff member, funded by payroll, and priced hourly or by honorarium make this crossing. Guest and alumni honoraria, petty-cash slots, and event-budget slots are deliberately excluded — they settle through finance.

Feed B — payable teaching hours

The ordinary timetable pays through a separate engine. The school chooses an hourly pay basis: logbook (pay the hours the teacher recorded teaching) or multi-factor presence (pay only the periods that were independently verified — an officer scan, a roll-call, a logbook entry, per the school's configured factors). Each payable period is priced through the hour-type multiplier from Chapter seven against the teacher's per-type rate. This is where a covered period or a substitution earns the substitute their hour — through the normal teaching-hours engine, not the extras slots.

Chapter nine

Invigilation from the exam schedule#

The one place slots are created for you is exams. From an exam schedule, YESS can generate an invigilation slot per session in one call — kind Invigilation, seats and rate as specified, linked back to the originating session. Run it twice and it won't duplicate; the generator is idempotent. The exams officer then only has to invite people, not build the slots by hand.

This is the bridge between the examinations module and this one: the exam timetable becomes a set of staffed, priced, payable slots without re-typing a single date.

Chapter ten

What makes extra hours elite#

Six things that make this elite

  1. 1

    Pay by the clock, not the plan

    Actual hours are computed from real check-in and check-out times, not the slot's booked window. A person who arrives late or leaves early is paid for what they worked — and the school can prove it.

  2. 2

    Lifecycle by function, not free text

    Every transition — accept, check-in, check-out, approve, no-show — runs through a security-definer database function. Nobody flips an assignment to 'paid' by editing a field; the state machine is enforced at the database, not the form.

  3. 3

    Idempotent payroll handoff

    Attaching extras to a payroll run flips each source assignment to paid and stamps it with the run id. Run payroll twice and the same hour is never paid twice — the breakdown on the payslip traces every franc back to its slot.

  4. 4

    Safeguarding at the gate

    Minor-facing slots can require a valid background check before anyone is assigned. An expired check makes the person ineligible unless a manager with an explicit bypass permission overrides it — a deliberate, logged act.

  5. 5

    Self-managing reliability

    Guests earn and lose a reliability score automatically — up on completion, down on a no-show — so the people who let the school down sort themselves to the bottom of the invite list without anyone keeping a grudge list.

  6. 6

    Two feeds, one engine

    Ad-hoc extras and ordinary teaching hours both price through the same hour-type rates and land in the same payroll run — the school sets the rules once and every hour, planned or extra, is valued consistently.

Planned features

What comes next#

The features below are planned and not yet built. They appear here honestly so you can plan around them.

Four features coming next

  1. 1

    Guest pay through finance

    Today only staff extras reach a payslip; guest and alumni honoraria are approved and tracked here but must be settled by hand in finance. The planned path routes approved outsider pay automatically into the expenses ledger.

  2. 2

    Substitution → slot automation

    A teacher absence that triggers cover does not yet create an extras slot automatically — cover is posted by hand. The planned flow turns a recorded substitution into a pre-filled ad-hoc-cover slot for the covering teacher.

  3. 3

    Club & event linkage

    Slots already carry a club id and event id, but the clubs and events tables they would point at are not yet wired in. The planned upgrade links an extracurricular or event-support slot straight to the club or event it serves.

  4. 4

    Tax-threshold withholding

    The settings already capture a tax threshold and period; the planned engine uses them to flag or withhold tax on extras that push a person over the configured threshold within the month or year.

The full lifecycle

A term of extra hours#

Term start. The school sets its rules once at /dashboard/extras-hours/settings — check-in method, reliability penalties, safeguarding gate — and reviews the hour-type multipliers at /dashboard/hour-types. The guest register is topped up with this term's vetted outsiders.

Through the term. Slots are posted as needs arise — a covered period here, a club session there, an open day. Staff accept invitations or self-opt-in; admins check people in and out; approvers clear the queue weekly.

Exam weeks. Invigilation slots are generated from the exam schedule, staffed, worked, and approved. The reliability register quietly records who showed up and who didn't.

Month-end / payroll. The accountant attaches queued extras to the run; staff see itemised extras lines on their payslips; assignments are stamped paid. Guest honoraria are settled through finance.

Term close. Filter the slot board by date range to read the term's whole extra-hours bill — by kind, by funding source, by person — for the next budget conversation.

Adjacent modules

Where extra hours connect#

Tutorial

Do it step by step#

Staff three invigilators for Saturday's exam and get them paid, end to end. Six steps, in the order the exams officer actually works.

  1. 1

    Set the rules once

    Open /dashboard/extras-hours/settings and set your check-in method, the reliability penalties, and — if outsiders will be near students — turn on the background-check gate for minor-facing slots. You only do this at the start of term.

    Set a sensible default pay currency here so every new slot inherits it instead of asking each time.

  2. 2

    Post the slot

    Open /dashboard/extras-hours, click Post a slot, choose kind Invigilation, three seats, the Saturday window, pay model Hourly with a rate, and funding source Payroll. Leave minor-facing on. The slot opens immediately.
  3. 3

    Invite the people

    Open the slot and use Invite to add two teachers and one vetted guest from /dashboard/extras-hours/guest-users. Each person accepts from their own portal; the seat counter fills as they do.

    Check the guest's reliability score and background-check status before you invite them — the register shows both on the card.

  4. 4

    Check them in and out

    On the day, check each invigilator in as they arrive and out when they finish. YESS computes actual hours from the gap. If someone never shows, mark them No-show — their reliability score adjusts automatically.
  5. 5

    Approve the pay

    Open each checked-out row and click Approve (you need the approve_pay permission). Approved hourly pay funded by payroll is now queued — visible to the accountant's next run.

    Clear the approval queue weekly. An assignment left un-approved is the single most common reason an invigilator's pay is missing from a run.

  6. 6

    Attach to payroll

    At month-end, the accountant runs payroll, previews the queued extras, and attaches them in one action. Each invigilator's payslip gains an itemised extras line; the assignments flip to paid, stamped with the run id, never to be paid twice. Guest honoraria settle separately through /docs/finance.

Every extra hour Saturday's exam cost is now on the right payslip — traceable back to the slot, and impossible to pay twice.