Overseas
Azure- en integratiearchitect
Distributie voor tax-free shops op luchthavens en cruiseschepen. Een team van drie, twee van ons developer, dus het werk valt hier niet uiteen in strikt afgebakende rollen.
Bluebird · van wekelijkse prijsmail naar B2B-webshop
Het begon als de wekelijkse prijswijzigingsmail. Sales ziet op dinsdag welke prijzen gaan veranderen en kan nog ingrijpen, klanten krijgen de nieuwe prijzen op donderdag. Op dat fundament is Bluebird gegroeid, de B2B-webshop waar de meeste klanten van Overseas vandaag hun orders plaatsen, en die verving een Python-versie met betrouwbaarheidsproblemen. Angular front end, ASP.NET Core API, orders die in het ERP-systeem landen. Het liep eerst op onze eigen servers en verhuisde later naar Azure. Na de migratie naar Business Central is de prijssynchronisatie naar Azure Functions gegaan, verdeeld over twee queues: één bericht per klant om de prijzen op te halen, en het resultaat op een tweede queue die naar de database schrijft. Die splitsing levert throughput en betrouwbaarheid, want een fout herhaalt één stap in plaats van de hele run.
Overseas Integration Platform
Toen Bluebird stond, ben ik begonnen met het vervangen van de vele losse applicaties die rechtstreeks met Navision communiceerden. Sommige waren in Python geschreven, andere zaten in SQL zelf, en er was geen gedeelde code. Het platform hergebruikt wat Bluebird al had, in de eerste plaats de synchronisatie met het ERP-systeem. Het is een message-based SOA op NServiceBus met drie endpoints: één voor Business Central, één voor uitgaande berichten en één voor inkomende. Die twee message-endpoints ondersteunen de protocollen van de andere kant, waaronder REST, FTP en XML. De endpoints draaien als Windows services op onze eigen servers, en daar blijft dit ook staan. Eén plugin per integratie, elk in een eigen map met eigen assemblies, zodat een nieuwe flow uitgerold kan worden zonder dat er iets verandert aan wat al draait, en de deployment pipeline volgt diezelfde structuur. Het platform verving Boomi. Betrouwbaarheid was het uitgangspunt, en de message-based opzet is wat dat oplevert. Berichten die op een tijdelijke fout stranden blijven staan en kunnen opnieuw verwerkt worden, of die fout nu een weggevallen databaseconnectie was of een bug die pas de dag erna gefixt werd. Er gaat niets verloren doordat een systeem op het verkeerde moment onbereikbaar is. Loopt er toch iets vast, dan krijgen de developers automatisch een melding met de diagnose, meestal voordat een gebruiker het gezien heeft.
Projecten die aan het platform hangen
Meer dan een dozijn integraties draaien er als plugin op: EDI, WMS, OrderEye, Slim, Multiscan, Rio, Entra ID-synchronisatie voor externe BI-gebruikers, het automatisch aanmaken van Jira-tickets, warehouse scan, bank statement scan, Stream, Zetes, ASN export, en sindsdien meer. Multiscan is een van de fysiekere: een toestel dat artikelen in drie dimensies meet, met een Blazor-scherm ervoor en een Python-oplossing erachter die het verving. Elk daarvan is een plugin en niet opnieuw een aparte applicatie met eigen conventies.
Navision naar Business Central Online · live 2025
De migratie van begin tot eind gedreven, inclusief het AL-extensiewerk in Business Central zelf en niet alleen de .NET-kant. Zes bedrijven draaien er vandaag op. Een SaaS-tenant heeft geen achterdeur, dus elke integratie moest naar de officiële API's. Die omzetting is doorgevoerd zonder functionele freeze, omdat de endpoints al geïsoleerd zaten achter hun eigen contracten. Deze migratie is het duidelijkste rendement dat ik gezien heb op architectuur die jaren eerder is neergezet.
Document recognition · waar het begon
Eerst magazijndocumenten. De barcodes op een gescande batch zoeken en de scan daarlangs in afzonderlijke documenten splitsen. Daarna kwamen bankafschriften, en die vroegen meer: genoeg uit elke pagina halen om ze aan de juiste bankrekening toe te wijzen. Een paar duizend van die twee in totaal. Samen zijn ze de plek waar we geleerd hebben hoe extractie zich in de praktijk gedraagt, en dat is wat de volgende stap haalbaar maakte.
OrderEye · verkoop- en aankoopdocumenten
Gebouwd op wat het werk rond magazijndocumenten en bankafschriften opleverde, met Azure AI Document Intelligence als lezer. Aan de verkoopkant maakt OrderEye de verkooporder in Business Central aan en meldt het aan de klant elke regel waar de prijs in zijn eigen document afwijkt van de werkelijke prijs in BC. Aan de aankoopkant controleert het wat de leverancier gestuurd heeft tegen wat er in BC staat. De gebruiker ziet in één oogopslag welke regels niet overeenkomen en corrigeert die manueel, waarna de correcties terug naar BC gaan. Business Central houdt een trace bij van alles wat OrderEye verwerkt heeft. Een paar honderd facturen per maand gaan erdoor. OrderEye voert de andere twee extracties niet uit, het bouwt op dezelfde principes.
- Bluebird en het integratieplatform delen een groot deel van hun code via interne NuGet packages. Eén uniforme manier van werken dekt alles wat hier gebouwd wordt, dus een fix in een gedeelde library komt in beide terecht. Beide staan vandaag op .NET 10, gemigreerd vanaf 8.
- Azure DevOps opgezet en de release pipelines voor beide applicaties gebouwd. Staging draait voor beide op onze eigen servers. In productie staat alleen Bluebird op Azure, het integratieplatform blijft on premise.
- Observability volgt diezelfde tweedeling. On premise vangt een middleware de logging en de niet-afgehandelde exceptions op, en het is die middleware die de meldingen naar de developers stuurt. Wat op Azure draait rapporteert in Application Insights. Elke API is beschreven met Swagger.
- De code volgt OWASP, en de secrets zitten in Key Vault in plaats van in de configuratie. Persoonsgegevens vallen onder de GDPR, dus anonimisatie zit in het ontwerp overal waar de data niet herleidbaar hoeft te blijven.
- Naast het ontwikkelwerk beheer ik de Azure-omgeving: de resources, de gebruikers op de tenant, de kosten, en de support wanneer iemand niet binnen raakt.
- In het begin de opleiding gegeven, en ik review de technische ontwerpkeuzes van de andere developer.
- Per omgeving een andere object graph in de IoC container, zodat staging en productie in configuratie verschillen en niet in code.
.NET 10, ASP.NET Core, Blazor, Business Central (AL), Azure App Service, Azure Functions, Azure Storage queues, Azure Blob storage, Application Insights, Entra ID, Azure AI Document Intelligence, NServiceBus, EF Core, SQL Server, Angular, REST, Swagger, SOAP, FTP, XML, Azure DevOps, OAuth 2