Skip to main content

Flyt og automatisering

Flyt brukes når organisasjonen vil styre rapportbehandling med mer presise regler enn "alle rapporter går til samme godkjenner". En flyt er en graf av noder med en trigger, betingelser og handlinger, som kan publiseres, simuleres og spores.

Eksempel: avansert godkjenningsflyt

Eksempel på godkjenningsflyt

Eksempelet over viser en typisk avansert flyt:

  • Triggere: Rapport innsendt og Rapport godkjent
  • Først en Krev godkjenning fra rolle i avdeling (Godkjenner)
  • Hvis ingen godkjennere finnes på avdelingen → fallback til Krev godkjenning fra brukerrolle Administrator
  • Innenfor avdelingen rutes videre til Krev godkjenning fra Nærmeste leder
  • Til slutt Krev godkjenning fra brukerrolle Eier
  • Avsluttes med Fullfør (godkjenn rapporten)

Standard godkjenning (uten flyt)

Hvis ingen flyt er publisert, gjelder standardregelen:

Når en rapport sendes inn, går den til avdelingens leder (AvdelingsRolle = Manager) eller — hvis avdelingen ikke har leder — til alle administratorer.

Du trenger ikke en flyt for grunnleggende godkjenning. Bygg flyt når du vil ha terskler, vilkår, eller automatiske handlinger.

Hva en flyt består av

KonseptBeskrivelse
TriggerHva som starter flyten
NodeEt steg i grafen (handling, betingelse eller forsinkelse)
BetingelseForgrener basert på rapportdata
HandlingNoe systemet gjør
ForsinkelseVent på tid eller hendelse før neste node
Utkast / PublisertEndringer skjer i utkast, blir aktive ved publisering
SporFullstendig spor av en konkret kjøring

Triggere

TriggerNår den fyrer
Rapport innsendtRapporten sendes inn første gang eller på nytt etter avvisning
Rapport godkjentEn godkjenning i flyten besvares positivt

Handlinger

HandlingBeskrivelse
FullførGodkjenn rapporten og avslutt flyten (terminal)
AvvisAvvis rapporten (terminal)
Krev godkjenningSend til godkjenner — én eller flere personer/roller
HTTP-forespørselSend HTTP-kall til ekstern URL (webhook)

Alle veier i grafen må ende i en terminal handling (Fullfør eller Avvis).

Betingelser

Betingelser sammenligner et felt på rapporten med en verdi. Felt angis som dot-path: report.totalAmount, report.departmentId, report.projectId, report.expenseTypeId, report.userId, osv.

Operatorer

OperatorBetydningType
eq, neqLik / uliktall, streng, boolean
gt, gte, lt, lteStørre/mindre enntall, dato
containsInneholder delstrengstreng
startsWith, endsWithStarter/slutter medstreng
inVerdien er i listentall, streng
isNull, isNotNullTomt eller sattalle

Samlingsoperatorer

For felter som inneholder lister (f.eks. utleggslinjer):

OperatorBetydning
ONE_OFMinst ett element matcher
ALLAlle elementer matcher
NONEIngen elementer matcher

Fallbacks

  • Betingelser har en standard-gren (defaultNodeId) som brukes når ingen gren matcher.
  • Krev godkjenning har en Ingen godkjennere-fallback når ingen gyldig godkjenner finnes (f.eks. hvis avdelingsleder er deaktivert) — vist som stiplet linje i editoren.

Forsinkelser

Vent-noden lar flyten pause på tid eller hendelse før neste node. Brukes f.eks. til å sende en påminnelse hvis en godkjenning ikke besvares innen en viss tid.

Krev godkjenning — kriterier

Velg godkjenner ved hjelp av et Godkjennerkriterium:

  • Spesifikk bruker (ID)
  • Rolle i avdeling (f.eks. Avdelingsleder)
  • Rolle i prosjekt
  • Brukerrolle (f.eks. Administrator, Eier)

Konfigurasjonen invalidateOnChange styrer når en eksisterende godkjenning blir ugyldig hvis brukeren endrer rapporten:

VerdiBetyr
amountBeløp endret → godkjenning må gjøres på nytt
departmentIdAvdeling endret → ny godkjenning
projectIdProsjekt endret → ny godkjenning

Bare disse tre feltene støttes i dag.

HTTP-forespørsel (webhook)

Bruk for å varsle eksterne systemer eller integrere med egne backender. HTTP-forespørsel er admin-måten å trigge eksterne kall når noe skjer på en rapport — uten å bygge eget abonnement på hendelsesstrømmen.

For utviklere: Hvis du heller vil lytte på alle hendelser kontinuerlig fra din egen backend, bruk SSE-endepunktet i stedet. Se Sanntid, dypelenker og notifikasjoner.

Konfigurasjon

FeltBeskrivelseGrenser
urlMål-URL (HTTPS)
methodPOST (default), PUT, PATCH
headersCustom headers (auth, content type)
bodyPayload med templating (rapportfelter)
timeoutMaks tid for et kall60 s
maxRetriesAntall forsøk ved 5xx/timeout5
initialDelayMsFørste ventetid mellom forsøk10 000 ms
maxDelayMsTak for eksponentielt backoff60 000 ms

Hvis alle retries feiler kjører flyten videre på error-grenen (eller stopper hvis den ikke har en).

Idempotens

Konsumenten din bør være idempotent — flyten kan re-fyre samme event ved retry, og en rapport kan sendes inn på nytt etter avvisning.

const eventKey = `${event.type}:${event.reportId}:${event.attemptId}`;
if (processed.has(eventKey)) return;
processed.add(eventKey);

Utkast → publisering → simulering

  1. Utkast: rediger fritt — ingen påvirkning på live rapporter.
  2. Test: kjør flyten mot historiske rapporter for å se hva som ville skjedd.
  3. Valider: systemet sjekker at alle veier ender i en terminal handling.
  4. Publiser: flyten blir aktiv (status Aktiv) for nye rapporter.

Versjonering bevares — du kan rulle tilbake til en tidligere publisert versjon i Historikk-fanen.

Spor (audit-trail)

Hver kjøring lagrer et spor: hvilken trigger som fyrte, hvilke noder som ble besøkt, betingelses-evalueringer, handling-resultat, og HTTP-respons (med redactede secrets). Bruk spor til feilsøking. Lagring følger audit-retention; se Sporbarhet, sikkerhet og kontroll.

Eksempler

Auto-godkjenn småbeløp

Trigger: Rapport innsendt
└─ Betingelse: report.totalAmount lt 500
├─ true → Fullfør
└─ false → Krev godkjenning (avdelingsleder) → Fullfør

Strengere kontroll for store beløp

Trigger: Rapport innsendt
└─ Betingelse: report.totalAmount gte 10000
├─ true → Krev godkjenning (avdelingsleder) → Krev godkjenning (CFO) → Fullfør
└─ false → Krev godkjenning (avdelingsleder) → Fullfør

Webhook ved godkjenning

Trigger: Rapport godkjent
└─ HTTP-forespørsel → https://din-tjeneste.no/utleggsappen/approved

Når du bør stoppe opp og teste mer

  • Når samme rapport kan treffe flere regler.
  • Når avdelings- eller lederstruktur er ufullstendig.
  • Når flyten kaller eksterne webhooker.
  • Når du bruker invalidateOnChange på rapporter brukerne ofte endrer.

Se også