INTERACTIVE DEMO — SYNTHETIC DATA

PeopleOS Payroll Engine

A month of clock punches, priced to the rupiah by the production payroll brain. Every hop is inspectable, because being wrong here is not a bad recommendation — it is somebody's pay.

Every record on this page is fabricated. No production system, customer, employee or credential is involved.

01The input

August 2026, one fictional roster. Pick a person, then pick a day. The punches below are EMP-D007's month; selecting anyone else re-runs those same punches through their schedule and pay profile, which is exactly how one payroll run differs person to person.

EMPLOYEE

THE MONTH · AUGUST 2026

MON
TUE
WED
THU
FRI
SAT
SUN
DROP A DIFFERENT DAY ONTO THE MONTH

One lived month cannot honestly contain every branch — nobody is on paid sick leave and unpaid leave at once. These substitute a what-if day for the recorded one, and the whole month re-prices underneath it. Two of them pay nothing at all, on purpose.

02The day engine

Clock events in, eight payable minute buckets out — plus the flags that decide the allowances. The timing verdict and the money are separate decisions, and neither overrides the other.

2026-08-28 · WORKDAY · NONE

RULE SET ATTENDANCE-V3-2026-08

CLOCK IN
08:00
CLOCK OUT
22:00
BREAK DEDUCTED
1.00 h
ACTUAL PAYABLE
13.00 h
PAYABLE WORK BEGAN
08:00
UNPAID PRE-SHIFT
0.00 h
SCHEDULED
08:00–17:00
LATENESS GRACE
30 min · strict start
THE EIGHT PAYABLE BUCKETS
BUCKETMINUTESHOURSPRICED AT
Regular4207.00× 1 hourly rate
Overtime, first hour601.00× 1.5 combined base
Overtime, after first3005.00× 2 combined base
Sunday / red-day regular00.00× 2 hourly rate
Sunday overtime, first hour00.00× 3 combined base
Sunday overtime, after first00.00× 4 combined base
Paid annual leave00.00credited, not worked
Paid sick leave00.00credited, not worked
  • HALF DAY no
  • ATTENDANCE BONUS YES
  • REGULAR MEAL YES
  • SUNDAY MEAL no
  • OVERTIME MEAL YES
  • NO BREAK PUNCHED no
  • FIXED HOLIDAY PAID no
  • HOLIDAY TREATMENT none
  • SAVING DAY EARNED no

03The month, and the 78-hour line

Overtime is never requested and never approved here; it is computed from what happened. The month's overtime is then walked chronologically against the company's confirmed monthly threshold, and everything past the line re-prices without a single day being reordered.

MONTHLY OVERTIME82.25 h

THRESHOLD78.00 h

CROSSED ON 2026-08-28 · 4.25 H RE-PRICED

  • within the threshold, priced where it was earned
  • weekday excess → Bonus O/T, × 2 on the combined base
  • Sunday excess → Sunday Bonus O/T, kept at × 4

The 78-hour monthly threshold is the company's confirmed rule, not a statutory one. Overtime is walked in date order and, within a day, first hour before after-first — so a crossing splits a single day's bucket rather than moving the day. A Sunday hour never gets cheaper for having been worked late in the month.

PAYROLL LINES · EACH ROUNDED ONCE, HALF-UP TO RP1
LINEQUANTITYFORMULAAMOUNT
Regular HoursREG155.75 h155.75 h x Rp25.000Rp3.893.750
Overtime First HourOT117.00 h17.00 h x Combined Base x 1.5Rp721.286
Overtime After First HourOT255.00 h55.00 h x Combined Base x 2Rp3.111.429
Bonus Overtime After ThresholdBONUS_OT0.25 h0.25 h x Combined Base x 2 (above the monthly 78h threshold)Rp14.143
Sunday Regular HoursSUN_REG28.00 h28.00 h x Rp25.000 x 2Rp1.400.000
Sunday Overtime First HourSUN_OT12.00 h2.00 h x Combined Base x 3Rp169.714
Sunday Overtime After First HourSUN_OT24.00 h4.00 h x Combined Base x 4Rp452.571
Sunday Bonus OvertimeSUN_BONUS_OT4.00 h4.00 h x Combined Base x 4 (Sunday excess keeps the Sunday rate)Rp452.571
Regular MealMEAL19 day(s)19 qualifying day(s) x Rp23.000Rp437.000
Regular Meal (Sunday/red day)SUN_MEAL4 day(s)4 Sunday/red day(s) x Rp23.000 (same regular-meal amount)Rp92.000
Attendance BonusATT_BONUS19 day(s)19 qualifying day(s) x Rp15.000Rp285.000
Overtime MealOT_MEAL14 day(s)14 qualifying day(s) x Rp30.000Rp420.000
GROSS EARNINGSRp11.449.464

04Exact decimal, not floating point

Every overtime rate is built on a base that does not divide evenly. That is where money quietly goes missing.

COMBINED OVERTIME BASE · ((Rp25.000 × 7) + Rp23.000) / 7

THE ENGINE · decimal.js, KEPT UNROUNDED
28285.714285714285714
THE SAME EXPRESSION IN AN IEEE-754 DOUBLE
28285.714285714286234

The base is a seventh, so it never terminates. A double diverges from it at decimal 12 — 5.2e-13 rupiah — and that error then travels through every overtime multiplier in the rule set, across every overtime minute in the month, before anything is rounded. The amount is trivial. The problem is that nobody can tell you where it came from, and payroll is the one place where “close enough” is a conversation with a person about their rent.

So the engine keeps every intermediate exact and rounds exactly once, half-up to Rp1, at the payroll line — HALF_UP_RP1 in the rule set, never per minute and never per day. Each formula in the table above is that single rounding, and the amount beside it is its result.

05Statutory deductions

Contributions first, then tax on a gross the contributions themselves changed. Both engines print their own arithmetic; neither of them is reimplemented above.

CONTRIBUTION BASIS · ((Rp25.000 × 7) + Rp23.000) × 25 = Rp4.950.000

CONTRIBUTIONEMPLOYEEEMPLOYER
BPJS KesehatanRp49.500Rp198.000
JHTRp99.000Rp183.150
JPRp49.500Rp99.000
JKKRp44.055
JKMRp14.850
TOTALRp198.000Rp539.055

JKK is priced by risk class — this employee is MEDIUM. Only the employee column leaves the payslip as cash; the employer column is paid alongside it, and three of its lines become taxable income below.

PPh 21 · MONTHLY EFFECTIVE-RATE METHOD

PTKP STATUS
K/2
GOLONGAN
2
NPWP ON FILE
yes
TAXABLE GROSS
Rp11.706.369
BRACKET
Rp11.600.001 – Rp12.600.000
TABLE RATE
3.00%
APPLIED RATE
3.00%
PPH 21
Rp351.191

Taxable gross is not the same figure as gross pay: JKK, JKM and BPJS Perusahaan are employer money that counts as the employee's income, while JHT Perusahaan and JP Perusahaan are excluded. That is the confirmed rule the composition function encodes, and it is why the number the tax is charged on is larger than the number in the earnings table.

VERIFICATION STATUS

PPh 21 itself is Indonesian public law. The effective-rate table shipped here is TARIF-PAJAK-2026-v1, and it carries its own note: “Company-configured PPh21 effective-rate table. Requires formal statutory verification before production payroll reliance. Float artifacts in the source normalized to 4-decimal rates.” The contribution rates, caps and floors in bpjs-v1-demo are the same — modelled on the legacy workbook and tracked as unverified. Every one of these was logged as pending confirmation with Accounting rather than quietly assumed correct, which is why the engine says so in its own output instead of leaving it to a comment.

06Take-home

The end of the chain, and the only number on this page an employee would recognise.

Gross earningsthe payroll lines above
Rp11.449.464
BPJS, employee sideKesehatan + JHT + JP
−Rp198.000
PPh 213.00% of the taxable gross
−Rp351.191

TAKE-HOME

Rp10.900.273

This last subtraction is the only arithmetic on the page the engines did not do. In production it belongs to the orchestrator, along with the payslip, the approval chain and the bank file — none of which are here.

BEYOND THE MONTH · THR

Rp4.375.000 · 60 MONTHS OF SERVICE · FULL · ELIGIBILITY 2027-03-20

THR uses basic salary only. Every allowance, bonus and overtime rupiah above is excluded from it, which is why a big overtime month does not move this figure at all.

EMP-D007 · SEWING · GOLONGAN 2

The month grid belongs to this employee. Strict Start is on for his schedule, so an early tap is recorded where it happened and paid from 08:00 — and his August overtime crosses the 78-hour line, which is the one rule a visitor should watch fire.

HOURLY RATE
Rp25.000
REGULAR MEAL
Rp23.000
ATTENDANCE BONUS
Rp15.000
SKILL BONUS
none
PTKP STATUS
K/2
NPWP
on file
JKK CLASS
medium
EXTRA FAMILY
0
SERVICE SINCE
2022-03-14
SCHEDULE
08:00–17:00

2026-08-28

The day the month crosses 78 overtime hours — and it crosses in the middle of it. Overtime is walked chronologically, first hour before after-first, so this day's after-first bucket splits: most of it stays where it was earned and the last few minutes move to Bonus O/T. The day's own classification is never rewritten; the move is a payroll-level view of it.

WHERE EACH RULE COMES FROM

PUBLIC LAW
Indonesian PPh 21 and its monthly effective-rate method. Naming it discloses nothing.
THE COMPANY'S CONFIRMED RULES
Operational, not statutory, and the employer is not named anywhere on this page or in the dataset:
  • Saturday 5-hour shift credited as 7 regular hours
  • Overtime meal threshold basis
  • Sunday/red-day multipliers (2x / 3x / 4x)
  • Monthly 78-hour overtime threshold
  • Daily attendance bonus qualification
TRACKED AS UNVERIFIED
The statutory rates, caps and floors were carried as pending confirmation with Accounting for as long as they were unconfirmed, and the rule sets say so in their own version strings and output. An unverified number that admits it is worth more than a confident one that does not.