Documentnummers: OUT-2026-00001 en het einde van 00NaN
Waarom elk ordernummer nu uit één teller in de database komt, en waarom twee collega’s nooit hetzelfde nummer kunnen krijgen.
Een ordernummer is de handgreep die iedereen buiten je gebouw gebruikt. De klant citeert hem aan de telefoon, de vervoerder drukt hem op de CMR, de boekhouder matcht de factuur eraan. Hij moet uniek zijn, leesbaar, en uitgereikt op het moment dat de order bestaat. Een tijdlang was het er twee van de drie.
Eén teller, per tenant, per jaar
Elk operationeel documentnummer — outbound OUT-, inbound INB-, collection COL-, receiving session RECEIV- en demanufacturing job DMF- — komt uit één databasefunctie die een teller bijhoudt per organisatie, per documenttype, per jaar, en die onder een lock ophoogt. Het formaat is prefix, jaar, vijf cijfers: OUT-2026-00001. Een lege reeks begint op 00001. In januari begint de teller opnieuw, en het jaartal in het nummer vertelt je naar welke reeks je kijkt.
Twee gebruikers, één seconde, twee nummers
Omdat de teller op slot zit terwijl hij een nummer uitreikt, krijgen twee collega's die op hetzelfde moment een outbound order aanmaken elke keer twee verschillende nummers. En mocht er ooit toch iets langs de teller glippen, dan weigert de database zelf een duplicaat binnen dezelfde organisatie en hetzelfde jaar. Het nummer is een row die de database schreef en geen tweede keer schrijft.
Geen zijdeuren
Orders die via een import of de publieke API worden aangemaakt, gebruiken dezelfde toekenning als de knop in de interface. Geen tweede nummerschema voor het ERP, geen override die een nummer oplevert dat de teller nooit gezien heeft. Eén reeks, één functie, één regel.
Waarom 00NaN een begrafenis verdiende
De oude aanpak las het hoogste bestaande nummer in de browser en telde er één bij op. Bij een lege reeks was er niets om één bij op te tellen, en het resultaat was een document dat fier OUT-2026-00NaN heette — wat een computer zegt wanneer je hem iets laat tellen dat geen getal is. Twee gelijktijdige gebruikers konden ook allebei hetzelfde "hoogste" lezen en er allebei één bij optellen. Geen van beide kan nog. Het is geen string. Het is een reeks.