@kreiseck/kasseneck-api 1.11.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +2 -1
- package/dist/cjs/client/aufrufe.d.ts +4 -4
- package/dist/cjs/client/aufrufe.js +15 -0
- package/dist/cjs/client/receipts.d.ts +5 -0
- package/dist/cjs/client/receipts.js +65 -6
- package/dist/cjs/enums/voucher-action.d.ts +2 -0
- package/dist/cjs/enums/voucher-action.js +2 -0
- package/dist/cjs/enums/voucher-type.d.ts +10 -0
- package/dist/cjs/enums/voucher-type.js +10 -0
- package/dist/cjs/index.d.ts +3 -3
- package/dist/cjs/index.js +9 -3
- package/dist/cjs/models/index.d.ts +3 -3
- package/dist/cjs/models/index.js +7 -2
- package/dist/cjs/models/receipt-errors.d.ts +1 -1
- package/dist/cjs/models/receipt-errors.js +2 -0
- package/dist/cjs/models/receipt-item.d.ts +11 -3
- package/dist/cjs/models/receipt-item.js +22 -1
- package/dist/cjs/models/receipt.d.ts +31 -1
- package/dist/cjs/models/receipt.js +45 -5
- package/dist/cjs/models/voucher.d.ts +57 -4
- package/dist/cjs/models/voucher.js +111 -3
- package/dist/cjs/partner/fehler.d.ts +1 -1
- package/dist/cjs/partner/fehler.js +2 -0
- package/dist/cjs/partner/index.d.ts +1 -1
- package/dist/cjs/partner/typen.d.ts +7 -1
- package/dist/cjs/partner/typen.js +3 -0
- package/dist/cjs/pos/client.d.ts +2 -1
- package/dist/cjs/pos/client.js +3 -1
- package/dist/cjs/pos/gutschein.d.ts +90 -0
- package/dist/cjs/pos/gutschein.js +164 -0
- package/dist/cjs/pos/index.d.ts +3 -2
- package/dist/cjs/pos/index.js +13 -2
- package/dist/cjs/pos/settings.d.ts +3 -0
- package/dist/cjs/pos/settings.js +12 -10
- package/dist/cjs/pos/texte.d.ts +156 -0
- package/dist/cjs/pos/texte.js +72 -1
- package/dist/cjs/react/index.js +8 -2
- package/dist/cjs/receipt/due.d.ts +83 -2
- package/dist/cjs/receipt/due.js +202 -36
- package/dist/cjs/receipt/grid.js +13 -1
- package/dist/cjs/receipt/gutschein-plan.d.ts +104 -0
- package/dist/cjs/receipt/gutschein-plan.js +360 -0
- package/dist/cjs/receipt/index.d.ts +1 -1
- package/dist/cjs/receipt/index.js +3 -0
- package/dist/cjs/receipt/layout.js +186 -10
- package/dist/cjs/register/pairing.d.ts +21 -1
- package/dist/cjs/register/pairing.js +17 -0
- package/dist/cjs/stored/bon-layout.d.ts +8 -0
- package/dist/cjs/stored/bon-layout.js +23 -0
- package/dist/cjs/stored/draht.d.ts +3 -1
- package/dist/cjs/stored/draht.js +53 -6
- package/dist/cjs/stored/einstellungen.js +2 -1
- package/dist/cjs/stored/gutscheine.d.ts +3 -0
- package/dist/cjs/stored/gutscheine.js +60 -0
- package/dist/cjs/stored/index.js +2 -17
- package/dist/cjs/stored/vokabular.d.ts +6 -4
- package/dist/cjs/stored/vokabular.js +48 -2
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/aufrufe.d.ts +4 -4
- package/dist/esm/client/aufrufe.js +15 -0
- package/dist/esm/client/receipts.d.ts +5 -0
- package/dist/esm/client/receipts.js +66 -8
- package/dist/esm/enums/voucher-action.d.ts +2 -0
- package/dist/esm/enums/voucher-action.js +2 -0
- package/dist/esm/enums/voucher-type.d.ts +10 -0
- package/dist/esm/enums/voucher-type.js +10 -0
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +3 -3
- package/dist/esm/models/index.d.ts +3 -3
- package/dist/esm/models/index.js +3 -3
- package/dist/esm/models/receipt-errors.d.ts +1 -1
- package/dist/esm/models/receipt-errors.js +2 -0
- package/dist/esm/models/receipt-item.d.ts +11 -3
- package/dist/esm/models/receipt-item.js +20 -1
- package/dist/esm/models/receipt.d.ts +31 -1
- package/dist/esm/models/receipt.js +44 -5
- package/dist/esm/models/voucher.d.ts +57 -4
- package/dist/esm/models/voucher.js +108 -3
- package/dist/esm/partner/fehler.d.ts +1 -1
- package/dist/esm/partner/fehler.js +2 -0
- package/dist/esm/partner/index.d.ts +1 -1
- package/dist/esm/partner/typen.d.ts +7 -1
- package/dist/esm/partner/typen.js +3 -0
- package/dist/esm/pos/client.d.ts +2 -1
- package/dist/esm/pos/client.js +3 -1
- package/dist/esm/pos/gutschein.d.ts +90 -0
- package/dist/esm/pos/gutschein.js +158 -0
- package/dist/esm/pos/index.d.ts +3 -2
- package/dist/esm/pos/index.js +4 -2
- package/dist/esm/pos/settings.d.ts +3 -0
- package/dist/esm/pos/settings.js +2 -0
- package/dist/esm/pos/texte.d.ts +156 -0
- package/dist/esm/pos/texte.js +70 -0
- package/dist/esm/react/index.js +8 -2
- package/dist/esm/receipt/due.d.ts +83 -2
- package/dist/esm/receipt/due.js +198 -34
- package/dist/esm/receipt/grid.js +13 -1
- package/dist/esm/receipt/gutschein-plan.d.ts +104 -0
- package/dist/esm/receipt/gutschein-plan.js +352 -0
- package/dist/esm/receipt/index.d.ts +1 -1
- package/dist/esm/receipt/index.js +1 -1
- package/dist/esm/receipt/layout.js +187 -11
- package/dist/esm/register/pairing.d.ts +21 -1
- package/dist/esm/register/pairing.js +16 -0
- package/dist/esm/stored/bon-layout.d.ts +8 -0
- package/dist/esm/stored/bon-layout.js +20 -0
- package/dist/esm/stored/draht.d.ts +3 -1
- package/dist/esm/stored/draht.js +52 -6
- package/dist/esm/stored/einstellungen.js +3 -2
- package/dist/esm/stored/gutscheine.d.ts +3 -0
- package/dist/esm/stored/gutscheine.js +56 -0
- package/dist/esm/stored/index.js +2 -17
- package/dist/esm/stored/vokabular.d.ts +6 -4
- package/dist/esm/stored/vokabular.js +48 -2
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/fixtures/expected/voucher-cancellation.grid32.txt +30 -0
- package/fixtures/expected/voucher-cancellation.grid48.txt +29 -0
- package/fixtures/expected/voucher-cancellation.lines.json +252 -0
- package/fixtures/expected/voucher-cancellation.sheet32.json +206 -0
- package/fixtures/expected/voucher-cancellation.sheet48.json +200 -0
- package/fixtures/expected/voucher-multi-purpose-redeem.grid32.txt +25 -0
- package/fixtures/expected/voucher-multi-purpose-redeem.grid48.txt +25 -0
- package/fixtures/expected/voucher-multi-purpose-redeem.lines.json +259 -0
- package/fixtures/expected/voucher-multi-purpose-redeem.sheet32.json +176 -0
- package/fixtures/expected/voucher-multi-purpose-redeem.sheet48.json +176 -0
- package/fixtures/expected/voucher-multi-purpose-sale.grid32.txt +24 -0
- package/fixtures/expected/voucher-multi-purpose-sale.grid48.txt +23 -0
- package/fixtures/expected/voucher-multi-purpose-sale.lines.json +216 -0
- package/fixtures/expected/voucher-multi-purpose-sale.sheet32.json +170 -0
- package/fixtures/expected/voucher-multi-purpose-sale.sheet48.json +164 -0
- package/fixtures/expected/voucher-payout.grid32.txt +23 -0
- package/fixtures/expected/voucher-payout.grid48.txt +22 -0
- package/fixtures/expected/voucher-payout.lines.json +216 -0
- package/fixtures/expected/voucher-payout.sheet32.json +164 -0
- package/fixtures/expected/voucher-payout.sheet48.json +158 -0
- package/fixtures/expected/voucher-service-redeem.grid32.txt +26 -0
- package/fixtures/expected/voucher-service-redeem.grid48.txt +25 -0
- package/fixtures/expected/voucher-service-redeem.lines.json +261 -0
- package/fixtures/expected/voucher-service-redeem.sheet32.json +182 -0
- package/fixtures/expected/voucher-service-redeem.sheet48.json +176 -0
- package/fixtures/expected/voucher-single-purpose-redeem-exempt.grid32.txt +30 -0
- package/fixtures/expected/voucher-single-purpose-redeem-exempt.grid48.txt +29 -0
- package/fixtures/expected/voucher-single-purpose-redeem-exempt.lines.json +331 -0
- package/fixtures/expected/voucher-single-purpose-redeem-exempt.sheet32.json +206 -0
- package/fixtures/expected/voucher-single-purpose-redeem-exempt.sheet48.json +200 -0
- package/fixtures/expected/voucher-single-purpose-redeem.grid32.txt +25 -0
- package/fixtures/expected/voucher-single-purpose-redeem.grid48.txt +24 -0
- package/fixtures/expected/voucher-single-purpose-redeem.lines.json +246 -0
- package/fixtures/expected/voucher-single-purpose-redeem.sheet32.json +176 -0
- package/fixtures/expected/voucher-single-purpose-redeem.sheet48.json +170 -0
- package/fixtures/expected/voucher-single-purpose-sale.grid32.txt +26 -0
- package/fixtures/expected/voucher-single-purpose-sale.grid48.txt +24 -0
- package/fixtures/expected/voucher-single-purpose-sale.lines.json +225 -0
- package/fixtures/expected/voucher-single-purpose-sale.sheet32.json +182 -0
- package/fixtures/expected/voucher-single-purpose-sale.sheet48.json +170 -0
- package/fixtures/hobex-hps-codes.json +1 -1
- package/fixtures/invoice-api.schema.json +1 -1
- package/fixtures/invoice-texts.json +1 -1
- package/fixtures/manifest.json +64 -0
- package/fixtures/pos-texts.json +170 -1
- package/fixtures/receipt-due-generated.json +1 -1
- package/fixtures/receipt-due-voucher-generated.json +494 -0
- package/fixtures/receipts/voucher-cancellation.json +76 -0
- package/fixtures/receipts/voucher-multi-purpose-redeem.json +62 -0
- package/fixtures/receipts/voucher-multi-purpose-sale.json +63 -0
- package/fixtures/receipts/voucher-payout.json +65 -0
- package/fixtures/receipts/voucher-service-redeem.json +82 -0
- package/fixtures/receipts/voucher-single-purpose-redeem-exempt.json +86 -0
- package/fixtures/receipts/voucher-single-purpose-redeem.json +71 -0
- package/fixtures/receipts/voucher-single-purpose-sale.json +88 -0
- package/fixtures/surface.json +35 -5
- package/fixtures/v3/antworten/belege.json +3405 -3
- package/fixtures/v3/antworten/belegmail.json +5 -2
- package/fixtures/v3/antworten/kasse-belege.json +3423 -3
- package/fixtures/v3/antworten/kasse.json +621 -14
- package/fixtures/v3/antworten/lager.json +1 -1
- package/fixtures/v3/antworten/rechnungen.json +5 -2
- package/fixtures/v3/antworten/storno.json +214 -3
- package/fixtures/v3/stored/belege.json +5 -2
- package/fixtures/v3/stored/kasse.json +225 -4
- package/fixtures/v3/stored/rechnungen.json +5 -2
- package/fixtures/v3/v3-vokabular.json +1375 -23
- package/fixtures/v3/zahlbetrag-faelle.json +293 -3
- package/package.json +4 -1
package/dist/esm/pos/settings.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* derselben Werte liegt unter `fixtures/stored/`. Trinkgeld ist bewusst AUS,
|
|
12
12
|
* bis die Buchung geklaert ist (Spec kachel-kasse § 9).
|
|
13
13
|
*/
|
|
14
|
+
import { posVoucherSettingsFromWire } from './gutschein.js';
|
|
14
15
|
/*
|
|
15
16
|
* Jedes Enum steht als Liste zur Laufzeit da, der Typ leitet sich daraus ab
|
|
16
17
|
* (`typeof LISTE[number]`). So gibt es die Werte nur einmal, und die Zwillinge
|
|
@@ -326,6 +327,7 @@ export function sanitizePosSettings(stored) {
|
|
|
326
327
|
return {
|
|
327
328
|
business: mergePosSettings(POS_BUSINESS_DEFAULTS, teil('business')),
|
|
328
329
|
device: mergePosSettings(POS_DEVICE_DEFAULTS, teil('device')),
|
|
330
|
+
vouchers: posVoucherSettingsFromWire(eigen(roh, 'vouchers') ? roh['vouchers'] : undefined),
|
|
329
331
|
};
|
|
330
332
|
}
|
|
331
333
|
/**
|
package/dist/esm/pos/texte.d.ts
CHANGED
|
@@ -318,6 +318,58 @@ declare const MELDUNGEN_ROH: {
|
|
|
318
318
|
readonly 'cancellation.tip_refunded_with_voucher': {
|
|
319
319
|
readonly text: "Beleg mit Gutschein: Das Trinkgeld wird mitstorniert.";
|
|
320
320
|
};
|
|
321
|
+
readonly 'voucher_error.not_found': {
|
|
322
|
+
readonly text: "Diesen Gutschein gibt es in diesem Betrieb nicht.";
|
|
323
|
+
};
|
|
324
|
+
readonly 'voucher_error.invalid': {
|
|
325
|
+
readonly text: "Dieser Gutschein ist nicht gültig.";
|
|
326
|
+
};
|
|
327
|
+
readonly 'voucher_error.invalid_code': {
|
|
328
|
+
readonly text: "Der Code ist nicht vollständig oder falsch abgetippt.";
|
|
329
|
+
};
|
|
330
|
+
readonly 'voucher_error.expired': {
|
|
331
|
+
readonly text: "Der Gutschein ist abgelaufen.";
|
|
332
|
+
};
|
|
333
|
+
readonly 'voucher_error.used_up': {
|
|
334
|
+
readonly text: "Der Gutschein ist bereits aufgebraucht.";
|
|
335
|
+
};
|
|
336
|
+
readonly 'voucher_error.blocked': {
|
|
337
|
+
readonly text: "Der Gutschein ist gesperrt.";
|
|
338
|
+
};
|
|
339
|
+
readonly 'voucher_error.cancelled': {
|
|
340
|
+
readonly text: "Der Gutschein wurde storniert.";
|
|
341
|
+
};
|
|
342
|
+
readonly 'voucher_error.insufficient_balance': {
|
|
343
|
+
readonly text: "Auf dem Gutschein ist nicht genug Guthaben.";
|
|
344
|
+
};
|
|
345
|
+
readonly 'voucher_error.exceeds_total': {
|
|
346
|
+
readonly text: "Der Gutschein deckt mehr, als offen ist. Bitte den Betrag anpassen.";
|
|
347
|
+
};
|
|
348
|
+
readonly 'voucher_error.balance_changed': {
|
|
349
|
+
readonly text: "Der Gutschein wurde gerade anderswo verwendet. Bitte neu prüfen.";
|
|
350
|
+
};
|
|
351
|
+
readonly 'voucher_error.rate_mismatch': {
|
|
352
|
+
readonly text: "Dieser Gutschein gilt nur für Leistungen mit {rate} %.";
|
|
353
|
+
readonly placeholders: readonly ["rate"];
|
|
354
|
+
};
|
|
355
|
+
readonly 'voucher_error.item_mismatch': {
|
|
356
|
+
readonly text: "Dieser Gutschein gilt nicht für die gewählten Positionen.";
|
|
357
|
+
};
|
|
358
|
+
readonly 'voucher_error.already_used': {
|
|
359
|
+
readonly text: "Dieser Gutschein wurde bereits verwendet.";
|
|
360
|
+
};
|
|
361
|
+
readonly 'voucher_error.partial_cancel': {
|
|
362
|
+
readonly text: "Belege mit Gutschein lassen sich nur ganz stornieren.";
|
|
363
|
+
};
|
|
364
|
+
readonly 'voucher_error.settings_missing': {
|
|
365
|
+
readonly text: "Die Gutschein-Einstellungen fehlen. Bitte die Kasse neu laden.";
|
|
366
|
+
};
|
|
367
|
+
readonly 'voucher_error.too_many_checks': {
|
|
368
|
+
readonly text: "Zu viele Versuche. Bitte in einer Stunde wieder.";
|
|
369
|
+
};
|
|
370
|
+
readonly 'voucher_error.sale_off': {
|
|
371
|
+
readonly text: "Gutscheine verkaufen geht hier noch nicht.";
|
|
372
|
+
};
|
|
321
373
|
readonly 'split.setting_hint': {
|
|
322
374
|
readonly text: "Ein Tisch zahlt in Teilen: jede Zahlung bar oder mit Karte, mit eigenem Trinkgeld – am Ende ein Beleg für alles.";
|
|
323
375
|
};
|
|
@@ -927,6 +979,32 @@ export type CancellationPaymentMessageCode = keyof typeof CANCELLATION_PAYMENT_E
|
|
|
927
979
|
* `cancellation.failed` auf – wie bei `receiptEmailErrorMessage`.
|
|
928
980
|
*/
|
|
929
981
|
export declare function cancellationPaymentErrorMessage(code: string | undefined | null): MessageKey;
|
|
982
|
+
/**
|
|
983
|
+
* Gutschein-Fehler (`/v3`): welcher `code` des Backends welchen Satz bekommt.
|
|
984
|
+
* Wie RECEIPT_EMAIL_ERROR_MESSAGES: beide Kassen entscheiden am Code. Ein
|
|
985
|
+
* unbekannter Code geht den allgemeinen Weg des Aufrufs.
|
|
986
|
+
*/
|
|
987
|
+
export declare const VOUCHER_ERROR_MESSAGES: {
|
|
988
|
+
readonly voucher_not_found: "voucher_error.not_found";
|
|
989
|
+
readonly voucher_invalid: "voucher_error.invalid";
|
|
990
|
+
readonly voucher_invalid_code: "voucher_error.invalid_code";
|
|
991
|
+
readonly voucher_expired: "voucher_error.expired";
|
|
992
|
+
readonly voucher_used_up: "voucher_error.used_up";
|
|
993
|
+
readonly voucher_blocked: "voucher_error.blocked";
|
|
994
|
+
readonly voucher_cancelled: "voucher_error.cancelled";
|
|
995
|
+
readonly voucher_insufficient_balance: "voucher_error.insufficient_balance";
|
|
996
|
+
readonly voucher_exceeds_total: "voucher_error.exceeds_total";
|
|
997
|
+
readonly voucher_balance_changed: "voucher_error.balance_changed";
|
|
998
|
+
readonly voucher_rate_mismatch: "voucher_error.rate_mismatch";
|
|
999
|
+
readonly voucher_item_mismatch: "voucher_error.item_mismatch";
|
|
1000
|
+
readonly voucher_already_used: "voucher_error.already_used";
|
|
1001
|
+
readonly voucher_partial_cancel: "voucher_error.partial_cancel";
|
|
1002
|
+
readonly voucher_settings_missing: "voucher_error.settings_missing";
|
|
1003
|
+
readonly too_many_voucher_checks: "voucher_error.too_many_checks";
|
|
1004
|
+
};
|
|
1005
|
+
export type VoucherMessageCode = keyof typeof VOUCHER_ERROR_MESSAGES;
|
|
1006
|
+
/** Der Satz zu einem Gutschein-`code`; `undefined` für jeden anderen Code. */
|
|
1007
|
+
export declare function voucherErrorMessage(code: string | undefined | null): MessageKey | undefined;
|
|
930
1008
|
/**
|
|
931
1009
|
* Beschriftungen: Knoepfe, Ueberschriften, Zeilennamen – was kein Satz ist.
|
|
932
1010
|
*
|
|
@@ -1590,6 +1668,84 @@ declare const BESCHRIFTUNGEN_ROH: {
|
|
|
1590
1668
|
readonly 'shift.voucher_redeemed': {
|
|
1591
1669
|
readonly text: "Gutschein eingelöst";
|
|
1592
1670
|
};
|
|
1671
|
+
readonly 'voucher.button': {
|
|
1672
|
+
readonly text: "Gutschein";
|
|
1673
|
+
};
|
|
1674
|
+
readonly 'voucher.redeem': {
|
|
1675
|
+
readonly text: "Gutschein einlösen";
|
|
1676
|
+
};
|
|
1677
|
+
readonly 'voucher.sell': {
|
|
1678
|
+
readonly text: "Gutschein verkaufen";
|
|
1679
|
+
};
|
|
1680
|
+
readonly 'voucher.payout': {
|
|
1681
|
+
readonly text: "Gutschein auszahlen";
|
|
1682
|
+
};
|
|
1683
|
+
readonly 'voucher.code': {
|
|
1684
|
+
readonly text: "Code";
|
|
1685
|
+
};
|
|
1686
|
+
readonly 'voucher.scan': {
|
|
1687
|
+
readonly text: "Code scannen";
|
|
1688
|
+
};
|
|
1689
|
+
readonly 'voucher.check': {
|
|
1690
|
+
readonly text: "Prüfen";
|
|
1691
|
+
};
|
|
1692
|
+
readonly 'voucher.amount': {
|
|
1693
|
+
readonly text: "Betrag";
|
|
1694
|
+
};
|
|
1695
|
+
readonly 'voucher.balance': {
|
|
1696
|
+
readonly text: "Rest am Gutschein: {amount}";
|
|
1697
|
+
readonly placeholders: readonly ["amount"];
|
|
1698
|
+
};
|
|
1699
|
+
readonly 'voucher.remaining_quantity': {
|
|
1700
|
+
readonly text: "{n} von {total} übrig";
|
|
1701
|
+
readonly placeholders: readonly ["n", "total"];
|
|
1702
|
+
};
|
|
1703
|
+
readonly 'voucher.reason': {
|
|
1704
|
+
readonly text: "Grund";
|
|
1705
|
+
};
|
|
1706
|
+
readonly 'voucher.multi_purpose': {
|
|
1707
|
+
readonly text: "Mehrzweckgutschein";
|
|
1708
|
+
};
|
|
1709
|
+
readonly 'voucher.single_purpose': {
|
|
1710
|
+
readonly text: "Einzweckgutschein {rate} %";
|
|
1711
|
+
readonly placeholders: readonly ["rate"];
|
|
1712
|
+
};
|
|
1713
|
+
readonly 'voucher.service': {
|
|
1714
|
+
readonly text: "Leistungsgutschein";
|
|
1715
|
+
};
|
|
1716
|
+
readonly 'voucher.promotion': {
|
|
1717
|
+
readonly text: "Aktionsgutschein";
|
|
1718
|
+
};
|
|
1719
|
+
readonly 'voucher.payment_line': {
|
|
1720
|
+
readonly text: "Gutschein ····-{suffix}";
|
|
1721
|
+
readonly placeholders: readonly ["suffix"];
|
|
1722
|
+
};
|
|
1723
|
+
readonly 'voucher.covers_items': {
|
|
1724
|
+
readonly text: "Deckt: {items}";
|
|
1725
|
+
readonly placeholders: readonly ["items"];
|
|
1726
|
+
};
|
|
1727
|
+
readonly 'voucher.code_shown_once': {
|
|
1728
|
+
readonly text: "Code nur jetzt sichtbar: {code}";
|
|
1729
|
+
readonly placeholders: readonly ["code"];
|
|
1730
|
+
};
|
|
1731
|
+
readonly 'voucher.not_in_split': {
|
|
1732
|
+
readonly text: "Gutscheine gehen beim getrennten Kassieren nicht.";
|
|
1733
|
+
};
|
|
1734
|
+
readonly 'voucher.payout_not_possible': {
|
|
1735
|
+
readonly text: "Dieser Gutschein lässt sich nicht auszahlen.";
|
|
1736
|
+
};
|
|
1737
|
+
readonly 'voucher.add_article': {
|
|
1738
|
+
readonly text: "{article} hinzufügen";
|
|
1739
|
+
readonly placeholders: readonly ["article"];
|
|
1740
|
+
};
|
|
1741
|
+
readonly 'voucher.payout_confirm': {
|
|
1742
|
+
readonly text: "{amount} bar auszahlen?";
|
|
1743
|
+
readonly placeholders: readonly ["amount"];
|
|
1744
|
+
};
|
|
1745
|
+
readonly 'cancellation.voucher_back': {
|
|
1746
|
+
readonly text: "{amount} geht zurück auf den Gutschein";
|
|
1747
|
+
readonly placeholders: readonly ["amount"];
|
|
1748
|
+
};
|
|
1593
1749
|
readonly 'shift.all_payments': {
|
|
1594
1750
|
readonly text: "Alle Zahlungen dieser Schicht (bar + unbar)";
|
|
1595
1751
|
};
|
package/dist/esm/pos/texte.js
CHANGED
|
@@ -177,6 +177,24 @@ const MELDUNGEN_ROH = {
|
|
|
177
177
|
'cancellation.tip_source_missing': { text: 'Bitte wählen: Woher kommt das Trinkgeld zurück?' },
|
|
178
178
|
// Beleg mit Wertgutschein: keine Frage, das Trinkgeld geht mit (Ruling R59, asksRefundTip).
|
|
179
179
|
'cancellation.tip_refunded_with_voucher': { text: 'Beleg mit Gutschein: Das Trinkgeld wird mitstorniert.' },
|
|
180
|
+
// --- Gutscheine: Fehlersätze (Zuordnung in VOUCHER_ERROR_MESSAGES) ---------
|
|
181
|
+
'voucher_error.not_found': { text: 'Diesen Gutschein gibt es in diesem Betrieb nicht.' },
|
|
182
|
+
'voucher_error.invalid': { text: 'Dieser Gutschein ist nicht gültig.' },
|
|
183
|
+
'voucher_error.invalid_code': { text: 'Der Code ist nicht vollständig oder falsch abgetippt.' },
|
|
184
|
+
'voucher_error.expired': { text: 'Der Gutschein ist abgelaufen.' },
|
|
185
|
+
'voucher_error.used_up': { text: 'Der Gutschein ist bereits aufgebraucht.' },
|
|
186
|
+
'voucher_error.blocked': { text: 'Der Gutschein ist gesperrt.' },
|
|
187
|
+
'voucher_error.cancelled': { text: 'Der Gutschein wurde storniert.' },
|
|
188
|
+
'voucher_error.insufficient_balance': { text: 'Auf dem Gutschein ist nicht genug Guthaben.' },
|
|
189
|
+
'voucher_error.exceeds_total': { text: 'Der Gutschein deckt mehr, als offen ist. Bitte den Betrag anpassen.' },
|
|
190
|
+
'voucher_error.balance_changed': { text: 'Der Gutschein wurde gerade anderswo verwendet. Bitte neu prüfen.' },
|
|
191
|
+
'voucher_error.rate_mismatch': { text: 'Dieser Gutschein gilt nur für Leistungen mit {rate} %.', placeholders: ['rate'] },
|
|
192
|
+
'voucher_error.item_mismatch': { text: 'Dieser Gutschein gilt nicht für die gewählten Positionen.' },
|
|
193
|
+
'voucher_error.already_used': { text: 'Dieser Gutschein wurde bereits verwendet.' },
|
|
194
|
+
'voucher_error.partial_cancel': { text: 'Belege mit Gutschein lassen sich nur ganz stornieren.' },
|
|
195
|
+
'voucher_error.settings_missing': { text: 'Die Gutschein-Einstellungen fehlen. Bitte die Kasse neu laden.' },
|
|
196
|
+
'voucher_error.too_many_checks': { text: 'Zu viele Versuche. Bitte in einer Stunde wieder.' },
|
|
197
|
+
'voucher_error.sale_off': { text: 'Gutscheine verkaufen geht hier noch nicht.' },
|
|
180
198
|
// --- Getrennt zahlen -----------------------------------------------------
|
|
181
199
|
// Ein Tisch zahlt in Teilen, ein Beleg fuer alles. Das Teure ist eine schon
|
|
182
200
|
// belastete Karte: jeder Satz, der sie betrifft, nennt den Betrag, und keiner
|
|
@@ -544,6 +562,34 @@ export function cancellationPaymentErrorMessage(code) {
|
|
|
544
562
|
const fehler = CANCELLATION_PAYMENT_ERROR_MESSAGES;
|
|
545
563
|
return (code !== undefined && code !== null && fehler[code]) || 'cancellation.failed';
|
|
546
564
|
}
|
|
565
|
+
/**
|
|
566
|
+
* Gutschein-Fehler (`/v3`): welcher `code` des Backends welchen Satz bekommt.
|
|
567
|
+
* Wie RECEIPT_EMAIL_ERROR_MESSAGES: beide Kassen entscheiden am Code. Ein
|
|
568
|
+
* unbekannter Code geht den allgemeinen Weg des Aufrufs.
|
|
569
|
+
*/
|
|
570
|
+
export const VOUCHER_ERROR_MESSAGES = {
|
|
571
|
+
voucher_not_found: 'voucher_error.not_found',
|
|
572
|
+
voucher_invalid: 'voucher_error.invalid',
|
|
573
|
+
voucher_invalid_code: 'voucher_error.invalid_code',
|
|
574
|
+
voucher_expired: 'voucher_error.expired',
|
|
575
|
+
voucher_used_up: 'voucher_error.used_up',
|
|
576
|
+
voucher_blocked: 'voucher_error.blocked',
|
|
577
|
+
voucher_cancelled: 'voucher_error.cancelled',
|
|
578
|
+
voucher_insufficient_balance: 'voucher_error.insufficient_balance',
|
|
579
|
+
voucher_exceeds_total: 'voucher_error.exceeds_total',
|
|
580
|
+
voucher_balance_changed: 'voucher_error.balance_changed',
|
|
581
|
+
voucher_rate_mismatch: 'voucher_error.rate_mismatch',
|
|
582
|
+
voucher_item_mismatch: 'voucher_error.item_mismatch',
|
|
583
|
+
voucher_already_used: 'voucher_error.already_used',
|
|
584
|
+
voucher_partial_cancel: 'voucher_error.partial_cancel',
|
|
585
|
+
voucher_settings_missing: 'voucher_error.settings_missing',
|
|
586
|
+
too_many_voucher_checks: 'voucher_error.too_many_checks',
|
|
587
|
+
};
|
|
588
|
+
/** Der Satz zu einem Gutschein-`code`; `undefined` für jeden anderen Code. */
|
|
589
|
+
export function voucherErrorMessage(code) {
|
|
590
|
+
const fehler = VOUCHER_ERROR_MESSAGES;
|
|
591
|
+
return code !== undefined && code !== null ? fehler[code] : undefined;
|
|
592
|
+
}
|
|
547
593
|
/**
|
|
548
594
|
* Beschriftungen: Knoepfe, Ueberschriften, Zeilennamen – was kein Satz ist.
|
|
549
595
|
*
|
|
@@ -821,6 +867,30 @@ const BESCHRIFTUNGEN_ROH = {
|
|
|
821
867
|
'shift.collected_outside_drawer': { text: 'Kassiert, aber nicht in der Kassenlade' },
|
|
822
868
|
'shift.non_cash_short': { text: 'unbar' },
|
|
823
869
|
'shift.voucher_redeemed': { text: 'Gutschein eingelöst' },
|
|
870
|
+
// Gutscheine an der Kasse (1.12.0)
|
|
871
|
+
'voucher.button': { text: 'Gutschein' },
|
|
872
|
+
'voucher.redeem': { text: 'Gutschein einlösen' },
|
|
873
|
+
'voucher.sell': { text: 'Gutschein verkaufen' },
|
|
874
|
+
'voucher.payout': { text: 'Gutschein auszahlen' },
|
|
875
|
+
'voucher.code': { text: 'Code' },
|
|
876
|
+
'voucher.scan': { text: 'Code scannen' },
|
|
877
|
+
'voucher.check': { text: 'Prüfen' },
|
|
878
|
+
'voucher.amount': { text: 'Betrag' },
|
|
879
|
+
'voucher.balance': { text: 'Rest am Gutschein: {amount}', placeholders: ['amount'] },
|
|
880
|
+
'voucher.remaining_quantity': { text: '{n} von {total} übrig', placeholders: ['n', 'total'] },
|
|
881
|
+
'voucher.reason': { text: 'Grund' },
|
|
882
|
+
'voucher.multi_purpose': { text: 'Mehrzweckgutschein' },
|
|
883
|
+
'voucher.single_purpose': { text: 'Einzweckgutschein {rate} %', placeholders: ['rate'] },
|
|
884
|
+
'voucher.service': { text: 'Leistungsgutschein' },
|
|
885
|
+
'voucher.promotion': { text: 'Aktionsgutschein' },
|
|
886
|
+
'voucher.payment_line': { text: 'Gutschein ····-{suffix}', placeholders: ['suffix'] },
|
|
887
|
+
'voucher.covers_items': { text: 'Deckt: {items}', placeholders: ['items'] },
|
|
888
|
+
'voucher.code_shown_once': { text: 'Code nur jetzt sichtbar: {code}', placeholders: ['code'] },
|
|
889
|
+
'voucher.not_in_split': { text: 'Gutscheine gehen beim getrennten Kassieren nicht.' },
|
|
890
|
+
'voucher.payout_not_possible': { text: 'Dieser Gutschein lässt sich nicht auszahlen.' },
|
|
891
|
+
'voucher.add_article': { text: '{article} hinzufügen', placeholders: ['article'] },
|
|
892
|
+
'voucher.payout_confirm': { text: '{amount} bar auszahlen?', placeholders: ['amount'] },
|
|
893
|
+
'cancellation.voucher_back': { text: '{amount} geht zurück auf den Gutschein', placeholders: ['amount'] },
|
|
824
894
|
'shift.all_payments': { text: 'Alle Zahlungen dieser Schicht (bar + unbar)' },
|
|
825
895
|
'shift.receipt_count_one': { text: '1 Beleg' },
|
|
826
896
|
'shift.receipt_count_other': { text: '{count} Belege', placeholders: ['count'] },
|
package/dist/esm/react/index.js
CHANGED
|
@@ -42,8 +42,14 @@ export function HiddenQr({ data, text = 'Antippen zum Anzeigen', children }) {
|
|
|
42
42
|
}
|
|
43
43
|
function Zeile({ zeile, renderQr, qrVerdeckt, qrVerdecktText }) {
|
|
44
44
|
switch (zeile.kind) {
|
|
45
|
-
case 'text':
|
|
46
|
-
|
|
45
|
+
case 'text': {
|
|
46
|
+
// Haengender Einzug wie im Zeichenraster: fuehrende Leerzeichen eines
|
|
47
|
+
// linksbuendigen Textes werden zum Einzug aller Zeilen (HTML liesse sie
|
|
48
|
+
// sonst wegfallen). Ohne fuehrende Leerzeichen bleibt alles wie bisher.
|
|
49
|
+
const einzug = zeile.align === 'left' && zeile.text.trimStart() !== '' ? zeile.text.length - zeile.text.trimStart().length : 0;
|
|
50
|
+
const text = einzug > 0 ? zeile.text.trimStart() : zeile.text;
|
|
51
|
+
return (_jsx("div", { className: "keck-receipt-text", style: { textAlign: AUSRICHTUNG[zeile.align], fontWeight: zeile.bold ? 'bold' : 'normal', ...(einzug > 0 ? { paddingLeft: `${einzug}ch` } : {}) }, children: text.length > 0 ? text : ' ' }));
|
|
52
|
+
}
|
|
47
53
|
case 'columns':
|
|
48
54
|
return (_jsx("div", { className: "keck-receipt-row", style: { display: 'flex', width: '100%', ...(zeile.bold === true ? { fontWeight: 'bold' } : {}) }, children: zeile.columns.map((spalte, index) => (_jsx("div", { className: "keck-receipt-cell", style: {
|
|
49
55
|
// Die Breite ist ein Zwoelftel-Anteil (wie beim Bondrucker);
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { ReceiptType, type ReceiptTypeKey, KeckPaymentMethod } from '../enums/index.js';
|
|
2
2
|
import type { ReceiptItem } from '../models/receipt-item.js';
|
|
3
3
|
import type { Voucher } from '../models/voucher.js';
|
|
4
|
+
import type { PosVoucherSettings, VoucherCheck } from '../pos/gutschein.js';
|
|
5
|
+
import { type VoucherDueArticle, type VoucherDueInfo } from './gutschein-plan.js';
|
|
6
|
+
export { VOUCHER_ZERO_RATE_BUCKET_FROM, type VoucherDueArticle, type VoucherDueInfo } from './gutschein-plan.js';
|
|
4
7
|
/**
|
|
5
8
|
* Zahlbetrag eines Belegs in ganzen Cent: Zwilling von `createReceipt` im
|
|
6
9
|
* Backend (Nachtrag §8), also `beleg-toepfe.belegToepfe(...).zaehlerDeltaCents`
|
|
@@ -34,6 +37,19 @@ import type { Voucher } from '../models/voucher.js';
|
|
|
34
37
|
* sobald Trinkgeld ohne `recipients` vorkommt. Ohne angemeldeten Benutzer
|
|
35
38
|
* (Geraete-Schluessel) gilt `'staff'`.
|
|
36
39
|
*
|
|
40
|
+
* **Gutscheine der neuen Form** (Mehrzweck, Einzweck, Leistung, Aktion,
|
|
41
|
+
* Auszahlung): der Server macht daraus Positionen und Eintraege
|
|
42
|
+
* (`gutschein-beleg.plane`, Zwilling in `gutschein-plan.ts`). Was er dafuer
|
|
43
|
+
* aus seinen Daten liest, gibt die Kasse mit: je Einloesung/Auszahlung die
|
|
44
|
+
* Pruefung aus `checkVoucher` (`voucherInfo`, ueber den Code zugeordnet), fuer
|
|
45
|
+
* einen Einzweck-Verkauf die Gutschein-Einstellung der Kasse
|
|
46
|
+
* (`voucherSettings`, Satz), fuer einen Leistungsgutschein-Verkauf den Artikel
|
|
47
|
+
* (`voucherArticles`, Preis und Satz) und `smallBusiness` fuer ein
|
|
48
|
+
* Kleinunternehmer-Konto. Was fehlt oder was der Server abwiese, wirft
|
|
49
|
+
* `invalid_voucher` mit dem erwarteten Server-Code in `voucherErrorCode`.
|
|
50
|
+
* Ein Beleg nur aus Auszahlungen hat einen negativen Zahlbetrag (genau eine
|
|
51
|
+
* Barzahlung ueber diesen Betrag).
|
|
52
|
+
*
|
|
37
53
|
* **Nicht rechenbar:** jede unbrauchbare Eingabe wirft [ReceiptDueError]
|
|
38
54
|
* (`code: 'receipt_due_unavailable'`, `reason` im Einzelnen), nie still eine
|
|
39
55
|
* falsche Zahl. Dann ist nichts gesendet.
|
|
@@ -62,6 +78,42 @@ export interface ReceiptDueOptions {
|
|
|
62
78
|
}>;
|
|
63
79
|
/** Pflicht, sobald Trinkgeld ohne `recipients` vorkommt (siehe Modulkommentar). */
|
|
64
80
|
tipRecipient?: ReceiptDueTipRecipient;
|
|
81
|
+
/**
|
|
82
|
+
* Je Einloesung bzw. Auszahlung der neuen Form die Pruefung aus
|
|
83
|
+
* `checkVoucher`, ueber den Code zugeordnet. Fehlt sie fuer einen Code,
|
|
84
|
+
* wirft die Rechnung `invalid_voucher` mit `voucherErrorCode:
|
|
85
|
+
* 'voucher_not_found'` (die Kasse hat den Code nicht geprueft).
|
|
86
|
+
*/
|
|
87
|
+
voucherInfo?: readonly VoucherDueInfo[];
|
|
88
|
+
/**
|
|
89
|
+
* Gutschein-Einstellung der Kasse (`getKasseSettings`, Block `vouchers`):
|
|
90
|
+
* Pflicht fuer jeden Verkauf eines Mehrzweck- oder Einzweckgutscheins (der
|
|
91
|
+
* Server verkauft nur mit Einstellung). Fehlt sie oder ist keine Art
|
|
92
|
+
* gewaehlt: `voucher_settings_missing`; eine andere Art als die
|
|
93
|
+
* eingestellte: `voucher_invalid`.
|
|
94
|
+
*/
|
|
95
|
+
voucherSettings?: PosVoucherSettings;
|
|
96
|
+
/**
|
|
97
|
+
* Artikel fuer den Verkauf von Dienstleistungsgutscheinen (Preis und Satz,
|
|
98
|
+
* wie im Artikelstamm). Fehlt der verkaufte Artikel hier:
|
|
99
|
+
* `voucher_item_mismatch`, wie beim Server fuer einen unbekannten Artikel.
|
|
100
|
+
*/
|
|
101
|
+
voucherArticles?: readonly VoucherDueArticle[];
|
|
102
|
+
/**
|
|
103
|
+
* Das Konto ist Kleinunternehmer (Konto-Fakten): Einzweck/Leistung werden zu
|
|
104
|
+
* 0 % verkauft, eine Einzweck-Einloesung verteilt sich anteilig auf alle
|
|
105
|
+
* Saetze des Korbs. Dasselbe gilt fuer einen befreit verkauften Gutschein
|
|
106
|
+
* (`VoucherCheck.exempt`) in jedem Konto, wie der Server (`kuEingefroren || ku`).
|
|
107
|
+
*/
|
|
108
|
+
smallBusiness?: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Stichtag des 0-%-Topfs fuer Mehrzweck-Verkaeufe (`YYYY-MM-DD`). Vorgabe
|
|
111
|
+
* [VOUCHER_ZERO_RATE_BUCKET_FROM], wie im Backend. Nur angeben, wenn der
|
|
112
|
+
* Server ihn nachweislich anders fuehrt (Test-Umgebung).
|
|
113
|
+
*/
|
|
114
|
+
zeroRateBucketFrom?: string;
|
|
115
|
+
/** Wiener Tag des Belegs (`YYYY-MM-DD`); Vorgabe: heute in Wien. */
|
|
116
|
+
today?: string;
|
|
65
117
|
}
|
|
66
118
|
/** Die sechs RKSV-Toepfe in Cent, Namen wie am Beleg des Backends. */
|
|
67
119
|
export interface ReceiptDueBuckets {
|
|
@@ -108,7 +160,13 @@ export declare class ReceiptDueError extends Error {
|
|
|
108
160
|
readonly reason: ReceiptDueErrorReason;
|
|
109
161
|
/** Immer `'rejected'`: es ging nichts hinaus. */
|
|
110
162
|
readonly outcome: "rejected";
|
|
111
|
-
|
|
163
|
+
/**
|
|
164
|
+
* Nur bei `invalid_voucher`: der Gutschein-Code, mit dem der Server
|
|
165
|
+
* denselben Beleg abwiese (`voucher_rate_mismatch`, `voucher_exceeds_total`,
|
|
166
|
+
* `voucher_not_found` …), fuer die Meldung an der Kasse.
|
|
167
|
+
*/
|
|
168
|
+
readonly voucherErrorCode?: string;
|
|
169
|
+
constructor(reason: ReceiptDueErrorReason, message: string, voucherErrorCode?: string);
|
|
112
170
|
}
|
|
113
171
|
export declare function isReceiptDueError(error: unknown): error is ReceiptDueError;
|
|
114
172
|
type BelegArt = ReceiptType | ReceiptTypeKey | string;
|
|
@@ -116,4 +174,27 @@ type BelegArt = ReceiptType | ReceiptTypeKey | string;
|
|
|
116
174
|
export declare function receiptDueCents(items: readonly ReceiptItem[], vouchers: readonly Voucher[], receiptType: BelegArt, options?: ReceiptDueOptions): number;
|
|
117
175
|
/** Wie [receiptDueCents], dazu Zaehler-Delta, Wertgutschein-Anteil und Toepfe. */
|
|
118
176
|
export declare function receiptDueBreakdown(items: readonly ReceiptItem[], vouchers: readonly Voucher[], receiptType: BelegArt, options?: ReceiptDueOptions): ReceiptDueBreakdown;
|
|
119
|
-
|
|
177
|
+
/** Schon gewaehlte Gutscheine und Optionen des Belegs, vor dem Gutschein, der vorbelegt wird. */
|
|
178
|
+
export interface VoucherRedeemContext {
|
|
179
|
+
vouchers?: readonly Voucher[];
|
|
180
|
+
options?: ReceiptDueOptions;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Hoechstbetrag zum Vorbelegen einer Einloesung an der Kasse, in Cent, nie
|
|
184
|
+
* negativ: der groesste Betrag, den der Server fuer diesen Gutschein annimmt.
|
|
185
|
+
*
|
|
186
|
+
* Obergrenze: Saldo, offener Betrag; bei Einzweck die deckbaren Positionen im
|
|
187
|
+
* Topf seines Satzes abzueglich der schon gewaehlten Einloesungen dort. Befreit
|
|
188
|
+
* verkauft bzw. als Kleinunternehmer verteilt der Server anteilig auf alle
|
|
189
|
+
* Saetze (`kuTeile`); dann begrenzt jeder Topf: sein Anteil plus die schon
|
|
190
|
+
* gewaehlten Einloesungen dort darf seine Positionen nicht uebersteigen.
|
|
191
|
+
*
|
|
192
|
+
* Unter dieser Grenze wird jeder Kandidat mit genau der Rechnung von
|
|
193
|
+
* [receiptDueCents] geprueft (Rundung halber Cent, groesster Rest), zuerst
|
|
194
|
+
* Cent fuer Cent abwaerts (64 Schritte). Findet das nichts, sucht eine
|
|
195
|
+
* Bisektion ueber [1, Grenze] und prueft danach 16 Cent aufwaerts: am Rand
|
|
196
|
+
* des groessten Rests ist die Annahme nicht monoton. Leistung (wird ueber
|
|
197
|
+
* Positionen eingeloest), Aktion (Rabatt rechnet der Server) und jeder nicht
|
|
198
|
+
* aktive Gutschein: 0.
|
|
199
|
+
*/
|
|
200
|
+
export declare function voucherRedeemMaxCents(items: readonly ReceiptItem[], voucher: VoucherCheck, before?: VoucherRedeemContext): number;
|