@fin.cx/opendata 4.1.0 → 4.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/.smartconfig.json +4 -2
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/baserate/baserate.d.ts +9 -0
- package/dist_ts/baserate/baserate.js +49 -0
- package/dist_ts/baserate/classes.baserateerror.d.ts +14 -0
- package/dist_ts/baserate/classes.baserateerror.js +10 -0
- package/dist_ts/baserate/data.baserate.d.ts +18 -0
- package/dist_ts/baserate/data.baserate.js +63 -0
- package/dist_ts/baserate/index.d.ts +4 -0
- package/dist_ts/baserate/index.js +7 -0
- package/dist_ts/baserate/interfaces.d.ts +19 -0
- package/dist_ts/baserate/interfaces.js +2 -0
- package/dist_ts/vatid/classes.evatrclient.d.ts +15 -0
- package/dist_ts/vatid/classes.evatrclient.js +169 -0
- package/dist_ts/vatid/classes.vatiderror.d.ts +51 -0
- package/dist_ts/vatid/classes.vatiderror.js +29 -0
- package/dist_ts/vatid/classes.viesclient.d.ts +12 -0
- package/dist_ts/vatid/classes.viesclient.js +118 -0
- package/dist_ts/vatid/constants.d.ts +28 -0
- package/dist_ts/vatid/constants.js +37 -0
- package/dist_ts/vatid/index.d.ts +6 -0
- package/dist_ts/vatid/index.js +10 -0
- package/dist_ts/vatid/interfaces.d.ts +141 -0
- package/dist_ts/vatid/interfaces.js +2 -0
- package/dist_ts/vatid/request.d.ts +16 -0
- package/dist_ts/vatid/request.js +65 -0
- package/dist_ts/vatid/vatid.d.ts +8 -0
- package/dist_ts/vatid/vatid.js +22 -0
- package/package.json +16 -6
- package/readme.md +70 -3
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/baserate/baserate.ts +57 -0
- package/ts/baserate/classes.baserateerror.ts +20 -0
- package/ts/baserate/data.baserate.ts +81 -0
- package/ts/baserate/index.ts +6 -0
- package/ts/baserate/interfaces.ts +21 -0
- package/ts/vatid/classes.evatrclient.ts +182 -0
- package/ts/vatid/classes.vatiderror.ts +83 -0
- package/ts/vatid/classes.viesclient.ts +123 -0
- package/ts/vatid/constants.ts +40 -0
- package/ts/vatid/index.ts +17 -0
- package/ts/vatid/interfaces.ts +154 -0
- package/ts/vatid/request.ts +77 -0
- package/ts/vatid/vatid.ts +25 -0
package/.smartconfig.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"githost": "gitlab.com",
|
|
6
6
|
"gitscope": "fin.cx",
|
|
7
7
|
"gitrepo": "opendata",
|
|
8
|
-
"description": "Open business and financial data for TypeScript: register lookups on the German register portal (handelsregister.de) without storage, the statutory public holidays of the German federal states, and stock and crypto prices and fundamentals from several providers.",
|
|
8
|
+
"description": "Open business and financial data for TypeScript: register lookups on the German register portal (handelsregister.de) without storage, the statutory public holidays of the German federal states, the base rate of § 247 BGB, and stock and crypto prices and fundamentals from several providers.",
|
|
9
9
|
"npmPackagename": "@fin.cx/opendata",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"projectDomain": "fin.cx",
|
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
"fundamentals",
|
|
26
26
|
"public holidays",
|
|
27
27
|
"Feiertage",
|
|
28
|
-
"working days"
|
|
28
|
+
"working days",
|
|
29
|
+
"Basiszinssatz",
|
|
30
|
+
"base rate"
|
|
29
31
|
]
|
|
30
32
|
},
|
|
31
33
|
"release": {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@fin.cx/opendata',
|
|
6
|
-
version: '4.
|
|
7
|
-
description: 'Open business and financial data for TypeScript: register lookups on the German register portal (handelsregister.de) without storage, the statutory public holidays of the German federal states, and stock and crypto prices and fundamentals from several providers.'
|
|
6
|
+
version: '4.3.0',
|
|
7
|
+
description: 'Open business and financial data for TypeScript: register lookups on the German register portal (handelsregister.de) without storage, the statutory public holidays of the German federal states, the base rate of § 247 BGB, and stock and crypto prices and fundamentals from several providers.'
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLG9TQUFvUztDQUNsVCxDQUFBIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IBaseRatePeriod, IBaseRateSpan, TIsoDate } from './interfaces.js';
|
|
2
|
+
/** The base rate in force on a day: the published period that contains it. */
|
|
3
|
+
export declare const getBaseRate: (dateArg: TIsoDate) => IBaseRatePeriod;
|
|
4
|
+
/**
|
|
5
|
+
* A span of days, both inclusive, split where the base rate changes: one piece per published
|
|
6
|
+
* period it touches, oldest first. Interest under § 288 BGB is computed per piece, since the rate
|
|
7
|
+
* of each half-year applies to the days in it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const splitByBaseRate: (fromArg: TIsoDate, toArg: TIsoDate) => IBaseRateSpan[];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseRateError } from './classes.baserateerror.js';
|
|
2
|
+
import { baseRateFirstDay, baseRatePeriods, baseRatesReadOn } from './data.baserate.js';
|
|
3
|
+
const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
4
|
+
const checkDate = (dateArg) => {
|
|
5
|
+
const match = typeof dateArg === 'string' ? ISO_DATE.exec(dateArg) : null;
|
|
6
|
+
const utc = match ? new Date(Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]))) : null;
|
|
7
|
+
if (!match || !utc || utc.toISOString().slice(0, 10) !== dateArg) {
|
|
8
|
+
throw new BaseRateError('invalid_date', `${JSON.stringify(dateArg)} is not a calendar date written YYYY-MM-DD.`);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const addDay = (dateArg) => {
|
|
12
|
+
const utc = new Date(`${dateArg}T00:00:00Z`);
|
|
13
|
+
utc.setUTCDate(utc.getUTCDate() + 1);
|
|
14
|
+
return utc.toISOString().slice(0, 10);
|
|
15
|
+
};
|
|
16
|
+
/** The base rate in force on a day: the published period that contains it. */
|
|
17
|
+
export const getBaseRate = (dateArg) => {
|
|
18
|
+
checkDate(dateArg);
|
|
19
|
+
if (dateArg < baseRateFirstDay) {
|
|
20
|
+
throw new BaseRateError('before_first_period', `${dateArg} lies before ${baseRateFirstDay}, the first day of the Bundesbank's table.`);
|
|
21
|
+
}
|
|
22
|
+
const period = baseRatePeriods.find((periodArg) => periodArg.validFrom <= dateArg && dateArg <= periodArg.validTo);
|
|
23
|
+
if (!period) {
|
|
24
|
+
throw new BaseRateError('not_published', `${dateArg} lies after ${baseRatePeriods[baseRatePeriods.length - 1].validTo}; the base rate of its half-year was not published when the table was read on ${baseRatesReadOn}.`);
|
|
25
|
+
}
|
|
26
|
+
return period;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* A span of days, both inclusive, split where the base rate changes: one piece per published
|
|
30
|
+
* period it touches, oldest first. Interest under § 288 BGB is computed per piece, since the rate
|
|
31
|
+
* of each half-year applies to the days in it.
|
|
32
|
+
*/
|
|
33
|
+
export const splitByBaseRate = (fromArg, toArg) => {
|
|
34
|
+
checkDate(fromArg);
|
|
35
|
+
checkDate(toArg);
|
|
36
|
+
if (toArg < fromArg) {
|
|
37
|
+
throw new BaseRateError('invalid_range', `${toArg} lies before ${fromArg}.`);
|
|
38
|
+
}
|
|
39
|
+
const spans = [];
|
|
40
|
+
let day = fromArg;
|
|
41
|
+
while (day <= toArg) {
|
|
42
|
+
const period = getBaseRate(day);
|
|
43
|
+
const to = period.validTo < toArg ? period.validTo : toArg;
|
|
44
|
+
spans.push({ from: day, to, ratePercent: period.ratePercent });
|
|
45
|
+
day = addDay(to);
|
|
46
|
+
}
|
|
47
|
+
return spans;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9iYXNlcmF0ZS9iYXNlcmF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUd4RixNQUFNLFFBQVEsR0FBRywyQkFBMkIsQ0FBQztBQUU3QyxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWlCLEVBQVEsRUFBRTtJQUM1QyxNQUFNLEtBQUssR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMxRSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDakUsTUFBTSxJQUFJLGFBQWEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQ25ILENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLE9BQWlCLEVBQVksRUFBRTtJQUM3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLE9BQU8sWUFBWSxDQUFDLENBQUM7SUFDN0MsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckMsT0FBTyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN4QyxDQUFDLENBQUM7QUFFRiw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBaUIsRUFBbUIsRUFBRTtJQUNoRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkIsSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksYUFBYSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsT0FBTyxnQkFBZ0IsZ0JBQWdCLDRDQUE0QyxDQUFDLENBQUM7SUFDekksQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkgsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLGFBQWEsQ0FDckIsZUFBZSxFQUNmLEdBQUcsT0FBTyxlQUFlLGVBQWUsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8saUZBQWlGLGVBQWUsR0FBRyxDQUNoTCxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFpQixFQUFFLEtBQWUsRUFBbUIsRUFBRTtJQUNyRixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkIsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLElBQUksS0FBSyxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxhQUFhLENBQUMsZUFBZSxFQUFFLEdBQUcsS0FBSyxnQkFBZ0IsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztJQUNsQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUM7SUFDbEIsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDcEIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDM0QsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMvRCxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why a question to the base-rate table was refused:
|
|
3
|
+
* - `invalid_date`: the value is not a calendar date written `YYYY-MM-DD`;
|
|
4
|
+
* - `invalid_range`: a span ends before it begins;
|
|
5
|
+
* - `before_first_period`: the day lies before the first period the table holds (1 July 2002);
|
|
6
|
+
* - `not_published`: the day lies after the half-year of the last period the table holds, whose
|
|
7
|
+
* rate the Bundesbank had not published when the table was read (`baseRatesReadOn`).
|
|
8
|
+
*/
|
|
9
|
+
export type TBaseRateErrorCode = 'invalid_date' | 'invalid_range' | 'before_first_period' | 'not_published';
|
|
10
|
+
/** The typed error of the base-rate table. */
|
|
11
|
+
export declare class BaseRateError extends Error {
|
|
12
|
+
readonly code: TBaseRateErrorCode;
|
|
13
|
+
constructor(code: TBaseRateErrorCode, message: string);
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** The typed error of the base-rate table. */
|
|
2
|
+
export class BaseRateError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'BaseRateError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5iYXNlcmF0ZWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYmFzZXJhdGUvY2xhc3Nlcy5iYXNlcmF0ZWVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLDhDQUE4QztBQUM5QyxNQUFNLE9BQU8sYUFBYyxTQUFRLEtBQUs7SUFDdEIsSUFBSSxDQUFxQjtJQUV6QyxZQUFZLElBQXdCLEVBQUUsT0FBZTtRQUNuRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The base rate (Basiszinssatz) of § 247 BGB, as the Deutsche Bundesbank publishes it: "Gemäß
|
|
3
|
+
* § 247 Abs. 2 BGB ist die Deutsche Bundesbank verpflichtet, den aktuellen Stand des
|
|
4
|
+
* Basiszinssatzes im Bundesanzeiger zu veröffentlichen." It changes on 1 January and 1 July
|
|
5
|
+
* (§ 247 Abs. 1 Satz 2 BGB). The table below is the Bundesbank's table "Basiszinssatz nach § 247
|
|
6
|
+
* BGB" (https://www.bundesbank.de/de/bundesbank/organisation/agb-und-regelungen/basiszinssatz-607820),
|
|
7
|
+
* read on 2026-09-27, unaltered: every row from 1 July 2002, the first one it lists, to the
|
|
8
|
+
* current one. A later half-year needs a new release.
|
|
9
|
+
*/
|
|
10
|
+
import type { IBaseRatePeriod } from './interfaces.js';
|
|
11
|
+
/** the first day the table answers for */
|
|
12
|
+
export declare const baseRateFirstDay = "2002-07-01";
|
|
13
|
+
/** the day the Bundesbank's table was read; later half-years need a new release */
|
|
14
|
+
export declare const baseRatesReadOn = "2026-09-27";
|
|
15
|
+
/** the page the table was read from */
|
|
16
|
+
export declare const baseRateSource = "https://www.bundesbank.de/de/bundesbank/organisation/agb-und-regelungen/basiszinssatz-607820";
|
|
17
|
+
/** every published period, oldest first */
|
|
18
|
+
export declare const baseRatePeriods: readonly IBaseRatePeriod[];
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** the first day the table answers for */
|
|
2
|
+
export const baseRateFirstDay = '2002-07-01';
|
|
3
|
+
/** the day the Bundesbank's table was read; later half-years need a new release */
|
|
4
|
+
export const baseRatesReadOn = '2026-09-27';
|
|
5
|
+
/** the page the table was read from */
|
|
6
|
+
export const baseRateSource = 'https://www.bundesbank.de/de/bundesbank/organisation/agb-und-regelungen/basiszinssatz-607820';
|
|
7
|
+
const rows = [
|
|
8
|
+
// gültig ab, Basiszinssatz in Prozent, as the table of the Deutsche Bundesbank states them
|
|
9
|
+
['2002-07-01', 2.47],
|
|
10
|
+
['2003-01-01', 1.97],
|
|
11
|
+
['2003-07-01', 1.22],
|
|
12
|
+
['2004-01-01', 1.14],
|
|
13
|
+
['2004-07-01', 1.13],
|
|
14
|
+
['2005-01-01', 1.21],
|
|
15
|
+
['2005-07-01', 1.17],
|
|
16
|
+
['2006-01-01', 1.37],
|
|
17
|
+
['2006-07-01', 1.95],
|
|
18
|
+
['2007-01-01', 2.70],
|
|
19
|
+
['2007-07-01', 3.19],
|
|
20
|
+
['2008-01-01', 3.32],
|
|
21
|
+
['2008-07-01', 3.19],
|
|
22
|
+
['2009-01-01', 1.62],
|
|
23
|
+
['2009-07-01', 0.12],
|
|
24
|
+
['2010-01-01', 0.12],
|
|
25
|
+
['2010-07-01', 0.12],
|
|
26
|
+
['2011-01-01', 0.12],
|
|
27
|
+
['2011-07-01', 0.37],
|
|
28
|
+
['2012-01-01', 0.12],
|
|
29
|
+
['2012-07-01', 0.12],
|
|
30
|
+
['2013-01-01', -0.13],
|
|
31
|
+
['2013-07-01', -0.38],
|
|
32
|
+
['2014-01-01', -0.63],
|
|
33
|
+
['2014-07-01', -0.73],
|
|
34
|
+
['2015-01-01', -0.83],
|
|
35
|
+
['2015-07-01', -0.83],
|
|
36
|
+
['2016-01-01', -0.83],
|
|
37
|
+
['2016-07-01', -0.88],
|
|
38
|
+
['2017-01-01', -0.88],
|
|
39
|
+
['2017-07-01', -0.88],
|
|
40
|
+
['2018-01-01', -0.88],
|
|
41
|
+
['2018-07-01', -0.88],
|
|
42
|
+
['2019-01-01', -0.88],
|
|
43
|
+
['2019-07-01', -0.88],
|
|
44
|
+
['2020-01-01', -0.88],
|
|
45
|
+
['2020-07-01', -0.88],
|
|
46
|
+
['2021-01-01', -0.88],
|
|
47
|
+
['2021-07-01', -0.88],
|
|
48
|
+
['2022-01-01', -0.88],
|
|
49
|
+
['2022-07-01', -0.88],
|
|
50
|
+
['2023-01-01', 1.62],
|
|
51
|
+
['2023-07-01', 3.12],
|
|
52
|
+
['2024-01-01', 3.62],
|
|
53
|
+
['2024-07-01', 3.37],
|
|
54
|
+
['2025-01-01', 2.27],
|
|
55
|
+
['2025-07-01', 1.27],
|
|
56
|
+
['2026-01-01', 1.27],
|
|
57
|
+
['2026-07-01', 1.52],
|
|
58
|
+
];
|
|
59
|
+
/** the last day of the half-year a period begins in */
|
|
60
|
+
const halfYearEndOf = (validFromArg) => `${validFromArg.slice(0, 4)}-${validFromArg.slice(5, 7) === '01' ? '06-30' : '12-31'}`;
|
|
61
|
+
/** every published period, oldest first */
|
|
62
|
+
export const baseRatePeriods = Object.freeze(rows.map(([validFrom, ratePercent]) => Object.freeze({ validFrom, validTo: halfYearEndOf(validFrom), ratePercent })));
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS5iYXNlcmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2Jhc2VyYXRlL2RhdGEuYmFzZXJhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsMENBQTBDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUU3QyxtRkFBbUY7QUFDbkYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUU1Qyx1Q0FBdUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLDhGQUE4RixDQUFDO0FBRTdILE1BQU0sSUFBSSxHQUE2QztJQUNyRCwyRkFBMkY7SUFDM0YsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDcEIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ3BCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztDQUNyQixDQUFDO0FBRUYsdURBQXVEO0FBQ3ZELE1BQU0sYUFBYSxHQUFHLENBQUMsWUFBb0IsRUFBVSxFQUFFLENBQ3JELEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRXpGLDJDQUEyQztBQUMzQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCLE1BQU0sQ0FBQyxNQUFNLENBQ3RFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FDckgsQ0FBQyJ9
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './interfaces.js';
|
|
2
|
+
export { BaseRateError, type TBaseRateErrorCode } from './classes.baserateerror.js';
|
|
3
|
+
export { baseRateFirstDay, baseRatePeriods, baseRateSource, baseRatesReadOn } from './data.baserate.js';
|
|
4
|
+
export { getBaseRate, splitByBaseRate } from './baserate.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// This entry point stands alone: it imports nothing from the rest of the package, has no
|
|
2
|
+
// dependencies and needs no storage or network.
|
|
3
|
+
export * from './interfaces.js';
|
|
4
|
+
export { BaseRateError } from './classes.baserateerror.js';
|
|
5
|
+
export { baseRateFirstDay, baseRatePeriods, baseRateSource, baseRatesReadOn } from './data.baserate.js';
|
|
6
|
+
export { getBaseRate, splitByBaseRate } from './baserate.js';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9iYXNlcmF0ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5RkFBeUY7QUFDekYsZ0RBQWdEO0FBQ2hELGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBMkIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RyxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQyJ9
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A plain calendar date, `YYYY-MM-DD`. */
|
|
2
|
+
export type TIsoDate = string;
|
|
3
|
+
/**
|
|
4
|
+
* One half-year's base rate (Basiszinssatz, § 247 BGB) as the Deutsche
|
|
5
|
+
* Bundesbank publishes it: valid from 1 January or 1 July to the last day of
|
|
6
|
+
* that half-year, both inclusive.
|
|
7
|
+
*/
|
|
8
|
+
export interface IBaseRatePeriod {
|
|
9
|
+
validFrom: TIsoDate;
|
|
10
|
+
validTo: TIsoDate;
|
|
11
|
+
/** percent a year; it can be negative (2013 to 2022) */
|
|
12
|
+
ratePercent: number;
|
|
13
|
+
}
|
|
14
|
+
/** A span of days within one base-rate period, both days inclusive. */
|
|
15
|
+
export interface IBaseRateSpan {
|
|
16
|
+
from: TIsoDate;
|
|
17
|
+
to: TIsoDate;
|
|
18
|
+
ratePercent: number;
|
|
19
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IEvatrConfirmation, IEvatrConfirmationInput, IVatIdClientOptions, IVatIdTraderData } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* The BZSt's confirmation of foreign VAT IDs (§ 18e Nr. 1 UStG) over its eVatR REST API
|
|
4
|
+
* (`https://api.evatr.vies.bzst.de/api-docs`). A simple confirmation says whether a VAT ID is valid
|
|
5
|
+
* when asked; a qualified one also compares the business's name, city, and where given street and
|
|
6
|
+
* postal code with what its member state registered. The BZSt confirms to a business with a German
|
|
7
|
+
* VAT ID of its own, which every request names. Nothing is kept: each answer goes to the caller.
|
|
8
|
+
*/
|
|
9
|
+
export declare class EvatrClient {
|
|
10
|
+
private readonly options;
|
|
11
|
+
constructor(options?: IVatIdClientOptions);
|
|
12
|
+
confirm(inputArg: IEvatrConfirmationInput): Promise<IEvatrConfirmation>;
|
|
13
|
+
}
|
|
14
|
+
/** The business data as a qualified confirmation sends it: trimmed, with the name and the city required. */
|
|
15
|
+
export declare const traderOf: (traderArg: IVatIdTraderData) => IVatIdTraderData | undefined;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { VatIdError } from './classes.vatiderror.js';
|
|
2
|
+
import { evatrBaseUrl, evatrConfirmationPath, evatrStatusCodes } from './constants.js';
|
|
3
|
+
import { postJson, textField } from './request.js';
|
|
4
|
+
import { splitVatId } from './vatid.js';
|
|
5
|
+
/** The status codes that are an answer about the VAT ID asked about, and whether they say it is valid. */
|
|
6
|
+
const ANSWERS = {
|
|
7
|
+
'evatr-0000': true,
|
|
8
|
+
'evatr-2008': true,
|
|
9
|
+
'evatr-2001': false,
|
|
10
|
+
'evatr-2002': false,
|
|
11
|
+
'evatr-2006': false,
|
|
12
|
+
};
|
|
13
|
+
/** What every other status code means for the caller (`VatIdError`). */
|
|
14
|
+
const REFUSALS = {
|
|
15
|
+
'evatr-0001': 'invalid_input',
|
|
16
|
+
'evatr-0002': 'invalid_input',
|
|
17
|
+
'evatr-0003': 'invalid_input',
|
|
18
|
+
'evatr-0004': 'requester_invalid',
|
|
19
|
+
'evatr-0005': 'vat_id_malformed',
|
|
20
|
+
'evatr-0006': 'not_permitted',
|
|
21
|
+
'evatr-0007': 'invalid_input',
|
|
22
|
+
'evatr-0008': 'qualified_limit_reached',
|
|
23
|
+
'evatr-0011': 'unavailable',
|
|
24
|
+
'evatr-0012': 'vat_id_malformed',
|
|
25
|
+
'evatr-0013': 'unavailable',
|
|
26
|
+
'evatr-1001': 'unavailable',
|
|
27
|
+
'evatr-1002': 'unavailable',
|
|
28
|
+
'evatr-1003': 'unavailable',
|
|
29
|
+
'evatr-1004': 'unavailable',
|
|
30
|
+
'evatr-2003': 'vat_id_malformed',
|
|
31
|
+
'evatr-2004': 'unavailable',
|
|
32
|
+
'evatr-2005': 'requester_invalid',
|
|
33
|
+
'evatr-2007': 'member_state_unavailable',
|
|
34
|
+
'evatr-2011': 'unavailable',
|
|
35
|
+
'evatr-3011': 'unavailable',
|
|
36
|
+
};
|
|
37
|
+
const FIELD_RESULTS = ['A', 'B', 'C', 'D'];
|
|
38
|
+
const fieldResult = (bodyArg, keyArg) => {
|
|
39
|
+
const value = textField(bodyArg, keyArg);
|
|
40
|
+
return value !== undefined && FIELD_RESULTS.includes(value) ? value : undefined;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* The BZSt's confirmation of foreign VAT IDs (§ 18e Nr. 1 UStG) over its eVatR REST API
|
|
44
|
+
* (`https://api.evatr.vies.bzst.de/api-docs`). A simple confirmation says whether a VAT ID is valid
|
|
45
|
+
* when asked; a qualified one also compares the business's name, city, and where given street and
|
|
46
|
+
* postal code with what its member state registered. The BZSt confirms to a business with a German
|
|
47
|
+
* VAT ID of its own, which every request names. Nothing is kept: each answer goes to the caller.
|
|
48
|
+
*/
|
|
49
|
+
export class EvatrClient {
|
|
50
|
+
options;
|
|
51
|
+
constructor(options = {}) {
|
|
52
|
+
this.options = options;
|
|
53
|
+
}
|
|
54
|
+
async confirm(inputArg) {
|
|
55
|
+
const requester = splitVatId(inputArg.requesterVatId);
|
|
56
|
+
if (!requester || requester.countryCode !== 'DE') {
|
|
57
|
+
throw new VatIdError('invalid_input', 'the requester is named by its German VAT ID', { service: 'bzst-evatr', field: 'requesterVatId' });
|
|
58
|
+
}
|
|
59
|
+
const asked = splitVatId(inputArg.vatId);
|
|
60
|
+
if (!asked) {
|
|
61
|
+
throw new VatIdError('invalid_input', 'the VAT ID asked about starts with no member state\'s code', { service: 'bzst-evatr', field: 'vatId' });
|
|
62
|
+
}
|
|
63
|
+
const trader = inputArg.trader ? traderOf(inputArg.trader) : undefined;
|
|
64
|
+
if (inputArg.trader && !trader) {
|
|
65
|
+
throw new VatIdError('invalid_input', 'a qualified confirmation needs the name and the city', { service: 'bzst-evatr', field: 'trader' });
|
|
66
|
+
}
|
|
67
|
+
const answer = await postJson(this.options, 'bzst-evatr', `${this.options.baseUrl ?? evatrBaseUrl}${evatrConfirmationPath}`, {
|
|
68
|
+
anfragendeUstid: requester.vatId,
|
|
69
|
+
angefragteUstid: asked.vatId,
|
|
70
|
+
...(trader
|
|
71
|
+
? {
|
|
72
|
+
firmenname: trader.name,
|
|
73
|
+
ort: trader.city,
|
|
74
|
+
...(trader.street ? { strasse: trader.street } : {}),
|
|
75
|
+
...(trader.postalCode ? { plz: trader.postalCode } : {}),
|
|
76
|
+
}
|
|
77
|
+
: {}),
|
|
78
|
+
}, inputArg.signal);
|
|
79
|
+
const status = textField(answer.body, 'status');
|
|
80
|
+
if (!status || !evatrStatusCodes.includes(status)) {
|
|
81
|
+
throw new VatIdError('unexpected_answer', `the BZSt answered HTTP ${answer.httpStatus} without a status it documents`, {
|
|
82
|
+
service: 'bzst-evatr',
|
|
83
|
+
httpStatus: answer.httpStatus,
|
|
84
|
+
...(status ? { serviceCode: status } : {}),
|
|
85
|
+
answer: answer.answer,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const code = status;
|
|
89
|
+
const valid = ANSWERS[code];
|
|
90
|
+
if (valid === undefined) {
|
|
91
|
+
throw new VatIdError(REFUSALS[code] ?? 'unexpected_answer', `the BZSt answered ${code}`, {
|
|
92
|
+
service: 'bzst-evatr',
|
|
93
|
+
serviceCode: code,
|
|
94
|
+
httpStatus: answer.httpStatus,
|
|
95
|
+
answer: answer.answer,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const requestedAt = textField(answer.body, 'anfrageZeitpunkt');
|
|
99
|
+
const requestedAtMs = requestedAt ? Date.parse(requestedAt) : Number.NaN;
|
|
100
|
+
if (!requestedAt || Number.isNaN(requestedAtMs)) {
|
|
101
|
+
throw new VatIdError('unexpected_answer', 'the BZSt answered without the moment of the request', {
|
|
102
|
+
service: 'bzst-evatr',
|
|
103
|
+
serviceCode: code,
|
|
104
|
+
httpStatus: answer.httpStatus,
|
|
105
|
+
answer: answer.answer,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const requestId = textField(answer.body, 'id');
|
|
109
|
+
const validFrom = textField(answer.body, 'gueltigAb');
|
|
110
|
+
const validTo = textField(answer.body, 'gueltigBis');
|
|
111
|
+
const qualified = trader && valid ? qualifiedResultOf(trader, code, answer.body) : undefined;
|
|
112
|
+
if (qualified === null) {
|
|
113
|
+
// a qualified request answered valid without a result for each field sent would read as a simple
|
|
114
|
+
// confirmation; it is refused instead of being passed on as one
|
|
115
|
+
throw new VatIdError('unexpected_answer', `the BZSt answered ${code} to a qualified request without a documented result for each field sent`, {
|
|
116
|
+
service: 'bzst-evatr',
|
|
117
|
+
serviceCode: code,
|
|
118
|
+
httpStatus: answer.httpStatus,
|
|
119
|
+
answer: answer.answer,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
service: 'bzst-evatr',
|
|
124
|
+
...(requestId ? { requestId } : {}),
|
|
125
|
+
requestedAt,
|
|
126
|
+
requestedAtMs,
|
|
127
|
+
status: code,
|
|
128
|
+
valid,
|
|
129
|
+
...(validFrom ? { validFrom } : {}),
|
|
130
|
+
...(validTo ? { validTo } : {}),
|
|
131
|
+
requesterVatId: requester.vatId,
|
|
132
|
+
vatId: asked.vatId,
|
|
133
|
+
...(qualified ? { qualified } : {}),
|
|
134
|
+
answer: answer.answer,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The comparison of a qualified request whose VAT ID is valid: `evatr-2008` says it has a
|
|
140
|
+
* particularity and gives no result (`answered: false`); otherwise every field sent has a documented
|
|
141
|
+
* result (`A`…`D`), or the answer is not one this client reads (`null`). A result the BZSt gives for a
|
|
142
|
+
* field not sent is kept as it is.
|
|
143
|
+
*/
|
|
144
|
+
const qualifiedResultOf = (traderArg, codeArg, bodyArg) => {
|
|
145
|
+
if (codeArg === 'evatr-2008') {
|
|
146
|
+
return { asked: traderArg, answered: false };
|
|
147
|
+
}
|
|
148
|
+
const name = fieldResult(bodyArg, 'ergFirmenname');
|
|
149
|
+
const city = fieldResult(bodyArg, 'ergOrt');
|
|
150
|
+
// a field not sent may still carry its result (`C`, not asked); one sent must
|
|
151
|
+
const street = fieldResult(bodyArg, 'ergStrasse');
|
|
152
|
+
const postalCode = fieldResult(bodyArg, 'ergPlz');
|
|
153
|
+
if (!name || !city || (traderArg.street && !street) || (traderArg.postalCode && !postalCode)) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
return { asked: traderArg, answered: true, name, city, ...(street ? { street } : {}), ...(postalCode ? { postalCode } : {}) };
|
|
157
|
+
};
|
|
158
|
+
/** The business data as a qualified confirmation sends it: trimmed, with the name and the city required. */
|
|
159
|
+
export const traderOf = (traderArg) => {
|
|
160
|
+
const name = traderArg.name.trim();
|
|
161
|
+
const city = traderArg.city.trim();
|
|
162
|
+
if (!name || !city) {
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
const street = traderArg.street?.trim();
|
|
166
|
+
const postalCode = traderArg.postalCode?.trim();
|
|
167
|
+
return { name, city, ...(street ? { street } : {}), ...(postalCode ? { postalCode } : {}) };
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ldmF0cmNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3ZhdGlkL2NsYXNzZXMuZXZhdHJjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBd0IsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVdkYsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4QywwR0FBMEc7QUFDMUcsTUFBTSxPQUFPLEdBQXlEO0lBQ3BFLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFlBQVksRUFBRSxLQUFLO0lBQ25CLFlBQVksRUFBRSxLQUFLO0NBQ3BCLENBQUM7QUFFRix3RUFBd0U7QUFDeEUsTUFBTSxRQUFRLEdBQWlFO0lBQzdFLFlBQVksRUFBRSxlQUFlO0lBQzdCLFlBQVksRUFBRSxlQUFlO0lBQzdCLFlBQVksRUFBRSxlQUFlO0lBQzdCLFlBQVksRUFBRSxtQkFBbUI7SUFDakMsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxZQUFZLEVBQUUsZUFBZTtJQUM3QixZQUFZLEVBQUUsZUFBZTtJQUM3QixZQUFZLEVBQUUseUJBQXlCO0lBQ3ZDLFlBQVksRUFBRSxhQUFhO0lBQzNCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBWSxFQUFFLGFBQWE7SUFDM0IsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFZ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
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { IVatIdServiceAnswer } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* Why a VAT ID could not be confirmed. Every code means that the service gave no answer about the
|
|
4
|
+
* validity of the VAT ID asked about:
|
|
5
|
+
* - `invalid_input`: what was asked is incomplete or not a VAT ID of a member state (checked before
|
|
6
|
+
* sending, or refused by the service: eVatR `evatr-0002`, `evatr-0003`, `evatr-0007`, VIES
|
|
7
|
+
* `INVALID_INPUT`);
|
|
8
|
+
* - `vat_id_malformed`: the service says the VAT ID asked about does not have the form its member
|
|
9
|
+
* state gives (eVatR `evatr-0005`, `evatr-0012`, `evatr-2003`);
|
|
10
|
+
* - `requester_invalid`: the requester's own VAT ID is malformed or not valid (eVatR `evatr-0004`,
|
|
11
|
+
* `evatr-2005`, VIES `INVALID_REQUESTER_INFO`);
|
|
12
|
+
* - `not_permitted`: a German VAT ID asked about by a German one (eVatR `evatr-0006`);
|
|
13
|
+
* - `qualified_limit_reached`: the qualified confirmations of this session are used up (eVatR
|
|
14
|
+
* `evatr-0008`); a simple one is still possible;
|
|
15
|
+
* - `unavailable`: the service cannot answer now (eVatR `evatr-0011`, `-0013`, `-1001`…`-1004`,
|
|
16
|
+
* `-2004`, `-2011`, `-3011`; VIES `SERVICE_UNAVAILABLE`);
|
|
17
|
+
* - `member_state_unavailable`: the member state's system did not answer or failed (eVatR
|
|
18
|
+
* `evatr-2007`; VIES `MS_UNAVAILABLE`, `TIMEOUT`);
|
|
19
|
+
* - `busy`: too many requests at once (VIES `GLOBAL_MAX_CONCURRENT_REQ`, `MS_MAX_CONCURRENT_REQ`
|
|
20
|
+
* and their `_TIME` forms);
|
|
21
|
+
* - `blocked`: the service blocks this address or this VAT ID (VIES `IP_BLOCKED`, `VAT_BLOCKED`);
|
|
22
|
+
* - `unreachable`: no answer arrived — the name, the connection or TLS failed;
|
|
23
|
+
* - `timeout`: the answer did not arrive within the client's time;
|
|
24
|
+
* - `aborted`: the caller's signal ended the request;
|
|
25
|
+
* - `unexpected_answer`: an answer this client cannot read, or a status it does not know.
|
|
26
|
+
*/
|
|
27
|
+
export type TVatIdErrorCode = 'invalid_input' | 'vat_id_malformed' | 'requester_invalid' | 'not_permitted' | 'qualified_limit_reached' | 'unavailable' | 'member_state_unavailable' | 'busy' | 'blocked' | 'unreachable' | 'timeout' | 'aborted' | 'unexpected_answer';
|
|
28
|
+
export interface IVatIdErrorDetails {
|
|
29
|
+
service: 'bzst-evatr' | 'vies';
|
|
30
|
+
/** the service's own code: `evatr-0008`, `MS_UNAVAILABLE` */
|
|
31
|
+
serviceCode?: string;
|
|
32
|
+
/** the HTTP status of the answer, where one arrived */
|
|
33
|
+
httpStatus?: number;
|
|
34
|
+
/** which input a local check refused */
|
|
35
|
+
field?: 'requesterVatId' | 'vatId' | 'trader';
|
|
36
|
+
/** the answer as it arrived, where one did */
|
|
37
|
+
answer?: IVatIdServiceAnswer;
|
|
38
|
+
}
|
|
39
|
+
/** The typed error of the VAT ID clients. */
|
|
40
|
+
export declare class VatIdError extends Error {
|
|
41
|
+
readonly code: TVatIdErrorCode;
|
|
42
|
+
readonly service: IVatIdErrorDetails['service'];
|
|
43
|
+
readonly serviceCode?: string;
|
|
44
|
+
readonly httpStatus?: number;
|
|
45
|
+
readonly field?: IVatIdErrorDetails['field'];
|
|
46
|
+
/** the answer as it arrived, where one did: a refusal, or an answer this client cannot read */
|
|
47
|
+
readonly answer?: IVatIdServiceAnswer;
|
|
48
|
+
constructor(code: TVatIdErrorCode, message: string, detailsArg: IVatIdErrorDetails, options?: {
|
|
49
|
+
cause?: unknown;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** The typed error of the VAT ID clients. */
|
|
2
|
+
export class VatIdError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
service;
|
|
5
|
+
serviceCode;
|
|
6
|
+
httpStatus;
|
|
7
|
+
field;
|
|
8
|
+
/** the answer as it arrived, where one did: a refusal, or an answer this client cannot read */
|
|
9
|
+
answer;
|
|
10
|
+
constructor(code, message, detailsArg, options) {
|
|
11
|
+
super(message, options);
|
|
12
|
+
this.name = 'VatIdError';
|
|
13
|
+
this.code = code;
|
|
14
|
+
this.service = detailsArg.service;
|
|
15
|
+
if (detailsArg.serviceCode !== undefined) {
|
|
16
|
+
this.serviceCode = detailsArg.serviceCode;
|
|
17
|
+
}
|
|
18
|
+
if (detailsArg.httpStatus !== undefined) {
|
|
19
|
+
this.httpStatus = detailsArg.httpStatus;
|
|
20
|
+
}
|
|
21
|
+
if (detailsArg.field !== undefined) {
|
|
22
|
+
this.field = detailsArg.field;
|
|
23
|
+
}
|
|
24
|
+
if (detailsArg.answer !== undefined) {
|
|
25
|
+
this.answer = detailsArg.answer;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy52YXRpZGVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvdmF0aWQvY2xhc3Nlcy52YXRpZGVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXNEQSw2Q0FBNkM7QUFDN0MsTUFBTSxPQUFPLFVBQVcsU0FBUSxLQUFLO0lBQ25CLElBQUksQ0FBa0I7SUFDdEIsT0FBTyxDQUFnQztJQUN2QyxXQUFXLENBQVU7SUFDckIsVUFBVSxDQUFVO0lBQ3BCLEtBQUssQ0FBK0I7SUFDcEQsK0ZBQStGO0lBQy9FLE1BQU0sQ0FBdUI7SUFFN0MsWUFBWSxJQUFxQixFQUFFLE9BQWUsRUFBRSxVQUE4QixFQUFFLE9BQTZCO1FBQy9HLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2xDLElBQUksVUFBVSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IViesCheck, IViesCheckInput, IVatIdClientOptions } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* The European Commission's VIES over its REST API ("Vies on-the-Web", `swagger_publicVAT.yaml`):
|
|
4
|
+
* whether a VAT ID is valid, and with the business data a comparison of each field. A request that
|
|
5
|
+
* names the requester's own VAT ID gets VIES's request identifier. Errors arrive with HTTP 200 and
|
|
6
|
+
* `actionSucceed: false`; they are thrown as `VatIdError`. Nothing is kept.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ViesClient {
|
|
9
|
+
private readonly options;
|
|
10
|
+
constructor(options?: IVatIdClientOptions);
|
|
11
|
+
check(inputArg: IViesCheckInput): Promise<IViesCheck>;
|
|
12
|
+
}
|