@fin.cx/skr 1.2.0 → 1.2.2

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 (58) hide show
  1. package/{npmextra.json → .smartconfig.json} +12 -6
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/index.d.ts +21 -15
  5. package/dist_ts/index.js +16 -16
  6. package/dist_ts/plugins.d.ts +15 -5
  7. package/dist_ts/plugins.js +42 -6
  8. package/dist_ts/skr.api.js +20 -13
  9. package/dist_ts/skr.classes.account.d.ts +36 -3
  10. package/dist_ts/skr.classes.account.js +366 -210
  11. package/dist_ts/skr.classes.chartofaccounts.d.ts +1 -1
  12. package/dist_ts/skr.classes.chartofaccounts.js +13 -6
  13. package/dist_ts/skr.classes.journalentry.d.ts +9 -4
  14. package/dist_ts/skr.classes.journalentry.js +430 -309
  15. package/dist_ts/skr.classes.ledger.js +7 -1
  16. package/dist_ts/skr.classes.reports.js +4 -1
  17. package/dist_ts/skr.classes.transaction.d.ts +9 -4
  18. package/dist_ts/skr.classes.transaction.js +315 -244
  19. package/dist_ts/skr.export.accounts.js +3 -2
  20. package/dist_ts/skr.export.balances.js +4 -2
  21. package/dist_ts/skr.export.js +6 -3
  22. package/dist_ts/skr.export.ledger.js +4 -3
  23. package/dist_ts/skr.export.pdf.js +6 -3
  24. package/dist_ts/skr.invoice.adapter.d.ts +2 -0
  25. package/dist_ts/skr.invoice.adapter.js +22 -10
  26. package/dist_ts/skr.invoice.booking.js +52 -25
  27. package/dist_ts/skr.invoice.mapper.js +84 -82
  28. package/dist_ts/skr.invoice.storage.js +10 -5
  29. package/dist_ts/skr.postingkeys.d.ts +56 -0
  30. package/dist_ts/skr.postingkeys.js +196 -0
  31. package/dist_ts/skr.security.js +24 -21
  32. package/dist_ts/skr.types.d.ts +18 -0
  33. package/dist_ts/skr03.data.js +3 -1
  34. package/dist_ts/skr04.data.js +3 -1
  35. package/license.md +21 -0
  36. package/package.json +31 -23
  37. package/readme.hints.md +54 -1
  38. package/readme.md +215 -632
  39. package/readme.plan.md +1 -1
  40. package/ts/00_commitinfo_data.ts +8 -0
  41. package/ts/index.ts +43 -15
  42. package/ts/plugins.ts +52 -15
  43. package/ts/skr.api.ts +9 -5
  44. package/ts/skr.classes.account.ts +144 -23
  45. package/ts/skr.classes.chartofaccounts.ts +8 -3
  46. package/ts/skr.classes.journalentry.ts +117 -24
  47. package/ts/skr.classes.ledger.ts +4 -0
  48. package/ts/skr.classes.reports.ts +22 -2
  49. package/ts/skr.classes.transaction.ts +40 -22
  50. package/ts/skr.export.pdf.ts +4 -3
  51. package/ts/skr.invoice.adapter.ts +31 -11
  52. package/ts/skr.invoice.booking.ts +54 -30
  53. package/ts/skr.invoice.storage.ts +3 -2
  54. package/ts/skr.postingkeys.ts +252 -0
  55. package/ts/skr.security.ts +23 -22
  56. package/ts/skr.types.ts +26 -0
  57. package/ts/skr03.data.ts +2 -0
  58. package/ts/skr04.data.ts +2 -0
@@ -1,336 +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
- const { SmartDataDbDoc, svDb, unI, index, searchable } = plugins.smartdata;
16
- let JournalEntry = JournalEntry_1 = class JournalEntry extends SmartDataDbDoc {
17
- constructor(data) {
18
- super();
19
- if (data) {
20
- this.id = plugins.smartunique.shortId();
21
- this.journalNumber = this.generateJournalNumber();
22
- this.date = data.date || new Date();
23
- this.description = data.description || '';
24
- this.reference = data.reference || '';
25
- this.lines = data.lines || [];
26
- this.skrType = data.skrType || 'SKR03';
39
+ import { validatePostingKey, validatePostingKeyConsistency, getPostingKeyDescription, } from './skr.postingkeys.js';
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() {
27
223
  this.totalDebits = 0;
28
224
  this.totalCredits = 0;
29
- this.isBalanced = false;
30
- this.status = 'draft';
31
- this.transactionIds = [];
32
- // Set period and fiscal year
33
- const entryDate = new Date(this.date);
34
- this.period = `${entryDate.getFullYear()}-${String(entryDate.getMonth() + 1).padStart(2, '0')}`;
35
- this.fiscalYear = entryDate.getFullYear();
36
- this.createdAt = new Date();
37
- this.postedAt = null;
38
- this.createdBy = 'system';
39
- // Normalize any negative amounts to the correct side
40
- this.sanitizeLines();
41
- // Calculate totals
42
- this.calculateTotals();
43
- }
44
- }
45
- generateJournalNumber() {
46
- const timestamp = Date.now();
47
- const random = Math.floor(Math.random() * 1000);
48
- return `JE-${timestamp}-${random}`;
49
- }
50
- sanitizeLines() {
51
- for (const line of this.lines) {
52
- // Check if both debit and credit are set (not allowed)
53
- if (line.debit !== undefined && line.debit !== 0 &&
54
- line.credit !== undefined && line.credit !== 0) {
55
- 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
+ }
56
232
  }
57
- // Handle negative debit - convert to positive credit
58
- if (line.debit !== undefined && line.debit < 0) {
59
- line.credit = Math.abs(line.debit);
60
- 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');
61
247
  }
62
- // Handle negative credit - convert to positive debit
63
- if (line.credit !== undefined && line.credit < 0) {
64
- line.debit = Math.abs(line.credit);
65
- delete line.credit;
248
+ if (!line.debit && !line.credit) {
249
+ throw new Error('Either debit or credit amount is required');
66
250
  }
67
- // Check that at least one side has a positive value
68
- const hasDebit = line.debit !== undefined && line.debit > 0;
69
- const hasCredit = line.credit !== undefined && line.credit > 0;
70
- if (!hasDebit && !hasCredit) {
71
- 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');
72
253
  }
73
- }
74
- }
75
- calculateTotals() {
76
- this.totalDebits = 0;
77
- this.totalCredits = 0;
78
- for (const line of this.lines) {
79
- if (line.debit) {
80
- this.totalDebits += line.debit;
254
+ if (line.debit && line.debit < 0) {
255
+ throw new Error('Debit amount must be positive');
81
256
  }
82
- if (line.credit) {
83
- this.totalCredits += line.credit;
257
+ if (line.credit && line.credit < 0) {
258
+ throw new Error('Credit amount must be positive');
84
259
  }
85
- }
86
- // Check if balanced (allowing for small rounding differences)
87
- const difference = Math.abs(this.totalDebits - this.totalCredits);
88
- this.isBalanced = difference < 0.01;
89
- }
90
- static async createJournalEntry(data) {
91
- const journalEntry = new JournalEntry_1(data);
92
- await journalEntry.validate();
93
- await journalEntry.save();
94
- return journalEntry;
95
- }
96
- addLine(line) {
97
- // Validate line
98
- if (!line.accountNumber) {
99
- throw new Error('Account number is required for journal entry line');
100
- }
101
- if (!line.debit && !line.credit) {
102
- throw new Error('Either debit or credit amount is required');
103
- }
104
- if (line.debit && line.credit) {
105
- throw new Error('A line cannot have both debit and credit amounts');
106
- }
107
- if (line.debit && line.debit < 0) {
108
- throw new Error('Debit amount must be positive');
109
- }
110
- if (line.credit && line.credit < 0) {
111
- throw new Error('Credit amount must be positive');
112
- }
113
- this.lines.push(line);
114
- this.calculateTotals();
115
- }
116
- removeLine(index) {
117
- if (index >= 0 && index < this.lines.length) {
118
- this.lines.splice(index, 1);
260
+ this.lines.push(line);
119
261
  this.calculateTotals();
120
262
  }
121
- }
122
- async validate() {
123
- // Check if entry is balanced
124
- if (!this.isBalanced) {
125
- throw new Error(`Journal entry is not balanced. Debits: ${this.totalDebits}, Credits: ${this.totalCredits}`);
126
- }
127
- // Check minimum lines
128
- if (this.lines.length < 2) {
129
- 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
+ }
130
268
  }
131
- // Validate all accounts exist and are active
132
- for (const line of this.lines) {
133
- const account = await Account.getAccountByNumber(line.accountNumber, this.skrType);
134
- if (!account) {
135
- throw new Error(`Account ${line.accountNumber} not found for ${this.skrType}`);
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}`);
136
273
  }
137
- if (!account.isActive) {
138
- throw new Error(`Account ${line.accountNumber} is not active`);
274
+ // Check minimum lines
275
+ if (this.lines.length < 2) {
276
+ throw new Error('Journal entry must have at least 2 lines');
277
+ }
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
+ }
319
+ }
320
+ // Validate posting key consistency across all lines
321
+ const consistencyValidation = validatePostingKeyConsistency(this.lines);
322
+ if (!consistencyValidation.isValid) {
323
+ validationErrors.push(...consistencyValidation.errors);
324
+ }
325
+ if (consistencyValidation.warnings.length > 0) {
326
+ validationWarnings.push(...consistencyValidation.warnings);
327
+ }
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}`));
332
+ }
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'));
139
337
  }
140
338
  }
141
- }
142
- async post() {
143
- if (this.status === 'posted') {
144
- throw new Error('Journal entry is already posted');
145
- }
146
- // Normalize any negative amounts to the correct side
147
- this.sanitizeLines();
148
- // Validate before posting
149
- await this.validate();
150
- // Create individual transactions for each debit-credit pair
151
- const transactions = [];
152
- // Simple posting logic: match debits with credits
153
- // For complex entries, this could be enhanced with specific pairing logic
154
- const debitLines = this.lines.filter((l) => l.debit);
155
- const creditLines = this.lines.filter((l) => l.credit);
156
- if (debitLines.length === 1 && creditLines.length === 1) {
157
- // Simple entry: one debit, one credit
158
- const transaction = await Transaction.createTransaction({
159
- date: this.date,
160
- debitAccount: debitLines[0].accountNumber,
161
- creditAccount: creditLines[0].accountNumber,
162
- amount: debitLines[0].debit,
163
- description: this.description,
164
- reference: this.reference,
165
- skrType: this.skrType,
166
- costCenter: debitLines[0].costCenter,
167
- });
168
- transactions.push(transaction);
169
- }
170
- else {
171
- // Complex entry: multiple debits and/or credits
172
- // Build working queues with remaining amounts (don't mutate original lines)
173
- const debitQueue = debitLines.map(l => ({
174
- line: l,
175
- remaining: l.debit || 0
176
- }));
177
- const creditQueue = creditLines.map(l => ({
178
- line: l,
179
- remaining: l.credit || 0
180
- }));
181
- // Create transactions to balance the entry
182
- for (const d of debitQueue) {
183
- for (const c of creditQueue) {
184
- const amount = Math.min(d.remaining, c.remaining);
185
- if (amount > 0.0000001) { // small epsilon to avoid float artifacts
186
- const transaction = await Transaction.createTransaction({
187
- date: this.date,
188
- debitAccount: d.line.accountNumber,
189
- creditAccount: c.line.accountNumber,
190
- amount: Math.round(amount * 100) / 100, // round to 2 decimals
191
- description: `${this.description} - ${d.line.description || c.line.description || ''}`,
192
- reference: this.reference,
193
- skrType: this.skrType,
194
- costCenter: d.line.costCenter || c.line.costCenter,
195
- });
196
- transactions.push(transaction);
197
- // Reduce remaining amounts in working copies (not original lines)
198
- d.remaining -= amount;
199
- 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;
200
400
  }
201
- if (d.remaining <= 0.0000001)
202
- break;
203
401
  }
204
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();
205
409
  }
206
- // Store transaction IDs
207
- this.transactionIds = transactions.map((t) => t.id);
208
- // Update status
209
- this.status = 'posted';
210
- this.postedAt = new Date();
211
- await this.save();
212
- }
213
- async reverse() {
214
- if (this.status !== 'posted') {
215
- throw new Error('Can only reverse posted journal entries');
216
- }
217
- // Create reversal entry with swapped debits and credits
218
- const reversalLines = this.lines.map((line) => ({
219
- accountNumber: line.accountNumber,
220
- debit: line.credit, // Swap
221
- credit: line.debit, // Swap
222
- description: `Reversal: ${line.description || ''}`,
223
- costCenter: line.costCenter,
224
- }));
225
- const reversalEntry = new JournalEntry_1({
226
- date: new Date(),
227
- description: `Reversal of ${this.journalNumber}: ${this.description}`,
228
- reference: `REV-${this.journalNumber}`,
229
- lines: reversalLines,
230
- skrType: this.skrType,
231
- });
232
- await reversalEntry.validate();
233
- await reversalEntry.post();
234
- // Update original entry status
235
- this.status = 'reversed';
236
- await this.save();
237
- return reversalEntry;
238
- }
239
- async beforeSave() {
240
- // Normalize any negative amounts to the correct side
241
- this.sanitizeLines();
242
- // Recalculate totals before saving
243
- this.calculateTotals();
244
- // Validate required fields
245
- if (!this.date) {
246
- throw new Error('Journal entry date is required');
247
- }
248
- if (!this.description) {
249
- 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;
250
436
  }
251
- if (this.lines.length === 0) {
252
- 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
+ }
253
452
  }
254
- }
255
- };
256
- __decorate([
257
- unI(),
258
- __metadata("design:type", String)
259
- ], JournalEntry.prototype, "id", void 0);
260
- __decorate([
261
- svDb(),
262
- index(),
263
- __metadata("design:type", String)
264
- ], JournalEntry.prototype, "journalNumber", void 0);
265
- __decorate([
266
- svDb(),
267
- index(),
268
- __metadata("design:type", Date)
269
- ], JournalEntry.prototype, "date", void 0);
270
- __decorate([
271
- svDb(),
272
- searchable(),
273
- __metadata("design:type", String)
274
- ], JournalEntry.prototype, "description", void 0);
275
- __decorate([
276
- svDb(),
277
- index(),
278
- __metadata("design:type", String)
279
- ], JournalEntry.prototype, "reference", void 0);
280
- __decorate([
281
- svDb(),
282
- __metadata("design:type", Array)
283
- ], JournalEntry.prototype, "lines", void 0);
284
- __decorate([
285
- svDb(),
286
- index(),
287
- __metadata("design:type", String)
288
- ], JournalEntry.prototype, "skrType", void 0);
289
- __decorate([
290
- svDb(),
291
- __metadata("design:type", Number)
292
- ], JournalEntry.prototype, "totalDebits", void 0);
293
- __decorate([
294
- svDb(),
295
- __metadata("design:type", Number)
296
- ], JournalEntry.prototype, "totalCredits", void 0);
297
- __decorate([
298
- svDb(),
299
- __metadata("design:type", Boolean)
300
- ], JournalEntry.prototype, "isBalanced", void 0);
301
- __decorate([
302
- svDb(),
303
- index(),
304
- __metadata("design:type", String)
305
- ], JournalEntry.prototype, "status", void 0);
306
- __decorate([
307
- svDb(),
308
- __metadata("design:type", Array)
309
- ], JournalEntry.prototype, "transactionIds", void 0);
310
- __decorate([
311
- svDb(),
312
- index(),
313
- __metadata("design:type", String)
314
- ], JournalEntry.prototype, "period", void 0);
315
- __decorate([
316
- svDb(),
317
- __metadata("design:type", Number)
318
- ], JournalEntry.prototype, "fiscalYear", void 0);
319
- __decorate([
320
- svDb(),
321
- __metadata("design:type", Date)
322
- ], JournalEntry.prototype, "createdAt", void 0);
323
- __decorate([
324
- svDb(),
325
- __metadata("design:type", Date)
326
- ], JournalEntry.prototype, "postedAt", void 0);
327
- __decorate([
328
- svDb(),
329
- __metadata("design:type", String)
330
- ], JournalEntry.prototype, "createdBy", void 0);
331
- JournalEntry = JournalEntry_1 = __decorate([
332
- plugins.smartdata.Collection(() => getDbSync()),
333
- __metadata("design:paramtypes", [Object])
334
- ], JournalEntry);
453
+ };
454
+ return JournalEntry = _classThis;
455
+ })();
335
456
  export { JournalEntry };
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU8zRCxNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFHcEUsSUFBTSxZQUFZLG9CQUFsQixNQUFNLFlBQWEsU0FBUSxjQUEwQztJQTJEMUUsWUFBWSxJQUE2QjtRQUN2QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElB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
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLDZCQUE2QixFQUM3Qix3QkFBd0IsR0FDekIsTUFBTSxzQkFBc0IsQ0FBQztBQW9COUIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFzRCxDQUFDO0FBQ2hHLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBaUIsQ0FBQztBQUN2RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQVcsQ0FBQztBQUMzQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQVUsQ0FBQztBQUN6QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQVksQ0FBQztBQUM3QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQWlCLENBQUM7SUFHMUMsWUFBWTs0QkFEeEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOzs7O3NCQUNJLGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NEJBQXRCLFNBQVEsV0FBYzs7Ozs4QkFDN0MsR0FBRyxFQUFFO3lDQUdMLElBQUksRUFBRSxFQUNOLEtB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