@fin.cx/skr 1.2.1 → 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 (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 +31 -23
  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,307 +1,380 @@
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 Account_1;
11
35
  import * as plugins from './plugins.js';
12
36
  import { getDb, getDbSync } from './skr.database.js';
13
- const { SmartDataDbDoc, svDb, unI, index, searchable } = plugins.smartdata;
14
- let Account = Account_1 = class Account extends SmartDataDbDoc {
15
- constructor(data) {
16
- super();
17
- if (data) {
18
- this.id = plugins.smartunique.shortId();
19
- this.accountNumber = data.accountNumber || '';
20
- this.accountName = data.accountName || '';
21
- this.accountClass = data.accountClass || 0;
22
- this.accountType = data.accountType || 'asset';
23
- this.skrType = data.skrType || 'SKR03';
24
- this.description = data.description || '';
25
- this.vatRate = data.vatRate || 0;
26
- this.isActive = data.isActive !== undefined ? data.isActive : true;
27
- // Parse account structure from number
28
- if (this.accountNumber && this.accountNumber.length === 4) {
29
- this.accountClass = parseInt(this.accountNumber[0]);
30
- this.accountGroup = parseInt(this.accountNumber[1]);
31
- this.accountSubgroup = parseInt(this.accountNumber[2]);
32
- }
33
- else {
34
- this.accountGroup = 0;
35
- this.accountSubgroup = 0;
37
+ const SmartDataDbDoc = plugins.smartdata.SmartDataDbDoc;
38
+ const Collection = plugins.smartdata.Collection;
39
+ const svDb = plugins.smartdata.svDb;
40
+ const unI = plugins.smartdata.unI;
41
+ const index = plugins.smartdata.index;
42
+ const searchable = plugins.smartdata.searchable;
43
+ let Account = (() => {
44
+ let _classDecorators = [Collection(() => getDbSync())];
45
+ let _classDescriptor;
46
+ let _classExtraInitializers = [];
47
+ let _classThis;
48
+ let _classSuper = SmartDataDbDoc;
49
+ let _id_decorators;
50
+ let _id_initializers = [];
51
+ let _id_extraInitializers = [];
52
+ let _accountNumber_decorators;
53
+ let _accountNumber_initializers = [];
54
+ let _accountNumber_extraInitializers = [];
55
+ let _accountName_decorators;
56
+ let _accountName_initializers = [];
57
+ let _accountName_extraInitializers = [];
58
+ let _accountClass_decorators;
59
+ let _accountClass_initializers = [];
60
+ let _accountClass_extraInitializers = [];
61
+ let _accountGroup_decorators;
62
+ let _accountGroup_initializers = [];
63
+ let _accountGroup_extraInitializers = [];
64
+ let _accountSubgroup_decorators;
65
+ let _accountSubgroup_initializers = [];
66
+ let _accountSubgroup_extraInitializers = [];
67
+ let _accountType_decorators;
68
+ let _accountType_initializers = [];
69
+ let _accountType_extraInitializers = [];
70
+ let _skrType_decorators;
71
+ let _skrType_initializers = [];
72
+ let _skrType_extraInitializers = [];
73
+ let _description_decorators;
74
+ let _description_initializers = [];
75
+ let _description_extraInitializers = [];
76
+ let _vatRate_decorators;
77
+ let _vatRate_initializers = [];
78
+ let _vatRate_extraInitializers = [];
79
+ let _balance_decorators;
80
+ let _balance_initializers = [];
81
+ let _balance_extraInitializers = [];
82
+ let _debitTotal_decorators;
83
+ let _debitTotal_initializers = [];
84
+ let _debitTotal_extraInitializers = [];
85
+ let _creditTotal_decorators;
86
+ let _creditTotal_initializers = [];
87
+ let _creditTotal_extraInitializers = [];
88
+ let _isActive_decorators;
89
+ let _isActive_initializers = [];
90
+ let _isActive_extraInitializers = [];
91
+ let _isSystemAccount_decorators;
92
+ let _isSystemAccount_initializers = [];
93
+ let _isSystemAccount_extraInitializers = [];
94
+ let _isAutomaticAccount_decorators;
95
+ let _isAutomaticAccount_initializers = [];
96
+ let _isAutomaticAccount_extraInitializers = [];
97
+ let _createdAt_decorators;
98
+ let _createdAt_initializers = [];
99
+ let _createdAt_extraInitializers = [];
100
+ let _updatedAt_decorators;
101
+ let _updatedAt_initializers = [];
102
+ let _updatedAt_extraInitializers = [];
103
+ var Account = 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
+ _accountNumber_decorators = [svDb(), index()];
109
+ _accountName_decorators = [svDb(), searchable()];
110
+ _accountClass_decorators = [svDb(), index()];
111
+ _accountGroup_decorators = [svDb()];
112
+ _accountSubgroup_decorators = [svDb()];
113
+ _accountType_decorators = [svDb()];
114
+ _skrType_decorators = [svDb(), index()];
115
+ _description_decorators = [svDb(), searchable()];
116
+ _vatRate_decorators = [svDb()];
117
+ _balance_decorators = [svDb()];
118
+ _debitTotal_decorators = [svDb()];
119
+ _creditTotal_decorators = [svDb()];
120
+ _isActive_decorators = [svDb()];
121
+ _isSystemAccount_decorators = [svDb()];
122
+ _isAutomaticAccount_decorators = [svDb()];
123
+ _createdAt_decorators = [svDb()];
124
+ _updatedAt_decorators = [svDb()];
125
+ __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);
126
+ __esDecorate(null, null, _accountNumber_decorators, { kind: "field", name: "accountNumber", static: false, private: false, access: { has: obj => "accountNumber" in obj, get: obj => obj.accountNumber, set: (obj, value) => { obj.accountNumber = value; } }, metadata: _metadata }, _accountNumber_initializers, _accountNumber_extraInitializers);
127
+ __esDecorate(null, null, _accountName_decorators, { kind: "field", name: "accountName", static: false, private: false, access: { has: obj => "accountName" in obj, get: obj => obj.accountName, set: (obj, value) => { obj.accountName = value; } }, metadata: _metadata }, _accountName_initializers, _accountName_extraInitializers);
128
+ __esDecorate(null, null, _accountClass_decorators, { kind: "field", name: "accountClass", static: false, private: false, access: { has: obj => "accountClass" in obj, get: obj => obj.accountClass, set: (obj, value) => { obj.accountClass = value; } }, metadata: _metadata }, _accountClass_initializers, _accountClass_extraInitializers);
129
+ __esDecorate(null, null, _accountGroup_decorators, { kind: "field", name: "accountGroup", static: false, private: false, access: { has: obj => "accountGroup" in obj, get: obj => obj.accountGroup, set: (obj, value) => { obj.accountGroup = value; } }, metadata: _metadata }, _accountGroup_initializers, _accountGroup_extraInitializers);
130
+ __esDecorate(null, null, _accountSubgroup_decorators, { kind: "field", name: "accountSubgroup", static: false, private: false, access: { has: obj => "accountSubgroup" in obj, get: obj => obj.accountSubgroup, set: (obj, value) => { obj.accountSubgroup = value; } }, metadata: _metadata }, _accountSubgroup_initializers, _accountSubgroup_extraInitializers);
131
+ __esDecorate(null, null, _accountType_decorators, { kind: "field", name: "accountType", static: false, private: false, access: { has: obj => "accountType" in obj, get: obj => obj.accountType, set: (obj, value) => { obj.accountType = value; } }, metadata: _metadata }, _accountType_initializers, _accountType_extraInitializers);
132
+ __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);
133
+ __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);
134
+ __esDecorate(null, null, _vatRate_decorators, { kind: "field", name: "vatRate", static: false, private: false, access: { has: obj => "vatRate" in obj, get: obj => obj.vatRate, set: (obj, value) => { obj.vatRate = value; } }, metadata: _metadata }, _vatRate_initializers, _vatRate_extraInitializers);
135
+ __esDecorate(null, null, _balance_decorators, { kind: "field", name: "balance", static: false, private: false, access: { has: obj => "balance" in obj, get: obj => obj.balance, set: (obj, value) => { obj.balance = value; } }, metadata: _metadata }, _balance_initializers, _balance_extraInitializers);
136
+ __esDecorate(null, null, _debitTotal_decorators, { kind: "field", name: "debitTotal", static: false, private: false, access: { has: obj => "debitTotal" in obj, get: obj => obj.debitTotal, set: (obj, value) => { obj.debitTotal = value; } }, metadata: _metadata }, _debitTotal_initializers, _debitTotal_extraInitializers);
137
+ __esDecorate(null, null, _creditTotal_decorators, { kind: "field", name: "creditTotal", static: false, private: false, access: { has: obj => "creditTotal" in obj, get: obj => obj.creditTotal, set: (obj, value) => { obj.creditTotal = value; } }, metadata: _metadata }, _creditTotal_initializers, _creditTotal_extraInitializers);
138
+ __esDecorate(null, null, _isActive_decorators, { kind: "field", name: "isActive", static: false, private: false, access: { has: obj => "isActive" in obj, get: obj => obj.isActive, set: (obj, value) => { obj.isActive = value; } }, metadata: _metadata }, _isActive_initializers, _isActive_extraInitializers);
139
+ __esDecorate(null, null, _isSystemAccount_decorators, { kind: "field", name: "isSystemAccount", static: false, private: false, access: { has: obj => "isSystemAccount" in obj, get: obj => obj.isSystemAccount, set: (obj, value) => { obj.isSystemAccount = value; } }, metadata: _metadata }, _isSystemAccount_initializers, _isSystemAccount_extraInitializers);
140
+ __esDecorate(null, null, _isAutomaticAccount_decorators, { kind: "field", name: "isAutomaticAccount", static: false, private: false, access: { has: obj => "isAutomaticAccount" in obj, get: obj => obj.isAutomaticAccount, set: (obj, value) => { obj.isAutomaticAccount = value; } }, metadata: _metadata }, _isAutomaticAccount_initializers, _isAutomaticAccount_extraInitializers);
141
+ __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);
142
+ __esDecorate(null, null, _updatedAt_decorators, { kind: "field", name: "updatedAt", static: false, private: false, access: { has: obj => "updatedAt" in obj, get: obj => obj.updatedAt, set: (obj, value) => { obj.updatedAt = value; } }, metadata: _metadata }, _updatedAt_initializers, _updatedAt_extraInitializers);
143
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
144
+ Account = _classThis = _classDescriptor.value;
145
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
146
+ __runInitializers(_classThis, _classExtraInitializers);
147
+ }
148
+ id = __runInitializers(this, _id_initializers, void 0);
149
+ accountNumber = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _accountNumber_initializers, void 0));
150
+ accountName = (__runInitializers(this, _accountNumber_extraInitializers), __runInitializers(this, _accountName_initializers, void 0));
151
+ accountClass = (__runInitializers(this, _accountName_extraInitializers), __runInitializers(this, _accountClass_initializers, void 0));
152
+ accountGroup = (__runInitializers(this, _accountClass_extraInitializers), __runInitializers(this, _accountGroup_initializers, void 0));
153
+ accountSubgroup = (__runInitializers(this, _accountGroup_extraInitializers), __runInitializers(this, _accountSubgroup_initializers, void 0));
154
+ accountType = (__runInitializers(this, _accountSubgroup_extraInitializers), __runInitializers(this, _accountType_initializers, void 0));
155
+ skrType = (__runInitializers(this, _accountType_extraInitializers), __runInitializers(this, _skrType_initializers, void 0));
156
+ description = (__runInitializers(this, _skrType_extraInitializers), __runInitializers(this, _description_initializers, void 0));
157
+ vatRate = (__runInitializers(this, _description_extraInitializers), __runInitializers(this, _vatRate_initializers, void 0));
158
+ balance = (__runInitializers(this, _vatRate_extraInitializers), __runInitializers(this, _balance_initializers, void 0));
159
+ debitTotal = (__runInitializers(this, _balance_extraInitializers), __runInitializers(this, _debitTotal_initializers, void 0));
160
+ creditTotal = (__runInitializers(this, _debitTotal_extraInitializers), __runInitializers(this, _creditTotal_initializers, void 0));
161
+ isActive = (__runInitializers(this, _creditTotal_extraInitializers), __runInitializers(this, _isActive_initializers, void 0));
162
+ isSystemAccount = (__runInitializers(this, _isActive_extraInitializers), __runInitializers(this, _isSystemAccount_initializers, void 0));
163
+ isAutomaticAccount = (__runInitializers(this, _isSystemAccount_extraInitializers), __runInitializers(this, _isAutomaticAccount_initializers, void 0));
164
+ createdAt = (__runInitializers(this, _isAutomaticAccount_extraInitializers), __runInitializers(this, _createdAt_initializers, void 0));
165
+ updatedAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _updatedAt_initializers, void 0));
166
+ constructor(data) {
167
+ super();
168
+ __runInitializers(this, _updatedAt_extraInitializers);
169
+ if (data) {
170
+ this.id = plugins.smartunique.shortId();
171
+ this.accountNumber = data.accountNumber || '';
172
+ this.accountName = data.accountName || '';
173
+ this.accountClass = data.accountClass || 0;
174
+ this.accountType = data.accountType || 'asset';
175
+ this.skrType = data.skrType || 'SKR03';
176
+ this.description = data.description || '';
177
+ this.vatRate = data.vatRate || 0;
178
+ this.isActive = data.isActive !== undefined ? data.isActive : true;
179
+ // Parse account structure from number
180
+ if (this.accountNumber && this.accountNumber.length === 4) {
181
+ this.accountClass = parseInt(this.accountNumber[0]);
182
+ this.accountGroup = parseInt(this.accountNumber[1]);
183
+ this.accountSubgroup = parseInt(this.accountNumber[2]);
184
+ }
185
+ else {
186
+ this.accountGroup = 0;
187
+ this.accountSubgroup = 0;
188
+ }
189
+ this.balance = 0;
190
+ this.debitTotal = 0;
191
+ this.creditTotal = 0;
192
+ this.isSystemAccount = true;
193
+ this.isAutomaticAccount = data.isAutomaticAccount || false;
194
+ this.createdAt = new Date();
195
+ this.updatedAt = new Date();
36
196
  }
37
- this.balance = 0;
38
- this.debitTotal = 0;
39
- this.creditTotal = 0;
40
- this.isSystemAccount = true;
41
- this.isAutomaticAccount = data.isAutomaticAccount || false;
42
- this.createdAt = new Date();
43
- this.updatedAt = new Date();
44
197
  }
45
- }
46
- static async createAccount(data) {
47
- const account = new Account_1(data);
48
- await account.save();
49
- return account;
50
- }
51
- static async getAccountByNumber(accountNumber, skrType) {
52
- const account = await Account_1.getInstance({
53
- accountNumber,
54
- skrType,
55
- });
56
- return account;
57
- }
58
- static async getAccountsByClass(accountClass, skrType) {
59
- const accounts = await Account_1.getInstances({
60
- accountClass,
61
- skrType,
62
- isActive: true,
63
- });
64
- return accounts;
65
- }
66
- static async getAccountsByType(accountType, skrType) {
67
- const accounts = await Account_1.getInstances({
68
- accountType,
69
- skrType,
70
- isActive: true,
71
- });
72
- return accounts;
73
- }
74
- static async searchAccounts(searchTerm, skrType) {
75
- const query = {};
76
- if (skrType) {
77
- query.skrType = skrType;
198
+ static async createAccount(data) {
199
+ const account = new Account(data);
200
+ await account.save();
201
+ return account;
78
202
  }
79
- const accounts = await Account_1.getInstances(query);
80
- // Filter by search term
81
- const lowerSearchTerm = searchTerm.toLowerCase();
82
- return accounts.filter((account) => account.accountNumber.includes(searchTerm) ||
83
- account.accountName.toLowerCase().includes(lowerSearchTerm) ||
84
- account.description.toLowerCase().includes(lowerSearchTerm));
85
- }
86
- /**
87
- * Check if account number is in debtor range (10000-69999)
88
- * Debtor accounts (Debitorenkonten) are individual customer accounts
89
- */
90
- static isInDebtorRange(accountNumber) {
91
- const num = parseInt(accountNumber);
92
- return num >= 10000 && num <= 69999;
93
- }
94
- /**
95
- * Check if account number is in creditor range (70000-99999)
96
- * Creditor accounts (Kreditorenkonten) are individual vendor accounts
97
- */
98
- static isInCreditorRange(accountNumber) {
99
- const num = parseInt(accountNumber);
100
- return num >= 70000 && num <= 99999;
101
- }
102
- /**
103
- * Check if account is an automatic account (Automatikkonto)
104
- * Automatic accounts like 1400/1600 cannot be posted to directly
105
- */
106
- static isAutomaticAccount(accountNumber, skrType) {
107
- // SKR03: 1400 (Forderungen), 1600 (Verbindlichkeiten)
108
- // SKR04: 1400 (Forderungen), 1600 (Verbindlichkeiten)
109
- // Note: In SKR04, 3300 is "Fahrzeugkosten" (vehicle costs), NOT an automatic account
110
- if (skrType === 'SKR03') {
111
- return accountNumber === '1400' || accountNumber === '1600';
203
+ static async getAccountByNumber(accountNumber, skrType) {
204
+ const account = await Account.getInstance({
205
+ accountNumber,
206
+ skrType,
207
+ });
208
+ return account;
112
209
  }
113
- else {
114
- return accountNumber === '1400' || accountNumber === '1600';
210
+ static async getAccountsByClass(accountClass, skrType) {
211
+ const accounts = await Account.getInstances({
212
+ accountClass,
213
+ skrType,
214
+ isActive: true,
215
+ });
216
+ return accounts;
115
217
  }
116
- }
117
- /**
118
- * Validate account for posting - throws error if account cannot be posted to
119
- */
120
- static async validateAccountForPosting(accountNumber, skrType) {
121
- // Check if automatic account
122
- if (Account_1.isAutomaticAccount(accountNumber, skrType)) {
123
- throw new Error(`Account ${accountNumber} is an automatic account (Automatikkonto) and cannot be posted to directly. ` +
124
- `Use debtor accounts (10000-69999) or creditor accounts (70000-99999) instead.`);
218
+ static async getAccountsByType(accountType, skrType) {
219
+ const accounts = await Account.getInstances({
220
+ accountType,
221
+ skrType,
222
+ isActive: true,
223
+ });
224
+ return accounts;
125
225
  }
126
- // Get account to verify it exists
127
- const account = await Account_1.getAccountByNumber(accountNumber, skrType);
128
- if (!account) {
129
- throw new Error(`Account ${accountNumber} not found in ${skrType}. ` +
130
- `Please create the account before posting.`);
226
+ static async searchAccounts(searchTerm, skrType) {
227
+ const query = {};
228
+ if (skrType) {
229
+ query.skrType = skrType;
230
+ }
231
+ const accounts = await Account.getInstances(query);
232
+ // Filter by search term
233
+ const lowerSearchTerm = searchTerm.toLowerCase();
234
+ return accounts.filter((account) => account.accountNumber.includes(searchTerm) ||
235
+ account.accountName.toLowerCase().includes(lowerSearchTerm) ||
236
+ account.description.toLowerCase().includes(lowerSearchTerm));
131
237
  }
132
- // Check if account is active
133
- if (!account.isActive) {
134
- throw new Error(`Account ${accountNumber} is inactive and cannot be posted to.`);
238
+ /**
239
+ * Check if account number is in debtor range (10000-69999)
240
+ * Debtor accounts (Debitorenkonten) are individual customer accounts
241
+ */
242
+ static isInDebtorRange(accountNumber) {
243
+ const num = parseInt(accountNumber);
244
+ return num >= 10000 && num <= 69999;
135
245
  }
136
- }
137
- /**
138
- * Check if this account instance is a debtor account
139
- */
140
- isDebtorAccount() {
141
- return Account_1.isInDebtorRange(this.accountNumber);
142
- }
143
- /**
144
- * Check if this account instance is a creditor account
145
- */
146
- isCreditorAccount() {
147
- return Account_1.isInCreditorRange(this.accountNumber);
148
- }
149
- async updateBalance(debitAmount = 0, creditAmount = 0) {
150
- this.debitTotal += debitAmount;
151
- this.creditTotal += creditAmount;
152
- // Calculate balance based on account type
153
- switch (this.accountType) {
154
- case 'asset':
155
- case 'expense':
156
- // Normal debit accounts
157
- this.balance = this.debitTotal - this.creditTotal;
158
- break;
159
- case 'liability':
160
- case 'equity':
161
- case 'revenue':
162
- // Normal credit accounts
163
- this.balance = this.creditTotal - this.debitTotal;
164
- break;
246
+ /**
247
+ * Check if account number is in creditor range (70000-99999)
248
+ * Creditor accounts (Kreditorenkonten) are individual vendor accounts
249
+ */
250
+ static isInCreditorRange(accountNumber) {
251
+ const num = parseInt(accountNumber);
252
+ return num >= 70000 && num <= 99999;
165
253
  }
166
- this.updatedAt = new Date();
167
- await this.save();
168
- }
169
- async deactivate() {
170
- this.isActive = false;
171
- this.updatedAt = new Date();
172
- await this.save();
173
- }
174
- async activate() {
175
- this.isActive = true;
176
- this.updatedAt = new Date();
177
- await this.save();
178
- }
179
- getNormalBalance() {
180
- switch (this.accountType) {
181
- case 'asset':
182
- case 'expense':
183
- return 'debit';
184
- case 'liability':
185
- case 'equity':
186
- case 'revenue':
187
- return 'credit';
254
+ /**
255
+ * Check if account is an automatic account (Automatikkonto)
256
+ * Automatic accounts like 1400/1600 cannot be posted to directly
257
+ */
258
+ static isAutomaticAccount(accountNumber, skrType) {
259
+ // SKR03: 1400 (Forderungen), 1600 (Verbindlichkeiten)
260
+ // SKR04: 1400 (Forderungen), 1600 (Verbindlichkeiten)
261
+ // Note: In SKR04, 3300 is "Fahrzeugkosten" (vehicle costs), NOT an automatic account
262
+ if (skrType === 'SKR03') {
263
+ return accountNumber === '1400' || accountNumber === '1600';
264
+ }
265
+ else {
266
+ return accountNumber === '1400' || accountNumber === '1600';
267
+ }
188
268
  }
189
- }
190
- async beforeSave() {
191
- // Validate account number format
192
- const accountLength = this.accountNumber?.length || 0;
193
- if (!this.accountNumber || (accountLength !== 4 && accountLength !== 5)) {
194
- throw new Error(`Invalid account number format: ${this.accountNumber}. Must be 4 digits (standard SKR) or 5 digits (debtor/creditor).`);
269
+ /**
270
+ * Validate account for posting - throws error if account cannot be posted to
271
+ */
272
+ static async validateAccountForPosting(accountNumber, skrType) {
273
+ // Check if automatic account
274
+ if (Account.isAutomaticAccount(accountNumber, skrType)) {
275
+ throw new Error(`Account ${accountNumber} is an automatic account (Automatikkonto) and cannot be posted to directly. ` +
276
+ `Use debtor accounts (10000-69999) or creditor accounts (70000-99999) instead.`);
277
+ }
278
+ // Get account to verify it exists
279
+ const account = await Account.getAccountByNumber(accountNumber, skrType);
280
+ if (!account) {
281
+ throw new Error(`Account ${accountNumber} not found in ${skrType}. ` +
282
+ `Please create the account before posting.`);
283
+ }
284
+ // Check if account is active
285
+ if (!account.isActive) {
286
+ throw new Error(`Account ${accountNumber} is inactive and cannot be posted to.`);
287
+ }
288
+ }
289
+ /**
290
+ * Check if this account instance is a debtor account
291
+ */
292
+ isDebtorAccount() {
293
+ return Account.isInDebtorRange(this.accountNumber);
195
294
  }
196
- // Validate account number is numeric
197
- if (!/^\d{4,5}$/.test(this.accountNumber)) {
198
- throw new Error(`Account number must contain only digits: ${this.accountNumber}`);
295
+ /**
296
+ * Check if this account instance is a creditor account
297
+ */
298
+ isCreditorAccount() {
299
+ return Account.isInCreditorRange(this.accountNumber);
199
300
  }
200
- // For 5-digit accounts, validate they are in debtor (10000-69999) or creditor (70000-99999) ranges
201
- if (accountLength === 5) {
202
- const accountNum = parseInt(this.accountNumber);
203
- const isDebtor = accountNum >= 10000 && accountNum <= 69999;
204
- const isCreditor = accountNum >= 70000 && accountNum <= 99999;
205
- if (!isDebtor && !isCreditor) {
206
- throw new Error(`5-digit account number ${this.accountNumber} must be in debtor range (10000-69999) or creditor range (70000-99999).`);
301
+ async updateBalance(debitAmount = 0, creditAmount = 0) {
302
+ this.debitTotal += debitAmount;
303
+ this.creditTotal += creditAmount;
304
+ // Calculate balance based on account type
305
+ switch (this.accountType) {
306
+ case 'asset':
307
+ case 'expense':
308
+ // Normal debit accounts
309
+ this.balance = this.debitTotal - this.creditTotal;
310
+ break;
311
+ case 'liability':
312
+ case 'equity':
313
+ case 'revenue':
314
+ // Normal credit accounts
315
+ this.balance = this.creditTotal - this.debitTotal;
316
+ break;
207
317
  }
318
+ this.updatedAt = new Date();
319
+ await this.save();
320
+ }
321
+ async deactivate() {
322
+ this.isActive = false;
323
+ this.updatedAt = new Date();
324
+ await this.save();
208
325
  }
209
- // Validate account class matches first digit
210
- const firstDigit = parseInt(this.accountNumber[0]);
211
- if (this.accountClass !== firstDigit) {
212
- throw new Error(`Account class ${this.accountClass} does not match account number ${this.accountNumber}`);
326
+ async activate() {
327
+ this.isActive = true;
328
+ this.updatedAt = new Date();
329
+ await this.save();
213
330
  }
214
- // Validate SKR type
215
- if (this.skrType !== 'SKR03' && this.skrType !== 'SKR04') {
216
- throw new Error(`Invalid SKR type: ${this.skrType}`);
331
+ getNormalBalance() {
332
+ switch (this.accountType) {
333
+ case 'asset':
334
+ case 'expense':
335
+ return 'debit';
336
+ case 'liability':
337
+ case 'equity':
338
+ case 'revenue':
339
+ return 'credit';
340
+ }
217
341
  }
218
- // Mark automatic accounts (Automatikkonten)
219
- // These are summary accounts that cannot be posted to directly
220
- if (Account_1.isAutomaticAccount(this.accountNumber, this.skrType)) {
221
- this.isAutomaticAccount = true;
342
+ async beforeSave() {
343
+ // Validate account number format
344
+ const accountLength = this.accountNumber?.length || 0;
345
+ if (!this.accountNumber || (accountLength !== 4 && accountLength !== 5)) {
346
+ throw new Error(`Invalid account number format: ${this.accountNumber}. Must be 4 digits (standard SKR) or 5 digits (debtor/creditor).`);
347
+ }
348
+ // Validate account number is numeric
349
+ if (!/^\d{4,5}$/.test(this.accountNumber)) {
350
+ throw new Error(`Account number must contain only digits: ${this.accountNumber}`);
351
+ }
352
+ // For 5-digit accounts, validate they are in debtor (10000-69999) or creditor (70000-99999) ranges
353
+ if (accountLength === 5) {
354
+ const accountNum = parseInt(this.accountNumber);
355
+ const isDebtor = accountNum >= 10000 && accountNum <= 69999;
356
+ const isCreditor = accountNum >= 70000 && accountNum <= 99999;
357
+ if (!isDebtor && !isCreditor) {
358
+ throw new Error(`5-digit account number ${this.accountNumber} must be in debtor range (10000-69999) or creditor range (70000-99999).`);
359
+ }
360
+ }
361
+ // Validate account class matches first digit
362
+ const firstDigit = parseInt(this.accountNumber[0]);
363
+ if (this.accountClass !== firstDigit) {
364
+ throw new Error(`Account class ${this.accountClass} does not match account number ${this.accountNumber}`);
365
+ }
366
+ // Validate SKR type
367
+ if (this.skrType !== 'SKR03' && this.skrType !== 'SKR04') {
368
+ throw new Error(`Invalid SKR type: ${this.skrType}`);
369
+ }
370
+ // Mark automatic accounts (Automatikkonten)
371
+ // These are summary accounts that cannot be posted to directly
372
+ if (Account.isAutomaticAccount(this.accountNumber, this.skrType)) {
373
+ this.isAutomaticAccount = true;
374
+ }
222
375
  }
223
- }
224
- };
225
- __decorate([
226
- unI(),
227
- __metadata("design:type", String)
228
- ], Account.prototype, "id", void 0);
229
- __decorate([
230
- svDb(),
231
- index(),
232
- __metadata("design:type", String)
233
- ], Account.prototype, "accountNumber", void 0);
234
- __decorate([
235
- svDb(),
236
- searchable(),
237
- __metadata("design:type", String)
238
- ], Account.prototype, "accountName", void 0);
239
- __decorate([
240
- svDb(),
241
- index(),
242
- __metadata("design:type", Number)
243
- ], Account.prototype, "accountClass", void 0);
244
- __decorate([
245
- svDb(),
246
- __metadata("design:type", Number)
247
- ], Account.prototype, "accountGroup", void 0);
248
- __decorate([
249
- svDb(),
250
- __metadata("design:type", Number)
251
- ], Account.prototype, "accountSubgroup", void 0);
252
- __decorate([
253
- svDb(),
254
- __metadata("design:type", String)
255
- ], Account.prototype, "accountType", void 0);
256
- __decorate([
257
- svDb(),
258
- index(),
259
- __metadata("design:type", String)
260
- ], Account.prototype, "skrType", void 0);
261
- __decorate([
262
- svDb(),
263
- searchable(),
264
- __metadata("design:type", String)
265
- ], Account.prototype, "description", void 0);
266
- __decorate([
267
- svDb(),
268
- __metadata("design:type", Number)
269
- ], Account.prototype, "vatRate", void 0);
270
- __decorate([
271
- svDb(),
272
- __metadata("design:type", Number)
273
- ], Account.prototype, "balance", void 0);
274
- __decorate([
275
- svDb(),
276
- __metadata("design:type", Number)
277
- ], Account.prototype, "debitTotal", void 0);
278
- __decorate([
279
- svDb(),
280
- __metadata("design:type", Number)
281
- ], Account.prototype, "creditTotal", void 0);
282
- __decorate([
283
- svDb(),
284
- __metadata("design:type", Boolean)
285
- ], Account.prototype, "isActive", void 0);
286
- __decorate([
287
- svDb(),
288
- __metadata("design:type", Boolean)
289
- ], Account.prototype, "isSystemAccount", void 0);
290
- __decorate([
291
- svDb(),
292
- __metadata("design:type", Boolean)
293
- ], Account.prototype, "isAutomaticAccount", void 0);
294
- __decorate([
295
- svDb(),
296
- __metadata("design:type", Date)
297
- ], Account.prototype, "createdAt", void 0);
298
- __decorate([
299
- svDb(),
300
- __metadata("design:type", Date)
301
- ], Account.prototype, "updatedAt", void 0);
302
- Account = Account_1 = __decorate([
303
- plugins.smartdata.Collection(() => getDbSync()),
304
- __metadata("design:paramtypes", [Object])
305
- ], Account);
376
+ };
377
+ return Account = _classThis;
378
+ })();
306
379
  export { Account };
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMuYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Nrci5jbGFzc2VzLmFjY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHckQsTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBR3BFLElBQU0sT0FBTyxlQUFiLE1BQU0sT0FBUSxTQUFRLGNBQWdDO0lBNEQzRCxZQUFZLElBQTRCO1FBQ3RDLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDO1lBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcs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
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMuYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Nrci5jbGFzc2VzLmFjY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFnQnJELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBc0QsQ0FBQztBQUNoRyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQWlCLENBQUM7QUFDdkQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFXLENBQUM7QUFDM0MsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFVLENBQUM7QUFDekMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFZLENBQUM7QUFDN0MsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFpQixDQUFDO0lBRzFDLE9BQU87NEJBRG5CLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7OztzQkFDRCxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VCQUF0QixTQUFRLFdBQWM7Ozs7OEJBQ3hDLEdBQUcsRUFBRTt5Q0FHTCxJQUFJLEVBQUUsRUFDTixLQUFLLEVBQUU7dUNBR1AsSUFBSSxFQUFFLEVBQ04sVUFBVSxFQUFFO3dDQUdaLElBQUksRUFBRSxFQUNOLEtBQUssRUFBRTt3Q0FHUCxJQUFJLEVBQUU7MkNBR04sSUFBSSxFQUFFO3VDQUdOLElBQUksRUFBRTttQ0FHTixJQUFJLEVBQUUsRUFDTixLQUFLLEVBQUU7dUNBR1As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