@kreiseck/kasseneck-api 0.27.2 → 0.28.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +59 -9
  3. package/dist/cjs/partner/ablauf.d.ts +4 -3
  4. package/dist/cjs/partner/ablauf.js +4 -3
  5. package/dist/cjs/partner/api.d.ts +20 -8
  6. package/dist/cjs/partner/api.js +12 -1
  7. package/dist/cjs/partner/endpunkte.d.ts +9 -12
  8. package/dist/cjs/partner/endpunkte.js +85 -26
  9. package/dist/cjs/partner/fehler.d.ts +1 -1
  10. package/dist/cjs/partner/fehler.js +8 -3
  11. package/dist/cjs/partner/index.d.ts +7 -3
  12. package/dist/cjs/partner/index.js +7 -2
  13. package/dist/cjs/partner/typen.d.ts +144 -34
  14. package/dist/cjs/partner/typen.js +4 -0
  15. package/dist/cjs/partner/webhooks.d.ts +76 -14
  16. package/dist/cjs/partner/webhooks.js +40 -12
  17. package/dist/cjs/payments/index.d.ts +5 -4
  18. package/dist/cjs/payments/index.js +4 -3
  19. package/dist/cjs/rechnung/summen.d.ts +18 -3
  20. package/dist/cjs/rechnung/summen.js +18 -3
  21. package/dist/cjs/rechnung/typen.d.ts +1 -1
  22. package/dist/cjs/rechnung/vertrag.d.ts +1 -1
  23. package/dist/cjs/rechnung/vertrag.js +1 -1
  24. package/dist/esm/partner/ablauf.d.ts +4 -3
  25. package/dist/esm/partner/ablauf.js +4 -3
  26. package/dist/esm/partner/api.d.ts +20 -8
  27. package/dist/esm/partner/api.js +11 -1
  28. package/dist/esm/partner/endpunkte.d.ts +9 -12
  29. package/dist/esm/partner/endpunkte.js +85 -26
  30. package/dist/esm/partner/fehler.d.ts +1 -1
  31. package/dist/esm/partner/fehler.js +8 -3
  32. package/dist/esm/partner/index.d.ts +7 -3
  33. package/dist/esm/partner/index.js +5 -1
  34. package/dist/esm/partner/typen.d.ts +144 -34
  35. package/dist/esm/partner/typen.js +4 -0
  36. package/dist/esm/partner/webhooks.d.ts +76 -14
  37. package/dist/esm/partner/webhooks.js +40 -12
  38. package/dist/esm/payments/index.d.ts +5 -4
  39. package/dist/esm/payments/index.js +4 -3
  40. package/dist/esm/rechnung/summen.d.ts +18 -3
  41. package/dist/esm/rechnung/summen.js +18 -3
  42. package/dist/esm/rechnung/typen.d.ts +1 -1
  43. package/dist/esm/rechnung/vertrag.d.ts +1 -1
  44. package/dist/esm/rechnung/vertrag.js +1 -1
  45. package/fixtures/hobex-hps-codes.json +1 -1
  46. package/fixtures/kasse-texte.json +1 -1
  47. package/fixtures/oberflaeche.json +3 -1
  48. package/fixtures/rechnung-api.schema.json +1 -1
  49. package/fixtures/rechnung-texte.json +1 -1
  50. package/package.json +1 -1
@@ -23,9 +23,10 @@
23
23
  * Terminal spricht. Das ist kein Widerspruch zur Umgebungsgrenze, sondern ein
24
24
  * zweiter, seit `hobex-hps.js` genutzter Weg um sie herum.
25
25
  *
26
- * Wer Gutschrift oder Storno am HPS-Terminal braucht, braucht weiterhin die
27
- * Flutter-App: Connect exponiert dafuer (noch) keinen Endpunkt, siehe
28
- * `hobex-hps/connect-client.ts`.
26
+ * Gutschrift und Storno am HPS-Terminal laufen ebenfalls ueber Connect
27
+ * (`POST /v1/terminal/refund` bzw. `/cancel`): `HpsPayments.refund`/`cancel`
28
+ * mit `HpsRefundOptions`/`HpsCancelOptions`, darunter
29
+ * `HpsConnectClient.refund`/`cancel`, siehe `hobex-hps/connect-client.ts`.
29
30
  *
30
31
  * **Kassen-Benutzer-Weg (`registerUserAuth`, Browser-Kasse):** **Keiner** der
31
32
  * vier Cloud-Zahlungs-Endpunkte (Stripe, Hobex-Cloud) setzt `allowRegisterUser`;
@@ -1,7 +1,16 @@
1
1
  /**
2
- * Summen einer Rechnung vorab rechnen — genau so, wie der Server sie beim
3
- * Ausstellen rechnet. Fuer Shops, die kassieren, bevor die Rechnung entsteht,
4
- * und denselben Betrag brauchen, den die Rechnung spaeter ausweist.
2
+ * Summen einer Rechnung vorab rechnen, nach der frueheren Formel (Weg 2,
3
+ * Gleitkomma). Gedacht fuer Shops, die kassieren, bevor die Rechnung entsteht.
4
+ *
5
+ * **Veraltet.** Seit dem 23.09.2026, 17:05 Uhr stellt der Server jede neue
6
+ * Rechnung ueber den exakten Ganzzahl-Kern aus (`rechnungRechnen` in
7
+ * `…/rechnung/rechnen`). An Halbcent-Grenzen weicht diese Funktion davon um
8
+ * einen Cent je Satz ab (21,35 EUR netto zu 10 %: hier 23,48 EUR, auf der
9
+ * Rechnung 23,49 EUR). Die Formel bleibt trotzdem, wie sie ist: der Server
10
+ * schaltet den Kern je Konto ueber einen Schalter und rechnet Entwuerfe
11
+ * ausserhalb des Ausstellens teils weiter nach Weg 2, und Backend und
12
+ * Dart-Zwilling pruefen gegen `fixtures/rechnung-summen.json`. Neuer Code
13
+ * nimmt `rechnungRechnen` oder `previewInvoice`.
5
14
  *
6
15
  * Die Regel (je USt-Satz, Betraege in Cent, kaufmaennisch gerundet):
7
16
  *
@@ -38,5 +47,11 @@ export interface SummenPosition {
38
47
  * Server einen steuerfreien Fall ab (etwa eine ig. Lieferung), gehoert dieser
39
48
  * Fall hierher — sonst rechnet die Funktion Steuer, die die Rechnung nicht
40
49
  * ausweist.
50
+ *
51
+ * @deprecated Seit 0.27.3: rechnet nach der frueheren Formel (Weg 2) und kann
52
+ * an Halbcent-Grenzen um einen Cent je Satz von einer heute ausgestellten
53
+ * Rechnung abweichen. Stattdessen `rechnungRechnen` aus
54
+ * `@kreiseck/kasseneck-api/rechnung/rechnen` (Euro-Positionen ueber
55
+ * `positionAusEuro`) oder `previewInvoice` verwenden.
41
56
  */
42
57
  export declare function rechnungSummen(items: readonly SummenPosition[], priceMode: PriceMode, taxScheme?: TaxScheme): InvoiceTotals;
@@ -1,8 +1,17 @@
1
1
  "use strict";
2
2
  /**
3
- * Summen einer Rechnung vorab rechnen — genau so, wie der Server sie beim
4
- * Ausstellen rechnet. Fuer Shops, die kassieren, bevor die Rechnung entsteht,
5
- * und denselben Betrag brauchen, den die Rechnung spaeter ausweist.
3
+ * Summen einer Rechnung vorab rechnen, nach der frueheren Formel (Weg 2,
4
+ * Gleitkomma). Gedacht fuer Shops, die kassieren, bevor die Rechnung entsteht.
5
+ *
6
+ * **Veraltet.** Seit dem 23.09.2026, 17:05 Uhr stellt der Server jede neue
7
+ * Rechnung ueber den exakten Ganzzahl-Kern aus (`rechnungRechnen` in
8
+ * `…/rechnung/rechnen`). An Halbcent-Grenzen weicht diese Funktion davon um
9
+ * einen Cent je Satz ab (21,35 EUR netto zu 10 %: hier 23,48 EUR, auf der
10
+ * Rechnung 23,49 EUR). Die Formel bleibt trotzdem, wie sie ist: der Server
11
+ * schaltet den Kern je Konto ueber einen Schalter und rechnet Entwuerfe
12
+ * ausserhalb des Ausstellens teils weiter nach Weg 2, und Backend und
13
+ * Dart-Zwilling pruefen gegen `fixtures/rechnung-summen.json`. Neuer Code
14
+ * nimmt `rechnungRechnen` oder `previewInvoice`.
6
15
  *
7
16
  * Die Regel (je USt-Satz, Betraege in Cent, kaufmaennisch gerundet):
8
17
  *
@@ -42,6 +51,12 @@ function centRund(x) {
42
51
  * Server einen steuerfreien Fall ab (etwa eine ig. Lieferung), gehoert dieser
43
52
  * Fall hierher — sonst rechnet die Funktion Steuer, die die Rechnung nicht
44
53
  * ausweist.
54
+ *
55
+ * @deprecated Seit 0.27.3: rechnet nach der frueheren Formel (Weg 2) und kann
56
+ * an Halbcent-Grenzen um einen Cent je Satz von einer heute ausgestellten
57
+ * Rechnung abweichen. Stattdessen `rechnungRechnen` aus
58
+ * `@kreiseck/kasseneck-api/rechnung/rechnen` (Euro-Positionen ueber
59
+ * `positionAusEuro`) oder `previewInvoice` verwenden.
45
60
  */
46
61
  function rechnungSummen(items, priceMode, taxScheme = 'normal') {
47
62
  const steuerfrei = rechnen_js_1.STEUERFREIE_FAELLE.includes(taxScheme);
@@ -133,7 +133,7 @@ export interface PaymentInput {
133
133
  reference?: string;
134
134
  /**
135
135
  * Die Zahlung erfolgte vor Ort beim Unternehmer (Terminal an der Kasse).
136
- * Dann ist sie ein Barumsatz — auch mit Karte (§ 131b Abs. 1 Z 3 UStG) — und
136
+ * Dann ist sie ein Barumsatz — auch mit Karte (§ 131b Abs. 1 Z 3 BAO) — und
137
137
  * die Antwort traegt den Hinweis `cash_receipt_required`. Zu `transfer`
138
138
  * passt das Kennzeichen nicht und wird abgewiesen.
139
139
  */
@@ -130,7 +130,7 @@ export type InvoiceLanguage = (typeof INVOICE_LANGUAGES)[number];
130
130
  * Wie eine Rechnung bezahlt wurde. Der Vermerk ist Buchhaltung, kein Beleg.
131
131
  *
132
132
  * Ein **Barumsatz** ist nicht nur Bargeld: als Barzahlung gilt auch die Zahlung
133
- * mit Bankomat- oder Kreditkarte **vor Ort** (§ 131b Abs. 1 Z 3 UStG), nicht
133
+ * mit Bankomat- oder Kreditkarte **vor Ort** (§ 131b Abs. 1 Z 3 BAO), nicht
134
134
  * aber dieselbe Karte im Internet. Weil `card` und `online` beides sein
135
135
  * koennen, sagt das Feld `onSite` es dem Server — und nur dann traegt die
136
136
  * Antwort den Hinweis `cash_receipt_required` (bei `cash` immer).
@@ -147,7 +147,7 @@ exports.INVOICE_LANGUAGES = ['de', 'en'];
147
147
  * Wie eine Rechnung bezahlt wurde. Der Vermerk ist Buchhaltung, kein Beleg.
148
148
  *
149
149
  * Ein **Barumsatz** ist nicht nur Bargeld: als Barzahlung gilt auch die Zahlung
150
- * mit Bankomat- oder Kreditkarte **vor Ort** (§ 131b Abs. 1 Z 3 UStG), nicht
150
+ * mit Bankomat- oder Kreditkarte **vor Ort** (§ 131b Abs. 1 Z 3 BAO), nicht
151
151
  * aber dieselbe Karte im Internet. Weil `card` und `online` beides sein
152
152
  * koennen, sagt das Feld `onSite` es dem Server — und nur dann traegt die
153
153
  * Antwort den Hinweis `cash_receipt_required` (bei `cash` immer).
@@ -10,9 +10,10 @@
10
10
  * Fehler. Hier steht sie vorher — abfragbar, ausgebbar, und in
11
11
  * [naechsterSchritt] auch beantwortbar.
12
12
  *
13
- * **Ohne Vertragsschritt.** Auftragsverarbeitungsvertraege wirken in diesem
14
- * Weg nicht mehr (Stand 2026-08-31): kein Aufruf meldet einen, keine Kasse
15
- * bleibt deswegen stehen.
13
+ * **Kein eigener Vertragsschritt.** AVV und Nutzungsvertrag bestaetigt der
14
+ * Betrieb ueber denselben Einrichtungs-Link wie seinen FinanzOnline-Zugang
15
+ * (Schritt `fon`). Live geht ohne beide keine Kasse live
16
+ * (`vertrag_offen`); den Stand zeigen `avv` und `terms` am Betrieb.
16
17
  *
17
18
  * Zwei Dinge laufen bewusst **parallel**: der Signaturantrag und das Anlegen
18
19
  * der Kasse. Eine mit `automatic:true` angelegte Kasse wartet, bis die
@@ -10,9 +10,10 @@
10
10
  * Fehler. Hier steht sie vorher — abfragbar, ausgebbar, und in
11
11
  * [naechsterSchritt] auch beantwortbar.
12
12
  *
13
- * **Ohne Vertragsschritt.** Auftragsverarbeitungsvertraege wirken in diesem
14
- * Weg nicht mehr (Stand 2026-08-31): kein Aufruf meldet einen, keine Kasse
15
- * bleibt deswegen stehen.
13
+ * **Kein eigener Vertragsschritt.** AVV und Nutzungsvertrag bestaetigt der
14
+ * Betrieb ueber denselben Einrichtungs-Link wie seinen FinanzOnline-Zugang
15
+ * (Schritt `fon`). Live geht ohne beide keine Kasse live
16
+ * (`vertrag_offen`); den Stand zeigen `avv` und `terms` am Betrieb.
16
17
  *
17
18
  * Zwei Dinge laufen bewusst **parallel**: der Signaturantrag und das Anlegen
18
19
  * der Kasse. Eine mit `automatic:true` angelegte Kasse wartet, bis die
@@ -5,12 +5,27 @@
5
5
  * Funktionen und bleiben einzeln importierbar.
6
6
  */
7
7
  import { type FetchLike } from '../client/transport.js';
8
- import { type CreateWebhookOptions, type CreateWebhookResult, type PartnerWebhook, type WebhookListe, type PartnerWebhookEventType, type WebhookPatch, type WebhookTestResult, type WebhookZustellung } from './webhooks.js';
9
- import type { ActivateCashregisterResult, CreateCashregisterOptions, CreateCashregisterResult, CreateCustomerOptions, CreateCustomerResult, CustomerCredentials, FonLinkResult, KassenListe, Kunde, KundenListe, ListCustomersOptions, PartnerInfo, RequestSignatureResult, SignaturStand } from './typen.js';
8
+ import { type CreateWebhookOptions, type CreateWebhookResult, type DeleteWebhookResult, type PartnerWebhook, type WebhookListe, type PartnerWebhookEventType, type WebhookPatch, type WebhookTestResult, type WebhookZustellung } from './webhooks.js';
9
+ import type { ActivateCashregisterResult, CreateCashregisterOptions, CreateCashregisterResult, CreateCustomerOptions, CreateCustomerResult, CustomerCredentials, FonLinkResult, KassenListe, Kunde, KundenListe, ListCustomersOptions, PartnerInfo, RequestSignatureOptions, RequestSignatureResult, SignaturStand } from './typen.js';
10
+ /**
11
+ * Die Basis-URL der Partner-API: `/v3`, die englische Fassung.
12
+ *
13
+ * Nur der Partner-Teil spricht `/v3`. Belege, Rechnungen, Kasse und Zahlungen
14
+ * laufen weiter ueber [DEFAULT_BASE_URL] (`/v1`), bis es fuer sie eine `/v3`
15
+ * gibt. Die Partner-Endpunkte unter `/v1` antworten weiter, deutsch und
16
+ * abgekuendigt (Kopfzeilen `Deprecation`/`Sunset`); dieser Client spricht sie
17
+ * nicht mehr.
18
+ */
19
+ export declare const PARTNER_BASE_URL = "https://api.kasseneck.at/v3";
10
20
  export interface PartnerApiOptions {
11
21
  /** Partner-Schluessel `pk_test_…` / `pk_live_…`. Gehoert auf einen Server. */
12
22
  partnerKey: string;
13
- /** Abweichende Basis-URL; Vorgabe `https://api.kasseneck.at/v1`. */
23
+ /**
24
+ * Abweichende Basis-URL; Vorgabe [PARTNER_BASE_URL]
25
+ * (`https://api.kasseneck.at/v3`). Die Antworten werden in der Form der
26
+ * `/v3` gelesen: eine `/v1`-Adresse hier liefert deutsche Werte, die diese
27
+ * Typen nicht beschreiben.
28
+ */
14
29
  baseUrl?: string;
15
30
  /** Zeitlimit je Aufruf in Millisekunden. */
16
31
  timeoutMs?: number;
@@ -23,10 +38,7 @@ export interface PartnerApi {
23
38
  listPartnerCustomers(optionen?: ListCustomersOptions): Promise<KundenListe>;
24
39
  getPartnerCustomer(customerId: string): Promise<Kunde>;
25
40
  sendPartnerCustomerFonLink(customerId: string): Promise<FonLinkResult>;
26
- requestCustomerSignature(customerId: string, optionen?: {
27
- art?: string;
28
- additional?: boolean;
29
- }): Promise<RequestSignatureResult>;
41
+ requestCustomerSignature(customerId: string, optionen?: RequestSignatureOptions): Promise<RequestSignatureResult>;
30
42
  getCustomerSignatureStatus(customerId: string): Promise<SignaturStand>;
31
43
  createCustomerCashregister(optionen: CreateCashregisterOptions): Promise<CreateCashregisterResult>;
32
44
  activateCashregister(customerId: string, cashregisterId: string): Promise<ActivateCashregisterResult>;
@@ -42,7 +54,7 @@ export interface PartnerApi {
42
54
  createPartnerWebhook(optionen: CreateWebhookOptions): Promise<CreateWebhookResult>;
43
55
  listPartnerWebhooks(): Promise<WebhookListe>;
44
56
  updatePartnerWebhook(webhookId: string, patch: WebhookPatch): Promise<PartnerWebhook>;
45
- deletePartnerWebhook(webhookId: string): Promise<string>;
57
+ deletePartnerWebhook(webhookId: string): Promise<DeleteWebhookResult>;
46
58
  /**
47
59
  * Neues Secret fuer denselben Endpunkt — dieselbe `webhookId`, dieselben
48
60
  * Ereignisse. Das alte gilt ab der Antwort nicht mehr.
@@ -9,10 +9,20 @@ import { partnerKeyAuth } from './auth.js';
9
9
  import { partnerFehlerRat } from './fehler.js';
10
10
  import { activateCashregister, createCustomerCashregister, createPartnerCustomer, getCustomerCredentials, getCustomerSignatureStatus, getPartnerCustomer, getPartnerInfo, checkPartnerCustomerEmail, listCustomerCashregisters, listPartnerCustomers, requestCustomerSignature, sendPartnerCustomerFonLink, } from './endpunkte.js';
11
11
  import { createPartnerWebhook, deletePartnerWebhook, listPartnerWebhookDeliveries, listPartnerWebhooks, rotatePartnerWebhookSecret, sendPartnerWebhookTest, updatePartnerWebhook, } from './webhooks.js';
12
+ /**
13
+ * Die Basis-URL der Partner-API: `/v3`, die englische Fassung.
14
+ *
15
+ * Nur der Partner-Teil spricht `/v3`. Belege, Rechnungen, Kasse und Zahlungen
16
+ * laufen weiter ueber [DEFAULT_BASE_URL] (`/v1`), bis es fuer sie eine `/v3`
17
+ * gibt. Die Partner-Endpunkte unter `/v1` antworten weiter, deutsch und
18
+ * abgekuendigt (Kopfzeilen `Deprecation`/`Sunset`); dieser Client spricht sie
19
+ * nicht mehr.
20
+ */
21
+ export const PARTNER_BASE_URL = 'https://api.kasseneck.at/v3';
12
22
  export function createPartnerApi(optionen) {
13
23
  const rufen = createTransport({
14
24
  auth: partnerKeyAuth({ partnerKey: optionen.partnerKey }),
15
- baseUrl: optionen.baseUrl,
25
+ baseUrl: optionen.baseUrl ?? PARTNER_BASE_URL,
16
26
  timeoutMs: optionen.timeoutMs,
17
27
  fetch: optionen.fetch,
18
28
  });
@@ -19,7 +19,7 @@
19
19
  * einen `TypeError` an unpassender Stelle.
20
20
  */
21
21
  import type { InternerTransport } from '../client/aufrufe.js';
22
- import type { ActivateCashregisterResult, CreateCashregisterOptions, CreateCashregisterResult, CreateCustomerOptions, CreateCustomerResult, CustomerCredentials, FonLinkResult, KassenListe, Kunde, KundenListe, ListCustomersOptions, PartnerInfo, RequestSignatureResult, SignaturStand } from './typen.js';
22
+ import type { ActivateCashregisterResult, CreateCashregisterOptions, CreateCashregisterResult, CreateCustomerOptions, CreateCustomerResult, CustomerCredentials, FonLinkResult, KassenListe, Kunde, KundenListe, ListCustomersOptions, PartnerInfo, RequestSignatureOptions, RequestSignatureResult, SignaturStand } from './typen.js';
23
23
  /**
24
24
  * Wer bin ich, in welcher Umgebung, mit welchen Rechten — und welche Apps
25
25
  * gehoeren mir. `apps[].id` ist die `appId` fuer [createPartnerCustomer].
@@ -76,8 +76,8 @@ export declare function sendPartnerCustomerFonLink(rufen: InternerTransport, cus
76
76
  * Vertrauensdiensteanbieter **auf diesen Betrieb** ausstellen und meldet sie
77
77
  * bei FinanzOnline an; einen Vorrat fertiger Karten gibt es nicht.
78
78
  *
79
- * Der Antrag erzeugt sofort ein Signatur-OBJEKT: `antrag.requestId` ist
80
- * zugleich die `signaturId`, auf die sich eine Kasse beruft — auch solange
79
+ * Der Antrag erzeugt sofort ein Signatur-OBJEKT: `request.requestId` ist
80
+ * zugleich die `signatureRequestId`, auf die sich eine Kasse beruft — auch solange
81
81
  * noch keine Karte zugewiesen ist.
82
82
  *
83
83
  * **Je Betrieb laeuft nur ein Antrag.** Ein zweiter Aufruf liefert den
@@ -87,23 +87,20 @@ export declare function sendPartnerCustomerFonLink(rufen: InternerTransport, cus
87
87
  * Abschluss kommt als Ereignis `signature.ready`, nicht als Antwort auf diesen
88
88
  * Aufruf.
89
89
  */
90
- export declare function requestCustomerSignature(rufen: InternerTransport, customerId: string, optionen?: {
91
- art?: string;
92
- additional?: boolean;
93
- }): Promise<RequestSignatureResult>;
94
- /** Stand der Signatur eines Betriebs samt aller Antraege und des FON-Zugangs. */
90
+ export declare function requestCustomerSignature(rufen: InternerTransport, customerId: string, optionen?: RequestSignatureOptions): Promise<RequestSignatureResult>;
91
+ /** Stand der Signatur eines Betriebs samt aller Signaturen, Antraege und des FON-Zugangs. */
95
92
  export declare function getCustomerSignatureStatus(rufen: InternerTransport, customerId: string): Promise<SignaturStand>;
96
93
  /**
97
94
  * Legt eine Kasse an.
98
95
  *
99
96
  * **Jede Kasse bezieht sich auf eine Signatur.** Ohne eine einzige — auch eine
100
97
  * noch laufende zaehlt — entsteht keine (`signature_missing`); bei mehreren
101
- * muss `signaturId` dastehen (`signature_ambiguous`).
98
+ * muss `signatureRequestId` dastehen (`signature_ambiguous`).
102
99
  *
103
100
  * **Darf vor der fertigen Signatur aufgerufen werden:** die Kasse bleibt dann
104
- * auf `entwurf` und geht von selbst live, sobald IHRE Signatur bereit ist
105
- * (`automatic:true`, Vorgabe). `inbetriebnahme.reason` sagt, warum gerade
106
- * nichts lief: `signature_not_ready` oder `automatik_aus`.
101
+ * auf `draft` und geht von selbst live, sobald IHRE Signatur bereit ist
102
+ * (`automatic:true`, Vorgabe). `activation.reason` sagt, warum gerade
103
+ * nichts lief: `signature_not_ready` oder `automation_off`.
107
104
  *
108
105
  * Hoechstens 20 Kassen je Betrieb (`cashregister_limit`); ohne gebuchtes Modul
109
106
  * `module_inactive`.
@@ -45,6 +45,19 @@ function zahlOderNull(wert) {
45
45
  function jaNein(wert, rueckfall = false) {
46
46
  return typeof wert === 'boolean' ? wert : rueckfall;
47
47
  }
48
+ /**
49
+ * Das gebuchte Entgelt (`fee`), falls die Antwort eines fuehrt. Ohne Betrag
50
+ * ist es keines: ein erfundenes `0` saehe aus wie ein kostenloser Posten.
51
+ */
52
+ function entgelt(wert) {
53
+ if (wert === null || typeof wert !== 'object' || Array.isArray(wert))
54
+ return null;
55
+ const f = wert;
56
+ const cents = zahlOderNull(f['cents']);
57
+ if (cents === null)
58
+ return null;
59
+ return { cents, interval: text(f['interval']), test: jaNein(f['test']) };
60
+ }
48
61
  /**
49
62
  * Verlangt ein Feld der Antwort. Der Fehler nennt das Feld und den Vorgang,
50
63
  * damit ein Aufrufer nicht raten muss, welcher der Aufrufe etwas anderes
@@ -158,6 +171,7 @@ export async function createPartnerCustomer(rufen, optionen) {
158
171
  appId: text(daten['appId'], appId),
159
172
  access: { invited: jaNein(zugang['invited']), sentTo: textOderNull(zugang['sentTo']) },
160
173
  nextSteps: liste(daten['nextSteps']).filter((s) => typeof s === 'string'),
174
+ fee: entgelt(daten['fee']),
161
175
  replayed: jaNein(daten['replayed']),
162
176
  };
163
177
  }
@@ -186,26 +200,38 @@ function kundenZeile(eintrag) {
186
200
  appId: textOderNull(k['appId']),
187
201
  env: text(k['env']) === 'test' ? 'test' : 'live',
188
202
  createdAt: zahlOderNull(k['createdAt']),
203
+ fon: fonStand(k['fon']),
189
204
  avv: avvStand(k['avv']),
205
+ terms: vertragStand(k['terms']),
190
206
  };
191
207
  }
192
- /**
193
- * Der Vertragsstand, **falls** die Antwort ihn ueberhaupt fuehrt — heute tut
194
- * sie das nicht, dann bleibt es bei `null`. Kein erfundenes `offen`: „nicht
195
- * mitgeliefert" und „nicht bestaetigt" duerfen fuer einen Aufrufer nicht
196
- * dasselbe sein.
197
- */
198
- function avvStand(wert) {
208
+ function fonStand(wert) {
199
209
  if (wert === null || typeof wert !== 'object' || Array.isArray(wert))
200
210
  return null;
201
- const a = wert;
211
+ const f = wert;
202
212
  return {
203
- status: text(a['status']),
204
- version: textOderNull(a['version']),
205
- confirmedAt: zahlOderNull(a['confirmedAt']),
206
- mode: textOderNull(a['mode']),
213
+ configured: jaNein(f['configured']),
214
+ linkSentAt: zahlOderNull(f['linkSentAt']),
215
+ linkOpenedAt: zahlOderNull(f['linkOpenedAt']),
207
216
  };
208
217
  }
218
+ function vertragStand(wert) {
219
+ if (wert === null || typeof wert !== 'object' || Array.isArray(wert))
220
+ return null;
221
+ const v = wert;
222
+ return { status: text(v['status']), version: textOderNull(v['version']), confirmedAt: zahlOderNull(v['confirmedAt']) };
223
+ }
224
+ /**
225
+ * Der AVV-Stand, **falls** die Antwort ihn fuehrt; sonst `null`. Kein
226
+ * erfundenes `pending`: „nicht mitgeliefert" und „nicht bestaetigt" duerfen
227
+ * fuer einen Aufrufer nicht dasselbe sein.
228
+ */
229
+ function avvStand(wert) {
230
+ const v = vertragStand(wert);
231
+ if (!v)
232
+ return null;
233
+ return { ...v, mode: textOderNull(wert['mode']) };
234
+ }
209
235
  /** Ein Betrieb mit allem, was der Partner ueber ihn sehen darf — nie Geheimnisse. */
210
236
  export async function getPartnerCustomer(rufen, customerId) {
211
237
  const id = pflicht(customerId, 'getPartnerCustomer', 'customerId');
@@ -220,7 +246,13 @@ export async function getPartnerCustomer(rufen, customerId) {
220
246
  createdAt: zahlOderNull(k['createdAt']),
221
247
  createdVia: textOderNull(k['createdVia']),
222
248
  business: objekt(k['business']),
223
- fon: { configured: jaNein(fon['configured']), verifiedAt: zahlOderNull(fon['verifiedAt']) },
249
+ fon: {
250
+ configured: jaNein(fon['configured']),
251
+ verifiedAt: zahlOderNull(fon['verifiedAt']),
252
+ linkSentAt: zahlOderNull(fon['linkSentAt']),
253
+ linkSentTo: textOderNull(fon['linkSentTo']),
254
+ linkOpenedAt: zahlOderNull(fon['linkOpenedAt']),
255
+ },
224
256
  access: zugang === null || typeof zugang !== 'object'
225
257
  ? null
226
258
  : {
@@ -274,7 +306,7 @@ function antrag(eintrag) {
274
306
  requestId: text(a['requestId']),
275
307
  status: text(a['status']),
276
308
  statusText: text(a['statusText']),
277
- art: text(a['art'], 'signature_card'),
309
+ kind: text(a['kind'], 'signature_card'),
278
310
  vdaId: textOderNull(a['vdaId']),
279
311
  signatureId: textOderNull(a['signatureId']),
280
312
  error: fehler === null || typeof fehler !== 'object'
@@ -290,8 +322,8 @@ function antrag(eintrag) {
290
322
  history: liste(a['history']).map((h) => {
291
323
  const e = objekt(h);
292
324
  return {
293
- von: textOderNull(e['von']),
294
- nach: text(e['nach']),
325
+ from: textOderNull(e['from']),
326
+ to: text(e['to']),
295
327
  at: zahlOderNull(e['at']) ?? 0,
296
328
  reason: textOderNull(e['reason']),
297
329
  };
@@ -303,8 +335,8 @@ function antrag(eintrag) {
303
335
  * Vertrauensdiensteanbieter **auf diesen Betrieb** ausstellen und meldet sie
304
336
  * bei FinanzOnline an; einen Vorrat fertiger Karten gibt es nicht.
305
337
  *
306
- * Der Antrag erzeugt sofort ein Signatur-OBJEKT: `antrag.requestId` ist
307
- * zugleich die `signaturId`, auf die sich eine Kasse beruft — auch solange
338
+ * Der Antrag erzeugt sofort ein Signatur-OBJEKT: `request.requestId` ist
339
+ * zugleich die `signatureRequestId`, auf die sich eine Kasse beruft — auch solange
308
340
  * noch keine Karte zugewiesen ist.
309
341
  *
310
342
  * **Je Betrieb laeuft nur ein Antrag.** Ein zweiter Aufruf liefert den
@@ -318,27 +350,54 @@ export async function requestCustomerSignature(rufen, customerId, optionen = {})
318
350
  const id = pflicht(customerId, 'requestCustomerSignature', 'customerId');
319
351
  const daten = objekt(await rufen('requestCustomerSignature', {
320
352
  customerId: id,
321
- art: optionen.art,
353
+ kind: optionen.kind,
322
354
  additional: optionen.additional,
323
355
  }));
324
356
  return {
325
357
  request: antrag(verlangt(daten['request'], 'requestCustomerSignature', 'request')),
326
358
  replayed: jaNein(daten['replayed']),
327
359
  note: textOderNull(daten['note']),
360
+ fee: entgelt(daten['fee']),
328
361
  };
329
362
  }
330
- /** Stand der Signatur eines Betriebs samt aller Antraege und des FON-Zugangs. */
363
+ function signaturEinzeln(eintrag) {
364
+ const s = objekt(eintrag);
365
+ const fehler = s['error'];
366
+ return {
367
+ signatureRequestId: text(s['signatureRequestId']),
368
+ status: text(s['status']),
369
+ statusText: text(s['statusText']),
370
+ inProgress: jaNein(s['inProgress']),
371
+ ready: jaNein(s['ready']),
372
+ kind: text(s['kind'], 'signature_card'),
373
+ vdaId: textOderNull(s['vdaId']),
374
+ requestId: textOderNull(s['requestId']),
375
+ signatureId: textOderNull(s['signatureId']),
376
+ error: fehler === null || typeof fehler !== 'object'
377
+ ? null
378
+ : {
379
+ code: textOderNull(objekt(fehler)['code']),
380
+ message: textOderNull(objekt(fehler)['message']),
381
+ rc: textOderNull(objekt(fehler)['rc']),
382
+ },
383
+ createdAt: zahlOderNull(s['createdAt']),
384
+ updatedAt: zahlOderNull(s['updatedAt']),
385
+ };
386
+ }
387
+ /** Stand der Signatur eines Betriebs samt aller Signaturen, Antraege und des FON-Zugangs. */
331
388
  export async function getCustomerSignatureStatus(rufen, customerId) {
332
389
  const id = pflicht(customerId, 'getCustomerSignatureStatus', 'customerId');
333
390
  const daten = objekt(await rufen('getCustomerSignatureStatus', { customerId: id }));
334
- const signatur = objekt(daten['signatur']);
391
+ const signatur = objekt(daten['signature']);
335
392
  const fon = objekt(daten['fon']);
336
393
  return {
337
- signatur: {
394
+ customerId: text(daten['customerId'], id),
395
+ signature: {
338
396
  ready: jaNein(signatur['ready']),
339
397
  signatureId: textOderNull(signatur['signatureId']),
340
398
  vdaId: textOderNull(signatur['vdaId']),
341
399
  },
400
+ signatures: liste(daten['signatures']).map(signaturEinzeln),
342
401
  requests: liste(daten['requests']).map(antrag),
343
402
  fon: { present: jaNein(fon['present']), verifiedAt: zahlOderNull(fon['verifiedAt']) },
344
403
  };
@@ -378,12 +437,12 @@ function kasse(eintrag) {
378
437
  *
379
438
  * **Jede Kasse bezieht sich auf eine Signatur.** Ohne eine einzige — auch eine
380
439
  * noch laufende zaehlt — entsteht keine (`signature_missing`); bei mehreren
381
- * muss `signaturId` dastehen (`signature_ambiguous`).
440
+ * muss `signatureRequestId` dastehen (`signature_ambiguous`).
382
441
  *
383
442
  * **Darf vor der fertigen Signatur aufgerufen werden:** die Kasse bleibt dann
384
- * auf `entwurf` und geht von selbst live, sobald IHRE Signatur bereit ist
385
- * (`automatic:true`, Vorgabe). `inbetriebnahme.reason` sagt, warum gerade
386
- * nichts lief: `signature_not_ready` oder `automatik_aus`.
443
+ * auf `draft` und geht von selbst live, sobald IHRE Signatur bereit ist
444
+ * (`automatic:true`, Vorgabe). `activation.reason` sagt, warum gerade
445
+ * nichts lief: `signature_not_ready` oder `automation_off`.
387
446
  *
388
447
  * Hoechstens 20 Kassen je Betrieb (`cashregister_limit`); ohne gebuchtes Modul
389
448
  * `module_inactive`.
@@ -27,7 +27,7 @@
27
27
  *
28
28
  * Reihenfolge und Bestand wie im Abzug des Backends.
29
29
  */
30
- export declare const PARTNER_FEHLER_CODES: readonly ["validation", "rate_limited", "app_not_found", "app_not_accepted", "kein_partnerbetrieb", "live_not_allowed", "customer_exists", "customer_conflict", "customer_limit", "zugang_nicht_erlaubt", "email_taken", "no_email", "fon_missing", "signature_pending", "request_not_found", "signature_missing", "signature_unknown", "signature_ambiguous", "signature_not_ready", "signature_limit", "signature_failed", "module_inactive", "cashregister_limit", "cashregister_not_found", "activation_failed", "webhook_limit", "webhook_inactive", "event_not_subscribed"];
30
+ export declare const PARTNER_FEHLER_CODES: readonly ["validation", "rate_limited", "app_not_found", "app_not_accepted", "kein_partnerbetrieb", "live_not_allowed", "customer_exists", "customer_conflict", "customer_limit", "zugang_nicht_erlaubt", "email_taken", "no_email", "kennung_fehlt", "fon_missing", "signature_pending", "request_not_found", "signature_missing", "signature_unknown", "signature_ambiguous", "signature_not_ready", "signature_limit", "signature_failed", "module_inactive", "cashregister_limit", "cashregister_not_found", "vertrag_offen", "activation_failed", "webhook_limit", "webhook_inactive", "event_not_subscribed"];
31
31
  /**
32
32
  * Die Codes, die nur im **Partner-Portal** entstehen — beim Pflegen der App,
33
33
  * der Schluessel, der Mitglieder und der Signaturkarten.
@@ -43,6 +43,8 @@ export const PARTNER_FEHLER_CODES = [
43
43
  'zugang_nicht_erlaubt',
44
44
  'email_taken',
45
45
  'no_email',
46
+ // FinanzOnline-Link
47
+ 'kennung_fehlt',
46
48
  // Signatur
47
49
  'fon_missing',
48
50
  'signature_pending',
@@ -57,6 +59,7 @@ export const PARTNER_FEHLER_CODES = [
57
59
  'module_inactive',
58
60
  'cashregister_limit',
59
61
  'cashregister_not_found',
62
+ 'vertrag_offen',
60
63
  'activation_failed',
61
64
  // Webhooks
62
65
  'webhook_limit',
@@ -111,21 +114,23 @@ const RAT = {
111
114
  customer_exists: 'Diesen Betrieb gibt es schon (data.customerId). Mit derselben customerId weiterarbeiten.',
112
115
  customer_conflict: 'Die Steuernummer ist bei Kasseneck bereits registriert. Die Zuordnung zum Partner macht Kasseneck — hello@kasseneck.at.',
113
116
  customer_limit: 'Das Tageslimit fuer neue Betriebe ist erreicht (data.max, data.resetAt). Morgen weiter.',
114
- zugang_nicht_erlaubt: 'Fuer dieses Partner-Konto sind Zugaenge zum Kundenpanel nicht freigeschaltet — es entstand NICHTS, auch kein Betrieb. Ohne zugang{invite:true} erneut anlegen oder die Freischaltung erfragen (Stand: getPartnerInfo.partner.canCreateAccess).',
117
+ zugang_nicht_erlaubt: 'Fuer dieses Partner-Konto sind Zugaenge zum Kundenpanel nicht freigeschaltet — es entstand NICHTS, auch kein Betrieb. Ohne access{invite:true} erneut anlegen oder die Freischaltung erfragen (Stand: getPartnerInfo.partner.canCreateAccess).',
115
118
  email_taken: 'Fuer diese E-Mail gibt es schon einen Kasseneck-Zugang. Eine andere Adresse waehlen, auf die Einladung verzichten oder den Betrieb zuordnen lassen.',
116
119
  no_email: 'Im Konto des Betriebs steht keine E-Mail-Adresse. Ohne sie geht weder eine Einladung noch der FinanzOnline-Link hinaus.',
120
+ kennung_fehlt: 'Am Betrieb ist keine Steuernummer hinterlegt, ohne sie gibt es keinen Einrichtungs-Link. Die Steuernummer bei Kasseneck nachtragen lassen (hello@kasseneck.at), dann sendPartnerCustomerFonLink erneut.',
117
121
  fon_missing: 'Der Betrieb hat noch keinen FinanzOnline-Zugang. sendPartnerCustomerFonLink senden und customer.fon_verified abwarten. Betrifft das ANMELDEN der Signatureinheit, nicht das Beantragen.',
118
122
  signature_pending: 'Fuer diesen Betrieb laeuft bereits ein Antrag. Auf signature.ready warten.',
119
123
  request_not_found: 'Diese signaturId gibt es nicht. getCustomerSignatureStatus nennt die des Betriebs.',
120
124
  signature_missing: 'Der Betrieb hat ueberhaupt keine Signatur, und jede Kasse bezieht sich auf eine. Zuerst requestCustomerSignature.',
121
- signature_unknown: 'Die genannte signaturId gehoert nicht zu diesem Betrieb. getCustomerSignatureStatus nennt die seinen.',
122
- signature_ambiguous: 'Der Betrieb hat mehrere Signaturen; welche die Kasse benutzt, muss dastehen. Eine aus data.choices als signaturId mitgeben.',
125
+ signature_unknown: 'Die genannte signatureRequestId gehoert nicht zu diesem Betrieb. getCustomerSignatureStatus nennt die seinen.',
126
+ signature_ambiguous: 'Der Betrieb hat mehrere Signaturen; welche die Kasse benutzt, muss dastehen. Eine aus data.choices als signatureRequestId mitgeben.',
123
127
  signature_not_ready: 'Die Signatur DIESER Kasse ist noch nicht bereit. Auf signature.ready warten; eine mit automatic:true angelegte Kasse geht danach von selbst live.',
124
128
  signature_limit: 'Hoechstens zehn Signaturen je Betrieb. Eine bestehende benutzen, statt mit additional:true eine weitere zu beantragen.',
125
129
  signature_failed: 'FinanzOnline hat die Anmeldung abgelehnt (data.rc). Kasseneck klaert das — hello@kasseneck.at.',
126
130
  module_inactive: 'Das Modul (data.modul) ist fuer diesen Betrieb nicht gebucht. Kasseneck schaltet es frei.',
127
131
  cashregister_limit: 'Hoechstens 20 Registrierkassen je Betrieb. Eine bestehende nutzen.',
128
132
  cashregister_not_found: 'Diese cashregisterId gibt es bei diesem Betrieb nicht.',
133
+ vertrag_offen: 'Nur live: der Betrieb hat Auftragsverarbeitungs- und Nutzungsvertrag noch nicht bestaetigt. An der Kasse aendert sich nichts. Den Betrieb ueber den Einrichtungs-Link bestaetigen lassen (sendPartnerCustomerFonLink, Stand in avv/terms von getPartnerCustomer), danach activateCashregister erneut.',
129
134
  activation_failed: 'Die Inbetriebnahme blieb an data.step haengen (ggf. data.rc). activateCashregister erneut aufrufen — jeder Schritt ist idempotent, der Lauf setzt an der Bruchstelle an.',
130
135
  webhook_limit: 'Hoechstens 10 Webhook-Endpunkte je Partner. Einen ungenutzten loeschen.',
131
136
  webhook_inactive: 'Der Webhook steht auf active:false. Zuerst aktivieren, dann erneut proben.',
@@ -12,17 +12,21 @@
12
12
  * Was hier steht, ist die Benutzung dieses Clients.
13
13
  *
14
14
  * Reihenfolge der Kette: [PARTNER_ABLAUF].
15
+ *
16
+ * **Seit 0.28.0 spricht dieser Teil die englische `/v3`** ([PARTNER_BASE_URL]).
17
+ * Alles andere im Paket (Belege, Rechnungen, Kasse, Druck, Zahlungen) bleibt
18
+ * auf `/v1`, bis es dort eine `/v3` gibt.
15
19
  */
16
- export { createPartnerApi, type PartnerApi, type PartnerApiOptions } from './api.js';
20
+ export { createPartnerApi, PARTNER_BASE_URL, type PartnerApi, type PartnerApiOptions } from './api.js';
17
21
  export { partnerKeyAuth, partnerKeyEnv, type PartnerKeyAuthOptions } from './auth.js';
18
22
  export { PARTNER_ABLAUF, naechsterSchritt, type AblaufSchritt, } from './ablauf.js';
19
23
  export { PARTNER_FEHLER_CODES, PARTNER_PORTAL_FEHLER_CODES, istPartnerFehlerCode, istPartnerPortalFehlerCode, istPartnerFehler, partnerFehlerCode, partnerFehlerRat, partnerFeldFehler, partnerWartezeitSek, type PartnerCode, type PartnerFehlerCode, type PartnerPortalFehlerCode, type PartnerFeldFehler, } from './fehler.js';
20
24
  export { BETRIEB_FELDER, unbekannteBetriebsfelder, type BetriebFeld, } from './betrieb.js';
21
25
  export { KasseneckSecret, SECRET_MASKE } from './secret.js';
22
26
  export { getPartnerInfo, createPartnerCustomer, listPartnerCustomers, checkPartnerCustomerEmail, getPartnerCustomer, sendPartnerCustomerFonLink, requestCustomerSignature, getCustomerSignatureStatus, createCustomerCashregister, activateCashregister, listCustomerCashregisters, getCustomerCredentials, } from './endpunkte.js';
23
- export { createPartnerWebhook, listPartnerWebhooks, rotatePartnerWebhookSecret, updatePartnerWebhook, deletePartnerWebhook, sendPartnerWebhookTest, listPartnerWebhookDeliveries, parseWebhookEvent, istPartnerWebhookEvent, PARTNER_WEBHOOK_EVENTS, WEBHOOK_UMSCHLAG_FELDER, type PartnerWebhookEvent, type PartnerWebhookEventType, type PartnerWebhook, type CreateWebhookOptions, type CreateWebhookResult, type WebhookPatch, type WebhookListe, type WebhookZustellung, type WebhookTestResult, type WebhookEventResult, } from './webhooks.js';
27
+ export { createPartnerWebhook, listPartnerWebhooks, rotatePartnerWebhookSecret, updatePartnerWebhook, deletePartnerWebhook, sendPartnerWebhookTest, listPartnerWebhookDeliveries, parseWebhookEvent, istPartnerWebhookEvent, PARTNER_WEBHOOK_EVENTS, WEBHOOK_UMSCHLAG_FELDER, type PartnerWebhookEvent, type PartnerWebhookEventType, type PartnerWebhook, type CreateWebhookOptions, type CreateWebhookResult, type DeleteWebhookResult, type WebhookApiVersion, type WebhookDeliveryStatus, type WebhookTestZustellung, type ContractKind, type ContractSource, type ContractAcceptedEventData, type WebhookPatch, type WebhookListe, type WebhookZustellung, type WebhookTestResult, type WebhookEventResult, } from './webhooks.js';
24
28
  export { verifyWebhookSignature, parseSignatureHeader, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, WEBHOOK_RETRY_PLAN_SEC, WEBHOOK_MAX_ATTEMPTS, WEBHOOK_TIMEOUT_MS, WEBHOOK_LIMIT, type VerifyWebhookOptions, type WebhookVerifyResult, type WebhookVerifyReason, } from './webhook-signatur.js';
25
29
  export { PARTNER_ENVS } from './typen.js';
26
- export type { PartnerEnv, PartnerScope, PartnerApp, PartnerInfo, Rechtsform, Bundesland, KontaktRolle, BetriebAdresse, BetriebSteuer, BetriebKontakt, BetriebSteuerberater, Betrieb, CreateCustomerOptions, CreateCustomerResult, KundenStatus, KundenZeile, AvvStand, ListCustomersOptions, KundenListe, Kunde, FonLinkResult, SignaturAntragStatus, SignaturHistorieEintrag, SignaturAntrag, RequestSignatureResult, SignaturStand, KassenSchritt, KassenStatus, Kasse, CreateCashregisterOptions, CreateCashregisterResult, ActivateCashregisterResult, KassenListe, CustomerCashregisterCredential, CustomerCredentials, } from './typen.js';
30
+ export type { PartnerEnv, PartnerScope, PartnerApp, PartnerInfo, LegalForm, AustrianState, ContactRole, AvvMode, FeeInterval, PartnerFee, SignatureHistoryReason, RequestSignatureOptions, CustomerSignature, Rechtsform, Bundesland, KontaktRolle, BetriebAdresse, BetriebSteuer, BetriebKontakt, BetriebSteuerberater, Betrieb, CreateCustomerOptions, CreateCustomerResult, KundenStatus, KundenZeile, AvvStand, VertragStand, KundenFonStand, ListCustomersOptions, KundenListe, Kunde, FonLinkResult, SignaturAntragStatus, SignaturHistorieEintrag, SignaturAntrag, RequestSignatureResult, SignaturStand, KassenSchritt, KassenStatus, Kasse, CreateCashregisterOptions, CreateCashregisterResult, ActivateCashregisterResult, KassenListe, CustomerCashregisterCredential, CustomerCredentials, } from './typen.js';
27
31
  /** `credentials:read` — nicht im Standardsatz, siehe typen.ts. */
28
32
  export { SCOPE_CREDENTIALS } from './typen.js';
@@ -12,8 +12,12 @@
12
12
  * Was hier steht, ist die Benutzung dieses Clients.
13
13
  *
14
14
  * Reihenfolge der Kette: [PARTNER_ABLAUF].
15
+ *
16
+ * **Seit 0.28.0 spricht dieser Teil die englische `/v3`** ([PARTNER_BASE_URL]).
17
+ * Alles andere im Paket (Belege, Rechnungen, Kasse, Druck, Zahlungen) bleibt
18
+ * auf `/v1`, bis es dort eine `/v3` gibt.
15
19
  */
16
- export { createPartnerApi } from './api.js';
20
+ export { createPartnerApi, PARTNER_BASE_URL } from './api.js';
17
21
  export { partnerKeyAuth, partnerKeyEnv } from './auth.js';
18
22
  export { PARTNER_ABLAUF, naechsterSchritt, } from './ablauf.js';
19
23
  export { PARTNER_FEHLER_CODES, PARTNER_PORTAL_FEHLER_CODES, istPartnerFehlerCode, istPartnerPortalFehlerCode, istPartnerFehler, partnerFehlerCode, partnerFehlerRat, partnerFeldFehler, partnerWartezeitSek, } from './fehler.js';