@kreiseck/kasseneck-api 0.7.0 → 0.7.2

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 (122) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +87 -15
  3. package/dist/cjs/client/aufrufe.d.ts +1 -1
  4. package/dist/cjs/client/aufrufe.js +1 -0
  5. package/dist/cjs/client/errors.d.ts +8 -4
  6. package/dist/cjs/client/errors.js +12 -9
  7. package/dist/cjs/client/receipts.d.ts +22 -0
  8. package/dist/cjs/client/receipts.js +16 -0
  9. package/dist/cjs/client/transport.js +5 -4
  10. package/dist/cjs/index.d.ts +1 -1
  11. package/dist/cjs/index.js +4 -2
  12. package/dist/cjs/models/cancellation.d.ts +28 -0
  13. package/dist/cjs/models/cancellation.js +31 -1
  14. package/dist/cjs/models/hobex-receipt.js +9 -2
  15. package/dist/cjs/models/index.d.ts +1 -1
  16. package/dist/cjs/models/index.js +3 -1
  17. package/dist/cjs/models/receipt-summary.d.ts +2 -0
  18. package/dist/cjs/models/receipt-summary.js +4 -1
  19. package/dist/cjs/models/receipt.js +8 -1
  20. package/dist/cjs/models/voucher.js +18 -2
  21. package/dist/cjs/payments/hobex-hps/connect-client.d.ts +104 -0
  22. package/dist/cjs/payments/hobex-hps/connect-client.js +159 -0
  23. package/dist/cjs/payments/hobex-hps/errors.d.ts +122 -0
  24. package/dist/cjs/payments/hobex-hps/errors.js +158 -0
  25. package/dist/cjs/payments/hobex-hps/events.d.ts +22 -0
  26. package/dist/cjs/payments/hobex-hps/events.js +2 -0
  27. package/dist/cjs/payments/hobex-hps/index.d.ts +27 -0
  28. package/dist/cjs/payments/hobex-hps/index.js +67 -0
  29. package/dist/cjs/payments/hobex-hps/outcome.d.ts +46 -0
  30. package/dist/cjs/payments/hobex-hps/outcome.js +7 -0
  31. package/dist/cjs/payments/hobex-hps/payments.d.ts +149 -0
  32. package/dist/cjs/payments/hobex-hps/payments.js +573 -0
  33. package/dist/cjs/payments/hobex-hps/receipt.d.ts +28 -0
  34. package/dist/cjs/payments/hobex-hps/receipt.js +60 -0
  35. package/dist/cjs/payments/hobex-hps/transaction-id.d.ts +65 -0
  36. package/dist/cjs/payments/hobex-hps/transaction-id.js +91 -0
  37. package/dist/cjs/payments/hobex-hps/transaction-response.d.ts +175 -0
  38. package/dist/cjs/payments/hobex-hps/transaction-response.js +266 -0
  39. package/dist/cjs/payments/hobex.js +9 -6
  40. package/dist/cjs/payments/index.d.ts +26 -14
  41. package/dist/cjs/payments/index.js +59 -15
  42. package/dist/cjs/printing/index.d.ts +1 -1
  43. package/dist/cjs/printing/index.js +2 -1
  44. package/dist/cjs/printing/webusb.d.ts +37 -7
  45. package/dist/cjs/printing/webusb.js +76 -18
  46. package/dist/cjs/receipt/epos.d.ts +18 -0
  47. package/dist/cjs/receipt/epos.js +78 -6
  48. package/dist/cjs/receipt/index.d.ts +1 -1
  49. package/dist/cjs/receipt/index.js +2 -1
  50. package/dist/cjs/receipt/layout.js +19 -0
  51. package/dist/cjs/register/index.d.ts +1 -1
  52. package/dist/cjs/register/index.js +2 -1
  53. package/dist/cjs/register/pairing.d.ts +59 -0
  54. package/dist/cjs/register/pairing.js +51 -2
  55. package/dist/esm/client/aufrufe.d.ts +1 -1
  56. package/dist/esm/client/aufrufe.js +1 -0
  57. package/dist/esm/client/errors.d.ts +8 -4
  58. package/dist/esm/client/errors.js +12 -9
  59. package/dist/esm/client/receipts.d.ts +22 -0
  60. package/dist/esm/client/receipts.js +16 -0
  61. package/dist/esm/client/transport.js +5 -4
  62. package/dist/esm/index.d.ts +1 -1
  63. package/dist/esm/index.js +1 -1
  64. package/dist/esm/models/cancellation.d.ts +28 -0
  65. package/dist/esm/models/cancellation.js +29 -0
  66. package/dist/esm/models/hobex-receipt.js +10 -3
  67. package/dist/esm/models/index.d.ts +1 -1
  68. package/dist/esm/models/index.js +1 -1
  69. package/dist/esm/models/receipt-summary.d.ts +2 -0
  70. package/dist/esm/models/receipt-summary.js +4 -1
  71. package/dist/esm/models/receipt.js +8 -1
  72. package/dist/esm/models/voucher.js +18 -2
  73. package/dist/esm/payments/hobex-hps/connect-client.d.ts +104 -0
  74. package/dist/esm/payments/hobex-hps/connect-client.js +156 -0
  75. package/dist/esm/payments/hobex-hps/errors.d.ts +122 -0
  76. package/dist/esm/payments/hobex-hps/errors.js +149 -0
  77. package/dist/esm/payments/hobex-hps/events.d.ts +22 -0
  78. package/dist/esm/payments/hobex-hps/events.js +1 -0
  79. package/dist/esm/payments/hobex-hps/index.d.ts +27 -0
  80. package/dist/esm/payments/hobex-hps/index.js +26 -0
  81. package/dist/esm/payments/hobex-hps/outcome.d.ts +46 -0
  82. package/dist/esm/payments/hobex-hps/outcome.js +4 -0
  83. package/dist/esm/payments/hobex-hps/payments.d.ts +149 -0
  84. package/dist/esm/payments/hobex-hps/payments.js +570 -0
  85. package/dist/esm/payments/hobex-hps/receipt.d.ts +28 -0
  86. package/dist/esm/payments/hobex-hps/receipt.js +57 -0
  87. package/dist/esm/payments/hobex-hps/transaction-id.d.ts +65 -0
  88. package/dist/esm/payments/hobex-hps/transaction-id.js +86 -0
  89. package/dist/esm/payments/hobex-hps/transaction-response.d.ts +175 -0
  90. package/dist/esm/payments/hobex-hps/transaction-response.js +254 -0
  91. package/dist/esm/payments/hobex.js +9 -6
  92. package/dist/esm/payments/index.d.ts +26 -14
  93. package/dist/esm/payments/index.js +26 -14
  94. package/dist/esm/printing/index.d.ts +1 -1
  95. package/dist/esm/printing/index.js +1 -1
  96. package/dist/esm/printing/webusb.d.ts +37 -7
  97. package/dist/esm/printing/webusb.js +74 -17
  98. package/dist/esm/receipt/epos.d.ts +18 -0
  99. package/dist/esm/receipt/epos.js +76 -6
  100. package/dist/esm/receipt/index.d.ts +1 -1
  101. package/dist/esm/receipt/index.js +1 -1
  102. package/dist/esm/receipt/layout.js +19 -0
  103. package/dist/esm/register/index.d.ts +1 -1
  104. package/dist/esm/register/index.js +1 -1
  105. package/dist/esm/register/pairing.d.ts +59 -0
  106. package/dist/esm/register/pairing.js +50 -2
  107. package/fixtures/belege/storno-rabatt.json +3 -2
  108. package/fixtures/belege/storno-teil.json +2 -1
  109. package/fixtures/belege/storno-voll.json +2 -1
  110. package/fixtures/erwartet/storno-rabatt.grid32.txt +1 -0
  111. package/fixtures/erwartet/storno-rabatt.grid48.txt +1 -0
  112. package/fixtures/erwartet/storno-rabatt.lines.json +6 -0
  113. package/fixtures/erwartet/storno-teil.grid32.txt +1 -0
  114. package/fixtures/erwartet/storno-teil.grid48.txt +1 -0
  115. package/fixtures/erwartet/storno-teil.lines.json +6 -0
  116. package/fixtures/erwartet/storno-voll.grid32.txt +1 -0
  117. package/fixtures/erwartet/storno-voll.grid48.txt +1 -0
  118. package/fixtures/erwartet/storno-voll.lines.json +6 -0
  119. package/fixtures/hobex-hps-codes.json +83 -0
  120. package/fixtures/manifest.json +12 -12
  121. package/fixtures/oberflaeche.json +2 -1
  122. package/package.json +3 -2
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * Hobex-**HPS**-Kartenzahlung ueber **Kasseneck Connect** — den lokalen
4
+ * Geraete-Agenten, der ueber HTTP erreichbar ist und mit dem physischen
5
+ * Terminal spricht. Siehe `payments.ts` fuer den Klaerweg (Doku dort ist der
6
+ * Maszstab) und `connect-client.ts` fuer die Abgrenzung zum Dart-Zwilling
7
+ * `HpsClient` (der das Terminal DIREKT anspricht, ohne Connect).
8
+ *
9
+ * `pay`/`refund`/`cancel` — seit `kasseneck-connect` Commit `1c8a003` traegt
10
+ * Connect auch Gutschrift und Aufhebung, die Luecke aus einer frueheren
11
+ * Fassung dieses Moduls ist geschlossen.
12
+ *
13
+ * **Verbleibt: keine Adress-/Port-Ermittlung fuer Connect.** Der Agent kann
14
+ * auf `127.0.0.1:27182` bis `27189` laufen (belegter Port faellt auf den
15
+ * naechsten zurueck, siehe `kasseneck-connect`s README). Dieses Modul nimmt
16
+ * eine FESTE `baseUrl` entgegen (`HpsConnectClientOptions.baseUrl`, Vorgabe
17
+ * `27182`) und probiert die Portreihe nicht selbst durch — das Aufloesen der
18
+ * tatsaechlichen Adresse (z. B. ueber `GET /v1/status` je Port) bleibt Sache
19
+ * des Aufrufers.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.hobexReceiptFromHps = exports.parseHpsTransactionResponse = exports.isUnknownCode = exports.isTechnicalError = exports.isNotAbortable = exports.isNoStatement = exports.isInProgress = exports.isConclusive = exports.isCanceled = exports.isApproved = exports.TRANSACTION_CANCELED_CODE = exports.TERMINAL_BUSY_HTTP_STATUS = exports.TECHNICAL_ERROR_CODE = exports.NO_STATEMENT_CODE = exports.WRONG_PIN_CODE = exports.INVALID_TID_CODE = exports.AMOUNT_OUT_OF_RANGE_CODE = exports.INVALID_AMOUNT_CODE = exports.NOT_ABORTABLE_CODE = exports.INVALID_TRANSACTION_CODE = exports.HPS_MEASURED_CODES = exports.CARD_NOT_PRESENT_CODE = exports.APPROVED_CODE = exports.ABORTED_CODE = exports.newHpsTransactionId = exports.isValidHpsTransactionId = exports.createHpsTransactionIdGenerator = exports.MAX_TRANSACTION_ID_LENGTH = exports.createHpsPayments = exports.mayRetrySafely = exports.PREFLIGHT_CONNECT_CODES = exports.HpsTransactionIdError = exports.HpsPreflightError = exports.HpsConnectTransportError = exports.HpsConnectTerminalError = exports.HpsConnectException = exports.HpsClarifyTimeoutError = exports.createHpsConnectClient = void 0;
23
+ var connect_client_js_1 = require("./connect-client.js");
24
+ Object.defineProperty(exports, "createHpsConnectClient", { enumerable: true, get: function () { return connect_client_js_1.createHpsConnectClient; } });
25
+ var errors_js_1 = require("./errors.js");
26
+ Object.defineProperty(exports, "HpsClarifyTimeoutError", { enumerable: true, get: function () { return errors_js_1.HpsClarifyTimeoutError; } });
27
+ Object.defineProperty(exports, "HpsConnectException", { enumerable: true, get: function () { return errors_js_1.HpsConnectException; } });
28
+ Object.defineProperty(exports, "HpsConnectTerminalError", { enumerable: true, get: function () { return errors_js_1.HpsConnectTerminalError; } });
29
+ Object.defineProperty(exports, "HpsConnectTransportError", { enumerable: true, get: function () { return errors_js_1.HpsConnectTransportError; } });
30
+ Object.defineProperty(exports, "HpsPreflightError", { enumerable: true, get: function () { return errors_js_1.HpsPreflightError; } });
31
+ Object.defineProperty(exports, "HpsTransactionIdError", { enumerable: true, get: function () { return errors_js_1.HpsTransactionIdError; } });
32
+ Object.defineProperty(exports, "PREFLIGHT_CONNECT_CODES", { enumerable: true, get: function () { return errors_js_1.PREFLIGHT_CONNECT_CODES; } });
33
+ var outcome_js_1 = require("./outcome.js");
34
+ Object.defineProperty(exports, "mayRetrySafely", { enumerable: true, get: function () { return outcome_js_1.mayRetrySafely; } });
35
+ var payments_js_1 = require("./payments.js");
36
+ Object.defineProperty(exports, "createHpsPayments", { enumerable: true, get: function () { return payments_js_1.createHpsPayments; } });
37
+ var transaction_id_js_1 = require("./transaction-id.js");
38
+ Object.defineProperty(exports, "MAX_TRANSACTION_ID_LENGTH", { enumerable: true, get: function () { return transaction_id_js_1.MAX_TRANSACTION_ID_LENGTH; } });
39
+ Object.defineProperty(exports, "createHpsTransactionIdGenerator", { enumerable: true, get: function () { return transaction_id_js_1.createHpsTransactionIdGenerator; } });
40
+ Object.defineProperty(exports, "isValidHpsTransactionId", { enumerable: true, get: function () { return transaction_id_js_1.isValidHpsTransactionId; } });
41
+ Object.defineProperty(exports, "newHpsTransactionId", { enumerable: true, get: function () { return transaction_id_js_1.newHpsTransactionId; } });
42
+ var transaction_response_js_1 = require("./transaction-response.js");
43
+ Object.defineProperty(exports, "ABORTED_CODE", { enumerable: true, get: function () { return transaction_response_js_1.ABORTED_CODE; } });
44
+ Object.defineProperty(exports, "APPROVED_CODE", { enumerable: true, get: function () { return transaction_response_js_1.APPROVED_CODE; } });
45
+ Object.defineProperty(exports, "CARD_NOT_PRESENT_CODE", { enumerable: true, get: function () { return transaction_response_js_1.CARD_NOT_PRESENT_CODE; } });
46
+ Object.defineProperty(exports, "HPS_MEASURED_CODES", { enumerable: true, get: function () { return transaction_response_js_1.HPS_MEASURED_CODES; } });
47
+ Object.defineProperty(exports, "INVALID_TRANSACTION_CODE", { enumerable: true, get: function () { return transaction_response_js_1.INVALID_TRANSACTION_CODE; } });
48
+ Object.defineProperty(exports, "NOT_ABORTABLE_CODE", { enumerable: true, get: function () { return transaction_response_js_1.NOT_ABORTABLE_CODE; } });
49
+ Object.defineProperty(exports, "INVALID_AMOUNT_CODE", { enumerable: true, get: function () { return transaction_response_js_1.INVALID_AMOUNT_CODE; } });
50
+ Object.defineProperty(exports, "AMOUNT_OUT_OF_RANGE_CODE", { enumerable: true, get: function () { return transaction_response_js_1.AMOUNT_OUT_OF_RANGE_CODE; } });
51
+ Object.defineProperty(exports, "INVALID_TID_CODE", { enumerable: true, get: function () { return transaction_response_js_1.INVALID_TID_CODE; } });
52
+ Object.defineProperty(exports, "WRONG_PIN_CODE", { enumerable: true, get: function () { return transaction_response_js_1.WRONG_PIN_CODE; } });
53
+ Object.defineProperty(exports, "NO_STATEMENT_CODE", { enumerable: true, get: function () { return transaction_response_js_1.NO_STATEMENT_CODE; } });
54
+ Object.defineProperty(exports, "TECHNICAL_ERROR_CODE", { enumerable: true, get: function () { return transaction_response_js_1.TECHNICAL_ERROR_CODE; } });
55
+ Object.defineProperty(exports, "TERMINAL_BUSY_HTTP_STATUS", { enumerable: true, get: function () { return transaction_response_js_1.TERMINAL_BUSY_HTTP_STATUS; } });
56
+ Object.defineProperty(exports, "TRANSACTION_CANCELED_CODE", { enumerable: true, get: function () { return transaction_response_js_1.TRANSACTION_CANCELED_CODE; } });
57
+ Object.defineProperty(exports, "isApproved", { enumerable: true, get: function () { return transaction_response_js_1.isApproved; } });
58
+ Object.defineProperty(exports, "isCanceled", { enumerable: true, get: function () { return transaction_response_js_1.isCanceled; } });
59
+ Object.defineProperty(exports, "isConclusive", { enumerable: true, get: function () { return transaction_response_js_1.isConclusive; } });
60
+ Object.defineProperty(exports, "isInProgress", { enumerable: true, get: function () { return transaction_response_js_1.isInProgress; } });
61
+ Object.defineProperty(exports, "isNoStatement", { enumerable: true, get: function () { return transaction_response_js_1.isNoStatement; } });
62
+ Object.defineProperty(exports, "isNotAbortable", { enumerable: true, get: function () { return transaction_response_js_1.isNotAbortable; } });
63
+ Object.defineProperty(exports, "isTechnicalError", { enumerable: true, get: function () { return transaction_response_js_1.isTechnicalError; } });
64
+ Object.defineProperty(exports, "isUnknownCode", { enumerable: true, get: function () { return transaction_response_js_1.isUnknownCode; } });
65
+ Object.defineProperty(exports, "parseHpsTransactionResponse", { enumerable: true, get: function () { return transaction_response_js_1.parseHpsTransactionResponse; } });
66
+ var receipt_js_1 = require("./receipt.js");
67
+ Object.defineProperty(exports, "hobexReceiptFromHps", { enumerable: true, get: function () { return receipt_js_1.hobexReceiptFromHps; } });
@@ -0,0 +1,46 @@
1
+ import type { HpsTransactionResponse } from './transaction-response.js';
2
+ /**
3
+ * Ausgang eines Kartenzahlvorgangs — die einzige Frage, die ein Aufrufer
4
+ * wirklich hat: darf ich es nochmal versuchen?
5
+ *
6
+ * Drei Werte, nicht zwei: ein `boolean` oder ein `null` als Ergebnis einer
7
+ * Zahlung waere ein Fehler, kein Stil (Zwilling: `CardPaymentOutcome` in
8
+ * `kasseneck_api/lib/src/payments/card_payment_outcome.dart`).
9
+ */
10
+ export type CardPaymentOutcome = 'approved' | 'declined' | 'unresolved';
11
+ /**
12
+ * Ergebnis einer Kartenzahlung samt Kennung und Klaerungsverlauf.
13
+ *
14
+ * [transactionId] ist IMMER gesetzt, auch bei `outcome: 'unresolved'` — ohne
15
+ * sie sind Statusabfrage und weitere Klaerung unerreichbar, und genau daran
16
+ * ist der Vorfall vom 24.08.2026 gescheitert.
17
+ */
18
+ export interface HpsPaymentResult {
19
+ readonly outcome: CardPaymentOutcome;
20
+ readonly transactionId: string;
21
+ /**
22
+ * Die Antwort des Terminals, die den Ausgang FESTGESCHRIEBEN hat -- nur
23
+ * bei `approved` und `declined`. Bei `unresolved` fehlt sie: eine
24
+ * Nicht-Aussage darf nicht als Beleg mitgegeben werden. Was das Terminal
25
+ * zuletzt gesagt hat, steht dann in [lastResponse].
26
+ */
27
+ readonly response?: HpsTransactionResponse;
28
+ /**
29
+ * Die letzte Antwort des Terminals bei `unresolved`, sofern ueberhaupt
30
+ * eine ankam -- auch wenn sie nichts entschied (9027, 9900, ein
31
+ * unbekannter Code). NIE ein Beleg, sondern Material fuer Anzeige und
32
+ * Katalog: am 02.09.2026 sah der Bediener bei einer Antwort `55`
33
+ * "PIN falsch" nur "Ausgang unklar", musste raten und buchte eine
34
+ * abgelehnte Zahlung als bezahlt. Der Klartext des Terminals haette die
35
+ * Entscheidung getragen. Bei schluessigem Ausgang nicht gesetzt.
36
+ */
37
+ readonly lastResponse?: HpsTransactionResponse;
38
+ /**
39
+ * Verlauf der Klaerung, in Reihenfolge — der Nachweis, der im
40
+ * Belastungsstreit gelesen wird. Behauptet nie eine Ursache, die nicht
41
+ * feststeht.
42
+ */
43
+ readonly steps: readonly string[];
44
+ }
45
+ /** Nur bei `'declined'` steht fest, dass nichts belastet wurde. */
46
+ export declare function mayRetrySafely(result: Pick<HpsPaymentResult, 'outcome'>): boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mayRetrySafely = mayRetrySafely;
4
+ /** Nur bei `'declined'` steht fest, dass nichts belastet wurde. */
5
+ function mayRetrySafely(result) {
6
+ return result.outcome === 'declined';
7
+ }
@@ -0,0 +1,149 @@
1
+ import type { HpsConnectClient, HpsConnectTarget } from './connect-client.js';
2
+ import type { HpsPaymentObserver } from './events.js';
3
+ import type { HpsPaymentResult } from './outcome.js';
4
+ /**
5
+ * Kartenzahlung ueber **Kasseneck Connect**, deren Ausgang IMMER bekannt ist.
6
+ *
7
+ * Zwilling von `HpsPayments` (`kasseneck_api/lib/src/hobex_hps/hps_payments.dart`)
8
+ * — Logik und Begruendungen sind von dort uebernommen, nicht neu erfunden.
9
+ * Was dort an Flutter/Dart-Spezifischem haengt, gehoert hier nicht hin; siehe
10
+ * `connect-client.ts` fuer den wesentlichen Unterschied (Connect statt
11
+ * direktem Terminal-Kontakt).
12
+ *
13
+ * [pay], [refund] und [cancel] -- seit `kasseneck-connect` Commit `1c8a003`
14
+ * traegt Connect auch die beiden letzteren, siehe `connect-client.ts`.
15
+ *
16
+ * Regel, von der nicht abgewichen wird: `outcome: 'declined'` entsteht
17
+ * ausschliesslich aus einer POSITIVEN Aussage — einem GEMESSENEN Ergebniscode
18
+ * des Terminals ungleich `'0'` ([isConclusive]), einem nachweislich
19
+ * gelungenen Abbruch, oder dem gemessenen "Terminal beschaeftigt"-Fall
20
+ * (HTTP 409 auf die ERZEUGENDE Anfrage, siehe `errors.ts`,
21
+ * `HpsConnectTerminalError.isTerminalBusy`). Ein Transportfehler, ein
22
+ * Zeitablauf oder eine Wissensluecke fuehren NIE dorthin: keines davon ist
23
+ * eine Aussage darueber, dass nichts belastet wurde. Genau diese
24
+ * Verwechslung hat am 24.08.2026 eine echte Belastung als unbelastet
25
+ * ausgewiesen und den Kunden ein zweites Mal belastet.
26
+ *
27
+ * ## Der Klaerweg, wie er am 26./27.08.2026 am hobex-HPS gemessen wurde
28
+ *
29
+ * Bleibt die Antwort auf eine Zahlung aus:
30
+ *
31
+ * 1. [HpsConnectClient.abort] einmalig versuchen.
32
+ * 2. `responseCode === '0'` -> der Vorgang war noch abbrechbar, also nicht
33
+ * abgeschlossen -> `declined`, beweisbar.
34
+ * 3. Jeder andere Code (gemessen `100010`) -> der Vorgang ist ueber den
35
+ * abbrechbaren Punkt hinaus -> JETZT die Statusabfrage pollen, sie liefert
36
+ * nun eine echte Aussage.
37
+ * 4. Abbruch scheitert am Transport -> pollen wie in 3.
38
+ * 5. Beim Pollen ist `9027` KEIN Ergebnis, sondern ein Grund weiterzumachen.
39
+ * Budget erschoepft -> `unresolved`.
40
+ *
41
+ * Der Abbruch VOR dem Pollen ist wesentlich: die Statusabfrage meldet
42
+ * "laeuft noch" nie (sie antwortet auf jeden nicht genehmigten Vorgang mit
43
+ * `9027`). Der Abbruchversuch ist auf einen Bruchteil des Klaerbudgets
44
+ * gedeckelt ([ABORT_BUDGET_DIVISOR]), sonst friesst ein haengender Abbruch
45
+ * die ganze Klaerung.
46
+ *
47
+ * Die Kennung ist in JEDEM Ergebnis gesetzt, auch bei `'unresolved'`.
48
+ *
49
+ * ## [refund] bekommt EXAKT denselben Klaerweg wie [pay]
50
+ *
51
+ * Abbruch eingeschlossen -- und das ist GEMESSEN, nicht analog geschlossen.
52
+ * Am 26.08.2026 nachgemessen: `abort` auf eine LAUFENDE Gutschrift antwortet
53
+ * ebenfalls mit `responseCode '0'`, und die Gutschrift endet daraufhin mit
54
+ * `100002` "Aborted". Der Abbruch ist dort also derselbe Diskriminator wie bei
55
+ * einer Zahlung. Die Kennung ist bei [refund] die des NEUEN Vorgangs (der
56
+ * Gutschrift selbst), eine Statusabfrage darauf liefert also genau deren
57
+ * Ausgang -- deshalb reicht dieselbe [resolve]-Funktion unveraendert. Ohne den
58
+ * Abbruch haette die Klaerung einer Gutschrift gar keinen Diskriminator mehr
59
+ * und endete fast immer bei `unresolved`, weil die Statusabfrage auch hier
60
+ * `9027` antwortet.
61
+ *
62
+ * ## [cancel] ist die Ausnahme, in beiden Richtungen
63
+ *
64
+ * Die uebergebene Kennung ist die der URSPRUENGLICHEN Zahlung, nicht die eines
65
+ * neuen Vorgangs -- und `'0'` bedeutet dort NICHT "genehmigt". Am 26. und
66
+ * 28.08.2026 gemessen (Statusabfrage auf die Original-Kennung, NACHDEM eine
67
+ * genehmigte Zahlung per Void aufgehoben wurde):
68
+ *
69
+ * | Antwort der Statusabfrage auf die Originalkennung | Bedeutung |
70
+ * |---|---|
71
+ * | `9011` "Transaction Canceled" | die Aufhebung hat GEWIRKT -> `approved` |
72
+ * | `'0'` | die Originalzahlung steht UNVERAENDERT -> die Aufhebung hat NICHT gegriffen -> `declined` |
73
+ * | `9027` und alles andere | weiter klaeren, am Ende `unresolved` |
74
+ *
75
+ * Zwei Sicherungen dagegen, `'0'` faelschlich fuer "nicht gegriffen" zu halten
76
+ * und damit den Kunden nach dem Tagesabschluss ueber eine Rueckerstattung ein
77
+ * zweites Mal zu bezahlen (siehe [fromCancelStatus]):
78
+ *
79
+ * 1. **`'0'` entscheidet erst ab der ZWEITEN beantworteten Statusabfrage.**
80
+ * Die erste laeuft unmittelbar nachdem der Aufhebungs-Aufruf abgerissen
81
+ * ist -- genau das Fenster, in dem die Aufhebung noch unterwegs sein kann.
82
+ * Reicht das Budget nur fuer eine Abfrage, endet die Klaerung bei
83
+ * `unresolved`.
84
+ * 2. **`9011` auf dem DIREKTEN Antwortweg von `cancel`** wird NICHT als
85
+ * `declined` gelesen -- was es dort genau heisst, ist ungemessen (siehe
86
+ * [fromCancelResponse]). Der Zustand der Originalzahlung wird abgefragt
87
+ * statt geraten.
88
+ *
89
+ * Kein [tryAbort]-Versuch bei [cancel]: die Originalzahlung ist laengst
90
+ * abgeschlossen und antwortet gemessen mit `100010` -- ein Abbruch darauf
91
+ * waere sinnlos.
92
+ */
93
+ export interface HpsPaymentsOptions {
94
+ /** Wie lange insgesamt geklaert wird, bevor der Ausgang offen bleibt. Vorgabe 90 s. */
95
+ resolveBudgetMs?: number;
96
+ /** Obergrenze fuer den Abstand zwischen zwei Statusabfragen. Vorgabe 10 s. */
97
+ maxBackoffMs?: number;
98
+ /** Nach so vielen Statusabfragen in Folge, die am Transport scheitern, wird abgebrochen. Vorgabe 3. */
99
+ maxTransportFailures?: number;
100
+ /** Pausenquelle — Naht fuer Tests. Vorgabe `setTimeout`. */
101
+ sleep?: (ms: number) => Promise<void>;
102
+ /** Uhr fuer das Budget in ms — Naht fuer Tests. Vorgabe `Date.now`. */
103
+ now?: () => number;
104
+ observer?: HpsPaymentObserver;
105
+ }
106
+ export interface HpsPaymentOptions {
107
+ /** Zu belastender Betrag in **Cent** (ohne Trinkgeld). */
108
+ amountCents: number;
109
+ tipCents?: number;
110
+ reference?: string;
111
+ currency?: string;
112
+ language?: string;
113
+ /**
114
+ * Kennung; wird ohne Angabe erzeugt und im Ergebnis zurueckgegeben. Vorgeben,
115
+ * um einen abgebrochenen Vorgang gezielt weiterzuverfolgen.
116
+ */
117
+ transactionId?: string;
118
+ }
119
+ export interface HpsRefundOptions {
120
+ /** Zu erstattender Betrag in **Cent**. */
121
+ amountCents: number;
122
+ /** Kennung der erstatteten Zahlung -- Connect verlangt sie zwingend. */
123
+ originalTransactionId: string;
124
+ reference?: string;
125
+ currency?: string;
126
+ language?: string;
127
+ /**
128
+ * Kennung der Gutschrift SELBST; wird ohne Angabe erzeugt und im Ergebnis
129
+ * zurueckgegeben. Vorgeben, um eine abgebrochene Gutschrift gezielt
130
+ * weiterzuverfolgen -- wie bei [HpsPaymentOptions.transactionId].
131
+ */
132
+ transactionId?: string;
133
+ }
134
+ export interface HpsCancelOptions {
135
+ /** Kennung der URSPRUENGLICHEN Zahlung -- keine neue, MUSS feststehen. */
136
+ transactionId: string;
137
+ /** Pflicht: ein Void ohne Betrag weist das Terminal mit `400 Missing amount` ab. */
138
+ amountCents: number;
139
+ currency?: string;
140
+ language?: string;
141
+ }
142
+ export interface HpsPayments {
143
+ pay(options: HpsPaymentOptions): Promise<HpsPaymentResult>;
144
+ /** Gutschrift, geklaert wie [pay] -- siehe Klassendoku oben. */
145
+ refund(options: HpsRefundOptions): Promise<HpsPaymentResult>;
146
+ /** Aufhebung (Storno/Void) einer bestehenden Zahlung -- eigener Klaerweg, siehe Klassendoku oben. */
147
+ cancel(options: HpsCancelOptions): Promise<HpsPaymentResult>;
148
+ }
149
+ export declare function createHpsPayments(client: HpsConnectClient, target: HpsConnectTarget, options?: HpsPaymentsOptions): HpsPayments;