@fin.cx/skr 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/index.d.ts +10 -0
- package/dist_ts/index.js +11 -0
- package/dist_ts/plugins.d.ts +5 -0
- package/dist_ts/plugins.js +7 -0
- package/dist_ts/skr.api.d.ts +181 -0
- package/dist_ts/skr.api.js +402 -0
- package/dist_ts/skr.classes.account.d.ts +34 -0
- package/dist_ts/skr.classes.account.js +224 -0
- package/dist_ts/skr.classes.chartofaccounts.d.ts +99 -0
- package/dist_ts/skr.classes.chartofaccounts.js +377 -0
- package/dist_ts/skr.classes.journalentry.d.ts +33 -0
- package/dist_ts/skr.classes.journalentry.js +296 -0
- package/dist_ts/skr.classes.ledger.d.ts +61 -0
- package/dist_ts/skr.classes.ledger.js +363 -0
- package/dist_ts/skr.classes.reports.d.ts +55 -0
- package/dist_ts/skr.classes.reports.js +514 -0
- package/dist_ts/skr.classes.transaction.d.ts +37 -0
- package/dist_ts/skr.classes.transaction.js +263 -0
- package/dist_ts/skr.database.d.ts +5 -0
- package/dist_ts/skr.database.js +28 -0
- package/dist_ts/skr.types.d.ts +126 -0
- package/dist_ts/skr.types.js +2 -0
- package/dist_ts/skr03.data.d.ts +18 -0
- package/dist_ts/skr03.data.js +890 -0
- package/dist_ts/skr04.data.d.ts +18 -0
- package/dist_ts/skr04.data.js +912 -0
- package/npmextra.json +17 -0
- package/package.json +61 -0
- package/readme.hints.md +3 -0
- package/readme.md +409 -0
- package/readme.plan.md +243 -0
- package/ts/index.ts +10 -0
- package/ts/plugins.ts +7 -0
- package/ts/skr.api.ts +533 -0
- package/ts/skr.classes.account.ts +238 -0
- package/ts/skr.classes.chartofaccounts.ts +508 -0
- package/ts/skr.classes.journalentry.ts +318 -0
- package/ts/skr.classes.ledger.ts +528 -0
- package/ts/skr.classes.reports.ts +721 -0
- package/ts/skr.classes.transaction.ts +300 -0
- package/ts/skr.database.ts +39 -0
- package/ts/skr.types.ts +154 -0
- package/ts/skr03.data.ts +901 -0
- package/ts/skr04.data.ts +923 -0
|
@@ -0,0 +1,296 @@
|
|
|
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;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var JournalEntry_1;
|
|
11
|
+
import * as plugins from './plugins.js';
|
|
12
|
+
import { getDbSync } from './skr.database.js';
|
|
13
|
+
import { Account } from './skr.classes.account.js';
|
|
14
|
+
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';
|
|
27
|
+
this.totalDebits = 0;
|
|
28
|
+
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
|
+
// Calculate totals
|
|
40
|
+
this.calculateTotals();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
generateJournalNumber() {
|
|
44
|
+
const timestamp = Date.now();
|
|
45
|
+
const random = Math.floor(Math.random() * 1000);
|
|
46
|
+
return `JE-${timestamp}-${random}`;
|
|
47
|
+
}
|
|
48
|
+
calculateTotals() {
|
|
49
|
+
this.totalDebits = 0;
|
|
50
|
+
this.totalCredits = 0;
|
|
51
|
+
for (const line of this.lines) {
|
|
52
|
+
if (line.debit) {
|
|
53
|
+
this.totalDebits += line.debit;
|
|
54
|
+
}
|
|
55
|
+
if (line.credit) {
|
|
56
|
+
this.totalCredits += line.credit;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Check if balanced (allowing for small rounding differences)
|
|
60
|
+
const difference = Math.abs(this.totalDebits - this.totalCredits);
|
|
61
|
+
this.isBalanced = difference < 0.01;
|
|
62
|
+
}
|
|
63
|
+
static async createJournalEntry(data) {
|
|
64
|
+
const journalEntry = new JournalEntry_1(data);
|
|
65
|
+
await journalEntry.validate();
|
|
66
|
+
await journalEntry.save();
|
|
67
|
+
return journalEntry;
|
|
68
|
+
}
|
|
69
|
+
addLine(line) {
|
|
70
|
+
// Validate line
|
|
71
|
+
if (!line.accountNumber) {
|
|
72
|
+
throw new Error('Account number is required for journal entry line');
|
|
73
|
+
}
|
|
74
|
+
if (!line.debit && !line.credit) {
|
|
75
|
+
throw new Error('Either debit or credit amount is required');
|
|
76
|
+
}
|
|
77
|
+
if (line.debit && line.credit) {
|
|
78
|
+
throw new Error('A line cannot have both debit and credit amounts');
|
|
79
|
+
}
|
|
80
|
+
if (line.debit && line.debit < 0) {
|
|
81
|
+
throw new Error('Debit amount must be positive');
|
|
82
|
+
}
|
|
83
|
+
if (line.credit && line.credit < 0) {
|
|
84
|
+
throw new Error('Credit amount must be positive');
|
|
85
|
+
}
|
|
86
|
+
this.lines.push(line);
|
|
87
|
+
this.calculateTotals();
|
|
88
|
+
}
|
|
89
|
+
removeLine(index) {
|
|
90
|
+
if (index >= 0 && index < this.lines.length) {
|
|
91
|
+
this.lines.splice(index, 1);
|
|
92
|
+
this.calculateTotals();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async validate() {
|
|
96
|
+
// Check if entry is balanced
|
|
97
|
+
if (!this.isBalanced) {
|
|
98
|
+
throw new Error(`Journal entry is not balanced. Debits: ${this.totalDebits}, Credits: ${this.totalCredits}`);
|
|
99
|
+
}
|
|
100
|
+
// Check minimum lines
|
|
101
|
+
if (this.lines.length < 2) {
|
|
102
|
+
throw new Error('Journal entry must have at least 2 lines');
|
|
103
|
+
}
|
|
104
|
+
// Validate all accounts exist and are active
|
|
105
|
+
for (const line of this.lines) {
|
|
106
|
+
const account = await Account.getAccountByNumber(line.accountNumber, this.skrType);
|
|
107
|
+
if (!account) {
|
|
108
|
+
throw new Error(`Account ${line.accountNumber} not found for ${this.skrType}`);
|
|
109
|
+
}
|
|
110
|
+
if (!account.isActive) {
|
|
111
|
+
throw new Error(`Account ${line.accountNumber} is not active`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async post() {
|
|
116
|
+
if (this.status === 'posted') {
|
|
117
|
+
throw new Error('Journal entry is already posted');
|
|
118
|
+
}
|
|
119
|
+
// Validate before posting
|
|
120
|
+
await this.validate();
|
|
121
|
+
// Create individual transactions for each debit-credit pair
|
|
122
|
+
const transactions = [];
|
|
123
|
+
// Simple posting logic: match debits with credits
|
|
124
|
+
// For complex entries, this could be enhanced with specific pairing logic
|
|
125
|
+
const debitLines = this.lines.filter((l) => l.debit);
|
|
126
|
+
const creditLines = this.lines.filter((l) => l.credit);
|
|
127
|
+
if (debitLines.length === 1 && creditLines.length === 1) {
|
|
128
|
+
// Simple entry: one debit, one credit
|
|
129
|
+
const transaction = await Transaction.createTransaction({
|
|
130
|
+
date: this.date,
|
|
131
|
+
debitAccount: debitLines[0].accountNumber,
|
|
132
|
+
creditAccount: creditLines[0].accountNumber,
|
|
133
|
+
amount: debitLines[0].debit,
|
|
134
|
+
description: this.description,
|
|
135
|
+
reference: this.reference,
|
|
136
|
+
skrType: this.skrType,
|
|
137
|
+
costCenter: debitLines[0].costCenter,
|
|
138
|
+
});
|
|
139
|
+
transactions.push(transaction);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Complex entry: multiple debits and/or credits
|
|
143
|
+
// Create transactions to balance the entry
|
|
144
|
+
for (const debitLine of debitLines) {
|
|
145
|
+
for (const creditLine of creditLines) {
|
|
146
|
+
const amount = Math.min(debitLine.debit || 0, creditLine.credit || 0);
|
|
147
|
+
if (amount > 0) {
|
|
148
|
+
const transaction = await Transaction.createTransaction({
|
|
149
|
+
date: this.date,
|
|
150
|
+
debitAccount: debitLine.accountNumber,
|
|
151
|
+
creditAccount: creditLine.accountNumber,
|
|
152
|
+
amount: amount,
|
|
153
|
+
description: `${this.description} - ${debitLine.description || creditLine.description || ''}`,
|
|
154
|
+
reference: this.reference,
|
|
155
|
+
skrType: this.skrType,
|
|
156
|
+
costCenter: debitLine.costCenter || creditLine.costCenter,
|
|
157
|
+
});
|
|
158
|
+
transactions.push(transaction);
|
|
159
|
+
// Reduce amounts for tracking
|
|
160
|
+
if (debitLine.debit)
|
|
161
|
+
debitLine.debit -= amount;
|
|
162
|
+
if (creditLine.credit)
|
|
163
|
+
creditLine.credit -= amount;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Store transaction IDs
|
|
169
|
+
this.transactionIds = transactions.map((t) => t.id);
|
|
170
|
+
// Update status
|
|
171
|
+
this.status = 'posted';
|
|
172
|
+
this.postedAt = new Date();
|
|
173
|
+
await this.save();
|
|
174
|
+
}
|
|
175
|
+
async reverse() {
|
|
176
|
+
if (this.status !== 'posted') {
|
|
177
|
+
throw new Error('Can only reverse posted journal entries');
|
|
178
|
+
}
|
|
179
|
+
// Create reversal entry with swapped debits and credits
|
|
180
|
+
const reversalLines = this.lines.map((line) => ({
|
|
181
|
+
accountNumber: line.accountNumber,
|
|
182
|
+
debit: line.credit, // Swap
|
|
183
|
+
credit: line.debit, // Swap
|
|
184
|
+
description: `Reversal: ${line.description || ''}`,
|
|
185
|
+
costCenter: line.costCenter,
|
|
186
|
+
}));
|
|
187
|
+
const reversalEntry = new JournalEntry_1({
|
|
188
|
+
date: new Date(),
|
|
189
|
+
description: `Reversal of ${this.journalNumber}: ${this.description}`,
|
|
190
|
+
reference: `REV-${this.journalNumber}`,
|
|
191
|
+
lines: reversalLines,
|
|
192
|
+
skrType: this.skrType,
|
|
193
|
+
});
|
|
194
|
+
await reversalEntry.validate();
|
|
195
|
+
await reversalEntry.post();
|
|
196
|
+
// Update original entry status
|
|
197
|
+
this.status = 'reversed';
|
|
198
|
+
await this.save();
|
|
199
|
+
return reversalEntry;
|
|
200
|
+
}
|
|
201
|
+
async beforeSave() {
|
|
202
|
+
// Recalculate totals before saving
|
|
203
|
+
this.calculateTotals();
|
|
204
|
+
// Validate required fields
|
|
205
|
+
if (!this.date) {
|
|
206
|
+
throw new Error('Journal entry date is required');
|
|
207
|
+
}
|
|
208
|
+
if (!this.description) {
|
|
209
|
+
throw new Error('Journal entry description is required');
|
|
210
|
+
}
|
|
211
|
+
if (this.lines.length === 0) {
|
|
212
|
+
throw new Error('Journal entry must have at least one line');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
__decorate([
|
|
217
|
+
unI(),
|
|
218
|
+
__metadata("design:type", String)
|
|
219
|
+
], JournalEntry.prototype, "id", void 0);
|
|
220
|
+
__decorate([
|
|
221
|
+
svDb(),
|
|
222
|
+
index(),
|
|
223
|
+
__metadata("design:type", String)
|
|
224
|
+
], JournalEntry.prototype, "journalNumber", void 0);
|
|
225
|
+
__decorate([
|
|
226
|
+
svDb(),
|
|
227
|
+
index(),
|
|
228
|
+
__metadata("design:type", Date)
|
|
229
|
+
], JournalEntry.prototype, "date", void 0);
|
|
230
|
+
__decorate([
|
|
231
|
+
svDb(),
|
|
232
|
+
searchable(),
|
|
233
|
+
__metadata("design:type", String)
|
|
234
|
+
], JournalEntry.prototype, "description", void 0);
|
|
235
|
+
__decorate([
|
|
236
|
+
svDb(),
|
|
237
|
+
index(),
|
|
238
|
+
__metadata("design:type", String)
|
|
239
|
+
], JournalEntry.prototype, "reference", void 0);
|
|
240
|
+
__decorate([
|
|
241
|
+
svDb(),
|
|
242
|
+
__metadata("design:type", Array)
|
|
243
|
+
], JournalEntry.prototype, "lines", void 0);
|
|
244
|
+
__decorate([
|
|
245
|
+
svDb(),
|
|
246
|
+
index(),
|
|
247
|
+
__metadata("design:type", String)
|
|
248
|
+
], JournalEntry.prototype, "skrType", void 0);
|
|
249
|
+
__decorate([
|
|
250
|
+
svDb(),
|
|
251
|
+
__metadata("design:type", Number)
|
|
252
|
+
], JournalEntry.prototype, "totalDebits", void 0);
|
|
253
|
+
__decorate([
|
|
254
|
+
svDb(),
|
|
255
|
+
__metadata("design:type", Number)
|
|
256
|
+
], JournalEntry.prototype, "totalCredits", void 0);
|
|
257
|
+
__decorate([
|
|
258
|
+
svDb(),
|
|
259
|
+
__metadata("design:type", Boolean)
|
|
260
|
+
], JournalEntry.prototype, "isBalanced", void 0);
|
|
261
|
+
__decorate([
|
|
262
|
+
svDb(),
|
|
263
|
+
index(),
|
|
264
|
+
__metadata("design:type", String)
|
|
265
|
+
], JournalEntry.prototype, "status", void 0);
|
|
266
|
+
__decorate([
|
|
267
|
+
svDb(),
|
|
268
|
+
__metadata("design:type", Array)
|
|
269
|
+
], JournalEntry.prototype, "transactionIds", void 0);
|
|
270
|
+
__decorate([
|
|
271
|
+
svDb(),
|
|
272
|
+
index(),
|
|
273
|
+
__metadata("design:type", String)
|
|
274
|
+
], JournalEntry.prototype, "period", void 0);
|
|
275
|
+
__decorate([
|
|
276
|
+
svDb(),
|
|
277
|
+
__metadata("design:type", Number)
|
|
278
|
+
], JournalEntry.prototype, "fiscalYear", void 0);
|
|
279
|
+
__decorate([
|
|
280
|
+
svDb(),
|
|
281
|
+
__metadata("design:type", Date)
|
|
282
|
+
], JournalEntry.prototype, "createdAt", void 0);
|
|
283
|
+
__decorate([
|
|
284
|
+
svDb(),
|
|
285
|
+
__metadata("design:type", Date)
|
|
286
|
+
], JournalEntry.prototype, "postedAt", void 0);
|
|
287
|
+
__decorate([
|
|
288
|
+
svDb(),
|
|
289
|
+
__metadata("design:type", String)
|
|
290
|
+
], JournalEntry.prototype, "createdBy", void 0);
|
|
291
|
+
JournalEntry = JournalEntry_1 = __decorate([
|
|
292
|
+
plugins.smartdata.Collection(() => getDbSync()),
|
|
293
|
+
__metadata("design:paramtypes", [Object])
|
|
294
|
+
], JournalEntry);
|
|
295
|
+
export { JournalEntry };
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc2tyLmNsYXNzZXMuam91cm5hbGVudHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU8zRCxNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFHcEUsSUFBTSxZQUFZLG9CQUFsQixNQUFNLFlBQWEsU0FBUSxjQUEwQztJQTJEMUUsWUFBWSxJQUE2QjtRQUN2QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElB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
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Transaction } from './skr.classes.transaction.js';
|
|
2
|
+
import { JournalEntry } from './skr.classes.journalentry.js';
|
|
3
|
+
import type { TSKRType, ITransactionData, IJournalEntry, IAccountBalance } from './skr.types.js';
|
|
4
|
+
export declare class Ledger {
|
|
5
|
+
private skrType;
|
|
6
|
+
private logger;
|
|
7
|
+
constructor(skrType: TSKRType);
|
|
8
|
+
/**
|
|
9
|
+
* Post a transaction with validation
|
|
10
|
+
*/
|
|
11
|
+
postTransaction(transactionData: ITransactionData): Promise<Transaction>;
|
|
12
|
+
/**
|
|
13
|
+
* Post a journal entry with validation
|
|
14
|
+
*/
|
|
15
|
+
postJournalEntry(journalData: IJournalEntry): Promise<JournalEntry>;
|
|
16
|
+
/**
|
|
17
|
+
* Validate that accounts exist and are active
|
|
18
|
+
*/
|
|
19
|
+
private validateAccounts;
|
|
20
|
+
/**
|
|
21
|
+
* Validate journal entry balance
|
|
22
|
+
*/
|
|
23
|
+
private validateJournalBalance;
|
|
24
|
+
/**
|
|
25
|
+
* Reverse a transaction
|
|
26
|
+
*/
|
|
27
|
+
reverseTransaction(transactionId: string): Promise<Transaction>;
|
|
28
|
+
/**
|
|
29
|
+
* Reverse a journal entry
|
|
30
|
+
*/
|
|
31
|
+
reverseJournalEntry(journalId: string): Promise<JournalEntry>;
|
|
32
|
+
/**
|
|
33
|
+
* Get account history (all transactions for an account)
|
|
34
|
+
*/
|
|
35
|
+
getAccountHistory(accountNumber: string, dateFrom?: Date, dateTo?: Date): Promise<Transaction[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Get account balance at a specific date
|
|
38
|
+
*/
|
|
39
|
+
getAccountBalance(accountNumber: string, asOfDate?: Date): Promise<IAccountBalance>;
|
|
40
|
+
/**
|
|
41
|
+
* Close accounting period (create closing entries)
|
|
42
|
+
*/
|
|
43
|
+
closeAccountingPeriod(period: string, // Format: YYYY-MM
|
|
44
|
+
closingAccountNumber?: string): Promise<JournalEntry[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Calculate account balance for a specific set of transactions
|
|
47
|
+
*/
|
|
48
|
+
private getAccountBalanceForPeriod;
|
|
49
|
+
/**
|
|
50
|
+
* Validate double-entry rules
|
|
51
|
+
*/
|
|
52
|
+
validateDoubleEntry(debitAmount: number, creditAmount: number): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Get unbalanced transactions (for audit)
|
|
55
|
+
*/
|
|
56
|
+
getUnbalancedTransactions(): Promise<Transaction[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Recalculate all account balances
|
|
59
|
+
*/
|
|
60
|
+
recalculateAllBalances(): Promise<void>;
|
|
61
|
+
}
|