| Item | Code | On hand | Level | Status |
|---|
Every movement gets a client id on the phone. When a batch arrives twice, the second copy is answered already_synced and changes nothing.
A movement that would take stock below zero is rejected on its own; the rest of the batch still applies.
Only codes shaped like TTG:ITEM:CEM-50 are accepted. Any other QR is refused.