Ga naar inhoud

Alle artikelenArchitectuur

Sluit een datacontract met uw ERP, ook al kan het niet tekenen

Een taalmodel leest een gewijzigde export zonder morren in, en juist daarom hoort het nooit de poortwachter voor binnenkomende data te zijn. Het contract dat we bij elke batch afdwingen, gaat over vorm, betekenis, volledigheid, timing en eigenaarschap. Een afwijkende batch gaat in quarantaine en wordt niet stilletjes gerepareerd.

18 maart 20255 min leestijdGeschreven door Subash Natarajan

Op een maandagochtend daalde het matchpercentage van een financeworkflow scherp, en er was niets kapotgegaan. Geen foutmelding, geen alert, geen gestopte job. In het weekend had de ERP-partner een update doorgevoerd die in één export het datumformaat veranderde van dag eerst naar maand eerst. Elke datum tot en met de twaalfde van de maand werd nog steeds ingelezen. Verkeerd. Facturen werden gematcht tegen de ontvangsten van de verkeerde week, rustig en op volle snelheid.

Het herstel kostte een uur. Het vinden kostte het grootste deel van een dag, omdat niets in het ontwerp ervan uitging dat een export van betekenis kon veranderen zonder van vorm te veranderen.

Elke AI-workflow in een operatie leunt op data waarvan niemand heeft beloofd dat ze stabiel blijft: exports die jaren geleden zijn ingepland, velden die voor nieuwe doelen zijn hergebruikt, codes die per land verschillen. Het ERP kan geen contract tekenen. Wij schrijven er toch een, en handhaven het bij elke batch.

Met consumer-driven contracts, zoals Ian Robinson ze in 2006 op de site van Martin Fowler beschreef, legt de afnemer van een service vast waar hij op leunt, en test de aanbieder daartegen. Een legacy-ERP zal nooit de tests van iemand anders draaien. De afnemer schrijft het contract dus en handhaaft het alleen, en de ontwerpvraag wordt welk onderdeel streng genoeg is om dat te doen.

Modellen zijn te vergevingsgezind om het te handhaven

Taalmodellen zijn goed in het lezen van rommelige invoer. Een hernoemde kolom, een nieuw datumformaat, een extra veld: het model redt zich wel. Teams zien dat als een voordeel en laten het model formaatwijzigingen opvangen.

Op een datagrens is het een risico. Een traditionele parser die een gewijzigde export tegenkomt, faalt luid, en iemand gaat kijken. Een model dat dezelfde wijziging tegenkomt, geeft een plausibel antwoord en gaat door, en de fout komt weken later boven in een reconciliatie, ver van de oorzaak. De grens hoort het minst vergevingsgezinde onderdeel van het systeem te zijn. Het model krijgt alleen data die haar al is gepasseerd.

Een model mag de inhoud van een document lezen. Het mag niet bepalen wat de kolommen van een systeemexport betekenen.

Wat het contract dekt

De meeste teams schrijven het eerste van deze vijf op en vergeten de rest.

Vorm. Velden, types, formaten, verplichte waarden. Datums in één vastgelegd formaat. Bedragen met een vastgelegd decimaalteken en tekenconventie.

Betekenis. Wat een veld per bron voorstelt. Of "boekingsdatum" in deze markt de documentdatum of de invoerdatum is. Of creditnota's binnenkomen als negatieve bedragen of als positieve bedragen met een documenttype. Of een hoeveelheid in dozen of in pallets is. Twee exports kunnen dezelfde vorm hebben en een andere betekenis, en daarom gaat data uit meerdere markten hier stuk.

Volledigheid. Hoeveel records er moeten binnenkomen en waar ze samen op uit moeten komen. We vragen de bron om controletotalen, het aantal records en de som van de bedragen, onafhankelijk van de export aangemaakt, en vergelijken die bij elke batch. Een batch die qua vorm perfect is en honderd regels mist, is de gevaarlijkste soort. We houden de controle ook aan voor bronnen die "nooit regels kwijtraken". Elke bron raakt ooit regels kwijt, en dat gebeurt op een dag dat niemand kijkt.

Timing. Wanneer de batch binnenkomt, welke periode hij dekt en wat er gebeurt met records die na de cut-off zijn geboekt. Een workflow die een export leest voordat het magazijn zijn ontvangsten boekt, maakt uitzonderingen aan die eigenlijk alleen vertraging zijn.

Eigenaarschap. Wie aan de kant van de klant een wijziging in de export goedkeurt, en hoe wij dat te horen krijgen. Zonder dit is het contract een document dat niemand leest tot na het incident.

Afgekeurde batches gaan in hun geheel in quarantaine

Het contract is code. Elke binnenkomende batch wordt ertegen gecontroleerd voordat er enige bedrijfslogica draait. Een batch die faalt, wordt niet half verwerkt en niet op gevoel gerepareerd, ook niet als de oplossing voor de hand ligt. Voor de hand liggende oplossingen die stil worden toegepast, zijn hoe één verkeerde aanname uitgroeit tot een maand verkeerde boekingen. De batch gaat in quarantaine met een reden, en een benoemde persoon krijgt een melding.

Quarantaine voelt traag voor wie doorvoer wil. Een afgewezen batch kost een uur aandacht van iemand. Een verkeerd gelezen batch kost dagen onderzoek en, in finance, een correctiespoor waar de accountants naar gaan vragen.

Betekenis is niet altijd mechanisch te controleren, dus voegen we controlerecords toe: een handvol bekende records waarvan we weten hoe ze gelezen moeten worden, gecontroleerd bij elke run. Als een bekende factuur van een bekende leverancier ineens een andere datum of een ander bedrag oplevert, is de betekenis veranderd, ook al is de vorm gelijk gebleven. Die maandag had een controlerecord de datumwijziging binnen enkele minuten gevonden.

Elke bron krijgt een eigen contract

Toen we voor Bredent Medical vier Europese markten koppelden, elk op Dynamics 365 of een legacysysteem, bleek er niet zoiets als één ERP-contract te bestaan. Elke markt had zijn systeem anders ingericht, gebruikte eigen codes en exporteerde op een eigen schema. Eén integratielaag stond voor alle vier, met een contract per bron en een mapping per markt naar één gedeeld model. De contracten hielden die laag betrouwbaar terwijl elke markt zijn eigen configuratie bleef aanpassen. Dat weegt het zwaarst als een bedrijf markten toevoegt: elke nieuwe markt komt binnen als een nieuwe bron, en hoort met haar contract binnen te komen.

Bankdata vraagt dezelfde discipline. MT940-afschriften en ISO 20022-berichten van het type camt.053 bevatten referenties, valutadatums en boekdatums die de kwaliteit van de matching bepalen lang voordat er een model aan te pas komt, en banken veranderen het gebruik van velden als ze tussen formaten migreren. Een contract per bank en rekeningtype, met sentinels, vangt dat voordat de reconciliatie het doet.

Contracten worden getest met kapotte bestanden

Bij elk contract hoort een set voorbeeldbestanden: goede, en bewust kapotte met een hernoemd veld, een gewijzigd datumformaat, ontbrekende regels of een verkeerd totaal. De grens moet de eerste accepteren en elk van de tweede afwijzen, en dat draait bij elke wijziging in de testsuite. Als de ERP-partner een upgrade inplant, kan het team van de klant een voorbeeldexport uit het testsysteem door de grens halen en binnen enkele minuten weten of er iets breekt.

We spreken ook één regel af met de IT-afdeling van de klant en de ERP-partner: een wijziging in een export die een workflow voedt, loopt via hetzelfde wijzigingsproces als een wijziging in de workflow. Die regel heeft meer incidenten voorkomen dan welke validatiecode die we hebben geschreven ook.

Luide fouten zijn het doel

Het meeste van wat een AI-workflow in productie betrouwbaar maakt, gebeurt voordat het model iets ziet. Een contract houdt niet tegen dat exports veranderen. Het maakt de verandering luid, en luide fouten worden in een uur verholpen. Stille fouten worden door de accountant gevonden.

Bespreek uw operatie met onze engineers.

Beschrijf één proces en de systemen waarop het steunt. Een senior engineer reageert binnen twee werkdagen met een eerste beoordeling: wat we zouden bouwen, wat niet, en waarom.

Een senior engineer leest elke aanvraag en reageert binnen twee werkdagen.

Of boek direct: agenda voor een kennismakingsgesprek