Sist endret: 29. okt. 2026
Preview: Dette er dokumentasjonen for Altinn Studio v9, som er en forhåndsversjon. Gjeldende versjon er v8. For å se dokumentasjonen for gjeldende versjon, velg v8 i versjonsvelgeren i menyen til venstre.

Fiks Arkiv

Slik setter du opp Fiks Arkiv som systemoppgave i appen din.

I v9 er Fiks Arkiv en systemoppgave. Du legger den til som et steg i prosessen (process.bpmn), og appen sender arkivmeldingen når prosessen kommer til steget. Oppgaven venter selv på svaret fra arkivet, så du trenger ikke lenger en tilbakemeldingsoppgave etter den. Når svaret har kommet, går prosessen alltid videre: en eksklusiv gateway rett etter oppgaven skiller en bekreftet arkivering fra en avvist, og appen nekter å starte uten den.

Fiks Arkiv ligger i en egen NuGet-pakke, Altinn.App.Clients.Fiks, som du legger til i appen. Det skiller den fra PDF og eFormidling, som følger med Altinn.App.Core.

Bruk samme versjon av Altinn.App.Clients.Fiks som av Altinn.App.Core og Altinn.App.Api. Kommer du fra v8, finner du endringene under Kommer du fra v8?.

Forutsetninger

Før du setter opp Fiks Arkiv i appen, må du ha dette på plass:

  • Fiks Protokoll aktivert i Fiks forvaltningsportalen for organisasjonen din.
  • Tilgang i Samarbeidsportalen til å administrere Maskinporten-klienter for organisasjonen din. Altinn Studio bruker denne tilgangen når du logger inn med Ansattporten og legger Maskinporten-scopes til appen.
  • Et arkivsystem som er integrert med Fiks Arkiv.

Slik fungerer oppgaven

fiks-arkiv-flyt.png
Prinsippet for meldingsutveksling gjennom Fiks Arkiv. Fagsystemet i skissen er i dette tilfellet en Altinn-app.
Kilde: KS Digital

Plattformen kjører oppgaven på serveren som tjenesteeier når prosessen kommer til steget. Oppgaven er delt i to: et arbeidssteg som sender arkivmeldingen, og en postkasse som tar imot svarene fra arkivet. Mekanismen er den samme som for andre systemoppgaver med flere steg.

sequenceDiagram autonumber participant Bruker participant App as Altinn-app participant FiksIO as Fiks IO participant Arkiv as Arkivsystem Bruker->>App: Sender inn skjemaet App->>App: Lager arkivmelding.xml og dokumentene,
og lagrer arkivmeldingen på instansen App->>App: Åpner en postkasse med frist på 7 døgn App->>FiksIO: arkivmelding.opprett
klientKorrelasjonsId = postkassens id FiksIO->>Arkiv: Leverer meldingen Arkiv-->>FiksIO: arkivmelding.opprett.mottatt FiksIO-->>App: Mottaksbekreftelse, oppgaven venter videre Arkiv-->>FiksIO: arkivmelding.opprett.kvittering FiksIO-->>App: Kvittering App->>App: Lagrer kvitteringen på instansen
og flytter prosessen videre App-->>Bruker: Neste steg vises

Slik går det steg for steg:

  1. Appen sender. Arbeidssteget henter mottakeren, lager arkivmelding.xml med hoveddokument og vedlegg fra instansdataene, og lagrer arkivmeldingen på instansen som datatypen i Receipt.ArchiveRecord. Så åpner det en postkasse og sender meldingen til mottakerkontoen gjennom Fiks IO. Postkassens id følger med som klientKorrelasjonsId, og det er den som gjør at svaret finner tilbake til riktig oppgave. Feiler noe underveis, prøver plattformen steget på nytt med samme innhold.
  2. Arkivet svarer. Arkivsystemet sender først en mottaksbekreftelse (arkivmelding.opprett.mottatt) og deretter en kvittering (arkivmelding.opprett.kvittering) når saken er opprettet. Kan det ikke opprette saken, sender det en feilmelding i stedet.
  3. Lytteren sender svaret videre. Appen lytter på Fiks IO-kontoen sin, leser klientKorrelasjonsId fra hver melding og leverer den til postkassen som venter. Meldinger uten korrelasjons-id blir logget og forkastet, siden ingen oppgave venter på dem.
  4. Oppgaven konkluderer. Mottaksbekreftelsen holder oppgaven ventende. Kvitteringen lagres på instansen som datatypen i Receipt.ConfirmationRecord, instansen markeres som fullført med mindre du har slått det av, og prosessen går videre med handlingen i SuccessHandling.Action, som standard uten handling. En feilmelding fra arkivet sender prosessen videre med handlingen i ErrorHandling.Action, som standard reject. Gatewayen etter oppgaven skiller de to veiene. Kommer det ingen kvittering på 7 døgn, feiler oppgaven.

Mens oppgaven venter, ser brukeren lastevisningen. Ingen bruker eller tjenesteeier trenger å gjøre noe, og ingenting spør arkivet om status. Se Hva brukeren ser mens en systemoppgave kjører for hvordan du tilpasser ventingen og feilsiden.

Sette opp Fiks Arkiv i appen

Steg 1: Legg til Maskinporten-scopes i Altinn Studio

Legg til dette scopet på appen i Altinn Studio:

  • ks:fiks

Fiks IO-klienten bruker appens innebygde Maskinporten-klient til å autentisere seg mot Fiks med dette scopet. Tjenesteeier-scopene mot Altinn-plattformen har alle v9-apper allerede, så dem trenger du ikke legge til. Når appen publiseres, oppretter Altinn Studio Maskinporten-klienten og legger innstillingene inn i appen.

Se Legge til scopes i Altinn Studio for fremgangsmåten.

Steg 2: Opprett en Fiks Arkiv-konto

Svarene fra arkivet leveres til kontoen som sendte meldingen. Deler flere apper én konto, kan lytteren i én app plukke opp svar som hører til en annen. Sett derfor opp én konto per Altinn-app.
  • Generer et x509-sertifikat for Fiks Arkiv-kryptering.

    Formatkrav:

    • Offentlig del: PEM-fil, som du laster opp i Fiks Forvaltning.
    • Privat del: PEM-formatert streng, base64-kodet, som du legger inn som en secret for Altinn-appen.

    Bruk det verktøyet du foretrekker for å generere sertifikatet. En veiledning ligger nederst i dette steget.

  • Sett opp et nytt system under Fiks Protokoll for organisasjonen din i Fiks Forvaltning. Se KS Digitals veiledning for systemoppsett.

  • Opprett en konto knyttet til dette systemet. Se KS Digitals veiledning for kontooppsett.

    Kontoen skal ha disse egenskapene:

    EgenskapVerdi
    Protokolltypeno.ks.fiks.arkiv
    Versjonv1
    Protokollparterklient.arkivering / klient.full*

    * Bruk klient.arkivering med mindre kontoen skal brukes til andre oppgaver også.

  • Ta vare på disse verdiene til oppsettet av appen:

    • Integrasjons-ID og passord for Fiks-systemet Skjermbilde som viser hvor du finner systemkonfigurasjonsverdiene i Fiks Forvaltning
    • Konto-ID for Fiks-kontoen Skjermbilde som viser hvor du finner kontokonfigurasjonsverdiene i Fiks Forvaltning
    • Privat del av x509-sertifikatet som en base64-streng

Forutsetninger

  • OpenSSL installert på maskinen din.
    Et raskt Google-søk vil peke deg til installasjonsanvisninger for ditt operativsystem.
  1. Generer SSL-sertifikat og privatnøkkel

    Åpne en konsoll der openssl er tilgjengelig, naviger til en passende katalog, og kjør kommandoen:

    openssl req -x509 -newkey rsa:2048 -nodes -keyout private.pem -out public.pem -days 720
    

    Forklaring av flagg

    • req -x509: Generer et X.509-sertifikat.
    • -newkey rsa:2048: Opprett en ny RSA-nøkkel med 2048-bit kryptering.
    • -nodes: Ikke krypter privatnøkkelen.
    • -keyout private.pem: Skriv privatnøkkel til private.pem.
    • -out public.pem: Skriv sertifikat til public.pem.
    • -days 720: Gyldig i 720 dager.

    Svar på eventuelle spørsmål med verdier som representerer din organisasjon, eller la dem stå tomme hvis du foretrekker det.

    Resultat: To filer vil bli opprettet i katalogen:

    • public.pem (sertifikat)
    • private.pem (privatnøkkel)
  2. Base64-kode privatnøkkelen

    Windows

    Bruk certutil til å kode privatnøkkelen:

    certutil -encode -f "private.pem" "privatebase64.txt"
    

    Dette genererer en fil privatebase64.txt som inneholder privatnøkkelen som en Base64-kodet streng.

    Linux / macOS Bruk base64-kommandoen:

    base64 private.pem > privatebase64.txt
    

    Dette oppretter privatebase64.txt med den Base64-kodede privatnøkkelen.

Merknader

  • Hold privatnøkkelen din sikker. Ikke del private.pem eller dens Base64-representasjon offentlig.
  • Det genererte sertifikatet (public.pem) kan distribueres etter behov.

Feilsøking

  • OpenSSL ikke funnet: Sørg for at det er installert og lagt til i system-PATH.
  • Tillatelsesproblem: Kjør kommandoene med passende rettigheter eller i en katalog der du har skrivetilgang.
  • Ugyldig Base64-utdata: Bekreft at den opprinnelige filen eksisterer og er lesbar før koding.

Steg 3: Legg til pakken og registrer tjenestene

Legg til en referanse til NuGet-pakken Altinn.App.Clients.Fiks i prosjektfilen. Bruk samme versjon som for Altinn.App.Core og Altinn.App.Api.

App/App.csproj
<PackageReference Include="Altinn.App.Api" Version="9.0.0">
  <CopyToOutputDirectory>lib\$(TargetFramework)\*.xml</CopyToOutputDirectory>
</PackageReference>
<PackageReference Include="Altinn.App.Core" Version="9.0.0" />
<PackageReference Include="Altinn.App.Clients.Fiks" Version="9.0.0" />

Registrer så Fiks Arkiv-tjenestene og pek dem til konfigurasjonsseksjonene dine i RegisterCustomAppServices i Program.cs:

App/Program.cs
void RegisterCustomAppServices(IServiceCollection services, IConfiguration config, IWebHostEnvironment env)
{
    services
        .AddFiksArkiv()
        .WithFiksIOConfig("FiksIOSettings")
        .WithFiksArkivConfig("FiksArkivSettings");
}

Utvidelsesmetodene ligger i navnerommet Altinn.App.Clients.Fiks.Extensions, så husk using for dette.

AddFiksArkiv() registrerer alt oppgaven trenger: Fiks IO-klienten, lytteren som tar imot svar, generatoren som lager arkivmeldingen, og selve systemoppgaven. Fiks IO-klienten bruker appens innebygde Maskinporten-klient og trenger ingen egen Maskinporten-konfigurasjon. Du velger selv navnene på konfigurasjonsseksjonene, men de må stemme med seksjonsnavnene du bruker i appsettings.json og i Key Vault.

Steg 4: Legg til oppgaven i prosessen

Legg oppgaven inn i process.bpmn som en bpmn:serviceTask med oppgavetypen fiksArkiv, og legg en eksklusiv gateway rett etter den. Oppgaven går alltid videre når arkiveringen er avgjort: med handlingen i SuccessHandling.Action når arkivet har bekreftet saken, og med handlingen i ErrorHandling.Action, som standard reject, når arkiveringen ikke kan lykkes. Gatewayen er der de to veiene skiller lag, og appen nekter å starte hvis oppgaven ikke er fulgt av en gateway med minst to utganger. Plasser oppgaven etter oppgaven som lager dataene du vil arkivere, vanligvis etter PDF-oppgaven, og ikke legg en tilbakemeldingsoppgave etter den.

Merk: Du kan ennå ikke dra en Fiks Arkiv-oppgave direkte inn i Prosess-editoren i Altinn Studio. Inntil videre anbefaler vi denne fremgangsmåten:

  1. Dra en vanlig dataoppgave inn i Prosess-editoren.
  2. Del endringene i Studio.
  3. Rediger process.bpmn på din egen maskin.
  4. Gjør dataoppgaven om til en bpmn:serviceTask (se eksemplet nedenfor).

Slik sikrer du at sekvensflytene og diagrammet holder seg korrekte.

App/config/process/process.bpmn
<bpmn:serviceTask id="Task_FiksArkiv" name="Fiks Arkiv">
  <bpmn:extensionElements>
    <altinn:taskExtension>
      <altinn:taskType>fiksArkiv</altinn:taskType>
    </altinn:taskExtension>
  </bpmn:extensionElements>
  <bpmn:incoming>Flow_2</bpmn:incoming>
  <bpmn:outgoing>Flow_3</bpmn:outgoing>
</bpmn:serviceTask>
<bpmn:sequenceFlow id="Flow_3" sourceRef="Task_FiksArkiv" targetRef="Gateway_FiksArkiv" />
<bpmn:exclusiveGateway id="Gateway_FiksArkiv">
  <bpmn:incoming>Flow_3</bpmn:incoming>
  <bpmn:outgoing>Flow_4</bpmn:outgoing>
  <bpmn:outgoing>Flow_5</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_4" sourceRef="Gateway_FiksArkiv" targetRef="EndEvent_1">
  <bpmn:conditionExpression>["notEquals", ["gatewayAction"], "reject"]</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_5" sourceRef="Gateway_FiksArkiv" targetRef="Task_Oppfolging">
  <bpmn:conditionExpression>["equals", ["gatewayAction"], "reject"]</bpmn:conditionExpression>
</bpmn:sequenceFlow>

Flow_4 tas når handlingen ikke er reject. Med standardinnstillingene betyr det at arkivet har bekreftet saken. Flow_5 tas når handlingen er reject, og fører her til en oppgave der noen kan følge opp saken. Hva den oppgaven gjør, bestemmer du. Endrer du SuccessHandling.Action eller ErrorHandling.Action, må uttrykkene i gatewayen endres tilsvarende. All konfigurasjon av selve meldingen ligger i appsettings.json, ikke i prosessen. Se flytkontroll for mer om gatewayer og gatewayAction.

Steg 5: Gi tjenesteeieren tilgang

Plattformen flytter prosessen ut av oppgaven som tjenesteeier. Oppgavetypen fiksArkiv krever handlingen write, som tilgangsfilen fra appmalen allerede gir tjenesteeieren. Fordi oppgaven går videre med reject når arkiveringen ikke kan lykkes, trenger tjenesteeieren reject i tillegg. Se Gi tilgang til oppgaven for regelen og hva som skjer når den mangler.

Steg 6: Konfigurer appen

Legg konfigurasjonen i appsettings.json, og legg alle sensitive verdier i Azure Key Vault i stedet for å sjekke dem inn. Appen må ha Key Vault som konfigurasjonskilde. Se siden om hemmeligheter for hvordan du setter det opp. Endrer du hemmelighetene for Fiks IO i Key Vault etter publisering, henter appen de nye verdiene innen fem minutter og kobler seg til Fiks IO på nytt. Du trenger ikke publisere appen på nytt.

InnstillingBeskrivelse
AccountIdKonto-ID for Fiks IO-kontoen appen sender fra.
IntegrationIdIntegrasjons-ID for Fiks-systemet.
IntegrationPasswordPassordet for integrasjonen.
AccountPrivateKeyBase64Privatnøkkelen til kontoen, som base64-kodet PEM med topp- og bunntekst. Brukes til autentisering og til å dekryptere svarene fra arkivet.
ApiHostNødbrems for adressen til Fiks IO sitt API. Trengs ikke i vanlig bruk, se under.
AmqpHostNødbrems for adressen til Fiks IO sin meldingskanal. Trengs ikke i vanlig bruk, se under.

Legg IntegrationPassword og AccountPrivateKeyBase64 i Key Vault. ApiHost og AmqpHost lar du stå tomme: appen velger selv KS sitt testmiljø overalt utenom produksjon, også når du kjører lokalt, og KS sitt produksjonsmiljø i produksjon. De to innstillingene finnes bare i tilfelle KS skulle endre adressene sine før appen er oppdatert.

Skal du prøve en innsending fra en app som kjører lokalt, må du først sette opp en Maskinporten-klient og koble den til appen din. Du finner utdypende instruksjoner i her: Integrere Altinn-app med Maskinporten. Husk scopet ks:fiks.

App/appsettings.json
"FiksIOSettings": {
  "AccountId": "c3c87fac-06be-44ed-a11c-aa137d12863c",
  "IntegrationId": "08b3d8b9-5026-46dc-936c-8e6709efa72c",
  "IntegrationPassword": "hentes fra Key Vault",
  "AccountPrivateKeyBase64": "hentes fra Key Vault"
}

Key Vault-secrets:

  • FiksIOSettings--IntegrationPassword
  • FiksIOSettings--AccountPrivateKeyBase64

Overordnet struktur

FiksArkivSettings
├─ Receipt
│  ├─ ConfirmationRecord
│  └─ ArchiveRecord
├─ Recipient
│  ├─ FiksAccount
│  ├─ Identifier
│  ├─ Name
│  └─ OrganizationNumber
├─ Metadata
│  ├─ SystemId
│  ├─ RuleId
│  ├─ CaseFileId
│  ├─ CaseFileTitle
│  ├─ JournalEntryTitle
│  ├─ CaseFileAdministrativeUnit
│  └─ CaseFileClassifications[]
├─ Documents
│  ├─ PrimaryDocument
│  └─ Attachments[]
├─ ErrorHandling
│  └─ Action
└─ SuccessHandling
   ├─ Action
   └─ MarkInstanceComplete

Nedenfor går vi gjennom hver seksjon, viser hvordan du oppgir verdier (fast eller fra datamodellen), og gir eksempler på appsettings.json.

Innstillingene er dokumentert etter beste evne, men koden kan endre seg. Trenger du den nøyaktige listen, se kildekoden.

Receipt

Datatypene appen lagrer arkivmeldingen og kvitteringen i. Begge er påkrevd.

Datatypene må finnes i applicationmetadata.json, og appen må kunne skrive til dem.

Begge oppgis som { "DataType": "…", "Filename": "…" }.

InnstillingFormål
ArchiveRecordDatatypen og filnavnet for arkivmeldingen. Lagres når meldingen sendes.
ConfirmationRecordDatatypen og filnavnet for arkivkvitteringen. Lagres når kvitteringen kommer, før prosessen går videre.
App/appsettings.json
"FiksArkivSettings": {
  "Receipt": {
    "ArchiveRecord": {
      "DataType": "fiks-archive-record",
      "Filename": "Arkivmelding.xml"
    },
    "ConfirmationRecord": {
      "DataType": "fiks-receipt",
      "Filename": "Arkivkvittering.xml"
    }
  }
}
App/config/applicationmetadata.json
{
  "dataTypes": [
    {
      "id": "fiks-archive-record",
      "allowedContributors": ["app:owned"],
      "maxCount": 1,
      "minCount": 0,
      "enableFileScan": false,
      "validationErrorOnPendingFileScan": false
    },
    {
      "id": "fiks-receipt",
      "allowedContributors": ["app:owned"],
      "maxCount": 1,
      "minCount": 0,
      "enableFileScan": false,
      "validationErrorOnPendingFileScan": false
    }
  ]
}

Recipient

Hvem som skal motta arkivmeldingen.

InnstillingFormålType
FiksAccountKonto-ID-en (GUID) til mottakerkontoen meldingen sendes til.GUID (påkrevd)
IdentifierIdentifikator for mottakeren, for eksempel kommunenummer.string (påkrevd)
NameNavnet på mottakeren.string (påkrevd)
OrganizationNumberOrganisasjonsnummeret til mottakeren.string (valgfri)

Alle verdiene kan være faste eller hentes fra datamodellen. Se Slik oppgir du verdier, og bruk DataModelBinding når mottakeren varierer fra instans til instans.

App/appsettings.json
"FiksArkivSettings": {
  "Recipient": {
    "FiksAccount": {
      "DataModelBinding": { "DataType": "HelperDataModel", "Field": "Recipient.AccountId" }
    },
    "Identifier": {
      "DataModelBinding": { "DataType": "HelperDataModel", "Field": "Recipient.Identifier" }
    },
    "Name": {
      "DataModelBinding": { "DataType": "HelperDataModel", "Field": "Recipient.Name" }
    },
    "OrganizationNumber": {
      "DataModelBinding": { "DataType": "HelperDataModel", "Field": "Recipient.OrgNumber" }
    }
  }
}

Metadata

Informasjon arkivsystemet bruker til å plassere saken.

InnstillingFormål og standardverdi
SystemIdSystem-ID i den genererte arkivmelding.xml. Standard: Altinn Studio.
RuleIdRegel-ID for behandling av meldingen i arkivsystemer som støtter regler. Utelatt hvis den ikke er satt.
CaseFileIdID for saksmappen (saksmappe). Standard: instans-ID-en.
CaseFileTitleTittel på saksmappen. Standard: apptittelen.
JournalEntryTitleTittel på journalposten (journalpost). Standard: apptittelen.
CaseFileAdministrativeUnitAdministrativ enhet (administrativEnhet) på saksmappen. Standard: org-koden til appeieren.
CaseFileClassificationsKlassifikasjoner (klassifikasjon) på saksmappen, i den rekkefølgen du lister dem. Ingen som standard.

Alle verdiene unntatt CaseFileClassifications kan være faste eller hentes fra datamodellen.

Klassifikasjoner. Hver oppføring i CaseFileClassifications er én av to ting:

  • { "Source": "InstanceOwner" } legger på eieren av instansen. En organisasjon klassifiseres med organisasjonsnummeret sitt i systemet ORGNR, en person med fødselsnummeret sitt i systemet PNR. Tittelen er navnet fra registeret. Eieren er den saken gjelder, uavhengig av hvem som sendte inn skjemaet.
  • En egen klassifikasjon med SystemId, ClassificationId og Title. Alle tre er påkrevd.

IsRestricted kan settes på begge typene og gir erSkjermet i XML-en. Utelater du CaseFileClassifications, får saksmappen ingen klassifikasjoner. Skal appen fortsette å klassifisere på eieren slik den gjorde i v8, må du legge inn InstanceOwner-oppføringen selv.

App/appsettings.json
"FiksArkivSettings": {
  "Metadata": {
    "CaseFileTitle": {
      "DataModelBinding": { "DataType": "HelperDataModel", "Field": "CaseFileTitle" }
    },
    "JournalEntryTitle": {
      "Value": "Søknad om skjenkebevilling"
    },
    "CaseFileAdministrativeUnit": {
      "Value": "Næringsavdelingen"
    },
    "CaseFileClassifications": [
      { "Source": "InstanceOwner" },
      { "SystemId": "Fagklasse", "ClassificationId": "U63", "Title": "Skjenkebevilling" },
      { "SystemId": "Tilleggsklasse", "ClassificationId": "&18", "Title": "Unntatt offentlighet", "IsRestricted": true }
    ]
  }
}

Documents

Dokumentene som sendes med arkivmeldingen.

InnstillingFormål
PrimaryDocumentHoveddokumentet, for eksempel skjemadataene eller PDF-en. Sendes som Hoveddokument.
AttachmentsVedlegg. Sendes som Vedlegg. Alle dataelementer av datatypen blir med.

Hvert dokument har disse innstillingene:

InnstillingFormål og standardverdi
DataTypeDatatypen i applicationmetadata.json. Påkrevd.
FilenameFilnavnet dokumentet får i arkivmeldingen. Standard: filnavnet på dataelementet, ellers datatypen med filendelse.
FormatFormatkode (dokumentobjekt.format), for eksempel PDF/A. Standard: filendelsen.
VariantVariantformat (dokumentobjekt.variantformat), for eksempel A for arkivformat eller P for produksjonsformat. Utelatt hvis det ikke er satt.

Format og Variant oppgis som { "Code": "…", "Description": "…" }, der Description er valgfri. Spør arkivet ditt hvilke koder det forventer.

App/appsettings.json
"FiksArkivSettings": {
  "Documents": {
    "PrimaryDocument": {
      "DataType": "ref-data-as-pdf",
      "Filename": "Soknad.pdf",
      "Format": { "Code": "PDF/A" },
      "Variant": { "Code": "A", "Description": "Arkivformat" }
    },
    "Attachments": [
      { "DataType": "DataModel" },
      { "DataType": "vedlegg" }
    ]
  }
}

SuccessHandling

Hva oppgaven gjør når arkivet har bekreftet saken med en kvittering. Innstillingene gjelder altså ikke når meldingen er sendt, men når kvitteringen har kommet. Prosessen går alltid videre; innstillingene bestemmer hvordan.

InnstillingFormål og standardverdi
ActionHandlingen prosessen går videre med. Standard: ingen. Gatewayen i eksempelet over tar da Flow_4.
MarkInstanceCompleteOm instansen skal markeres som fullført. Skjer før prosessen går videre. Standard: true.

Seksjonen kan utelates. Da markeres instansen som fullført, og prosessen går videre uten handling. Gatewayen i eksempelet over tar da Flow_4. Sett MarkInstanceComplete til false hvis instansen skal holdes åpen etter arkiveringen, og Action hvis gatewayen skal skille på en egen handling. Slik ser standardverdiene ut, skrevet ut:

App/appsettings.json
"FiksArkivSettings": {
  "SuccessHandling": {
    "Action": null,
    "MarkInstanceComplete": true
  }
}

ErrorHandling

Hva oppgaven gjør når arkiveringen ikke kan lykkes for denne saken: arkivet avviser meldingen, eller mottakerkontoen finnes ikke. Prosessen går videre med handlingen i Action, og gatewayen etter oppgaven avgjør hvor den går. Andre feil er ikke omfattet, se Når noe går galt.

InnstillingFormål og standardverdi
ActionHandlingen prosessen går videre med når arkiveringen ikke kan lykkes. Standard: reject.
En avvist arkivering feiler ikke oppgaven. Prosessen tar reject-veien ut av gatewayen, og det er oppgaven du har lagt der som avgjør hva som skjer med saken videre. Mangler gatewayen, nekter appen å starte.

Seksjonen kan utelates. Da går prosessen videre med reject. Sett Action bare hvis gatewayen din skal skille på en annen handling. Slik ser standardverdien ut, skrevet ut:

App/appsettings.json
"FiksArkivSettings": {
  "ErrorHandling": {
    "Action": "reject"
  }
}

Slik oppgir du verdier

Innstillingene under Recipient og Metadata kan oppgis på to måter:

  1. Fast verdi

    App/appsettings.json
    "JournalEntryTitle": {
      "Value": "Søknad om skjenkebevilling"
    }
    
  2. Verdi fra datamodellen

    App/appsettings.json
    "CaseFileTitle": {
      "DataModelBinding": {
        "DataType": "HelperDataModel",
        "Field": "CaseFileTitle"
      }
    }
    

Bruk Value når du kjenner teksten på forhånd, og DataModelBinding når verdien skal hentes fra dataene i instansen, for eksempel et felt brukeren har fylt ut eller en hjelpemodell appen fyller ut. Field støtter punktnotasjon.

Appen kontrollerer konfigurasjonen ved oppstart

Appen kontrollerer Fiks Arkiv-konfigurasjonen og prosessen når den starter, ikke når den første instansen kommer til oppgaven. Den nekter å starte hvis en Fiks Arkiv-oppgave ikke er fulgt av en eksklusiv gateway med minst to utganger, hvis Receipt, Recipient eller Documents mangler, hvis en datatype ikke finnes i applicationmetadata.json, hvis en DataModelBinding peker til en datatype uten datamodell, eller hvis en klassifikasjon både har Source og egne felt. Feilmeldingen sier hva som er galt.

Praktiske tips

  • Start enkelt. Sett opp Receipt, Recipient og Documents først. Legg til Metadata når du vet hva arkivet ditt trenger.
  • Bruk binding der verdiene varierer. Foretrekk DataModelBinding for felt som er ulike fra instans til instans.
  • Bruk standardverdiene. Utelater du metadatafelt, brukes fornuftige standarder, som apptittelen og instans-ID-en.
  • Avklar klassifikasjoner og formatkoder med arkivet. Arkivet bestemmer hvilke klassifikasjonssystemer og formatkoder det godtar.

Arkivmeldingen appen sender

Standardgeneratoren lager en NOARK 5-arkivmelding med dette innholdet:

  • Saksmappe med tittel, administrativ enhet, saksår og saksdato, en ekstern nøkkel som består av app-ID-en og CaseFileId, og klassifikasjonene du har konfigurert.
  • Journalpost med tittel, journalstatus Journalført og journalposttype Inngående dokument.
  • Korrespondanseparter: mottakeren fra Recipient, med lenken til instansen som referanse, og eieren av instansen som avsender, med navn, person- eller organisasjonsnummer og kontaktinformasjon fra registeret.
  • Dokumentbeskrivelser for hoveddokumentet og hvert vedlegg, med filnavn, format og eventuelt variantformat.
  • system fra SystemId og regel fra RuleId.

Alle datoer og tidspunkter er i UTC og er hentet fra det samme tidspunktet, så en oppgave som prøves på nytt sender samme arkivmelding som første gang. Dekker ikke standardmeldingen behovet ditt, kan du lage din egen.

Overstyre standardatferd

Lage din egen arkivmelding

Implementer IFiksArkivPayloadGenerator og registrer klassen din. Grensesnittet har to metoder: GeneratePayload, som får oppgave-ID, mottaker, meldingstype, referansetidspunktet og tilgang til instansdataene, og returnerer filene som skal sendes, og ValidateConfiguration, som appen kaller ved oppstart med datatypene og prosessoppgavene i appen.

App/Program.cs
services
    .AddFiksArkiv()
    .WithPayloadGenerator<MinArkivmeldingGenerator>();

Bruk referansetidspunktet til alle datoer i meldingen, og les dokumentene gjennom IInstanceDataAccessor du får inn. Da sender en oppgave som prøves på nytt den samme meldingen som første gang.

Reagere på svar fra arkivet

Trenger appen å gjøre noe med svarene fra arkivet, for eksempel kopiere saksnummeret fra kvitteringen inn i skjemadataene, implementerer du IFiksArkivMessageHandler og registrerer klassen din. Oppgaven kaller HandleMessage én gang for hver melding arkivet sender, før den tolker meldingen selv.

App/Program.cs
services
    .AddFiksArkiv()
    .WithMessageHandler<MinMeldingshandterer>();
public class MinMeldingshandterer : IFiksArkivMessageHandler
{
    public Task HandleMessage(FiksArkivReceivedMessage message, ServiceTaskContext context)
    {
        if (message.IsReceipt)
        {
            // Les kvitteringen fra message.Payloads og lagre det du trenger
            // gjennom context.InstanceDataMutator.
        }

        return Task.CompletedTask;
    }
}

Fire ting å vite om handleren:

  • Den kjører inne i prosessovergangen som behandler meldingen. Alt du lagrer gjennom context.InstanceDataMutator, lagres sammen med kvitteringen.
  • Den skal ikke flytte prosessen. Oppgaven gjør det selv etter SuccessHandling og ErrorHandling, og et kall til process/next fra handleren blir avvist.
  • Kaster den en feil, prøver plattformen meldingen på nytt, og oppgaven konkluderer ikke før handleren lykkes.
  • Meldinger kan komme mer enn én gang. Bruk message.MessageId til å oppdage gjentakelser hvis handleren gjør noe som ikke tåler å skje to ganger.

message.IsAcknowledgement, message.IsReceipt og message.IsError sier hva slags melding det er, og message.Payloads inneholder innholdet, ferdig tolket der plattformen kjenner meldingstypen.

Når noe går galt

SituasjonHva oppgaven gjør
Arkivet avviser meldingenProsessen går videre med ErrorHandling.Action, som standard reject, og gatewayen etter oppgaven avgjør veien.
Mottakerkontoen finnes ikkeSamme som når arkivet avviser meldingen.
Fiks IO avviser integrasjons-ID-en eller passordetOppgaven feiler straks. Rett opp verdiene og gjenoppta oppgaven. ErrorHandling brukes ikke, siden ingen handling fra brukeren hjelper.
Midlertidig feil, for eksempel mot Maskinporten eller nettverketPlattformen prøver sendingen på nytt. Gir det seg ikke, feiler oppgaven.
Ingen kvittering på 7 døgnOppgaven feiler. Saken kan likevel være arkivert, så sjekk hos arkivet før du sender på nytt.
Kvitteringen kan ikke lesesOppgaven feiler. Saken er sannsynligvis arkivert, men appen har ingen kvittering å lagre.
Din IFiksArkivMessageHandler kaster en feilMeldingen prøves på nytt til handleren lykkes.

En avvist arkivering feiler altså ikke oppgaven; den er avgjort, og saken går reject-veien ut av gatewayen til oppgaven du har lagt der. Når oppgaven derimot feiler, ser brukeren feilsiden, og feilen dukker opp i overvåkingen med en melding som sier hva som skjedde. En som har handlingen for oppgaven kan gjenoppta den med Prøv igjen, og en reject-flyt gir brukeren mulighet til å gå tilbake. Se Hva brukeren ser mens en systemoppgave kjører.

Kommer du fra v8?

Dette er endret fra v8:

  • Ingen tilbakemeldingsoppgave. Oppgaven venter selv på kvitteringen fra arkivet, og prosessen går først videre når den har kommet. Fjern tilbakemeldingsoppgaven du hadde etter Fiks Arkiv-oppgaven.
  • MoveToNextTask finnes ikke lenger. Oppgaven går alltid videre når arkiveringen er avgjort: med SuccessHandling.Action etter en kvittering, og med ErrorHandling.Action, som standard reject, etter en avvisning. Legg en eksklusiv gateway rett etter oppgaven, og gi tjenesteeieren reject. Appen nekter å starte uten gatewayen.
  • SuccessHandling gjelder når arkivet har bekreftet saken, ikke når meldingen er sendt, og MarkInstanceComplete er true som standard.
  • Fiks IO-klienten bruker appens innebygde Maskinporten-klient. Du peker den ikke lenger til en egen MaskinportenSettings-seksjon.
  • Klassifikasjon av eieren er valgfri. Den legges ikke lenger på automatisk. Legg inn { "Source": "InstanceOwner" } i Metadata.CaseFileClassifications for å beholde den. Systemene heter nå PNR og ORGNR, og eieren av instansen klassifiseres, ikke den som sendte inn.
  • IFiksArkivResponseHandler er erstattet av IFiksArkivMessageHandler, og .WithResponseHandler<T>() av .WithMessageHandler<T>(). Handleren kalles for hver melding arkivet sender, og skal ikke flytte prosessen.
  • IFiksArkivHost er fjernet. Meldinger sendes bare gjennom systemoppgaven.
  • klientKorrelasjonsId er postkassens id, ikke lenken til instansen. Lenken ligger fortsatt i arkivmeldingen, som referansen på mottakerens korrespondansepart.
  • Tidspunktene i arkivmeldingen er i UTC, og dokumentobjekt har ikke lenger en systemID.

studioctl app upgrade v9 legger inn tilgangsreglene tjenesteeieren trenger, fjerner MoveToNextTask fra Fiks Arkiv-konfigurasjonen og sier fra hvis verdien var false eller oppgaven mangler gatewayen. Resten av Fiks Arkiv-konfigurasjonen lar den stå.

Konfigurasjon for mottak av meldinger i arkivsystemet

Digdir leverer verken arkivsystemet eller Fiks Arkiv, så vi har ikke fullstendig dokumentasjon for mottakersiden. Bruk KS Digitals dokumentasjon sammen med dokumentasjonen fra arkivsystemleverandøren. Oppsettet av mottakerkontoen er likevel det samme uansett arkivsystem.

Opprett en Fiks Arkiv-konto for mottak

  1. Sett opp et nytt system under Fiks Protokoll for organisasjonen din.

  2. Opprett en konto knyttet til dette systemet, med disse egenskapene:

    EgenskapVerdi
    Protokolltypeno.ks.fiks.arkiv
    Versjonv1
    Protokollparterarkiv.full

    Gi kontoen et navn som gjenspeiler appen, siden vi anbefaler én konto per Altinn-app.

  3. Se dokumentasjonen for arkivsystemet for krav til krypteringsnøkkelparet.

  4. Under kontoen, gå til fanen Søk etter systemer og slå opp systemet som ble opprettet for å sende meldinger. Gi systemet tillatelse til å sende til mottakerkontoen ved å klikke Gi tilgang. Skjermbilde som viser hvordan du gir et system tilgang fra en Fiks-konto

Ekstern dokumentasjon

Mer om Fiks Arkiv: