Spring til indhold

Grundfast

GuideAdresser

Hvordan ved vi, at leveringsadressen findes, før ordren gemmes?

Et adressefelt med forslag forhindrer de fleste fejl, men det kører i kundens browser, og browseren kan sende hvad som helst. Det sidste tjek hører hjemme på din server, i det øjeblik ordren oprettes. Her er den rækkefølge, der virker: slå det valgte id op, vask det, der er skrevet i hånden, tjek etage og dør, og gem resultatet sammen med ordren.

5 min læsning6 trinOpdateret
På denne side6 trin

Hvorfor tjekke igen på serveren

Adressefeltet i checkout giver kunden forslag fra DAR, og når kunden vælger et, får du adressens id’er med i formularen. Men der er flere veje uden om forslagene: browserens autoudfyld, en indsat adresse, en kunde, der skriver videre efter valget, en ordre fra en app eller et andet system. Og et id, der kommer fra browseren, er bare tekst, indtil din server har set det i registret.

Tjekket bruger ét eller to kald pr. ordre. Det er billigt nok til at køre på hver ordre, men lad være med at kalde ved hvert tastetryk — det er feltets opgave.

Kunden valgte et forslag: slå id’et op

Send kun de to id’er fra feltet med formularen — adgangsadresse_id og adresse_id — og lad serveren hente resten. /v1/adresser med adgangsadresseid giver alle boliger på adressen i ét kald: hver med sin egen UUID, etage, dør, BFE-nummer og kommunekode. Findes id’et ikke, er listen tom.

GET /v1/adresser?adgangsadresseid=0a3f507a-9cb8-…
{
  "antal": 12,
  "side": 1,
  "per_side": 1000,
  "srid": 4326,
  "adresser": [
    {
      "betegnelse": "Jagtvej 37, 2200 København N",
      "adresse_id": "dff92675-2e1d-4f83-8f43-c7a05508da7d",
      "etage": null,
      "doer": null,
      "…": "…"
    },
    {
      "betegnelse": "Jagtvej 37, 1. th, 2200 København N",
      "adresse_id": "0a3f509e-f830-32b8-e044-0003ba298018",
      "adgangsadresse_id": "0a3f507a-9cb8-32b8-e044-0003ba298018",
      "etage": "1",
      "doer": "th",
      "postnr": "2200",
      "kommunekode": "0101",
      "bfe_nummer": 9866621,
      "koordinat": { "lon": 12.5456551, "lat": 55.6917347 }
    }
  ]
}
  1. Et tomt svar (antal: 0) betyder, at id’et ikke findes i adresseindekset. Tjek det live, før du afviser — se nedenfor.

  2. Find den bolig, kunden valgte, ved at sammenligne med adresse_id fra formularen. Har kunden ikke valgt en, og er der flere, så spørg.

  3. En opgang kan have en adresse uden etage og dør ved siden af lejlighederne. Om den er god nok til en levering, er jeres regel.

  4. Tag dem fra dette svar, ikke fra browseren. bfe_nummer er nøglen videre til BBR.

curl -G "https://api.grundfast.dk/v1/adresser" \
  --data-urlencode "adgangsadresseid=0a3f507a-9cb8-32b8-e044-0003ba298018" \
  --data-urlencode "per_side=1000" \
  -H "Authorization: Bearer $GRUNDFAST_API_KEY"

Adresseindekset bag listen opdateres dagligt fra DAR. En adresse, der er oprettet i dag, kan derfor mangle et døgn. Før du afviser et tomt svar, så slå id’et op med /v1/adresse/:uuid, som spørger DAR direkte: 404 betyder, at der ikke findes en gældende adresse med det id. Det svar har ikke BFE-nummeret, så hent det ved næste tjek.

bash
curl "https://api.grundfast.dk/v1/adresse/0a3f509e-f830-32b8-e044-0003ba298018" \
  -H "Authorization: Bearer $GRUNDFAST_API_KEY"

Adressen er skrevet i hånden: vask den

Uden id har du kun teksten. Send den til /v1/datavask/adgangsadresser, som finder de adresser i DAR, der ligner mest, og giver det bedste match en kategori: A er sikkert, B er sandsynligt, C er usikkert, og antal: 0 betyder, at intet ligner. Hvordan formularen reagerer på hver af dem — godkend, spørg “mente du …?” eller afvis — står på Adressevalidering. Her er det, serveren gør bagefter.

Datavasken arbejder på vej, husnummer og postnummer. Har kunden skrevet etage og dør, så tjek dem bagefter mod den adgangsadresse, vasken fandt:

const svar = await gf.datavask('Jagtvej 37, 2200 Kbh N');
if (svar.antal > 0 && svar.kategori === 'A') {
  const { adresser } = await gf.adresser({
    adgangsadresseid: svar.resultater[0]!.adgangsadresse_id,
    etage: '1',
    doer: 'th',
  });
  // Én bolig = etage og dør findes. Tom liste = spørg kunden.
}

Etage og dør sammenlignes præcist

Filtrene på /v1/adresser skelner ikke mellem store og små bogstaver, men “2.” er ikke “2”, og “2. sal” er ikke en etage. Ryd op i kundens tekst, før du sender den, og sæt kun doer med, hvis kunden har skrevet en — ellers kan du få både th og tv tilbage.

Det, der skal gemmes på ordren

FeltHvorfor
adgangsadresse_idDen stabile nøgle til huset eller opgangen. Den bliver ved med at pege på samme sted, også hvis vejen skifter navn.
adresse_idDen konkrete bolig med etage og dør.
betegnelseAdressen, som DAR skrev den, da ordren blev lagt — den tekst, der skal på pakken.
bfe_nummerEjendommen bag adressen. Kan være null, hvis intet jordstykke dækker adressepunktet.
kommunekodeTil alt det, der følger kommunen — ikke postnummeret.
status og tidspunktok, overstyret eller ikke tjekket, og hvornår det blev afgjort.
kundens egen tekstDet, kunden skrev, uændret. Du får brug for den ved en klage.

Gem felterne fra serverens svar, ikke fra formularen. Så kan du senere slå adressen op igen på id og sammenligne uden stavefejl. Gem både postnr og kommunekode som tekst med foranstillet nul.

Når kunden siger, at adressen er rigtig

Et nybyggeri kan være beboet, før adressen står i DAR, og en kunde kan have ret, selv om registret ikke har adressen endnu. Afvis derfor ikke hårdt. Lad kunden bekræfte sin egen tekst, gem ordren med status overstyret og uden id’er, og send den til manuel kontrol. Erstat aldrig kundens tekst med et B- eller C-forslag, som kunden ikke selv har valgt. Kør datavasken igen nogle dage senere: dukker adressen op som et A, kan du sætte id’erne på bagefter.

Når opslaget fejler

  • Stop ikke ordren. Svarer API’et ikke inden for et par sekunder, eller med 5xx, så gem ordren med status ikke tjekket og kør tjekket igen senere. Svar med 5xx og 504 lægges tilbage i kvoten.
  • Tjek formatet først. Et id, der ikke er en UUID, giver 400 — og et 400 tæller som et kald. En simpel kontrol af formatet koster ingenting.
  • 503 fra /v1/adresser betyder, at boligindekset ikke er indlæst. Fald tilbage til /v1/adresse/:uuid for den bolig, kunden valgte.
  • Hold nøglen på serveren. Tjekket kører med en hemmelig nøgle i din backend, aldrig i browseren. Se Godkendelse.

Var denne side nyttig?

Ofte stillede spørgsmål

Nej. Forslagene forhindrer de fleste fejl, men browseren kan sende en hvilken som helst tekst og et hvilket som helst id. Først når serveren har slået id’et op i DAR, ved du, at adressen findes.

Fordi det kommer fra browseren. Hent BFE-nummer og kommunekode fra serverens eget opslag, så kan en manipuleret formular ikke skrive forkerte værdier på ordren.

Et valgt forslag er ét kald. En adresse skrevet i hånden er ét kald til datavask og ét mere, hvis etage og dør skal tjekkes. Svar med serverfejl lægges tilbage i kvoten.

Ja. Listen over boliger på adgangsadressen viser alle etager og døre, og med etage og dør som filtre får du præcis én bolig tilbage, hvis den findes.

Lad kunden bekræfte adressen, gem ordren som overstyret uden id’er og kontrollér den manuelt. Kør vasken igen senere og sæt id’erne på, når adressen er registreret.

Prøv det på rigtige data

En gratis nøgle giver adgang til alle registre med samme svarform. Testnøgler faktureres aldrig, så du kan bygge færdigt, før du skifter til produktion.

Gratis op til 5.000 kald/md · intet kreditkort · data fra Klimadatastyrelsen/Datafordeler, CC BY 4.0

Relateret