-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
213 lines (173 loc) · 8.22 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<!DOCTYPE html>
<html lang="no">
<head>
<title>Pilot: Rapportering til SSB basert på SAF-T</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="https://nordicsmartgovernment.org/themes/custom/newerst/favicon.ico" type="image/vnd.microsoft.icon">
<link href="css/style.css" rel="stylesheet">
<link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
<script defer src="https://pyscript.net/latest/pyscript.js"></script>
</head>
<body>
<py-config>
packages = ["pandas", "lxml", "beautifulsoup4"]
[[fetch]]
#from = "static/python/"
files = ["saft2dataframe.py", "request.py"]
</py-config>
<py-script src="main.py">
</py-script>
<header>
<img src="https://nordicsmartgovernment.org/themes/custom/newerst/lbe/Nordic_Smart_Government_and_Business_logo.svg" alt="Nordic smart government and Business logo" width="103" height="40">
<h1>Pilot: Rapportering til SSB basert på SAF-T</h1>
</header>
<main id="main">
<article id="intro">
<h1>Introduksjon</h1>
<p>Dette er en pilot for å forenkle rapporteringen til SSB. Den dekker i første omgang rapportering til
<a href="https://www.ssb.no/varehandel-og-tjenesteyting/varehandel/statistikk/varehandelsindeksen">varehandelsindeksen</a>,
som idag løses ved å sende inn skjema RA-0187.
Istedenfor å finne de relevante omsetningstallene manuelt, inneholder denne siden kode som kan hente de relevante tallene
fra en oppdatert SAF-T-fil. Følg instruksjonene under. Se <a href="https://github.com/nordicsmartgovernment/statistikkpilot_ssb">Github</a> for
mer informasjon.</p>
<p style="font-size: small">Du kan også skru på en "REPL" (Python-vindu for å kjøre kode):
<button id="display_debug" py-click="display_debug()">Vis REPL</button> <button id="skjul_debug" py-click="skjul_debug()">Skjul REPL</button>
</p>
<py-script>
def display_debug():
el = Element('debug')
el.remove_class('hidden')
el.add_class('visible')
el = Element('debug_respons')
el.clear()
display('Python-vindu vises nå nederst på siden.', target="debug_respons")
def skjul_debug():
el = Element('debug')
el.remove_class('visible')
el.add_class('hidden')
el = Element('debug_respons')
el.clear()
</py-script>
<div id="debug_respons"></div>
</article>
<article id="a1">
<h1>Steg 1: Velg SAF-T-fil</h1>
<p>Eksporter en SAF-T-fil fra regnskapssystemet. Bokføringen må være oppdatert for perioden det skal rapporteres for.</p>
<p><strong>Merk at filen <em>ikke</em> blir sendt/overført til noen andre.</strong>
<p style="font-size: small">Du kan verifisere dette selv ved å skru på flymodus/trekke ut nettverkskabelen, før du velger en fil. Analysen av SAF-T-filen vil fungere ettersom den relevante koden
allerede er lastet ned. Bruk <a href="https://raw.githubusercontent.com/Skatteetaten/saf-t/master/Example%20Files/ExampleFile%20SAF-T%20Financial_888888888_20180228235959.xml">
denne filen</a> hvis du ikke har en SAF-T fil og vil teste funksjonene på denne siden. Merk at testfilen kun inneholder data for 2017.</p>
<label for="saftfil">Velg fil:</label>
<input type="file" id="saftfil" name="saftfil"/>
<p id="resultat_a1" class="resultat">
</p>
<py-repl class="hidden">
# Bruk vedlagte eksempelfil (hentet fra Skatteetatens Github)
url = ("kopi_av_eksempelfil_888888888_20180228235959_fra_Skatteetatens_github.xml")
saft, orgnr = gle2df(open_url(url))
if len(år_liste := saft['PeriodYear'].unique()) != 1:
raise()
år = år_liste[0]
min_måned = saft['Period'].min()
maks_måned = saft['Period'].max()
oppdater_månedsvelger(år, min_måned, maks_måned)
#gjentar oppsettet for å oppdage endringer i måned:
oppsett_for_å_oppdage_valgt_måned()
</py-repl>
</article>
<article id="a2" class="hidden">
<h1>Steg 2: Velg rapporteringsperiode</h1>
<p>År: </p>
<p>Velg måneden det skal rapporteres for:</p>
<label for="maaned_velger">Velg måned (1-12):</label>
<input type="number" id="maaned_velger" name="maaned_velger"
min="1" max="12">
<!--
<py-repl>
år = 2017 # fordi testfilen bar har data for januar
måned = 1 # 1 er januar, 2 er februar osv
Element('a3').remove_class('hidden')
</py-repl>
-->
</article>
<article id="a3" class="hidden">
<h1>Steg 3: Kjør analysen og verifiser resultatet</h1>
<p>Klikk knappen nedenfor for å finne omsetning for perioden du spesifiserte i forrige steg.</p>
<p style="font-size: small">Merk at det foreløpig er amerikansk desimal- og tusenskilletegn</p>
<py-script>
def finn_omsetning(df, år: int, måned: int) -> str:
global resultat
global orgnr
resultat = {
'orgnr': orgnr,
'år': int(år),
'måned': måned,
}
resultat.update(dict(df.loc[
(df['Period'] == måned)
& (df['StandardAccountID'] >= '3000')
& (df['StandardAccountID'] < '4000')] \
[[
'DebitAmount', # selecting the amount-columns
'CreditAmount',]].sum()))
# beregning av omsetning, og formatering til hele tusen kroner, derfor "/1000:.0f"
omsetning_i_tusen = f"{(-(resultat['DebitAmount'] - resultat['CreditAmount']))/1000:.0f}"
resultat.update({'omsetning_i_tusen': omsetning_i_tusen})
display(f'''Orgnr: {orgnr} |
År: {år} |
Måned: {måned} |
Debit: {resultat['DebitAmount']:,.2f} |
Kredit: {resultat[ 'CreditAmount']:,.2f} |
Omsetning i hele tusen: {resultat['omsetning_i_tusen']}''',
target="resultat_finn_omsetning")
Element('a4').add_class('visible')
Element('a4').remove_class('hidden')
</py-script>
<button id="finn_omsetning" py-click="finn_omsetning(saft, år, måned)">Finn omsetning</button>
<p id="resultat_finn_omsetning"></p>
</article>
<article id="a4" class="hidden">
<h1><s>Steg 4: Send inn tallene til SSB</s></h1>
<p>Denne funksjonen er ikke implementert</p>
<py-script>
async def api_kall(data, baseurl, orid):
headers = {"Content-type": "application/json"}
new_post = await request(f"{baseurl}/{orid}", body=data, method="POST", headers=headers)
display(f"""Har POSTet følgende data:
{await new_post.json()}
Statuskode: {new_post.status}. (20x betyr at det var vellykket!)""",
target='resultat_send_inn_tallene')
def send_inn():
baseurl = "https://oa-reporting-api.ew.r.appspot.com/orid"
data = json.dumps(resultat)
asyncio.ensure_future(api_kall(data, baseurl, "RA-0187"))
</py-script>
<button id="send_inn_tallene" py-click="send_inn()" disabled>Send inn</button>
<p id="resultat_send_inn_tallene"></p>
</article>
<article id="debug" class="hidden">
<h1>Debug: Her kan du kjøre egen kode</h1>
<p>Bruk den såkalte REPL nedenfor for å kjøre egen kode. Dataene fra SAF-T-fila er tilgjengelige i variabelen <code>saft</code>.
Etter at du har kjørt steg 3, er omsetningen tilgjengelig i variabelen <code>omsetning</code></p>
<py-repl id="debug-repl" auto-generate="true">
# kjør denne cellen (Shift-Enter) og få liste over kolonnene
# NB! Hvis du ikke har åpnet en SAF-T fil ennå er listen over kolonner tom
saft.columns
</py-repl>
</article>
</main>
</body>
<script>
// hvis URL-en slutter med #debug så vises hele siden
if (document.location.hash === "#debug") {
console.log('Er i debug-modus');
console.log(document.querySelectorAll('.hidden'))
for (let name of document.querySelectorAll(".hidden")) {
console.log('Skal fjerne hidden for element med id ${name}')
name.classList.replace('hidden', 'visible')
};
console.log('nå skal alle hidden være fjernet');
}
</script>
</html>