@fin.cx/skr 1.3.0 → 2.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/.smartconfig.json +33 -6
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/core/core.accountpolicy.d.ts +67 -0
- package/dist_ts/core/core.accountpolicy.js +91 -0
- package/dist_ts/core/core.bukeys.d.ts +38 -0
- package/dist_ts/core/core.bukeys.js +117 -0
- package/dist_ts/core/core.datev.captions.d.ts +7 -0
- package/dist_ts/core/core.datev.captions.js +134 -0
- package/dist_ts/core/core.datev.d.ts +47 -0
- package/dist_ts/core/core.datev.js +129 -0
- package/dist_ts/core/core.hash.d.ts +27 -0
- package/dist_ts/core/core.hash.js +72 -0
- package/dist_ts/core/core.plugins.d.ts +3 -0
- package/dist_ts/core/core.plugins.js +9 -0
- package/dist_ts/core/core.recipes.d.ts +118 -0
- package/dist_ts/core/core.recipes.js +504 -0
- package/dist_ts/core/core.taxscenario.d.ts +27 -0
- package/dist_ts/core/core.taxscenario.js +85 -0
- package/dist_ts/core/core.types.d.ts +48 -0
- package/dist_ts/core/core.types.js +2 -0
- package/dist_ts/core/core.validate.d.ts +17 -0
- package/dist_ts/core/core.validate.js +89 -0
- package/dist_ts/core/index.d.ts +15 -0
- package/dist_ts/core/index.js +16 -0
- package/dist_ts/index.d.ts +15 -0
- package/dist_ts/index.js +10 -1
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +4 -2
- package/dist_ts/skr.api.d.ts +91 -22
- package/dist_ts/skr.api.js +357 -42
- package/dist_ts/skr.balances.d.ts +28 -0
- package/dist_ts/skr.balances.js +96 -0
- package/dist_ts/skr.classes.journalentry.d.ts +19 -3
- package/dist_ts/skr.classes.journalentry.js +67 -4
- package/dist_ts/skr.classes.reports.js +49 -102
- package/dist_ts/skr.database.d.ts +2 -0
- package/dist_ts/skr.database.js +1 -1
- package/dist_ts/skr.errors.d.ts +18 -0
- package/dist_ts/skr.errors.js +34 -0
- package/dist_ts/skr.export.js +4 -7
- package/dist_ts/skr.invoice.adapter.d.ts +15 -1
- package/dist_ts/skr.invoice.adapter.js +253 -41
- package/dist_ts/skr.invoice.booking.js +14 -28
- package/dist_ts/skr.migrate.d.ts +20 -0
- package/dist_ts/skr.migrate.js +223 -0
- package/dist_ts/skr.period.d.ts +47 -0
- package/dist_ts/skr.period.js +95 -0
- package/dist_ts/skr.posting.d.ts +74 -0
- package/dist_ts/skr.posting.js +209 -0
- package/dist_ts/skr.security.d.ts +6 -9
- package/dist_ts/skr.security.js +16 -89
- package/dist_ts/skr.sequence.d.ts +32 -0
- package/dist_ts/skr.sequence.js +51 -0
- package/dist_ts/skr.txview.d.ts +46 -0
- package/dist_ts/skr.txview.js +235 -0
- package/dist_ts/skr.types.d.ts +35 -1
- package/dist_ts/skr.verify.d.ts +13 -0
- package/dist_ts/skr.verify.js +84 -0
- package/package.json +21 -24
- package/readme.hints.md +37 -0
- package/readme.md +94 -1
- package/readme.plan.md +180 -243
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/core.accountpolicy.ts +154 -0
- package/ts/core/core.bukeys.ts +146 -0
- package/ts/core/core.datev.captions.ts +133 -0
- package/ts/core/core.datev.ts +174 -0
- package/ts/core/core.hash.ts +76 -0
- package/ts/core/core.plugins.ts +9 -0
- package/ts/core/core.recipes.ts +659 -0
- package/ts/core/core.taxscenario.ts +156 -0
- package/ts/core/core.types.ts +74 -0
- package/ts/core/core.validate.ts +119 -0
- package/ts/core/index.ts +15 -0
- package/ts/index.ts +31 -0
- package/ts/plugins.ts +4 -0
- package/ts/skr.api.ts +432 -46
- package/ts/skr.balances.ts +127 -0
- package/ts/skr.classes.journalentry.ts +54 -5
- package/ts/skr.classes.reports.ts +54 -126
- package/ts/skr.database.ts +3 -0
- package/ts/skr.errors.ts +44 -0
- package/ts/skr.export.ts +3 -6
- package/ts/skr.invoice.adapter.ts +291 -45
- package/ts/skr.invoice.booking.ts +22 -34
- package/ts/skr.migrate.ts +268 -0
- package/ts/skr.period.ts +139 -0
- package/ts/skr.posting.ts +273 -0
- package/ts/skr.security.ts +18 -93
- package/ts/skr.sequence.ts +89 -0
- package/ts/skr.txview.ts +268 -0
- package/ts/skr.types.ts +37 -1
- package/ts/skr.verify.ts +99 -0
- /package/{license.md → license} +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { TCents } from '@fin.cx/calculation';
|
|
2
|
+
export type { TCents };
|
|
3
|
+
export type TSKRType = 'SKR03' | 'SKR04';
|
|
4
|
+
/**
|
|
5
|
+
* DATEV BU-Schlüssel (Steuerschlüssel), field 9 of the Buchungsstapel row.
|
|
6
|
+
* String-typed: '' means "no key" and keys keep leading semantics ('40').
|
|
7
|
+
* The set is intentionally conservative — only keys the core emits.
|
|
8
|
+
*/
|
|
9
|
+
export type TBuKey = '' | '1' | '2' | '3' | '8' | '9' | '18' | '19' | '40' | '91' | '94';
|
|
10
|
+
export type TTaxScenario = 'domestic_standard' | 'domestic_reduced' | 'domestic_tax_free' | 'intra_eu_supply' | 'intra_eu_acquisition' | 'reverse_charge_13b' | 'export_third_country';
|
|
11
|
+
export type TLineSide = 'debit' | 'credit';
|
|
12
|
+
/**
|
|
13
|
+
* One journal line. counterAccount is the explicit DATEV Gegenkonto for this
|
|
14
|
+
* line — recipes know the pairing, so nothing has to be reconstructed later
|
|
15
|
+
* (v1 derived pairs greedily and lossily).
|
|
16
|
+
*/
|
|
17
|
+
export interface IJournalLineDraft {
|
|
18
|
+
accountNumber: string;
|
|
19
|
+
counterAccount: string;
|
|
20
|
+
side: TLineSide;
|
|
21
|
+
amountCents: TCents;
|
|
22
|
+
buKey: TBuKey;
|
|
23
|
+
buchungstext: string;
|
|
24
|
+
belegfeld1?: string;
|
|
25
|
+
belegfeld2?: string;
|
|
26
|
+
costCenter1?: string;
|
|
27
|
+
costCenter2?: string;
|
|
28
|
+
docLink?: string;
|
|
29
|
+
/** informational VAT share carried on the line (v1 compatibility) */
|
|
30
|
+
vatAmountCents?: TCents;
|
|
31
|
+
}
|
|
32
|
+
export interface IJournalDraft {
|
|
33
|
+
date: Date;
|
|
34
|
+
description: string;
|
|
35
|
+
reference?: string;
|
|
36
|
+
skrType: TSKRType;
|
|
37
|
+
currency: 'EUR';
|
|
38
|
+
taxScenario?: TTaxScenario;
|
|
39
|
+
/** id of the entry this draft reverses (Storno linkage, part of the hash) */
|
|
40
|
+
reversalOf?: string;
|
|
41
|
+
lines: IJournalLineDraft[];
|
|
42
|
+
}
|
|
43
|
+
export interface IValidationResult {
|
|
44
|
+
valid: boolean;
|
|
45
|
+
errors: string[];
|
|
46
|
+
warnings: string[];
|
|
47
|
+
normalized: IJournalDraft;
|
|
48
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure journal validation. No chart lookups, no persistence — structural and
|
|
3
|
+
* arithmetic invariants only. Account-existence checks belong to the
|
|
4
|
+
* persistence layer, which owns the chart of accounts.
|
|
5
|
+
*/
|
|
6
|
+
import type { IJournalDraft, IValidationResult } from './core.types.js';
|
|
7
|
+
import type { IAccountPolicy } from './core.accountpolicy.js';
|
|
8
|
+
export declare const DATEV_MAX_BUCHUNGSTEXT = 60;
|
|
9
|
+
export declare const DATEV_MAX_BELEGFELD = 36;
|
|
10
|
+
/**
|
|
11
|
+
* Validate (and normalize) a journal draft.
|
|
12
|
+
*
|
|
13
|
+
* Normalization: negative amounts are flipped to the opposite side so the
|
|
14
|
+
* ledger only ever stores positive amounts with an explicit side.
|
|
15
|
+
* Balance check is EXACT — integer cents, no tolerance.
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateJournalDraft(draft: IJournalDraft, policy?: IAccountPolicy): IValidationResult;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { isKnownBuKey } from './core.bukeys.js';
|
|
2
|
+
import { isAutomatikAccount } from './core.accountpolicy.js';
|
|
3
|
+
export const DATEV_MAX_BUCHUNGSTEXT = 60;
|
|
4
|
+
export const DATEV_MAX_BELEGFELD = 36;
|
|
5
|
+
/**
|
|
6
|
+
* Validate (and normalize) a journal draft.
|
|
7
|
+
*
|
|
8
|
+
* Normalization: negative amounts are flipped to the opposite side so the
|
|
9
|
+
* ledger only ever stores positive amounts with an explicit side.
|
|
10
|
+
* Balance check is EXACT — integer cents, no tolerance.
|
|
11
|
+
*/
|
|
12
|
+
export function validateJournalDraft(draft, policy) {
|
|
13
|
+
const errors = [];
|
|
14
|
+
const warnings = [];
|
|
15
|
+
const normalizedLines = draft.lines.map((line) => {
|
|
16
|
+
if (line.amountCents < 0) {
|
|
17
|
+
return {
|
|
18
|
+
...line,
|
|
19
|
+
amountCents: -line.amountCents,
|
|
20
|
+
side: line.side === 'debit' ? 'credit' : 'debit',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return { ...line };
|
|
24
|
+
});
|
|
25
|
+
const normalized = { ...draft, lines: normalizedLines };
|
|
26
|
+
if (!(draft.date instanceof Date) || Number.isNaN(draft.date.getTime())) {
|
|
27
|
+
errors.push('Journal draft requires a valid date');
|
|
28
|
+
}
|
|
29
|
+
if (!draft.description) {
|
|
30
|
+
warnings.push('Journal draft has no description');
|
|
31
|
+
}
|
|
32
|
+
if (draft.currency !== 'EUR') {
|
|
33
|
+
errors.push(`Core booking currency must be EUR, got '${draft.currency}'`);
|
|
34
|
+
}
|
|
35
|
+
if (normalizedLines.length < 2) {
|
|
36
|
+
errors.push('A journal entry requires at least two lines');
|
|
37
|
+
}
|
|
38
|
+
let debitTotal = 0;
|
|
39
|
+
let creditTotal = 0;
|
|
40
|
+
normalizedLines.forEach((line, index) => {
|
|
41
|
+
const label = `line ${index + 1} (${line.accountNumber || '?'})`;
|
|
42
|
+
if (!Number.isSafeInteger(line.amountCents)) {
|
|
43
|
+
errors.push(`${label}: amountCents must be a safe integer, got ${line.amountCents}`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (line.amountCents === 0) {
|
|
47
|
+
errors.push(`${label}: amount must not be zero`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (!line.accountNumber) {
|
|
51
|
+
errors.push(`${label}: accountNumber is required`);
|
|
52
|
+
}
|
|
53
|
+
if (!line.counterAccount) {
|
|
54
|
+
errors.push(`${label}: counterAccount (Gegenkonto) is required`);
|
|
55
|
+
}
|
|
56
|
+
else if (line.counterAccount === line.accountNumber) {
|
|
57
|
+
errors.push(`${label}: account and counterAccount must differ`);
|
|
58
|
+
}
|
|
59
|
+
if (!isKnownBuKey(line.buKey)) {
|
|
60
|
+
errors.push(`${label}: unknown BU key '${line.buKey}'`);
|
|
61
|
+
}
|
|
62
|
+
if (line.buchungstext && line.buchungstext.length > DATEV_MAX_BUCHUNGSTEXT) {
|
|
63
|
+
warnings.push(`${label}: buchungstext exceeds ${DATEV_MAX_BUCHUNGSTEXT} chars and will be truncated in DATEV export`);
|
|
64
|
+
}
|
|
65
|
+
if (line.belegfeld1 && line.belegfeld1.length > DATEV_MAX_BELEGFELD) {
|
|
66
|
+
warnings.push(`${label}: belegfeld1 exceeds ${DATEV_MAX_BELEGFELD} chars and will be truncated in DATEV export`);
|
|
67
|
+
}
|
|
68
|
+
if (policy) {
|
|
69
|
+
if (isAutomatikAccount(policy, line.accountNumber) && line.buKey !== '' && line.buKey !== '40') {
|
|
70
|
+
errors.push(`${label}: Automatikkonto must not carry BU key '${line.buKey}' (only none or 40)`);
|
|
71
|
+
}
|
|
72
|
+
if (line.accountNumber === policy.debtorsControl ||
|
|
73
|
+
line.accountNumber === policy.creditorsControl) {
|
|
74
|
+
errors.push(`${label}: direct posting to control account ${line.accountNumber} — use a personal account`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (line.side === 'debit') {
|
|
78
|
+
debitTotal += line.amountCents;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
creditTotal += line.amountCents;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
if (errors.length === 0 && debitTotal !== creditTotal) {
|
|
85
|
+
errors.push(`Entry is not balanced: debit ${debitTotal} cents !== credit ${creditTotal} cents`);
|
|
86
|
+
}
|
|
87
|
+
return { valid: errors.length === 0, errors, warnings, normalized };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS52YWxpZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvcmUvY29yZS52YWxpZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBQ3pDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUV0Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEtBQW9CLEVBQ3BCLE1BQXVCO0lBRXZCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFFOUIsTUFBTSxlQUFlLEdBQXdCLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDcEUsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU87Z0JBQ0wsR0FBRyxJQUFJO2dCQUNQLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTzthQUNqRCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxVQUFVLEdBQWtCLEVBQUUsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO0lBRXZFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FB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
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless booking core: pure types, BU keys, tax scenario detection,
|
|
3
|
+
* account policies, booking recipes, validation, DATEV Buchungsstapel writer,
|
|
4
|
+
* and hash chaining. Nothing in here touches MongoDB, the filesystem, or the
|
|
5
|
+
* network — plain inputs in, validated journal drafts / DATEV rows out.
|
|
6
|
+
*/
|
|
7
|
+
export * from './core.types.js';
|
|
8
|
+
export * from './core.bukeys.js';
|
|
9
|
+
export * from './core.taxscenario.js';
|
|
10
|
+
export * from './core.accountpolicy.js';
|
|
11
|
+
export * from './core.validate.js';
|
|
12
|
+
export * from './core.recipes.js';
|
|
13
|
+
export * from './core.datev.js';
|
|
14
|
+
export { DATEV_COLUMN_CAPTIONS } from './core.datev.captions.js';
|
|
15
|
+
export * from './core.hash.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless booking core: pure types, BU keys, tax scenario detection,
|
|
3
|
+
* account policies, booking recipes, validation, DATEV Buchungsstapel writer,
|
|
4
|
+
* and hash chaining. Nothing in here touches MongoDB, the filesystem, or the
|
|
5
|
+
* network — plain inputs in, validated journal drafts / DATEV rows out.
|
|
6
|
+
*/
|
|
7
|
+
export * from './core.types.js';
|
|
8
|
+
export * from './core.bukeys.js';
|
|
9
|
+
export * from './core.taxscenario.js';
|
|
10
|
+
export * from './core.accountpolicy.js';
|
|
11
|
+
export * from './core.validate.js';
|
|
12
|
+
export * from './core.recipes.js';
|
|
13
|
+
export * from './core.datev.js';
|
|
14
|
+
export { DATEV_COLUMN_CAPTIONS } from './core.datev.captions.js';
|
|
15
|
+
export * from './core.hash.js';
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb3JlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBQ0gsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRSxjQUFjLGdCQUFnQixDQUFDIn0=
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
export * from './skr.types.js';
|
|
2
|
+
export * as core from './core/index.js';
|
|
3
|
+
export * from './skr.errors.js';
|
|
4
|
+
export { JournalPoster, buildHashPayload } from './skr.posting.js';
|
|
5
|
+
export type { IPostDraftOptions } from './skr.posting.js';
|
|
6
|
+
export { festschreibePeriod, getPeriodState, assertPeriodOpen, periodOf, fiscalYearOf, } from './skr.period.js';
|
|
7
|
+
export type { ILedgerPeriodState } from './skr.period.js';
|
|
8
|
+
export { getSequenceState } from './skr.sequence.js';
|
|
9
|
+
export type { ILedgerSequenceState } from './skr.sequence.js';
|
|
10
|
+
export { aggregateTrialBalance, aggregateAccountBalance } from './skr.balances.js';
|
|
11
|
+
export type { IAccountBalanceCents, ITrialBalanceCents, IBalanceQueryOptions, } from './skr.balances.js';
|
|
12
|
+
export { verifyHashChain } from './skr.verify.js';
|
|
13
|
+
export type { IChainVerificationResult } from './skr.verify.js';
|
|
14
|
+
export { migrateToV2 } from './skr.migrate.js';
|
|
15
|
+
export type { IMigrationReport } from './skr.migrate.js';
|
|
16
|
+
export { transactionDataToDraft, journalInputToDraft, entryToTransactionView, accountLineViews, mapNumericPostingKey, } from './skr.txview.js';
|
|
2
17
|
export { Account } from './skr.classes.account.js';
|
|
3
18
|
export { Transaction } from './skr.classes.transaction.js';
|
|
4
19
|
export { JournalEntry } from './skr.classes.journalentry.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
export * from './skr.types.js';
|
|
2
|
+
export * as core from './core/index.js';
|
|
3
|
+
export * from './skr.errors.js';
|
|
4
|
+
export { JournalPoster, buildHashPayload } from './skr.posting.js';
|
|
5
|
+
export { festschreibePeriod, getPeriodState, assertPeriodOpen, periodOf, fiscalYearOf, } from './skr.period.js';
|
|
6
|
+
export { getSequenceState } from './skr.sequence.js';
|
|
7
|
+
export { aggregateTrialBalance, aggregateAccountBalance } from './skr.balances.js';
|
|
8
|
+
export { verifyHashChain } from './skr.verify.js';
|
|
9
|
+
export { migrateToV2 } from './skr.migrate.js';
|
|
10
|
+
export { transactionDataToDraft, journalInputToDraft, entryToTransactionView, accountLineViews, mapNumericPostingKey, } from './skr.txview.js';
|
|
2
11
|
export { Account } from './skr.classes.account.js';
|
|
3
12
|
export { Transaction } from './skr.classes.transaction.js';
|
|
4
13
|
export { JournalEntry } from './skr.classes.journalentry.js';
|
|
@@ -14,4 +23,4 @@ export { AccountsExporter } from './skr.export.accounts.js';
|
|
|
14
23
|
export { BalancesExporter } from './skr.export.balances.js';
|
|
15
24
|
export { PdfReportGenerator } from './skr.export.pdf.js';
|
|
16
25
|
export { SecurityManager } from './skr.security.js';
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLE9BQU8sS0FBSyxJQUFJLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixZQUFZLEdBQ2IsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQU1uRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU81QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFTeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDIn0=
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as calculation from '@fin.cx/calculation';
|
|
1
2
|
import * as smartdata from '@push.rocks/smartdata';
|
|
2
3
|
import * as smartunique from '@push.rocks/smartunique';
|
|
3
4
|
import * as smarttime from '@push.rocks/smarttime';
|
|
@@ -19,4 +20,4 @@ declare const smartfile: {
|
|
|
19
20
|
toFs: (content: string | Buffer, filePath: string) => Promise<void>;
|
|
20
21
|
};
|
|
21
22
|
};
|
|
22
|
-
export { smartdata, smartunique, smarttime, smartlog, smartfs, smartfile, smarthash, smartpath, MerkleTree, };
|
|
23
|
+
export { calculation, smartdata, smartunique, smarttime, smartlog, smartfs, smartfile, smarthash, smartpath, MerkleTree, };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// @fin.cx scope
|
|
2
|
+
import * as calculation from '@fin.cx/calculation';
|
|
1
3
|
// @push.rocks scope
|
|
2
4
|
import * as smartdata from '@push.rocks/smartdata';
|
|
3
5
|
import * as smartunique from '@push.rocks/smartunique';
|
|
@@ -47,5 +49,5 @@ const smartfile = {
|
|
|
47
49
|
},
|
|
48
50
|
},
|
|
49
51
|
};
|
|
50
|
-
export { smartdata, smartunique, smarttime, smartlog, smartfs, smartfile, smarthash, smartpath, MerkleTree, };
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
export { calculation, smartdata, smartunique, smarttime, smartlog, smartfs, smartfile, smarthash, smartpath, MerkleTree, };
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCO0FBQ2hCLE9BQU8sS0FBSyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsY0FBYztBQUNkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUN2QyxJQUFJLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxDQUN4QyxDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDaEIsRUFBRSxFQUFFO1FBQ0YsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFlLEVBQWlCLEVBQUU7WUFDbEQsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFDRCxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQWdCLEVBQW1CLEVBQUU7WUFDcEQsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBVyxDQUFDO1FBQ3pELENBQUM7UUFDRCxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQWdCLEVBQW1CLEVBQUU7WUFDeEQsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQVcsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFnQixFQUFvQixFQUFFO1lBQ3ZELE9BQU8sTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLENBQUM7UUFDRCxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQWUsRUFBRSxPQUFlLEVBQXFCLEVBQUU7WUFDMUUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEUsT0FBTyxPQUFPO3FCQUNYLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDOUQsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQXdCLEVBQUUsUUFBZ0IsRUFBaUIsRUFBRTtZQUN4RSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pELE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUNGO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsUUFBUSxFQUNSLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEdBQ1gsQ0FBQyJ9
|
package/dist_ts/skr.api.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { Account } from './skr.classes.account.js';
|
|
2
|
-
import { Transaction } from './skr.classes.transaction.js';
|
|
3
2
|
import { JournalEntry } from './skr.classes.journalentry.js';
|
|
4
3
|
import { type IExportOptions } from './skr.export.js';
|
|
4
|
+
import * as core from './core/index.js';
|
|
5
|
+
import { type IPostDraftOptions } from './skr.posting.js';
|
|
6
|
+
import { type ILedgerPeriodState } from './skr.period.js';
|
|
7
|
+
import { type IChainVerificationResult } from './skr.verify.js';
|
|
8
|
+
import { type IBalanceQueryOptions, type ITrialBalanceCents, type IAccountBalanceCents } from './skr.balances.js';
|
|
5
9
|
import { type IBookingOptions, type IBookingResult } from './skr.invoice.booking.js';
|
|
6
10
|
import type { IInvoice, IInvoiceFilter, IInvoiceImportOptions, IInvoiceExportOptions, IBookingRules, TInvoiceDirection } from './skr.invoice.entity.js';
|
|
7
|
-
import type { IDatabaseConfig, TSKRType, IAccountData, IAccountFilter, ITransactionData, ITransactionFilter, IJournalEntry, IReportParams, ITrialBalanceReport, IIncomeStatement, IBalanceSheet } from './skr.types.js';
|
|
11
|
+
import type { IDatabaseConfig, TSKRType, IAccountData, IAccountFilter, ITransactionData, ITransactionFilter, IJournalEntry, IReportParams, ITrialBalanceReport, IIncomeStatement, IBalanceSheet, IAccountBalance, ITransactionView } from './skr.types.js';
|
|
8
12
|
/**
|
|
9
13
|
* Main API class for SKR accounting operations
|
|
10
14
|
*/
|
|
@@ -19,6 +23,7 @@ export declare class SkrApi {
|
|
|
19
23
|
private invoiceAdapter;
|
|
20
24
|
private invoiceStorage;
|
|
21
25
|
private invoiceBookingEngine;
|
|
26
|
+
private journalPoster;
|
|
22
27
|
constructor(config: IDatabaseConfig);
|
|
23
28
|
/**
|
|
24
29
|
* Initialize the API with specified SKR type
|
|
@@ -61,31 +66,34 @@ export declare class SkrApi {
|
|
|
61
66
|
*/
|
|
62
67
|
getAccountsByType(accountType: IAccountData['accountType']): Promise<Account[]>;
|
|
63
68
|
/**
|
|
64
|
-
* Post a simple transaction
|
|
69
|
+
* Post a simple transaction. Since v2 this creates a hashed two-line
|
|
70
|
+
* journal entry (exact cents) — the Transaction collection is frozen.
|
|
65
71
|
*/
|
|
66
|
-
postTransaction(transactionData: ITransactionData): Promise<
|
|
72
|
+
postTransaction(transactionData: ITransactionData): Promise<ITransactionView>;
|
|
67
73
|
/**
|
|
68
|
-
* Post a journal entry
|
|
74
|
+
* Post a journal entry. Since v2 the entry is hashed, sequenced, and
|
|
75
|
+
* immutable; float inputs are converted to exact cents with a drift guard.
|
|
69
76
|
*/
|
|
70
77
|
postJournalEntry(journalData: IJournalEntry): Promise<JournalEntry>;
|
|
71
78
|
/**
|
|
72
|
-
* Get transaction by
|
|
79
|
+
* Get a transaction view by id (two-line v2 entries project 1:1).
|
|
73
80
|
*/
|
|
74
|
-
getTransaction(transactionId: string): Promise<
|
|
81
|
+
getTransaction(transactionId: string): Promise<ITransactionView | null>;
|
|
75
82
|
/**
|
|
76
|
-
* List
|
|
83
|
+
* List transaction views with optional filter (two-line v2 entries).
|
|
77
84
|
*/
|
|
78
|
-
listTransactions(filter?: ITransactionFilter): Promise<
|
|
85
|
+
listTransactions(filter?: ITransactionFilter): Promise<ITransactionView[]>;
|
|
86
|
+
private listTransactionViews;
|
|
79
87
|
/**
|
|
80
|
-
* Get
|
|
88
|
+
* Get per-line transaction views for one account.
|
|
81
89
|
*/
|
|
82
|
-
getAccountTransactions(accountNumber: string): Promise<
|
|
90
|
+
getAccountTransactions(accountNumber: string): Promise<ITransactionView[]>;
|
|
83
91
|
/**
|
|
84
|
-
* Reverse
|
|
92
|
+
* Reverse via Storno — the original entry is never mutated (GoBD).
|
|
85
93
|
*/
|
|
86
|
-
reverseTransaction(transactionId: string): Promise<
|
|
94
|
+
reverseTransaction(transactionId: string): Promise<ITransactionView>;
|
|
87
95
|
/**
|
|
88
|
-
* Reverse a journal entry
|
|
96
|
+
* Reverse a journal entry via Storno.
|
|
89
97
|
*/
|
|
90
98
|
reverseJournalEntry(journalId: string): Promise<JournalEntry>;
|
|
91
99
|
/**
|
|
@@ -113,19 +121,22 @@ export declare class SkrApi {
|
|
|
113
121
|
*/
|
|
114
122
|
exportReportToCSV(reportType: 'trial_balance' | 'income_statement' | 'balance_sheet', params?: IReportParams): Promise<string>;
|
|
115
123
|
/**
|
|
116
|
-
* Export to DATEV format
|
|
124
|
+
* Export to DATEV format (EXTF 700 Buchungsstapel over v2 entries).
|
|
125
|
+
* For a fully parameterized export use exportDatevBuchungsstapel().
|
|
117
126
|
*/
|
|
118
127
|
exportToDATEV(params?: IReportParams): Promise<string>;
|
|
119
128
|
/**
|
|
120
|
-
* Close accounting period
|
|
129
|
+
* Close accounting period: post P&L-zeroing entries (v2) into the period.
|
|
130
|
+
* Locking is a separate deliberate act — call festschreibePeriod() after.
|
|
121
131
|
*/
|
|
122
132
|
closePeriod(period: string, closingAccountNumber?: string): Promise<JournalEntry[]>;
|
|
123
133
|
/**
|
|
124
|
-
* Get account balance
|
|
134
|
+
* Get account balance (aggregated from v2 entries, exact cents inside).
|
|
125
135
|
*/
|
|
126
|
-
getAccountBalance(accountNumber: string, asOfDate?: Date): Promise<
|
|
136
|
+
getAccountBalance(accountNumber: string, asOfDate?: Date): Promise<IAccountBalance>;
|
|
127
137
|
/**
|
|
128
|
-
*
|
|
138
|
+
* Refresh the (informational) balance caches on Account documents from the
|
|
139
|
+
* aggregated v2 ledger.
|
|
129
140
|
*/
|
|
130
141
|
recalculateBalances(): Promise<void>;
|
|
131
142
|
/**
|
|
@@ -161,6 +172,64 @@ export declare class SkrApi {
|
|
|
161
172
|
* Sign the export with CAdES signature
|
|
162
173
|
*/
|
|
163
174
|
private signExport;
|
|
175
|
+
/**
|
|
176
|
+
* Default account policy for the active chart.
|
|
177
|
+
*/
|
|
178
|
+
getDefaultPolicy(): core.IAccountPolicy;
|
|
179
|
+
/**
|
|
180
|
+
* Post a validated journal draft atomically (v2 path: exact cents,
|
|
181
|
+
* gapless sequence, hash chain). Use the recipes in `core` to build drafts.
|
|
182
|
+
*/
|
|
183
|
+
postDraft(draft: core.IJournalDraft, options?: IPostDraftOptions): Promise<JournalEntry>;
|
|
184
|
+
/**
|
|
185
|
+
* Reverse a hashed entry via Storno — the original is never mutated.
|
|
186
|
+
*/
|
|
187
|
+
postStorno(entry: JournalEntry, options?: IPostDraftOptions & {
|
|
188
|
+
date?: Date;
|
|
189
|
+
description?: string;
|
|
190
|
+
}): Promise<JournalEntry>;
|
|
191
|
+
/**
|
|
192
|
+
* Festschreibung: finalize all posted v2 entries of a period and lock it
|
|
193
|
+
* against further postings (GoBD).
|
|
194
|
+
*/
|
|
195
|
+
festschreibePeriod(period: string, lockedBy?: string): Promise<{
|
|
196
|
+
finalizedEntries: number;
|
|
197
|
+
}>;
|
|
198
|
+
getPeriodState(period: string): Promise<ILedgerPeriodState | null>;
|
|
199
|
+
/**
|
|
200
|
+
* Recompute the whole hash chain for a fiscal year and compare it against
|
|
201
|
+
* the stored chain head — the audit-trail integrity check.
|
|
202
|
+
*/
|
|
203
|
+
verifyAuditChain(fiscalYear: number): Promise<IChainVerificationResult>;
|
|
204
|
+
/**
|
|
205
|
+
* Exact trial balance in integer cents, aggregated from v2 entries.
|
|
206
|
+
*/
|
|
207
|
+
getTrialBalanceCents(options?: IBalanceQueryOptions): Promise<ITrialBalanceCents>;
|
|
208
|
+
getAccountBalanceCents(accountNumber: string, options?: IBalanceQueryOptions): Promise<IAccountBalanceCents>;
|
|
209
|
+
/**
|
|
210
|
+
* DATEV Buchungsstapel (EXTF 700 / v13) over the v2 entries of a date
|
|
211
|
+
* range. Returns the CSV string (persist as CP1252!) and filename.
|
|
212
|
+
*/
|
|
213
|
+
exportDatevBuchungsstapel(options: {
|
|
214
|
+
dateFrom: Date;
|
|
215
|
+
dateTo: Date;
|
|
216
|
+
consultantNumber: number;
|
|
217
|
+
clientNumber: number;
|
|
218
|
+
fiscalYearStart: Date;
|
|
219
|
+
label?: string;
|
|
220
|
+
festschreibung?: boolean;
|
|
221
|
+
createdAt?: Date;
|
|
222
|
+
}): Promise<{
|
|
223
|
+
csv: string;
|
|
224
|
+
filename: string;
|
|
225
|
+
rowCount: number;
|
|
226
|
+
}>;
|
|
227
|
+
/**
|
|
228
|
+
* Run the idempotent v1 -> v2 data migration (cents backfill, journal
|
|
229
|
+
* unification, hash-chain assignment). Persist the returned report with
|
|
230
|
+
* your records (Verfahrensdokumentation artifact).
|
|
231
|
+
*/
|
|
232
|
+
migrateToV2(): Promise<import('./skr.migrate.js').IMigrationReport>;
|
|
164
233
|
/**
|
|
165
234
|
* Get current SKR type
|
|
166
235
|
*/
|
|
@@ -176,7 +245,7 @@ export declare class SkrApi {
|
|
|
176
245
|
/**
|
|
177
246
|
* Get unbalanced transactions (for audit)
|
|
178
247
|
*/
|
|
179
|
-
getUnbalancedTransactions(): Promise<
|
|
248
|
+
getUnbalancedTransactions(): Promise<ITransactionView[]>;
|
|
180
249
|
/**
|
|
181
250
|
* Close the API and database connection
|
|
182
251
|
*/
|
|
@@ -184,7 +253,7 @@ export declare class SkrApi {
|
|
|
184
253
|
/**
|
|
185
254
|
* Post multiple transactions
|
|
186
255
|
*/
|
|
187
|
-
postBatchTransactions(transactions: ITransactionData[]): Promise<
|
|
256
|
+
postBatchTransactions(transactions: ITransactionData[]): Promise<ITransactionView[]>;
|
|
188
257
|
/**
|
|
189
258
|
* Create multiple accounts
|
|
190
259
|
*/
|
|
@@ -203,7 +272,7 @@ export declare class SkrApi {
|
|
|
203
272
|
* Get paginated transactions
|
|
204
273
|
*/
|
|
205
274
|
getTransactionsPaginated(page?: number, pageSize?: number, filter?: ITransactionFilter): Promise<{
|
|
206
|
-
data:
|
|
275
|
+
data: ITransactionView[];
|
|
207
276
|
total: number;
|
|
208
277
|
page: number;
|
|
209
278
|
pageSize: number;
|