@kreiseck/kasseneck-api 0.9.3 → 0.10.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 (30) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/cjs/kasse/settings.d.ts +10 -2
  3. package/dist/cjs/kasse/settings.js +10 -2
  4. package/dist/cjs/payments/hobex-hps/index.d.ts +2 -2
  5. package/dist/cjs/payments/hobex-hps/index.js +36 -1
  6. package/dist/cjs/payments/hobex-hps/outcome.d.ts +20 -1
  7. package/dist/cjs/payments/hobex-hps/outcome.js +11 -0
  8. package/dist/cjs/payments/hobex-hps/payments.d.ts +19 -0
  9. package/dist/cjs/payments/hobex-hps/payments.js +160 -33
  10. package/dist/cjs/payments/hobex-hps/transaction-response.d.ts +180 -31
  11. package/dist/cjs/payments/hobex-hps/transaction-response.js +308 -88
  12. package/dist/cjs/payments/index.d.ts +1 -1
  13. package/dist/cjs/payments/index.js +8 -1
  14. package/dist/esm/kasse/settings.d.ts +10 -2
  15. package/dist/esm/kasse/settings.js +10 -2
  16. package/dist/esm/payments/hobex-hps/index.d.ts +2 -2
  17. package/dist/esm/payments/hobex-hps/index.js +2 -2
  18. package/dist/esm/payments/hobex-hps/outcome.d.ts +20 -1
  19. package/dist/esm/payments/hobex-hps/outcome.js +10 -0
  20. package/dist/esm/payments/hobex-hps/payments.d.ts +19 -0
  21. package/dist/esm/payments/hobex-hps/payments.js +161 -34
  22. package/dist/esm/payments/hobex-hps/transaction-response.d.ts +180 -31
  23. package/dist/esm/payments/hobex-hps/transaction-response.js +302 -87
  24. package/dist/esm/payments/index.d.ts +1 -1
  25. package/dist/esm/payments/index.js +1 -1
  26. package/fixtures/hobex-hps-codes.json +365 -15
  27. package/fixtures/kasse-settings-standard.json +1 -1
  28. package/fixtures/kasse-texte.json +1 -1
  29. package/fixtures/oberflaeche.json +2 -1
  30. package/package.json +1 -1
@@ -6,7 +6,7 @@
6
6
  * ein, es reicht den Terminal-Rumpf roh durch — die Einordnung passiert hier.
7
7
  *
8
8
  * **Zwilling:** `kasseneck_api/lib/src/hobex_hps/transaction_response.dart`.
9
- * Beide Seiten pinnen dieselbe Codetabelle, siehe `HPS_MEASURED_CODES` unten
9
+ * Beide Seiten pinnen dieselbe Codetabelle, siehe `HPS_CODES` unten
10
10
  * und `fixtures/hobex-hps-codes.json`.
11
11
  *
12
12
  * **`responseCode !== '0'` ist NICHT die Pruefung auf eine Ablehnung.** Genau
@@ -19,7 +19,7 @@
19
19
  *
20
20
  * [isConclusive] ist die einzige Stelle, an der ein Code zu einem Ausgang
21
21
  * wird — und sie ist eine ECHTE Positivliste: nur ein Code, dessen Bedeutung
22
- * GEMESSEN und in [HPS_MEASURED_CODES] benannt ist, zaehlt. Jeder andere —
22
+ * feststeht und in [HPS_CODES] benannt ist, zaehlt. Jeder andere —
23
23
  * auch ein neuer, heute noch unbekannter Code — ist eine Wissensluecke, siehe
24
24
  * [isUnknownCode]. Am 27.08.2026 hat der Dart-Zwilling gemessen, warum die
25
25
  * Gegenrichtung ("jeder Code ausser 9027 ist schluessig") gefaehrlich ist: ein
@@ -28,7 +28,10 @@
28
28
  * sein kann, als `declined` gemeldet.
29
29
  */
30
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
- exports.TERMINAL_BUSY_HTTP_STATUS = exports.WRONG_PIN_CODE = exports.INVALID_TID_CODE = exports.AMOUNT_OUT_OF_RANGE_CODE = exports.INVALID_AMOUNT_CODE = exports.NOT_ABORTABLE_CODE = exports.CARD_NOT_PRESENT_CODE = exports.ABORTED_CODE = exports.TECHNICAL_ERROR_CODE = exports.NO_STATEMENT_CODE = exports.TRANSACTION_CANCELED_CODE = exports.INVALID_TRANSACTION_CODE = exports.APPROVED_CODE = exports.HPS_MEASURED_CODES = void 0;
31
+ exports.TERMINAL_BUSY_HTTP_STATUS = exports.INTERNAL_ERROR_CODE = exports.TERMINAL_BUSY_CODE = exports.HOST_TIMEOUT_REVERSED_CODE = exports.TIP_SELECTION_FAILED_CODE = exports.UNSUPPORTED_USER_DATA_CODE = exports.CHIP_DATA_MISMATCH_CODE = exports.REFUND_DISABLED_CODE = exports.COMPLETION_FAILED_CODE = exports.INVALID_MESSAGE_TYPE_CODE = exports.TERMINAL_BLOCKED_CODE = exports.PASSWORD_NOT_ENTERED_CODE = exports.REFUND_PASSWORD_INVALID_CODE = exports.SCEP_ENROLLMENT_FAILED_CODE = exports.CARD_NOT_SUPPORTED_CODE = exports.CARD_DECLINED_CODE = exports.CARD_INFO_NOT_ENTERED_CODE = exports.DIAGNOSIS_FAILED_CODE = exports.MAX_RETRIES_EXCEEDED_CODE = exports.NOT_FOUND_CODE = exports.INVALID_TX_TYPE_CODE = exports.INVALID_TID_DOCUMENTED_CODE = exports.HOST_STEP_FAILED_CODE = exports.HOST_COMMUNICATION_FAILED_CODE = exports.APP_SELECT_FAILED_CODE = exports.CARD_READ_FAILED_CODE = exports.BAD_REQUEST_CODE = exports.WRONG_PIN_CODE = exports.INVALID_TID_CODE = exports.AMOUNT_OUT_OF_RANGE_CODE = exports.INVALID_AMOUNT_CODE = exports.NOT_ABORTABLE_CODE = exports.CARD_NOT_PRESENT_CODE = exports.ABORTED_CODE = exports.TECHNICAL_ERROR_CODE = exports.NO_STATEMENT_CODE = exports.TRANSACTION_CANCELED_CODE = exports.INVALID_TRANSACTION_CODE = exports.APPROVED_CODE = exports.HPS_MEASURED_CODES = exports.HPS_CODES = exports.HPS_REASON_HINTS = void 0;
32
+ exports.isHostUncertainReason = isHostUncertainReason;
33
+ exports.hpsCodeInfo = hpsCodeInfo;
34
+ exports.hpsCodeReason = hpsCodeReason;
32
35
  exports.parseHpsTransactionResponse = parseHpsTransactionResponse;
33
36
  exports.isApproved = isApproved;
34
37
  exports.isInProgress = isInProgress;
@@ -37,99 +40,220 @@ exports.isNoStatement = isNoStatement;
37
40
  exports.isTechnicalError = isTechnicalError;
38
41
  exports.isCanceled = isCanceled;
39
42
  exports.isConclusive = isConclusive;
43
+ exports.isConclusiveAsStatus = isConclusiveAsStatus;
44
+ exports.isHostUncertain = isHostUncertain;
40
45
  exports.isUnknownCode = isUnknownCode;
46
+ /** Der Satz fuer den Bediener je Grund, deutsch. */
47
+ exports.HPS_REASON_HINTS = {
48
+ approved: 'Vom Terminal genehmigt.',
49
+ aborted: 'Der Vorgang wurde abgebrochen. Es wurde kein Geld bewegt.',
50
+ noCard: 'Es wurde keine Karte vorgehalten. Es wurde kein Geld bewegt — '
51
+ + 'bitte erneut versuchen.',
52
+ cardReadFailed: 'Die Karte konnte nicht gelesen werden. Es wurde kein Geld bewegt — '
53
+ + 'bitte erneut versuchen, notfalls die Karte stecken statt auflegen.',
54
+ cardDeclined: 'Die Karte wurde vom Terminal abgelehnt. Es wurde kein Geld bewegt '
55
+ + '— bitte eine andere Karte oder Zahlungsart verwenden.',
56
+ wrongPin: 'Die PIN war falsch. Es wurde kein Geld bewegt — bitte erneut '
57
+ + 'versuchen.',
58
+ amountInvalid: 'Das Terminal nimmt diesen Betrag nicht an. Es wurde kein Geld '
59
+ + 'bewegt.',
60
+ tipNotSelected: 'Das Trinkgeld wurde nicht rechtzeitig gewählt. Es wurde kein Geld '
61
+ + 'bewegt — bitte erneut versuchen.',
62
+ terminalBusy: 'Das Terminal ist noch mit einem anderen Vorgang beschäftigt. Es '
63
+ + 'wurde kein Geld bewegt — kurz warten und erneut versuchen.',
64
+ terminalBlocked: 'Das Terminal ist gesperrt. Es wurde kein Geld bewegt — bitte hobex '
65
+ + 'kontaktieren.',
66
+ terminalSetup: 'Das Terminal ist nicht richtig eingerichtet. Es wurde kein Geld '
67
+ + 'bewegt — bitte die Terminal-ID in den Einstellungen prüfen, sonst '
68
+ + 'hobex kontaktieren.',
69
+ terminalFault: 'Das Terminal meldet eine Störung. Es wurde kein Geld bewegt — '
70
+ + 'bitte das Terminal neu starten und erneut versuchen.',
71
+ requestRejected: 'Das Terminal hat die Anfrage abgewiesen. Es wurde kein Geld bewegt '
72
+ + '— tritt das wieder auf, bitte den Support kontaktieren.',
73
+ invalidTransaction: 'Das Terminal kennt die ursprüngliche Zahlung nicht. Es wurde kein '
74
+ + 'Geld bewegt.',
75
+ refundPassword: 'Das Passwort für die Gutschrift war falsch oder wurde nicht '
76
+ + 'eingegeben. Es wurde nichts ausgezahlt.',
77
+ refundDisabled: 'Gutschriften sind an diesem Terminal abgeschaltet. Es wurde nichts '
78
+ + 'ausgezahlt — bitte hobex kontaktieren.',
79
+ hostTimeoutReversed: 'hobex hat nicht rechtzeitig geantwortet, das Terminal hat den '
80
+ + 'Vorgang selbst storniert. Es wird kein Geld bewegt — bitte erneut '
81
+ + 'versuchen.',
82
+ hostFault: 'Die Verbindung zwischen Terminal und hobex ist gestört. Ob die '
83
+ + 'Karte belastet wurde, weiß das Terminal nicht — bitte nicht erneut '
84
+ + 'kassieren, bevor es geklärt ist.',
85
+ internalError: 'Das Terminal meldet einen internen Fehler. Ob die Karte belastet '
86
+ + 'wurde, ist unklar — bitte nicht erneut kassieren, bevor es geklärt '
87
+ + 'ist.',
88
+ canceled: 'Die Zahlung ist aufgehoben.',
89
+ notAbortable: 'Der Vorgang ist bereits abgeschlossen und lässt sich nicht mehr '
90
+ + 'abbrechen.',
91
+ noStatement: 'Das Terminal hat zu diesem Vorgang keine Auskunft.',
92
+ technicalError: 'Das Terminal meldet einen technischen Fehler; über den Vorgang '
93
+ + 'sagt das nichts.',
94
+ unknown: 'Das Terminal nennt einen Code, dessen Bedeutung nicht bekannt ist.',
95
+ };
41
96
  /**
42
- * Die gemessene Codetabelle — Vertrag mit dem Dart-Zwilling, siehe
43
- * `fixtures/hobex-hps-codes.json`. Gemessen an einem hobex-HPS (TID 3600335,
44
- * HPS 1.10.0, Firmware 7.3.6, 26.–28.08.2026).
97
+ * Die beiden Gruende hinter einem Code mit `effect: 'hostUncertain'`: ob Geld
98
+ * geflossen ist, weiss das Terminal nicht.
99
+ */
100
+ function isHostUncertainReason(reason) {
101
+ return reason === 'hostFault' || reason === 'internalError';
102
+ }
103
+ function code(c, title, meaning, effect, reason, source, rejectsRequest = false) {
104
+ return { code: c, title, meaning, conclusive: effect === 'conclusive', effect, reason, source, rejectsRequest };
105
+ }
106
+ /**
107
+ * Die vollstaendige Codetabelle — Vertrag mit dem Dart-Zwilling
108
+ * (`HpsCodes.all` in `lib/src/hobex_hps/response_codes.dart`), ausgegeben als
109
+ * `fixtures/hobex-hps-codes.json`.
110
+ *
111
+ * Zwei Quellen: GEMESSEN an hobex-HPS-Geraeten (TID 3600335, HPS 1.10.0,
112
+ * Firmware 7.3.6, 26.–28.08.2026; TID 3556988 im Betrieb) und die
113
+ * Antwortcodeliste von hobex (erhalten 11.09.2026). Die Regel bleibt: nur ein
114
+ * Code mit feststehender Bedeutung schreibt einen Ausgang fest -- die Liste des
115
+ * Herstellers ist eine solche Feststellung, kein Raten aus der Codefamilie.
116
+ *
117
+ * Eingeordnet wird danach, WO im Ablauf ein dokumentierter Code entsteht:
118
+ * - vor dem Host (Anfrage, Karte, EMV-Kernel, Eingaben, Geraetezustand) ->
119
+ * `conclusive`, also `declined`;
120
+ * - `100029`, Zeitueberschreitung zum Host MIT auto-reversal -> ebenfalls
121
+ * `declined`, das Terminal storniert laut hobex selbst;
122
+ * - beim oder nach dem Host OHNE auto-reversal, dazu der Sammelcode `100999`
123
+ * -> `hostUncertain`.
45
124
  *
46
- * Reihenfolge ist die im Messprotokoll (`doc/kartenzahlung.md` im
47
- * Dart-Zwilling) — numerisch aufsteigend zu sortieren wuerde beim Diff
48
- * gegen die Vertragsdatei nichts gewinnen und macht Aenderungen schwerer
49
- * nachzuverfolgen.
125
+ * Reihenfolge: zuerst die gemessenen wie im Messprotokoll, dann die
126
+ * dokumentierten aufsteigend -- identisch mit dem Dart-Zwilling.
50
127
  */
51
- exports.HPS_MEASURED_CODES = [
52
- { code: '0', meaning: 'genehmigt', conclusive: true },
53
- {
54
- code: '9002',
55
- meaning: 'ungueltiger Vorgang -- das Terminal hat den Vorgang selbst als '
56
- + 'unzulaessig verworfen, bevor irgendetwas in Bewegung kam',
57
- conclusive: true,
58
- },
59
- {
60
- code: '9011',
61
- meaning: "aufgehoben (\"Transaction Canceled\") -- der Vorgang unter dieser Kennung wurde storniert",
62
- conclusive: true,
63
- },
64
- {
65
- code: '9027',
66
- meaning: 'keine Aussage -- steht gleichermassen fuer "nie gesehen", '
67
- + '"laeuft gerade", "Karte nicht aufgelegt" und "abgebrochen"',
68
- conclusive: false,
69
- },
70
- {
71
- code: '9900',
72
- meaning: '"Technical Error Database" -- gemessen im Zusammenhang mit '
73
- + 'einer nicht rein numerischen Kennung; keine Aussage ueber den Vorgang selbst',
74
- conclusive: false,
75
- },
76
- {
77
- code: '9003',
78
- meaning: '"Invalid Amount" -- der Betrag wird abgewiesen, BEVOR eine Karte '
79
- + 'verlangt wird (28.08.2026: 99999,99 EUR, Antwort nach 15,7 s ohne '
80
- + 'Kartenaufforderung); nichts belastet',
81
- conclusive: true,
82
- },
83
- { code: '100002', meaning: 'abgebrochen ("Aborted")', conclusive: true },
84
- { code: '100003', meaning: 'Karte nicht aufgelegt ("Card not present")', conclusive: true },
85
- { code: '100010', meaning: 'nicht mehr abbrechbar -- der Vorgang ist bereits abgeschlossen', conclusive: true },
86
- {
87
- code: '100019',
88
- meaning: '"Amount is not in a valid range" -- Betrag ausserhalb des '
89
- + 'zulaessigen Bereichs, gemessen mit negativem Betrag; Abweisung vor '
90
- + 'dem Kartenfluss, nichts belastet',
91
- conclusive: true,
92
- },
93
- {
94
- code: '100108',
95
- meaning: '"Invalid TID" -- die Terminal-Kennung gibt es an diesem Geraet '
96
- + 'nicht; der Vorgang wird abgewiesen, bevor etwas geschieht',
97
- conclusive: true,
98
- },
99
- {
100
- code: '55',
101
- meaning: '"PIN falsch" -- Host-Ablehnung wegen falscher PIN, die erste '
102
- + 'gemessene Host-Ablehnung ueberhaupt (02.09.2026 im Betrieb, TID '
103
- + '3556988, HPS 1.11.4, Firmware 2.3.9): die Zahlung antwortete direkt '
104
- + 'damit, die Statusabfrage danach elfmal in Folge ebenso -- eine '
105
- + 'Host-Ablehnung bleibt am Terminal abrufbar; nichts belastet',
106
- conclusive: true,
107
- },
128
+ exports.HPS_CODES = [
129
+ code('0', 'Authorized', 'genehmigt', 'conclusive', 'approved', 'measuredAndDocumented'),
130
+ code('9002', 'Invalid Transaction', 'ungueltiger Vorgang -- das Terminal hat den Vorgang selbst als '
131
+ + 'unzulaessig verworfen, bevor irgendetwas in Bewegung kam', 'conclusive', 'invalidTransaction', 'measured', true),
132
+ code('9011', 'Transaction Canceled', 'aufgehoben ("Transaction Canceled") -- der Vorgang unter dieser '
133
+ + 'Kennung wurde storniert', 'conclusive', 'canceled', 'measured'),
134
+ code('9027', 'Original Tx not found', 'keine Aussage -- steht gleichermassen fuer "nie gesehen", "laeuft '
135
+ + 'gerade", "Karte nicht aufgelegt" und "abgebrochen"', 'noStatement', 'noStatement', 'measured'),
136
+ code('9900', 'Technical Error Database', '"Technical Error Database" -- gemessen im Zusammenhang mit einer '
137
+ + 'nicht rein numerischen Kennung; keine Aussage ueber den Vorgang '
138
+ + 'selbst', 'noStatement', 'technicalError', 'measured'),
139
+ code('9003', 'Invalid Amount', '"Invalid Amount" -- der Betrag wird abgewiesen, BEVOR eine Karte '
140
+ + 'verlangt wird (28.08.2026: 99999,99 EUR, Antwort nach 15,7 s ohne '
141
+ + 'Kartenaufforderung); nichts belastet', 'conclusive', 'amountInvalid', 'measured'),
142
+ code('100002', 'Aborted', 'abgebrochen ("Aborted") -- ueber die Kasse oder am Terminal; '
143
+ + 'nichts belastet', 'conclusive', 'aborted', 'measuredAndDocumented'),
144
+ code('100003', 'Card not present', 'Karte nicht aufgelegt ("Card not present") -- innerhalb der Frist '
145
+ + '(gemessen rund 60 s) keine Karte; nichts belastet', 'conclusive', 'noCard', 'measuredAndDocumented'),
146
+ code('100010', 'Unable to abort transaction', 'nicht mehr abbrechbar -- der Vorgang ist bereits abgeschlossen', 'conclusive', 'notAbortable', 'measuredAndDocumented', true),
147
+ code('100019', 'Amount is not in a valid range', '"Amount is not in a valid range" -- Betrag ausserhalb des '
148
+ + 'zulaessigen Bereichs, gemessen mit negativem Betrag; Abweisung vor '
149
+ + 'dem Kartenfluss, nichts belastet', 'conclusive', 'amountInvalid', 'measuredAndDocumented'),
150
+ code('100108', 'Invalid TID', '"Invalid TID" -- die Terminal-Kennung gibt es an diesem Geraet '
151
+ + 'nicht; der Vorgang wird abgewiesen, bevor etwas geschieht', 'conclusive', 'terminalSetup', 'measured', true),
152
+ code('55', 'PIN falsch', '"PIN falsch" -- Host-Ablehnung wegen falscher PIN, die erste '
153
+ + 'gemessene Host-Ablehnung ueberhaupt (02.09.2026 im Betrieb, TID '
154
+ + '3556988, HPS 1.11.4, Firmware 2.3.9): die Zahlung antwortete '
155
+ + 'direkt damit, die Statusabfrage danach elfmal in Folge ebenso -- '
156
+ + 'eine Host-Ablehnung bleibt am Terminal abrufbar; nichts belastet', 'conclusive', 'wrongPin', 'measured'),
157
+ // ---- ab hier: Antwortcodeliste von hobex, erhalten 11.09.2026 ----
158
+ code('100001', 'Bad Request', 'fehlerhafte Anfrage der Kasse ("Bad Request") -- Abweisung vor dem '
159
+ + 'Kartenfluss; nichts belastet', 'conclusive', 'requestRejected', 'documented', true),
160
+ code('100004', 'Card read failed', 'Karte nicht lesbar ("Card read failed") -- Fehler beim Umgang mit '
161
+ + 'der Karte, vor jeder Autorisierung; im Betrieb (TID 3556988, '
162
+ + '28.08.2026) danach dauerhaft 9027; nichts belastet', 'conclusive', 'cardReadFailed', 'documented'),
163
+ code('100005', 'App select failed', 'Anwendungsauswahl gescheitert ("App select failed") -- die Karte '
164
+ + 'bietet keine passende Anwendung, vor jeder Autorisierung; im '
165
+ + 'Betrieb danach dauerhaft 9027; nichts belastet', 'conclusive', 'cardReadFailed', 'documented'),
166
+ code('100006', 'Communication with TecsXml failed', 'keine Verbindung zum hobex-Host ("Communication with TecsXml '
167
+ + 'failed") -- das Terminal storniert NICHT selbst; ob beim Host '
168
+ + 'etwas angekommen ist, weiss das Terminal nicht', 'hostUncertain', 'hostFault', 'documented'),
169
+ code('100007', 'Processing of TecsXml step failed', 'Schritt beim hobex-Host gescheitert ("Processing of TecsXml step '
170
+ + 'failed") -- das Terminal storniert NICHT selbst; ob beim Host '
171
+ + 'belastet wurde, weiss das Terminal nicht', 'hostUncertain', 'hostFault', 'documented'),
172
+ code('100008', 'Invalid TID', 'Terminal-Kennung passt nicht ("Invalid TID") -- die TID der '
173
+ + 'Anfrage ist nicht die eingerichtete; Abweisung vor dem '
174
+ + 'Kartenfluss, nichts belastet (am Geraet gemessen wurde dafuer '
175
+ + '100108)', 'conclusive', 'terminalSetup', 'documented', true),
176
+ code('100009', 'Invalid Tx Type', 'Vorgangstyp unbekannt oder nicht moeglich ("Invalid Tx Type") -- '
177
+ + 'Abweisung vor dem Kartenfluss; nichts belastet', 'conclusive', 'requestRejected', 'documented', true),
178
+ code('100011', 'Not Found', 'nicht gefunden ("Not Found") -- das Terminal kennt den Vorgang '
179
+ + 'nicht; keine Aussage ueber den Vorgang, anders als 9027 aber nie '
180
+ + 'gemessen und deshalb ohne dessen Schlussregel', 'noStatement', 'noStatement', 'documented'),
181
+ code('100012', 'Max retries exceeded', 'zu viele Kartenversuche ("Max retries exceeded") -- die Karte '
182
+ + 'wurde mehrfach (Vorgabe 3) erfolglos vorgehalten; nichts belastet', 'conclusive', 'cardReadFailed', 'documented'),
183
+ code('100013', 'Diagnosis failed', 'Diagnose gescheitert ("Diagnosis failed") -- das Terminal konnte '
184
+ + 'die Daten des EMV-Kernels nicht lesen; kein Kartenfluss, nichts '
185
+ + 'belastet', 'conclusive', 'terminalFault', 'documented', true),
186
+ code('100014', 'Card information wasn\'t entered', 'Kartendaten nicht eingegeben ("Card information wasn\'t entered") '
187
+ + '-- die MOTO-Eingabe kam nicht innerhalb der Frist; nichts belastet', 'conclusive', 'noCard', 'documented'),
188
+ code('100015', 'Card declined', 'Karte vom EMV-Kernel abgelehnt ("Card declined") -- Ablehnung im '
189
+ + 'Terminal, vor jeder Autorisierung beim Host; im Betrieb danach '
190
+ + 'dauerhaft 9027; nichts belastet', 'conclusive', 'cardDeclined', 'documented'),
191
+ code('100017', 'Card Not Supported', 'Karte nicht unterstuetzt ("Card Not Supported") -- der EMV-Kernel '
192
+ + 'kennt die Karte nicht; nichts belastet', 'conclusive', 'cardDeclined', 'documented'),
193
+ code('100018', 'Scep enrollment failed', 'Zertifikatsanmeldung gescheitert ("Scep enrollment failed") -- '
194
+ + 'falscher Code oder keine Verbindung; das Terminal kann den Host '
195
+ + 'nicht ansprechen, nichts belastet', 'conclusive', 'terminalSetup', 'documented', true),
196
+ code('100020', 'Refund password is invalid', 'Passwort fuer die Gutschrift falsch ("Refund password is invalid") '
197
+ + '-- die Gutschrift wird nicht ausgefuehrt, nichts ausgezahlt', 'conclusive', 'refundPassword', 'documented'),
198
+ code('100021', 'Failed to enter the password', 'Passwort nicht eingegeben ("Failed to enter the password") -- '
199
+ + 'nicht innerhalb der Frist; nichts ausgefuehrt', 'conclusive', 'refundPassword', 'documented'),
200
+ code('100022', 'Terminal is blocked', 'Terminal gesperrt ("Terminal is blocked") -- das Geraet ist nicht '
201
+ + 'IN_OPERATION; nichts belastet', 'conclusive', 'terminalBlocked', 'documented', true),
202
+ code('100023', 'Invalid message type', 'ungueltige Antwort des hobex-Hosts ("Invalid message type") -- '
203
+ + 'Nachricht und Antwortcode in den UserData ungueltig; ob beim Host '
204
+ + 'belastet wurde, weiss das Terminal nicht', 'hostUncertain', 'hostFault', 'documented'),
205
+ code('100024', 'Transaction completion has failed', 'Abschluss des Online-Vorgangs gescheitert ("Transaction completion '
206
+ + 'has failed") -- NACH der Anfrage beim Host; ob belastet bleibt, '
207
+ + 'weiss das Terminal nicht', 'hostUncertain', 'hostFault', 'documented'),
208
+ code('100025', 'Refund transactions are disabled', 'Gutschriften abgeschaltet ("Refund transactions are disabled") -- '
209
+ + 'in der Geraeteeinstellung; nichts ausgezahlt', 'conclusive', 'refundDisabled', 'documented'),
210
+ code('100026', 'Transaction was declined.', 'Host-Antwort passt nicht zur Karte ("Transaction was declined.") '
211
+ + '-- Chip-Daten fuer eine Karte ohne Chip; das Terminal lehnt ab, ob '
212
+ + 'der Host zuvor belastet hat, ist offen', 'hostUncertain', 'hostFault', 'documented'),
213
+ code('100027', 'Unsupported UserData in TecsXml Response', 'unbekannte Daten in der Antwort des hobex-Hosts ("Unsupported '
214
+ + 'UserData in TecsXml Response") -- ob beim Host belastet wurde, '
215
+ + 'weiss das Terminal nicht', 'hostUncertain', 'hostFault', 'documented'),
216
+ code('100028', 'Tip selection process has failed.', 'Trinkgeld nicht gewaehlt ("Tip selection process has failed.") -- '
217
+ + 'nicht innerhalb der Frist; nichts belastet', 'conclusive', 'tipNotSelected', 'documented'),
218
+ code('100029', 'Communication with TecsXml timeout', 'Zeitueberschreitung zum hobex-Host ("Communication with TecsXml '
219
+ + 'timeout") -- das Terminal storniert den Vorgang SELBST '
220
+ + '(auto-reversal); nichts belastet', 'conclusive', 'hostTimeoutReversed', 'documented'),
221
+ code('100998', 'Terminal is busy', 'Terminal beschaeftigt ("Terminal is busy") -- ein anderer Vorgang '
222
+ + 'laeuft oder das Geraet ist nicht bereit; die Anfrage wurde nicht '
223
+ + 'angenommen, nichts belastet', 'conclusive', 'terminalBusy', 'documented', true),
224
+ code('100999', 'Internal Error', 'interner Fehler des Terminals ("Internal Error") -- Sammelcode '
225
+ + 'fuer jeden sonst nicht benannten Fehler, an jeder Stelle des '
226
+ + 'Ablaufs moeglich; ob belastet wurde, ist offen', 'hostUncertain', 'internalError', 'documented'),
108
227
  ];
228
+ /**
229
+ * @deprecated Seit 0.10.0 [HPS_CODES] -- die Tabelle fuehrt nicht mehr nur
230
+ * gemessene Codes. Gleicher Inhalt, bleibt fuer bestehende Aufrufer.
231
+ */
232
+ exports.HPS_MEASURED_CODES = exports.HPS_CODES;
109
233
  /** `responseCode` einer genehmigten Zahlung. */
110
234
  exports.APPROVED_CODE = '0';
111
- /** Siehe [HPS_MEASURED_CODES]: ungueltiger Vorgang, nichts passiert. */
235
+ /** Siehe [HPS_CODES]: ungueltiger Vorgang, nichts passiert. */
112
236
  exports.INVALID_TRANSACTION_CODE = '9002';
113
- /** Siehe [HPS_MEASURED_CODES]: aufgehoben. */
237
+ /** Siehe [HPS_CODES]: aufgehoben. */
114
238
  exports.TRANSACTION_CANCELED_CODE = '9011';
115
- /** Siehe [HPS_MEASURED_CODES]: keine Aussage. */
239
+ /** Siehe [HPS_CODES]: keine Aussage. */
116
240
  exports.NO_STATEMENT_CODE = '9027';
117
- /** Siehe [HPS_MEASURED_CODES]: Kennung nicht numerisch, keine Aussage. */
241
+ /** Siehe [HPS_CODES]: Kennung nicht numerisch, keine Aussage. */
118
242
  exports.TECHNICAL_ERROR_CODE = '9900';
119
- /** Siehe [HPS_MEASURED_CODES]: abgebrochen. */
243
+ /** Siehe [HPS_CODES]: abgebrochen. */
120
244
  exports.ABORTED_CODE = '100002';
121
- /** Siehe [HPS_MEASURED_CODES]: Karte nicht aufgelegt. */
245
+ /** Siehe [HPS_CODES]: Karte nicht aufgelegt. */
122
246
  exports.CARD_NOT_PRESENT_CODE = '100003';
123
- /** Siehe [HPS_MEASURED_CODES]: nicht mehr abbrechbar. */
247
+ /** Siehe [HPS_CODES]: nicht mehr abbrechbar. */
124
248
  exports.NOT_ABORTABLE_CODE = '100010';
125
- /** Siehe [HPS_MEASURED_CODES]: Betrag abgewiesen, vor dem Kartenfluss. */
249
+ /** Siehe [HPS_CODES]: Betrag abgewiesen, vor dem Kartenfluss. */
126
250
  exports.INVALID_AMOUNT_CODE = '9003';
127
- /** Siehe [HPS_MEASURED_CODES]: Betrag ausserhalb des zulaessigen Bereichs. */
251
+ /** Siehe [HPS_CODES]: Betrag ausserhalb des zulaessigen Bereichs. */
128
252
  exports.AMOUNT_OUT_OF_RANGE_CODE = '100019';
129
- /** Siehe [HPS_MEASURED_CODES]: Terminal-Kennung unbekannt. */
253
+ /** Siehe [HPS_CODES]: Terminal-Kennung unbekannt. */
130
254
  exports.INVALID_TID_CODE = '100108';
131
255
  /**
132
- * Siehe [HPS_MEASURED_CODES]: Host-Ablehnung, falsche PIN -- nichts belastet.
256
+ * Siehe [HPS_CODES]: Host-Ablehnung, falsche PIN -- nichts belastet.
133
257
  *
134
258
  * Zweistellig, weil ein Antwortcode des HOSTS (ISO 8583, 55 = "Incorrect
135
259
  * PIN"), kein `9xxx`-Terminalcode und kein `100xxx`-Code der HPS-Anwendung.
@@ -140,6 +264,61 @@ exports.INVALID_TID_CODE = '100108';
140
264
  * dann nicht 9027 antwortet, sondern mit dem Code selbst.
141
265
  */
142
266
  exports.WRONG_PIN_CODE = '55';
267
+ // ---- Antwortcodeliste von hobex, erhalten 11.09.2026 ----
268
+ // Bedeutung, Wirkung und Grund stehen in [HPS_CODES]; hier nur die Namen,
269
+ // gleichlautend mit dem Dart-Zwilling (`TransactionResponse.*Code`).
270
+ /** `100001` "Bad Request" -- nichts belastet. */
271
+ exports.BAD_REQUEST_CODE = '100001';
272
+ /** `100004` "Card read failed" -- nichts belastet. Im Betrieb am 28.08.2026 gesehen. */
273
+ exports.CARD_READ_FAILED_CODE = '100004';
274
+ /** `100005` "App select failed" -- nichts belastet. Im Betrieb am 28.08.2026 gesehen. */
275
+ exports.APP_SELECT_FAILED_CODE = '100005';
276
+ /** `100006` "Communication with TecsXml failed" (No auto-reversal) -- ungewiss. */
277
+ exports.HOST_COMMUNICATION_FAILED_CODE = '100006';
278
+ /** `100007` "Processing of TecsXml step failed" (No auto-reversal) -- ungewiss. */
279
+ exports.HOST_STEP_FAILED_CODE = '100007';
280
+ /** `100008` "Invalid TID" laut hobex; gemessen wurde [INVALID_TID_CODE]. */
281
+ exports.INVALID_TID_DOCUMENTED_CODE = '100008';
282
+ /** `100009` "Invalid Tx Type" -- nichts belastet. */
283
+ exports.INVALID_TX_TYPE_CODE = '100009';
284
+ /** `100011` "Not Found" -- keine Aussage, aber ohne die Zwei-9027-Regel. */
285
+ exports.NOT_FOUND_CODE = '100011';
286
+ /** `100012` "Max retries exceeded" -- nichts belastet. */
287
+ exports.MAX_RETRIES_EXCEEDED_CODE = '100012';
288
+ /** `100013` "Diagnosis failed" -- nichts belastet. */
289
+ exports.DIAGNOSIS_FAILED_CODE = '100013';
290
+ /** `100014` "Card information wasn't entered" (MOTO) -- nichts belastet. */
291
+ exports.CARD_INFO_NOT_ENTERED_CODE = '100014';
292
+ /** `100015` "Card declined" (EMV-Kernel) -- nichts belastet. Im Betrieb am 28. und 31.08.2026 gesehen. */
293
+ exports.CARD_DECLINED_CODE = '100015';
294
+ /** `100017` "Card Not Supported" -- nichts belastet. */
295
+ exports.CARD_NOT_SUPPORTED_CODE = '100017';
296
+ /** `100018` "Scep enrollment failed" -- nichts belastet. */
297
+ exports.SCEP_ENROLLMENT_FAILED_CODE = '100018';
298
+ /** `100020` "Refund password is invalid" -- nichts ausgezahlt. */
299
+ exports.REFUND_PASSWORD_INVALID_CODE = '100020';
300
+ /** `100021` "Failed to enter the password" -- nichts ausgezahlt. */
301
+ exports.PASSWORD_NOT_ENTERED_CODE = '100021';
302
+ /** `100022` "Terminal is blocked" -- nichts belastet. */
303
+ exports.TERMINAL_BLOCKED_CODE = '100022';
304
+ /** `100023` "Invalid message type" -- ungewiss. */
305
+ exports.INVALID_MESSAGE_TYPE_CODE = '100023';
306
+ /** `100024` "Transaction completion has failed" -- ungewiss. */
307
+ exports.COMPLETION_FAILED_CODE = '100024';
308
+ /** `100025` "Refund transactions are disabled" -- nichts ausgezahlt. */
309
+ exports.REFUND_DISABLED_CODE = '100025';
310
+ /** `100026` "Transaction was declined." (Chip-Daten fuer eine Karte ohne Chip) -- ungewiss. */
311
+ exports.CHIP_DATA_MISMATCH_CODE = '100026';
312
+ /** `100027` "Unsupported UserData in TecsXml Response" -- ungewiss. */
313
+ exports.UNSUPPORTED_USER_DATA_CODE = '100027';
314
+ /** `100028` "Tip selection process has failed." -- nichts belastet. */
315
+ exports.TIP_SELECTION_FAILED_CODE = '100028';
316
+ /** `100029` "Communication with TecsXml timeout" (auto-reversal) -- nichts belastet. */
317
+ exports.HOST_TIMEOUT_REVERSED_CODE = '100029';
318
+ /** `100998` "Terminal is busy" -- nichts belastet; gemessen als HTTP [TERMINAL_BUSY_HTTP_STATUS]. */
319
+ exports.TERMINAL_BUSY_CODE = '100998';
320
+ /** `100999` "Internal Error" -- Sammelcode, ungewiss. */
321
+ exports.INTERNAL_ERROR_CODE = '100999';
143
322
  /**
144
323
  * HTTP `409` ("Terminal is busy"): das Terminal serialisiert und weist eine
145
324
  * zweite Anfrage ab, waehrend eine erste noch laeuft. Am 27.08.2026 gemessen:
@@ -147,13 +326,26 @@ exports.WRONG_PIN_CODE = '55';
147
326
  * Spur (die Statusabfrage auf seine Kennung liefert weiterhin
148
327
  * [NO_STATEMENT_CODE]).
149
328
  *
150
- * Bewusst KEIN Eintrag in [HPS_MEASURED_CODES]: es ist ein HTTP-Status, kein
329
+ * Bewusst KEIN Eintrag in [HPS_CODES]: es ist ein HTTP-Status, kein
151
330
  * `responseCode` — er entsteht, bevor ueberhaupt ein Antwortrumpf gelesen
152
331
  * wird. Siehe `errors.ts` (`HpsConnectTerminalError.isTerminalBusy`) fuer die
153
332
  * getrennte Auswertung.
154
333
  */
155
334
  exports.TERMINAL_BUSY_HTTP_STATUS = 409;
156
- const KNOWN_OUTCOME_CODES = new Set(exports.HPS_MEASURED_CODES.filter((c) => c.conclusive).map((c) => c.code));
335
+ const CODE_BY_ID = new Map(exports.HPS_CODES.map((c) => [c.code, c]));
336
+ /** Der Eintrag zu [code] in [HPS_CODES], oder `undefined`, wenn seine Bedeutung nicht feststeht. */
337
+ function hpsCodeInfo(code) {
338
+ return code === undefined ? undefined : CODE_BY_ID.get(code);
339
+ }
340
+ /**
341
+ * Der Grund zu [code] -- `'unknown'` fuer einen Code ausserhalb der Tabelle,
342
+ * `undefined` ohne Code.
343
+ */
344
+ function hpsCodeReason(code) {
345
+ if (code === undefined)
346
+ return undefined;
347
+ return hpsCodeInfo(code)?.reason ?? 'unknown';
348
+ }
157
349
  /**
158
350
  * Liest eine Terminal-Antwort aus dem `hps`-Feld der Connect-Huelle.
159
351
  *
@@ -229,7 +421,13 @@ function isInProgress(res) {
229
421
  function isNotAbortable(res) {
230
422
  return res.responseCode === exports.NOT_ABORTABLE_CODE;
231
423
  }
232
- /** `true`, wenn das Terminal zu dieser Kennung keine Auskunft gibt (9027). */
424
+ /**
425
+ * `true`, wenn das Terminal zu dieser Kennung keine Auskunft gibt (9027).
426
+ *
427
+ * Bewusst NUR `9027`, nicht auch [NOT_FOUND_CODE] (`100011`): auf `9027` ruht
428
+ * die Zwei-9027-Regel in `payments.ts`, und die ist fuer genau diesen Code
429
+ * gemessen. `100011` ist dokumentiert, aber nie gesehen.
430
+ */
233
431
  function isNoStatement(res) {
234
432
  return res.responseCode === exports.NO_STATEMENT_CODE;
235
433
  }
@@ -250,17 +448,39 @@ function isCanceled(res) {
250
448
  }
251
449
  /**
252
450
  * `true`, wenn diese Antwort ueberhaupt eine Aussage ueber den Ausgang
253
- * traegt — ein Ergebniscode, der in [HPS_MEASURED_CODES] als `conclusive`
254
- * gefuehrt wird. Die einzige Stelle, an der ein Code zu einem Ausgang wird.
451
+ * traegt — ein Ergebniscode, der in [HPS_CODES] als `conclusive` gefuehrt
452
+ * wird. Die einzige Stelle, an der ein Code zu einem Ausgang wird.
255
453
  */
256
454
  function isConclusive(res) {
257
- return res.responseCode !== undefined && KNOWN_OUTCOME_CODES.has(res.responseCode);
455
+ return hpsCodeInfo(res.responseCode)?.conclusive ?? false;
456
+ }
457
+ /**
458
+ * Wie [isConclusive], aber fuer die Antwort auf eine STATUSABFRAGE: ein Code,
459
+ * der die Anfrage selbst abweist (`rejectsRequest`, etwa `100022` "Terminal is
460
+ * blocked" oder `100108` "Invalid TID"), sagt dort nichts ueber den gesuchten
461
+ * Vorgang. Als `declined` gelesen, hiesse ein gesperrtes Terminal "die Zahlung
462
+ * ist nicht belastet".
463
+ */
464
+ function isConclusiveAsStatus(res) {
465
+ const info = hpsCodeInfo(res.responseCode);
466
+ return info !== undefined && info.conclusive && !info.rejectsRequest;
467
+ }
468
+ /**
469
+ * `true`, wenn der Code einen Ausgang meldet, den das Terminal selbst nicht
470
+ * kennt: der hobex-Host war beteiligt, und das Terminal storniert nicht von
471
+ * sich aus (`effect: 'hostUncertain'`). Ein spaeteres `9027` auf die
472
+ * Statusabfrage heisst dann NICHT "nichts belastet" -- es spiegelt nur den
473
+ * Speicher des Terminals, nicht den des Hosts.
474
+ */
475
+ function isHostUncertain(res) {
476
+ return hpsCodeInfo(res.responseCode)?.effect === 'hostUncertain';
258
477
  }
259
478
  /**
260
- * `true`, wenn ein Ergebniscode VORHANDEN ist, aber weder schluessig noch
261
- * eine der beiden gemessenen Wissensluecken ([isNoStatement],
262
- * [isTechnicalError]) — ein Code, den dieses Modell schlicht nicht kennt.
479
+ * `true`, wenn ein Ergebniscode VORHANDEN ist, dessen Bedeutung aber nicht
480
+ * feststeht -- er fehlt in [HPS_CODES]. Ein Code, den dieses Modell schlicht
481
+ * nicht kennt; anders als [isNoStatement], [isTechnicalError] und
482
+ * [isHostUncertain], die eine Wissensluecke ueber den VORGANG benennen.
263
483
  */
264
484
  function isUnknownCode(res) {
265
- return res.responseCode !== undefined && !isConclusive(res) && !isNoStatement(res) && !isTechnicalError(res);
485
+ return res.responseCode !== undefined && hpsCodeInfo(res.responseCode) === undefined;
266
486
  }
@@ -42,4 +42,4 @@
42
42
  export { StripeLinkMode, type StripeLinkModeKey } from '../enums/index.js';
43
43
  export { type CreateStripeLinkOptions, type StripeCaptureResult, createStripeLink, stripeCaptureIntent, } from './stripe.js';
44
44
  export { type HobexPayOptions, type HobexRefundOptions, type HobexTransactionIdOptions, hobexPay, hobexRefund, newHobexTransactionId, } from './hobex.js';
45
- export { type CardPaymentOutcome, type HpsConnectClient, type HpsConnectClientOptions, type HpsConnectFetch, type HpsConnectFetchResponse, type HpsConnectPaymentOptions, type HpsConnectTarget, type HpsConnectTransactionOptions, type HpsMeasuredCode, type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver, type HpsPaymentOptions, type HpsPayments, type HpsPaymentResult, type HpsPaymentsOptions, type HpsTransactionIdGeneratorOptions, type HpsTransactionResponse, ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, createHpsConnectClient, createHpsPayments, createHpsTransactionIdGenerator, HPS_MEASURED_CODES, HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, INVALID_TRANSACTION_CODE, isApproved, isConclusive, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, isValidHpsTransactionId, mayRetrySafely, MAX_TRANSACTION_ID_LENGTH, newHpsTransactionId, NOT_ABORTABLE_CODE, NO_STATEMENT_CODE, parseHpsTransactionResponse, PREFLIGHT_CONNECT_CODES, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, } from './hobex-hps/index.js';
45
+ export { type CardPaymentOutcome, type HpsConnectClient, type HpsConnectClientOptions, type HpsConnectFetch, type HpsConnectFetchResponse, type HpsConnectPaymentOptions, type HpsConnectTarget, type HpsConnectTransactionOptions, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver, type HpsPaymentOptions, type HpsPayments, type HpsPaymentResult, type HpsPaymentsOptions, type HpsTransactionIdGeneratorOptions, type HpsTransactionResponse, ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, createHpsConnectClient, createHpsPayments, createHpsTransactionIdGenerator, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, hpsCodeInfo, hpsCodeReason, HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, INVALID_TRANSACTION_CODE, isApproved, isConclusive, isConclusiveAsStatus, isHostUncertain, isHostUncertainResult, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, isValidHpsTransactionId, mayRetrySafely, MAX_TRANSACTION_ID_LENGTH, newHpsTransactionId, NOT_ABORTABLE_CODE, NO_STATEMENT_CODE, parseHpsTransactionResponse, PREFLIGHT_CONNECT_CODES, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, } from './hobex-hps/index.js';
@@ -41,7 +41,7 @@
41
41
  * nichts zu entscheiden.
42
42
  */
43
43
  Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.TRANSACTION_CANCELED_CODE = exports.TERMINAL_BUSY_HTTP_STATUS = exports.TECHNICAL_ERROR_CODE = exports.PREFLIGHT_CONNECT_CODES = exports.parseHpsTransactionResponse = exports.NO_STATEMENT_CODE = exports.NOT_ABORTABLE_CODE = exports.newHpsTransactionId = exports.MAX_TRANSACTION_ID_LENGTH = exports.mayRetrySafely = exports.isValidHpsTransactionId = exports.isUnknownCode = exports.isTechnicalError = exports.isNotAbortable = exports.isNoStatement = exports.isInProgress = exports.isConclusive = exports.isApproved = exports.INVALID_TRANSACTION_CODE = exports.HpsTransactionIdError = exports.HpsPreflightError = exports.HpsConnectTransportError = exports.HpsConnectTerminalError = exports.HpsConnectException = exports.HpsClarifyTimeoutError = exports.HPS_MEASURED_CODES = exports.createHpsTransactionIdGenerator = exports.createHpsPayments = exports.createHpsConnectClient = exports.CARD_NOT_PRESENT_CODE = exports.APPROVED_CODE = exports.ABORTED_CODE = exports.newHobexTransactionId = exports.hobexRefund = exports.hobexPay = exports.stripeCaptureIntent = exports.createStripeLink = exports.StripeLinkMode = void 0;
44
+ exports.TRANSACTION_CANCELED_CODE = exports.TERMINAL_BUSY_HTTP_STATUS = exports.TECHNICAL_ERROR_CODE = exports.PREFLIGHT_CONNECT_CODES = exports.parseHpsTransactionResponse = exports.NO_STATEMENT_CODE = exports.NOT_ABORTABLE_CODE = exports.newHpsTransactionId = exports.MAX_TRANSACTION_ID_LENGTH = exports.mayRetrySafely = exports.isValidHpsTransactionId = exports.isUnknownCode = exports.isTechnicalError = exports.isNotAbortable = exports.isNoStatement = exports.isInProgress = exports.isHostUncertainResult = exports.isHostUncertain = exports.isConclusiveAsStatus = exports.isConclusive = exports.isApproved = exports.INVALID_TRANSACTION_CODE = exports.HpsTransactionIdError = exports.HpsPreflightError = exports.HpsConnectTransportError = exports.HpsConnectTerminalError = exports.HpsConnectException = exports.HpsClarifyTimeoutError = exports.hpsCodeReason = exports.hpsCodeInfo = exports.HPS_REASON_HINTS = exports.HPS_MEASURED_CODES = exports.HPS_CODES = exports.createHpsTransactionIdGenerator = exports.createHpsPayments = exports.createHpsConnectClient = exports.CARD_NOT_PRESENT_CODE = exports.APPROVED_CODE = exports.ABORTED_CODE = exports.newHobexTransactionId = exports.hobexRefund = exports.hobexPay = exports.stripeCaptureIntent = exports.createStripeLink = exports.StripeLinkMode = void 0;
45
45
  var index_js_1 = require("../enums/index.js");
46
46
  Object.defineProperty(exports, "StripeLinkMode", { enumerable: true, get: function () { return index_js_1.StripeLinkMode; } });
47
47
  var stripe_js_1 = require("./stripe.js");
@@ -58,7 +58,11 @@ Object.defineProperty(exports, "CARD_NOT_PRESENT_CODE", { enumerable: true, get:
58
58
  Object.defineProperty(exports, "createHpsConnectClient", { enumerable: true, get: function () { return index_js_2.createHpsConnectClient; } });
59
59
  Object.defineProperty(exports, "createHpsPayments", { enumerable: true, get: function () { return index_js_2.createHpsPayments; } });
60
60
  Object.defineProperty(exports, "createHpsTransactionIdGenerator", { enumerable: true, get: function () { return index_js_2.createHpsTransactionIdGenerator; } });
61
+ Object.defineProperty(exports, "HPS_CODES", { enumerable: true, get: function () { return index_js_2.HPS_CODES; } });
61
62
  Object.defineProperty(exports, "HPS_MEASURED_CODES", { enumerable: true, get: function () { return index_js_2.HPS_MEASURED_CODES; } });
63
+ Object.defineProperty(exports, "HPS_REASON_HINTS", { enumerable: true, get: function () { return index_js_2.HPS_REASON_HINTS; } });
64
+ Object.defineProperty(exports, "hpsCodeInfo", { enumerable: true, get: function () { return index_js_2.hpsCodeInfo; } });
65
+ Object.defineProperty(exports, "hpsCodeReason", { enumerable: true, get: function () { return index_js_2.hpsCodeReason; } });
62
66
  Object.defineProperty(exports, "HpsClarifyTimeoutError", { enumerable: true, get: function () { return index_js_2.HpsClarifyTimeoutError; } });
63
67
  Object.defineProperty(exports, "HpsConnectException", { enumerable: true, get: function () { return index_js_2.HpsConnectException; } });
64
68
  Object.defineProperty(exports, "HpsConnectTerminalError", { enumerable: true, get: function () { return index_js_2.HpsConnectTerminalError; } });
@@ -68,6 +72,9 @@ Object.defineProperty(exports, "HpsTransactionIdError", { enumerable: true, get:
68
72
  Object.defineProperty(exports, "INVALID_TRANSACTION_CODE", { enumerable: true, get: function () { return index_js_2.INVALID_TRANSACTION_CODE; } });
69
73
  Object.defineProperty(exports, "isApproved", { enumerable: true, get: function () { return index_js_2.isApproved; } });
70
74
  Object.defineProperty(exports, "isConclusive", { enumerable: true, get: function () { return index_js_2.isConclusive; } });
75
+ Object.defineProperty(exports, "isConclusiveAsStatus", { enumerable: true, get: function () { return index_js_2.isConclusiveAsStatus; } });
76
+ Object.defineProperty(exports, "isHostUncertain", { enumerable: true, get: function () { return index_js_2.isHostUncertain; } });
77
+ Object.defineProperty(exports, "isHostUncertainResult", { enumerable: true, get: function () { return index_js_2.isHostUncertainResult; } });
71
78
  Object.defineProperty(exports, "isInProgress", { enumerable: true, get: function () { return index_js_2.isInProgress; } });
72
79
  Object.defineProperty(exports, "isNoStatement", { enumerable: true, get: function () { return index_js_2.isNoStatement; } });
73
80
  Object.defineProperty(exports, "isNotAbortable", { enumerable: true, get: function () { return index_js_2.isNotAbortable; } });
@@ -58,12 +58,20 @@ export type KasseLadeAuto = typeof LADE_AUTO[number];
58
58
  * und schneller, aber aeltere Geraete drucken dann gar keinen QR oder
59
59
  * Zeichensalat.
60
60
  *
61
+ * `auto` ist die Vorgabe und heisst **unbestimmt**: an diesem Geraet hat noch
62
+ * niemand am Papier entschieden. Jede Kasse bleibt dann bei ihrer bisherigen
63
+ * Praxis — die Browser-Kasse beim ESC/POS-Befehl, die App beim Rasterbild.
64
+ * Eine harte Vorgabe waere hier eine stille Umstellung des Altbestands
65
+ * gewesen: jedes Geraet, das nie durch den Drucker-Wizard lief, druckte
66
+ * ploetzlich anders, und ueber BLE kostet ein Rasterbild mehrere Sekunden je
67
+ * Bon. Nur ein ausdruecklich gesetzter Wert aendert etwas.
68
+ *
61
69
  * **Eine Geraete-Einstellung, keine des Betriebs:** derselbe Bon kommt an einer
62
70
  * Kasse sauber heraus und an der Nebenkasse nicht. Und sie ist nicht
63
71
  * kosmetisch — nach § 132a BAO ist der QR Teil des Belegs; wer den falschen
64
72
  * Modus stehen laesst, erteilt Belege ohne lesbare Signatur.
65
73
  */
66
- export declare const QR_MODUS: readonly ["raster", "escpos"];
74
+ export declare const QR_MODUS: readonly ["auto", "raster", "escpos"];
67
75
  export type KasseQrModus = typeof QR_MODUS[number];
68
76
  /** Groesse des Kuerzel-Logos in der Kopfzeile der Kasse. */
69
77
  export declare const LOGO_GROESSE: readonly ["S", "M", "L"];
@@ -191,7 +199,7 @@ export interface KasseSettingsGeraet {
191
199
  papier: KassePapier;
192
200
  zeichensatz: KasseZeichensatz;
193
201
  schnitt: KasseSchnitt;
194
- /** Befehl fuer den Signatur-QR auf dem Bon; der Drucker-Wizard probiert beide aus. */
202
+ /** Befehl fuer den Signatur-QR auf dem Bon; 'auto' = unbestimmt, der Drucker-Wizard probiert beide aus. */
195
203
  qrModus: KasseQrModus;
196
204
  ladeAn: boolean;
197
205
  ladeAuto: KasseLadeAuto;
@@ -46,12 +46,20 @@ export const LADE_AUTO = ['bar', 'immer', 'nie'];
46
46
  * und schneller, aber aeltere Geraete drucken dann gar keinen QR oder
47
47
  * Zeichensalat.
48
48
  *
49
+ * `auto` ist die Vorgabe und heisst **unbestimmt**: an diesem Geraet hat noch
50
+ * niemand am Papier entschieden. Jede Kasse bleibt dann bei ihrer bisherigen
51
+ * Praxis — die Browser-Kasse beim ESC/POS-Befehl, die App beim Rasterbild.
52
+ * Eine harte Vorgabe waere hier eine stille Umstellung des Altbestands
53
+ * gewesen: jedes Geraet, das nie durch den Drucker-Wizard lief, druckte
54
+ * ploetzlich anders, und ueber BLE kostet ein Rasterbild mehrere Sekunden je
55
+ * Bon. Nur ein ausdruecklich gesetzter Wert aendert etwas.
56
+ *
49
57
  * **Eine Geraete-Einstellung, keine des Betriebs:** derselbe Bon kommt an einer
50
58
  * Kasse sauber heraus und an der Nebenkasse nicht. Und sie ist nicht
51
59
  * kosmetisch — nach § 132a BAO ist der QR Teil des Belegs; wer den falschen
52
60
  * Modus stehen laesst, erteilt Belege ohne lesbare Signatur.
53
61
  */
54
- export const QR_MODUS = ['raster', 'escpos'];
62
+ export const QR_MODUS = ['auto', 'raster', 'escpos'];
55
63
  /*
56
64
  * Auch die uebrigen Wertemengen der Einstellungen stehen jetzt als Liste da —
57
65
  * vorher waren sie nur als Union am Feld ausgeschrieben. Ein Zwilling konnte
@@ -125,7 +133,7 @@ export const KASSE_GERAET_STANDARD = Object.freeze({
125
133
  tasten: { ...KASSE_TASTEN_STANDARD },
126
134
  druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerName: '', druckerId: '', druckerDevid: 'local_printer',
127
135
  connectDruckerId: '',
128
- papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial', qrModus: 'raster',
136
+ papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial', qrModus: 'auto',
129
137
  ladeAn: false, ladeAuto: 'bar',
130
138
  terminalIp: '', terminalPort: 8080, terminalVia: 'direkt',
131
139
  terminalArt: 'keins', terminalTid: '', tastenMarken: true,
@@ -20,8 +20,8 @@
20
20
  export { type HpsConnectCancelOptions, type HpsConnectClient, type HpsConnectClientOptions, type HpsConnectFetch, type HpsConnectFetchResponse, type HpsConnectPaymentOptions, type HpsConnectRefundOptions, type HpsConnectTarget, type HpsConnectTransactionOptions, createHpsConnectClient, } from './connect-client.js';
21
21
  export { HpsClarifyTimeoutError, HpsConnectException, HpsConnectTerminalError, HpsConnectTransportError, HpsPreflightError, HpsTransactionIdError, PREFLIGHT_CONNECT_CODES, } from './errors.js';
22
22
  export { type HpsPaymentEvent, type HpsPaymentEventKind, type HpsPaymentObserver, } from './events.js';
23
- export { type CardPaymentOutcome, type HpsPaymentResult, mayRetrySafely, } from './outcome.js';
23
+ export { type CardPaymentOutcome, type HpsPaymentResult, isHostUncertainResult, mayRetrySafely, } from './outcome.js';
24
24
  export { type HpsCancelOptions, type HpsPaymentOptions, type HpsPayments, type HpsPaymentsOptions, type HpsRefundOptions, createHpsPayments, } from './payments.js';
25
25
  export { MAX_TRANSACTION_ID_LENGTH, createHpsTransactionIdGenerator, isValidHpsTransactionId, newHpsTransactionId, type HpsTransactionIdGeneratorOptions, } from './transaction-id.js';
26
- export { ABORTED_CODE, APPROVED_CODE, CARD_NOT_PRESENT_CODE, HPS_MEASURED_CODES, INVALID_TRANSACTION_CODE, NOT_ABORTABLE_CODE, INVALID_AMOUNT_CODE, AMOUNT_OUT_OF_RANGE_CODE, INVALID_TID_CODE, WRONG_PIN_CODE, NO_STATEMENT_CODE, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, isApproved, isCanceled, isConclusive, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, parseHpsTransactionResponse, type HpsMeasuredCode, type HpsTransactionResponse, } from './transaction-response.js';
26
+ export { ABORTED_CODE, APP_SELECT_FAILED_CODE, APPROVED_CODE, BAD_REQUEST_CODE, CARD_DECLINED_CODE, CARD_INFO_NOT_ENTERED_CODE, CARD_NOT_PRESENT_CODE, CARD_NOT_SUPPORTED_CODE, CARD_READ_FAILED_CODE, CHIP_DATA_MISMATCH_CODE, COMPLETION_FAILED_CODE, DIAGNOSIS_FAILED_CODE, HOST_COMMUNICATION_FAILED_CODE, HOST_STEP_FAILED_CODE, HOST_TIMEOUT_REVERSED_CODE, HPS_CODES, HPS_MEASURED_CODES, HPS_REASON_HINTS, INTERNAL_ERROR_CODE, INVALID_MESSAGE_TYPE_CODE, INVALID_TID_DOCUMENTED_CODE, INVALID_TX_TYPE_CODE, MAX_RETRIES_EXCEEDED_CODE, NOT_FOUND_CODE, PASSWORD_NOT_ENTERED_CODE, REFUND_DISABLED_CODE, REFUND_PASSWORD_INVALID_CODE, SCEP_ENROLLMENT_FAILED_CODE, TERMINAL_BLOCKED_CODE, TERMINAL_BUSY_CODE, TIP_SELECTION_FAILED_CODE, UNSUPPORTED_USER_DATA_CODE, hpsCodeInfo, hpsCodeReason, isHostUncertain, isHostUncertainReason, INVALID_TRANSACTION_CODE, NOT_ABORTABLE_CODE, INVALID_AMOUNT_CODE, AMOUNT_OUT_OF_RANGE_CODE, INVALID_TID_CODE, WRONG_PIN_CODE, NO_STATEMENT_CODE, TECHNICAL_ERROR_CODE, TERMINAL_BUSY_HTTP_STATUS, TRANSACTION_CANCELED_CODE, isApproved, isCanceled, isConclusive, isConclusiveAsStatus, isInProgress, isNoStatement, isNotAbortable, isTechnicalError, isUnknownCode, parseHpsTransactionResponse, type HpsCode, type HpsCodeEffect, type HpsCodeReason, type HpsCodeSource, type HpsMeasuredCode, type HpsTransactionResponse, } from './transaction-response.js';
27
27
  export { hobexReceiptFromHps } from './receipt.js';