@kreiseck/kasseneck-api 0.31.0 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +317 -0
- package/README.de.md +11 -7
- package/README.md +509 -126
- package/dist/cjs/client/api.d.ts +7 -6
- package/dist/cjs/client/api.js +2 -2
- package/dist/cjs/client/aufrufe.d.ts +29 -5
- package/dist/cjs/client/aufrufe.js +114 -2
- package/dist/cjs/client/auth.d.ts +2 -0
- package/dist/cjs/client/auth.js +17 -1
- package/dist/cjs/client/cashregisters.d.ts +1 -1
- package/dist/cjs/client/cashregisters.js +2 -2
- package/dist/cjs/client/errors.d.ts +94 -19
- package/dist/cjs/client/errors.js +132 -28
- package/dist/cjs/client/fehlercodes.d.ts +9 -0
- package/dist/cjs/client/fehlercodes.js +36 -0
- package/dist/cjs/client/index.d.ts +5 -5
- package/dist/cjs/client/index.js +11 -3
- package/dist/cjs/client/receipts.d.ts +131 -124
- package/dist/cjs/client/receipts.js +196 -137
- package/dist/cjs/client/reports.d.ts +26 -4
- package/dist/cjs/client/reports.js +37 -4
- package/dist/cjs/client/status.d.ts +3 -3
- package/dist/cjs/client/status.js +7 -7
- package/dist/cjs/client/transport.d.ts +56 -4
- package/dist/cjs/client/transport.js +234 -25
- package/dist/cjs/enums/vat-rate.d.ts +2 -2
- package/dist/cjs/enums/vat-rate.js +1 -1
- package/dist/cjs/index.d.ts +4 -3
- package/dist/cjs/index.js +42 -13
- package/dist/{esm/rechnung → cjs/invoice}/api.d.ts +18 -17
- package/dist/cjs/{rechnung → invoice}/api.js +6 -6
- package/dist/{esm/rechnung → cjs/invoice}/auth.d.ts +2 -2
- package/dist/cjs/{rechnung → invoice}/auth.js +5 -5
- package/dist/{esm/rechnung/rechnen.d.ts → cjs/invoice/calc.d.ts} +27 -27
- package/dist/cjs/{rechnung/rechnen.js → invoice/calc.js} +54 -54
- package/dist/{esm/rechnung → cjs/invoice}/endpunkte.d.ts +23 -21
- package/dist/cjs/{rechnung → invoice}/endpunkte.js +52 -42
- package/dist/cjs/invoice/fehler.d.ts +31 -0
- package/dist/cjs/invoice/fehler.js +39 -0
- package/dist/cjs/invoice/index.d.ts +21 -0
- package/dist/cjs/invoice/index.js +86 -0
- package/dist/cjs/{rechnung → invoice}/summen.d.ts +12 -12
- package/dist/cjs/{rechnung → invoice}/summen.js +14 -14
- package/dist/cjs/invoice/texte.d.ts +224 -0
- package/dist/cjs/invoice/texte.js +425 -0
- package/dist/{esm/rechnung → cjs/invoice}/typen.d.ts +32 -11
- package/dist/cjs/{rechnung → invoice}/vertrag.d.ts +97 -71
- package/dist/cjs/{rechnung → invoice}/vertrag.js +144 -82
- package/dist/cjs/models/cancellation.d.ts +43 -24
- package/dist/cjs/models/cancellation.js +94 -46
- package/dist/cjs/models/hobex-receipt.d.ts +3 -3
- package/dist/cjs/models/hobex-receipt.js +35 -35
- package/dist/cjs/models/index.d.ts +6 -5
- package/dist/cjs/models/index.js +22 -2
- package/dist/cjs/models/payment-errors.d.ts +32 -15
- package/dist/cjs/models/payment-errors.js +80 -32
- package/dist/cjs/models/receipt-company.d.ts +6 -5
- package/dist/cjs/models/receipt-company.js +4 -4
- package/dist/cjs/models/receipt-email.d.ts +32 -18
- package/dist/cjs/models/receipt-email.js +69 -24
- package/dist/cjs/models/receipt-errors.d.ts +39 -0
- package/dist/cjs/models/receipt-errors.js +94 -0
- package/dist/cjs/models/receipt-item.d.ts +9 -1
- package/dist/cjs/models/receipt-item.js +3 -0
- package/dist/cjs/models/receipt-summary.d.ts +10 -4
- package/dist/cjs/models/receipt-summary.js +10 -4
- package/dist/cjs/models/receipt.d.ts +31 -2
- package/dist/cjs/models/receipt.js +12 -1
- package/dist/cjs/models/voucher.d.ts +7 -6
- package/dist/cjs/models/voucher.js +2 -7
- package/dist/cjs/partner/ablauf.d.ts +10 -10
- package/dist/cjs/partner/ablauf.js +29 -29
- package/dist/cjs/partner/api.d.ts +26 -23
- package/dist/cjs/partner/api.js +11 -13
- package/dist/cjs/partner/auth.d.ts +1 -1
- package/dist/cjs/partner/auth.js +2 -2
- package/dist/cjs/partner/betrieb.d.ts +7 -7
- package/dist/cjs/partner/betrieb.js +10 -10
- package/dist/cjs/partner/endpunkte.d.ts +27 -14
- package/dist/cjs/partner/endpunkte.js +80 -39
- package/dist/cjs/partner/fehler.d.ts +60 -30
- package/dist/cjs/partner/fehler.js +99 -43
- package/dist/cjs/partner/index.d.ts +13 -12
- package/dist/cjs/partner/index.js +35 -22
- package/dist/cjs/partner/secret.d.ts +3 -3
- package/dist/cjs/partner/secret.js +6 -6
- package/dist/cjs/partner/typen.d.ts +129 -71
- package/dist/cjs/partner/typen.js +76 -3
- package/dist/cjs/partner/webhook-signatur.d.ts +2 -2
- package/dist/cjs/partner/webhook-signatur.js +12 -12
- package/dist/cjs/partner/webhooks.d.ts +60 -32
- package/dist/cjs/partner/webhooks.js +40 -34
- package/dist/cjs/payments/hobex.d.ts +11 -3
- package/dist/cjs/payments/hobex.js +17 -5
- package/dist/cjs/payments/stripe.d.ts +5 -2
- package/dist/cjs/payments/stripe.js +10 -5
- package/dist/cjs/pos/artikel.d.ts +90 -0
- package/dist/cjs/pos/artikel.js +89 -0
- package/dist/cjs/pos/client.d.ts +27 -0
- package/dist/cjs/pos/client.js +144 -0
- package/dist/cjs/pos/drucker.d.ts +86 -0
- package/dist/cjs/pos/drucker.js +78 -0
- package/dist/cjs/pos/errors.d.ts +36 -0
- package/dist/cjs/pos/errors.js +95 -0
- package/dist/cjs/pos/index.d.ts +15 -0
- package/dist/cjs/pos/index.js +102 -0
- package/dist/cjs/pos/settings.d.ts +313 -0
- package/dist/cjs/pos/settings.js +376 -0
- package/dist/cjs/pos/texte.d.ts +883 -0
- package/dist/cjs/pos/texte.js +489 -0
- package/dist/cjs/{kasse → pos}/trinkgeld.d.ts +1 -1
- package/dist/cjs/{kasse → pos}/trinkgeld.js +2 -2
- package/dist/cjs/printing/escpos.d.ts +29 -29
- package/dist/cjs/printing/escpos.js +61 -61
- package/dist/cjs/printing/index.d.ts +2 -2
- package/dist/cjs/printing/index.js +17 -17
- package/dist/cjs/printing/qr-groesse.d.ts +38 -38
- package/dist/cjs/printing/qr-groesse.js +47 -47
- package/dist/cjs/printing/webusb.d.ts +2 -2
- package/dist/cjs/printing/webusb.js +4 -4
- package/dist/cjs/react/index.d.ts +21 -21
- package/dist/cjs/react/index.js +40 -30
- package/dist/cjs/receipt/bild.d.ts +4 -4
- package/dist/cjs/receipt/bild.js +11 -11
- package/dist/cjs/receipt/blatt.d.ts +46 -46
- package/dist/cjs/receipt/blatt.js +59 -59
- package/dist/cjs/receipt/discount.d.ts +1 -1
- package/dist/cjs/receipt/discount.js +8 -8
- package/dist/cjs/receipt/due.d.ts +86 -0
- package/dist/cjs/receipt/due.js +261 -0
- package/dist/cjs/receipt/epos.d.ts +22 -22
- package/dist/cjs/receipt/epos.js +45 -45
- package/dist/cjs/receipt/grid.d.ts +10 -10
- package/dist/cjs/receipt/grid.js +20 -20
- package/dist/cjs/receipt/index.d.ts +9 -8
- package/dist/cjs/receipt/index.js +26 -23
- package/dist/cjs/receipt/layout-escpos.d.ts +24 -24
- package/dist/cjs/receipt/layout-escpos.js +49 -49
- package/dist/cjs/receipt/layout.d.ts +28 -23
- package/dist/cjs/receipt/layout.js +45 -21
- package/dist/cjs/receipt/marke-daten.d.ts +8 -8
- package/dist/cjs/receipt/marke-daten.js +8 -8
- package/dist/cjs/receipt/marke.d.ts +7 -7
- package/dist/cjs/receipt/marke.js +10 -10
- package/dist/cjs/register/errors.d.ts +61 -0
- package/dist/cjs/register/errors.js +112 -0
- package/dist/cjs/register/index.d.ts +14 -1
- package/dist/cjs/register/index.js +20 -1
- package/dist/cjs/register/pairing.d.ts +55 -36
- package/dist/cjs/register/pairing.js +33 -29
- package/dist/cjs/register/session.d.ts +5 -5
- package/dist/cjs/register/session.js +7 -7
- package/dist/cjs/stored/draht.d.ts +45 -0
- package/dist/cjs/stored/draht.js +220 -0
- package/dist/cjs/stored/einstellungen.d.ts +23 -0
- package/dist/cjs/stored/einstellungen.js +200 -0
- package/dist/cjs/stored/index.d.ts +109 -0
- package/dist/cjs/stored/index.js +225 -0
- package/dist/cjs/stored/vokabular.d.ts +18 -0
- package/dist/cjs/stored/vokabular.js +389 -0
- package/dist/cjs/version.d.ts +7 -0
- package/dist/cjs/version.js +10 -0
- package/dist/cjs/vienna-time.d.ts +1 -1
- package/dist/cjs/vienna-time.js +2 -2
- package/dist/esm/client/api.d.ts +7 -6
- package/dist/esm/client/api.js +4 -4
- package/dist/esm/client/aufrufe.d.ts +29 -5
- package/dist/esm/client/aufrufe.js +111 -1
- package/dist/esm/client/auth.d.ts +2 -0
- package/dist/esm/client/auth.js +16 -1
- package/dist/esm/client/cashregisters.d.ts +1 -1
- package/dist/esm/client/cashregisters.js +2 -2
- package/dist/esm/client/errors.d.ts +94 -19
- package/dist/esm/client/errors.js +129 -27
- package/dist/esm/client/fehlercodes.d.ts +9 -0
- package/dist/esm/client/fehlercodes.js +32 -0
- package/dist/esm/client/index.d.ts +5 -5
- package/dist/esm/client/index.js +5 -5
- package/dist/esm/client/receipts.d.ts +131 -124
- package/dist/esm/client/receipts.js +195 -140
- package/dist/esm/client/reports.d.ts +26 -4
- package/dist/esm/client/reports.js +36 -4
- package/dist/esm/client/status.d.ts +3 -3
- package/dist/esm/client/status.js +7 -7
- package/dist/esm/client/transport.d.ts +56 -4
- package/dist/esm/client/transport.js +233 -24
- package/dist/esm/enums/vat-rate.d.ts +2 -2
- package/dist/esm/enums/vat-rate.js +1 -1
- package/dist/esm/index.d.ts +4 -3
- package/dist/esm/index.js +4 -3
- package/dist/{cjs/rechnung → esm/invoice}/api.d.ts +18 -17
- package/dist/esm/{rechnung → invoice}/api.js +6 -6
- package/dist/{cjs/rechnung → esm/invoice}/auth.d.ts +2 -2
- package/dist/esm/{rechnung → invoice}/auth.js +4 -4
- package/dist/{cjs/rechnung/rechnen.d.ts → esm/invoice/calc.d.ts} +27 -27
- package/dist/esm/{rechnung/rechnen.js → invoice/calc.js} +45 -45
- package/dist/{cjs/rechnung → esm/invoice}/endpunkte.d.ts +23 -21
- package/dist/esm/{rechnung → invoice}/endpunkte.js +52 -42
- package/dist/esm/invoice/fehler.d.ts +31 -0
- package/dist/esm/invoice/fehler.js +33 -0
- package/dist/esm/invoice/index.d.ts +21 -0
- package/dist/esm/invoice/index.js +20 -0
- package/dist/esm/{rechnung → invoice}/summen.d.ts +12 -12
- package/dist/esm/{rechnung → invoice}/summen.js +12 -12
- package/dist/esm/invoice/texte.d.ts +224 -0
- package/dist/esm/invoice/texte.js +421 -0
- package/dist/{cjs/rechnung → esm/invoice}/typen.d.ts +32 -11
- package/dist/esm/{rechnung → invoice}/vertrag.d.ts +97 -71
- package/dist/esm/{rechnung → invoice}/vertrag.js +143 -81
- package/dist/esm/models/cancellation.d.ts +43 -24
- package/dist/esm/models/cancellation.js +90 -45
- package/dist/esm/models/hobex-receipt.d.ts +3 -3
- package/dist/esm/models/hobex-receipt.js +35 -35
- package/dist/esm/models/index.d.ts +6 -5
- package/dist/esm/models/index.js +6 -5
- package/dist/esm/models/payment-errors.d.ts +32 -15
- package/dist/esm/models/payment-errors.js +77 -32
- package/dist/esm/models/receipt-company.d.ts +6 -5
- package/dist/esm/models/receipt-company.js +4 -4
- package/dist/esm/models/receipt-email.d.ts +32 -18
- package/dist/esm/models/receipt-email.js +65 -23
- package/dist/esm/models/receipt-errors.d.ts +39 -0
- package/dist/esm/models/receipt-errors.js +87 -0
- package/dist/esm/models/receipt-item.d.ts +9 -1
- package/dist/esm/models/receipt-item.js +3 -0
- package/dist/esm/models/receipt-summary.d.ts +10 -4
- package/dist/esm/models/receipt-summary.js +9 -3
- package/dist/esm/models/receipt.d.ts +31 -2
- package/dist/esm/models/receipt.js +12 -2
- package/dist/esm/models/voucher.d.ts +7 -6
- package/dist/esm/models/voucher.js +2 -7
- package/dist/esm/partner/ablauf.d.ts +10 -10
- package/dist/esm/partner/ablauf.js +27 -27
- package/dist/esm/partner/api.d.ts +26 -23
- package/dist/esm/partner/api.js +13 -15
- package/dist/esm/partner/auth.d.ts +1 -1
- package/dist/esm/partner/auth.js +2 -2
- package/dist/esm/partner/betrieb.d.ts +7 -7
- package/dist/esm/partner/betrieb.js +8 -8
- package/dist/esm/partner/endpunkte.d.ts +27 -14
- package/dist/esm/partner/endpunkte.js +79 -39
- package/dist/esm/partner/fehler.d.ts +60 -30
- package/dist/esm/partner/fehler.js +91 -35
- package/dist/esm/partner/index.d.ts +13 -12
- package/dist/esm/partner/index.js +12 -11
- package/dist/esm/partner/secret.d.ts +3 -3
- package/dist/esm/partner/secret.js +5 -5
- package/dist/esm/partner/typen.d.ts +129 -71
- package/dist/esm/partner/typen.js +75 -2
- package/dist/esm/partner/webhook-signatur.d.ts +2 -2
- package/dist/esm/partner/webhook-signatur.js +12 -12
- package/dist/esm/partner/webhooks.d.ts +60 -32
- package/dist/esm/partner/webhooks.js +38 -32
- package/dist/esm/payments/hobex.d.ts +11 -3
- package/dist/esm/payments/hobex.js +18 -6
- package/dist/esm/payments/stripe.d.ts +5 -2
- package/dist/esm/payments/stripe.js +11 -6
- package/dist/esm/pos/artikel.d.ts +90 -0
- package/dist/esm/pos/artikel.js +79 -0
- package/dist/esm/pos/client.d.ts +27 -0
- package/dist/esm/pos/client.js +137 -0
- package/dist/esm/pos/drucker.d.ts +86 -0
- package/dist/esm/pos/drucker.js +71 -0
- package/dist/esm/pos/errors.d.ts +36 -0
- package/dist/esm/pos/errors.js +88 -0
- package/dist/esm/pos/index.d.ts +15 -0
- package/dist/esm/pos/index.js +20 -0
- package/dist/esm/pos/settings.d.ts +313 -0
- package/dist/esm/pos/settings.js +367 -0
- package/dist/esm/pos/texte.d.ts +883 -0
- package/dist/esm/pos/texte.js +481 -0
- package/dist/esm/{kasse → pos}/trinkgeld.d.ts +1 -1
- package/dist/esm/{kasse → pos}/trinkgeld.js +2 -2
- package/dist/esm/printing/escpos.d.ts +29 -29
- package/dist/esm/printing/escpos.js +56 -56
- package/dist/esm/printing/index.d.ts +2 -2
- package/dist/esm/printing/index.js +2 -2
- package/dist/esm/printing/qr-groesse.d.ts +38 -38
- package/dist/esm/printing/qr-groesse.js +42 -42
- package/dist/esm/printing/webusb.d.ts +2 -2
- package/dist/esm/printing/webusb.js +4 -4
- package/dist/esm/react/index.d.ts +21 -21
- package/dist/esm/react/index.js +39 -29
- package/dist/esm/receipt/bild.d.ts +4 -4
- package/dist/esm/receipt/bild.js +11 -11
- package/dist/esm/receipt/blatt.d.ts +46 -46
- package/dist/esm/receipt/blatt.js +55 -55
- package/dist/esm/receipt/discount.d.ts +1 -1
- package/dist/esm/receipt/discount.js +7 -7
- package/dist/esm/receipt/due.d.ts +86 -0
- package/dist/esm/receipt/due.js +257 -0
- package/dist/esm/receipt/epos.d.ts +22 -22
- package/dist/esm/receipt/epos.js +47 -47
- package/dist/esm/receipt/grid.d.ts +10 -10
- package/dist/esm/receipt/grid.js +18 -18
- package/dist/esm/receipt/index.d.ts +9 -8
- package/dist/esm/receipt/index.js +9 -8
- package/dist/esm/receipt/layout-escpos.d.ts +24 -24
- package/dist/esm/receipt/layout-escpos.js +51 -51
- package/dist/esm/receipt/layout.d.ts +28 -23
- package/dist/esm/receipt/layout.js +44 -20
- package/dist/esm/receipt/marke-daten.d.ts +8 -8
- package/dist/esm/receipt/marke-daten.js +7 -7
- package/dist/esm/receipt/marke.d.ts +7 -7
- package/dist/esm/receipt/marke.js +10 -10
- package/dist/esm/register/errors.d.ts +61 -0
- package/dist/esm/register/errors.js +104 -0
- package/dist/esm/register/index.d.ts +14 -1
- package/dist/esm/register/index.js +13 -0
- package/dist/esm/register/pairing.d.ts +55 -36
- package/dist/esm/register/pairing.js +33 -29
- package/dist/esm/register/session.d.ts +5 -5
- package/dist/esm/register/session.js +7 -7
- package/dist/esm/stored/draht.d.ts +45 -0
- package/dist/esm/stored/draht.js +208 -0
- package/dist/esm/stored/einstellungen.d.ts +23 -0
- package/dist/esm/stored/einstellungen.js +196 -0
- package/dist/esm/stored/index.d.ts +109 -0
- package/dist/esm/stored/index.js +217 -0
- package/dist/esm/stored/vokabular.d.ts +18 -0
- package/dist/esm/stored/vokabular.js +386 -0
- package/dist/esm/version.d.ts +7 -0
- package/dist/esm/version.js +7 -0
- package/dist/esm/vienna-time.d.ts +1 -1
- package/dist/esm/vienna-time.js +2 -2
- package/fixtures/{erwartet/storno-rabatt.lines.json → expected/cancellation-discount.lines.json} +2 -2
- package/fixtures/expected/cancellation-discount.sheet32.json +248 -0
- package/fixtures/{erwartet/storno-rabatt.blatt48.json → expected/cancellation-discount.sheet48.json} +119 -119
- package/fixtures/{erwartet/storno-voll.lines.json → expected/cancellation-full.lines.json} +2 -2
- package/fixtures/expected/cancellation-full.sheet32.json +218 -0
- package/fixtures/{erwartet/storno-voll.blatt48.json → expected/cancellation-full.sheet48.json} +107 -107
- package/fixtures/{erwartet/storno-teil.lines.json → expected/cancellation-partial.lines.json} +2 -2
- package/fixtures/expected/cancellation-partial.sheet32.json +206 -0
- package/fixtures/{erwartet/storno-teil.blatt48.json → expected/cancellation-partial.sheet48.json} +101 -101
- package/fixtures/{erwartet/storno-split-voll.lines.json → expected/cancellation-split-full.lines.json} +2 -2
- package/fixtures/expected/cancellation-split-full.sheet32.json +320 -0
- package/fixtures/{erwartet/storno-split-voll.blatt48.json → expected/cancellation-split-full.sheet48.json} +158 -158
- package/fixtures/{erwartet/storno-split-teil.lines.json → expected/cancellation-split-partial.lines.json} +2 -2
- package/fixtures/expected/cancellation-split-partial.sheet32.json +230 -0
- package/fixtures/{erwartet/storno-split-teil.blatt48.json → expected/cancellation-split-partial.sheet48.json} +113 -113
- package/fixtures/{erwartet/karte-eigener.lines.json → expected/card-custom.lines.json} +1 -1
- package/fixtures/expected/card-custom.sheet32.json +158 -0
- package/fixtures/{erwartet/karte-eigener.blatt48.json → expected/card-custom.sheet48.json} +80 -80
- package/fixtures/{erwartet/karte-gptom-ios.lines.json → expected/card-gptom-ios.lines.json} +1 -1
- package/fixtures/expected/card-gptom-ios.sheet32.json +230 -0
- package/fixtures/{erwartet/karte-gptom-ios.blatt48.json → expected/card-gptom-ios.sheet48.json} +116 -116
- package/fixtures/{erwartet/karte-gptom.lines.json → expected/card-gptom.lines.json} +1 -1
- package/fixtures/expected/card-gptom.sheet32.json +230 -0
- package/fixtures/{erwartet/karte-gptom.blatt48.json → expected/card-gptom.sheet48.json} +116 -116
- package/fixtures/{erwartet/karte-hobex-cloud.lines.json → expected/card-hobex-cloud.lines.json} +1 -1
- package/fixtures/expected/card-hobex-cloud.sheet32.json +200 -0
- package/fixtures/{erwartet/karte-hobex-cloud.blatt48.json → expected/card-hobex-cloud.sheet48.json} +101 -101
- package/fixtures/{erwartet/karte-hobex-hps.lines.json → expected/card-hobex-hps.lines.json} +1 -1
- package/fixtures/expected/card-hobex-hps.sheet32.json +224 -0
- package/fixtures/{erwartet/karte-hobex-hps.blatt48.json → expected/card-hobex-hps.sheet48.json} +113 -113
- package/fixtures/{erwartet/karte-mypos.lines.json → expected/card-mypos.lines.json} +1 -1
- package/fixtures/expected/card-mypos.sheet32.json +254 -0
- package/fixtures/{erwartet/karte-mypos.blatt48.json → expected/card-mypos.sheet48.json} +122 -122
- package/fixtures/{erwartet/karte-stripe-eps.lines.json → expected/card-stripe-eps.lines.json} +1 -1
- package/fixtures/expected/card-stripe-eps.sheet32.json +194 -0
- package/fixtures/{erwartet/karte-stripe-eps.blatt48.json → expected/card-stripe-eps.sheet48.json} +98 -98
- package/fixtures/{erwartet/karte-stripe.lines.json → expected/card-stripe.lines.json} +1 -1
- package/fixtures/expected/card-stripe.sheet32.json +212 -0
- package/fixtures/{erwartet/karte-stripe.blatt48.json → expected/card-stripe.sheet48.json} +107 -107
- package/fixtures/{erwartet/karte-sumup.lines.json → expected/card-sumup.lines.json} +1 -1
- package/fixtures/expected/card-sumup.sheet32.json +218 -0
- package/fixtures/{erwartet/karte-sumup.blatt48.json → expected/card-sumup.sheet48.json} +104 -104
- package/fixtures/{erwartet/rabattzeilen.lines.json → expected/discount-lines.lines.json} +1 -1
- package/fixtures/expected/discount-lines.sheet32.json +200 -0
- package/fixtures/{erwartet/rabattzeilen.blatt48.json → expected/discount-lines.sheet48.json} +98 -98
- package/fixtures/{erwartet/rabatt-chef-trinkgeld.lines.json → expected/discount-owner-tip.lines.json} +1 -1
- package/fixtures/expected/discount-owner-tip.sheet32.json +212 -0
- package/fixtures/{erwartet/rabatt-chef-trinkgeld.blatt48.json → expected/discount-owner-tip.sheet48.json} +104 -104
- package/fixtures/{erwartet/rabatt-einfach.lines.json → expected/discount-simple.lines.json} +1 -1
- package/fixtures/expected/discount-simple.sheet32.json +182 -0
- package/fixtures/{erwartet/rabatt-einfach.blatt48.json → expected/discount-simple.sheet48.json} +89 -89
- package/fixtures/{erwartet/rabatt-trinkgeld.lines.json → expected/discount-tip.lines.json} +1 -1
- package/fixtures/expected/discount-tip.sheet32.json +212 -0
- package/fixtures/{erwartet/rabatt-trinkgeld.blatt48.json → expected/discount-tip.sheet48.json} +104 -104
- package/fixtures/{erwartet/rabatt-wertgutschein.lines.json → expected/discount-value-voucher.lines.json} +1 -1
- package/fixtures/expected/discount-value-voucher.sheet32.json +218 -0
- package/fixtures/{erwartet/rabatt-wertgutschein.blatt48.json → expected/discount-value-voucher.sheet48.json} +107 -107
- package/fixtures/{erwartet/langer-artikelname.lines.json → expected/long-item-name.lines.json} +1 -1
- package/fixtures/expected/long-item-name.sheet32.json +176 -0
- package/fixtures/{erwartet/langer-artikelname.blatt48.json → expected/long-item-name.sheet48.json} +86 -86
- package/fixtures/{erwartet/verkauf-karte.lines.json → expected/sale-card.lines.json} +1 -1
- package/fixtures/expected/sale-card.sheet32.json +176 -0
- package/fixtures/{erwartet/verkauf-karte.blatt48.json → expected/sale-card.sheet48.json} +86 -86
- package/fixtures/{erwartet/verkauf-bar.lines.json → expected/sale-cash.lines.json} +1 -1
- package/fixtures/expected/sale-cash.sheet32.json +176 -0
- package/fixtures/{erwartet/verkauf-bar.blatt48.json → expected/sale-cash.sheet48.json} +86 -86
- package/fixtures/{erwartet/verkauf-kleinunternehmer.lines.json → expected/sale-small-business.lines.json} +1 -1
- package/fixtures/expected/sale-small-business.sheet32.json +182 -0
- package/fixtures/{erwartet/verkauf-kleinunternehmer.blatt48.json → expected/sale-small-business.sheet48.json} +89 -89
- package/fixtures/{erwartet/signaturausfall-verkauf.lines.json → expected/signature-outage-sale.lines.json} +1 -1
- package/fixtures/expected/signature-outage-sale.sheet32.json +194 -0
- package/fixtures/{erwartet/signaturausfall-verkauf.blatt48.json → expected/signature-outage-sale.sheet48.json} +92 -92
- package/fixtures/{erwartet/split-karte-karte-bar.lines.json → expected/split-card-card-cash.lines.json} +1 -1
- package/fixtures/expected/split-card-card-cash.sheet32.json +356 -0
- package/fixtures/{erwartet/split-karte-karte-bar.blatt48.json → expected/split-card-card-cash.sheet48.json} +170 -170
- package/fixtures/{erwartet/split-bar-rueckgeld.lines.json → expected/split-cash-change.lines.json} +1 -1
- package/fixtures/expected/split-cash-change.sheet32.json +194 -0
- package/fixtures/{erwartet/split-bar-rueckgeld.blatt48.json → expected/split-cash-change.sheet48.json} +92 -92
- package/fixtures/{erwartet/split-langer-betrag.lines.json → expected/split-long-amount.lines.json} +1 -1
- package/fixtures/expected/split-long-amount.sheet32.json +266 -0
- package/fixtures/{erwartet/split-langer-betrag.blatt48.json → expected/split-long-amount.sheet48.json} +131 -131
- package/fixtures/{erwartet/split-eine-karte-trinkgeld.lines.json → expected/split-one-card-tip.lines.json} +1 -1
- package/fixtures/expected/split-one-card-tip.sheet32.json +242 -0
- package/fixtures/{erwartet/split-eine-karte-trinkgeld.blatt48.json → expected/split-one-card-tip.sheet48.json} +113 -113
- package/fixtures/{erwartet/split-tischrunde-trinkgeld.lines.json → expected/split-table-round-tip.lines.json} +1 -1
- package/fixtures/expected/split-table-round-tip.sheet32.json +470 -0
- package/fixtures/{erwartet/split-tischrunde-trinkgeld.blatt48.json → expected/split-table-round-tip.sheet48.json} +218 -218
- package/fixtures/{erwartet/split-trinkgeld-karte.lines.json → expected/split-tip-card.lines.json} +1 -1
- package/fixtures/expected/split-tip-card.sheet32.json +272 -0
- package/fixtures/{erwartet/split-trinkgeld-karte.blatt48.json → expected/split-tip-card.sheet48.json} +128 -128
- package/fixtures/{erwartet/split-zwei-karten-gleicher-anbieter.lines.json → expected/split-two-cards-same-provider.lines.json} +1 -1
- package/fixtures/expected/split-two-cards-same-provider.sheet32.json +326 -0
- package/fixtures/{erwartet/split-zwei-karten-gleicher-anbieter.blatt48.json → expected/split-two-cards-same-provider.sheet48.json} +149 -149
- package/fixtures/{erwartet/testkasse-verkauf.lines.json → expected/test-cashregister-sale.lines.json} +3 -3
- package/fixtures/expected/test-cashregister-sale.sheet32.json +224 -0
- package/fixtures/{erwartet/testkasse-verkauf.blatt48.json → expected/test-cashregister-sale.sheet48.json} +110 -110
- package/fixtures/{erwartet/testsignatur-verkauf.lines.json → expected/test-signature-sale.lines.json} +3 -3
- package/fixtures/expected/test-signature-sale.sheet32.json +236 -0
- package/fixtures/{erwartet/testsignatur-verkauf.blatt48.json → expected/test-signature-sale.sheet48.json} +110 -110
- package/fixtures/{erwartet → expected}/training.lines.json +2 -2
- package/fixtures/expected/training.sheet32.json +236 -0
- package/fixtures/{erwartet/training.blatt48.json → expected/training.sheet48.json} +110 -110
- package/fixtures/{erwartet/null-jahr.lines.json → expected/zero-annual.lines.json} +2 -2
- package/fixtures/expected/zero-annual.sheet32.json +212 -0
- package/fixtures/{erwartet/null-jahr.blatt48.json → expected/zero-annual.sheet48.json} +95 -95
- package/fixtures/{erwartet/null-schluss.lines.json → expected/zero-final.lines.json} +2 -2
- package/fixtures/expected/zero-final.sheet32.json +206 -0
- package/fixtures/{erwartet/null-schluss.blatt48.json → expected/zero-final.sheet48.json} +95 -95
- package/fixtures/{erwartet/null-pruef.lines.json → expected/zero-manual.lines.json} +2 -2
- package/fixtures/expected/zero-manual.sheet32.json +206 -0
- package/fixtures/{erwartet/null-pruef.blatt48.json → expected/zero-manual.sheet48.json} +95 -95
- package/fixtures/{erwartet/null-monat.lines.json → expected/zero-monthly.lines.json} +2 -2
- package/fixtures/expected/zero-monthly.sheet32.json +206 -0
- package/fixtures/{erwartet/null-monat.blatt48.json → expected/zero-monthly.sheet48.json} +95 -95
- package/fixtures/{erwartet/null-ausfall.lines.json → expected/zero-outage-end.lines.json} +2 -2
- package/fixtures/expected/zero-outage-end.sheet32.json +206 -0
- package/fixtures/{erwartet/null-ausfall.blatt48.json → expected/zero-outage-end.sheet48.json} +95 -95
- package/fixtures/{erwartet/null-start.lines.json → expected/zero-start.lines.json} +2 -2
- package/fixtures/expected/zero-start.sheet32.json +206 -0
- package/fixtures/{erwartet/null-start.blatt48.json → expected/zero-start.sheet48.json} +95 -95
- package/fixtures/hobex-hps-codes.json +12 -12
- package/fixtures/invoice-api-examples/brands-ok.json +8 -0
- package/fixtures/{rechnung-api-beispiele/credit-fehler-grund.json → invoice-api-examples/credit-error-reason.json} +6 -6
- package/fixtures/{rechnung-api-beispiele → invoice-api-examples}/credit-ok.json +6 -6
- package/fixtures/{rechnung-api-beispiele/customer-fehler-uid.json → invoice-api-examples/customer-error-vat-id.json} +4 -4
- package/fixtures/invoice-api-examples/customer-get-error-both.json +15 -0
- package/fixtures/{rechnung-api-beispiele → invoice-api-examples}/customer-ok.json +4 -4
- package/fixtures/{rechnung-api-beispiele/customer-search-fehler-leer.json → invoice-api-examples/customer-search-error-empty.json} +4 -4
- package/fixtures/{rechnung-api-beispiele/issue-rabatt.json → invoice-api-examples/issue-discount.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-englisch.json → invoice-api-examples/issue-english.json} +7 -7
- package/fixtures/{rechnung-api-beispiele/issue-fehler-cent.json → invoice-api-examples/issue-error-cent.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-fehler-sprache.json → invoice-api-examples/issue-error-language.json} +5 -5
- package/fixtures/{rechnung-api-beispiele/issue-fehler-negativ.json → invoice-api-examples/issue-error-negative.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-fehler-zahlungsart.json → invoice-api-examples/issue-error-payment-method.json} +8 -6
- package/fixtures/{rechnung-api-beispiele/issue-fehler-preis-beide.json → invoice-api-examples/issue-error-price-both.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-fehler-preis-fehlt.json → invoice-api-examples/issue-error-price-missing.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-fehler-menge.json → invoice-api-examples/issue-error-quantity.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-fehler-satz.json → invoice-api-examples/issue-error-rate.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-fehler-einheit.json → invoice-api-examples/issue-error-unit.json} +5 -5
- package/fixtures/{rechnung-api-beispiele/issue-fehler-unbekannt.json → invoice-api-examples/issue-error-unknown.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-brutto-20.json → invoice-api-examples/issue-gross-20.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-mikropreis.json → invoice-api-examples/issue-micro-price.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-gemischt.json → invoice-api-examples/issue-mixed.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-netto-20.json → invoice-api-examples/issue-net-20.json} +6 -6
- package/fixtures/{rechnung-api-beispiele/issue-bezahlt.json → invoice-api-examples/issue-paid.json} +7 -7
- package/fixtures/{rechnung-api-beispiele/issue-kleinunternehmer.json → invoice-api-examples/issue-small-business.json} +6 -6
- package/fixtures/invoice-api-examples/payment-error-on-site.json +17 -0
- package/fixtures/invoice-api-examples/payment-error-without-key.json +16 -0
- package/fixtures/invoice-api-examples/payment-recorded-later.json +14 -0
- package/fixtures/{rechnung-api-beispiele/setup-status-fehler-feld.json → invoice-api-examples/setup-status-error-field.json} +4 -4
- package/fixtures/invoice-api-examples/setup-status-ok.json +8 -0
- package/fixtures/{rechnung-api.schema.json → invoice-api.schema.json} +24 -24
- package/fixtures/{rechnung-rechnen-zufall.json → invoice-calc-random.json} +828 -828
- package/fixtures/{rechnung-rechnen.json → invoice-calc.json} +47 -47
- package/fixtures/invoice-texts.json +464 -0
- package/fixtures/{rechnung-summen.json → invoice-totals.json} +25 -25
- package/fixtures/{position-aus-euro.json → item-from-euro.json} +26 -26
- package/fixtures/manifest.json +252 -252
- package/fixtures/pos-message-cases.json +32 -0
- package/fixtures/pos-settings-defaults.json +149 -0
- package/fixtures/{kasse-texte.json → pos-texts.json} +416 -416
- package/fixtures/receipt-due-generated.json +1218 -0
- package/fixtures/{belege/storno-rabatt.json → receipts/cancellation-discount.json} +3 -3
- package/fixtures/{belege/storno-voll.json → receipts/cancellation-full.json} +3 -3
- package/fixtures/{belege/storno-teil.json → receipts/cancellation-partial.json} +3 -3
- package/fixtures/{belege/storno-split-voll.json → receipts/cancellation-split-full.json} +3 -3
- package/fixtures/{belege/storno-split-teil.json → receipts/cancellation-split-partial.json} +3 -3
- package/fixtures/{belege/karte-eigener.json → receipts/card-custom.json} +2 -2
- package/fixtures/{belege/karte-gptom-ios.json → receipts/card-gptom-ios.json} +2 -2
- package/fixtures/{belege/karte-gptom.json → receipts/card-gptom.json} +2 -2
- package/fixtures/{belege/karte-hobex-cloud.json → receipts/card-hobex-cloud.json} +2 -2
- package/fixtures/{belege/karte-hobex-hps.json → receipts/card-hobex-hps.json} +2 -2
- package/fixtures/{belege/karte-mypos.json → receipts/card-mypos.json} +2 -2
- package/fixtures/{belege/karte-stripe-eps.json → receipts/card-stripe-eps.json} +2 -2
- package/fixtures/{belege/karte-stripe.json → receipts/card-stripe.json} +2 -2
- package/fixtures/{belege/karte-sumup.json → receipts/card-sumup.json} +2 -2
- package/fixtures/{belege/rabattzeilen.json → receipts/discount-lines.json} +2 -2
- package/fixtures/{belege/rabatt-chef-trinkgeld.json → receipts/discount-owner-tip.json} +2 -2
- package/fixtures/{belege/rabatt-einfach.json → receipts/discount-simple.json} +2 -2
- package/fixtures/{belege/rabatt-trinkgeld.json → receipts/discount-tip.json} +2 -2
- package/fixtures/{belege/rabatt-wertgutschein.json → receipts/discount-value-voucher.json} +2 -2
- package/fixtures/{belege/langer-artikelname.json → receipts/long-item-name.json} +2 -2
- package/fixtures/{belege/verkauf-karte.json → receipts/sale-card.json} +2 -2
- package/fixtures/{belege/verkauf-bar.json → receipts/sale-cash.json} +2 -2
- package/fixtures/{belege/verkauf-kleinunternehmer.json → receipts/sale-small-business.json} +1 -1
- package/fixtures/{belege/signaturausfall-verkauf.json → receipts/signature-outage-sale.json} +2 -2
- package/fixtures/{belege/split-karte-karte-bar.json → receipts/split-card-card-cash.json} +2 -2
- package/fixtures/{belege/split-bar-rueckgeld.json → receipts/split-cash-change.json} +2 -2
- package/fixtures/{belege/split-langer-betrag.json → receipts/split-long-amount.json} +2 -2
- package/fixtures/{belege/split-eine-karte-trinkgeld.json → receipts/split-one-card-tip.json} +2 -2
- package/fixtures/{belege/split-tischrunde-trinkgeld.json → receipts/split-table-round-tip.json} +2 -2
- package/fixtures/{belege/split-trinkgeld-karte.json → receipts/split-tip-card.json} +2 -2
- package/fixtures/{belege/split-zwei-karten-gleicher-anbieter.json → receipts/split-two-cards-same-provider.json} +2 -2
- package/fixtures/{belege/testsignatur-verkauf.json → receipts/test-cashregister-sale.json} +3 -3
- package/fixtures/{belege/testkasse-verkauf.json → receipts/test-signature-sale.json} +3 -3
- package/fixtures/{belege → receipts}/training.json +2 -2
- package/fixtures/{belege/null-jahr.json → receipts/zero-annual.json} +5 -5
- package/fixtures/{belege/null-schluss.json → receipts/zero-final.json} +5 -5
- package/fixtures/{belege/null-pruef.json → receipts/zero-manual.json} +5 -5
- package/fixtures/{belege/null-monat.json → receipts/zero-monthly.json} +5 -5
- package/fixtures/{belege/null-ausfall.json → receipts/zero-outage-end.json} +5 -5
- package/fixtures/{belege/null-start.json → receipts/zero-start.json} +5 -5
- package/fixtures/renames-1.0.json +1490 -0
- package/fixtures/{kasse-settings-standard.json → stored/pos-settings-defaults.json} +7 -7
- package/fixtures/surface.json +877 -0
- package/fixtures/v3/README.md +125 -0
- package/fixtures/v3/antworten/belege.json +4738 -0
- package/fixtures/v3/antworten/belegmail.json +154 -0
- package/fixtures/v3/antworten/kasse-belege.json +4304 -0
- package/fixtures/v3/antworten/kasse.json +12716 -0
- package/fixtures/v3/antworten/rechnungen.json +1712 -0
- package/fixtures/v3/antworten/storno.json +737 -0
- package/fixtures/v3/stored/belege.json +502 -0
- package/fixtures/v3/stored/kasse.json +3461 -0
- package/fixtures/v3/stored/rechnungen.json +750 -0
- package/fixtures/v3/v3-vokabular.json +3375 -0
- package/fixtures/v3/zahlbetrag-faelle.json +794 -0
- package/package.json +32 -18
- package/dist/cjs/kasse/artikel.d.ts +0 -83
- package/dist/cjs/kasse/artikel.js +0 -79
- package/dist/cjs/kasse/client.d.ts +0 -10
- package/dist/cjs/kasse/client.js +0 -38
- package/dist/cjs/kasse/drucker.d.ts +0 -59
- package/dist/cjs/kasse/drucker.js +0 -50
- package/dist/cjs/kasse/index.d.ts +0 -13
- package/dist/cjs/kasse/index.js +0 -83
- package/dist/cjs/kasse/settings.d.ts +0 -229
- package/dist/cjs/kasse/settings.js +0 -172
- package/dist/cjs/kasse/texte.d.ts +0 -868
- package/dist/cjs/kasse/texte.js +0 -474
- package/dist/cjs/rechnung/fehler.d.ts +0 -21
- package/dist/cjs/rechnung/fehler.js +0 -44
- package/dist/cjs/rechnung/index.d.ts +0 -21
- package/dist/cjs/rechnung/index.js +0 -82
- package/dist/cjs/rechnung/texte.d.ts +0 -222
- package/dist/cjs/rechnung/texte.js +0 -425
- package/dist/esm/kasse/artikel.d.ts +0 -83
- package/dist/esm/kasse/artikel.js +0 -70
- package/dist/esm/kasse/client.d.ts +0 -10
- package/dist/esm/kasse/client.js +0 -33
- package/dist/esm/kasse/drucker.d.ts +0 -59
- package/dist/esm/kasse/drucker.js +0 -45
- package/dist/esm/kasse/index.d.ts +0 -13
- package/dist/esm/kasse/index.js +0 -18
- package/dist/esm/kasse/settings.d.ts +0 -229
- package/dist/esm/kasse/settings.js +0 -168
- package/dist/esm/kasse/texte.d.ts +0 -868
- package/dist/esm/kasse/texte.js +0 -466
- package/dist/esm/rechnung/fehler.d.ts +0 -21
- package/dist/esm/rechnung/fehler.js +0 -39
- package/dist/esm/rechnung/index.d.ts +0 -21
- package/dist/esm/rechnung/index.js +0 -20
- package/dist/esm/rechnung/texte.d.ts +0 -222
- package/dist/esm/rechnung/texte.js +0 -421
- package/fixtures/erwartet/karte-eigener.blatt32.json +0 -158
- package/fixtures/erwartet/karte-gptom-ios.blatt32.json +0 -230
- package/fixtures/erwartet/karte-gptom.blatt32.json +0 -230
- package/fixtures/erwartet/karte-hobex-cloud.blatt32.json +0 -200
- package/fixtures/erwartet/karte-hobex-hps.blatt32.json +0 -224
- package/fixtures/erwartet/karte-mypos.blatt32.json +0 -254
- package/fixtures/erwartet/karte-stripe-eps.blatt32.json +0 -194
- package/fixtures/erwartet/karte-stripe.blatt32.json +0 -212
- package/fixtures/erwartet/karte-sumup.blatt32.json +0 -218
- package/fixtures/erwartet/langer-artikelname.blatt32.json +0 -176
- package/fixtures/erwartet/null-ausfall.blatt32.json +0 -206
- package/fixtures/erwartet/null-jahr.blatt32.json +0 -212
- package/fixtures/erwartet/null-monat.blatt32.json +0 -206
- package/fixtures/erwartet/null-pruef.blatt32.json +0 -206
- package/fixtures/erwartet/null-schluss.blatt32.json +0 -206
- package/fixtures/erwartet/null-start.blatt32.json +0 -206
- package/fixtures/erwartet/rabatt-chef-trinkgeld.blatt32.json +0 -212
- package/fixtures/erwartet/rabatt-einfach.blatt32.json +0 -182
- package/fixtures/erwartet/rabatt-trinkgeld.blatt32.json +0 -212
- package/fixtures/erwartet/rabatt-wertgutschein.blatt32.json +0 -218
- package/fixtures/erwartet/rabattzeilen.blatt32.json +0 -200
- package/fixtures/erwartet/signaturausfall-verkauf.blatt32.json +0 -194
- package/fixtures/erwartet/split-bar-rueckgeld.blatt32.json +0 -194
- package/fixtures/erwartet/split-eine-karte-trinkgeld.blatt32.json +0 -242
- package/fixtures/erwartet/split-karte-karte-bar.blatt32.json +0 -356
- package/fixtures/erwartet/split-langer-betrag.blatt32.json +0 -266
- package/fixtures/erwartet/split-tischrunde-trinkgeld.blatt32.json +0 -470
- package/fixtures/erwartet/split-trinkgeld-karte.blatt32.json +0 -272
- package/fixtures/erwartet/split-zwei-karten-gleicher-anbieter.blatt32.json +0 -326
- package/fixtures/erwartet/storno-rabatt.blatt32.json +0 -248
- package/fixtures/erwartet/storno-split-teil.blatt32.json +0 -230
- package/fixtures/erwartet/storno-split-voll.blatt32.json +0 -320
- package/fixtures/erwartet/storno-teil.blatt32.json +0 -206
- package/fixtures/erwartet/storno-voll.blatt32.json +0 -218
- package/fixtures/erwartet/testkasse-verkauf.blatt32.json +0 -224
- package/fixtures/erwartet/testsignatur-verkauf.blatt32.json +0 -236
- package/fixtures/erwartet/training.blatt32.json +0 -236
- package/fixtures/erwartet/verkauf-bar.blatt32.json +0 -176
- package/fixtures/erwartet/verkauf-karte.blatt32.json +0 -176
- package/fixtures/erwartet/verkauf-kleinunternehmer.blatt32.json +0 -182
- package/fixtures/kasse-meldungen-faelle.json +0 -32
- package/fixtures/oberflaeche.json +0 -558
- package/fixtures/rechnung-api-beispiele/brands-ok.json +0 -8
- package/fixtures/rechnung-api-beispiele/customer-get-fehler-beide.json +0 -15
- package/fixtures/rechnung-api-beispiele/setup-status-ok.json +0 -8
- package/fixtures/rechnung-api-beispiele/zahlung-fehler-ohne-schluessel.json +0 -14
- package/fixtures/rechnung-api-beispiele/zahlung-fehler-vor-ort.json +0 -15
- package/fixtures/rechnung-api-beispiele/zahlung-nachtrag.json +0 -14
- package/fixtures/rechnung-texte.json +0 -464
- /package/dist/cjs/{rechnung → invoice}/typen.js +0 -0
- /package/dist/esm/{rechnung → invoice}/typen.js +0 -0
- /package/fixtures/{erwartet/storno-rabatt.grid32.txt → expected/cancellation-discount.grid32.txt} +0 -0
- /package/fixtures/{erwartet/storno-rabatt.grid48.txt → expected/cancellation-discount.grid48.txt} +0 -0
- /package/fixtures/{erwartet/storno-voll.grid32.txt → expected/cancellation-full.grid32.txt} +0 -0
- /package/fixtures/{erwartet/storno-voll.grid48.txt → expected/cancellation-full.grid48.txt} +0 -0
- /package/fixtures/{erwartet/storno-teil.grid32.txt → expected/cancellation-partial.grid32.txt} +0 -0
- /package/fixtures/{erwartet/storno-teil.grid48.txt → expected/cancellation-partial.grid48.txt} +0 -0
- /package/fixtures/{erwartet/storno-split-voll.grid32.txt → expected/cancellation-split-full.grid32.txt} +0 -0
- /package/fixtures/{erwartet/storno-split-voll.grid48.txt → expected/cancellation-split-full.grid48.txt} +0 -0
- /package/fixtures/{erwartet/storno-split-teil.grid32.txt → expected/cancellation-split-partial.grid32.txt} +0 -0
- /package/fixtures/{erwartet/storno-split-teil.grid48.txt → expected/cancellation-split-partial.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-eigener.grid32.txt → expected/card-custom.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-eigener.grid48.txt → expected/card-custom.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-gptom-ios.grid32.txt → expected/card-gptom-ios.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-gptom-ios.grid48.txt → expected/card-gptom-ios.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-gptom.grid32.txt → expected/card-gptom.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-gptom.grid48.txt → expected/card-gptom.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-hobex-cloud.grid32.txt → expected/card-hobex-cloud.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-hobex-cloud.grid48.txt → expected/card-hobex-cloud.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-hobex-hps.grid32.txt → expected/card-hobex-hps.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-hobex-hps.grid48.txt → expected/card-hobex-hps.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-mypos.grid32.txt → expected/card-mypos.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-mypos.grid48.txt → expected/card-mypos.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-stripe-eps.grid32.txt → expected/card-stripe-eps.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-stripe-eps.grid48.txt → expected/card-stripe-eps.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-stripe.grid32.txt → expected/card-stripe.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-stripe.grid48.txt → expected/card-stripe.grid48.txt} +0 -0
- /package/fixtures/{erwartet/karte-sumup.grid32.txt → expected/card-sumup.grid32.txt} +0 -0
- /package/fixtures/{erwartet/karte-sumup.grid48.txt → expected/card-sumup.grid48.txt} +0 -0
- /package/fixtures/{erwartet/rabattzeilen.grid32.txt → expected/discount-lines.grid32.txt} +0 -0
- /package/fixtures/{erwartet/rabattzeilen.grid48.txt → expected/discount-lines.grid48.txt} +0 -0
- /package/fixtures/{erwartet/rabatt-chef-trinkgeld.grid32.txt → expected/discount-owner-tip.grid32.txt} +0 -0
- /package/fixtures/{erwartet/rabatt-chef-trinkgeld.grid48.txt → expected/discount-owner-tip.grid48.txt} +0 -0
- /package/fixtures/{erwartet/rabatt-einfach.grid32.txt → expected/discount-simple.grid32.txt} +0 -0
- /package/fixtures/{erwartet/rabatt-einfach.grid48.txt → expected/discount-simple.grid48.txt} +0 -0
- /package/fixtures/{erwartet/rabatt-trinkgeld.grid32.txt → expected/discount-tip.grid32.txt} +0 -0
- /package/fixtures/{erwartet/rabatt-trinkgeld.grid48.txt → expected/discount-tip.grid48.txt} +0 -0
- /package/fixtures/{erwartet/rabatt-wertgutschein.grid32.txt → expected/discount-value-voucher.grid32.txt} +0 -0
- /package/fixtures/{erwartet/rabatt-wertgutschein.grid48.txt → expected/discount-value-voucher.grid48.txt} +0 -0
- /package/fixtures/{erwartet/logo-probe-hoch.raster32.txt → expected/logo-sample-tall.raster32.txt} +0 -0
- /package/fixtures/{erwartet/logo-probe.raster32.txt → expected/logo-sample.raster32.txt} +0 -0
- /package/fixtures/{erwartet/langer-artikelname.grid32.txt → expected/long-item-name.grid32.txt} +0 -0
- /package/fixtures/{erwartet/langer-artikelname.grid48.txt → expected/long-item-name.grid48.txt} +0 -0
- /package/fixtures/{erwartet/verkauf-karte.grid32.txt → expected/sale-card.grid32.txt} +0 -0
- /package/fixtures/{erwartet/verkauf-karte.grid48.txt → expected/sale-card.grid48.txt} +0 -0
- /package/fixtures/{erwartet/verkauf-bar.grid32.txt → expected/sale-cash.grid32.txt} +0 -0
- /package/fixtures/{erwartet/verkauf-bar.grid48.txt → expected/sale-cash.grid48.txt} +0 -0
- /package/fixtures/{erwartet/verkauf-kleinunternehmer.grid32.txt → expected/sale-small-business.grid32.txt} +0 -0
- /package/fixtures/{erwartet/verkauf-kleinunternehmer.grid48.txt → expected/sale-small-business.grid48.txt} +0 -0
- /package/fixtures/{erwartet/signaturausfall-verkauf.grid32.txt → expected/signature-outage-sale.grid32.txt} +0 -0
- /package/fixtures/{erwartet/signaturausfall-verkauf.grid48.txt → expected/signature-outage-sale.grid48.txt} +0 -0
- /package/fixtures/{erwartet/split-karte-karte-bar.grid32.txt → expected/split-card-card-cash.grid32.txt} +0 -0
- /package/fixtures/{erwartet/split-karte-karte-bar.grid48.txt → expected/split-card-card-cash.grid48.txt} +0 -0
- /package/fixtures/{erwartet/split-bar-rueckgeld.grid32.txt → expected/split-cash-change.grid32.txt} +0 -0
- /package/fixtures/{erwartet/split-bar-rueckgeld.grid48.txt → expected/split-cash-change.grid48.txt} +0 -0
- /package/fixtures/{erwartet/split-langer-betrag.grid32.txt → expected/split-long-amount.grid32.txt} +0 -0
- /package/fixtures/{erwartet/split-langer-betrag.grid48.txt → expected/split-long-amount.grid48.txt} +0 -0
- /package/fixtures/{erwartet/split-eine-karte-trinkgeld.grid32.txt → expected/split-one-card-tip.grid32.txt} +0 -0
- /package/fixtures/{erwartet/split-eine-karte-trinkgeld.grid48.txt → expected/split-one-card-tip.grid48.txt} +0 -0
- /package/fixtures/{erwartet/split-tischrunde-trinkgeld.grid32.txt → expected/split-table-round-tip.grid32.txt} +0 -0
- /package/fixtures/{erwartet/split-tischrunde-trinkgeld.grid48.txt → expected/split-table-round-tip.grid48.txt} +0 -0
- /package/fixtures/{erwartet/split-trinkgeld-karte.grid32.txt → expected/split-tip-card.grid32.txt} +0 -0
- /package/fixtures/{erwartet/split-trinkgeld-karte.grid48.txt → expected/split-tip-card.grid48.txt} +0 -0
- /package/fixtures/{erwartet/split-zwei-karten-gleicher-anbieter.grid32.txt → expected/split-two-cards-same-provider.grid32.txt} +0 -0
- /package/fixtures/{erwartet/split-zwei-karten-gleicher-anbieter.grid48.txt → expected/split-two-cards-same-provider.grid48.txt} +0 -0
- /package/fixtures/{erwartet/testkasse-verkauf.grid32.txt → expected/test-cashregister-sale.grid32.txt} +0 -0
- /package/fixtures/{erwartet/testkasse-verkauf.grid48.txt → expected/test-cashregister-sale.grid48.txt} +0 -0
- /package/fixtures/{erwartet/testsignatur-verkauf.grid32.txt → expected/test-signature-sale.grid32.txt} +0 -0
- /package/fixtures/{erwartet/testsignatur-verkauf.grid48.txt → expected/test-signature-sale.grid48.txt} +0 -0
- /package/fixtures/{erwartet → expected}/training.grid32.txt +0 -0
- /package/fixtures/{erwartet → expected}/training.grid48.txt +0 -0
- /package/fixtures/{erwartet/null-jahr.grid32.txt → expected/zero-annual.grid32.txt} +0 -0
- /package/fixtures/{erwartet/null-jahr.grid48.txt → expected/zero-annual.grid48.txt} +0 -0
- /package/fixtures/{erwartet/null-schluss.grid32.txt → expected/zero-final.grid32.txt} +0 -0
- /package/fixtures/{erwartet/null-schluss.grid48.txt → expected/zero-final.grid48.txt} +0 -0
- /package/fixtures/{erwartet/null-pruef.grid32.txt → expected/zero-manual.grid32.txt} +0 -0
- /package/fixtures/{erwartet/null-pruef.grid48.txt → expected/zero-manual.grid48.txt} +0 -0
- /package/fixtures/{erwartet/null-monat.grid32.txt → expected/zero-monthly.grid32.txt} +0 -0
- /package/fixtures/{erwartet/null-monat.grid48.txt → expected/zero-monthly.grid48.txt} +0 -0
- /package/fixtures/{erwartet/null-ausfall.grid32.txt → expected/zero-outage-end.grid32.txt} +0 -0
- /package/fixtures/{erwartet/null-ausfall.grid48.txt → expected/zero-outage-end.grid48.txt} +0 -0
- /package/fixtures/{erwartet/null-start.grid32.txt → expected/zero-start.grid32.txt} +0 -0
- /package/fixtures/{erwartet/null-start.grid48.txt → expected/zero-start.grid48.txt} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { fromReceiptCompanyPayload, fromReceiptPayload, } from '../models/index.js';
|
|
1
2
|
import { toViennaWallClock } from '../vienna-time.js';
|
|
2
3
|
import { KasseneckValidationError } from './errors.js';
|
|
3
4
|
/**
|
|
@@ -31,7 +32,7 @@ import { KasseneckValidationError } from './errors.js';
|
|
|
31
32
|
*/
|
|
32
33
|
// `async`, damit auch die Eingabepruefung als abgelehntes Versprechen ankommt
|
|
33
34
|
// und nicht als synchroner Wurf am `await` des Aufrufers vorbei.
|
|
34
|
-
export async function downloadDailyReport(
|
|
35
|
+
export async function downloadDailyReport(transport, date) {
|
|
35
36
|
let wanduhr;
|
|
36
37
|
try {
|
|
37
38
|
wanduhr = toViennaWallClock(date);
|
|
@@ -41,7 +42,7 @@ export async function downloadDailyReport(rufen, date) {
|
|
|
41
42
|
// Rumpf (JSON.stringify macht aus NaN null) und einen ratlosen Serverfehler.
|
|
42
43
|
throw eingabefehler('downloadDailyReport', 'Uebergebener Zeitpunkt ist unbrauchbar (Invalid Date)');
|
|
43
44
|
}
|
|
44
|
-
return
|
|
45
|
+
return transport('downloadDailyReport', { year: wanduhr.year, month: wanduhr.month, day: wanduhr.day });
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
48
|
* Monatsbericht als PDF.
|
|
@@ -53,7 +54,7 @@ export async function downloadDailyReport(rufen, date) {
|
|
|
53
54
|
* `month` geht als **Zahl 1-12** raus (im Flutter-Paket `reportMonth.month.id`,
|
|
54
55
|
* wo `KeckMonth.january.id === 1` ist) — kein Name, kein nullbasierter Index.
|
|
55
56
|
*/
|
|
56
|
-
export async function downloadMonthlyReport(
|
|
57
|
+
export async function downloadMonthlyReport(transport, reportMonth) {
|
|
57
58
|
const { month, year } = reportMonth;
|
|
58
59
|
if (!Number.isInteger(month) || month < 1 || month > 12) {
|
|
59
60
|
throw eingabefehler('downloadReport', `Berichtsmonat: month muss 1-12 sein, war "${month}"`);
|
|
@@ -61,7 +62,38 @@ export async function downloadMonthlyReport(rufen, reportMonth) {
|
|
|
61
62
|
if (!Number.isInteger(year)) {
|
|
62
63
|
throw eingabefehler('downloadReport', `Berichtsmonat: year muss eine ganze Zahl sein, war "${year}"`);
|
|
63
64
|
}
|
|
64
|
-
return
|
|
65
|
+
return transport('downloadReport', { month, year });
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Rohdaten eines Zeitraums (`getReportV2`): alle Belege der Kasse und die
|
|
69
|
+
* Firmendaten fuer Kopf und Fuss. Der Server vergleicht die Zeitstempel als
|
|
70
|
+
* Text (`start <= timeStamp < end`), darum Wiener Wanduhr im Serverformat.
|
|
71
|
+
* Nur ueber den API-Schluessel-Weg (Kasse aus dem `cashregister-token`).
|
|
72
|
+
*/
|
|
73
|
+
export async function getReportV2(transport, options) {
|
|
74
|
+
for (const feld of ['start', 'end']) {
|
|
75
|
+
const wert = options?.[feld];
|
|
76
|
+
if (typeof wert !== 'string' || !/^\d{4}-\d{2}-\d{2}/.test(wert)) {
|
|
77
|
+
throw eingabefehler('getReportV2', `${feld} muss mit YYYY-MM-DD beginnen, war "${String(wert)}"`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (options.start >= options.end) {
|
|
81
|
+
throw eingabefehler('getReportV2', 'end muss nach start liegen (end ist ausschliesslich)');
|
|
82
|
+
}
|
|
83
|
+
const daten = await transport('getReportV2', { start: options.start, end: options.end });
|
|
84
|
+
const liste = daten?.receipts;
|
|
85
|
+
if (!Array.isArray(liste) || liste.some((b) => b == null || typeof b !== 'object' || Array.isArray(b))) {
|
|
86
|
+
throw new KasseneckValidationError('getReportV2', 'Antwort enthaelt keine Belegliste (data.receipts fehlt)', 'response');
|
|
87
|
+
}
|
|
88
|
+
const meta = daten.metadata;
|
|
89
|
+
if (meta == null || typeof meta !== 'object' || Array.isArray(meta)) {
|
|
90
|
+
throw new KasseneckValidationError('getReportV2', 'Antwort enthaelt keine Firmendaten (data.metadata fehlt)', 'response');
|
|
91
|
+
}
|
|
92
|
+
const label = meta.label;
|
|
93
|
+
return {
|
|
94
|
+
receipts: liste.map((b) => fromReceiptPayload(b)),
|
|
95
|
+
metadata: { ...fromReceiptCompanyPayload(meta), label: typeof label === 'string' ? label : '' },
|
|
96
|
+
};
|
|
65
97
|
}
|
|
66
98
|
/** Fehler in der Eingabe des Aufrufers — es geht keine Anfrage raus. */
|
|
67
99
|
function eingabefehler(functionName, grund) {
|
|
@@ -31,13 +31,13 @@ export type CashboxStatus = 'AKTIVIERT' | 'REGISTRIERT' | 'IN_BETRIEB' | 'AUSFAL
|
|
|
31
31
|
*/
|
|
32
32
|
export type SignatureStatus = CashboxStatus | 'NOT_REGISTERED';
|
|
33
33
|
/** Betriebsstatus der Kasse bei FinanzOnline. */
|
|
34
|
-
export declare function getCashboxStatus(
|
|
34
|
+
export declare function getCashboxStatus(transport: InternerTransport): Promise<CashboxStatus>;
|
|
35
35
|
/**
|
|
36
|
-
* Status der Signatureinheit mit der Zertifikatsseriennummer [
|
|
36
|
+
* Status der Signatureinheit mit der Zertifikatsseriennummer [certificateSerialHex]
|
|
37
37
|
* (hexadezimal, z. B. `6F0404F0`).
|
|
38
38
|
*
|
|
39
39
|
* **Der Returncode wird vor dem Status gelesen** (wie im Dart-Vorbild): `B33`
|
|
40
40
|
* heisst "nicht registriert" und schlaegt jedes Statusfeld, das daneben stehen
|
|
41
41
|
* mag. Andersherum meldete eine nie registrierte Karte am Ende "in Betrieb".
|
|
42
42
|
*/
|
|
43
|
-
export declare function getSignatureStatus(
|
|
43
|
+
export declare function getSignatureStatus(transport: InternerTransport, certificateSerialHex: string): Promise<SignatureStatus>;
|
|
@@ -10,23 +10,23 @@ import { KasseneckValidationError } from './errors.js';
|
|
|
10
10
|
const VORGANG_KASSE = 'financeWebService/status_cashbox';
|
|
11
11
|
const VORGANG_SIGNATUR = 'financeWebService/status_signature';
|
|
12
12
|
/** Betriebsstatus der Kasse bei FinanzOnline. */
|
|
13
|
-
export async function getCashboxStatus(
|
|
14
|
-
const daten = await
|
|
13
|
+
export async function getCashboxStatus(transport) {
|
|
14
|
+
const daten = await transport('financeWebService', {}, { method: 'status_cashbox' });
|
|
15
15
|
return statusAusMeldung(daten, VORGANG_KASSE);
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
* Status der Signatureinheit mit der Zertifikatsseriennummer [
|
|
18
|
+
* Status der Signatureinheit mit der Zertifikatsseriennummer [certificateSerialHex]
|
|
19
19
|
* (hexadezimal, z. B. `6F0404F0`).
|
|
20
20
|
*
|
|
21
21
|
* **Der Returncode wird vor dem Status gelesen** (wie im Dart-Vorbild): `B33`
|
|
22
22
|
* heisst "nicht registriert" und schlaegt jedes Statusfeld, das daneben stehen
|
|
23
23
|
* mag. Andersherum meldete eine nie registrierte Karte am Ende "in Betrieb".
|
|
24
24
|
*/
|
|
25
|
-
export async function getSignatureStatus(
|
|
26
|
-
if (typeof
|
|
27
|
-
throw new KasseneckValidationError(VORGANG_SIGNATUR, '
|
|
25
|
+
export async function getSignatureStatus(transport, certificateSerialHex) {
|
|
26
|
+
if (typeof certificateSerialHex !== 'string' || !certificateSerialHex.trim()) {
|
|
27
|
+
throw new KasseneckValidationError(VORGANG_SIGNATUR, 'certificateSerialHex fehlt', 'request');
|
|
28
28
|
}
|
|
29
|
-
const daten = await
|
|
29
|
+
const daten = await transport('financeWebService', { zertifikatnr_hex: certificateSerialHex }, { method: 'status_signature' });
|
|
30
30
|
if (daten?.rkdbMessage?.rc === 'B33') {
|
|
31
31
|
return 'NOT_REGISTERED';
|
|
32
32
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type KasseneckAuth } from './auth.js';
|
|
2
2
|
/**
|
|
3
3
|
* Transport zum Kasseneck-Backend: ein Aufruf ist ein POST an
|
|
4
4
|
* `<basis>/<funktionsname>` mit dem JSON-Rumpf `{ "params": { … } }` — wie im
|
|
@@ -15,12 +15,32 @@ import type { KasseneckAuth } from './auth.js';
|
|
|
15
15
|
* Fehlerarten sind bei beiden dieselben; sie unterscheiden sich nur darin, wie
|
|
16
16
|
* der Antwortrumpf gelesen und ausgewertet wird.
|
|
17
17
|
*
|
|
18
|
+
* **Nur `/v3`, fail closed.** Jede Antwort muss das Kennzeichen
|
|
19
|
+
* `Kasseneck-Api-Version: v3` tragen; fehlt es, wirft der Transport
|
|
20
|
+
* `dialect_mismatch`, **bevor** er den Rumpf liest, und tut nichts weiter
|
|
21
|
+
* (Nachtrag §5.4, Risiko R1: eine Route auf eine Function mit altem Rand
|
|
22
|
+
* haette die englischen Parameter deutsch gedeutet). Eine HTML-Antwort ist
|
|
23
|
+
* `route_missing`: die Hosting-Auffangregel hat den Aufruf abgefangen, bevor
|
|
24
|
+
* ihn eine Function sah.
|
|
25
|
+
*
|
|
26
|
+
* **Kasseneck-Kopfzeilen nur an Kasseneck-Basen** (Nachtrag §6, Risiko R3):
|
|
27
|
+
* `Kasseneck-Api-Version: v3` und `Kasseneck-Client: <produkt>/<version>`
|
|
28
|
+
* setzt der Transport selbst, abhaengig von der Basis, und nie ueber die
|
|
29
|
+
* `fetch`-Umsetzung. Dieselbe Umsetzung darf darum auch Connect, ePOS-Drucker
|
|
30
|
+
* und Terminals bedienen, ohne dass dort eine fremde Kopfzeile den Vorflug
|
|
31
|
+
* scheitern laesst.
|
|
32
|
+
*
|
|
18
33
|
* **Kein Wiederholen fehlgeschlagener Aufrufe.** Ein Beleg ist nicht folgenlos
|
|
19
34
|
* wiederholbar; ohne entschiedene Idempotenz waere ein automatischer zweiter
|
|
20
35
|
* Versuch ein zweiter Beleg.
|
|
21
36
|
*/
|
|
22
|
-
/** Basis-URL der Produktion. */
|
|
23
|
-
export declare const DEFAULT_BASE_URL = "https://api.kasseneck.at/
|
|
37
|
+
/** Basis-URL der oeffentlichen API (Produktion). */
|
|
38
|
+
export declare const DEFAULT_BASE_URL = "https://api.kasseneck.at/v3";
|
|
39
|
+
/**
|
|
40
|
+
* Basis-URL des Kassenwegs (Kanal `app`, Nachtrag §5.2). Die Web-Kasse ruft
|
|
41
|
+
* denselben Weg im gleichen Ursprung als `/api/v3`.
|
|
42
|
+
*/
|
|
43
|
+
export declare const POS_BASE_URL = "https://kasse.kasseneck.at/api/v3";
|
|
24
44
|
/**
|
|
25
45
|
* Zeitlimit je Aufruf (wie im Flutter-Zwilling). Ohne Zeitlimit bleibt eine
|
|
26
46
|
* haengende Anfrage fuer immer offen — der Aufrufer bekaeme weder Ergebnis
|
|
@@ -63,12 +83,44 @@ export type FetchLike = (url: string, init: HttpRequestInit) => Promise<HttpResp
|
|
|
63
83
|
export interface TransportOptions {
|
|
64
84
|
/** Anmeldung; wird pro Aufruf befragt. */
|
|
65
85
|
auth: KasseneckAuth;
|
|
66
|
-
/**
|
|
86
|
+
/**
|
|
87
|
+
* Abweichende Basis der **oeffentlichen** Aufrufe (Vorgabe
|
|
88
|
+
* [DEFAULT_BASE_URL]): alles ausser den 25 Aufrufen des Kassenwegs, und die
|
|
89
|
+
* sechs oeffentlichen davon nur, wenn nicht mit `registerUserAuth`
|
|
90
|
+
* angemeldet. Muss auf `/v3` enden (eigene Proxys erlaubt), sonst wirft das
|
|
91
|
+
* Anlegen; `/v1` oder `/api` gibt es in der 1.x-Linie nicht.
|
|
92
|
+
*/
|
|
67
93
|
baseUrl?: string;
|
|
94
|
+
/**
|
|
95
|
+
* Abweichende Basis des **Kassenwegs** (Vorgabe [POS_BASE_URL]): die 19
|
|
96
|
+
* reinen Kassenaufrufe (Kopplung, Anmeldung, Einstellungen, Artikel,
|
|
97
|
+
* Drucker, ...) und mit `registerUserAuth` alle 25 Aufrufe des Kassenwegs.
|
|
98
|
+
* Die Web-Kasse gibt `'/api/v3'` (gleicher Ursprung). Muss auf `/v3` enden
|
|
99
|
+
* (in der Regel `/api/v3`), sonst wirft das Anlegen.
|
|
100
|
+
*/
|
|
101
|
+
posBaseUrl?: string;
|
|
68
102
|
/** Zeitlimit je Aufruf in Millisekunden. */
|
|
69
103
|
timeoutMs?: number;
|
|
70
104
|
/** Eigene `fetch`-Umsetzung (Tests, Proxys). */
|
|
71
105
|
fetch?: FetchLike;
|
|
106
|
+
/**
|
|
107
|
+
* Wert der Kopfzeile `Kasseneck-Client`, Vorgabe `kasseneck-api/<version>`.
|
|
108
|
+
* Eine App nennt sich selbst (`kasse-web/<build>`, `kasse-app/<version+build>`).
|
|
109
|
+
* Erlaubt sind nur die Produkte `kasse-web`, `kasse-app`, `kasseneck-api`,
|
|
110
|
+
* `kasseneck_api` mit einer Version aus `[0-9A-Za-z.+-]` (hoechstens 40
|
|
111
|
+
* Zeichen, gesamt hoechstens 64); sonst wirft das Anlegen.
|
|
112
|
+
*/
|
|
113
|
+
clientHeader?: string;
|
|
114
|
+
/**
|
|
115
|
+
* `true` laesst `Kasseneck-Api-Version` und `Kasseneck-Client` auch an
|
|
116
|
+
* Kasseneck-Basen weg. Fuer Browser, die die oeffentliche API von einem
|
|
117
|
+
* fremden Ursprung aus rufen: solange der Vorflug unter `/v3` die beiden
|
|
118
|
+
* Kopfzeilen nicht erlaubt, scheiterte sonst jeder Aufruf schon dort. Die
|
|
119
|
+
* Pruefung des Kennzeichens in der **Antwort** bleibt unberuehrt; es entfaellt
|
|
120
|
+
* nur die Gegenpruefung des Rands (`createReceipt`/`cancelReceipt` weisen
|
|
121
|
+
* eine als v3 gekennzeichnete Anfrage auf einem Nicht-v3-Pfad ab).
|
|
122
|
+
*/
|
|
123
|
+
omitKasseneckHeaders?: boolean;
|
|
72
124
|
}
|
|
73
125
|
/**
|
|
74
126
|
* Ruft eine Backend-Funktion auf und liefert deren Nutzlast **ohne Huelle**.
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { isRegisterUserAuth } from './auth.js';
|
|
2
|
+
import { isPosCall, isPosOnlyCall } from './aufrufe.js';
|
|
3
|
+
import { PACKAGE_VERSION } from '../version.js';
|
|
1
4
|
import { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, causeDigest, fehlerDetails, } from './errors.js';
|
|
2
5
|
/**
|
|
3
6
|
* Transport zum Kasseneck-Backend: ein Aufruf ist ein POST an
|
|
@@ -15,12 +18,69 @@ import { KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNet
|
|
|
15
18
|
* Fehlerarten sind bei beiden dieselben; sie unterscheiden sich nur darin, wie
|
|
16
19
|
* der Antwortrumpf gelesen und ausgewertet wird.
|
|
17
20
|
*
|
|
21
|
+
* **Nur `/v3`, fail closed.** Jede Antwort muss das Kennzeichen
|
|
22
|
+
* `Kasseneck-Api-Version: v3` tragen; fehlt es, wirft der Transport
|
|
23
|
+
* `dialect_mismatch`, **bevor** er den Rumpf liest, und tut nichts weiter
|
|
24
|
+
* (Nachtrag §5.4, Risiko R1: eine Route auf eine Function mit altem Rand
|
|
25
|
+
* haette die englischen Parameter deutsch gedeutet). Eine HTML-Antwort ist
|
|
26
|
+
* `route_missing`: die Hosting-Auffangregel hat den Aufruf abgefangen, bevor
|
|
27
|
+
* ihn eine Function sah.
|
|
28
|
+
*
|
|
29
|
+
* **Kasseneck-Kopfzeilen nur an Kasseneck-Basen** (Nachtrag §6, Risiko R3):
|
|
30
|
+
* `Kasseneck-Api-Version: v3` und `Kasseneck-Client: <produkt>/<version>`
|
|
31
|
+
* setzt der Transport selbst, abhaengig von der Basis, und nie ueber die
|
|
32
|
+
* `fetch`-Umsetzung. Dieselbe Umsetzung darf darum auch Connect, ePOS-Drucker
|
|
33
|
+
* und Terminals bedienen, ohne dass dort eine fremde Kopfzeile den Vorflug
|
|
34
|
+
* scheitern laesst.
|
|
35
|
+
*
|
|
18
36
|
* **Kein Wiederholen fehlgeschlagener Aufrufe.** Ein Beleg ist nicht folgenlos
|
|
19
37
|
* wiederholbar; ohne entschiedene Idempotenz waere ein automatischer zweiter
|
|
20
38
|
* Versuch ein zweiter Beleg.
|
|
21
39
|
*/
|
|
22
|
-
/** Basis-URL der Produktion. */
|
|
23
|
-
export const DEFAULT_BASE_URL = 'https://api.kasseneck.at/
|
|
40
|
+
/** Basis-URL der oeffentlichen API (Produktion). */
|
|
41
|
+
export const DEFAULT_BASE_URL = 'https://api.kasseneck.at/v3';
|
|
42
|
+
/**
|
|
43
|
+
* Basis-URL des Kassenwegs (Kanal `app`, Nachtrag §5.2). Die Web-Kasse ruft
|
|
44
|
+
* denselben Weg im gleichen Ursprung als `/api/v3`.
|
|
45
|
+
*/
|
|
46
|
+
export const POS_BASE_URL = 'https://kasse.kasseneck.at/api/v3';
|
|
47
|
+
/** Kennzeichen der `/v3`-Antworten und -Anfragen. */
|
|
48
|
+
const VERSION_KOPF = 'Kasseneck-Api-Version';
|
|
49
|
+
const CLIENT_KOPF = 'Kasseneck-Client';
|
|
50
|
+
const VERSION_WERT = 'v3';
|
|
51
|
+
/**
|
|
52
|
+
* Hosts, die als Kasseneck-Basis gelten, nur ueber https und ohne eigenen
|
|
53
|
+
* Port. Alles andere (Proxys, Emulator, `127.0.0.1` fuer Connect) bekommt die
|
|
54
|
+
* Kasseneck-Kopfzeilen nicht.
|
|
55
|
+
*/
|
|
56
|
+
const KASSENECK_HOSTS = new Set(['api.kasseneck.at', 'kasse.kasseneck.at']);
|
|
57
|
+
/** Die 1.x-Linie spricht nur `/v3`: jede Basis endet so (`/v3` oder `/api/v3`). */
|
|
58
|
+
const V3_ENDE = /\/v3$/;
|
|
59
|
+
/**
|
|
60
|
+
* Aufrufe mit Wirkung, die nie blind wiederholt werden duerfen: sie signieren
|
|
61
|
+
* (`createReceipt`, `cancelReceipt`), loesen bei FinanzOnline etwas aus
|
|
62
|
+
* (`financeWebService`) oder bewegen Geld (`hobexPayApi` belastet eine Karte,
|
|
63
|
+
* `hobexRefundApi` erstattet, `stripeCaptureIntent` zieht eine vorgemerkte
|
|
64
|
+
* Zahlung ein). Scheitert einer, nachdem die Anfrage unterwegs war (Netz,
|
|
65
|
+
* Zeitlimit, HTTP 5xx, unlesbare Erfolgsantwort, HTML mit Kennzeichen), ist
|
|
66
|
+
* sein Ausgang offen.
|
|
67
|
+
*/
|
|
68
|
+
const UNKNOWN_OUTCOME_CALLS = new Set([
|
|
69
|
+
'createReceipt',
|
|
70
|
+
'cancelReceipt',
|
|
71
|
+
'financeWebService',
|
|
72
|
+
'hobexPayApi',
|
|
73
|
+
'hobexRefundApi',
|
|
74
|
+
'stripeCaptureIntent',
|
|
75
|
+
]);
|
|
76
|
+
/**
|
|
77
|
+
* Produkte, die das Backend in `Kasseneck-Client` zaehlt (Positivliste,
|
|
78
|
+
* Nachtrag §6); alles andere zaehlte dort als `ungueltig`. Das Paket weist
|
|
79
|
+
* es darum schon beim Anlegen des Transports ab.
|
|
80
|
+
*/
|
|
81
|
+
const CLIENT_PRODUKTE = new Set(['kasse-web', 'kasse-app', 'kasseneck-api', 'kasseneck_api']);
|
|
82
|
+
const CLIENT_VERSION = /^[0-9A-Za-z.+-]{1,40}$/;
|
|
83
|
+
const CLIENT_MAX = 64;
|
|
24
84
|
/**
|
|
25
85
|
* Zeitlimit je Aufruf (wie im Flutter-Zwilling). Ohne Zeitlimit bleibt eine
|
|
26
86
|
* haengende Anfrage fuer immer offen — der Aufrufer bekaeme weder Ergebnis
|
|
@@ -49,9 +109,22 @@ export function createBinaryTransport(options) {
|
|
|
49
109
|
* `auswerten`.
|
|
50
110
|
*/
|
|
51
111
|
function createCore(options) {
|
|
52
|
-
const
|
|
112
|
+
const oeffentlicheBasis = v3Basis('baseUrl', options.baseUrl) ?? DEFAULT_BASE_URL;
|
|
113
|
+
const kassenBasis = v3Basis('posBaseUrl', options.posBaseUrl) ?? POS_BASE_URL;
|
|
114
|
+
const kassenweg = isRegisterUserAuth(options.auth);
|
|
53
115
|
const zeitlimitMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
54
116
|
const holen = options.fetch ?? globalesFetch();
|
|
117
|
+
const kennung = options.clientHeader ?? `kasseneck-api/${PACKAGE_VERSION}`;
|
|
118
|
+
pruefeKennung(kennung);
|
|
119
|
+
const kopfzeilenSenden = options.omitKasseneckHeaders !== true;
|
|
120
|
+
/**
|
|
121
|
+
* Basis je Aufruf. Die 19 reinen Kassenaufrufe gehen immer an den
|
|
122
|
+
* Kassenweg (unter der oeffentlichen Basis gibt es sie nicht), und die
|
|
123
|
+
* Kassen-Anmeldung ruft alle 25 Aufrufe des Kassenwegs dort, auch die sechs
|
|
124
|
+
* oeffentlichen (Kanal `app`). Was der Kassenweg gar nicht fuehrt
|
|
125
|
+
* (Berichte, Zahlungen, FinanzOnline), geht an die oeffentliche Basis.
|
|
126
|
+
*/
|
|
127
|
+
const basisFuer = (functionName) => isPosOnlyCall(functionName) || (kassenweg && isPosCall(functionName)) ? kassenBasis : oeffentlicheBasis;
|
|
55
128
|
return async function aufrufen(functionName, params = {}, extraBodyFields, secretParams, lesen, auswerten) {
|
|
56
129
|
// Die URL nennt die Backend-Funktion, die Fehler nennen den **Vorgang**:
|
|
57
130
|
// `financeWebService` fuehrt ein Dutzend verschiedener Vorgaenge unter einem
|
|
@@ -87,13 +160,26 @@ function createCore(options) {
|
|
|
87
160
|
// Geraetegeheimnis, PIN). Ohne die zweite Haelfte greift die Zusage genau
|
|
88
161
|
// dort nicht, wo es gar keine Kopfzeilen gibt.
|
|
89
162
|
const geheimnisse = [...Object.values(anmeldung.headers), ...(secretParams ?? [])];
|
|
163
|
+
// Bis zur ersten Antwort (bzw. beim Lesen des Rumpfs) ist alles Scheitern
|
|
164
|
+
// Netz oder Zeitlimit.
|
|
165
|
+
const netzfehler = (ursache) => {
|
|
166
|
+
// Ein Formfehler des Pakets ist kein Netzfehler und behaelt seine Art
|
|
167
|
+
// (der Binaerweg wirft ihn, wenn die fetch-Antwort keine Bytes liefert).
|
|
168
|
+
if (ursache instanceof KasseneckValidationError) {
|
|
169
|
+
return ursache;
|
|
170
|
+
}
|
|
171
|
+
// Bis hierher kam keine verwertbare Antwort: Netz weg oder Zeitlimit.
|
|
172
|
+
// Die Anfrage war schon unterwegs: bei einem Aufruf mit Wirkung kann
|
|
173
|
+
// der Beleg bzw. die Zahlung entstanden sein (Ausgang unklar, nachlesen).
|
|
174
|
+
return new KasseneckNetworkError(fehlerName, abbruch.signal.aborted, zeitlimitMs, causeDigest(ursache, geheimnisse), UNKNOWN_OUTCOME_CALLS.has(functionName) ? 'unknown' : 'rejected');
|
|
175
|
+
};
|
|
176
|
+
const basis = basisFuer(functionName);
|
|
90
177
|
const url = `${basis}/${encodeURIComponent(functionName)}`;
|
|
91
178
|
// `params` steht ZULETZT: so kann kein Zusatzfeld die Nutzlast (und mit
|
|
92
179
|
// ihr die Kassenbindung aus der Anmeldung) verdraengen — auch nicht von
|
|
93
180
|
// einem Verbraucher, der ohne Typen an TransportBodyFields vorbeikommt.
|
|
94
181
|
const rumpf = JSON.stringify({ ...extraBodyFields, params: nutzlast(anmeldung.params, params) });
|
|
95
182
|
let antwort;
|
|
96
|
-
let koerper;
|
|
97
183
|
try {
|
|
98
184
|
// Auch der Aufruf laeuft gegen den Abbruch — nicht nur die Anmeldung.
|
|
99
185
|
// Das `AbortSignal` geht zwar mit, aber ob eine fetch-Umsetzung es
|
|
@@ -106,30 +192,69 @@ function createCore(options) {
|
|
|
106
192
|
antwort = await Promise.race([
|
|
107
193
|
holen(url, {
|
|
108
194
|
method: 'POST',
|
|
109
|
-
headers: {
|
|
195
|
+
headers: {
|
|
196
|
+
'Content-Type': 'application/json',
|
|
197
|
+
...ohneKasseneckKopfzeilen(anmeldung.headers),
|
|
198
|
+
...(kopfzeilenSenden && istKasseneckBasis(basis)
|
|
199
|
+
? { [VERSION_KOPF]: VERSION_WERT, [CLIENT_KOPF]: kennung }
|
|
200
|
+
: {}),
|
|
201
|
+
},
|
|
110
202
|
body: rumpf,
|
|
111
203
|
signal: abbruch.signal,
|
|
112
204
|
}),
|
|
113
205
|
abbruchAlsAblehnung(abbruch.signal),
|
|
114
206
|
]);
|
|
115
|
-
koerper = await Promise.race([lesen(antwort, fehlerName), abbruchAlsAblehnung(abbruch.signal)]);
|
|
116
207
|
}
|
|
117
208
|
catch (ursache) {
|
|
118
|
-
|
|
119
|
-
// (der Binaerweg wirft ihn, wenn die fetch-Antwort keine Bytes liefert).
|
|
120
|
-
if (ursache instanceof KasseneckValidationError) {
|
|
121
|
-
throw ursache;
|
|
122
|
-
}
|
|
123
|
-
// Bis hierher kam keine verwertbare Antwort: Netz weg oder Zeitlimit.
|
|
124
|
-
throw new KasseneckNetworkError(fehlerName, abbruch.signal.aborted, zeitlimitMs, causeDigest(ursache, geheimnisse));
|
|
209
|
+
throw netzfehler(ursache);
|
|
125
210
|
}
|
|
211
|
+
// Alles Folgende entscheidet an den Kopfzeilen, **bevor** der Rumpf
|
|
212
|
+
// gelesen wird: was nicht vom `/v3`-Rand kommt, wird nicht gedeutet.
|
|
126
213
|
const inhaltstyp = antwort.headers.get('content-type') ?? undefined;
|
|
127
214
|
// Das Backend antwortet auf jeden fachlichen Ausgang mit HTTP 200; alles
|
|
128
|
-
// andere kommt nicht von ihm (Proxy, Rewrite-Luecke, Infrastruktur).
|
|
215
|
+
// andere kommt nicht von ihm (Proxy, Rewrite-Luecke, Infrastruktur). Das
|
|
216
|
+
// steht VOR der HTML-Pruefung: eine 500er-Fehlerseite ist auch HTML, aber
|
|
217
|
+
// dort kann eine Function gelaufen sein; `route_missing` sagt das Gegenteil.
|
|
129
218
|
if (antwort.status !== 200) {
|
|
130
|
-
|
|
219
|
+
// Ausnahme: der `/v3`-Rand antwortet auf einen unbekannten Endpunkt mit
|
|
220
|
+
// HTTP 404, Kennzeichen und Huelle samt Code (`not_found`). Nur mit
|
|
221
|
+
// Kennzeichen wird dieser Rumpf gelesen.
|
|
222
|
+
if (antwort.status === 404 && traegtKennzeichen(antwort)) {
|
|
223
|
+
const fehler = await randFehler404(antwort, fehlerName, geheimnisse, abbruch.signal);
|
|
224
|
+
if (fehler)
|
|
225
|
+
throw fehler;
|
|
226
|
+
}
|
|
227
|
+
// 5xx auf einem Aufruf mit Wirkung: der Handler kann gelaufen sein.
|
|
228
|
+
const ausgang = antwort.status >= 500 && UNKNOWN_OUTCOME_CALLS.has(functionName) ? 'unknown' : 'rejected';
|
|
229
|
+
throw new KasseneckHttpError(fehlerName, antwort.status, inhaltstyp, 'server-error', ausgang);
|
|
230
|
+
}
|
|
231
|
+
// HTTP 200 mit HTML: die Auffangregel der Single-Page-App hat den Aufruf
|
|
232
|
+
// bedient, keine Function hat ihn gesehen (Nachtrag §5.4, R15).
|
|
233
|
+
if (inhaltstyp !== undefined && /^\s*text\/html\b/i.test(inhaltstyp)) {
|
|
234
|
+
// Mit Kennzeichen hat der `/v3`-Rand den Aufruf gesehen (etwa ein
|
|
235
|
+
// Proxy, der nur den Inhaltstyp umschreibt). Bei einem Aufruf mit
|
|
236
|
+
// Wirkung kann der Beleg bzw. die Zahlung dann entstanden sein: unlesbarer Rumpf,
|
|
237
|
+
// Ausgang unklar, statt `route_missing`.
|
|
238
|
+
if (UNKNOWN_OUTCOME_CALLS.has(functionName) && traegtKennzeichen(antwort)) {
|
|
239
|
+
throw new KasseneckHttpError(fehlerName, antwort.status, inhaltstyp, 'not-json', 'unknown');
|
|
240
|
+
}
|
|
241
|
+
throw new KasseneckApiError(fehlerName, 'Route fehlt: die Antwort ist eine HTML-Seite statt des Backends', {}, 'route_missing');
|
|
242
|
+
}
|
|
243
|
+
if (!traegtKennzeichen(antwort)) {
|
|
244
|
+
throw new KasseneckApiError(fehlerName, 'Server spricht nicht /v3 (Kennzeichen Kasseneck-Api-Version fehlt); Antwort verworfen', {}, 'dialect_mismatch');
|
|
245
|
+
}
|
|
246
|
+
let koerper;
|
|
247
|
+
try {
|
|
248
|
+
koerper = await Promise.race([lesen(antwort, fehlerName), abbruchAlsAblehnung(abbruch.signal)]);
|
|
131
249
|
}
|
|
132
|
-
|
|
250
|
+
catch (ursache) {
|
|
251
|
+
throw netzfehler(ursache);
|
|
252
|
+
}
|
|
253
|
+
// Ab hier kam HTTP 200 mit Kennzeichen: der `/v3`-Rand hat den Aufruf
|
|
254
|
+
// gesehen. Ist der Rumpf dann unlesbar (gekuerzt von einem Proxy,
|
|
255
|
+
// abgebrochene Verbindung), kann ein Handler mit Wirkung gelaufen sein.
|
|
256
|
+
const unlesbar = UNKNOWN_OUTCOME_CALLS.has(functionName) ? 'unknown' : 'rejected';
|
|
257
|
+
return auswerten(koerper, fehlerName, antwort.status, inhaltstyp, geheimnisse, unlesbar);
|
|
133
258
|
}
|
|
134
259
|
finally {
|
|
135
260
|
// Ohne Abraeumen haelt der Wecker den Node-Prozess bis zum Zeitlimit wach.
|
|
@@ -137,6 +262,90 @@ function createCore(options) {
|
|
|
137
262
|
}
|
|
138
263
|
};
|
|
139
264
|
}
|
|
265
|
+
/** Traegt die Antwort das Kennzeichen `Kasseneck-Api-Version: v3`? */
|
|
266
|
+
function traegtKennzeichen(antwort) {
|
|
267
|
+
return (antwort.headers.get(VERSION_KOPF) ?? '').trim().toLowerCase() === VERSION_WERT;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Liest die 404-Huelle des `/v3`-Rands. Liefert den fachlichen Fehler, wenn
|
|
271
|
+
* es eine Fehlerhuelle mit Code ist, sonst `null` (dann bleibt es beim
|
|
272
|
+
* HTTP-Fehler). Ein Lesefehler zaehlt ebenfalls als `null`.
|
|
273
|
+
*/
|
|
274
|
+
async function randFehler404(antwort, functionName, geheimnisse, signal) {
|
|
275
|
+
try {
|
|
276
|
+
const text = await Promise.race([antwort.text(), abbruchAlsAblehnung(signal)]);
|
|
277
|
+
const huelle = alsHuelle(JSON.parse(text));
|
|
278
|
+
if (huelle === null || huelle.status === 'success')
|
|
279
|
+
return null;
|
|
280
|
+
const fehler = fachfehler(functionName, huelle.message, huelle.data, geheimnisse, huelle.code);
|
|
281
|
+
return fehler.code === undefined ? null : fehler;
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Prueft eine abweichende Basis beim Anlegen: die 1.x-Linie spricht nur
|
|
289
|
+
* `/v3`. Liefert sie ohne abschliessende Schraegstriche, oder `undefined`
|
|
290
|
+
* ohne Angabe.
|
|
291
|
+
*/
|
|
292
|
+
function v3Basis(option, basis) {
|
|
293
|
+
if (basis === undefined)
|
|
294
|
+
return undefined;
|
|
295
|
+
const ohne = typeof basis === 'string' ? basis.replace(/\/+$/, '') : '';
|
|
296
|
+
if (!V3_ENDE.test(ohne)) {
|
|
297
|
+
const beispiel = option === 'posBaseUrl' ? "'/api/v3' bzw. POS_BASE_URL" : 'DEFAULT_BASE_URL';
|
|
298
|
+
throw new KasseneckValidationError('createTransport', `${option} muss auf /v3 oder /api/v3 enden (1.x spricht nur /v3; z. B. ${beispiel} statt /api oder /v1)`, 'request');
|
|
299
|
+
}
|
|
300
|
+
return ohne;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Ist `basis` eine Kasseneck-Basis? Relativ (gleicher Ursprung) immer,
|
|
304
|
+
* ausser `//host` (fremder Host ohne Schema); absolut nur
|
|
305
|
+
* `https://api.kasseneck.at` bzw. `https://kasse.kasseneck.at` ohne Port und
|
|
306
|
+
* ohne Zugangsdaten.
|
|
307
|
+
*/
|
|
308
|
+
function istKasseneckBasis(basis) {
|
|
309
|
+
if (basis.startsWith('//'))
|
|
310
|
+
return false;
|
|
311
|
+
let adresse;
|
|
312
|
+
try {
|
|
313
|
+
adresse = new URL(basis);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
// Keine absolute Adresse: relativ zum eigenen Ursprung.
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
return adresse.protocol === 'https:'
|
|
320
|
+
&& adresse.port === ''
|
|
321
|
+
&& adresse.username === ''
|
|
322
|
+
&& adresse.password === ''
|
|
323
|
+
&& KASSENECK_HOSTS.has(adresse.hostname);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Die beiden Kasseneck-Kopfzeilen setzt allein der Transport. Liefert die
|
|
327
|
+
* Anmeldung sie mit (in beliebiger Schreibweise), fallen sie weg: sonst kaeme
|
|
328
|
+
* ein zweiter Wert daneben, oder eine fremde Basis bekaeme sie doch.
|
|
329
|
+
*/
|
|
330
|
+
function ohneKasseneckKopfzeilen(kopfzeilen) {
|
|
331
|
+
const gesperrt = new Set([VERSION_KOPF.toLowerCase(), CLIENT_KOPF.toLowerCase()]);
|
|
332
|
+
const ergebnis = {};
|
|
333
|
+
for (const [name, wert] of Object.entries(kopfzeilen)) {
|
|
334
|
+
if (!gesperrt.has(name.toLowerCase()))
|
|
335
|
+
ergebnis[name] = wert;
|
|
336
|
+
}
|
|
337
|
+
return ergebnis;
|
|
338
|
+
}
|
|
339
|
+
/** Prueft `Kasseneck-Client` gegen Positivliste und Form (Nachtrag §6). */
|
|
340
|
+
function pruefeKennung(kennung) {
|
|
341
|
+
const text = typeof kennung === 'string' ? kennung : '';
|
|
342
|
+
const trenner = text.indexOf('/');
|
|
343
|
+
const produkt = trenner > 0 ? text.slice(0, trenner) : '';
|
|
344
|
+
const version = trenner > 0 ? text.slice(trenner + 1) : '';
|
|
345
|
+
if (text.length > CLIENT_MAX || !CLIENT_PRODUKTE.has(produkt) || !CLIENT_VERSION.test(version)) {
|
|
346
|
+
throw new KasseneckValidationError('createTransport', 'clientHeader muss <produkt>/<version> sein (Produkt: kasse-web, kasse-app, kasseneck-api, kasseneck_api)', 'request');
|
|
347
|
+
}
|
|
348
|
+
}
|
|
140
349
|
/** JSON-Weg: der Rumpf ist Text. */
|
|
141
350
|
const alsText = (antwort) => antwort.text();
|
|
142
351
|
/**
|
|
@@ -154,9 +363,9 @@ const alsBytes = async (antwort, functionName) => {
|
|
|
154
363
|
return new Uint8Array(await antwort.arrayBuffer());
|
|
155
364
|
};
|
|
156
365
|
/** Auswertung des JSON-Wegs: Huelle aufloesen, Nutzlast zurueckgeben. */
|
|
157
|
-
function jsonAuswerten(text, functionName, statusCode, inhaltstyp, geheimnisse) {
|
|
366
|
+
function jsonAuswerten(text, functionName, statusCode, inhaltstyp, geheimnisse, unlesbar) {
|
|
158
367
|
if (!text.trim()) {
|
|
159
|
-
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body');
|
|
368
|
+
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body', unlesbar);
|
|
160
369
|
}
|
|
161
370
|
let roh;
|
|
162
371
|
try {
|
|
@@ -165,11 +374,11 @@ function jsonAuswerten(text, functionName, statusCode, inhaltstyp, geheimnisse)
|
|
|
165
374
|
catch {
|
|
166
375
|
// Typischer Fall: der Aufruf landete mangels Rewrite auf der HTML-Seite
|
|
167
376
|
// der Single-Page-App — HTTP 200, aber kein JSON.
|
|
168
|
-
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json');
|
|
377
|
+
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json', unlesbar);
|
|
169
378
|
}
|
|
170
379
|
const huelle = alsHuelle(roh);
|
|
171
380
|
if (huelle === null) {
|
|
172
|
-
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status');
|
|
381
|
+
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status', unlesbar);
|
|
173
382
|
}
|
|
174
383
|
if (huelle.status === 'success') {
|
|
175
384
|
return huelle.data;
|
|
@@ -191,9 +400,9 @@ function jsonAuswerten(text, functionName, statusCode, inhaltstyp, geheimnisse)
|
|
|
191
400
|
* das Backend hier erzeugt (pdf-lib). Alles, was nicht so anfaengt, ist kein
|
|
192
401
|
* Bericht — und wird dann daraufhin angesehen, ob es die Fehlerhuelle ist.
|
|
193
402
|
*/
|
|
194
|
-
function pdfAuswerten(bytes, functionName, statusCode, inhaltstyp, geheimnisse) {
|
|
403
|
+
function pdfAuswerten(bytes, functionName, statusCode, inhaltstyp, geheimnisse, unlesbar) {
|
|
195
404
|
if (bytes.length === 0) {
|
|
196
|
-
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body');
|
|
405
|
+
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body', unlesbar);
|
|
197
406
|
}
|
|
198
407
|
if (istPdf(bytes)) {
|
|
199
408
|
return bytes;
|
|
@@ -209,11 +418,11 @@ function pdfAuswerten(bytes, functionName, statusCode, inhaltstyp, geheimnisse)
|
|
|
209
418
|
roh = JSON.parse(new TextDecoder('utf-8').decode(bytes));
|
|
210
419
|
}
|
|
211
420
|
catch {
|
|
212
|
-
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json');
|
|
421
|
+
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json', unlesbar);
|
|
213
422
|
}
|
|
214
423
|
const huelle = alsHuelle(roh);
|
|
215
424
|
if (huelle === null) {
|
|
216
|
-
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status');
|
|
425
|
+
throw new KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status', unlesbar);
|
|
217
426
|
}
|
|
218
427
|
if (huelle.status === 'success') {
|
|
219
428
|
// Erfolg gemeldet, aber kein PDF geliefert: die Antwort traegt nicht, was
|
|
@@ -8,7 +8,7 @@ import { defineEnum } from './define-enum.js';
|
|
|
8
8
|
export const VatRate = defineEnum({
|
|
9
9
|
vat0: { value: 'vat0', rate: 0, category: 'D' },
|
|
10
10
|
// Grundnahrungsmittel ab 01.07.2026 -> Betrag-Satz-Besonders (BMF/RKSV)
|
|
11
|
-
|
|
11
|
+
vat4_9: { value: 'vat4_9', rate: 4.9, category: 'G' },
|
|
12
12
|
vat10: { value: 'vat10', rate: 10, category: 'B' },
|
|
13
13
|
vat13: { value: 'vat13', rate: 13, category: 'C' },
|
|
14
14
|
vat19: { value: 'vat19', rate: 19, category: 'E' },
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { ReceiptType, type ReceiptTypeKey, VatRate, type VatRateKey, KeckPaymentMethod, type KeckPaymentMethodKey, CreditCardProvider, type CreditCardProviderKey, VoucherType, type VoucherTypeKey, VoucherAction, type VoucherActionKey, StripeLinkMode, type StripeLinkModeKey, } from './enums/index.js';
|
|
2
|
-
export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type TipRecipient, isTipItem, type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid, type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, type CancellationErrorCode, CANCELLATION_REASONS, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isCancellationErrorCode, type ReceiptPayment, type ReceiptPaymentPayload, type ReceiptPaymentInput, fromReceiptPaymentPayload, toReceiptPaymentPayload, type PaymentErrorCode, PAYMENT_ERROR_CODES, isPaymentErrorCode, type ReceiptEmailErrorCode, RECEIPT_EMAIL_ERROR_CODES, isReceiptEmailErrorCode, remainingQuantities, type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS,
|
|
3
|
-
export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type RegisterUserAuthOptions, apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport,
|
|
2
|
+
export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type TipRecipient, isTipItem, type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid, type Receipt, type RegistrationInfo, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, type CancellationErrorCode, type CancellationStatus, CANCELLATION_REASONS, CANCELLATION_STATUSES, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isCancellationErrorCode, cancellationErrorCode, isCancellationError, cancellationFieldErrors, type CancellationFieldError, type ReceiptPayment, type ReceiptPaymentPayload, type ReceiptPaymentInput, fromReceiptPaymentPayload, toReceiptPaymentPayload, type PaymentErrorCode, PAYMENT_ERROR_CODES, isPaymentErrorCode, paymentErrorCode, isPaymentError, paymentFieldErrors, type PaymentFieldError, type ReceiptEmailErrorCode, type ReceiptEmailVia, RECEIPT_EMAIL_ERROR_CODES, RECEIPT_EMAIL_SEND_ERROR_CODES, type ReceiptEmailSendErrorCode, RECEIPT_EMAIL_VIAS, isReceiptEmailErrorCode, receiptEmailErrorCode, isReceiptEmailError, receiptEmailFieldErrors, type ReceiptEmailFieldError, type ReceiptErrorCode, type ReceiptFieldError, RECEIPT_ERROR_CODES, isReceiptErrorCode, receiptErrorCode, isReceiptError, receiptFieldErrors, remainingQuantities, type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, isZeroKind, type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, type HobexReceipt, type HobexReceiptPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
|
|
3
|
+
export { type AuthCredentials, type KasseneckAuth, type ApiKeyAuthOptions, type RegisterUserAuthOptions, apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, POS_BASE_URL, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, ALL_CALLS, type ApiCall, PUBLIC_CALLS, POS_CALLS, type PublicCall, type PosCall, createTransport, createBinaryTransport, 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, type ReceiptCommonOptions, type SellReceiptOptions, type TipOptions, type TipRecipientShare, type CancelReceiptOptions, type CancelReceiptResult, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, paymentsExpectedCents, cardRefundReference, receiptLayoutFromResult, cancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, listMyCashregisters, checkVoucherCombinationError, type SendReceiptEmailOptions, type SendReceiptEmailResult, sendReceiptEmail, downloadDailyReport, downloadMonthlyReport, getReportV2, type ReportV2, type ReportV2Metadata, type ReportV2Options, type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, type KasseneckApi, createKasseneckApi, } from './client/index.js';
|
|
4
|
+
export { type ReceiptDueTip, type ReceiptDueTipRecipient, type ReceiptDueOptions, type ReceiptDueBuckets, type ReceiptDueBreakdown, receiptDueCents, receiptDueBreakdown, } from './receipt/due.js';
|
|
4
5
|
export { parseServerTimeStamp, toViennaWallClock, type ViennaWallClock } from './vienna-time.js';
|
|
5
|
-
export { type
|
|
6
|
+
export { type PosBusinessSettings, type PosDeviceSettings, type PosSettings, type ArticleGroup, type PosArticle, POS_BUSINESS_DEFAULTS, POS_DEVICE_DEFAULTS, mergePosSettings, fromArticleGroupPayload, fromPosArticlePayload, listMyArticleGroups, listMyArticles, getPosSettings, setMyPosSettings, setMyRegisterDeviceSettings, distributeDiscount, cancelScopeOf, receiptsScopeOf, } from './pos/index.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { ReceiptType, VatRate, KeckPaymentMethod, CreditCardProvider, VoucherType, VoucherAction, StripeLinkMode, } from './enums/index.js';
|
|
2
|
-
export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, isTipItem, toVoucherPayload, fromVoucherPayload, voucherIsValid, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, CANCELLATION_REASONS, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isCancellationErrorCode, fromReceiptPaymentPayload, toReceiptPaymentPayload, PAYMENT_ERROR_CODES, isPaymentErrorCode, RECEIPT_EMAIL_ERROR_CODES, isReceiptEmailErrorCode, remainingQuantities, fromReceiptCompanyPayload, receiptCompanyTaxInfo, fromCashregisterPayload, fromReceiptSummaryPayload, ZERO_KINDS,
|
|
3
|
-
export { apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS,
|
|
2
|
+
export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, isTipItem, toVoucherPayload, fromVoucherPayload, voucherIsValid, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, CANCELLATION_REASONS, CANCELLATION_STATUSES, CANCELLATION_ERROR_CODES, CANCELLATION_RESERVATION_MS, isCancellationReason, isCancellationErrorCode, cancellationErrorCode, isCancellationError, cancellationFieldErrors, fromReceiptPaymentPayload, toReceiptPaymentPayload, PAYMENT_ERROR_CODES, isPaymentErrorCode, paymentErrorCode, isPaymentError, paymentFieldErrors, RECEIPT_EMAIL_ERROR_CODES, RECEIPT_EMAIL_SEND_ERROR_CODES, RECEIPT_EMAIL_VIAS, isReceiptEmailErrorCode, receiptEmailErrorCode, isReceiptEmailError, receiptEmailFieldErrors, RECEIPT_ERROR_CODES, isReceiptErrorCode, receiptErrorCode, isReceiptError, receiptFieldErrors, remainingQuantities, fromReceiptCompanyPayload, receiptCompanyTaxInfo, fromCashregisterPayload, fromReceiptSummaryPayload, ZERO_KINDS, isZeroKind, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
|
|
3
|
+
export { apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, POS_BASE_URL, DEFAULT_TIMEOUT_MS, ALL_CALLS, PUBLIC_CALLS, POS_CALLS, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, CLIENT_ERROR_CODES, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, isOutcomeUnknown, sellReceipt, sellReceiptWithCompany, paymentsExpectedCents, cardRefundReference, receiptLayoutFromResult, cancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, listMyCashregisters, checkVoucherCombinationError, sendReceiptEmail, downloadDailyReport, downloadMonthlyReport, getReportV2, getCashboxStatus, getSignatureStatus, createKasseneckApi, } from './client/index.js';
|
|
4
|
+
export { receiptDueCents, receiptDueBreakdown, } from './receipt/due.js';
|
|
4
5
|
export { parseServerTimeStamp, toViennaWallClock } from './vienna-time.js';
|
|
5
|
-
export {
|
|
6
|
+
export { POS_BUSINESS_DEFAULTS, POS_DEVICE_DEFAULTS, mergePosSettings, fromArticleGroupPayload, fromPosArticlePayload, listMyArticleGroups, listMyArticles, getPosSettings, setMyPosSettings, setMyRegisterDeviceSettings, distributeDiscount, cancelScopeOf, receiptsScopeOf, } from './pos/index.js';
|