@fin.cx/tax 2.1.0 → 2.3.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/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +2 -1
- package/dist_ts/smallbusiness.d.ts +129 -0
- package/dist_ts/smallbusiness.js +113 -0
- package/dist_ts/ustva.d.ts +3 -2
- package/dist_ts/ustva.js +37 -23
- package/dist_ts/ustva.types.d.ts +4 -2
- package/package.json +3 -3
- package/readme.md +27 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +1 -0
- package/ts/smallbusiness.ts +236 -0
- package/ts/ustva.ts +34 -20
- package/ts/ustva.types.ts +4 -2
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@fin.cx/tax',
|
|
6
|
-
version: '2.
|
|
6
|
+
version: '2.3.0',
|
|
7
7
|
description: 'German tax computation engine: UStVA Kennzahl aggregation from ledger balances with form rounding, Zahllast and reconciliation checks — exact cents'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxhQUFhO0lBQ25CLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxxSkFBcUo7Q0FDbkssQ0FBQSJ9
|
package/dist_ts/index.d.ts
CHANGED
package/dist_ts/index.js
CHANGED
|
@@ -3,4 +3,5 @@ export * from './ustva.accounts.js';
|
|
|
3
3
|
export * from './ustva.js';
|
|
4
4
|
export * from './zm.js';
|
|
5
5
|
export * from './rates.js';
|
|
6
|
-
|
|
6
|
+
export * from './smallbusiness.js';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxvQkFBb0IsQ0FBQyJ9
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Kleinunternehmer of § 19 UStG in the version from 1 January 2025 and
|
|
3
|
+
* its Gesamtumsatz. Pure; the caller states each Entgelt received and what
|
|
4
|
+
* kind of supply it paid, and records the waiver.
|
|
5
|
+
*
|
|
6
|
+
* Source: § 19 UStG on gesetze-im-internet.de, read 2026-09-29.
|
|
7
|
+
* - Abs. 1 Satz 1: a supply (§ 1 Abs. 1 Nr. 1) of a business resident in
|
|
8
|
+
* Germany or in the areas of § 1 Abs. 3 UStG "ist steuerfrei, wenn der Gesamtumsatz nach Absatz 2 im
|
|
9
|
+
* vorangegangenen Kalenderjahr 25 000 Euro nicht überschritten hat und im
|
|
10
|
+
* laufenden Kalenderjahr 100 000 Euro nicht überschreitet".
|
|
11
|
+
* - Abs. 2: "Gesamtumsatz ist die nach vereinnahmten Entgelten berechnete
|
|
12
|
+
* Summe der vom Unternehmer ausgeführten steuerbaren Umsätze im Sinne des
|
|
13
|
+
* § 1 Absatz 1 Nummer 1 abzüglich folgender Umsätze: 1. Umsätze, die nach
|
|
14
|
+
* § 4 Nummer 8 Buchstabe i, Nummer 9 Buchstabe b und Nummer 11 bis 29
|
|
15
|
+
* steuerfrei sind; 2. Umsätze, die nach § 4 Nummer 8 Buchstabe a bis h,
|
|
16
|
+
* Nummer 9 Buchstabe a und Nummer 10 steuerfrei sind, wenn sie Hilfsumsätze
|
|
17
|
+
* sind. Die Umsätze mit Wirtschaftsgütern des Anlagevermögens eines
|
|
18
|
+
* Unternehmers bleiben bei der Ermittlung des Gesamtumsatzes nach Satz 1
|
|
19
|
+
* außer Ansatz."
|
|
20
|
+
* - Abs. 3: the waiver, declared "bis zum letzten Tag des Monats Februar des
|
|
21
|
+
* zweiten auf den Besteuerungszeitraum folgenden Kalenderjahres",
|
|
22
|
+
* effective from the start of the Besteuerungszeitraum it is for, binding
|
|
23
|
+
* "mindestens für fünf Kalenderjahre", revocable "mit Wirkung von Beginn
|
|
24
|
+
* eines darauffolgenden Kalenderjahres".
|
|
25
|
+
*
|
|
26
|
+
* - Abs. 6: not for the intra-Community supply of new vehicles; not modelled
|
|
27
|
+
* here (the caller counts such a supply taxed).
|
|
28
|
+
* - The version until 31 December 2024 had other limits (22 000 € in the
|
|
29
|
+
* previous year, 50 000 € expected in the running one, both with the
|
|
30
|
+
* tax) and did not exempt the supplies but levied no tax on them; a year
|
|
31
|
+
* before 2025 answers `before_2025` and is not told.
|
|
32
|
+
*
|
|
33
|
+
* Not read: the BMF-Schreiben of 18 March 2025 (UStAE Abschn. 19.1 ff.),
|
|
34
|
+
* which the BMF site did not serve. Two questions it answers stay open here:
|
|
35
|
+
* the limit in the year the business starts, which the statute does not name
|
|
36
|
+
* (`business_started_this_year` answers `unknown`), and whether the supply by
|
|
37
|
+
* which the running year exceeds 100 000 € is itself taxed. The statute's
|
|
38
|
+
* wording (the running year's Gesamtumsatz "nicht überschreitet") is read so
|
|
39
|
+
* that it is: `endsWith` names the receipt at which the sum first exceeds the
|
|
40
|
+
* limit, and every receipt from it on is taxed.
|
|
41
|
+
*/
|
|
42
|
+
import type { TCents } from '@fin.cx/calculation';
|
|
43
|
+
/** The first calendar year of the version of § 19 UStG this module applies (Jahressteuergesetz 2024, from 1 January 2025). */
|
|
44
|
+
export declare const SMALL_BUSINESS_FIRST_YEAR = 2025;
|
|
45
|
+
/** 25 000 €: the previous calendar year's limit (§ 19 Abs. 1 Satz 1 UStG) */
|
|
46
|
+
export declare const SMALL_BUSINESS_PREVIOUS_YEAR_LIMIT_CENTS: TCents;
|
|
47
|
+
/** 100 000 €: the running calendar year's limit (§ 19 Abs. 1 Satz 1 UStG) */
|
|
48
|
+
export declare const SMALL_BUSINESS_RUNNING_YEAR_LIMIT_CENTS: TCents;
|
|
49
|
+
/**
|
|
50
|
+
* What a receipt is to the Gesamtumsatz (§ 19 Abs. 2 UStG):
|
|
51
|
+
* - `counted`: an Entgelt for a steuerbarer Umsatz (§ 1 Abs. 1 Nr. 1), taxed or
|
|
52
|
+
* exempt otherwise than below, a Kleinunternehmer's own exempt supplies
|
|
53
|
+
* included;
|
|
54
|
+
* - `exempt_section_4_listed`: exempt under § 4 Nr. 8 Buchst. i, Nr. 9
|
|
55
|
+
* Buchst. b or Nr. 11 bis 29 (Satz 1 Nr. 1), left out;
|
|
56
|
+
* - `exempt_ancillary`: exempt under § 4 Nr. 8 Buchst. a bis h, Nr. 9 Buchst.
|
|
57
|
+
* a or Nr. 10 and a Hilfsumsatz (Satz 1 Nr. 2), left out; such a supply that
|
|
58
|
+
* is no Hilfsumsatz is `counted`;
|
|
59
|
+
* - `fixed_assets`: a sale of fixed assets (Satz 2), left out;
|
|
60
|
+
* - `not_taxable_here`: no steuerbarer Umsatz in Germany (its place of supply
|
|
61
|
+
* abroad), left out.
|
|
62
|
+
*/
|
|
63
|
+
export type TGesamtumsatzPart = 'counted' | 'exempt_section_4_listed' | 'exempt_ancillary' | 'fixed_assets' | 'not_taxable_here';
|
|
64
|
+
export declare const GESAMTUMSATZ_PARTS: readonly TGesamtumsatzPart[];
|
|
65
|
+
/** One Entgelt received (§ 19 Abs. 2 UStG counts by receipts), or a refund of one (negative). */
|
|
66
|
+
export interface IGesamtumsatzReceipt {
|
|
67
|
+
/** the day it was received, `YYYY-MM-DD` */
|
|
68
|
+
receivedOn: string;
|
|
69
|
+
/** the Entgelt, whole cents, without the tax where one is owed on it; negative for a refund */
|
|
70
|
+
entgeltCents: TCents;
|
|
71
|
+
part: TGesamtumsatzPart;
|
|
72
|
+
}
|
|
73
|
+
/** The Gesamtumsatz of a calendar year, and what § 19 Abs. 2 left out of it. */
|
|
74
|
+
export interface IGesamtumsatzOfYear {
|
|
75
|
+
year: number;
|
|
76
|
+
totalCents: TCents;
|
|
77
|
+
leftOutCents: Record<Exclude<TGesamtumsatzPart, 'counted'>, TCents>;
|
|
78
|
+
}
|
|
79
|
+
/** Why a year starts with the exemption or without it. */
|
|
80
|
+
export type TSmallBusinessReason = 'within_limits' | 'previous_year_over' | 'waived' | 'previous_year_unknown' | 'business_started_this_year'
|
|
81
|
+
/** a year before 2025, under the version with other limits (`SMALL_BUSINESS_FIRST_YEAR`): not told */
|
|
82
|
+
| 'before_2025';
|
|
83
|
+
export interface ISmallBusinessYearInput {
|
|
84
|
+
/** the calendar year (the Besteuerungszeitraum, § 16 Abs. 1 Satz 2 UStG) */
|
|
85
|
+
year: number;
|
|
86
|
+
/**
|
|
87
|
+
* the Gesamtumsatz of the previous calendar year, whole cents; `undefined`
|
|
88
|
+
* where it is not known; `'business_started'` where the business started in
|
|
89
|
+
* this year and had no previous year
|
|
90
|
+
*/
|
|
91
|
+
previousYearCents: TCents | undefined | 'business_started';
|
|
92
|
+
/** a waiver (§ 19 Abs. 3 UStG) is in force for the year */
|
|
93
|
+
waived?: boolean;
|
|
94
|
+
/** the receipts of the year, in any order; those of other years are ignored */
|
|
95
|
+
receipts: readonly IGesamtumsatzReceipt[];
|
|
96
|
+
}
|
|
97
|
+
export interface ISmallBusinessStatus {
|
|
98
|
+
year: number;
|
|
99
|
+
/** whether the year's supplies are exempt from its start; `unknown` where the input cannot tell */
|
|
100
|
+
atStart: 'exempt' | 'taxable' | 'unknown';
|
|
101
|
+
reason: TSmallBusinessReason;
|
|
102
|
+
/**
|
|
103
|
+
* Where the year starts exempt and its Gesamtumsatz exceeds 100 000 €: the
|
|
104
|
+
* receipt by which it first does (its day, its place in the receipts as
|
|
105
|
+
* given, the sum with it). It and every later receipt are taxed.
|
|
106
|
+
*/
|
|
107
|
+
endsWith?: {
|
|
108
|
+
receivedOn: string;
|
|
109
|
+
index: number;
|
|
110
|
+
runningCents: TCents;
|
|
111
|
+
};
|
|
112
|
+
/** the year's Gesamtumsatz over all its receipts */
|
|
113
|
+
runningCents: TCents;
|
|
114
|
+
}
|
|
115
|
+
/** The Gesamtumsatz of a calendar year (§ 19 Abs. 2 UStG): the Entgelte received in it that count, and those left out. */
|
|
116
|
+
export declare function gesamtumsatzOf(receiptsArg: readonly IGesamtumsatzReceipt[], yearArg: number): IGesamtumsatzOfYear;
|
|
117
|
+
/**
|
|
118
|
+
* Whether a calendar year's supplies are exempt under § 19 Abs. 1 UStG: from
|
|
119
|
+
* its start where the previous year's Gesamtumsatz did not exceed 25 000 € and
|
|
120
|
+
* no waiver is in force, until the receipt by which the running year's
|
|
121
|
+
* Gesamtumsatz exceeds 100 000 € (`endsWith`).
|
|
122
|
+
*/
|
|
123
|
+
export declare function smallBusinessStatusOf(inputArg: ISmallBusinessYearInput): ISmallBusinessStatus;
|
|
124
|
+
/** The last calendar year a waiver effective for `yearArg` binds (§ 19 Abs. 3 Satz 3 UStG: at least five calendar years). */
|
|
125
|
+
export declare function smallBusinessWaiverBindsUntil(yearArg: number): number;
|
|
126
|
+
/** The first calendar year from whose start a waiver effective for `yearArg` can be revoked (§ 19 Abs. 3 Satz 3 and 4 UStG). */
|
|
127
|
+
export declare function smallBusinessWaiverRevocableFrom(yearArg: number): number;
|
|
128
|
+
/** The last day a waiver for the Besteuerungszeitraum `yearArg` can be declared: the last day of February two years later (§ 19 Abs. 3 Satz 1 UStG). */
|
|
129
|
+
export declare function smallBusinessWaiverDeadline(yearArg: number): string;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** The first calendar year of the version of § 19 UStG this module applies (Jahressteuergesetz 2024, from 1 January 2025). */
|
|
2
|
+
export const SMALL_BUSINESS_FIRST_YEAR = 2025;
|
|
3
|
+
/** 25 000 €: the previous calendar year's limit (§ 19 Abs. 1 Satz 1 UStG) */
|
|
4
|
+
export const SMALL_BUSINESS_PREVIOUS_YEAR_LIMIT_CENTS = 2_500_000;
|
|
5
|
+
/** 100 000 €: the running calendar year's limit (§ 19 Abs. 1 Satz 1 UStG) */
|
|
6
|
+
export const SMALL_BUSINESS_RUNNING_YEAR_LIMIT_CENTS = 10_000_000;
|
|
7
|
+
export const GESAMTUMSATZ_PARTS = ['counted', 'exempt_section_4_listed', 'exempt_ancillary', 'fixed_assets', 'not_taxable_here'];
|
|
8
|
+
const isCalendarDay = (valueArg) => {
|
|
9
|
+
if (typeof valueArg !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(valueArg)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const [year, month, day] = valueArg.split('-').map(Number);
|
|
13
|
+
const date = new Date(Date.UTC(year, month - 1, day));
|
|
14
|
+
return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
|
|
15
|
+
};
|
|
16
|
+
const assertReceipt = (receiptArg, indexArg) => {
|
|
17
|
+
if (!isCalendarDay(receiptArg.receivedOn)) {
|
|
18
|
+
throw new Error(`receipts[${indexArg}].receivedOn must be a calendar day YYYY-MM-DD, got ${String(receiptArg.receivedOn)}`);
|
|
19
|
+
}
|
|
20
|
+
if (!Number.isSafeInteger(receiptArg.entgeltCents)) {
|
|
21
|
+
throw new Error(`receipts[${indexArg}].entgeltCents must be whole cents, got ${String(receiptArg.entgeltCents)}`);
|
|
22
|
+
}
|
|
23
|
+
if (!GESAMTUMSATZ_PARTS.includes(receiptArg.part)) {
|
|
24
|
+
throw new Error(`receipts[${indexArg}].part must be one of ${GESAMTUMSATZ_PARTS.join(', ')}, got ${String(receiptArg.part)}`);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const assertYear = (yearArg) => {
|
|
28
|
+
if (!Number.isSafeInteger(yearArg) || yearArg < 1900 || yearArg > 9999) {
|
|
29
|
+
throw new Error(`year must be a calendar year, got ${String(yearArg)}`);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/** The Gesamtumsatz of a calendar year (§ 19 Abs. 2 UStG): the Entgelte received in it that count, and those left out. */
|
|
33
|
+
export function gesamtumsatzOf(receiptsArg, yearArg) {
|
|
34
|
+
assertYear(yearArg);
|
|
35
|
+
const leftOutCents = { exempt_section_4_listed: 0, exempt_ancillary: 0, fixed_assets: 0, not_taxable_here: 0 };
|
|
36
|
+
let totalCents = 0;
|
|
37
|
+
receiptsArg.forEach((receiptArg, indexArg) => {
|
|
38
|
+
assertReceipt(receiptArg, indexArg);
|
|
39
|
+
if (Number(receiptArg.receivedOn.slice(0, 4)) !== yearArg) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (receiptArg.part === 'counted') {
|
|
43
|
+
totalCents += receiptArg.entgeltCents;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
leftOutCents[receiptArg.part] += receiptArg.entgeltCents;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return { year: yearArg, totalCents, leftOutCents };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Whether a calendar year's supplies are exempt under § 19 Abs. 1 UStG: from
|
|
53
|
+
* its start where the previous year's Gesamtumsatz did not exceed 25 000 € and
|
|
54
|
+
* no waiver is in force, until the receipt by which the running year's
|
|
55
|
+
* Gesamtumsatz exceeds 100 000 € (`endsWith`).
|
|
56
|
+
*/
|
|
57
|
+
export function smallBusinessStatusOf(inputArg) {
|
|
58
|
+
assertYear(inputArg.year);
|
|
59
|
+
const previous = inputArg.previousYearCents;
|
|
60
|
+
if (previous !== undefined && previous !== 'business_started' && (!Number.isSafeInteger(previous) || previous < 0)) {
|
|
61
|
+
throw new Error(`previousYearCents must be whole cents of at least 0, 'business_started' or undefined, got ${String(previous)}`);
|
|
62
|
+
}
|
|
63
|
+
const counted = inputArg.receipts
|
|
64
|
+
.map((receiptArg, indexArg) => {
|
|
65
|
+
assertReceipt(receiptArg, indexArg);
|
|
66
|
+
return { receipt: receiptArg, index: indexArg };
|
|
67
|
+
})
|
|
68
|
+
.filter(({ receipt }) => Number(receipt.receivedOn.slice(0, 4)) === inputArg.year && receipt.part === 'counted')
|
|
69
|
+
// by day; receipts of one day in the order given
|
|
70
|
+
.sort((leftArg, rightArg) => leftArg.receipt.receivedOn.localeCompare(rightArg.receipt.receivedOn) || leftArg.index - rightArg.index);
|
|
71
|
+
const runningCents = counted.reduce((sumArg, { receipt }) => sumArg + receipt.entgeltCents, 0);
|
|
72
|
+
const base = { year: inputArg.year, runningCents };
|
|
73
|
+
if (inputArg.year < SMALL_BUSINESS_FIRST_YEAR) {
|
|
74
|
+
return { ...base, atStart: 'unknown', reason: 'before_2025' };
|
|
75
|
+
}
|
|
76
|
+
if (inputArg.waived === true) {
|
|
77
|
+
return { ...base, atStart: 'taxable', reason: 'waived' };
|
|
78
|
+
}
|
|
79
|
+
if (previous === 'business_started') {
|
|
80
|
+
return { ...base, atStart: 'unknown', reason: 'business_started_this_year' };
|
|
81
|
+
}
|
|
82
|
+
if (previous === undefined) {
|
|
83
|
+
return { ...base, atStart: 'unknown', reason: 'previous_year_unknown' };
|
|
84
|
+
}
|
|
85
|
+
if (previous > SMALL_BUSINESS_PREVIOUS_YEAR_LIMIT_CENTS) {
|
|
86
|
+
return { ...base, atStart: 'taxable', reason: 'previous_year_over' };
|
|
87
|
+
}
|
|
88
|
+
let sum = 0;
|
|
89
|
+
for (const { receipt, index } of counted) {
|
|
90
|
+
sum += receipt.entgeltCents;
|
|
91
|
+
if (sum > SMALL_BUSINESS_RUNNING_YEAR_LIMIT_CENTS) {
|
|
92
|
+
return { ...base, atStart: 'exempt', reason: 'within_limits', endsWith: { receivedOn: receipt.receivedOn, index, runningCents: sum } };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { ...base, atStart: 'exempt', reason: 'within_limits' };
|
|
96
|
+
}
|
|
97
|
+
/** The last calendar year a waiver effective for `yearArg` binds (§ 19 Abs. 3 Satz 3 UStG: at least five calendar years). */
|
|
98
|
+
export function smallBusinessWaiverBindsUntil(yearArg) {
|
|
99
|
+
assertYear(yearArg);
|
|
100
|
+
return yearArg + 4;
|
|
101
|
+
}
|
|
102
|
+
/** The first calendar year from whose start a waiver effective for `yearArg` can be revoked (§ 19 Abs. 3 Satz 3 and 4 UStG). */
|
|
103
|
+
export function smallBusinessWaiverRevocableFrom(yearArg) {
|
|
104
|
+
return smallBusinessWaiverBindsUntil(yearArg) + 1;
|
|
105
|
+
}
|
|
106
|
+
/** The last day a waiver for the Besteuerungszeitraum `yearArg` can be declared: the last day of February two years later (§ 19 Abs. 3 Satz 1 UStG). */
|
|
107
|
+
export function smallBusinessWaiverDeadline(yearArg) {
|
|
108
|
+
assertYear(yearArg);
|
|
109
|
+
const year = yearArg + 2;
|
|
110
|
+
const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
111
|
+
return `${year}-02-${leap ? '29' : '28'}`;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hbGxidXNpbmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYWxsYnVzaW5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkNBLDhIQUE4SDtBQUM5SCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7QUFFOUMsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFXLFNBQVMsQ0FBQztBQUMxRSw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0sdUNBQXVDLEdBQVcsVUFBVSxDQUFDO0FBa0IxRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUMsQ0FBQyxTQUFTLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUEwRC9KLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRTtJQUM5RCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzFFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEdBQUcsQ0FBQztBQUN6RyxDQUFDLENBQUM7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
|
package/dist_ts/ustva.d.ts
CHANGED
|
@@ -2,14 +2,15 @@ import type { IUstvaInput, IUstvaResult } from './ustva.types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* The labels of the Kennzahlen this module fills. Kz 21, 45 and 87 carry the
|
|
4
4
|
* titles of their fields in ELSTER's "Anleitung zur UStVA 2026" (read
|
|
5
|
-
* 2026-09-25)
|
|
5
|
+
* 2026-09-25); Kz 46, 73 and 84, the fields of section D of the USt 1 A 2026
|
|
6
|
+
* (BMF, 29.12.2025), their texts there.
|
|
6
7
|
*/
|
|
7
8
|
export declare const USTVA_KENNZAHL_LABELS: Readonly<Record<number, string>>;
|
|
8
9
|
/**
|
|
9
10
|
* The Kennzahlen this module fills, in the order of the UStVA 2026 form
|
|
10
11
|
* (ELSTER, "Anleitung zur UStVA 2026"): taxable supplies (81, 86, 87), tax-free
|
|
11
12
|
* supplies (41, 43, 48), intra-Community acquisitions (89, 93), the tax the
|
|
12
|
-
* recipient owes (46/47, 84/85), supplies whose recipient owes the tax (60),
|
|
13
|
+
* recipient owes (46/47, 73/74, 84/85), supplies whose recipient owes the tax (60),
|
|
13
14
|
* services in the rest of the Community (21), other non-taxable turnover (45),
|
|
14
15
|
* input tax (66, 61, 62, 67), the Sondervorauszahlung (39) and the result (83).
|
|
15
16
|
* A Kennzahl computed but not listed here is reported as an issue, never
|
package/dist_ts/ustva.js
CHANGED
|
@@ -24,7 +24,8 @@ import { VAT_ACCOUNTS } from './ustva.accounts.js';
|
|
|
24
24
|
/**
|
|
25
25
|
* The labels of the Kennzahlen this module fills. Kz 21, 45 and 87 carry the
|
|
26
26
|
* titles of their fields in ELSTER's "Anleitung zur UStVA 2026" (read
|
|
27
|
-
* 2026-09-25)
|
|
27
|
+
* 2026-09-25); Kz 46, 73 and 84, the fields of section D of the USt 1 A 2026
|
|
28
|
+
* (BMF, 29.12.2025), their texts there.
|
|
28
29
|
*/
|
|
29
30
|
export const USTVA_KENNZAHL_LABELS = {
|
|
30
31
|
81: 'Steuerpflichtige Umsätze 19 %',
|
|
@@ -35,9 +36,11 @@ export const USTVA_KENNZAHL_LABELS = {
|
|
|
35
36
|
41: 'Steuerfreie innergemeinschaftliche Lieferungen',
|
|
36
37
|
43: 'Steuerfreie Umsätze mit Vorsteuerabzug (u. a. Ausfuhr)',
|
|
37
38
|
48: 'Steuerfreie Umsätze ohne Vorsteuerabzug',
|
|
38
|
-
46: 'Sonstige Leistungen
|
|
39
|
+
46: 'Sonstige Leistungen nach § 3a Absatz 2 UStG eines im übrigen Gemeinschaftsgebiet ansässigen Unternehmers (§ 13b Absatz 1 UStG)',
|
|
39
40
|
47: 'Steuer zu Kennzahl 46',
|
|
40
|
-
|
|
41
|
+
73: 'Umsätze, die unter das GrEStG fallen (§ 13b Absatz 2 Nummer 3 UStG)',
|
|
42
|
+
74: 'Steuer zu Kennzahl 73',
|
|
43
|
+
84: 'Andere Leistungen (§ 13b Absatz 2 Nummer 1, 2, 4 bis 12 UStG)',
|
|
41
44
|
85: 'Steuer zu Kennzahl 84',
|
|
42
45
|
60: 'Steuerpflichtige Umsätze, für die der Leistungsempfänger die Steuer schuldet (§13b)',
|
|
43
46
|
21: 'Sonstige Leistungen im übrigen Gemeinschaftsgebiet',
|
|
@@ -53,13 +56,13 @@ export const USTVA_KENNZAHL_LABELS = {
|
|
|
53
56
|
* The Kennzahlen this module fills, in the order of the UStVA 2026 form
|
|
54
57
|
* (ELSTER, "Anleitung zur UStVA 2026"): taxable supplies (81, 86, 87), tax-free
|
|
55
58
|
* supplies (41, 43, 48), intra-Community acquisitions (89, 93), the tax the
|
|
56
|
-
* recipient owes (46/47, 84/85), supplies whose recipient owes the tax (60),
|
|
59
|
+
* recipient owes (46/47, 73/74, 84/85), supplies whose recipient owes the tax (60),
|
|
57
60
|
* services in the rest of the Community (21), other non-taxable turnover (45),
|
|
58
61
|
* input tax (66, 61, 62, 67), the Sondervorauszahlung (39) and the result (83).
|
|
59
62
|
* A Kennzahl computed but not listed here is reported as an issue, never
|
|
60
63
|
* dropped.
|
|
61
64
|
*/
|
|
62
|
-
export const USTVA_KENNZAHL_ORDER = [81, 86, 87, 41, 43, 48, 89, 93, 46, 47, 84, 85, 60, 21, 45, 66, 61, 62, 67, 39, 83];
|
|
65
|
+
export const USTVA_KENNZAHL_ORDER = [81, 86, 87, 41, 43, 48, 89, 93, 46, 47, 73, 74, 84, 85, 60, 21, 45, 66, 61, 62, 67, 39, 83];
|
|
63
66
|
/** full euros, cents truncated toward zero (form rule for bases) */
|
|
64
67
|
function truncateToEur(cents) {
|
|
65
68
|
return Math.trunc(cents / 100);
|
|
@@ -174,30 +177,34 @@ export function computeUstva(input) {
|
|
|
174
177
|
const kz93Cents = scenario.intraEuAcquisitionReducedCents ?? 0;
|
|
175
178
|
let kz46Cents = scenario.reverseChargeServicesEuCents ?? 0;
|
|
176
179
|
let kz46Source = '(scenario)';
|
|
180
|
+
const kz73Cents = scenario.reverseChargeRealEstateCents ?? 0;
|
|
177
181
|
const kz84Cents = scenario.reverseChargeOtherCents ?? 0;
|
|
178
182
|
const hasRcScenario = scenario.reverseChargeServicesEuCents !== undefined ||
|
|
183
|
+
scenario.reverseChargeRealEstateCents !== undefined ||
|
|
179
184
|
scenario.reverseChargeOtherCents !== undefined;
|
|
180
185
|
if (!hasRcScenario && ledgerRcOutputCents !== 0) {
|
|
181
186
|
kz46Cents = Math.round((ledgerRcOutputCents * 100) / 19);
|
|
182
187
|
kz46Source = '(derived)';
|
|
183
188
|
derived.push(`Kz 46 derived from §13b output tax movement (${ledgerRcOutputCents} cents / 19 %) — split vs Kz 84 unknown without scenario bases`);
|
|
184
189
|
}
|
|
185
|
-
// §13b tax split:
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
kz47Cents = ledgerRcOutputCents;
|
|
190
|
+
// §13b tax split over Kz 47, 74 and 85: each base's 19 %, the last base carrying what keeps the total identical to
|
|
191
|
+
// the ledger movement; a single base carries the whole movement
|
|
192
|
+
const rcTaxCents = new Map();
|
|
193
|
+
const rcBases = [[47, kz46Cents], [74, kz73Cents], [85, kz84Cents]].filter(([, cents]) => cents !== 0);
|
|
194
|
+
if (rcBases.length > 0) {
|
|
195
|
+
let rest = ledgerRcOutputCents;
|
|
196
|
+
rcBases.forEach(([taxKennzahl, baseCents], index) => {
|
|
197
|
+
const cents = index === rcBases.length - 1 ? rest : vatFromNetCents(baseCents, 19);
|
|
198
|
+
rcTaxCents.set(taxKennzahl, cents);
|
|
199
|
+
rest -= cents;
|
|
200
|
+
});
|
|
197
201
|
}
|
|
198
202
|
else if (ledgerRcOutputCents !== 0) {
|
|
199
|
-
|
|
203
|
+
rcTaxCents.set(47, ledgerRcOutputCents); // derived path above set Kz 46
|
|
200
204
|
}
|
|
205
|
+
const kz47Cents = rcTaxCents.get(47) ?? 0;
|
|
206
|
+
const kz74Cents = rcTaxCents.get(74) ?? 0;
|
|
207
|
+
const kz85Cents = rcTaxCents.get(85) ?? 0;
|
|
201
208
|
// consistency: scenario bases × rate must reproduce the ledger tax
|
|
202
209
|
if (kz89Source === '(scenario)' && kz89Cents !== 0) {
|
|
203
210
|
const expected = vatFromNetCents(kz89Cents, 19);
|
|
@@ -208,7 +215,7 @@ export function computeUstva(input) {
|
|
|
208
215
|
}
|
|
209
216
|
}
|
|
210
217
|
if (hasRcScenario) {
|
|
211
|
-
const expected = vatFromNetCents(kz46Cents, 19) + vatFromNetCents(kz84Cents, 19);
|
|
218
|
+
const expected = vatFromNetCents(kz46Cents, 19) + vatFromNetCents(kz73Cents, 19) + vatFromNetCents(kz84Cents, 19);
|
|
212
219
|
const diff = ledgerRcOutputCents - expected;
|
|
213
220
|
checks.push(`§13b: ledger output tax ${ledgerRcOutputCents} vs 19 % of scenario bases ${expected} (diff ${diff})`);
|
|
214
221
|
if (Math.abs(diff) > tolerance) {
|
|
@@ -243,6 +250,10 @@ export function computeUstva(input) {
|
|
|
243
250
|
put(46, 'baseEur', truncateToEur(kz46Cents), [kz46Source]);
|
|
244
251
|
if (kz47Cents !== 0)
|
|
245
252
|
put(47, 'taxCents', kz47Cents, VAT_ACCOUNTS[input.chart].outputReverseCharge);
|
|
253
|
+
if (kz73Cents !== 0)
|
|
254
|
+
put(73, 'baseEur', truncateToEur(kz73Cents), ['(scenario)']);
|
|
255
|
+
if (kz74Cents !== 0)
|
|
256
|
+
put(74, 'taxCents', kz74Cents, VAT_ACCOUNTS[input.chart].outputReverseCharge);
|
|
246
257
|
if (kz84Cents !== 0)
|
|
247
258
|
put(84, 'baseEur', truncateToEur(kz84Cents), ['(scenario)']);
|
|
248
259
|
if (kz85Cents !== 0)
|
|
@@ -258,6 +269,7 @@ export function computeUstva(input) {
|
|
|
258
269
|
const zahllastCents = formDomesticTaxCents +
|
|
259
270
|
formIgeTaxCents +
|
|
260
271
|
kz47Cents +
|
|
272
|
+
kz74Cents +
|
|
261
273
|
kz85Cents -
|
|
262
274
|
inputTaxCents -
|
|
263
275
|
sondervorauszahlung;
|
|
@@ -273,9 +285,11 @@ export function computeUstva(input) {
|
|
|
273
285
|
if (kzValue(61) !== 0 || ledgerIgeOutputCents !== 0) {
|
|
274
286
|
checks.push(`igE input vs output tax: Kz 61 ${kzValue(61)} vs ledger igE output ${ledgerIgeOutputCents} (diff ${igeDeductionDiff}; non-zero = partial deduction or inconsistency)`);
|
|
275
287
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
288
|
+
// every § 13b tax field the recipient owes, the GrEStG's Kz 74 included, against its deduction
|
|
289
|
+
const rcOutputCents = kz47Cents + kz74Cents + kz85Cents;
|
|
290
|
+
const rcDeductionDiff = kzValue(67) - rcOutputCents;
|
|
291
|
+
if (kzValue(67) !== 0 || kz47Cents !== 0 || kz74Cents !== 0 || kz85Cents !== 0) {
|
|
292
|
+
checks.push(`§13b input vs output tax: Kz 67 ${kzValue(67)} vs Kz 47+74+85 ${rcOutputCents} (diff ${rcDeductionDiff}; non-zero = partial deduction or inconsistency)`);
|
|
279
293
|
}
|
|
280
294
|
const kennzahlen = USTVA_KENNZAHL_ORDER.filter((kennzahl) => values.has(kennzahl)).map((kennzahl) => values.get(kennzahl));
|
|
281
295
|
// a figure the form order does not place would be left out of the filing: say so instead
|
|
@@ -300,4 +314,4 @@ export function computeUstva(input) {
|
|
|
300
314
|
issues,
|
|
301
315
|
};
|
|
302
316
|
}
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXN0dmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy91c3R2YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVNuRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQXFDO0lBQ3JFLEVBQUUsRUFBRSwrQkFBK0I7SUFDbkMsRUFBRSxFQUFFLDhCQUE4QjtJQUNsQyxFQUFFLEVBQUUsNERBQTREO0lBQ2hFLEVBQUUsRUFBRSxxQ0FBcUM7SUFDekMsRUFBRSxFQUFFLG9DQUFvQztJQUN4QyxFQUFFLEVBQUUsZ0RBQWdEO0lBQ3BELEVBQUUsRUFBRSx3REFBd0Q7SUFDNUQsRUFBRSxFQUFFLHlDQUF5QztJQUM3QyxFQUFFLEVBQUUsZ0VBQWdFO0lBQ3BFLEVBQUUsRUFBRSx1QkFBdUI7SUFDM0IsRUFBRSxFQUFFLG1FQUFtRTtJQUN2RSxFQUFFLEVBQUUsdUJBQXVCO0lBQzNCLEVBQUUsRUFBRSxxRkFBcUY7SUFDekYsRUFBRSxFQUFFLG9EQUFvRDtJQUN4RCxFQUFFLEVBQUUsZ0VBQWdFO0lBQ3BFLEVBQUUsRUFBRSw4Q0FBOEM7SUFDbEQsRUFBRSxFQUFFLDhDQUE4QztJQUNsRCxFQUFFLEVBQUUsaUNBQWlDO0lBQ3JDLEVBQUUsRUFBRSxpREFBaUQ7SUFDckQsRUFBRSxFQUFFLDZEQUE2RDtJQUNqRSxFQUFFLEVBQUUsc0RBQXNEO0NBQzNELENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBc0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxF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
|
|
317
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXN0dmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy91c3R2YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVNuRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFxQztJQUNyRSxFQUFFLEVBQUUsK0JBQStCO0lBQ25DLEVBQUUsRUFBRSw4QkFBOEI7SUFDbEMsRUFBRSxFQUFFLDREQUE0RDtJQUNoRSxFQUFFLEVBQUUscUNBQXFDO0lBQ3pDLEVBQUUsRUFBRSxvQ0FBb0M7SUFDeEMsRUFBRSxFQUFFLGdEQUFnRDtJQUNwRCxFQUFFLEVBQUUsd0RBQXdEO0lBQzVELEVBQUUsRUFBRSx5Q0FBeUM7SUFDN0MsRUFBRSxFQUFFLGdJQUFnSTtJQUNwSSxFQUFFLEVBQUUsdUJBQXVCO0lBQzNCLEVBQUUsRUFBRSxxRUFBcUU7SUFDekUsRUFBRSxFQUFFLHVCQUF1QjtJQUMzQixFQUFFLEVBQUUsK0RBQStEO0lBQ25FLEVBQUUsRUFBRSx1QkFBdUI7SUFDM0IsRUFBRSxFQUFFLHFGQUFxRjtJQUN6RixFQUFFLEVBQUUsb0RBQW9EO0lBQ3hELEVBQUUsRUFBRSxnRUFBZ0U7SUFDcEUsRUFBRSxFQUFFLDhDQUE4QztJQUNsRCxFQUFFLEVBQUUsOENBQThDO0lBQ2xELEVBQUUsRUFBRSxpQ0FBaUM7SUFDckMsRUFBRSxFQUFFLGlEQUFpRDtJQUNyRCxFQUFFLEVBQUUsNkRBQTZEO0lBQ2pFLEVBQUUsRUFBRSxzREFBc0Q7Q0FDM0QsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFzQixDQUFD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
|
package/dist_ts/ustva.types.d.ts
CHANGED
|
@@ -16,9 +16,11 @@ export interface IScenarioBaseInput {
|
|
|
16
16
|
intraEuAcquisitionStandardCents?: TCents;
|
|
17
17
|
/** igE 7 % net bases -> Kz 93 */
|
|
18
18
|
intraEuAcquisitionReducedCents?: TCents;
|
|
19
|
-
/** §13b sonstige Leistungen
|
|
19
|
+
/** §13b Abs. 1: sonstige Leistungen of an entrepreneur established in another member state -> Kz 46/47 */
|
|
20
20
|
reverseChargeServicesEuCents?: TCents;
|
|
21
|
-
/**
|
|
21
|
+
/** §13b Abs. 2 Nr. 3: Umsätze, die unter das GrEStG fallen -> Kz 73/74 */
|
|
22
|
+
reverseChargeRealEstateCents?: TCents;
|
|
23
|
+
/** the other §13b inputs, Abs. 2 Nr. 1, 2, 4 bis 12 -> Kz 84/85 */
|
|
22
24
|
reverseChargeOtherCents?: TCents;
|
|
23
25
|
}
|
|
24
26
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fin.cx/tax",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "German tax computation engine: UStVA Kennzahl aggregation from ledger balances with form rounding, Zahllast and reconciliation checks — exact cents",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"homepage": "https://code.foss.global/fin.cx/tax#readme",
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@fin.cx/calculation": "^1.1.1",
|
|
32
|
-
"@fin.cx/chartdata": "^2.
|
|
32
|
+
"@fin.cx/chartdata": "^2.6.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@git.zone/tsbuild": "^5.0.0",
|
|
36
|
-
"@git.zone/tsrun": "^3.0.
|
|
36
|
+
"@git.zone/tsrun": "^3.0.2",
|
|
37
37
|
"@git.zone/tstest": "^6.3.2",
|
|
38
38
|
"@types/node": "^26.6.2"
|
|
39
39
|
},
|
package/readme.md
CHANGED
|
@@ -25,7 +25,7 @@ pnpm install @fin.cx/tax
|
|
|
25
25
|
| Umsatzsteuer nach § 13b UStG 19 % | 1787 | 3837 |
|
|
26
26
|
| igE of new vehicles from suppliers without a VAT ID (flagged) | 1784 | 3834 |
|
|
27
27
|
|
|
28
|
-
- **igE and inbound §13b bases** (Kz 89/93, 46/47, 84/85) are scenario figures, not single-account figures. Pass them exactly via `scenarioBases` (aggregated from tax-scenario-tagged journal entries, e.g. @fin.cx/skr's `taxScenario`);
|
|
28
|
+
- **igE and inbound §13b bases** (Kz 89/93, 46/47, 73/74, 84/85) are scenario figures, not single-account figures. Pass them exactly via `scenarioBases` (aggregated from tax-scenario-tagged journal entries, e.g. @fin.cx/skr's `taxScenario`): `reverseChargeServicesEuCents` for § 13b Abs. 1 (Kz 46), `reverseChargeRealEstateCents` for the Umsätze under the GrEStG, § 13b Abs. 2 Nr. 3 (Kz 73), `reverseChargeOtherCents` for the other § 13b Abs. 2 supplies (Kz 84); the tax fields split the ledger's § 13b output tax, each 19 % of its base and the last the rest, so they sum to the ledger, and the reconciliation checks Kz 67 against Kz 47+74+85. The fields carry the texts of section D of the USt 1 A 2026 (BMF, 29.12.2025), character for character: Kz 46 "Sonstige Leistungen nach § 3a Absatz 2 UStG eines im übrigen Gemeinschaftsgebiet ansässigen Unternehmers (§ 13b Absatz 1 UStG)", Kz 73 "Umsätze, die unter das GrEStG fallen (§ 13b Absatz 2 Nummer 3 UStG)", Kz 84 "Andere Leistungen (§ 13b Absatz 2 Nummer 1, 2, 4 bis 12 UStG)". Without scenario bases the module derives the 19 % bases from the output-tax account movements and marks them `(derived)`.
|
|
29
29
|
- **Kz 83 (Zahllast/Erstattung)** is computed the way the form computes it, including an optional Sondervorauszahlung credit (Kz 39, Dauerfristverlängerung).
|
|
30
30
|
- **Reconciliation**: the ledger's output-tax balances are compared against the form computation; small drift from base truncation and per-invoice rounding is reported, drift beyond the tolerance (default 5.00 EUR) becomes an issue. igE and §13b input/output tax symmetry is checked too.
|
|
31
31
|
- **Loud failures**: revenue accounts without a UStVA mapping, unknown revenue-class accounts, undifferentiated output-VAT balances, and output VAT on the intra-EU acquisition of new vehicles from suppliers without a VAT ID (SKR 03 1784, SKR 04 3834, which this module does not compute) land in `issues`. **Do not generate a filing while `issues` is non-empty.**
|
|
@@ -73,6 +73,32 @@ Set `taxationMethod` so the result records which mode the figures represent. If
|
|
|
73
73
|
|
|
74
74
|
**Whole euros:** the CSV takes "eine ganze Zahl" of euros, and no source read says how cents are treated. `zmEurosOf` drops the cents of each line's sum toward zero, as the UStVA drops those of its bases (2 000,50 € is 2000, -2 000,50 € is -2000). This is a recorded decision, pending the tax advisor's confirmation (`ZM_EUROS_RULE`), not a rule a source states.
|
|
75
75
|
|
|
76
|
+
## Kleinunternehmer (§ 19 UStG)
|
|
77
|
+
|
|
78
|
+
Since 2025 a Kleinunternehmer's supplies are tax-exempt where the Gesamtumsatz
|
|
79
|
+
did not exceed 25 000 € in the previous calendar year and does not exceed
|
|
80
|
+
100 000 € in the running one (§ 19 Abs. 1 Satz 1 UStG). The Gesamtumsatz counts
|
|
81
|
+
the Entgelte received (§ 19 Abs. 2), less the listed § 4 exemptions, the
|
|
82
|
+
Hilfsumsätze and fixed assets.
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
const status = tax.smallBusinessStatusOf({
|
|
86
|
+
year: 2026,
|
|
87
|
+
previousYearCents: tax.gesamtumsatzOf(receipts, 2025).totalCents,
|
|
88
|
+
receipts, // [{ receivedOn: '2026-03-01', entgeltCents: 120000, part: 'counted' }, …]
|
|
89
|
+
});
|
|
90
|
+
// { atStart: 'exempt', reason: 'within_limits', endsWith?: { receivedOn, index, runningCents }, runningCents }
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`endsWith` names the receipt by which the running year first exceeds
|
|
94
|
+
100 000 €; it and every later one are taxed. A waiver (§ 19 Abs. 3) makes the
|
|
95
|
+
year `taxable`; `smallBusinessWaiverDeadline`, `…BindsUntil` and
|
|
96
|
+
`…RevocableFrom` give its dates. The year the business starts answers
|
|
97
|
+
`unknown`: the statute names no limit for it. So does a year before 2025
|
|
98
|
+
(`before_2025`), under the version with other limits (22 000 € / 50 000 €,
|
|
99
|
+
with the tax). The rules cover businesses resident in Germany or the areas of
|
|
100
|
+
§ 1 Abs. 3 UStG; the new vehicles of § 19 Abs. 6 are not modelled.
|
|
101
|
+
|
|
76
102
|
## German VAT rates, dated
|
|
77
103
|
|
|
78
104
|
`GERMAN_VAT_RATES` lists the rates German law sets for a supply, each with the days it applies to, which rate it is (`provision`) and the provision and act that set it (`basis`): 19 % and 7 % (§ 12 Abs. 1, 2 UStG), 16 % and 5 % in their place from 2020-07-01 to 2020-12-31 (§ 28 Abs. 1, 2 UStG), 0 % from 2023-01-01 for the photovoltaic supplies of § 12 Abs. 3 UStG (`provision: 'zero'`, Art. 16 Nr. 5 Jahressteuergesetz 2022), and the average rates of § 24 Abs. 1 Satz 1 UStG: Nr. 1 (5,5 %), Nr. 2 (19 %, 16 % in the second half of 2020 by § 28 Abs. 3 UStG) and Nr. 3. `germanVatRatesOn(day)` answers the rates of a day of supply, each once (§ 27 Abs. 1 Satz 1 UStG: the rate in force when the supply is carried out), `undefined` before 2007-01-01, where the table begins.
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/index.ts
CHANGED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Kleinunternehmer of § 19 UStG in the version from 1 January 2025 and
|
|
3
|
+
* its Gesamtumsatz. Pure; the caller states each Entgelt received and what
|
|
4
|
+
* kind of supply it paid, and records the waiver.
|
|
5
|
+
*
|
|
6
|
+
* Source: § 19 UStG on gesetze-im-internet.de, read 2026-09-29.
|
|
7
|
+
* - Abs. 1 Satz 1: a supply (§ 1 Abs. 1 Nr. 1) of a business resident in
|
|
8
|
+
* Germany or in the areas of § 1 Abs. 3 UStG "ist steuerfrei, wenn der Gesamtumsatz nach Absatz 2 im
|
|
9
|
+
* vorangegangenen Kalenderjahr 25 000 Euro nicht überschritten hat und im
|
|
10
|
+
* laufenden Kalenderjahr 100 000 Euro nicht überschreitet".
|
|
11
|
+
* - Abs. 2: "Gesamtumsatz ist die nach vereinnahmten Entgelten berechnete
|
|
12
|
+
* Summe der vom Unternehmer ausgeführten steuerbaren Umsätze im Sinne des
|
|
13
|
+
* § 1 Absatz 1 Nummer 1 abzüglich folgender Umsätze: 1. Umsätze, die nach
|
|
14
|
+
* § 4 Nummer 8 Buchstabe i, Nummer 9 Buchstabe b und Nummer 11 bis 29
|
|
15
|
+
* steuerfrei sind; 2. Umsätze, die nach § 4 Nummer 8 Buchstabe a bis h,
|
|
16
|
+
* Nummer 9 Buchstabe a und Nummer 10 steuerfrei sind, wenn sie Hilfsumsätze
|
|
17
|
+
* sind. Die Umsätze mit Wirtschaftsgütern des Anlagevermögens eines
|
|
18
|
+
* Unternehmers bleiben bei der Ermittlung des Gesamtumsatzes nach Satz 1
|
|
19
|
+
* außer Ansatz."
|
|
20
|
+
* - Abs. 3: the waiver, declared "bis zum letzten Tag des Monats Februar des
|
|
21
|
+
* zweiten auf den Besteuerungszeitraum folgenden Kalenderjahres",
|
|
22
|
+
* effective from the start of the Besteuerungszeitraum it is for, binding
|
|
23
|
+
* "mindestens für fünf Kalenderjahre", revocable "mit Wirkung von Beginn
|
|
24
|
+
* eines darauffolgenden Kalenderjahres".
|
|
25
|
+
*
|
|
26
|
+
* - Abs. 6: not for the intra-Community supply of new vehicles; not modelled
|
|
27
|
+
* here (the caller counts such a supply taxed).
|
|
28
|
+
* - The version until 31 December 2024 had other limits (22 000 € in the
|
|
29
|
+
* previous year, 50 000 € expected in the running one, both with the
|
|
30
|
+
* tax) and did not exempt the supplies but levied no tax on them; a year
|
|
31
|
+
* before 2025 answers `before_2025` and is not told.
|
|
32
|
+
*
|
|
33
|
+
* Not read: the BMF-Schreiben of 18 March 2025 (UStAE Abschn. 19.1 ff.),
|
|
34
|
+
* which the BMF site did not serve. Two questions it answers stay open here:
|
|
35
|
+
* the limit in the year the business starts, which the statute does not name
|
|
36
|
+
* (`business_started_this_year` answers `unknown`), and whether the supply by
|
|
37
|
+
* which the running year exceeds 100 000 € is itself taxed. The statute's
|
|
38
|
+
* wording (the running year's Gesamtumsatz "nicht überschreitet") is read so
|
|
39
|
+
* that it is: `endsWith` names the receipt at which the sum first exceeds the
|
|
40
|
+
* limit, and every receipt from it on is taxed.
|
|
41
|
+
*/
|
|
42
|
+
import type { TCents } from '@fin.cx/calculation';
|
|
43
|
+
|
|
44
|
+
/** The first calendar year of the version of § 19 UStG this module applies (Jahressteuergesetz 2024, from 1 January 2025). */
|
|
45
|
+
export const SMALL_BUSINESS_FIRST_YEAR = 2025;
|
|
46
|
+
|
|
47
|
+
/** 25 000 €: the previous calendar year's limit (§ 19 Abs. 1 Satz 1 UStG) */
|
|
48
|
+
export const SMALL_BUSINESS_PREVIOUS_YEAR_LIMIT_CENTS: TCents = 2_500_000;
|
|
49
|
+
/** 100 000 €: the running calendar year's limit (§ 19 Abs. 1 Satz 1 UStG) */
|
|
50
|
+
export const SMALL_BUSINESS_RUNNING_YEAR_LIMIT_CENTS: TCents = 10_000_000;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* What a receipt is to the Gesamtumsatz (§ 19 Abs. 2 UStG):
|
|
54
|
+
* - `counted`: an Entgelt for a steuerbarer Umsatz (§ 1 Abs. 1 Nr. 1), taxed or
|
|
55
|
+
* exempt otherwise than below, a Kleinunternehmer's own exempt supplies
|
|
56
|
+
* included;
|
|
57
|
+
* - `exempt_section_4_listed`: exempt under § 4 Nr. 8 Buchst. i, Nr. 9
|
|
58
|
+
* Buchst. b or Nr. 11 bis 29 (Satz 1 Nr. 1), left out;
|
|
59
|
+
* - `exempt_ancillary`: exempt under § 4 Nr. 8 Buchst. a bis h, Nr. 9 Buchst.
|
|
60
|
+
* a or Nr. 10 and a Hilfsumsatz (Satz 1 Nr. 2), left out; such a supply that
|
|
61
|
+
* is no Hilfsumsatz is `counted`;
|
|
62
|
+
* - `fixed_assets`: a sale of fixed assets (Satz 2), left out;
|
|
63
|
+
* - `not_taxable_here`: no steuerbarer Umsatz in Germany (its place of supply
|
|
64
|
+
* abroad), left out.
|
|
65
|
+
*/
|
|
66
|
+
export type TGesamtumsatzPart = 'counted' | 'exempt_section_4_listed' | 'exempt_ancillary' | 'fixed_assets' | 'not_taxable_here';
|
|
67
|
+
|
|
68
|
+
export const GESAMTUMSATZ_PARTS: readonly TGesamtumsatzPart[] = ['counted', 'exempt_section_4_listed', 'exempt_ancillary', 'fixed_assets', 'not_taxable_here'];
|
|
69
|
+
|
|
70
|
+
/** One Entgelt received (§ 19 Abs. 2 UStG counts by receipts), or a refund of one (negative). */
|
|
71
|
+
export interface IGesamtumsatzReceipt {
|
|
72
|
+
/** the day it was received, `YYYY-MM-DD` */
|
|
73
|
+
receivedOn: string;
|
|
74
|
+
/** the Entgelt, whole cents, without the tax where one is owed on it; negative for a refund */
|
|
75
|
+
entgeltCents: TCents;
|
|
76
|
+
part: TGesamtumsatzPart;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** The Gesamtumsatz of a calendar year, and what § 19 Abs. 2 left out of it. */
|
|
80
|
+
export interface IGesamtumsatzOfYear {
|
|
81
|
+
year: number;
|
|
82
|
+
totalCents: TCents;
|
|
83
|
+
leftOutCents: Record<Exclude<TGesamtumsatzPart, 'counted'>, TCents>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Why a year starts with the exemption or without it. */
|
|
87
|
+
export type TSmallBusinessReason =
|
|
88
|
+
| 'within_limits'
|
|
89
|
+
| 'previous_year_over'
|
|
90
|
+
| 'waived'
|
|
91
|
+
| 'previous_year_unknown'
|
|
92
|
+
| 'business_started_this_year'
|
|
93
|
+
/** a year before 2025, under the version with other limits (`SMALL_BUSINESS_FIRST_YEAR`): not told */
|
|
94
|
+
| 'before_2025';
|
|
95
|
+
|
|
96
|
+
export interface ISmallBusinessYearInput {
|
|
97
|
+
/** the calendar year (the Besteuerungszeitraum, § 16 Abs. 1 Satz 2 UStG) */
|
|
98
|
+
year: number;
|
|
99
|
+
/**
|
|
100
|
+
* the Gesamtumsatz of the previous calendar year, whole cents; `undefined`
|
|
101
|
+
* where it is not known; `'business_started'` where the business started in
|
|
102
|
+
* this year and had no previous year
|
|
103
|
+
*/
|
|
104
|
+
previousYearCents: TCents | undefined | 'business_started';
|
|
105
|
+
/** a waiver (§ 19 Abs. 3 UStG) is in force for the year */
|
|
106
|
+
waived?: boolean;
|
|
107
|
+
/** the receipts of the year, in any order; those of other years are ignored */
|
|
108
|
+
receipts: readonly IGesamtumsatzReceipt[];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface ISmallBusinessStatus {
|
|
112
|
+
year: number;
|
|
113
|
+
/** whether the year's supplies are exempt from its start; `unknown` where the input cannot tell */
|
|
114
|
+
atStart: 'exempt' | 'taxable' | 'unknown';
|
|
115
|
+
reason: TSmallBusinessReason;
|
|
116
|
+
/**
|
|
117
|
+
* Where the year starts exempt and its Gesamtumsatz exceeds 100 000 €: the
|
|
118
|
+
* receipt by which it first does (its day, its place in the receipts as
|
|
119
|
+
* given, the sum with it). It and every later receipt are taxed.
|
|
120
|
+
*/
|
|
121
|
+
endsWith?: { receivedOn: string; index: number; runningCents: TCents };
|
|
122
|
+
/** the year's Gesamtumsatz over all its receipts */
|
|
123
|
+
runningCents: TCents;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const isCalendarDay = (valueArg: unknown): valueArg is string => {
|
|
127
|
+
if (typeof valueArg !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(valueArg)) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
const [year, month, day] = valueArg.split('-').map(Number);
|
|
131
|
+
const date = new Date(Date.UTC(year, month - 1, day));
|
|
132
|
+
return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const assertReceipt = (receiptArg: IGesamtumsatzReceipt, indexArg: number): void => {
|
|
136
|
+
if (!isCalendarDay(receiptArg.receivedOn)) {
|
|
137
|
+
throw new Error(`receipts[${indexArg}].receivedOn must be a calendar day YYYY-MM-DD, got ${String(receiptArg.receivedOn)}`);
|
|
138
|
+
}
|
|
139
|
+
if (!Number.isSafeInteger(receiptArg.entgeltCents)) {
|
|
140
|
+
throw new Error(`receipts[${indexArg}].entgeltCents must be whole cents, got ${String(receiptArg.entgeltCents)}`);
|
|
141
|
+
}
|
|
142
|
+
if (!GESAMTUMSATZ_PARTS.includes(receiptArg.part)) {
|
|
143
|
+
throw new Error(`receipts[${indexArg}].part must be one of ${GESAMTUMSATZ_PARTS.join(', ')}, got ${String(receiptArg.part)}`);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const assertYear = (yearArg: number): void => {
|
|
148
|
+
if (!Number.isSafeInteger(yearArg) || yearArg < 1900 || yearArg > 9999) {
|
|
149
|
+
throw new Error(`year must be a calendar year, got ${String(yearArg)}`);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/** The Gesamtumsatz of a calendar year (§ 19 Abs. 2 UStG): the Entgelte received in it that count, and those left out. */
|
|
154
|
+
export function gesamtumsatzOf(receiptsArg: readonly IGesamtumsatzReceipt[], yearArg: number): IGesamtumsatzOfYear {
|
|
155
|
+
assertYear(yearArg);
|
|
156
|
+
const leftOutCents: IGesamtumsatzOfYear['leftOutCents'] = { exempt_section_4_listed: 0, exempt_ancillary: 0, fixed_assets: 0, not_taxable_here: 0 };
|
|
157
|
+
let totalCents = 0;
|
|
158
|
+
receiptsArg.forEach((receiptArg, indexArg) => {
|
|
159
|
+
assertReceipt(receiptArg, indexArg);
|
|
160
|
+
if (Number(receiptArg.receivedOn.slice(0, 4)) !== yearArg) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (receiptArg.part === 'counted') {
|
|
164
|
+
totalCents += receiptArg.entgeltCents;
|
|
165
|
+
} else {
|
|
166
|
+
leftOutCents[receiptArg.part] += receiptArg.entgeltCents;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
return { year: yearArg, totalCents, leftOutCents };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Whether a calendar year's supplies are exempt under § 19 Abs. 1 UStG: from
|
|
174
|
+
* its start where the previous year's Gesamtumsatz did not exceed 25 000 € and
|
|
175
|
+
* no waiver is in force, until the receipt by which the running year's
|
|
176
|
+
* Gesamtumsatz exceeds 100 000 € (`endsWith`).
|
|
177
|
+
*/
|
|
178
|
+
export function smallBusinessStatusOf(inputArg: ISmallBusinessYearInput): ISmallBusinessStatus {
|
|
179
|
+
assertYear(inputArg.year);
|
|
180
|
+
const previous = inputArg.previousYearCents;
|
|
181
|
+
if (previous !== undefined && previous !== 'business_started' && (!Number.isSafeInteger(previous) || previous < 0)) {
|
|
182
|
+
throw new Error(`previousYearCents must be whole cents of at least 0, 'business_started' or undefined, got ${String(previous)}`);
|
|
183
|
+
}
|
|
184
|
+
const counted = inputArg.receipts
|
|
185
|
+
.map((receiptArg, indexArg) => {
|
|
186
|
+
assertReceipt(receiptArg, indexArg);
|
|
187
|
+
return { receipt: receiptArg, index: indexArg };
|
|
188
|
+
})
|
|
189
|
+
.filter(({ receipt }) => Number(receipt.receivedOn.slice(0, 4)) === inputArg.year && receipt.part === 'counted')
|
|
190
|
+
// by day; receipts of one day in the order given
|
|
191
|
+
.sort((leftArg, rightArg) => leftArg.receipt.receivedOn.localeCompare(rightArg.receipt.receivedOn) || leftArg.index - rightArg.index);
|
|
192
|
+
const runningCents = counted.reduce((sumArg, { receipt }) => sumArg + receipt.entgeltCents, 0);
|
|
193
|
+
const base = { year: inputArg.year, runningCents };
|
|
194
|
+
if (inputArg.year < SMALL_BUSINESS_FIRST_YEAR) {
|
|
195
|
+
return { ...base, atStart: 'unknown', reason: 'before_2025' };
|
|
196
|
+
}
|
|
197
|
+
if (inputArg.waived === true) {
|
|
198
|
+
return { ...base, atStart: 'taxable', reason: 'waived' };
|
|
199
|
+
}
|
|
200
|
+
if (previous === 'business_started') {
|
|
201
|
+
return { ...base, atStart: 'unknown', reason: 'business_started_this_year' };
|
|
202
|
+
}
|
|
203
|
+
if (previous === undefined) {
|
|
204
|
+
return { ...base, atStart: 'unknown', reason: 'previous_year_unknown' };
|
|
205
|
+
}
|
|
206
|
+
if (previous > SMALL_BUSINESS_PREVIOUS_YEAR_LIMIT_CENTS) {
|
|
207
|
+
return { ...base, atStart: 'taxable', reason: 'previous_year_over' };
|
|
208
|
+
}
|
|
209
|
+
let sum = 0;
|
|
210
|
+
for (const { receipt, index } of counted) {
|
|
211
|
+
sum += receipt.entgeltCents;
|
|
212
|
+
if (sum > SMALL_BUSINESS_RUNNING_YEAR_LIMIT_CENTS) {
|
|
213
|
+
return { ...base, atStart: 'exempt', reason: 'within_limits', endsWith: { receivedOn: receipt.receivedOn, index, runningCents: sum } };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return { ...base, atStart: 'exempt', reason: 'within_limits' };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** The last calendar year a waiver effective for `yearArg` binds (§ 19 Abs. 3 Satz 3 UStG: at least five calendar years). */
|
|
220
|
+
export function smallBusinessWaiverBindsUntil(yearArg: number): number {
|
|
221
|
+
assertYear(yearArg);
|
|
222
|
+
return yearArg + 4;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** The first calendar year from whose start a waiver effective for `yearArg` can be revoked (§ 19 Abs. 3 Satz 3 and 4 UStG). */
|
|
226
|
+
export function smallBusinessWaiverRevocableFrom(yearArg: number): number {
|
|
227
|
+
return smallBusinessWaiverBindsUntil(yearArg) + 1;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** The last day a waiver for the Besteuerungszeitraum `yearArg` can be declared: the last day of February two years later (§ 19 Abs. 3 Satz 1 UStG). */
|
|
231
|
+
export function smallBusinessWaiverDeadline(yearArg: number): string {
|
|
232
|
+
assertYear(yearArg);
|
|
233
|
+
const year = yearArg + 2;
|
|
234
|
+
const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
235
|
+
return `${year}-02-${leap ? '29' : '28'}`;
|
|
236
|
+
}
|
package/ts/ustva.ts
CHANGED
|
@@ -32,7 +32,8 @@ import type {
|
|
|
32
32
|
/**
|
|
33
33
|
* The labels of the Kennzahlen this module fills. Kz 21, 45 and 87 carry the
|
|
34
34
|
* titles of their fields in ELSTER's "Anleitung zur UStVA 2026" (read
|
|
35
|
-
* 2026-09-25)
|
|
35
|
+
* 2026-09-25); Kz 46, 73 and 84, the fields of section D of the USt 1 A 2026
|
|
36
|
+
* (BMF, 29.12.2025), their texts there.
|
|
36
37
|
*/
|
|
37
38
|
export const USTVA_KENNZAHL_LABELS: Readonly<Record<number, string>> = {
|
|
38
39
|
81: 'Steuerpflichtige Umsätze 19 %',
|
|
@@ -43,9 +44,11 @@ export const USTVA_KENNZAHL_LABELS: Readonly<Record<number, string>> = {
|
|
|
43
44
|
41: 'Steuerfreie innergemeinschaftliche Lieferungen',
|
|
44
45
|
43: 'Steuerfreie Umsätze mit Vorsteuerabzug (u. a. Ausfuhr)',
|
|
45
46
|
48: 'Steuerfreie Umsätze ohne Vorsteuerabzug',
|
|
46
|
-
46: 'Sonstige Leistungen
|
|
47
|
+
46: 'Sonstige Leistungen nach § 3a Absatz 2 UStG eines im übrigen Gemeinschaftsgebiet ansässigen Unternehmers (§ 13b Absatz 1 UStG)',
|
|
47
48
|
47: 'Steuer zu Kennzahl 46',
|
|
48
|
-
|
|
49
|
+
73: 'Umsätze, die unter das GrEStG fallen (§ 13b Absatz 2 Nummer 3 UStG)',
|
|
50
|
+
74: 'Steuer zu Kennzahl 73',
|
|
51
|
+
84: 'Andere Leistungen (§ 13b Absatz 2 Nummer 1, 2, 4 bis 12 UStG)',
|
|
49
52
|
85: 'Steuer zu Kennzahl 84',
|
|
50
53
|
60: 'Steuerpflichtige Umsätze, für die der Leistungsempfänger die Steuer schuldet (§13b)',
|
|
51
54
|
21: 'Sonstige Leistungen im übrigen Gemeinschaftsgebiet',
|
|
@@ -62,13 +65,13 @@ export const USTVA_KENNZAHL_LABELS: Readonly<Record<number, string>> = {
|
|
|
62
65
|
* The Kennzahlen this module fills, in the order of the UStVA 2026 form
|
|
63
66
|
* (ELSTER, "Anleitung zur UStVA 2026"): taxable supplies (81, 86, 87), tax-free
|
|
64
67
|
* supplies (41, 43, 48), intra-Community acquisitions (89, 93), the tax the
|
|
65
|
-
* recipient owes (46/47, 84/85), supplies whose recipient owes the tax (60),
|
|
68
|
+
* recipient owes (46/47, 73/74, 84/85), supplies whose recipient owes the tax (60),
|
|
66
69
|
* services in the rest of the Community (21), other non-taxable turnover (45),
|
|
67
70
|
* input tax (66, 61, 62, 67), the Sondervorauszahlung (39) and the result (83).
|
|
68
71
|
* A Kennzahl computed but not listed here is reported as an issue, never
|
|
69
72
|
* dropped.
|
|
70
73
|
*/
|
|
71
|
-
export const USTVA_KENNZAHL_ORDER: readonly number[] = [81, 86, 87, 41, 43, 48, 89, 93, 46, 47, 84, 85, 60, 21, 45, 66, 61, 62, 67, 39, 83];
|
|
74
|
+
export const USTVA_KENNZAHL_ORDER: readonly number[] = [81, 86, 87, 41, 43, 48, 89, 93, 46, 47, 73, 74, 84, 85, 60, 21, 45, 66, 61, 62, 67, 39, 83];
|
|
72
75
|
|
|
73
76
|
/** full euros, cents truncated toward zero (form rule for bases) */
|
|
74
77
|
function truncateToEur(cents: TCents): number {
|
|
@@ -206,9 +209,11 @@ export function computeUstva(input: IUstvaInput): IUstvaResult {
|
|
|
206
209
|
|
|
207
210
|
let kz46Cents = scenario.reverseChargeServicesEuCents ?? 0;
|
|
208
211
|
let kz46Source = '(scenario)';
|
|
212
|
+
const kz73Cents = scenario.reverseChargeRealEstateCents ?? 0;
|
|
209
213
|
const kz84Cents = scenario.reverseChargeOtherCents ?? 0;
|
|
210
214
|
const hasRcScenario =
|
|
211
215
|
scenario.reverseChargeServicesEuCents !== undefined ||
|
|
216
|
+
scenario.reverseChargeRealEstateCents !== undefined ||
|
|
212
217
|
scenario.reverseChargeOtherCents !== undefined;
|
|
213
218
|
if (!hasRcScenario && ledgerRcOutputCents !== 0) {
|
|
214
219
|
kz46Cents = Math.round((ledgerRcOutputCents * 100) / 19);
|
|
@@ -218,19 +223,23 @@ export function computeUstva(input: IUstvaInput): IUstvaResult {
|
|
|
218
223
|
);
|
|
219
224
|
}
|
|
220
225
|
|
|
221
|
-
// §13b tax split:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
226
|
+
// §13b tax split over Kz 47, 74 and 85: each base's 19 %, the last base carrying what keeps the total identical to
|
|
227
|
+
// the ledger movement; a single base carries the whole movement
|
|
228
|
+
const rcTaxCents = new Map<number, number>();
|
|
229
|
+
const rcBases = ([[47, kz46Cents], [74, kz73Cents], [85, kz84Cents]] as Array<[number, number]>).filter(([, cents]) => cents !== 0);
|
|
230
|
+
if (rcBases.length > 0) {
|
|
231
|
+
let rest = ledgerRcOutputCents;
|
|
232
|
+
rcBases.forEach(([taxKennzahl, baseCents], index) => {
|
|
233
|
+
const cents = index === rcBases.length - 1 ? rest : vatFromNetCents(baseCents, 19);
|
|
234
|
+
rcTaxCents.set(taxKennzahl, cents);
|
|
235
|
+
rest -= cents;
|
|
236
|
+
});
|
|
231
237
|
} else if (ledgerRcOutputCents !== 0) {
|
|
232
|
-
|
|
238
|
+
rcTaxCents.set(47, ledgerRcOutputCents); // derived path above set Kz 46
|
|
233
239
|
}
|
|
240
|
+
const kz47Cents = rcTaxCents.get(47) ?? 0;
|
|
241
|
+
const kz74Cents = rcTaxCents.get(74) ?? 0;
|
|
242
|
+
const kz85Cents = rcTaxCents.get(85) ?? 0;
|
|
234
243
|
|
|
235
244
|
// consistency: scenario bases × rate must reproduce the ledger tax
|
|
236
245
|
if (kz89Source === '(scenario)' && kz89Cents !== 0) {
|
|
@@ -242,7 +251,7 @@ export function computeUstva(input: IUstvaInput): IUstvaResult {
|
|
|
242
251
|
}
|
|
243
252
|
}
|
|
244
253
|
if (hasRcScenario) {
|
|
245
|
-
const expected = vatFromNetCents(kz46Cents, 19) + vatFromNetCents(kz84Cents, 19);
|
|
254
|
+
const expected = vatFromNetCents(kz46Cents, 19) + vatFromNetCents(kz73Cents, 19) + vatFromNetCents(kz84Cents, 19);
|
|
246
255
|
const diff = ledgerRcOutputCents - expected;
|
|
247
256
|
checks.push(`§13b: ledger output tax ${ledgerRcOutputCents} vs 19 % of scenario bases ${expected} (diff ${diff})`);
|
|
248
257
|
if (Math.abs(diff) > tolerance) {
|
|
@@ -274,6 +283,8 @@ export function computeUstva(input: IUstvaInput): IUstvaResult {
|
|
|
274
283
|
if (kz93Cents !== 0) put(93, 'baseEur', truncateToEur(kz93Cents), ['(scenario)']);
|
|
275
284
|
if (kz46Cents !== 0) put(46, 'baseEur', truncateToEur(kz46Cents), [kz46Source]);
|
|
276
285
|
if (kz47Cents !== 0) put(47, 'taxCents', kz47Cents, VAT_ACCOUNTS[input.chart].outputReverseCharge);
|
|
286
|
+
if (kz73Cents !== 0) put(73, 'baseEur', truncateToEur(kz73Cents), ['(scenario)']);
|
|
287
|
+
if (kz74Cents !== 0) put(74, 'taxCents', kz74Cents, VAT_ACCOUNTS[input.chart].outputReverseCharge);
|
|
277
288
|
if (kz84Cents !== 0) put(84, 'baseEur', truncateToEur(kz84Cents), ['(scenario)']);
|
|
278
289
|
if (kz85Cents !== 0) put(85, 'taxCents', kz85Cents, VAT_ACCOUNTS[input.chart].outputReverseCharge);
|
|
279
290
|
const sondervorauszahlung = input.sondervorauszahlungCents ?? 0;
|
|
@@ -290,6 +301,7 @@ export function computeUstva(input: IUstvaInput): IUstvaResult {
|
|
|
290
301
|
formDomesticTaxCents +
|
|
291
302
|
formIgeTaxCents +
|
|
292
303
|
kz47Cents +
|
|
304
|
+
kz74Cents +
|
|
293
305
|
kz85Cents -
|
|
294
306
|
inputTaxCents -
|
|
295
307
|
sondervorauszahlung;
|
|
@@ -313,10 +325,12 @@ export function computeUstva(input: IUstvaInput): IUstvaResult {
|
|
|
313
325
|
`igE input vs output tax: Kz 61 ${kzValue(61)} vs ledger igE output ${ledgerIgeOutputCents} (diff ${igeDeductionDiff}; non-zero = partial deduction or inconsistency)`,
|
|
314
326
|
);
|
|
315
327
|
}
|
|
316
|
-
|
|
317
|
-
|
|
328
|
+
// every § 13b tax field the recipient owes, the GrEStG's Kz 74 included, against its deduction
|
|
329
|
+
const rcOutputCents = kz47Cents + kz74Cents + kz85Cents;
|
|
330
|
+
const rcDeductionDiff = kzValue(67) - rcOutputCents;
|
|
331
|
+
if (kzValue(67) !== 0 || kz47Cents !== 0 || kz74Cents !== 0 || kz85Cents !== 0) {
|
|
318
332
|
checks.push(
|
|
319
|
-
`§13b input vs output tax: Kz 67 ${kzValue(67)} vs Kz 47+85 ${
|
|
333
|
+
`§13b input vs output tax: Kz 67 ${kzValue(67)} vs Kz 47+74+85 ${rcOutputCents} (diff ${rcDeductionDiff}; non-zero = partial deduction or inconsistency)`,
|
|
320
334
|
);
|
|
321
335
|
}
|
|
322
336
|
|
package/ts/ustva.types.ts
CHANGED
|
@@ -18,9 +18,11 @@ export interface IScenarioBaseInput {
|
|
|
18
18
|
intraEuAcquisitionStandardCents?: TCents;
|
|
19
19
|
/** igE 7 % net bases -> Kz 93 */
|
|
20
20
|
intraEuAcquisitionReducedCents?: TCents;
|
|
21
|
-
/** §13b sonstige Leistungen
|
|
21
|
+
/** §13b Abs. 1: sonstige Leistungen of an entrepreneur established in another member state -> Kz 46/47 */
|
|
22
22
|
reverseChargeServicesEuCents?: TCents;
|
|
23
|
-
/**
|
|
23
|
+
/** §13b Abs. 2 Nr. 3: Umsätze, die unter das GrEStG fallen -> Kz 73/74 */
|
|
24
|
+
reverseChargeRealEstateCents?: TCents;
|
|
25
|
+
/** the other §13b inputs, Abs. 2 Nr. 1, 2, 4 bis 12 -> Kz 84/85 */
|
|
24
26
|
reverseChargeOtherCents?: TCents;
|
|
25
27
|
}
|
|
26
28
|
|