@fin.cx/skr 1.0.0 → 1.2.0

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.
Files changed (54) hide show
  1. package/dist_ts/index.d.ts +6 -0
  2. package/dist_ts/index.js +7 -1
  3. package/dist_ts/plugins.d.ts +8 -1
  4. package/dist_ts/plugins.js +10 -2
  5. package/dist_ts/skr.api.d.ts +70 -0
  6. package/dist_ts/skr.api.js +354 -3
  7. package/dist_ts/skr.classes.journalentry.d.ts +1 -0
  8. package/dist_ts/skr.classes.journalentry.js +55 -15
  9. package/dist_ts/skr.classes.ledger.d.ts +4 -0
  10. package/dist_ts/skr.classes.ledger.js +72 -1
  11. package/dist_ts/skr.classes.reports.js +56 -22
  12. package/dist_ts/skr.export.accounts.d.ts +53 -0
  13. package/dist_ts/skr.export.accounts.js +111 -0
  14. package/dist_ts/skr.export.balances.d.ts +59 -0
  15. package/dist_ts/skr.export.balances.js +205 -0
  16. package/dist_ts/skr.export.d.ts +110 -0
  17. package/dist_ts/skr.export.js +315 -0
  18. package/dist_ts/skr.export.ledger.d.ts +95 -0
  19. package/dist_ts/skr.export.ledger.js +164 -0
  20. package/dist_ts/skr.export.pdf.d.ts +82 -0
  21. package/dist_ts/skr.export.pdf.js +548 -0
  22. package/dist_ts/skr.invoice.adapter.d.ts +98 -0
  23. package/dist_ts/skr.invoice.adapter.js +476 -0
  24. package/dist_ts/skr.invoice.booking.d.ts +102 -0
  25. package/dist_ts/skr.invoice.booking.js +556 -0
  26. package/dist_ts/skr.invoice.entity.d.ts +287 -0
  27. package/dist_ts/skr.invoice.entity.js +2 -0
  28. package/dist_ts/skr.invoice.mapper.d.ts +69 -0
  29. package/dist_ts/skr.invoice.mapper.js +401 -0
  30. package/dist_ts/skr.invoice.storage.d.ts +140 -0
  31. package/dist_ts/skr.invoice.storage.js +529 -0
  32. package/dist_ts/skr.security.d.ts +65 -0
  33. package/dist_ts/skr.security.js +319 -0
  34. package/dist_ts/skr.types.d.ts +1 -0
  35. package/package.json +18 -12
  36. package/readme.md +461 -132
  37. package/ts/index.ts +6 -0
  38. package/ts/plugins.ts +22 -1
  39. package/ts/skr.api.ts +489 -2
  40. package/ts/skr.classes.journalentry.ts +63 -14
  41. package/ts/skr.classes.ledger.ts +85 -0
  42. package/ts/skr.classes.reports.ts +64 -21
  43. package/ts/skr.export.accounts.ts +154 -0
  44. package/ts/skr.export.balances.ts +270 -0
  45. package/ts/skr.export.ledger.ts +249 -0
  46. package/ts/skr.export.pdf.ts +601 -0
  47. package/ts/skr.export.ts +443 -0
  48. package/ts/skr.invoice.adapter.ts +581 -0
  49. package/ts/skr.invoice.booking.ts +738 -0
  50. package/ts/skr.invoice.entity.ts +351 -0
  51. package/ts/skr.invoice.mapper.ts +486 -0
  52. package/ts/skr.invoice.storage.ts +710 -0
  53. package/ts/skr.security.ts +405 -0
  54. package/ts/skr.types.ts +1 -0
@@ -0,0 +1,319 @@
1
+ import * as plugins from './plugins.js';
2
+ import * as path from 'path';
3
+ import * as crypto from 'crypto';
4
+ import * as https from 'https';
5
+ export class SecurityManager {
6
+ constructor(options = {}) {
7
+ this.options = {
8
+ timestampServerUrl: options.timestampServerUrl || 'http://timestamp.digicert.com',
9
+ includeTimestamp: options.includeTimestamp !== false,
10
+ ...options
11
+ };
12
+ this.logger = new plugins.smartlog.ConsoleLog();
13
+ }
14
+ /**
15
+ * Creates a CAdES-B (Basic) signature for data
16
+ */
17
+ async createCadesSignature(data, certificatePem, privateKeyPem) {
18
+ const cert = certificatePem || this.options.certificatePem;
19
+ const key = privateKeyPem || this.options.privateKeyPem;
20
+ if (!cert || !key) {
21
+ throw new Error('Certificate and private key are required for signing');
22
+ }
23
+ try {
24
+ // Parse certificate and key
25
+ const certificate = plugins.nodeForge.pki.certificateFromPem(cert);
26
+ const privateKey = this.options.privateKeyPassphrase
27
+ ? plugins.nodeForge.pki.decryptRsaPrivateKey(key, this.options.privateKeyPassphrase)
28
+ : plugins.nodeForge.pki.privateKeyFromPem(key);
29
+ // Create PKCS#7 signed data (CMS)
30
+ const p7 = plugins.nodeForge.pkcs7.createSignedData();
31
+ // Add content
32
+ if (typeof data === 'string') {
33
+ p7.content = plugins.nodeForge.util.createBuffer(data, 'utf8');
34
+ }
35
+ else {
36
+ p7.content = plugins.nodeForge.util.createBuffer(data.toString('latin1'));
37
+ }
38
+ // Add certificate
39
+ p7.addCertificate(certificate);
40
+ // Add signer
41
+ p7.addSigner({
42
+ key: privateKey,
43
+ certificate: certificate,
44
+ digestAlgorithm: plugins.nodeForge.pki.oids.sha256,
45
+ authenticatedAttributes: [
46
+ {
47
+ type: plugins.nodeForge.pki.oids.contentType,
48
+ value: plugins.nodeForge.pki.oids.data
49
+ },
50
+ {
51
+ type: plugins.nodeForge.pki.oids.messageDigest
52
+ },
53
+ {
54
+ type: plugins.nodeForge.pki.oids.signingTime,
55
+ value: new Date().toISOString()
56
+ }
57
+ ]
58
+ });
59
+ // Sign the data
60
+ p7.sign({ detached: true });
61
+ // Convert to PEM
62
+ const pem = plugins.nodeForge.pkcs7.messageToPem(p7);
63
+ // Extract base64 signature
64
+ const signature = pem
65
+ .replace(/-----BEGIN PKCS7-----/, '')
66
+ .replace(/-----END PKCS7-----/, '')
67
+ .replace(/\r?\n/g, '');
68
+ const result = {
69
+ signature: signature,
70
+ signatureFormat: 'CAdES-B',
71
+ signingTime: new Date().toISOString(),
72
+ certificateChain: [cert]
73
+ };
74
+ // Add timestamp if requested
75
+ if (this.options.includeTimestamp && this.options.timestampServerUrl) {
76
+ try {
77
+ const timestampResponse = await this.requestTimestamp(signature);
78
+ result.timestampToken = timestampResponse.token;
79
+ result.timestampTime = timestampResponse.time;
80
+ result.signatureFormat = 'CAdES-T';
81
+ }
82
+ catch (error) {
83
+ this.logger.log('warn', `Failed to obtain timestamp: ${error}`);
84
+ }
85
+ }
86
+ return result;
87
+ }
88
+ catch (error) {
89
+ throw new Error(`Failed to create CAdES signature: ${error}`);
90
+ }
91
+ }
92
+ /**
93
+ * Requests an RFC 3161 timestamp from a TSA
94
+ */
95
+ async requestTimestamp(dataHash) {
96
+ try {
97
+ // Create hash of the data
98
+ let hash;
99
+ if (typeof dataHash === 'string') {
100
+ hash = crypto.createHash('sha256').update(dataHash).digest();
101
+ }
102
+ else {
103
+ hash = crypto.createHash('sha256').update(dataHash).digest();
104
+ }
105
+ // Create timestamp request (simplified - in production use proper ASN.1 encoding)
106
+ const tsRequest = this.createTimestampRequest(hash);
107
+ // Send request to TSA
108
+ const response = await this.sendTimestampRequest(tsRequest);
109
+ return {
110
+ token: response.toString('base64'),
111
+ time: new Date().toISOString(),
112
+ serverUrl: this.options.timestampServerUrl,
113
+ hashAlgorithm: 'sha256'
114
+ };
115
+ }
116
+ catch (error) {
117
+ throw new Error(`Failed to obtain timestamp: ${error}`);
118
+ }
119
+ }
120
+ /**
121
+ * Creates a timestamp request (simplified version)
122
+ */
123
+ createTimestampRequest(hash) {
124
+ // In production, use proper ASN.1 encoding library
125
+ // This is a simplified placeholder
126
+ const request = {
127
+ version: 1,
128
+ messageImprint: {
129
+ hashAlgorithm: { algorithm: '2.16.840.1.101.3.4.2.1' }, // SHA-256 OID
130
+ hashedMessage: hash
131
+ },
132
+ reqPolicy: null,
133
+ nonce: crypto.randomBytes(8),
134
+ certReq: true
135
+ };
136
+ // Convert to DER-encoded ASN.1 (simplified)
137
+ return Buffer.from(JSON.stringify(request));
138
+ }
139
+ /**
140
+ * Sends timestamp request to TSA server
141
+ */
142
+ async sendTimestampRequest(request) {
143
+ return new Promise((resolve, reject) => {
144
+ const url = new URL(this.options.timestampServerUrl);
145
+ const options = {
146
+ hostname: url.hostname,
147
+ port: url.port || 443,
148
+ path: url.pathname,
149
+ method: 'POST',
150
+ headers: {
151
+ 'Content-Type': 'application/timestamp-query',
152
+ 'Content-Length': request.length
153
+ }
154
+ };
155
+ const req = https.request(options, (res) => {
156
+ const chunks = [];
157
+ res.on('data', (chunk) => chunks.push(chunk));
158
+ res.on('end', () => {
159
+ const response = Buffer.concat(chunks);
160
+ if (res.statusCode === 200) {
161
+ resolve(response);
162
+ }
163
+ else {
164
+ reject(new Error(`TSA server returned status ${res.statusCode}`));
165
+ }
166
+ });
167
+ });
168
+ req.on('error', reject);
169
+ req.write(request);
170
+ req.end();
171
+ });
172
+ }
173
+ /**
174
+ * Verifies a CAdES signature
175
+ */
176
+ async verifyCadesSignature(data, signature, certificatePem) {
177
+ try {
178
+ // Add PEM headers if not present
179
+ let pemSignature = signature;
180
+ if (!signature.includes('BEGIN PKCS7')) {
181
+ pemSignature = `-----BEGIN PKCS7-----\n${signature}\n-----END PKCS7-----`;
182
+ }
183
+ // Parse the PKCS#7 message
184
+ const p7 = plugins.nodeForge.pkcs7.messageFromPem(pemSignature);
185
+ // Prepare content for verification
186
+ let content;
187
+ if (typeof data === 'string') {
188
+ content = plugins.nodeForge.util.createBuffer(data, 'utf8');
189
+ }
190
+ else {
191
+ content = plugins.nodeForge.util.createBuffer(data.toString('latin1'));
192
+ }
193
+ // Verify the signature
194
+ const verified = p7.verify({
195
+ content: content,
196
+ detached: true
197
+ });
198
+ return verified;
199
+ }
200
+ catch (error) {
201
+ this.logger.log('error', `Signature verification failed: ${error}`);
202
+ return false;
203
+ }
204
+ }
205
+ /**
206
+ * Generates a self-signed certificate for testing
207
+ */
208
+ async generateSelfSignedCertificate(commonName = 'SKR Export System', validDays = 365) {
209
+ const keys = plugins.nodeForge.pki.rsa.generateKeyPair(2048);
210
+ const cert = plugins.nodeForge.pki.createCertificate();
211
+ cert.publicKey = keys.publicKey;
212
+ cert.serialNumber = '01';
213
+ cert.validity.notBefore = new Date();
214
+ cert.validity.notAfter = new Date();
215
+ cert.validity.notAfter.setDate(cert.validity.notAfter.getDate() + validDays);
216
+ const attrs = [
217
+ { name: 'commonName', value: commonName },
218
+ { name: 'countryName', value: 'DE' },
219
+ { name: 'organizationName', value: 'SKR Export System' },
220
+ { shortName: 'OU', value: 'Accounting' }
221
+ ];
222
+ cert.setSubject(attrs);
223
+ cert.setIssuer(attrs);
224
+ cert.setExtensions([
225
+ {
226
+ name: 'basicConstraints',
227
+ cA: true
228
+ },
229
+ {
230
+ name: 'keyUsage',
231
+ keyCertSign: true,
232
+ digitalSignature: true,
233
+ nonRepudiation: true,
234
+ keyEncipherment: true,
235
+ dataEncipherment: true
236
+ },
237
+ {
238
+ name: 'extKeyUsage',
239
+ serverAuth: true,
240
+ clientAuth: true,
241
+ codeSigning: true,
242
+ emailProtection: true,
243
+ timeStamping: true
244
+ },
245
+ {
246
+ name: 'nsCertType',
247
+ client: true,
248
+ server: true,
249
+ email: true,
250
+ objsign: true,
251
+ sslCA: true,
252
+ emailCA: true,
253
+ objCA: true
254
+ },
255
+ {
256
+ name: 'subjectAltName',
257
+ altNames: [
258
+ { type: 2, value: commonName }
259
+ ]
260
+ }
261
+ ]);
262
+ // Self-sign certificate
263
+ cert.sign(keys.privateKey, plugins.nodeForge.md.sha256.create());
264
+ // Convert to PEM
265
+ const certificatePem = plugins.nodeForge.pki.certificateToPem(cert);
266
+ const privateKeyPem = plugins.nodeForge.pki.privateKeyToPem(keys.privateKey);
267
+ return {
268
+ certificate: certificatePem,
269
+ privateKey: privateKeyPem
270
+ };
271
+ }
272
+ /**
273
+ * Creates a detached signature file
274
+ */
275
+ async createDetachedSignature(dataPath, outputPath) {
276
+ const data = await plugins.smartfile.fs.toBuffer(dataPath);
277
+ const signature = await this.createCadesSignature(data);
278
+ const signatureData = {
279
+ signature: signature.signature,
280
+ format: signature.signatureFormat,
281
+ signingTime: signature.signingTime,
282
+ timestamp: signature.timestampToken,
283
+ timestampTime: signature.timestampTime,
284
+ algorithm: 'SHA256withRSA',
285
+ signedFile: path.basename(dataPath)
286
+ };
287
+ await plugins.smartfile.memory.toFs(JSON.stringify(signatureData, null, 2), outputPath);
288
+ }
289
+ /**
290
+ * Verifies a detached signature file
291
+ */
292
+ async verifyDetachedSignature(dataPath, signaturePath) {
293
+ try {
294
+ const data = await plugins.smartfile.fs.toBuffer(dataPath);
295
+ const signatureJson = await plugins.smartfile.fs.toStringSync(signaturePath);
296
+ const signatureData = JSON.parse(signatureJson);
297
+ return await this.verifyCadesSignature(data, signatureData.signature);
298
+ }
299
+ catch (error) {
300
+ this.logger.log('error', `Failed to verify detached signature: ${error}`);
301
+ return false;
302
+ }
303
+ }
304
+ /**
305
+ * Adds Long-Term Validation (LTV) information
306
+ */
307
+ async addLtvInformation(signature, ocspResponse, crlData) {
308
+ // Add OCSP response and CRL data for long-term validation
309
+ const ltv = {
310
+ ...signature,
311
+ signatureFormat: 'CAdES-LT',
312
+ ocsp: ocspResponse?.toString('base64'),
313
+ crl: crlData?.toString('base64'),
314
+ ltvTime: new Date().toISOString()
315
+ };
316
+ return ltv;
317
+ }
318
+ }
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLnNlY3VyaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc2tyLnNlY3VyaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBMEIvQixNQUFNLE9BQU8sZUFBZTtJQUkxQixZQUFZLFVBQTJCLEVBQUU7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSwrQkFBK0I7WUFDakYsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixLQUFLLEtBQUs7WUFDcEQsR0FBRyxPQUFPO1NBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FDL0IsSUFBcUIsRUFDckIsY0FBdUIsRUFDdkIsYUFBc0I7UUFFdEIsTUFBTSxJQUFJLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzNELE1BQU0sR0FBRyxHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUV4RCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCw0QkFBNEI7WUFDNUIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0I7Z0JBQ2xELENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztnQkFDcEYsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWpELGtDQUFrQztZQUNsQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRXRELGNBQWM7WUFDZCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixFQUFFLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDakUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEVBQUUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1RSxDQUFDO1lBRUQsa0JBQWtCO1lBQ2xCLEVBQUUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFL0IsYUFBYTtZQUNiLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ1gsR0FBRyxFQUFFLFVBQVU7Z0JBQ2YsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLGVBQWUsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTTtnQkFDbEQsdUJBQXVCLEVBQUU7b0JBQ3ZCO3dCQUNFLElBQUksRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVzt3QkFDNUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJO3FCQUN2QztvQkFDRDt3QkFDRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWE7cUJBQy9DO29CQUNEO3dCQUNFLElBQUksRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVzt3QkFDNUMsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO3FCQUNoQztpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILGdCQUFnQjtZQUNoQixFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFNUIsaUJBQWlCO1lBQ2pCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVyRCwyQkFBMkI7WUFDM0IsTUFBTSxTQUFTLEdBQUcsR0FBRztpQkFDbEIsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQztpQkFDcEMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztpQkFDbEMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV6QixNQUFNLE1BQU0sR0FBcUI7Z0JBQy9CLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixlQUFlLEVBQUUsU0FBUztnQkFDMUIsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNyQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQzthQUN6QixDQUFDO1lBRUYsNkJBQTZCO1lBQzdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3JFLElBQUksQ0FBQztvQkFDSCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNqRSxNQUFNLENBQUMsY0FBYyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQztvQkFDaEQsTUFBTSxDQUFDLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7b0JBQzlDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2dCQUNyQyxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLCtCQUErQixLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQXlCO1FBQ3JELElBQUksQ0FBQztZQUNILDBCQUEwQjtZQUMxQixJQUFJLElBQVksQ0FBQztZQUNqQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvRCxDQUFDO1lBRUQsa0ZBQWtGO1lBQ2xGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVwRCxzQkFBc0I7WUFDdEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFNUQsT0FBTztnQkFDTCxLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDOUIsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQW1CO2dCQUMzQyxhQUFhLEVBQUUsUUFBUTthQUN4QixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxzQkFBc0IsQ0FBQyxJQUFZO1FBQ3pDLG1EQUFtRDtRQUNuRCxtQ0FBbUM7UUFDbkMsTUFBTSxPQUFPLEdBQUc7WUFDZCxPQUFPLEVBQUUsQ0FBQztZQUNWLGNBQWMsRUFBRTtnQkFDZCxhQUFhLEVBQUUsRUFBRSxTQUFTLEVBQUUsd0JBQXdCLEVBQUUsRUFBRSxjQUFjO2dCQUN0RSxhQUFhLEVBQUUsSUFBSTthQUNwQjtZQUNELFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztRQUVGLDRDQUE0QztRQUM1QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxPQUFlO1FBQ2hELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBbUIsQ0FBQyxDQUFDO1lBRXRELE1BQU0sT0FBTyxHQUFHO2dCQUNkLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtnQkFDdEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRztnQkFDckIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRO2dCQUNsQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxPQUFPLEVBQUU7b0JBQ1AsY0FBYyxFQUFFLDZCQUE2QjtvQkFDN0MsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLE1BQU07aUJBQ2pDO2FBQ0YsQ0FBQztZQUVGLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3pDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztnQkFFNUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDOUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO29CQUNqQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN2QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7d0JBQzNCLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDcEIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDcEUsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDeEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FDL0IsSUFBcUIsRUFDckIsU0FBaUIsRUFDakIsY0FBdUI7UUFFdkIsSUFBSSxDQUFDO1lBQ0gsaUNBQWlDO1lBQ2pDLElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxZQUFZLEdBQUcsMEJBQTBCLFNBQVMsdUJBQXVCLENBQUM7WUFDNUUsQ0FBQztZQUVELDJCQUEyQjtZQUMzQixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFaEUsbUNBQW1DO1lBQ25DLElBQUksT0FBZ0QsQ0FBQztZQUNyRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekUsQ0FBQztZQUVELHVCQUF1QjtZQUN2QixNQUFNLFFBQVEsR0FBSSxFQUFVLENBQUMsTUFBTSxDQUFDO2dCQUNsQyxPQUFPLEVBQUUsT0FBTztnQkFDaEIsUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7WUFFSCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxrQ0FBa0MsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNwRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsNkJBQTZCLENBQ3hDLGFBQXFCLG1CQUFtQixFQUN4QyxZQUFvQixHQUFHO1FBRXZCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV2RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUU3RSxNQUFNLEtBQUssR0FBRztZQUNaLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQ3pDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ3BDLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtZQUN4RCxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtTQUN6QyxDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRCLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDakI7Z0JBQ0UsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsRUFBRSxFQUFFLElBQUk7YUFDVDtZQUNEO2dCQUNFLElBQUksRUFBRSxVQUFVO2dCQUNoQixXQUFXLEVBQUUsSUFBSTtnQkFDakIsZ0JBQWdCLEVBQUUsSUFBSTtnQkFDdEIsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixnQkFBZ0IsRUFBRSxJQUFJO2FBQ3ZCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixZQUFZLEVBQUUsSUFBSTthQUNuQjtZQUNEO2dCQUNFLElBQUksRUFBRSxZQUFZO2dCQUNsQixNQUFNLEVBQUUsSUFBSTtnQkFDWixNQUFNLEVBQUUsSUFBSTtnQkFDWixLQUFLLEVBQUUsSUFBSTtnQkFDWCxPQUFPLEVBQUUsSUFBSTtnQkFDYixLQUFLLEVBQUUsSUFBSTtnQkFDWCxPQUFPLEVBQUUsSUFBSTtnQkFDYixLQUFLLEVBQUUsSUFBSTthQUNaO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsUUFBUSxFQUFFO29CQUNSLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO2lCQUMvQjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVqRSxpQkFBaUI7UUFDakIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3RSxPQUFPO1lBQ0wsV0FBVyxFQUFFLGNBQWM7WUFDM0IsVUFBVSxFQUFFLGFBQWE7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbEMsUUFBZ0IsRUFDaEIsVUFBa0I7UUFFbEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEQsTUFBTSxhQUFhLEdBQUc7WUFDcEIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzlCLE1BQU0sRUFBRSxTQUFTLENBQUMsZUFBZTtZQUNqQyxXQUFXLEVBQUUsU0FBUyxDQUFDLFdBQVc7WUFDbEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjO1lBQ25DLGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYTtZQUN0QyxTQUFTLEVBQUUsZUFBZTtZQUMxQixVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDcEMsQ0FBQztRQUVGLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQ3RDLFVBQVUsQ0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLHVCQUF1QixDQUNsQyxRQUFnQixFQUNoQixhQUFxQjtRQUVyQixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRCxNQUFNLGFBQWEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRWhELE9BQU8sTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSx3Q0FBd0MsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQzVCLFNBQTJCLEVBQzNCLFlBQXFCLEVBQ3JCLE9BQWdCO1FBRWhCLDBEQUEwRDtRQUMxRCxNQUFNLEdBQUcsR0FBRztZQUNWLEdBQUcsU0FBUztZQUNaLGVBQWUsRUFBRSxVQUFtQjtZQUNwQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDdEMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ2hDLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtTQUNsQyxDQUFDO1FBRUYsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YifQ==
@@ -110,6 +110,7 @@ export interface ITransactionFilter {
110
110
  export interface IDatabaseConfig {
111
111
  mongoDbUrl: string;
112
112
  dbName?: string;
113
+ invoiceExportPath?: string;
113
114
  }
114
115
  export interface IReportParams {
115
116
  dateFrom?: Date;
package/package.json CHANGED
@@ -1,15 +1,10 @@
1
1
  {
2
2
  "name": "@fin.cx/skr",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "SKR03 and SKR04 German accounting standards for double-entry bookkeeping",
5
5
  "main": "dist_ts/index.js",
6
6
  "typings": "dist_ts/index.d.ts",
7
7
  "type": "module",
8
- "scripts": {
9
- "test": "tstest test/ --verbose --logfile --timeout=60",
10
- "build": "tsbuild --web --node",
11
- "buildDocs": "tsdoc"
12
- },
13
8
  "keywords": [
14
9
  "skr03",
15
10
  "skr04",
@@ -23,17 +18,26 @@
23
18
  ],
24
19
  "author": "Fin.cx",
25
20
  "license": "MIT",
26
- "packageManager": "pnpm@10.11.0",
27
21
  "dependencies": {
22
+ "@e-invoice-eu/core": "^2.1.9",
23
+ "@fin.cx/einvoice": "5.1.4",
28
24
  "@push.rocks/smartdata": "^5.15.1",
25
+ "@push.rocks/smartfile": "^11.0.22",
26
+ "@push.rocks/smarthash": "^3.0.7",
29
27
  "@push.rocks/smartlog": "^3.1.8",
28
+ "@push.rocks/smartpath": "^5.0.18",
29
+ "@push.rocks/smartpdf": "^3.1.5",
30
30
  "@push.rocks/smarttime": "^4.1.1",
31
- "@push.rocks/smartunique": "^3.0.9"
31
+ "@push.rocks/smartunique": "^3.0.9",
32
+ "merkletreejs": "^0.4.0",
33
+ "node-forge": "^1.3.1"
32
34
  },
33
35
  "devDependencies": {
34
36
  "@git.zone/tsbuild": "^2.6.4",
35
37
  "@git.zone/tsrun": "^1.3.3",
36
- "@git.zone/tstest": "^2.3.2"
38
+ "@git.zone/tstest": "^2.3.2",
39
+ "@push.rocks/qenv": "^6.1.0",
40
+ "@types/node-forge": "^1.3.11"
37
41
  },
38
42
  "repository": {
39
43
  "type": "git",
@@ -55,7 +59,9 @@
55
59
  "npmextra.json",
56
60
  "readme.md"
57
61
  ],
58
- "pnpm": {
59
- "overrides": {}
62
+ "scripts": {
63
+ "test": "tstest test/ --verbose --logfile --timeout=60",
64
+ "build": "tsbuild --web --node",
65
+ "buildDocs": "tsdoc"
60
66
  }
61
- }
67
+ }