@kreiseck/kasseneck-api 0.28.0 → 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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,42 @@ Was vor 0.7.0 geschah, steht in der Commit-Historie (`git log`); ab hier wird
4
4
  es hier geführt. Ein Eintrag nennt die Änderung **und ihren Grund** —
5
5
  nur der Grund überlebt den nächsten Umbau.
6
6
 
7
+ ## 0.29.0
8
+
9
+ - **Bricht `./partner` (und nur das): `PARTNER_FEHLER_CODES` ist jetzt durchgehend englisch,
10
+ wie der Rest von `/v3`.** `zugang_nicht_erlaubt` → `access_not_allowed`, `kennung_fehlt` →
11
+ `tax_number_missing`, `vertrag_offen` → `contracts_pending` (Sätze unverändert, nur der
12
+ Schlüssel neu); die `RAT`-Tabelle und `partnerFehlerRat` folgen. Grund: 0.28.0 stellte den
13
+ Partner-Teil auf `/v3` um, liess aber ein paar Codes, die der Server bis dahin noch roh
14
+ durchreichte, unuebersetzt in ihrer `/v1`-Schreibweise stehen (siehe dessen Eintrag "Die
15
+ Fehlercodes bleiben in dieser Stufe wie in `/v1`"): der Server schickt seit dieser Version
16
+ wirklich nur noch englische Codes, und dieses Paket folgt.
17
+ - **`PARTNER_FEHLER_CODES` um neun Codes von `reportCustomerContract` ergänzt**: `kind_not_allowed`,
18
+ `mode_not_allowed`, `power_of_attorney_missing`, `not_found`, `no_version`, `not_required`,
19
+ `unknown_version`, `text_changed`, `already_accepted`, mit Handlungssatz. Der Katalog des
20
+ Backends (`partner-core.FEHLER_KATALOG`, Fläche `api`/`beide`) führt sie für die Schnittstelle,
21
+ obwohl dieses Paket `reportCustomerContract` selbst nicht anbietet: derselbe Grund wie bei den
22
+ Portal-Codes: eine halbe Liste ist schlimmer als keine, und ein Code, den nur eine Seite kennt,
23
+ ist für einen Aufrufer nicht von "gibt es nicht" zu unterscheiden.
24
+ - **`kein_partnerbetrieb` und `request_not_found` aus `PARTNER_FEHLER_CODES` entfernt.** Beide sind
25
+ admin-only (`partner-endpoints.js`) und stehen gar nicht in `partner-core.FEHLER_KATALOG`; ein
26
+ Partner-Aufruf konnte sie unter keinem Pfad je bekommen. Sie standen seit jeher versehentlich in
27
+ der Liste; ein Aufrufer, der auf sie prüfte, prüfte auf einen Fall, der nie eintritt.
28
+ - `module_inactive`s Handlungssatz nennt jetzt `data.module`/`data.detail` statt `data.modul` (die
29
+ Werte selbst, z. B. `cash_register`, waren mit 0.28.0 schon englisch, nur der Text hier hinkte
30
+ nach).
31
+ - Neuer Typ `SignatureErrorCode` (`customer_not_found` | `incomplete` | `finanzonline_error`) für
32
+ `SignaturAntrag.error.code` und `CustomerSignature.error.code` (bisher `string | null` ohne
33
+ jeden Hinweis auf die möglichen Werte), nach demselben Muster wie `SignatureHistoryReason`.
34
+ - `PartnerFeldFehler.field`s Beispiele sind nicht mehr `address.land`/`tax_details.ustid` (Namen,
35
+ die `/v3` als unbekanntes Feld abweist), sondern echte `/v3`-Pfade: `address.zip`,
36
+ `taxDetails.taxNumber`, `contacts.0.email`.
37
+ - Die Tests lesen wieder echte `/v3`-Fehlerantworten: `scripts/partner-v3-antworten.cjs` schickt
38
+ jeden Code aus `fehlerKatalogFuer('api')` jetzt durch denselben Fehlerzweig wie eine echte
39
+ Antwort (`antwortNachAussen` statt der rohen Katalogwerte), und `getCustomerSignatureStatus`
40
+ trägt in der Fixture einen zweiten, fehlgeschlagenen Antrag (`fon_fehler` → `finanzonline_error`)
41
+ als Beleg dafür, dass `request.error.code` denselben Rand durchläuft wie jede Fehlerhülle.
42
+
7
43
  ## 0.28.0
8
44
 
9
45
  - **Bricht `./partner` (und nur das): der Partner-Teil spricht jetzt die englische Partner-API
package/README.md CHANGED
@@ -539,11 +539,11 @@ businesses and, with the extra scope `credentials:read`, fetch their secrets.
539
539
 
540
540
  This subpath talks to the English Partner API **`/v3`**
541
541
  (`PARTNER_BASE_URL`, `https://api.kasseneck.at/v3`): every field name and
542
- every value your code branches on is English. Texts for humans (`message`,
543
- `note`, `statusText`, `nextSteps`) stay German, and so do the error codes for
544
- now. Everything else in this package (receipts, invoices, the register,
545
- printing, payments) still uses `/v1` (`DEFAULT_BASE_URL`) until those
546
- endpoints have a `/v3` of their own.
542
+ every value your code branches on is English, including every error code
543
+ (`PARTNER_FEHLER_CODES`). Texts for humans (`message`, `note`, `statusText`,
544
+ `nextSteps`) stay German. Everything else in this package (receipts,
545
+ invoices, the register, printing, payments) still uses `/v1`
546
+ (`DEFAULT_BASE_URL`) until those endpoints have a `/v3` of their own.
547
547
 
548
548
  ```ts
549
549
  import { createPartnerApi, istPartnerFehler } from '@kreiseck/kasseneck-api/partner';
@@ -621,6 +621,42 @@ await partner.updatePartnerWebhook(webhookId, { apiVersion: 'v3' });
621
621
 
622
622
  Webhook signature verification is unchanged.
623
623
 
624
+ ### Migrating from 0.28.x
625
+
626
+ 0.29.0 is a breaking change for `./partner` only, and only for
627
+ `PARTNER_FEHLER_CODES`: three codes that the server still sent in their
628
+ German `/v1` spelling under 0.28.0 now come through English, matching every
629
+ other value on `/v3`.
630
+
631
+ | 0.28.x | 0.29.0 |
632
+ |---|---|
633
+ | `zugang_nicht_erlaubt` | `access_not_allowed` |
634
+ | `kennung_fehlt` | `tax_number_missing` |
635
+ | `vertrag_offen` | `contracts_pending` |
636
+
637
+ `partnerFehlerRat()` and `istPartnerFehler()` follow: look up the new,
638
+ English key. A build that still checks the old German string will no longer
639
+ match, silently, so this is worth a search across your codebase.
640
+
641
+ Two codes that never reached this package's own error handling
642
+ (`kein_partnerbetrieb`, `request_not_found`, both admin-only and outside the
643
+ backend's public catalog) are gone from `PARTNER_FEHLER_CODES`. If you were
644
+ checking for them, that check was already dead code: the server never sent
645
+ them to a partner call.
646
+
647
+ `PARTNER_FEHLER_CODES` also gained nine codes for `reportCustomerContract`
648
+ (`kind_not_allowed`, `mode_not_allowed`, `power_of_attorney_missing`,
649
+ `not_found`, `no_version`, `not_required`, `unknown_version`, `text_changed`,
650
+ `already_accepted`), each with a `partnerFehlerRat()` sentence. This package
651
+ still does not expose that endpoint; the codes are here for completeness (a
652
+ catalog page, or code that reads the raw error yourself), not because a call
653
+ of this client can produce them.
654
+
655
+ The signature error type `SignaturAntrag.error.code` /
656
+ `CustomerSignature.error.code` is now `SignatureErrorCode`
657
+ (`customer_not_found` | `incomplete` | `finanzonline_error` | any other
658
+ string), a documented union instead of a bare `string | null`.
659
+
624
660
  ### A test event is not a cash register
625
661
 
626
662
  `sendPartnerWebhookTest(webhookId, 'cashregister.live')` fires exactly the
@@ -19,6 +19,32 @@
19
19
  * unterscheiden. Deshalb stehen hier BEIDE Flaechen: die der Schnittstelle
20
20
  * ([PARTNER_FEHLER_CODES]) und die des Partner-Portals
21
21
  * ([PARTNER_PORTAL_FEHLER_CODES]).
22
+ *
23
+ * **Seit 0.29.0 englisch, wie der Rest von `/v3`.** Dieser Client spricht seit
24
+ * 0.28.0 ausschliesslich `/v3` (`PARTNER_BASE_URL`): die paar deutschen Codes,
25
+ * die der Server bis dahin noch roh durchreichte, kommen jetzt genauso englisch
26
+ * an wie alle anderen. [PARTNER_FEHLER_CODES] fuehrt deshalb ausnahmslos die
27
+ * `/v3`-Schreibweise aus `fehlercodes.json`s `v3`-Zuordnung (deutsch -> englisch);
28
+ * ein Aufrufer bekommt vom Server nie mehr die deutsche Form.
29
+ *
30
+ * **`kein_partnerbetrieb` und `request_not_found` fehlen absichtlich.** Beide
31
+ * sind admin-only (`partner-endpoints.js`, ausserhalb von `FEHLER_KATALOG`) und
32
+ * erreichen `/v3` nie: ein Partner-Aufruf kann sie unter keinem Pfad bekommen.
33
+ * Sie standen frueher versehentlich in dieser Liste; `dart-partner.json` (ein
34
+ * eingefrorener Abzug aus Dart 5.3.0, bevor das korrigiert wurde) fuehrt sie
35
+ * weiterhin, siehe die Ausnahme in `test/partner-enums.test.ts`.
36
+ *
37
+ * **Die Vertrags-Codes (`kind_not_allowed`, `mode_not_allowed`,
38
+ * `power_of_attorney_missing`, `not_found`, `no_version`,
39
+ * `unknown_version`, `text_changed`, `already_accepted`) stehen hier, obwohl
40
+ * dieses Paket `reportCustomerContract` nicht anbietet.** Der Katalog des
41
+ * Backends fuehrt sie mit `flaeche: 'api'`/`'beide'`, dieselbe Regel wie bei
42
+ * den Portal-Codes oben: vollstaendig heisst vollstaendig, auch fuer einen
43
+ * Endpunkt, den (noch) kein Aufruf dieses Clients ausloest. Ein Server-Update,
44
+ * das den Endpunkt ergaenzt, bräuchte dann keinen zweiten Fehlerkatalog-Umbau.
45
+ * `not_required` fehlt bewusst: derselbe gemeinsame Server-Zweig wie die
46
+ * anderen sechs, aber ueber die Partner-API nicht erreichbar (der Server hat
47
+ * ihn aus `FEHLER_KATALOG` entfernt, siehe `partner-core.js` im Backend).
22
48
  */
23
49
  /**
24
50
  * Alle Codes, die die **Schnittstelle** kennt. Als Liste und nicht nur als
@@ -27,7 +53,7 @@
27
53
  *
28
54
  * Reihenfolge und Bestand wie im Abzug des Backends.
29
55
  */
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"];
56
+ export declare const PARTNER_FEHLER_CODES: readonly ["validation", "rate_limited", "app_not_found", "app_not_accepted", "live_not_allowed", "customer_exists", "customer_conflict", "customer_limit", "access_not_allowed", "email_taken", "no_email", "tax_number_missing", "fon_missing", "signature_pending", "signature_missing", "signature_unknown", "signature_ambiguous", "signature_not_ready", "signature_limit", "signature_failed", "module_inactive", "cashregister_limit", "cashregister_not_found", "contracts_pending", "kind_not_allowed", "mode_not_allowed", "power_of_attorney_missing", "not_found", "no_version", "unknown_version", "text_changed", "already_accepted", "activation_failed", "webhook_limit", "webhook_inactive", "event_not_subscribed"];
31
57
  /**
32
58
  * Die Codes, die nur im **Partner-Portal** entstehen — beim Pflegen der App,
33
59
  * der Schluessel, der Mitglieder und der Signaturkarten.
@@ -58,7 +84,7 @@ export declare function istPartnerFehler(error: unknown, code: PartnerCode): boo
58
84
  export interface PartnerFeldFehler {
59
85
  /**
60
86
  * Der Feldpfad, so wie er im gesendeten Betrieb steht — verschachtelt und je
61
- * Kontakt: `address.land`, `tax_details.ustid`, `contacts.1.abteilung`.
87
+ * Kontakt: `address.zip`, `taxDetails.taxNumber`, `contacts.0.email`.
62
88
  */
63
89
  field: string;
64
90
  message: string;
@@ -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,21 +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',
56
81
  // FinanzOnline-Link
57
- 'kennung_fehlt',
82
+ 'tax_number_missing',
58
83
  // Signatur
59
84
  'fon_missing',
60
85
  'signature_pending',
61
- 'request_not_found',
62
86
  'signature_missing',
63
87
  'signature_unknown',
64
88
  'signature_ambiguous',
@@ -69,7 +93,17 @@ exports.PARTNER_FEHLER_CODES = [
69
93
  'module_inactive',
70
94
  'cashregister_limit',
71
95
  'cashregister_not_found',
72
- 'vertrag_offen',
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',
73
107
  'activation_failed',
74
108
  // Webhooks
75
109
  'webhook_limit',
@@ -119,28 +153,38 @@ const RAT = {
119
153
  rate_limited: 'Zu viele Aufrufe. data.retryAfterSec Sekunden warten und denselben Aufruf wiederholen.',
120
154
  app_not_found: 'Die appId gibt es nicht. getPartnerInfo liefert die eigenen Apps samt id.',
121
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.',
122
- kein_partnerbetrieb: 'Dieser Betrieb gehoert nicht zu diesem Partner-Konto. Die eigenen stehen in listPartnerCustomers.',
123
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.',
124
157
  customer_exists: 'Diesen Betrieb gibt es schon (data.customerId). Mit derselben customerId weiterarbeiten.',
125
158
  customer_conflict: 'Die Steuernummer ist bei Kasseneck bereits registriert. Die Zuordnung zum Partner macht Kasseneck — hello@kasseneck.at.',
126
159
  customer_limit: 'Das Tageslimit fuer neue Betriebe ist erreicht (data.max, data.resetAt). Morgen weiter.',
127
- 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).',
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).',
128
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.',
129
162
  no_email: 'Im Konto des Betriebs steht keine E-Mail-Adresse. Ohne sie geht weder eine Einladung noch der FinanzOnline-Link hinaus.',
130
- 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.',
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.',
131
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.',
132
165
  signature_pending: 'Fuer diesen Betrieb laeuft bereits ein Antrag. Auf signature.ready warten.',
133
- request_not_found: 'Diese signaturId gibt es nicht. getCustomerSignatureStatus nennt die des Betriebs.',
134
166
  signature_missing: 'Der Betrieb hat ueberhaupt keine Signatur, und jede Kasse bezieht sich auf eine. Zuerst requestCustomerSignature.',
135
167
  signature_unknown: 'Die genannte signatureRequestId gehoert nicht zu diesem Betrieb. getCustomerSignatureStatus nennt die seinen.',
136
168
  signature_ambiguous: 'Der Betrieb hat mehrere Signaturen; welche die Kasse benutzt, muss dastehen. Eine aus data.choices als signatureRequestId mitgeben.',
137
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.',
138
170
  signature_limit: 'Hoechstens zehn Signaturen je Betrieb. Eine bestehende benutzen, statt mit additional:true eine weitere zu beantragen.',
139
171
  signature_failed: 'FinanzOnline hat die Anmeldung abgelehnt (data.rc). Kasseneck klaert das — hello@kasseneck.at.',
140
- 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.',
141
173
  cashregister_limit: 'Hoechstens 20 Registrierkassen je Betrieb. Eine bestehende nutzen.',
142
174
  cashregister_not_found: 'Diese cashregisterId gibt es bei diesem Betrieb nicht.',
143
- 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.',
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.',
144
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.',
145
189
  webhook_limit: 'Hoechstens 10 Webhook-Endpunkte je Partner. Einen ungenutzten loeschen.',
146
190
  webhook_inactive: 'Der Webhook steht auf active:false. Zuerst aktivieren, dann erneut proben.',
@@ -27,6 +27,6 @@ export { getPartnerInfo, createPartnerCustomer, listPartnerCustomers, checkPartn
27
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';
28
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';
29
29
  export { PARTNER_ENVS } 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';
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';
31
31
  /** `credentials:read` — nicht im Standardsatz, siehe typen.ts. */
32
32
  export { SCOPE_CREDENTIALS } from './typen.js';
@@ -329,6 +329,13 @@ export type SignaturAntragStatus = 'requested' | 'assigned' | 'registered' | 're
329
329
  * `finanzonline` hiessen unter `/v1` `karte_eingetragen` und `fon`.
330
330
  */
331
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 & {});
332
339
  export interface SignaturHistorieEintrag {
333
340
  from: SignaturAntragStatus | null;
334
341
  to: SignaturAntragStatus;
@@ -344,7 +351,7 @@ export interface SignaturAntrag {
344
351
  vdaId: string | null;
345
352
  signatureId: string | null;
346
353
  error: {
347
- code: string | null;
354
+ code: SignatureErrorCode | null;
348
355
  message: string | null;
349
356
  rc: string | null;
350
357
  } | null;
@@ -383,7 +390,7 @@ export interface CustomerSignature {
383
390
  requestId: string | null;
384
391
  signatureId: string | null;
385
392
  error: {
386
- code: string | null;
393
+ code: SignatureErrorCode | null;
387
394
  message: string | null;
388
395
  rc: string | null;
389
396
  } | null;
@@ -19,6 +19,32 @@
19
19
  * unterscheiden. Deshalb stehen hier BEIDE Flaechen: die der Schnittstelle
20
20
  * ([PARTNER_FEHLER_CODES]) und die des Partner-Portals
21
21
  * ([PARTNER_PORTAL_FEHLER_CODES]).
22
+ *
23
+ * **Seit 0.29.0 englisch, wie der Rest von `/v3`.** Dieser Client spricht seit
24
+ * 0.28.0 ausschliesslich `/v3` (`PARTNER_BASE_URL`): die paar deutschen Codes,
25
+ * die der Server bis dahin noch roh durchreichte, kommen jetzt genauso englisch
26
+ * an wie alle anderen. [PARTNER_FEHLER_CODES] fuehrt deshalb ausnahmslos die
27
+ * `/v3`-Schreibweise aus `fehlercodes.json`s `v3`-Zuordnung (deutsch -> englisch);
28
+ * ein Aufrufer bekommt vom Server nie mehr die deutsche Form.
29
+ *
30
+ * **`kein_partnerbetrieb` und `request_not_found` fehlen absichtlich.** Beide
31
+ * sind admin-only (`partner-endpoints.js`, ausserhalb von `FEHLER_KATALOG`) und
32
+ * erreichen `/v3` nie: ein Partner-Aufruf kann sie unter keinem Pfad bekommen.
33
+ * Sie standen frueher versehentlich in dieser Liste; `dart-partner.json` (ein
34
+ * eingefrorener Abzug aus Dart 5.3.0, bevor das korrigiert wurde) fuehrt sie
35
+ * weiterhin, siehe die Ausnahme in `test/partner-enums.test.ts`.
36
+ *
37
+ * **Die Vertrags-Codes (`kind_not_allowed`, `mode_not_allowed`,
38
+ * `power_of_attorney_missing`, `not_found`, `no_version`,
39
+ * `unknown_version`, `text_changed`, `already_accepted`) stehen hier, obwohl
40
+ * dieses Paket `reportCustomerContract` nicht anbietet.** Der Katalog des
41
+ * Backends fuehrt sie mit `flaeche: 'api'`/`'beide'`, dieselbe Regel wie bei
42
+ * den Portal-Codes oben: vollstaendig heisst vollstaendig, auch fuer einen
43
+ * Endpunkt, den (noch) kein Aufruf dieses Clients ausloest. Ein Server-Update,
44
+ * das den Endpunkt ergaenzt, bräuchte dann keinen zweiten Fehlerkatalog-Umbau.
45
+ * `not_required` fehlt bewusst: derselbe gemeinsame Server-Zweig wie die
46
+ * anderen sechs, aber ueber die Partner-API nicht erreichbar (der Server hat
47
+ * ihn aus `FEHLER_KATALOG` entfernt, siehe `partner-core.js` im Backend).
22
48
  */
23
49
  /**
24
50
  * Alle Codes, die die **Schnittstelle** kennt. Als Liste und nicht nur als
@@ -27,7 +53,7 @@
27
53
  *
28
54
  * Reihenfolge und Bestand wie im Abzug des Backends.
29
55
  */
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"];
56
+ export declare const PARTNER_FEHLER_CODES: readonly ["validation", "rate_limited", "app_not_found", "app_not_accepted", "live_not_allowed", "customer_exists", "customer_conflict", "customer_limit", "access_not_allowed", "email_taken", "no_email", "tax_number_missing", "fon_missing", "signature_pending", "signature_missing", "signature_unknown", "signature_ambiguous", "signature_not_ready", "signature_limit", "signature_failed", "module_inactive", "cashregister_limit", "cashregister_not_found", "contracts_pending", "kind_not_allowed", "mode_not_allowed", "power_of_attorney_missing", "not_found", "no_version", "unknown_version", "text_changed", "already_accepted", "activation_failed", "webhook_limit", "webhook_inactive", "event_not_subscribed"];
31
57
  /**
32
58
  * Die Codes, die nur im **Partner-Portal** entstehen — beim Pflegen der App,
33
59
  * der Schluessel, der Mitglieder und der Signaturkarten.
@@ -58,7 +84,7 @@ export declare function istPartnerFehler(error: unknown, code: PartnerCode): boo
58
84
  export interface PartnerFeldFehler {
59
85
  /**
60
86
  * Der Feldpfad, so wie er im gesendeten Betrieb steht — verschachtelt und je
61
- * Kontakt: `address.land`, `tax_details.ustid`, `contacts.1.abteilung`.
87
+ * Kontakt: `address.zip`, `taxDetails.taxNumber`, `contacts.0.email`.
62
88
  */
63
89
  field: string;
64
90
  message: string;
@@ -19,6 +19,32 @@
19
19
  * unterscheiden. Deshalb stehen hier BEIDE Flaechen: die der Schnittstelle
20
20
  * ([PARTNER_FEHLER_CODES]) und die des Partner-Portals
21
21
  * ([PARTNER_PORTAL_FEHLER_CODES]).
22
+ *
23
+ * **Seit 0.29.0 englisch, wie der Rest von `/v3`.** Dieser Client spricht seit
24
+ * 0.28.0 ausschliesslich `/v3` (`PARTNER_BASE_URL`): die paar deutschen Codes,
25
+ * die der Server bis dahin noch roh durchreichte, kommen jetzt genauso englisch
26
+ * an wie alle anderen. [PARTNER_FEHLER_CODES] fuehrt deshalb ausnahmslos die
27
+ * `/v3`-Schreibweise aus `fehlercodes.json`s `v3`-Zuordnung (deutsch -> englisch);
28
+ * ein Aufrufer bekommt vom Server nie mehr die deutsche Form.
29
+ *
30
+ * **`kein_partnerbetrieb` und `request_not_found` fehlen absichtlich.** Beide
31
+ * sind admin-only (`partner-endpoints.js`, ausserhalb von `FEHLER_KATALOG`) und
32
+ * erreichen `/v3` nie: ein Partner-Aufruf kann sie unter keinem Pfad bekommen.
33
+ * Sie standen frueher versehentlich in dieser Liste; `dart-partner.json` (ein
34
+ * eingefrorener Abzug aus Dart 5.3.0, bevor das korrigiert wurde) fuehrt sie
35
+ * weiterhin, siehe die Ausnahme in `test/partner-enums.test.ts`.
36
+ *
37
+ * **Die Vertrags-Codes (`kind_not_allowed`, `mode_not_allowed`,
38
+ * `power_of_attorney_missing`, `not_found`, `no_version`,
39
+ * `unknown_version`, `text_changed`, `already_accepted`) stehen hier, obwohl
40
+ * dieses Paket `reportCustomerContract` nicht anbietet.** Der Katalog des
41
+ * Backends fuehrt sie mit `flaeche: 'api'`/`'beide'`, dieselbe Regel wie bei
42
+ * den Portal-Codes oben: vollstaendig heisst vollstaendig, auch fuer einen
43
+ * Endpunkt, den (noch) kein Aufruf dieses Clients ausloest. Ein Server-Update,
44
+ * das den Endpunkt ergaenzt, bräuchte dann keinen zweiten Fehlerkatalog-Umbau.
45
+ * `not_required` fehlt bewusst: derselbe gemeinsame Server-Zweig wie die
46
+ * anderen sechs, aber ueber die Partner-API nicht erreichbar (der Server hat
47
+ * ihn aus `FEHLER_KATALOG` entfernt, siehe `partner-core.js` im Backend).
22
48
  */
23
49
  import { KasseneckApiError } from '../client/errors.js';
24
50
  /**
@@ -34,21 +60,19 @@ export const PARTNER_FEHLER_CODES = [
34
60
  'rate_limited',
35
61
  'app_not_found',
36
62
  'app_not_accepted',
37
- 'kein_partnerbetrieb',
38
63
  'live_not_allowed',
39
64
  // Betrieb anlegen
40
65
  'customer_exists',
41
66
  'customer_conflict',
42
67
  'customer_limit',
43
- 'zugang_nicht_erlaubt',
68
+ 'access_not_allowed',
44
69
  'email_taken',
45
70
  'no_email',
46
71
  // FinanzOnline-Link
47
- 'kennung_fehlt',
72
+ 'tax_number_missing',
48
73
  // Signatur
49
74
  'fon_missing',
50
75
  'signature_pending',
51
- 'request_not_found',
52
76
  'signature_missing',
53
77
  'signature_unknown',
54
78
  'signature_ambiguous',
@@ -59,7 +83,17 @@ export const PARTNER_FEHLER_CODES = [
59
83
  'module_inactive',
60
84
  'cashregister_limit',
61
85
  'cashregister_not_found',
62
- 'vertrag_offen',
86
+ 'contracts_pending',
87
+ // Vertraege (reportCustomerContract: dieses Paket bietet den Endpunkt nicht
88
+ // an, der Katalog fuehrt die Codes trotzdem vollstaendig, siehe oben)
89
+ 'kind_not_allowed',
90
+ 'mode_not_allowed',
91
+ 'power_of_attorney_missing',
92
+ 'not_found',
93
+ 'no_version',
94
+ 'unknown_version',
95
+ 'text_changed',
96
+ 'already_accepted',
63
97
  'activation_failed',
64
98
  // Webhooks
65
99
  'webhook_limit',
@@ -109,28 +143,38 @@ const RAT = {
109
143
  rate_limited: 'Zu viele Aufrufe. data.retryAfterSec Sekunden warten und denselben Aufruf wiederholen.',
110
144
  app_not_found: 'Die appId gibt es nicht. getPartnerInfo liefert die eigenen Apps samt id.',
111
145
  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.',
112
- kein_partnerbetrieb: 'Dieser Betrieb gehoert nicht zu diesem Partner-Konto. Die eigenen stehen in listPartnerCustomers.',
113
146
  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.',
114
147
  customer_exists: 'Diesen Betrieb gibt es schon (data.customerId). Mit derselben customerId weiterarbeiten.',
115
148
  customer_conflict: 'Die Steuernummer ist bei Kasseneck bereits registriert. Die Zuordnung zum Partner macht Kasseneck — hello@kasseneck.at.',
116
149
  customer_limit: 'Das Tageslimit fuer neue Betriebe ist erreicht (data.max, data.resetAt). Morgen weiter.',
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).',
150
+ 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).',
118
151
  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.',
119
152
  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.',
153
+ 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.',
121
154
  fon_missing: 'Der Betrieb hat noch keinen FinanzOnline-Zugang. sendPartnerCustomerFonLink senden und customer.fon_verified abwarten. Betrifft das ANMELDEN der Signatureinheit, nicht das Beantragen.',
122
155
  signature_pending: 'Fuer diesen Betrieb laeuft bereits ein Antrag. Auf signature.ready warten.',
123
- request_not_found: 'Diese signaturId gibt es nicht. getCustomerSignatureStatus nennt die des Betriebs.',
124
156
  signature_missing: 'Der Betrieb hat ueberhaupt keine Signatur, und jede Kasse bezieht sich auf eine. Zuerst requestCustomerSignature.',
125
157
  signature_unknown: 'Die genannte signatureRequestId gehoert nicht zu diesem Betrieb. getCustomerSignatureStatus nennt die seinen.',
126
158
  signature_ambiguous: 'Der Betrieb hat mehrere Signaturen; welche die Kasse benutzt, muss dastehen. Eine aus data.choices als signatureRequestId mitgeben.',
127
159
  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.',
128
160
  signature_limit: 'Hoechstens zehn Signaturen je Betrieb. Eine bestehende benutzen, statt mit additional:true eine weitere zu beantragen.',
129
161
  signature_failed: 'FinanzOnline hat die Anmeldung abgelehnt (data.rc). Kasseneck klaert das — hello@kasseneck.at.',
130
- module_inactive: 'Das Modul (data.modul) ist fuer diesen Betrieb nicht gebucht. Kasseneck schaltet es frei.',
162
+ module_inactive: 'Das Modul (data.module, z. B. "cash_register", Text in data.detail) ist fuer diesen Betrieb nicht gebucht. Kasseneck schaltet es frei.',
131
163
  cashregister_limit: 'Hoechstens 20 Registrierkassen je Betrieb. Eine bestehende nutzen.',
132
164
  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.',
165
+ 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.',
166
+ // -- Vertraege (reportCustomerContract) ------------------------------------
167
+ // Dieser Client bietet den Endpunkt (noch) nicht an; die Codes stehen hier
168
+ // nur fuer die Katalogseite und fuer einen Aufrufer, der die rohe Antwort
169
+ // selbst auswertet (siehe Kopfkommentar der Datei).
170
+ kind_not_allowed: 'reportCustomerContract mit einer anderen Art als "avv". Der Vollmachtsweg nimmt nur den Auftragsverarbeitungsvertrag entgegen. Dieser Client bietet den Endpunkt nicht an.',
171
+ mode_not_allowed: 'Der Vollmachtsweg ist fuer dieses Partner-Konto nicht freigeschaltet. Kasseneck fragen (hello@kasseneck.at).',
172
+ power_of_attorney_missing: 'Der Partnervertrag mit dem Vollmachts-Kapitel ist noch nicht bestaetigt. Erst danach nimmt der Vollmachtsweg Meldungen entgegen.',
173
+ not_found: 'Die genannte customerId gehoert nicht zu diesem Partner-Konto oder existiert nicht. listPartnerCustomers nennt die eigenen.',
174
+ no_version: 'Fuer die gemeldete Vertragsart gibt es derzeit keine gueltige Fassung. Bei Kasseneck nachfragen.',
175
+ unknown_version: 'Die gemeldete Vertragsversion gibt es nicht. Die aktuell geltende Fassung neu abrufen.',
176
+ 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.',
177
+ already_accepted: 'Diese Fassung ist bereits bestaetigt (data.contractId). Nichts weiter zu tun.',
134
178
  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.',
135
179
  webhook_limit: 'Hoechstens 10 Webhook-Endpunkte je Partner. Einen ungenutzten loeschen.',
136
180
  webhook_inactive: 'Der Webhook steht auf active:false. Zuerst aktivieren, dann erneut proben.',
@@ -27,6 +27,6 @@ export { getPartnerInfo, createPartnerCustomer, listPartnerCustomers, checkPartn
27
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';
28
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';
29
29
  export { PARTNER_ENVS } 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';
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';
31
31
  /** `credentials:read` — nicht im Standardsatz, siehe typen.ts. */
32
32
  export { SCOPE_CREDENTIALS } from './typen.js';
@@ -329,6 +329,13 @@ export type SignaturAntragStatus = 'requested' | 'assigned' | 'registered' | 're
329
329
  * `finanzonline` hiessen unter `/v1` `karte_eingetragen` und `fon`.
330
330
  */
331
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 & {});
332
339
  export interface SignaturHistorieEintrag {
333
340
  from: SignaturAntragStatus | null;
334
341
  to: SignaturAntragStatus;
@@ -344,7 +351,7 @@ export interface SignaturAntrag {
344
351
  vdaId: string | null;
345
352
  signatureId: string | null;
346
353
  error: {
347
- code: string | null;
354
+ code: SignatureErrorCode | null;
348
355
  message: string | null;
349
356
  rc: string | null;
350
357
  } | null;
@@ -383,7 +390,7 @@ export interface CustomerSignature {
383
390
  requestId: string | null;
384
391
  signatureId: string | null;
385
392
  error: {
386
- code: string | null;
393
+ code: SignatureErrorCode | null;
387
394
  message: string | null;
388
395
  rc: string | null;
389
396
  } | null;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.28.0",
2
+ "version": "0.29.0",
3
3
  "gemessenAn": {
4
4
  "tid": "3600335",
5
5
  "hpsVersion": "1.10.0",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.28.0",
2
+ "version": "0.29.0",
3
3
  "meldungen": {
4
4
  "netz.keine_verbindung": {
5
5
  "text": "Keine Verbindung zum Server. Bitte die Internetverbindung prüfen und erneut versuchen."
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.28.0",
2
+ "version": "0.29.0",
3
3
  "aufrufe": [
4
4
  "activateCashregister",
5
5
  "cancelInvoice",
@@ -292,18 +292,16 @@
292
292
  "rate_limited",
293
293
  "app_not_found",
294
294
  "app_not_accepted",
295
- "kein_partnerbetrieb",
296
295
  "live_not_allowed",
297
296
  "customer_exists",
298
297
  "customer_conflict",
299
298
  "customer_limit",
300
- "zugang_nicht_erlaubt",
299
+ "access_not_allowed",
301
300
  "email_taken",
302
301
  "no_email",
303
- "kennung_fehlt",
302
+ "tax_number_missing",
304
303
  "fon_missing",
305
304
  "signature_pending",
306
- "request_not_found",
307
305
  "signature_missing",
308
306
  "signature_unknown",
309
307
  "signature_ambiguous",
@@ -313,7 +311,15 @@
313
311
  "module_inactive",
314
312
  "cashregister_limit",
315
313
  "cashregister_not_found",
316
- "vertrag_offen",
314
+ "contracts_pending",
315
+ "kind_not_allowed",
316
+ "mode_not_allowed",
317
+ "power_of_attorney_missing",
318
+ "not_found",
319
+ "no_version",
320
+ "unknown_version",
321
+ "text_changed",
322
+ "already_accepted",
317
323
  "activation_failed",
318
324
  "webhook_limit",
319
325
  "webhook_inactive",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "Kasseneck Rechnungs-API",
4
4
  "version": 1,
5
- "paket": "0.28.0",
5
+ "paket": "0.29.0",
6
6
  "aufrufe": {
7
7
  "createCustomer": {
8
8
  "anfrage": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.28.0",
2
+ "version": "0.29.0",
3
3
  "sprachen": [
4
4
  "de",
5
5
  "en"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kreiseck/kasseneck-api",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "description": "Austrian fiscal cash register (RKSV) client for JavaScript and TypeScript: signed receipts, cancellations, card payments, receipt printing (ESC/POS), invoices. RKSV-Registrierkasse für JavaScript und TypeScript.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Kreiseck",