Het datamodel is de kindpagina onder ons profiel: hoe NimbusCode fruit als object beschrijft. Lars de Wit ontwerpt velden zo dat kwaliteit, inkoop en IT dezelfde JSON kunnen lezen. Geen UML-poster. Een contract van objecten: Crop, Cultivar, Lot, Measurement, QualityEvent, Instrument.

Beeldschermen met catalogusinterface en fruitmonsters op een bureau in Amsterdam Sloterdijk
Datamodel in Sloterdijk: het scherm toont velden, de kist levert de waarden.

Wij forceren geen microservices-religie. Een CSV-export die de velden eert, is beter dan een REST-laag die ze verbreekt. Wie een API wil, krijgt hem; wie een nachtelijk bestand wil, krijgt hem. Beide moeten hetzelfde schema spreken. Zie de modules onder Catalogus.

Kernobjecten

Object Sleutel Relatie
Cultivar cultivar_id 1–n Lot
Lot lot_id n Measurement
Measurement meas_id Instrument + protocol
QualityEvent event_id hold / class change
Instrument instrument_id kalibratielog
{
  "lot_id": "LOT-2026-0828-014",
  "cultivar_id": "MNG-KENT",
  "measurements": [
    { "type": "brix_bx", "n": 12, "mean": 16.4, "sd": 0.7 }
  ],
  "quality": { "class": "I", "hold": false }
}

Identiteit en tijd

Elke meting heeft UTC en Europe/Amsterdam. Elke hold heeft een actor. Elke overwrite is verboden; updates zijn nieuwe events. Dat is trager in de demo en juister in de audit. Wij kiezen de audit.

Enumerations zijn gesloten: quality_class, ripeness_stage, meas_type. Vrije tekst mag in note, nooit in het veld dat het WMS filtert. Die regel voorkomt dat „bijna Extra” een klasse wordt.

Versiebeheer van het schema is semver. Minor voegt optionele velden toe. Major breekt mapping. Wij kondigen major minstens één seizoen van tevoren aan. Fruit wacht niet op een breaking change in week 24.

Null versus ontbrekend veld is een bewuste keuze. null betekent gemeten en leeg of niet van toepassing (avocado.brix_bx = null). Een ontbrekend veld betekent: deze versie van het schema kende het niet. Importroutines mogen null niet stil naar 0.0 omzetten. 0.0 °Bx is een meting. null is een categorie. Die twee verwarren is hoe een WMS pitaya als defect suikergehalte gaat zien.

Tijdzones schrijven wij dubbel: UTC in het event, Europe/Amsterdam in het rapport. Ploegen denken in lokale klok. Audits denken in UTC. Het model draagt beide. Operator-ID’s zijn interne sleutels, geen e-mailadressen in het lotobject. PII hoort in het HR- of toegangsregister, niet in de mango.

Wie een GraphQL-laag wil, mag die zelf zetten op onze JSON. Wij onderhouden geen tweede contract. Eén contract, twee transporten (bestand en HTTPS). Dat houdt de catalogus saai, en daarom bruikbaar wanneer de mango-piek de sprintreview overschreeuwt.

Veelgestelde vragen

Welk formaat leveren jullie?

JSON primair, CSV secundair. XML alleen als uw WMS niets anders lust.

Hosting?

Uw stack of onze begrensde instantie. Geen publieke fruit-API zonder contract.

PII in het model?

Operator-ID ja, geen privéadressen van panelisten in het lotrecord.

Documentatie?

Veldlijst + voorbeelden. Geen 200 pagina’s architectuurproza.

Werkgebied Amsterdam

Wij meten, coderen en documenteren verse AGF voor handelshuizen, importeurs, packingstations en retailinkopers in Amsterdam. Onderstaande stadsdelen zijn geen marketinglijst, maar de dagelijkse routes tussen Food Center, Sloterdijk en de verse markt.

  • Westpoort
  • Sloterdijk
  • Bos en Lommer
  • Westerpark
  • Oud-West
  • De Pijp
  • Centrum
  • Amsterdam-Noord

NimbusCode Fresh Produce Database B.V.

Uw aanspreekpunt: Lars de Wit

Naritaweg 12
1043 CA Amsterdam

Telefoon: +31 20 760 4188

E-mail: [email protected]

OpenStreetMap: Naritaweg 12, 1043 CA Amsterdam

Schema-mapping bespreken