Kundecase fra Danmark

WMS-integrasjon hos Constellation Cold Logistics: fra direkte databaseskriving til én datamodell

Constellation Cold Logistics Denmark driver kjølelagre i Danmark for matprodusenter der hvert kolli skal kunne spores. Kundenes EDI-filer ble skrevet rett inn i lagersystemets databaser, kunde for kunde. SublimTech har bygget om landskapet med Lobster-integrasjon og én kanonisk datamodell, slik at en ny kunde er én mapping, og lagersystemet kan byttes uten å røre kundekoblingene.

Løsningen er designet og bygget av Jonatan Augustsson, Head of Consultants i SublimTech, og er i drift i dag. Her er hele historien, fra utgangspunkt til plan.

  • Kjølelager og matlogistikk i Danmark
  • Lobster Data Platform og Infor WMS
  • Ca. 8 min lesetid
Lobster Value Added Reseller, Platinum Partner
10 kjølelagre i Danmark
ca. en tredjedel av Danmarks frysekapasitet
1 kanonisk datamodell per meldingstype
ordrer, forsendelsesvarsler, varemottak, lagerjusteringer
ca. 2 mnd. mål for onboarding av en ny kunde
mot seks til åtte måneder før
1 samlet rapport i stedet for 40-50 enkeltmeldinger
ved lagerjusteringer på tvers av paller

Kilde: SublimTechs eget prosjektmateriale om Constellation Cold Logistics Denmark. Onboarding-tallet er prosjektets mål for nye kundekoblinger, ikke et beregnet gjennomsnitt.

Kunden

Ti kjølelagre og sporbarhet som ikke er til forhandling

Constellation Cold Logistics Denmark het frem til 2025 Agri-Norcold. Virksomheten ble grunnlagt i 1964 som slakteri og kjølehus i den danske byen Hobro og vokste til ti lokasjoner i Danmark med rundt en tredjedel av landets samlede frysekapasitet. Anlegget i Vejen er Nord-Europas største kjølelager. I 2024 ble virksomheten en del av Constellation, Europas tredjestørste kjølelageroperatør med ti oppkjøp på fire år i ni land.

Kundene er matprodusenter, fra dypfryste varer til kjølt melk, og mange av dem leverer kjøtt. Kjøtt er regulert av myndighetene, så sporingsdata for hvert enkelt kolli er ikke et ønske, men et krav. Det er rammen integrasjonen skal virke i: mange kunder, mange formater og data som skal kunne følges tilbake til kilden.

Filmen illustrerer kjølekjeden

Se en kjølekjede fra ende til ende: kjøtt på båndet, paller, frysere og containere på vei ut i verden. Spilles av ved klikk.
Før

Ett filområde, skrevet rett inn i databasen

Utgangspunktet var ett felles SFTP-filområde på en lokal server, knyttet til AS/400. Alle kundene leverte filer på samme sted, og filene ble hentet og skrevet rett inn i databasetabellene, melding for melding. Det fantes ikke noe felles lag og ingen felles struktur. Hver kundes særegenheter lå i koden som skrev filene inn i tabellene, og en ny kunde betydde at alt måtte bygges på nytt. Noen kunder brukte ikke EDI i det hele tatt.

Det skjulte problemet

Det var ikke bare datamodellen som var udokumentert. Det samme gjaldt rørleggerarbeidet.

  • Hver ny kundekobling reiste de samme spørsmålene: henter vi filen, eller leverer de den? SFTP eller et API vi selv må hente fra? Og hvilket format ligger egentlig i filen?
  • Kunnskapen satt hos enkeltpersoner, ikke i dokumentasjon. De opprinnelige integrasjonene var bygget av noen få, svært erfarne folk, og når de går videre, forsvinner begrunnelsene med dem.
  • Gamle kundeprofiler ble beholdt som maler, bare fordi neste onboarding skulle ha noe å kopiere fra.
  • AS/400-tabellene som alt ble skrevet inn i, var like udokumenterte som filene som kom inn.

Det er som å arve et hus uten tegninger, der halvparten av rørene sitter inne i veggene. Før man kan legge nye rør, må man finne ut hvor de gamle faktisk går.

Slik startet vi

Intervjuer først, deretter de ekte filene

Prosjektet kunne ikke starte med et design. Det måtte starte med spørsmål.

  1. Kunde for kunde: hvilke data finnes egentlig?
  2. Og hvordan beveger de seg fysisk gjennom systemene?
  3. Svarene ble sjekket mot ekte produksjonsfiler, ikke mot beskrivelsen av dem.

Kartlegging i Lobster i stedet for ved skrivebordet

Ekte produksjonsfiler fra hver kunde ble lest rett inn i en Lobster-profil. Dermed ble meldingens struktur synlig med en gang, og mappingen kunne justeres fortløpende uten at noe måtte rulles ut for å teste en teori. EDI er bare en standard i navnet. Hver kundes implementering har sine egne særegenheter, og de fleste er udokumenterte, så den eneste pålitelige kilden var dataene selv.

Den kanoniske modellen

Én intern modell per meldingstype

Kjernen i løsningen er én kanonisk datamodell, på engelsk en canonical data model eller CDM, for hver meldingstype: ordrer, forsendelsesvarsler, varemottak, lagerjusteringer og flere. Det er ett standardisert internt format som Constellation selv har full kontroll over. Modellen ble definert ut fra store mengder ekte produksjonsdata på tvers av kundene, analysert ved hjelp av AI, slik at den fungerer generelt og ikke er formet etter én kundes særegenheter. Den fastsetter hvilke felter som minst må være med for at en kunde i det hele tatt kan kobles på.

Tenk på det som et felles arbeidsspråk i diplomatiet. I stedet for at hvert land må ha en tolk til hvert annet land, har hvert land én tolk: fra eget språk til det felles og tilbake. Kommer det et nytt land til, kommer det én tolk til. De andre trenger man ikke røre.

Slik ser en ordre ut i modellen

NivåFelter
HodeOrdrenummer, kunde-ID, lager-ID, ordredato, ønsket leveringsdato
LinjerLinjenummer, varenummer, pall-ID, antall, enhet, lotnummer, best før
KolliPer pall, når kunden spores på kollinivå: kolli-ID, antall, lotnummer, best før, sporbarhetsreferanse
MetaKildesystem, modellversjon, status, opprettet

To nivåer i linjene, pall og under den kolli, gjør at sporbarheten kan ligge på det nivået den enkelte kunde spores på. Onboarding består i å gjøre denne øvelsen én gang: kundens felter til modellen, inn og ut. Alt nedstrøms finnes allerede.

Slik sender kundene det, og slik krever modellen det

Typisk fra en kunde

Linje 1: varenummer 4408, 120 esker, 3 paller

Linje 2: varenummer 9120, 1 800 kg, blandpaller

Strukturen varierer fra kunde til kunde. Sjelden én linje per pall, og hver kunde har sin egen logikk.

Slik krever modellen det

Linje 1: varenummer 4408, pall PAL-04007, 36 kolli CTN-0001 til CTN-0036, hvert med lot og best før

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

Én linje per pall, og hver pall kan romme mange kolli som spores hver for seg. Fordi modellen er Constellations egen, håndheves begge nivåene sentralt, på ett sted.

Arkitekturen

Kundeformat, felles modell, lagerformat

Hvert ledd i kjeden er sin egen Lobster-profil, frikoblet fra de andre. Utgående meldinger følger den samme kjeden motsatt vei. En ny kunde er én mapping, som deretter kobles inn i den eksisterende prosessen. Den samme fleksibiliteten gjelder den andre veien: et bytte av lagersystem, eller et ekstra lagersystem som kommer med et oppkjøp.

1. Kundens EDI

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

2. Den kanoniske modellen

Én intern modell per meldingstype, som SublimTech og Constellation selv definerer og eier. Alt som kommer etter, kjenner bare denne modellen.

3. Lagerformatet

Modellen oversettes til det lagersystemet forventer. Byttes lagersystemet, er det bare denne mappingen som endres.

4. Infor WMS

Lagersystemet mottar meldingene i sitt eget format. Utgående meldinger følger den samme kjeden motsatt vei.

Bygget én gang, brukt overalt

Logging og sporbarhetsfelter er felles objekter i Lobster som alle profilene refererer til, i stedet for å bygges på nytt i hver profil. Loggingen fanger de samme detaljene i de samme kolonnene på tvers av alle flyter, slik at support kan lese en hvilken som helst flyt uten å lære den først. En endring i logging eller sporbarhet er én endring, ikke tjue.

Hva det betyr

Hver melding kan spores, og hver særegenhet er kapslet inn

Hver melding i modellen har med seg sine egne metadata: kildesystem, modellversjon, status og tidsstempel. Går noe galt, enten det er dårlige data fra en kunde, et manglende felt eller en feilet levering, kan det spores til nøyaktig hvilken melding, hvilken kunde og hvilket punkt i kjeden. Muligheten til å bevise og spore hva som skjedde med dataene, og ikke bare flytte dem, var en av de viktigste grunnene til at Constellation valgte Lobster som mellomlag.

  • Kundespesifikk logikk ligger i kundens egen profil, ikke spredt utover kjerneprosessen. Én kundes unntak kan ikke velte en annens flyt, og kjernen forblir lesbar.
  • En ny kunde er en mappingoppgave: kundens format til og fra modellen, pluss transporten. Resten av flyten finnes allerede, med de obligatoriske feltene definert.
  • Ingen binding til ett lagersystem. I dag er det Infor WMS. Byttes det, endres bare mappingen fra modellen til lagersystemet, og et ekstra lagersystem fra et oppkjøp er et tillegg, ikke en migrering.

Målet: onboarding på rundt to måneder

Før betydde onboarding av en enkelt kunde måneder med frem og tilbake, typisk seks til åtte måneder. Med modellen på plass er målet for en ny kobling rundt to måneder, og den første kunden kobles nå på etter den nye modellen. Planen er flere danske kundekoblinger og deretter konsernets andre land. Det første lageret går etter planen i drift på Infor WMS i november 2026, og etter måneder med testing fungerer både standardprosessene og unntakene rundt dem.

Bygget videre

Rapporter, strømpriser og sertifikater på samme plattform

Hver kunde er implementert forskjellig, særlig i hva de kan og ikke kan håndtere på EDI-siden, så det er alltid spesialtilfeller og enkeltstående rapporter. Så lenge logikken kan forklares og lagersystemet kan levere rådata til Lobster, bygger og leverer Lobster rapporten.

Rapporter lagersystemet ikke kan lage

Lagerlister som Excel-ark, delt opp per pall, per vare og på andre måter, med ulike maler etter behov. Lagersystemet kan bare sende én justering om gangen, så en justering på tvers av mange paller utløser 40-50 enkeltmeldinger. Lobster samler dem i en database, og en tidsstyrt profil sender én samlet rapport per kunde og lager, på et tidspunkt kunden kan håndtere.

Strømpriser og frysere

Lobster henter strømprisene fra nettet time for time. Ut fra prisen kan frysere slås av og på automatisk, slik at driften reagerer på prissvingninger i sanntid.

Sertifikater fra papir til JSON

Det startet som en løsning én kollega laget: utfylte PDF-er i stedet for håndstemplede papirsertifikater med vannmerke. I dag genererer Lobster sertifikatdata som JSON til en partner som rapporterer digitalt til Fødevarestyrelsen, det danske mattilsynet. Bare to til tre sertifikattyper er fortsatt på papir.

Planlagt, ikke bygget

Bort fra den lokale serveren og ut som API-er

Alt ovenfor er bygget og i drift. Det som følger nå, er retningen videre, ikke noe som er levert.

  • Kundene flyttes bort fra det AS/400-bundne filområdet og over på Lobster: SFTP i Lobster som minimum, HTTP direkte for dem som kan API. Poenget er ikke å avskaffe SFTP, for Lobster snakker nesten enhver protokoll. Poenget er å komme bort fra den lokale serveren.
  • Modellen og rapportene eksponeres som eksterne API-er med Lobsters egen OAuth2-tjeneste og tilgangsstyring i API Manager, slik at kundene selv kan hente dataene sine når de vil.
  • Onboarding via Trading Partner Manager, der partneroppsett, transport og tilganger samles på ett sted, slik at en API-klar kunde blir et oppsettstrinn i stedet for et utviklingsprosjekt.
  • Ikke alle kunder trenger eller har kapasitet til full EDI-integrasjon. Visjonen er en WebEDI-portal for de mindre, der ordre- og lagerdata vises i nettleseren uten EDI-oppsett.

Løsningen var fra starten tenkt for flere lagre og flere land, med kundene holdt atskilt som en del av selve strukturen, ikke som et tillegg. Hvert oppkjøp i konsernet kommer med sine egne systemer og sin egen utgave av AS/400, akkurat som Danmark gjorde. Mønsteret herfra er ikke en dansk løsning, men en gjenbrukbar tegning for det neste oppkjøpet.

Har dere et lignende landskap med mange kunder, mange formater og kunnskap som sitter hos noen få personer? Da er en felles datamodell ofte det første steget.

Book en samtale om integrasjonene deres
Spørsmål

Ofte stilte spørsmål om caset

Hva er en kanonisk datamodell (CDM)?

Ett felles internt format per meldingstype, f.eks. én måte å beskrive en ordre på, som alle kundeformater oversettes til, og som lagersystemets format oversettes fra. Den definerer hvilke felter som minst må være med for at en kunde i det hele tatt kan kobles på. Fordelen er at hver kunde bare må mappes én gang, og at ingenting nedstrøms trenger å kjenne den enkelte kundes særegenheter. På engelsk heter det canonical data model, forkortet CDM. Det må ikke forveksles med Microsofts Common Data Model, som er noe annet.

Hvorfor ikke bare mappe hver kunde direkte til lagersystemet?

Fordi antallet koblinger da vokser med hver kombinasjon av kunde og system, og fordi hver kundes særegenheter havner i koden som skriver til lagersystemet. Det var nettopp utgangspunktet hos Constellation: hver ny kunde betydde at alt måtte bygges på nytt. Med modellen i midten er en ny kunde én mapping, og et bytte av lagersystem rører ikke kundene.

Kan samme tilnærming brukes utenfor kjølelagre?

Ja. Mønsteret er det samme enten det er et lager, et ERP-system eller en nettbutikk i den ene enden: kundeformat, felles modell, systemformat. Det som er spesielt for kjølelagre og mat, er sporbarheten på pall- og kollinivå, og den er bygget inn i modellen som gjenbrukbare felter i stedet for som regler i hver flyt.

Hva skjer med kundekoblingene hvis lagersystemet byttes?

Ingenting. Kundene snakker bare med den kanoniske modellen, så et nytt lagersystem betyr en ny mapping fra modellen til det nye systemet, mens alle kundekoblingene står urørt. Et ekstra lagersystem, f.eks. fra et oppkjøp, er et tillegg, ikke en migrering.

Skal integrasjonene deres bygges på én modell?

Vi går gjerne gjennom hvordan en kanonisk datamodell ville sett ut hos dere, og hva den ville betydd for onboarding av nye partnere.

Kontakt SublimTech