saft 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
```
|