@kreiseck/kasseneck-api 0.6.45 → 0.6.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -15
- package/dist/cjs/client/aufrufe.d.ts +1 -1
- package/dist/cjs/client/aufrufe.js +2 -0
- package/dist/cjs/client/errors.d.ts +7 -1
- package/dist/cjs/client/errors.js +8 -1
- package/dist/cjs/client/receipts.d.ts +16 -0
- package/dist/cjs/client/receipts.js +10 -0
- package/dist/cjs/client/transport.js +5 -4
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/kasse/index.d.ts +1 -0
- package/dist/cjs/kasse/index.js +3 -0
- package/dist/cjs/kasse/trinkgeld.d.ts +10 -0
- package/dist/cjs/kasse/trinkgeld.js +27 -0
- package/dist/cjs/models/cancellation.d.ts +22 -0
- package/dist/cjs/models/cancellation.js +31 -1
- package/dist/cjs/models/hobex-receipt.js +9 -2
- package/dist/cjs/models/index.d.ts +1 -1
- package/dist/cjs/models/index.js +3 -1
- package/dist/cjs/models/receipt.js +3 -0
- package/dist/cjs/models/voucher.js +18 -2
- package/dist/cjs/payments/hobex-hps/connect-client.d.ts +104 -0
- package/dist/cjs/payments/hobex-hps/connect-client.js +159 -0
- package/dist/cjs/payments/hobex-hps/errors.d.ts +122 -0
- package/dist/cjs/payments/hobex-hps/errors.js +158 -0
- package/dist/cjs/payments/hobex-hps/events.d.ts +22 -0
- package/dist/cjs/payments/hobex-hps/events.js +2 -0
- package/dist/cjs/payments/hobex-hps/index.d.ts +27 -0
- package/dist/cjs/payments/hobex-hps/index.js +66 -0
- package/dist/cjs/payments/hobex-hps/outcome.d.ts +31 -0
- package/dist/cjs/payments/hobex-hps/outcome.js +7 -0
- package/dist/cjs/payments/hobex-hps/payments.d.ts +149 -0
- package/dist/cjs/payments/hobex-hps/payments.js +550 -0
- package/dist/cjs/payments/hobex-hps/receipt.d.ts +28 -0
- package/dist/cjs/payments/hobex-hps/receipt.js +60 -0
- package/dist/cjs/payments/hobex-hps/transaction-id.d.ts +65 -0
- package/dist/cjs/payments/hobex-hps/transaction-id.js +91 -0
- package/dist/cjs/payments/hobex-hps/transaction-response.d.ts +163 -0
- package/dist/cjs/payments/hobex-hps/transaction-response.js +245 -0
- package/dist/cjs/payments/hobex.js +9 -6
- package/dist/cjs/payments/index.d.ts +26 -14
- package/dist/cjs/payments/index.js +59 -15
- package/dist/cjs/printing/index.d.ts +1 -1
- package/dist/cjs/printing/index.js +2 -1
- package/dist/cjs/printing/webusb.d.ts +37 -7
- package/dist/cjs/printing/webusb.js +76 -18
- package/dist/cjs/receipt/epos.d.ts +18 -0
- package/dist/cjs/receipt/epos.js +78 -6
- package/dist/cjs/receipt/index.d.ts +1 -1
- package/dist/cjs/receipt/index.js +2 -1
- package/dist/cjs/register/index.d.ts +1 -1
- package/dist/cjs/register/index.js +2 -1
- package/dist/cjs/register/pairing.d.ts +67 -1
- package/dist/cjs/register/pairing.js +59 -3
- package/dist/esm/client/aufrufe.d.ts +1 -1
- package/dist/esm/client/aufrufe.js +2 -0
- package/dist/esm/client/errors.d.ts +7 -1
- package/dist/esm/client/errors.js +8 -1
- package/dist/esm/client/receipts.d.ts +16 -0
- package/dist/esm/client/receipts.js +10 -0
- package/dist/esm/client/transport.js +5 -4
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/kasse/index.d.ts +1 -0
- package/dist/esm/kasse/index.js +1 -0
- package/dist/esm/kasse/trinkgeld.d.ts +10 -0
- package/dist/esm/kasse/trinkgeld.js +24 -0
- package/dist/esm/models/cancellation.d.ts +22 -0
- package/dist/esm/models/cancellation.js +29 -0
- package/dist/esm/models/hobex-receipt.js +10 -3
- package/dist/esm/models/index.d.ts +1 -1
- package/dist/esm/models/index.js +1 -1
- package/dist/esm/models/receipt.js +3 -0
- package/dist/esm/models/voucher.js +18 -2
- package/dist/esm/payments/hobex-hps/connect-client.d.ts +104 -0
- package/dist/esm/payments/hobex-hps/connect-client.js +156 -0
- package/dist/esm/payments/hobex-hps/errors.d.ts +122 -0
- package/dist/esm/payments/hobex-hps/errors.js +149 -0
- package/dist/esm/payments/hobex-hps/events.d.ts +22 -0
- package/dist/esm/payments/hobex-hps/events.js +1 -0
- package/dist/esm/payments/hobex-hps/index.d.ts +27 -0
- package/dist/esm/payments/hobex-hps/index.js +26 -0
- package/dist/esm/payments/hobex-hps/outcome.d.ts +31 -0
- package/dist/esm/payments/hobex-hps/outcome.js +4 -0
- package/dist/esm/payments/hobex-hps/payments.d.ts +149 -0
- package/dist/esm/payments/hobex-hps/payments.js +547 -0
- package/dist/esm/payments/hobex-hps/receipt.d.ts +28 -0
- package/dist/esm/payments/hobex-hps/receipt.js +57 -0
- package/dist/esm/payments/hobex-hps/transaction-id.d.ts +65 -0
- package/dist/esm/payments/hobex-hps/transaction-id.js +86 -0
- package/dist/esm/payments/hobex-hps/transaction-response.d.ts +163 -0
- package/dist/esm/payments/hobex-hps/transaction-response.js +233 -0
- package/dist/esm/payments/hobex.js +9 -6
- package/dist/esm/payments/index.d.ts +26 -14
- package/dist/esm/payments/index.js +26 -14
- package/dist/esm/printing/index.d.ts +1 -1
- package/dist/esm/printing/index.js +1 -1
- package/dist/esm/printing/webusb.d.ts +37 -7
- package/dist/esm/printing/webusb.js +74 -17
- package/dist/esm/receipt/epos.d.ts +18 -0
- package/dist/esm/receipt/epos.js +76 -6
- package/dist/esm/receipt/index.d.ts +1 -1
- package/dist/esm/receipt/index.js +1 -1
- package/dist/esm/register/index.d.ts +1 -1
- package/dist/esm/register/index.js +1 -1
- package/dist/esm/register/pairing.d.ts +67 -1
- package/dist/esm/register/pairing.js +58 -3
- package/fixtures/hobex-hps-codes.json +67 -0
- package/fixtures/oberflaeche.json +3 -1
- package/package.json +4 -2
|
@@ -0,0 +1,66 @@
|
|
|
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.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, "NO_STATEMENT_CODE", { enumerable: true, get: function () { return transaction_response_js_1.NO_STATEMENT_CODE; } });
|
|
53
|
+
Object.defineProperty(exports, "TECHNICAL_ERROR_CODE", { enumerable: true, get: function () { return transaction_response_js_1.TECHNICAL_ERROR_CODE; } });
|
|
54
|
+
Object.defineProperty(exports, "TERMINAL_BUSY_HTTP_STATUS", { enumerable: true, get: function () { return transaction_response_js_1.TERMINAL_BUSY_HTTP_STATUS; } });
|
|
55
|
+
Object.defineProperty(exports, "TRANSACTION_CANCELED_CODE", { enumerable: true, get: function () { return transaction_response_js_1.TRANSACTION_CANCELED_CODE; } });
|
|
56
|
+
Object.defineProperty(exports, "isApproved", { enumerable: true, get: function () { return transaction_response_js_1.isApproved; } });
|
|
57
|
+
Object.defineProperty(exports, "isCanceled", { enumerable: true, get: function () { return transaction_response_js_1.isCanceled; } });
|
|
58
|
+
Object.defineProperty(exports, "isConclusive", { enumerable: true, get: function () { return transaction_response_js_1.isConclusive; } });
|
|
59
|
+
Object.defineProperty(exports, "isInProgress", { enumerable: true, get: function () { return transaction_response_js_1.isInProgress; } });
|
|
60
|
+
Object.defineProperty(exports, "isNoStatement", { enumerable: true, get: function () { return transaction_response_js_1.isNoStatement; } });
|
|
61
|
+
Object.defineProperty(exports, "isNotAbortable", { enumerable: true, get: function () { return transaction_response_js_1.isNotAbortable; } });
|
|
62
|
+
Object.defineProperty(exports, "isTechnicalError", { enumerable: true, get: function () { return transaction_response_js_1.isTechnicalError; } });
|
|
63
|
+
Object.defineProperty(exports, "isUnknownCode", { enumerable: true, get: function () { return transaction_response_js_1.isUnknownCode; } });
|
|
64
|
+
Object.defineProperty(exports, "parseHpsTransactionResponse", { enumerable: true, get: function () { return transaction_response_js_1.parseHpsTransactionResponse; } });
|
|
65
|
+
var receipt_js_1 = require("./receipt.js");
|
|
66
|
+
Object.defineProperty(exports, "hobexReceiptFromHps", { enumerable: true, get: function () { return receipt_js_1.hobexReceiptFromHps; } });
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
/** Die letzte Antwort des Terminals, sofern eine schluessige ankam. */
|
|
22
|
+
readonly response?: HpsTransactionResponse;
|
|
23
|
+
/**
|
|
24
|
+
* Verlauf der Klaerung, in Reihenfolge — der Nachweis, der im
|
|
25
|
+
* Belastungsstreit gelesen wird. Behauptet nie eine Ursache, die nicht
|
|
26
|
+
* feststeht.
|
|
27
|
+
*/
|
|
28
|
+
readonly steps: readonly string[];
|
|
29
|
+
}
|
|
30
|
+
/** Nur bei `'declined'` steht fest, dass nichts belastet wurde. */
|
|
31
|
+
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;
|