@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,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
|
+
}
|