diff --git a/src/test/Testcafe/.gitignore b/src/test/Testcafe/.gitignore index 8e5a63f1dac..ad43191b47f 100644 --- a/src/test/Testcafe/.gitignore +++ b/src/test/Testcafe/.gitignore @@ -1 +1,2 @@ /Screenshots +**/junit.xml \ No newline at end of file diff --git a/src/test/Testcafe/config.json b/src/test/Testcafe/config.json index 9670f03866e..09e1f6d2a56 100644 --- a/src/test/Testcafe/config.json +++ b/src/test/Testcafe/config.json @@ -1,9 +1,9 @@ { "local": { - "baseUrl": "http://altinn3.no" + "baseUrl": "http://altinn3.no/" }, "dev": { - "baseUrl": "https://dev.altinn.studio" + "baseUrl": "https://dev.altinn.studio/" }, "uat": { "baseUrl": "base for uat" diff --git a/src/test/Testcafe/designer_tests/navigation-tests.js b/src/test/Testcafe/designer_tests/navigation-tests.js new file mode 100644 index 00000000000..539aef20dc1 --- /dev/null +++ b/src/test/Testcafe/designer_tests/navigation-tests.js @@ -0,0 +1,75 @@ +import { t } from 'testcafe'; +import { waitForReact } from 'testcafe-react-selectors'; +import DesignerPage from '../page-objects/designerPage'; +import CommonPage from '../page-objects/common'; +import TestData from '../TestData'; +import App from '../app'; +import LoginPage from '../page-objects/loginPage'; + +let app = new App(); +let common = new CommonPage(); +let loginPage = new LoginPage(); +let designerPage = new DesignerPage(); +const testUser = new TestData('AutoTest', 'automatictestaltinn@brreg.no', 'test123', 'basic'); + +fixture('Navigating the Service designer') + .page(app.baseUrl) + .before(async () => { + }) + .beforeEach(async () => { + await common.login(testUser.userEmail, testUser.password, loginPage); + await waitForReact(); + //app.before(); + }) + .after(async () => { + //await app.after(); + }) + +test('Om tab navigation', async () => { + await t + .navigateTo(app.baseUrl + 'designer/AutoTest/testcafe01#/aboutservice') //navigate to the designer on test user repo + .click(designerPage.omNavigationTab) + .hover(designerPage.leftDrawerMenu) + .expect(designerPage.omLeftMenuItems[0].visible).ok() + .expect(designerPage.omLeftMenuItems[1].visible).ok() + .expect(designerPage.omLeftMenuItems[2].visible).ok() + .expect(designerPage.omLeftMenuItems[3].visible).ok() + .expect(designerPage.omLeftMenuItems[4].visible).ok() + .expect(designerPage.omLeftMenuItems[5].visible).ok() +}); + +test('Lage tab navigation', async () => { + await t + .navigateTo(app.baseUrl + 'designer/AutoTest/testcafe01#/aboutservice') + .click(designerPage.lageNavigationTab) + .hover(designerPage.leftDrawerMenu) + .expect(designerPage.lageLeftMenuItems[0].visible).ok() + .expect(designerPage.lageLeftMenuItems[1].visible).ok() + .expect(designerPage.lageLeftMenuItems[2].visible).ok() +}); + +test('Språk tab navigation', async () => { + await t + .navigateTo(app.baseUrl + 'designer/AutoTest/testcafe01#/aboutservice') + .click(designerPage.spraakNavigationTab) + .hover(designerPage.leftDrawerMenu) + .expect(designerPage.spraakLeftMenuItems[0].visible).ok() + .expect(designerPage.spraakLeftMenuItems[1].visible).ok() +}); + +test('Teste tab navigation', async () => { + await t + .navigateTo(app.baseUrl + 'designer/AutoTest/testcafe01#/aboutservice') + .click(designerPage.testeNavigationTab) + .hover(designerPage.leftDrawerMenu) + .expect(designerPage.testeLeftMenuItems[0].visible).ok() +}); + +test('Publisere tab navigation', async () => { + await t + .navigateTo(app.baseUrl + 'designer/AutoTest/testcafe01#/aboutservice') + .click(designerPage.publisereNavigationTab) + .hover(designerPage.leftDrawerMenu) + .expect(designerPage.publisereLeftMenuItems[0].visible).ok() + .expect(designerPage.publisereLeftMenuItems[1].visible).ok() +}); \ No newline at end of file diff --git a/src/test/Testcafe/package-lock.json b/src/test/Testcafe/package-lock.json index 66e826fba44..431cfac6b21 100644 --- a/src/test/Testcafe/package-lock.json +++ b/src/test/Testcafe/package-lock.json @@ -2672,12 +2672,22 @@ } } }, + "testcafe-react-selectors": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/testcafe-react-selectors/-/testcafe-react-selectors-3.0.3.tgz", + "integrity": "sha512-EA0VmJJQNVtQK+gF39y7VemNb8bAXONfV0TtqM64TJ8cH2geIxeX2pUxBaJ6zRA/vtSofeJNqTm4+fxoQW2voA==" + }, "testcafe-reporter-json": { "version": "2.1.0", "resolved": "http://registry.npmjs.org/testcafe-reporter-json/-/testcafe-reporter-json-2.1.0.tgz", "integrity": "sha1-gLm1pt/y7h3h+R4mcHBsFHLmQAY=", "dev": true }, + "testcafe-reporter-junit": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/testcafe-reporter-junit/-/testcafe-reporter-junit-3.0.0.tgz", + "integrity": "sha512-G1nSs+cqGrSebL1pzam+G2xJdoeAd8KUToySJO6aCujOI54u0EbiiikKJphhuAVC/NrCDfaBimEFC/QyT9syrw==" + }, "testcafe-reporter-list": { "version": "2.1.0", "resolved": "http://registry.npmjs.org/testcafe-reporter-list/-/testcafe-reporter-list-2.1.0.tgz", diff --git a/src/test/Testcafe/package.json b/src/test/Testcafe/package.json index 02a27cb851e..55a02522604 100644 --- a/src/test/Testcafe/package.json +++ b/src/test/Testcafe/package.json @@ -4,7 +4,7 @@ "description": "UI tests for Altinn tjenester 3.0", "main": "app.js", "scripts": { - "start": "cross-env NODE_ENV=test && testcafe chrome ." + "test": "node .\\testRunner --env=dev" }, "keywords": [], "author": "", @@ -15,5 +15,9 @@ "process": "^0.11.10", "testcafe": "^0.22.0", "tslint": "^5.11.0" + }, + "dependencies": { + "testcafe-react-selectors": "^3.0.3", + "testcafe-reporter-junit": "^3.0.0" } } diff --git a/src/test/Testcafe/page-objects/designerPage.js b/src/test/Testcafe/page-objects/designerPage.js index 6ee0a94702f..3d812a180b1 100644 --- a/src/test/Testcafe/page-objects/designerPage.js +++ b/src/test/Testcafe/page-objects/designerPage.js @@ -1,34 +1,77 @@ import { t, Selector } from 'testcafe'; +import { ReactSelector } from 'testcafe-react-selectors'; import App from '../app'; -export default class designerPage { +export default class DesignerPage { constructor() { - this.header = Selector(".button").withText("Header"); - this.inputBtn = Selector(".button").withText("Input"); - this.dropDown = Selector(".button").withText("Dropdown"); - this.checkBoxes = Selector(".button").withText("Checkboxes"); - this.radioButtons = Selector(".button").withText("RadioButtons"); - this.textArea = Selector(".button").withText("TextArea"); - this.fileUpload = Selector(".button").withText("FileUpload"); - this.submit = Selector(".button").withText("Submit"); - this.addContainer = Selector(".button").withText("Add Container"); - this.saveButton = Selector(".button").withText("Save"); + this.header = Selector("#schema-components").withText("Header"); + this.inputBtn = Selector("#schema-components").withText("Input"); + this.dropDown = Selector("#schema-components").withText("Dropdown"); + this.checkBoxes = Selector("#schema-components").withText("Checkboxes"); + this.radioButtons = Selector("#schema-components").withText("RadioButtons"); + this.textArea = Selector("#schema-components").withText("TextArea"); + this.fileUpload = Selector("#schema-components").withText("FileUpload"); + this.submit = Selector("#schema-components").withText("Submit"); + this.addContainer = Selector("#schema-components").withText("Add Container"); + this.saveButton = Selector("#schema-components").withText("Save"); this.addApiConnection = Selector(".d-block").withText("Api connections").child(0); this.addRuleConnection = Selector(".d-block").withText("Rule connections").child(0); this.addConditionalRendering = Selector(".d-block").withText("Conditional Rendering").child(0); + //left drawer menu + this.leftDrawerMenu = Selector('#root > div > div:nth-child(2) > div:nth-child(1) > div > div > div'); + this.leftMenuList = Selector('li') //all unordered list elements to be filtered + + //"Om" navigation tab selectors + this.omNavigationTab = Selector('div').withExactText('Om'); + this.omLeftMenuItems = [ + this.leftMenuList.withExactText('Om tjenesten'), + this.leftMenuList.withExactText('Roller og rettigheter'), + this.leftMenuList.withExactText('Produksjon'), + this.leftMenuList.withExactText('Versjonshistorikk'), + this.leftMenuList.withExactText('Om sluttbrukeren'), + this.leftMenuList.withExactText('Altinn.no') + ]; + + //"Lage" navigation tab selectors + this.lageNavigationTab = Selector('div').withExactText('Lage'); + this.lageLeftMenuItems = [ + this.leftMenuList.withExactText('Datamodell'), + this.leftMenuList.withExactText('GUI'), + this.leftMenuList.withExactText('API') + ]; + + //"språk" navigation tab selectors + this.spraakNavigationTab = Selector('div').withExactText('Språk'); + this.spraakLeftMenuItems = [ + this.leftMenuList.withExactText('Tekst'), + this.leftMenuList.withExactText('Flere språk') + ]; + + //"teste" navigation tab selectors + this.testeNavigationTab = Selector('div').withExactText('Teste'); + this.testeLeftMenuItems = [ + this.leftMenuList.withExactText('Test') + ]; + + //"publisere" navigation tab selectors + this.publisereNavigationTab = Selector('div').withExactText('Publisere'); + this.publisereLeftMenuItems = [ + this.leftMenuList.withExactText('Produksjonsette'), + this.leftMenuList.withExactText('Status') + ]; + //preview tab this.previewSaveButton = Selector(".a-btn-success").withText("Save"); this.controlAndSubmit = Selector(".a-btn-success"); //tekst tab - this.nyTextButton = Selector(".btn").withText("Ny tekst"); + this.nyTittelButton = Selector("#schema-texts").withText("Tittel"); this.addNewLanguage = Selector("#newtab > a"); } - - deleteDataModelTexts(numberToDelete) { + async deleteDataModelTexts(numberToDelete) { let deleteButtons = await Selector(".tbn").withText("Slett"); let count = deleteButtons().count; diff --git a/src/test/Testcafe/page-objects/loginPage.js b/src/test/Testcafe/page-objects/loginPage.js index 26dc3e9e511..fb96f90d0f5 100644 --- a/src/test/Testcafe/page-objects/loginPage.js +++ b/src/test/Testcafe/page-objects/loginPage.js @@ -7,7 +7,7 @@ export default class LoginPage { this.welcomeLoginButton = Selector('[value ^= "Logg inn"]'); this.userInput = Selector('#user_name'); this.passwordInput = Selector('#password'); - this.loginButton = Selector('.ui.green.button'); + this.loginButton = Selector('.button').withExactText('Logg inn'); } } \ No newline at end of file diff --git a/src/test/Testcafe/testRunner.js b/src/test/Testcafe/testRunner.js index b4837e55593..7b095260539 100644 --- a/src/test/Testcafe/testRunner.js +++ b/src/test/Testcafe/testRunner.js @@ -1,30 +1,35 @@ const createTestCafe = require('testcafe'); +const fs = require('fs'); let testcafe = null; createTestCafe() .then(tc => { testcafe = tc; const runner = testcafe.createRunner(); + const stream = fs.createWriteStream('junit.xml'); return runner - .browsers(['chrome']) + .browsers(['chrome:headless']) .concurrency(1) //.speed(0.75) - .screenshots('./screenshots', { takeOnFails: false }) - .reporter('spec') - .src(['./repository_tests/login_create_new_repo.js']) + .screenshots('./screenshots', { takeOnFails: true }) + .reporter('junit', stream) + .src(['./designer_tests/navigation-tests.js']) .run({ skipJsErrors: true, quarantineMode: false, - selectorTimeout: 2000, - assertionTimeout: 1000, - pageLoadTimeout: 1000, + selectorTimeout: 5000, + assertionTimeout: 5000, + pageLoadTimeout: 5000, speed: 1, debugOnFail: true, - stopOnFirstFail: true + stopOnFirstFail: false + }) + .then(failedCount => { + console.log('Total tests failed ' + failedCount); + stream.end(); }) }) - .then(failedCount => { - console.log('Total tests failed: ' + failedCount); + .then(() => { testcafe.close(); }); diff --git a/src/test/Testcafe/testdata/ServiceModel.txt b/src/test/Testcafe/testdata/ServiceModel.txt new file mode 100644 index 00000000000..016b0ce3d60 --- /dev/null +++ b/src/test/Testcafe/testdata/ServiceModel.txt @@ -0,0 +1,1132 @@ + + + + + + +

RF-1117 Klage på likningen

+
+
+ + +

Skjema gjelder for alle grupper av skattytere. NB! Inneholder klagen sensitiv informasjon (f.eks. om sykdom) kan den ikke leveres elektronisk. Klagen sendes da med brev til skattekontoret.

+
+
+ + +

RF-1117 Klage på likninga

+
+
+ + +

Klageskjemaet gjeld for alle grupper av skattytarar. NB! Inneheld klaga sensitive opplysningar (t.d om sjukdom) kan du ikkje levere klaga elektronisk. Ho må sendast i brev til skattekontoret.

+
+
+
+ + + + + + + + + + + + + + + + SKATTEETATEN + + + + + + + +
+ + + + +

Informasjon om skattyter

+
+
+ + +

Gi opplysninger om klagers navn, postadresse, postnummer og fødsels-/organisasjonsnummer

+
+
+ + +

Informasjon om skattytar

+
+
+ + +

Gi opplysningar om klagar sitt namn, postadresse, postnummer og fødsels-/organisasjonsnummer

+
+
+
+ + + + + + + + +
+ + + + + + + + +

Navn

+
+
+ + +

Namn

+
+
+
+
+ + + + +

Adresse

+
+
+ + +

Adresse

+
+
+
+
+ + + + +

Postnummer

+
+
+ + +

Postnummer

+
+
+
+
+ + + + +

Poststed

+
+
+ + +

Poststad

+
+
+
+
+ + + + +

Fødselsnummer

+
+
+ + +

Fødselsnummer

+
+
+
+
+ + + + +

Organisasjonsnummer

+
+
+ + +

Organisasjonsnummer

+
+
+
+
+ + + + +

Kommune

+
+
+ + +

Selskapets kontorkommune

+
+
+ + +

Kommune

+
+
+ + +

Kontorkommuna til selskapet

+
+
+
+
+
+ +
+
+ + + + +

Navn på oppgavegiver

+
+
+ + 3 + +
+ + + + + + + +
+ + + + 8 + + + + + + + + + + + +

Adresse til oppgavegiver

+
+
+ + 4 + +
+ + + + + + + +
+ + + + 166 + + + + + + + + + + + +

Postnummer til oppgavegiver

+
+
+ + 5 + +
+ + + + + + + +
+ + + + 10 + + + +

Enter positive integer with four digits

+
+
+ + +

Feltet krever positivt heltall med fire siffer

+
+
+ + +

Feltet krev positivt heiltal med fire siffer

+
+
+
+ + + + +
+ + + + +

Poststed til oppgavegiver

+
+
+ + 6 + +
+ + + + + + + +
+ + + + 3 + + + + + + + + + + + +

Fødselsnummer til oppgavegiveren

+
+
+ + 2 + +
+ + + + + + + +
+ + + + 18 + + + +

Ugyldig fødselsnummer

+
+
+ + +

Ugyldig fødselsnummer

+
+
+
+ + + +
+ + + + +

Organisasjonsnummeret til enheten

+
+
+ + +

Organisasjonsnummer til årsregnskapets eier

+
+
+ + 1 + +
+ + + + + + + +
+ + + + 1 + + + +

Ugyldig organisasjonsnummer

+
+
+ + +

Ugyldig organisasjonsnummer

+
+
+
+ + + +
+ + + + +

Kommunenummer i forretningsadressen til juridisk enhet

+
+
+ + 7 + +
+ + + + + + + +
+ + + + +

Kontaktinformasjon

+
+
+ + +

Gi opp navn og adresse om skattyteren har en fullmektig/kontaktperson.

+
+
+ + +

Kontaktperson,eventuelt fullmektig

+
+
+ + +

Kontaktinformasjon

+
+
+ + +

Gi opp namn og adresse om skattytaren har ein fullmektig/kontaktperson.

+
+
+ + +

Kontaktperson,eventuelt fullmektig

+
+
+
+ + + + + + +

Navn

+
+
+ + +

Namn

+
+
+
+
+ + + + +

Adresse

+
+
+ + +

Adresse

+
+
+
+
+ + + + +

Postnummer

+
+
+ + +

Postnummer

+
+
+
+
+ + + + +

Poststed

+
+
+ + +

Poststed

+
+
+
+
+ + + + +

Epostadresse

+
+
+ + +

Epostadresse

+
+
+
+
+ + + + +

Telefonnummer

+
+
+ + +

Telefonnummer

+
+
+
+
+
+ +
+
+ + + + 8 + + + + + + + + + + + + + + 13 + + + + + + + + + + + +

Kontaktpersonens gateadresse

+
+
+ + 9 + +
+ + + + + + + +
+ + + + 9 + + + + + + + + + + + +

Postnummer i kontaktpersons adresse

+
+
+ + 10 + +
+ + + + + + + +
+ + + + +

Poststed i kontaktpersons adresse

+
+
+ + 11 + +
+ + + + + + + +
+ + + + +

E-postadressen til kontaktperson

+
+
+ + 12 + +
+ + + + + + + +
+ + + + 150 + + + + + + + + + + + +

Kontaktpersonens telefonnummer

+
+
+ + 13 + +
+ + + + + + + +
+ + + + 12 + + + + + + + + + + + +

Klagefrist

+
+
+ + +

Klagefrist

+
+
+
+ + + + + + +

Klagen/anmodningen om endring gjelder selvangivelsen for inntektsåret:

+
+
+ + +

Gjelder klagen andre inntektsår enn siste år er klagefristen oversittet og du har ikke rett til å få den behandlet. Klagen blir i stedet ansett som en anmodning til skattekontoret om å endre likningen for dette + året.

+

+

Gjelder klagen/anmodningen flere inntektsår er det tilstrekkelig å opplyse om det siste av inntektsårene. Det må imidlertid gå klart frem av begrunnelsen hvilke inntektsår klagen/anmodningen gjelder.

+
+
+ + +

NB! Klageskjemaet skal du bare bruke for å klage på feil/endringer i skatteoppgjøret du har mottatt.

+

Oppgi hvilket inntektsår klagen/anmodningen om endring gjelder

+
+
+ + +

Klaga/oppmodninga om endring gjeld inntektsåret:

+
+
+ + +

Gjeld klaga andre inntektsår enn siste år er klagefristen utløypt og du har ikkje rett til å få ho behandla. Klaga blir i staden behandla som ei oppmoding om å endre likninga.

+

+

Gjeld klaga/oppmoding fleire inntektsår treng du berre å oppgi det siste av inntektsåra. Det må imidlertid gå klart fram av grunngivinga kva inntektsår klaga/oppmodinga gjeld.

+
+
+ + +

NB! Klageskjemaet skal du bare bruke for å klage på feil/endringar i skatteoppgjeret du har mottatt.

+

Gi opp kva år klaga/oppmodninga om endring gjeld.

+
+
+
+
+ + + + +

Klagen er sendt innen fristen

+
+
+ + +

Leveres klagen innen fristen?

+

+

Klage over ligningen må leveres innen seks uker etter at skatteoppgjøret er sendt skattyter, likevel slik at klagefristen tidligst utløper 10.august.

+

Se lignl. § 9-2 nr 4 og 5.

+
+
+ + +

Klaga er sendt innan fristen

+
+
+ + +

Leveres klaga innan klagefristen?

+

+

For å klage over ligninga må du levere klaga innan seks veker etter at skatteoppgjeret er sendt skattytar. Klagefristen går likevel ikkje ut tidlegare enn før 10.august.

+

Se lignl. § 9-2 nr 4 og 5.

+
+
+
+
+ + + + +

Begrunnelse for at likningen skal tas opp til endring selv om klagefristen er oversittet

+
+
+ + +

Er klagefristen oversittet har du ikke rett til å få klagen behandlet. Det samme gjelder dersom likningen er fastsatt ved skjønn etter ligningsloven § 8-2.

+

+

Du kan anmode skattekontoret om å behandle klagen. En slik anmodning skal begrunnes. Ved vurderingen om klagen skal behandles skal det blant annet tas hensyn til spørsmålets betydning, skattyters forhold, sakens + opplysning og den tid som er gått.

+
+
+ + +

Gi begrunnelse for at skattekontoret skal behandle klagen selv om klagefristen er oversittet.

+

+

NB! Inneholder begrunnelsen sensitive opplysninger (f. eks. om sykdom) må klagen sendes i brev til skattekontoret

+
+
+ + +

Grunngiving for at likninga skal tas opp til endring sjølv om klagefristen er utløypt.

+
+
+ + +

Er klagefristen oversittet har du ikkje rett til å få klaga behandla. Det same gjeld om likninga er fastsett ved skjønn etter ligningslova § 8-2.

+

+

Du kan oppmode skattekontoret om å behandle klaga. Ei slik oppmoding må grunngivast. Ved vurderinga av om klaga skal behandlast skal det mellom anna takast omsyn til spørsmålet si betydning, skattytaren sine + forhold, opplysning av saka og den tida som er gått.

+
+
+ + +

Grunngi kvifor skattekontoret skal behandle klaga sjølv om klagefristen er utløypt.

+

+

NB! Inneheld grunngivinga sensitive opplysningar (t.d. om sjukdom) må du sende klaga i brev til skattekontoret.

+
+
+
+
+
+ +
+
+ + + + +

Inntektsåret klagen gjelder for.

+
+
+ + 14 + +
+ + + + + + + +
+ + + + 6 + + + + + + + + +

Om klage er sendt innen klagefristen.

+
+
+ + 15 + +
+ + + + + + + +
+ + + + 4 + + + + + + + + + +

Yes

+
+
+ + +

Ja

+
+
+ + +

Ja

+
+
+
+
+ + + + +

No

+
+
+ + +

Nei

+
+
+ + +

Nei

+
+
+
+
+
+
+ + + + +

Begrunnelse for klage.

+
+
+ + 16 + +
+ + + + + + + +
+ + + + 77 + + + + + + + + + + + +

Klage på likningen

+
+
+ + +

Det skal gå klart frem hva du mener er feil og begrunnelsen for det. Skatteoppgjøret viser de beløpene du selv har ført opp i selvangivelsen, ved siden av de beløpene skattekontoret har lagt til grunn. Kontroller at beløpene + stemmer (det kan være små differanser pga. øreavrunding). Vær oppmerksom på at du må betale restskatten i rett tid selv om du klager på likningen.

+

+

Hvis teksten inneholder med enn 1000 tegn må du sende inn klagen i eget vedlegg. Du kan legge ved elektroniske vedlegg ved å trykke på arkfanen Vedlegg, øverst til venstre i skjemaet. Merk vedleggene med + fødsels/organisasjonsnummer.

+

+

Klagen behandles av skattekontoret. Skattekontoret tar kontakt dersom det trenger mer informasjon eller dokumentasjon. Forventet saksbehandlingstid er ca tre måneder.

+
+
+ + +

Angi hva klagen gjelder. Alle klager må begrunnes. Begrunnelsen må inneholde bestemte påstander og redegjøre for de forhold påstandene bygger på. Du kan legge ved elektroniske vedlegg ved å trykke på arkfanen Vedlegg, øverst + til venstre i skjemaet. Merk vedleggene med fødselsnummer.

+

NB! Inneholder begrunnelsen sensitive opplysninger (f.eks.om sykdom), må den sendes i eget brev til skattekontoret.

+
+
+ + +

Klage på likninga

+
+
+ + +

Det skal gå klart frem kva du meiner er feil og ein grunngiving for dette. Skatteoppgjeret viser dei beløpa du sjølv har ført opp i sjølvmeldinga, ved sidan av dei beløpa skattekontoret har lagt til grunn. Kontroller at + beløpa er rett (det kan vere små skilnader på grunn av øreavrundinga). Ver merksam på at du må betale restskatten i tide sjølv om du klagar på likninga.

+

+

Velg fra menyen til venstre for elektroniske vedlegg. Merk vedlegga med fødselsnummer.

+

+

Klaga behandles av skattekontoret. Skattekontoret tar kontakt om det treng meir informasjon eller dokumentasjon. Forventa saksbehandlingstid er ca 3 månader.

+
+
+ + +

Gi opp hva klaga gjeld. Alle klagar skal grunngivast. Grunngivinga skal inneholde bestemte påstander og redegjere for dei forholda som påstandane byggjer på. Du kan leggje ved elektroniske vedlegg ved å trykke på arkfana + Vedlegg, øvst til venstre i skjemaet. Merk vedlegga med fødselsnummer.

+

NB! Inneheld grunngivinga sensitive opplysningar (t.d. om sjukdom), må du sende klaga i brev til skattekontoret.

+
+
+
+ + + + + + +
+ + + + + + + + +

Klage på likningen med begrunnelse

+
+
+ + +

Klage på likninga med grunngiving

+
+
+
+
+ + + + +

Noe annet

+
+
+ + +

Noe annet

+
+
+
+
+ + + + +

Og en tulleting til slutt

+
+
+ + +

Og en tulleting til slutt

+
+
+
+
+
+ +
+
+ + + + +

Spesifisering av hva det klages på.

+
+
+ + 17 + +
+ + + + + + + +
+ + + + +

Spesifisering av noe

+
+
+ + 18 + +
+ + + + + + + +
+ + + + +

Spesifisering av noe annet tull

+
+
+ + 19 + +
+ + + + + + + +
+
\ No newline at end of file