@fin.cx/skr 1.2.1 → 1.3.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 (46) hide show
  1. package/{npmextra.json → .smartconfig.json} +12 -6
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/index.d.ts +21 -15
  4. package/dist_ts/index.js +16 -16
  5. package/dist_ts/plugins.d.ts +15 -5
  6. package/dist_ts/plugins.js +42 -6
  7. package/dist_ts/skr.api.js +20 -13
  8. package/dist_ts/skr.classes.account.d.ts +8 -3
  9. package/dist_ts/skr.classes.account.js +358 -285
  10. package/dist_ts/skr.classes.chartofaccounts.d.ts +1 -1
  11. package/dist_ts/skr.classes.chartofaccounts.js +13 -6
  12. package/dist_ts/skr.classes.journalentry.d.ts +9 -4
  13. package/dist_ts/skr.classes.journalentry.js +424 -355
  14. package/dist_ts/skr.classes.ledger.js +3 -1
  15. package/dist_ts/skr.classes.reports.js +4 -1
  16. package/dist_ts/skr.classes.transaction.d.ts +9 -4
  17. package/dist_ts/skr.classes.transaction.js +315 -244
  18. package/dist_ts/skr.export.accounts.js +3 -2
  19. package/dist_ts/skr.export.balances.js +4 -2
  20. package/dist_ts/skr.export.js +6 -3
  21. package/dist_ts/skr.export.ledger.js +4 -3
  22. package/dist_ts/skr.export.pdf.js +6 -3
  23. package/dist_ts/skr.invoice.adapter.d.ts +2 -0
  24. package/dist_ts/skr.invoice.adapter.js +22 -10
  25. package/dist_ts/skr.invoice.booking.js +8 -3
  26. package/dist_ts/skr.invoice.mapper.js +84 -82
  27. package/dist_ts/skr.invoice.storage.js +10 -5
  28. package/dist_ts/skr.security.js +24 -21
  29. package/license.md +21 -0
  30. package/package.json +32 -24
  31. package/readme.md +215 -632
  32. package/readme.plan.md +1 -1
  33. package/ts/00_commitinfo_data.ts +1 -1
  34. package/ts/index.ts +43 -15
  35. package/ts/plugins.ts +52 -15
  36. package/ts/skr.api.ts +9 -5
  37. package/ts/skr.classes.account.ts +39 -21
  38. package/ts/skr.classes.chartofaccounts.ts +8 -3
  39. package/ts/skr.classes.journalentry.ts +40 -22
  40. package/ts/skr.classes.reports.ts +22 -2
  41. package/ts/skr.classes.transaction.ts +40 -22
  42. package/ts/skr.export.pdf.ts +4 -3
  43. package/ts/skr.invoice.adapter.ts +31 -11
  44. package/ts/skr.invoice.booking.ts +5 -3
  45. package/ts/skr.invoice.storage.ts +3 -2
  46. package/ts/skr.security.ts +23 -22
@@ -1,388 +1,457 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
6
27
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
9
34
  };
10
- var JournalEntry_1;
11
35
  import * as plugins from './plugins.js';
12
36
  import { getDbSync } from './skr.database.js';
13
37
  import { Account } from './skr.classes.account.js';
14
38
  import { Transaction } from './skr.classes.transaction.js';
15
39
  import { validatePostingKey, validatePostingKeyConsistency, getPostingKeyDescription, } from './skr.postingkeys.js';
16
- const { SmartDataDbDoc, svDb, unI, index, searchable } = plugins.smartdata;
17
- let JournalEntry = JournalEntry_1 = class JournalEntry extends SmartDataDbDoc {
18
- constructor(data) {
19
- super();
20
- if (data) {
21
- this.id = plugins.smartunique.shortId();
22
- this.journalNumber = this.generateJournalNumber();
23
- this.date = data.date || new Date();
24
- this.description = data.description || '';
25
- this.reference = data.reference || '';
26
- this.lines = data.lines || [];
27
- this.skrType = data.skrType || 'SKR03';
40
+ const SmartDataDbDoc = plugins.smartdata.SmartDataDbDoc;
41
+ const Collection = plugins.smartdata.Collection;
42
+ const svDb = plugins.smartdata.svDb;
43
+ const unI = plugins.smartdata.unI;
44
+ const index = plugins.smartdata.index;
45
+ const searchable = plugins.smartdata.searchable;
46
+ let JournalEntry = (() => {
47
+ let _classDecorators = [Collection(() => getDbSync())];
48
+ let _classDescriptor;
49
+ let _classExtraInitializers = [];
50
+ let _classThis;
51
+ let _classSuper = SmartDataDbDoc;
52
+ let _id_decorators;
53
+ let _id_initializers = [];
54
+ let _id_extraInitializers = [];
55
+ let _journalNumber_decorators;
56
+ let _journalNumber_initializers = [];
57
+ let _journalNumber_extraInitializers = [];
58
+ let _date_decorators;
59
+ let _date_initializers = [];
60
+ let _date_extraInitializers = [];
61
+ let _description_decorators;
62
+ let _description_initializers = [];
63
+ let _description_extraInitializers = [];
64
+ let _reference_decorators;
65
+ let _reference_initializers = [];
66
+ let _reference_extraInitializers = [];
67
+ let _lines_decorators;
68
+ let _lines_initializers = [];
69
+ let _lines_extraInitializers = [];
70
+ let _skrType_decorators;
71
+ let _skrType_initializers = [];
72
+ let _skrType_extraInitializers = [];
73
+ let _totalDebits_decorators;
74
+ let _totalDebits_initializers = [];
75
+ let _totalDebits_extraInitializers = [];
76
+ let _totalCredits_decorators;
77
+ let _totalCredits_initializers = [];
78
+ let _totalCredits_extraInitializers = [];
79
+ let _isBalanced_decorators;
80
+ let _isBalanced_initializers = [];
81
+ let _isBalanced_extraInitializers = [];
82
+ let _status_decorators;
83
+ let _status_initializers = [];
84
+ let _status_extraInitializers = [];
85
+ let _transactionIds_decorators;
86
+ let _transactionIds_initializers = [];
87
+ let _transactionIds_extraInitializers = [];
88
+ let _period_decorators;
89
+ let _period_initializers = [];
90
+ let _period_extraInitializers = [];
91
+ let _fiscalYear_decorators;
92
+ let _fiscalYear_initializers = [];
93
+ let _fiscalYear_extraInitializers = [];
94
+ let _createdAt_decorators;
95
+ let _createdAt_initializers = [];
96
+ let _createdAt_extraInitializers = [];
97
+ let _postedAt_decorators;
98
+ let _postedAt_initializers = [];
99
+ let _postedAt_extraInitializers = [];
100
+ let _createdBy_decorators;
101
+ let _createdBy_initializers = [];
102
+ let _createdBy_extraInitializers = [];
103
+ var JournalEntry = class extends _classSuper {
104
+ static { _classThis = this; }
105
+ static {
106
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
107
+ _id_decorators = [unI()];
108
+ _journalNumber_decorators = [svDb(), index()];
109
+ _date_decorators = [svDb(), index()];
110
+ _description_decorators = [svDb(), searchable()];
111
+ _reference_decorators = [svDb(), index()];
112
+ _lines_decorators = [svDb()];
113
+ _skrType_decorators = [svDb(), index()];
114
+ _totalDebits_decorators = [svDb()];
115
+ _totalCredits_decorators = [svDb()];
116
+ _isBalanced_decorators = [svDb()];
117
+ _status_decorators = [svDb(), index()];
118
+ _transactionIds_decorators = [svDb()];
119
+ _period_decorators = [svDb(), index()];
120
+ _fiscalYear_decorators = [svDb()];
121
+ _createdAt_decorators = [svDb()];
122
+ _postedAt_decorators = [svDb()];
123
+ _createdBy_decorators = [svDb()];
124
+ __esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
125
+ __esDecorate(null, null, _journalNumber_decorators, { kind: "field", name: "journalNumber", static: false, private: false, access: { has: obj => "journalNumber" in obj, get: obj => obj.journalNumber, set: (obj, value) => { obj.journalNumber = value; } }, metadata: _metadata }, _journalNumber_initializers, _journalNumber_extraInitializers);
126
+ __esDecorate(null, null, _date_decorators, { kind: "field", name: "date", static: false, private: false, access: { has: obj => "date" in obj, get: obj => obj.date, set: (obj, value) => { obj.date = value; } }, metadata: _metadata }, _date_initializers, _date_extraInitializers);
127
+ __esDecorate(null, null, _description_decorators, { kind: "field", name: "description", static: false, private: false, access: { has: obj => "description" in obj, get: obj => obj.description, set: (obj, value) => { obj.description = value; } }, metadata: _metadata }, _description_initializers, _description_extraInitializers);
128
+ __esDecorate(null, null, _reference_decorators, { kind: "field", name: "reference", static: false, private: false, access: { has: obj => "reference" in obj, get: obj => obj.reference, set: (obj, value) => { obj.reference = value; } }, metadata: _metadata }, _reference_initializers, _reference_extraInitializers);
129
+ __esDecorate(null, null, _lines_decorators, { kind: "field", name: "lines", static: false, private: false, access: { has: obj => "lines" in obj, get: obj => obj.lines, set: (obj, value) => { obj.lines = value; } }, metadata: _metadata }, _lines_initializers, _lines_extraInitializers);
130
+ __esDecorate(null, null, _skrType_decorators, { kind: "field", name: "skrType", static: false, private: false, access: { has: obj => "skrType" in obj, get: obj => obj.skrType, set: (obj, value) => { obj.skrType = value; } }, metadata: _metadata }, _skrType_initializers, _skrType_extraInitializers);
131
+ __esDecorate(null, null, _totalDebits_decorators, { kind: "field", name: "totalDebits", static: false, private: false, access: { has: obj => "totalDebits" in obj, get: obj => obj.totalDebits, set: (obj, value) => { obj.totalDebits = value; } }, metadata: _metadata }, _totalDebits_initializers, _totalDebits_extraInitializers);
132
+ __esDecorate(null, null, _totalCredits_decorators, { kind: "field", name: "totalCredits", static: false, private: false, access: { has: obj => "totalCredits" in obj, get: obj => obj.totalCredits, set: (obj, value) => { obj.totalCredits = value; } }, metadata: _metadata }, _totalCredits_initializers, _totalCredits_extraInitializers);
133
+ __esDecorate(null, null, _isBalanced_decorators, { kind: "field", name: "isBalanced", static: false, private: false, access: { has: obj => "isBalanced" in obj, get: obj => obj.isBalanced, set: (obj, value) => { obj.isBalanced = value; } }, metadata: _metadata }, _isBalanced_initializers, _isBalanced_extraInitializers);
134
+ __esDecorate(null, null, _status_decorators, { kind: "field", name: "status", static: false, private: false, access: { has: obj => "status" in obj, get: obj => obj.status, set: (obj, value) => { obj.status = value; } }, metadata: _metadata }, _status_initializers, _status_extraInitializers);
135
+ __esDecorate(null, null, _transactionIds_decorators, { kind: "field", name: "transactionIds", static: false, private: false, access: { has: obj => "transactionIds" in obj, get: obj => obj.transactionIds, set: (obj, value) => { obj.transactionIds = value; } }, metadata: _metadata }, _transactionIds_initializers, _transactionIds_extraInitializers);
136
+ __esDecorate(null, null, _period_decorators, { kind: "field", name: "period", static: false, private: false, access: { has: obj => "period" in obj, get: obj => obj.period, set: (obj, value) => { obj.period = value; } }, metadata: _metadata }, _period_initializers, _period_extraInitializers);
137
+ __esDecorate(null, null, _fiscalYear_decorators, { kind: "field", name: "fiscalYear", static: false, private: false, access: { has: obj => "fiscalYear" in obj, get: obj => obj.fiscalYear, set: (obj, value) => { obj.fiscalYear = value; } }, metadata: _metadata }, _fiscalYear_initializers, _fiscalYear_extraInitializers);
138
+ __esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
139
+ __esDecorate(null, null, _postedAt_decorators, { kind: "field", name: "postedAt", static: false, private: false, access: { has: obj => "postedAt" in obj, get: obj => obj.postedAt, set: (obj, value) => { obj.postedAt = value; } }, metadata: _metadata }, _postedAt_initializers, _postedAt_extraInitializers);
140
+ __esDecorate(null, null, _createdBy_decorators, { kind: "field", name: "createdBy", static: false, private: false, access: { has: obj => "createdBy" in obj, get: obj => obj.createdBy, set: (obj, value) => { obj.createdBy = value; } }, metadata: _metadata }, _createdBy_initializers, _createdBy_extraInitializers);
141
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
142
+ JournalEntry = _classThis = _classDescriptor.value;
143
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
144
+ __runInitializers(_classThis, _classExtraInitializers);
145
+ }
146
+ id = __runInitializers(this, _id_initializers, void 0);
147
+ journalNumber = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _journalNumber_initializers, void 0));
148
+ date = (__runInitializers(this, _journalNumber_extraInitializers), __runInitializers(this, _date_initializers, void 0));
149
+ description = (__runInitializers(this, _date_extraInitializers), __runInitializers(this, _description_initializers, void 0));
150
+ reference = (__runInitializers(this, _description_extraInitializers), __runInitializers(this, _reference_initializers, void 0));
151
+ lines = (__runInitializers(this, _reference_extraInitializers), __runInitializers(this, _lines_initializers, void 0));
152
+ skrType = (__runInitializers(this, _lines_extraInitializers), __runInitializers(this, _skrType_initializers, void 0));
153
+ totalDebits = (__runInitializers(this, _skrType_extraInitializers), __runInitializers(this, _totalDebits_initializers, void 0));
154
+ totalCredits = (__runInitializers(this, _totalDebits_extraInitializers), __runInitializers(this, _totalCredits_initializers, void 0));
155
+ isBalanced = (__runInitializers(this, _totalCredits_extraInitializers), __runInitializers(this, _isBalanced_initializers, void 0));
156
+ status = (__runInitializers(this, _isBalanced_extraInitializers), __runInitializers(this, _status_initializers, void 0));
157
+ transactionIds = (__runInitializers(this, _status_extraInitializers), __runInitializers(this, _transactionIds_initializers, void 0));
158
+ period = (__runInitializers(this, _transactionIds_extraInitializers), __runInitializers(this, _period_initializers, void 0));
159
+ fiscalYear = (__runInitializers(this, _period_extraInitializers), __runInitializers(this, _fiscalYear_initializers, void 0));
160
+ createdAt = (__runInitializers(this, _fiscalYear_extraInitializers), __runInitializers(this, _createdAt_initializers, void 0));
161
+ postedAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _postedAt_initializers, void 0));
162
+ createdBy = (__runInitializers(this, _postedAt_extraInitializers), __runInitializers(this, _createdBy_initializers, void 0));
163
+ constructor(data) {
164
+ super();
165
+ __runInitializers(this, _createdBy_extraInitializers);
166
+ if (data) {
167
+ this.id = plugins.smartunique.shortId();
168
+ this.journalNumber = this.generateJournalNumber();
169
+ this.date = data.date || new Date();
170
+ this.description = data.description || '';
171
+ this.reference = data.reference || '';
172
+ this.lines = data.lines || [];
173
+ this.skrType = data.skrType || 'SKR03';
174
+ this.totalDebits = 0;
175
+ this.totalCredits = 0;
176
+ this.isBalanced = false;
177
+ this.status = 'draft';
178
+ this.transactionIds = [];
179
+ // Set period and fiscal year
180
+ const entryDate = new Date(this.date);
181
+ this.period = `${entryDate.getFullYear()}-${String(entryDate.getMonth() + 1).padStart(2, '0')}`;
182
+ this.fiscalYear = entryDate.getFullYear();
183
+ this.createdAt = new Date();
184
+ this.postedAt = null;
185
+ this.createdBy = 'system';
186
+ // Normalize any negative amounts to the correct side
187
+ this.sanitizeLines();
188
+ // Calculate totals
189
+ this.calculateTotals();
190
+ }
191
+ }
192
+ generateJournalNumber() {
193
+ const timestamp = Date.now();
194
+ const random = Math.floor(Math.random() * 1000);
195
+ return `JE-${timestamp}-${random}`;
196
+ }
197
+ sanitizeLines() {
198
+ for (const line of this.lines) {
199
+ // Check if both debit and credit are set (not allowed)
200
+ if (line.debit !== undefined && line.debit !== 0 &&
201
+ line.credit !== undefined && line.credit !== 0) {
202
+ throw new Error('A line cannot have both debit and credit amounts');
203
+ }
204
+ // Handle negative debit - convert to positive credit
205
+ if (line.debit !== undefined && line.debit < 0) {
206
+ line.credit = Math.abs(line.debit);
207
+ delete line.debit;
208
+ }
209
+ // Handle negative credit - convert to positive debit
210
+ if (line.credit !== undefined && line.credit < 0) {
211
+ line.debit = Math.abs(line.credit);
212
+ delete line.credit;
213
+ }
214
+ // Check that at least one side has a positive value
215
+ const hasDebit = line.debit !== undefined && line.debit > 0;
216
+ const hasCredit = line.credit !== undefined && line.credit > 0;
217
+ if (!hasDebit && !hasCredit) {
218
+ throw new Error('Either debit or credit must be a positive number');
219
+ }
220
+ }
221
+ }
222
+ calculateTotals() {
28
223
  this.totalDebits = 0;
29
224
  this.totalCredits = 0;
30
- this.isBalanced = false;
31
- this.status = 'draft';
32
- this.transactionIds = [];
33
- // Set period and fiscal year
34
- const entryDate = new Date(this.date);
35
- this.period = `${entryDate.getFullYear()}-${String(entryDate.getMonth() + 1).padStart(2, '0')}`;
36
- this.fiscalYear = entryDate.getFullYear();
37
- this.createdAt = new Date();
38
- this.postedAt = null;
39
- this.createdBy = 'system';
40
- // Normalize any negative amounts to the correct side
41
- this.sanitizeLines();
42
- // Calculate totals
43
- this.calculateTotals();
44
- }
45
- }
46
- generateJournalNumber() {
47
- const timestamp = Date.now();
48
- const random = Math.floor(Math.random() * 1000);
49
- return `JE-${timestamp}-${random}`;
50
- }
51
- sanitizeLines() {
52
- for (const line of this.lines) {
53
- // Check if both debit and credit are set (not allowed)
54
- if (line.debit !== undefined && line.debit !== 0 &&
55
- line.credit !== undefined && line.credit !== 0) {
56
- throw new Error('A line cannot have both debit and credit amounts');
225
+ for (const line of this.lines) {
226
+ if (line.debit) {
227
+ this.totalDebits += line.debit;
228
+ }
229
+ if (line.credit) {
230
+ this.totalCredits += line.credit;
231
+ }
57
232
  }
58
- // Handle negative debit - convert to positive credit
59
- if (line.debit !== undefined && line.debit < 0) {
60
- line.credit = Math.abs(line.debit);
61
- delete line.debit;
233
+ // Check if balanced (allowing for small rounding differences)
234
+ const difference = Math.abs(this.totalDebits - this.totalCredits);
235
+ this.isBalanced = difference < 0.01;
236
+ }
237
+ static async createJournalEntry(data) {
238
+ const journalEntry = new JournalEntry(data);
239
+ await journalEntry.validate();
240
+ await journalEntry.save();
241
+ return journalEntry;
242
+ }
243
+ addLine(line) {
244
+ // Validate line
245
+ if (!line.accountNumber) {
246
+ throw new Error('Account number is required for journal entry line');
62
247
  }
63
- // Handle negative credit - convert to positive debit
64
- if (line.credit !== undefined && line.credit < 0) {
65
- line.debit = Math.abs(line.credit);
66
- delete line.credit;
248
+ if (!line.debit && !line.credit) {
249
+ throw new Error('Either debit or credit amount is required');
67
250
  }
68
- // Check that at least one side has a positive value
69
- const hasDebit = line.debit !== undefined && line.debit > 0;
70
- const hasCredit = line.credit !== undefined && line.credit > 0;
71
- if (!hasDebit && !hasCredit) {
72
- throw new Error('Either debit or credit must be a positive number');
251
+ if (line.debit && line.credit) {
252
+ throw new Error('A line cannot have both debit and credit amounts');
73
253
  }
74
- }
75
- }
76
- calculateTotals() {
77
- this.totalDebits = 0;
78
- this.totalCredits = 0;
79
- for (const line of this.lines) {
80
- if (line.debit) {
81
- this.totalDebits += line.debit;
254
+ if (line.debit && line.debit < 0) {
255
+ throw new Error('Debit amount must be positive');
82
256
  }
83
- if (line.credit) {
84
- this.totalCredits += line.credit;
257
+ if (line.credit && line.credit < 0) {
258
+ throw new Error('Credit amount must be positive');
85
259
  }
86
- }
87
- // Check if balanced (allowing for small rounding differences)
88
- const difference = Math.abs(this.totalDebits - this.totalCredits);
89
- this.isBalanced = difference < 0.01;
90
- }
91
- static async createJournalEntry(data) {
92
- const journalEntry = new JournalEntry_1(data);
93
- await journalEntry.validate();
94
- await journalEntry.save();
95
- return journalEntry;
96
- }
97
- addLine(line) {
98
- // Validate line
99
- if (!line.accountNumber) {
100
- throw new Error('Account number is required for journal entry line');
101
- }
102
- if (!line.debit && !line.credit) {
103
- throw new Error('Either debit or credit amount is required');
104
- }
105
- if (line.debit && line.credit) {
106
- throw new Error('A line cannot have both debit and credit amounts');
107
- }
108
- if (line.debit && line.debit < 0) {
109
- throw new Error('Debit amount must be positive');
110
- }
111
- if (line.credit && line.credit < 0) {
112
- throw new Error('Credit amount must be positive');
113
- }
114
- this.lines.push(line);
115
- this.calculateTotals();
116
- }
117
- removeLine(index) {
118
- if (index >= 0 && index < this.lines.length) {
119
- this.lines.splice(index, 1);
260
+ this.lines.push(line);
120
261
  this.calculateTotals();
121
262
  }
122
- }
123
- async validate() {
124
- // Check if entry is balanced
125
- if (!this.isBalanced) {
126
- throw new Error(`Journal entry is not balanced. Debits: ${this.totalDebits}, Credits: ${this.totalCredits}`);
127
- }
128
- // Check minimum lines
129
- if (this.lines.length < 2) {
130
- throw new Error('Journal entry must have at least 2 lines');
263
+ removeLine(index) {
264
+ if (index >= 0 && index < this.lines.length) {
265
+ this.lines.splice(index, 1);
266
+ this.calculateTotals();
267
+ }
131
268
  }
132
- // Validate all accounts exist, are active, and can be posted to
133
- const validationErrors = [];
134
- const validationWarnings = [];
135
- // Check if this journal entry has VAT lines (for smarter posting key validation)
136
- const hasVATLines = this.lines.some(line => line.accountNumber === '1571' || line.accountNumber === '1771' || line.accountNumber === '1576');
137
- for (const line of this.lines) {
138
- // Validate posting key is present (REQUIRED)
139
- if (!line.postingKey) {
140
- validationErrors.push(`Line for account ${line.accountNumber} is missing required posting key (Buchungsschlüssel). ` +
141
- `Posting keys are mandatory for DATEV compliance.`);
142
- continue; // Skip further validation for this line
269
+ async validate() {
270
+ // Check if entry is balanced
271
+ if (!this.isBalanced) {
272
+ throw new Error(`Journal entry is not balanced. Debits: ${this.totalDebits}, Credits: ${this.totalCredits}`);
143
273
  }
144
- // Validate account is not an automatic account (Automatikkonto)
145
- try {
146
- await Account.validateAccountForPosting(line.accountNumber, this.skrType);
274
+ // Check minimum lines
275
+ if (this.lines.length < 2) {
276
+ throw new Error('Journal entry must have at least 2 lines');
147
277
  }
148
- catch (error) {
149
- validationErrors.push(error.message);
150
- continue; // Skip further validation for this line
278
+ // Validate all accounts exist, are active, and can be posted to
279
+ const validationErrors = [];
280
+ const validationWarnings = [];
281
+ // Check if this journal entry has VAT lines (for smarter posting key validation)
282
+ const hasVATLines = this.lines.some(line => line.accountNumber === '1571' || line.accountNumber === '1771' || line.accountNumber === '1576');
283
+ for (const line of this.lines) {
284
+ // Validate posting key is present (REQUIRED)
285
+ if (!line.postingKey) {
286
+ validationErrors.push(`Line for account ${line.accountNumber} is missing required posting key (Buchungsschlüssel). ` +
287
+ `Posting keys are mandatory for DATEV compliance.`);
288
+ continue; // Skip further validation for this line
289
+ }
290
+ // Validate account is not an automatic account (Automatikkonto)
291
+ try {
292
+ await Account.validateAccountForPosting(line.accountNumber, this.skrType);
293
+ }
294
+ catch (error) {
295
+ validationErrors.push(error instanceof Error ? error.message : String(error));
296
+ continue; // Skip further validation for this line
297
+ }
298
+ // Get account for posting key validation
299
+ const account = await Account.getAccountByNumber(line.accountNumber, this.skrType);
300
+ if (!account) {
301
+ validationErrors.push(`Account ${line.accountNumber} not found for ${this.skrType}`);
302
+ continue;
303
+ }
304
+ if (!account.isActive) {
305
+ validationErrors.push(`Account ${line.accountNumber} is not active`);
306
+ continue;
307
+ }
308
+ // Validate posting key for this line
309
+ const amount = line.debit || line.credit || 0;
310
+ // For journal entries with VAT lines, pass amount as vatAmount to satisfy validation
311
+ const postingKeyValidation = validatePostingKey(line.postingKey, line.accountNumber, amount, hasVATLines ? amount : undefined // If entry has VAT lines, we consider the validation satisfied
312
+ );
313
+ if (!postingKeyValidation.isValid) {
314
+ validationErrors.push(...postingKeyValidation.errors);
315
+ }
316
+ if (postingKeyValidation.warnings.length > 0) {
317
+ validationWarnings.push(...postingKeyValidation.warnings);
318
+ }
151
319
  }
152
- // Get account for posting key validation
153
- const account = await Account.getAccountByNumber(line.accountNumber, this.skrType);
154
- if (!account) {
155
- validationErrors.push(`Account ${line.accountNumber} not found for ${this.skrType}`);
156
- continue;
320
+ // Validate posting key consistency across all lines
321
+ const consistencyValidation = validatePostingKeyConsistency(this.lines);
322
+ if (!consistencyValidation.isValid) {
323
+ validationErrors.push(...consistencyValidation.errors);
157
324
  }
158
- if (!account.isActive) {
159
- validationErrors.push(`Account ${line.accountNumber} is not active`);
160
- continue;
325
+ if (consistencyValidation.warnings.length > 0) {
326
+ validationWarnings.push(...consistencyValidation.warnings);
161
327
  }
162
- // Validate posting key for this line
163
- const amount = line.debit || line.credit || 0;
164
- // For journal entries with VAT lines, pass amount as vatAmount to satisfy validation
165
- const postingKeyValidation = validatePostingKey(line.postingKey, line.accountNumber, amount, hasVATLines ? amount : undefined // If entry has VAT lines, we consider the validation satisfied
166
- );
167
- if (!postingKeyValidation.isValid) {
168
- validationErrors.push(...postingKeyValidation.errors);
328
+ // Log warnings but don't fail validation
329
+ if (validationWarnings.length > 0) {
330
+ console.warn('Journal entry validation warnings:');
331
+ validationWarnings.forEach(warning => console.warn(` - ${warning}`));
169
332
  }
170
- if (postingKeyValidation.warnings.length > 0) {
171
- validationWarnings.push(...postingKeyValidation.warnings);
333
+ // Throw if any errors
334
+ if (validationErrors.length > 0) {
335
+ throw new Error('Journal entry validation failed:\n' +
336
+ validationErrors.map(e => ` - ${e}`).join('\n'));
172
337
  }
173
338
  }
174
- // Validate posting key consistency across all lines
175
- const consistencyValidation = validatePostingKeyConsistency(this.lines);
176
- if (!consistencyValidation.isValid) {
177
- validationErrors.push(...consistencyValidation.errors);
178
- }
179
- if (consistencyValidation.warnings.length > 0) {
180
- validationWarnings.push(...consistencyValidation.warnings);
181
- }
182
- // Log warnings but don't fail validation
183
- if (validationWarnings.length > 0) {
184
- console.warn('Journal entry validation warnings:');
185
- validationWarnings.forEach(warning => console.warn(` - ${warning}`));
186
- }
187
- // Throw if any errors
188
- if (validationErrors.length > 0) {
189
- throw new Error('Journal entry validation failed:\n' +
190
- validationErrors.map(e => ` - ${e}`).join('\n'));
191
- }
192
- }
193
- async post() {
194
- if (this.status === 'posted') {
195
- throw new Error('Journal entry is already posted');
196
- }
197
- // Normalize any negative amounts to the correct side
198
- this.sanitizeLines();
199
- // Validate before posting
200
- await this.validate();
201
- // Create individual transactions for each debit-credit pair
202
- const transactions = [];
203
- // Simple posting logic: match debits with credits
204
- // For complex entries, this could be enhanced with specific pairing logic
205
- const debitLines = this.lines.filter((l) => l.debit);
206
- const creditLines = this.lines.filter((l) => l.credit);
207
- if (debitLines.length === 1 && creditLines.length === 1) {
208
- // Simple entry: one debit, one credit
209
- const transaction = await Transaction.createTransaction({
210
- date: this.date,
211
- debitAccount: debitLines[0].accountNumber,
212
- creditAccount: creditLines[0].accountNumber,
213
- amount: debitLines[0].debit,
214
- description: this.description,
215
- reference: this.reference,
216
- skrType: this.skrType,
217
- costCenter: debitLines[0].costCenter,
218
- });
219
- transactions.push(transaction);
220
- }
221
- else {
222
- // Complex entry: multiple debits and/or credits
223
- // Build working queues with remaining amounts (don't mutate original lines)
224
- const debitQueue = debitLines.map(l => ({
225
- line: l,
226
- remaining: l.debit || 0
227
- }));
228
- const creditQueue = creditLines.map(l => ({
229
- line: l,
230
- remaining: l.credit || 0
231
- }));
232
- // Create transactions to balance the entry
233
- for (const d of debitQueue) {
234
- for (const c of creditQueue) {
235
- const amount = Math.min(d.remaining, c.remaining);
236
- if (amount > 0.0000001) { // small epsilon to avoid float artifacts
237
- const transaction = await Transaction.createTransaction({
238
- date: this.date,
239
- debitAccount: d.line.accountNumber,
240
- creditAccount: c.line.accountNumber,
241
- amount: Math.round(amount * 100) / 100, // round to 2 decimals
242
- description: `${this.description} - ${d.line.description || c.line.description || ''}`,
243
- reference: this.reference,
244
- skrType: this.skrType,
245
- costCenter: d.line.costCenter || c.line.costCenter,
246
- });
247
- transactions.push(transaction);
248
- // Reduce remaining amounts in working copies (not original lines)
249
- d.remaining -= amount;
250
- c.remaining -= amount;
339
+ async post() {
340
+ if (this.status === 'posted') {
341
+ throw new Error('Journal entry is already posted');
342
+ }
343
+ // Normalize any negative amounts to the correct side
344
+ this.sanitizeLines();
345
+ // Validate before posting
346
+ await this.validate();
347
+ // Create individual transactions for each debit-credit pair
348
+ const transactions = [];
349
+ // Simple posting logic: match debits with credits
350
+ // For complex entries, this could be enhanced with specific pairing logic
351
+ const debitLines = this.lines.filter((l) => l.debit);
352
+ const creditLines = this.lines.filter((l) => l.credit);
353
+ if (debitLines.length === 1 && creditLines.length === 1) {
354
+ // Simple entry: one debit, one credit
355
+ const transaction = await Transaction.createTransaction({
356
+ date: this.date,
357
+ debitAccount: debitLines[0].accountNumber,
358
+ creditAccount: creditLines[0].accountNumber,
359
+ amount: debitLines[0].debit || 0,
360
+ description: this.description,
361
+ reference: this.reference,
362
+ skrType: this.skrType,
363
+ costCenter: debitLines[0].costCenter,
364
+ });
365
+ transactions.push(transaction);
366
+ }
367
+ else {
368
+ // Complex entry: multiple debits and/or credits
369
+ // Build working queues with remaining amounts (don't mutate original lines)
370
+ const debitQueue = debitLines.map(l => ({
371
+ line: l,
372
+ remaining: l.debit || 0
373
+ }));
374
+ const creditQueue = creditLines.map(l => ({
375
+ line: l,
376
+ remaining: l.credit || 0
377
+ }));
378
+ // Create transactions to balance the entry
379
+ for (const d of debitQueue) {
380
+ for (const c of creditQueue) {
381
+ const amount = Math.min(d.remaining, c.remaining);
382
+ if (amount > 0.0000001) { // small epsilon to avoid float artifacts
383
+ const transaction = await Transaction.createTransaction({
384
+ date: this.date,
385
+ debitAccount: d.line.accountNumber,
386
+ creditAccount: c.line.accountNumber,
387
+ amount: Math.round(amount * 100) / 100, // round to 2 decimals
388
+ description: `${this.description} - ${d.line.description || c.line.description || ''}`,
389
+ reference: this.reference,
390
+ skrType: this.skrType,
391
+ costCenter: d.line.costCenter || c.line.costCenter,
392
+ });
393
+ transactions.push(transaction);
394
+ // Reduce remaining amounts in working copies (not original lines)
395
+ d.remaining -= amount;
396
+ c.remaining -= amount;
397
+ }
398
+ if (d.remaining <= 0.0000001)
399
+ break;
251
400
  }
252
- if (d.remaining <= 0.0000001)
253
- break;
254
401
  }
255
402
  }
403
+ // Store transaction IDs
404
+ this.transactionIds = transactions.map((t) => t.id);
405
+ // Update status
406
+ this.status = 'posted';
407
+ this.postedAt = new Date();
408
+ await this.save();
256
409
  }
257
- // Store transaction IDs
258
- this.transactionIds = transactions.map((t) => t.id);
259
- // Update status
260
- this.status = 'posted';
261
- this.postedAt = new Date();
262
- await this.save();
263
- }
264
- async reverse() {
265
- if (this.status !== 'posted') {
266
- throw new Error('Can only reverse posted journal entries');
267
- }
268
- // Create reversal entry with swapped debits and credits
269
- const reversalLines = this.lines.map((line) => ({
270
- accountNumber: line.accountNumber,
271
- debit: line.credit, // Swap
272
- credit: line.debit, // Swap
273
- description: `Reversal: ${line.description || ''}`,
274
- costCenter: line.costCenter,
275
- postingKey: line.postingKey, // Keep same posting key for reversal
276
- }));
277
- const reversalEntry = new JournalEntry_1({
278
- date: new Date(),
279
- description: `Reversal of ${this.journalNumber}: ${this.description}`,
280
- reference: `REV-${this.journalNumber}`,
281
- lines: reversalLines,
282
- skrType: this.skrType,
283
- });
284
- await reversalEntry.validate();
285
- await reversalEntry.post();
286
- // Update original entry status
287
- this.status = 'reversed';
288
- await this.save();
289
- return reversalEntry;
290
- }
291
- async beforeSave() {
292
- // Normalize any negative amounts to the correct side
293
- this.sanitizeLines();
294
- // Recalculate totals before saving
295
- this.calculateTotals();
296
- // Validate required fields
297
- if (!this.date) {
298
- throw new Error('Journal entry date is required');
299
- }
300
- if (!this.description) {
301
- throw new Error('Journal entry description is required');
410
+ async reverse() {
411
+ if (this.status !== 'posted') {
412
+ throw new Error('Can only reverse posted journal entries');
413
+ }
414
+ // Create reversal entry with swapped debits and credits
415
+ const reversalLines = this.lines.map((line) => ({
416
+ accountNumber: line.accountNumber,
417
+ debit: line.credit, // Swap
418
+ credit: line.debit, // Swap
419
+ description: `Reversal: ${line.description || ''}`,
420
+ costCenter: line.costCenter,
421
+ postingKey: line.postingKey, // Keep same posting key for reversal
422
+ }));
423
+ const reversalEntry = new JournalEntry({
424
+ date: new Date(),
425
+ description: `Reversal of ${this.journalNumber}: ${this.description}`,
426
+ reference: `REV-${this.journalNumber}`,
427
+ lines: reversalLines,
428
+ skrType: this.skrType,
429
+ });
430
+ await reversalEntry.validate();
431
+ await reversalEntry.post();
432
+ // Update original entry status
433
+ this.status = 'reversed';
434
+ await this.save();
435
+ return reversalEntry;
302
436
  }
303
- if (this.lines.length === 0) {
304
- throw new Error('Journal entry must have at least one line');
437
+ async beforeSave() {
438
+ // Normalize any negative amounts to the correct side
439
+ this.sanitizeLines();
440
+ // Recalculate totals before saving
441
+ this.calculateTotals();
442
+ // Validate required fields
443
+ if (!this.date) {
444
+ throw new Error('Journal entry date is required');
445
+ }
446
+ if (!this.description) {
447
+ throw new Error('Journal entry description is required');
448
+ }
449
+ if (this.lines.length === 0) {
450
+ throw new Error('Journal entry must have at least one line');
451
+ }
305
452
  }
306
- }
307
- };
308
- __decorate([
309
- unI(),
310
- __metadata("design:type", String)
311
- ], JournalEntry.prototype, "id", void 0);
312
- __decorate([
313
- svDb(),
314
- index(),
315
- __metadata("design:type", String)
316
- ], JournalEntry.prototype, "journalNumber", void 0);
317
- __decorate([
318
- svDb(),
319
- index(),
320
- __metadata("design:type", Date)
321
- ], JournalEntry.prototype, "date", void 0);
322
- __decorate([
323
- svDb(),
324
- searchable(),
325
- __metadata("design:type", String)
326
- ], JournalEntry.prototype, "description", void 0);
327
- __decorate([
328
- svDb(),
329
- index(),
330
- __metadata("design:type", String)
331
- ], JournalEntry.prototype, "reference", void 0);
332
- __decorate([
333
- svDb(),
334
- __metadata("design:type", Array)
335
- ], JournalEntry.prototype, "lines", void 0);
336
- __decorate([
337
- svDb(),
338
- index(),
339
- __metadata("design:type", String)
340
- ], JournalEntry.prototype, "skrType", void 0);
341
- __decorate([
342
- svDb(),
343
- __metadata("design:type", Number)
344
- ], JournalEntry.prototype, "totalDebits", void 0);
345
- __decorate([
346
- svDb(),
347
- __metadata("design:type", Number)
348
- ], JournalEntry.prototype, "totalCredits", void 0);
349
- __decorate([
350
- svDb(),
351
- __metadata("design:type", Boolean)
352
- ], JournalEntry.prototype, "isBalanced", void 0);
353
- __decorate([
354
- svDb(),
355
- index(),
356
- __metadata("design:type", String)
357
- ], JournalEntry.prototype, "status", void 0);
358
- __decorate([
359
- svDb(),
360
- __metadata("design:type", Array)
361
- ], JournalEntry.prototype, "transactionIds", void 0);
362
- __decorate([
363
- svDb(),
364
- index(),
365
- __metadata("design:type", String)
366
- ], JournalEntry.prototype, "period", void 0);
367
- __decorate([
368
- svDb(),
369
- __metadata("design:type", Number)
370
- ], JournalEntry.prototype, "fiscalYear", void 0);
371
- __decorate([
372
- svDb(),
373
- __metadata("design:type", Date)
374
- ], JournalEntry.prototype, "createdAt", void 0);
375
- __decorate([
376
- svDb(),
377
- __metadata("design:type", Date)
378
- ], JournalEntry.prototype, "postedAt", void 0);
379
- __decorate([
380
- svDb(),
381
- __metadata("design:type", String)
382
- ], JournalEntry.prototype, "createdBy", void 0);
383
- JournalEntry = JournalEntry_1 = __decorate([
384
- plugins.smartdata.Collection(() => getDbSync()),
385
- __metadata("design:paramtypes", [Object])
386
- ], JournalEntry);
453
+ };
454
+ return JournalEntry = _classThis;
455
+ })();
387
456
  export { JournalEntry };
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLDZCQUE2QixFQUM3Qix3QkFBd0IsR0FDekIsTUFBTSxzQkFBc0IsQ0FBQztBQU85QixNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFHcEUsSUFBTSxZQUFZLG9CQUFsQixNQUFNLFlBQWEsU0FBUSxjQUEwQztJQTJEMUUsWUFBWSxJQUE2QjtRQUN2QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJ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
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLDZCQUE2QixFQUM3Qix3QkFBd0IsR0FDekIsTUFBTSxzQkFBc0IsQ0FBQztBQW9COUIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFzRCxDQUFDO0FBQ2hHLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBaUIsQ0FBQztBQUN2RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQVcsQ0FBQztBQUMzQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQVUsQ0FBQztBQUN6QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQVksQ0FBQztBQUM3QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQWlCLENBQUM7SUFHMUMsWUFBWTs0QkFEeEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOzs7O3NCQUNJLGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NEJBQXRCLFNBQVEsV0FBYzs7Ozs4QkFDN0MsR0FBRyxFQUFFO3lDQUdMLElBQUksRUFBRSxFQUNOLEtB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