@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,224 @@
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 Account_1;
11
+ import * as plugins from './plugins.js';
12
+ 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;
36
+ }
37
+ this.balance = 0;
38
+ this.debitTotal = 0;
39
+ this.creditTotal = 0;
40
+ this.isSystemAccount = true;
41
+ this.createdAt = new Date();
42
+ this.updatedAt = new Date();
43
+ }
44
+ }
45
+ static async createAccount(data) {
46
+ const account = new Account_1(data);
47
+ await account.save();
48
+ return account;
49
+ }
50
+ static async getAccountByNumber(accountNumber, skrType) {
51
+ const account = await Account_1.getInstance({
52
+ accountNumber,
53
+ skrType,
54
+ });
55
+ return account;
56
+ }
57
+ static async getAccountsByClass(accountClass, skrType) {
58
+ const accounts = await Account_1.getInstances({
59
+ accountClass,
60
+ skrType,
61
+ isActive: true,
62
+ });
63
+ return accounts;
64
+ }
65
+ static async getAccountsByType(accountType, skrType) {
66
+ const accounts = await Account_1.getInstances({
67
+ accountType,
68
+ skrType,
69
+ isActive: true,
70
+ });
71
+ return accounts;
72
+ }
73
+ static async searchAccounts(searchTerm, skrType) {
74
+ const query = {};
75
+ if (skrType) {
76
+ query.skrType = skrType;
77
+ }
78
+ const accounts = await Account_1.getInstances(query);
79
+ // Filter by search term
80
+ const lowerSearchTerm = searchTerm.toLowerCase();
81
+ return accounts.filter((account) => account.accountNumber.includes(searchTerm) ||
82
+ account.accountName.toLowerCase().includes(lowerSearchTerm) ||
83
+ account.description.toLowerCase().includes(lowerSearchTerm));
84
+ }
85
+ async updateBalance(debitAmount = 0, creditAmount = 0) {
86
+ this.debitTotal += debitAmount;
87
+ this.creditTotal += creditAmount;
88
+ // Calculate balance based on account type
89
+ switch (this.accountType) {
90
+ case 'asset':
91
+ case 'expense':
92
+ // Normal debit accounts
93
+ this.balance = this.debitTotal - this.creditTotal;
94
+ break;
95
+ case 'liability':
96
+ case 'equity':
97
+ case 'revenue':
98
+ // Normal credit accounts
99
+ this.balance = this.creditTotal - this.debitTotal;
100
+ break;
101
+ }
102
+ this.updatedAt = new Date();
103
+ await this.save();
104
+ }
105
+ async deactivate() {
106
+ this.isActive = false;
107
+ this.updatedAt = new Date();
108
+ await this.save();
109
+ }
110
+ async activate() {
111
+ this.isActive = true;
112
+ this.updatedAt = new Date();
113
+ await this.save();
114
+ }
115
+ getNormalBalance() {
116
+ switch (this.accountType) {
117
+ case 'asset':
118
+ case 'expense':
119
+ return 'debit';
120
+ case 'liability':
121
+ case 'equity':
122
+ case 'revenue':
123
+ return 'credit';
124
+ }
125
+ }
126
+ async beforeSave() {
127
+ // Validate account number format
128
+ if (!this.accountNumber || this.accountNumber.length !== 4) {
129
+ throw new Error(`Invalid account number format: ${this.accountNumber}. Must be 4 digits.`);
130
+ }
131
+ // Validate account number is numeric
132
+ if (!/^\d{4}$/.test(this.accountNumber)) {
133
+ throw new Error(`Account number must contain only digits: ${this.accountNumber}`);
134
+ }
135
+ // Validate account class matches first digit
136
+ const firstDigit = parseInt(this.accountNumber[0]);
137
+ if (this.accountClass !== firstDigit) {
138
+ throw new Error(`Account class ${this.accountClass} does not match account number ${this.accountNumber}`);
139
+ }
140
+ // Validate SKR type
141
+ if (this.skrType !== 'SKR03' && this.skrType !== 'SKR04') {
142
+ throw new Error(`Invalid SKR type: ${this.skrType}`);
143
+ }
144
+ }
145
+ };
146
+ __decorate([
147
+ unI(),
148
+ __metadata("design:type", String)
149
+ ], Account.prototype, "id", void 0);
150
+ __decorate([
151
+ svDb(),
152
+ index(),
153
+ __metadata("design:type", String)
154
+ ], Account.prototype, "accountNumber", void 0);
155
+ __decorate([
156
+ svDb(),
157
+ searchable(),
158
+ __metadata("design:type", String)
159
+ ], Account.prototype, "accountName", void 0);
160
+ __decorate([
161
+ svDb(),
162
+ index(),
163
+ __metadata("design:type", Number)
164
+ ], Account.prototype, "accountClass", void 0);
165
+ __decorate([
166
+ svDb(),
167
+ __metadata("design:type", Number)
168
+ ], Account.prototype, "accountGroup", void 0);
169
+ __decorate([
170
+ svDb(),
171
+ __metadata("design:type", Number)
172
+ ], Account.prototype, "accountSubgroup", void 0);
173
+ __decorate([
174
+ svDb(),
175
+ __metadata("design:type", String)
176
+ ], Account.prototype, "accountType", void 0);
177
+ __decorate([
178
+ svDb(),
179
+ index(),
180
+ __metadata("design:type", String)
181
+ ], Account.prototype, "skrType", void 0);
182
+ __decorate([
183
+ svDb(),
184
+ searchable(),
185
+ __metadata("design:type", String)
186
+ ], Account.prototype, "description", void 0);
187
+ __decorate([
188
+ svDb(),
189
+ __metadata("design:type", Number)
190
+ ], Account.prototype, "vatRate", void 0);
191
+ __decorate([
192
+ svDb(),
193
+ __metadata("design:type", Number)
194
+ ], Account.prototype, "balance", void 0);
195
+ __decorate([
196
+ svDb(),
197
+ __metadata("design:type", Number)
198
+ ], Account.prototype, "debitTotal", void 0);
199
+ __decorate([
200
+ svDb(),
201
+ __metadata("design:type", Number)
202
+ ], Account.prototype, "creditTotal", void 0);
203
+ __decorate([
204
+ svDb(),
205
+ __metadata("design:type", Boolean)
206
+ ], Account.prototype, "isActive", void 0);
207
+ __decorate([
208
+ svDb(),
209
+ __metadata("design:type", Boolean)
210
+ ], Account.prototype, "isSystemAccount", void 0);
211
+ __decorate([
212
+ svDb(),
213
+ __metadata("design:type", Date)
214
+ ], Account.prototype, "createdAt", void 0);
215
+ __decorate([
216
+ svDb(),
217
+ __metadata("design:type", Date)
218
+ ], Account.prototype, "updatedAt", void 0);
219
+ Account = Account_1 = __decorate([
220
+ plugins.smartdata.Collection(() => getDbSync()),
221
+ __metadata("design:paramtypes", [Object])
222
+ ], Account);
223
+ export { Account };
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tyLmNsYXNzZXMuYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3Nrci5jbGFzc2VzLmFjY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHckQsTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBR3BFLElBQU0sT0FBTyxlQUFiLE1BQU0sT0FBUSxTQUFRLGNBQWdDO0lBeUQzRCxZQUFZLElBQTRCO1FBQ3RDLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDO1lBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcs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
@@ -0,0 +1,99 @@
1
+ import { Account } from './skr.classes.account.js';
2
+ import { Transaction } from './skr.classes.transaction.js';
3
+ import { JournalEntry } from './skr.classes.journalentry.js';
4
+ import type { IDatabaseConfig, TSKRType, IAccountData, IAccountFilter, ITransactionFilter, ITransactionData, IJournalEntry } from './skr.types.js';
5
+ export declare class ChartOfAccounts {
6
+ private config?;
7
+ private logger;
8
+ private initialized;
9
+ private skrType;
10
+ constructor(config?: IDatabaseConfig);
11
+ /**
12
+ * Initialize the database connection
13
+ */
14
+ init(): Promise<void>;
15
+ /**
16
+ * Initialize SKR03 chart of accounts
17
+ */
18
+ initializeSKR03(): Promise<void>;
19
+ /**
20
+ * Initialize SKR04 chart of accounts
21
+ */
22
+ initializeSKR04(): Promise<void>;
23
+ /**
24
+ * Get the current SKR type
25
+ */
26
+ getSKRType(): TSKRType | null;
27
+ /**
28
+ * Set the active SKR type
29
+ */
30
+ setSKRType(skrType: TSKRType): void;
31
+ /**
32
+ * Get account by number
33
+ */
34
+ getAccountByNumber(accountNumber: string): Promise<Account | null>;
35
+ /**
36
+ * Get accounts by class
37
+ */
38
+ getAccountsByClass(accountClass: number): Promise<Account[]>;
39
+ /**
40
+ * Get accounts by type
41
+ */
42
+ getAccountsByType(accountType: IAccountData['accountType']): Promise<Account[]>;
43
+ /**
44
+ * Create a custom account
45
+ */
46
+ createCustomAccount(accountData: Partial<IAccountData>): Promise<Account>;
47
+ /**
48
+ * Update an existing account
49
+ */
50
+ updateAccount(accountNumber: string, updates: Partial<IAccountData>): Promise<Account>;
51
+ /**
52
+ * Delete a custom account (only non-system accounts)
53
+ */
54
+ deleteAccount(accountNumber: string): Promise<void>;
55
+ /**
56
+ * Search accounts
57
+ */
58
+ searchAccounts(searchTerm: string): Promise<Account[]>;
59
+ /**
60
+ * Get all accounts
61
+ */
62
+ getAllAccounts(filter?: IAccountFilter): Promise<Account[]>;
63
+ /**
64
+ * Post a simple transaction
65
+ */
66
+ postTransaction(transactionData: ITransactionData): Promise<Transaction>;
67
+ /**
68
+ * Post a journal entry
69
+ */
70
+ postJournalEntry(journalData: IJournalEntry): Promise<JournalEntry>;
71
+ /**
72
+ * Get transactions for an account
73
+ */
74
+ getAccountTransactions(accountNumber: string): Promise<Transaction[]>;
75
+ /**
76
+ * Get transactions by filter
77
+ */
78
+ getTransactions(filter?: ITransactionFilter): Promise<Transaction[]>;
79
+ /**
80
+ * Reverse a transaction
81
+ */
82
+ reverseTransaction(transactionId: string): Promise<Transaction>;
83
+ /**
84
+ * Get account class description
85
+ */
86
+ getAccountClassDescription(accountClass: number): string;
87
+ /**
88
+ * Import accounts from CSV
89
+ */
90
+ importAccountsFromCSV(csvContent: string): Promise<number>;
91
+ /**
92
+ * Export accounts to CSV
93
+ */
94
+ exportAccountsToCSV(): Promise<string>;
95
+ /**
96
+ * Close the database connection
97
+ */
98
+ close(): Promise<void>;
99
+ }