@kreiseck/kasseneck-api 0.6.9 → 0.6.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +21 -0
  2. package/dist/cjs/client/aufrufe.d.ts +21 -0
  3. package/dist/cjs/client/aufrufe.js +34 -0
  4. package/dist/cjs/client/cashregisters.d.ts +2 -2
  5. package/dist/cjs/client/index.d.ts +2 -1
  6. package/dist/cjs/client/index.js +3 -1
  7. package/dist/cjs/client/receipts.d.ts +31 -12
  8. package/dist/cjs/client/receipts.js +51 -0
  9. package/dist/cjs/client/reports.d.ts +3 -3
  10. package/dist/cjs/client/status.d.ts +3 -3
  11. package/dist/cjs/index.d.ts +2 -2
  12. package/dist/cjs/index.js +4 -2
  13. package/dist/cjs/kasse/artikel.d.ts +3 -3
  14. package/dist/cjs/kasse/client.d.ts +4 -4
  15. package/dist/cjs/kasse/drucker.d.ts +4 -4
  16. package/dist/cjs/kasse/index.d.ts +1 -1
  17. package/dist/cjs/kasse/index.js +30 -1
  18. package/dist/cjs/kasse/settings.d.ts +113 -26
  19. package/dist/cjs/kasse/settings.js +91 -9
  20. package/dist/cjs/models/index.d.ts +1 -1
  21. package/dist/cjs/models/index.js +3 -1
  22. package/dist/cjs/models/receipt-item.d.ts +41 -0
  23. package/dist/cjs/models/receipt-item.js +41 -1
  24. package/dist/cjs/models/receipt.d.ts +7 -0
  25. package/dist/cjs/models/receipt.js +2 -0
  26. package/dist/cjs/payments/hobex.d.ts +3 -3
  27. package/dist/cjs/payments/stripe.d.ts +3 -3
  28. package/dist/cjs/printing/escpos.js +7 -0
  29. package/dist/cjs/react/index.js +11 -1
  30. package/dist/cjs/receipt/discount.js +1 -1
  31. package/dist/cjs/receipt/layout-escpos.js +9 -4
  32. package/dist/cjs/receipt/layout.d.ts +6 -3
  33. package/dist/cjs/receipt/layout.js +166 -14
  34. package/dist/cjs/register/index.d.ts +1 -1
  35. package/dist/cjs/register/index.js +2 -1
  36. package/dist/cjs/register/pairing.d.ts +17 -0
  37. package/dist/cjs/register/pairing.js +28 -3
  38. package/dist/cjs/register/session.d.ts +3 -3
  39. package/dist/esm/client/aufrufe.d.ts +21 -0
  40. package/dist/esm/client/aufrufe.js +31 -0
  41. package/dist/esm/client/cashregisters.d.ts +2 -2
  42. package/dist/esm/client/index.d.ts +2 -1
  43. package/dist/esm/client/index.js +1 -0
  44. package/dist/esm/client/receipts.d.ts +31 -12
  45. package/dist/esm/client/receipts.js +51 -0
  46. package/dist/esm/client/reports.d.ts +3 -3
  47. package/dist/esm/client/status.d.ts +3 -3
  48. package/dist/esm/index.d.ts +2 -2
  49. package/dist/esm/index.js +2 -2
  50. package/dist/esm/kasse/artikel.d.ts +3 -3
  51. package/dist/esm/kasse/client.d.ts +4 -4
  52. package/dist/esm/kasse/drucker.d.ts +4 -4
  53. package/dist/esm/kasse/index.d.ts +1 -1
  54. package/dist/esm/kasse/index.js +3 -1
  55. package/dist/esm/kasse/settings.d.ts +113 -26
  56. package/dist/esm/kasse/settings.js +90 -8
  57. package/dist/esm/models/index.d.ts +1 -1
  58. package/dist/esm/models/index.js +1 -1
  59. package/dist/esm/models/receipt-item.d.ts +41 -0
  60. package/dist/esm/models/receipt-item.js +39 -1
  61. package/dist/esm/models/receipt.d.ts +7 -0
  62. package/dist/esm/models/receipt.js +2 -0
  63. package/dist/esm/payments/hobex.d.ts +3 -3
  64. package/dist/esm/payments/stripe.d.ts +3 -3
  65. package/dist/esm/printing/escpos.js +7 -0
  66. package/dist/esm/react/index.js +11 -1
  67. package/dist/esm/receipt/discount.js +1 -1
  68. package/dist/esm/receipt/layout-escpos.js +9 -4
  69. package/dist/esm/receipt/layout.d.ts +6 -3
  70. package/dist/esm/receipt/layout.js +167 -15
  71. package/dist/esm/register/index.d.ts +1 -1
  72. package/dist/esm/register/index.js +1 -1
  73. package/dist/esm/register/pairing.d.ts +17 -0
  74. package/dist/esm/register/pairing.js +27 -3
  75. package/dist/esm/register/session.d.ts +3 -3
  76. package/fixtures/belege/rabatt-chef-trinkgeld.json +89 -0
  77. package/fixtures/belege/rabatt-einfach.json +50 -0
  78. package/fixtures/belege/rabatt-trinkgeld.json +75 -0
  79. package/fixtures/belege/rabatt-wertgutschein.json +70 -0
  80. package/fixtures/belege/rabattzeilen.json +5 -3
  81. package/fixtures/belege/storno-rabatt.json +68 -0
  82. package/fixtures/erwartet/rabatt-chef-trinkgeld.grid32.txt +31 -0
  83. package/fixtures/erwartet/rabatt-chef-trinkgeld.grid48.txt +30 -0
  84. package/fixtures/erwartet/rabatt-chef-trinkgeld.lines.json +317 -0
  85. package/fixtures/erwartet/rabatt-einfach.grid32.txt +26 -0
  86. package/fixtures/erwartet/rabatt-einfach.grid48.txt +25 -0
  87. package/fixtures/erwartet/rabatt-einfach.lines.json +250 -0
  88. package/fixtures/erwartet/rabatt-trinkgeld.grid32.txt +31 -0
  89. package/fixtures/erwartet/rabatt-trinkgeld.grid48.txt +30 -0
  90. package/fixtures/erwartet/rabatt-trinkgeld.lines.json +336 -0
  91. package/fixtures/erwartet/rabatt-wertgutschein.grid32.txt +32 -0
  92. package/fixtures/erwartet/rabatt-wertgutschein.grid48.txt +31 -0
  93. package/fixtures/erwartet/rabatt-wertgutschein.lines.json +330 -0
  94. package/fixtures/erwartet/rabattzeilen.grid32.txt +4 -2
  95. package/fixtures/erwartet/rabattzeilen.grid48.txt +4 -2
  96. package/fixtures/erwartet/rabattzeilen.lines.json +18 -8
  97. package/fixtures/erwartet/storno-rabatt.grid32.txt +34 -0
  98. package/fixtures/erwartet/storno-rabatt.grid48.txt +32 -0
  99. package/fixtures/erwartet/storno-rabatt.lines.json +317 -0
  100. package/fixtures/kasse-settings-standard.json +44 -5
  101. package/fixtures/manifest.json +34 -4
  102. package/fixtures/oberflaeche.json +216 -0
  103. package/package.json +3 -2
@@ -73,6 +73,12 @@ function createReceiptParams(options) {
73
73
  }
74
74
  }
75
75
  }
76
+ if (options.tip != null) {
77
+ if (typ.value !== ReceiptType.standard.value && typ.value !== ReceiptType.training.value) {
78
+ throw eingabefehler(`Trinkgeld ist nur bei receiptType standard oder training moeglich, nicht bei "${typ.value}".`);
79
+ }
80
+ params['tip'] = gepruefterTip(options.tip);
81
+ }
76
82
  if (options.customProjectId != null) {
77
83
  params['customProjectId'] = options.customProjectId;
78
84
  }
@@ -358,6 +364,51 @@ function alsNutzlast(werte, wandeln) {
358
364
  throw eingabefehler(ursache instanceof Error ? ursache.message : 'Ungueltige Nutzlast uebergeben.');
359
365
  }
360
366
  }
367
+ /** Positive ganze Cent? */
368
+ function istCentBetrag(wert) {
369
+ return typeof wert === 'number' && Number.isInteger(wert) && wert > 0;
370
+ }
371
+ /**
372
+ * Trinkgeld pruefen und in die Nutzlast-Form bringen (Zahl bleibt Zahl; das
373
+ * Objekt geht mit geprueftem Zahlart-Wert und Empfaengern hinaus). Dieselben
374
+ * Regeln wie das Backend (tip-core.normalizeTip) — nur frueher.
375
+ */
376
+ function gepruefterTip(tip) {
377
+ if (typeof tip === 'number') {
378
+ if (!istCentBetrag(tip))
379
+ throw eingabefehler('Trinkgeld: Betrag muss eine ganze Zahl in Cent > 0 sein.');
380
+ return tip;
381
+ }
382
+ if (tip == null || typeof tip !== 'object' || !istCentBetrag(tip.cents)) {
383
+ throw eingabefehler('Trinkgeld: Betrag muss eine ganze Zahl in Cent > 0 sein.');
384
+ }
385
+ const nutzlast = { cents: tip.cents };
386
+ if (tip.paymentMethod != null)
387
+ nutzlast['paymentMethod'] = gepruefteZahlungsart(tip.paymentMethod);
388
+ if (tip.recipients != null) {
389
+ if (!Array.isArray(tip.recipients) || tip.recipients.length === 0) {
390
+ throw eingabefehler('Trinkgeld: recipients darf nicht leer sein.');
391
+ }
392
+ let summe = 0;
393
+ const gesehen = new Set();
394
+ for (const r of tip.recipients) {
395
+ if (r == null || typeof r.registerUserId !== 'string' || r.registerUserId === '') {
396
+ throw eingabefehler('Trinkgeld: recipients[].registerUserId fehlt.');
397
+ }
398
+ if (!istCentBetrag(r.cents))
399
+ throw eingabefehler('Trinkgeld: recipients[].cents muss eine ganze Zahl > 0 sein.');
400
+ if (gesehen.has(r.registerUserId))
401
+ throw eingabefehler(`Trinkgeld: Kassen-Benutzer ${r.registerUserId} doppelt.`);
402
+ gesehen.add(r.registerUserId);
403
+ summe += r.cents;
404
+ }
405
+ if (summe !== tip.cents) {
406
+ throw eingabefehler(`Trinkgeld: Summe der Empfaenger (${summe}) entspricht nicht dem Betrag (${tip.cents}).`);
407
+ }
408
+ nutzlast['recipients'] = tip.recipients.map((r) => ({ registerUserId: r.registerUserId, cents: r.cents }));
409
+ }
410
+ return nutzlast;
411
+ }
361
412
  /** Zahlungsart des Aufrufers pruefen — unbekannt wirft, bevor etwas rausgeht. */
362
413
  function gepruefteZahlungsart(wert) {
363
414
  if (typeof wert === 'object') {
@@ -1,5 +1,5 @@
1
1
  import type { ReportMonth } from '../models/index.js';
2
- import type { KasseneckBinaryTransport } from './transport.js';
2
+ import type { InternerBinaerTransport } from './aufrufe.js';
3
3
  /**
4
4
  * Bericht-Downloads — Zwilling von `downloadDailyReport`/`downloadMonthlyReport`
5
5
  * in kasseneck_api/lib/kasseneck_api.dart (Zeilen 113-128).
@@ -29,7 +29,7 @@ import type { KasseneckBinaryTransport } from './transport.js';
29
29
  * Vortags holen (das Dart-Vorbild nimmt hier die Geraetezeit, was auf einer
30
30
  * oesterreichischen Kasse zufaellig stimmt).
31
31
  */
32
- export declare function downloadDailyReport(rufen: KasseneckBinaryTransport, date: Date): Promise<Uint8Array>;
32
+ export declare function downloadDailyReport(rufen: InternerBinaerTransport, date: Date): Promise<Uint8Array>;
33
33
  /**
34
34
  * Monatsbericht als PDF.
35
35
  *
@@ -40,4 +40,4 @@ export declare function downloadDailyReport(rufen: KasseneckBinaryTransport, dat
40
40
  * `month` geht als **Zahl 1-12** raus (im Flutter-Paket `reportMonth.month.id`,
41
41
  * wo `KeckMonth.january.id === 1` ist) — kein Name, kein nullbasierter Index.
42
42
  */
43
- export declare function downloadMonthlyReport(rufen: KasseneckBinaryTransport, reportMonth: ReportMonth): Promise<Uint8Array>;
43
+ export declare function downloadMonthlyReport(rufen: InternerBinaerTransport, reportMonth: ReportMonth): Promise<Uint8Array>;
@@ -1,4 +1,4 @@
1
- import type { KasseneckTransport } from './transport.js';
1
+ import type { InternerTransport } from './aufrufe.js';
2
2
  /**
3
3
  * Betriebsstatus von Kasse und Signatureinheit bei FinanzOnline — Zwilling von
4
4
  * `getCashboxStatus`/`getSignatureStatus` in
@@ -31,7 +31,7 @@ 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(rufen: KasseneckTransport): Promise<CashboxStatus>;
34
+ export declare function getCashboxStatus(rufen: InternerTransport): Promise<CashboxStatus>;
35
35
  /**
36
36
  * Status der Signatureinheit mit der Zertifikatsseriennummer [zertifikatNrHex]
37
37
  * (hexadezimal, z. B. `6F0404F0`).
@@ -40,4 +40,4 @@ export declare function getCashboxStatus(rufen: KasseneckTransport): Promise<Cas
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(rufen: KasseneckTransport, zertifikatNrHex: string): Promise<SignatureStatus>;
43
+ export declare function getSignatureStatus(rufen: InternerTransport, zertifikatNrHex: string): Promise<SignatureStatus>;
@@ -1,5 +1,5 @@
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 Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid, type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, 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, istZeroKind, 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, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, type ReceiptCommonOptions, type SellReceiptOptions, type CancelReceiptOptions, type CancelReceiptResult, type CreateCancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, listMyCashregisters, checkVoucherCombinationError, downloadDailyReport, downloadMonthlyReport, type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, type KasseneckApi, createKasseneckApi, } from './client/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, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, 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, istZeroKind, 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, DEFAULT_TIMEOUT_MS, type HttpResponseLike, type HttpRequestInit, type FetchLike, type TransportOptions, type TransportBodyFields, type KasseneckTransport, type KasseneckBinaryTransport, AUFRUFE, type Aufruf, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, type ValidationScope, type KasseneckError, type HttpFailureReason, type CauseDigest, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, type ReceiptCommonOptions, type SellReceiptOptions, type TipOptions, type TipRecipientShare, type CancelReceiptOptions, type CancelReceiptResult, type CreateCancelReceiptOptions, type ReceiptWithCompany, sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, type ListMyReceiptsOptions, type ReceiptList, type ReceiptListStats, listMyCashregisters, checkVoucherCombinationError, downloadDailyReport, downloadMonthlyReport, type CashboxStatus, type SignatureStatus, getCashboxStatus, getSignatureStatus, type KasseneckApi, createKasseneckApi, } from './client/index.js';
4
4
  export { parseServerTimeStamp, toViennaWallClock, type ViennaWallClock } from './vienna-time.js';
5
5
  export { type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, type ArticleGroup, type KasseArtikel, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, fromArticleGroupPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings, verteileRabatt, cancelScopeOf, receiptsScopeOf, } from './kasse/index.js';
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { ReceiptType, VatRate, KeckPaymentMethod, CreditCardProvider, VoucherType, VoucherAction, StripeLinkMode, } from './enums/index.js';
2
- export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, toVoucherPayload, fromVoucherPayload, voucherIsValid, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, fromReceiptCompanyPayload, receiptCompanyTaxInfo, fromCashregisterPayload, fromReceiptSummaryPayload, ZERO_KINDS, istZeroKind, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
3
- export { apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, listMyCashregisters, checkVoucherCombinationError, downloadDailyReport, downloadMonthlyReport, getCashboxStatus, getSignatureStatus, createKasseneckApi, } from './client/index.js';
2
+ export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, isTipItem, toVoucherPayload, fromVoucherPayload, voucherIsValid, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, fromReceiptCompanyPayload, receiptCompanyTaxInfo, fromCashregisterPayload, fromReceiptSummaryPayload, ZERO_KINDS, istZeroKind, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, toHobexReceiptPayload, fromHobexReceiptPayload, hobexReceiptToCardPaymentData, hobexReceiptNeedsSignature, } from './models/index.js';
3
+ export { apiKeyAuth, registerUserAuth, DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS, AUFRUFE, createTransport, createBinaryTransport, KasseneckApiError, KasseneckAuthError, KasseneckHttpError, KasseneckNetworkError, KasseneckValidationError, isKasseneckApiError, isKasseneckAuthError, isKasseneckHttpError, isKasseneckNetworkError, isKasseneckValidationError, sellReceipt, sellReceiptWithCompany, cancelReceipt, createCancelReceipt, zeroReceipt, getReceipt, getReceiptWithCompany, generateFullReceiptId, getFirstReceiptDate, listMyReceipts, listMyCashregisters, checkVoucherCombinationError, downloadDailyReport, downloadMonthlyReport, getCashboxStatus, getSignatureStatus, createKasseneckApi, } from './client/index.js';
4
4
  export { parseServerTimeStamp, toViennaWallClock } from './vienna-time.js';
5
5
  export { KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, fromArticleGroupPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings, verteileRabatt, cancelScopeOf, receiptsScopeOf, } from './kasse/index.js';
@@ -1,4 +1,4 @@
1
- import type { KasseneckTransport } from '../client/transport.js';
1
+ import type { InternerTransport } from '../client/aufrufe.js';
2
2
  /**
3
3
  * Artikelgruppen (Kategorien der Kachel-Kasse) und Artikel in der Form, die
4
4
  * die Kacheln brauchen — Backend: `article-endpoints.js`
@@ -79,5 +79,5 @@ export interface KasseArtikelPayload {
79
79
  maxMenge?: number | null;
80
80
  }
81
81
  export declare function fromKasseArtikelPayload(p: KasseArtikelPayload): KasseArtikel;
82
- export declare function listMyArticleGroups(rufen: KasseneckTransport): Promise<ArticleGroup[]>;
83
- export declare function listMyArticles(rufen: KasseneckTransport): Promise<KasseArtikel[]>;
82
+ export declare function listMyArticleGroups(rufen: InternerTransport): Promise<ArticleGroup[]>;
83
+ export declare function listMyArticles(rufen: InternerTransport): Promise<KasseArtikel[]>;
@@ -1,10 +1,10 @@
1
- import type { KasseneckTransport } from '../client/transport.js';
1
+ import type { InternerTransport } from '../client/aufrufe.js';
2
2
  import { type KasseSettings, type KasseSettingsBetrieb, type KasseSettingsGeraet } from './settings.js';
3
3
  /** Einstellungen lesen — Standard + gespeichert (Backend: `getKasseSettings`). */
4
- export declare function getKasseSettings(rufen: KasseneckTransport, options?: {
4
+ export declare function getKasseSettings(rufen: InternerTransport, options?: {
5
5
  deviceId?: string;
6
6
  }): Promise<KasseSettings>;
7
7
  /** Betriebsweite Einstellungen schreiben (Recht `layout`); liefert den gemischten Stand. */
8
- export declare function setMyKasseSettings(rufen: KasseneckTransport, betrieb: Partial<KasseSettingsBetrieb>): Promise<KasseSettingsBetrieb>;
8
+ export declare function setMyKasseSettings(rufen: InternerTransport, betrieb: Partial<KasseSettingsBetrieb>): Promise<KasseSettingsBetrieb>;
9
9
  /** Geraete-Einstellungen schreiben (Recht `layout`); liefert den gemischten Stand. */
10
- export declare function setMyRegisterDeviceSettings(rufen: KasseneckTransport, deviceId: string, geraet: Partial<KasseSettingsGeraet>): Promise<KasseSettingsGeraet>;
10
+ export declare function setMyRegisterDeviceSettings(rufen: InternerTransport, deviceId: string, geraet: Partial<KasseSettingsGeraet>): Promise<KasseSettingsGeraet>;
@@ -1,4 +1,4 @@
1
- import type { KasseneckTransport } from '../client/transport.js';
1
+ import type { InternerTransport } from '../client/aufrufe.js';
2
2
  import type { ReceiptLayout } from '../receipt/layout.js';
3
3
  /**
4
4
  * Netzwerk-Bondrucker ueber Epson "Server Direct Print": das Backend fuehrt
@@ -39,7 +39,7 @@ export interface DruckJob {
39
39
  zeit?: number;
40
40
  } | null;
41
41
  }
42
- export declare function listMyPrinters(rufen: KasseneckTransport): Promise<NetzDrucker[]>;
42
+ export declare function listMyPrinters(rufen: InternerTransport): Promise<NetzDrucker[]>;
43
43
  export interface CreatePrintJobOptions {
44
44
  druckerId: string;
45
45
  layout: ReceiptLayout;
@@ -47,8 +47,8 @@ export interface CreatePrintJobOptions {
47
47
  titel?: string;
48
48
  quelle?: string;
49
49
  }
50
- export declare function createPrintJob(rufen: KasseneckTransport, o: CreatePrintJobOptions): Promise<DruckJob>;
51
- export declare function getPrintJob(rufen: KasseneckTransport, o: {
50
+ export declare function createPrintJob(rufen: InternerTransport, o: CreatePrintJobOptions): Promise<DruckJob>;
51
+ export declare function getPrintJob(rufen: InternerTransport, o: {
52
52
  druckerId: string;
53
53
  jobId: string;
54
54
  }): Promise<DruckJob>;
@@ -3,7 +3,7 @@
3
3
  * Rabattverteilung. Die Aufrufe heissen 1:1 wie die Backend-Functions
4
4
  * (die Rewrites-Waechter der Web-App leiten daraus ab).
5
5
  */
6
- export { type KasseStil, type KasseSchrift, type KasseWasserzeichen, type KasseMenge, type KasseTgModus, type KasseKassierenModus, type KasseKartenanbieter, KARTENANBIETER, type KasseBelegAusgabe, type KasseTastenAktion, type KasseTastenkarte, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, type KasseLayout, type KasseKatpos, type KasseHoehe, type KasseDruckerArt, type KassePapier, type KasseZeichensatz, type KasseSchnitt, type KasseLadeAuto, type Schalterkarte, type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, } from './settings.js';
6
+ export { type KasseStil, type KasseSchrift, type KasseWasserzeichen, type KasseMenge, type KasseTgModus, type KasseKassierenModus, type KasseKartenanbieter, KARTENANBIETER, type KasseBelegAusgabe, type KasseTastenAktion, type KasseTastenkarte, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, type KasseLayout, type KasseKatpos, type KasseHoehe, type KasseDruckerArt, type KasseTerminalVia, type KasseTerminalArt, type KassePapier, type KasseZeichensatz, type KasseSchnitt, type KasseLadeAuto, type KasseLogoGroesse, type KasseSchriftEinst, type KasseKachelstil, type KasseAutoAbMin, type KasseRabatt, type KasseWzSeite, type KasseWzStaerke, type KasseLogoSkala, type KasseWzSkala, type KasseFertigSekunden, type Schalterkarte, type KasseSettingsBetrieb, type KasseSettingsGeraet, type KasseSettings, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, STIL, SCHRIFT, WASSERZEICHEN, MENGE, TG_MODUS, KASSIEREN_MODUS, BELEG_AUSGABE, LAYOUT, KATPOS, HOEHE, DRUCKER_ART, TERMINAL_VIA, TERMINAL_ART, PAPIER, ZEICHENSATZ, SCHNITT, LADE_AUTO, TASTEN_AKTIONEN, LOGO_GROESSE, SCHRIFT_EINST, KACHELSTIL, AUTO_AB_MIN, RABATT, WZ_SEITE, WZ_STAERKE, LOGO_SKALA, WZ_SKALA, FERTIG_SEKUNDEN, } from './settings.js';
7
7
  export { type ArticleGroup, type ArticleGroupPayload, fromArticleGroupPayload, type KasseArtikel, type KasseArtikelPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, type Mengenregel, type MengenVorgabe, mengenregelFuerEinheit, mengenVorgabe, mengeErlaubt, } from './artikel.js';
8
8
  export { getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings } from './client.js';
9
9
  export { verteileRabatt } from '../receipt/discount.js';
@@ -3,7 +3,9 @@
3
3
  * Rabattverteilung. Die Aufrufe heissen 1:1 wie die Backend-Functions
4
4
  * (die Rewrites-Waechter der Web-App leiten daraus ab).
5
5
  */
6
- export { KARTENANBIETER, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings, } from './settings.js';
6
+ export { KARTENANBIETER, KASSE_TASTEN_AKTIONEN, KASSE_TASTEN_STANDARD, KASSE_BETRIEB_STANDARD, KASSE_GERAET_STANDARD, mergeKasseSettings,
7
+ // Die Enums als Laufzeitlisten — dieselben Werte, die die Typen oben tragen.
8
+ STIL, SCHRIFT, WASSERZEICHEN, MENGE, TG_MODUS, KASSIEREN_MODUS, BELEG_AUSGABE, LAYOUT, KATPOS, HOEHE, DRUCKER_ART, TERMINAL_VIA, TERMINAL_ART, PAPIER, ZEICHENSATZ, SCHNITT, LADE_AUTO, TASTEN_AKTIONEN, LOGO_GROESSE, SCHRIFT_EINST, KACHELSTIL, AUTO_AB_MIN, RABATT, WZ_SEITE, WZ_STAERKE, LOGO_SKALA, WZ_SKALA, FERTIG_SEKUNDEN, } from './settings.js';
7
9
  export { fromArticleGroupPayload, fromKasseArtikelPayload, listMyArticleGroups, listMyArticles, mengenregelFuerEinheit, mengenVorgabe, mengeErlaubt, } from './artikel.js';
8
10
  export { getKasseSettings, setMyKasseSettings, setMyRegisterDeviceSettings } from './client.js';
9
11
  export { verteileRabatt } from '../receipt/discount.js';
@@ -7,41 +7,95 @@
7
7
  * Backend; ein Test in beiden Repos haelt sie deckungsgleich. Trinkgeld ist
8
8
  * bewusst AUS, bis die Buchung geklaert ist (Spec kachel-kasse § 9).
9
9
  */
10
- export type KasseStil = 'klar' | 'warm' | 'nacht' | 'kontrast';
11
- export type KasseSchrift = 'S' | 'M' | 'L' | 'XL';
12
- export type KasseWasserzeichen = 'aus' | 'anmeldung' | 'ueberall';
13
- export type KasseMenge = 'aus' | 'x' | 'kg';
14
- export type KasseTgModus = 'betrag' | 'gesamt' | 'beides';
15
- export type KasseKassierenModus = 'seite' | 'panel';
10
+ export declare const STIL: readonly ["klar", "warm", "nacht", "kontrast"];
11
+ export type KasseStil = typeof STIL[number];
12
+ export declare const SCHRIFT: readonly ["S", "M", "L", "XL"];
13
+ export type KasseSchrift = typeof SCHRIFT[number];
14
+ export declare const WASSERZEICHEN: readonly ["aus", "anmeldung", "ueberall"];
15
+ export type KasseWasserzeichen = typeof WASSERZEICHEN[number];
16
+ export declare const MENGE: readonly ["aus", "x", "kg"];
17
+ export type KasseMenge = typeof MENGE[number];
18
+ export declare const TG_MODUS: readonly ["betrag", "gesamt", "beides"];
19
+ export type KasseTgModus = typeof TG_MODUS[number];
20
+ export declare const KASSIEREN_MODUS: readonly ["seite", "panel"];
21
+ export type KasseKassierenModus = typeof KASSIEREN_MODUS[number];
16
22
  /** Kartenanbieter: Karte gibt es erst mit eingerichtetem Anbieter; 'extern' = eigenes Terminal ohne Anbindung. */
17
- export type KasseKartenanbieter = 'keiner' | 'extern' | 'hobex' | 'mypos' | 'stripe';
18
- export declare const KARTENANBIETER: readonly KasseKartenanbieter[];
19
- export type KasseBelegAusgabe = 'qr' | 'druck' | 'mail' | 'sms' | 'fragen';
20
- export type KasseLayout = 'rechts' | 'links' | 'vollbild';
21
- export type KasseKatpos = 'oben' | 'links';
22
- export type KasseHoehe = 'S' | 'M' | 'L';
23
- /** `sdp` = Netzwerk ueber Epson Server Direct Print (der Drucker holt Jobs vom Backend, jeder Browser druckt). */
24
- export type KasseDruckerArt = 'sdp' | 'netz' | 'bt' | 'usb';
25
- export type KassePapier = 'mm58' | 'mm80';
26
- export type KasseZeichensatz = 'CP1252' | 'CP437';
27
- export type KasseSchnitt = 'partial' | 'full' | 'none';
28
- export type KasseLadeAuto = 'bar' | 'immer' | 'nie';
23
+ export declare const KARTENANBIETER: readonly ["keiner", "extern", "gptom", "hobex", "mypos", "stripe"];
24
+ export type KasseKartenanbieter = typeof KARTENANBIETER[number];
25
+ export declare const BELEG_AUSGABE: readonly ["qr", "druck", "mail", "sms", "fragen"];
26
+ export type KasseBelegAusgabe = typeof BELEG_AUSGABE[number];
27
+ export declare const LAYOUT: readonly ["rechts", "links", "vollbild"];
28
+ export type KasseLayout = typeof LAYOUT[number];
29
+ export declare const KATPOS: readonly ["oben", "links"];
30
+ export type KasseKatpos = typeof KATPOS[number];
31
+ export declare const HOEHE: readonly ["S", "M", "L"];
32
+ export type KasseHoehe = typeof HOEHE[number];
33
+ /**
34
+ * `sdp` = Netzwerk ueber Epson Server Direct Print (der Drucker holt Jobs vom Backend, jeder Browser druckt).
35
+ * `connect` = Kasseneck Connect (lokaler Agent auf dem Kassen-Rechner druckt fuer die Browser-Kasse).
36
+ */
37
+ export declare const DRUCKER_ART: readonly ["sdp", "netz", "bt", "usb", "connect"];
38
+ export type KasseDruckerArt = typeof DRUCKER_ART[number];
39
+ /** Terminal-Ansprache: direkt per IP (wie bisher) oder ueber Kasseneck Connect (Agent leitet weiter). */
40
+ export declare const TERMINAL_VIA: readonly ["direkt", "connect"];
41
+ export type KasseTerminalVia = typeof TERMINAL_VIA[number];
42
+ /** Art des Kartenterminals an dieser Kasse: keines oder Hobex HPS (JSON-REST am Geraet). */
43
+ export declare const TERMINAL_ART: readonly ["keins", "hps"];
44
+ export type KasseTerminalArt = typeof TERMINAL_ART[number];
45
+ export declare const PAPIER: readonly ["mm58", "mm80"];
46
+ export type KassePapier = typeof PAPIER[number];
47
+ export declare const ZEICHENSATZ: readonly ["CP1252", "CP437"];
48
+ export type KasseZeichensatz = typeof ZEICHENSATZ[number];
49
+ export declare const SCHNITT: readonly ["partial", "full", "none"];
50
+ export type KasseSchnitt = typeof SCHNITT[number];
51
+ export declare const LADE_AUTO: readonly ["bar", "immer", "nie"];
52
+ export type KasseLadeAuto = typeof LADE_AUTO[number];
53
+ /** Groesse des Kuerzel-Logos in der Kopfzeile der Kasse. */
54
+ export declare const LOGO_GROESSE: readonly ["S", "M", "L"];
55
+ export type KasseLogoGroesse = typeof LOGO_GROESSE[number];
56
+ /** Schriftgroesse in den Chef-Einstellungen — getrennt von der Schrift der Kasse. */
57
+ export declare const SCHRIFT_EINST: readonly ["S", "M", "L"];
58
+ export type KasseSchriftEinst = typeof SCHRIFT_EINST[number];
59
+ /** Kachel-Optik: farbiger Streifen am Rand oder ganz gefuellte Kachel. */
60
+ export declare const KACHELSTIL: readonly ["streifen", "voll"];
61
+ export type KasseKachelstil = typeof KACHELSTIL[number];
62
+ /** Automatisches Abmelden nach Minuten Ruhe; 0 = nie. */
63
+ export declare const AUTO_AB_MIN: readonly [0, 1, 5, 15, 30];
64
+ export type KasseAutoAbMin = typeof AUTO_AB_MIN[number];
65
+ /** Rabatt am Beleg erlaubt. */
66
+ export declare const RABATT: readonly ["aus", "an"];
67
+ export type KasseRabatt = typeof RABATT[number];
68
+ /** Seite des Wasserzeichens — ALT, abgeloest von wzPos. */
69
+ export declare const WZ_SEITE: readonly ["links", "mitte", "rechts"];
70
+ export type KasseWzSeite = typeof WZ_SEITE[number];
71
+ /** Deckkraft des Wasserzeichens in Prozent — bewusst Stufen, kein Schieberegler. */
72
+ export declare const WZ_STAERKE: readonly [3, 6, 10, 16];
73
+ export type KasseWzStaerke = typeof WZ_STAERKE[number];
74
+ /** Groesse des Bild-Logos am Beleg. */
75
+ export declare const LOGO_SKALA: readonly ["S", "M", "L", "XL"];
76
+ export type KasseLogoSkala = typeof LOGO_SKALA[number];
77
+ /** Groesse des Wasserzeichens — getrennt vom Beleg-Logo. */
78
+ export declare const WZ_SKALA: readonly ["S", "M", "L", "XL"];
79
+ export type KasseWzSkala = typeof WZ_SKALA[number];
80
+ /** Wie lange die Fertig-Seite stehen bleibt, in Sekunden; 0 = bis zum Tippen. */
81
+ export declare const FERTIG_SEKUNDEN: readonly [0, 3, 5, 10, 15, 30, 60];
82
+ export type KasseFertigSekunden = typeof FERTIG_SEKUNDEN[number];
29
83
  /** Schalter-Landkarte: Steuersaetze / Trinkgeldstufen (Schluessel = Wert als Text). */
30
84
  export type Schalterkarte = Record<string, boolean>;
31
85
  export interface KasseSettingsBetrieb {
32
86
  logoText: string;
33
87
  logoAn: boolean;
34
- logoGroesse: 'S' | 'M' | 'L';
88
+ logoGroesse: KasseLogoGroesse;
35
89
  wasserzeichen: KasseWasserzeichen;
36
90
  farbe: string;
37
91
  stil: KasseStil;
38
92
  schrift: KasseSchrift;
39
- schriftEinst: 'S' | 'M' | 'L';
40
- kachelstil: 'streifen' | 'voll';
93
+ schriftEinst: KasseSchriftEinst;
94
+ kachelstil: KasseKachelstil;
41
95
  uhr: boolean;
42
96
  sperrbild: boolean;
43
97
  foto: boolean;
44
- autoAbMin: 0 | 1 | 5 | 15 | 30;
98
+ autoAbMin: KasseAutoAbMin;
45
99
  abNachVerkauf: boolean;
46
100
  /** Schnelles Entsperren mit gemerkter PIN (lokal, Server-Login laeuft nach); aus = streng, jeder Login wartet. */
47
101
  schnellLogin: boolean;
@@ -54,7 +108,21 @@ export interface KasseSettingsBetrieb {
54
108
  menge: KasseMenge;
55
109
  notiz: boolean;
56
110
  suche: boolean;
57
- rabatt: 'aus' | 'an';
111
+ rabatt: KasseRabatt;
112
+ /** Bild-Logo (Download-URL aus dem Kasse-Upload); '' = Kuerzel verwenden. */
113
+ logoBild: string;
114
+ /** Seite des Wasserzeichens — ALT: abgeloest von wzPos, bleibt fuers Mischen alter Staende. */
115
+ wzSeite: KasseWzSeite;
116
+ /** Horizontale Lage der Wasserzeichen-MITTE in Prozent (-25 bis 125 — darf ueber den Rand hinaus). */
117
+ wzPos: number;
118
+ /** Vertikale Lage der Wasserzeichen-Mitte in Prozent (-25 bis 125). */
119
+ wzPosV: number;
120
+ /** Deckkraft des Wasserzeichens in Prozent — bewusst Stufen, kein Schieberegler. */
121
+ wzStaerke: KasseWzStaerke;
122
+ /** Groesse des Bild-Logos am BELEG (Ansicht, PDF, Kopfzeile). */
123
+ logoSkala: KasseLogoSkala;
124
+ /** Groesse des Wasserzeichens — getrennt vom Beleg-Logo. */
125
+ wzSkala: KasseWzSkala;
58
126
  zahlBar: boolean;
59
127
  zahlKarte: boolean;
60
128
  kartenanbieter: KasseKartenanbieter;
@@ -67,12 +135,20 @@ export interface KasseSettingsBetrieb {
67
135
  kassierenModus: KasseKassierenModus;
68
136
  /** Trinkgeld-Chips in Prozent (eine Nachkommastelle, max 5, eindeutig, Reihenfolge des Chefs). */
69
137
  tgChips: number[];
138
+ /** Rabatt-Chips in Prozent — dieselben Regeln wie tgChips, vom Chef einstellbar. */
139
+ rabattChips: number[];
70
140
  belegAusgabe: KasseBelegAusgabe;
71
- fertigSekunden: 0 | 3 | 5 | 10 | 15 | 30 | 60;
141
+ fertigSekunden: KasseFertigSekunden;
142
+ /** Glas-Optik: Kacheln und Korb leicht durchscheinend (Wasserzeichen schimmert). */
143
+ glas: boolean;
144
+ /** Hilfetexte in den Chef-Einstellungen anzeigen. */
145
+ hinweise: boolean;
72
146
  }
73
147
  /** Aktionen der Kasse, die eine Taste bekommen koennen. */
74
- export type KasseTastenAktion = 'kassieren' | 'abschliessen' | 'abbrechen' | 'frei' | 'bar' | 'karte' | 'passend' | 'belege' | 'letzteZurueck';
75
- export declare const KASSE_TASTEN_AKTIONEN: readonly KasseTastenAktion[];
148
+ export declare const KASSE_TASTEN_AKTIONEN: readonly ["kassieren", "abschliessen", "abbrechen", "frei", "bar", "karte", "passend", "belege", "letzteZurueck", "einstellungen", "abmelden", "trinkgeld", "vollbild", "gegebenLeeren", "korbLeeren"];
149
+ export type KasseTastenAktion = typeof KASSE_TASTEN_AKTIONEN[number];
150
+ /** Kurzer Name, damit alle Enum-Listen gleich heissen; der alte bleibt gueltig. */
151
+ export declare const TASTEN_AKTIONEN: readonly ["kassieren", "abschliessen", "abbrechen", "frei", "bar", "karte", "passend", "belege", "letzteZurueck", "einstellungen", "abmelden", "trinkgeld", "vollbild", "gegebenLeeren", "korbLeeren"];
76
152
  /** Tastenkarte: Aktion -> Tasten (`Mod+F`, `Enter`, `Escape`, `F5` ...; `Mod` = ⌘ auf dem Mac, Strg sonst). */
77
153
  export type KasseTastenkarte = Record<KasseTastenAktion, string[]>;
78
154
  export declare const KASSE_TASTEN_STANDARD: Readonly<KasseTastenkarte>;
@@ -89,10 +165,14 @@ export interface KasseSettingsGeraet {
89
165
  druckerIp: string;
90
166
  druckerPort: number;
91
167
  druckerBt: string;
168
+ /** Klartextname des gemerkten Druckers; sonst stuende dort eine nackte Bluetooth-Adresse. */
169
+ druckerName: string;
92
170
  /** Kennung des Netzwerk-Druckers (Server Direct Print) aus `listMyPrinters`; '' = keiner gewaehlt. */
93
171
  druckerId: string;
94
172
  /** ePOS Device-ID bei `druckerArt 'netz'` (Epson direkt per IP), Vorgabe `local_printer`. */
95
173
  druckerDevid: string;
174
+ /** Kennung des Druckers im lokalen Kasseneck-Connect-Agenten, bei `druckerArt 'connect'`. */
175
+ connectDruckerId: string;
96
176
  papier: KassePapier;
97
177
  zeichensatz: KasseZeichensatz;
98
178
  schnitt: KasseSchnitt;
@@ -100,6 +180,13 @@ export interface KasseSettingsGeraet {
100
180
  ladeAuto: KasseLadeAuto;
101
181
  terminalIp: string;
102
182
  terminalPort: number;
183
+ terminalVia: KasseTerminalVia;
184
+ /** Art des Terminals ('keins' = Kartenzahlung ohne Terminal-Anbindung gesperrt, sofern zahlKarte an). */
185
+ terminalArt: KasseTerminalArt;
186
+ /** Tastenmarken (die kleinen Kuerzel an den Knoepfen) anzeigen. */
187
+ tastenMarken: boolean;
188
+ /** Terminal-ID aus dem Hobex-Vertrag (ohne fuehrende Null); noetig fuer Diagnose und Zahlung. */
189
+ terminalTid: string;
103
190
  }
104
191
  export interface KasseSettings {
105
192
  betrieb: KasseSettingsBetrieb;
@@ -7,15 +7,91 @@
7
7
  * Backend; ein Test in beiden Repos haelt sie deckungsgleich. Trinkgeld ist
8
8
  * bewusst AUS, bis die Buchung geklaert ist (Spec kachel-kasse § 9).
9
9
  */
10
- export const KARTENANBIETER = ['keiner', 'extern', 'hobex', 'mypos', 'stripe'];
11
- export const KASSE_TASTEN_AKTIONEN = ['kassieren', 'abschliessen', 'abbrechen', 'frei', 'bar', 'karte', 'passend', 'belege', 'letzteZurueck'];
10
+ /*
11
+ * Jedes Enum steht als Liste zur Laufzeit da, der Typ leitet sich daraus ab
12
+ * (`typeof LISTE[number]`). So gibt es die Werte nur einmal, und die Zwillinge
13
+ * (Backend-Validator, Flutter-Paket) koennen gegen dieselben Listen pruefen,
14
+ * statt sie abzuschreiben.
15
+ */
16
+ export const STIL = ['klar', 'warm', 'nacht', 'kontrast'];
17
+ export const SCHRIFT = ['S', 'M', 'L', 'XL'];
18
+ export const WASSERZEICHEN = ['aus', 'anmeldung', 'ueberall'];
19
+ export const MENGE = ['aus', 'x', 'kg'];
20
+ export const TG_MODUS = ['betrag', 'gesamt', 'beides'];
21
+ export const KASSIEREN_MODUS = ['seite', 'panel'];
22
+ /** Kartenanbieter: Karte gibt es erst mit eingerichtetem Anbieter; 'extern' = eigenes Terminal ohne Anbindung. */
23
+ export const KARTENANBIETER = ['keiner', 'extern', 'gptom', 'hobex', 'mypos', 'stripe'];
24
+ export const BELEG_AUSGABE = ['qr', 'druck', 'mail', 'sms', 'fragen'];
25
+ export const LAYOUT = ['rechts', 'links', 'vollbild'];
26
+ export const KATPOS = ['oben', 'links'];
27
+ export const HOEHE = ['S', 'M', 'L'];
28
+ /**
29
+ * `sdp` = Netzwerk ueber Epson Server Direct Print (der Drucker holt Jobs vom Backend, jeder Browser druckt).
30
+ * `connect` = Kasseneck Connect (lokaler Agent auf dem Kassen-Rechner druckt fuer die Browser-Kasse).
31
+ */
32
+ export const DRUCKER_ART = ['sdp', 'netz', 'bt', 'usb', 'connect'];
33
+ /** Terminal-Ansprache: direkt per IP (wie bisher) oder ueber Kasseneck Connect (Agent leitet weiter). */
34
+ export const TERMINAL_VIA = ['direkt', 'connect'];
35
+ /** Art des Kartenterminals an dieser Kasse: keines oder Hobex HPS (JSON-REST am Geraet). */
36
+ export const TERMINAL_ART = ['keins', 'hps'];
37
+ export const PAPIER = ['mm58', 'mm80'];
38
+ export const ZEICHENSATZ = ['CP1252', 'CP437'];
39
+ export const SCHNITT = ['partial', 'full', 'none'];
40
+ export const LADE_AUTO = ['bar', 'immer', 'nie'];
41
+ /*
42
+ * Auch die uebrigen Wertemengen der Einstellungen stehen jetzt als Liste da —
43
+ * vorher waren sie nur als Union am Feld ausgeschrieben. Ein Zwilling konnte
44
+ * dadurch einen Wert (etwa `kachelstil: 'voll'`) gar nicht kennen, ohne dass es
45
+ * auffiel: der Vertrag fuehrte die Menge nicht, und die Standardwerte-Datei
46
+ * pinnt je Feld nur einen einzigen Wert.
47
+ */
48
+ /** Groesse des Kuerzel-Logos in der Kopfzeile der Kasse. */
49
+ export const LOGO_GROESSE = ['S', 'M', 'L'];
50
+ /** Schriftgroesse in den Chef-Einstellungen — getrennt von der Schrift der Kasse. */
51
+ export const SCHRIFT_EINST = ['S', 'M', 'L'];
52
+ /** Kachel-Optik: farbiger Streifen am Rand oder ganz gefuellte Kachel. */
53
+ export const KACHELSTIL = ['streifen', 'voll'];
54
+ /** Automatisches Abmelden nach Minuten Ruhe; 0 = nie. */
55
+ export const AUTO_AB_MIN = [0, 1, 5, 15, 30];
56
+ /** Rabatt am Beleg erlaubt. */
57
+ export const RABATT = ['aus', 'an'];
58
+ /** Seite des Wasserzeichens — ALT, abgeloest von wzPos. */
59
+ export const WZ_SEITE = ['links', 'mitte', 'rechts'];
60
+ /** Deckkraft des Wasserzeichens in Prozent — bewusst Stufen, kein Schieberegler. */
61
+ export const WZ_STAERKE = [3, 6, 10, 16];
62
+ /** Groesse des Bild-Logos am Beleg. */
63
+ export const LOGO_SKALA = ['S', 'M', 'L', 'XL'];
64
+ /** Groesse des Wasserzeichens — getrennt vom Beleg-Logo. */
65
+ export const WZ_SKALA = ['S', 'M', 'L', 'XL'];
66
+ /** Wie lange die Fertig-Seite stehen bleibt, in Sekunden; 0 = bis zum Tippen. */
67
+ export const FERTIG_SEKUNDEN = [0, 3, 5, 10, 15, 30, 60];
68
+ /** Aktionen der Kasse, die eine Taste bekommen koennen. */
69
+ export const KASSE_TASTEN_AKTIONEN = ['kassieren', 'abschliessen', 'abbrechen', 'frei', 'bar', 'karte', 'passend', 'belege', 'letzteZurueck', 'einstellungen', 'abmelden', 'trinkgeld', 'vollbild', 'gegebenLeeren', 'korbLeeren'];
70
+ /** Kurzer Name, damit alle Enum-Listen gleich heissen; der alte bleibt gueltig. */
71
+ export const TASTEN_AKTIONEN = KASSE_TASTEN_AKTIONEN;
12
72
  export const KASSE_TASTEN_STANDARD = Object.freeze({
13
73
  kassieren: ['Enter'], abschliessen: ['Enter'], abbrechen: ['Escape'],
14
- frei: ['Mod+F'], bar: ['Mod+B'], karte: ['Mod+K'], passend: ['Mod+P'],
15
- belege: ['Mod+E'], letzteZurueck: ['Mod+Backspace'],
74
+ // Mod+F gehoert dem Vollbild; Betrag frei liegt auf D. Bar bleibt auf B,
75
+ // Belege auf E (Entscheidung vom 21.8., der Tausch von 0.6.25 ist zurueck).
76
+ frei: ['Mod+D'], bar: ['Mod+B'], karte: ['Mod+K'], passend: ['Mod+P'],
77
+ // NICHT Mod+E: das faengt Chrome auf dem Mac selbst ab („Auswahl fuer
78
+ // Suche verwenden") — am Geraet belegt. J wie Journal laesst er durch.
79
+ belege: ['Mod+J'], letzteZurueck: ['Mod+Backspace'],
80
+ // NICHT Mod+T: die Taste ist im Browser reserviert (neuer Tab) und kommt
81
+ // nie bei der Seite an. Mod+G laesst Chrome durch.
82
+ einstellungen: ['Mod+S'], abmelden: ['Mod+L'], trinkgeld: ['Mod+G'],
83
+ vollbild: ['Mod+F'],
84
+ // Mod+C = Kopieren des Browsers — im Kassieren-Schritt ist Kopieren fern,
85
+ // und die Bindung gilt nur dort (Bar + Rueckgeld-Rechner an).
86
+ gegebenLeeren: ['Mod+C'],
87
+ // Bewusst DIESELBE Taste wie gegebenLeeren: die beiden leben in
88
+ // verschiedenen Momenten (Korb vor dem Kassieren, Gegeben-Feld darin) —
89
+ // der Verteiler laesst die nicht zustaendige Aktion durchfallen.
90
+ korbLeeren: ['Mod+C'],
16
91
  });
17
92
  export const KASSE_BETRIEB_STANDARD = Object.freeze({
18
- logoText: 'K', logoAn: true, logoGroesse: 'M', wasserzeichen: 'anmeldung', farbe: '#1B46F5',
93
+ // Petrol aus der Markenpalette ("Ecke, Aktion") nicht das alte Blau.
94
+ logoText: 'K', logoAn: true, logoGroesse: 'M', wasserzeichen: 'anmeldung', farbe: '#116B6B',
19
95
  stil: 'klar', schrift: 'M', schriftEinst: 'S', kachelstil: 'streifen', uhr: true,
20
96
  sperrbild: true, foto: true, autoAbMin: 0, abNachVerkauf: false, schnellLogin: true,
21
97
  preisAnzeigen: true, ustAnzeigen: false, emoji: true, katFarben: true, freiErlaubt: true,
@@ -24,15 +100,21 @@ export const KASSE_BETRIEB_STANDARD = Object.freeze({
24
100
  zahlBar: true, zahlKarte: false, kartenanbieter: 'keiner', trinkgeld: false, tgModus: 'beides',
25
101
  tgStufen: { 5: true, 10: true, 15: false, 20: false }, tgChips: [5, 10], tgSplit: true, rueckgeld: true,
26
102
  schnellbar: false, kassierenModus: 'seite',
27
- belegAusgabe: 'qr', fertigSekunden: 0,
103
+ // 'fragen' = Fertig-Seite bietet QR und Bon an — sicherster Standard.
104
+ logoBild: '', wzSeite: 'mitte', wzPos: 50, wzPosV: 50, wzStaerke: 6, logoSkala: 'M', wzSkala: 'M',
105
+ glas: true, hinweise: true,
106
+ rabattChips: [5, 10, 15, 20],
107
+ belegAusgabe: 'fragen', fertigSekunden: 0,
28
108
  });
29
109
  export const KASSE_GERAET_STANDARD = Object.freeze({
30
110
  layout: 'rechts', katpos: 'oben', spaltenExtra: 0, hoehe: 'M', touch: false,
31
111
  tasten: { ...KASSE_TASTEN_STANDARD },
32
- druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerId: '', druckerDevid: 'local_printer',
112
+ druckerAn: false, druckerArt: 'sdp', druckerIp: '', druckerPort: 9100, druckerBt: '', druckerName: '', druckerId: '', druckerDevid: 'local_printer',
113
+ connectDruckerId: '',
33
114
  papier: 'mm80', zeichensatz: 'CP1252', schnitt: 'partial',
34
115
  ladeAn: false, ladeAuto: 'bar',
35
- terminalIp: '', terminalPort: 20008,
116
+ terminalIp: '', terminalPort: 8080, terminalVia: 'direkt',
117
+ terminalArt: 'keins', terminalTid: '', tastenMarken: true,
36
118
  });
37
119
  /**
38
120
  * Standard + gespeichert. Landkarten (`saetze`, `tgStufen`) werden je Schluessel
@@ -1,4 +1,4 @@
1
- export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, } from './receipt-item.js';
1
+ export { type ReceiptItem, type ReceiptItemPayload, type ReceiptItemPayloadRead, toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, type TipRecipient, isTipItem, isDiscountItem, } from './receipt-item.js';
2
2
  export { type Voucher, type VoucherPayload, toVoucherPayload, fromVoucherPayload, voucherIsValid } from './voucher.js';
3
3
  export { type Receipt, type ReceiptPayload, type ReceiptPayloadRead, toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, } from './receipt.js';
4
4
  export { type CancellationOf, type CancellationItem, type Cancellation, type CancellationReason, CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, } from './cancellation.js';
@@ -1,4 +1,4 @@
1
- export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, } from './receipt-item.js';
1
+ export { toReceiptItemPayload, fromReceiptItemPayload, receiptItemTotalCents, receiptItemIsValid, negateReceiptItem, isTipItem, isDiscountItem, } from './receipt-item.js';
2
2
  export { toVoucherPayload, fromVoucherPayload, voucherIsValid } from './voucher.js';
3
3
  export { toReceiptPayload, fromReceiptPayload, receiptSubSumCents, receiptSumCents, } from './receipt.js';
4
4
  export { CANCELLATION_REASONS, CANCELLATION_RESERVATION_MS, isCancellationReason, remainingQuantities, } from './cancellation.js';