@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
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.downloadDailyReport = downloadDailyReport;
|
|
4
4
|
exports.downloadMonthlyReport = downloadMonthlyReport;
|
|
5
|
+
exports.getReportV2 = getReportV2;
|
|
6
|
+
const index_js_1 = require("../models/index.js");
|
|
5
7
|
const vienna_time_js_1 = require("../vienna-time.js");
|
|
6
8
|
const errors_js_1 = require("./errors.js");
|
|
7
9
|
/**
|
|
@@ -35,7 +37,7 @@ const errors_js_1 = require("./errors.js");
|
|
|
35
37
|
*/
|
|
36
38
|
// `async`, damit auch die Eingabepruefung als abgelehntes Versprechen ankommt
|
|
37
39
|
// und nicht als synchroner Wurf am `await` des Aufrufers vorbei.
|
|
38
|
-
async function downloadDailyReport(
|
|
40
|
+
async function downloadDailyReport(transport, date) {
|
|
39
41
|
let wanduhr;
|
|
40
42
|
try {
|
|
41
43
|
wanduhr = (0, vienna_time_js_1.toViennaWallClock)(date);
|
|
@@ -45,7 +47,7 @@ async function downloadDailyReport(rufen, date) {
|
|
|
45
47
|
// Rumpf (JSON.stringify macht aus NaN null) und einen ratlosen Serverfehler.
|
|
46
48
|
throw eingabefehler('downloadDailyReport', 'Uebergebener Zeitpunkt ist unbrauchbar (Invalid Date)');
|
|
47
49
|
}
|
|
48
|
-
return
|
|
50
|
+
return transport('downloadDailyReport', { year: wanduhr.year, month: wanduhr.month, day: wanduhr.day });
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
51
53
|
* Monatsbericht als PDF.
|
|
@@ -57,7 +59,7 @@ async function downloadDailyReport(rufen, date) {
|
|
|
57
59
|
* `month` geht als **Zahl 1-12** raus (im Flutter-Paket `reportMonth.month.id`,
|
|
58
60
|
* wo `KeckMonth.january.id === 1` ist) — kein Name, kein nullbasierter Index.
|
|
59
61
|
*/
|
|
60
|
-
async function downloadMonthlyReport(
|
|
62
|
+
async function downloadMonthlyReport(transport, reportMonth) {
|
|
61
63
|
const { month, year } = reportMonth;
|
|
62
64
|
if (!Number.isInteger(month) || month < 1 || month > 12) {
|
|
63
65
|
throw eingabefehler('downloadReport', `Berichtsmonat: month muss 1-12 sein, war "${month}"`);
|
|
@@ -65,7 +67,38 @@ async function downloadMonthlyReport(rufen, reportMonth) {
|
|
|
65
67
|
if (!Number.isInteger(year)) {
|
|
66
68
|
throw eingabefehler('downloadReport', `Berichtsmonat: year muss eine ganze Zahl sein, war "${year}"`);
|
|
67
69
|
}
|
|
68
|
-
return
|
|
70
|
+
return transport('downloadReport', { month, year });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Rohdaten eines Zeitraums (`getReportV2`): alle Belege der Kasse und die
|
|
74
|
+
* Firmendaten fuer Kopf und Fuss. Der Server vergleicht die Zeitstempel als
|
|
75
|
+
* Text (`start <= timeStamp < end`), darum Wiener Wanduhr im Serverformat.
|
|
76
|
+
* Nur ueber den API-Schluessel-Weg (Kasse aus dem `cashregister-token`).
|
|
77
|
+
*/
|
|
78
|
+
async function getReportV2(transport, options) {
|
|
79
|
+
for (const feld of ['start', 'end']) {
|
|
80
|
+
const wert = options?.[feld];
|
|
81
|
+
if (typeof wert !== 'string' || !/^\d{4}-\d{2}-\d{2}/.test(wert)) {
|
|
82
|
+
throw eingabefehler('getReportV2', `${feld} muss mit YYYY-MM-DD beginnen, war "${String(wert)}"`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (options.start >= options.end) {
|
|
86
|
+
throw eingabefehler('getReportV2', 'end muss nach start liegen (end ist ausschliesslich)');
|
|
87
|
+
}
|
|
88
|
+
const daten = await transport('getReportV2', { start: options.start, end: options.end });
|
|
89
|
+
const liste = daten?.receipts;
|
|
90
|
+
if (!Array.isArray(liste) || liste.some((b) => b == null || typeof b !== 'object' || Array.isArray(b))) {
|
|
91
|
+
throw new errors_js_1.KasseneckValidationError('getReportV2', 'Antwort enthaelt keine Belegliste (data.receipts fehlt)', 'response');
|
|
92
|
+
}
|
|
93
|
+
const meta = daten.metadata;
|
|
94
|
+
if (meta == null || typeof meta !== 'object' || Array.isArray(meta)) {
|
|
95
|
+
throw new errors_js_1.KasseneckValidationError('getReportV2', 'Antwort enthaelt keine Firmendaten (data.metadata fehlt)', 'response');
|
|
96
|
+
}
|
|
97
|
+
const label = meta.label;
|
|
98
|
+
return {
|
|
99
|
+
receipts: liste.map((b) => (0, index_js_1.fromReceiptPayload)(b)),
|
|
100
|
+
metadata: { ...(0, index_js_1.fromReceiptCompanyPayload)(meta), label: typeof label === 'string' ? label : '' },
|
|
101
|
+
};
|
|
69
102
|
}
|
|
70
103
|
/** Fehler in der Eingabe des Aufrufers — es geht keine Anfrage raus. */
|
|
71
104
|
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>;
|
|
@@ -14,23 +14,23 @@ const errors_js_1 = require("./errors.js");
|
|
|
14
14
|
const VORGANG_KASSE = 'financeWebService/status_cashbox';
|
|
15
15
|
const VORGANG_SIGNATUR = 'financeWebService/status_signature';
|
|
16
16
|
/** Betriebsstatus der Kasse bei FinanzOnline. */
|
|
17
|
-
async function getCashboxStatus(
|
|
18
|
-
const daten = await
|
|
17
|
+
async function getCashboxStatus(transport) {
|
|
18
|
+
const daten = await transport('financeWebService', {}, { method: 'status_cashbox' });
|
|
19
19
|
return statusAusMeldung(daten, VORGANG_KASSE);
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
* Status der Signatureinheit mit der Zertifikatsseriennummer [
|
|
22
|
+
* Status der Signatureinheit mit der Zertifikatsseriennummer [certificateSerialHex]
|
|
23
23
|
* (hexadezimal, z. B. `6F0404F0`).
|
|
24
24
|
*
|
|
25
25
|
* **Der Returncode wird vor dem Status gelesen** (wie im Dart-Vorbild): `B33`
|
|
26
26
|
* heisst "nicht registriert" und schlaegt jedes Statusfeld, das daneben stehen
|
|
27
27
|
* mag. Andersherum meldete eine nie registrierte Karte am Ende "in Betrieb".
|
|
28
28
|
*/
|
|
29
|
-
async function getSignatureStatus(
|
|
30
|
-
if (typeof
|
|
31
|
-
throw new errors_js_1.KasseneckValidationError(VORGANG_SIGNATUR, '
|
|
29
|
+
async function getSignatureStatus(transport, certificateSerialHex) {
|
|
30
|
+
if (typeof certificateSerialHex !== 'string' || !certificateSerialHex.trim()) {
|
|
31
|
+
throw new errors_js_1.KasseneckValidationError(VORGANG_SIGNATUR, 'certificateSerialHex fehlt', 'request');
|
|
32
32
|
}
|
|
33
|
-
const daten = await
|
|
33
|
+
const daten = await transport('financeWebService', { zertifikatnr_hex: certificateSerialHex }, { method: 'status_signature' });
|
|
34
34
|
if (daten?.rkdbMessage?.rc === 'B33') {
|
|
35
35
|
return 'NOT_REGISTERED';
|
|
36
36
|
}
|
|
@@ -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,8 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_TIMEOUT_MS = exports.DEFAULT_BASE_URL = void 0;
|
|
3
|
+
exports.DEFAULT_TIMEOUT_MS = exports.POS_BASE_URL = exports.DEFAULT_BASE_URL = void 0;
|
|
4
4
|
exports.createTransport = createTransport;
|
|
5
5
|
exports.createBinaryTransport = createBinaryTransport;
|
|
6
|
+
const auth_js_1 = require("./auth.js");
|
|
7
|
+
const aufrufe_js_1 = require("./aufrufe.js");
|
|
8
|
+
const version_js_1 = require("../version.js");
|
|
6
9
|
const errors_js_1 = require("./errors.js");
|
|
7
10
|
/**
|
|
8
11
|
* Transport zum Kasseneck-Backend: ein Aufruf ist ein POST an
|
|
@@ -20,12 +23,69 @@ const errors_js_1 = require("./errors.js");
|
|
|
20
23
|
* Fehlerarten sind bei beiden dieselben; sie unterscheiden sich nur darin, wie
|
|
21
24
|
* der Antwortrumpf gelesen und ausgewertet wird.
|
|
22
25
|
*
|
|
26
|
+
* **Nur `/v3`, fail closed.** Jede Antwort muss das Kennzeichen
|
|
27
|
+
* `Kasseneck-Api-Version: v3` tragen; fehlt es, wirft der Transport
|
|
28
|
+
* `dialect_mismatch`, **bevor** er den Rumpf liest, und tut nichts weiter
|
|
29
|
+
* (Nachtrag §5.4, Risiko R1: eine Route auf eine Function mit altem Rand
|
|
30
|
+
* haette die englischen Parameter deutsch gedeutet). Eine HTML-Antwort ist
|
|
31
|
+
* `route_missing`: die Hosting-Auffangregel hat den Aufruf abgefangen, bevor
|
|
32
|
+
* ihn eine Function sah.
|
|
33
|
+
*
|
|
34
|
+
* **Kasseneck-Kopfzeilen nur an Kasseneck-Basen** (Nachtrag §6, Risiko R3):
|
|
35
|
+
* `Kasseneck-Api-Version: v3` und `Kasseneck-Client: <produkt>/<version>`
|
|
36
|
+
* setzt der Transport selbst, abhaengig von der Basis, und nie ueber die
|
|
37
|
+
* `fetch`-Umsetzung. Dieselbe Umsetzung darf darum auch Connect, ePOS-Drucker
|
|
38
|
+
* und Terminals bedienen, ohne dass dort eine fremde Kopfzeile den Vorflug
|
|
39
|
+
* scheitern laesst.
|
|
40
|
+
*
|
|
23
41
|
* **Kein Wiederholen fehlgeschlagener Aufrufe.** Ein Beleg ist nicht folgenlos
|
|
24
42
|
* wiederholbar; ohne entschiedene Idempotenz waere ein automatischer zweiter
|
|
25
43
|
* Versuch ein zweiter Beleg.
|
|
26
44
|
*/
|
|
27
|
-
/** Basis-URL der Produktion. */
|
|
28
|
-
exports.DEFAULT_BASE_URL = 'https://api.kasseneck.at/
|
|
45
|
+
/** Basis-URL der oeffentlichen API (Produktion). */
|
|
46
|
+
exports.DEFAULT_BASE_URL = 'https://api.kasseneck.at/v3';
|
|
47
|
+
/**
|
|
48
|
+
* Basis-URL des Kassenwegs (Kanal `app`, Nachtrag §5.2). Die Web-Kasse ruft
|
|
49
|
+
* denselben Weg im gleichen Ursprung als `/api/v3`.
|
|
50
|
+
*/
|
|
51
|
+
exports.POS_BASE_URL = 'https://kasse.kasseneck.at/api/v3';
|
|
52
|
+
/** Kennzeichen der `/v3`-Antworten und -Anfragen. */
|
|
53
|
+
const VERSION_KOPF = 'Kasseneck-Api-Version';
|
|
54
|
+
const CLIENT_KOPF = 'Kasseneck-Client';
|
|
55
|
+
const VERSION_WERT = 'v3';
|
|
56
|
+
/**
|
|
57
|
+
* Hosts, die als Kasseneck-Basis gelten, nur ueber https und ohne eigenen
|
|
58
|
+
* Port. Alles andere (Proxys, Emulator, `127.0.0.1` fuer Connect) bekommt die
|
|
59
|
+
* Kasseneck-Kopfzeilen nicht.
|
|
60
|
+
*/
|
|
61
|
+
const KASSENECK_HOSTS = new Set(['api.kasseneck.at', 'kasse.kasseneck.at']);
|
|
62
|
+
/** Die 1.x-Linie spricht nur `/v3`: jede Basis endet so (`/v3` oder `/api/v3`). */
|
|
63
|
+
const V3_ENDE = /\/v3$/;
|
|
64
|
+
/**
|
|
65
|
+
* Aufrufe mit Wirkung, die nie blind wiederholt werden duerfen: sie signieren
|
|
66
|
+
* (`createReceipt`, `cancelReceipt`), loesen bei FinanzOnline etwas aus
|
|
67
|
+
* (`financeWebService`) oder bewegen Geld (`hobexPayApi` belastet eine Karte,
|
|
68
|
+
* `hobexRefundApi` erstattet, `stripeCaptureIntent` zieht eine vorgemerkte
|
|
69
|
+
* Zahlung ein). Scheitert einer, nachdem die Anfrage unterwegs war (Netz,
|
|
70
|
+
* Zeitlimit, HTTP 5xx, unlesbare Erfolgsantwort, HTML mit Kennzeichen), ist
|
|
71
|
+
* sein Ausgang offen.
|
|
72
|
+
*/
|
|
73
|
+
const UNKNOWN_OUTCOME_CALLS = new Set([
|
|
74
|
+
'createReceipt',
|
|
75
|
+
'cancelReceipt',
|
|
76
|
+
'financeWebService',
|
|
77
|
+
'hobexPayApi',
|
|
78
|
+
'hobexRefundApi',
|
|
79
|
+
'stripeCaptureIntent',
|
|
80
|
+
]);
|
|
81
|
+
/**
|
|
82
|
+
* Produkte, die das Backend in `Kasseneck-Client` zaehlt (Positivliste,
|
|
83
|
+
* Nachtrag §6); alles andere zaehlte dort als `ungueltig`. Das Paket weist
|
|
84
|
+
* es darum schon beim Anlegen des Transports ab.
|
|
85
|
+
*/
|
|
86
|
+
const CLIENT_PRODUKTE = new Set(['kasse-web', 'kasse-app', 'kasseneck-api', 'kasseneck_api']);
|
|
87
|
+
const CLIENT_VERSION = /^[0-9A-Za-z.+-]{1,40}$/;
|
|
88
|
+
const CLIENT_MAX = 64;
|
|
29
89
|
/**
|
|
30
90
|
* Zeitlimit je Aufruf (wie im Flutter-Zwilling). Ohne Zeitlimit bleibt eine
|
|
31
91
|
* haengende Anfrage fuer immer offen — der Aufrufer bekaeme weder Ergebnis
|
|
@@ -54,9 +114,22 @@ function createBinaryTransport(options) {
|
|
|
54
114
|
* `auswerten`.
|
|
55
115
|
*/
|
|
56
116
|
function createCore(options) {
|
|
57
|
-
const
|
|
117
|
+
const oeffentlicheBasis = v3Basis('baseUrl', options.baseUrl) ?? exports.DEFAULT_BASE_URL;
|
|
118
|
+
const kassenBasis = v3Basis('posBaseUrl', options.posBaseUrl) ?? exports.POS_BASE_URL;
|
|
119
|
+
const kassenweg = (0, auth_js_1.isRegisterUserAuth)(options.auth);
|
|
58
120
|
const zeitlimitMs = options.timeoutMs ?? exports.DEFAULT_TIMEOUT_MS;
|
|
59
121
|
const holen = options.fetch ?? globalesFetch();
|
|
122
|
+
const kennung = options.clientHeader ?? `kasseneck-api/${version_js_1.PACKAGE_VERSION}`;
|
|
123
|
+
pruefeKennung(kennung);
|
|
124
|
+
const kopfzeilenSenden = options.omitKasseneckHeaders !== true;
|
|
125
|
+
/**
|
|
126
|
+
* Basis je Aufruf. Die 19 reinen Kassenaufrufe gehen immer an den
|
|
127
|
+
* Kassenweg (unter der oeffentlichen Basis gibt es sie nicht), und die
|
|
128
|
+
* Kassen-Anmeldung ruft alle 25 Aufrufe des Kassenwegs dort, auch die sechs
|
|
129
|
+
* oeffentlichen (Kanal `app`). Was der Kassenweg gar nicht fuehrt
|
|
130
|
+
* (Berichte, Zahlungen, FinanzOnline), geht an die oeffentliche Basis.
|
|
131
|
+
*/
|
|
132
|
+
const basisFuer = (functionName) => (0, aufrufe_js_1.isPosOnlyCall)(functionName) || (kassenweg && (0, aufrufe_js_1.isPosCall)(functionName)) ? kassenBasis : oeffentlicheBasis;
|
|
60
133
|
return async function aufrufen(functionName, params = {}, extraBodyFields, secretParams, lesen, auswerten) {
|
|
61
134
|
// Die URL nennt die Backend-Funktion, die Fehler nennen den **Vorgang**:
|
|
62
135
|
// `financeWebService` fuehrt ein Dutzend verschiedener Vorgaenge unter einem
|
|
@@ -92,13 +165,26 @@ function createCore(options) {
|
|
|
92
165
|
// Geraetegeheimnis, PIN). Ohne die zweite Haelfte greift die Zusage genau
|
|
93
166
|
// dort nicht, wo es gar keine Kopfzeilen gibt.
|
|
94
167
|
const geheimnisse = [...Object.values(anmeldung.headers), ...(secretParams ?? [])];
|
|
168
|
+
// Bis zur ersten Antwort (bzw. beim Lesen des Rumpfs) ist alles Scheitern
|
|
169
|
+
// Netz oder Zeitlimit.
|
|
170
|
+
const netzfehler = (ursache) => {
|
|
171
|
+
// Ein Formfehler des Pakets ist kein Netzfehler und behaelt seine Art
|
|
172
|
+
// (der Binaerweg wirft ihn, wenn die fetch-Antwort keine Bytes liefert).
|
|
173
|
+
if (ursache instanceof errors_js_1.KasseneckValidationError) {
|
|
174
|
+
return ursache;
|
|
175
|
+
}
|
|
176
|
+
// Bis hierher kam keine verwertbare Antwort: Netz weg oder Zeitlimit.
|
|
177
|
+
// Die Anfrage war schon unterwegs: bei einem Aufruf mit Wirkung kann
|
|
178
|
+
// der Beleg bzw. die Zahlung entstanden sein (Ausgang unklar, nachlesen).
|
|
179
|
+
return new errors_js_1.KasseneckNetworkError(fehlerName, abbruch.signal.aborted, zeitlimitMs, (0, errors_js_1.causeDigest)(ursache, geheimnisse), UNKNOWN_OUTCOME_CALLS.has(functionName) ? 'unknown' : 'rejected');
|
|
180
|
+
};
|
|
181
|
+
const basis = basisFuer(functionName);
|
|
95
182
|
const url = `${basis}/${encodeURIComponent(functionName)}`;
|
|
96
183
|
// `params` steht ZULETZT: so kann kein Zusatzfeld die Nutzlast (und mit
|
|
97
184
|
// ihr die Kassenbindung aus der Anmeldung) verdraengen — auch nicht von
|
|
98
185
|
// einem Verbraucher, der ohne Typen an TransportBodyFields vorbeikommt.
|
|
99
186
|
const rumpf = JSON.stringify({ ...extraBodyFields, params: nutzlast(anmeldung.params, params) });
|
|
100
187
|
let antwort;
|
|
101
|
-
let koerper;
|
|
102
188
|
try {
|
|
103
189
|
// Auch der Aufruf laeuft gegen den Abbruch — nicht nur die Anmeldung.
|
|
104
190
|
// Das `AbortSignal` geht zwar mit, aber ob eine fetch-Umsetzung es
|
|
@@ -111,30 +197,69 @@ function createCore(options) {
|
|
|
111
197
|
antwort = await Promise.race([
|
|
112
198
|
holen(url, {
|
|
113
199
|
method: 'POST',
|
|
114
|
-
headers: {
|
|
200
|
+
headers: {
|
|
201
|
+
'Content-Type': 'application/json',
|
|
202
|
+
...ohneKasseneckKopfzeilen(anmeldung.headers),
|
|
203
|
+
...(kopfzeilenSenden && istKasseneckBasis(basis)
|
|
204
|
+
? { [VERSION_KOPF]: VERSION_WERT, [CLIENT_KOPF]: kennung }
|
|
205
|
+
: {}),
|
|
206
|
+
},
|
|
115
207
|
body: rumpf,
|
|
116
208
|
signal: abbruch.signal,
|
|
117
209
|
}),
|
|
118
210
|
abbruchAlsAblehnung(abbruch.signal),
|
|
119
211
|
]);
|
|
120
|
-
koerper = await Promise.race([lesen(antwort, fehlerName), abbruchAlsAblehnung(abbruch.signal)]);
|
|
121
212
|
}
|
|
122
213
|
catch (ursache) {
|
|
123
|
-
|
|
124
|
-
// (der Binaerweg wirft ihn, wenn die fetch-Antwort keine Bytes liefert).
|
|
125
|
-
if (ursache instanceof errors_js_1.KasseneckValidationError) {
|
|
126
|
-
throw ursache;
|
|
127
|
-
}
|
|
128
|
-
// Bis hierher kam keine verwertbare Antwort: Netz weg oder Zeitlimit.
|
|
129
|
-
throw new errors_js_1.KasseneckNetworkError(fehlerName, abbruch.signal.aborted, zeitlimitMs, (0, errors_js_1.causeDigest)(ursache, geheimnisse));
|
|
214
|
+
throw netzfehler(ursache);
|
|
130
215
|
}
|
|
216
|
+
// Alles Folgende entscheidet an den Kopfzeilen, **bevor** der Rumpf
|
|
217
|
+
// gelesen wird: was nicht vom `/v3`-Rand kommt, wird nicht gedeutet.
|
|
131
218
|
const inhaltstyp = antwort.headers.get('content-type') ?? undefined;
|
|
132
219
|
// Das Backend antwortet auf jeden fachlichen Ausgang mit HTTP 200; alles
|
|
133
|
-
// andere kommt nicht von ihm (Proxy, Rewrite-Luecke, Infrastruktur).
|
|
220
|
+
// andere kommt nicht von ihm (Proxy, Rewrite-Luecke, Infrastruktur). Das
|
|
221
|
+
// steht VOR der HTML-Pruefung: eine 500er-Fehlerseite ist auch HTML, aber
|
|
222
|
+
// dort kann eine Function gelaufen sein; `route_missing` sagt das Gegenteil.
|
|
134
223
|
if (antwort.status !== 200) {
|
|
135
|
-
|
|
224
|
+
// Ausnahme: der `/v3`-Rand antwortet auf einen unbekannten Endpunkt mit
|
|
225
|
+
// HTTP 404, Kennzeichen und Huelle samt Code (`not_found`). Nur mit
|
|
226
|
+
// Kennzeichen wird dieser Rumpf gelesen.
|
|
227
|
+
if (antwort.status === 404 && traegtKennzeichen(antwort)) {
|
|
228
|
+
const fehler = await randFehler404(antwort, fehlerName, geheimnisse, abbruch.signal);
|
|
229
|
+
if (fehler)
|
|
230
|
+
throw fehler;
|
|
231
|
+
}
|
|
232
|
+
// 5xx auf einem Aufruf mit Wirkung: der Handler kann gelaufen sein.
|
|
233
|
+
const ausgang = antwort.status >= 500 && UNKNOWN_OUTCOME_CALLS.has(functionName) ? 'unknown' : 'rejected';
|
|
234
|
+
throw new errors_js_1.KasseneckHttpError(fehlerName, antwort.status, inhaltstyp, 'server-error', ausgang);
|
|
235
|
+
}
|
|
236
|
+
// HTTP 200 mit HTML: die Auffangregel der Single-Page-App hat den Aufruf
|
|
237
|
+
// bedient, keine Function hat ihn gesehen (Nachtrag §5.4, R15).
|
|
238
|
+
if (inhaltstyp !== undefined && /^\s*text\/html\b/i.test(inhaltstyp)) {
|
|
239
|
+
// Mit Kennzeichen hat der `/v3`-Rand den Aufruf gesehen (etwa ein
|
|
240
|
+
// Proxy, der nur den Inhaltstyp umschreibt). Bei einem Aufruf mit
|
|
241
|
+
// Wirkung kann der Beleg bzw. die Zahlung dann entstanden sein: unlesbarer Rumpf,
|
|
242
|
+
// Ausgang unklar, statt `route_missing`.
|
|
243
|
+
if (UNKNOWN_OUTCOME_CALLS.has(functionName) && traegtKennzeichen(antwort)) {
|
|
244
|
+
throw new errors_js_1.KasseneckHttpError(fehlerName, antwort.status, inhaltstyp, 'not-json', 'unknown');
|
|
245
|
+
}
|
|
246
|
+
throw new errors_js_1.KasseneckApiError(fehlerName, 'Route fehlt: die Antwort ist eine HTML-Seite statt des Backends', {}, 'route_missing');
|
|
247
|
+
}
|
|
248
|
+
if (!traegtKennzeichen(antwort)) {
|
|
249
|
+
throw new errors_js_1.KasseneckApiError(fehlerName, 'Server spricht nicht /v3 (Kennzeichen Kasseneck-Api-Version fehlt); Antwort verworfen', {}, 'dialect_mismatch');
|
|
250
|
+
}
|
|
251
|
+
let koerper;
|
|
252
|
+
try {
|
|
253
|
+
koerper = await Promise.race([lesen(antwort, fehlerName), abbruchAlsAblehnung(abbruch.signal)]);
|
|
136
254
|
}
|
|
137
|
-
|
|
255
|
+
catch (ursache) {
|
|
256
|
+
throw netzfehler(ursache);
|
|
257
|
+
}
|
|
258
|
+
// Ab hier kam HTTP 200 mit Kennzeichen: der `/v3`-Rand hat den Aufruf
|
|
259
|
+
// gesehen. Ist der Rumpf dann unlesbar (gekuerzt von einem Proxy,
|
|
260
|
+
// abgebrochene Verbindung), kann ein Handler mit Wirkung gelaufen sein.
|
|
261
|
+
const unlesbar = UNKNOWN_OUTCOME_CALLS.has(functionName) ? 'unknown' : 'rejected';
|
|
262
|
+
return auswerten(koerper, fehlerName, antwort.status, inhaltstyp, geheimnisse, unlesbar);
|
|
138
263
|
}
|
|
139
264
|
finally {
|
|
140
265
|
// Ohne Abraeumen haelt der Wecker den Node-Prozess bis zum Zeitlimit wach.
|
|
@@ -142,6 +267,90 @@ function createCore(options) {
|
|
|
142
267
|
}
|
|
143
268
|
};
|
|
144
269
|
}
|
|
270
|
+
/** Traegt die Antwort das Kennzeichen `Kasseneck-Api-Version: v3`? */
|
|
271
|
+
function traegtKennzeichen(antwort) {
|
|
272
|
+
return (antwort.headers.get(VERSION_KOPF) ?? '').trim().toLowerCase() === VERSION_WERT;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Liest die 404-Huelle des `/v3`-Rands. Liefert den fachlichen Fehler, wenn
|
|
276
|
+
* es eine Fehlerhuelle mit Code ist, sonst `null` (dann bleibt es beim
|
|
277
|
+
* HTTP-Fehler). Ein Lesefehler zaehlt ebenfalls als `null`.
|
|
278
|
+
*/
|
|
279
|
+
async function randFehler404(antwort, functionName, geheimnisse, signal) {
|
|
280
|
+
try {
|
|
281
|
+
const text = await Promise.race([antwort.text(), abbruchAlsAblehnung(signal)]);
|
|
282
|
+
const huelle = alsHuelle(JSON.parse(text));
|
|
283
|
+
if (huelle === null || huelle.status === 'success')
|
|
284
|
+
return null;
|
|
285
|
+
const fehler = fachfehler(functionName, huelle.message, huelle.data, geheimnisse, huelle.code);
|
|
286
|
+
return fehler.code === undefined ? null : fehler;
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Prueft eine abweichende Basis beim Anlegen: die 1.x-Linie spricht nur
|
|
294
|
+
* `/v3`. Liefert sie ohne abschliessende Schraegstriche, oder `undefined`
|
|
295
|
+
* ohne Angabe.
|
|
296
|
+
*/
|
|
297
|
+
function v3Basis(option, basis) {
|
|
298
|
+
if (basis === undefined)
|
|
299
|
+
return undefined;
|
|
300
|
+
const ohne = typeof basis === 'string' ? basis.replace(/\/+$/, '') : '';
|
|
301
|
+
if (!V3_ENDE.test(ohne)) {
|
|
302
|
+
const beispiel = option === 'posBaseUrl' ? "'/api/v3' bzw. POS_BASE_URL" : 'DEFAULT_BASE_URL';
|
|
303
|
+
throw new errors_js_1.KasseneckValidationError('createTransport', `${option} muss auf /v3 oder /api/v3 enden (1.x spricht nur /v3; z. B. ${beispiel} statt /api oder /v1)`, 'request');
|
|
304
|
+
}
|
|
305
|
+
return ohne;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Ist `basis` eine Kasseneck-Basis? Relativ (gleicher Ursprung) immer,
|
|
309
|
+
* ausser `//host` (fremder Host ohne Schema); absolut nur
|
|
310
|
+
* `https://api.kasseneck.at` bzw. `https://kasse.kasseneck.at` ohne Port und
|
|
311
|
+
* ohne Zugangsdaten.
|
|
312
|
+
*/
|
|
313
|
+
function istKasseneckBasis(basis) {
|
|
314
|
+
if (basis.startsWith('//'))
|
|
315
|
+
return false;
|
|
316
|
+
let adresse;
|
|
317
|
+
try {
|
|
318
|
+
adresse = new URL(basis);
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
// Keine absolute Adresse: relativ zum eigenen Ursprung.
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
return adresse.protocol === 'https:'
|
|
325
|
+
&& adresse.port === ''
|
|
326
|
+
&& adresse.username === ''
|
|
327
|
+
&& adresse.password === ''
|
|
328
|
+
&& KASSENECK_HOSTS.has(adresse.hostname);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Die beiden Kasseneck-Kopfzeilen setzt allein der Transport. Liefert die
|
|
332
|
+
* Anmeldung sie mit (in beliebiger Schreibweise), fallen sie weg: sonst kaeme
|
|
333
|
+
* ein zweiter Wert daneben, oder eine fremde Basis bekaeme sie doch.
|
|
334
|
+
*/
|
|
335
|
+
function ohneKasseneckKopfzeilen(kopfzeilen) {
|
|
336
|
+
const gesperrt = new Set([VERSION_KOPF.toLowerCase(), CLIENT_KOPF.toLowerCase()]);
|
|
337
|
+
const ergebnis = {};
|
|
338
|
+
for (const [name, wert] of Object.entries(kopfzeilen)) {
|
|
339
|
+
if (!gesperrt.has(name.toLowerCase()))
|
|
340
|
+
ergebnis[name] = wert;
|
|
341
|
+
}
|
|
342
|
+
return ergebnis;
|
|
343
|
+
}
|
|
344
|
+
/** Prueft `Kasseneck-Client` gegen Positivliste und Form (Nachtrag §6). */
|
|
345
|
+
function pruefeKennung(kennung) {
|
|
346
|
+
const text = typeof kennung === 'string' ? kennung : '';
|
|
347
|
+
const trenner = text.indexOf('/');
|
|
348
|
+
const produkt = trenner > 0 ? text.slice(0, trenner) : '';
|
|
349
|
+
const version = trenner > 0 ? text.slice(trenner + 1) : '';
|
|
350
|
+
if (text.length > CLIENT_MAX || !CLIENT_PRODUKTE.has(produkt) || !CLIENT_VERSION.test(version)) {
|
|
351
|
+
throw new errors_js_1.KasseneckValidationError('createTransport', 'clientHeader muss <produkt>/<version> sein (Produkt: kasse-web, kasse-app, kasseneck-api, kasseneck_api)', 'request');
|
|
352
|
+
}
|
|
353
|
+
}
|
|
145
354
|
/** JSON-Weg: der Rumpf ist Text. */
|
|
146
355
|
const alsText = (antwort) => antwort.text();
|
|
147
356
|
/**
|
|
@@ -159,9 +368,9 @@ const alsBytes = async (antwort, functionName) => {
|
|
|
159
368
|
return new Uint8Array(await antwort.arrayBuffer());
|
|
160
369
|
};
|
|
161
370
|
/** Auswertung des JSON-Wegs: Huelle aufloesen, Nutzlast zurueckgeben. */
|
|
162
|
-
function jsonAuswerten(text, functionName, statusCode, inhaltstyp, geheimnisse) {
|
|
371
|
+
function jsonAuswerten(text, functionName, statusCode, inhaltstyp, geheimnisse, unlesbar) {
|
|
163
372
|
if (!text.trim()) {
|
|
164
|
-
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body');
|
|
373
|
+
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body', unlesbar);
|
|
165
374
|
}
|
|
166
375
|
let roh;
|
|
167
376
|
try {
|
|
@@ -170,11 +379,11 @@ function jsonAuswerten(text, functionName, statusCode, inhaltstyp, geheimnisse)
|
|
|
170
379
|
catch {
|
|
171
380
|
// Typischer Fall: der Aufruf landete mangels Rewrite auf der HTML-Seite
|
|
172
381
|
// der Single-Page-App — HTTP 200, aber kein JSON.
|
|
173
|
-
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json');
|
|
382
|
+
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json', unlesbar);
|
|
174
383
|
}
|
|
175
384
|
const huelle = alsHuelle(roh);
|
|
176
385
|
if (huelle === null) {
|
|
177
|
-
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status');
|
|
386
|
+
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status', unlesbar);
|
|
178
387
|
}
|
|
179
388
|
if (huelle.status === 'success') {
|
|
180
389
|
return huelle.data;
|
|
@@ -196,9 +405,9 @@ function jsonAuswerten(text, functionName, statusCode, inhaltstyp, geheimnisse)
|
|
|
196
405
|
* das Backend hier erzeugt (pdf-lib). Alles, was nicht so anfaengt, ist kein
|
|
197
406
|
* Bericht — und wird dann daraufhin angesehen, ob es die Fehlerhuelle ist.
|
|
198
407
|
*/
|
|
199
|
-
function pdfAuswerten(bytes, functionName, statusCode, inhaltstyp, geheimnisse) {
|
|
408
|
+
function pdfAuswerten(bytes, functionName, statusCode, inhaltstyp, geheimnisse, unlesbar) {
|
|
200
409
|
if (bytes.length === 0) {
|
|
201
|
-
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body');
|
|
410
|
+
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'empty-body', unlesbar);
|
|
202
411
|
}
|
|
203
412
|
if (istPdf(bytes)) {
|
|
204
413
|
return bytes;
|
|
@@ -214,11 +423,11 @@ function pdfAuswerten(bytes, functionName, statusCode, inhaltstyp, geheimnisse)
|
|
|
214
423
|
roh = JSON.parse(new TextDecoder('utf-8').decode(bytes));
|
|
215
424
|
}
|
|
216
425
|
catch {
|
|
217
|
-
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json');
|
|
426
|
+
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'not-json', unlesbar);
|
|
218
427
|
}
|
|
219
428
|
const huelle = alsHuelle(roh);
|
|
220
429
|
if (huelle === null) {
|
|
221
|
-
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status');
|
|
430
|
+
throw new errors_js_1.KasseneckHttpError(functionName, statusCode, inhaltstyp, 'missing-status', unlesbar);
|
|
222
431
|
}
|
|
223
432
|
if (huelle.status === 'success') {
|
|
224
433
|
// Erfolg gemeldet, aber kein PDF geliefert: die Antwort traegt nicht, was
|
|
@@ -11,7 +11,7 @@ const define_enum_js_1 = require("./define-enum.js");
|
|
|
11
11
|
exports.VatRate = (0, define_enum_js_1.defineEnum)({
|
|
12
12
|
vat0: { value: 'vat0', rate: 0, category: 'D' },
|
|
13
13
|
// Grundnahrungsmittel ab 01.07.2026 -> Betrag-Satz-Besonders (BMF/RKSV)
|
|
14
|
-
|
|
14
|
+
vat4_9: { value: 'vat4_9', rate: 4.9, category: 'G' },
|
|
15
15
|
vat10: { value: 'vat10', rate: 10, category: 'B' },
|
|
16
16
|
vat13: { value: 'vat13', rate: 13, category: 'C' },
|
|
17
17
|
vat19: { value: 'vat19', rate: 19, category: 'E' },
|
package/dist/cjs/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';
|