@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.
Files changed (44) hide show
  1. package/dist_ts/index.d.ts +10 -0
  2. package/dist_ts/index.js +11 -0
  3. package/dist_ts/plugins.d.ts +5 -0
  4. package/dist_ts/plugins.js +7 -0
  5. package/dist_ts/skr.api.d.ts +181 -0
  6. package/dist_ts/skr.api.js +402 -0
  7. package/dist_ts/skr.classes.account.d.ts +34 -0
  8. package/dist_ts/skr.classes.account.js +224 -0
  9. package/dist_ts/skr.classes.chartofaccounts.d.ts +99 -0
  10. package/dist_ts/skr.classes.chartofaccounts.js +377 -0
  11. package/dist_ts/skr.classes.journalentry.d.ts +33 -0
  12. package/dist_ts/skr.classes.journalentry.js +296 -0
  13. package/dist_ts/skr.classes.ledger.d.ts +61 -0
  14. package/dist_ts/skr.classes.ledger.js +363 -0
  15. package/dist_ts/skr.classes.reports.d.ts +55 -0
  16. package/dist_ts/skr.classes.reports.js +514 -0
  17. package/dist_ts/skr.classes.transaction.d.ts +37 -0
  18. package/dist_ts/skr.classes.transaction.js +263 -0
  19. package/dist_ts/skr.database.d.ts +5 -0
  20. package/dist_ts/skr.database.js +28 -0
  21. package/dist_ts/skr.types.d.ts +126 -0
  22. package/dist_ts/skr.types.js +2 -0
  23. package/dist_ts/skr03.data.d.ts +18 -0
  24. package/dist_ts/skr03.data.js +890 -0
  25. package/dist_ts/skr04.data.d.ts +18 -0
  26. package/dist_ts/skr04.data.js +912 -0
  27. package/npmextra.json +17 -0
  28. package/package.json +61 -0
  29. package/readme.hints.md +3 -0
  30. package/readme.md +409 -0
  31. package/readme.plan.md +243 -0
  32. package/ts/index.ts +10 -0
  33. package/ts/plugins.ts +7 -0
  34. package/ts/skr.api.ts +533 -0
  35. package/ts/skr.classes.account.ts +238 -0
  36. package/ts/skr.classes.chartofaccounts.ts +508 -0
  37. package/ts/skr.classes.journalentry.ts +318 -0
  38. package/ts/skr.classes.ledger.ts +528 -0
  39. package/ts/skr.classes.reports.ts +721 -0
  40. package/ts/skr.classes.transaction.ts +300 -0
  41. package/ts/skr.database.ts +39 -0
  42. package/ts/skr.types.ts +154 -0
  43. package/ts/skr03.data.ts +901 -0
  44. 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
+ }