@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,263 +1,334 @@
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 Transaction_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
- const { SmartDataDbDoc, svDb, unI, index, searchable } = plugins.smartdata;
15
- let Transaction = Transaction_1 = class Transaction extends SmartDataDbDoc {
16
- constructor(data) {
17
- super();
18
- if (data) {
19
- this.id = plugins.smartunique.shortId();
20
- this.transactionNumber = this.generateTransactionNumber();
21
- this.date = data.date || new Date();
22
- this.debitAccount = data.debitAccount || '';
23
- this.creditAccount = data.creditAccount || '';
24
- this.amount = data.amount || 0;
25
- this.description = data.description || '';
26
- this.reference = data.reference || '';
27
- this.skrType = data.skrType || 'SKR03';
28
- this.vatAmount = data.vatAmount || 0;
29
- this.costCenter = data.costCenter || '';
30
- this.status = 'pending';
31
- this.reversalOf = '';
32
- this.reversedBy = '';
33
- // Set period and fiscal year
34
- const transDate = new Date(this.date);
35
- this.period = `${transDate.getFullYear()}-${String(transDate.getMonth() + 1).padStart(2, '0')}`;
36
- this.fiscalYear = transDate.getFullYear();
37
- this.createdAt = new Date();
38
- this.postedAt = null;
39
- this.createdBy = 'system';
40
- }
41
- }
42
- generateTransactionNumber() {
43
- const timestamp = Date.now();
44
- const random = Math.floor(Math.random() * 1000);
45
- return `TXN-${timestamp}-${random}`;
46
- }
47
- static async createTransaction(data) {
48
- const transaction = new Transaction_1(data);
49
- await transaction.validateAndPost();
50
- return transaction;
51
- }
52
- static async getTransactionById(id) {
53
- const transaction = await Transaction_1.getInstance({ id });
54
- return transaction;
55
- }
56
- static async getTransactionsByAccount(accountNumber, skrType) {
57
- const transactionsDebit = await Transaction_1.getInstances({
58
- debitAccount: accountNumber,
59
- skrType,
60
- status: 'posted',
61
- });
62
- const transactionsCredit = await Transaction_1.getInstances({
63
- creditAccount: accountNumber,
64
- skrType,
65
- status: 'posted',
66
- });
67
- const transactions = [...transactionsDebit, ...transactionsCredit];
68
- return transactions;
69
- }
70
- static async getTransactionsByPeriod(period, skrType) {
71
- const transactions = await Transaction_1.getInstances({
72
- period,
73
- skrType,
74
- status: 'posted',
75
- });
76
- return transactions;
77
- }
78
- static async getTransactionsByDateRange(dateFrom, dateTo, skrType) {
79
- const allTransactions = await Transaction_1.getInstances({
80
- skrType,
81
- status: 'posted',
82
- });
83
- const transactions = allTransactions.filter((t) => t.date >= dateFrom && t.date <= dateTo);
84
- return transactions;
85
- }
86
- async validateAndPost() {
87
- // Validate transaction
88
- await this.validateTransaction();
89
- // Update account balances
90
- await this.updateAccountBalances();
91
- // Mark as posted
92
- this.status = 'posted';
93
- this.postedAt = new Date();
94
- await this.save();
95
- }
96
- async validateTransaction() {
97
- // Check if accounts exist
98
- const debitAccount = await Account.getAccountByNumber(this.debitAccount, this.skrType);
99
- const creditAccount = await Account.getAccountByNumber(this.creditAccount, this.skrType);
100
- if (!debitAccount) {
101
- throw new Error(`Debit account ${this.debitAccount} not found for ${this.skrType}`);
38
+ const SmartDataDbDoc = plugins.smartdata.SmartDataDbDoc;
39
+ const Collection = plugins.smartdata.Collection;
40
+ const svDb = plugins.smartdata.svDb;
41
+ const unI = plugins.smartdata.unI;
42
+ const index = plugins.smartdata.index;
43
+ const searchable = plugins.smartdata.searchable;
44
+ let Transaction = (() => {
45
+ let _classDecorators = [Collection(() => getDbSync())];
46
+ let _classDescriptor;
47
+ let _classExtraInitializers = [];
48
+ let _classThis;
49
+ let _classSuper = SmartDataDbDoc;
50
+ let _id_decorators;
51
+ let _id_initializers = [];
52
+ let _id_extraInitializers = [];
53
+ let _transactionNumber_decorators;
54
+ let _transactionNumber_initializers = [];
55
+ let _transactionNumber_extraInitializers = [];
56
+ let _date_decorators;
57
+ let _date_initializers = [];
58
+ let _date_extraInitializers = [];
59
+ let _debitAccount_decorators;
60
+ let _debitAccount_initializers = [];
61
+ let _debitAccount_extraInitializers = [];
62
+ let _creditAccount_decorators;
63
+ let _creditAccount_initializers = [];
64
+ let _creditAccount_extraInitializers = [];
65
+ let _amount_decorators;
66
+ let _amount_initializers = [];
67
+ let _amount_extraInitializers = [];
68
+ let _description_decorators;
69
+ let _description_initializers = [];
70
+ let _description_extraInitializers = [];
71
+ let _reference_decorators;
72
+ let _reference_initializers = [];
73
+ let _reference_extraInitializers = [];
74
+ let _skrType_decorators;
75
+ let _skrType_initializers = [];
76
+ let _skrType_extraInitializers = [];
77
+ let _vatAmount_decorators;
78
+ let _vatAmount_initializers = [];
79
+ let _vatAmount_extraInitializers = [];
80
+ let _costCenter_decorators;
81
+ let _costCenter_initializers = [];
82
+ let _costCenter_extraInitializers = [];
83
+ let _status_decorators;
84
+ let _status_initializers = [];
85
+ let _status_extraInitializers = [];
86
+ let _reversalOf_decorators;
87
+ let _reversalOf_initializers = [];
88
+ let _reversalOf_extraInitializers = [];
89
+ let _reversedBy_decorators;
90
+ let _reversedBy_initializers = [];
91
+ let _reversedBy_extraInitializers = [];
92
+ let _period_decorators;
93
+ let _period_initializers = [];
94
+ let _period_extraInitializers = [];
95
+ let _fiscalYear_decorators;
96
+ let _fiscalYear_initializers = [];
97
+ let _fiscalYear_extraInitializers = [];
98
+ let _createdAt_decorators;
99
+ let _createdAt_initializers = [];
100
+ let _createdAt_extraInitializers = [];
101
+ let _postedAt_decorators;
102
+ let _postedAt_initializers = [];
103
+ let _postedAt_extraInitializers = [];
104
+ let _createdBy_decorators;
105
+ let _createdBy_initializers = [];
106
+ let _createdBy_extraInitializers = [];
107
+ var Transaction = class extends _classSuper {
108
+ static { _classThis = this; }
109
+ static {
110
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
111
+ _id_decorators = [unI()];
112
+ _transactionNumber_decorators = [svDb(), index()];
113
+ _date_decorators = [svDb(), index()];
114
+ _debitAccount_decorators = [svDb(), index()];
115
+ _creditAccount_decorators = [svDb(), index()];
116
+ _amount_decorators = [svDb()];
117
+ _description_decorators = [svDb(), searchable()];
118
+ _reference_decorators = [svDb(), index()];
119
+ _skrType_decorators = [svDb(), index()];
120
+ _vatAmount_decorators = [svDb()];
121
+ _costCenter_decorators = [svDb()];
122
+ _status_decorators = [svDb(), index()];
123
+ _reversalOf_decorators = [svDb()];
124
+ _reversedBy_decorators = [svDb()];
125
+ _period_decorators = [svDb(), index()];
126
+ _fiscalYear_decorators = [svDb()];
127
+ _createdAt_decorators = [svDb()];
128
+ _postedAt_decorators = [svDb()];
129
+ _createdBy_decorators = [svDb()];
130
+ __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);
131
+ __esDecorate(null, null, _transactionNumber_decorators, { kind: "field", name: "transactionNumber", static: false, private: false, access: { has: obj => "transactionNumber" in obj, get: obj => obj.transactionNumber, set: (obj, value) => { obj.transactionNumber = value; } }, metadata: _metadata }, _transactionNumber_initializers, _transactionNumber_extraInitializers);
132
+ __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);
133
+ __esDecorate(null, null, _debitAccount_decorators, { kind: "field", name: "debitAccount", static: false, private: false, access: { has: obj => "debitAccount" in obj, get: obj => obj.debitAccount, set: (obj, value) => { obj.debitAccount = value; } }, metadata: _metadata }, _debitAccount_initializers, _debitAccount_extraInitializers);
134
+ __esDecorate(null, null, _creditAccount_decorators, { kind: "field", name: "creditAccount", static: false, private: false, access: { has: obj => "creditAccount" in obj, get: obj => obj.creditAccount, set: (obj, value) => { obj.creditAccount = value; } }, metadata: _metadata }, _creditAccount_initializers, _creditAccount_extraInitializers);
135
+ __esDecorate(null, null, _amount_decorators, { kind: "field", name: "amount", static: false, private: false, access: { has: obj => "amount" in obj, get: obj => obj.amount, set: (obj, value) => { obj.amount = value; } }, metadata: _metadata }, _amount_initializers, _amount_extraInitializers);
136
+ __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);
137
+ __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);
138
+ __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);
139
+ __esDecorate(null, null, _vatAmount_decorators, { kind: "field", name: "vatAmount", static: false, private: false, access: { has: obj => "vatAmount" in obj, get: obj => obj.vatAmount, set: (obj, value) => { obj.vatAmount = value; } }, metadata: _metadata }, _vatAmount_initializers, _vatAmount_extraInitializers);
140
+ __esDecorate(null, null, _costCenter_decorators, { kind: "field", name: "costCenter", static: false, private: false, access: { has: obj => "costCenter" in obj, get: obj => obj.costCenter, set: (obj, value) => { obj.costCenter = value; } }, metadata: _metadata }, _costCenter_initializers, _costCenter_extraInitializers);
141
+ __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);
142
+ __esDecorate(null, null, _reversalOf_decorators, { kind: "field", name: "reversalOf", static: false, private: false, access: { has: obj => "reversalOf" in obj, get: obj => obj.reversalOf, set: (obj, value) => { obj.reversalOf = value; } }, metadata: _metadata }, _reversalOf_initializers, _reversalOf_extraInitializers);
143
+ __esDecorate(null, null, _reversedBy_decorators, { kind: "field", name: "reversedBy", static: false, private: false, access: { has: obj => "reversedBy" in obj, get: obj => obj.reversedBy, set: (obj, value) => { obj.reversedBy = value; } }, metadata: _metadata }, _reversedBy_initializers, _reversedBy_extraInitializers);
144
+ __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);
145
+ __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);
146
+ __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);
147
+ __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);
148
+ __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);
149
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
150
+ Transaction = _classThis = _classDescriptor.value;
151
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
152
+ __runInitializers(_classThis, _classExtraInitializers);
102
153
  }
103
- if (!creditAccount) {
104
- throw new Error(`Credit account ${this.creditAccount} not found for ${this.skrType}`);
154
+ id = __runInitializers(this, _id_initializers, void 0);
155
+ transactionNumber = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _transactionNumber_initializers, void 0));
156
+ date = (__runInitializers(this, _transactionNumber_extraInitializers), __runInitializers(this, _date_initializers, void 0));
157
+ debitAccount = (__runInitializers(this, _date_extraInitializers), __runInitializers(this, _debitAccount_initializers, void 0));
158
+ creditAccount = (__runInitializers(this, _debitAccount_extraInitializers), __runInitializers(this, _creditAccount_initializers, void 0));
159
+ amount = (__runInitializers(this, _creditAccount_extraInitializers), __runInitializers(this, _amount_initializers, void 0));
160
+ description = (__runInitializers(this, _amount_extraInitializers), __runInitializers(this, _description_initializers, void 0));
161
+ reference = (__runInitializers(this, _description_extraInitializers), __runInitializers(this, _reference_initializers, void 0));
162
+ skrType = (__runInitializers(this, _reference_extraInitializers), __runInitializers(this, _skrType_initializers, void 0));
163
+ vatAmount = (__runInitializers(this, _skrType_extraInitializers), __runInitializers(this, _vatAmount_initializers, void 0));
164
+ costCenter = (__runInitializers(this, _vatAmount_extraInitializers), __runInitializers(this, _costCenter_initializers, void 0));
165
+ status = (__runInitializers(this, _costCenter_extraInitializers), __runInitializers(this, _status_initializers, void 0));
166
+ reversalOf = (__runInitializers(this, _status_extraInitializers), __runInitializers(this, _reversalOf_initializers, void 0));
167
+ reversedBy = (__runInitializers(this, _reversalOf_extraInitializers), __runInitializers(this, _reversedBy_initializers, void 0));
168
+ period = (__runInitializers(this, _reversedBy_extraInitializers), __runInitializers(this, _period_initializers, void 0)); // Format: YYYY-MM
169
+ fiscalYear = (__runInitializers(this, _period_extraInitializers), __runInitializers(this, _fiscalYear_initializers, void 0));
170
+ createdAt = (__runInitializers(this, _fiscalYear_extraInitializers), __runInitializers(this, _createdAt_initializers, void 0));
171
+ postedAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _postedAt_initializers, void 0));
172
+ createdBy = (__runInitializers(this, _postedAt_extraInitializers), __runInitializers(this, _createdBy_initializers, void 0));
173
+ constructor(data) {
174
+ super();
175
+ __runInitializers(this, _createdBy_extraInitializers);
176
+ if (data) {
177
+ this.id = plugins.smartunique.shortId();
178
+ this.transactionNumber = this.generateTransactionNumber();
179
+ this.date = data.date || new Date();
180
+ this.debitAccount = data.debitAccount || '';
181
+ this.creditAccount = data.creditAccount || '';
182
+ this.amount = data.amount || 0;
183
+ this.description = data.description || '';
184
+ this.reference = data.reference || '';
185
+ this.skrType = data.skrType || 'SKR03';
186
+ this.vatAmount = data.vatAmount || 0;
187
+ this.costCenter = data.costCenter || '';
188
+ this.status = 'pending';
189
+ this.reversalOf = '';
190
+ this.reversedBy = '';
191
+ // Set period and fiscal year
192
+ const transDate = new Date(this.date);
193
+ this.period = `${transDate.getFullYear()}-${String(transDate.getMonth() + 1).padStart(2, '0')}`;
194
+ this.fiscalYear = transDate.getFullYear();
195
+ this.createdAt = new Date();
196
+ this.postedAt = null;
197
+ this.createdBy = 'system';
198
+ }
105
199
  }
106
- // Check if accounts are active
107
- if (!debitAccount.isActive) {
108
- throw new Error(`Debit account ${this.debitAccount} is not active`);
200
+ generateTransactionNumber() {
201
+ const timestamp = Date.now();
202
+ const random = Math.floor(Math.random() * 1000);
203
+ return `TXN-${timestamp}-${random}`;
109
204
  }
110
- if (!creditAccount.isActive) {
111
- throw new Error(`Credit account ${this.creditAccount} is not active`);
205
+ static async createTransaction(data) {
206
+ const transaction = new Transaction(data);
207
+ await transaction.validateAndPost();
208
+ return transaction;
112
209
  }
113
- // Validate amount
114
- if (this.amount <= 0) {
115
- throw new Error('Transaction amount must be greater than zero');
210
+ static async getTransactionById(id) {
211
+ const transaction = await Transaction.getInstance({ id });
212
+ return transaction;
116
213
  }
117
- // Check for same account
118
- if (this.debitAccount === this.creditAccount) {
119
- throw new Error('Debit and credit accounts cannot be the same');
214
+ static async getTransactionsByAccount(accountNumber, skrType) {
215
+ const transactionsDebit = await Transaction.getInstances({
216
+ debitAccount: accountNumber,
217
+ skrType,
218
+ status: 'posted',
219
+ });
220
+ const transactionsCredit = await Transaction.getInstances({
221
+ creditAccount: accountNumber,
222
+ skrType,
223
+ status: 'posted',
224
+ });
225
+ const transactions = [...transactionsDebit, ...transactionsCredit];
226
+ return transactions;
120
227
  }
121
- }
122
- async updateAccountBalances() {
123
- const debitAccount = await Account.getAccountByNumber(this.debitAccount, this.skrType);
124
- const creditAccount = await Account.getAccountByNumber(this.creditAccount, this.skrType);
125
- if (debitAccount) {
126
- await debitAccount.updateBalance(this.amount, 0);
228
+ static async getTransactionsByPeriod(period, skrType) {
229
+ const transactions = await Transaction.getInstances({
230
+ period,
231
+ skrType,
232
+ status: 'posted',
233
+ });
234
+ return transactions;
127
235
  }
128
- if (creditAccount) {
129
- await creditAccount.updateBalance(0, this.amount);
236
+ static async getTransactionsByDateRange(dateFrom, dateTo, skrType) {
237
+ const allTransactions = await Transaction.getInstances({
238
+ skrType,
239
+ status: 'posted',
240
+ });
241
+ const transactions = allTransactions.filter((t) => t.date >= dateFrom && t.date <= dateTo);
242
+ return transactions;
130
243
  }
131
- }
132
- async reverseTransaction() {
133
- if (this.status !== 'posted') {
134
- throw new Error('Can only reverse posted transactions');
244
+ async validateAndPost() {
245
+ // Validate transaction
246
+ await this.validateTransaction();
247
+ // Update account balances
248
+ await this.updateAccountBalances();
249
+ // Mark as posted
250
+ this.status = 'posted';
251
+ this.postedAt = new Date();
252
+ await this.save();
135
253
  }
136
- if (this.reversedBy) {
137
- throw new Error('Transaction has already been reversed');
254
+ async validateTransaction() {
255
+ // Check if accounts exist
256
+ const debitAccount = await Account.getAccountByNumber(this.debitAccount, this.skrType);
257
+ const creditAccount = await Account.getAccountByNumber(this.creditAccount, this.skrType);
258
+ if (!debitAccount) {
259
+ throw new Error(`Debit account ${this.debitAccount} not found for ${this.skrType}`);
260
+ }
261
+ if (!creditAccount) {
262
+ throw new Error(`Credit account ${this.creditAccount} not found for ${this.skrType}`);
263
+ }
264
+ // Check if accounts are active
265
+ if (!debitAccount.isActive) {
266
+ throw new Error(`Debit account ${this.debitAccount} is not active`);
267
+ }
268
+ if (!creditAccount.isActive) {
269
+ throw new Error(`Credit account ${this.creditAccount} is not active`);
270
+ }
271
+ // Validate amount
272
+ if (this.amount <= 0) {
273
+ throw new Error('Transaction amount must be greater than zero');
274
+ }
275
+ // Check for same account
276
+ if (this.debitAccount === this.creditAccount) {
277
+ throw new Error('Debit and credit accounts cannot be the same');
278
+ }
138
279
  }
139
- // Create reversal transaction
140
- const reversalData = {
141
- date: new Date(),
142
- debitAccount: this.creditAccount, // Swap accounts
143
- creditAccount: this.debitAccount, // Swap accounts
144
- amount: this.amount,
145
- description: `Reversal of ${this.transactionNumber}: ${this.description}`,
146
- reference: `REV-${this.transactionNumber}`,
147
- skrType: this.skrType,
148
- vatAmount: this.vatAmount,
149
- costCenter: this.costCenter,
150
- };
151
- const reversalTransaction = new Transaction_1(reversalData);
152
- reversalTransaction.reversalOf = this.id;
153
- await reversalTransaction.validateAndPost();
154
- // Update original transaction
155
- this.reversedBy = reversalTransaction.id;
156
- this.status = 'reversed';
157
- await this.save();
158
- return reversalTransaction;
159
- }
160
- async beforeSave() {
161
- // Additional validation before saving
162
- if (!this.debitAccount || !this.creditAccount) {
163
- throw new Error('Both debit and credit accounts are required');
280
+ async updateAccountBalances() {
281
+ const debitAccount = await Account.getAccountByNumber(this.debitAccount, this.skrType);
282
+ const creditAccount = await Account.getAccountByNumber(this.creditAccount, this.skrType);
283
+ if (debitAccount) {
284
+ await debitAccount.updateBalance(this.amount, 0);
285
+ }
286
+ if (creditAccount) {
287
+ await creditAccount.updateBalance(0, this.amount);
288
+ }
164
289
  }
165
- if (!this.date) {
166
- throw new Error('Transaction date is required');
290
+ async reverseTransaction() {
291
+ if (this.status !== 'posted') {
292
+ throw new Error('Can only reverse posted transactions');
293
+ }
294
+ if (this.reversedBy) {
295
+ throw new Error('Transaction has already been reversed');
296
+ }
297
+ // Create reversal transaction
298
+ const reversalData = {
299
+ date: new Date(),
300
+ debitAccount: this.creditAccount, // Swap accounts
301
+ creditAccount: this.debitAccount, // Swap accounts
302
+ amount: this.amount,
303
+ description: `Reversal of ${this.transactionNumber}: ${this.description}`,
304
+ reference: `REV-${this.transactionNumber}`,
305
+ skrType: this.skrType,
306
+ vatAmount: this.vatAmount,
307
+ costCenter: this.costCenter,
308
+ };
309
+ const reversalTransaction = new Transaction(reversalData);
310
+ reversalTransaction.reversalOf = this.id;
311
+ await reversalTransaction.validateAndPost();
312
+ // Update original transaction
313
+ this.reversedBy = reversalTransaction.id;
314
+ this.status = 'reversed';
315
+ await this.save();
316
+ return reversalTransaction;
167
317
  }
168
- if (!this.description) {
169
- throw new Error('Transaction description is required');
318
+ async beforeSave() {
319
+ // Additional validation before saving
320
+ if (!this.debitAccount || !this.creditAccount) {
321
+ throw new Error('Both debit and credit accounts are required');
322
+ }
323
+ if (!this.date) {
324
+ throw new Error('Transaction date is required');
325
+ }
326
+ if (!this.description) {
327
+ throw new Error('Transaction description is required');
328
+ }
170
329
  }
171
- }
172
- };
173
- __decorate([
174
- unI(),
175
- __metadata("design:type", String)
176
- ], Transaction.prototype, "id", void 0);
177
- __decorate([
178
- svDb(),
179
- index(),
180
- __metadata("design:type", String)
181
- ], Transaction.prototype, "transactionNumber", void 0);
182
- __decorate([
183
- svDb(),
184
- index(),
185
- __metadata("design:type", Date)
186
- ], Transaction.prototype, "date", void 0);
187
- __decorate([
188
- svDb(),
189
- index(),
190
- __metadata("design:type", String)
191
- ], Transaction.prototype, "debitAccount", void 0);
192
- __decorate([
193
- svDb(),
194
- index(),
195
- __metadata("design:type", String)
196
- ], Transaction.prototype, "creditAccount", void 0);
197
- __decorate([
198
- svDb(),
199
- __metadata("design:type", Number)
200
- ], Transaction.prototype, "amount", void 0);
201
- __decorate([
202
- svDb(),
203
- searchable(),
204
- __metadata("design:type", String)
205
- ], Transaction.prototype, "description", void 0);
206
- __decorate([
207
- svDb(),
208
- index(),
209
- __metadata("design:type", String)
210
- ], Transaction.prototype, "reference", void 0);
211
- __decorate([
212
- svDb(),
213
- index(),
214
- __metadata("design:type", String)
215
- ], Transaction.prototype, "skrType", void 0);
216
- __decorate([
217
- svDb(),
218
- __metadata("design:type", Number)
219
- ], Transaction.prototype, "vatAmount", void 0);
220
- __decorate([
221
- svDb(),
222
- __metadata("design:type", String)
223
- ], Transaction.prototype, "costCenter", void 0);
224
- __decorate([
225
- svDb(),
226
- index(),
227
- __metadata("design:type", String)
228
- ], Transaction.prototype, "status", void 0);
229
- __decorate([
230
- svDb(),
231
- __metadata("design:type", String)
232
- ], Transaction.prototype, "reversalOf", void 0);
233
- __decorate([
234
- svDb(),
235
- __metadata("design:type", String)
236
- ], Transaction.prototype, "reversedBy", void 0);
237
- __decorate([
238
- svDb(),
239
- index(),
240
- __metadata("design:type", String)
241
- ], Transaction.prototype, "period", void 0);
242
- __decorate([
243
- svDb(),
244
- __metadata("design:type", Number)
245
- ], Transaction.prototype, "fiscalYear", void 0);
246
- __decorate([
247
- svDb(),
248
- __metadata("design:type", Date)
249
- ], Transaction.prototype, "createdAt", void 0);
250
- __decorate([
251
- svDb(),
252
- __metadata("design:type", Date)
253
- ], Transaction.prototype, "postedAt", void 0);
254
- __decorate([
255
- svDb(),
256
- __metadata("design:type", String)
257
- ], Transaction.prototype, "createdBy", void 0);
258
- Transaction = Transaction_1 = __decorate([
259
- plugins.smartdata.Collection(() => getDbSync()),
260
- __metadata("design:paramtypes", [Object])
261
- ], Transaction);
330
+ };
331
+ return Transaction = _classThis;
332
+ })();
262
333
  export { Transaction };
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMudHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9za3IuY2xhc3Nlcy50cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU9uRCxNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFHcEUsSUFBTSxXQUFXLG1CQUFqQixNQUFNLFdBQVksU0FBUSxjQUF3QztJQW1FdkUsWUFBWSxJQUFnQztRQUMxQyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJ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
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMudHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9za3IuY2xhc3Nlcy50cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQW9CbkQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFzRCxDQUFDO0FBQ2hHLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBaUIsQ0FBQztBQUN2RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQVcsQ0FBQztBQUMzQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQVUsQ0FBQztBQUN6QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQVksQ0FBQztBQUM3QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQWlCLENBQUM7SUFHMUMsV0FBVzs0QkFEdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOzs7O3NCQUNHLGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBQXRCLFNBQVEsV0FBYzs7Ozs4QkFDNUMsR0FBRyxFQUFFOzZDQUdMLElBQUksRUFBRSxFQUNOLEtBQUssRUFBRTtnQ0FHUCxJQUFJLEVBQUUsRUFDTixLQUFLLEVBQUU7d0NBR1AsSUFBSSxFQUFFLEVBQ04sS0FBSyxFQUFFO3lDQUdQLElBQUksRUFBRSxFQUNOLEtBQUssRUFBRTtrQ0FHUCxJQUFJ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