@kreiseck/kasseneck-api 1.14.0 → 1.16.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 (57) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +72 -2
  3. package/dist/cjs/client/api.d.ts +5 -0
  4. package/dist/cjs/client/api.js +3 -0
  5. package/dist/cjs/client/aufrufe.d.ts +2 -2
  6. package/dist/cjs/client/aufrufe.js +4 -0
  7. package/dist/cjs/client/index.d.ts +1 -0
  8. package/dist/cjs/client/index.js +12 -1
  9. package/dist/cjs/client/list-receipts.d.ts +217 -0
  10. package/dist/cjs/client/list-receipts.js +298 -0
  11. package/dist/cjs/index.d.ts +1 -1
  12. package/dist/cjs/index.js +11 -2
  13. package/dist/cjs/invoice/vertrag.d.ts +1 -1
  14. package/dist/cjs/invoice/vertrag.js +2 -0
  15. package/dist/cjs/models/receipt-errors.d.ts +1 -1
  16. package/dist/cjs/models/receipt-errors.js +3 -0
  17. package/dist/cjs/stored/vokabular.d.ts +1 -1
  18. package/dist/cjs/stored/vokabular.js +14 -2
  19. package/dist/cjs/version.d.ts +1 -1
  20. package/dist/cjs/version.js +1 -1
  21. package/dist/esm/client/api.d.ts +5 -0
  22. package/dist/esm/client/api.js +3 -0
  23. package/dist/esm/client/aufrufe.d.ts +2 -2
  24. package/dist/esm/client/aufrufe.js +4 -0
  25. package/dist/esm/client/index.d.ts +1 -0
  26. package/dist/esm/client/index.js +1 -0
  27. package/dist/esm/client/list-receipts.d.ts +217 -0
  28. package/dist/esm/client/list-receipts.js +292 -0
  29. package/dist/esm/index.d.ts +1 -1
  30. package/dist/esm/index.js +1 -1
  31. package/dist/esm/invoice/vertrag.d.ts +1 -1
  32. package/dist/esm/invoice/vertrag.js +2 -0
  33. package/dist/esm/models/receipt-errors.d.ts +1 -1
  34. package/dist/esm/models/receipt-errors.js +3 -0
  35. package/dist/esm/stored/vokabular.d.ts +1 -1
  36. package/dist/esm/stored/vokabular.js +14 -2
  37. package/dist/esm/version.d.ts +1 -1
  38. package/dist/esm/version.js +1 -1
  39. package/fixtures/hobex-hps-codes.json +1 -1
  40. package/fixtures/invoice-api.schema.json +3 -2
  41. package/fixtures/invoice-texts.json +1 -1
  42. package/fixtures/pos-texts.json +1 -1
  43. package/fixtures/receipt-due-voucher-generated.json +1 -1
  44. package/fixtures/surface.json +6 -3
  45. package/fixtures/v3/antworten/belege.json +1 -1
  46. package/fixtures/v3/antworten/belegmail.json +1 -1
  47. package/fixtures/v3/antworten/kasse-belege.json +1 -1
  48. package/fixtures/v3/antworten/kasse.json +75 -10
  49. package/fixtures/v3/antworten/lager.json +1 -1
  50. package/fixtures/v3/antworten/rechnungen.json +1 -1
  51. package/fixtures/v3/antworten/storno.json +1 -1
  52. package/fixtures/v3/stored/belege.json +1 -1
  53. package/fixtures/v3/stored/kasse.json +151 -381
  54. package/fixtures/v3/stored/rechnungen.json +142 -2
  55. package/fixtures/v3/v3-vokabular.json +103 -11
  56. package/fixtures/v3/zahlbetrag-faelle.json +1 -1
  57. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,27 @@ Was vor 0.7.0 geschah, steht in der Commit-Historie (`git log`); ab hier wird
4
4
  es hier geführt. Ein Eintrag nennt die Änderung **und ihren Grund** —
5
5
  nur der Grund überlebt den nächsten Umbau.
6
6
 
7
+ ## 1.16.0 - 2026-10-28
8
+
9
+ Header data for the full view of `listReceipts`, and the new upper limit of `getReportV2`. Additive.
10
+
11
+ - **`ListReceiptsPage.metadata`** (only with `view: 'full'`): the business data for the receipt header, the same `ReportV2Metadata` as `getReportV2().metadata` (`companyName`, address, `taxNumber`, `vatId`, footers, logo, `label` of the cash register); missing on the summary view. A `metadata` that is not an object is a response error. Reason: an app that prints a receipt again needs the header, and moving from `getReportV2` to `listReceipts` must not lose it.
12
+ - **`getReportV2`: the server now refuses more than 62 calendar days between `start` and `end`** with `range_too_long` (`KasseneckApiError`), without reading any receipt. The package does not check this before sending. Reason: one call could load an unbounded number of receipts; lists belong to `listReceipts`.
13
+ - Contract `v3` from the backend after keck#790.
14
+
15
+ ## 1.15.0 - 2026-10-28
16
+
17
+ Receipt lists page by page: `listReceipts` and `listAllReceipts` for the new public endpoint `listReceipts` (`/v3` only). Additive.
18
+
19
+ - **`listReceipts(options)`** (root and `createKasseneckApi`, `apiKeyAuth` with `cashregister-token` like `getReportV2`) returns one page `{ receipts, hasMore, nextCursor, daySummary? }` (`ListReceiptsPage`). Window: exactly one of `date` (`YYYY-MM-DD`, one Vienna day) or `from` (inclusive) + `to` (exclusive), each `YYYY-MM-DD` or `YYYY-MM-DDTHH:mm:ss` Vienna wall clock, at most 31 calendar days (`LIST_RECEIPTS_DAYS_MAX`); `limit` 1-500 (`LIST_RECEIPTS_LIMIT_MAX`, default 100), `order` `desc`|`asc` (`LIST_RECEIPTS_ORDERS`), `view` `summary`|`full` (`LIST_RECEIPTS_VIEWS`), `cursor` = `nextCursor` of the previous page (same window, order and view; limit may change). Reason: `getReportV2` returns every receipt of any period in one answer, without a limit; a list needs pages with bounded cost per call.
20
+ - **Checked before sending, by the server's rules:** one window form, the date formats (impossible dates such as `2026-02-30`, no zone, no fractions), `to` after `from`, 31 calendar days counted without time zone (also across the change of summer time), `limit` an integer 1-500 (never capped silently), `order`/`view` values, a non-empty `cursor`. A violation throws `KasseneckValidationError` (`scope: 'request'`) and nothing goes out. Reason: a partner should notice a wrong request at once, not after a round trip, and the package rejects what the server rejects.
21
+ - **Separate types per view:** `view: 'summary'` (default) gives `ListReceiptsSummary` rows (`receiptId`, `counter`, `receiptType`, `zeroKind`, `timeStamp`, `totalCents`, `grossByRateCents { standard, reduced1, reduced2, zero, special }`, `paymentMethod`, `payments?`, `tipCents?`, `operator { name } | null`, `cancellationOf { receiptId, timeStamp } | null`, `cancellationReason`, `cancellationStatus`, `signatureOk`, `customProjectId`, `fullReceiptId`), amounts in whole cents; `view: 'full'` gives `Receipt`, the same shape and reader as `getReportV2`. The page type follows `view` (`ListReceiptsPage<'full'>`, `ListedReceipt<V>`). Read leniently like the other lists: an unknown receipt type or payment method stays readable as sent, an unknown `cancellationStatus` reads as `'unknown'` (offer no cancellation then). The name is `ListReceiptsSummary` because `ReceiptSummary` already is the row of `listMyReceipts` (register path, other fields).
22
+ - **`daySummary`** (`ListReceiptsDaySummary`: `date`, `receiptCount`, `revenueCents`, `revenueByRate [{ rateBp, grossCents }]`) only with `date` and only on the first page, `null` when the day has no statistics, absent on later pages. It is not the sum of the list (the count covers every receipt of the day, the revenue only standard and cancellation receipts, without employee tips, after promotion discounts).
23
+ - **`listAllReceipts(options)`**: an `AsyncGenerator` that fetches page after page with the same window, order and view and yields each receipt once, in the server's order; without `limit` it asks for pages of 500, with `cursor` it resumes there. An error on a page ends the loop (receipts already yielded stay valid). After `LIST_ALL_RECEIPTS_MAX_PAGES` (100) pages, or when the server names the same cursor twice, it throws `KasseneckValidationError` (`scope: 'response'`). Reason: a cursor that never ends must not turn into an endless loop of paid reads.
24
+ - **Answer checks:** a page without `receipts`, without boolean `hasMore`, with `hasMore` but no cursor (or a cursor without `hasMore`), or with a `daySummary` that is neither object nor `null` throws `KasseneckValidationError` (`scope: 'response'`).
25
+ - **`LIST_RECEIPTS_ERROR_CODES`**: `invalid_date`, `invalid_range`, `range_too_long`, `invalid_limit`, `invalid_order`, `invalid_view`, `invalid_cursor`, `server_error` (plus the codes of sign-in and edge). `listReceipts` is a read (`outcome: 'rejected'` after a timeout), in `PUBLIC_CALLS` (now 108) and in the contract `surface.json`.
26
+ - Contract re-fetched from the backend (`listReceipts` in `endpoints.public`, schema with `cancellationStatus`/`cancellationReason` catalogues). Also from it: `idempotency_conflict` in `RECEIPT_ERROR_CODES` (readable only; this package sends no `idempotencyKey` on receipts yet), `invoice_number_taken` at the end of `INVOICE_ERROR_CODES` (`fixtures/invoice-api.schema.json` rewritten), and the old settings field `vouchers.label`, which the package does not read (registers before voucher stage 4b).
27
+
7
28
  ## 1.14.0 - 2026-10-23
8
29
 
9
30
  Vouchers at the register, catch-up: the receipt rules of the voucher form, words for the register navigation, the drawer reason of a voucher payout and three shortcut actions; in addition the line `Duplikat am:` on every reprint (`markAsDuplicate`) and the receipt outputs (`logReceiptOutputs`, `outputs` from `getReceipt`, words for the receipt detail). Additive, with one type narrowing (see below).
package/README.md CHANGED
@@ -552,8 +552,9 @@ The facade from `createKasseneckApi` offers `sellReceipt` and
552
552
  `getReceipt` and `getReceiptWithCompany`, `listMyReceipts`, `cancelReceipt`,
553
553
  `sendReceiptEmail`, the report downloads, the FinanzOnline status queries
554
554
  (`getCashboxStatus`, `getSignatureStatus`), `getReportV2({ start, end })` for
555
- the raw receipts and company data of a period, and the Stripe and Hobex cloud
556
- payments.
555
+ the raw receipts and company data of a period, `listReceipts` and
556
+ `listAllReceipts` for receipt lists page by page (see below), and the Stripe
557
+ and Hobex cloud payments.
557
558
 
558
559
  The models are English throughout: the company has `taxNumber` and `vatId`, a
559
560
  receipt `headerVersionId`, `layoutRuleset` and `registrationInfo`, a receipt
@@ -596,6 +597,73 @@ text stays German, and the CSS classes of the React banner stay
596
597
  Times on receipts are read as **Vienna wall-clock time**
597
598
  (`parseServerTimeStamp`), never through `new Date(text)`.
598
599
 
600
+ ### Listing receipts: `listReceipts` and `listAllReceipts`
601
+
602
+ `listReceipts` lists the receipts of the signed-in cash register for one day
603
+ (`date`) or a period (`from` inclusive, `to` exclusive, at most 31 calendar
604
+ days), page by page. Same sign-in as `getReportV2`: `apiKeyAuth` with the API
605
+ key and the `cashregister-token`; the cash register comes from the token.
606
+ Only on `/v3`. Times are Vienna wall-clock text (`YYYY-MM-DD` or
607
+ `YYYY-MM-DDTHH:mm:ss`, no zone), like `timeStamp` on the receipt; a day is a
608
+ calendar day, also when the clocks change. For lists use this instead of
609
+ `getReportV2`, which returns a whole period in one answer and stays for
610
+ reports.
611
+
612
+ ```ts
613
+ import { createKasseneckApi, apiKeyAuth } from '@kreiseck/kasseneck-api';
614
+
615
+ const api = createKasseneckApi({ auth: apiKeyAuth({ apiKey, cashregisterToken }) });
616
+
617
+ // One page (default 100, at most 500), newest first, short lines in cents.
618
+ const page = await api.listReceipts({ date: '2026-10-27', limit: 50 });
619
+ for (const r of page.receipts) console.log(r.counter, r.timeStamp, r.totalCents, r.cancellationStatus);
620
+ console.log(page.daySummary?.revenueCents);
621
+ if (page.hasMore) {
622
+ // Same window, order and view; limit may change.
623
+ const next = await api.listReceipts({ date: '2026-10-27', limit: 50, cursor: page.nextCursor! });
624
+ }
625
+
626
+ // Every receipt of a month, oldest first, as the stored receipt document.
627
+ for await (const receipt of api.listAllReceipts({ from: '2026-10-01', to: '2026-11-01', order: 'asc', view: 'full' })) {
628
+ console.log(receipt.receiptId, receipt.items.length);
629
+ }
630
+ ```
631
+
632
+ - **Options:** exactly one window, `date` or `from` + `to`; `limit` 1-500
633
+ (an integer; the server never caps silently), `order` `desc` (default) or
634
+ `asc`, `view` `summary` (default) or `full`, `cursor` from `nextCursor`.
635
+ The package checks all of this before sending, by the server's rules
636
+ (impossible dates like `2026-02-30`, more than 31 calendar days, `to` not
637
+ after `from`, ...), and throws `KasseneckValidationError` with
638
+ `scope: 'request'`; nothing goes out.
639
+ - **Views:** `summary` returns `ListReceiptsSummary` rows (`receiptId`,
640
+ `counter`, `receiptType`, `zeroKind`, `timeStamp`, `totalCents`,
641
+ `grossByRateCents`, `paymentMethod`, `payments`, `tipCents`, `operator`,
642
+ `cancellationOf`, `cancellationReason`, `cancellationStatus`, `signatureOk`,
643
+ `customProjectId`, `fullReceiptId`); amounts in cents, no items, no layout.
644
+ `full` returns `Receipt`, the same shape as `getReportV2`. For one receipt
645
+ with its print layout use `getReceiptWithCompany`, for the PDF
646
+ `downloadReceipt` with `fullReceiptId`. `ListReceiptsSummary` is not the
647
+ `ReceiptSummary` of `listMyReceipts` (register path, other fields).
648
+ - **`daySummary`** is only there with `date` and only on the first page
649
+ (`null` when the day has no statistics): `receiptCount` counts every
650
+ receipt of the day, `revenueCents` only standard and cancellation receipts,
651
+ without employee tips and after promotion discounts, and `revenueByRate`
652
+ per rate in basis points. It is not the sum of the list; to sum the list,
653
+ sum the list.
654
+ - **`listAllReceipts`** fetches page after page with the same window, `order`
655
+ and `view` and yields each receipt once, in the server's order. Without
656
+ `limit` it asks for pages of 500. An error on any page ends the loop
657
+ (`for await` throws it; receipts already yielded stay valid). After
658
+ `LIST_ALL_RECEIPTS_MAX_PAGES` (100) pages, or when the server repeats a
659
+ cursor, it throws `KasseneckValidationError` (`scope: 'response'`) instead
660
+ of running forever. It does not return `daySummary`.
661
+ - **Errors** (`KasseneckApiError.code`, `LIST_RECEIPTS_ERROR_CODES`):
662
+ `invalid_date`, `invalid_range`, `range_too_long`, `invalid_limit`,
663
+ `invalid_order`, `invalid_view`, `invalid_cursor` (a cursor of another
664
+ cash register or query, or changed window, `order` or `view`),
665
+ `server_error`, plus the codes of sign-in and edge.
666
+
599
667
  ## Cancellation (Storno)
600
668
 
601
669
  A cancellation (*Storno*) refers to the original receipt, in full or in part:
@@ -724,6 +792,8 @@ receipt in 24 hours, 30 per register per hour) and `send_failed`.
724
792
 
725
793
  ## Receipt printing: QR code, logo, printers
726
794
 
795
+ `view: 'full'` returns the stored receipts plus `page.metadata` (business data for the receipt header, the same as `getReportV2().metadata`). `getReportV2` itself accepts at most 62 days between `start` and `end` (`range_too_long`).
796
+
727
797
  ### The QR code fits the paper
728
798
 
729
799
  The native QR command is given a module size in dots and does not check
@@ -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 ListedReceipt, type ListReceiptsOptions, type ListReceiptsPage, type ListReceiptsView } from './list-receipts.js';
7
8
  import { type SendReceiptEmailOptions, type SendReceiptEmailResult, type LogReceiptOutputsOptions, type LogReceiptOutputsResult, type ListMyReceiptsOptions, type ReceiptList, type ReceiptWithCompany, type SellReceiptOptions, type CancelReceiptOptions, type CancelReceiptResult } from './receipts.js';
8
9
  /**
9
10
  * Schlichte Factory ueber den Endpunkt-Funktionen: bindet einen Transport
@@ -56,6 +57,10 @@ export interface KasseneckApi {
56
57
  listMyCashregisters(): Promise<Cashregister[]>;
57
58
  /** Rohdaten eines Zeitraums: Belege und Firmendaten (`getReportV2`). */
58
59
  getReportV2(options: ReportV2Options): Promise<ReportV2>;
60
+ /** Eine Seite Belege eines Tages oder Zeitraums (`listReceipts`, hoechstens 31 Tage, blaetterbar). */
61
+ listReceipts<V extends ListReceiptsView = 'summary'>(options: ListReceiptsOptions<V>): Promise<ListReceiptsPage<V>>;
62
+ /** Alle Belege eines Tages oder Zeitraums, Seite fuer Seite geholt (hoechstens 100 Seiten). */
63
+ listAllReceipts<V extends ListReceiptsView = 'summary'>(options: ListReceiptsOptions<V>): AsyncGenerator<ListedReceipt<V>, void, undefined>;
59
64
  /** Kassenbericht als PDF (v2): abgeschlossener Monat, Tag oder Zeitraum (Endpunkt `getCashregisterReport`). */
60
65
  getCashregisterReport(options: CashregisterReportPeriod): Promise<Uint8Array>;
61
66
  /** @deprecated Since 1.10.0: use getCashregisterReport. Tagesbericht als PDF (Kalendertag nach Wiener Zeit). */
@@ -6,6 +6,7 @@ const hobex_js_1 = require("../payments/hobex.js");
6
6
  const transport_js_1 = require("./transport.js");
7
7
  const reports_js_1 = require("./reports.js");
8
8
  const status_js_1 = require("./status.js");
9
+ const list_receipts_js_1 = require("./list-receipts.js");
9
10
  const receipts_js_1 = require("./receipts.js");
10
11
  const cashregisters_js_1 = require("./cashregisters.js");
11
12
  const session_js_1 = require("../register/session.js");
@@ -28,6 +29,8 @@ function createKasseneckApi(options) {
28
29
  logReceiptOutputs: (o) => (0, receipts_js_1.logReceiptOutputs)(rufen, o),
29
30
  listMyCashregisters: () => (0, cashregisters_js_1.listMyCashregisters)(rufen),
30
31
  getReportV2: (o) => (0, reports_js_1.getReportV2)(rufen, o),
32
+ listReceipts: (o) => (0, list_receipts_js_1.listReceipts)(rufen, o),
33
+ listAllReceipts: (o) => (0, list_receipts_js_1.listAllReceipts)(rufen, o),
31
34
  getCashregisterReport: (options) => (0, reports_js_1.getCashregisterReport)(rufenBinaer, options),
32
35
  downloadDailyReport: (date) => (0, reports_js_1.downloadDailyReport)(rufenBinaer, date),
33
36
  downloadMonthlyReport: (reportMonth) => (0, reports_js_1.downloadMonthlyReport)(rufenBinaer, reportMonth),
@@ -13,7 +13,7 @@
13
13
  * umhuellt, muss ihn weiterhin absetzen koennen.
14
14
  */
15
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", "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"];
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"];
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"];
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"];
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
@@ -55,6 +55,7 @@ exports.ALL_CALLS = [
55
55
  'listPartnerCustomers',
56
56
  'listPartnerWebhookDeliveries',
57
57
  'listPartnerWebhooks',
58
+ 'listReceipts',
58
59
  'listRegisterUsersForDevice',
59
60
  'listRegisterSessionsForDevice',
60
61
  'pairRegisterDevice',
@@ -268,6 +269,8 @@ exports.PUBLIC_CALLS = [
268
269
  'getStocktakePdf',
269
270
  'orderSignatureCard',
270
271
  'getSignatureCardOrder',
272
+ // Belege einer Kasse auflisten, nur unter /v3 (Nachfolger von getReportV2 fuer Listen).
273
+ 'listReceipts',
271
274
  ];
272
275
  /**
273
276
  * Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
@@ -495,6 +498,7 @@ exports.CALLS_WITHOUT_EFFECT = Object.freeze({
495
498
  listPartnerCustomers: 'read',
496
499
  listPartnerWebhookDeliveries: 'read',
497
500
  listPartnerWebhooks: 'read',
501
+ listReceipts: 'read',
498
502
  listRegisterSessionsForDevice: 'read',
499
503
  listRegisterUsersForDevice: 'read',
500
504
  listReservations: 'read',
@@ -4,6 +4,7 @@ export { ALL_CALLS, type ApiCall, PUBLIC_CALLS, POS_CALLS, UNKNOWN_OUTCOME_CALLS
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, type ReceiptOutputEntry, type LogReceiptOutputsOptions, type LogReceiptOutputsResult, type RejectedReceiptOutput, logReceiptOutputs, } from './receipts.js';
6
6
  export { listMyCashregisters } from './cashregisters.js';
7
+ export { listReceipts, listAllReceipts, fromListReceiptsSummaryPayload, LIST_RECEIPTS_VIEWS, LIST_RECEIPTS_ORDERS, LIST_RECEIPTS_LIMIT_MAX, LIST_RECEIPTS_DAYS_MAX, LIST_ALL_RECEIPTS_MAX_PAGES, LIST_RECEIPTS_ERROR_CODES, type ListReceiptsErrorCode, type ListReceiptsView, type ListReceiptsOrder, type ListReceiptsOptions, type ListReceiptsWindow, type ListReceiptsGrossByRate, type ListReceiptsSummary, type ListReceiptsDaySummary, type ListReceiptsPage, type ListedReceipt, } from './list-receipts.js';
7
8
  export { downloadDailyReport, downloadMonthlyReport, getCashregisterReport, getReportV2, type CashregisterReportPeriod, type ReportV2, type ReportV2Metadata, type ReportV2Options } from './reports.js';
8
9
  export { type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, } from './status.js';
9
10
  export { type KasseneckApi, createKasseneckApi } from './api.js';
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createKasseneckApi = exports.getSignatureStatus = exports.getCashboxStatus = exports.getReportV2 = exports.getCashregisterReport = exports.downloadMonthlyReport = exports.downloadDailyReport = exports.listMyCashregisters = exports.logReceiptOutputs = exports.sendReceiptEmail = exports.checkVoucherCombinationError = exports.listMyReceipts = exports.getFirstReceiptDate = exports.generateFullReceiptId = exports.getReceiptWithCompany = exports.getReceipt = exports.zeroReceipt = exports.cancelReceipt = exports.receiptLayoutFromResult = exports.cardRefundReference = exports.paymentsExpectedCents = exports.sellReceiptWithCompany = exports.sellReceipt = exports.isOutcomeUnknown = exports.isKasseneckValidationError = exports.isKasseneckNetworkError = exports.isKasseneckHttpError = exports.isKasseneckAuthError = exports.isKasseneckApiError = exports.CLIENT_ERROR_CODES = exports.KasseneckValidationError = exports.KasseneckNetworkError = exports.KasseneckHttpError = exports.KasseneckAuthError = exports.KasseneckApiError = exports.UNKNOWN_OUTCOME_CALLS = exports.POS_CALLS = exports.PUBLIC_CALLS = exports.ALL_CALLS = exports.createPdfOrDataTransport = exports.createBinaryTransport = exports.createTransport = exports.DEFAULT_TIMEOUT_MS = exports.POS_BASE_URL = exports.DEFAULT_BASE_URL = exports.registerUserAuth = exports.apiKeyAuth = void 0;
3
+ exports.downloadDailyReport = exports.LIST_RECEIPTS_ERROR_CODES = exports.LIST_ALL_RECEIPTS_MAX_PAGES = exports.LIST_RECEIPTS_DAYS_MAX = exports.LIST_RECEIPTS_LIMIT_MAX = exports.LIST_RECEIPTS_ORDERS = exports.LIST_RECEIPTS_VIEWS = exports.fromListReceiptsSummaryPayload = exports.listAllReceipts = exports.listReceipts = exports.listMyCashregisters = exports.logReceiptOutputs = exports.sendReceiptEmail = exports.checkVoucherCombinationError = exports.listMyReceipts = exports.getFirstReceiptDate = exports.generateFullReceiptId = exports.getReceiptWithCompany = exports.getReceipt = exports.zeroReceipt = exports.cancelReceipt = exports.receiptLayoutFromResult = exports.cardRefundReference = exports.paymentsExpectedCents = exports.sellReceiptWithCompany = exports.sellReceipt = exports.isOutcomeUnknown = exports.isKasseneckValidationError = exports.isKasseneckNetworkError = exports.isKasseneckHttpError = exports.isKasseneckAuthError = exports.isKasseneckApiError = exports.CLIENT_ERROR_CODES = exports.KasseneckValidationError = exports.KasseneckNetworkError = exports.KasseneckHttpError = exports.KasseneckAuthError = exports.KasseneckApiError = exports.UNKNOWN_OUTCOME_CALLS = exports.POS_CALLS = exports.PUBLIC_CALLS = exports.ALL_CALLS = exports.createPdfOrDataTransport = exports.createBinaryTransport = exports.createTransport = exports.DEFAULT_TIMEOUT_MS = exports.POS_BASE_URL = exports.DEFAULT_BASE_URL = exports.registerUserAuth = exports.apiKeyAuth = void 0;
4
+ exports.createKasseneckApi = exports.getSignatureStatus = exports.getCashboxStatus = exports.getReportV2 = exports.getCashregisterReport = exports.downloadMonthlyReport = void 0;
4
5
  var auth_js_1 = require("./auth.js");
5
6
  Object.defineProperty(exports, "apiKeyAuth", { enumerable: true, get: function () { return auth_js_1.apiKeyAuth; } });
6
7
  Object.defineProperty(exports, "registerUserAuth", { enumerable: true, get: function () { return auth_js_1.registerUserAuth; } });
@@ -47,6 +48,16 @@ Object.defineProperty(exports, "sendReceiptEmail", { enumerable: true, get: func
47
48
  Object.defineProperty(exports, "logReceiptOutputs", { enumerable: true, get: function () { return receipts_js_1.logReceiptOutputs; } });
48
49
  var cashregisters_js_1 = require("./cashregisters.js");
49
50
  Object.defineProperty(exports, "listMyCashregisters", { enumerable: true, get: function () { return cashregisters_js_1.listMyCashregisters; } });
51
+ var list_receipts_js_1 = require("./list-receipts.js");
52
+ Object.defineProperty(exports, "listReceipts", { enumerable: true, get: function () { return list_receipts_js_1.listReceipts; } });
53
+ Object.defineProperty(exports, "listAllReceipts", { enumerable: true, get: function () { return list_receipts_js_1.listAllReceipts; } });
54
+ Object.defineProperty(exports, "fromListReceiptsSummaryPayload", { enumerable: true, get: function () { return list_receipts_js_1.fromListReceiptsSummaryPayload; } });
55
+ Object.defineProperty(exports, "LIST_RECEIPTS_VIEWS", { enumerable: true, get: function () { return list_receipts_js_1.LIST_RECEIPTS_VIEWS; } });
56
+ Object.defineProperty(exports, "LIST_RECEIPTS_ORDERS", { enumerable: true, get: function () { return list_receipts_js_1.LIST_RECEIPTS_ORDERS; } });
57
+ Object.defineProperty(exports, "LIST_RECEIPTS_LIMIT_MAX", { enumerable: true, get: function () { return list_receipts_js_1.LIST_RECEIPTS_LIMIT_MAX; } });
58
+ Object.defineProperty(exports, "LIST_RECEIPTS_DAYS_MAX", { enumerable: true, get: function () { return list_receipts_js_1.LIST_RECEIPTS_DAYS_MAX; } });
59
+ Object.defineProperty(exports, "LIST_ALL_RECEIPTS_MAX_PAGES", { enumerable: true, get: function () { return list_receipts_js_1.LIST_ALL_RECEIPTS_MAX_PAGES; } });
60
+ Object.defineProperty(exports, "LIST_RECEIPTS_ERROR_CODES", { enumerable: true, get: function () { return list_receipts_js_1.LIST_RECEIPTS_ERROR_CODES; } });
50
61
  var reports_js_1 = require("./reports.js");
51
62
  Object.defineProperty(exports, "downloadDailyReport", { enumerable: true, get: function () { return reports_js_1.downloadDailyReport; } });
52
63
  Object.defineProperty(exports, "downloadMonthlyReport", { enumerable: true, get: function () { return reports_js_1.downloadMonthlyReport; } });
@@ -0,0 +1,217 @@
1
+ import { KeckPaymentMethod, ReceiptType } from '../enums/index.js';
2
+ import { type CancellationReason, type CancellationStatus, type Receipt, type ReceiptPayment, type ZeroKind } from '../models/index.js';
3
+ import type { ReportV2Metadata } from './reports.js';
4
+ import type { InternerTransport } from './aufrufe.js';
5
+ /**
6
+ * Belege einer Kasse auflisten (`listReceipts`, nur unter `/v3`): ein Tag oder
7
+ * ein Zeitraum von hoechstens 31 Kalendertagen, Seite fuer Seite ueber einen
8
+ * undurchsichtigen Cursor. Nachfolger von `getReportV2` fuer Listen;
9
+ * `getReportV2` bleibt fuer Berichte.
10
+ *
11
+ * **Anmeldung wie `getReportV2`:** API-Schluessel plus `cashregister-token`
12
+ * (`apiKeyAuth`); die Kasse kommt aus dem Token, nie aus einem Parameter.
13
+ * Kassen-Bediener (Geraet + PIN) weist der Server ab; die Kasse hat dafuer
14
+ * `listMyReceipts` am Kassenweg. Dieses Paket bildet das nicht nach, wer darf,
15
+ * entscheidet allein das Backend.
16
+ *
17
+ * Zeiten sind die **Wiener Wanduhr** als Text, wie `timeStamp` am Beleg; der
18
+ * Server vergleicht sie als Text. Ein Tag ist ein Kalendertag, auch an den
19
+ * Tagen der Zeitumstellung, und die Grenze von 31 Tagen zaehlt Kalendertage,
20
+ * nicht 31 x 24 Stunden. Die Pruefung hier rechnet darum ohne Zeitzone, genau
21
+ * wie der Server (`beleg-liste-core.js`).
22
+ */
23
+ /** Ansicht einer Seite: `summary` eine schlanke Zeile je Beleg, `full` das gespeicherte Belegdokument. */
24
+ export declare const LIST_RECEIPTS_VIEWS: readonly ["summary", "full"];
25
+ export type ListReceiptsView = (typeof LIST_RECEIPTS_VIEWS)[number];
26
+ /** Reihenfolge: `desc` neueste zuerst (Vorgabe des Servers), `asc` aelteste zuerst. */
27
+ export declare const LIST_RECEIPTS_ORDERS: readonly ["desc", "asc"];
28
+ export type ListReceiptsOrder = (typeof LIST_RECEIPTS_ORDERS)[number];
29
+ /** Groesste Seite, die der Server liefert (`limit`); ohne Angabe nimmt er 100. */
30
+ export declare const LIST_RECEIPTS_LIMIT_MAX = 500;
31
+ /** Laengster Zeitraum in Kalendertagen (`to` hoechstens `from` + 31 Tage). */
32
+ export declare const LIST_RECEIPTS_DAYS_MAX = 31;
33
+ /**
34
+ * So viele Seiten holt [listAllReceipts] hoechstens, dann bricht er mit
35
+ * Fehler ab. Schutz gegen einen Cursor, der nie endet; mit der Seitengroesse
36
+ * des Helfers (500) sind das 50.000 Belege, mehr als jede Kasse in 31 Tagen
37
+ * ausstellt.
38
+ */
39
+ export declare const LIST_ALL_RECEIPTS_MAX_PAGES = 100;
40
+ /**
41
+ * Fehlercodes von `listReceipts` (`code` des [KasseneckApiError]), dazu die
42
+ * gemeinsamen Codes von Anmeldung und Rand (Kassen-Token, Live-Gate,
43
+ * API-Freigabe). Ein Code ausserhalb bleibt ueber `KasseneckApiError.code`
44
+ * lesbar. Die Regeln der ersten sieben prueft dieses Paket schon vor dem
45
+ * Senden (ausser `invalid_cursor`: ob ein Cursor zur Abfrage passt, weiss nur
46
+ * der Server).
47
+ */
48
+ export declare const LIST_RECEIPTS_ERROR_CODES: readonly ["invalid_date", "invalid_range", "range_too_long", "invalid_limit", "invalid_order", "invalid_view", "invalid_cursor", "server_error"];
49
+ export type ListReceiptsErrorCode = (typeof LIST_RECEIPTS_ERROR_CODES)[number];
50
+ /**
51
+ * Eingabe von [listReceipts]. Genau eine Form des Zeitfensters: `date` ODER
52
+ * `from` + `to`.
53
+ *
54
+ * - `date`: ein Wiener Tag, `YYYY-MM-DD` (00:00:00 bis zum Beginn des
55
+ * Folgetags). Nur mit `date` traegt die erste Seite `daySummary`.
56
+ * - `from` (einschliesslich) und `to` (ausschliesslich): `YYYY-MM-DD` oder
57
+ * `YYYY-MM-DDTHH:mm:ss`, Wiener Wanduhr ohne Zone. Ein reines Datum heisst
58
+ * Beginn dieses Tages; `to` liegt hoechstens 31 Kalendertage nach `from`.
59
+ *
60
+ * Mit `cursor` (dem `nextCursor` der Vorseite) muessen Zeitfenster, `order`
61
+ * und `view` gleich bleiben wie auf Seite 1, sonst antwortet der Server
62
+ * `invalid_cursor`; `limit` darf sich aendern.
63
+ */
64
+ export type ListReceiptsOptions<V extends ListReceiptsView = ListReceiptsView> = ListReceiptsWindow & {
65
+ /** Seitengroesse, ganze Zahl 1-500; ohne Angabe 100. */
66
+ limit?: number;
67
+ /** Ohne Angabe `desc` (neueste zuerst). */
68
+ order?: ListReceiptsOrder;
69
+ /** Ohne Angabe `summary`. */
70
+ view?: V;
71
+ /** `nextCursor` der vorigen Seite. */
72
+ cursor?: string;
73
+ };
74
+ /** Zeitfenster von [ListReceiptsOptions]: ein Tag oder ein Zeitraum. */
75
+ export type ListReceiptsWindow = {
76
+ date: string;
77
+ from?: undefined;
78
+ to?: undefined;
79
+ } | {
80
+ from: string;
81
+ to: string;
82
+ date?: undefined;
83
+ };
84
+ /** Brutto je RKSV-Satzgruppe in Cent (`amountRateStandard` bis `amountRateSpecial` am Beleg). */
85
+ export interface ListReceiptsGrossByRate {
86
+ standard: number;
87
+ reduced1: number;
88
+ reduced2: number;
89
+ zero: number;
90
+ special: number;
91
+ }
92
+ /**
93
+ * Zeile eines Belegs in [listReceipts] mit `view: 'summary'`. Betraege in
94
+ * ganzen Cent. Kein Layout, kein Kopf, keine Positionen und keine
95
+ * Pruefangaben: fuer die Detailansicht `getReceipt`, fuer die PDF
96
+ * `downloadReceipt` mit `fullReceiptId`.
97
+ *
98
+ * Nicht zu verwechseln mit [ReceiptSummary] von `listMyReceipts` (Kassenweg,
99
+ * andere Felder, Betrag dort aus Euro gerechnet).
100
+ *
101
+ * `receiptType` und `paymentMethod` sind wie ueberall beim Lesen der bekannte
102
+ * Enum-Eintrag oder der rohe Schluessel; ein Wert, den dieses Paket nicht
103
+ * kennt, laesst die Liste nicht scheitern.
104
+ */
105
+ export interface ListReceiptsSummary {
106
+ receiptId: string | null;
107
+ /** Fortlaufender Belegzaehler der Kasse; `null` bei Alt-Belegen. */
108
+ counter: number | null;
109
+ receiptType: ReceiptType | string | null;
110
+ /** Nur am Nullbeleg: Anlass (`manual`, wenn der Beleg keinen nennt); sonst `null`. */
111
+ zeroKind: ZeroKind | string | null;
112
+ /** Roher Belegzeitstempel (Wiener Wanduhr); Deutung ueber `parseServerTimeStamp`. */
113
+ timeStamp: string | null;
114
+ /** Summe von `grossByRateCents`; negativ am Storno-Beleg. */
115
+ totalCents: number;
116
+ grossByRateCents: ListReceiptsGrossByRate;
117
+ /** `mixed` bei mehreren Zahlungen (die stehen dann in `payments`). */
118
+ paymentMethod: KeckPaymentMethod | string | null;
119
+ /** Nur wenn der Beleg eine Zahlungsliste traegt; ohne Anbieterdaten. */
120
+ payments?: ReceiptPayment[];
121
+ /** Nur wenn der Beleg Trinkgeld traegt. */
122
+ tipCents?: number;
123
+ /** Bediener (nur der Name), oder `null`. */
124
+ operator: {
125
+ name: string;
126
+ } | null;
127
+ /** Nur am Storno-Beleg: das Original. */
128
+ cancellationOf: {
129
+ receiptId: string | null;
130
+ timeStamp: string | null;
131
+ } | null;
132
+ cancellationReason: CancellationReason | string | null;
133
+ /**
134
+ * Storno-Stand: `none`, `partial` oder `full` (nur an Normalbelegen anders
135
+ * als `none`). Ein Wert, den dieses Paket nicht kennt, kommt als
136
+ * `'unknown'` an, nie still als `none`: dann keinen Storno anbieten, bis
137
+ * der Beleg einzeln gelesen ist.
138
+ */
139
+ cancellationStatus: CancellationStatus | 'unknown';
140
+ /** Mit funktionierender Signatureinheit ausgestellt (`signatureSuccess !== false`). */
141
+ signatureOk: boolean;
142
+ /** Eigene Referenz des Aufrufers am Beleg, oder `null`. */
143
+ customProjectId: string | null;
144
+ /** Schluessel fuer `downloadReceipt` und den Beleg-Link, oder `null`. */
145
+ fullReceiptId: string | null;
146
+ }
147
+ /** Ein Beleg der Liste je Ansicht: `full` das Belegdokument wie bei `getReportV2`, sonst die Zeile. */
148
+ export type ListedReceipt<V extends ListReceiptsView = 'summary'> = V extends 'full' ? Receipt : ListReceiptsSummary;
149
+ /**
150
+ * Tagessumme aus der Tagesstatistik der Kasse, nur bei `date` und nur auf
151
+ * der ersten Seite. **Nicht die Summe der Liste:** `receiptCount` zaehlt jeden
152
+ * Beleg des Tages (auch Null-, Start- und Trainingsbelege), `revenueCents`
153
+ * nur Normal- und Storno-Belege, ohne Mitarbeiter-Trinkgeld und nach
154
+ * Aktionsrabatt. Wer die Liste summieren will, summiert die Liste.
155
+ */
156
+ export interface ListReceiptsDaySummary {
157
+ date: string;
158
+ receiptCount: number;
159
+ revenueCents: number;
160
+ /** Je Steuersatz (Basispunkte, 2000 = 20 %), hoechster zuerst; Saetze ohne Umsatz fehlen. */
161
+ revenueByRate: Array<{
162
+ rateBp: number;
163
+ grossCents: number;
164
+ }>;
165
+ }
166
+ /** Eine Seite von [listReceipts]. */
167
+ export interface ListReceiptsPage<V extends ListReceiptsView = 'summary'> {
168
+ receipts: Array<ListedReceipt<V>>;
169
+ /** Es gibt weitere Belege: mit `cursor: nextCursor` weiterlesen. */
170
+ hasMore: boolean;
171
+ /** `null`, wenn `hasMore` false ist. */
172
+ nextCursor: string | null;
173
+ /**
174
+ * Nur bei `date` auf der ersten Seite (ohne `cursor`); `null`, wenn es fuer
175
+ * den Tag keine Statistik gibt. Auf allen anderen Seiten fehlt das Feld.
176
+ */
177
+ daySummary?: ListReceiptsDaySummary | null;
178
+ /**
179
+ * Nur bei `view: 'full'`: Firmendaten fuer den Belegkopf (Nachdruck), dieselben Felder wie
180
+ * `getReportV2().metadata`. Bei der Kurzansicht fehlt das Feld.
181
+ */
182
+ metadata?: V extends 'full' ? ReportV2Metadata : never;
183
+ }
184
+ /** Zeile `view: summary` vom Draht. */
185
+ export declare function fromListReceiptsSummaryPayload(payload: Record<string, unknown>): ListReceiptsSummary;
186
+ /**
187
+ * Eine Seite Belege der angemeldeten Kasse (`listReceipts`). Die Eingabe wird
188
+ * vor dem Senden nach den Regeln des Servers geprueft (genau eine Form des
189
+ * Zeitfensters, Datumsformat, hoechstens 31 Kalendertage, `limit` 1-500,
190
+ * `order`, `view`); ein Verstoss wirft [KasseneckValidationError] mit
191
+ * `scope: 'request'`, ohne dass etwas hinausgeht.
192
+ *
193
+ * Mit `view: 'full'` sind die Belege das gespeicherte Belegdokument
194
+ * ([Receipt], dieselbe Form wie `getReportV2`), sonst [ListReceiptsSummary].
195
+ * Alle Seiten auf einmal: [listAllReceipts].
196
+ */
197
+ export declare function listReceipts<V extends ListReceiptsView = 'summary'>(transport: InternerTransport, options: ListReceiptsOptions<V>): Promise<ListReceiptsPage<V>>;
198
+ /**
199
+ * Alle Belege eines Tages oder Zeitraums, Seite fuer Seite: holt mit
200
+ * [listReceipts] die erste Seite, dann mit `cursor: nextCursor` und
201
+ * demselben Zeitfenster, `order` und `view` jede weitere, und liefert jeden
202
+ * Beleg einzeln, in der Reihenfolge des Servers. Jeder Beleg des Fensters
203
+ * kommt genau einmal.
204
+ *
205
+ * Ohne `limit` holt der Helfer Seiten zu 500 (weniger Aufrufe als die
206
+ * Vorgabe 100 des Servers). Mit `cursor` setzt er an dieser Stelle fort.
207
+ *
208
+ * Ein Fehler auf irgendeiner Seite bricht ab (der Fehler kommt im
209
+ * `for await` an); die bis dahin gelieferten Belege bleiben gueltig. Nach
210
+ * [LIST_ALL_RECEIPTS_MAX_PAGES] Seiten, oder wenn der Server denselben
211
+ * Cursor zweimal nennt, bricht er mit [KasseneckValidationError]
212
+ * (`scope: 'response'`) ab, statt endlos zu laufen.
213
+ *
214
+ * `daySummary` liefert der Helfer nicht; wer sie braucht, ruft die erste
215
+ * Seite mit [listReceipts].
216
+ */
217
+ export declare function listAllReceipts<V extends ListReceiptsView = 'summary'>(transport: InternerTransport, options: ListReceiptsOptions<V>): AsyncGenerator<ListedReceipt<V>, void, undefined>;