@kreiseck/kasseneck-api 1.5.0 → 1.6.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 (90) hide show
  1. package/CHANGELOG.md +124 -0
  2. package/README.md +181 -27
  3. package/dist/cjs/client/aufrufe.d.ts +58 -4
  4. package/dist/cjs/client/aufrufe.js +185 -1
  5. package/dist/cjs/client/errors.d.ts +32 -19
  6. package/dist/cjs/client/errors.js +28 -17
  7. package/dist/cjs/client/index.d.ts +2 -2
  8. package/dist/cjs/client/index.js +2 -1
  9. package/dist/cjs/client/transport.d.ts +27 -1
  10. package/dist/cjs/client/transport.js +25 -27
  11. package/dist/cjs/index.d.ts +1 -1
  12. package/dist/cjs/index.js +3 -2
  13. package/dist/cjs/inventory/api.d.ts +10 -2
  14. package/dist/cjs/inventory/api.js +8 -1
  15. package/dist/cjs/inventory/endpunkte.d.ts +2 -1
  16. package/dist/cjs/inventory/endpunkte.js +2 -1
  17. package/dist/cjs/inventory/index.d.ts +5 -3
  18. package/dist/cjs/inventory/index.js +15 -3
  19. package/dist/cjs/inventory/lesen.d.ts +7 -1
  20. package/dist/cjs/inventory/lesen.js +75 -0
  21. package/dist/cjs/inventory/schreiben.d.ts +26 -1
  22. package/dist/cjs/inventory/schreiben.js +24 -10
  23. package/dist/cjs/inventory/typen.d.ts +156 -2
  24. package/dist/cjs/inventory/varianten.d.ts +67 -0
  25. package/dist/cjs/inventory/varianten.js +150 -0
  26. package/dist/cjs/inventory/vertrag.d.ts +40 -5
  27. package/dist/cjs/inventory/vertrag.js +51 -3
  28. package/dist/cjs/inventory/webhook.d.ts +5 -2
  29. package/dist/cjs/inventory/webhook.js +8 -2
  30. package/dist/cjs/invoice/endpunkte.d.ts +6 -0
  31. package/dist/cjs/invoice/endpunkte.js +13 -2
  32. package/dist/cjs/pos/texte.d.ts +11 -6
  33. package/dist/cjs/pos/texte.js +11 -6
  34. package/dist/cjs/stored/vokabular.d.ts +1 -1
  35. package/dist/cjs/stored/vokabular.js +1 -1
  36. package/dist/cjs/version.d.ts +1 -1
  37. package/dist/cjs/version.js +1 -1
  38. package/dist/esm/client/aufrufe.d.ts +58 -4
  39. package/dist/esm/client/aufrufe.js +183 -0
  40. package/dist/esm/client/errors.d.ts +32 -19
  41. package/dist/esm/client/errors.js +28 -17
  42. package/dist/esm/client/index.d.ts +2 -2
  43. package/dist/esm/client/index.js +1 -1
  44. package/dist/esm/client/transport.d.ts +27 -1
  45. package/dist/esm/client/transport.js +26 -28
  46. package/dist/esm/index.d.ts +1 -1
  47. package/dist/esm/index.js +1 -1
  48. package/dist/esm/inventory/api.d.ts +10 -2
  49. package/dist/esm/inventory/api.js +8 -1
  50. package/dist/esm/inventory/endpunkte.d.ts +2 -1
  51. package/dist/esm/inventory/endpunkte.js +2 -1
  52. package/dist/esm/inventory/index.d.ts +5 -3
  53. package/dist/esm/inventory/index.js +4 -2
  54. package/dist/esm/inventory/lesen.d.ts +7 -1
  55. package/dist/esm/inventory/lesen.js +74 -0
  56. package/dist/esm/inventory/schreiben.d.ts +26 -1
  57. package/dist/esm/inventory/schreiben.js +19 -11
  58. package/dist/esm/inventory/typen.d.ts +156 -2
  59. package/dist/esm/inventory/varianten.d.ts +67 -0
  60. package/dist/esm/inventory/varianten.js +142 -0
  61. package/dist/esm/inventory/vertrag.d.ts +40 -5
  62. package/dist/esm/inventory/vertrag.js +50 -2
  63. package/dist/esm/inventory/webhook.d.ts +5 -2
  64. package/dist/esm/inventory/webhook.js +9 -3
  65. package/dist/esm/invoice/endpunkte.d.ts +6 -0
  66. package/dist/esm/invoice/endpunkte.js +13 -2
  67. package/dist/esm/pos/texte.d.ts +11 -6
  68. package/dist/esm/pos/texte.js +11 -6
  69. package/dist/esm/stored/vokabular.d.ts +1 -1
  70. package/dist/esm/stored/vokabular.js +1 -1
  71. package/dist/esm/version.d.ts +1 -1
  72. package/dist/esm/version.js +1 -1
  73. package/fixtures/hobex-hps-codes.json +1 -1
  74. package/fixtures/invoice-api.schema.json +1 -1
  75. package/fixtures/invoice-texts.json +1 -1
  76. package/fixtures/pos-texts.json +1 -1
  77. package/fixtures/surface.json +85 -6
  78. package/fixtures/v3/antworten/belege.json +1 -1
  79. package/fixtures/v3/antworten/belegmail.json +1 -1
  80. package/fixtures/v3/antworten/kasse-belege.json +1 -1
  81. package/fixtures/v3/antworten/kasse.json +2 -2
  82. package/fixtures/v3/antworten/lager.json +2396 -4
  83. package/fixtures/v3/antworten/rechnungen.json +1 -1
  84. package/fixtures/v3/antworten/storno.json +1 -1
  85. package/fixtures/v3/stored/belege.json +1 -1
  86. package/fixtures/v3/stored/kasse.json +2 -2
  87. package/fixtures/v3/stored/rechnungen.json +1 -1
  88. package/fixtures/v3/v3-vokabular.json +151 -6
  89. package/fixtures/v3/zahlbetrag-faelle.json +1 -1
  90. package/package.json +1 -1
@@ -12,8 +12,8 @@
12
12
  * weiterhin jeden `string`: wer einen Aufruf braucht, den dieses Paket nicht
13
13
  * umhuellt, muss ihn weiterhin absetzen koennen.
14
14
  */
15
- import type { TransportBodyFields } from './transport.js';
16
- export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceSetupStatus", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "getReportV2", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listBrands", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyStock", "listMyStockLocations", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations"];
15
+ import type { TransportBodyFields, TransportCallOptions } from './transport.js';
16
+ export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceSetupStatus", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "getReportV2", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listBrands", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyStock", "listMyStockLocations", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations", "createVariantGroup", "updateVariantGroup", "getVariantGroup", "listVariantGroups", "addVariant"];
17
17
  export type ApiCall = typeof ALL_CALLS[number];
18
18
  /**
19
19
  * Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
@@ -21,7 +21,7 @@ export type ApiCall = typeof ALL_CALLS[number];
21
21
  * (`fixtures/v3/v3-vokabular.json`, `endpoints.public`, umbenannt nach
22
22
  * `names`). Ein Test haelt beide Listen deckungsgleich.
23
23
  */
24
- export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "cancelReceipt", "sendReceiptEmail", "generateFullReceiptId", "downloadReceipt", "getFirstReceiptDate", "getReportV2", "downloadReport", "downloadDailyReport", "createPaymentLinkStripe", "stripeCaptureIntent", "hobexPayApi", "hobexRefundApi", "hobexGetStatus", "financeWebService", "listMyTipRecipients", "getPartnerInfo", "createPartnerCustomer", "checkPartnerCustomerEmail", "listPartnerCustomers", "getPartnerCustomer", "sendPartnerCustomerFonLink", "createPartnerWebhook", "updatePartnerWebhook", "deletePartnerWebhook", "listPartnerWebhooks", "sendPartnerWebhookTest", "rotatePartnerWebhookSecret", "listPartnerWebhookDeliveries", "requestCustomerSignature", "getCustomerSignatureStatus", "createCustomerCashregister", "activateCashregister", "listCustomerCashregisters", "getCustomerCredentials", "reportCustomerContract", "getPartnerBilling", "getPartnerBillingMonth", "createCustomer", "getCustomer", "updateCustomer", "searchCustomers", "issueInvoice", "cancelInvoice", "createCreditNote", "getInvoice", "listInvoices", "getInvoicePdf", "getInvoiceXml", "getInvoiceSetupStatus", "listBrands", "recordInvoicePayment", "createInvoiceItem", "updateInvoiceItem", "withdrawInvoiceItem", "getInvoiceItem", "listInvoiceItems", "setCustomerMandate", "revokeCustomerMandate", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations"];
24
+ export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "cancelReceipt", "sendReceiptEmail", "generateFullReceiptId", "downloadReceipt", "getFirstReceiptDate", "getReportV2", "downloadReport", "downloadDailyReport", "createPaymentLinkStripe", "stripeCaptureIntent", "hobexPayApi", "hobexRefundApi", "hobexGetStatus", "financeWebService", "listMyTipRecipients", "getPartnerInfo", "createPartnerCustomer", "checkPartnerCustomerEmail", "listPartnerCustomers", "getPartnerCustomer", "sendPartnerCustomerFonLink", "createPartnerWebhook", "updatePartnerWebhook", "deletePartnerWebhook", "listPartnerWebhooks", "sendPartnerWebhookTest", "rotatePartnerWebhookSecret", "listPartnerWebhookDeliveries", "requestCustomerSignature", "getCustomerSignatureStatus", "createCustomerCashregister", "activateCashregister", "listCustomerCashregisters", "getCustomerCredentials", "reportCustomerContract", "getPartnerBilling", "getPartnerBillingMonth", "createCustomer", "getCustomer", "updateCustomer", "searchCustomers", "issueInvoice", "cancelInvoice", "createCreditNote", "getInvoice", "listInvoices", "getInvoicePdf", "getInvoiceXml", "getInvoiceSetupStatus", "listBrands", "recordInvoicePayment", "createInvoiceItem", "updateInvoiceItem", "withdrawInvoiceItem", "getInvoiceItem", "listInvoiceItems", "setCustomerMandate", "revokeCustomerMandate", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations", "createVariantGroup", "updateVariantGroup", "getVariantGroup", "listVariantGroups", "addVariant"];
25
25
  /**
26
26
  * Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
27
27
  * Web-Kasse: gleicher Ursprung `/api/v3`), in der Reihenfolge von
@@ -31,6 +31,60 @@ export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "can
31
31
  export declare const POS_CALLS: readonly ["pairRegisterDevice", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "registerUserLogin", "registerPinLogin", "renewRegisterSession", "endRegisterSession", "unpairRegisterDevice", "listMyCashregisters", "listMyReceipts", "getReceipt", "createReceipt", "generateFullReceiptId", "cancelReceipt", "sendReceiptEmail", "listMyArticleGroups", "listMyArticles", "getKasseSettings", "setMyKasseSettings", "setMyKasseLogo", "setMyRegisterDeviceSettings", "listMyPrinters", "createPrintJob", "getPrintJob", "listMyTipRecipients", "listMyStockLocations", "listMyStock", "setMyCashregisterStockLocation"];
32
32
  export type PublicCall = typeof PUBLIC_CALLS[number];
33
33
  export type PosCall = typeof POS_CALLS[number];
34
+ /**
35
+ * Die Aufrufe **mit Wirkung**, alphabetisch: sie legen etwas an, aendern oder
36
+ * loeschen es, buchen, signieren, bewegen Geld oder senden etwas hinaus
37
+ * (Mail, Druckjob, Probesendung). Scheitert einer, nachdem die Anfrage
38
+ * unterwegs war (Netzfehler, Zeitlimit, HTTP 5xx, unlesbare Erfolgsantwort,
39
+ * HTML mit Kennzeichen), meldet der Transport `outcome: 'unknown'`: der
40
+ * Vorgang kann ausgefuehrt sein.
41
+ *
42
+ * Bis 1.5.0 galt das nur fuer die sechs signierenden und geldbewegenden
43
+ * Aufrufe; ein Wareneingang oder eine Rechnung nach einem Zeitlimit kam als
44
+ * `'rejected'` an, und wer das glaubte und mit NEUEM Idempotenzschluessel
45
+ * neu sendete, buchte doppelt.
46
+ *
47
+ * Geht als `unknownOutcomeCalls` in den Vertrag (`fixtures/surface.json`);
48
+ * der Dart-Zwilling prueft seine Liste dagegen. Jeder Aufruf aus
49
+ * [ALL_CALLS], [PUBLIC_CALLS] und [POS_CALLS] steht entweder hier oder in
50
+ * [CALLS_WITHOUT_EFFECT] (Waechter `test/ausgang-einordnung.test.ts`).
51
+ */
52
+ export declare const UNKNOWN_OUTCOME_CALLS: readonly ["activateCashregister", "addVariant", "cancelInvoice", "cancelReceipt", "changeStockCondition", "createArticle", "createCreditNote", "createCustomer", "createCustomerCashregister", "createInvoiceItem", "createPartnerCustomer", "createPartnerWebhook", "createPrintJob", "createReceipt", "createReservation", "createVariantGroup", "createWebhook", "deactivateArticle", "deletePartnerWebhook", "deleteWebhook", "extendReservation", "financeWebService", "hobexPayApi", "hobexRefundApi", "issueInvoice", "pairRegisterDevice", "receiveGoods", "recordInvoicePayment", "recordStockLoss", "releaseReservation", "reportCustomerContract", "requestCustomerSignature", "reverseStockMovement", "revokeCustomerMandate", "rotatePartnerWebhookSecret", "rotateWebhookSecret", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "sendWebhookTest", "setCustomerMandate", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "transferStock", "unpairRegisterDevice", "updateArticle", "updateCustomer", "updateInvoiceItem", "updatePartnerWebhook", "updateVariantGroup", "updateWebhook", "withdrawInvoiceItem"];
53
+ /** Warum ein Aufruf keine Wirkung hat, die ein Zeitlimit offen lassen koennte. */
54
+ export type CallWithoutEffectReason = 'read' | 'repeatable';
55
+ /**
56
+ * Die Aufrufe **ohne Wirkung**, je mit Grund. Bei ihnen bleibt es bei
57
+ * `outcome: 'rejected'`, auch nach Zeitlimit, Netzfehler oder HTTP 5xx; eine
58
+ * Wiederholung bucht nichts doppelt:
59
+ *
60
+ * - `read`: reines Lesen (auch Berichte, Dateien, `generateFullReceiptId`,
61
+ * das nur einen Link-Schluessel ableitet, und `getCustomerCredentials`,
62
+ * dessen Abruf das Backend nur mitschreibt).
63
+ * - `repeatable`: legt etwas an, das ohne die verlorene Antwort niemand
64
+ * erreicht und das von selbst verfaellt, und bucht nichts. Die Sitzung der
65
+ * Kassen-Anmeldung (anmelden, verlaengern, abmelden: eine Wiederholung legt
66
+ * hoechstens eine weitere kurzlebige Sitzung an bzw. verlaengert oder
67
+ * beendet dieselbe noch einmal) und der Stripe-Zahlungslink
68
+ * (`createPaymentLinkStripe`: den Link kennt nur die Antwort, ein nie
69
+ * zugestellter Link wird nie bezahlt; Geld bewegt erst die Zahlung bzw.
70
+ * `stripeCaptureIntent`).
71
+ *
72
+ * Probelaeufe (`previewGoodsReceipt`, `previewInvoice`) teilen den Namen mit
73
+ * dem echten Aufruf und stehen darum nicht hier; die Huellen setzen fuer sie
74
+ * `hasEffect: false` beim Aufruf, das nur zusammen mit `dryRun: true` gilt
75
+ * (siehe `TransportCallOptions`).
76
+ *
77
+ * Paketintern; nicht Teil der Paketoberflaeche.
78
+ */
79
+ export declare const CALLS_WITHOUT_EFFECT: Readonly<Record<string, CallWithoutEffectReason>>;
80
+ /**
81
+ * Hat dieser Aufruf Wirkung, ist sein Ausgang nach Zeitlimit, Netzfehler,
82
+ * HTTP 5xx oder unlesbarer Erfolgsantwort also unklar? `financeWebService`
83
+ * zaehlt mit jedem Vorgang. Ein Name, den dieses Paket nicht kennt (der
84
+ * offene Transport nimmt jeden), ist `false`; wer so einen Aufruf mit Wirkung
85
+ * absetzt, sagt es mit `hasEffect: true`.
86
+ */
87
+ export declare function isUnknownOutcomeCall(name: string): boolean;
34
88
  /** Einer der 28 Aufrufe des Kassenwegs. */
35
89
  export declare function isPosCall(name: string): boolean;
36
90
  /**
@@ -40,6 +94,6 @@ export declare function isPosCall(name: string): boolean;
40
94
  */
41
95
  export declare function isPosOnlyCall(name: string): boolean;
42
96
  /** Wie [KasseneckTransport], nur mit bekanntem Aufrufnamen. Nicht exportiert nach aussen. */
43
- export type InternerTransport = <T = unknown>(functionName: ApiCall, params?: Record<string, unknown>, extraBodyFields?: TransportBodyFields, secretParams?: readonly string[]) => Promise<T>;
97
+ export type InternerTransport = <T = unknown>(functionName: ApiCall, params?: Record<string, unknown>, extraBodyFields?: TransportBodyFields, secretParams?: readonly string[], options?: TransportCallOptions) => Promise<T>;
44
98
  /** Wie [KasseneckBinaryTransport], nur mit bekanntem Aufrufnamen. */
45
99
  export type InternerBinaerTransport = (functionName: ApiCall, params?: Record<string, unknown>) => Promise<Uint8Array>;
@@ -99,6 +99,12 @@ export const ALL_CALLS = [
99
99
  'releaseReservation',
100
100
  'getReservation',
101
101
  'listReservations',
102
+ // Lager-API Varianten (Stufe 5c, ./inventory)
103
+ 'createVariantGroup',
104
+ 'updateVariantGroup',
105
+ 'getVariantGroup',
106
+ 'listVariantGroups',
107
+ 'addVariant',
102
108
  ];
103
109
  /**
104
110
  * Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
@@ -199,6 +205,12 @@ export const PUBLIC_CALLS = [
199
205
  'releaseReservation',
200
206
  'getReservation',
201
207
  'listReservations',
208
+ // Lager-API Varianten (Backend Stufe 5c), umhuellt in `./inventory`.
209
+ 'createVariantGroup',
210
+ 'updateVariantGroup',
211
+ 'getVariantGroup',
212
+ 'listVariantGroups',
213
+ 'addVariant',
202
214
  ];
203
215
  /**
204
216
  * Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
@@ -237,6 +249,177 @@ export const POS_CALLS = [
237
249
  'listMyStock',
238
250
  'setMyCashregisterStockLocation',
239
251
  ];
252
+ /**
253
+ * Die Aufrufe **mit Wirkung**, alphabetisch: sie legen etwas an, aendern oder
254
+ * loeschen es, buchen, signieren, bewegen Geld oder senden etwas hinaus
255
+ * (Mail, Druckjob, Probesendung). Scheitert einer, nachdem die Anfrage
256
+ * unterwegs war (Netzfehler, Zeitlimit, HTTP 5xx, unlesbare Erfolgsantwort,
257
+ * HTML mit Kennzeichen), meldet der Transport `outcome: 'unknown'`: der
258
+ * Vorgang kann ausgefuehrt sein.
259
+ *
260
+ * Bis 1.5.0 galt das nur fuer die sechs signierenden und geldbewegenden
261
+ * Aufrufe; ein Wareneingang oder eine Rechnung nach einem Zeitlimit kam als
262
+ * `'rejected'` an, und wer das glaubte und mit NEUEM Idempotenzschluessel
263
+ * neu sendete, buchte doppelt.
264
+ *
265
+ * Geht als `unknownOutcomeCalls` in den Vertrag (`fixtures/surface.json`);
266
+ * der Dart-Zwilling prueft seine Liste dagegen. Jeder Aufruf aus
267
+ * [ALL_CALLS], [PUBLIC_CALLS] und [POS_CALLS] steht entweder hier oder in
268
+ * [CALLS_WITHOUT_EFFECT] (Waechter `test/ausgang-einordnung.test.ts`).
269
+ */
270
+ export const UNKNOWN_OUTCOME_CALLS = [
271
+ 'activateCashregister',
272
+ 'addVariant',
273
+ 'cancelInvoice',
274
+ 'cancelReceipt',
275
+ 'changeStockCondition',
276
+ 'createArticle',
277
+ 'createCreditNote',
278
+ 'createCustomer',
279
+ 'createCustomerCashregister',
280
+ 'createInvoiceItem',
281
+ 'createPartnerCustomer',
282
+ 'createPartnerWebhook',
283
+ 'createPrintJob',
284
+ 'createReceipt',
285
+ 'createReservation',
286
+ 'createVariantGroup',
287
+ 'createWebhook',
288
+ 'deactivateArticle',
289
+ 'deletePartnerWebhook',
290
+ 'deleteWebhook',
291
+ 'extendReservation',
292
+ 'financeWebService',
293
+ 'hobexPayApi',
294
+ 'hobexRefundApi',
295
+ 'issueInvoice',
296
+ 'pairRegisterDevice',
297
+ 'receiveGoods',
298
+ 'recordInvoicePayment',
299
+ 'recordStockLoss',
300
+ 'releaseReservation',
301
+ 'reportCustomerContract',
302
+ 'requestCustomerSignature',
303
+ 'reverseStockMovement',
304
+ 'revokeCustomerMandate',
305
+ 'rotatePartnerWebhookSecret',
306
+ 'rotateWebhookSecret',
307
+ 'sendPartnerCustomerFonLink',
308
+ 'sendPartnerWebhookTest',
309
+ 'sendReceiptEmail',
310
+ 'sendWebhookTest',
311
+ 'setCustomerMandate',
312
+ 'setMyCashregisterStockLocation',
313
+ 'setMyKasseLogo',
314
+ 'setMyKasseSettings',
315
+ 'setMyRegisterDeviceSettings',
316
+ 'stripeCaptureIntent',
317
+ 'transferStock',
318
+ 'unpairRegisterDevice',
319
+ 'updateArticle',
320
+ 'updateCustomer',
321
+ 'updateInvoiceItem',
322
+ 'updatePartnerWebhook',
323
+ 'updateVariantGroup',
324
+ 'updateWebhook',
325
+ 'withdrawInvoiceItem',
326
+ ];
327
+ /**
328
+ * Die Aufrufe **ohne Wirkung**, je mit Grund. Bei ihnen bleibt es bei
329
+ * `outcome: 'rejected'`, auch nach Zeitlimit, Netzfehler oder HTTP 5xx; eine
330
+ * Wiederholung bucht nichts doppelt:
331
+ *
332
+ * - `read`: reines Lesen (auch Berichte, Dateien, `generateFullReceiptId`,
333
+ * das nur einen Link-Schluessel ableitet, und `getCustomerCredentials`,
334
+ * dessen Abruf das Backend nur mitschreibt).
335
+ * - `repeatable`: legt etwas an, das ohne die verlorene Antwort niemand
336
+ * erreicht und das von selbst verfaellt, und bucht nichts. Die Sitzung der
337
+ * Kassen-Anmeldung (anmelden, verlaengern, abmelden: eine Wiederholung legt
338
+ * hoechstens eine weitere kurzlebige Sitzung an bzw. verlaengert oder
339
+ * beendet dieselbe noch einmal) und der Stripe-Zahlungslink
340
+ * (`createPaymentLinkStripe`: den Link kennt nur die Antwort, ein nie
341
+ * zugestellter Link wird nie bezahlt; Geld bewegt erst die Zahlung bzw.
342
+ * `stripeCaptureIntent`).
343
+ *
344
+ * Probelaeufe (`previewGoodsReceipt`, `previewInvoice`) teilen den Namen mit
345
+ * dem echten Aufruf und stehen darum nicht hier; die Huellen setzen fuer sie
346
+ * `hasEffect: false` beim Aufruf, das nur zusammen mit `dryRun: true` gilt
347
+ * (siehe `TransportCallOptions`).
348
+ *
349
+ * Paketintern; nicht Teil der Paketoberflaeche.
350
+ */
351
+ export const CALLS_WITHOUT_EFFECT = Object.freeze({
352
+ checkPartnerCustomerEmail: 'read',
353
+ downloadDailyReport: 'read',
354
+ downloadReceipt: 'read',
355
+ downloadReport: 'read',
356
+ createPaymentLinkStripe: 'repeatable',
357
+ endRegisterSession: 'repeatable',
358
+ generateFullReceiptId: 'read',
359
+ getArticle: 'read',
360
+ getCustomer: 'read',
361
+ getCustomerCredentials: 'read',
362
+ getCustomerSignatureStatus: 'read',
363
+ getFirstReceiptDate: 'read',
364
+ getInvoice: 'read',
365
+ getInvoiceItem: 'read',
366
+ getInvoicePdf: 'read',
367
+ getInvoiceSetupStatus: 'read',
368
+ getInvoiceXml: 'read',
369
+ getKasseSettings: 'read',
370
+ getPartnerBilling: 'read',
371
+ getPartnerBillingMonth: 'read',
372
+ getPartnerCustomer: 'read',
373
+ getPartnerInfo: 'read',
374
+ getPrintJob: 'read',
375
+ getReceipt: 'read',
376
+ getReportV2: 'read',
377
+ getReservation: 'read',
378
+ getStock: 'read',
379
+ getVariantGroup: 'read',
380
+ hobexGetStatus: 'read',
381
+ listArticles: 'read',
382
+ listBrands: 'read',
383
+ listCustomerCashregisters: 'read',
384
+ listInvoiceItems: 'read',
385
+ listInvoices: 'read',
386
+ listLocations: 'read',
387
+ listMyArticleGroups: 'read',
388
+ listMyArticles: 'read',
389
+ listMyCashregisters: 'read',
390
+ listMyPrinters: 'read',
391
+ listMyReceipts: 'read',
392
+ listMyStock: 'read',
393
+ listMyStockLocations: 'read',
394
+ listMyTipRecipients: 'read',
395
+ listPartnerCustomers: 'read',
396
+ listPartnerWebhookDeliveries: 'read',
397
+ listPartnerWebhooks: 'read',
398
+ listRegisterSessionsForDevice: 'read',
399
+ listRegisterUsersForDevice: 'read',
400
+ listReservations: 'read',
401
+ listStock: 'read',
402
+ listStockMovements: 'read',
403
+ listVariantGroups: 'read',
404
+ listWebhookDeliveries: 'read',
405
+ listWebhooks: 'read',
406
+ lookupArticleByCode: 'read',
407
+ registerPinLogin: 'repeatable',
408
+ registerUserLogin: 'repeatable',
409
+ renewRegisterSession: 'repeatable',
410
+ searchCustomers: 'read',
411
+ });
412
+ const MIT_WIRKUNG = new Set(UNKNOWN_OUTCOME_CALLS);
413
+ /**
414
+ * Hat dieser Aufruf Wirkung, ist sein Ausgang nach Zeitlimit, Netzfehler,
415
+ * HTTP 5xx oder unlesbarer Erfolgsantwort also unklar? `financeWebService`
416
+ * zaehlt mit jedem Vorgang. Ein Name, den dieses Paket nicht kennt (der
417
+ * offene Transport nimmt jeden), ist `false`; wer so einen Aufruf mit Wirkung
418
+ * absetzt, sagt es mit `hasEffect: true`.
419
+ */
420
+ export function isUnknownOutcomeCall(name) {
421
+ return MIT_WIRKUNG.has(name);
422
+ }
240
423
  const OEFFENTLICH = new Set(PUBLIC_CALLS);
241
424
  const KASSENWEG = new Set(POS_CALLS);
242
425
  const NUR_KASSE = new Set(POS_CALLS.filter((name) => !OEFFENTLICH.has(name)));
@@ -25,20 +25,27 @@
25
25
  * **Entscheidend ist `outcome`:** `'rejected'` heisst abgelehnt, nichts
26
26
  * geschehen, Wiederholen hilft nicht. `'unknown'` heisst: der Vorgang kann
27
27
  * ausgefuehrt sein (bei `createReceipt` ein signierter Beleg). Dann **nie
28
- * wiederholen**, sondern das Ergebnis nachlesen (Belegliste, `getReceipt`).
28
+ * blind wiederholen**: Belege, Stornos und Zahlungen nachlesen
29
+ * (Belegliste, `getReceipt`, Terminal-Beleg); ein Aufruf mit
30
+ * `idempotencyKey` (Lager schreiben, Rechnung, Partner-Betrieb mit
31
+ * Schluessel) darf mit **demselben** Schluessel erneut gesendet werden und
32
+ * wirkt genau einmal, nie mit einem neuen. `createInvoiceItem` erkennt die
33
+ * Wiederholung an `source` + `reference` (dieselben Werte erneut senden);
34
+ * Posten aendern oder zurueckziehen und Mandate haben keinen Schluessel:
35
+ * erst nachlesen.
29
36
  * - `KasseneckHttpError` — die Antwort war **keine** verwertbare Huelle:
30
37
  * HTTP 500/404 ohne Huelle, leerer Rumpf oder Text statt JSON. Beim
31
38
  * Bericht-Download gelten dieselben Gruende fuer alles, was kein PDF ist.
32
39
  * `reason` trennt die Faelle maschinenlesbar. Auf einem Aufruf mit
33
- * Wirkung (signierend oder geldbewegend) hat HTTP 5xx
40
+ * Wirkung (`UNKNOWN_OUTCOME_CALLS` in aufrufe.ts) hat HTTP 5xx
34
41
  * `outcome: 'unknown'`, ebenso HTTP 200 mit Kennzeichen, aber leerem oder
35
42
  * unlesbarem Rumpf.
36
43
  * - `KasseneckNetworkError` — die Antwort kam gar nicht: Netz weg, DNS,
37
44
  * abgebrochene Verbindung oder Zeitueberschreitung (`timedOut`). Auch hier
38
45
  * gilt `outcome`: war die Anfrage schon unterwegs und ist der Aufruf einer
39
- * mit Wirkung (signierend: `createReceipt`, `cancelReceipt`,
40
- * `financeWebService`; geldbewegend: `hobexPayApi`, `hobexRefundApi`,
41
- * `stripeCaptureIntent`), ist er `'unknown'`.
46
+ * mit Wirkung (signieren, Geld bewegen, buchen, ausstellen, anlegen,
47
+ * aendern, loeschen, senden; die Liste `UNKNOWN_OUTCOME_CALLS`), ist er
48
+ * `'unknown'`. Lesen und Probelauf bleiben `'rejected'`.
42
49
  * - `KasseneckAuthError` — es kam nicht einmal zur Anfrage, weil die Anmeldung
43
50
  * scheiterte (fehlende Zugangsdaten, oder der Token-/Sitzungsgeber warf).
44
51
  * In der Browser-Kasse mit ihrer 90-Sekunden-Sitzung ist das Alltag, kein
@@ -106,8 +113,10 @@ export declare function causeDigest(ursache: unknown, geheimnisse: readonly stri
106
113
  export declare function fehlerDetails(daten: unknown, geheimnisse: readonly string[]): Record<string, unknown>;
107
114
  /**
108
115
  * Ausgang eines gescheiterten Aufrufs. `'rejected'`: nichts geschehen.
109
- * `'unknown'`: der Vorgang kann ausgefuehrt sein; nie wiederholen, sondern
110
- * das Ergebnis nachlesen.
116
+ * `'unknown'`: der Vorgang kann ausgefuehrt sein; nie blind wiederholen.
117
+ * Belege, Stornos und Zahlungen nachlesen; ein Aufruf mit `idempotencyKey`
118
+ * nur mit **demselben** Schluessel erneut senden (wirkt genau einmal); ohne
119
+ * Schluessel erst nachlesen.
111
120
  */
112
121
  export type ErrorOutcome = 'unknown' | 'rejected';
113
122
  /**
@@ -195,12 +204,12 @@ export declare class KasseneckHttpError extends Error {
195
204
  /** Maschinenlesbarer Grund — trennt den Rewrite-Fall vom 500er ohne Textparsen. */
196
205
  readonly reason: HttpFailureReason;
197
206
  /**
198
- * `'unknown'` auf einem Aufruf mit Wirkung (`createReceipt`,
199
- * `cancelReceipt`, `financeWebService`, `hobexPayApi`, `hobexRefundApi`,
200
- * `stripeCaptureIntent`) bei HTTP 5xx und bei HTTP 200 mit
201
- * Kennzeichen, aber unlesbarem Rumpf (`empty-body`, `not-json` auch bei
202
- * `text/html`, `missing-status`): der Handler kann gelaufen sein, nie wiederholen,
203
- * sondern nachlesen. Sonst `'rejected'` (auch 4xx).
207
+ * `'unknown'` auf einem Aufruf mit Wirkung (`UNKNOWN_OUTCOME_CALLS`:
208
+ * signieren, Geld bewegen, buchen, ausstellen, anlegen, aendern, loeschen,
209
+ * senden) bei HTTP 5xx und bei HTTP 200 mit Kennzeichen, aber unlesbarem
210
+ * Rumpf (`empty-body`, `not-json` auch bei `text/html`, `missing-status`):
211
+ * der Handler kann gelaufen sein, nie blind wiederholen (siehe
212
+ * [ErrorOutcome]). Sonst `'rejected'` (auch 4xx, Lesen und Probelauf).
204
213
  */
205
214
  readonly outcome: ErrorOutcome;
206
215
  constructor(functionName: string, statusCode: number, contentType: string | undefined, reason: HttpFailureReason, outcome?: ErrorOutcome);
@@ -218,9 +227,10 @@ export declare class KasseneckNetworkError extends Error {
218
227
  /** Code der zugrunde liegenden Ursache, sofern unbedenklich (z. B. `ECONNREFUSED`). */
219
228
  readonly causeCode: string | undefined;
220
229
  /**
221
- * `'unknown'`, wenn die Anfrage schon unterwegs war und der Aufruf signiert
222
- * (`createReceipt`, `cancelReceipt`, `financeWebService`): dann nie
223
- * wiederholen, sondern nachlesen. Sonst `'rejected'`.
230
+ * `'unknown'`, wenn die Anfrage schon unterwegs war und der Aufruf Wirkung
231
+ * hat (`UNKNOWN_OUTCOME_CALLS`): dann nie blind wiederholen (siehe
232
+ * [ErrorOutcome]). Sonst `'rejected'`, auch bei Lesen und Probelauf und
233
+ * wenn schon die Anmeldung das Zeitlimit verbrauchte.
224
234
  */
225
235
  readonly outcome: ErrorOutcome;
226
236
  constructor(functionName: string, timedOut: boolean, timeoutMs: number, cause?: CauseDigest, outcome?: ErrorOutcome);
@@ -273,9 +283,12 @@ export declare class KasseneckValidationError extends Error {
273
283
  export type KasseneckError = KasseneckApiError | KasseneckHttpError | KasseneckNetworkError | KasseneckAuthError | KasseneckValidationError;
274
284
  /**
275
285
  * Ist der Ausgang dieses Fehlers unklar (`outcome === 'unknown'`)? Dann den
276
- * Aufruf **nicht wiederholen**, sondern das Ergebnis nachlesen. Gilt fuer
277
- * jede Fehlerart; nur [KasseneckApiError], [KasseneckHttpError] und
278
- * [KasseneckNetworkError] koennen `'unknown'` sein.
286
+ * Aufruf **nicht blind wiederholen**: Belege, Stornos und Zahlungen
287
+ * nachlesen; einen Aufruf mit `idempotencyKey` nur mit **demselben**
288
+ * Schluessel erneut senden (wirkt genau einmal, ein neuer buchte doppelt);
289
+ * ohne Schluessel erst nachlesen. Gilt fuer jede Fehlerart; nur
290
+ * [KasseneckApiError], [KasseneckHttpError] und [KasseneckNetworkError]
291
+ * koennen `'unknown'` sein.
279
292
  */
280
293
  export declare function isOutcomeUnknown(error: unknown): boolean;
281
294
  export declare function isKasseneckApiError(error: unknown): error is KasseneckApiError;
@@ -25,20 +25,27 @@
25
25
  * **Entscheidend ist `outcome`:** `'rejected'` heisst abgelehnt, nichts
26
26
  * geschehen, Wiederholen hilft nicht. `'unknown'` heisst: der Vorgang kann
27
27
  * ausgefuehrt sein (bei `createReceipt` ein signierter Beleg). Dann **nie
28
- * wiederholen**, sondern das Ergebnis nachlesen (Belegliste, `getReceipt`).
28
+ * blind wiederholen**: Belege, Stornos und Zahlungen nachlesen
29
+ * (Belegliste, `getReceipt`, Terminal-Beleg); ein Aufruf mit
30
+ * `idempotencyKey` (Lager schreiben, Rechnung, Partner-Betrieb mit
31
+ * Schluessel) darf mit **demselben** Schluessel erneut gesendet werden und
32
+ * wirkt genau einmal, nie mit einem neuen. `createInvoiceItem` erkennt die
33
+ * Wiederholung an `source` + `reference` (dieselben Werte erneut senden);
34
+ * Posten aendern oder zurueckziehen und Mandate haben keinen Schluessel:
35
+ * erst nachlesen.
29
36
  * - `KasseneckHttpError` — die Antwort war **keine** verwertbare Huelle:
30
37
  * HTTP 500/404 ohne Huelle, leerer Rumpf oder Text statt JSON. Beim
31
38
  * Bericht-Download gelten dieselben Gruende fuer alles, was kein PDF ist.
32
39
  * `reason` trennt die Faelle maschinenlesbar. Auf einem Aufruf mit
33
- * Wirkung (signierend oder geldbewegend) hat HTTP 5xx
40
+ * Wirkung (`UNKNOWN_OUTCOME_CALLS` in aufrufe.ts) hat HTTP 5xx
34
41
  * `outcome: 'unknown'`, ebenso HTTP 200 mit Kennzeichen, aber leerem oder
35
42
  * unlesbarem Rumpf.
36
43
  * - `KasseneckNetworkError` — die Antwort kam gar nicht: Netz weg, DNS,
37
44
  * abgebrochene Verbindung oder Zeitueberschreitung (`timedOut`). Auch hier
38
45
  * gilt `outcome`: war die Anfrage schon unterwegs und ist der Aufruf einer
39
- * mit Wirkung (signierend: `createReceipt`, `cancelReceipt`,
40
- * `financeWebService`; geldbewegend: `hobexPayApi`, `hobexRefundApi`,
41
- * `stripeCaptureIntent`), ist er `'unknown'`.
46
+ * mit Wirkung (signieren, Geld bewegen, buchen, ausstellen, anlegen,
47
+ * aendern, loeschen, senden; die Liste `UNKNOWN_OUTCOME_CALLS`), ist er
48
+ * `'unknown'`. Lesen und Probelauf bleiben `'rejected'`.
42
49
  * - `KasseneckAuthError` — es kam nicht einmal zur Anfrage, weil die Anmeldung
43
50
  * scheiterte (fehlende Zugangsdaten, oder der Token-/Sitzungsgeber warf).
44
51
  * In der Browser-Kasse mit ihrer 90-Sekunden-Sitzung ist das Alltag, kein
@@ -365,12 +372,12 @@ export class KasseneckHttpError extends Error {
365
372
  /** Maschinenlesbarer Grund — trennt den Rewrite-Fall vom 500er ohne Textparsen. */
366
373
  reason;
367
374
  /**
368
- * `'unknown'` auf einem Aufruf mit Wirkung (`createReceipt`,
369
- * `cancelReceipt`, `financeWebService`, `hobexPayApi`, `hobexRefundApi`,
370
- * `stripeCaptureIntent`) bei HTTP 5xx und bei HTTP 200 mit
371
- * Kennzeichen, aber unlesbarem Rumpf (`empty-body`, `not-json` auch bei
372
- * `text/html`, `missing-status`): der Handler kann gelaufen sein, nie wiederholen,
373
- * sondern nachlesen. Sonst `'rejected'` (auch 4xx).
375
+ * `'unknown'` auf einem Aufruf mit Wirkung (`UNKNOWN_OUTCOME_CALLS`:
376
+ * signieren, Geld bewegen, buchen, ausstellen, anlegen, aendern, loeschen,
377
+ * senden) bei HTTP 5xx und bei HTTP 200 mit Kennzeichen, aber unlesbarem
378
+ * Rumpf (`empty-body`, `not-json` auch bei `text/html`, `missing-status`):
379
+ * der Handler kann gelaufen sein, nie blind wiederholen (siehe
380
+ * [ErrorOutcome]). Sonst `'rejected'` (auch 4xx, Lesen und Probelauf).
374
381
  */
375
382
  outcome;
376
383
  constructor(functionName, statusCode, contentType, reason, outcome = 'rejected') {
@@ -396,9 +403,10 @@ export class KasseneckNetworkError extends Error {
396
403
  /** Code der zugrunde liegenden Ursache, sofern unbedenklich (z. B. `ECONNREFUSED`). */
397
404
  causeCode;
398
405
  /**
399
- * `'unknown'`, wenn die Anfrage schon unterwegs war und der Aufruf signiert
400
- * (`createReceipt`, `cancelReceipt`, `financeWebService`): dann nie
401
- * wiederholen, sondern nachlesen. Sonst `'rejected'`.
406
+ * `'unknown'`, wenn die Anfrage schon unterwegs war und der Aufruf Wirkung
407
+ * hat (`UNKNOWN_OUTCOME_CALLS`): dann nie blind wiederholen (siehe
408
+ * [ErrorOutcome]). Sonst `'rejected'`, auch bei Lesen und Probelauf und
409
+ * wenn schon die Anmeldung das Zeitlimit verbrauchte.
402
410
  */
403
411
  outcome;
404
412
  constructor(functionName, timedOut, timeoutMs, cause = {}, outcome = 'rejected') {
@@ -464,9 +472,12 @@ export class KasseneckValidationError extends Error {
464
472
  }
465
473
  /**
466
474
  * Ist der Ausgang dieses Fehlers unklar (`outcome === 'unknown'`)? Dann den
467
- * Aufruf **nicht wiederholen**, sondern das Ergebnis nachlesen. Gilt fuer
468
- * jede Fehlerart; nur [KasseneckApiError], [KasseneckHttpError] und
469
- * [KasseneckNetworkError] koennen `'unknown'` sein.
475
+ * Aufruf **nicht blind wiederholen**: Belege, Stornos und Zahlungen
476
+ * nachlesen; einen Aufruf mit `idempotencyKey` nur mit **demselben**
477
+ * Schluessel erneut senden (wirkt genau einmal, ein neuer buchte doppelt);
478
+ * ohne Schluessel erst nachlesen. Gilt fuer jede Fehlerart; nur
479
+ * [KasseneckApiError], [KasseneckHttpError] und [KasseneckNetworkError]
480
+ * koennen `'unknown'` sein.
470
481
  */
471
482
  export function isOutcomeUnknown(error) {
472
483
  return ((error instanceof KasseneckApiError || error instanceof KasseneckHttpError || error instanceof KasseneckNetworkError)
@@ -1,6 +1,6 @@
1
1
  export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type RegisterUserAuthOptions, apiKeyAuth, registerUserAuth, } from './auth.js';
2
- export { DEFAULT_BASE_URL, POS_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, createTransport, createBinaryTransport, } from './transport.js';
3
- export { ALL_CALLS, type ApiCall, PUBLIC_CALLS, POS_CALLS, type PublicCall, type PosCall, } from './aufrufe.js';
2
+ export { DEFAULT_BASE_URL, POS_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type TransportCallOptions, type KasseneckTransport, type KasseneckBinaryTransport, createTransport, createBinaryTransport, } from './transport.js';
3
+ export { ALL_CALLS, type ApiCall, PUBLIC_CALLS, POS_CALLS, UNKNOWN_OUTCOME_CALLS, type PublicCall, type PosCall, } from './aufrufe.js';
4
4
  export { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, type ErrorOutcome, CLIENT_ERROR_CODES, type ClientErrorCode, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, isOutcomeUnknown, } from './errors.js';
5
5
  export { type ReceiptCommonOptions, type SellReceiptOptions, type TipOptions, type TipRecipientShare, type CancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, paymentsExpectedCents, cardRefundReference, receiptLayoutFromResult, cancelReceipt, type CancelReceiptResult, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, checkVoucherCombinationError, type SendReceiptEmailOptions, type SendReceiptEmailResult, sendReceiptEmail, } from './receipts.js';
6
6
  export { listMyCashregisters } from './cashregisters.js';
@@ -1,6 +1,6 @@
1
1
  export { apiKeyAuth, registerUserAuth, } from './auth.js';
2
2
  export { DEFAULT_BASE_URL, POS_BASE_URL, DEFAULT_TIMEOUT_MS, createTransport, createBinaryTransport, } from './transport.js';
3
- export { ALL_CALLS, PUBLIC_CALLS, POS_CALLS, } from './aufrufe.js';
3
+ export { ALL_CALLS, PUBLIC_CALLS, POS_CALLS, UNKNOWN_OUTCOME_CALLS, } from './aufrufe.js';
4
4
  export { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, CLIENT_ERROR_CODES, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, isOutcomeUnknown, } from './errors.js';
5
5
  export { sellReceipt, sellReceiptWithCompany, paymentsExpectedCents, cardRefundReference, receiptLayoutFromResult, cancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, checkVoucherCombinationError, sendReceiptEmail, } from './receipts.js';
6
6
  export { listMyCashregisters } from './cashregisters.js';
@@ -33,6 +33,12 @@ import { type KasseneckAuth } from './auth.js';
33
33
  * **Kein Wiederholen fehlgeschlagener Aufrufe.** Ein Beleg ist nicht folgenlos
34
34
  * wiederholbar; ohne entschiedene Idempotenz waere ein automatischer zweiter
35
35
  * Versuch ein zweiter Beleg.
36
+ *
37
+ * **Ausgang je Aufruf.** Ob ein Scheitern nach dem Senden `outcome: 'unknown'`
38
+ * traegt, haengt am Aufruf: mit Wirkung ([UNKNOWN_OUTCOME_CALLS] in
39
+ * aufrufe.ts) ja, Lesen und Probelauf nein. Ein Probelauf traegt denselben
40
+ * Namen wie der echte Aufruf; die Huelle sagt es darum beim Aufruf
41
+ * (`hasEffect: false`, [TransportCallOptions]).
36
42
  */
37
43
  /** Basis-URL der oeffentlichen API (Produktion). */
38
44
  export declare const DEFAULT_BASE_URL = "https://api.kasseneck.at/v3";
@@ -151,7 +157,27 @@ export interface TransportBodyFields {
151
157
  /** Vorgangsart von `financeWebService` (z. B. `status_cashbox`). */
152
158
  method?: string;
153
159
  }
154
- export type KasseneckTransport = <T = unknown>(functionName: string, params?: Record<string, unknown>, extraBodyFields?: TransportBodyFields, secretParams?: readonly string[]) => Promise<T>;
160
+ /**
161
+ * Einstellungen fuer **einen** Aufruf, die nicht mitgesendet werden.
162
+ */
163
+ export interface TransportCallOptions {
164
+ /**
165
+ * Hat dieser Aufruf Wirkung? Entscheidet den Ausgang, wenn er scheitert,
166
+ * nachdem die Anfrage unterwegs war (Netzfehler, Zeitlimit, HTTP 5xx,
167
+ * unlesbare Erfolgsantwort, HTML mit Kennzeichen): `true` ergibt
168
+ * `outcome: 'unknown'`. Ohne Angabe gilt die Liste des Pakets
169
+ * (`UNKNOWN_OUTCOME_CALLS`); ein Name, den sie nicht kennt, gilt dann als
170
+ * ohne Wirkung.
171
+ *
172
+ * `true` fuer einen Aufruf mit Wirkung, den dieses Paket nicht kennt.
173
+ * `false` gilt **nur zusammen mit `params.dryRun === true`** (Probelauf
174
+ * unter dem Namen des echten Aufrufs, schreibt nichts) und ergibt dann
175
+ * `'rejected'`; ohne `dryRun: true` bleibt ein Aufruf aus der Liste
176
+ * `'unknown'`, was immer hier steht.
177
+ */
178
+ hasEffect?: boolean;
179
+ }
180
+ export type KasseneckTransport = <T = unknown>(functionName: string, params?: Record<string, unknown>, extraBodyFields?: TransportBodyFields, secretParams?: readonly string[], options?: TransportCallOptions) => Promise<T>;
155
181
  /**
156
182
  * Ruft eine Backend-Funktion auf, die **Binaerdaten** liefert (die beiden
157
183
  * Bericht-PDFs), und gibt sie als `Uint8Array` zurueck.