@kreiseck/kasseneck-api 1.5.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +119 -3
  3. package/dist/cjs/client/aufrufe.d.ts +3 -3
  4. package/dist/cjs/client/aufrufe.js +17 -0
  5. package/dist/cjs/index.d.ts +1 -1
  6. package/dist/cjs/inventory/api.d.ts +10 -2
  7. package/dist/cjs/inventory/api.js +8 -1
  8. package/dist/cjs/inventory/endpunkte.d.ts +2 -1
  9. package/dist/cjs/inventory/endpunkte.js +2 -1
  10. package/dist/cjs/inventory/index.d.ts +5 -3
  11. package/dist/cjs/inventory/index.js +15 -3
  12. package/dist/cjs/inventory/lesen.d.ts +7 -1
  13. package/dist/cjs/inventory/lesen.js +75 -0
  14. package/dist/cjs/inventory/schreiben.d.ts +23 -1
  15. package/dist/cjs/inventory/schreiben.js +18 -9
  16. package/dist/cjs/inventory/typen.d.ts +156 -2
  17. package/dist/cjs/inventory/varianten.d.ts +67 -0
  18. package/dist/cjs/inventory/varianten.js +150 -0
  19. package/dist/cjs/inventory/vertrag.d.ts +40 -5
  20. package/dist/cjs/inventory/vertrag.js +51 -3
  21. package/dist/cjs/inventory/webhook.d.ts +5 -2
  22. package/dist/cjs/inventory/webhook.js +8 -2
  23. package/dist/cjs/models/cashregister.d.ts +21 -0
  24. package/dist/cjs/models/cashregister.js +20 -0
  25. package/dist/cjs/models/index.d.ts +1 -1
  26. package/dist/cjs/stored/vokabular.d.ts +1 -1
  27. package/dist/cjs/stored/vokabular.js +1 -1
  28. package/dist/cjs/version.d.ts +1 -1
  29. package/dist/cjs/version.js +1 -1
  30. package/dist/esm/client/aufrufe.d.ts +3 -3
  31. package/dist/esm/client/aufrufe.js +17 -0
  32. package/dist/esm/index.d.ts +1 -1
  33. package/dist/esm/inventory/api.d.ts +10 -2
  34. package/dist/esm/inventory/api.js +8 -1
  35. package/dist/esm/inventory/endpunkte.d.ts +2 -1
  36. package/dist/esm/inventory/endpunkte.js +2 -1
  37. package/dist/esm/inventory/index.d.ts +5 -3
  38. package/dist/esm/inventory/index.js +4 -2
  39. package/dist/esm/inventory/lesen.d.ts +7 -1
  40. package/dist/esm/inventory/lesen.js +74 -0
  41. package/dist/esm/inventory/schreiben.d.ts +23 -1
  42. package/dist/esm/inventory/schreiben.js +13 -10
  43. package/dist/esm/inventory/typen.d.ts +156 -2
  44. package/dist/esm/inventory/varianten.d.ts +67 -0
  45. package/dist/esm/inventory/varianten.js +142 -0
  46. package/dist/esm/inventory/vertrag.d.ts +40 -5
  47. package/dist/esm/inventory/vertrag.js +50 -2
  48. package/dist/esm/inventory/webhook.d.ts +5 -2
  49. package/dist/esm/inventory/webhook.js +9 -3
  50. package/dist/esm/models/cashregister.d.ts +21 -0
  51. package/dist/esm/models/cashregister.js +20 -0
  52. package/dist/esm/models/index.d.ts +1 -1
  53. package/dist/esm/stored/vokabular.d.ts +1 -1
  54. package/dist/esm/stored/vokabular.js +1 -1
  55. package/dist/esm/version.d.ts +1 -1
  56. package/dist/esm/version.js +1 -1
  57. package/fixtures/hobex-hps-codes.json +1 -1
  58. package/fixtures/invoice-api.schema.json +1 -1
  59. package/fixtures/invoice-texts.json +1 -1
  60. package/fixtures/pos-texts.json +1 -1
  61. package/fixtures/surface.json +31 -6
  62. package/fixtures/v3/antworten/belege.json +1 -1
  63. package/fixtures/v3/antworten/belegmail.json +1 -1
  64. package/fixtures/v3/antworten/kasse-belege.json +1 -1
  65. package/fixtures/v3/antworten/kasse.json +2 -2
  66. package/fixtures/v3/antworten/lager.json +2396 -4
  67. package/fixtures/v3/antworten/rechnungen.json +1 -1
  68. package/fixtures/v3/antworten/storno.json +1 -1
  69. package/fixtures/v3/stored/belege.json +1 -1
  70. package/fixtures/v3/stored/kasse.json +2 -2
  71. package/fixtures/v3/stored/rechnungen.json +1 -1
  72. package/fixtures/v3/v3-vokabular.json +151 -6
  73. package/fixtures/v3/zahlbetrag-faelle.json +1 -1
  74. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Der Vertrag der Lager-API (Backend Stufe 5a lesen, 5b schreiben und
3
- * reservieren) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
3
+ * reservieren, 5c Varianten) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
4
4
  * Hinweiscodes, englisch wie am Draht `/v3`.
5
5
  *
6
6
  * Quelle ist der Vertrags-Export des Backends (`fixtures/v3/v3-vokabular.json`):
@@ -11,8 +11,8 @@
11
11
  * und `warningCodes.inventory`. `test/inventory.test.ts` haelt jede Liste
12
12
  * deckungsgleich mit dieser Datei; nichts hier wird geraten.
13
13
  */
14
- /** Die 27 Endpunkte (14 aus 5a, 13 aus 5b), in der Reihenfolge von `endpoints.public`. */
15
- export declare const INVENTORY_ENDPOINTS: readonly ["getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations"];
14
+ /** Die 32 Endpunkte (14 aus 5a, 13 aus 5b, 5 aus 5c), in der Reihenfolge von `endpoints.public`. */
15
+ export declare const INVENTORY_ENDPOINTS: readonly ["getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations", "createVariantGroup", "updateVariantGroup", "getVariantGroup", "listVariantGroups", "addVariant"];
16
16
  export type InventoryEndpoint = (typeof INVENTORY_ENDPOINTS)[number];
17
17
  /** Art eines Standorts (Katalog `STANDORT_TYP`). */
18
18
  export declare const LOCATION_TYPES: readonly ["warehouse", "store", "vehicle", "other"];
@@ -52,8 +52,12 @@ export type WebhookDeliveryStatus = (typeof WEBHOOK_DELIVERY_STATUSES)[number];
52
52
  * wie `getReservation`, mit dem Status danach: `reservation.released` und
53
53
  * `reservation.redeemed` kommen bei jeder wirksamen Freigabe bzw. Einloesung,
54
54
  * auch einer teilweisen (dann bleibt der Status `active`).
55
+ * `variant_group.created` und `variant_group.updated` (seit 1.6.0) tragen die
56
+ * Variantengruppe wie `getVariantGroup`; `updated` kommt nur bei einer aussen
57
+ * sichtbaren Aenderung (neuer Wert, neue oder stillgelegte Variante, Name,
58
+ * Vorgaben, Stilllegen der Gruppe).
55
59
  */
56
- export declare const INVENTORY_WEBHOOK_EVENTS: readonly ["stock.changed", "stock.below_minimum", "article.created", "article.updated", "article.deactivated", "reservation.expired", "reservation.released", "reservation.redeemed"];
60
+ export declare const INVENTORY_WEBHOOK_EVENTS: readonly ["stock.changed", "stock.below_minimum", "article.created", "article.updated", "article.deactivated", "reservation.expired", "reservation.released", "reservation.redeemed", "variant_group.created", "variant_group.updated"];
57
61
  export type InventoryWebhookEventType = (typeof INVENTORY_WEBHOOK_EVENTS)[number];
58
62
  /**
59
63
  * Die Felder der Huelle jeder Zustellung, in der Reihenfolge am Draht. Statt
@@ -81,8 +85,21 @@ export declare const INVENTORY_LIST_LIMIT_MAX = 200;
81
85
  * [inventoryShortfalls]), `code_taken` und `external_id_taken` (mit `field` und
82
86
  * `articleId` des Artikels, dem der Code gehoert), `stock_kind_locked`,
83
87
  * `reservation_not_found`, `reservation_not_active` …
88
+ *
89
+ * Seit 1.6.0 dahinter die Codes der Variantengruppen: `variant_group_not_found`
90
+ * (unbekannte Kennung), `variant_already_exists` (die Kombination gibt es in der
91
+ * Gruppe schon, dann mit `articleId` der bestehenden Variante, oder sie steht
92
+ * zweimal in `variants[]`; jeweils mit `field`),
93
+ * `invalid_variant_attributes` (ein Merkmal fehlt, ist unbekannt oder sein Wert
94
+ * steht nicht in der Werteliste; `field` und `errors[]`),
95
+ * `variant_group_inactive` (stillgelegte Gruppe: kein `addVariant`, keine
96
+ * Aenderung ausser erneutem Stilllegen) und `variant_limit` (mehr als
97
+ * [VARIANT_GROUP_ACTIVE_MAX] aktive Varianten je Gruppe). Wiederverwendet:
98
+ * `too_many_positions` traegt bei Varianten `field` (`variants`,
99
+ * `createMatrix` bzw. `externalIds` bei `addVariant`): die Anfrage braeuchte
100
+ * mehr Schreibvorgaenge, als in einen Vorgang passen; geschrieben wurde nichts.
84
101
  */
85
- export declare const INVENTORY_ERROR_CODES: readonly ["validation", "invalid_cursor", "article_not_found", "webhook_not_found", "webhook_limit", "invalid_webhook_url", "event_not_subscribed", "webhook_inactive", "inventory_api_not_enabled", "module_inactive", "rate_limited", "server_error", "idempotency_key_required", "idempotency_conflict", "location_not_found", "location_inactive", "invalid_location", "invalid_locations", "invalid_transfer", "operation_not_found", "already_reversed", "reversal_not_possible", "reversal_not_supported", "exceeds_stock", "no_positions", "too_many_positions", "invalid_step", "invalid_quantity", "invalid_amount", "invalid_price", "negative_value", "invalid_reason", "note_required", "withdrawal_type_required", "invalid_method", "invalid_stock_kind", "invalid_minimum", "invalid_dimensions", "weight_missing", "invalid_landed_cost", "invalid_distribution", "landed_costs_mismatch", "return_totals_mismatch", "lot_not_found", "invalid_serial", "serial_required", "serial_not_allowed", "serial_already_exists", "serial_not_in_stock", "code_taken", "external_id_taken", "group_not_found", "revenue_group_not_found", "stock_kind_locked", "article_inactive", "invalid_position", "invalid_condition", "reason_required", "insufficient_available", "reservation_not_found", "reservation_not_active"];
102
+ export declare const INVENTORY_ERROR_CODES: readonly ["validation", "invalid_cursor", "article_not_found", "webhook_not_found", "webhook_limit", "invalid_webhook_url", "event_not_subscribed", "webhook_inactive", "inventory_api_not_enabled", "module_inactive", "rate_limited", "server_error", "idempotency_key_required", "idempotency_conflict", "location_not_found", "location_inactive", "invalid_location", "invalid_locations", "invalid_transfer", "operation_not_found", "already_reversed", "reversal_not_possible", "reversal_not_supported", "exceeds_stock", "no_positions", "too_many_positions", "invalid_step", "invalid_quantity", "invalid_amount", "invalid_price", "negative_value", "invalid_reason", "note_required", "withdrawal_type_required", "invalid_method", "invalid_stock_kind", "invalid_minimum", "invalid_dimensions", "weight_missing", "invalid_landed_cost", "invalid_distribution", "landed_costs_mismatch", "return_totals_mismatch", "lot_not_found", "invalid_serial", "serial_required", "serial_not_allowed", "serial_already_exists", "serial_not_in_stock", "code_taken", "external_id_taken", "group_not_found", "revenue_group_not_found", "stock_kind_locked", "article_inactive", "invalid_position", "invalid_condition", "reason_required", "insufficient_available", "reservation_not_found", "reservation_not_active", "variant_group_not_found", "variant_already_exists", "invalid_variant_attributes", "variant_group_inactive", "variant_limit"];
86
103
  export type InventoryErrorCode = (typeof INVENTORY_ERROR_CODES)[number];
87
104
  /**
88
105
  * Codes, die Anmeldung und Rand auf jedem Lager-Aufruf erzeugen koennen,
@@ -134,3 +151,21 @@ export declare const INVENTORY_IDEMPOTENCY_KEY_MAX = 120;
134
151
  /** Kuerzeste und laengste Haltedauer einer Reservierung in Minuten (`expiresInMinutes`, 30 Tage). */
135
152
  export declare const RESERVATION_MINUTES_MIN = 5;
136
153
  export declare const RESERVATION_MINUTES_MAX = 43200;
154
+ /**
155
+ * Grenzen einer Variantengruppe, wie das Backend sie prueft. Das Paket prueft
156
+ * sie **nicht** vor dem Senden: der Server darf sie anheben, ohne dass eine
157
+ * aeltere Paketversion dann faelschlich abweist. Wer darueber liegt, bekommt
158
+ * `validation` (Merkmale, Werte, Matrix, `variants[]`) bzw. `variant_limit`.
159
+ *
160
+ * - [VARIANT_ATTRIBUTES_MAX] Merkmale je Gruppe (Schluessel `^[a-z0-9_]{1,32}$`,
161
+ * eindeutig; `__…__` ist reserviert),
162
+ * - [VARIANT_VALUES_MAX] Werte je Merkmal (je 1–30 Zeichen, eindeutig ohne
163
+ * Gross/Klein),
164
+ * - [VARIANT_MATRIX_MAX] Kombinationen bei `createMatrix: true` und hoechstens
165
+ * so viele Eintraege in `variants[]` je Anfrage,
166
+ * - [VARIANT_GROUP_ACTIVE_MAX] aktive Varianten je Gruppe.
167
+ */
168
+ export declare const VARIANT_ATTRIBUTES_MAX = 3;
169
+ export declare const VARIANT_VALUES_MAX = 30;
170
+ export declare const VARIANT_MATRIX_MAX = 100;
171
+ export declare const VARIANT_GROUP_ACTIVE_MAX = 250;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Der Vertrag der Lager-API (Backend Stufe 5a lesen, 5b schreiben und
3
- * reservieren) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
3
+ * reservieren, 5c Varianten) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
4
4
  * Hinweiscodes, englisch wie am Draht `/v3`.
5
5
  *
6
6
  * Quelle ist der Vertrags-Export des Backends (`fixtures/v3/v3-vokabular.json`):
@@ -11,7 +11,7 @@
11
11
  * und `warningCodes.inventory`. `test/inventory.test.ts` haelt jede Liste
12
12
  * deckungsgleich mit dieser Datei; nichts hier wird geraten.
13
13
  */
14
- /** Die 27 Endpunkte (14 aus 5a, 13 aus 5b), in der Reihenfolge von `endpoints.public`. */
14
+ /** Die 32 Endpunkte (14 aus 5a, 13 aus 5b, 5 aus 5c), in der Reihenfolge von `endpoints.public`. */
15
15
  export const INVENTORY_ENDPOINTS = [
16
16
  'getArticle',
17
17
  'listArticles',
@@ -40,6 +40,11 @@ export const INVENTORY_ENDPOINTS = [
40
40
  'releaseReservation',
41
41
  'getReservation',
42
42
  'listReservations',
43
+ 'createVariantGroup',
44
+ 'updateVariantGroup',
45
+ 'getVariantGroup',
46
+ 'listVariantGroups',
47
+ 'addVariant',
43
48
  ];
44
49
  /** Art eines Standorts (Katalog `STANDORT_TYP`). */
45
50
  export const LOCATION_TYPES = ['warehouse', 'store', 'vehicle', 'other'];
@@ -113,6 +118,10 @@ export const WEBHOOK_DELIVERY_STATUSES = ['delivered', 'pending', 'failed', 'dro
113
118
  * wie `getReservation`, mit dem Status danach: `reservation.released` und
114
119
  * `reservation.redeemed` kommen bei jeder wirksamen Freigabe bzw. Einloesung,
115
120
  * auch einer teilweisen (dann bleibt der Status `active`).
121
+ * `variant_group.created` und `variant_group.updated` (seit 1.6.0) tragen die
122
+ * Variantengruppe wie `getVariantGroup`; `updated` kommt nur bei einer aussen
123
+ * sichtbaren Aenderung (neuer Wert, neue oder stillgelegte Variante, Name,
124
+ * Vorgaben, Stilllegen der Gruppe).
116
125
  */
117
126
  export const INVENTORY_WEBHOOK_EVENTS = [
118
127
  'stock.changed',
@@ -123,6 +132,8 @@ export const INVENTORY_WEBHOOK_EVENTS = [
123
132
  'reservation.expired',
124
133
  'reservation.released',
125
134
  'reservation.redeemed',
135
+ 'variant_group.created',
136
+ 'variant_group.updated',
126
137
  ];
127
138
  /**
128
139
  * Die Felder der Huelle jeder Zustellung, in der Reihenfolge am Draht. Statt
@@ -150,6 +161,19 @@ export const INVENTORY_LIST_LIMIT_MAX = 200;
150
161
  * [inventoryShortfalls]), `code_taken` und `external_id_taken` (mit `field` und
151
162
  * `articleId` des Artikels, dem der Code gehoert), `stock_kind_locked`,
152
163
  * `reservation_not_found`, `reservation_not_active` …
164
+ *
165
+ * Seit 1.6.0 dahinter die Codes der Variantengruppen: `variant_group_not_found`
166
+ * (unbekannte Kennung), `variant_already_exists` (die Kombination gibt es in der
167
+ * Gruppe schon, dann mit `articleId` der bestehenden Variante, oder sie steht
168
+ * zweimal in `variants[]`; jeweils mit `field`),
169
+ * `invalid_variant_attributes` (ein Merkmal fehlt, ist unbekannt oder sein Wert
170
+ * steht nicht in der Werteliste; `field` und `errors[]`),
171
+ * `variant_group_inactive` (stillgelegte Gruppe: kein `addVariant`, keine
172
+ * Aenderung ausser erneutem Stilllegen) und `variant_limit` (mehr als
173
+ * [VARIANT_GROUP_ACTIVE_MAX] aktive Varianten je Gruppe). Wiederverwendet:
174
+ * `too_many_positions` traegt bei Varianten `field` (`variants`,
175
+ * `createMatrix` bzw. `externalIds` bei `addVariant`): die Anfrage braeuchte
176
+ * mehr Schreibvorgaenge, als in einen Vorgang passen; geschrieben wurde nichts.
153
177
  */
154
178
  export const INVENTORY_ERROR_CODES = [
155
179
  'validation',
@@ -213,6 +237,11 @@ export const INVENTORY_ERROR_CODES = [
213
237
  'insufficient_available',
214
238
  'reservation_not_found',
215
239
  'reservation_not_active',
240
+ 'variant_group_not_found',
241
+ 'variant_already_exists',
242
+ 'invalid_variant_attributes',
243
+ 'variant_group_inactive',
244
+ 'variant_limit',
216
245
  ];
217
246
  /**
218
247
  * Codes, die Anmeldung und Rand auf jedem Lager-Aufruf erzeugen koennen,
@@ -286,3 +315,22 @@ export const INVENTORY_IDEMPOTENCY_KEY_MAX = 120;
286
315
  /** Kuerzeste und laengste Haltedauer einer Reservierung in Minuten (`expiresInMinutes`, 30 Tage). */
287
316
  export const RESERVATION_MINUTES_MIN = 5;
288
317
  export const RESERVATION_MINUTES_MAX = 43_200;
318
+ // ---- Varianten (Backend Stufe 5c, seit 1.6.0) -----------------------------------
319
+ /**
320
+ * Grenzen einer Variantengruppe, wie das Backend sie prueft. Das Paket prueft
321
+ * sie **nicht** vor dem Senden: der Server darf sie anheben, ohne dass eine
322
+ * aeltere Paketversion dann faelschlich abweist. Wer darueber liegt, bekommt
323
+ * `validation` (Merkmale, Werte, Matrix, `variants[]`) bzw. `variant_limit`.
324
+ *
325
+ * - [VARIANT_ATTRIBUTES_MAX] Merkmale je Gruppe (Schluessel `^[a-z0-9_]{1,32}$`,
326
+ * eindeutig; `__…__` ist reserviert),
327
+ * - [VARIANT_VALUES_MAX] Werte je Merkmal (je 1–30 Zeichen, eindeutig ohne
328
+ * Gross/Klein),
329
+ * - [VARIANT_MATRIX_MAX] Kombinationen bei `createMatrix: true` und hoechstens
330
+ * so viele Eintraege in `variants[]` je Anfrage,
331
+ * - [VARIANT_GROUP_ACTIVE_MAX] aktive Varianten je Gruppe.
332
+ */
333
+ export const VARIANT_ATTRIBUTES_MAX = 3;
334
+ export const VARIANT_VALUES_MAX = 30;
335
+ export const VARIANT_MATRIX_MAX = 100;
336
+ export const VARIANT_GROUP_ACTIVE_MAX = 250;
@@ -39,10 +39,13 @@ export declare function verifyInventoryWebhookSignature(secret: string | readonl
39
39
  * Liest eine Zustellung als typisiertes Ereignis. Vorher die Signatur pruefen
40
40
  * ([verifyInventoryWebhookSignature]).
41
41
  *
42
- * - Ein Ereignis, das diese Paketversion nicht kennt (etwa `variant_group.*`
43
- * einer spaeteren Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
42
+ * - Ein Ereignis, das diese Paketversion nicht kennt (eines einer spaeteren
43
+ * Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
44
44
  * - `reservation.expired|released|redeemed` tragen die Reservierung wie
45
45
  * `getReservation`, mit dem Status nach dem Vorgang (seit 1.5.0).
46
+ * - `variant_group.created|updated` tragen die Gruppe wie `getVariantGroup`
47
+ * (seit 1.6.0). Zwei Zustellungen koennen sich ueberholen: den Stand nur
48
+ * uebernehmen, wenn `data.updatedAt` neuer ist als der gespeicherte.
46
49
  * - Ein Rumpf, der keine Huelle ist, oder eine Bruchzahl in einer Menge wirft
47
50
  * `KasseneckValidationError` (`scope: 'response'`).
48
51
  *
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { KasseneckValidationError } from '../client/errors.js';
17
17
  import { verifyWebhookSignature as pruefeSignatur } from '../partner/webhook-signatur.js';
18
- import { artikel, bestandGeaendert, objekt, reservierung, unterMindestbestand } from './lesen.js';
18
+ import { artikel, bestandGeaendert, objekt, reservierung, unterMindestbestand, variantengruppe } from './lesen.js';
19
19
  import { INVENTORY_WEBHOOK_EVENTS } from './vertrag.js';
20
20
  export { WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, } from '../partner/webhook-signatur.js';
21
21
  /**
@@ -56,10 +56,13 @@ function kaputt(grund) {
56
56
  * Liest eine Zustellung als typisiertes Ereignis. Vorher die Signatur pruefen
57
57
  * ([verifyInventoryWebhookSignature]).
58
58
  *
59
- * - Ein Ereignis, das diese Paketversion nicht kennt (etwa `variant_group.*`
60
- * einer spaeteren Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
59
+ * - Ein Ereignis, das diese Paketversion nicht kennt (eines einer spaeteren
60
+ * Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
61
61
  * - `reservation.expired|released|redeemed` tragen die Reservierung wie
62
62
  * `getReservation`, mit dem Status nach dem Vorgang (seit 1.5.0).
63
+ * - `variant_group.created|updated` tragen die Gruppe wie `getVariantGroup`
64
+ * (seit 1.6.0). Zwei Zustellungen koennen sich ueberholen: den Stand nur
65
+ * uebernehmen, wenn `data.updatedAt` neuer ist als der gespeicherte.
63
66
  * - Ein Rumpf, der keine Huelle ist, oder eine Bruchzahl in einer Menge wirft
64
67
  * `KasseneckValidationError` (`scope: 'response'`).
65
68
  *
@@ -101,6 +104,9 @@ export function parseInventoryWebhookEvent(rawBody) {
101
104
  case 'reservation.released':
102
105
  case 'reservation.redeemed':
103
106
  return { ...huelle, type: huelle.type, data: reservierung(ort, data) };
107
+ case 'variant_group.created':
108
+ case 'variant_group.updated':
109
+ return { ...huelle, type: huelle.type, data: variantengruppe(ort, data) };
104
110
  default:
105
111
  return { ...huelle, type: huelle.type, data: artikel(ort, data) };
106
112
  }
@@ -38,8 +38,23 @@ export interface Cashregister {
38
38
  signatureId?: string;
39
39
  /** Lager-Standort der Kasse (Lager-Kern Stufe 2); fehlt = Standard-Standort des Betriebs. */
40
40
  stockLocationId?: string;
41
+ /**
42
+ * Eigene Abmelde-Werte dieser Kasse; fehlt, wenn die Kasse keine eigenen hat
43
+ * (dann gelten die Werte des Betriebs).
44
+ */
45
+ autoLogout?: CashregisterAutoLogout;
41
46
  onboarding: CashregisterOnboarding;
42
47
  }
48
+ /**
49
+ * Automatisches Abmelden an der Kasse. Beide Felder sind einzeln optional: der
50
+ * Server sendet nur, was die Kasse selbst gesetzt hat.
51
+ */
52
+ export interface CashregisterAutoLogout {
53
+ /** Abmeldung nach Leerlauf in Minuten; `0` = aus. */
54
+ autoLogoutMinutes?: 0 | 1 | 5 | 15 | 30;
55
+ /** Nach jedem Verkauf abmelden. */
56
+ logoutAfterSale?: boolean;
57
+ }
43
58
  /**
44
59
  * Stand der Inbetriebnahme (RKSV): Kasse bei FinanzOnline registriert,
45
60
  * Startbeleg erzeugt, Startbeleg uebermittelt. Die drei Kennzeichen entscheiden
@@ -61,9 +76,15 @@ export interface CashregisterPayload {
61
76
  create_time?: string | null;
62
77
  signature_id?: string | null;
63
78
  stockLocationId?: string | null;
79
+ autoLogout?: CashregisterAutoLogoutPayload | null;
64
80
  token?: string | null;
65
81
  onboarding?: CashregisterOnboardingPayload | null;
66
82
  }
83
+ /** `autoLogout` am Draht `/v3`; die Namen sind dieselben wie am Modell. */
84
+ export interface CashregisterAutoLogoutPayload {
85
+ autoLogoutMinutes?: number | null;
86
+ logoutAfterSale?: boolean | null;
87
+ }
67
88
  /**
68
89
  * `onboarding` am Draht `/v3` (fixtures/v3/antworten/kasse.json): der
69
90
  * Startbeleg heisst dort `start_receipt_*`. Die inneren Namen
@@ -14,6 +14,7 @@ export function fromCashregisterPayload(payload, id) {
14
14
  ...(payload.token ? { token: payload.token } : {}),
15
15
  ...(payload.signature_id ? { signatureId: payload.signature_id } : {}),
16
16
  ...(payload.stockLocationId ? { stockLocationId: payload.stockLocationId } : {}),
17
+ ...autoLogoutFeld(payload.autoLogout),
17
18
  onboarding: {
18
19
  cashboxRegistered: ob.cashbox_registered === true,
19
20
  startReceiptCreated: ob.start_receipt_created === true,
@@ -24,6 +25,25 @@ export function fromCashregisterPayload(payload, id) {
24
25
  },
25
26
  };
26
27
  }
28
+ const AUTO_LOGOUT_MINUTEN = new Set([0, 1, 5, 15, 30]);
29
+ /**
30
+ * `autoLogout` gibt es nur, wenn die Nutzlast mindestens einen lesbaren Wert
31
+ * traegt. Eine Minutenzahl ausserhalb von 0/1/5/15/30 wird verworfen statt
32
+ * durchgereicht (ein neuer Server-Wert soll die Kasse nicht unlesbar machen).
33
+ */
34
+ function autoLogoutFeld(roh) {
35
+ if (roh === null || roh === undefined || typeof roh !== 'object') {
36
+ return {};
37
+ }
38
+ const wert = {};
39
+ if (typeof roh.autoLogoutMinutes === 'number' && AUTO_LOGOUT_MINUTEN.has(roh.autoLogoutMinutes)) {
40
+ wert.autoLogoutMinutes = roh.autoLogoutMinutes;
41
+ }
42
+ if (typeof roh.logoutAfterSale === 'boolean') {
43
+ wert.logoutAfterSale = roh.logoutAfterSale;
44
+ }
45
+ return Object.keys(wert).length === 0 ? {} : { autoLogout: wert };
46
+ }
27
47
  /**
28
48
  * Ein Zeitfeld, das es nur gibt, wenn die Nutzlast einen lesbaren Zeitstempel
29
49
  * traegt. `null` (der Normalfall aus `isoTs`) und unlesbarer Unsinn ergeben
@@ -7,7 +7,7 @@ export { type PaymentErrorCode, PAYMENT_ERROR_CODES, isPaymentErrorCode, payment
7
7
  export { type ReceiptEmailErrorCode, type ReceiptEmailVia, RECEIPT_EMAIL_ERROR_CODES, RECEIPT_EMAIL_SEND_ERROR_CODES, type ReceiptEmailSendErrorCode, RECEIPT_EMAIL_VIAS, isReceiptEmailErrorCode, receiptEmailErrorCode, isReceiptEmailError, receiptEmailFieldErrors, type ReceiptEmailFieldError, } from './receipt-email.js';
8
8
  export { type ReceiptErrorCode, type ReceiptFieldError, RECEIPT_ERROR_CODES, isReceiptErrorCode, receiptErrorCode, isReceiptError, receiptFieldErrors, } from './receipt-errors.js';
9
9
  export { type ReceiptCompany, type ReceiptCompanyPayload, fromReceiptCompanyPayload, receiptCompanyTaxInfo, } from './receipt-company.js';
10
- export { type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, fromCashregisterPayload, } from './cashregister.js';
10
+ export { type Cashregister, type CashregisterOnboarding, type CashregisterPayload, type CashregisterOnboardingPayload, type CashregisterAutoLogout, type CashregisterAutoLogoutPayload, fromCashregisterPayload, } from './cashregister.js';
11
11
  export { type ReceiptSummary, type ReceiptSummaryPayload, fromReceiptSummaryPayload, type ZeroKind, ZERO_KINDS, isZeroKind } from './receipt-summary.js';
12
12
  export { type ReportMonth, reportMonthFromDate, previousReportMonth, nextReportMonth, reportMonthKey, reportMonthReadable, } from './report-month.js';
13
13
  export { type StripeUrlSession, type StripeUrlSessionPayload, toStripeUrlSessionPayload, fromStripeUrlSessionPayload, } from './stripe-url-session.js';
@@ -1,5 +1,5 @@
1
1
  /** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
2
- export declare const VOKABULAR_QUELLE = "d351a778c02888291e325068f96156ad1346859f6ff97bae27f91089e9619e8c";
2
+ export declare const VOKABULAR_QUELLE = "6e6eae018f1e84116d3942cbfd35bc2d5d6f5c5e5551823c7ed88f15ed407744";
3
3
  /** Schema-Notation des Vertrags: Blatt 'aussen': 'innen', Objekt { __: 'innen', ... }, Liste [ { __: 'innen', ... } ]. */
4
4
  export type SchemaEintrag = string | SchemaObjekt | readonly [SchemaObjekt];
5
5
  export interface SchemaObjekt {
@@ -1,7 +1,7 @@
1
1
  // Erzeugt von scripts/stored-vokabular.mjs aus fixtures/v3/v3-vokabular.json.
2
2
  // Nicht von Hand aendern: test/stored.test.ts vergleicht mit dem Vertrag.
3
3
  /** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
4
- export const VOKABULAR_QUELLE = "d351a778c02888291e325068f96156ad1346859f6ff97bae27f91089e9619e8c";
4
+ export const VOKABULAR_QUELLE = "6e6eae018f1e84116d3942cbfd35bc2d5d6f5c5e5551823c7ed88f15ed407744";
5
5
  /** Schema je Endpunkt (aussen -> innen) und Wertverweise auf die Kataloge. */
6
6
  export const SCHEMAS = {
7
7
  "getReceipt": {
@@ -4,4 +4,4 @@
4
4
  * Client-Version, Nachtrag §6). Ein Test haelt sie gleich mit `package.json`;
5
5
  * beim Anheben der Version beide Stellen aendern.
6
6
  */
7
- export declare const PACKAGE_VERSION = "1.5.1";
7
+ export declare const PACKAGE_VERSION = "1.7.0";
@@ -4,4 +4,4 @@
4
4
  * Client-Version, Nachtrag §6). Ein Test haelt sie gleich mit `package.json`;
5
5
  * beim Anheben der Version beide Stellen aendern.
6
6
  */
7
- export const PACKAGE_VERSION = '1.5.1';
7
+ export const PACKAGE_VERSION = '1.7.0';
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.1",
2
+ "version": "1.7.0",
3
3
  "measuredOn": {
4
4
  "tid": "3600335",
5
5
  "hpsVersion": "1.10.0",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "Kasseneck Rechnungs-API",
4
4
  "version": 2,
5
- "package": "1.5.1",
5
+ "package": "1.7.0",
6
6
  "endpoints": {
7
7
  "createCustomer": {
8
8
  "request": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.1",
2
+ "version": "1.7.0",
3
3
  "languages": [
4
4
  "de",
5
5
  "en"
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.1",
2
+ "version": "1.7.0",
3
3
  "messages": {
4
4
  "network.no_connection": {
5
5
  "text": "Keine Verbindung zum Server. Bitte die Internetverbindung prüfen und erneut versuchen."
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.1",
2
+ "version": "1.7.0",
3
3
  "baseUrls": {
4
4
  "public": "https://api.kasseneck.at/v3",
5
5
  "pos": "https://kasse.kasseneck.at/api/v3"
@@ -81,7 +81,12 @@
81
81
  "extendReservation",
82
82
  "releaseReservation",
83
83
  "getReservation",
84
- "listReservations"
84
+ "listReservations",
85
+ "createVariantGroup",
86
+ "updateVariantGroup",
87
+ "getVariantGroup",
88
+ "listVariantGroups",
89
+ "addVariant"
85
90
  ],
86
91
  "pos": [
87
92
  "cancelReceipt",
@@ -202,7 +207,12 @@
202
207
  "extendReservation",
203
208
  "releaseReservation",
204
209
  "getReservation",
205
- "listReservations"
210
+ "listReservations",
211
+ "createVariantGroup",
212
+ "updateVariantGroup",
213
+ "getVariantGroup",
214
+ "listVariantGroups",
215
+ "addVariant"
206
216
  ],
207
217
  "pos": [
208
218
  "pairRegisterDevice",
@@ -237,6 +247,7 @@
237
247
  },
238
248
  "unknownOutcomeCalls": [
239
249
  "activateCashregister",
250
+ "addVariant",
240
251
  "cancelInvoice",
241
252
  "cancelReceipt",
242
253
  "changeStockCondition",
@@ -250,6 +261,7 @@
250
261
  "createPrintJob",
251
262
  "createReceipt",
252
263
  "createReservation",
264
+ "createVariantGroup",
253
265
  "createWebhook",
254
266
  "deactivateArticle",
255
267
  "deletePartnerWebhook",
@@ -286,6 +298,7 @@
286
298
  "updateCustomer",
287
299
  "updateInvoiceItem",
288
300
  "updatePartnerWebhook",
301
+ "updateVariantGroup",
289
302
  "updateWebhook",
290
303
  "withdrawInvoiceItem"
291
304
  ],
@@ -1070,7 +1083,12 @@
1070
1083
  "extendReservation",
1071
1084
  "releaseReservation",
1072
1085
  "getReservation",
1073
- "listReservations"
1086
+ "listReservations",
1087
+ "createVariantGroup",
1088
+ "updateVariantGroup",
1089
+ "getVariantGroup",
1090
+ "listVariantGroups",
1091
+ "addVariant"
1074
1092
  ],
1075
1093
  "inventoryErrorCodes": [
1076
1094
  "validation",
@@ -1133,7 +1151,12 @@
1133
1151
  "reason_required",
1134
1152
  "insufficient_available",
1135
1153
  "reservation_not_found",
1136
- "reservation_not_active"
1154
+ "reservation_not_active",
1155
+ "variant_group_not_found",
1156
+ "variant_already_exists",
1157
+ "invalid_variant_attributes",
1158
+ "variant_group_inactive",
1159
+ "variant_limit"
1137
1160
  ],
1138
1161
  "inventoryRequestErrorCodes": [
1139
1162
  "account_not_found",
@@ -1182,7 +1205,9 @@
1182
1205
  "article.deactivated",
1183
1206
  "reservation.expired",
1184
1207
  "reservation.released",
1185
- "reservation.redeemed"
1208
+ "reservation.redeemed",
1209
+ "variant_group.created",
1210
+ "variant_group.updated"
1186
1211
  ],
1187
1212
  "landedCostAllocations": [
1188
1213
  "value",
@@ -2,7 +2,7 @@
2
2
  "_hinweis": "Vertrags-Export /v3, erzeugt aus den echten Handlern (npm run vertrag:v3 in functions/ und functions-kasse/). Nicht von Hand pflegen.",
3
3
  "_quelle": {
4
4
  "sha256": "61892b91e6a8a0f273dcfdeb63809d92d98fb837a3c0baa782f03b29dd3b8b7a",
5
- "inputsSha256": "b9dd3d819a4be22c35a201a788e7fcf947d90b6af7d9e41d3d74be3b48f8aa8e",
5
+ "inputsSha256": "8490315ac4059c3b26274649b8c3323295b26a6422a02da3a3cc241338cc797b",
6
6
  "backendPackage": "@kreiseck/kasseneck-api@0.33.0",
7
7
  "inputs": [
8
8
  "docs/api/fehlercodes.json",
@@ -2,7 +2,7 @@
2
2
  "_hinweis": "Vertrags-Export /v3, erzeugt aus den echten Handlern (npm run vertrag:v3 in functions/ und functions-kasse/). Nicht von Hand pflegen.",
3
3
  "_quelle": {
4
4
  "sha256": "265bcf3e14cdea33ec3c4df399eb487d40c0d7793ee23d2ee12bcf664bcad550",
5
- "inputsSha256": "b9dd3d819a4be22c35a201a788e7fcf947d90b6af7d9e41d3d74be3b48f8aa8e",
5
+ "inputsSha256": "8490315ac4059c3b26274649b8c3323295b26a6422a02da3a3cc241338cc797b",
6
6
  "backendPackage": "@kreiseck/kasseneck-api@0.33.0",
7
7
  "inputs": [
8
8
  "docs/api/fehlercodes.json",
@@ -2,7 +2,7 @@
2
2
  "_hinweis": "Vertrags-Export /v3, erzeugt aus den echten Handlern (npm run vertrag:v3 in functions/ und functions-kasse/). Nicht von Hand pflegen.",
3
3
  "_quelle": {
4
4
  "sha256": "aad7147db385e4a6d88ba5fb59d24c04e7e1f01195778aa70ccdc68fb90adcd7",
5
- "inputsSha256": "b9dd3d819a4be22c35a201a788e7fcf947d90b6af7d9e41d3d74be3b48f8aa8e",
5
+ "inputsSha256": "8490315ac4059c3b26274649b8c3323295b26a6422a02da3a3cc241338cc797b",
6
6
  "backendPackage": "@kreiseck/kasseneck-api@0.33.0",
7
7
  "inputs": [
8
8
  "docs/api/fehlercodes.json",
@@ -4,7 +4,7 @@
4
4
  "default": {
5
5
  "sha256": "bf1e7c100e328517c72d5badf31904183efe22d1fddec308e2fe2722068854bc",
6
6
  "head": [],
7
- "inputsSha256": "3a500a9049bc0b7b3955d14e4df69e7c690270bdd6a31071c2ef50f08a9b30cb",
7
+ "inputsSha256": "10b8007647d9d9ba2a1c904b320f1ad5a97f66ab2ae3f4511ba18bfcbd616dea",
8
8
  "backendPackage": "@kreiseck/kasseneck-api@0.33.0",
9
9
  "inputs": [
10
10
  "functions-kasse/test/unit/fixtures/kassen-welt.js",
@@ -24,7 +24,7 @@
24
24
  "channel",
25
25
  "note"
26
26
  ],
27
- "inputsSha256": "d1a29138f9bfdb32a861df2bc101f5be672e182c1387aa4f8f1786ab8de8fcc1",
27
+ "inputsSha256": "35cb1bb7c33a3eb238dd7a4a38ef604df1170e108afb3a8800fbf17ea6d3a3cb",
28
28
  "backendPackage": "@kreiseck/kasseneck-api@0.14.0",
29
29
  "inputs": [
30
30
  "functions-kasse/gemeinsam/api-rand.js",