Bygge skjemaprefill

Sist endret

January 21, 2025

Denne siden forklarer hvordan du går fram for å bygge din egen skjemaprefill. Med skjemaprefill menes prefill som går ut over det som er standard prefill i skjemaet.

Note

I utgangspunktet er det kun InternInfo som er obligatorisk “blokk” i instansieringsfila. I tillegg vil de aller fleste ha blokka for Kontakt (kontaktperson-info). Blokka for SkjemaData vil finnes for alle som har prefill ut over det som ligger i InternInfo.

Skjema prefill meta

For hver skjemaversjon eksisterer det en skjema prefill meta tabell. Tabellen gir informasjon om hvilke skjemaspesifikke prefill-felter som skjemaet kan inneholde.

Eksempel på skjema prefill meta tabell
Figur 1: Eksempel på skjema prefill meta tabell
Hva hvis skjemaprefill meta mangler?

Ta kontakt med planleggeren for skjemaet på seksjon 821 dersom skjemaet ditt skal inneholde skjemaprefill og meta-tabellen ikke inneholder data.

Metadata beskrivelse

Tabell 1 beskriver feltene i skjemaprefill meta-tabellen.

Tabell 1: Prefill Meta
Meta Forklaring
Komplett sti Refererer til hele stien som brukes for å navigere fra SkjemaData til en spesifikk verdi. Den beskriver nøyaktig plasseringen av dataene i hierarkiet og kan bestå av flere nivåer.
Type Beskriver hvilken datatype feltet kan inneholde.
Min Begrensing (minimum) på datatypen.
Maks Begrensing (makimum) på datatypen.
Obligatorisk Indikerer om feltet er påkrevd for prefill.
Statistikk navn Kan brukes for mapping til statistikkteamenes interne systemer.
Kommentar Eventuelle merknader eller tilleggsinformasjon om feltet.

Hente prefill meta med kode

For å hente ut skjema prefill meta i Python, kan du bruke metoden get_prefill_meta_by_skjema_def i SuvClient. Sørg for at du oppgir riktig RA-nummer, versjon og undersøkelsesnummer.

notebook
client = SuvClient()

output = client.get_prefill_meta_by_skjema_def(
            ra_nummer = 'RA-0666A3',
            versjon = 1,
            undersokelse_nr = '1060'
        )

print(json.dumps(output, indent=4))

Struktur på skjemaprefill

Skjemaprefill kan representeres som en hierarkisk struktur basert på sti_navn. Dette gir en oversikt over hvordan dataene er organisert. Følgende kode viser hvordan du kan vise strukturen med valgfri inkludering av metadata.

notebook
client = SuvClient()

resultat = client.get_prefill_meta_by_skjema_def(
                ra_nummer = 'RA-0666A3',
                versjon = 1,
                undersokelse_nr = '1060'            
)

def build_structure(data, include_metadata=False):
    structure = {}

    for item in data:
        path = item['sti_navn'].split('.') if item['sti_navn'] else [item['navn']]
        current_level = structure

        for part in path:
            if part not in current_level:
                current_level[part] = {"metadata": {}} if include_metadata else {}
            current_level = current_level[part]

        if include_metadata:
            current_level["metadata"]["type"] = item.get("type")
            current_level["metadata"]["kontroll"] = item.get("kontroll")
            current_level["metadata"]["stat_navn"] = item.get("stat_navn")
            current_level["metadata"]["kommentar"] = item.get("kommentar")

    return structure          

result_without_metadata = build_structure(resultat, include_metadata=False)
print(json.dumps(result_without_metadata, indent=4))

Eksempel på output for hierarkisk struktur uten metadata:

{
    "innkjoptElektriskKraft": {},
    "innkjoptElektriskKost": {},
    "GassOgPetroleumKost": {
        "produktTypeBruktId": {},
        "produktTypeBrukt": {},
        "produktEnhet": {}
    },
    "EgneprodEnergiProd": {
        "egenprodEnergiProdTypeID": {},
        "egenprodEnergiProdType": {},
        "egenprodEnergiProdEnhet": {}
    }
}

Lagre prefill data

For å lagre prefill for en enhet bruker du metoden save_prefill_for_enhet i SuvClient. Metoden lagrer skjemaprefill for en spesifikk enhet i utvalget. Beskrivelse av hvordan du henter utvalg finner du på siden Utvalg fra SFU

notebook
client = SuvClient()

output = client.save_prefill_for_enhet(
     ra_nummer = 'RA-0666A3',
     versjon = 1,
     periode_aar = 2024,
     periode_type = 'KVRT',
     periode_nr = 2,
     enhetsident = 'A3TF0018',
     enhetstype = 'FRTK',
     prefill = {
        "innkjoptElektriskKost": 10, 
        "innkjoptElektriskKraft": 20, 
        "GassOgPetroleumKost": [
            {"produktTypeBruktId": "1"},
            {"produktTypeBruktId": "2"}
        ]
    }                  
 )
print(output)    

Tabell 2 viser en beskrivelse av de ulike parameterne i save_prefill_for_enhet

Tabell 2: Beskrivelse av parametere
Parameter Forklaring
RA-nummer RA-nummer for skjemaet.
versjon Skjemaversjon.
periode_aar Årstall for perioden.
periode_type Periode type. Gyldige verdier er AAR, MND, KVRT, UKE
periode_nr Periode nummer
enhetsident Identifikator for enheten
enhetstype Type enhet. Gyldige verdier er FRTK, BEDR, PERS
prefill Prefill-data i gyldig JSON-format.

Validering av prefill data

Validering av skjemaprefill sikrer at dataene oppfyller kravene til struktur og innhold. Dette gjøres automatisk i save_prefill_for_enhet. Feil i valideringen vil føre til at dataene ikke lagres, og det gis en feilmelding. Dersom du ønsker å sjekke om prefill er gyldig før lagring er dette mulig ved hjelp av metoden validate_skjemadata.

notebook
client = SuvClient()

client.validate_skjemadata(      
        ra_nummer = 'RA-0678A3',
        versjon = 2,
        skjemadata = {"antallAnsattePrefill": "10"}
)   

dapla-suv-tools pakken inneholder også metoder for å hente ut lagret prefill og slette prefill. Det er mulig å slette prefill enten på enhetsnivå eller skjemanivå.

Valideringen er basert på JSON Schema.

Warning

Dersom skjemaet blir instansiert med ugyldige prefill data vil skjemaet feile ved instansiering hos Altinn. Skjemaet vil i dette tilfellet bli slettet fra innboksen til oppdragsgiver.

Eksempelkode

Noe demokode ligger i repoet, og kan være ett godt utgangspunkt å kopiere og endre fra.

RA-0678 (Ledige stillinger)

Dette eksemplet viser hvordan du kan bygge skjemaprefill for RA-0678 (Ledige stillinger). Nedenfor ser du hvordan innholdet i SkjemaData blokka er strukturert.

{
    "SkjemaData": {
        "antallAnsattePrefill": {
            "type": "string"
        },
        "datoPrefill": {
            "type": "string"
        }
    }
}

Skjemaet inneholder to felter som skal forhåndsutfylles. Det er antallAnsattePrefill og datoPrefill.

Tabell 3 beskriver feltene som kan forhåndsutfylles.

Tabell 3: Prefill felter
Felt Sti
antallAnsattePrefill -
datoPrefill -

Eksempelet leser prefill-data fra en tekstfil og bygger den nødvendige strukturen for å forhåndsutfylle skjemaet for utvalgte enheter.

RA-0692 (Utenrikshandel med tjenester)

Dette eksemplet viser hvordan du kan bygge skjemaprefill for RA-0692 (Utenrikshandel med tjenester). Nedenfor ser du hvordan innholdet i SkjemaData blokka er strukturert.

{
   "SkjemaData": {
        "type": "object",
        "properties": {
            "leveransetype": {
                "type": "string",
                "enum": [
                    "0",
                    "1",
                    "2"
                  ]
            },
            "Eksport": {
                "type": "array",
                "items": {
                    "$ref": "#/$defs/Eksport"                
              }
            },
            "Import": {
                "type": "array",
                "items": {
                    "$ref": "#/$defs/Import"
            }
        }
    },   
    "Eksport": {
        "type": "object",
        "properties": {
            "cpaLevel1Eksport": {
                "type": "string"        
            },
            "cpaEksport": {
                "type": "string"
            },
            "PostEksport": {
                "type": "array",
                "items": {
                    "$ref": "#/$defs/PostEksport"
            }
        }
    },
    "Import": {
        "type": "object",
        "properties": {
            "cpaLevel1Import": {
                "type": "string",          
            },
            "cpaImport": {
                "type": "string"
            },
            "PostImport": {
                "type": "array",
                "items": {
                    "$ref": "#/$defs/PostImport"
            }
        } 
    },
    "PostEksport": {
        "type": "object",
        "properties": {
            "landkodeEksport": {
                "type": "string"
            },
            "forrigeKvartalKrEksport": {
                "type": "integer"
            },
            "forrigeKonsernIntKrEksport": {
                "type": "integer"
            },
        }
    },
    "PostImport": {
        "type": "object",
        "properties": {
            "landkodeImport": {
                "type": "string",
            },
            "forrigeKvartalKrImport": {
                "type": "integer"
            },
            "forrigeKonsernIntKrImport": {
                "type": "integer"
            },
        }
    }
}

Merk at både Eksport/Import og PostEksport/PostImport er repeterende. Den ytterste gruppa er CPA-verdien, mens den innerste gruppa inneholder landskodene og kronebeløpene.

Tabell 4 beskriver feltene som kan forhåndsutfylles.

Tabell 4: Prefill felter
Felt Sti
leveransetype -
cpaLevel1Eksport Eksport
cpaEksport Eksport
landkodeEksport Eksport.PostEksport
forrigeKvartalKrEksport Eksport.PostEksport
forrigeKonsernIntKrEksport Eksport.PostEksport
cpaLevel1Import Import
cpaImport Import
landkodeImport Import.PostImport
forrigeKvartalKrImport Import.PostImport
forrigeKonsernIntKrImport Import.PostImport

Eksempelet leser prefill-data fra flere tekstfiler og bygger den nødvendige strukturen for å forhåndsutfylle skjemaet for utvalgte enheter.