@kreiseck/kasseneck-api 0.27.3 → 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 (36) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +51 -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 +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/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 +1 -1
  24. package/dist/esm/partner/fehler.js +8 -3
  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 +144 -34
  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 +3 -1
  34. package/fixtures/rechnung-api.schema.json +1 -1
  35. package/fixtures/rechnung-texte.json +1 -1
  36. package/package.json +1 -1
@@ -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';