← Tilbage til formularer

Flytteformular – Dokumentation

Denne side beskriver det komplette flow for flytteformularen i Modstrøm-appen, inklusiv de tre formflows, deres fields, betingede sektioner og de Bemærkninger som kun fremgår af eksempel-JSON'erne (ikke fra live endpoints).

Adresser i step 1: Kundens adresser/kontrakter hentes via GetAgreements.

Der er tilføjet en ny property: MovingLocked.
Hvis MovingLocked = true, må kunden ikke lave ny flytning på den adresse — adressekortet skal låses og vise teksten: "Flytning behandles" (dvs. kortet er ikke klikbart og datepickeren vises ikke).

1. Overblik – tre formflows

Valg i step 2FormNameFormGuid
Jeg ønsker at fortsætte min aftale hos Modstrøm Flytteblanket - Tilflytning d62e6f71-2299-4e37-8336-fc1c75bb3d3f
Jeg ønsker at opsige min aftale hos Modstrøm Flytteblanket - Fraflytning 47b0bfc4-8194-43e3-9af1-c379814d248b
Jeg er allerede kunde på min nye adresse Flytteblanket - Fraflytning til anden eksist. adresse fbae8332-0e86-4558-8845-90150e953a72

2. GetFormData endpoint

Formdata hentes fra dette endpoint – skift formGuid til det relevante guid:

GET https://dev.modstroem.dk/umbraco/api/ModstroemApp/GetFormData
    ?formGuid=d62e6f71-2299-4e37-8336-fc1c75bb3d3f
MiljøBase URL
Devhttps://dev.modstroem.dk
Testhttps://test.modstroem.dk
Produktionhttps://www.modstroem.dk
Bemærk: Der kan være elementer i JSON'en som ikke skal vises i appen — aftal nærmere med Joakim. Bemærkninger i eksempel-JSON'erne fremgår ikke fra live endpoints.

3. Step 1 – Vælg adresse og fraflytningsdato

Adresserne hentes fra kundens eksisterende aftaler via GetAgreements.

FeltTypeBeskrivelse
fraflytningsadresse Auto Adressen der svarer til den valgte kontrakt. Sendes som hidden felt til det valgte form.
fraflytningsdato Påkrævet Datepicker Brugervalgt fraflytningsdato. Sendes som hidden felt til det valgte form.
kundenummer Auto Kundens nummer som int (fx 591059) — hentes fra den valgte aftale.
kontraktnummer Auto Den valgte kontrakts guid — hentes fra den valgte aftale.
kundetype Default: privat Fast værdi privat (eller erhverv).
product Auto Produkt-guid fra den valgte aftale, hvis relevant. Angivet under DefaultValue i JSON'en.
MovingLocked Ny property Returneres fra GetAgreements. Hvis true: adressekortet låses og er ikke klikbart — vis teksten "Flytning behandles" i stedet for datepickeren. Brugeren kan ikke starte et nyt flytteflow for denne adresse.

4. Flow A – Jeg ønsker at fortsætte min aftale hos Modstrøm

FormGuid: d62e6f71-2299-4e37-8336-fc1c75bb3d3f · Flytteblanket - Tilflytning
Ny adresse – Altid vist
tilflytningsadresse Tilflytningsadresse Påkrævet
Type: adressevaelger — se confluence.kds.dk for opsætning.
BemærkningAdressevælgeren kan opsættes udfra beskrivelse i note-linket i JSON'en.
tilflytningsdato Tilflytningsdato Påkrævet
Type: input[type=date] — Datepicker fra dags dato og 3 måneder frem. Fortid deaktiveres.

Adresse-hidden fields (fra adressevælgeren)

AliasKilde
streetNameGadenavn fra adressevælgeren
houseNumberHusnummer fra adressevælgeren
floorEtage fra adressevælgeren
doorDør fra adressevælgeren
subCityStedbetegnelse fra adressevælgeren
zipCodePostnummer fra adressevælgeren
cityNameBynavn fra adressevælgeren

System hidden fields

AliasBemærkning
kundenummerFra step 1 — kundens nr som int, fx 591059
kontraktnummerFra step 1 — den valgte kontrakts guid
fraflytningsadresseFra step 1 — adressen som den valgte kontrakt har
fraflytningsdatoFra step 1 — den valgte fraflytningsdato
kundetypeDefault: privat
productEvt. produkt-guid angivet under DefaultValue i JSON'en
databowlSIDDefault: 2 — formentlig irrelevant i app
databowlCIDDefault: 2971_TEST — formentlig irrelevant i app
Ejerforhold – Altid vist · Vælg mellem Ejer og Udlejer

Tekst i headeren: "I forbindelse med din fraflytning af adressen [FULLADDRESS], har vi behov for at vide lidt om den nye ejer af adressen." — [FULLADDRESS] erstattes med fraflytningsadressen fra step 1.

ejer Jeg ejer boligen Betinget
Vises når brugeren vælger "Jeg ejer boligen". Udlevering af data forpligter ikke den nye ejer til en bindende aftale.
Vises når: Ejer er valgt
AliasTypeValidering
ejerNametextPåkrævet Ejerens fulde navn
ejerTelefonnumberPåkrævet ^\d{8}$ — 8 cifre
ejerEmailemailPåkrævet Gyldig email
udlejer Jeg bor til leje Betinget
Vises når brugeren vælger "Jeg bor til leje".
Vises når: Udlejer er valgt
udlejerValg Udlejerens type Påkrævet
Radio: Privatperson | Virksomhed
Privatperson
AliasTypeValidering
udlejerNavntextPåkrævet
udlejerTelefonnumberPåkrævet ^\d{8}$
udlejerEmailemailPåkrævet Gyldig email
Virksomhed
AliasTypeValidering
udlejerFirmanavntextPåkrævet
cVRnumberPåkrævet ^\d{8}$ — 8 cifre
udlejerTelefonnumberPåkrævet ^\d{8}$
udlejerEmailemailPåkrævet Gyldig email

5. Flow B – Jeg ønsker at opsige min aftale hos Modstrøm

FormGuid: 47b0bfc4-8194-43e3-9af1-c379814d248b · Flytteblanket - Fraflytning
Tilbud – 500 kr. rabat – Altid vist · Brugeren vælger accept eller afvisning

Viser en banner: "Tag os med på din nye adresse og få 500 kr. rabat på din næste strømregning"

tilbud Tilbud
Radio med to valg:
  • true — Jeg ønsker at acceptere tilbuddet → viser ny adresse + solcellesektion
  • false — Jeg ønsker ikke at acceptere tilbuddet → viser årsag-dropdown
NoteTilbuddet forudsætter at kundeforholdet fortsætter min. 3 mdr. Ophøres det inden da, dannes et gebyr svarende til rabatten.
Vises når: tilbud = true
AliasTypeValidering
tilflytningsadresseadressevaelgerPåkrævet
tilflytningsdatodatePåkrævet Fra dags dato, 3 mdr. frem
streetName … cityNamehiddenAuto Fra adressevælgeren
Vises når: tilbud = false
arsag Årsag Påkrævet
Select-dropdown. Valgmuligheder:
  • Jeg har fundet en udbyder, hvor jeg ikke betaler abonnement
  • Jeg har fundet en udbyder med lavere pris pr. kWh
  • Jeg har fundet en udbyder, hvor jeg ikke skal betale aconto
  • Jeg ønsker at samle flere af mine produkter hos én udbyder (el, TV, internet)
  • Jeg har købt en ladeboks af en anden udbyder
System hidden fields – Altid sendt
AliasBemærkning
kundenummerFra step 1 — kundens nr som int, fx 591059
kontraktnummerFra step 1 — den valgte kontrakts guid
fraflytningsadresseFra step 1 — adressen som den valgte kontrakt har
fraflytningsdatoFra step 1 — den valgte fraflytningsdato
kundetypeDefault: privat
productEvt. produkt-guid — ingen DefaultValue i dette flow
rabatDefault: -500 — beløb inkl. moms. Formentlig irrelevant i app, aftal med Joakim
gclid, utm_source, sideUrlWeb-tracking — formentlig irrelevant i app
Ejerforhold – Altid vist · Samme struktur som Flow A

Identisk struktur som Flow A (Ejer / Udlejer med Privatperson / Virksomhed). Se afsnit 4 ovenfor.

Headertekst: "I forbindelse med din fraflytning af adressen [FULLADDRESS]…" — [FULLADDRESS] erstattes med fraflytningsadressen.

Flow B har en opdateret udlejertekst: "NY TEKST DER DÆKKER PRIVAT PERSON OG VIRKSOMHED" — aftal endelig tekst med Joakim.

6. Flow C – Jeg er allerede kunde på min nye adresse

FormGuid: fbae8332-0e86-4558-8845-90150e953a72 · Flytteblanket - Fraflytning til anden eksist. adresse
Ejerforhold – Altid vist (eneste brugerinteraktion i dette flow)

Flow C har ingen adressevælger og ingen datepicker — tilflytningsadressen er allerede registreret. Brugerens eneste input er ejerforholdet for fraflytningsadressen.

Headertekst: "I forbindelse med din fraflytning af adressen [FULLADDRESS]…"

Struktur identisk med Flow A's ejerforholdssektion. Se afsnit 4.

System hidden fields

AliasBemærkning
kundenummerFra step 1 — kundens nr som int
kontraktnummerFra step 1 — den valgte kontrakts guid
fraflytningsadresseFra step 1 — adressen som den valgte kontrakt har
fraflytningsdatoFra step 1 — den valgte fraflytningsdato
kundetypeDefault: privat
productEvt. produkt-guid — tom DefaultValue i dette flow
gclid, utm_source, sideUrlWeb-tracking — formentlig irrelevant i app

7. Fælles elementer på tværs af flows

Label-felter (ikke brugerinput — vises som informationspaneler)

AliasTitelVist iBemærkning
produktion Har din nye bolig solceller? Flow B (tilbud=true) Informationspanel om produktionsaftale — ingen brugerinput. Vises ikke i Flow A per spec.
energitjek Gratis energibesøg på din nye adresse Flow A (fjernet per spec) Tilbydes normalt til fortsæt-kunder — vises ikke i app per aftale.

Ikoner

BrugURL
Ejer boligen (hus)https://www.modstroem.dk/media/z5hfftho/hus.svg
Bor til leje (lejlighed)https://www.modstroem.dk/media/uwzbswdf/lejlighed.svg
Step 2 – Fortsætte / Opsigehttps://www.modstroem.dk/assets/images/svg/Flytteblanket/heart.svg + heart-hover.svg
Step 2 – Allerede kundehttps://www.modstroem.dk/assets/images/svg/Flytteblanket/hustype.svg + hustype-hover.svg

8. Succes-skærm

Vises efter succesfuld indsendelse for alle tre flows:

Din flytning er registreret
"Vi har modtaget din flytteanmodning, og vi vil behandle den hurtigst muligt. Du vil modtage en bekræftelse via mail, lige så snart vi har behandlet den."

CTA-knap: Tilbage til Aftaler

9. cURL-eksempler – GetFormData

# Flow A – Fortsætte
curl "https://dev.modstroem.dk/umbraco/api/ModstroemApp/GetFormData \
     ?formGuid=d62e6f71-2299-4e37-8336-fc1c75bb3d3f"

# Flow B – Opsige
curl "https://dev.modstroem.dk/umbraco/api/ModstroemApp/GetFormData \
     ?formGuid=47b0bfc4-8194-43e3-9af1-c379814d248b"

# Flow C – Allerede kunde
curl "https://dev.modstroem.dk/umbraco/api/ModstroemApp/GetFormData \
     ?formGuid=fbae8332-0e86-4558-8845-90150e953a72"

10. SubmitForm – indsendelse til endpoint

Når brugeren klikker Send, POSTes data til:

POST {saveUrl}/umbraco/api/ModstroemApp/SubmitForm
Content-Type: application/json

Payload-struktur:

{
  "formGuid": "<det valgte flow's formGuid>",
  "values": {
    "<alias>": "<value>",
    ...
  }
}
Vigtig detalje – ejer/udlejer felter: Backenden forventer to separate booleanske felter, ikke ét kombineret felt. Formularen sender begge og udelader dem der er tomme: Dette styres af C#-koden: bool.Parse(Udlejer) → OwnerType.Udlejer eller OwnerType.Ejer.

Flow A – Fortsætte (ejer-eksempel)

curl -X POST "https://dev.modstroem.dk/umbraco/api/ModstroemApp/SubmitForm" \
  -H "Content-Type: application/json" \
  -d '{
    "formGuid": "d62e6f71-2299-4e37-8336-fc1c75bb3d3f",
    "values": {
      "kundenummer":          "174777",
      "kontraktnummer":       "885162",
      "kundetype":            "privat",
      "fraflytningsadresse":  "Tåsingegade 64 4. tv, 2100 København Ø",
      "fraflytningsdato":     "2026-10-24",
      "product":              "E19F93CC-8A31-4432-AB10-9398C1022444",
      "tilflytningsadresse":  "Egemosevej 40, 4571 Grevinge",
      "tilflytningsdato":     "2026-10-25",
      "streetName":           "Egemosevej",
      "houseNumber":          "40",
      "floor":                "",
      "door":                 "",
      "subCity":              "",
      "zipCode":              "4571",
      "cityName":             "Grevinge",
      "ejer":                 "true",
      "udlejer":              "false",
      "ejerName":             "Hans Hansen",
      "ejerTelefon":          "12345678",
      "ejerEmail":            "hans@example.dk"
    }
  }'

Flow A – Fortsætte (udlejer-eksempel, virksomhed)

curl -X POST "https://dev.modstroem.dk/umbraco/api/ModstroemApp/SubmitForm" \
  -H "Content-Type: application/json" \
  -d '{
    "formGuid": "d62e6f71-2299-4e37-8336-fc1c75bb3d3f",
    "values": {
      "kundenummer":          "174777",
      "kontraktnummer":       "885162",
      "kundetype":            "privat",
      "fraflytningsadresse":  "Tåsingegade 64 4. tv, 2100 København Ø",
      "fraflytningsdato":     "2026-10-24",
      "product":              "E19F93CC-8A31-4432-AB10-9398C1022444",
      "tilflytningsadresse":  "Egemosevej 40, 4571 Grevinge",
      "tilflytningsdato":     "2026-10-25",
      "streetName":           "Egemosevej",
      "houseNumber":          "40",
      "zipCode":              "4571",
      "cityName":             "Grevinge",
      "ejer":                 "false",
      "udlejer":              "true",
      "udlejerValg":          "Virksomhed",
      "udlejerFirmanavn":     "Firma A/S",
      "cVR":                  "12345678",
      "udlejerTelefon":       "87654321",
      "udlejerEmail":         "firma@example.dk"
    }
  }'

Flow B – Opsige (tilbud afvist)

curl -X POST "https://dev.modstroem.dk/umbraco/api/ModstroemApp/SubmitForm" \
  -H "Content-Type: application/json" \
  -d '{
    "formGuid": "47b0bfc4-8194-43e3-9af1-c379814d248b",
    "values": {
      "kundenummer":          "174777",
      "kontraktnummer":       "885162",
      "kundetype":            "privat",
      "fraflytningsadresse":  "Tåsingegade 64 4. tv, 2100 København Ø",
      "fraflytningsdato":     "2026-10-24",
      "rabat":                "-500",
      "tilbud":               "false",
      "arsag":                "Jeg har fundet en udbyder med lavere pris pr. kWh",
      "ejer":                 "true",
      "udlejer":              "false",
      "ejerName":             "Hans Hansen",
      "ejerTelefon":          "12345678",
      "ejerEmail":            "hans@example.dk"
    }
  }'

Flow B – Opsige (tilbud accepteret → tilflytning)

curl -X POST "https://dev.modstroem.dk/umbraco/api/ModstroemApp/SubmitForm" \
  -H "Content-Type: application/json" \
  -d '{
    "formGuid": "47b0bfc4-8194-43e3-9af1-c379814d248b",
    "values": {
      "kundenummer":          "174777",
      "kontraktnummer":       "885162",
      "kundetype":            "privat",
      "fraflytningsadresse":  "Tåsingegade 64 4. tv, 2100 København Ø",
      "fraflytningsdato":     "2026-10-24",
      "rabat":                "-500",
      "tilbud":               "true",
      "tilflytningsadresse":  "Egemosevej 40, 4571 Grevinge",
      "tilflytningsdato":     "2026-10-25",
      "streetName":           "Egemosevej",
      "houseNumber":          "40",
      "zipCode":              "4571",
      "cityName":             "Grevinge",
      "ejer":                 "true",
      "udlejer":              "false",
      "ejerName":             "Hans Hansen",
      "ejerTelefon":          "12345678",
      "ejerEmail":            "hans@example.dk"
    }
  }'

Flow C – Allerede kunde

curl -X POST "https://dev.modstroem.dk/umbraco/api/ModstroemApp/SubmitForm" \
  -H "Content-Type: application/json" \
  -d '{
    "formGuid": "fbae8332-0e86-4558-8845-90150e953a72",
    "values": {
      "kundenummer":          "174777",
      "kontraktnummer":       "885162",
      "kundetype":            "privat",
      "fraflytningsadresse":  "Tåsingegade 64 4. tv, 2100 København Ø",
      "fraflytningsdato":     "2026-10-24",
      "ejer":                 "false",
      "udlejer":              "true",
      "udlejerValg":          "Privatperson",
      "udlejerNavn":          "Hans Hansen",
      "udlejerTelefon":       "12345678",
      "udlejerEmail":         "hans@example.dk"
    }
  }'

JS payload-regler

RegelDetalje
Felter med præfiks (3a-, 3b-, 3c-)Springes over — kun UI-hjælpere, ikke data
Felter i skjulte betingede sektionerSpringes over — f.eks. udlejer-felter når ejer er valgt
Tomme ejer/udlejer-felterSpringes over — kun den satte sendes
CheckboxesSendes som "true" eller "false"
Skjulte radio-inputs (opacity:0 / position:absolute)Springes over — drevet af synlige labels

11. Bygghistorik – prompts brugt til at generere flytteform.html

Nedenstående er de prompts der blev brugt til at generere og iterere på flytteform.html, i kronologisk rækkefølge:

  1. "create new page called: flytteform.html and place link to it in top along with: dokumentation and download example application"
  2. "stop, its an entire new page, which is unrelated to existing pages"
    Præcisering: siden skal bygges fra bunden uden relation til tilmeldingsformularen.
  3. (Upload af 6 filer: Flyttefomular.docx, 3 JSON-filer, adresser.png, formflow.png)
    "setup according to spec in word file. first step is adresse.png, use dummy addresses for options. Add hidden fields for kundetype, kontraktnummer, kundenummer, product. when selecting an address show a datepicker. when clicking Næste show options.png. then get form data from endpoint, differentiate on specified formguids and show flow like shown on formflow.png. The json for each formguid has fields like these, capture values from first step addresses and fill in these hidden fields. build rest of form flow based on elements from json"
  4. "for first form flow, dont show: Alias: produktion, Alias: energitjek — for Opsig din aftale. I cant select name=tilbud"
  5. "still cant click them [tilbud options]. If an icon exists use it like this: add domain https://www.modstroem.dk — and use these images [heart.svg, hustype.svg with hover variants]"
  6. "for option Jeg ønsker at fortsætte — use attached image [hover SVGs from /assets/images/svg/Flytteblanket/]"
    Specificerede de tre billedpar for step 2-kortene med CSS hover-swap effekt.
  7. "use word and jsons, notice the Bemærkninger under elements to create specific dokumentation for flytteformular"
    Resulterede i denne fil: flytning-dokumentation.html.
  8. "could we not prefix fields [hidden fields like h3b-kundenummer] — if needed its okay to create 3 different pages, but I prefer one page"
    Løsning: wrappede hvert step i en <form id="form3x"> og brugte form.querySelector('[name="alias"]') i stedet for getElementById med præfiks.
  9. "in order to submit we have endpoint like this — curl POST SubmitForm — we need to make sure that the fields we send dont have prefixes so they can be picked up in our umbraco form flow"
    Upload af C#-workflow-koden (FlytteblanketMinSideFlow.cs). Resulterede i collectFormValues-funktionen og SubmitForm POST-kaldet.
  10. "adressevaelger CORS error + form submitting to query string instead of endpoint — i dont get any error but when i submit i am returned to first step"
    Fix: tilføjede e.preventDefault() og type="button" på Send-knapperne for at forhindre native form POST.
  11. "i tested this endpoint and it works [curl med ejer:true] — getting 400 Bad Request"
    Fix: backenden forventer to separate booleanske felter (ejer og udlejer) — ikke ét kombineret felt. Tilføjede begge hidden inputs og satte dem korrekt i setupEjerforhold.