Sign-On-Only (Attendance-Only) Contracts
Some suppliers and crews are managed attendance-only: the head contractor needs the prestart sign-on plus shift start/stop times for site presence and safety, but does not bill those workers via dockets (they are on a flat sub-contract or a separate commercial arrangement). For these suppliers, the auto-generated billing docket is noise — it pollutes the docket workbench, the cost-allocation report, and the field worker’s mobile flow.
Sign-on-only mode suppresses docket creation by contract policy while leaving attendance recording completely intact.
How it works
The flag lives on the contract — contracts.signon_only (a boolean,
default false). Because it is contract-scoped, one supplier link can be
docket-priced on Project A and attendance-only on Project B by having two
contracts.
When signon_only = true:
- Prestart sign-ons and shift start/stop times are still recorded (attendance is never affected).
- No billing docket is created for workers on that contract — neither on the live sign-on path nor on the mobile start-shift path.
- Classifying a worker later does not back-fill a docket while the flag is on. Suppressed sign-ons are also excluded from the unbilled back-fill queue, so they are never re-attempted.
Sign-on-only is now the main reason a sign-on produces no docket at all. It
returns the reason signon_only.
Changed 2026-08-10 (owner ruling). No worker who signs on — or who has a docket created for them manually in the web admin — is refused a docket any more. When pricing cannot be derived the docket is still created and simply carries no pricing lines: the response is
docket_created: trueplusdocket_pricing_pending: true, and the field app and web admin both open the docket on an empty pricing grid with the manual add-lines affordance.
pending_verificationis no longer a suppression reason at all. Every shape that used to return it now gets a docket with an empty grid — an unverified / unassigned worker, a grouping-tag assignment (crew-hour / flat-shift / material) off a non-subcontractor link, a wet-hire operator whose machine rate line resolves no operator, and a legacy equipment-rate assignment with no unified rate line. Attendance-only (signon_only) is the only input on either path that still answers “no docket”, and it is deliberately untouched: it is a commercial statement, not a missing-pricing state.All-or-nothing pricing is what makes that safe. A docket on these paths is either fully and correctly priced or carries zero pricing lines — never half. A half-priced docket (say a labour line for a wet-hire operator with the machine silently missing) is an invisible under-bill; an empty grid is a visible prompt a human fills in. So when the machine cannot be carried, the worker’s billing anchors are withheld too, and the classification back-fill will not later stamp one onto that row.
An unpriced docket does not end the story. Its worker row carries no billing anchor, so the sign-on stays in the unbilled back-fill queue: the next time an admin assigns that worker, the back-fill re-derives the route with the new assignment, attaches to the docket that already exists (never a second one), stamps the resolved anchor and prices it. Manually added lines survive that re-price. Once the docket is submitted it is treated as locked and is never re-derived — an admin resolves those by hand.
Turning it on / off
Toggle Attendance-only (no dockets) in the contract editor header (hidden
for materials contracts, which are delivery-docket-driven). The toggle is not
shown in the supplier portal — billing policy is head-contractor-internal.
- Turning it on does not touch existing dockets — they are left as-is. Only new sign-ons stop minting dockets.
- Turning it off re-enables billing for future sign-ons. The accumulated attendance-only sign-ons re-enter the unbilled back-fill queue and are billed the next time the worker is classified or a docket is saved (batched, up to 25 per call). The editor warns about this before you flip it off.
In the docket workbench
When you pick an attendance-only contract in the docket create dialog, the supplier/contract picker shows an amber notice, the worker / equipment / activity pricing builders are hidden, and Save & Submit is disabled — there is no docket to create. Manage attendance from the prestart sign-on flow instead.
On mobile
Start Shift says the supplier is attendance-only before the worker taps Continue, so the outcome is never a surprise. After tapping, the form itself confirms “Attendance recorded” as a normal success with a Done action — never an error, and never a bounce back to the previous screen with a toast. No docket screen is opened, because there is no docket.
Signing on a prestart for an attendance-only supplier shows “Signed on. This supplier is attendance-only — no docket needed.” and returns the worker to the previous screen.
Known limitation
An unclassified worker on an attendance-only contract can report a reason
other than signon_only — the worker’s assignment reaches a contract only
through its classification, so an unclassified assignment cannot surface the
contract’s flag. This is why the policy is read from the supplier↔project
link (org_supplier_link_projects.signon_only, always present) rather than
the contract: the link-sourced check fires for unclassified workers too, and it
runs before any routing decision, so an attendance-only supplier never mints
a docket even for a worker with nothing assigned.