@kreiseck/kasseneck-api 0.27.3 → 0.29.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 (36) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +87 -2
  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 +28 -2
  10. package/dist/cjs/partner/fehler.js +58 -9
  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 +152 -35
  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/esm/partner/ablauf.d.ts +4 -3
  18. package/dist/esm/partner/ablauf.js +4 -3
  19. package/dist/esm/partner/api.d.ts +20 -8
  20. package/dist/esm/partner/api.js +11 -1
  21. package/dist/esm/partner/endpunkte.d.ts +9 -12
  22. package/dist/esm/partner/endpunkte.js +85 -26
  23. package/dist/esm/partner/fehler.d.ts +28 -2
  24. package/dist/esm/partner/fehler.js +58 -9
  25. package/dist/esm/partner/index.d.ts +7 -3
  26. package/dist/esm/partner/index.js +5 -1
  27. package/dist/esm/partner/typen.d.ts +152 -35
  28. package/dist/esm/partner/typen.js +4 -0
  29. package/dist/esm/partner/webhooks.d.ts +76 -14
  30. package/dist/esm/partner/webhooks.js +40 -12
  31. package/fixtures/hobex-hps-codes.json +1 -1
  32. package/fixtures/kasse-texte.json +1 -1
  33. package/fixtures/oberflaeche.json +12 -4
  34. package/fixtures/rechnung-api.schema.json +1 -1
  35. package/fixtures/rechnung-texte.json +1 -1
  36. package/package.json +1 -1
@@ -20,6 +20,32 @@
20
20
  * unterscheiden. Deshalb stehen hier BEIDE Flaechen: die der Schnittstelle
21
21
  * ([PARTNER_FEHLER_CODES]) und die des Partner-Portals
22
22
  * ([PARTNER_PORTAL_FEHLER_CODES]).
23
+ *
24
+ * **Seit 0.29.0 englisch, wie der Rest von `/v3`.** Dieser Client spricht seit
25
+ * 0.28.0 ausschliesslich `/v3` (`PARTNER_BASE_URL`): die paar deutschen Codes,
26
+ * die der Server bis dahin noch roh durchreichte, kommen jetzt genauso englisch
27
+ * an wie alle anderen. [PARTNER_FEHLER_CODES] fuehrt deshalb ausnahmslos die
28
+ * `/v3`-Schreibweise aus `fehlercodes.json`s `v3`-Zuordnung (deutsch -> englisch);
29
+ * ein Aufrufer bekommt vom Server nie mehr die deutsche Form.
30
+ *
31
+ * **`kein_partnerbetrieb` und `request_not_found` fehlen absichtlich.** Beide
32
+ * sind admin-only (`partner-endpoints.js`, ausserhalb von `FEHLER_KATALOG`) und
33
+ * erreichen `/v3` nie: ein Partner-Aufruf kann sie unter keinem Pfad bekommen.
34
+ * Sie standen frueher versehentlich in dieser Liste; `dart-partner.json` (ein
35
+ * eingefrorener Abzug aus Dart 5.3.0, bevor das korrigiert wurde) fuehrt sie
36
+ * weiterhin, siehe die Ausnahme in `test/partner-enums.test.ts`.
37
+ *
38
+ * **Die Vertrags-Codes (`kind_not_allowed`, `mode_not_allowed`,
39
+ * `power_of_attorney_missing`, `not_found`, `no_version`,
40
+ * `unknown_version`, `text_changed`, `already_accepted`) stehen hier, obwohl
41
+ * dieses Paket `reportCustomerContract` nicht anbietet.** Der Katalog des
42
+ * Backends fuehrt sie mit `flaeche: 'api'`/`'beide'`, dieselbe Regel wie bei
43
+ * den Portal-Codes oben: vollstaendig heisst vollstaendig, auch fuer einen
44
+ * Endpunkt, den (noch) kein Aufruf dieses Clients ausloest. Ein Server-Update,
45
+ * das den Endpunkt ergaenzt, bräuchte dann keinen zweiten Fehlerkatalog-Umbau.
46
+ * `not_required` fehlt bewusst: derselbe gemeinsame Server-Zweig wie die
47
+ * anderen sechs, aber ueber die Partner-API nicht erreichbar (der Server hat
48
+ * ihn aus `FEHLER_KATALOG` entfernt, siehe `partner-core.js` im Backend).
23
49
  */
24
50
  Object.defineProperty(exports, "__esModule", { value: true });
25
51
  exports.PARTNER_PORTAL_FEHLER_CODES = exports.PARTNER_FEHLER_CODES = void 0;
@@ -44,19 +70,19 @@ exports.PARTNER_FEHLER_CODES = [
44
70
  'rate_limited',
45
71
  'app_not_found',
46
72
  'app_not_accepted',
47
- 'kein_partnerbetrieb',
48
73
  'live_not_allowed',
49
74
  // Betrieb anlegen
50
75
  'customer_exists',
51
76
  'customer_conflict',
52
77
  'customer_limit',
53
- 'zugang_nicht_erlaubt',
78
+ 'access_not_allowed',
54
79
  'email_taken',
55
80
  'no_email',
81
+ // FinanzOnline-Link
82
+ 'tax_number_missing',
56
83
  // Signatur
57
84
  'fon_missing',
58
85
  'signature_pending',
59
- 'request_not_found',
60
86
  'signature_missing',
61
87
  'signature_unknown',
62
88
  'signature_ambiguous',
@@ -67,6 +93,17 @@ exports.PARTNER_FEHLER_CODES = [
67
93
  'module_inactive',
68
94
  'cashregister_limit',
69
95
  'cashregister_not_found',
96
+ 'contracts_pending',
97
+ // Vertraege (reportCustomerContract: dieses Paket bietet den Endpunkt nicht
98
+ // an, der Katalog fuehrt die Codes trotzdem vollstaendig, siehe oben)
99
+ 'kind_not_allowed',
100
+ 'mode_not_allowed',
101
+ 'power_of_attorney_missing',
102
+ 'not_found',
103
+ 'no_version',
104
+ 'unknown_version',
105
+ 'text_changed',
106
+ 'already_accepted',
70
107
  'activation_failed',
71
108
  // Webhooks
72
109
  'webhook_limit',
@@ -116,26 +153,38 @@ const RAT = {
116
153
  rate_limited: 'Zu viele Aufrufe. data.retryAfterSec Sekunden warten und denselben Aufruf wiederholen.',
117
154
  app_not_found: 'Die appId gibt es nicht. getPartnerInfo liefert die eigenen Apps samt id.',
118
155
  app_not_accepted: 'Diese App hat noch keine abgenommene Version. Mit einem pk_test_-Schluessel oder mit env:"test" geht es sofort weiter; live erst nach der Abnahme.',
119
- kein_partnerbetrieb: 'Dieser Betrieb gehoert nicht zu diesem Partner-Konto. Die eigenen stehen in listPartnerCustomers.',
120
156
  live_not_allowed: 'Ein Test-Schluessel erzeugt nichts Echtes. Fuer einen Live-Betrieb den Live-Schluessel nehmen — umgekehrt darf ein Live-Schluessel mit env:"test" sehr wohl einen Testbetrieb anlegen.',
121
157
  customer_exists: 'Diesen Betrieb gibt es schon (data.customerId). Mit derselben customerId weiterarbeiten.',
122
158
  customer_conflict: 'Die Steuernummer ist bei Kasseneck bereits registriert. Die Zuordnung zum Partner macht Kasseneck — hello@kasseneck.at.',
123
159
  customer_limit: 'Das Tageslimit fuer neue Betriebe ist erreicht (data.max, data.resetAt). Morgen weiter.',
124
- 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).',
160
+ access_not_allowed: '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).',
125
161
  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.',
126
162
  no_email: 'Im Konto des Betriebs steht keine E-Mail-Adresse. Ohne sie geht weder eine Einladung noch der FinanzOnline-Link hinaus.',
163
+ tax_number_missing: '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.',
127
164
  fon_missing: 'Der Betrieb hat noch keinen FinanzOnline-Zugang. sendPartnerCustomerFonLink senden und customer.fon_verified abwarten. Betrifft das ANMELDEN der Signatureinheit, nicht das Beantragen.',
128
165
  signature_pending: 'Fuer diesen Betrieb laeuft bereits ein Antrag. Auf signature.ready warten.',
129
- request_not_found: 'Diese signaturId gibt es nicht. getCustomerSignatureStatus nennt die des Betriebs.',
130
166
  signature_missing: 'Der Betrieb hat ueberhaupt keine Signatur, und jede Kasse bezieht sich auf eine. Zuerst requestCustomerSignature.',
131
- signature_unknown: 'Die genannte signaturId gehoert nicht zu diesem Betrieb. getCustomerSignatureStatus nennt die seinen.',
132
- signature_ambiguous: 'Der Betrieb hat mehrere Signaturen; welche die Kasse benutzt, muss dastehen. Eine aus data.choices als signaturId mitgeben.',
167
+ signature_unknown: 'Die genannte signatureRequestId gehoert nicht zu diesem Betrieb. getCustomerSignatureStatus nennt die seinen.',
168
+ signature_ambiguous: 'Der Betrieb hat mehrere Signaturen; welche die Kasse benutzt, muss dastehen. Eine aus data.choices als signatureRequestId mitgeben.',
133
169
  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.',
134
170
  signature_limit: 'Hoechstens zehn Signaturen je Betrieb. Eine bestehende benutzen, statt mit additional:true eine weitere zu beantragen.',
135
171
  signature_failed: 'FinanzOnline hat die Anmeldung abgelehnt (data.rc). Kasseneck klaert das — hello@kasseneck.at.',
136
- module_inactive: 'Das Modul (data.modul) ist fuer diesen Betrieb nicht gebucht. Kasseneck schaltet es frei.',
172
+ module_inactive: 'Das Modul (data.module, z. B. "cash_register", Text in data.detail) ist fuer diesen Betrieb nicht gebucht. Kasseneck schaltet es frei.',
137
173
  cashregister_limit: 'Hoechstens 20 Registrierkassen je Betrieb. Eine bestehende nutzen.',
138
174
  cashregister_not_found: 'Diese cashregisterId gibt es bei diesem Betrieb nicht.',
175
+ contracts_pending: '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.',
176
+ // -- Vertraege (reportCustomerContract) ------------------------------------
177
+ // Dieser Client bietet den Endpunkt (noch) nicht an; die Codes stehen hier
178
+ // nur fuer die Katalogseite und fuer einen Aufrufer, der die rohe Antwort
179
+ // selbst auswertet (siehe Kopfkommentar der Datei).
180
+ kind_not_allowed: 'reportCustomerContract mit einer anderen Art als "avv". Der Vollmachtsweg nimmt nur den Auftragsverarbeitungsvertrag entgegen. Dieser Client bietet den Endpunkt nicht an.',
181
+ mode_not_allowed: 'Der Vollmachtsweg ist fuer dieses Partner-Konto nicht freigeschaltet. Kasseneck fragen (hello@kasseneck.at).',
182
+ power_of_attorney_missing: 'Der Partnervertrag mit dem Vollmachts-Kapitel ist noch nicht bestaetigt. Erst danach nimmt der Vollmachtsweg Meldungen entgegen.',
183
+ not_found: 'Die genannte customerId gehoert nicht zu diesem Partner-Konto oder existiert nicht. listPartnerCustomers nennt die eigenen.',
184
+ no_version: 'Fuer die gemeldete Vertragsart gibt es derzeit keine gueltige Fassung. Bei Kasseneck nachfragen.',
185
+ unknown_version: 'Die gemeldete Vertragsversion gibt es nicht. Die aktuell geltende Fassung neu abrufen.',
186
+ text_changed: 'Der gezeigte Vertragstext hat sich seit dem Laden geaendert (data.textHash traegt die aktuell geltende Pruefsumme). Neu laden und danach erneut bestaetigen lassen.',
187
+ already_accepted: 'Diese Fassung ist bereits bestaetigt (data.contractId). Nichts weiter zu tun.',
139
188
  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.',
140
189
  webhook_limit: 'Hoechstens 10 Webhook-Endpunkte je Partner. Einen ungenutzten loeschen.',
141
190
  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, SignatureErrorCode, 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';
@@ -13,12 +13,17 @@
13
13
  * Was hier steht, ist die Benutzung dieses Clients.
14
14
  *
15
15
  * Reihenfolge der Kette: [PARTNER_ABLAUF].
16
+ *
17
+ * **Seit 0.28.0 spricht dieser Teil die englische `/v3`** ([PARTNER_BASE_URL]).
18
+ * Alles andere im Paket (Belege, Rechnungen, Kasse, Druck, Zahlungen) bleibt
19
+ * auf `/v1`, bis es dort eine `/v3` gibt.
16
20
  */
17
21
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.WEBHOOK_TIMEOUT_MS = exports.WEBHOOK_MAX_ATTEMPTS = exports.WEBHOOK_RETRY_PLAN_SEC = exports.WEBHOOK_TOLERANCE_SEC = exports.WEBHOOK_DELIVERY_HEADER = exports.WEBHOOK_EVENT_HEADER = exports.WEBHOOK_SIGNATURE_HEADER = exports.parseSignatureHeader = exports.verifyWebhookSignature = exports.WEBHOOK_UMSCHLAG_FELDER = exports.PARTNER_WEBHOOK_EVENTS = exports.istPartnerWebhookEvent = exports.parseWebhookEvent = exports.listPartnerWebhookDeliveries = exports.sendPartnerWebhookTest = exports.deletePartnerWebhook = exports.updatePartnerWebhook = exports.rotatePartnerWebhookSecret = exports.listPartnerWebhooks = exports.createPartnerWebhook = exports.getCustomerCredentials = exports.listCustomerCashregisters = exports.activateCashregister = exports.createCustomerCashregister = exports.getCustomerSignatureStatus = exports.requestCustomerSignature = exports.sendPartnerCustomerFonLink = exports.getPartnerCustomer = exports.checkPartnerCustomerEmail = exports.listPartnerCustomers = exports.createPartnerCustomer = exports.getPartnerInfo = exports.SECRET_MASKE = exports.KasseneckSecret = exports.unbekannteBetriebsfelder = exports.BETRIEB_FELDER = exports.partnerWartezeitSek = exports.partnerFeldFehler = exports.partnerFehlerRat = exports.partnerFehlerCode = exports.istPartnerFehler = exports.istPartnerPortalFehlerCode = exports.istPartnerFehlerCode = exports.PARTNER_PORTAL_FEHLER_CODES = exports.PARTNER_FEHLER_CODES = exports.naechsterSchritt = exports.PARTNER_ABLAUF = exports.partnerKeyEnv = exports.partnerKeyAuth = exports.createPartnerApi = void 0;
19
- exports.SCOPE_CREDENTIALS = exports.PARTNER_ENVS = exports.WEBHOOK_LIMIT = void 0;
22
+ exports.WEBHOOK_MAX_ATTEMPTS = exports.WEBHOOK_RETRY_PLAN_SEC = exports.WEBHOOK_TOLERANCE_SEC = exports.WEBHOOK_DELIVERY_HEADER = exports.WEBHOOK_EVENT_HEADER = exports.WEBHOOK_SIGNATURE_HEADER = exports.parseSignatureHeader = exports.verifyWebhookSignature = exports.WEBHOOK_UMSCHLAG_FELDER = exports.PARTNER_WEBHOOK_EVENTS = exports.istPartnerWebhookEvent = exports.parseWebhookEvent = exports.listPartnerWebhookDeliveries = exports.sendPartnerWebhookTest = exports.deletePartnerWebhook = exports.updatePartnerWebhook = exports.rotatePartnerWebhookSecret = exports.listPartnerWebhooks = exports.createPartnerWebhook = exports.getCustomerCredentials = exports.listCustomerCashregisters = exports.activateCashregister = exports.createCustomerCashregister = exports.getCustomerSignatureStatus = exports.requestCustomerSignature = exports.sendPartnerCustomerFonLink = exports.getPartnerCustomer = exports.checkPartnerCustomerEmail = exports.listPartnerCustomers = exports.createPartnerCustomer = exports.getPartnerInfo = exports.SECRET_MASKE = exports.KasseneckSecret = exports.unbekannteBetriebsfelder = exports.BETRIEB_FELDER = exports.partnerWartezeitSek = exports.partnerFeldFehler = exports.partnerFehlerRat = exports.partnerFehlerCode = exports.istPartnerFehler = exports.istPartnerPortalFehlerCode = exports.istPartnerFehlerCode = exports.PARTNER_PORTAL_FEHLER_CODES = exports.PARTNER_FEHLER_CODES = exports.naechsterSchritt = exports.PARTNER_ABLAUF = exports.partnerKeyEnv = exports.partnerKeyAuth = exports.PARTNER_BASE_URL = exports.createPartnerApi = void 0;
23
+ exports.SCOPE_CREDENTIALS = exports.PARTNER_ENVS = exports.WEBHOOK_LIMIT = exports.WEBHOOK_TIMEOUT_MS = void 0;
20
24
  var api_js_1 = require("./api.js");
21
25
  Object.defineProperty(exports, "createPartnerApi", { enumerable: true, get: function () { return api_js_1.createPartnerApi; } });
26
+ Object.defineProperty(exports, "PARTNER_BASE_URL", { enumerable: true, get: function () { return api_js_1.PARTNER_BASE_URL; } });
22
27
  var auth_js_1 = require("./auth.js");
23
28
  Object.defineProperty(exports, "partnerKeyAuth", { enumerable: true, get: function () { return auth_js_1.partnerKeyAuth; } });
24
29
  Object.defineProperty(exports, "partnerKeyEnv", { enumerable: true, get: function () { return auth_js_1.partnerKeyEnv; } });
@@ -12,6 +12,10 @@
12
12
  * einfuehrt, soll diesen Client nicht zum Absturz bringen, sondern ihn
13
13
  * durchreichen. Eingabetypen sind dagegen eng — ein Tippfehler soll ein
14
14
  * Compilerfehler sein und keine `validation`-Antwort vom Server.
15
+ *
16
+ * **Die Formen sind die der `/v3`** (seit 0.28.0): Feldnamen und Werte, auf
17
+ * die ein Programm verzweigt, sind englisch; Texte fuer Menschen (`message`,
18
+ * `note`, `statusText`, `nextSteps`) bleiben deutsch, die Fehlercodes ebenso.
15
19
  */
16
20
  import type { KasseneckSecret } from './secret.js';
17
21
  /**
@@ -67,9 +71,29 @@ export interface PartnerInfo {
67
71
  };
68
72
  apps: PartnerApp[];
69
73
  }
70
- export type Rechtsform = 'einzel' | 'eu' | 'og' | 'kg' | 'gmbh' | 'gmbhcokg' | 'ag' | 'verein' | 'sonstige';
71
- export type Bundesland = 'burgenland' | 'kaernten' | 'niederoesterreich' | 'oberoesterreich' | 'salzburg' | 'steiermark' | 'tirol' | 'vorarlberg' | 'wien';
72
- export type KontaktRolle = 'geschaeftsfuehrung' | 'buchhaltung' | 'technik' | 'kasse';
74
+ /**
75
+ * Rechtsform des Betriebs, so wie `/v3` sie schreibt und liest.
76
+ *
77
+ * Die oesterreichischen Kurzformen (`eu`, `og`, `kg`, `gmbh`, `gmbhcokg`, `ag`)
78
+ * bleiben wie sie sind; nur die drei Woerter, die es auf Englisch gibt, sind
79
+ * englisch. `/v3` weist die deutschen Werte aus `/v1` (`einzel`, `verein`,
80
+ * `sonstige`) mit `validation` ab, statt sie still zu uebersetzen.
81
+ */
82
+ export type LegalForm = 'sole_proprietor' | 'eu' | 'og' | 'kg' | 'gmbh' | 'gmbhcokg' | 'ag' | 'association' | 'other';
83
+ /** @deprecated Seit 0.28.0 dasselbe wie [LegalForm] (englische Werte der `/v3`). */
84
+ export type Rechtsform = LegalForm;
85
+ /**
86
+ * Bundesland als ISO-3166-2-Code: `AT-1` Burgenland, `AT-2` Kaernten,
87
+ * `AT-3` Niederoesterreich, `AT-4` Oberoesterreich, `AT-5` Salzburg,
88
+ * `AT-6` Steiermark, `AT-7` Tirol, `AT-8` Vorarlberg, `AT-9` Wien.
89
+ */
90
+ export type AustrianState = 'AT-1' | 'AT-2' | 'AT-3' | 'AT-4' | 'AT-5' | 'AT-6' | 'AT-7' | 'AT-8' | 'AT-9';
91
+ /** @deprecated Seit 0.28.0 dasselbe wie [AustrianState] (ISO-Codes der `/v3`). */
92
+ export type Bundesland = AustrianState;
93
+ /** Rolle einer Kontaktperson; `/v1` sagte `geschaeftsfuehrung`, `buchhaltung`, `technik`, `kasse`. */
94
+ export type ContactRole = 'management' | 'accounting' | 'technical' | 'pos';
95
+ /** @deprecated Seit 0.28.0 dasselbe wie [ContactRole] (englische Werte der `/v3`). */
96
+ export type KontaktRolle = ContactRole;
73
97
  export interface BetriebAdresse {
74
98
  street: string;
75
99
  /** Hausnummer, kurz und alphanumerisch: `49`, `12a`, `49/5`. */
@@ -82,8 +106,11 @@ export interface BetriebSteuer {
82
106
  /** Steuernummer im Format `12-345/6789`; die Pruefziffer wird geprueft. */
83
107
  taxNumber: string;
84
108
  smallBusiness: boolean;
85
- /** UID, z. B. `ATU12345675`. */
86
- uid?: string;
109
+ /**
110
+ * UID, z. B. `ATU12345675`. Heisst auf der Leitung `vatId` (auch schon unter
111
+ * `/v1`); ein `uid` wies der Server als unbekanntes Feld ab.
112
+ */
113
+ vatId?: string;
87
114
  /** GLN, 13 Ziffern. */
88
115
  gln?: string;
89
116
  }
@@ -91,7 +118,7 @@ export interface BetriebKontakt {
91
118
  name: string;
92
119
  email: string;
93
120
  phone?: string;
94
- roles?: KontaktRolle[];
121
+ roles?: ContactRole[];
95
122
  }
96
123
  export interface BetriebSteuerberater {
97
124
  name: string;
@@ -115,11 +142,11 @@ export interface BetriebSteuerberater {
115
142
  */
116
143
  export interface Betrieb {
117
144
  companyName: string;
118
- legalForm: Rechtsform;
145
+ legalForm: LegalForm;
119
146
  /** Anmeldung des Betriebs im Kasseneck-Panel; darf dort noch keinen Zugang haben. */
120
147
  email: string;
121
148
  address: BetriebAdresse;
122
- state: Bundesland;
149
+ state: AustrianState;
123
150
  taxDetails: BetriebSteuer;
124
151
  /** Mindestens einer, hoechstens zehn. */
125
152
  contacts: BetriebKontakt[];
@@ -171,6 +198,20 @@ export interface CreateCustomerOptions {
171
198
  env?: PartnerEnv;
172
199
  }
173
200
  export type KundenStatus = 'created' | 'fon_configured' | 'signature_requested' | 'signature_ready' | 'cashregister_created' | 'live' | 'blocked' | (string & {});
201
+ /** Abrechnungsrhythmus eines Entgelts; `/v1` sagte `monat`, `jahr`, `einmal`. */
202
+ export type FeeInterval = 'monthly' | 'yearly' | 'once';
203
+ /**
204
+ * Das Entgelt, das mit einem Aufruf gebucht wurde: nur dann in der Antwort,
205
+ * wenn die Konditionen des Partners dafuer einen Preis vorsehen. Unter `/v1`
206
+ * hiess es `entgelt` mit `rhythmus`.
207
+ */
208
+ export interface PartnerFee {
209
+ /** Betrag in ganzen Cent. */
210
+ cents: number;
211
+ interval: FeeInterval | (string & {});
212
+ /** `true` fuer einen Testbetrieb: gebucht, aber nicht verrechnet. */
213
+ test: boolean;
214
+ }
174
215
  export interface CreateCustomerResult {
175
216
  customerId: string;
176
217
  status: KundenStatus;
@@ -182,24 +223,48 @@ export interface CreateCustomerResult {
182
223
  sentTo: string | null;
183
224
  };
184
225
  nextSteps: string[];
226
+ /** Das gebuchte Entgelt; `null`, wenn die Konditionen keinen Preis dafuer vorsehen. */
227
+ fee: PartnerFee | null;
185
228
  /** `true`, wenn derselbe `idempotencyKey` schon einmal ankam. */
186
229
  replayed: boolean;
187
230
  }
188
231
  /**
189
- * Stand des Auftragsverarbeitungsvertrags eines Betriebs.
232
+ * Wie das Partnerkonto den AVV handhabt; `/v1` sagte `direkt`, `vollmacht`,
233
+ * `unterauftrag`.
234
+ */
235
+ export type AvvMode = 'direct' | 'power_of_attorney' | 'subprocessor';
236
+ /**
237
+ * Stand eines Vertrags des Betriebs mit Kasseneck: `pending` (noch nicht
238
+ * bestaetigt), `confirmed`, `outdated` (eine neuere Pflichtfassung ist zu
239
+ * bestaetigen) oder `not_required` (Testumgebung).
190
240
  *
191
- * **Vertraege wirken im Partner-Weg nicht mehr** (Stand 2026-08-31): keine
192
- * Antwort fuehrt dieses Feld, kein Schritt in `naechsteSchritte` verlangt
193
- * einen Vertrag, und eine Kasse geht deswegen nicht weniger live. Der Typ
194
- * bleibt, damit eine Antwort, die ihn doch noch traegt, lesbar durchkommt —
195
- * **vorausgesetzt wird er nirgends**. Fuer selbst registrierte Kunden gibt es
196
- * die Maschinerie weiterhin, aber nicht ueber diese Schnittstelle.
241
+ * **Die Vertraege wirken:** live geht ohne beide (AVV und Nutzungsvertrag)
242
+ * keine Kasse live, `activateCashregister` antwortet dann `vertrag_offen`. Der
243
+ * Betrieb bestaetigt sie selbst ueber den Einrichtungs-Link
244
+ * (`sendPartnerCustomerFonLink`); die Ereignisse `customer.avv_accepted` und
245
+ * `customer.terms_accepted` melden die Bestaetigung. In der Testumgebung sind
246
+ * sie nicht noetig.
197
247
  */
198
- export interface AvvStand {
199
- status: string;
248
+ export interface VertragStand {
249
+ status: 'pending' | 'confirmed' | 'outdated' | 'not_required' | (string & {});
200
250
  version: string | null;
201
251
  confirmedAt: number | null;
202
- mode: string | null;
252
+ }
253
+ /**
254
+ * Stand des Auftragsverarbeitungsvertrags (AVV, Art. 28 DSGVO). Zusaetzlich zu
255
+ * [VertragStand] der Status `via_partner` (der Partnervertrag deckt den AVV,
256
+ * Weg `subprocessor`) und `mode`, der Weg des Partnerkontos.
257
+ */
258
+ export interface AvvStand extends VertragStand {
259
+ status: VertragStand['status'] | 'via_partner';
260
+ mode: AvvMode | (string & {}) | null;
261
+ }
262
+ /** FinanzOnline-Stand in der Liste: ist der Link draussen, geoeffnet, der Zugang geprueft? */
263
+ export interface KundenFonStand {
264
+ configured: boolean;
265
+ linkSentAt: number | null;
266
+ /** Erste Oeffnung; wird mit einem Ersatz-Link zurueckgesetzt. */
267
+ linkOpenedAt: number | null;
203
268
  }
204
269
  export interface KundenZeile {
205
270
  customerId: string;
@@ -208,12 +273,15 @@ export interface KundenZeile {
208
273
  appId: string | null;
209
274
  env: PartnerEnv;
210
275
  createdAt: number | null;
276
+ /** FinanzOnline-Stand; `null`, wenn die Antwort ihn nicht fuehrt. */
277
+ fon: KundenFonStand | null;
211
278
  /**
212
- * Vertragsstand, falls die Antwort ihn ueberhaupt fuehrt — heute tut sie das
213
- * nicht, der Wert ist dann `null`. Siehe [AvvStand]: nichts in diesem Client
214
- * setzt ihn voraus.
279
+ * AVV-Stand; `null`, wenn die Antwort ihn nicht fuehrt. Kein erfundenes
280
+ * `pending`: "nicht mitgeliefert" und "nicht bestaetigt" sind zweierlei.
215
281
  */
216
282
  avv: AvvStand | null;
283
+ /** Stand des Nutzungsvertrags; `null`, wenn die Antwort ihn nicht fuehrt. */
284
+ terms: VertragStand | null;
217
285
  }
218
286
  export interface ListCustomersOptions {
219
287
  status?: KundenStatus;
@@ -233,9 +301,10 @@ export interface Kunde extends KundenZeile {
233
301
  createdAt: number | null;
234
302
  createdVia: string | null;
235
303
  business: Record<string, unknown>;
236
- fon: {
237
- configured: boolean;
304
+ /** In der Einzelsicht zusaetzlich: wann geprueft, an welche (maskierte) Adresse der Link ging. */
305
+ fon: KundenFonStand & {
238
306
  verifiedAt: number | null;
307
+ linkSentTo: string | null;
239
308
  };
240
309
  access: {
241
310
  email: string | null;
@@ -250,26 +319,39 @@ export interface FonLinkResult {
250
319
  expiresAt: number;
251
320
  }
252
321
  /**
253
- * `beantragt → zugeteilt → registriert → bereit`. `registriert` heisst: die
254
- * Einheit ist FinanzOnline bekannt; `bereit` heisst: sie darf signieren. In der
255
- * Testumgebung wird ohne `registriert` direkt `bereit` erreicht.
322
+ * `requested → assigned → registered → ready`. `registered` heisst: die
323
+ * Einheit ist FinanzOnline bekannt; `ready` heisst: sie darf signieren. In der
324
+ * Testumgebung wird ohne `registered` direkt `ready` erreicht.
256
325
  */
257
326
  export type SignaturAntragStatus = 'requested' | 'assigned' | 'registered' | 'ready' | 'failed' | 'cancelled' | (string & {});
327
+ /**
328
+ * Gruende in der Historie eines Signaturantrags. `card_entered` und
329
+ * `finanzonline` hiessen unter `/v1` `karte_eingetragen` und `fon`.
330
+ */
331
+ export type SignatureHistoryReason = 'api' | 'portal' | 'card_entered' | 'finanzonline' | 'automation_off' | 'test_environment' | 'no_stock' | (string & {});
332
+ /**
333
+ * `error.code` eines Signaturantrags oder einer Signatur (`SignaturAntrag`,
334
+ * `CustomerSignature`). Hiess unter `/v1` `kunde_nicht_gefunden` /
335
+ * `unvollstaendig` / `fon_fehler`; dieser Client spricht seit 0.28.0 nur noch
336
+ * `/v3` und sieht darum nur die englische Form.
337
+ */
338
+ export type SignatureErrorCode = 'customer_not_found' | 'incomplete' | 'finanzonline_error' | (string & {});
258
339
  export interface SignaturHistorieEintrag {
259
- von: string | null;
260
- nach: string;
340
+ from: SignaturAntragStatus | null;
341
+ to: SignaturAntragStatus;
261
342
  at: number;
262
- reason: string | null;
343
+ reason: SignatureHistoryReason | null;
263
344
  }
264
345
  export interface SignaturAntrag {
265
346
  requestId: string;
266
347
  status: SignaturAntragStatus;
267
348
  statusText: string;
268
- art: string;
349
+ /** Art der Signatureinheit; heute nur `signature_card`. */
350
+ kind: string;
269
351
  vdaId: string | null;
270
352
  signatureId: string | null;
271
353
  error: {
272
- code: string | null;
354
+ code: SignatureErrorCode | null;
273
355
  message: string | null;
274
356
  rc: string | null;
275
357
  } | null;
@@ -278,18 +360,53 @@ export interface SignaturAntrag {
278
360
  updatedAt: number | null;
279
361
  history: SignaturHistorieEintrag[];
280
362
  }
363
+ export interface RequestSignatureOptions {
364
+ /** Art der Signatureinheit; heute nur `signature_card` (Vorgabe). */
365
+ kind?: string;
366
+ /** `true` beantragt eine WEITERE Signatur, obwohl schon eine besteht. */
367
+ additional?: boolean;
368
+ }
281
369
  export interface RequestSignatureResult {
282
370
  request: SignaturAntrag;
283
371
  /** `true`, wenn schon ein Antrag lief — dann ist es der laufende. */
284
372
  replayed: boolean;
285
373
  note: string | null;
374
+ /** Das gebuchte Entgelt; `null`, wenn die Konditionen keinen Preis dafuer vorsehen. */
375
+ fee: PartnerFee | null;
376
+ }
377
+ /**
378
+ * Eine Signatur des Betriebs, einzeln. Ein Betrieb kann mehrere haben
379
+ * (Ersatzkarte, zweiter Standort); `signatureRequestId` ist die Kennung, auf die
380
+ * sich eine Kasse beruft.
381
+ */
382
+ export interface CustomerSignature {
383
+ signatureRequestId: string;
384
+ status: SignaturAntragStatus | 'decommissioned';
385
+ statusText: string;
386
+ inProgress: boolean;
387
+ ready: boolean;
388
+ kind: string;
389
+ vdaId: string | null;
390
+ requestId: string | null;
391
+ signatureId: string | null;
392
+ error: {
393
+ code: SignatureErrorCode | null;
394
+ message: string | null;
395
+ rc: string | null;
396
+ } | null;
397
+ createdAt: number | null;
398
+ updatedAt: number | null;
286
399
  }
287
400
  export interface SignaturStand {
288
- signatur: {
401
+ customerId: string;
402
+ /** Die Kurzform: hat der Betrieb ueberhaupt eine brauchbare Signatur? */
403
+ signature: {
289
404
  ready: boolean;
290
405
  signatureId: string | null;
291
406
  vdaId: string | null;
292
407
  };
408
+ /** Jede Signatur einzeln. */
409
+ signatures: CustomerSignature[];
293
410
  requests: SignaturAntrag[];
294
411
  fon: {
295
412
  present: boolean;
@@ -297,8 +414,8 @@ export interface SignaturStand {
297
414
  };
298
415
  }
299
416
  /** Die Schritte der Inbetriebnahme, in dieser Reihenfolge. */
300
- export type KassenSchritt = 'signatur' | 'register_cashregister' | 'start_receipt' | 'transmit_start_receipt' | (string & {});
301
- export type KassenStatus = 'draft' | 'laeuft' | 'live' | 'failed' | (string & {});
417
+ export type KassenSchritt = 'signature' | 'register_cashregister' | 'start_receipt' | 'transmit_start_receipt' | (string & {});
418
+ export type KassenStatus = 'draft' | 'in_progress' | 'live' | 'failed' | (string & {});
302
419
  export interface Kasse {
303
420
  cashregisterId: string;
304
421
  name: string | null;
@@ -351,7 +468,7 @@ export interface CreateCashregisterResult {
351
468
  started: boolean;
352
469
  ok: boolean | null;
353
470
  step: KassenSchritt | null;
354
- /** `signature_not_ready` oder `automatik_aus`, wenn nicht gestartet wurde. */
471
+ /** `signature_not_ready` oder `automation_off`, wenn nicht gestartet wurde. */
355
472
  reason: string | null;
356
473
  };
357
474
  }
@@ -13,6 +13,10 @@
13
13
  * einfuehrt, soll diesen Client nicht zum Absturz bringen, sondern ihn
14
14
  * durchreichen. Eingabetypen sind dagegen eng — ein Tippfehler soll ein
15
15
  * Compilerfehler sein und keine `validation`-Antwort vom Server.
16
+ *
17
+ * **Die Formen sind die der `/v3`** (seit 0.28.0): Feldnamen und Werte, auf
18
+ * die ein Programm verzweigt, sind englisch; Texte fuer Menschen (`message`,
19
+ * `note`, `statusText`, `nextSteps`) bleiben deutsch, die Fehlercodes ebenso.
16
20
  */
17
21
  Object.defineProperty(exports, "__esModule", { value: true });
18
22
  exports.SCOPE_CREDENTIALS = exports.PARTNER_ENVS = void 0;
@@ -11,11 +11,11 @@ import { type VerifyWebhookOptions, type WebhookVerifyReason } from './webhook-s
11
11
  * Alle Ereignisse, die ein Webhook abonnieren **und proben** kann. Ein
12
12
  * Endpunkt bekommt ausschliesslich die, die in seiner `events`-Liste stehen.
13
13
  *
14
- * Kasseneck fuehrt daneben interne Ereignisse (etwa den Abschluss eines
15
- * Auftragsverarbeitungsvertrags). Sie stehen hier bewusst nicht: sie lassen
16
- * sich weder abonnieren noch mit [sendPartnerWebhookTest] ausloesen, und ein
17
- * Name in dieser Liste, den niemand bestellen kann, waere ein Versprechen ohne
18
- * Deckung.
14
+ * **Noch nicht in der Liste:** `customer.avv_accepted` und
15
+ * `customer.terms_accepted`. Das Backend bietet sie inzwischen zum Abonnieren
16
+ * an; die Liste wird mit dem Dart-Zwilling gemeinsam erweitert, weil beide
17
+ * gegeneinander geprueft werden. Abonnieren geht trotzdem schon (`events`
18
+ * nimmt jeden Namen), die Nutzlast beschreibt [ContractAcceptedEventData].
19
19
  */
20
20
  export declare const PARTNER_WEBHOOK_EVENTS: readonly ["customer.created", "customer.updated", "customer.status_changed", "customer.fon_verified", "customer.live_enabled", "signature.requested", "signature.ready", "signature.failed", "cashregister.created", "cashregister.live", "cashregister.failed", "app.version.accepted", "app.version.rejected", "webhook.test"];
21
21
  export type PartnerWebhookEventType = typeof PARTNER_WEBHOOK_EVENTS[number];
@@ -58,6 +58,38 @@ export interface PartnerWebhookEvent<T = Record<string, unknown>> {
58
58
  test: boolean;
59
59
  data: T;
60
60
  }
61
+ /**
62
+ * Die Sprache der Nutzlast eines Webhooks. Ein unter `/v1` angelegter Webhook
63
+ * spricht `v1` (deutsche Werte), ein unter `/v3` angelegter `v3`. Umstellen
64
+ * geht nur vorwaerts, mit `updatePartnerWebhook(id, { apiVersion: 'v3' })`;
65
+ * zurueck auf `v1` gibt es absichtlich nicht.
66
+ *
67
+ * Die Sprache der **Antworten** folgt dagegen dem Pfad: dieser Client ruft
68
+ * `/v3` und bekommt englische Antworten, gleich welche `apiVersion` ein
69
+ * Webhook hat.
70
+ */
71
+ export type WebhookApiVersion = 'v1' | 'v3';
72
+ /** Art des Vertrags in `customer.avv_accepted` / `customer.terms_accepted`. */
73
+ export type ContractKind = 'avv' | 'terms';
74
+ /**
75
+ * Wo der Betrieb bestaetigt hat. Unter `v1` hiessen die ersten fuenf
76
+ * `einrichten`, `prozess`, `partner_vollmacht`, `admin_papier`,
77
+ * `papier_upload`; `app` und `portal` sind in beiden Sprachen gleich.
78
+ */
79
+ export type ContractSource = 'setup_link' | 'process_link' | 'partner_power_of_attorney' | 'admin_paper' | 'paper_upload' | 'app' | 'portal' | (string & {});
80
+ /**
81
+ * Nutzlast von `customer.avv_accepted` und `customer.terms_accepted` in der
82
+ * Sprache `v3`. Ein Webhook mit `apiVersion: 'v1'` schickt hier weiter
83
+ * `kind: 'nutzung'` und die deutschen Quellen.
84
+ */
85
+ export interface ContractAcceptedEventData {
86
+ customerId: string;
87
+ companyName: string;
88
+ kind: ContractKind;
89
+ version: string;
90
+ confirmedAt: number;
91
+ source: ContractSource;
92
+ }
61
93
  export type WebhookEventResult = {
62
94
  ok: true;
63
95
  event: PartnerWebhookEvent;
@@ -82,14 +114,23 @@ export type WebhookEventResult = {
82
114
  * 30 min, 2 h, 12 h) und gilt dann als fehlgeschlagen.
83
115
  */
84
116
  export declare function parseWebhookEvent(optionen: VerifyWebhookOptions): Promise<WebhookEventResult>;
117
+ /** Stand einer Zustellung; `/v1` sagte `offen`, `zugestellt`, `fehlgeschlagen`, `verworfen`. */
118
+ export type WebhookDeliveryStatus = 'pending' | 'delivered' | 'failed' | 'dropped';
85
119
  export interface PartnerWebhook {
86
120
  webhookId: string;
121
+ /** Sprache der Nutzlast; fehlt sie in der Antwort, ist es ein Bestands-Webhook und damit `v1`. */
122
+ apiVersion: WebhookApiVersion | (string & {});
87
123
  url: string;
88
124
  events: string[];
89
125
  active: boolean;
90
126
  description: string | null;
91
127
  createdAt: number | null;
92
- lastDelivery: number | null;
128
+ /** Die letzte Zustellung; `null`, solange keine versucht wurde. */
129
+ lastDelivery: {
130
+ at: number | null;
131
+ status: WebhookDeliveryStatus | (string & {});
132
+ statusCode: number | null;
133
+ } | null;
93
134
  /** Fehlversuche in Folge — steigt der Wert, stimmt beim Empfaenger etwas nicht. */
94
135
  consecutiveFailures: number;
95
136
  }
@@ -120,6 +161,17 @@ export interface WebhookPatch {
120
161
  events?: (PartnerWebhookEventType | (string & {}))[];
121
162
  description?: string;
122
163
  active?: boolean;
164
+ /**
165
+ * Stellt die Nutzlast auf Englisch um. Nur `'v3'` ist moeglich: zurueck auf
166
+ * `v1` geht nicht, damit ein Partner nicht versehentlich wieder deutsche
167
+ * Nutzlasten bekommt.
168
+ */
169
+ apiVersion?: 'v3';
170
+ }
171
+ export interface DeleteWebhookResult {
172
+ webhookId: string;
173
+ /** Unter `/v1` hiess das Feld `geloescht`. */
174
+ deleted: boolean;
123
175
  }
124
176
  export interface WebhookListe {
125
177
  webhooks: PartnerWebhook[];
@@ -134,11 +186,11 @@ export interface WebhookZustellung {
134
186
  webhookId: string;
135
187
  event: string;
136
188
  eventId: string;
137
- /** `offen`, `zugestellt` oder `fehlgeschlagen`. */
138
- status: string;
189
+ /** `dropped`: der Webhook wurde vor der Faelligkeit deaktiviert oder geloescht. */
190
+ status: WebhookDeliveryStatus | (string & {});
139
191
  attempts: number;
140
- letzterVersuchAt: number | null;
141
- naechsterVersuchAt: number | null;
192
+ lastAttemptAt: number | null;
193
+ nextAttemptAt: number | null;
142
194
  statusCode: number | null;
143
195
  /** Auszug der Antwort des Empfaengers, hoechstens 500 Zeichen. */
144
196
  response: string | null;
@@ -171,13 +223,23 @@ export declare function listPartnerWebhooks(rufen: InternerTransport): Promise<W
171
223
  * tun.
172
224
  */
173
225
  export declare function updatePartnerWebhook(rufen: InternerTransport, webhookId: string, patch: WebhookPatch): Promise<PartnerWebhook>;
174
- /** Loescht einen Endpunkt. Danach kommt dort nichts mehr an. */
175
- export declare function deletePartnerWebhook(rufen: InternerTransport, webhookId: string): Promise<string>;
226
+ /**
227
+ * Loescht einen Endpunkt. Danach kommt dort nichts mehr an; offene
228
+ * Zustellungen werden verworfen (`dropped`).
229
+ */
230
+ export declare function deletePartnerWebhook(rufen: InternerTransport, webhookId: string): Promise<DeleteWebhookResult>;
231
+ /** Eine Zustellung der Probe, so wie `sendPartnerWebhookTest` sie meldet. */
232
+ export interface WebhookTestZustellung {
233
+ deliveryId: string;
234
+ webhookId: string;
235
+ status: WebhookDeliveryStatus | (string & {});
236
+ statusCode: number | null;
237
+ }
176
238
  export interface WebhookTestResult {
177
239
  eventId: string;
178
240
  /** Welches Ereignis geprobt wurde — ohne Angabe `webhook.test`. */
179
- ereignis: string;
180
- deliveries: unknown[];
241
+ event: string;
242
+ deliveries: WebhookTestZustellung[];
181
243
  }
182
244
  /**
183
245
  * Schickt eine Probe an genau diesen Endpunkt.