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. |
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
= SuvClient()
client
= client.get_prefill_meta_by_skjema_def(
output = 'RA-0666A3',
ra_nummer = 1,
versjon = '1060'
undersokelse_nr
)
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
= SuvClient()
client
= client.get_prefill_meta_by_skjema_def(
resultat = 'RA-0666A3',
ra_nummer = 1,
versjon = '1060'
undersokelse_nr
)
def build_structure(data, include_metadata=False):
= {}
structure
for item in data:
= item['sti_navn'].split('.') if item['sti_navn'] else [item['navn']]
path = structure
current_level
for part in path:
if part not in current_level:
= {"metadata": {}} if include_metadata else {}
current_level[part] = current_level[part]
current_level
if include_metadata:
"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")
current_level[
return structure
= build_structure(resultat, include_metadata=False)
result_without_metadata 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
= SuvClient()
client
= client.save_prefill_for_enhet(
output = 'RA-0666A3',
ra_nummer = 1,
versjon = 2024,
periode_aar = 'KVRT',
periode_type = 2,
periode_nr = 'A3TF0018',
enhetsident = 'FRTK',
enhetstype = {
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
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
= SuvClient()
client
client.validate_skjemadata( = 'RA-0678A3',
ra_nummer = 2,
versjon = {"antallAnsattePrefill": "10"}
skjemadata )
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-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.
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.