@fin.cx/skr 1.3.1 → 2.0.1

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 (90) hide show
  1. package/.smartconfig.json +33 -6
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/core/core.accountpolicy.d.ts +67 -0
  4. package/dist_ts/core/core.accountpolicy.js +91 -0
  5. package/dist_ts/core/core.bukeys.d.ts +38 -0
  6. package/dist_ts/core/core.bukeys.js +117 -0
  7. package/dist_ts/core/core.datev.captions.d.ts +7 -0
  8. package/dist_ts/core/core.datev.captions.js +134 -0
  9. package/dist_ts/core/core.datev.d.ts +47 -0
  10. package/dist_ts/core/core.datev.js +129 -0
  11. package/dist_ts/core/core.hash.d.ts +27 -0
  12. package/dist_ts/core/core.hash.js +72 -0
  13. package/dist_ts/core/core.plugins.d.ts +3 -0
  14. package/dist_ts/core/core.plugins.js +9 -0
  15. package/dist_ts/core/core.recipes.d.ts +118 -0
  16. package/dist_ts/core/core.recipes.js +504 -0
  17. package/dist_ts/core/core.taxscenario.d.ts +27 -0
  18. package/dist_ts/core/core.taxscenario.js +85 -0
  19. package/dist_ts/core/core.types.d.ts +48 -0
  20. package/dist_ts/core/core.types.js +2 -0
  21. package/dist_ts/core/core.validate.d.ts +17 -0
  22. package/dist_ts/core/core.validate.js +89 -0
  23. package/dist_ts/core/index.d.ts +15 -0
  24. package/dist_ts/core/index.js +16 -0
  25. package/dist_ts/index.d.ts +15 -0
  26. package/dist_ts/index.js +10 -1
  27. package/dist_ts/plugins.d.ts +2 -1
  28. package/dist_ts/plugins.js +4 -2
  29. package/dist_ts/skr.api.d.ts +91 -22
  30. package/dist_ts/skr.api.js +357 -42
  31. package/dist_ts/skr.balances.d.ts +28 -0
  32. package/dist_ts/skr.balances.js +96 -0
  33. package/dist_ts/skr.classes.journalentry.d.ts +19 -3
  34. package/dist_ts/skr.classes.journalentry.js +67 -4
  35. package/dist_ts/skr.classes.reports.js +49 -102
  36. package/dist_ts/skr.database.d.ts +2 -0
  37. package/dist_ts/skr.database.js +1 -1
  38. package/dist_ts/skr.errors.d.ts +18 -0
  39. package/dist_ts/skr.errors.js +34 -0
  40. package/dist_ts/skr.export.js +4 -7
  41. package/dist_ts/skr.invoice.booking.js +14 -28
  42. package/dist_ts/skr.migrate.d.ts +20 -0
  43. package/dist_ts/skr.migrate.js +223 -0
  44. package/dist_ts/skr.period.d.ts +47 -0
  45. package/dist_ts/skr.period.js +95 -0
  46. package/dist_ts/skr.posting.d.ts +74 -0
  47. package/dist_ts/skr.posting.js +209 -0
  48. package/dist_ts/skr.security.d.ts +6 -9
  49. package/dist_ts/skr.security.js +16 -89
  50. package/dist_ts/skr.sequence.d.ts +32 -0
  51. package/dist_ts/skr.sequence.js +51 -0
  52. package/dist_ts/skr.txview.d.ts +46 -0
  53. package/dist_ts/skr.txview.js +235 -0
  54. package/dist_ts/skr.types.d.ts +35 -1
  55. package/dist_ts/skr.verify.d.ts +13 -0
  56. package/dist_ts/skr.verify.js +84 -0
  57. package/package.json +6 -6
  58. package/readme.hints.md +37 -0
  59. package/readme.md +69 -1
  60. package/readme.plan.md +180 -243
  61. package/ts/00_commitinfo_data.ts +1 -1
  62. package/ts/core/core.accountpolicy.ts +154 -0
  63. package/ts/core/core.bukeys.ts +146 -0
  64. package/ts/core/core.datev.captions.ts +133 -0
  65. package/ts/core/core.datev.ts +174 -0
  66. package/ts/core/core.hash.ts +76 -0
  67. package/ts/core/core.plugins.ts +9 -0
  68. package/ts/core/core.recipes.ts +659 -0
  69. package/ts/core/core.taxscenario.ts +156 -0
  70. package/ts/core/core.types.ts +74 -0
  71. package/ts/core/core.validate.ts +119 -0
  72. package/ts/core/index.ts +15 -0
  73. package/ts/index.ts +31 -0
  74. package/ts/plugins.ts +4 -0
  75. package/ts/skr.api.ts +432 -46
  76. package/ts/skr.balances.ts +127 -0
  77. package/ts/skr.classes.journalentry.ts +54 -5
  78. package/ts/skr.classes.reports.ts +54 -126
  79. package/ts/skr.database.ts +3 -0
  80. package/ts/skr.errors.ts +44 -0
  81. package/ts/skr.export.ts +3 -6
  82. package/ts/skr.invoice.booking.ts +22 -34
  83. package/ts/skr.migrate.ts +268 -0
  84. package/ts/skr.period.ts +139 -0
  85. package/ts/skr.posting.ts +273 -0
  86. package/ts/skr.security.ts +18 -93
  87. package/ts/skr.sequence.ts +89 -0
  88. package/ts/skr.txview.ts +268 -0
  89. package/ts/skr.types.ts +37 -1
  90. package/ts/skr.verify.ts +99 -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvcmUvY29yZS50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -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=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFPNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBU3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQyJ9
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLE9BQU8sS0FBSyxJQUFJLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixZQUFZLEdBQ2IsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQU1uRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU81QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFTeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDIn0=
@@ -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, };
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsY0FBYztBQUNkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUN2QyxJQUFJLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxDQUN4QyxDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDaEIsRUFBRSxFQUFFO1FBQ0YsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFlLEVBQWlCLEVBQUU7WUFDbEQsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFDRCxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQWdCLEVBQW1CLEVBQUU7WUFDcEQsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBVyxDQUFDO1FBQ3pELENBQUM7UUFDRCxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQWdCLEVBQW1CLEVBQUU7WUFDeEQsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQVcsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFnQixFQUFvQixFQUFFO1lBQ3ZELE9BQU8sTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLENBQUM7UUFDRCxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQWUsRUFBRSxPQUFlLEVBQXFCLEVBQUU7WUFDMUUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEUsT0FBTyxPQUFPO3FCQUNYLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDOUQsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQXdCLEVBQUUsUUFBZ0IsRUFBaUIsRUFBRTtZQUN4RSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pELE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUNGO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsR0FDWCxDQUFDIn0=
52
+ export { calculation, smartdata, smartunique, smarttime, smartlog, smartfs, smartfile, smarthash, smartpath, MerkleTree, };
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCO0FBQ2hCLE9BQU8sS0FBSyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsY0FBYztBQUNkLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUN2QyxJQUFJLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxDQUN4QyxDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDaEIsRUFBRSxFQUFFO1FBQ0YsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFlLEVBQWlCLEVBQUU7WUFDbEQsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFDRCxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQWdCLEVBQW1CLEVBQUU7WUFDcEQsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBVyxDQUFDO1FBQ3pELENBQUM7UUFDRCxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQWdCLEVBQW1CLEVBQUU7WUFDeEQsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQVcsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFnQixFQUFvQixFQUFFO1lBQ3ZELE9BQU8sTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLENBQUM7UUFDRCxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQWUsRUFBRSxPQUFlLEVBQXFCLEVBQUU7WUFDMUUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEUsT0FBTyxPQUFPO3FCQUNYLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDOUQsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQXdCLEVBQUUsUUFBZ0IsRUFBaUIsRUFBRTtZQUN4RSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pELE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUNGO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsUUFBUSxFQUNSLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEdBQ1gsQ0FBQyJ9
@@ -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<Transaction>;
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 ID
79
+ * Get a transaction view by id (two-line v2 entries project 1:1).
73
80
  */
74
- getTransaction(transactionId: string): Promise<Transaction | null>;
81
+ getTransaction(transactionId: string): Promise<ITransactionView | null>;
75
82
  /**
76
- * List transactions with optional filter
83
+ * List transaction views with optional filter (two-line v2 entries).
77
84
  */
78
- listTransactions(filter?: ITransactionFilter): Promise<Transaction[]>;
85
+ listTransactions(filter?: ITransactionFilter): Promise<ITransactionView[]>;
86
+ private listTransactionViews;
79
87
  /**
80
- * Get transactions for specific account
88
+ * Get per-line transaction views for one account.
81
89
  */
82
- getAccountTransactions(accountNumber: string): Promise<Transaction[]>;
90
+ getAccountTransactions(accountNumber: string): Promise<ITransactionView[]>;
83
91
  /**
84
- * Reverse a transaction
92
+ * Reverse via Storno — the original entry is never mutated (GoBD).
85
93
  */
86
- reverseTransaction(transactionId: string): Promise<Transaction>;
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<any>;
136
+ getAccountBalance(accountNumber: string, asOfDate?: Date): Promise<IAccountBalance>;
127
137
  /**
128
- * Recalculate all account balances
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<Transaction[]>;
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<Transaction[]>;
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: Transaction[];
275
+ data: ITransactionView[];
207
276
  total: number;
208
277
  page: number;
209
278
  pageSize: number;