For å få tilgang til å kunne levere skattemelding må du sende epost til [email protected] og be om at ditt organisasjonsnummer blir registrert i Samarbeidsportalen. Når det er på plass må du sende epost til [email protected] og be om tilgang til scope for levering av skattemelding for det gitte organisasjonsnummeret.
Sett opp ein tunnel frå https://mac.tail31c54.ts.net til http://localhost:12345 slik:
tailscale funnel 12345
RUST_LOG=info cargo watch -x run
Finn endpoints her:
https://idporten.no/.well-known/openid-configuration
Dokumentasjon her:
https://skatteetaten.github.io/mva-meldingen/english/idportenauthentication/#example-of-integration
OAuth2 klient må inn her: https://sjolvbetjening.samarbeid.digdir.no/integrations
Det fungerer ikkje med redirect URL som inneheld "local" eller "127.0.0.1". Så applikasjonen må enten køyre på ein server eller få eit dynamisk DNS-navn. Sistnemnte kan ordnast med Tailscale slik:
tailscale funnel 12345
Redirect URL må dessutan innehalde portnummeret, så det blir til dømes https://mac.tailnnn.ts.net:443/token.
Klientkonfigurasjonen må også ha følgande:
- Difi-tjeneste: API-klient
- Scopes: openid og skatteetaten:formueinntekt/skattemelding
- Klientautentiseringsmetode: client_secret_basic
- Applikasjonstype: web
- PKCE: S256
OAuth2 authorize:
POST https://idporten.no/token
Retur: { "accesstoken": "ey..OQ", "id_token": "ey..QA", "token_type": "Bearer", "expires_in": 119, "refresh_token": "L..uo", "scope": "openid skatteetaten:formueinntekt/skattemelding" }
Hent utkast: GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/utkast/2022/999579922 {'Authorization': 'Bearer ' + js['access_token']}
Retur: SKI:755:338422757 utf-8 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c2thdHRlbWVsZGluZyB4bWxucz0idXJuOm5vOnNrYXR0ZWV0YXRlbjpmYXN0c2V0dGluZzpmb3JtdWVpbm50ZWt0OnNrYXR0ZW1lbGRpbmc6dXBlcnNvbmxpZzpla3N0ZXJuOnYyIj48cGFydHNudW1tZXI+MTQ0MjkyNzkzMjwvcGFydHNudW1tZXI+PGlubnRla3RzYWFyPjIwMjI8L2lubnRla3RzYWFyPjwvc2thdHRlbWVsZGluZz4= skattemeldingUpersonligUtkast
er dokumentidentifikator.
Hent gjeldende: GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/2022/999579922 {'Authorization': 'Bearer ' + js['access_token']}
Retur: SKI:755:338422757 utf-8 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c2thdHRlbWVsZGluZyB4bWxucz0idXJuOm5vOnNrYXR0ZWV0YXRlbjpmYXN0c2V0dGluZzpmb3JtdWVpbm50ZWt0OnNrYXR0ZW1lbGRpbmc6dXBlcnNvbmxpZzpla3N0ZXJuOnYyIj48cGFydHNudW1tZXI+MTQ0MjkyNzkzMjwvcGFydHNudW1tZXI+PGlubnRla3RzYWFyPjIwMjI8L2lubnRla3RzYWFyPjwvc2thdHRlbWVsZGluZz4= skattemeldingUpersonligUtkast
Hent fastsatt (etter levering og behandling): GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/fastsatt/2022/999579922 {'Authorization': 'Bearer ' + js['access_token']}
Base64 decode :
14429279322022trengs seinare.
Base64 encode skattemelding.xml og naeringsspesifikasjon.xml og lag melding som dette:
naering_as = """
skattemeldingUpersonlig utf-8 PD..4= naeringsspesifikasjon utf-8 PD..4= skattemeldingUpersonlig SKI:755:338422757 2022 komplett Tor Hovland """Valider med meldinga over som XML body: POST https://idporten.api.skatteetaten.no/api/skattemelding/v2/valider/2022/999579922 {'Authorization': 'Bearer ' + js['access_token']} header["Content-Type"] = "application/xml"
Retur: skattemeldingUpersonligEtterBeregning utf-8 PD..c+ naeringsspesifikasjonEtterBeregning utf-8 PD..== beregnetSkattUpersonlig utf-8 PD..== summertSkattegrunnlagForVisningUpersonlig utf-8 PD..4= avvikSkattemelding global 344940 44054 300886 verdsettingAvAksje/samletVerdiBakAksjeneISelskapet/beloep/beloepSomHeltall avvikNaeringsopplysninger global 314940 269625 45315 egenkapitalavstemming/utgaaendeEgenkapital/beloep/beloep NAVVIKÅRSRESULTAT_EGENKAPITALAVSTEMMING global Det er avvik mellom årsresultat og årets overskudd eller årets underskudd i egenkapitalavstemmingen. merknadStandard resultatregnskap/aarsresultat/beloep/beloep N_AVVIK_TILBAKEFØRT_SKATTEKOSTNAD global Det er avvik mellom sum skattekostnad i resultatregnskapet og tilbakeført skattekostnad i permanente forskjeller. merknadStandard resultatregnskap/sumSkattekostnad/beloep/beloep validertMedFeil avvikSkattemelding avvikNaeringsopplysninger true false false false false false
I tilfelle valideringsfeil, sjekk om det er kome nye XSD-filer her: https://github.com/Skatteetaten/skattemeldingen/tree/master/src/resources/xsd
Sjekk validering for eksempel her: https://www.freeformatter.com/xml-validator-xsd.html
Hent Altinn-token GET https://platform.altinn.no/authentication/api/v1/exchange/id-porten {'Authorization': 'Bearer ' + js['access_token']}
Retur: ey..EQ
Lag skattemeldingsinstans med JSON som body: POST https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/ altinn_header = {"Authorization": "Bearer " + r.text} {"instanceOwner": {"organisationNumber": '999579922'}, "appOwner": { "labels": ["gr", "x2"] }, "appId": "skd/formueinntekt-skattemelding-v2", "dueBefore": "2023-04-16", "visibleAfter": "2023-03-16", "title": {"nb": "Skattemelding"}, "dataValues": {"inntektsaar": "2022"}}
Retur: { "id": "60271338/d1ba8c2b-f424-44a6-b888-8425c202b810", "instanceOwner": { "partyId": "60271338", "personNumber": null, "organisationNumber": "999579922", "username": null }, "appId": "skd/formueinntekt-skattemelding-v2", "org": "skd", "selfLinks": { "apps": "https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810", "platform": "https://platform.altinn.no/storage/api/v1/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810" }, "dueBefore": "2023-04-16T00:00:00Z", "visibleAfter": "2023-03-16T00:00:00Z", "process": { "started": "2023-03-16T19:46:01.8526919Z", "startEvent": "StartEvent_1", "currentTask": { "flow": 2, "started": "2023-03-16T19:46:01.9580344Z", "elementId": "Task_1", "name": "Utfylling", "altinnTaskType": "data", "ended": null, "validated": null, "flowType": "CompleteCurrentMoveToNext" }, "ended": null, "endEvent": null }, "status": { "isArchived": false, "archived": null, "isSoftDeleted": false, "softDeleted": null, "isHardDeleted": false, "hardDeleted": null, "readStatus": 1, "substatus": null }, "completeConfirmations": null, "data": [ { "id": "bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f", "instanceGuid": "d1ba8c2b-f424-44a6-b888-8425c202b810", "dataType": "Skattemeldingsapp_v2", "filename": null, "contentType": "application/xml", "blobStoragePath": "skd/formueinntekt-skattemelding-v2/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f", "selfLinks": { "apps": "https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f", "platform": "https://platform.altinn.no/storage/api/v1/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f" }, "size": 246, "contentHash": null, "locked": false, "refs": [], "isRead": true, "tags": [], "deleteStatus": null, "fileScanResult": "Pending", "created": "2023-03-16T19:46:02.1542743Z", "createdBy": "481908", "lastChanged": "2023-03-16T19:46:02.1542743Z", "lastChangedBy": "481908" } ], "presentationTexts": { "inntektsaar": "2022" }, "dataValues": { "inntektsaar": "2022" }, "created": "2023-03-16T19:46:02.0092026Z", "createdBy": "481908", "lastChanged": "2023-03-16T19:46:02.0092026Z", "lastChangedBy": "481908" }
Last opp skattemelding: POST https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data?dataType=skattemeldingOgNaeringsspesifikasjon altinn_header = {"Authorization": "Bearer " + r.text} "content-type" = "text/xml" "Content-Disposition" = "attachment; filename=skattemelding.xml"
req_bekreftelse = endre_prosess_status(instans_data, altinn_header, "next", appnavn=altinn3_applikasjon) def endre_prosess_status(instans_data: dict, token: dict, neste_status: str, appnavn: str = "skd/formueinntekt-skattemelding-v2") -> str: if neste_status not in ["start", "next", "completeProcess"]: raise NotImplementedError
url = f"{ALTINN_URL}/{appnavn}/instances/{instans_data['id']}/process/{neste_status}"
r = requests.put(url, headers=token, verify=False)
r.raise_for_status()
return r.text
Sett status klar til bekreftelse: PUT https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/process/next altinn_header = {"Authorization": "Bearer " + r.text}
from skatteetaten_api import skattemelding_visning
url_skattemelding_visning = skattemelding_visning(instans_data, appnavn=altinn3_applikasjon) print(url_skattemelding_visning)
req_bekreftelse = endre_prosess_status(instans_data, altinn_header, "next", appnavn=altinn3_applikasjon) req_bekreftelse