Bygge skjemaprefill
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.
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.
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.
| 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. |
| Dublett-sjekk | Angir om feltet skal inneholde unike verdier. |
| Statistikk navn | Kan brukes for mapping til statistikkteamenes interne systemer. |
| Beskrivelse | Eventuell beskrivelse av datafeltet. |
| Kommentar | Eventuell kommentar om datafeltet. |
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) Prefill skal alltid lagres på skjemaenheten.
Mapping til felter i SFU:
enhetsident→skj_enh_ident_nrenhetstype→skj_enh_enhets_type
Tabell 2 viser en beskrivelse av de ulike parameterne i save_prefill_for_enhet
| 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.
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.
| 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-0255 (Omsetning, kostnader og investeringer i næringslivet)
Dette eksemplet viser hvordan du kan bygge skjemaprefill for RA-0255 (Omsetning, kostnader og investeringer i næringslivet). Nedenfor ser du hvordan innholdet i SkjemaData blokka er strukturert.
{
"SkjemaData": {
"type": "object",
"properties": {
"Prefill": {
"$ref": "#/$defs/Prefill"
},
"VirkTabell": {
"type": "array",
"maxItems": 1000,
"minItems": 1,
"uniqueItems": true,
"items": {
"$ref": "#/$defs/VirkTabell"
}
},
"Prefill": {
"type": "object",
"title": "Preutfylte verdier",
"description": "Verdier som skal komme preutfylt fra SSB",
"properties": {
"filter": {
"type": "string"
},
"totalOmsPrefill": {
"type": "number"
},
"pf9010Driftskostnader": {
"type": "number"
},
"pf4005Varekostnader": {
"type": "number"
},
"totalSalgsinntektPrefill": {
"type": "number"
},
"vedleggsinfo": {
"type": "string"
}
}
},
"VirkTabell": {
"type": "object",
"properties": {
"virkOrgNr": {
"type": "string"
},
"virkNavn": {
"type": "string"
},
"virkNaeringskode": {
"type": "string",
"maxLength": 7
},
"virkNaeringsbeskrivelse": {
"type": "string"
},
"omsetningPerVirk": {
"type": "number"
},
"driftskostnadPerVirk": {
"type": "number"
},
"virkKarakteristikk": {
"type": "string"
}
}
}Prefill for dette skjemaet inneholder både datafelter fra en flat struktur men også fra en tabell (VirkTabell)
Tabell 4 beskriver feltene som kan forhåndsutfylles.
| Felt | Sti |
|---|---|
| filter | Prefill |
| pf4005Varekostnader | Prefill |
| pf9010Driftskostnader | Prefill |
| totalOmsPrefill | Prefill |
| totalSalgsinntektPrefill | Prefill |
| vedleggsinfo | Prefill |
| virkKarakteristikk | VirkTabell |
| virkNaeringsbeskrivelse | VirkTabell |
| virkNaeringskode | VirkTabell |
| virkNavn | VirkTabell |
| virkOrgNr | VirkTabell |
Eksempelet leser prefill-data fra SFU og bygger den nødvendige strukturen for å forhåndsutfylle skjemaet for utvalgte enheter.
