@fin.cx/skr 1.3.0 → 2.0.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.
- package/.smartconfig.json +33 -6
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/core/core.accountpolicy.d.ts +67 -0
- package/dist_ts/core/core.accountpolicy.js +91 -0
- package/dist_ts/core/core.bukeys.d.ts +38 -0
- package/dist_ts/core/core.bukeys.js +117 -0
- package/dist_ts/core/core.datev.captions.d.ts +7 -0
- package/dist_ts/core/core.datev.captions.js +134 -0
- package/dist_ts/core/core.datev.d.ts +47 -0
- package/dist_ts/core/core.datev.js +129 -0
- package/dist_ts/core/core.hash.d.ts +27 -0
- package/dist_ts/core/core.hash.js +72 -0
- package/dist_ts/core/core.plugins.d.ts +3 -0
- package/dist_ts/core/core.plugins.js +9 -0
- package/dist_ts/core/core.recipes.d.ts +118 -0
- package/dist_ts/core/core.recipes.js +504 -0
- package/dist_ts/core/core.taxscenario.d.ts +27 -0
- package/dist_ts/core/core.taxscenario.js +85 -0
- package/dist_ts/core/core.types.d.ts +48 -0
- package/dist_ts/core/core.types.js +2 -0
- package/dist_ts/core/core.validate.d.ts +17 -0
- package/dist_ts/core/core.validate.js +89 -0
- package/dist_ts/core/index.d.ts +15 -0
- package/dist_ts/core/index.js +16 -0
- package/dist_ts/index.d.ts +15 -0
- package/dist_ts/index.js +10 -1
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +4 -2
- package/dist_ts/skr.api.d.ts +91 -22
- package/dist_ts/skr.api.js +357 -42
- package/dist_ts/skr.balances.d.ts +28 -0
- package/dist_ts/skr.balances.js +96 -0
- package/dist_ts/skr.classes.journalentry.d.ts +19 -3
- package/dist_ts/skr.classes.journalentry.js +67 -4
- package/dist_ts/skr.classes.reports.js +49 -102
- package/dist_ts/skr.database.d.ts +2 -0
- package/dist_ts/skr.database.js +1 -1
- package/dist_ts/skr.errors.d.ts +18 -0
- package/dist_ts/skr.errors.js +34 -0
- package/dist_ts/skr.export.js +4 -7
- package/dist_ts/skr.invoice.adapter.d.ts +15 -1
- package/dist_ts/skr.invoice.adapter.js +253 -41
- package/dist_ts/skr.invoice.booking.js +14 -28
- package/dist_ts/skr.migrate.d.ts +20 -0
- package/dist_ts/skr.migrate.js +223 -0
- package/dist_ts/skr.period.d.ts +47 -0
- package/dist_ts/skr.period.js +95 -0
- package/dist_ts/skr.posting.d.ts +74 -0
- package/dist_ts/skr.posting.js +209 -0
- package/dist_ts/skr.security.d.ts +6 -9
- package/dist_ts/skr.security.js +16 -89
- package/dist_ts/skr.sequence.d.ts +32 -0
- package/dist_ts/skr.sequence.js +51 -0
- package/dist_ts/skr.txview.d.ts +46 -0
- package/dist_ts/skr.txview.js +235 -0
- package/dist_ts/skr.types.d.ts +35 -1
- package/dist_ts/skr.verify.d.ts +13 -0
- package/dist_ts/skr.verify.js +84 -0
- package/package.json +21 -24
- package/readme.hints.md +37 -0
- package/readme.md +94 -1
- package/readme.plan.md +180 -243
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/core.accountpolicy.ts +154 -0
- package/ts/core/core.bukeys.ts +146 -0
- package/ts/core/core.datev.captions.ts +133 -0
- package/ts/core/core.datev.ts +174 -0
- package/ts/core/core.hash.ts +76 -0
- package/ts/core/core.plugins.ts +9 -0
- package/ts/core/core.recipes.ts +659 -0
- package/ts/core/core.taxscenario.ts +156 -0
- package/ts/core/core.types.ts +74 -0
- package/ts/core/core.validate.ts +119 -0
- package/ts/core/index.ts +15 -0
- package/ts/index.ts +31 -0
- package/ts/plugins.ts +4 -0
- package/ts/skr.api.ts +432 -46
- package/ts/skr.balances.ts +127 -0
- package/ts/skr.classes.journalentry.ts +54 -5
- package/ts/skr.classes.reports.ts +54 -126
- package/ts/skr.database.ts +3 -0
- package/ts/skr.errors.ts +44 -0
- package/ts/skr.export.ts +3 -6
- package/ts/skr.invoice.adapter.ts +291 -45
- package/ts/skr.invoice.booking.ts +22 -34
- package/ts/skr.migrate.ts +268 -0
- package/ts/skr.period.ts +139 -0
- package/ts/skr.posting.ts +273 -0
- package/ts/skr.security.ts +18 -93
- package/ts/skr.sequence.ts +89 -0
- package/ts/skr.txview.ts +268 -0
- package/ts/skr.types.ts +37 -1
- package/ts/skr.verify.ts +99 -0
- /package/{license.md → license} +0 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import { JournalEntry } from './skr.classes.journalentry.js';
|
|
3
|
+
import { JournalPoster } from './skr.posting.js';
|
|
4
|
+
import { journalInputToDraft } from './skr.txview.js';
|
|
3
5
|
import { SKRInvoiceMapper } from './skr.invoice.mapper.js';
|
|
4
6
|
import { suggestPostingKey } from './skr.postingkeys.js';
|
|
5
7
|
/**
|
|
@@ -43,12 +45,15 @@ export class InvoiceBookingEngine {
|
|
|
43
45
|
};
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
|
-
// Build journal
|
|
47
|
-
const
|
|
48
|
-
|
|
48
|
+
// Build journal input and post it atomically via the v2 path
|
|
49
|
+
const journalData = await this.buildJournalEntry(invoice, rules, options);
|
|
50
|
+
const journalEntry = await new JournalPoster().postDraft(journalInputToDraft(journalData));
|
|
51
|
+
if (invoice.status !== 'posted') {
|
|
52
|
+
invoice.status = 'posted';
|
|
53
|
+
}
|
|
49
54
|
const bookingInfo = {
|
|
50
55
|
journalEntryId: journalEntry.id,
|
|
51
|
-
transactionIds:
|
|
56
|
+
transactionIds: [],
|
|
52
57
|
bookedAt: new Date(),
|
|
53
58
|
bookedBy: 'system',
|
|
54
59
|
bookingRules: {
|
|
@@ -61,21 +66,6 @@ export class InvoiceBookingEngine {
|
|
|
61
66
|
confidence,
|
|
62
67
|
autoBooked: options?.autoBook || false
|
|
63
68
|
};
|
|
64
|
-
// Post the journal entry
|
|
65
|
-
// TODO: When MongoDB transactions are available, wrap this in a transaction
|
|
66
|
-
// Example: await db.withTransaction(async (session) => { ... })
|
|
67
|
-
try {
|
|
68
|
-
await journalEntry.validate();
|
|
69
|
-
await journalEntry.post();
|
|
70
|
-
// Mark invoice as posted if we have a reference to it
|
|
71
|
-
if (invoice.status !== 'posted') {
|
|
72
|
-
invoice.status = 'posted';
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
catch (postError) {
|
|
76
|
-
this.logger.log('error', `Failed to post journal entry: ${postError}`);
|
|
77
|
-
throw postError; // Re-throw to trigger rollback when transactions are available
|
|
78
|
-
}
|
|
79
69
|
return {
|
|
80
70
|
success: true,
|
|
81
71
|
journalEntry,
|
|
@@ -111,16 +101,14 @@ export class InvoiceBookingEngine {
|
|
|
111
101
|
// Outbound invoice (AR)
|
|
112
102
|
lines.push(...this.buildAREntry(invoice, rules, reverseDirection));
|
|
113
103
|
}
|
|
114
|
-
//
|
|
115
|
-
|
|
104
|
+
// Journal input data — posted through the v2 atomic path by the caller
|
|
105
|
+
return {
|
|
116
106
|
date: options?.bookingDate || invoice.issueDate,
|
|
117
107
|
description: this.buildDescription(invoice),
|
|
118
108
|
reference: options?.bookingReference || invoice.invoiceNumber,
|
|
119
109
|
lines,
|
|
120
110
|
skrType: this.skrType
|
|
121
111
|
};
|
|
122
|
-
const journalEntry = new JournalEntry(journalData);
|
|
123
|
-
return journalEntry;
|
|
124
112
|
}
|
|
125
113
|
/**
|
|
126
114
|
* Build AP (Accounts Payable) journal entry lines
|
|
@@ -418,7 +406,7 @@ export class InvoiceBookingEngine {
|
|
|
418
406
|
}
|
|
419
407
|
}
|
|
420
408
|
}
|
|
421
|
-
// Create journal entry for payment
|
|
409
|
+
// Create journal entry for payment (v2 atomic path)
|
|
422
410
|
const journalData = {
|
|
423
411
|
date: payment.paymentDate,
|
|
424
412
|
description: `Payment for invoice ${invoice.invoiceNumber}`,
|
|
@@ -426,9 +414,7 @@ export class InvoiceBookingEngine {
|
|
|
426
414
|
lines,
|
|
427
415
|
skrType: this.skrType
|
|
428
416
|
};
|
|
429
|
-
const journalEntry = new
|
|
430
|
-
await journalEntry.validate();
|
|
431
|
-
await journalEntry.post();
|
|
417
|
+
const journalEntry = await new JournalPoster().postDraft(journalInputToDraft(journalData));
|
|
432
418
|
return {
|
|
433
419
|
success: true,
|
|
434
420
|
journalEntry,
|
|
@@ -580,4 +566,4 @@ export class InvoiceBookingEngine {
|
|
|
580
566
|
return Array.from(accounts);
|
|
581
567
|
}
|
|
582
568
|
}
|
|
583
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmludm9pY2UuYm9va2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Nrci5pbnZvaWNlLmJvb2tpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBa0N6RDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBQ3ZCLE1BQU0sQ0FBOEI7SUFDcEMsT0FBTyxDQUFXO0lBQ2xCLE1BQU0sQ0FBbUI7SUFFakMsWUFBWSxPQUFpQjtRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FDdEIsT0FBaUIsRUFDakIsWUFBcUMsRUFDckMsT0FBeUI7UUFFekIsSUFBSSxDQUFDO1lBQ0gsNkJBQTZCO1lBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVqRSx1QkFBdUI7WUFDdkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFbkUsbUNBQW1DO1lBQ25DLElBQUksT0FBTyxFQUFFLFFBQVEsSUFBSSxVQUFVLEdBQUcsQ0FBQyxPQUFPLENBQUMs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
|
|
569
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmludm9pY2UuYm9va2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Nrci5pbnZvaWNlLmJvb2tpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWtDekQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixNQUFNLENBQThCO0lBQ3BDLE9BQU8sQ0FBVztJQUNsQixNQUFNLENBQW1CO0lBRWpDLFlBQVksT0FBaUI7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxXQUFXLENBQ3RCLE9BQWlCLEVBQ2pCLFlBQXFDLEVBQ3JDLE9BQXlCO1FBRXpCLElBQUksQ0FBQztZQUNILDZCQUE2QjtZQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFakUsdUJBQXVCO1lBQ3ZCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxF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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface IMigrationReport {
|
|
2
|
+
startedAt: Date;
|
|
3
|
+
finishedAt: Date | null;
|
|
4
|
+
m001: {
|
|
5
|
+
journalEntriesBackfilled: number;
|
|
6
|
+
transactionsBackfilled: number;
|
|
7
|
+
maxDriftCents: number;
|
|
8
|
+
};
|
|
9
|
+
m002: {
|
|
10
|
+
legacyEntriesUpgraded: number;
|
|
11
|
+
transactionsSynthesized: number;
|
|
12
|
+
};
|
|
13
|
+
m003: Array<{
|
|
14
|
+
skrType: string;
|
|
15
|
+
fiscalYear: number;
|
|
16
|
+
chainedEntries: number;
|
|
17
|
+
headHash: string;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
export declare function migrateToV2(): Promise<IMigrationReport>;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v1 -> v2 data migration (offline, idempotent, additive):
|
|
3
|
+
*
|
|
4
|
+
* M001 cents backfill — every legacy JournalEntry line gains exact-cent v2
|
|
5
|
+
* fields (amountCents/side/counterAccount/buKey) next to the kept
|
|
6
|
+
* float fields; sub-cent drift beyond the guard aborts loudly.
|
|
7
|
+
* M002 unify journal — standalone legacy Transactions (not referenced by any
|
|
8
|
+
* JournalEntry) become synthesized two-line entries (legacyImport);
|
|
9
|
+
* legacy entries get schemaVersion 2 so aggregations see them.
|
|
10
|
+
* v1 'reversed' status maps to 'posted' (kept as legacyStatus) so
|
|
11
|
+
* original+reversal pairs net to zero in aggregations.
|
|
12
|
+
* M003 sequence + chain — all v2 entries without a sequenceNumber are
|
|
13
|
+
* appended to the hash chain per (skrType, fiscalYear) in deterministic
|
|
14
|
+
* order (postedAt/createdAt/date, then id).
|
|
15
|
+
*
|
|
16
|
+
* Legacy float fields are never removed; the Transaction collection is kept
|
|
17
|
+
* as a frozen read model. The returned report is a Verfahrensdokumentation
|
|
18
|
+
* artifact — persist it with your records.
|
|
19
|
+
*/
|
|
20
|
+
import * as plugins from './plugins.js';
|
|
21
|
+
import * as core from './core/index.js';
|
|
22
|
+
import { getDbSync } from './skr.database.js';
|
|
23
|
+
import { JOURNAL_ENTRY_COLLECTION } from './skr.period.js';
|
|
24
|
+
import { buildHashPayload } from './skr.posting.js';
|
|
25
|
+
import { mapNumericPostingKey } from './skr.txview.js';
|
|
26
|
+
const { centsFromFloat } = plugins.calculation;
|
|
27
|
+
/** drift guard for legacy float data (plan: abort on drift > 0.5 cent) */
|
|
28
|
+
const LEGACY_DRIFT_CENTS = 0.5;
|
|
29
|
+
function toCents(value, driftTracker) {
|
|
30
|
+
const exact = value * 100;
|
|
31
|
+
const rounded = Math.round(exact);
|
|
32
|
+
const drift = Math.abs(exact - rounded);
|
|
33
|
+
if (drift > driftTracker.max)
|
|
34
|
+
driftTracker.max = drift;
|
|
35
|
+
return centsFromFloat(value, LEGACY_DRIFT_CENTS);
|
|
36
|
+
}
|
|
37
|
+
export async function migrateToV2() {
|
|
38
|
+
const db = getDbSync();
|
|
39
|
+
const entries = db.mongoDb.collection(JOURNAL_ENTRY_COLLECTION);
|
|
40
|
+
const transactions = db.mongoDb.collection('Transaction');
|
|
41
|
+
const drift = { max: 0 };
|
|
42
|
+
const report = {
|
|
43
|
+
startedAt: new Date(),
|
|
44
|
+
finishedAt: null,
|
|
45
|
+
m001: { journalEntriesBackfilled: 0, transactionsBackfilled: 0, maxDriftCents: 0 },
|
|
46
|
+
m002: { legacyEntriesUpgraded: 0, transactionsSynthesized: 0 },
|
|
47
|
+
m003: [],
|
|
48
|
+
};
|
|
49
|
+
// ---------- M001: cents backfill on legacy journal entries ----------
|
|
50
|
+
const legacyEntries = await entries
|
|
51
|
+
.find({ schemaVersion: { $exists: false } })
|
|
52
|
+
.toArray();
|
|
53
|
+
for (const doc of legacyEntries) {
|
|
54
|
+
const lines = (doc.lines ?? []);
|
|
55
|
+
const debitLines = lines.filter((line) => (line.debit ?? 0) > 0);
|
|
56
|
+
const creditLines = lines.filter((line) => (line.credit ?? 0) > 0);
|
|
57
|
+
const counterFor = (isDebit) => {
|
|
58
|
+
const opposite = isDebit ? creditLines : debitLines;
|
|
59
|
+
return opposite[0]?.accountNumber ?? '';
|
|
60
|
+
};
|
|
61
|
+
const upgraded = lines.map((line) => {
|
|
62
|
+
const isDebit = (line.debit ?? 0) > 0;
|
|
63
|
+
const amount = isDebit ? line.debit : (line.credit ?? 0);
|
|
64
|
+
return {
|
|
65
|
+
...line,
|
|
66
|
+
side: line.side ?? (isDebit ? 'debit' : 'credit'),
|
|
67
|
+
amountCents: line.amountCents ?? toCents(amount, drift),
|
|
68
|
+
counterAccount: line.counterAccount ?? counterFor(isDebit),
|
|
69
|
+
buKey: line.buKey ?? mapNumericPostingKey(line.postingKey),
|
|
70
|
+
buchungstext: line.buchungstext ?? line.description ?? doc.description,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
await entries.updateOne({ _id: doc._id }, { $set: { lines: upgraded } });
|
|
74
|
+
report.m001.journalEntriesBackfilled++;
|
|
75
|
+
}
|
|
76
|
+
// cents mirrors on frozen legacy transactions (informational)
|
|
77
|
+
const legacyTransactions = await transactions
|
|
78
|
+
.find({ amountCents: { $exists: false } })
|
|
79
|
+
.toArray();
|
|
80
|
+
for (const doc of legacyTransactions) {
|
|
81
|
+
await transactions.updateOne({ _id: doc._id }, {
|
|
82
|
+
$set: {
|
|
83
|
+
amountCents: toCents(doc.amount ?? 0, drift),
|
|
84
|
+
vatAmountCents: toCents(doc.vatAmount ?? 0, drift),
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
report.m001.transactionsBackfilled++;
|
|
88
|
+
}
|
|
89
|
+
report.m001.maxDriftCents = drift.max;
|
|
90
|
+
// ---------- M002: unify into the v2 journal ----------
|
|
91
|
+
// referenced transactions already live inside a journal entry
|
|
92
|
+
const referencedIds = new Set();
|
|
93
|
+
const entryDocs = await entries.find({}).toArray();
|
|
94
|
+
for (const doc of entryDocs) {
|
|
95
|
+
for (const id of doc.transactionIds ?? [])
|
|
96
|
+
referencedIds.add(id);
|
|
97
|
+
}
|
|
98
|
+
for (const doc of entryDocs) {
|
|
99
|
+
if (doc.schemaVersion === 2)
|
|
100
|
+
continue;
|
|
101
|
+
await entries.updateOne({ _id: doc._id }, {
|
|
102
|
+
$set: {
|
|
103
|
+
schemaVersion: 2,
|
|
104
|
+
currency: doc.currency ?? 'EUR',
|
|
105
|
+
legacyImport: true,
|
|
106
|
+
legacyStatus: doc.status,
|
|
107
|
+
status: doc.status === 'reversed' ? 'posted' : doc.status,
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
report.m002.legacyEntriesUpgraded++;
|
|
111
|
+
}
|
|
112
|
+
const standalone = await transactions
|
|
113
|
+
.find({ synthesizedIntoJournal: { $exists: false } })
|
|
114
|
+
.toArray();
|
|
115
|
+
for (const doc of standalone) {
|
|
116
|
+
if (referencedIds.has(doc.id))
|
|
117
|
+
continue;
|
|
118
|
+
const amountCents = doc.amountCents ?? toCents(doc.amount ?? 0, drift);
|
|
119
|
+
const date = doc.date;
|
|
120
|
+
const synthesized = {
|
|
121
|
+
id: plugins.smartunique.shortId(),
|
|
122
|
+
journalNumber: `JRN-LEGACY-${doc.transactionNumber ?? doc.id}`,
|
|
123
|
+
date,
|
|
124
|
+
description: doc.description ?? '',
|
|
125
|
+
reference: doc.reference ?? '',
|
|
126
|
+
skrType: doc.skrType,
|
|
127
|
+
currency: 'EUR',
|
|
128
|
+
schemaVersion: 2,
|
|
129
|
+
legacyImport: true,
|
|
130
|
+
legacyStatus: doc.status,
|
|
131
|
+
legacyTransactionId: doc.id,
|
|
132
|
+
status: doc.status === 'reversed' ? 'posted' : doc.status,
|
|
133
|
+
period: doc.period,
|
|
134
|
+
fiscalYear: doc.fiscalYear,
|
|
135
|
+
createdAt: doc.createdAt ?? date,
|
|
136
|
+
postedAt: doc.postedAt ?? date,
|
|
137
|
+
createdBy: doc.createdBy ?? 'migration',
|
|
138
|
+
totalDebits: (doc.amount ?? 0),
|
|
139
|
+
totalCredits: (doc.amount ?? 0),
|
|
140
|
+
isBalanced: true,
|
|
141
|
+
transactionIds: [],
|
|
142
|
+
lines: [
|
|
143
|
+
{
|
|
144
|
+
accountNumber: doc.debitAccount,
|
|
145
|
+
debit: doc.amount ?? 0,
|
|
146
|
+
credit: 0,
|
|
147
|
+
description: doc.description ?? '',
|
|
148
|
+
side: 'debit',
|
|
149
|
+
amountCents,
|
|
150
|
+
counterAccount: doc.creditAccount,
|
|
151
|
+
buKey: '',
|
|
152
|
+
buchungstext: doc.description ?? '',
|
|
153
|
+
vatAmountCents: doc.vatAmountCents ?? 0,
|
|
154
|
+
costCenter1: doc.costCenter || undefined,
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
accountNumber: doc.creditAccount,
|
|
158
|
+
debit: 0,
|
|
159
|
+
credit: doc.amount ?? 0,
|
|
160
|
+
description: doc.description ?? '',
|
|
161
|
+
side: 'credit',
|
|
162
|
+
amountCents,
|
|
163
|
+
counterAccount: doc.debitAccount,
|
|
164
|
+
buKey: '',
|
|
165
|
+
buchungstext: doc.description ?? '',
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|
|
169
|
+
await entries.insertOne(synthesized);
|
|
170
|
+
await transactions.updateOne({ _id: doc._id }, { $set: { synthesizedIntoJournal: synthesized.id } });
|
|
171
|
+
report.m002.transactionsSynthesized++;
|
|
172
|
+
}
|
|
173
|
+
// ---------- M003: append unchained entries to the hash chain ----------
|
|
174
|
+
const unchained = await entries
|
|
175
|
+
.find({ schemaVersion: 2, sequenceNumber: { $exists: false } })
|
|
176
|
+
.toArray();
|
|
177
|
+
const groups = new Map();
|
|
178
|
+
for (const doc of unchained) {
|
|
179
|
+
const key = `${doc.skrType}:${doc.fiscalYear}`;
|
|
180
|
+
if (!groups.has(key))
|
|
181
|
+
groups.set(key, []);
|
|
182
|
+
groups.get(key).push(doc);
|
|
183
|
+
}
|
|
184
|
+
const sequences = db.mongoDb.collection('LedgerSequence');
|
|
185
|
+
for (const [key, docs] of groups) {
|
|
186
|
+
const [skrType, yearString] = key.split(':');
|
|
187
|
+
const fiscalYear = Number.parseInt(yearString, 10);
|
|
188
|
+
docs.sort((a, b) => {
|
|
189
|
+
const timeA = (a.postedAt ?? a.createdAt ?? a.date).getTime();
|
|
190
|
+
const timeB = (b.postedAt ?? b.createdAt ?? b.date).getTime();
|
|
191
|
+
if (timeA !== timeB)
|
|
192
|
+
return timeA - timeB;
|
|
193
|
+
return String(a.id).localeCompare(String(b.id));
|
|
194
|
+
});
|
|
195
|
+
const state = await sequences.findOne({ skrType, fiscalYear });
|
|
196
|
+
let sequenceNumber = state?.value ?? 0;
|
|
197
|
+
let headHash = state?.headHash ?? core.genesisHash(skrType, fiscalYear);
|
|
198
|
+
for (const doc of docs) {
|
|
199
|
+
sequenceNumber += 1;
|
|
200
|
+
const postedAt = (doc.postedAt ?? doc.createdAt ?? doc.date);
|
|
201
|
+
const entryHash = core.entryHash(headHash, buildHashPayload({
|
|
202
|
+
sequenceNumber,
|
|
203
|
+
skrType,
|
|
204
|
+
fiscalYear,
|
|
205
|
+
date: doc.date,
|
|
206
|
+
postedAt,
|
|
207
|
+
description: doc.description,
|
|
208
|
+
reference: doc.reference,
|
|
209
|
+
taxScenario: doc.taxScenario,
|
|
210
|
+
currency: doc.currency ?? 'EUR',
|
|
211
|
+
reversalOf: doc.reversalOf,
|
|
212
|
+
lines: (doc.lines ?? []),
|
|
213
|
+
}));
|
|
214
|
+
await entries.updateOne({ _id: doc._id }, { $set: { sequenceNumber, prevHash: headHash, entryHash, postedAt } });
|
|
215
|
+
headHash = entryHash;
|
|
216
|
+
}
|
|
217
|
+
await sequences.updateOne({ skrType, fiscalYear }, { $set: { value: sequenceNumber, headHash } }, { upsert: true });
|
|
218
|
+
report.m003.push({ skrType, fiscalYear, chainedEntries: docs.length, headHash });
|
|
219
|
+
}
|
|
220
|
+
report.finishedAt = new Date();
|
|
221
|
+
return report;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLm1pZ3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9za3IubWlncmF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLElBQUksTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHdkQsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFtQi9DLDBFQUEwRTtBQUMxRSxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUUvQixTQUFTLE9BQU8sQ0FBQyxLQUFhLEVBQUUsWUFBNkI7SUFDM0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQyxHQUFHO1FBQUUsWUFBWSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDdkQsT0FBTyxjQUFjLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVztJQUMvQixNQUFNLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUN2QixNQUFNLE9BQU8s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
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accounting period locks (Festschreibung). One document per
|
|
3
|
+
* (skrType, period 'YYYY-MM') in the LedgerPeriod collection.
|
|
4
|
+
*
|
|
5
|
+
* festschreibePeriod() stamps all posted schemaVersion-2 entries of the
|
|
6
|
+
* period as finalized via a raw update — deliberately bypassing the doc-level
|
|
7
|
+
* immutability guard, because the finalization fields live OUTSIDE the entry
|
|
8
|
+
* hash. Detection of any other raw-driver tampering is verifyHashChain()'s job.
|
|
9
|
+
*/
|
|
10
|
+
import { type TDbSession } from './skr.database.js';
|
|
11
|
+
import type { TSKRType } from './skr.types.js';
|
|
12
|
+
export declare const LEDGER_PERIOD_COLLECTION = "LedgerPeriod";
|
|
13
|
+
export declare const JOURNAL_ENTRY_COLLECTION = "JournalEntry";
|
|
14
|
+
export interface ILedgerPeriodState {
|
|
15
|
+
skrType: TSKRType;
|
|
16
|
+
period: string;
|
|
17
|
+
status: 'open' | 'locked';
|
|
18
|
+
lockedAt?: Date;
|
|
19
|
+
lockedBy?: string;
|
|
20
|
+
chainCheckpoint?: {
|
|
21
|
+
lastSequenceNumber: number;
|
|
22
|
+
headHash: string;
|
|
23
|
+
} | null;
|
|
24
|
+
}
|
|
25
|
+
export declare function ensurePeriodIndexes(): Promise<void>;
|
|
26
|
+
export declare function periodOf(date: Date): string;
|
|
27
|
+
export declare function fiscalYearOf(date: Date): number;
|
|
28
|
+
/**
|
|
29
|
+
* Throws PeriodLockedError when the period is festgeschrieben. Runs inside
|
|
30
|
+
* the posting transaction so a concurrent lock aborts the posting.
|
|
31
|
+
*/
|
|
32
|
+
export declare function assertPeriodOpen(skrType: TSKRType, period: string, session?: TDbSession): Promise<void>;
|
|
33
|
+
export declare function getPeriodState(skrType: TSKRType, period: string): Promise<ILedgerPeriodState | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Festschreibung: lock the period against new postings and stamp all posted
|
|
36
|
+
* schemaVersion-2 entries as finalized. Idempotent — locking a locked period
|
|
37
|
+
* throws so callers notice double runs.
|
|
38
|
+
*/
|
|
39
|
+
export declare function festschreibePeriod(params: {
|
|
40
|
+
skrType: TSKRType;
|
|
41
|
+
period: string;
|
|
42
|
+
lockedBy?: string;
|
|
43
|
+
lockedAt?: Date;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
finalizedEntries: number;
|
|
46
|
+
checkpoint: ILedgerPeriodState['chainCheckpoint'];
|
|
47
|
+
}>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accounting period locks (Festschreibung). One document per
|
|
3
|
+
* (skrType, period 'YYYY-MM') in the LedgerPeriod collection.
|
|
4
|
+
*
|
|
5
|
+
* festschreibePeriod() stamps all posted schemaVersion-2 entries of the
|
|
6
|
+
* period as finalized via a raw update — deliberately bypassing the doc-level
|
|
7
|
+
* immutability guard, because the finalization fields live OUTSIDE the entry
|
|
8
|
+
* hash. Detection of any other raw-driver tampering is verifyHashChain()'s job.
|
|
9
|
+
*/
|
|
10
|
+
import { getDbSync } from './skr.database.js';
|
|
11
|
+
import { PeriodLockedError } from './skr.errors.js';
|
|
12
|
+
import { getSequenceState } from './skr.sequence.js';
|
|
13
|
+
export const LEDGER_PERIOD_COLLECTION = 'LedgerPeriod';
|
|
14
|
+
export const JOURNAL_ENTRY_COLLECTION = 'JournalEntry';
|
|
15
|
+
function periodCollection() {
|
|
16
|
+
return getDbSync().mongoDb.collection(LEDGER_PERIOD_COLLECTION);
|
|
17
|
+
}
|
|
18
|
+
export async function ensurePeriodIndexes() {
|
|
19
|
+
await periodCollection().createIndex({ skrType: 1, period: 1 }, { unique: true });
|
|
20
|
+
}
|
|
21
|
+
export function periodOf(date) {
|
|
22
|
+
return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`;
|
|
23
|
+
}
|
|
24
|
+
export function fiscalYearOf(date) {
|
|
25
|
+
return date.getUTCFullYear();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Throws PeriodLockedError when the period is festgeschrieben. Runs inside
|
|
29
|
+
* the posting transaction so a concurrent lock aborts the posting.
|
|
30
|
+
*/
|
|
31
|
+
export async function assertPeriodOpen(skrType, period, session) {
|
|
32
|
+
const doc = await periodCollection().findOne({ skrType, period }, { session });
|
|
33
|
+
if (doc && doc.status === 'locked') {
|
|
34
|
+
throw new PeriodLockedError(skrType, period);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function getPeriodState(skrType, period) {
|
|
38
|
+
const doc = await periodCollection().findOne({ skrType, period });
|
|
39
|
+
if (!doc)
|
|
40
|
+
return null;
|
|
41
|
+
return {
|
|
42
|
+
skrType,
|
|
43
|
+
period,
|
|
44
|
+
status: doc.status,
|
|
45
|
+
lockedAt: doc.lockedAt,
|
|
46
|
+
lockedBy: doc.lockedBy,
|
|
47
|
+
chainCheckpoint: doc.chainCheckpoint ?? null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Festschreibung: lock the period against new postings and stamp all posted
|
|
52
|
+
* schemaVersion-2 entries as finalized. Idempotent — locking a locked period
|
|
53
|
+
* throws so callers notice double runs.
|
|
54
|
+
*/
|
|
55
|
+
export async function festschreibePeriod(params) {
|
|
56
|
+
const db = getDbSync();
|
|
57
|
+
const session = db.startSession();
|
|
58
|
+
const lockedAt = params.lockedAt ?? new Date();
|
|
59
|
+
try {
|
|
60
|
+
let finalizedEntries = 0;
|
|
61
|
+
let checkpoint = null;
|
|
62
|
+
await session.withTransaction(async () => {
|
|
63
|
+
const existing = await periodCollection().findOne({ skrType: params.skrType, period: params.period }, { session });
|
|
64
|
+
if (existing && existing.status === 'locked') {
|
|
65
|
+
throw new PeriodLockedError(params.skrType, params.period);
|
|
66
|
+
}
|
|
67
|
+
const stamp = await db.mongoDb.collection(JOURNAL_ENTRY_COLLECTION).updateMany({
|
|
68
|
+
skrType: params.skrType,
|
|
69
|
+
period: params.period,
|
|
70
|
+
schemaVersion: 2,
|
|
71
|
+
status: 'posted',
|
|
72
|
+
}, { $set: { status: 'finalized', finalizedAt: lockedAt } }, { session });
|
|
73
|
+
finalizedEntries = stamp.modifiedCount;
|
|
74
|
+
await periodCollection().updateOne({ skrType: params.skrType, period: params.period }, {
|
|
75
|
+
$set: {
|
|
76
|
+
status: 'locked',
|
|
77
|
+
lockedAt,
|
|
78
|
+
lockedBy: params.lockedBy ?? 'system',
|
|
79
|
+
},
|
|
80
|
+
}, { upsert: true, session });
|
|
81
|
+
});
|
|
82
|
+
// checkpoint outside the txn: reads the settled chain head
|
|
83
|
+
const fiscalYear = Number.parseInt(params.period.slice(0, 4), 10);
|
|
84
|
+
const state = await getSequenceState(params.skrType, fiscalYear);
|
|
85
|
+
if (state) {
|
|
86
|
+
checkpoint = { lastSequenceNumber: state.value, headHash: state.headHash };
|
|
87
|
+
await periodCollection().updateOne({ skrType: params.skrType, period: params.period }, { $set: { chainCheckpoint: checkpoint } });
|
|
88
|
+
}
|
|
89
|
+
return { finalizedEntries, checkpoint };
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
await session.endSession();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLnBlcmlvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Nrci5wZXJpb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLG1CQUFtQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR3JELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLGNBQWMsQ0FBQztBQUN2RCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxjQUFjLENBQUM7QUFXdkQsU0FBUyxnQkFBZ0I7SUFDdkIsT0FBTyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CO0lBQ3ZDLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3BGLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQVU7SUFDakMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUN2RixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFVO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxPQUFpQixFQUNqQixNQUFjLEVBQ2QsT0FBb0I7SUFFcEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0UsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksaUJBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLE9BQWlCLEVBQ2pCLE1BQWM7SUFFZCxNQUFNLEdBQUcsR0FBRyxNQUFNLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QixPQUFPO1FBQ0wsT0FBTztRQUNQLE1BQU07UUFDTixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQTJCO1FBQ3ZDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBNEI7UUFDMUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUE4QjtRQUM1QyxlQUFlLEVBQUcsR0FBRyxDQUFDLGVBQXlELElBQUksSUFBSTtLQUN4RixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BS3hDO0lBQ0MsTUFBTSxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDdkIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUM7UUFDSCxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJLFVBQVUsR0FBMEMsSUFBSSxDQUFDO1FBQzdELE1BQU0sT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUMvQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQ2xELEVBQUUsT0FBTyxFQUFFLENBQ1osQ0FBQztZQUNGLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLFVBQVUsQ0FDNUU7Z0JBQ0UsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN2QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQixFQUNELEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFDeEQsRUFBRSxPQUFPLEVBQUUsQ0FDWixDQUFDO1lBQ0YsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztZQUV2QyxNQUFNLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUNoQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQ2xEO2dCQUNFLElBQUksRUFBRTtvQkFDSixNQUFNLEVBQUUsUUFBUTtvQkFDaEIsUUFBUTtvQkFDUixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxRQUFRO2lCQUN0QzthQUNGLEVBQ0QsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUMxQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCwyREFBMkQ7UUFDM0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pFLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixVQUFVLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0UsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FDaEMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUNsRCxFQUFFLElBQUksRUFBRSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUMxQyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUMxQyxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzdCLENBQUM7QUFDSCxDQUFDIn0=
|