saft 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gemspec +34 -0
- data/.rspec +4 -0
- data/.rubocop.yml +72 -0
- data/.rubocop_strict.yml +7 -0
- data/.ruby-gemset +1 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +26 -0
- data/Rakefile +18 -0
- data/docs/Norwegian SAF-T Financial data.pdf +0 -0
- data/docs/Norwegian SAF-T Standard VAT:Tax codes.pdf +0 -0
- data/docs/saf-t v2 xsd by oecd.pdf +0 -0
- data/lib/saft/v2/html.css +3 -0
- data/lib/saft/v2/html.rb +685 -0
- data/lib/saft/v2/html_dist.css +594 -0
- data/lib/saft/v2/norway.rb +133 -0
- data/lib/saft/v2/parse.rb +351 -0
- data/lib/saft/v2/scribe.rb +364 -0
- data/lib/saft/v2/types.rb +493 -0
- data/lib/saft/v2/xsd_validate.rb +28 -0
- data/lib/saft/v2.rb +36 -0
- data/lib/saft/version.rb +3 -0
- data/lib/saft.rb +26 -0
- data/package.json +15 -0
- data/pnpm-lock.yaml +443 -0
- data/readme.md +92 -0
- data/tailwind.config.js +10 -0
- data/vendor/SAF-T_Financial_Schema_NO_1.10.xsd +3343 -0
- data/vendor/norway/general_ledger_standard_accounts.xsd +54 -0
- data/vendor/norway/general_ledger_standard_accounts_2_character.csv +75 -0
- data/vendor/norway/general_ledger_standard_accounts_2_character.xml +373 -0
- data/vendor/norway/general_ledger_standard_accounts_4_character.csv +747 -0
- data/vendor/norway/general_ledger_standard_accounts_4_character.xml +3733 -0
- data/vendor/norway/standard_tax_codes.csv +31 -0
- data/vendor/norway/standard_tax_codes.xml +199 -0
- data/vendor/norway/standard_tax_codes.xsd +67 -0
- metadata +121 -0
data/pnpm-lock.yaml
ADDED
@@ -0,0 +1,443 @@
|
|
1
|
+
lockfileVersion: 5.4
|
2
|
+
|
3
|
+
specifiers:
|
4
|
+
tailwindcss: ^3.2.4
|
5
|
+
|
6
|
+
dependencies:
|
7
|
+
tailwindcss: 3.2.4
|
8
|
+
|
9
|
+
packages:
|
10
|
+
|
11
|
+
/@nodelib/fs.scandir/2.1.5:
|
12
|
+
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
13
|
+
engines: {node: '>= 8'}
|
14
|
+
dependencies:
|
15
|
+
'@nodelib/fs.stat': 2.0.5
|
16
|
+
run-parallel: 1.2.0
|
17
|
+
dev: false
|
18
|
+
|
19
|
+
/@nodelib/fs.stat/2.0.5:
|
20
|
+
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
|
21
|
+
engines: {node: '>= 8'}
|
22
|
+
dev: false
|
23
|
+
|
24
|
+
/@nodelib/fs.walk/1.2.8:
|
25
|
+
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
26
|
+
engines: {node: '>= 8'}
|
27
|
+
dependencies:
|
28
|
+
'@nodelib/fs.scandir': 2.1.5
|
29
|
+
fastq: 1.14.0
|
30
|
+
dev: false
|
31
|
+
|
32
|
+
/acorn-node/1.8.2:
|
33
|
+
resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
|
34
|
+
dependencies:
|
35
|
+
acorn: 7.4.1
|
36
|
+
acorn-walk: 7.2.0
|
37
|
+
xtend: 4.0.2
|
38
|
+
dev: false
|
39
|
+
|
40
|
+
/acorn-walk/7.2.0:
|
41
|
+
resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
|
42
|
+
engines: {node: '>=0.4.0'}
|
43
|
+
dev: false
|
44
|
+
|
45
|
+
/acorn/7.4.1:
|
46
|
+
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
|
47
|
+
engines: {node: '>=0.4.0'}
|
48
|
+
hasBin: true
|
49
|
+
dev: false
|
50
|
+
|
51
|
+
/anymatch/3.1.3:
|
52
|
+
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
|
53
|
+
engines: {node: '>= 8'}
|
54
|
+
dependencies:
|
55
|
+
normalize-path: 3.0.0
|
56
|
+
picomatch: 2.3.1
|
57
|
+
dev: false
|
58
|
+
|
59
|
+
/arg/5.0.2:
|
60
|
+
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
|
61
|
+
dev: false
|
62
|
+
|
63
|
+
/binary-extensions/2.2.0:
|
64
|
+
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
|
65
|
+
engines: {node: '>=8'}
|
66
|
+
dev: false
|
67
|
+
|
68
|
+
/braces/3.0.2:
|
69
|
+
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
|
70
|
+
engines: {node: '>=8'}
|
71
|
+
dependencies:
|
72
|
+
fill-range: 7.0.1
|
73
|
+
dev: false
|
74
|
+
|
75
|
+
/camelcase-css/2.0.1:
|
76
|
+
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
|
77
|
+
engines: {node: '>= 6'}
|
78
|
+
dev: false
|
79
|
+
|
80
|
+
/chokidar/3.5.3:
|
81
|
+
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
|
82
|
+
engines: {node: '>= 8.10.0'}
|
83
|
+
dependencies:
|
84
|
+
anymatch: 3.1.3
|
85
|
+
braces: 3.0.2
|
86
|
+
glob-parent: 5.1.2
|
87
|
+
is-binary-path: 2.1.0
|
88
|
+
is-glob: 4.0.3
|
89
|
+
normalize-path: 3.0.0
|
90
|
+
readdirp: 3.6.0
|
91
|
+
optionalDependencies:
|
92
|
+
fsevents: 2.3.2
|
93
|
+
dev: false
|
94
|
+
|
95
|
+
/color-name/1.1.4:
|
96
|
+
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
97
|
+
dev: false
|
98
|
+
|
99
|
+
/cssesc/3.0.0:
|
100
|
+
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
|
101
|
+
engines: {node: '>=4'}
|
102
|
+
hasBin: true
|
103
|
+
dev: false
|
104
|
+
|
105
|
+
/defined/1.0.1:
|
106
|
+
resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
|
107
|
+
dev: false
|
108
|
+
|
109
|
+
/detective/5.2.1:
|
110
|
+
resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==}
|
111
|
+
engines: {node: '>=0.8.0'}
|
112
|
+
hasBin: true
|
113
|
+
dependencies:
|
114
|
+
acorn-node: 1.8.2
|
115
|
+
defined: 1.0.1
|
116
|
+
minimist: 1.2.7
|
117
|
+
dev: false
|
118
|
+
|
119
|
+
/didyoumean/1.2.2:
|
120
|
+
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
|
121
|
+
dev: false
|
122
|
+
|
123
|
+
/dlv/1.1.3:
|
124
|
+
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
|
125
|
+
dev: false
|
126
|
+
|
127
|
+
/fast-glob/3.2.12:
|
128
|
+
resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
|
129
|
+
engines: {node: '>=8.6.0'}
|
130
|
+
dependencies:
|
131
|
+
'@nodelib/fs.stat': 2.0.5
|
132
|
+
'@nodelib/fs.walk': 1.2.8
|
133
|
+
glob-parent: 5.1.2
|
134
|
+
merge2: 1.4.1
|
135
|
+
micromatch: 4.0.5
|
136
|
+
dev: false
|
137
|
+
|
138
|
+
/fastq/1.14.0:
|
139
|
+
resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==}
|
140
|
+
dependencies:
|
141
|
+
reusify: 1.0.4
|
142
|
+
dev: false
|
143
|
+
|
144
|
+
/fill-range/7.0.1:
|
145
|
+
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
|
146
|
+
engines: {node: '>=8'}
|
147
|
+
dependencies:
|
148
|
+
to-regex-range: 5.0.1
|
149
|
+
dev: false
|
150
|
+
|
151
|
+
/fsevents/2.3.2:
|
152
|
+
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
153
|
+
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
154
|
+
os: [darwin]
|
155
|
+
requiresBuild: true
|
156
|
+
dev: false
|
157
|
+
optional: true
|
158
|
+
|
159
|
+
/function-bind/1.1.1:
|
160
|
+
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
|
161
|
+
dev: false
|
162
|
+
|
163
|
+
/glob-parent/5.1.2:
|
164
|
+
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
|
165
|
+
engines: {node: '>= 6'}
|
166
|
+
dependencies:
|
167
|
+
is-glob: 4.0.3
|
168
|
+
dev: false
|
169
|
+
|
170
|
+
/glob-parent/6.0.2:
|
171
|
+
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
172
|
+
engines: {node: '>=10.13.0'}
|
173
|
+
dependencies:
|
174
|
+
is-glob: 4.0.3
|
175
|
+
dev: false
|
176
|
+
|
177
|
+
/has/1.0.3:
|
178
|
+
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
|
179
|
+
engines: {node: '>= 0.4.0'}
|
180
|
+
dependencies:
|
181
|
+
function-bind: 1.1.1
|
182
|
+
dev: false
|
183
|
+
|
184
|
+
/is-binary-path/2.1.0:
|
185
|
+
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
|
186
|
+
engines: {node: '>=8'}
|
187
|
+
dependencies:
|
188
|
+
binary-extensions: 2.2.0
|
189
|
+
dev: false
|
190
|
+
|
191
|
+
/is-core-module/2.11.0:
|
192
|
+
resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
|
193
|
+
dependencies:
|
194
|
+
has: 1.0.3
|
195
|
+
dev: false
|
196
|
+
|
197
|
+
/is-extglob/2.1.1:
|
198
|
+
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
|
199
|
+
engines: {node: '>=0.10.0'}
|
200
|
+
dev: false
|
201
|
+
|
202
|
+
/is-glob/4.0.3:
|
203
|
+
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
|
204
|
+
engines: {node: '>=0.10.0'}
|
205
|
+
dependencies:
|
206
|
+
is-extglob: 2.1.1
|
207
|
+
dev: false
|
208
|
+
|
209
|
+
/is-number/7.0.0:
|
210
|
+
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
|
211
|
+
engines: {node: '>=0.12.0'}
|
212
|
+
dev: false
|
213
|
+
|
214
|
+
/lilconfig/2.0.6:
|
215
|
+
resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==}
|
216
|
+
engines: {node: '>=10'}
|
217
|
+
dev: false
|
218
|
+
|
219
|
+
/merge2/1.4.1:
|
220
|
+
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
221
|
+
engines: {node: '>= 8'}
|
222
|
+
dev: false
|
223
|
+
|
224
|
+
/micromatch/4.0.5:
|
225
|
+
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
|
226
|
+
engines: {node: '>=8.6'}
|
227
|
+
dependencies:
|
228
|
+
braces: 3.0.2
|
229
|
+
picomatch: 2.3.1
|
230
|
+
dev: false
|
231
|
+
|
232
|
+
/minimist/1.2.7:
|
233
|
+
resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
|
234
|
+
dev: false
|
235
|
+
|
236
|
+
/nanoid/3.3.4:
|
237
|
+
resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
|
238
|
+
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
239
|
+
hasBin: true
|
240
|
+
dev: false
|
241
|
+
|
242
|
+
/normalize-path/3.0.0:
|
243
|
+
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
244
|
+
engines: {node: '>=0.10.0'}
|
245
|
+
dev: false
|
246
|
+
|
247
|
+
/object-hash/3.0.0:
|
248
|
+
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
|
249
|
+
engines: {node: '>= 6'}
|
250
|
+
dev: false
|
251
|
+
|
252
|
+
/path-parse/1.0.7:
|
253
|
+
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
254
|
+
dev: false
|
255
|
+
|
256
|
+
/picocolors/1.0.0:
|
257
|
+
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
|
258
|
+
dev: false
|
259
|
+
|
260
|
+
/picomatch/2.3.1:
|
261
|
+
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
|
262
|
+
engines: {node: '>=8.6'}
|
263
|
+
dev: false
|
264
|
+
|
265
|
+
/pify/2.3.0:
|
266
|
+
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
|
267
|
+
engines: {node: '>=0.10.0'}
|
268
|
+
dev: false
|
269
|
+
|
270
|
+
/postcss-import/14.1.0_postcss@8.4.19:
|
271
|
+
resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
|
272
|
+
engines: {node: '>=10.0.0'}
|
273
|
+
peerDependencies:
|
274
|
+
postcss: ^8.0.0
|
275
|
+
dependencies:
|
276
|
+
postcss: 8.4.19
|
277
|
+
postcss-value-parser: 4.2.0
|
278
|
+
read-cache: 1.0.0
|
279
|
+
resolve: 1.22.1
|
280
|
+
dev: false
|
281
|
+
|
282
|
+
/postcss-js/4.0.0_postcss@8.4.19:
|
283
|
+
resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==}
|
284
|
+
engines: {node: ^12 || ^14 || >= 16}
|
285
|
+
peerDependencies:
|
286
|
+
postcss: ^8.3.3
|
287
|
+
dependencies:
|
288
|
+
camelcase-css: 2.0.1
|
289
|
+
postcss: 8.4.19
|
290
|
+
dev: false
|
291
|
+
|
292
|
+
/postcss-load-config/3.1.4_postcss@8.4.19:
|
293
|
+
resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
|
294
|
+
engines: {node: '>= 10'}
|
295
|
+
peerDependencies:
|
296
|
+
postcss: '>=8.0.9'
|
297
|
+
ts-node: '>=9.0.0'
|
298
|
+
peerDependenciesMeta:
|
299
|
+
postcss:
|
300
|
+
optional: true
|
301
|
+
ts-node:
|
302
|
+
optional: true
|
303
|
+
dependencies:
|
304
|
+
lilconfig: 2.0.6
|
305
|
+
postcss: 8.4.19
|
306
|
+
yaml: 1.10.2
|
307
|
+
dev: false
|
308
|
+
|
309
|
+
/postcss-nested/6.0.0_postcss@8.4.19:
|
310
|
+
resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==}
|
311
|
+
engines: {node: '>=12.0'}
|
312
|
+
peerDependencies:
|
313
|
+
postcss: ^8.2.14
|
314
|
+
dependencies:
|
315
|
+
postcss: 8.4.19
|
316
|
+
postcss-selector-parser: 6.0.11
|
317
|
+
dev: false
|
318
|
+
|
319
|
+
/postcss-selector-parser/6.0.11:
|
320
|
+
resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
|
321
|
+
engines: {node: '>=4'}
|
322
|
+
dependencies:
|
323
|
+
cssesc: 3.0.0
|
324
|
+
util-deprecate: 1.0.2
|
325
|
+
dev: false
|
326
|
+
|
327
|
+
/postcss-value-parser/4.2.0:
|
328
|
+
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
|
329
|
+
dev: false
|
330
|
+
|
331
|
+
/postcss/8.4.19:
|
332
|
+
resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==}
|
333
|
+
engines: {node: ^10 || ^12 || >=14}
|
334
|
+
dependencies:
|
335
|
+
nanoid: 3.3.4
|
336
|
+
picocolors: 1.0.0
|
337
|
+
source-map-js: 1.0.2
|
338
|
+
dev: false
|
339
|
+
|
340
|
+
/queue-microtask/1.2.3:
|
341
|
+
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
342
|
+
dev: false
|
343
|
+
|
344
|
+
/quick-lru/5.1.1:
|
345
|
+
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
|
346
|
+
engines: {node: '>=10'}
|
347
|
+
dev: false
|
348
|
+
|
349
|
+
/read-cache/1.0.0:
|
350
|
+
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
|
351
|
+
dependencies:
|
352
|
+
pify: 2.3.0
|
353
|
+
dev: false
|
354
|
+
|
355
|
+
/readdirp/3.6.0:
|
356
|
+
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
|
357
|
+
engines: {node: '>=8.10.0'}
|
358
|
+
dependencies:
|
359
|
+
picomatch: 2.3.1
|
360
|
+
dev: false
|
361
|
+
|
362
|
+
/resolve/1.22.1:
|
363
|
+
resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
|
364
|
+
hasBin: true
|
365
|
+
dependencies:
|
366
|
+
is-core-module: 2.11.0
|
367
|
+
path-parse: 1.0.7
|
368
|
+
supports-preserve-symlinks-flag: 1.0.0
|
369
|
+
dev: false
|
370
|
+
|
371
|
+
/reusify/1.0.4:
|
372
|
+
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
|
373
|
+
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
374
|
+
dev: false
|
375
|
+
|
376
|
+
/run-parallel/1.2.0:
|
377
|
+
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
|
378
|
+
dependencies:
|
379
|
+
queue-microtask: 1.2.3
|
380
|
+
dev: false
|
381
|
+
|
382
|
+
/source-map-js/1.0.2:
|
383
|
+
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
|
384
|
+
engines: {node: '>=0.10.0'}
|
385
|
+
dev: false
|
386
|
+
|
387
|
+
/supports-preserve-symlinks-flag/1.0.0:
|
388
|
+
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
|
389
|
+
engines: {node: '>= 0.4'}
|
390
|
+
dev: false
|
391
|
+
|
392
|
+
/tailwindcss/3.2.4:
|
393
|
+
resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==}
|
394
|
+
engines: {node: '>=12.13.0'}
|
395
|
+
hasBin: true
|
396
|
+
dependencies:
|
397
|
+
arg: 5.0.2
|
398
|
+
chokidar: 3.5.3
|
399
|
+
color-name: 1.1.4
|
400
|
+
detective: 5.2.1
|
401
|
+
didyoumean: 1.2.2
|
402
|
+
dlv: 1.1.3
|
403
|
+
fast-glob: 3.2.12
|
404
|
+
glob-parent: 6.0.2
|
405
|
+
is-glob: 4.0.3
|
406
|
+
lilconfig: 2.0.6
|
407
|
+
micromatch: 4.0.5
|
408
|
+
normalize-path: 3.0.0
|
409
|
+
object-hash: 3.0.0
|
410
|
+
picocolors: 1.0.0
|
411
|
+
postcss: 8.4.19
|
412
|
+
postcss-import: 14.1.0_postcss@8.4.19
|
413
|
+
postcss-js: 4.0.0_postcss@8.4.19
|
414
|
+
postcss-load-config: 3.1.4_postcss@8.4.19
|
415
|
+
postcss-nested: 6.0.0_postcss@8.4.19
|
416
|
+
postcss-selector-parser: 6.0.11
|
417
|
+
postcss-value-parser: 4.2.0
|
418
|
+
quick-lru: 5.1.1
|
419
|
+
resolve: 1.22.1
|
420
|
+
transitivePeerDependencies:
|
421
|
+
- ts-node
|
422
|
+
dev: false
|
423
|
+
|
424
|
+
/to-regex-range/5.0.1:
|
425
|
+
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
426
|
+
engines: {node: '>=8.0'}
|
427
|
+
dependencies:
|
428
|
+
is-number: 7.0.0
|
429
|
+
dev: false
|
430
|
+
|
431
|
+
/util-deprecate/1.0.2:
|
432
|
+
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
433
|
+
dev: false
|
434
|
+
|
435
|
+
/xtend/4.0.2:
|
436
|
+
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
|
437
|
+
engines: {node: '>=0.4'}
|
438
|
+
dev: false
|
439
|
+
|
440
|
+
/yaml/1.10.2:
|
441
|
+
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
|
442
|
+
engines: {node: '>= 6'}
|
443
|
+
dev: false
|
data/readme.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# SAF-T (Standard Audit File for Tax)
|
2
|
+
|
3
|
+
SAF-T is developed by OECD (Organisation for Economic Co-operation and Development). v1.0 was shipped in 2005, v2.0 was shipped in 2010.
|
4
|
+
|
5
|
+
https://en.wikipedia.org/wiki/SAF-T
|
6
|
+
|
7
|
+
Skatteetaten = The norwegian tax administration
|
8
|
+
|
9
|
+
In Norway we use version v2.0 of the format, but Skatteetaten in Norway has make some modifications and released their own versioning starting on v1.0, but that was a continuation on v2.0. I believe the only changes are related to which nodes should be used for what, so 100% backward compatible for SAF-T v2.0.
|
10
|
+
|
11
|
+
This gem is developed to work in Norway but it should be possible to make it work for all SAF-T versions. We didn't implement all Nodes but it should be quite easy to add.
|
12
|
+
|
13
|
+
Tested and verified for: None yet, Norway is in development
|
14
|
+
|
15
|
+
Even if you are able to create a AuditFile instance it doesn't mean it is valid per the xsd. There are some nodes where you have to choose this set of nodes or this other set of nodes. It would be possible to create such a structure with dry-stuct as well but we would end up with a lot more Nodes, also a bigger difference on xml structure and structs.
|
16
|
+
|
17
|
+
## Setup
|
18
|
+
|
19
|
+
```rb
|
20
|
+
# if you use SAF-T to write xmls you probably want the files to be as compact as
|
21
|
+
# possible in production but nicely formatted in development end test.
|
22
|
+
# default value is AS_XML
|
23
|
+
|
24
|
+
if production
|
25
|
+
SAFT.nokogiri_save_setting = Nokogiri::XML::Node::SaveOptions::AS_XML
|
26
|
+
else
|
27
|
+
SAFT.nokogiri_save_setting = Nokogiri::XML::Node::SaveOptions::DEFAULT_XML
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
## Usage
|
32
|
+
|
33
|
+
```rb
|
34
|
+
require "saft"
|
35
|
+
|
36
|
+
# read a SAF-T file
|
37
|
+
|
38
|
+
xml = File.read("saft.xml")
|
39
|
+
audit_file = SAFT::V2.parse(xml) # instance of SAFT::V2::Types::AuditFile or raises type errors
|
40
|
+
audit_file.header.company.name # name from xml
|
41
|
+
|
42
|
+
# create a SAF-T file
|
43
|
+
audit_file = SAFT::V2::Types::AuditFile.call({
|
44
|
+
header: {
|
45
|
+
audit_file_version: "1.10",
|
46
|
+
audit_file_country: "NO",
|
47
|
+
audit_file_date_created: Date.today,
|
48
|
+
# ...
|
49
|
+
}
|
50
|
+
})
|
51
|
+
|
52
|
+
xml_content = SAFT::V2.scribe(audit_file)
|
53
|
+
# it is recommended to validate against the xsd before taking it further because
|
54
|
+
# it is possible to create invalid xml
|
55
|
+
validations = SAFT::V2.validate(xml_content)
|
56
|
+
validations.valid? # true || false
|
57
|
+
validations.errors? # [] # array of Nokogiri::XML::SyntaxError from xsd errors
|
58
|
+
```
|
59
|
+
|
60
|
+
We supply three types of AuditFile which all can be used to generate the xml.
|
61
|
+
Relaxed, Strict and Sliced. Relaxed does not have any constrains on text length
|
62
|
+
so you are more likely to have XSD errors this way. Strict has more constraints
|
63
|
+
in place, it would raise Dry::Struct::Error when called with invalid options.
|
64
|
+
And the last mode, Sliced. It would cut the string at max length available.
|
65
|
+
|
66
|
+
## Norway
|
67
|
+
|
68
|
+
Main site for skatteetaten https://www.skatteetaten.no/en/business-and-organisation/start-and-run/best-practices-accounting-and-cash-register-systems/saf-t-financial/documentation/
|
69
|
+
|
70
|
+
Git repo from skatteetaten https://github.com/Skatteetaten/saf-t
|
71
|
+
|
72
|
+
SAF-T contains two formats, SAF-T Financial and SAF-T Cash Register.
|
73
|
+
|
74
|
+
Every electronic ERP system has to implement SAF-T Financial. SAF-T Cash
|
75
|
+
Register is either for the cash register to implement or the ERP, I don't know
|
76
|
+
yet. (I believe Cash Register since there should be event log which include
|
77
|
+
open drawer, copy receipt, etc)
|
78
|
+
|
79
|
+
## Html
|
80
|
+
|
81
|
+
We also ship a render for html view. It also ships styles
|
82
|
+
```rb
|
83
|
+
audit_file = SAFT::V2::Types::AuditFile.call({})
|
84
|
+
html = SAFT::V2.to_html(audit_file)
|
85
|
+
css = SAFT::V2::HTML.css
|
86
|
+
css_path = SAFT::V2::HTML.css_path
|
87
|
+
```
|
88
|
+
|
89
|
+
### Dev to rebuild styles
|
90
|
+
```
|
91
|
+
pnpm tailwindcss -i lib/saft/v2/html.css -o ./lib/saft/v2/html_dist.css
|
92
|
+
```
|