Kundecase

WMS-integration hos Constellation Cold Logistics: fra databaseskrivninger til én datamodel

Constellation Cold Logistics Denmark driver kølelagre for fødevareproducenter, hvor hver kolli skal kunne spores. Kundernes EDI-filer blev skrevet direkte ind i lagersystemets databaser, kunde for kunde. SublimTech har bygget landskabet om på Lobster med én kanonisk datamodel, så en ny kunde er én mapping, og lagersystemet kan skiftes uden at røre kundeforbindelserne.

Løsningen er designet og bygget af Jonatan Augustsson, CEO for SublimTech i Sverige, og er i drift i dag. Her er forløbet fra udgangspunkt til plan.

  • Kølelager og fødevarelogistik
  • Lobster Data Platform og Infor WMS
  • Ca. 8 min. læsning
Lobster Value Added Reseller, Platinum Partner
10 kølelagre i Danmark
ca. en tredjedel af landets frysekapacitet
1 canonical data model pr. beskedtype
ordrer, forsendelsesadviser, modtagelser, reguleringer
ca. 2 mdr. mål for onboarding af en ny kunde
mod seks til otte måneder før
1 samlet rapport i stedet for 40-50 enkeltbeskeder
ved reguleringer på tværs af paller

Kilde: SublimTechs eget projektmateriale om Constellation Cold Logistics Denmark. Onboarding-tallet er projektets mål for nye kundeforbindelser, ikke et opgjort gennemsnit.

Kunden

Ti kølelagre og en sporbarhed, der ikke er til forhandling

Constellation Cold Logistics Denmark hed indtil 2025 Agri-Norcold. Virksomheden blev grundlagt i Hobro i 1964 som slagteri og kølehus og voksede til ti lokationer i Danmark med omkring en tredjedel af landets samlede frysekapacitet. Anlægget i Vejen er Nordeuropas største kølelager. I 2024 blev virksomheden en del af Constellation, Europas tredjestørste kølelageroperatør med ti opkøb på fire år i ni lande.

Kunderne er fødevareproducenter, fra dybfrost til kølet mælk, og mange af dem leverer kød. Kød er reguleret af myndighederne, så sporingsdata for hver enkelt kolli er ikke et ønske, men et krav. Det er den ramme, integrationen skal virke i: mange kunder, mange formater og data, der skal kunne følges tilbage til kilden.

Filmen illustrerer kølekæden

Se en end-to-end cold supply chain: kød på båndet, paller, frysere og containere på vej ud i verden. Afspilles, når du klikker.
Før

Én fildeling, skrevet direkte ind i databasen

Udgangspunktet var én fælles SFTP-fildeling på en lokal server, bundet til AS/400. Alle kunder afleverede filer samme sted, og filerne blev hentet og skrevet direkte ind i databasetabellerne, besked for besked. Der var intet fælles lag og ingen fælles struktur. Hver kundes særheder boede i den kode, der skrev deres filer ind i tabellerne, og en ny kunde betød, at den leg blev bygget igen. Nogle kunder var slet ikke på EDI.

Den skjulte smerte

Det var ikke kun datamodellen, der var udokumenteret. Rørføringen var det også.

  • Hver ny kundeforbindelse rejste de samme spørgsmål: henter vi filen, eller leverer de den? SFTP eller et API, vi selv skal trække fra? Og hvilket format er der egentlig i filen?
  • Viden sad hos enkeltpersoner, ikke i dokumentation. De oprindelige integrationer var bygget af få, meget erfarne folk, og når de går videre, går begrundelserne med dem.
  • Gamle kundeprofiler blev bevaret som skabeloner, alene fordi den næste onboarding skulle have noget at kopiere fra.
  • AS/400-tabellerne, som alt blev skrevet ind i, var lige så udokumenterede som filerne, der kom ind.

Det svarer til at arve et hus uden tegninger, hvor halvdelen af rørene sidder inde i væggene. Før man kan lægge nye rør, må man finde ud af, hvor de gamle faktisk går.

Sådan startede vi

Interviews først, derefter de rigtige filer

Projektet kunne ikke starte med et design. Det måtte starte med at spørge.

  1. Kunde for kunde: hvilke data findes der egentlig?
  2. Og hvordan bevæger de sig fysisk gennem systemerne?
  3. Svarene blev bekræftet mod rigtige produktionsfiler, ikke mod beskrivelsen af dem.

Discovery i Lobster i stedet for ved skrivebordet

Rigtige produktionsfiler fra hver kunde blev læst direkte ind i en Lobster-profil. Dermed blev beskedens struktur synlig med det samme, og mappingen kunne justeres løbende, uden at noget skulle deployes for at afprøve en teori. EDI er kun en standard af navn. Hver kundes implementering har sine egne særheder, og de fleste er udokumenterede, så den eneste pålidelige kilde var dataene selv.

Den kanoniske model

Én intern model pr. beskedtype

Kernen i løsningen er én kanonisk datamodel, på engelsk en canonical data model eller CDM, for hver beskedtype: ordrer, forsendelsesadviser, modtagelser, reguleringer og flere. Det er ét standardiseret internt format, som Constellation selv har fuld kontrol over. Modellen blev defineret ud fra store mængder rigtige produktionsdata på tværs af kunderne, analyseret med hjælp fra AI, så den holder generelt og ikke er formet efter én kundes særheder. Den fastlægger de felter, der som minimum skal være der, for at en kunde overhovedet kan kobles på.

Tænk på det som et fælles arbejdssprog i diplomati. I stedet for at hvert land skal have en tolk til hvert andet land, har hvert land én tolk: fra eget sprog til det fælles og tilbage. Kommer der et nyt land til, kommer der én tolk til. De andre rører man ikke.

Sådan ser en ordre ud i modellen

NiveauFelter
HovedOrdrenummer, kunde-id, lager-id, ordredato, ønsket leveringsdato
LinjerLinjenummer, varenummer, palle-id, mængde, enhed, lotnummer, bedst før
KolliPr. palle, når kunden er kollisporet: kolli-id, mængde, lotnummer, bedst før, sporbarhedsreference
MetaKildesystem, modelversion, status, oprettet

To niveauer i linjerne, palle og derunder kolli, gør, at sporbarheden kan hænge på det niveau, den enkelte kunde spores på. Onboarding er denne øvelse, én gang: kundens felter til modellen, ind og ud. Alt nedstrøms findes allerede.

Sådan sender kunderne det, og sådan kræver modellen det

Typisk fra en kunde

Linje 1: varenummer 4408, 120 kasser, 3 paller

Linje 2: varenummer 9120, 1.800 kg, blandede paller

Strukturen varierer fra kunde til kunde. Sjældent én linje pr. palle, og hver kunde har sin egen logik.

Sådan kræver modellen det

Linje 1: varenummer 4408, palle PAL-04007, 36 kolli CTN-0001 til CTN-0036, hver med lot og bedst før

Linje 2: varenummer 4408, palle PAL-04014, 36 kolli CTN-0037 til CTN-0072

Én linje pr. palle, og hver palle kan rumme mange kolli, der spores hver for sig. Fordi modellen er Constellations egen, håndhæves begge niveauer ét sted, centralt.

Arkitekturen

Kundeformat, fælles model, lagerformat

Hvert led i kæden er sin egen Lobster-profil, afkoblet fra de andre. Udgående beskeder følger samme kæde den modsatte vej. En ny kunde er én mapping, som derefter kobles ind i den eksisterende proces. Samme fleksibilitet gælder den anden vej: et skifte af lagersystem, eller et ekstra lagersystem, der kommer med et opkøb.

1. Kundens EDI

Kundens eget format og egen transport: SFTP, API, push eller pull. Særhederne bliver her, i kundens egen profil.

2. Den kanoniske model

Én intern model pr. beskedtype, som SublimTech og Constellation selv definerer og ejer. Alt derefter kender kun denne model.

3. Lagerformatet

Modellen oversættes til det, lagersystemet forventer. Skiftes lagersystem, er det kun denne mapping, der ændres.

4. Infor WMS

Lagersystemet modtager beskederne i sit eget format. Udgående beskeder følger samme kæde den modsatte vej.

Bygget én gang, brugt overalt

Logning og sporbarhedsfelter er fælles objekter i Lobster, som alle profiler refererer til, i stedet for at blive bygget om i hver profil. Logningen fanger samme detaljer i samme kolonner på tværs af alle flows, så support kan læse et hvilket som helst flow uden at lære det først. En ændring i logning eller sporbarhed er én ændring, ikke tyve.

Hvad det betyder

Hver besked kan spores, og hver særhed er indkapslet

Hver besked i modellen bærer sine egne metadata: kildesystem, modelversion, status og tidsstempel. Går noget galt, dårlige data fra en kunde, et manglende felt, en fejlet levering, kan det spores til præcis hvilken besked, hvilken kunde og hvilket punkt i kæden. Muligheden for at bevise og spore, hvad der skete med data, og ikke kun flytte dem, var en af de vigtigste grunde til, at Constellation valgte Lobster som mellemlag.

  • Kundespecifik logik bor i kundens egen profil, ikke spredt gennem kerneprocessen. Én kundes undtagelse kan ikke vælte en andens flow, og kernen forbliver læselig.
  • En ny kunde er en mappingopgave: deres format til og fra modellen, plus transporten. Resten af flowet findes allerede, med de obligatoriske felter defineret.
  • Ingen binding til ét lagersystem. I dag er det Infor WMS. Skiftes det, ændres kun mappingen fra modellen til lagersystemet, og et ekstra lagersystem fra et opkøb er en tilføjelse, ikke en migrering.

Målet: fra måneder til uger

Før betød en enkelt kundes onboarding måneders frem og tilbage, typisk seks til otte måneder. Med modellen på plads er målet for en ny forbindelse omkring to måneder, og den første kunde bliver koblet på efter den nye model i øjeblikket. Planen er flere danske kundeforbindelser og derefter koncernens andre lande. Det første lager går efter planen i drift på Infor WMS i november 2026, og efter måneders test holder både standardprocesserne og undtagelserne omkring dem.

Bygget oven på

Rapporter, strømpriser og certifikater på samme platform

Hver kunde er implementeret forskelligt, især i hvad de kan og ikke kan håndtere på EDI-siden, så der er altid særtilfælde og enkeltstående rapporter. Så længe logikken kan forklares, og lagersystemet kan levere rådata til Lobster, bygger og leverer Lobster rapporten.

Rapporter, lagersystemet ikke kan lave

Lagerlister som Excel-ark, delt op pr. palle, pr. vare og mere, på forskellige skabeloner efter behov. Lagersystemet kan kun sende én regulering ad gangen, så en regulering på tværs af mange paller udløser 40-50 enkeltbeskeder. Lobster samler dem i en database, og en tidsstyret profil sender én samlet rapport pr. kunde og lager, timet til det, kunden kan håndtere.

Strømpriser og frysere

Lobster læser elpriserne fra nettet time for time. Ud fra prisen kan frysere slås fra og til automatisk, så driften reagerer på prisudsving i realtid.

Certifikater fra papir til JSON

Det begyndte som én kollegas løsning: udfyldte PDF'er i stedet for håndstemplede papircertifikater med vandmærke. I dag genererer Lobster certifikatdata som JSON til en partner, der indberetter digitalt til Fødevarestyrelsen. Kun to til tre certifikattyper er stadig på papir.

Planlagt, ikke bygget

Væk fra den lokale server og ud som API'er

Alt ovenfor er bygget og i drift. Det følgende er retningen, ikke leverancen.

  • Kunderne flyttes væk fra den AS/400-bundne fildeling og over på Lobster: SFTP hostet i Lobster som minimum, HTTP direkte for dem, der kan API. Pointen er ikke at afskaffe SFTP, for Lobster taler næsten enhver protokol. Pointen er at forlade den lokale server.
  • Modellen og rapporterne udstilles som eksterne API'er med Lobsters egen OAuth2-tjeneste og adgangsstyring i API Manager, så kunderne selv kan hente deres data, når de vil.
  • Onboarding via Trading Partner Manager, hvor partneropsætning, transport og adgange samles ét sted, så en API-parat kunde bliver et opsætningstrin frem for et udviklingsprojekt.
  • Ikke alle kunder har brug for eller kapacitet til fuld EDI. Visionen er en WebEDI-portal til de mindre, hvor ordre- og lagerdata ses i browseren uden EDI-opsætning.

Løsningen var fra starten tænkt til flere lagre og flere lande, adskilt pr. kunde som en egenskab ved strukturen, ikke som en tilføjelse. Hvert opkøb i koncernen kommer med sine egne systemer og sin egen udgave af AS/400, præcis som Danmark gjorde. Mønstret herfra er ikke en dansk løsning, men en genbrugelig tegning til det næste opkøb.

Har I et lignende landskab med mange kunder, mange formater og viden, der sidder hos få personer? Så er en fælles datamodel ofte det første skridt.

Book en dialog om jeres integrationer
Spørgsmål

Ofte stillede spørgsmål om casen

Hvad er en kanonisk datamodel (CDM)?

Ét fælles internt format pr. beskedtype, fx én måde at beskrive en ordre på, som alle kundeformater oversættes til, og som lagersystemets format oversættes fra. Den definerer de felter, der som minimum skal være der, for at en kunde overhovedet kan kobles på. Fordelen er, at hver kunde kun skal mappes én gang, og at intet nedstrøms behøver kende den enkelte kundes særheder. På engelsk hedder det en canonical data model, forkortet CDM. Det skal ikke forveksles med Microsofts Common Data Model, som er noget andet.

Hvorfor ikke bare mappe hver kunde direkte til lagersystemet?

Fordi antallet af forbindelser så vokser med hver kombination af kunde og system, og fordi hver kundes særheder ender i den kode, der skriver til lagersystemet. Det var præcis udgangspunktet hos Constellation: hver ny kunde betød, at den leg blev bygget igen. Med modellen imellem er en ny kunde én mapping, og et skifte af lagersystem rører ikke kunderne.

Kan samme tilgang bruges uden for kølelagre?

Ja. Mønstret er det samme, uanset om det er et lager, et ERP-system eller en webshop i den ene ende: kundeformat, fælles model, systemformat. Det, der er særligt for kølelagre og fødevarer, er sporbarheden på palle- og kolliniveau, og den er bygget ind i modellen som genbrugelige felter frem for som regler i hvert flow.

Hvad sker der med kundeforbindelserne, hvis lagersystemet skiftes?

Ingenting. Kunderne taler kun med den kanoniske model, så et nyt lagersystem betyder en ny mapping fra modellen til det nye system, mens alle kundeforbindelser står urørte. Et ekstra lagersystem, fx fra et opkøb, er en tilføjelse, ikke en migrering.

Skal jeres integrationer bygges på én model?

Vi gennemgår gerne, hvordan en kanonisk datamodel ville se ud hos jer, og hvad den ville betyde for onboarding af nye partnere.

Kontakt SublimTech