@fin.cx/tax 2.0.0 → 2.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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/rates.d.ts +112 -0
- package/dist_ts/rates.js +136 -0
- package/dist_ts/ustva.d.ts +17 -0
- package/dist_ts/ustva.js +29 -6
- package/dist_ts/zm.d.ts +92 -0
- package/dist_ts/zm.js +100 -0
- package/package.json +4 -4
- package/readme.md +13 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +2 -0
- package/ts/rates.ts +180 -0
- package/ts/ustva.ts +30 -5
- package/ts/zm.ts +166 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@fin.cx/tax',
|
|
6
|
-
version: '2.
|
|
6
|
+
version: '2.1.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
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export * from './ustva.types.js';
|
|
2
2
|
export * from './ustva.accounts.js';
|
|
3
3
|
export * from './ustva.js';
|
|
4
|
-
|
|
4
|
+
export * from './zm.js';
|
|
5
|
+
export * from './rates.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxZQUFZLENBQUMifQ==
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rates of German VAT, dated: which rates German law sets for a supply
|
|
3
|
+
* carried out on a day, and the transition rules the administration granted
|
|
4
|
+
* around the rate changes of 2020 and 2021. The rate in force when the supply
|
|
5
|
+
* is carried out applies (§ 27 Abs. 1 Satz 1 UStG).
|
|
6
|
+
*/
|
|
7
|
+
/** A rate German law sets for a supply, and the days it applies to: from `from`, until `to` inclusive when it ended. */
|
|
8
|
+
export interface IGermanVatRate {
|
|
9
|
+
ratePercent: number;
|
|
10
|
+
/** `YYYY-MM-DD` */
|
|
11
|
+
from: string;
|
|
12
|
+
/** `YYYY-MM-DD`, inclusive; absent while the rate is in force */
|
|
13
|
+
to?: string;
|
|
14
|
+
/** the rate this is: the general rate, the reduced rate, the 0 % of § 12 Abs. 3 UStG, or an average rate of § 24 Abs. 1 Satz 1 UStG by its number */
|
|
15
|
+
provision: 'general' | 'reduced' | 'zero' | 'average_nr1' | 'average_nr2' | 'average_nr3';
|
|
16
|
+
/** the provision that sets the rate for these days, and the act that set it */
|
|
17
|
+
basis: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The rates of German VAT, dated. The table begins on 2007-01-01.
|
|
21
|
+
* - The general rate, 19 % (§ 12 Abs. 1 UStG, since Art. 4 Nr. 1
|
|
22
|
+
* Haushaltsbegleitgesetz 2006, BGBl. I S. 1402, from 2007-01-01), and the
|
|
23
|
+
* reduced rate, 7 % (§ 12 Abs. 2 UStG). From 2020-07-01 to 2020-12-31, 16 %
|
|
24
|
+
* and 5 % in their place (§ 28 Abs. 1, 2 UStG, Art. 3 Zweites
|
|
25
|
+
* Corona-Steuerhilfegesetz, BGBl. I 2020 S. 1512).
|
|
26
|
+
* - § 24 Abs. 1 Satz 1 Nr. 2 UStG (Sägewerkserzeugnisse, Getränke and
|
|
27
|
+
* alkoholische Flüssigkeiten of a farmer or forester taxed by average
|
|
28
|
+
* rates): 19 %, the rate it states as read on gesetze-im-internet.de on
|
|
29
|
+
* 2026-09-27; 16 % from 2020-07-01 to 2020-12-31 (§ 24 Abs. 1 Satz 1 Nr. 2
|
|
30
|
+
* i. V. m. § 28 Abs. 3 UStG, Art. 3 Zweites Corona-Steuerhilfegesetz, BGBl. I
|
|
31
|
+
* 2020 S. 1512, as the BMF letter of 30 June 2020, Rz. 1, cites it; the act's
|
|
32
|
+
* own text was not read). That 19 % applied from 2007-01-01 is not verified
|
|
33
|
+
* from the amending act: the table starts it there with the general rate.
|
|
34
|
+
* - The average rates of § 24 Abs. 1 Satz 1 UStG, at which a farmer or
|
|
35
|
+
* forester taxed by them charges VAT on the invoice; the recipient deducts
|
|
36
|
+
* it as input tax (§ 15 Abs. 1 Satz 1 Nr. 1 UStG). Each from the amending
|
|
37
|
+
* act's text:
|
|
38
|
+
* - Nr. 1, forestry products: 5,5 % from 2007-01-01 (Art. 4 Nr. 2
|
|
39
|
+
* Buchst. a Doppelbuchst. aa Haushaltsbegleitgesetz 2006, "5 Prozent"
|
|
40
|
+
* replaced by "5,5 Prozent"); unchanged since.
|
|
41
|
+
* - Nr. 3, the other supplies: 10,7 % from 2007-01-01 (the same, Doppelbuchst.
|
|
42
|
+
* cc, "9 Prozent" by "10,7 Prozent"); 9,5 % from 2022-01-01 (Art. 1 Nr. 5
|
|
43
|
+
* Gesetz zur Umsetzung unionsrechtlicher Vorgaben im Umsatzsteuerrecht of
|
|
44
|
+
* 21.12.2021, BGBl. I S. 5250); 9,0 % from 2023-01-01 (Art. 12 Nr. 3 Achtes
|
|
45
|
+
* Gesetz zur Änderung von Verbrauchsteuergesetzen of 24.10.2022, BGBl. I
|
|
46
|
+
* S. 1838); 8,4 % from 2024-12-06 (Art. 24 Nr. 13 Jahressteuergesetz 2024
|
|
47
|
+
* of 02.12.2024, BGBl. 2024 I Nr. 387, in force the day after its
|
|
48
|
+
* promulgation on 2024-12-05, Art. 56 Abs. 1); 7,8 % from 2025-01-01
|
|
49
|
+
* (Art. 25 Nr. 21 of the same, Art. 56 Abs. 7), the rate § 24 Abs. 1 Satz 1
|
|
50
|
+
* Nr. 3 UStG states as read on gesetze-im-internet.de on 2026-09-25.
|
|
51
|
+
* - 0 % for the supplies of § 12 Abs. 3 UStG (photovoltaic installations:
|
|
52
|
+
* the modules and components delivered to their operator, their
|
|
53
|
+
* intra-Community acquisition, import and installation) from 2023-01-01
|
|
54
|
+
* (Art. 16 Nr. 5 Jahressteuergesetz 2022 of 16.12.2022, BGBl. I S. 2294,
|
|
55
|
+
* in force on 2023-01-01 by its Art. 43; the amending text as read on
|
|
56
|
+
* buzer.de on 2026-09-28, § 12 Abs. 3 as read on gesetze-im-internet.de).
|
|
57
|
+
*/
|
|
58
|
+
export declare const GERMAN_VAT_RATES: readonly IGermanVatRate[];
|
|
59
|
+
/**
|
|
60
|
+
* The rates of German VAT for a supply carried out on a day (`YYYY-MM-DD`),
|
|
61
|
+
* each once, in the order of `GERMAN_VAT_RATES`. `undefined` for a day before
|
|
62
|
+
* the table begins (2007-01-01): the table holds no law for it.
|
|
63
|
+
*/
|
|
64
|
+
export declare function germanVatRatesOn(dayArg: string): readonly number[] | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* A rate the administration names for some supplies of some days around a
|
|
67
|
+
* change of the rates, with its source and the supplies it covers. Whether a
|
|
68
|
+
* supply is one of them is a fact the caller states; this table cannot tell.
|
|
69
|
+
*/
|
|
70
|
+
export interface IGermanVatRateConcession {
|
|
71
|
+
ratePercent: number;
|
|
72
|
+
/**
|
|
73
|
+
* `required`: the letter says the rate is to be applied ("sind … anzuwenden");
|
|
74
|
+
* `accepted`: the letter allows it or does not object to it ("wird
|
|
75
|
+
* zugelassen", "wird nicht beanstandet"), and the law's rate of the day may be
|
|
76
|
+
* applied as well.
|
|
77
|
+
*/
|
|
78
|
+
standing: 'required' | 'accepted';
|
|
79
|
+
/** `YYYY-MM-DD` */
|
|
80
|
+
from: string;
|
|
81
|
+
/** `YYYY-MM-DD`, inclusive */
|
|
82
|
+
to: string;
|
|
83
|
+
/** the BMF letter, its GZ and its Rz. */
|
|
84
|
+
source: string;
|
|
85
|
+
/** the supplies it covers, and what it allows */
|
|
86
|
+
covers: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The transition rules of the administration around the rate changes of
|
|
90
|
+
* 1 July 2020 and 1 January 2021, each read in the letter itself (the copies of
|
|
91
|
+
* 8 July 2020 and 5 November 2020 in the Internet Archive of the PDFs on
|
|
92
|
+
* bundesfinanzministerium.de, read 2026-09-27):
|
|
93
|
+
* - Rz. 44 of the letter of 30 June 2020 allows the new rates on
|
|
94
|
+
* Bewirtungsleistungen in the night of 30 June to 1 July 2020 (accepted), and
|
|
95
|
+
* Rz. 22 of the letter of 4 November 2020 requires them on Beherbergungen of
|
|
96
|
+
* that night (required), which Rz. 44 had left out.
|
|
97
|
+
* - Rz. 46 of the letter of 30 June 2020 accepts the old rates, 19 and
|
|
98
|
+
* 7 percent, on supplies to entrepreneurs in July 2020, with the input tax
|
|
99
|
+
* deduction of the stated tax.
|
|
100
|
+
* - Rz. 22 of the letter of 4 November 2020 allows 16 and 5 percent on
|
|
101
|
+
* Bewirtungsleistungen and Beherbergungen in the night of 31 December 2020
|
|
102
|
+
* to 1 January 2021.
|
|
103
|
+
* Not here: Rz. 47 of the letter of 30 June 2020 applies its rules "entsprechend"
|
|
104
|
+
* to the rise on 1 January 2021; the letters grant no deduction of 16 or
|
|
105
|
+
* 5 percent stated on a supply of January 2021 beyond the night above, except
|
|
106
|
+
* for advance payment invoices issued before 2021 (4 November 2020, Rz. 1 and
|
|
107
|
+
* 2), whose case needs the invoice's date. No letter on the § 24 changes of
|
|
108
|
+
* 2022, 2023, 2024-12-06 and 2025 was found.
|
|
109
|
+
*/
|
|
110
|
+
export declare const GERMAN_VAT_RATE_CONCESSIONS: readonly IGermanVatRateConcession[];
|
|
111
|
+
/** The transition rules that cover a day of supply (`YYYY-MM-DD`), in the order of `GERMAN_VAT_RATE_CONCESSIONS`. */
|
|
112
|
+
export declare function germanVatRateConcessionsOn(dayArg: string): readonly IGermanVatRateConcession[];
|
package/dist_ts/rates.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rates of German VAT, dated: which rates German law sets for a supply
|
|
3
|
+
* carried out on a day, and the transition rules the administration granted
|
|
4
|
+
* around the rate changes of 2020 and 2021. The rate in force when the supply
|
|
5
|
+
* is carried out applies (§ 27 Abs. 1 Satz 1 UStG).
|
|
6
|
+
*/
|
|
7
|
+
const GENERAL = '§ 12 Abs. 1 UStG (Art. 4 Nr. 1 Haushaltsbegleitgesetz 2006, BGBl. I S. 1402)';
|
|
8
|
+
const REDUCED = '§ 12 Abs. 2 UStG';
|
|
9
|
+
const TEMPORARY = '§ 28 Abs. 1, 2 UStG (Art. 3 Zweites Corona-Steuerhilfegesetz, BGBl. I 2020 S. 1512)';
|
|
10
|
+
const SPECIAL_AVERAGE = '§ 24 Abs. 1 Satz 1 Nr. 2 UStG';
|
|
11
|
+
const FORESTRY = '§ 24 Abs. 1 Satz 1 Nr. 1 UStG (Art. 4 Nr. 2 Buchst. a Doppelbuchst. aa Haushaltsbegleitgesetz 2006)';
|
|
12
|
+
const AVERAGE_OTHER = '§ 24 Abs. 1 Satz 1 Nr. 3 UStG';
|
|
13
|
+
const ZERO = '§ 12 Abs. 3 UStG (Art. 16 Nr. 5 Jahressteuergesetz 2022 vom 16.12.2022, BGBl. I S. 2294, in force 2023-01-01 by its Art. 43)';
|
|
14
|
+
/**
|
|
15
|
+
* The rates of German VAT, dated. The table begins on 2007-01-01.
|
|
16
|
+
* - The general rate, 19 % (§ 12 Abs. 1 UStG, since Art. 4 Nr. 1
|
|
17
|
+
* Haushaltsbegleitgesetz 2006, BGBl. I S. 1402, from 2007-01-01), and the
|
|
18
|
+
* reduced rate, 7 % (§ 12 Abs. 2 UStG). From 2020-07-01 to 2020-12-31, 16 %
|
|
19
|
+
* and 5 % in their place (§ 28 Abs. 1, 2 UStG, Art. 3 Zweites
|
|
20
|
+
* Corona-Steuerhilfegesetz, BGBl. I 2020 S. 1512).
|
|
21
|
+
* - § 24 Abs. 1 Satz 1 Nr. 2 UStG (Sägewerkserzeugnisse, Getränke and
|
|
22
|
+
* alkoholische Flüssigkeiten of a farmer or forester taxed by average
|
|
23
|
+
* rates): 19 %, the rate it states as read on gesetze-im-internet.de on
|
|
24
|
+
* 2026-09-27; 16 % from 2020-07-01 to 2020-12-31 (§ 24 Abs. 1 Satz 1 Nr. 2
|
|
25
|
+
* i. V. m. § 28 Abs. 3 UStG, Art. 3 Zweites Corona-Steuerhilfegesetz, BGBl. I
|
|
26
|
+
* 2020 S. 1512, as the BMF letter of 30 June 2020, Rz. 1, cites it; the act's
|
|
27
|
+
* own text was not read). That 19 % applied from 2007-01-01 is not verified
|
|
28
|
+
* from the amending act: the table starts it there with the general rate.
|
|
29
|
+
* - The average rates of § 24 Abs. 1 Satz 1 UStG, at which a farmer or
|
|
30
|
+
* forester taxed by them charges VAT on the invoice; the recipient deducts
|
|
31
|
+
* it as input tax (§ 15 Abs. 1 Satz 1 Nr. 1 UStG). Each from the amending
|
|
32
|
+
* act's text:
|
|
33
|
+
* - Nr. 1, forestry products: 5,5 % from 2007-01-01 (Art. 4 Nr. 2
|
|
34
|
+
* Buchst. a Doppelbuchst. aa Haushaltsbegleitgesetz 2006, "5 Prozent"
|
|
35
|
+
* replaced by "5,5 Prozent"); unchanged since.
|
|
36
|
+
* - Nr. 3, the other supplies: 10,7 % from 2007-01-01 (the same, Doppelbuchst.
|
|
37
|
+
* cc, "9 Prozent" by "10,7 Prozent"); 9,5 % from 2022-01-01 (Art. 1 Nr. 5
|
|
38
|
+
* Gesetz zur Umsetzung unionsrechtlicher Vorgaben im Umsatzsteuerrecht of
|
|
39
|
+
* 21.12.2021, BGBl. I S. 5250); 9,0 % from 2023-01-01 (Art. 12 Nr. 3 Achtes
|
|
40
|
+
* Gesetz zur Änderung von Verbrauchsteuergesetzen of 24.10.2022, BGBl. I
|
|
41
|
+
* S. 1838); 8,4 % from 2024-12-06 (Art. 24 Nr. 13 Jahressteuergesetz 2024
|
|
42
|
+
* of 02.12.2024, BGBl. 2024 I Nr. 387, in force the day after its
|
|
43
|
+
* promulgation on 2024-12-05, Art. 56 Abs. 1); 7,8 % from 2025-01-01
|
|
44
|
+
* (Art. 25 Nr. 21 of the same, Art. 56 Abs. 7), the rate § 24 Abs. 1 Satz 1
|
|
45
|
+
* Nr. 3 UStG states as read on gesetze-im-internet.de on 2026-09-25.
|
|
46
|
+
* - 0 % for the supplies of § 12 Abs. 3 UStG (photovoltaic installations:
|
|
47
|
+
* the modules and components delivered to their operator, their
|
|
48
|
+
* intra-Community acquisition, import and installation) from 2023-01-01
|
|
49
|
+
* (Art. 16 Nr. 5 Jahressteuergesetz 2022 of 16.12.2022, BGBl. I S. 2294,
|
|
50
|
+
* in force on 2023-01-01 by its Art. 43; the amending text as read on
|
|
51
|
+
* buzer.de on 2026-09-28, § 12 Abs. 3 as read on gesetze-im-internet.de).
|
|
52
|
+
*/
|
|
53
|
+
export const GERMAN_VAT_RATES = [
|
|
54
|
+
{ ratePercent: 19, from: '2007-01-01', to: '2020-06-30', provision: 'general', basis: GENERAL },
|
|
55
|
+
{ ratePercent: 19, from: '2021-01-01', provision: 'general', basis: GENERAL },
|
|
56
|
+
{ ratePercent: 7, from: '2007-01-01', to: '2020-06-30', provision: 'reduced', basis: REDUCED },
|
|
57
|
+
{ ratePercent: 7, from: '2021-01-01', provision: 'reduced', basis: REDUCED },
|
|
58
|
+
{ ratePercent: 0, from: '2023-01-01', provision: 'zero', basis: ZERO },
|
|
59
|
+
{ ratePercent: 16, from: '2020-07-01', to: '2020-12-31', provision: 'general', basis: `${TEMPORARY}, in place of the rate of § 12 Abs. 1 UStG` },
|
|
60
|
+
{ ratePercent: 5, from: '2020-07-01', to: '2020-12-31', provision: 'reduced', basis: `${TEMPORARY}, in place of the rate of § 12 Abs. 2 UStG` },
|
|
61
|
+
{ ratePercent: 19, from: '2007-01-01', to: '2020-06-30', provision: 'average_nr2', basis: `${SPECIAL_AVERAGE} (the act that set 19 % from 2007-01-01 not verified)` },
|
|
62
|
+
{ ratePercent: 19, from: '2021-01-01', provision: 'average_nr2', basis: `${SPECIAL_AVERAGE} (19 % as read on gesetze-im-internet.de, 2026-09-27)` },
|
|
63
|
+
{ ratePercent: 16, from: '2020-07-01', to: '2020-12-31', provision: 'average_nr2', basis: `${SPECIAL_AVERAGE} i. V. m. § 28 Abs. 3 UStG (Art. 3 Zweites Corona-Steuerhilfegesetz, BGBl. I 2020 S. 1512, as cited by BMF 30.06.2020 Rz. 1)` },
|
|
64
|
+
{ ratePercent: 5.5, from: '2007-01-01', provision: 'average_nr1', basis: FORESTRY },
|
|
65
|
+
{ ratePercent: 10.7, from: '2007-01-01', to: '2021-12-31', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 4 Nr. 2 Buchst. a Doppelbuchst. cc Haushaltsbegleitgesetz 2006)` },
|
|
66
|
+
{ ratePercent: 9.5, from: '2022-01-01', to: '2022-12-31', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 1 Nr. 5 Gesetz zur Umsetzung unionsrechtlicher Vorgaben im Umsatzsteuerrecht, BGBl. I 2021 S. 5250)` },
|
|
67
|
+
{ ratePercent: 9, from: '2023-01-01', to: '2024-12-05', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 12 Nr. 3 Achtes Gesetz zur Änderung von Verbrauchsteuergesetzen, BGBl. I 2022 S. 1838)` },
|
|
68
|
+
{ ratePercent: 8.4, from: '2024-12-06', to: '2024-12-31', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 24 Nr. 13 Jahressteuergesetz 2024, BGBl. 2024 I Nr. 387)` },
|
|
69
|
+
{ ratePercent: 7.8, from: '2025-01-01', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 25 Nr. 21 Jahressteuergesetz 2024, BGBl. 2024 I Nr. 387)` },
|
|
70
|
+
];
|
|
71
|
+
const TABLE_BEGINS = '2007-01-01';
|
|
72
|
+
const assertDay = (dayArg) => {
|
|
73
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dayArg);
|
|
74
|
+
const date = match ? new Date(Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]))) : undefined;
|
|
75
|
+
if (!date || date.toISOString().slice(0, 10) !== dayArg) {
|
|
76
|
+
throw new Error(`a day of supply is written YYYY-MM-DD, got '${dayArg}'`);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* The rates of German VAT for a supply carried out on a day (`YYYY-MM-DD`),
|
|
81
|
+
* each once, in the order of `GERMAN_VAT_RATES`. `undefined` for a day before
|
|
82
|
+
* the table begins (2007-01-01): the table holds no law for it.
|
|
83
|
+
*/
|
|
84
|
+
export function germanVatRatesOn(dayArg) {
|
|
85
|
+
assertDay(dayArg);
|
|
86
|
+
if (dayArg < TABLE_BEGINS) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
return [...new Set(GERMAN_VAT_RATES
|
|
90
|
+
.filter((rateArg) => rateArg.from <= dayArg && (rateArg.to === undefined || dayArg <= rateArg.to))
|
|
91
|
+
.map((rateArg) => rateArg.ratePercent))];
|
|
92
|
+
}
|
|
93
|
+
const BMF_2020_06_30 = 'BMF-Schreiben vom 30. Juni 2020, III C 2 - S 7030/20/10009 :004, BStBl I S. 584';
|
|
94
|
+
const BMF_2020_11_04 = 'BMF-Schreiben vom 4. November 2020, III C 2 - S 7030/20/10009 :016';
|
|
95
|
+
const NIGHT_2020_06_30_BEWIRTUNG = 'Bewirtungsleistungen (food and drink for consumption on the spot, tobacco and the like) in the night of 30 June to 1 July 2020, at the rates in force from 1 July 2020 ("wird zugelassen")';
|
|
96
|
+
const NIGHT_2020_06_30_BEHERBERGUNG = 'Beherbergungen and the services that go with them in the night of 30 June to 1 July 2020, at the rates in force from 1 July 2020 ("sind … anzuwenden"; the letter of 30 June 2020, Rz. 44, had left them out)';
|
|
97
|
+
const JULY_2020 = '("wird es … nicht beanstandet") a supply to an entrepreneur carried out in July 2020 whose invoice states the rate in force before 1 July 2020 and whose supplier paid that tax: the invoice need not be corrected, and a recipient entitled to deduct input tax deducts the tax as stated (for § 13b supplies, the tax the recipient computed)';
|
|
98
|
+
const NIGHT_2020_12_31 = 'Bewirtungsleistungen, and Beherbergungen with the services that go with them, in the night of 31 December 2020 to 1 January 2021, at the rates of 16 and 5 percent ("wird zugelassen")';
|
|
99
|
+
/**
|
|
100
|
+
* The transition rules of the administration around the rate changes of
|
|
101
|
+
* 1 July 2020 and 1 January 2021, each read in the letter itself (the copies of
|
|
102
|
+
* 8 July 2020 and 5 November 2020 in the Internet Archive of the PDFs on
|
|
103
|
+
* bundesfinanzministerium.de, read 2026-09-27):
|
|
104
|
+
* - Rz. 44 of the letter of 30 June 2020 allows the new rates on
|
|
105
|
+
* Bewirtungsleistungen in the night of 30 June to 1 July 2020 (accepted), and
|
|
106
|
+
* Rz. 22 of the letter of 4 November 2020 requires them on Beherbergungen of
|
|
107
|
+
* that night (required), which Rz. 44 had left out.
|
|
108
|
+
* - Rz. 46 of the letter of 30 June 2020 accepts the old rates, 19 and
|
|
109
|
+
* 7 percent, on supplies to entrepreneurs in July 2020, with the input tax
|
|
110
|
+
* deduction of the stated tax.
|
|
111
|
+
* - Rz. 22 of the letter of 4 November 2020 allows 16 and 5 percent on
|
|
112
|
+
* Bewirtungsleistungen and Beherbergungen in the night of 31 December 2020
|
|
113
|
+
* to 1 January 2021.
|
|
114
|
+
* Not here: Rz. 47 of the letter of 30 June 2020 applies its rules "entsprechend"
|
|
115
|
+
* to the rise on 1 January 2021; the letters grant no deduction of 16 or
|
|
116
|
+
* 5 percent stated on a supply of January 2021 beyond the night above, except
|
|
117
|
+
* for advance payment invoices issued before 2021 (4 November 2020, Rz. 1 and
|
|
118
|
+
* 2), whose case needs the invoice's date. No letter on the § 24 changes of
|
|
119
|
+
* 2022, 2023, 2024-12-06 and 2025 was found.
|
|
120
|
+
*/
|
|
121
|
+
export const GERMAN_VAT_RATE_CONCESSIONS = [
|
|
122
|
+
{ ratePercent: 16, standing: 'accepted', from: '2020-06-30', to: '2020-06-30', source: `${BMF_2020_06_30}, Rz. 44; ${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_06_30_BEWIRTUNG },
|
|
123
|
+
{ ratePercent: 5, standing: 'accepted', from: '2020-06-30', to: '2020-06-30', source: `${BMF_2020_06_30}, Rz. 44; ${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_06_30_BEWIRTUNG },
|
|
124
|
+
{ ratePercent: 16, standing: 'required', from: '2020-06-30', to: '2020-06-30', source: `${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_06_30_BEHERBERGUNG },
|
|
125
|
+
{ ratePercent: 5, standing: 'required', from: '2020-06-30', to: '2020-06-30', source: `${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_06_30_BEHERBERGUNG },
|
|
126
|
+
{ ratePercent: 19, standing: 'accepted', from: '2020-07-01', to: '2020-07-31', source: `${BMF_2020_06_30}, Rz. 46`, covers: JULY_2020 },
|
|
127
|
+
{ ratePercent: 7, standing: 'accepted', from: '2020-07-01', to: '2020-07-31', source: `${BMF_2020_06_30}, Rz. 46`, covers: JULY_2020 },
|
|
128
|
+
{ ratePercent: 16, standing: 'accepted', from: '2021-01-01', to: '2021-01-01', source: `${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_12_31 },
|
|
129
|
+
{ ratePercent: 5, standing: 'accepted', from: '2021-01-01', to: '2021-01-01', source: `${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_12_31 },
|
|
130
|
+
];
|
|
131
|
+
/** The transition rules that cover a day of supply (`YYYY-MM-DD`), in the order of `GERMAN_VAT_RATE_CONCESSIONS`. */
|
|
132
|
+
export function germanVatRateConcessionsOn(dayArg) {
|
|
133
|
+
assertDay(dayArg);
|
|
134
|
+
return GERMAN_VAT_RATE_CONCESSIONS.filter((entryArg) => entryArg.from <= dayArg && dayArg <= entryArg.to);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9yYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWVILE1BQU0sT0FBTyxHQUFHLDhFQUE4RSxDQUFDO0FBQy9GLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDO0FBQ25DLE1BQU0sU0FBUyxHQUFHLHFGQUFxRixDQUFDO0FBQ3hHLE1BQU0sZUFBZSxHQUFHLCtCQUErQixDQUFDO0FBQ3hELE1BQU0sUUFBUSxHQUFHLHFHQUFxRyxDQUFDO0FBQ3ZILE1BQU0sYUFBYSxHQUFHLCtCQUErQixDQUFDO0FBQ3RELE1BQU0sSUFBSSxHQUFHLDhIQUE4SCxDQUFDO0FBRTVJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE4QjtJQUN6RCxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtJQUMvRixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7SUFDN0UsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7SUFDOUYsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO0lBQzVFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUs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
|
package/dist_ts/ustva.d.ts
CHANGED
|
@@ -1,2 +1,19 @@
|
|
|
1
1
|
import type { IUstvaInput, IUstvaResult } from './ustva.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The labels of the Kennzahlen this module fills. Kz 21, 45 and 87 carry the
|
|
4
|
+
* titles of their fields in ELSTER's "Anleitung zur UStVA 2026" (read
|
|
5
|
+
* 2026-09-25).
|
|
6
|
+
*/
|
|
7
|
+
export declare const USTVA_KENNZAHL_LABELS: Readonly<Record<number, string>>;
|
|
8
|
+
/**
|
|
9
|
+
* The Kennzahlen this module fills, in the order of the UStVA 2026 form
|
|
10
|
+
* (ELSTER, "Anleitung zur UStVA 2026"): taxable supplies (81, 86, 87), tax-free
|
|
11
|
+
* 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
|
+
* services in the rest of the Community (21), other non-taxable turnover (45),
|
|
14
|
+
* input tax (66, 61, 62, 67), the Sondervorauszahlung (39) and the result (83).
|
|
15
|
+
* A Kennzahl computed but not listed here is reported as an issue, never
|
|
16
|
+
* dropped.
|
|
17
|
+
*/
|
|
18
|
+
export declare const USTVA_KENNZAHL_ORDER: readonly number[];
|
|
2
19
|
export declare function computeUstva(input: IUstvaInput): IUstvaResult;
|
package/dist_ts/ustva.js
CHANGED
|
@@ -21,9 +21,15 @@
|
|
|
21
21
|
import { vatFromNetCents } from '@fin.cx/calculation';
|
|
22
22
|
import { getChart } from '@fin.cx/chartdata';
|
|
23
23
|
import { VAT_ACCOUNTS } from './ustva.accounts.js';
|
|
24
|
-
|
|
24
|
+
/**
|
|
25
|
+
* The labels of the Kennzahlen this module fills. Kz 21, 45 and 87 carry the
|
|
26
|
+
* titles of their fields in ELSTER's "Anleitung zur UStVA 2026" (read
|
|
27
|
+
* 2026-09-25).
|
|
28
|
+
*/
|
|
29
|
+
export const USTVA_KENNZAHL_LABELS = {
|
|
25
30
|
81: 'Steuerpflichtige Umsätze 19 %',
|
|
26
31
|
86: 'Steuerpflichtige Umsätze 7 %',
|
|
32
|
+
87: 'Steuerpflichtige Lieferungen und sonstige Leistungen (0 %)',
|
|
27
33
|
89: 'Innergemeinschaftliche Erwerbe 19 %',
|
|
28
34
|
93: 'Innergemeinschaftliche Erwerbe 7 %',
|
|
29
35
|
41: 'Steuerfreie innergemeinschaftliche Lieferungen',
|
|
@@ -34,6 +40,8 @@ const KENNZAHL_LABELS = {
|
|
|
34
40
|
84: 'Andere Leistungen eines im Ausland ansässigen Unternehmers (§13b)',
|
|
35
41
|
85: 'Steuer zu Kennzahl 84',
|
|
36
42
|
60: 'Steuerpflichtige Umsätze, für die der Leistungsempfänger die Steuer schuldet (§13b)',
|
|
43
|
+
21: 'Sonstige Leistungen im übrigen Gemeinschaftsgebiet',
|
|
44
|
+
45: 'Übrige nicht steuerbare Umsätze (Leistungsort nicht im Inland)',
|
|
37
45
|
66: 'Vorsteuer aus Rechnungen anderer Unternehmer',
|
|
38
46
|
61: 'Vorsteuer aus innergemeinschaftlichem Erwerb',
|
|
39
47
|
62: 'Entrichtete Einfuhrumsatzsteuer',
|
|
@@ -41,8 +49,17 @@ const KENNZAHL_LABELS = {
|
|
|
41
49
|
39: 'Anrechnung der Sondervorauszahlung (Dauerfristverlängerung)',
|
|
42
50
|
83: 'Verbleibende Umsatzsteuer-Vorauszahlung / Überschuss',
|
|
43
51
|
};
|
|
44
|
-
/**
|
|
45
|
-
|
|
52
|
+
/**
|
|
53
|
+
* The Kennzahlen this module fills, in the order of the UStVA 2026 form
|
|
54
|
+
* (ELSTER, "Anleitung zur UStVA 2026"): taxable supplies (81, 86, 87), tax-free
|
|
55
|
+
* 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),
|
|
57
|
+
* services in the rest of the Community (21), other non-taxable turnover (45),
|
|
58
|
+
* input tax (66, 61, 62, 67), the Sondervorauszahlung (39) and the result (83).
|
|
59
|
+
* A Kennzahl computed but not listed here is reported as an issue, never
|
|
60
|
+
* dropped.
|
|
61
|
+
*/
|
|
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];
|
|
46
63
|
/** full euros, cents truncated toward zero (form rule for bases) */
|
|
47
64
|
function truncateToEur(cents) {
|
|
48
65
|
return Math.trunc(cents / 100);
|
|
@@ -208,7 +225,7 @@ export function computeUstva(input) {
|
|
|
208
225
|
kennzahl,
|
|
209
226
|
kind,
|
|
210
227
|
value,
|
|
211
|
-
label:
|
|
228
|
+
label: USTVA_KENNZAHL_LABELS[kennzahl] ?? `Kennzahl ${kennzahl}`,
|
|
212
229
|
accounts,
|
|
213
230
|
});
|
|
214
231
|
};
|
|
@@ -260,7 +277,13 @@ export function computeUstva(input) {
|
|
|
260
277
|
if (kzValue(67) !== 0 || kz47Cents !== 0 || kz85Cents !== 0) {
|
|
261
278
|
checks.push(`§13b input vs output tax: Kz 67 ${kzValue(67)} vs Kz 47+85 ${kz47Cents + kz85Cents} (diff ${rcDeductionDiff}; non-zero = partial deduction or inconsistency)`);
|
|
262
279
|
}
|
|
263
|
-
const kennzahlen =
|
|
280
|
+
const kennzahlen = USTVA_KENNZAHL_ORDER.filter((kennzahl) => values.has(kennzahl)).map((kennzahl) => values.get(kennzahl));
|
|
281
|
+
// a figure the form order does not place would be left out of the filing: say so instead
|
|
282
|
+
for (const [kennzahl, value] of values) {
|
|
283
|
+
if (!USTVA_KENNZAHL_ORDER.includes(kennzahl)) {
|
|
284
|
+
issues.push(`Kennzahl ${kennzahl} (from ${value.accounts.join(', ')}) has no place in this module's form order — it cannot be filed; add it to USTVA_KENNZAHL_ORDER`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
264
287
|
return {
|
|
265
288
|
chart: input.chart,
|
|
266
289
|
year: input.year,
|
|
@@ -277,4 +300,4 @@ export function computeUstva(input) {
|
|
|
277
300
|
issues,
|
|
278
301
|
};
|
|
279
302
|
}
|
|
280
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXN0dmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy91c3R2YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVNuRCxNQUFNLGVBQWUsR0FBMkI7SUFDOUMsRUFBRSxFQUFFLCtCQUErQjtJQUNuQyxFQUFFLEVBQUUsOEJBQThCO0lBQ2xDLEVBQUUsRUFBRSxxQ0FBcUM7SUFDekMsRUFBRSxFQUFFLG9DQUFvQztJQUN4QyxFQUFFLEVBQUUsZ0RBQWdEO0lBQ3BELEVBQUUsRUFBRSx3REFBd0Q7SUFDNUQsRUFBRSxFQUFFLHlDQUF5QztJQUM3QyxFQUFFLEVBQUUsZ0VBQWdFO0lBQ3BFLEVBQUUsRUFBRSx1QkFBdUI7SUFDM0IsRUFBRSxFQUFFLG1FQUFtRTtJQUN2RSxFQUFFLEVBQUUsdUJBQXVCO0lBQzNCLEVBQUUsRUFBRSxxRkFBcUY7SUFDekYsRUFBRSxFQUFFLDhDQUE4QztJQUNsRCxFQUFFLEVBQUUsOENBQThDO0lBQ2xELEVBQUUsRUFBRSxpQ0FBaUM7SUFDckMsRUFBRSxFQUFFLGlEQUFpRDtJQUNyRCxFQUFFLEVBQUUsNkRBQTZEO0lBQ2pFLEVBQUUsRUFBRSxzREFBc0Q7Q0FDM0QsQ0FBQztBQUVGLDZDQUE2QztBQUM3QyxNQUFNLGNBQWMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFB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
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXN0dmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy91c3R2YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE9BQU8sRUFBRSxlQUFlLEVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVNuRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQXFDO0lBQ3JFLEVBQUUsRUFBRSwrQkFBK0I7SUFDbkMsRUFBRSxFQUFFLDhCQUE4QjtJQUNsQyxFQUFFLEVBQUUsNERBQTREO0lBQ2hFLEVBQUUsRUFBRSxxQ0FBcUM7SUFDekMsRUFBRSxFQUFFLG9DQUFvQztJQUN4QyxFQUFFLEVBQUUsZ0RBQWdEO0lBQ3BELEVBQUUsRUFBRSx3REFBd0Q7SUFDNUQsRUFBRSxFQUFFLHlDQUF5QztJQUM3QyxFQUFFLEVBQUUsZ0VBQWdFO0lBQ3BFLEVBQUUsRUFBRSx1QkFBdUI7SUFDM0IsRUFBRSxFQUFFLG1FQUFtRTtJQUN2RSxFQUFFLEVBQUUsdUJBQXVCO0lBQzNCLEVBQUUsRUFBRSxxRkFBcUY7SUFDekYsRUFBRSxFQUFFLG9EQUFvRDtJQUN4RCxFQUFFLEVBQUUsZ0VBQWdFO0lBQ3BFLEVBQUUsRUFBRSw4Q0FBOEM7SUFDbEQsRUFBRSxFQUFFLDhDQUE4QztJQUNsRCxFQUFFLEVBQUUsaUNBQWlDO0lBQ3JDLEVBQUUsRUFBRSxpREFBaUQ7SUFDckQsRUFBRSxFQUFFLDZEQUE2RDtJQUNqRSxFQUFFLEVBQUUsc0RBQXNEO0NBQzNELENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBc0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxF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
|
package/dist_ts/zm.d.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Zusammenfassende Meldung (§ 18a UStG): its lines, and the CSV the
|
|
3
|
+
* ELSTER (or BZSt-Online-Portal) online form imports. Pure; the caller
|
|
4
|
+
* decides which supplies of which period go in (§ 18a Abs. 1, 2, 8 UStG) and
|
|
5
|
+
* transmits the form itself, authenticated, as § 18a requires.
|
|
6
|
+
*
|
|
7
|
+
* Sources, read 2026-09-25:
|
|
8
|
+
* - ELSTER, "Import von Meldelisten zur Zusammenfassenden Meldung"
|
|
9
|
+
* (helpGlobal `zmdo_import_eop`, CSV version 3.0) and the general
|
|
10
|
+
* "Anleitung zur Erstellung von CSV-Dateien für die Importfunktion":
|
|
11
|
+
* UTF-8; line 1 `#v3.0`; the form's example adds `#ve3.2.1`; one line of
|
|
12
|
+
* field names; then the lines, one per record "Meldezeilen (Satzart 1)":
|
|
13
|
+
* USt-IdNr. AN(7,14) beginning with a country code of the list; Summe
|
|
14
|
+
* (Euro) N(11), "eine ganze Zahl", minus allowed; Art der Leistung A(1),
|
|
15
|
+
* `L` innergemeinschaftliche Lieferung, `S` sonstige Leistung, `D`
|
|
16
|
+
* Dreiecksgeschäft. At most 1 500 lines. The example separates its lines
|
|
17
|
+
* with a line feed and its fields with `,`.
|
|
18
|
+
* - BZSt, "Zusammenfassende Meldung - Fragen und Antworten"
|
|
19
|
+
* (bzst.de …/ZusammenfassendeMeldung/FAQ/faq_zm.html, read 2026-09-27),
|
|
20
|
+
* Brexit: a Northern Irish business has a VAT ID with `XI`; the ZM states
|
|
21
|
+
* the intra-Community supplies, triangular trades and § 6b transfers to it,
|
|
22
|
+
* while services to recipients in Northern Ireland follow the rules for the
|
|
23
|
+
* third-country territory and are not reported (Art. 8 of the Protocol on
|
|
24
|
+
* Ireland/Northern Ireland covers goods only).
|
|
25
|
+
* - BZSt, "Anleitung zur Zusammenfassenden Meldung" (USt ZM 1/2021): one line
|
|
26
|
+
* per recipient and kind in a period, the bases summed (Tz. 8, 11); a later
|
|
27
|
+
* change of the base netted into the period of the change, possibly
|
|
28
|
+
* negative (Tz. 10); no "Nullmeldungen" (III.1); a correction states the
|
|
29
|
+
* correct totals, and `0` to storno a line (Tz. 12.2, 12.3).
|
|
30
|
+
*/
|
|
31
|
+
import type { TCents } from '@fin.cx/calculation';
|
|
32
|
+
/** `L` innergemeinschaftliche Warenlieferung, `S` sonstige Leistung (§ 3a Abs. 2), `D` Dreiecksgeschäft (§ 25b Abs. 2) */
|
|
33
|
+
export type TZmKind = 'L' | 'S' | 'D';
|
|
34
|
+
/** One supply (or a later change of its base) of the period: the recipient's VAT ID, its kind, the base in euro cents */
|
|
35
|
+
export interface IZmSupplyInput {
|
|
36
|
+
vatId: string;
|
|
37
|
+
kind: TZmKind;
|
|
38
|
+
/** signed: a later reduction of the base is negative */
|
|
39
|
+
baseCents: TCents;
|
|
40
|
+
}
|
|
41
|
+
/** One line of the report: the recipient, the kind, the summed base in euro cents */
|
|
42
|
+
export interface IZmLine {
|
|
43
|
+
vatId: string;
|
|
44
|
+
kind: TZmKind;
|
|
45
|
+
baseCents: TCents;
|
|
46
|
+
}
|
|
47
|
+
export interface IZmCsv {
|
|
48
|
+
text: string;
|
|
49
|
+
/** the text as UTF-8, as the import requires */
|
|
50
|
+
bytes: Uint8Array;
|
|
51
|
+
lineCount: number;
|
|
52
|
+
}
|
|
53
|
+
/** The country codes the ZM takes (ELSTER, "Liste der Länderkennzeichen"); `GB` only for periods before 2021, so not here. */
|
|
54
|
+
export declare const ZM_COUNTRY_CODES: readonly string[];
|
|
55
|
+
export declare const ZM_MAX_LINES = 1500;
|
|
56
|
+
/** The CSV version lines and the field names, as the form's example gives them. */
|
|
57
|
+
export declare const ZM_CSV_HEAD: readonly string[];
|
|
58
|
+
/**
|
|
59
|
+
* How a sum with cents becomes the whole euros the CSV's "Summe (Euro)"
|
|
60
|
+
* takes. No source read states it (ELSTER: "eine ganze Zahl"; ELMA5: "in Euro
|
|
61
|
+
* ohne Cent"; the paper form: "volle EUR | Ct"). The cents are dropped toward
|
|
62
|
+
* zero, as the UStVA drops those of its bases ("in vollen Euro (ohne
|
|
63
|
+
* Centbeträge)", Anleitung zur Umsatzsteuer-Voranmeldung 2026), so that the
|
|
64
|
+
* ZM and the UStVA's Kz 41 and Kz 21, which the BZSt compares, are cut alike.
|
|
65
|
+
* This is a recorded decision of 2026-09-27, pending the tax advisor's
|
|
66
|
+
* confirmation; it is not a rule a source states.
|
|
67
|
+
*/
|
|
68
|
+
export declare const ZM_EUROS_RULE = "the cents of each line's sum are dropped toward zero, as the UStVA drops those of its bases (a recorded decision of 2026-09-27, pending the tax advisor's confirmation; no source states the rule)";
|
|
69
|
+
/**
|
|
70
|
+
* The whole euros of a sum in cents, as the CSV's "Summe (Euro)" takes them:
|
|
71
|
+
* the cents dropped toward zero (`ZM_EUROS_RULE`), so 2 000,50 € is 2000 and
|
|
72
|
+
* -2 000,50 € is -2000. At most 11 digits (N(11)).
|
|
73
|
+
*/
|
|
74
|
+
export declare function zmEurosOf(centsArg: TCents): number;
|
|
75
|
+
/**
|
|
76
|
+
* A recipient's VAT ID as the form takes it: upper case, without spaces, the
|
|
77
|
+
* country code first (`GR` written `EL`, as the list has it); 7 to 14
|
|
78
|
+
* characters of letters, digits, `+` and `*`; a country code of the list.
|
|
79
|
+
*/
|
|
80
|
+
export declare function normalizeZmVatId(valueArg: string): string;
|
|
81
|
+
/** The lines of a period: one per recipient VAT ID and kind, in the order they first appear, the bases summed. */
|
|
82
|
+
export declare function aggregateZmLines(suppliesArg: readonly IZmSupplyInput[]): IZmLine[];
|
|
83
|
+
/**
|
|
84
|
+
* The CSV of one report. An original report leaves out a line that nets to
|
|
85
|
+
* zero and refuses to be written with no line left (no "Nullmeldung"); a
|
|
86
|
+
* correction keeps a `0` line, which stornos what was reported under it.
|
|
87
|
+
* Each line's sum is cut to whole euros by `zmEurosOf`. Refused beyond 1 500
|
|
88
|
+
* lines.
|
|
89
|
+
*/
|
|
90
|
+
export declare function writeZmCsv(linesArg: readonly IZmLine[], optionsArg: {
|
|
91
|
+
purpose: 'original' | 'correction';
|
|
92
|
+
}): IZmCsv;
|
package/dist_ts/zm.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/** The country codes the ZM takes (ELSTER, "Liste der Länderkennzeichen"); `GB` only for periods before 2021, so not here. */
|
|
2
|
+
export const ZM_COUNTRY_CODES = [
|
|
3
|
+
'AT', 'BE', 'BG', 'CY', 'CZ', 'DK', 'EE', 'EL', 'ES', 'FI', 'FR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK', 'XI',
|
|
4
|
+
];
|
|
5
|
+
export const ZM_MAX_LINES = 1500;
|
|
6
|
+
/** The CSV version lines and the field names, as the form's example gives them. */
|
|
7
|
+
export const ZM_CSV_HEAD = [
|
|
8
|
+
'#v3.0',
|
|
9
|
+
'#ve3.2.1',
|
|
10
|
+
'Umsatzsteuer-Identifikationsnummer (USt-IdNr.),Summe (Euro),Art der Leistung',
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* How a sum with cents becomes the whole euros the CSV's "Summe (Euro)"
|
|
14
|
+
* takes. No source read states it (ELSTER: "eine ganze Zahl"; ELMA5: "in Euro
|
|
15
|
+
* ohne Cent"; the paper form: "volle EUR | Ct"). The cents are dropped toward
|
|
16
|
+
* zero, as the UStVA drops those of its bases ("in vollen Euro (ohne
|
|
17
|
+
* Centbeträge)", Anleitung zur Umsatzsteuer-Voranmeldung 2026), so that the
|
|
18
|
+
* ZM and the UStVA's Kz 41 and Kz 21, which the BZSt compares, are cut alike.
|
|
19
|
+
* This is a recorded decision of 2026-09-27, pending the tax advisor's
|
|
20
|
+
* confirmation; it is not a rule a source states.
|
|
21
|
+
*/
|
|
22
|
+
export const ZM_EUROS_RULE = 'the cents of each line\'s sum are dropped toward zero, as the UStVA drops those of its bases (a recorded decision of 2026-09-27, pending the tax advisor\'s confirmation; no source states the rule)';
|
|
23
|
+
/**
|
|
24
|
+
* The whole euros of a sum in cents, as the CSV's "Summe (Euro)" takes them:
|
|
25
|
+
* the cents dropped toward zero (`ZM_EUROS_RULE`), so 2 000,50 € is 2000 and
|
|
26
|
+
* -2 000,50 € is -2000. At most 11 digits (N(11)).
|
|
27
|
+
*/
|
|
28
|
+
export function zmEurosOf(centsArg) {
|
|
29
|
+
if (!Number.isSafeInteger(centsArg)) {
|
|
30
|
+
throw new Error(`the ZM sum must be an integer number of cents, got ${centsArg}`);
|
|
31
|
+
}
|
|
32
|
+
// Math.trunc of a small negative sum is -0, which is written "0"; `+ 0` makes it a plain 0
|
|
33
|
+
const euros = Math.trunc(centsArg / 100) + 0;
|
|
34
|
+
if (String(Math.abs(euros)).length > 11) {
|
|
35
|
+
throw new Error(`the ZM sum has at most 11 digits (N(11)), got ${euros} euros`);
|
|
36
|
+
}
|
|
37
|
+
return euros;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* A recipient's VAT ID as the form takes it: upper case, without spaces, the
|
|
41
|
+
* country code first (`GR` written `EL`, as the list has it); 7 to 14
|
|
42
|
+
* characters of letters, digits, `+` and `*`; a country code of the list.
|
|
43
|
+
*/
|
|
44
|
+
export function normalizeZmVatId(valueArg) {
|
|
45
|
+
let id = String(valueArg ?? '').replace(/\s+/g, '').toUpperCase();
|
|
46
|
+
if (id.startsWith('GR')) {
|
|
47
|
+
id = `EL${id.slice(2)}`;
|
|
48
|
+
}
|
|
49
|
+
if (id.length < 7 || id.length > 14) {
|
|
50
|
+
throw new Error(`a ZM VAT ID has 7 to 14 characters, got '${id}'`);
|
|
51
|
+
}
|
|
52
|
+
if (!/^[A-Z]{2}[A-Z0-9+*]+$/.test(id)) {
|
|
53
|
+
throw new Error(`a ZM VAT ID has a country code and then letters, digits, + or *, got '${id}'`);
|
|
54
|
+
}
|
|
55
|
+
if (!ZM_COUNTRY_CODES.includes(id.slice(0, 2))) {
|
|
56
|
+
throw new Error(`'${id.slice(0, 2)}' is no country code the ZM takes (another member state's, or XI)`);
|
|
57
|
+
}
|
|
58
|
+
return id;
|
|
59
|
+
}
|
|
60
|
+
/** The lines of a period: one per recipient VAT ID and kind, in the order they first appear, the bases summed. */
|
|
61
|
+
export function aggregateZmLines(suppliesArg) {
|
|
62
|
+
const lines = new Map();
|
|
63
|
+
for (const supply of suppliesArg) {
|
|
64
|
+
if (supply.kind !== 'L' && supply.kind !== 'S' && supply.kind !== 'D') {
|
|
65
|
+
throw new Error(`a ZM kind is L, S or D, got '${String(supply.kind)}'`);
|
|
66
|
+
}
|
|
67
|
+
if (!Number.isSafeInteger(supply.baseCents)) {
|
|
68
|
+
throw new Error(`a ZM base must be an integer number of cents, got ${supply.baseCents}`);
|
|
69
|
+
}
|
|
70
|
+
const vatId = normalizeZmVatId(supply.vatId);
|
|
71
|
+
if (vatId.startsWith('XI') && supply.kind === 'S') {
|
|
72
|
+
throw new Error(`'${vatId}' is a recipient in Northern Ireland, which is Community territory for goods only: a service to it follows the rules for the third-country territory and is not reported in the ZM (BZSt, Zusammenfassende Meldung - Fragen und Antworten, Brexit)`);
|
|
73
|
+
}
|
|
74
|
+
const key = `${vatId}|${supply.kind}`;
|
|
75
|
+
const line = lines.get(key) ?? { vatId, kind: supply.kind, baseCents: 0 };
|
|
76
|
+
line.baseCents += supply.baseCents;
|
|
77
|
+
lines.set(key, line);
|
|
78
|
+
}
|
|
79
|
+
return [...lines.values()];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The CSV of one report. An original report leaves out a line that nets to
|
|
83
|
+
* zero and refuses to be written with no line left (no "Nullmeldung"); a
|
|
84
|
+
* correction keeps a `0` line, which stornos what was reported under it.
|
|
85
|
+
* Each line's sum is cut to whole euros by `zmEurosOf`. Refused beyond 1 500
|
|
86
|
+
* lines.
|
|
87
|
+
*/
|
|
88
|
+
export function writeZmCsv(linesArg, optionsArg) {
|
|
89
|
+
const lines = aggregateZmLines(linesArg).filter((lineArg) => optionsArg.purpose === 'correction' || lineArg.baseCents !== 0);
|
|
90
|
+
if (lines.length === 0) {
|
|
91
|
+
throw new Error('a ZM with no line is no report: "Nullmeldungen" are not given (BZSt Anleitung III.1)');
|
|
92
|
+
}
|
|
93
|
+
if (lines.length > ZM_MAX_LINES) {
|
|
94
|
+
throw new Error(`the ZM online form imports at most ${ZM_MAX_LINES} lines, got ${lines.length}`);
|
|
95
|
+
}
|
|
96
|
+
const rows = lines.map((lineArg) => `${lineArg.vatId},${zmEurosOf(lineArg.baseCents)},${lineArg.kind}`);
|
|
97
|
+
const text = [...ZM_CSV_HEAD, ...rows].join('\n') + '\n';
|
|
98
|
+
return { text, bytes: new TextEncoder().encode(text), lineCount: rows.length };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy96bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF5REEsOEhBQThIO0FBQzlILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFzQjtJQUNqRCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7Q0FDakssQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFFakMsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBc0I7SUFDNUMsT0FBTztJQUNQLFVBQVU7SUFDViw4RUFBOEU7Q0FDL0UsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FDeEIsc01BQXNNLENBQUM7QUFFek07Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsUUFBZ0I7SUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFDRCwyRkFBMkY7SUFDM0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFH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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fin.cx/tax",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.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,12 +29,12 @@
|
|
|
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.4.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@git.zone/tsbuild": "^5.0.0",
|
|
36
|
-
"@git.zone/tsrun": "^3.0.
|
|
37
|
-
"@git.zone/tstest": "^6.3.
|
|
36
|
+
"@git.zone/tsrun": "^3.0.1",
|
|
37
|
+
"@git.zone/tstest": "^6.3.2",
|
|
38
38
|
"@types/node": "^26.6.2"
|
|
39
39
|
},
|
|
40
40
|
"files": [
|
package/readme.md
CHANGED
|
@@ -12,7 +12,7 @@ pnpm install @fin.cx/tax
|
|
|
12
12
|
|
|
13
13
|
`computeUstva()` turns one period's account movements into the UStVA figures:
|
|
14
14
|
|
|
15
|
-
- **Account→Kennzahl mapping** comes from [@fin.cx/chartdata](https://code.foss.global/fin.cx/chartdata) (SKR03/SKR04, year-versioned). Revenue accounts feed the Bemessungsgrundlagen (Kz 81, 86, 41, 43, 48, 60); Vorsteuer accounts feed the tax fields (Kz 66, 61, 67, 62) cent-exact.
|
|
15
|
+
- **Account→Kennzahl mapping** comes from [@fin.cx/chartdata](https://code.foss.global/fin.cx/chartdata) (SKR03/SKR04, year-versioned). Revenue accounts feed the Bemessungsgrundlagen (Kz 81, 86, 87, 41, 43, 48, 60, 21, 45); Vorsteuer accounts feed the tax fields (Kz 66, 61, 67, 62) cent-exact. `USTVA_KENNZAHL_ORDER` lists the fields in the order of the UStVA 2026 form, with their labels in `USTVA_KENNZAHL_LABELS`; a Kennzahl the chart data maps that has no place there is a filing issue, never dropped.
|
|
16
16
|
- **Form rounding is applied correctly**: Bemessungsgrundlagen are declared in full euros with cents truncated toward zero — on the *period sum per Kennzahl*, not per booking. Tax amounts stay cent-exact. Output tax on domestic and igE bases is what the form computes from the truncated bases (`base EUR × 19` is an exact integer number of cents).
|
|
17
17
|
- **Output-VAT accounts** (`VAT_ACCOUNTS`, overridable per call with `vatAccounts`) follow the DATEV Kontenrahmen 2026:
|
|
18
18
|
|
|
@@ -67,6 +67,18 @@ This module aggregates whatever movements you pass in — it does not decide *wh
|
|
|
67
67
|
|
|
68
68
|
Set `taxationMethod` so the result records which mode the figures represent. If you are unsure which regime applies to your company, resolve that before filing — it materially changes the period selection.
|
|
69
69
|
|
|
70
|
+
## Zusammenfassende Meldung (§ 18a UStG)
|
|
71
|
+
|
|
72
|
+
`aggregateZmLines(supplies)` sums a period's intra-Community supplies (`L`), § 3a Abs. 2 services (`S`) and triangular trade (`D`) per recipient VAT ID and kind, a later change of the base netted in; a service to a Northern Irish VAT ID (`XI`) is refused, since Northern Ireland is Community territory for goods only (BZSt ZM FAQ, Brexit). `writeZmCsv(lines, { purpose })` writes the CSV that the ZM online form in ELSTER (or the BZSt-Online-Portal) imports: CSV version 3.0, UTF-8, `#v3.0`, `#ve3.2.1`, the field names, then one line per recipient and kind, at most 1 500 lines. An original report leaves out lines that net to zero and refuses to be empty (no "Nullmeldung"); a correction keeps `0` lines, which storno what was reported. `normalizeZmVatId` takes a VAT ID as the form does (`GR` as `EL`, no spaces, a country code of the list). Transmission stays with the person: § 18a requires it authenticated.
|
|
73
|
+
|
|
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
|
+
|
|
76
|
+
## German VAT rates, dated
|
|
77
|
+
|
|
78
|
+
`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.
|
|
79
|
+
|
|
80
|
+
`GERMAN_VAT_RATE_CONCESSIONS` and `germanVatRateConcessionsOn(day)` hold what the BMF letters of 30 June 2020 and 4 November 2020 say about the rates around the changes of 2020 and 2021, each with its GZ, Rz., the supplies it covers and its standing: `required` where the letter says the rate is to be applied (Beherbergungen in the night of 30 June 2020, Rz. 22 of 4 November 2020), `accepted` where it allows it or does not object (Bewirtung in that night, Rz. 44; 19 % / 7 % on supplies to entrepreneurs in July 2020 with the deduction of the stated tax, Rz. 46; 16 % / 5 % in the night of 31 December 2020, Rz. 22). Whether a supply is one they cover is the caller's fact. No letter on the § 24 changes of 2022 to 2025 was found.
|
|
81
|
+
|
|
70
82
|
## Scope
|
|
71
83
|
|
|
72
84
|
Transport to ELSTER is deliberately out of scope — this package computes figures; `@fin.cx/elster` (ERiC bridge) files them. KSt/GewSt/year-end tax computation will land here as further modules.
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/index.ts
CHANGED
package/ts/rates.ts
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rates of German VAT, dated: which rates German law sets for a supply
|
|
3
|
+
* carried out on a day, and the transition rules the administration granted
|
|
4
|
+
* around the rate changes of 2020 and 2021. The rate in force when the supply
|
|
5
|
+
* is carried out applies (§ 27 Abs. 1 Satz 1 UStG).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** A rate German law sets for a supply, and the days it applies to: from `from`, until `to` inclusive when it ended. */
|
|
9
|
+
export interface IGermanVatRate {
|
|
10
|
+
ratePercent: number;
|
|
11
|
+
/** `YYYY-MM-DD` */
|
|
12
|
+
from: string;
|
|
13
|
+
/** `YYYY-MM-DD`, inclusive; absent while the rate is in force */
|
|
14
|
+
to?: string;
|
|
15
|
+
/** the rate this is: the general rate, the reduced rate, the 0 % of § 12 Abs. 3 UStG, or an average rate of § 24 Abs. 1 Satz 1 UStG by its number */
|
|
16
|
+
provision: 'general' | 'reduced' | 'zero' | 'average_nr1' | 'average_nr2' | 'average_nr3';
|
|
17
|
+
/** the provision that sets the rate for these days, and the act that set it */
|
|
18
|
+
basis: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const GENERAL = '§ 12 Abs. 1 UStG (Art. 4 Nr. 1 Haushaltsbegleitgesetz 2006, BGBl. I S. 1402)';
|
|
22
|
+
const REDUCED = '§ 12 Abs. 2 UStG';
|
|
23
|
+
const TEMPORARY = '§ 28 Abs. 1, 2 UStG (Art. 3 Zweites Corona-Steuerhilfegesetz, BGBl. I 2020 S. 1512)';
|
|
24
|
+
const SPECIAL_AVERAGE = '§ 24 Abs. 1 Satz 1 Nr. 2 UStG';
|
|
25
|
+
const FORESTRY = '§ 24 Abs. 1 Satz 1 Nr. 1 UStG (Art. 4 Nr. 2 Buchst. a Doppelbuchst. aa Haushaltsbegleitgesetz 2006)';
|
|
26
|
+
const AVERAGE_OTHER = '§ 24 Abs. 1 Satz 1 Nr. 3 UStG';
|
|
27
|
+
const ZERO = '§ 12 Abs. 3 UStG (Art. 16 Nr. 5 Jahressteuergesetz 2022 vom 16.12.2022, BGBl. I S. 2294, in force 2023-01-01 by its Art. 43)';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The rates of German VAT, dated. The table begins on 2007-01-01.
|
|
31
|
+
* - The general rate, 19 % (§ 12 Abs. 1 UStG, since Art. 4 Nr. 1
|
|
32
|
+
* Haushaltsbegleitgesetz 2006, BGBl. I S. 1402, from 2007-01-01), and the
|
|
33
|
+
* reduced rate, 7 % (§ 12 Abs. 2 UStG). From 2020-07-01 to 2020-12-31, 16 %
|
|
34
|
+
* and 5 % in their place (§ 28 Abs. 1, 2 UStG, Art. 3 Zweites
|
|
35
|
+
* Corona-Steuerhilfegesetz, BGBl. I 2020 S. 1512).
|
|
36
|
+
* - § 24 Abs. 1 Satz 1 Nr. 2 UStG (Sägewerkserzeugnisse, Getränke and
|
|
37
|
+
* alkoholische Flüssigkeiten of a farmer or forester taxed by average
|
|
38
|
+
* rates): 19 %, the rate it states as read on gesetze-im-internet.de on
|
|
39
|
+
* 2026-09-27; 16 % from 2020-07-01 to 2020-12-31 (§ 24 Abs. 1 Satz 1 Nr. 2
|
|
40
|
+
* i. V. m. § 28 Abs. 3 UStG, Art. 3 Zweites Corona-Steuerhilfegesetz, BGBl. I
|
|
41
|
+
* 2020 S. 1512, as the BMF letter of 30 June 2020, Rz. 1, cites it; the act's
|
|
42
|
+
* own text was not read). That 19 % applied from 2007-01-01 is not verified
|
|
43
|
+
* from the amending act: the table starts it there with the general rate.
|
|
44
|
+
* - The average rates of § 24 Abs. 1 Satz 1 UStG, at which a farmer or
|
|
45
|
+
* forester taxed by them charges VAT on the invoice; the recipient deducts
|
|
46
|
+
* it as input tax (§ 15 Abs. 1 Satz 1 Nr. 1 UStG). Each from the amending
|
|
47
|
+
* act's text:
|
|
48
|
+
* - Nr. 1, forestry products: 5,5 % from 2007-01-01 (Art. 4 Nr. 2
|
|
49
|
+
* Buchst. a Doppelbuchst. aa Haushaltsbegleitgesetz 2006, "5 Prozent"
|
|
50
|
+
* replaced by "5,5 Prozent"); unchanged since.
|
|
51
|
+
* - Nr. 3, the other supplies: 10,7 % from 2007-01-01 (the same, Doppelbuchst.
|
|
52
|
+
* cc, "9 Prozent" by "10,7 Prozent"); 9,5 % from 2022-01-01 (Art. 1 Nr. 5
|
|
53
|
+
* Gesetz zur Umsetzung unionsrechtlicher Vorgaben im Umsatzsteuerrecht of
|
|
54
|
+
* 21.12.2021, BGBl. I S. 5250); 9,0 % from 2023-01-01 (Art. 12 Nr. 3 Achtes
|
|
55
|
+
* Gesetz zur Änderung von Verbrauchsteuergesetzen of 24.10.2022, BGBl. I
|
|
56
|
+
* S. 1838); 8,4 % from 2024-12-06 (Art. 24 Nr. 13 Jahressteuergesetz 2024
|
|
57
|
+
* of 02.12.2024, BGBl. 2024 I Nr. 387, in force the day after its
|
|
58
|
+
* promulgation on 2024-12-05, Art. 56 Abs. 1); 7,8 % from 2025-01-01
|
|
59
|
+
* (Art. 25 Nr. 21 of the same, Art. 56 Abs. 7), the rate § 24 Abs. 1 Satz 1
|
|
60
|
+
* Nr. 3 UStG states as read on gesetze-im-internet.de on 2026-09-25.
|
|
61
|
+
* - 0 % for the supplies of § 12 Abs. 3 UStG (photovoltaic installations:
|
|
62
|
+
* the modules and components delivered to their operator, their
|
|
63
|
+
* intra-Community acquisition, import and installation) from 2023-01-01
|
|
64
|
+
* (Art. 16 Nr. 5 Jahressteuergesetz 2022 of 16.12.2022, BGBl. I S. 2294,
|
|
65
|
+
* in force on 2023-01-01 by its Art. 43; the amending text as read on
|
|
66
|
+
* buzer.de on 2026-09-28, § 12 Abs. 3 as read on gesetze-im-internet.de).
|
|
67
|
+
*/
|
|
68
|
+
export const GERMAN_VAT_RATES: readonly IGermanVatRate[] = [
|
|
69
|
+
{ ratePercent: 19, from: '2007-01-01', to: '2020-06-30', provision: 'general', basis: GENERAL },
|
|
70
|
+
{ ratePercent: 19, from: '2021-01-01', provision: 'general', basis: GENERAL },
|
|
71
|
+
{ ratePercent: 7, from: '2007-01-01', to: '2020-06-30', provision: 'reduced', basis: REDUCED },
|
|
72
|
+
{ ratePercent: 7, from: '2021-01-01', provision: 'reduced', basis: REDUCED },
|
|
73
|
+
{ ratePercent: 0, from: '2023-01-01', provision: 'zero', basis: ZERO },
|
|
74
|
+
{ ratePercent: 16, from: '2020-07-01', to: '2020-12-31', provision: 'general', basis: `${TEMPORARY}, in place of the rate of § 12 Abs. 1 UStG` },
|
|
75
|
+
{ ratePercent: 5, from: '2020-07-01', to: '2020-12-31', provision: 'reduced', basis: `${TEMPORARY}, in place of the rate of § 12 Abs. 2 UStG` },
|
|
76
|
+
{ ratePercent: 19, from: '2007-01-01', to: '2020-06-30', provision: 'average_nr2', basis: `${SPECIAL_AVERAGE} (the act that set 19 % from 2007-01-01 not verified)` },
|
|
77
|
+
{ ratePercent: 19, from: '2021-01-01', provision: 'average_nr2', basis: `${SPECIAL_AVERAGE} (19 % as read on gesetze-im-internet.de, 2026-09-27)` },
|
|
78
|
+
{ ratePercent: 16, from: '2020-07-01', to: '2020-12-31', provision: 'average_nr2', basis: `${SPECIAL_AVERAGE} i. V. m. § 28 Abs. 3 UStG (Art. 3 Zweites Corona-Steuerhilfegesetz, BGBl. I 2020 S. 1512, as cited by BMF 30.06.2020 Rz. 1)` },
|
|
79
|
+
{ ratePercent: 5.5, from: '2007-01-01', provision: 'average_nr1', basis: FORESTRY },
|
|
80
|
+
{ ratePercent: 10.7, from: '2007-01-01', to: '2021-12-31', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 4 Nr. 2 Buchst. a Doppelbuchst. cc Haushaltsbegleitgesetz 2006)` },
|
|
81
|
+
{ ratePercent: 9.5, from: '2022-01-01', to: '2022-12-31', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 1 Nr. 5 Gesetz zur Umsetzung unionsrechtlicher Vorgaben im Umsatzsteuerrecht, BGBl. I 2021 S. 5250)` },
|
|
82
|
+
{ ratePercent: 9, from: '2023-01-01', to: '2024-12-05', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 12 Nr. 3 Achtes Gesetz zur Änderung von Verbrauchsteuergesetzen, BGBl. I 2022 S. 1838)` },
|
|
83
|
+
{ ratePercent: 8.4, from: '2024-12-06', to: '2024-12-31', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 24 Nr. 13 Jahressteuergesetz 2024, BGBl. 2024 I Nr. 387)` },
|
|
84
|
+
{ ratePercent: 7.8, from: '2025-01-01', provision: 'average_nr3', basis: `${AVERAGE_OTHER} (Art. 25 Nr. 21 Jahressteuergesetz 2024, BGBl. 2024 I Nr. 387)` },
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
const TABLE_BEGINS = '2007-01-01';
|
|
88
|
+
|
|
89
|
+
const assertDay = (dayArg: string): void => {
|
|
90
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(dayArg);
|
|
91
|
+
const date = match ? new Date(Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]))) : undefined;
|
|
92
|
+
if (!date || date.toISOString().slice(0, 10) !== dayArg) {
|
|
93
|
+
throw new Error(`a day of supply is written YYYY-MM-DD, got '${dayArg}'`);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The rates of German VAT for a supply carried out on a day (`YYYY-MM-DD`),
|
|
99
|
+
* each once, in the order of `GERMAN_VAT_RATES`. `undefined` for a day before
|
|
100
|
+
* the table begins (2007-01-01): the table holds no law for it.
|
|
101
|
+
*/
|
|
102
|
+
export function germanVatRatesOn(dayArg: string): readonly number[] | undefined {
|
|
103
|
+
assertDay(dayArg);
|
|
104
|
+
if (dayArg < TABLE_BEGINS) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
return [...new Set(GERMAN_VAT_RATES
|
|
108
|
+
.filter((rateArg) => rateArg.from <= dayArg && (rateArg.to === undefined || dayArg <= rateArg.to))
|
|
109
|
+
.map((rateArg) => rateArg.ratePercent))];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* A rate the administration names for some supplies of some days around a
|
|
114
|
+
* change of the rates, with its source and the supplies it covers. Whether a
|
|
115
|
+
* supply is one of them is a fact the caller states; this table cannot tell.
|
|
116
|
+
*/
|
|
117
|
+
export interface IGermanVatRateConcession {
|
|
118
|
+
ratePercent: number;
|
|
119
|
+
/**
|
|
120
|
+
* `required`: the letter says the rate is to be applied ("sind … anzuwenden");
|
|
121
|
+
* `accepted`: the letter allows it or does not object to it ("wird
|
|
122
|
+
* zugelassen", "wird nicht beanstandet"), and the law's rate of the day may be
|
|
123
|
+
* applied as well.
|
|
124
|
+
*/
|
|
125
|
+
standing: 'required' | 'accepted';
|
|
126
|
+
/** `YYYY-MM-DD` */
|
|
127
|
+
from: string;
|
|
128
|
+
/** `YYYY-MM-DD`, inclusive */
|
|
129
|
+
to: string;
|
|
130
|
+
/** the BMF letter, its GZ and its Rz. */
|
|
131
|
+
source: string;
|
|
132
|
+
/** the supplies it covers, and what it allows */
|
|
133
|
+
covers: string;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const BMF_2020_06_30 = 'BMF-Schreiben vom 30. Juni 2020, III C 2 - S 7030/20/10009 :004, BStBl I S. 584';
|
|
137
|
+
const BMF_2020_11_04 = 'BMF-Schreiben vom 4. November 2020, III C 2 - S 7030/20/10009 :016';
|
|
138
|
+
const NIGHT_2020_06_30_BEWIRTUNG = 'Bewirtungsleistungen (food and drink for consumption on the spot, tobacco and the like) in the night of 30 June to 1 July 2020, at the rates in force from 1 July 2020 ("wird zugelassen")';
|
|
139
|
+
const NIGHT_2020_06_30_BEHERBERGUNG = 'Beherbergungen and the services that go with them in the night of 30 June to 1 July 2020, at the rates in force from 1 July 2020 ("sind … anzuwenden"; the letter of 30 June 2020, Rz. 44, had left them out)';
|
|
140
|
+
const JULY_2020 = '("wird es … nicht beanstandet") a supply to an entrepreneur carried out in July 2020 whose invoice states the rate in force before 1 July 2020 and whose supplier paid that tax: the invoice need not be corrected, and a recipient entitled to deduct input tax deducts the tax as stated (for § 13b supplies, the tax the recipient computed)';
|
|
141
|
+
const NIGHT_2020_12_31 = 'Bewirtungsleistungen, and Beherbergungen with the services that go with them, in the night of 31 December 2020 to 1 January 2021, at the rates of 16 and 5 percent ("wird zugelassen")';
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The transition rules of the administration around the rate changes of
|
|
145
|
+
* 1 July 2020 and 1 January 2021, each read in the letter itself (the copies of
|
|
146
|
+
* 8 July 2020 and 5 November 2020 in the Internet Archive of the PDFs on
|
|
147
|
+
* bundesfinanzministerium.de, read 2026-09-27):
|
|
148
|
+
* - Rz. 44 of the letter of 30 June 2020 allows the new rates on
|
|
149
|
+
* Bewirtungsleistungen in the night of 30 June to 1 July 2020 (accepted), and
|
|
150
|
+
* Rz. 22 of the letter of 4 November 2020 requires them on Beherbergungen of
|
|
151
|
+
* that night (required), which Rz. 44 had left out.
|
|
152
|
+
* - Rz. 46 of the letter of 30 June 2020 accepts the old rates, 19 and
|
|
153
|
+
* 7 percent, on supplies to entrepreneurs in July 2020, with the input tax
|
|
154
|
+
* deduction of the stated tax.
|
|
155
|
+
* - Rz. 22 of the letter of 4 November 2020 allows 16 and 5 percent on
|
|
156
|
+
* Bewirtungsleistungen and Beherbergungen in the night of 31 December 2020
|
|
157
|
+
* to 1 January 2021.
|
|
158
|
+
* Not here: Rz. 47 of the letter of 30 June 2020 applies its rules "entsprechend"
|
|
159
|
+
* to the rise on 1 January 2021; the letters grant no deduction of 16 or
|
|
160
|
+
* 5 percent stated on a supply of January 2021 beyond the night above, except
|
|
161
|
+
* for advance payment invoices issued before 2021 (4 November 2020, Rz. 1 and
|
|
162
|
+
* 2), whose case needs the invoice's date. No letter on the § 24 changes of
|
|
163
|
+
* 2022, 2023, 2024-12-06 and 2025 was found.
|
|
164
|
+
*/
|
|
165
|
+
export const GERMAN_VAT_RATE_CONCESSIONS: readonly IGermanVatRateConcession[] = [
|
|
166
|
+
{ ratePercent: 16, standing: 'accepted', from: '2020-06-30', to: '2020-06-30', source: `${BMF_2020_06_30}, Rz. 44; ${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_06_30_BEWIRTUNG },
|
|
167
|
+
{ ratePercent: 5, standing: 'accepted', from: '2020-06-30', to: '2020-06-30', source: `${BMF_2020_06_30}, Rz. 44; ${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_06_30_BEWIRTUNG },
|
|
168
|
+
{ ratePercent: 16, standing: 'required', from: '2020-06-30', to: '2020-06-30', source: `${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_06_30_BEHERBERGUNG },
|
|
169
|
+
{ ratePercent: 5, standing: 'required', from: '2020-06-30', to: '2020-06-30', source: `${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_06_30_BEHERBERGUNG },
|
|
170
|
+
{ ratePercent: 19, standing: 'accepted', from: '2020-07-01', to: '2020-07-31', source: `${BMF_2020_06_30}, Rz. 46`, covers: JULY_2020 },
|
|
171
|
+
{ ratePercent: 7, standing: 'accepted', from: '2020-07-01', to: '2020-07-31', source: `${BMF_2020_06_30}, Rz. 46`, covers: JULY_2020 },
|
|
172
|
+
{ ratePercent: 16, standing: 'accepted', from: '2021-01-01', to: '2021-01-01', source: `${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_12_31 },
|
|
173
|
+
{ ratePercent: 5, standing: 'accepted', from: '2021-01-01', to: '2021-01-01', source: `${BMF_2020_11_04}, Rz. 22`, covers: NIGHT_2020_12_31 },
|
|
174
|
+
];
|
|
175
|
+
|
|
176
|
+
/** The transition rules that cover a day of supply (`YYYY-MM-DD`), in the order of `GERMAN_VAT_RATE_CONCESSIONS`. */
|
|
177
|
+
export function germanVatRateConcessionsOn(dayArg: string): readonly IGermanVatRateConcession[] {
|
|
178
|
+
assertDay(dayArg);
|
|
179
|
+
return GERMAN_VAT_RATE_CONCESSIONS.filter((entryArg) => entryArg.from <= dayArg && dayArg <= entryArg.to);
|
|
180
|
+
}
|
package/ts/ustva.ts
CHANGED
|
@@ -29,9 +29,15 @@ import type {
|
|
|
29
29
|
TKennzahlKind,
|
|
30
30
|
} from './ustva.types.js';
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
/**
|
|
33
|
+
* The labels of the Kennzahlen this module fills. Kz 21, 45 and 87 carry the
|
|
34
|
+
* titles of their fields in ELSTER's "Anleitung zur UStVA 2026" (read
|
|
35
|
+
* 2026-09-25).
|
|
36
|
+
*/
|
|
37
|
+
export const USTVA_KENNZAHL_LABELS: Readonly<Record<number, string>> = {
|
|
33
38
|
81: 'Steuerpflichtige Umsätze 19 %',
|
|
34
39
|
86: 'Steuerpflichtige Umsätze 7 %',
|
|
40
|
+
87: 'Steuerpflichtige Lieferungen und sonstige Leistungen (0 %)',
|
|
35
41
|
89: 'Innergemeinschaftliche Erwerbe 19 %',
|
|
36
42
|
93: 'Innergemeinschaftliche Erwerbe 7 %',
|
|
37
43
|
41: 'Steuerfreie innergemeinschaftliche Lieferungen',
|
|
@@ -42,6 +48,8 @@ const KENNZAHL_LABELS: Record<number, string> = {
|
|
|
42
48
|
84: 'Andere Leistungen eines im Ausland ansässigen Unternehmers (§13b)',
|
|
43
49
|
85: 'Steuer zu Kennzahl 84',
|
|
44
50
|
60: 'Steuerpflichtige Umsätze, für die der Leistungsempfänger die Steuer schuldet (§13b)',
|
|
51
|
+
21: 'Sonstige Leistungen im übrigen Gemeinschaftsgebiet',
|
|
52
|
+
45: 'Übrige nicht steuerbare Umsätze (Leistungsort nicht im Inland)',
|
|
45
53
|
66: 'Vorsteuer aus Rechnungen anderer Unternehmer',
|
|
46
54
|
61: 'Vorsteuer aus innergemeinschaftlichem Erwerb',
|
|
47
55
|
62: 'Entrichtete Einfuhrumsatzsteuer',
|
|
@@ -50,8 +58,17 @@ const KENNZAHL_LABELS: Record<number, string> = {
|
|
|
50
58
|
83: 'Verbleibende Umsatzsteuer-Vorauszahlung / Überschuss',
|
|
51
59
|
};
|
|
52
60
|
|
|
53
|
-
/**
|
|
54
|
-
|
|
61
|
+
/**
|
|
62
|
+
* The Kennzahlen this module fills, in the order of the UStVA 2026 form
|
|
63
|
+
* (ELSTER, "Anleitung zur UStVA 2026"): taxable supplies (81, 86, 87), tax-free
|
|
64
|
+
* 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),
|
|
66
|
+
* services in the rest of the Community (21), other non-taxable turnover (45),
|
|
67
|
+
* input tax (66, 61, 62, 67), the Sondervorauszahlung (39) and the result (83).
|
|
68
|
+
* A Kennzahl computed but not listed here is reported as an issue, never
|
|
69
|
+
* dropped.
|
|
70
|
+
*/
|
|
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];
|
|
55
72
|
|
|
56
73
|
/** full euros, cents truncated toward zero (form rule for bases) */
|
|
57
74
|
function truncateToEur(cents: TCents): number {
|
|
@@ -242,7 +259,7 @@ export function computeUstva(input: IUstvaInput): IUstvaResult {
|
|
|
242
259
|
kennzahl,
|
|
243
260
|
kind,
|
|
244
261
|
value,
|
|
245
|
-
label:
|
|
262
|
+
label: USTVA_KENNZAHL_LABELS[kennzahl] ?? `Kennzahl ${kennzahl}`,
|
|
246
263
|
accounts,
|
|
247
264
|
});
|
|
248
265
|
};
|
|
@@ -303,9 +320,17 @@ export function computeUstva(input: IUstvaInput): IUstvaResult {
|
|
|
303
320
|
);
|
|
304
321
|
}
|
|
305
322
|
|
|
306
|
-
const kennzahlen =
|
|
323
|
+
const kennzahlen = USTVA_KENNZAHL_ORDER.filter((kennzahl) => values.has(kennzahl)).map(
|
|
307
324
|
(kennzahl) => values.get(kennzahl)!,
|
|
308
325
|
);
|
|
326
|
+
// a figure the form order does not place would be left out of the filing: say so instead
|
|
327
|
+
for (const [kennzahl, value] of values) {
|
|
328
|
+
if (!USTVA_KENNZAHL_ORDER.includes(kennzahl)) {
|
|
329
|
+
issues.push(
|
|
330
|
+
`Kennzahl ${kennzahl} (from ${value.accounts.join(', ')}) has no place in this module's form order — it cannot be filed; add it to USTVA_KENNZAHL_ORDER`,
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
309
334
|
|
|
310
335
|
return {
|
|
311
336
|
chart: input.chart,
|
package/ts/zm.ts
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Zusammenfassende Meldung (§ 18a UStG): its lines, and the CSV the
|
|
3
|
+
* ELSTER (or BZSt-Online-Portal) online form imports. Pure; the caller
|
|
4
|
+
* decides which supplies of which period go in (§ 18a Abs. 1, 2, 8 UStG) and
|
|
5
|
+
* transmits the form itself, authenticated, as § 18a requires.
|
|
6
|
+
*
|
|
7
|
+
* Sources, read 2026-09-25:
|
|
8
|
+
* - ELSTER, "Import von Meldelisten zur Zusammenfassenden Meldung"
|
|
9
|
+
* (helpGlobal `zmdo_import_eop`, CSV version 3.0) and the general
|
|
10
|
+
* "Anleitung zur Erstellung von CSV-Dateien für die Importfunktion":
|
|
11
|
+
* UTF-8; line 1 `#v3.0`; the form's example adds `#ve3.2.1`; one line of
|
|
12
|
+
* field names; then the lines, one per record "Meldezeilen (Satzart 1)":
|
|
13
|
+
* USt-IdNr. AN(7,14) beginning with a country code of the list; Summe
|
|
14
|
+
* (Euro) N(11), "eine ganze Zahl", minus allowed; Art der Leistung A(1),
|
|
15
|
+
* `L` innergemeinschaftliche Lieferung, `S` sonstige Leistung, `D`
|
|
16
|
+
* Dreiecksgeschäft. At most 1 500 lines. The example separates its lines
|
|
17
|
+
* with a line feed and its fields with `,`.
|
|
18
|
+
* - BZSt, "Zusammenfassende Meldung - Fragen und Antworten"
|
|
19
|
+
* (bzst.de …/ZusammenfassendeMeldung/FAQ/faq_zm.html, read 2026-09-27),
|
|
20
|
+
* Brexit: a Northern Irish business has a VAT ID with `XI`; the ZM states
|
|
21
|
+
* the intra-Community supplies, triangular trades and § 6b transfers to it,
|
|
22
|
+
* while services to recipients in Northern Ireland follow the rules for the
|
|
23
|
+
* third-country territory and are not reported (Art. 8 of the Protocol on
|
|
24
|
+
* Ireland/Northern Ireland covers goods only).
|
|
25
|
+
* - BZSt, "Anleitung zur Zusammenfassenden Meldung" (USt ZM 1/2021): one line
|
|
26
|
+
* per recipient and kind in a period, the bases summed (Tz. 8, 11); a later
|
|
27
|
+
* change of the base netted into the period of the change, possibly
|
|
28
|
+
* negative (Tz. 10); no "Nullmeldungen" (III.1); a correction states the
|
|
29
|
+
* correct totals, and `0` to storno a line (Tz. 12.2, 12.3).
|
|
30
|
+
*/
|
|
31
|
+
import type { TCents } from '@fin.cx/calculation';
|
|
32
|
+
|
|
33
|
+
/** `L` innergemeinschaftliche Warenlieferung, `S` sonstige Leistung (§ 3a Abs. 2), `D` Dreiecksgeschäft (§ 25b Abs. 2) */
|
|
34
|
+
export type TZmKind = 'L' | 'S' | 'D';
|
|
35
|
+
|
|
36
|
+
/** One supply (or a later change of its base) of the period: the recipient's VAT ID, its kind, the base in euro cents */
|
|
37
|
+
export interface IZmSupplyInput {
|
|
38
|
+
vatId: string;
|
|
39
|
+
kind: TZmKind;
|
|
40
|
+
/** signed: a later reduction of the base is negative */
|
|
41
|
+
baseCents: TCents;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** One line of the report: the recipient, the kind, the summed base in euro cents */
|
|
45
|
+
export interface IZmLine {
|
|
46
|
+
vatId: string;
|
|
47
|
+
kind: TZmKind;
|
|
48
|
+
baseCents: TCents;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface IZmCsv {
|
|
52
|
+
text: string;
|
|
53
|
+
/** the text as UTF-8, as the import requires */
|
|
54
|
+
bytes: Uint8Array;
|
|
55
|
+
lineCount: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** The country codes the ZM takes (ELSTER, "Liste der Länderkennzeichen"); `GB` only for periods before 2021, so not here. */
|
|
59
|
+
export const ZM_COUNTRY_CODES: readonly string[] = [
|
|
60
|
+
'AT', 'BE', 'BG', 'CY', 'CZ', 'DK', 'EE', 'EL', 'ES', 'FI', 'FR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK', 'XI',
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
export const ZM_MAX_LINES = 1500;
|
|
64
|
+
|
|
65
|
+
/** The CSV version lines and the field names, as the form's example gives them. */
|
|
66
|
+
export const ZM_CSV_HEAD: readonly string[] = [
|
|
67
|
+
'#v3.0',
|
|
68
|
+
'#ve3.2.1',
|
|
69
|
+
'Umsatzsteuer-Identifikationsnummer (USt-IdNr.),Summe (Euro),Art der Leistung',
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* How a sum with cents becomes the whole euros the CSV's "Summe (Euro)"
|
|
74
|
+
* takes. No source read states it (ELSTER: "eine ganze Zahl"; ELMA5: "in Euro
|
|
75
|
+
* ohne Cent"; the paper form: "volle EUR | Ct"). The cents are dropped toward
|
|
76
|
+
* zero, as the UStVA drops those of its bases ("in vollen Euro (ohne
|
|
77
|
+
* Centbeträge)", Anleitung zur Umsatzsteuer-Voranmeldung 2026), so that the
|
|
78
|
+
* ZM and the UStVA's Kz 41 and Kz 21, which the BZSt compares, are cut alike.
|
|
79
|
+
* This is a recorded decision of 2026-09-27, pending the tax advisor's
|
|
80
|
+
* confirmation; it is not a rule a source states.
|
|
81
|
+
*/
|
|
82
|
+
export const ZM_EUROS_RULE =
|
|
83
|
+
'the cents of each line\'s sum are dropped toward zero, as the UStVA drops those of its bases (a recorded decision of 2026-09-27, pending the tax advisor\'s confirmation; no source states the rule)';
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The whole euros of a sum in cents, as the CSV's "Summe (Euro)" takes them:
|
|
87
|
+
* the cents dropped toward zero (`ZM_EUROS_RULE`), so 2 000,50 € is 2000 and
|
|
88
|
+
* -2 000,50 € is -2000. At most 11 digits (N(11)).
|
|
89
|
+
*/
|
|
90
|
+
export function zmEurosOf(centsArg: TCents): number {
|
|
91
|
+
if (!Number.isSafeInteger(centsArg)) {
|
|
92
|
+
throw new Error(`the ZM sum must be an integer number of cents, got ${centsArg}`);
|
|
93
|
+
}
|
|
94
|
+
// Math.trunc of a small negative sum is -0, which is written "0"; `+ 0` makes it a plain 0
|
|
95
|
+
const euros = Math.trunc(centsArg / 100) + 0;
|
|
96
|
+
if (String(Math.abs(euros)).length > 11) {
|
|
97
|
+
throw new Error(`the ZM sum has at most 11 digits (N(11)), got ${euros} euros`);
|
|
98
|
+
}
|
|
99
|
+
return euros;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* A recipient's VAT ID as the form takes it: upper case, without spaces, the
|
|
104
|
+
* country code first (`GR` written `EL`, as the list has it); 7 to 14
|
|
105
|
+
* characters of letters, digits, `+` and `*`; a country code of the list.
|
|
106
|
+
*/
|
|
107
|
+
export function normalizeZmVatId(valueArg: string): string {
|
|
108
|
+
let id = String(valueArg ?? '').replace(/\s+/g, '').toUpperCase();
|
|
109
|
+
if (id.startsWith('GR')) {
|
|
110
|
+
id = `EL${id.slice(2)}`;
|
|
111
|
+
}
|
|
112
|
+
if (id.length < 7 || id.length > 14) {
|
|
113
|
+
throw new Error(`a ZM VAT ID has 7 to 14 characters, got '${id}'`);
|
|
114
|
+
}
|
|
115
|
+
if (!/^[A-Z]{2}[A-Z0-9+*]+$/.test(id)) {
|
|
116
|
+
throw new Error(`a ZM VAT ID has a country code and then letters, digits, + or *, got '${id}'`);
|
|
117
|
+
}
|
|
118
|
+
if (!ZM_COUNTRY_CODES.includes(id.slice(0, 2))) {
|
|
119
|
+
throw new Error(`'${id.slice(0, 2)}' is no country code the ZM takes (another member state's, or XI)`);
|
|
120
|
+
}
|
|
121
|
+
return id;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** The lines of a period: one per recipient VAT ID and kind, in the order they first appear, the bases summed. */
|
|
125
|
+
export function aggregateZmLines(suppliesArg: readonly IZmSupplyInput[]): IZmLine[] {
|
|
126
|
+
const lines = new Map<string, IZmLine>();
|
|
127
|
+
for (const supply of suppliesArg) {
|
|
128
|
+
if (supply.kind !== 'L' && supply.kind !== 'S' && supply.kind !== 'D') {
|
|
129
|
+
throw new Error(`a ZM kind is L, S or D, got '${String(supply.kind)}'`);
|
|
130
|
+
}
|
|
131
|
+
if (!Number.isSafeInteger(supply.baseCents)) {
|
|
132
|
+
throw new Error(`a ZM base must be an integer number of cents, got ${supply.baseCents}`);
|
|
133
|
+
}
|
|
134
|
+
const vatId = normalizeZmVatId(supply.vatId);
|
|
135
|
+
if (vatId.startsWith('XI') && supply.kind === 'S') {
|
|
136
|
+
throw new Error(
|
|
137
|
+
`'${vatId}' is a recipient in Northern Ireland, which is Community territory for goods only: a service to it follows the rules for the third-country territory and is not reported in the ZM (BZSt, Zusammenfassende Meldung - Fragen und Antworten, Brexit)`,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
const key = `${vatId}|${supply.kind}`;
|
|
141
|
+
const line = lines.get(key) ?? { vatId, kind: supply.kind, baseCents: 0 };
|
|
142
|
+
line.baseCents += supply.baseCents;
|
|
143
|
+
lines.set(key, line);
|
|
144
|
+
}
|
|
145
|
+
return [...lines.values()];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The CSV of one report. An original report leaves out a line that nets to
|
|
150
|
+
* zero and refuses to be written with no line left (no "Nullmeldung"); a
|
|
151
|
+
* correction keeps a `0` line, which stornos what was reported under it.
|
|
152
|
+
* Each line's sum is cut to whole euros by `zmEurosOf`. Refused beyond 1 500
|
|
153
|
+
* lines.
|
|
154
|
+
*/
|
|
155
|
+
export function writeZmCsv(linesArg: readonly IZmLine[], optionsArg: { purpose: 'original' | 'correction' }): IZmCsv {
|
|
156
|
+
const lines = aggregateZmLines(linesArg).filter((lineArg) => optionsArg.purpose === 'correction' || lineArg.baseCents !== 0);
|
|
157
|
+
if (lines.length === 0) {
|
|
158
|
+
throw new Error('a ZM with no line is no report: "Nullmeldungen" are not given (BZSt Anleitung III.1)');
|
|
159
|
+
}
|
|
160
|
+
if (lines.length > ZM_MAX_LINES) {
|
|
161
|
+
throw new Error(`the ZM online form imports at most ${ZM_MAX_LINES} lines, got ${lines.length}`);
|
|
162
|
+
}
|
|
163
|
+
const rows = lines.map((lineArg) => `${lineArg.vatId},${zmEurosOf(lineArg.baseCents)},${lineArg.kind}`);
|
|
164
|
+
const text = [...ZM_CSV_HEAD, ...rows].join('\n') + '\n';
|
|
165
|
+
return { text, bytes: new TextEncoder().encode(text), lineCount: rows.length };
|
|
166
|
+
}
|