@fin.cx/chartdata 1.1.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.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export declare const commitinfo: {
5
+ name: string;
6
+ version: string;
7
+ description: string;
8
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export const commitinfo = {
5
+ name: '@fin.cx/chartdata',
6
+ version: '1.1.0',
7
+ description: 'Year-versioned German SKR03/SKR04 chart-of-accounts datasets with Automatikkonto functions, BU-key rules, and UStVA-Kennzahl mappings'
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxtQkFBbUI7SUFDekIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHVJQUF1STtDQUNySixDQUFBIn0=
@@ -0,0 +1,22 @@
1
+ import type { IChart, IChartAccount, IMappingCoverage, IScenarioKennzahlen, TChartName, TMappingDimension } from './chartdata.types.js';
2
+ /**
3
+ * UStVA Kennzahlen driven by the tax scenario of a booking (not by a single
4
+ * account). Verified against the stable UStVA layout; ERiC validation in the
5
+ * elster milestone is the final oracle.
6
+ */
7
+ export declare const USTVA_SCENARIO_KENNZAHLEN: IScenarioKennzahlen;
8
+ export declare function listAvailableCharts(): Array<{
9
+ chart: TChartName;
10
+ year: number;
11
+ }>;
12
+ /**
13
+ * Get a chart dataset. Throws for unknown chart/year combinations —
14
+ * year-versioned data must never fall back silently.
15
+ */
16
+ export declare function getChart(chart: TChartName, year: number): IChart;
17
+ export declare function getAccount(chart: TChartName, year: number, accountNumber: string): IChartAccount | null;
18
+ /**
19
+ * Coverage check for the accounts a ledger actually uses. Callers must treat
20
+ * missing/unknown accounts as a hard error before generating filings.
21
+ */
22
+ export declare function getMappingCoverage(chart: TChartName, year: number, usedAccounts: string[], dimension: TMappingDimension): IMappingCoverage;
@@ -0,0 +1,78 @@
1
+ import { SKR03_2026 } from './data/skr03.2026.js';
2
+ import { SKR04_2026 } from './data/skr04.2026.js';
3
+ const CHARTS = [SKR03_2026, SKR04_2026];
4
+ /**
5
+ * UStVA Kennzahlen driven by the tax scenario of a booking (not by a single
6
+ * account). Verified against the stable UStVA layout; ERiC validation in the
7
+ * elster milestone is the final oracle.
8
+ */
9
+ export const USTVA_SCENARIO_KENNZAHLEN = {
10
+ intraEuAcquisitionBaseStandard: 89,
11
+ intraEuAcquisitionBaseReduced: 93,
12
+ reverseChargeServicesEuBase: 46,
13
+ reverseChargeServicesEuTax: 47,
14
+ reverseChargeOtherBase: 84,
15
+ reverseChargeOtherTax: 85,
16
+ intraEuSupplyBase: 41,
17
+ exportBase: 43,
18
+ domesticStandardBase: 81,
19
+ domesticReducedBase: 86,
20
+ outboundReverseChargeBase: 60,
21
+ inputVat: 66,
22
+ inputVatIntraEu: 61,
23
+ inputVatReverseCharge: 67,
24
+ importVat: 62,
25
+ };
26
+ export function listAvailableCharts() {
27
+ return CHARTS.map(({ chart, year }) => ({ chart, year }));
28
+ }
29
+ /**
30
+ * Get a chart dataset. Throws for unknown chart/year combinations —
31
+ * year-versioned data must never fall back silently.
32
+ */
33
+ export function getChart(chart, year) {
34
+ const found = CHARTS.find((candidate) => candidate.chart === chart && candidate.year === year);
35
+ if (!found) {
36
+ throw new Error(`No ${chart} dataset for year ${year}. Available: ${CHARTS.map((candidate) => `${candidate.chart}/${candidate.year}`).join(', ')}`);
37
+ }
38
+ return found;
39
+ }
40
+ export function getAccount(chart, year, accountNumber) {
41
+ return (getChart(chart, year).accounts.find((account) => account.accountNumber === accountNumber) ?? null);
42
+ }
43
+ function hasMapping(account, dimension) {
44
+ switch (dimension) {
45
+ case 'ustva':
46
+ return account.ustva !== undefined;
47
+ case 'hgb266':
48
+ return account.hgb266Position !== undefined;
49
+ case 'hgb275':
50
+ return account.hgb275Position !== undefined;
51
+ case 'ebilanz':
52
+ return account.ebilanzPosition !== undefined;
53
+ }
54
+ }
55
+ /**
56
+ * Coverage check for the accounts a ledger actually uses. Callers must treat
57
+ * missing/unknown accounts as a hard error before generating filings.
58
+ */
59
+ export function getMappingCoverage(chart, year, usedAccounts, dimension) {
60
+ const dataset = getChart(chart, year);
61
+ const byNumber = new Map(dataset.accounts.map((account) => [account.accountNumber, account]));
62
+ const missing = [];
63
+ const unknown = [];
64
+ let covered = 0;
65
+ for (const accountNumber of usedAccounts) {
66
+ const account = byNumber.get(accountNumber);
67
+ if (!account) {
68
+ unknown.push(accountNumber);
69
+ continue;
70
+ }
71
+ if (hasMapping(account, dimension))
72
+ covered++;
73
+ else
74
+ missing.push(accountNumber);
75
+ }
76
+ return { dimension, requested: usedAccounts.length, covered, missing, unknown };
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnRkYXRhLmxvb2t1cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NoYXJ0ZGF0YS5sb29rdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxNQUFNLE1BQU0sR0FBYSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUVsRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXdCO0lBQzVELDhCQUE4QixFQUFFLEVBQUU7SUFDbEMsNkJBQTZCLEVBQUUsRUFBRTtJQUNqQywyQkFBMkIsRUFBRSxFQUFFO0lBQy9CLDBCQUEwQixFQUFFLEVBQUU7SUFDOUIsc0JBQXNCLEVBQUUsRUFBRTtJQUMxQixxQkFBcUIsRUFBRSxFQUFFO0lBQ3pCLGlCQUFpQixFQUFFLEVBQUU7SUFDckIsVUFBVSxFQUFFLEVBQUU7SUFDZCxvQkFBb0IsRUFBRSxFQUFFO0lBQ3hCLG1CQUFtQixFQUFFLEVBQUU7SUFDdkIseUJBQXlCLEVBQUUsRUFBRTtJQUM3QixRQUFRLEVBQUUsRUFBRTtJQUNaLGVBQWUsRUFBRSxFQUFFO0lBQ25CLHFCQUFxQixFQUFFLEVBQUU7SUFDekIsU0FBUyxFQUFFLEVBQUU7Q0FDZCxDQUFDO0FBRUYsTUFBTSxVQUFVLG1CQUFtQjtJQUNqQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBaUIsRUFBRSxJQUFZO0lBQ3RELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FB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
@@ -0,0 +1,83 @@
1
+ export type TChartName = 'SKR03' | 'SKR04';
2
+ export type TAccountType = 'asset' | 'liability' | 'equity' | 'revenue' | 'expense';
3
+ /**
4
+ * Built-in DATEV tax automatism of an account. Lines on automatik accounts
5
+ * must carry no BU key (automatism applies) or key 40 (automatism cancelled).
6
+ */
7
+ export type TAutomatikFunction = {
8
+ taxType: 'ust';
9
+ ratePercent: number;
10
+ } | {
11
+ taxType: 'vst';
12
+ ratePercent: number;
13
+ } | {
14
+ taxType: 'free';
15
+ };
16
+ /**
17
+ * Direct account→UStVA mapping. role 'base' = the account's period movement
18
+ * is a Bemessungsgrundlage for the Kennzahl; role 'tax' = the account balance
19
+ * IS the tax figure reported under the Kennzahl.
20
+ */
21
+ export interface IUstvaMapping {
22
+ kennzahl: number;
23
+ role: 'base' | 'tax';
24
+ }
25
+ export interface IChartAccount {
26
+ accountNumber: string;
27
+ accountName: string;
28
+ accountClass: number;
29
+ accountType: TAccountType;
30
+ description?: string;
31
+ automatikFunction?: TAutomatikFunction;
32
+ /** BU keys allowed on lines of this account ('' = none). Unset = all. */
33
+ allowedBuKeys?: string[];
34
+ ustva?: IUstvaMapping;
35
+ /** HGB §266 balance-sheet position path (A2 — not yet populated) */
36
+ hgb266Position?: string;
37
+ /** HGB §275 GuV position path (A2 — not yet populated) */
38
+ hgb275Position?: string;
39
+ /** E-Bilanz de-gaap-ci taxonomy position (A3 — not yet populated) */
40
+ ebilanzPosition?: string;
41
+ /** where this record's facts come from (source, date) */
42
+ provenance: string;
43
+ /** first year this record is valid for */
44
+ validFrom: number;
45
+ validTo?: number;
46
+ }
47
+ export interface IChart {
48
+ chart: TChartName;
49
+ year: number;
50
+ accounts: IChartAccount[];
51
+ }
52
+ export type TMappingDimension = 'ustva' | 'hgb266' | 'hgb275' | 'ebilanz';
53
+ export interface IMappingCoverage {
54
+ dimension: TMappingDimension;
55
+ requested: number;
56
+ covered: number;
57
+ /** account numbers without a mapping — callers must fail loudly on gaps */
58
+ missing: string[];
59
+ /** requested accounts that do not exist in the chart at all */
60
+ unknown: string[];
61
+ }
62
+ /**
63
+ * UStVA Kennzahlen that derive from the TAX SCENARIO of a booking rather
64
+ * than from a single account (Bemessungsgrundlagen for igE and §13b are
65
+ * reported per scenario; the base can sit on any expense account).
66
+ */
67
+ export interface IScenarioKennzahlen {
68
+ intraEuAcquisitionBaseStandard: number;
69
+ intraEuAcquisitionBaseReduced: number;
70
+ reverseChargeServicesEuBase: number;
71
+ reverseChargeServicesEuTax: number;
72
+ reverseChargeOtherBase: number;
73
+ reverseChargeOtherTax: number;
74
+ intraEuSupplyBase: number;
75
+ exportBase: number;
76
+ domesticStandardBase: number;
77
+ domesticReducedBase: number;
78
+ outboundReverseChargeBase: number;
79
+ inputVat: number;
80
+ inputVatIntraEu: number;
81
+ inputVatReverseCharge: number;
82
+ importVat: number;
83
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnRkYXRhLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2hhcnRkYXRhLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,2 @@
1
+ import type { IChart } from '../chartdata.types.js';
2
+ export declare const SKR03_2026: IChart;