Waterschap Brabantse Delta · R&D lab · asset management

Every outcome of a field scan, and what the engineer reads

owner R&D derived from RnD/passport@e4683f9 version 1.2 last tested against the code 2026-08-05 live
A scan in the field either moves a device or refuses to. This page lists every way that ends, in the order the register actually checks them, with the literal sentence the engineer gets on screen. It is read out of verplaats() and neemInHand() rather than written from memory, so it cannot drift away from the app.

The flow, in the order the checks fire

Order matters and is not cosmetic: a destroyed uuid is refused before anything looks at the place, and the class check runs before the maintenance check, so a pressure sensor on a valve position never reaches the question of whether the position was signed off. Click any outcome.

Twelve of the sixteen are drawn. Left out on purpose: the two request guards a client cannot reach from the field app (#1, #2) and the re-scan of a device you already hold (#15) — they are in the list below.

device known? resolveToestel uuid burned? scrapped, not reversed place known? tag, id or short code already here? same device, same place position usable? not out of service class fits? PT on PT, PU on PU occupied? then: on maintenance? unknown device 404 · nothing is written destroyed uuid 409 · never comes back unknown place 404 · check the label no movement history is not cut in two out of service 409 · tag stays reserved class mismatch 409 · wrong kind of device not on maintenance 409 · THE protection moved · one displaced the old one is now in YOUR hands moved the place was free exclusive and taken 409 · two scans at once scrap needs confirming 409 · the only hard stop taken in hand a device scan with no place — the warehouse handover no to all of the above ↓
pick an outcome above

Each one shows the literal sentence on the phone, and what the engineer does next.

All of it as a list

Thirteen outcomes for a move and three for a handover. The refusals carry their HTTP status because the field screen prints the server's sentence verbatim — what you read below is what is on the phone.

#whenwhat the register doeswhat the engineer reads

Two rules that explain most of the refusals

Nothing is written on a refusal. Every check above happens inside one transaction, so a rejected scan leaves the register exactly as it was. There is no half-move to clean up.

Where a device stands is its status. There is no status field to set, so there is nothing to forget to set. That is also why "in the hands of" is not a place you scan but simply the absence of one — see the movement rows below.

source src/plaatsen.js · verplaats(), neemInHand() · migration 0016_bezetting_uit_door_wie.sql

When you cannot scan at all

Both stickers can be missing or weathered. Neither dead-ends: an unrecorded movement is worse than one recorded by hand, because without a record there is no telemetry and operations have no view.

UnreadableWay outWhat is recorded
Device sticker Type the short code printed under the QR (D-7F3A21); it resolves to the same uuid. Gone as well? Search on supplier plus serial number from the nameplate — that pair is the fingerprint and it is unique. Evidence handmatig, under your own name.
Place sticker “Place QR unreadable?” searches every place, not just this site — a van or a return shelf belongs to no site. Outcome #4 above. Evidence handmatig. Reprint the place sticker from the position register; the tag itself never changes.
The manual way out takes more taps than scanning. That difference is the incentive, and it is deliberate.

source src/service.jsgetRow() resolves uuid, short code and tag · outcome #4 above

Agreed on 2026-08-05, not yet in the app

This page is read out of the running code, so these four are kept apart until they are built. Each comes out of the review round on part 1.

agreed · to be built
A defect flag is not maintenance
Silent-position detection will stop writing status: 'onderhoud' and raise a defect flag instead. Outcome #10 then refuses on a position that is visibly broken but never signed off — and says so.
Maintenance is a reservation — new refusal
Replacing on a position that someone else opened, or that you did not open yourself, is refused: “you opened RG-KLUNDERT-PT-4, this is PT-5”. This closes the one gap outcomes #9 and #10 leave open: two neighbouring positions of the same class, both on maintenance.
A move is accepted but unconfirmed
Outcomes #12 and #13 keep succeeding, but the pairing stays unconfirmed until the position’s Datastream lives again within the configured window. Unconfirmed pairings surface on the deviation list. Deliberately not a gate: the most common repair is a replacement on a loop that is still dead.
A lapsed maintenance asks a question
Today an opened maintenance that expires silently writes back “in service”. It will instead raise an open item on whoever opened it — was the meter replaced? — with “yes, without scanning” as the correction path.

spec ~/align/2026-08-05-asset-levenscyclus-reviewronde.md, decisions 2–5

What this does not decide

Whether a position should be on maintenance. The register only checks that it is. Today the silent-position detection opens that state on its own signal (learned rhythm, flatness, edge heartbeat) and an engineer can set it by hand from the refusal screen — one confirmation, under their own name, lapsing after a configurable window (24 h by default). Under the decision above that split becomes sharper: detection raises a defect flag, and only a person opens maintenance. How the detection itself works is part 3.

source src/app/poortdetectie.js · src/app/poortloop.js · plaats_status.verloopt_op

When it goes wrong

Method the outcomes are read out of verplaats() and neemInHand(); every sentence below zin is copied from the server message verbatim.
Last checked 2026-08-05 against RnD/passport@1bba319. A change to the refusal messages makes this page wrong — re-read it after touching src/plaatsen.js.
If it goes wrong nothing is written on a refusal (one transaction), so a rejected scan needs no clean-up. A move that was accepted but wrong is corrected by scanning the device to where it actually is; scrap is the one step that does not reverse without two admins.
Series part 2 of 3 — see the bar at the top.
Contact R&D lab · wbd-rd.nl