@kreiseck/kasseneck-api 1.19.0 → 1.20.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 (53) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +70 -1
  3. package/dist/cjs/client/api.d.ts +19 -0
  4. package/dist/cjs/client/api.js +18 -0
  5. package/dist/cjs/client/aufrufe.d.ts +5 -3
  6. package/dist/cjs/client/aufrufe.js +20 -0
  7. package/dist/cjs/client/dep-export.d.ts +242 -0
  8. package/dist/cjs/client/dep-export.js +336 -0
  9. package/dist/cjs/client/index.d.ts +2 -1
  10. package/dist/cjs/client/index.js +21 -2
  11. package/dist/cjs/client/transport.d.ts +35 -0
  12. package/dist/cjs/client/transport.js +37 -2
  13. package/dist/cjs/index.d.ts +1 -1
  14. package/dist/cjs/index.js +20 -2
  15. package/dist/cjs/stored/vokabular.d.ts +1 -1
  16. package/dist/cjs/stored/vokabular.js +1 -1
  17. package/dist/cjs/version.d.ts +1 -1
  18. package/dist/cjs/version.js +1 -1
  19. package/dist/esm/client/api.d.ts +19 -0
  20. package/dist/esm/client/api.js +19 -1
  21. package/dist/esm/client/aufrufe.d.ts +5 -3
  22. package/dist/esm/client/aufrufe.js +20 -0
  23. package/dist/esm/client/dep-export.d.ts +242 -0
  24. package/dist/esm/client/dep-export.js +325 -0
  25. package/dist/esm/client/index.d.ts +2 -1
  26. package/dist/esm/client/index.js +2 -1
  27. package/dist/esm/client/transport.d.ts +35 -0
  28. package/dist/esm/client/transport.js +36 -2
  29. package/dist/esm/index.d.ts +1 -1
  30. package/dist/esm/index.js +1 -1
  31. package/dist/esm/stored/vokabular.d.ts +1 -1
  32. package/dist/esm/stored/vokabular.js +1 -1
  33. package/dist/esm/version.d.ts +1 -1
  34. package/dist/esm/version.js +1 -1
  35. package/fixtures/hobex-hps-codes.json +1 -1
  36. package/fixtures/invoice-api.schema.json +1 -1
  37. package/fixtures/invoice-texts.json +1 -1
  38. package/fixtures/pos-texts.json +1 -1
  39. package/fixtures/surface.json +12 -2
  40. package/fixtures/v3/antworten/belege.json +1 -1
  41. package/fixtures/v3/antworten/belegmail.json +1 -1
  42. package/fixtures/v3/antworten/berichte.json +1 -1
  43. package/fixtures/v3/antworten/kasse-belege.json +1 -1
  44. package/fixtures/v3/antworten/kasse.json +2 -2
  45. package/fixtures/v3/antworten/lager.json +1 -1
  46. package/fixtures/v3/antworten/rechnungen.json +1 -1
  47. package/fixtures/v3/antworten/storno.json +1 -1
  48. package/fixtures/v3/stored/belege.json +1 -1
  49. package/fixtures/v3/stored/kasse.json +2 -2
  50. package/fixtures/v3/stored/rechnungen.json +1 -1
  51. package/fixtures/v3/v3-vokabular.json +140 -8
  52. package/fixtures/v3/zahlbetrag-faelle.json +1 -1
  53. package/package.json +1 -1
@@ -7,4 +7,4 @@ exports.PACKAGE_VERSION = void 0;
7
7
  * Client-Version, Nachtrag §6). Ein Test haelt sie gleich mit `package.json`;
8
8
  * beim Anheben der Version beide Stellen aendern.
9
9
  */
10
- exports.PACKAGE_VERSION = '1.19.0';
10
+ exports.PACKAGE_VERSION = '1.20.0';
@@ -4,6 +4,7 @@ import { type HobexPayOptions, type HobexRefundOptions } from '../payments/hobex
4
4
  import { type TransportOptions } from './transport.js';
5
5
  import { type CashregisterReportPeriod, type ReportV2, type ReportV2Options } from './reports.js';
6
6
  import { type CashboxStatus, type SignatureStatus } from './status.js';
7
+ import { type CreateDepExportOptions, type CreateDepExportResult, type DepExport, type DepExportFile, type DepHandoverLink, type GetDepExportFileOptions, type RevokedDepHandoverLink, type WaitForDepExportOptions } from './dep-export.js';
7
8
  import { type ListedReceipt, type ListReceiptsOptions, type ListReceiptsPage, type ListReceiptsView } from './list-receipts.js';
8
9
  import { type SendReceiptEmailOptions, type SendReceiptEmailResult, type LogReceiptOutputsOptions, type LogReceiptOutputsResult, type ListMyReceiptsOptions, type ReceiptList, type ReceiptWithCompany, type SellReceiptOptions, type CancelReceiptOptions, type CancelReceiptResult } from './receipts.js';
9
10
  /**
@@ -61,6 +62,24 @@ export interface KasseneckApi {
61
62
  listReceipts<V extends ListReceiptsView = 'summary'>(options: ListReceiptsOptions<V>): Promise<ListReceiptsPage<V>>;
62
63
  /** Alle Belege eines Tages oder Zeitraums, Seite fuer Seite geholt (hoechstens 100 Seiten). */
63
64
  listAllReceipts<V extends ListReceiptsView = 'summary'>(options: ListReceiptsOptions<V>): AsyncGenerator<ListedReceipt<V>, void, undefined>;
65
+ /** DEP-Export fuer die Kassennachschau einstellen (`createDepExport`, nur /v3); antwortet sofort, der Export laeuft im Hintergrund. */
66
+ createDepExport(options?: CreateDepExportOptions): Promise<CreateDepExportResult>;
67
+ /** Zustand, Kennzahlen, Befund und Pruefer-Links eines Exports (`getDepExport`). */
68
+ getDepExport(options: {
69
+ exportId: string;
70
+ }): Promise<DepExport>;
71
+ /** Wartet, bis der Export fertig ist (Abfrage 2 s, x1,5, hoechstens 15 s; Vorgabe 10 Minuten). */
72
+ waitForDepExport(options: WaitForDepExportOptions): Promise<DepExport>;
73
+ /** Eine Datei des Exports (dep, protocol, items, zip) laden und gegen die SHA-256-Summe pruefen. */
74
+ getDepExportFile(options: GetDepExportFileOptions): Promise<DepExportFile>;
75
+ /** Pruefer-Link (Adresse und 6-stelliger Code, 14 Tage) zu einem fertigen Export. */
76
+ createDepHandoverLink(options: {
77
+ exportId: string;
78
+ }): Promise<DepHandoverLink>;
79
+ /** Pruefer-Link der eigenen Kasse widerrufen. */
80
+ revokeDepHandoverLink(options: {
81
+ linkId: string;
82
+ }): Promise<RevokedDepHandoverLink>;
64
83
  /** Kassenbericht als PDF (v2): abgeschlossener Monat, Tag oder Zeitraum (Endpunkt `getCashregisterReport`). */
65
84
  getCashregisterReport(options: CashregisterReportPeriod): Promise<Uint8Array>;
66
85
  /** @deprecated Since 1.10.0: use getCashregisterReport. Tagesbericht als PDF (Kalendertag nach Wiener Zeit). */
@@ -1,8 +1,9 @@
1
1
  import { createStripeLink, stripeCaptureIntent, } from '../payments/stripe.js';
2
2
  import { hobexPay, hobexRefund } from '../payments/hobex.js';
3
- import { createTransport, createBinaryTransport } from './transport.js';
3
+ import { createTransport, createBinaryTransport, createFileOrDataTransport } from './transport.js';
4
4
  import { downloadDailyReport, downloadMonthlyReport, getCashregisterReport, getReportV2 } from './reports.js';
5
5
  import { getCashboxStatus, getSignatureStatus } from './status.js';
6
+ import { createDepExport, createDepHandoverLink, getDepExport, getDepExportFile, revokeDepHandoverLink, waitForDepExport, } from './dep-export.js';
6
7
  import { listAllReceipts, listReceipts } from './list-receipts.js';
7
8
  import { sellReceipt, sellReceiptWithCompany, cancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, sendReceiptEmail, logReceiptOutputs, } from './receipts.js';
8
9
  import { listMyCashregisters } from './cashregisters.js';
@@ -12,6 +13,17 @@ export function createKasseneckApi(options) {
12
13
  // Zweiter Einstiegspunkt fuer die PDF-Downloads; dieselben Optionen,
13
14
  // dieselbe Anmeldung — nur die Antwort wird als Bytes gelesen.
14
15
  const rufenBinaer = createBinaryTransport(options);
16
+ // Fuer Dateien beliebiger Art (DEP-Export): Datei oder Lese-Link.
17
+ const rufenDatei = createFileOrDataTransport(options);
18
+ // Das globale fetch erst beim Folgen eines Lese-Links holen: ohne Link braucht es niemand.
19
+ const holen = (url, init) => {
20
+ if (options.fetch)
21
+ return options.fetch(url, init);
22
+ const umgebung = globalThis;
23
+ if (typeof umgebung.fetch !== 'function')
24
+ throw new Error('getDepExportFile: kein globales fetch vorhanden');
25
+ return umgebung.fetch(url, init);
26
+ };
15
27
  return {
16
28
  sellReceipt: (o) => sellReceipt(rufen, o),
17
29
  sellReceiptWithCompany: (o) => sellReceiptWithCompany(rufen, o),
@@ -28,6 +40,12 @@ export function createKasseneckApi(options) {
28
40
  getReportV2: (o) => getReportV2(rufen, o),
29
41
  listReceipts: (o) => listReceipts(rufen, o),
30
42
  listAllReceipts: (o) => listAllReceipts(rufen, o),
43
+ createDepExport: (o) => createDepExport(rufen, o),
44
+ getDepExport: (o) => getDepExport(rufen, o),
45
+ waitForDepExport: (o) => waitForDepExport(rufen, o),
46
+ getDepExportFile: (o) => getDepExportFile(rufenDatei, holen, o),
47
+ createDepHandoverLink: (o) => createDepHandoverLink(rufen, o),
48
+ revokeDepHandoverLink: (o) => revokeDepHandoverLink(rufen, o),
31
49
  getCashregisterReport: (options) => getCashregisterReport(rufenBinaer, options),
32
50
  downloadDailyReport: (date) => downloadDailyReport(rufenBinaer, date),
33
51
  downloadMonthlyReport: (reportMonth) => downloadMonthlyReport(rufenBinaer, reportMonth),
@@ -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 { PdfOrData, 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", "getCashregisterReport", "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", "listReceipts", "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", "createStocktake", "listStocktakes", "getStocktake", "listStocktakeItems", "recordStocktakeCount", "voidStocktakeCount", "listStocktakeCounts", "reviewStocktake", "recountStocktake", "closeStocktake", "cancelStocktake", "getStocktakePdf", "orderSignatureCard", "getSignatureCardOrder", "listMyStocktakes", "listMyStocktakeItems", "listMyStocktakeCounts", "recordMyStocktakeCount", "voidMyStocktakeCount", "checkVoucher", "reprintVoucherLabel", "getMyDrawerState", "openMyShift", "recordMyCashMovement", "logMyDrawerOpenings", "getMyShiftReport", "closeMyShift", "logReceiptOutputs"];
15
+ import type { FileOrData, FileOrDataCallOptions, PdfOrData, TransportBodyFields, TransportCallOptions } from './transport.js';
16
+ export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createDepExport", "createDepHandoverLink", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCashregisterReport", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getDepExport", "getDepExportFile", "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", "listReceipts", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "revokeDepHandoverLink", "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", "createStocktake", "listStocktakes", "getStocktake", "listStocktakeItems", "recordStocktakeCount", "voidStocktakeCount", "listStocktakeCounts", "reviewStocktake", "recountStocktake", "closeStocktake", "cancelStocktake", "getStocktakePdf", "orderSignatureCard", "getSignatureCardOrder", "listMyStocktakes", "listMyStocktakeItems", "listMyStocktakeCounts", "recordMyStocktakeCount", "voidMyStocktakeCount", "checkVoucher", "reprintVoucherLabel", "getMyDrawerState", "openMyShift", "recordMyCashMovement", "logMyDrawerOpenings", "getMyShiftReport", "closeMyShift", "logReceiptOutputs"];
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", "getCashregisterReport", "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", "createStocktake", "listStocktakes", "getStocktake", "listStocktakeItems", "recordStocktakeCount", "voidStocktakeCount", "listStocktakeCounts", "reviewStocktake", "recountStocktake", "closeStocktake", "cancelStocktake", "getStocktakePdf", "orderSignatureCard", "getSignatureCardOrder", "listReceipts"];
24
+ export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "cancelReceipt", "sendReceiptEmail", "generateFullReceiptId", "downloadReceipt", "getFirstReceiptDate", "getReportV2", "downloadReport", "downloadDailyReport", "getCashregisterReport", "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", "createStocktake", "listStocktakes", "getStocktake", "listStocktakeItems", "recordStocktakeCount", "voidStocktakeCount", "listStocktakeCounts", "reviewStocktake", "recountStocktake", "closeStocktake", "cancelStocktake", "getStocktakePdf", "orderSignatureCard", "getSignatureCardOrder", "listReceipts", "createDepExport", "getDepExport", "getDepExportFile", "createDepHandoverLink", "revokeDepHandoverLink"];
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
@@ -99,3 +99,5 @@ export type InternerTransport = <T = unknown>(functionName: ApiCall, params?: Re
99
99
  export type InternerBinaerTransport = (functionName: ApiCall, params?: Record<string, unknown>) => Promise<Uint8Array>;
100
100
  /** Wie `createPdfOrDataTransport` (transport.ts), nur mit bekanntem Aufrufnamen. */
101
101
  export type InternerPdfOderDatenTransport = (functionName: ApiCall, params?: Record<string, unknown>) => Promise<PdfOrData>;
102
+ /** Wie `createFileOrDataTransport` (transport.ts), nur mit bekanntem Aufrufnamen. */
103
+ export type InternerDateiOderDatenTransport = (functionName: ApiCall, params?: Record<string, unknown>, options?: FileOrDataCallOptions) => Promise<FileOrData>;
@@ -5,6 +5,8 @@ export const ALL_CALLS = [
5
5
  'createCreditNote',
6
6
  'createCustomer',
7
7
  'createCustomerCashregister',
8
+ 'createDepExport',
9
+ 'createDepHandoverLink',
8
10
  'createPartnerCustomer',
9
11
  'checkPartnerCustomerEmail',
10
12
  'createPartnerWebhook',
@@ -21,6 +23,8 @@ export const ALL_CALLS = [
21
23
  'getCustomer',
22
24
  'getCustomerCredentials',
23
25
  'getCustomerSignatureStatus',
26
+ 'getDepExport',
27
+ 'getDepExportFile',
24
28
  'getFirstReceiptDate',
25
29
  'getInvoice',
26
30
  'getInvoicePdf',
@@ -59,6 +63,7 @@ export const ALL_CALLS = [
59
63
  'renewRegisterSession',
60
64
  'reportCustomerContract',
61
65
  'requestCustomerSignature',
66
+ 'revokeDepHandoverLink',
62
67
  'searchCustomers',
63
68
  'sendPartnerCustomerFonLink',
64
69
  'sendPartnerWebhookTest',
@@ -265,6 +270,12 @@ export const PUBLIC_CALLS = [
265
270
  'getSignatureCardOrder',
266
271
  // Belege einer Kasse auflisten, nur unter /v3 (Nachfolger von getReportV2 fuer Listen).
267
272
  'listReceipts',
273
+ // DEP-Export fuer die Kassennachschau (Kassen-Token), nur unter /v3.
274
+ 'createDepExport',
275
+ 'getDepExport',
276
+ 'getDepExportFile',
277
+ 'createDepHandoverLink',
278
+ 'revokeDepHandoverLink',
268
279
  ];
269
280
  /**
270
281
  * Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
@@ -449,6 +460,15 @@ export const CALLS_WITHOUT_EFFECT = Object.freeze({
449
460
  getCustomer: 'read',
450
461
  getCustomerCredentials: 'read',
451
462
  getCustomerSignatureStatus: 'read',
463
+ // DEP-Export: ein verlorener Ausgang ist harmlos wiederholbar. createDepExport ist mit requestId idempotent, ohne nur
464
+ // doppelt (Grenze 20 je Tag, keine Buchung). createDepHandoverLink erzeugt bei Wiederholung einen zweiten Link (der
465
+ // alte steht in getDepExport().handoverLinks und ist widerrufbar; Preis hoechstens too_many_links). revokeDepHandoverLink
466
+ // ist idempotent.
467
+ createDepExport: 'repeatable',
468
+ createDepHandoverLink: 'repeatable',
469
+ revokeDepHandoverLink: 'repeatable',
470
+ getDepExport: 'read',
471
+ getDepExportFile: 'read',
452
472
  getFirstReceiptDate: 'read',
453
473
  getInvoice: 'read',
454
474
  getInvoiceItem: 'read',
@@ -0,0 +1,242 @@
1
+ import { KasseneckValidationError } from './errors.js';
2
+ import type { InternerDateiOderDatenTransport, InternerTransport } from './aufrufe.js';
3
+ import type { FetchLike } from './transport.js';
4
+ /**
5
+ * DEP-Export fuer die Kassennachschau (nur unter `/v3`): ein Export des
6
+ * Datenerfassungsprotokolls fuer einen vom Pruefungsorgan vorgegebenen
7
+ * Zeitraum (§ 19 Abs. 2 RKSV), Dateien zum Abholen und ein Pruefer-Link mit
8
+ * Code, ueber den das Pruefungsorgan die Dateien ohne Anmeldung laedt.
9
+ *
10
+ * **Anmeldung wie `listReceipts`:** API-Schluessel plus `cashregister-token`;
11
+ * die Kasse kommt aus dem Token, nie aus einem Parameter. Ein Export einer
12
+ * anderen Kasse ist `export_not_found`.
13
+ *
14
+ * **Ablauf:** `createDepExport` stellt den Export ein und antwortet sofort
15
+ * (`status: 'running'`; eine Wiederholung mit derselben `requestId` nennt den
16
+ * aktuellen Stand); er laeuft im Hintergrund. `waitForDepExport` fragt bis zum
17
+ * Ende, `getDepExportFile` holt eine Datei, `createDepHandoverLink` erzeugt den
18
+ * Link fuer das Pruefungsorgan.
19
+ */
20
+ /** Zustand eines Exports: in Arbeit, fertig oder fehlgeschlagen. */
21
+ export declare const DEP_EXPORT_STATUSES: readonly ["running", "done", "failed"];
22
+ export type DepExportStatus = (typeof DEP_EXPORT_STATUSES)[number];
23
+ /** Die Dateien eines Exports: DEP-JSON, Protokoll (PDF), Positionen (CSV) und alles zusammen als ZIP. */
24
+ export declare const DEP_EXPORT_FILES: readonly ["dep", "protocol", "items", "zip"];
25
+ export type DepExportFileKind = (typeof DEP_EXPORT_FILES)[number];
26
+ /**
27
+ * Fehlercodes der fuenf Aufrufe (`code` des [KasseneckApiError]) wie im
28
+ * Vertrag des Backends (`errorCodes.depExport` in `fixtures/v3/v3-vokabular.json`,
29
+ * Katalog `dep_nachschau`), in dessen Reihenfolge; dazu kommen die gemeinsamen
30
+ * Codes von Anmeldung und Rand. Ein Code ausserhalb bleibt ueber
31
+ * `KasseneckApiError.code` lesbar.
32
+ */
33
+ export declare const DEP_EXPORT_ERROR_CODES: readonly ["validation", "invalid_period", "idempotency_conflict", "export_running", "too_many_exports", "export_not_found", "export_not_ready", "export_failed", "invalid_file", "file_not_available", "too_many_links", "link_not_found", "server_error"];
34
+ /**
35
+ * Warum ein Export fehlgeschlagen ist (`DepExport.error`): die Werte des
36
+ * Katalogs `DEP_EXPORT_FEHLER` im Vertrag. `export_stalled` = nach 35 Minuten
37
+ * nicht fertig.
38
+ */
39
+ export declare const DEP_EXPORT_FAILURES: readonly ["export_failed", "export_stalled"];
40
+ export type DepExportFailure = (typeof DEP_EXPORT_FAILURES)[number];
41
+ /**
42
+ * Codes, die die DEP-Aufrufe als `KasseneckApiError.code` werfen:
43
+ * [DEP_EXPORT_ERROR_CODES] und, aus [waitForDepExport], die Gruende eines
44
+ * fehlgeschlagenen Exports ([DEP_EXPORT_FAILURES], also auch `export_stalled`).
45
+ */
46
+ export type DepExportErrorCode = (typeof DEP_EXPORT_ERROR_CODES)[number] | DepExportFailure;
47
+ /** Eingabe von [createDepExport]. Ohne `from`/`to` der ganze Bestand. */
48
+ export interface CreateDepExportOptions {
49
+ /** Erster Tag (inklusive), `YYYY-MM-DD`, nicht in der Zukunft. */
50
+ from?: string;
51
+ /** Letzter Tag (inklusive), `YYYY-MM-DD`, nicht vor `from`. */
52
+ to?: string;
53
+ /**
54
+ * Wiederholungsschutz je Kasse: derselbe Wert mit demselben Zeitraum
55
+ * liefert denselben Export (mit seinem aktuellen Stand) statt eines zweiten;
56
+ * mit anderem Zeitraum `idempotency_conflict`. Hoechstens 64 Zeichen aus
57
+ * `A-Z a-z 0-9 _ -`. Bei unklarem Ausgang (Zeitlimit) mit **demselben** Wert
58
+ * und demselben Zeitraum wiederholen.
59
+ */
60
+ requestId?: string;
61
+ }
62
+ /** Antwort von [createDepExport]: Kennung und Zustand (bei einer wiederholten `requestId` auch `done`). */
63
+ export interface CreateDepExportResult {
64
+ exportId: string;
65
+ status: DepExportStatus;
66
+ from: string | null;
67
+ to: string | null;
68
+ }
69
+ /** Eine Luecke in der Belegnummerierung: Zaehler von bis (einschliesslich). */
70
+ export interface DepExportGap {
71
+ from: number;
72
+ to: number;
73
+ }
74
+ /** Erster Bruch der Signaturkette: am Zaehler `counter` erwartet, aber gefunden. */
75
+ export interface DepExportChainBreak {
76
+ counter: number | null;
77
+ expected: unknown;
78
+ found: unknown;
79
+ }
80
+ /** Befund der Pruefung des Exports (`DepExport.findings`). */
81
+ export interface DepExportFindings {
82
+ receiptCount: number | null;
83
+ counterFrom: number | null;
84
+ counterTo: number | null;
85
+ /** Fehlende Belegnummern als zusammenhaengende Bereiche. */
86
+ gaps: DepExportGap[];
87
+ /** Hoechstens ein Eintrag: der erste Bruch der Kette. */
88
+ chainBreaks: DepExportChainBreak[];
89
+ /** `receiptId` der Belege ohne Zaehler. */
90
+ withoutCounter: string[];
91
+ /** `receiptId` der Belege ohne Signatur. */
92
+ withoutSignature: string[];
93
+ }
94
+ /** Die Positionsdatei (CSV) eines Exports; `null` bei Exporten aus der Zeit davor. */
95
+ export interface DepExportItems {
96
+ rowCount: number;
97
+ sha256: string;
98
+ size: number;
99
+ }
100
+ /** Ein Pruefer-Link, wie ihn der Export auffuehrt (ohne Adresse und Code). */
101
+ export interface DepHandoverLinkInfo {
102
+ linkId: string;
103
+ createdAt: string | null;
104
+ expiresAt: string | null;
105
+ revokedAt: string | null;
106
+ firstAccessAt: string | null;
107
+ accessCount: number;
108
+ }
109
+ /** Ein Export mit Zustand, Kennzahlen, Befund und Links (`getDepExport`). Zeiten ISO 8601 (UTC). */
110
+ export interface DepExport {
111
+ exportId: string;
112
+ status: DepExportStatus;
113
+ from: string | null;
114
+ to: string | null;
115
+ createdAt: string | null;
116
+ finishedAt: string | null;
117
+ receiptCount: number | null;
118
+ counterFrom: number | null;
119
+ counterTo: number | null;
120
+ /** SHA-256 (hex) der DEP-JSON-Datei. */
121
+ sha256: string | null;
122
+ /** Groesse der DEP-JSON-Datei in Byte. */
123
+ size: number | null;
124
+ findings: DepExportFindings | null;
125
+ items: DepExportItems | null;
126
+ handoverLinks: DepHandoverLinkInfo[];
127
+ /** Nur bei `status: 'failed'`: `export_stalled` (haengend) oder `export_failed`. */
128
+ error?: DepExportFailure;
129
+ }
130
+ /** Eingabe von [waitForDepExport]. */
131
+ export interface WaitForDepExportOptions {
132
+ exportId: string;
133
+ /** Hoechstdauer in Millisekunden (Vorgabe 600.000 = 10 Minuten). */
134
+ timeoutMs?: number;
135
+ }
136
+ /** Eingabe von [getDepExportFile]. */
137
+ export interface GetDepExportFileOptions {
138
+ exportId: string;
139
+ file: DepExportFileKind;
140
+ /**
141
+ * Bekannte SHA-256-Pruefsumme (hex) der Datei, etwa `DepExport.sha256` fuer
142
+ * `dep` oder `DepExport.items.sha256` fuer `items`. Weicht die geladene Datei
143
+ * ab, wirft der Aufruf. Bei einem Lese-Link prueft der Aufruf ausserdem immer
144
+ * gegen die Pruefsumme, die der Server mit dem Link nennt.
145
+ */
146
+ sha256?: string;
147
+ /**
148
+ * Zeitlimit in Millisekunden (Vorgabe 600.000), je fuer den Aufruf selbst und
149
+ * fuer das Laden ueber einen Lese-Link. Der Aufruf liefert eine Datei bis
150
+ * 9 MiB direkt und braucht dafuer mehr als das allgemeine Zeitlimit des
151
+ * Transports (`timeoutMs`, Vorgabe 30 s); es gilt hier nicht.
152
+ */
153
+ downloadTimeoutMs?: number;
154
+ }
155
+ /** Eine geladene, gepruefte Datei. */
156
+ export interface DepExportFile {
157
+ bytes: Uint8Array;
158
+ fileName: string;
159
+ contentType: string;
160
+ /** SHA-256 (hex) der Bytes, vom Paket berechnet. */
161
+ sha256: string;
162
+ }
163
+ /** Ein erzeugter Pruefer-Link (`createDepHandoverLink`). Adresse und Code nur jetzt, danach nie wieder. */
164
+ export interface DepHandoverLink {
165
+ linkId: string;
166
+ /** Adresse fuer das Pruefungsorgan (Token im Fragment). */
167
+ url: string;
168
+ /** 6-stelliger Code, getrennt von der Adresse zu uebergeben. */
169
+ code: string;
170
+ expiresAt: string;
171
+ }
172
+ /** Antwort von [revokeDepHandoverLink]. */
173
+ export interface RevokedDepHandoverLink {
174
+ linkId: string;
175
+ revokedAt: string | null;
176
+ }
177
+ /** Wartezeiten von [waitForDepExport]: 2 s, dann je x1,5, hoechstens 15 s. */
178
+ export declare const DEP_EXPORT_POLL_START_MS = 2000;
179
+ export declare const DEP_EXPORT_POLL_FACTOR = 1.5;
180
+ export declare const DEP_EXPORT_POLL_MAX_MS = 15000;
181
+ /** Vorgabe fuer `waitForDepExport.timeoutMs`. */
182
+ export declare const DEP_EXPORT_WAIT_TIMEOUT_MS = 600000;
183
+ /** Vorgabe fuer `getDepExportFile.downloadTimeoutMs`: der Aufruf selbst und das Laden ueber einen Lese-Link. */
184
+ export declare const DEP_EXPORT_DOWNLOAD_TIMEOUT_MS = 600000;
185
+ /**
186
+ * [waitForDepExport] gab auf, weil der Export nach `timeoutMs` weder fertig
187
+ * noch fehlgeschlagen war. Der Export laeuft serverseitig weiter: mit
188
+ * `getDepExport` (oder erneutem Warten) nachsehen, nicht neu anstossen.
189
+ */
190
+ export declare class DepExportTimeoutError extends Error {
191
+ readonly name = "DepExportTimeoutError";
192
+ readonly exportId: string;
193
+ readonly timeoutMs: number;
194
+ /** Zustand bei der letzten Abfrage. */
195
+ readonly lastStatus: DepExportStatus;
196
+ constructor(exportId: string, timeoutMs: number, lastStatus: DepExportStatus);
197
+ }
198
+ /** Das Ergebnis stimmt nicht mit der Pruefsumme ueberein: die Datei ist nicht zu verwenden. */
199
+ export declare class DepExportChecksumError extends KasseneckValidationError {
200
+ readonly expected: string;
201
+ readonly actual: string;
202
+ constructor(exportId: string, file: DepExportFileKind, expected: string, actual: string);
203
+ }
204
+ /**
205
+ * Stellt einen DEP-Export ein (`createDepExport`) und antwortet sofort mit
206
+ * `status: 'running'`. Hoechstens ein laufender Export je Kasse
207
+ * (`export_running`, `details.exportId` nennt ihn). Mit `requestId` ist der
208
+ * Aufruf wiederholbar: dieselbe Kennung mit demselben Zeitraum liefert den
209
+ * bestehenden Export mit seinem aktuellen Stand (auch `done` oder `failed`),
210
+ * mit anderem Zeitraum `idempotency_conflict`.
211
+ */
212
+ export declare function createDepExport(transport: InternerTransport, options?: CreateDepExportOptions): Promise<CreateDepExportResult>;
213
+ /** Zustand, Kennzahlen, Befund und Links eines Exports (`getDepExport`). */
214
+ export declare function getDepExport(transport: InternerTransport, options: {
215
+ exportId: string;
216
+ }): Promise<DepExport>;
217
+ /**
218
+ * Wartet, bis der Export fertig ist, und gibt ihn zurueck. Fragt mit
219
+ * [DEP_EXPORT_POLL_START_MS] Abstand, dann je x[DEP_EXPORT_POLL_FACTOR],
220
+ * hoechstens [DEP_EXPORT_POLL_MAX_MS]. Bei `failed` wirft er einen
221
+ * [KasseneckApiError] mit `code` `export_failed` oder `export_stalled`
222
+ * (haengender Export); nach `timeoutMs` einen [DepExportTimeoutError]. Ein
223
+ * Fehler beim Abfragen selbst bricht ab.
224
+ */
225
+ export declare function waitForDepExport(transport: InternerTransport, options: WaitForDepExportOptions): Promise<DepExport>;
226
+ /**
227
+ * Holt eine Datei eines fertigen Exports (`getDepExportFile`). Der Server
228
+ * liefert sie bis 9 MiB selbst, darueber als signierten Lese-Link (15 Minuten);
229
+ * dem Link folgt dieser Aufruf und laedt die Bytes. In beiden Faellen ist das
230
+ * Ergebnis dasselbe. Geprueft wird die SHA-256-Summe: beim Lese-Link immer
231
+ * gegen die Summe des Servers, sonst und zusaetzlich gegen `options.sha256`,
232
+ * wenn sie bekannt ist. Eine Abweichung wirft [DepExportChecksumError].
233
+ */
234
+ export declare function getDepExportFile(transport: InternerDateiOderDatenTransport, fetchFn: FetchLike, options: GetDepExportFileOptions): Promise<DepExportFile>;
235
+ /** Erzeugt einen Pruefer-Link zu einem fertigen Export (`createDepHandoverLink`). Gueltig 14 Tage. */
236
+ export declare function createDepHandoverLink(transport: InternerTransport, options: {
237
+ exportId: string;
238
+ }): Promise<DepHandoverLink>;
239
+ /** Widerruft einen Pruefer-Link der eigenen Kasse (`revokeDepHandoverLink`). */
240
+ export declare function revokeDepHandoverLink(transport: InternerTransport, options: {
241
+ linkId: string;
242
+ }): Promise<RevokedDepHandoverLink>;