@kreiseck/kasseneck-api 0.28.0 → 0.30.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 (113) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +41 -5
  3. package/dist/cjs/client/api.d.ts +3 -3
  4. package/dist/cjs/client/index.d.ts +1 -1
  5. package/dist/cjs/client/receipts.d.ts +32 -3
  6. package/dist/cjs/client/receipts.js +121 -6
  7. package/dist/cjs/enums/keck-payment-method.d.ts +10 -0
  8. package/dist/cjs/enums/keck-payment-method.js +6 -0
  9. package/dist/cjs/index.d.ts +2 -2
  10. package/dist/cjs/index.js +6 -2
  11. package/dist/cjs/models/cancellation.d.ts +11 -1
  12. package/dist/cjs/models/cancellation.js +15 -0
  13. package/dist/cjs/models/index.d.ts +2 -0
  14. package/dist/cjs/models/index.js +7 -1
  15. package/dist/cjs/models/payment-errors.d.ts +22 -0
  16. package/dist/cjs/models/payment-errors.js +46 -0
  17. package/dist/cjs/models/receipt-payment.d.ts +85 -0
  18. package/dist/cjs/models/receipt-payment.js +40 -0
  19. package/dist/cjs/models/receipt-summary.d.ts +9 -0
  20. package/dist/cjs/models/receipt-summary.js +2 -0
  21. package/dist/cjs/models/receipt.d.ts +9 -0
  22. package/dist/cjs/models/receipt.js +3 -0
  23. package/dist/cjs/partner/fehler.d.ts +28 -2
  24. package/dist/cjs/partner/fehler.js +55 -11
  25. package/dist/cjs/partner/index.d.ts +1 -1
  26. package/dist/cjs/partner/typen.d.ts +9 -2
  27. package/dist/cjs/receipt/layout.js +112 -10
  28. package/dist/esm/client/api.d.ts +3 -3
  29. package/dist/esm/client/index.d.ts +1 -1
  30. package/dist/esm/client/receipts.d.ts +32 -3
  31. package/dist/esm/client/receipts.js +121 -6
  32. package/dist/esm/enums/keck-payment-method.d.ts +10 -0
  33. package/dist/esm/enums/keck-payment-method.js +6 -0
  34. package/dist/esm/index.d.ts +2 -2
  35. package/dist/esm/index.js +1 -1
  36. package/dist/esm/models/cancellation.d.ts +11 -1
  37. package/dist/esm/models/cancellation.js +15 -0
  38. package/dist/esm/models/index.d.ts +2 -0
  39. package/dist/esm/models/index.js +2 -0
  40. package/dist/esm/models/payment-errors.d.ts +22 -0
  41. package/dist/esm/models/payment-errors.js +42 -0
  42. package/dist/esm/models/receipt-payment.d.ts +85 -0
  43. package/dist/esm/models/receipt-payment.js +36 -0
  44. package/dist/esm/models/receipt-summary.d.ts +9 -0
  45. package/dist/esm/models/receipt-summary.js +2 -0
  46. package/dist/esm/models/receipt.d.ts +9 -0
  47. package/dist/esm/models/receipt.js +3 -0
  48. package/dist/esm/partner/fehler.d.ts +28 -2
  49. package/dist/esm/partner/fehler.js +55 -11
  50. package/dist/esm/partner/index.d.ts +1 -1
  51. package/dist/esm/partner/typen.d.ts +9 -2
  52. package/dist/esm/receipt/layout.js +112 -10
  53. package/fixtures/belege/split-bar-rueckgeld.json +58 -0
  54. package/fixtures/belege/split-eine-karte-trinkgeld.json +75 -0
  55. package/fixtures/belege/split-karte-karte-bar.json +102 -0
  56. package/fixtures/belege/split-langer-betrag.json +74 -0
  57. package/fixtures/belege/split-tischrunde-trinkgeld.json +152 -0
  58. package/fixtures/belege/split-trinkgeld-karte.json +82 -0
  59. package/fixtures/belege/split-zwei-karten-gleicher-anbieter.json +89 -0
  60. package/fixtures/belege/storno-split-teil.json +71 -0
  61. package/fixtures/belege/storno-split-voll.json +100 -0
  62. package/fixtures/erwartet/split-bar-rueckgeld.blatt32.json +194 -0
  63. package/fixtures/erwartet/split-bar-rueckgeld.blatt48.json +182 -0
  64. package/fixtures/erwartet/split-bar-rueckgeld.grid32.txt +28 -0
  65. package/fixtures/erwartet/split-bar-rueckgeld.grid48.txt +26 -0
  66. package/fixtures/erwartet/split-bar-rueckgeld.lines.json +286 -0
  67. package/fixtures/erwartet/split-eine-karte-trinkgeld.blatt32.json +242 -0
  68. package/fixtures/erwartet/split-eine-karte-trinkgeld.blatt48.json +224 -0
  69. package/fixtures/erwartet/split-eine-karte-trinkgeld.grid32.txt +36 -0
  70. package/fixtures/erwartet/split-eine-karte-trinkgeld.grid48.txt +33 -0
  71. package/fixtures/erwartet/split-eine-karte-trinkgeld.lines.json +371 -0
  72. package/fixtures/erwartet/split-karte-karte-bar.blatt32.json +356 -0
  73. package/fixtures/erwartet/split-karte-karte-bar.blatt48.json +338 -0
  74. package/fixtures/erwartet/split-karte-karte-bar.grid32.txt +55 -0
  75. package/fixtures/erwartet/split-karte-karte-bar.grid48.txt +52 -0
  76. package/fixtures/erwartet/split-karte-karte-bar.lines.json +519 -0
  77. package/fixtures/erwartet/split-langer-betrag.blatt32.json +266 -0
  78. package/fixtures/erwartet/split-langer-betrag.blatt48.json +260 -0
  79. package/fixtures/erwartet/split-langer-betrag.grid32.txt +40 -0
  80. package/fixtures/erwartet/split-langer-betrag.grid48.txt +39 -0
  81. package/fixtures/erwartet/split-langer-betrag.lines.json +343 -0
  82. package/fixtures/erwartet/split-tischrunde-trinkgeld.blatt32.json +470 -0
  83. package/fixtures/erwartet/split-tischrunde-trinkgeld.blatt48.json +434 -0
  84. package/fixtures/erwartet/split-tischrunde-trinkgeld.grid32.txt +74 -0
  85. package/fixtures/erwartet/split-tischrunde-trinkgeld.grid48.txt +68 -0
  86. package/fixtures/erwartet/split-tischrunde-trinkgeld.lines.json +740 -0
  87. package/fixtures/erwartet/split-trinkgeld-karte.blatt32.json +272 -0
  88. package/fixtures/erwartet/split-trinkgeld-karte.blatt48.json +254 -0
  89. package/fixtures/erwartet/split-trinkgeld-karte.grid32.txt +41 -0
  90. package/fixtures/erwartet/split-trinkgeld-karte.grid48.txt +38 -0
  91. package/fixtures/erwartet/split-trinkgeld-karte.lines.json +428 -0
  92. package/fixtures/erwartet/split-zwei-karten-gleicher-anbieter.blatt32.json +326 -0
  93. package/fixtures/erwartet/split-zwei-karten-gleicher-anbieter.blatt48.json +296 -0
  94. package/fixtures/erwartet/split-zwei-karten-gleicher-anbieter.grid32.txt +50 -0
  95. package/fixtures/erwartet/split-zwei-karten-gleicher-anbieter.grid48.txt +45 -0
  96. package/fixtures/erwartet/split-zwei-karten-gleicher-anbieter.lines.json +504 -0
  97. package/fixtures/erwartet/storno-split-teil.blatt32.json +230 -0
  98. package/fixtures/erwartet/storno-split-teil.blatt48.json +224 -0
  99. package/fixtures/erwartet/storno-split-teil.grid32.txt +34 -0
  100. package/fixtures/erwartet/storno-split-teil.grid48.txt +33 -0
  101. package/fixtures/erwartet/storno-split-teil.lines.json +304 -0
  102. package/fixtures/erwartet/storno-split-voll.blatt32.json +320 -0
  103. package/fixtures/erwartet/storno-split-voll.blatt48.json +314 -0
  104. package/fixtures/erwartet/storno-split-voll.grid32.txt +49 -0
  105. package/fixtures/erwartet/storno-split-voll.grid48.txt +48 -0
  106. package/fixtures/erwartet/storno-split-voll.lines.json +410 -0
  107. package/fixtures/hobex-hps-codes.json +1 -1
  108. package/fixtures/kasse-texte.json +1 -1
  109. package/fixtures/manifest.json +72 -0
  110. package/fixtures/oberflaeche.json +12 -6
  111. package/fixtures/rechnung-api.schema.json +1 -1
  112. package/fixtures/rechnung-texte.json +1 -1
  113. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,85 @@ 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.30.0
8
+
9
+ Mehrere Zahlungen je Beleg. Setzt ein Backend mit `payments` voraus (keck, live seit
10
+ 2026-09-25); gegen einen älteren Server bleibt alles ohne `payments` wie bisher. Nichts bricht:
11
+ ein Beleg ohne Zahlungsliste liest, sendet und druckt sich byte-gleich wie in 0.29.0.
12
+
13
+ - **`Receipt` und `ReceiptSummary` tragen `payments` (`ReceiptPayment[]`), wenn der Server sie
14
+ liefert**, je Zahlung Zahlart, `amountCents`, bei Bar `tenderedCents`/Rückgeld, bei Karte
15
+ Anbieter und Terminaldaten, bei Stornos `refundOf`, dazu `tipCents` (Trinkgeld je Zahlung).
16
+ Grund: ein Tisch zahlt mit zwei Karten und dem Rest bar, und das Einzelfeld `paymentMethod`
17
+ konnte das nicht abbilden. Altbelege ohne Liste lesen sich unverändert (`payments` fehlt).
18
+ - **`KeckPaymentMethod.mixed` („Mehrere Zahlungsarten")**, nur zum Lesen. Der Server setzt ihn als
19
+ `paymentMethod`, wenn die Zahlungen verschiedene Zahlarten haben; wer ihn selbst sendet, wird
20
+ schon im Client abgewiesen. Grund: sonst wäre ein solcher Beleg für einen älteren Leser eine
21
+ unbekannte Zahlart; zum Kassieren gibt es die Zahlungsliste.
22
+ - **`payments` bei `sellReceipt`, `createReceipt` und `cancelReceipt`**, mit Form- und
23
+ Konfliktprüfung im Client (`payments` zusammen mit `paymentMethod` oder Kartenfeldern ergibt
24
+ `PAYMENTS_CONFLICT`; `payments: null` gilt als nicht angegeben). Für `sellReceipt` gibt es den
25
+ neuen Typ `SellReceiptWithPaymentsOptions`; `SellReceiptOptions` bleibt ein `interface` und
26
+ bekommt nur das optionale `payments?: undefined`, damit bestehender Code unverändert kompiliert
27
+ und die beiden Wege sich nicht mischen lassen. Beim Storno nennt `refundOf` die Zahlung des
28
+ Originals, auf die zurückgezahlt wird.
29
+ - **`PAYMENT_ERROR_CODES` (18 Codes) und `isPaymentErrorCode`**, Zwilling von
30
+ `ZAHLUNGS_FEHLERCODES` im Backend (gleiche Codes, gleiche Reihenfolge). `isPaymentErrorCode`
31
+ erkennt auch die kleingeschriebene `/v3`-Schreibweise, weil `/v3` diese Codes 1:1 klein
32
+ ausliefert. Grund: am Code entscheiden, nie am Text.
33
+ - **`CANCELLATION_ERROR_CODES` um vier `STORNO_…`-Codes ergänzt** (`STORNO_PAYMENTS_REQUIRED`,
34
+ `STORNO_REFUND_EXCEEDS_PAYMENT`, `STORNO_REFUND_REFERENCE_REQUIRED`,
35
+ `STORNO_REFUND_REFERENCE_UNKNOWN`) für die Rückzahlung je Zahlung. `isCancellationErrorCode`
36
+ prüft weiter exakt: unter `/v3` heißen die Storno-Codes nach dem Vokabular anders (nicht bloß
37
+ klein), die Namen kommen mit der Umstellung des Pakets auf `/v3`.
38
+ - **Beleg-Layout: bei mehr als einer Zahlung eine nummerierte Aufschlüsselung** unter „Gesamt:"
39
+ („Zahlungsarten:", dann „1. Kartenzahlung", „2. Barzahlung" … samt Betrag; der Betrag bricht
40
+ auf 58 mm nie). Darunter eingerückt „davon Trinkgeld", „Gegeben" und „Rückgeld" der jeweiligen
41
+ Zahlung; die Kartenblöcke kommen je Zahlung in Zahlungsreihenfolge, jeweils mit derselben
42
+ Nummer darüber. Grund: auf dem Bon muss nachvollziehbar sein, welcher Betrag wie bezahlt wurde
43
+ und zu welcher Zahlung ein Terminal-Block gehört.
44
+ - **Bei genau einer Zahlung bleibt der Beleg wie bisher**, nur „davon Trinkgeld", „Gegeben" und
45
+ „Rückgeld" stehen jetzt eingerückt unter „Zahlungsart:". Ohne Zahlungsliste ändert sich nichts:
46
+ alle bisherigen Vertragsbeispiele (`fixtures/erwartet`) und der Bytestrom-Zwilling sind
47
+ unverändert. Neu sind neun Beispiele `split-*`/`storno-split-*` (Karte+Karte+Bar,
48
+ Tischrunde mit Trinkgeld, Rückgeld, langer Betrag, Voll- und Teilstorno).
49
+
50
+ ## 0.29.0
51
+
52
+ - **Bricht `./partner` (und nur das): `PARTNER_FEHLER_CODES` ist jetzt durchgehend englisch,
53
+ wie der Rest von `/v3`.** `zugang_nicht_erlaubt` → `access_not_allowed`, `kennung_fehlt` →
54
+ `tax_number_missing`, `vertrag_offen` → `contracts_pending` (Sätze unverändert, nur der
55
+ Schlüssel neu); die `RAT`-Tabelle und `partnerFehlerRat` folgen. Grund: 0.28.0 stellte den
56
+ Partner-Teil auf `/v3` um, liess aber ein paar Codes, die der Server bis dahin noch roh
57
+ durchreichte, unuebersetzt in ihrer `/v1`-Schreibweise stehen (siehe dessen Eintrag "Die
58
+ Fehlercodes bleiben in dieser Stufe wie in `/v1`"): der Server schickt seit dieser Version
59
+ wirklich nur noch englische Codes, und dieses Paket folgt.
60
+ - **`PARTNER_FEHLER_CODES` um neun Codes von `reportCustomerContract` ergänzt**: `kind_not_allowed`,
61
+ `mode_not_allowed`, `power_of_attorney_missing`, `not_found`, `no_version`, `not_required`,
62
+ `unknown_version`, `text_changed`, `already_accepted`, mit Handlungssatz. Der Katalog des
63
+ Backends (`partner-core.FEHLER_KATALOG`, Fläche `api`/`beide`) führt sie für die Schnittstelle,
64
+ obwohl dieses Paket `reportCustomerContract` selbst nicht anbietet: derselbe Grund wie bei den
65
+ Portal-Codes: eine halbe Liste ist schlimmer als keine, und ein Code, den nur eine Seite kennt,
66
+ ist für einen Aufrufer nicht von "gibt es nicht" zu unterscheiden.
67
+ - **`kein_partnerbetrieb` und `request_not_found` aus `PARTNER_FEHLER_CODES` entfernt.** Beide sind
68
+ admin-only (`partner-endpoints.js`) und stehen gar nicht in `partner-core.FEHLER_KATALOG`; ein
69
+ Partner-Aufruf konnte sie unter keinem Pfad je bekommen. Sie standen seit jeher versehentlich in
70
+ der Liste; ein Aufrufer, der auf sie prüfte, prüfte auf einen Fall, der nie eintritt.
71
+ - `module_inactive`s Handlungssatz nennt jetzt `data.module`/`data.detail` statt `data.modul` (die
72
+ Werte selbst, z. B. `cash_register`, waren mit 0.28.0 schon englisch, nur der Text hier hinkte
73
+ nach).
74
+ - Neuer Typ `SignatureErrorCode` (`customer_not_found` | `incomplete` | `finanzonline_error`) für
75
+ `SignaturAntrag.error.code` und `CustomerSignature.error.code` (bisher `string | null` ohne
76
+ jeden Hinweis auf die möglichen Werte), nach demselben Muster wie `SignatureHistoryReason`.
77
+ - `PartnerFeldFehler.field`s Beispiele sind nicht mehr `address.land`/`tax_details.ustid` (Namen,
78
+ die `/v3` als unbekanntes Feld abweist), sondern echte `/v3`-Pfade: `address.zip`,
79
+ `taxDetails.taxNumber`, `contacts.0.email`.
80
+ - Die Tests lesen wieder echte `/v3`-Fehlerantworten: `scripts/partner-v3-antworten.cjs` schickt
81
+ jeden Code aus `fehlerKatalogFuer('api')` jetzt durch denselben Fehlerzweig wie eine echte
82
+ Antwort (`antwortNachAussen` statt der rohen Katalogwerte), und `getCustomerSignatureStatus`
83
+ trägt in der Fixture einen zweiten, fehlgeschlagenen Antrag (`fon_fehler` → `finanzonline_error`)
84
+ als Beleg dafür, dass `request.error.code` denselben Rand durchläuft wie jede Fehlerhülle.
85
+
7
86
  ## 0.28.0
8
87
 
9
88
  - **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
@@ -3,7 +3,7 @@ import { type CreateStripeLinkOptions, type StripeCaptureResult } from '../payme
3
3
  import { type HobexPayOptions, type HobexRefundOptions } from '../payments/hobex.js';
4
4
  import { type TransportOptions } from './transport.js';
5
5
  import { type CashboxStatus, type SignatureStatus } from './status.js';
6
- import { type SendReceiptEmailOptions, type SendReceiptEmailResult, type ListMyReceiptsOptions, type ReceiptList, type ReceiptWithCompany, type SellReceiptOptions, type CancelReceiptOptions, type CancelReceiptResult, type CreateCancelReceiptOptions } from './receipts.js';
6
+ import { type SendReceiptEmailOptions, type SendReceiptEmailResult, type ListMyReceiptsOptions, type ReceiptList, type ReceiptWithCompany, type SellReceiptOptions, type SellReceiptWithPaymentsOptions, type CancelReceiptOptions, type CancelReceiptResult, type CreateCancelReceiptOptions } from './receipts.js';
7
7
  /**
8
8
  * Schlichte Factory ueber den Endpunkt-Funktionen: bindet einen Transport
9
9
  * einmal und liefert die Aufrufe ohne den wiederkehrenden ersten Parameter.
@@ -30,9 +30,9 @@ import { type SendReceiptEmailOptions, type SendReceiptEmailResult, type ListMyR
30
30
  */
31
31
  export interface KasseneckApi {
32
32
  /** Normalbeleg (Verkauf). */
33
- sellReceipt(options: SellReceiptOptions): Promise<Receipt>;
33
+ sellReceipt(options: SellReceiptOptions | SellReceiptWithPaymentsOptions): Promise<Receipt>;
34
34
  /** Normalbeleg samt Firmen-/Druckdaten fuer den Belegdruck. */
35
- sellReceiptWithCompany(options: SellReceiptOptions): Promise<ReceiptWithCompany>;
35
+ sellReceiptWithCompany(options: SellReceiptOptions | SellReceiptWithPaymentsOptions): Promise<ReceiptWithCompany>;
36
36
  /** Storno eines bestehenden Belegs — voll oder in Teilen, ueber den Storno-Endpunkt. */
37
37
  cancelReceipt(options: CancelReceiptOptions): Promise<CancelReceiptResult>;
38
38
  /** Storno aus frei uebergebenen Positionen. */
@@ -2,7 +2,7 @@ export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type
2
2
  export { DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, createTransport, createBinaryTransport, } from './transport.js';
3
3
  export { AUFRUFE, type Aufruf, } from './aufrufe.js';
4
4
  export { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, } from './errors.js';
5
- export { type ReceiptCommonOptions, type SellReceiptOptions, type TipOptions, type TipRecipientShare, type CancelReceiptOptions, type CreateCancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, cancelReceipt, type CancelReceiptResult, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, checkVoucherCombinationError, type SendReceiptEmailOptions, type SendReceiptEmailResult, sendReceiptEmail, } from './receipts.js';
5
+ export { type ReceiptCommonOptions, type SellReceiptOptions, type SellReceiptWithPaymentsOptions, type TipOptions, type TipRecipientShare, type CancelReceiptOptions, type CreateCancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, cancelReceipt, type CancelReceiptResult, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, checkVoucherCombinationError, type SendReceiptEmailOptions, type SendReceiptEmailResult, sendReceiptEmail, } from './receipts.js';
6
6
  export { listMyCashregisters } from './cashregisters.js';
7
7
  export { downloadDailyReport, downloadMonthlyReport } from './reports.js';
8
8
  export { type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, } from './status.js';
@@ -1,5 +1,5 @@
1
1
  import { ReceiptType, type ReceiptTypeKey, KeckPaymentMethod, type KeckPaymentMethodKey, CreditCardProvider } from '../enums/index.js';
2
- import { type Receipt, type ReceiptCompany, type ReceiptItem, type Voucher, type ReceiptSummary, type ReportMonth, type CancellationItem, type CancellationOf, type CancellationReason } from '../models/index.js';
2
+ import { type Receipt, type ReceiptCompany, type ReceiptItem, type Voucher, type ReceiptSummary, type ReportMonth, type CancellationItem, type CancellationOf, type CancellationReason, type ReceiptPaymentInput } from '../models/index.js';
3
3
  import type { InternerTransport } from './aufrufe.js';
4
4
  import type { Pruefangaben, ReceiptLayout } from '../receipt/layout.js';
5
5
  import type { LogoStufe } from '../receipt/blatt.js';
@@ -90,11 +90,32 @@ export interface CreateReceiptOptions extends ReceiptCommonOptions {
90
90
  * ausdruecklich uebergebene `paymentMethod` sticht.
91
91
  */
92
92
  paymentMethodFromServer?: string;
93
+ /**
94
+ * Mehrere Zahlungen je Beleg (siehe [ReceiptPaymentInput]). Schliesst
95
+ * `paymentMethod`, `paymentMethodFromServer` und die Kartenfelder aus —
96
+ * die Kartenangaben gehoeren dann in die einzelne Zahlung (Backend:
97
+ * `PAYMENTS_CONFLICT`). Nur bei `standard` und `training`.
98
+ */
99
+ payments?: ReceiptPaymentInput[];
93
100
  items?: ReceiptItem[];
94
101
  vouchers?: Voucher[];
95
102
  }
103
+ /** Verkauf mit einer Zahlungsart (`paymentMethod`, Kartenfelder aus [ReceiptCommonOptions]). */
96
104
  export interface SellReceiptOptions extends ReceiptCommonOptions {
97
105
  paymentMethod: KeckPaymentMethod | KeckPaymentMethodKey;
106
+ payments?: undefined;
107
+ items?: ReceiptItem[];
108
+ vouchers?: Voucher[];
109
+ }
110
+ /**
111
+ * Verkauf mit mehreren Zahlungen (`payments`, siehe [ReceiptPaymentInput]).
112
+ * Ohne `paymentMethod` und ohne die Kartenfelder aus [ReceiptCommonOptions] —
113
+ * die Kartenangaben stehen in der einzelnen Zahlung (Backend:
114
+ * `PAYMENTS_CONFLICT`, zur Laufzeit ebenso geprueft).
115
+ */
116
+ export interface SellReceiptWithPaymentsOptions extends ReceiptCommonOptions {
117
+ payments: ReceiptPaymentInput[];
118
+ paymentMethod?: undefined;
98
119
  items?: ReceiptItem[];
99
120
  vouchers?: Voucher[];
100
121
  }
@@ -126,6 +147,14 @@ export type CancelReceiptOptions = {
126
147
  creditCardProvider?: CreditCardProvider;
127
148
  cardPaymentId?: string;
128
149
  cardPaymentData?: Record<string, unknown>;
150
+ /**
151
+ * Rueckzahlung je Zahlung (Betraege negativ, `refundOf` = `id` der
152
+ * Originalzahlung). Schliesst `paymentMethod` und die Kartenfelder aus
153
+ * (Backend: `PAYMENTS_CONFLICT`). Ohne Angabe spiegelt der Server die
154
+ * Restbetraege jeder Originalzahlung; ein Teilstorno eines Belegs mit
155
+ * mehreren Zahlungen braucht sie (`STORNO_PAYMENTS_REQUIRED`).
156
+ */
157
+ payments?: ReceiptPaymentInput[];
129
158
  } & ({
130
159
  receipt: Receipt;
131
160
  cashregisterId?: string;
@@ -183,12 +212,12 @@ export interface ReceiptWithCompany {
183
212
  */
184
213
  export declare function createReceipt(rufen: InternerTransport, options: CreateReceiptOptions): Promise<Receipt>;
185
214
  /** Normalbeleg (Verkauf) nach RKSV. */
186
- export declare function sellReceipt(rufen: InternerTransport, options: SellReceiptOptions): Promise<Receipt>;
215
+ export declare function sellReceipt(rufen: InternerTransport, options: SellReceiptOptions | SellReceiptWithPaymentsOptions): Promise<Receipt>;
187
216
  /**
188
217
  * Normalbeleg wie [sellReceipt], liefert zusaetzlich die Firmen-/Druckdaten
189
218
  * aus derselben Antwort — alles, was ein Belegdruck braucht, in einem Aufruf.
190
219
  */
191
- export declare function sellReceiptWithCompany(rufen: InternerTransport, options: SellReceiptOptions): Promise<ReceiptWithCompany>;
220
+ export declare function sellReceiptWithCompany(rufen: InternerTransport, options: SellReceiptOptions | SellReceiptWithPaymentsOptions): Promise<ReceiptWithCompany>;
192
221
  /**
193
222
  * Storno-Beleg zu einem bestehenden Beleg — voll oder in Teilen. Prueft die
194
223
  * Eingabe, bevor etwas hinausgeht; der Server haelt die Restmengen und die
@@ -65,6 +65,22 @@ function createReceiptParams(options) {
65
65
  if (items != null && items.length > 0) {
66
66
  params['items'] = alsNutzlast(items, index_js_2.toReceiptItemPayload);
67
67
  }
68
+ // `payments: null` gilt wie im Backend (zahlungs-eingang.js) als nicht angegeben.
69
+ if (options.payments != null) {
70
+ // Der alte Storno-Weg und der Null-/Startbeleg nehmen keine Zahlungsliste
71
+ // (Backend: PAYMENTS_NOT_ALLOWED); ein Storno mit mehreren Zahlungen
72
+ // laeuft ueber cancelReceipt.
73
+ if (typ.value === index_js_1.ReceiptType.cancellation.value) {
74
+ throw eingabefehler('payments am Storno gehen nur ueber cancelReceipt.');
75
+ }
76
+ if (typ.value !== index_js_1.ReceiptType.standard.value && typ.value !== index_js_1.ReceiptType.training.value) {
77
+ throw eingabefehler(`payments sind bei receiptType "${typ.value}" nicht erlaubt.`);
78
+ }
79
+ const konflikt = zahlungsKonflikt(options);
80
+ if (konflikt != null)
81
+ throw eingabefehler(konflikt);
82
+ params['payments'] = gepruefteZahlungen(options.payments, false, 'createReceipt');
83
+ }
68
84
  // Vom Aufrufer kommt sie geprueft, vom Server roh — siehe die beiden Felder
69
85
  // in [CreateReceiptOptions]. Die Typpruefung allein reicht dafuer nicht: ein
70
86
  // Verbraucher ohne Typen faellt durch dieses Netz, und ein Tippfehler in der
@@ -148,11 +164,15 @@ async function cancelReceipt(rufen, options) {
148
164
  if (options.note !== undefined && options.note.length > NOTE_MAX) {
149
165
  throw new errors_js_1.KasseneckValidationError('cancelReceipt', `Anmerkung ist zu lang (hoechstens ${NOTE_MAX} Zeichen)`, 'request');
150
166
  }
167
+ // `payments: null` gilt wie im Backend als nicht angegeben.
168
+ const zahlungen = options.payments != null ? gepruefteStornoZahlungen(options) : undefined;
151
169
  const params = { cashregisterId, originalReceiptId, reason: options.reason };
152
170
  if (options.items !== undefined)
153
171
  params.items = options.items.map((p) => ({ index: p.index, quantity: p.quantity }));
154
172
  if (options.note !== undefined && options.note !== '')
155
173
  params.note = options.note;
174
+ if (zahlungen !== undefined)
175
+ params.payments = zahlungen;
156
176
  if (options.paymentMethod != null)
157
177
  params.paymentMethod = gepruefteZahlungsart(options.paymentMethod);
158
178
  const karte = options.creditCardProvider != null || options.cardPaymentId != null || options.cardPaymentData != null;
@@ -506,15 +526,110 @@ function gepruefterTip(tip) {
506
526
  }
507
527
  return nutzlast;
508
528
  }
509
- /** Zahlungsart des Aufrufers pruefen — unbekannt wirft, bevor etwas rausgeht. */
529
+ /**
530
+ * Zahlungsart des Aufrufers pruefen — unbekannt wirft, bevor etwas rausgeht.
531
+ * `mixed` wirft ebenfalls: den Wert vergibt nur der Server (Beleg mit
532
+ * mehreren Zahlarten); gesendet wird stattdessen die Zahlungsliste.
533
+ */
510
534
  function gepruefteZahlungsart(wert) {
511
- if (typeof wert === 'object') {
512
- return wert.value;
535
+ let zahlungsart;
536
+ if (typeof wert === 'object' && wert !== null) {
537
+ zahlungsart = wert.value;
538
+ }
539
+ else {
540
+ if (typeof wert !== 'string' || !Object.prototype.hasOwnProperty.call(index_js_1.KeckPaymentMethod, wert)) {
541
+ throw eingabefehler(`Zahlungsart: unbekannter Schluessel "${String(wert)}"`);
542
+ }
543
+ zahlungsart = index_js_1.KeckPaymentMethod[wert].value;
513
544
  }
514
- if (!Object.prototype.hasOwnProperty.call(index_js_1.KeckPaymentMethod, wert)) {
515
- throw eingabefehler(`Zahlungsart: unbekannter Schluessel "${wert}"`);
545
+ if (zahlungsart === index_js_1.KeckPaymentMethod.mixed.value) {
546
+ throw eingabefehler('Zahlungsart "mixed" vergibt nur der Server – mehrere Zahlarten gehen als payments hinaus.');
516
547
  }
517
- return index_js_1.KeckPaymentMethod[wert].value;
548
+ return zahlungsart;
549
+ }
550
+ /** Hoechstzahl der Zahlungen je Beleg (Backend: MAX_ZAHLUNGEN). */
551
+ const MAX_ZAHLUNGEN = 20;
552
+ /**
553
+ * `payments` neben einer Einzel-Zahlungsart oder Kartenfeldern? Liefert den
554
+ * Grund (Backend: PAYMENTS_CONFLICT), sonst null. Nie still eines bevorzugen.
555
+ */
556
+ function zahlungsKonflikt(options) {
557
+ for (const feld of ['paymentMethod', 'paymentMethodFromServer', 'creditCardProvider', 'cardPaymentId', 'cardPaymentData']) {
558
+ if (options[feld] != null) {
559
+ return `payments und ${feld} duerfen nicht gemeinsam gesendet werden – Kartenangaben gehoeren in die Zahlung.`;
560
+ }
561
+ }
562
+ return null;
563
+ }
564
+ /**
565
+ * Zahlungsliste pruefen und in Nutzlast-Form bringen — Formpruefung wie
566
+ * `pruefeZahlungen` im Backend, soweit sie ohne Beleg und Zahlbetrag geht
567
+ * (Summe, Anbieter-Pflicht und Trinkgeld prueft der Server). Wirft, bevor
568
+ * etwas hinausgeht.
569
+ */
570
+ function gepruefteZahlungen(roh, storno, functionName) {
571
+ const fehler = (grund) => new errors_js_1.KasseneckValidationError(functionName, grund, 'request');
572
+ if (!Array.isArray(roh))
573
+ throw fehler('payments muss eine Liste sein.');
574
+ if (roh.length > MAX_ZAHLUNGEN)
575
+ throw fehler(`payments: es sind hoechstens ${MAX_ZAHLUNGEN} Eintraege erlaubt.`);
576
+ return roh.map((eintrag, i) => {
577
+ const nr = i + 1;
578
+ if (eintrag == null || typeof eintrag !== 'object' || Array.isArray(eintrag)) {
579
+ throw fehler(`Zahlung ${nr}: kein gueltiges Objekt.`);
580
+ }
581
+ const z = eintrag;
582
+ const method = gepruefteZahlungsart(z['method']);
583
+ const betrag = z['amountCents'];
584
+ if (typeof betrag !== 'number' || !Number.isInteger(betrag) || (storno ? betrag >= 0 : betrag <= 0)) {
585
+ throw fehler(`Zahlung ${nr}: amountCents muss eine ganze Zahl ${storno ? 'kleiner' : 'groesser'} als 0 sein.`);
586
+ }
587
+ const aus = { method, amountCents: betrag };
588
+ if (z['tenderedCents'] !== undefined) {
589
+ const gegeben = z['tenderedCents'];
590
+ if (storno || typeof gegeben !== 'number' || !Number.isInteger(gegeben) || gegeben < betrag) {
591
+ throw fehler(`Zahlung ${nr}: tenderedCents muss eine ganze Zahl von mindestens amountCents sein (nur am Verkauf).`);
592
+ }
593
+ aus['tenderedCents'] = gegeben;
594
+ }
595
+ if (z['tipCents'] !== undefined) {
596
+ const trinkgeld = z['tipCents'];
597
+ if (typeof trinkgeld !== 'number' || !Number.isInteger(trinkgeld) || trinkgeld <= 0) {
598
+ throw fehler(`Zahlung ${nr}: tipCents muss eine ganze Zahl groesser als 0 sein.`);
599
+ }
600
+ aus['tipCents'] = trinkgeld;
601
+ }
602
+ if (z['provider'] !== undefined) {
603
+ aus['provider'] = kartenanbieter(String(z['provider']));
604
+ }
605
+ if (z['providerPaymentId'] !== undefined) {
606
+ if (typeof z['providerPaymentId'] !== 'string' || z['providerPaymentId'] === '') {
607
+ throw fehler(`Zahlung ${nr}: providerPaymentId muss ein nicht-leerer Text sein.`);
608
+ }
609
+ aus['providerPaymentId'] = z['providerPaymentId'];
610
+ }
611
+ if (z['providerData'] !== undefined) {
612
+ const daten = z['providerData'];
613
+ if (daten === null || typeof daten !== 'object' || Array.isArray(daten)) {
614
+ throw fehler(`Zahlung ${nr}: providerData muss ein Objekt sein.`);
615
+ }
616
+ aus['providerData'] = daten;
617
+ }
618
+ if (z['refundOf'] !== undefined) {
619
+ if (!storno || typeof z['refundOf'] !== 'string' || z['refundOf'] === '') {
620
+ throw fehler(`Zahlung ${nr}: refundOf gibt es nur am Storno, als id der Originalzahlung.`);
621
+ }
622
+ aus['refundOf'] = z['refundOf'];
623
+ }
624
+ return aus;
625
+ });
626
+ }
627
+ /** `payments` am Storno: Konflikt mit Zahlungsart/Kartenfeldern, dann Form. */
628
+ function gepruefteStornoZahlungen(options) {
629
+ const konflikt = zahlungsKonflikt(options);
630
+ if (konflikt != null)
631
+ throw new errors_js_1.KasseneckValidationError('cancelReceipt', konflikt, 'request');
632
+ return gepruefteZahlungen(options.payments, true, 'cancelReceipt');
518
633
  }
519
634
  /** Kartenanbieter pruefen — er stammt vom Aufrufer, nicht aus Serverdaten. */
520
635
  function kartenanbieter(wert) {
@@ -5,6 +5,11 @@
5
5
  * `label` ist das deutsche Anzeige-Label fuer die Zahlungsart-Zeile auf dem Beleg.
6
6
  * Muss 1:1 mit dem Backend-Mapping `paymentMethodToString` (functions/helper.js)
7
7
  * uebereinstimmen.
8
+ *
9
+ * `mixed` vergibt nur der Server: ein Beleg mit mehreren Zahlungen
10
+ * verschiedener Zahlart (`payments`) traegt ihn als Einzelfeld
11
+ * `paymentMethod`. Lesen ist erlaubt, Senden nicht — wer mehrere Zahlarten
12
+ * kassiert, schickt die Zahlungsliste, nie `mixed`.
8
13
  */
9
14
  export declare const KeckPaymentMethod: {
10
15
  readonly cash: {
@@ -52,6 +57,11 @@ export declare const KeckPaymentMethod: {
52
57
  readonly needsCreditCard: true;
53
58
  readonly label: "Bolt Card";
54
59
  };
60
+ readonly mixed: {
61
+ readonly value: "mixed";
62
+ readonly needsCreditCard: false;
63
+ readonly label: "Mehrere Zahlungsarten";
64
+ };
55
65
  };
56
66
  export type KeckPaymentMethodKey = keyof typeof KeckPaymentMethod;
57
67
  export type KeckPaymentMethod = (typeof KeckPaymentMethod)[KeckPaymentMethodKey];
@@ -9,6 +9,11 @@ const define_enum_js_1 = require("./define-enum.js");
9
9
  * `label` ist das deutsche Anzeige-Label fuer die Zahlungsart-Zeile auf dem Beleg.
10
10
  * Muss 1:1 mit dem Backend-Mapping `paymentMethodToString` (functions/helper.js)
11
11
  * uebereinstimmen.
12
+ *
13
+ * `mixed` vergibt nur der Server: ein Beleg mit mehreren Zahlungen
14
+ * verschiedener Zahlart (`payments`) traegt ihn als Einzelfeld
15
+ * `paymentMethod`. Lesen ist erlaubt, Senden nicht — wer mehrere Zahlarten
16
+ * kassiert, schickt die Zahlungsliste, nie `mixed`.
12
17
  */
13
18
  exports.KeckPaymentMethod = (0, define_enum_js_1.defineEnum)({
14
19
  cash: { value: 'cash', needsCreditCard: false, label: 'Barzahlung' },
@@ -20,4 +25,5 @@ exports.KeckPaymentMethod = (0, define_enum_js_1.defineEnum)({
20
25
  boltApp: { value: 'boltApp', needsCreditCard: false, label: 'Bolt App' },
21
26
  boltCash: { value: 'boltCash', needsCreditCard: false, label: 'Bolt Cash' },
22
27
  boltCard: { value: 'boltCard', needsCreditCard: true, label: 'Bolt Card' },
28
+ mixed: { value: 'mixed', needsCreditCard: false, label: 'Mehrere Zahlungsarten' },
23
29
  });
@@ -1,5 +1,5 @@
1
1
  export { ReceiptType, type ReceiptTypeKey, VatRate, type VatRateKey, KeckPaymentMethod, type KeckPaymentMethodKey, CreditCardProvider, type CreditCardProviderKey, VoucherType, type VoucherTypeKey, VoucherAction, type VoucherActionKey, StripeLinkMode, type StripeLinkModeKey, } from './enums/index.js';
2
- export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type TipRecipient, isTipItem, type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid, type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, type CancellationErrorCode, CANCELLATION_REASONS, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isCancellationErrorCode, type ReceiptEmailErrorCode, RECEIPT_EMAIL_ERROR_CODES, isReceiptEmailErrorCode, remainingQuantities, type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, istZeroKind, type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, type HobexReceipt, type HobexReceiptPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
3
- export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type RegisterUserAuthOptions, apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, AUFRUFE, type Aufruf, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, type ReceiptCommonOptions, type SellReceiptOptions, type TipOptions, type TipRecipientShare, type CancelReceiptOptions, type CancelReceiptResult, type CreateCancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, listMyCashregisters, checkVoucherCombinationError, type SendReceiptEmailOptions, type SendReceiptEmailResult, sendReceiptEmail, downloadDailyReport, downloadMonthlyReport, type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, type KasseneckApi, createKasseneckApi, } from './client/index.js';
2
+ export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type TipRecipient, isTipItem, type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid, type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, type CancellationErrorCode, CANCELLATION_REASONS, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isCancellationErrorCode, type ReceiptPayment, type ReceiptPaymentPayload, type ReceiptPaymentInput, fromReceiptPaymentPayload, toReceiptPaymentPayload, type PaymentErrorCode, PAYMENT_ERROR_CODES, isPaymentErrorCode, type ReceiptEmailErrorCode, RECEIPT_EMAIL_ERROR_CODES, isReceiptEmailErrorCode, remainingQuantities, type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, istZeroKind, type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, type HobexReceipt, type HobexReceiptPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
3
+ export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type RegisterUserAuthOptions, apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, AUFRUFE, type Aufruf, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, type ReceiptCommonOptions, type SellReceiptOptions, type SellReceiptWithPaymentsOptions, type TipOptions, type TipRecipientShare, type CancelReceiptOptions, type CancelReceiptResult, type CreateCancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, listMyCashregisters, checkVoucherCombinationError, type SendReceiptEmailOptions, type SendReceiptEmailResult, sendReceiptEmail, downloadDailyReport, downloadMonthlyReport, type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, type KasseneckApi, createKasseneckApi, } from './client/index.js';
4
4
  export { parseServerTimeStamp, toViennaWallClock, type ViennaWallClock } from './vienna-time.js';
5
5
  export { type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, type ArticleGroup, type KasseArtikel, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, fromArticleGroupPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings, verteileRabatt, cancelScopeOf, receiptsScopeOf, } from './kasse/index.js';
package/dist/cjs/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AUFRUFE = exports.DEFAULT_TIMEOUT_MS = exports.DEFAULT_BASE_URL = exports.registerUserAuth = exports.apiKeyAuth = exports.hobexReceiptNeedsSignature = exports.hobexReceiptToCardPaymentData = exports.fromHobexReceiptPayload = exports.toHobexReceiptPayload = exports.fromStripeUrlSessionPayload = exports.toStripeUrlSessionPayload = exports.reportMonthReadable = exports.reportMonthKey = exports.nextReportMonth = exports.previousReportMonth = exports.reportMonthFromDate = exports.istZeroKind = exports.ZERO_KINDS = exports.fromReceiptSummaryPayload = exports.fromCashregisterPayload = exports.receiptCompanyTaxInfo = exports.fromReceiptCompanyPayload = exports.remainingQuantities = exports.isReceiptEmailErrorCode = exports.RECEIPT_EMAIL_ERROR_CODES = exports.isCancellationErrorCode = exports.isCancellationReason = exports.CANCELLATION_RESERVATION_MS = exports.CANCELLATION_ERROR_CODES = exports.CANCELLATION_REASONS = exports.receiptSumCents = exports.receiptSubSumCents = exports.fromReceiptPayload = exports.toReceiptPayload = exports.voucherIsValid = exports.fromVoucherPayload = exports.toVoucherPayload = exports.isTipItem = exports.negateReceiptItem = exports.receiptItemIsValid = exports.receiptItemTotalCents = exports.fromReceiptItemPayload = exports.toReceiptItemPayload = exports.StripeLinkMode = exports.VoucherAction = exports.VoucherType = exports.CreditCardProvider = exports.KeckPaymentMethod = exports.VatRate = exports.ReceiptType = void 0;
4
- exports.receiptsScopeOf = exports.cancelScopeOf = exports.verteileRabatt = exports.setMyRegisterDeviceSettings = exports.setMyKasseSettings = exports.getKasseSettings = exports.listMyArticles = exports.listMyArticleGroups = exports.fromKasseArtikelPayload = exports.fromArticleGroupPayload = exports.mergeKasseSettings = exports.KASSE_GERAET_STANDARD = exports.KASSE_BETRIEB_STANDARD = exports.toViennaWallClock = exports.parseServerTimeStamp = exports.createKasseneckApi = exports.getSignatureStatus = exports.getCashboxStatus = exports.downloadMonthlyReport = exports.downloadDailyReport = exports.sendReceiptEmail = exports.checkVoucherCombinationError = exports.listMyCashregisters = exports.listMyReceipts = exports.getFirstReceiptDate = exports.generateFullReceiptId = exports.getReceiptWithCompany = exports.getReceipt = exports.zeroReceipt = exports.createCancelReceipt = exports.cancelReceipt = exports.sellReceiptWithCompany = exports.sellReceipt = exports.isKasseneckValidationError = exports.isKasseneckNetworkError = exports.isKasseneckHttpError = exports.isKasseneckAuthError = exports.isKasseneckApiError = exports.KasseneckValidationError = exports.KasseneckNetworkError = exports.KasseneckHttpError = exports.KasseneckAuthError = exports.KasseneckApiError = exports.createBinaryTransport = exports.createTransport = void 0;
3
+ exports.apiKeyAuth = exports.hobexReceiptNeedsSignature = exports.hobexReceiptToCardPaymentData = exports.fromHobexReceiptPayload = exports.toHobexReceiptPayload = exports.fromStripeUrlSessionPayload = exports.toStripeUrlSessionPayload = exports.reportMonthReadable = exports.reportMonthKey = exports.nextReportMonth = exports.previousReportMonth = exports.reportMonthFromDate = exports.istZeroKind = exports.ZERO_KINDS = exports.fromReceiptSummaryPayload = exports.fromCashregisterPayload = exports.receiptCompanyTaxInfo = exports.fromReceiptCompanyPayload = exports.remainingQuantities = exports.isReceiptEmailErrorCode = exports.RECEIPT_EMAIL_ERROR_CODES = exports.isPaymentErrorCode = exports.PAYMENT_ERROR_CODES = exports.toReceiptPaymentPayload = exports.fromReceiptPaymentPayload = exports.isCancellationErrorCode = exports.isCancellationReason = exports.CANCELLATION_RESERVATION_MS = exports.CANCELLATION_ERROR_CODES = exports.CANCELLATION_REASONS = exports.receiptSumCents = exports.receiptSubSumCents = exports.fromReceiptPayload = exports.toReceiptPayload = exports.voucherIsValid = exports.fromVoucherPayload = exports.toVoucherPayload = exports.isTipItem = exports.negateReceiptItem = exports.receiptItemIsValid = exports.receiptItemTotalCents = exports.fromReceiptItemPayload = exports.toReceiptItemPayload = exports.StripeLinkMode = exports.VoucherAction = exports.VoucherType = exports.CreditCardProvider = exports.KeckPaymentMethod = exports.VatRate = exports.ReceiptType = void 0;
4
+ exports.receiptsScopeOf = exports.cancelScopeOf = exports.verteileRabatt = exports.setMyRegisterDeviceSettings = exports.setMyKasseSettings = exports.getKasseSettings = exports.listMyArticles = exports.listMyArticleGroups = exports.fromKasseArtikelPayload = exports.fromArticleGroupPayload = exports.mergeKasseSettings = exports.KASSE_GERAET_STANDARD = exports.KASSE_BETRIEB_STANDARD = exports.toViennaWallClock = exports.parseServerTimeStamp = exports.createKasseneckApi = exports.getSignatureStatus = exports.getCashboxStatus = exports.downloadMonthlyReport = exports.downloadDailyReport = exports.sendReceiptEmail = exports.checkVoucherCombinationError = exports.listMyCashregisters = exports.listMyReceipts = exports.getFirstReceiptDate = exports.generateFullReceiptId = exports.getReceiptWithCompany = exports.getReceipt = exports.zeroReceipt = exports.createCancelReceipt = exports.cancelReceipt = exports.sellReceiptWithCompany = exports.sellReceipt = exports.isKasseneckValidationError = exports.isKasseneckNetworkError = exports.isKasseneckHttpError = exports.isKasseneckAuthError = exports.isKasseneckApiError = exports.KasseneckValidationError = exports.KasseneckNetworkError = exports.KasseneckHttpError = exports.KasseneckAuthError = exports.KasseneckApiError = exports.createBinaryTransport = exports.createTransport = exports.AUFRUFE = exports.DEFAULT_TIMEOUT_MS = exports.DEFAULT_BASE_URL = exports.registerUserAuth = void 0;
5
5
  var index_js_1 = require("./enums/index.js");
6
6
  Object.defineProperty(exports, "ReceiptType", { enumerable: true, get: function () { return index_js_1.ReceiptType; } });
7
7
  Object.defineProperty(exports, "VatRate", { enumerable: true, get: function () { return index_js_1.VatRate; } });
@@ -29,6 +29,10 @@ Object.defineProperty(exports, "CANCELLATION_ERROR_CODES", { enumerable: true, g
29
29
  Object.defineProperty(exports, "CANCELLATION_RESERVATION_MS", { enumerable: true, get: function () { return index_js_2.CANCELLATION_RESERVATION_MS; } });
30
30
  Object.defineProperty(exports, "isCancellationReason", { enumerable: true, get: function () { return index_js_2.isCancellationReason; } });
31
31
  Object.defineProperty(exports, "isCancellationErrorCode", { enumerable: true, get: function () { return index_js_2.isCancellationErrorCode; } });
32
+ Object.defineProperty(exports, "fromReceiptPaymentPayload", { enumerable: true, get: function () { return index_js_2.fromReceiptPaymentPayload; } });
33
+ Object.defineProperty(exports, "toReceiptPaymentPayload", { enumerable: true, get: function () { return index_js_2.toReceiptPaymentPayload; } });
34
+ Object.defineProperty(exports, "PAYMENT_ERROR_CODES", { enumerable: true, get: function () { return index_js_2.PAYMENT_ERROR_CODES; } });
35
+ Object.defineProperty(exports, "isPaymentErrorCode", { enumerable: true, get: function () { return index_js_2.isPaymentErrorCode; } });
32
36
  Object.defineProperty(exports, "RECEIPT_EMAIL_ERROR_CODES", { enumerable: true, get: function () { return index_js_2.RECEIPT_EMAIL_ERROR_CODES; } });
33
37
  Object.defineProperty(exports, "isReceiptEmailErrorCode", { enumerable: true, get: function () { return index_js_2.isReceiptEmailErrorCode; } });
34
38
  Object.defineProperty(exports, "remainingQuantities", { enumerable: true, get: function () { return index_js_2.remainingQuantities; } });
@@ -27,8 +27,18 @@ export declare function isCancellationReason(value: unknown): value is Cancellat
27
27
  *
28
28
  * Nur Auth-/Parameterfehler (Sitzung abgelaufen, Pflichtfeld fehlt) kommen
29
29
  * ohne Code; dort bleibt `code` undefined.
30
+ *
31
+ * Die vier `STORNO_…`-Codes am Ende gehoeren zur Rueckzahlung je Zahlung
32
+ * (mehrere Zahlungen je Beleg); Formfehler an `payments` selbst melden die
33
+ * Codes aus [PAYMENT_ERROR_CODES].
34
+ *
35
+ * Die Werte hier sind die von `/v1` und intern. Unter `/v3` heissen die
36
+ * Storno-Codes nach dem /v3-Vokabular anders (`already_cancelled`,
37
+ * `cancellation_payments_required`, functions/gemeinsam/api-vokabular-v3.js);
38
+ * diese Namen kommen mit der Umstellung des Pakets auf `/v3`.
39
+ * [isCancellationErrorCode] prueft darum exakt.
30
40
  */
31
- export declare const CANCELLATION_ERROR_CODES: readonly ["beleg_nicht_gefunden", "belegart_nicht_stornierbar", "trainingsbeleg", "bereits_storniert", "position_ungueltig", "menge_ueber_rest", "grund_unbekannt", "anmerkung_zu_lang", "items_ungueltig", "kasse_nicht_zugewiesen", "keine_berechtigung", "nur_eigene_belege", "kasse_unvollstaendig", "storno_fehlgeschlagen"];
41
+ export declare const CANCELLATION_ERROR_CODES: readonly ["beleg_nicht_gefunden", "belegart_nicht_stornierbar", "trainingsbeleg", "bereits_storniert", "position_ungueltig", "menge_ueber_rest", "grund_unbekannt", "anmerkung_zu_lang", "items_ungueltig", "kasse_nicht_zugewiesen", "keine_berechtigung", "nur_eigene_belege", "kasse_unvollstaendig", "storno_fehlgeschlagen", "STORNO_PAYMENTS_REQUIRED", "STORNO_REFUND_EXCEEDS_PAYMENT", "STORNO_REFUND_REFERENCE_REQUIRED", "STORNO_REFUND_REFERENCE_UNKNOWN"];
32
42
  export type CancellationErrorCode = (typeof CANCELLATION_ERROR_CODES)[number];
33
43
  export declare function isCancellationErrorCode(value: unknown): value is CancellationErrorCode;
34
44
  /** Bezug eines Storno-Belegs auf sein Original. */
@@ -33,6 +33,16 @@ function isCancellationReason(value) {
33
33
  *
34
34
  * Nur Auth-/Parameterfehler (Sitzung abgelaufen, Pflichtfeld fehlt) kommen
35
35
  * ohne Code; dort bleibt `code` undefined.
36
+ *
37
+ * Die vier `STORNO_…`-Codes am Ende gehoeren zur Rueckzahlung je Zahlung
38
+ * (mehrere Zahlungen je Beleg); Formfehler an `payments` selbst melden die
39
+ * Codes aus [PAYMENT_ERROR_CODES].
40
+ *
41
+ * Die Werte hier sind die von `/v1` und intern. Unter `/v3` heissen die
42
+ * Storno-Codes nach dem /v3-Vokabular anders (`already_cancelled`,
43
+ * `cancellation_payments_required`, functions/gemeinsam/api-vokabular-v3.js);
44
+ * diese Namen kommen mit der Umstellung des Pakets auf `/v3`.
45
+ * [isCancellationErrorCode] prueft darum exakt.
36
46
  */
37
47
  exports.CANCELLATION_ERROR_CODES = [
38
48
  'beleg_nicht_gefunden', // Original fehlt oder gehoert nicht zu dieser Kasse
@@ -49,6 +59,11 @@ exports.CANCELLATION_ERROR_CODES = [
49
59
  'nur_eigene_belege', // Recht "eigene", fremder Beleg
50
60
  'kasse_unvollstaendig', // api_key/token fehlen am Konto bzw. an der Kasse
51
61
  'storno_fehlgeschlagen', // der Storno-Beleg selbst wurde abgelehnt (z. B. Signatur)
62
+ // Mehrere Zahlungen je Beleg (Rueckzahlung je Zahlung):
63
+ 'STORNO_PAYMENTS_REQUIRED', // Teilstorno eines Belegs mit mehreren Zahlungen ohne payments
64
+ 'STORNO_REFUND_EXCEEDS_PAYMENT', // Rueckzahlungen auf eine Zahlung uebersteigen deren Rest
65
+ 'STORNO_REFUND_REFERENCE_REQUIRED', // Karten-Rueckzahlung ohne refundOf einer Kartenzahlung
66
+ 'STORNO_REFUND_REFERENCE_UNKNOWN', // refundOf nennt keine Zahlung des Originals
52
67
  ];
53
68
  function isCancellationErrorCode(value) {
54
69
  return typeof value === 'string' && exports.CANCELLATION_ERROR_CODES.includes(value);
@@ -2,6 +2,8 @@ export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead,
2
2
  export { type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid } from './voucher.js';
3
3
  export { type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, } from './receipt.js';
4
4
  export { type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, type CancellationErrorCode, CANCELLATION_REASONS, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isCancellationErrorCode, remainingQuantities, } from './cancellation.js';
5
+ export { type ReceiptPayment, type ReceiptPaymentPayload, type ReceiptPaymentInput, fromReceiptPaymentPayload, toReceiptPaymentPayload, } from './receipt-payment.js';
6
+ export { type PaymentErrorCode, PAYMENT_ERROR_CODES, isPaymentErrorCode } from './payment-errors.js';
5
7
  export { type ReceiptEmailErrorCode, RECEIPT_EMAIL_ERROR_CODES, isReceiptEmailErrorCode, } from './receipt-email.js';
6
8
  export { type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, } from './receipt-company.js';
7
9
  export { type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, } from './cashregister.js';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hobexReceiptNeedsSignature = exports.hobexReceiptToCardPaymentData = exports.fromHobexReceiptPayload = exports.toHobexReceiptPayload = exports.fromStripeUrlSessionPayload = exports.toStripeUrlSessionPayload = exports.reportMonthReadable = exports.reportMonthKey = exports.nextReportMonth = exports.previousReportMonth = exports.reportMonthFromDate = exports.istZeroKind = exports.ZERO_KINDS = exports.fromReceiptSummaryPayload = exports.fromCashregisterPayload = exports.receiptCompanyTaxInfo = exports.fromReceiptCompanyPayload = exports.isReceiptEmailErrorCode = exports.RECEIPT_EMAIL_ERROR_CODES = exports.remainingQuantities = exports.isCancellationErrorCode = exports.isCancellationReason = exports.CANCELLATION_RESERVATION_MS = exports.CANCELLATION_ERROR_CODES = exports.CANCELLATION_REASONS = exports.receiptSumCents = exports.receiptSubSumCents = exports.fromReceiptPayload = exports.toReceiptPayload = exports.voucherIsValid = exports.fromVoucherPayload = exports.toVoucherPayload = exports.isDiscountItem = exports.isTipItem = exports.negateReceiptItem = exports.receiptItemIsValid = exports.receiptItemTotalCents = exports.fromReceiptItemPayload = exports.toReceiptItemPayload = void 0;
3
+ exports.hobexReceiptNeedsSignature = exports.hobexReceiptToCardPaymentData = exports.fromHobexReceiptPayload = exports.toHobexReceiptPayload = exports.fromStripeUrlSessionPayload = exports.toStripeUrlSessionPayload = exports.reportMonthReadable = exports.reportMonthKey = exports.nextReportMonth = exports.previousReportMonth = exports.reportMonthFromDate = exports.istZeroKind = exports.ZERO_KINDS = exports.fromReceiptSummaryPayload = exports.fromCashregisterPayload = exports.receiptCompanyTaxInfo = exports.fromReceiptCompanyPayload = exports.isReceiptEmailErrorCode = exports.RECEIPT_EMAIL_ERROR_CODES = exports.isPaymentErrorCode = exports.PAYMENT_ERROR_CODES = exports.toReceiptPaymentPayload = exports.fromReceiptPaymentPayload = exports.remainingQuantities = exports.isCancellationErrorCode = exports.isCancellationReason = exports.CANCELLATION_RESERVATION_MS = exports.CANCELLATION_ERROR_CODES = exports.CANCELLATION_REASONS = exports.receiptSumCents = exports.receiptSubSumCents = exports.fromReceiptPayload = exports.toReceiptPayload = exports.voucherIsValid = exports.fromVoucherPayload = exports.toVoucherPayload = exports.isDiscountItem = exports.isTipItem = exports.negateReceiptItem = exports.receiptItemIsValid = exports.receiptItemTotalCents = exports.fromReceiptItemPayload = exports.toReceiptItemPayload = void 0;
4
4
  var receipt_item_js_1 = require("./receipt-item.js");
5
5
  Object.defineProperty(exports, "toReceiptItemPayload", { enumerable: true, get: function () { return receipt_item_js_1.toReceiptItemPayload; } });
6
6
  Object.defineProperty(exports, "fromReceiptItemPayload", { enumerable: true, get: function () { return receipt_item_js_1.fromReceiptItemPayload; } });
@@ -25,6 +25,12 @@ Object.defineProperty(exports, "CANCELLATION_RESERVATION_MS", { enumerable: true
25
25
  Object.defineProperty(exports, "isCancellationReason", { enumerable: true, get: function () { return cancellation_js_1.isCancellationReason; } });
26
26
  Object.defineProperty(exports, "isCancellationErrorCode", { enumerable: true, get: function () { return cancellation_js_1.isCancellationErrorCode; } });
27
27
  Object.defineProperty(exports, "remainingQuantities", { enumerable: true, get: function () { return cancellation_js_1.remainingQuantities; } });
28
+ var receipt_payment_js_1 = require("./receipt-payment.js");
29
+ Object.defineProperty(exports, "fromReceiptPaymentPayload", { enumerable: true, get: function () { return receipt_payment_js_1.fromReceiptPaymentPayload; } });
30
+ Object.defineProperty(exports, "toReceiptPaymentPayload", { enumerable: true, get: function () { return receipt_payment_js_1.toReceiptPaymentPayload; } });
31
+ var payment_errors_js_1 = require("./payment-errors.js");
32
+ Object.defineProperty(exports, "PAYMENT_ERROR_CODES", { enumerable: true, get: function () { return payment_errors_js_1.PAYMENT_ERROR_CODES; } });
33
+ Object.defineProperty(exports, "isPaymentErrorCode", { enumerable: true, get: function () { return payment_errors_js_1.isPaymentErrorCode; } });
28
34
  var receipt_email_js_1 = require("./receipt-email.js");
29
35
  Object.defineProperty(exports, "RECEIPT_EMAIL_ERROR_CODES", { enumerable: true, get: function () { return receipt_email_js_1.RECEIPT_EMAIL_ERROR_CODES; } });
30
36
  Object.defineProperty(exports, "isReceiptEmailErrorCode", { enumerable: true, get: function () { return receipt_email_js_1.isReceiptEmailErrorCode; } });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Mehrere Zahlungen je Beleg — Fehlercode-Katalog, Zwilling von
3
+ * `functions/gemeinsam/zahlungen-core.js` ZAHLUNGS_FEHLERCODES (gleiche
4
+ * Codes, gleiche Reihenfolge).
5
+ *
6
+ * `createReceipt` und `cancelReceipt` legen sie bei jedem Fehler rund um
7
+ * `payments` (und bei den Aufrufer-Vorbedingungen wie `PAYMENTS_CONFLICT`)
8
+ * als `code` neben die Meldung; das Paket reicht sie als
9
+ * [KasseneckApiError.code] durch. **Entscheide am Code, nie am Text** — die
10
+ * deutsche Meldung darf sich aendern, der Code nicht.
11
+ *
12
+ * Schreibweise: auf `/v1`, `/v2` und intern kommen die Codes gross
13
+ * (`PAYMENTS_SUM_MISMATCH`), unter `/v3` schreibt der Rand des Backends sie
14
+ * klein (`payments_sum_mismatch`, functions/gemeinsam/api-vokabular-v3.js:
15
+ * jeder dieser Codes 1:1 in Kleinschreibung, anders als die Storno-Codes).
16
+ * [isPaymentErrorCode] erkennt beide; wer selbst vergleicht, vergleicht
17
+ * `code.toUpperCase()`.
18
+ */
19
+ export declare const PAYMENT_ERROR_CODES: readonly ["PAYMENTS_INVALID", "PAYMENT_METHOD_INVALID", "PAYMENT_AMOUNT_INVALID", "PAYMENT_TENDERED_INVALID", "PAYMENT_PROVIDER_INVALID", "PAYMENT_PROVIDER_NOT_ALLOWED", "PAYMENTS_SUM_MISMATCH", "PAYMENTS_DUE_NEGATIVE", "PAYMENTS_NOT_ALLOWED", "PAYMENTS_CONFLICT", "PAYMENTS_REQUIRED", "PAYMENT_METHOD_NOT_SUPPORTED", "TIP_PAYMENT_METHOD_INVALID", "TIP_PAYMENT_METHOD_REQUIRED", "TIP_EXCEEDS_PAYMENT", "PAYMENT_REFUND_NOT_ALLOWED", "PAYMENT_TIP_INVALID", "TIP_CONFLICT"];
20
+ export type PaymentErrorCode = (typeof PAYMENT_ERROR_CODES)[number];
21
+ /** Erkennt einen Code aus [PAYMENT_ERROR_CODES] — gross (`/v1`) wie klein (`/v3`). */
22
+ export declare function isPaymentErrorCode(value: unknown): value is PaymentErrorCode | Lowercase<PaymentErrorCode>;