@kreiseck/kasseneck-api 1.5.1 → 1.6.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 (66) hide show
  1. package/CHANGELOG.md +66 -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/inventory/api.d.ts +10 -2
  6. package/dist/cjs/inventory/api.js +8 -1
  7. package/dist/cjs/inventory/endpunkte.d.ts +2 -1
  8. package/dist/cjs/inventory/endpunkte.js +2 -1
  9. package/dist/cjs/inventory/index.d.ts +5 -3
  10. package/dist/cjs/inventory/index.js +15 -3
  11. package/dist/cjs/inventory/lesen.d.ts +7 -1
  12. package/dist/cjs/inventory/lesen.js +75 -0
  13. package/dist/cjs/inventory/schreiben.d.ts +23 -1
  14. package/dist/cjs/inventory/schreiben.js +18 -9
  15. package/dist/cjs/inventory/typen.d.ts +156 -2
  16. package/dist/cjs/inventory/varianten.d.ts +67 -0
  17. package/dist/cjs/inventory/varianten.js +150 -0
  18. package/dist/cjs/inventory/vertrag.d.ts +40 -5
  19. package/dist/cjs/inventory/vertrag.js +51 -3
  20. package/dist/cjs/inventory/webhook.d.ts +5 -2
  21. package/dist/cjs/inventory/webhook.js +8 -2
  22. package/dist/cjs/stored/vokabular.d.ts +1 -1
  23. package/dist/cjs/stored/vokabular.js +1 -1
  24. package/dist/cjs/version.d.ts +1 -1
  25. package/dist/cjs/version.js +1 -1
  26. package/dist/esm/client/aufrufe.d.ts +3 -3
  27. package/dist/esm/client/aufrufe.js +17 -0
  28. package/dist/esm/inventory/api.d.ts +10 -2
  29. package/dist/esm/inventory/api.js +8 -1
  30. package/dist/esm/inventory/endpunkte.d.ts +2 -1
  31. package/dist/esm/inventory/endpunkte.js +2 -1
  32. package/dist/esm/inventory/index.d.ts +5 -3
  33. package/dist/esm/inventory/index.js +4 -2
  34. package/dist/esm/inventory/lesen.d.ts +7 -1
  35. package/dist/esm/inventory/lesen.js +74 -0
  36. package/dist/esm/inventory/schreiben.d.ts +23 -1
  37. package/dist/esm/inventory/schreiben.js +13 -10
  38. package/dist/esm/inventory/typen.d.ts +156 -2
  39. package/dist/esm/inventory/varianten.d.ts +67 -0
  40. package/dist/esm/inventory/varianten.js +142 -0
  41. package/dist/esm/inventory/vertrag.d.ts +40 -5
  42. package/dist/esm/inventory/vertrag.js +50 -2
  43. package/dist/esm/inventory/webhook.d.ts +5 -2
  44. package/dist/esm/inventory/webhook.js +9 -3
  45. package/dist/esm/stored/vokabular.d.ts +1 -1
  46. package/dist/esm/stored/vokabular.js +1 -1
  47. package/dist/esm/version.d.ts +1 -1
  48. package/dist/esm/version.js +1 -1
  49. package/fixtures/hobex-hps-codes.json +1 -1
  50. package/fixtures/invoice-api.schema.json +1 -1
  51. package/fixtures/invoice-texts.json +1 -1
  52. package/fixtures/pos-texts.json +1 -1
  53. package/fixtures/surface.json +31 -6
  54. package/fixtures/v3/antworten/belege.json +1 -1
  55. package/fixtures/v3/antworten/belegmail.json +1 -1
  56. package/fixtures/v3/antworten/kasse-belege.json +1 -1
  57. package/fixtures/v3/antworten/kasse.json +2 -2
  58. package/fixtures/v3/antworten/lager.json +2396 -4
  59. package/fixtures/v3/antworten/rechnungen.json +1 -1
  60. package/fixtures/v3/antworten/storno.json +1 -1
  61. package/fixtures/v3/stored/belege.json +1 -1
  62. package/fixtures/v3/stored/kasse.json +2 -2
  63. package/fixtures/v3/stored/rechnungen.json +1 -1
  64. package/fixtures/v3/v3-vokabular.json +151 -6
  65. package/fixtures/v3/zahlbetrag-faelle.json +1 -1
  66. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Der Vertrag der Lager-API (Backend Stufe 5a lesen, 5b schreiben und
4
- * reservieren) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
4
+ * reservieren, 5c Varianten) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
5
5
  * Hinweiscodes, englisch wie am Draht `/v3`.
6
6
  *
7
7
  * Quelle ist der Vertrags-Export des Backends (`fixtures/v3/v3-vokabular.json`):
@@ -13,8 +13,8 @@
13
13
  * deckungsgleich mit dieser Datei; nichts hier wird geraten.
14
14
  */
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.RESERVATION_MINUTES_MAX = exports.RESERVATION_MINUTES_MIN = exports.INVENTORY_IDEMPOTENCY_KEY_MAX = exports.RESERVATION_STATUSES = exports.LANDED_COST_ALLOCATIONS = exports.LANDED_COST_TYPES = exports.WITHDRAWAL_TYPES = exports.STOCK_LOSS_REASONS = exports.STOCK_KINDS = exports.INVENTORY_WARNING_CODES = exports.INVENTORY_REQUEST_ERROR_CODES = exports.INVENTORY_ERROR_CODES = exports.INVENTORY_LIST_LIMIT_MAX = exports.INVENTORY_WEBHOOK_LIMIT = exports.INVENTORY_WEBHOOK_ENVELOPE_FIELDS = exports.INVENTORY_WEBHOOK_EVENTS = exports.WEBHOOK_DELIVERY_STATUSES = exports.STOCK_CHANGE_CAUSES = exports.STOCK_CONDITIONS = exports.STOCK_MOVEMENT_SOURCES = exports.STOCK_MOVEMENT_TYPES = exports.LOCATION_TYPES = exports.INVENTORY_ENDPOINTS = void 0;
17
- /** Die 27 Endpunkte (14 aus 5a, 13 aus 5b), in der Reihenfolge von `endpoints.public`. */
16
+ exports.VARIANT_GROUP_ACTIVE_MAX = exports.VARIANT_MATRIX_MAX = exports.VARIANT_VALUES_MAX = exports.VARIANT_ATTRIBUTES_MAX = exports.RESERVATION_MINUTES_MAX = exports.RESERVATION_MINUTES_MIN = exports.INVENTORY_IDEMPOTENCY_KEY_MAX = exports.RESERVATION_STATUSES = exports.LANDED_COST_ALLOCATIONS = exports.LANDED_COST_TYPES = exports.WITHDRAWAL_TYPES = exports.STOCK_LOSS_REASONS = exports.STOCK_KINDS = exports.INVENTORY_WARNING_CODES = exports.INVENTORY_REQUEST_ERROR_CODES = exports.INVENTORY_ERROR_CODES = exports.INVENTORY_LIST_LIMIT_MAX = exports.INVENTORY_WEBHOOK_LIMIT = exports.INVENTORY_WEBHOOK_ENVELOPE_FIELDS = exports.INVENTORY_WEBHOOK_EVENTS = exports.WEBHOOK_DELIVERY_STATUSES = exports.STOCK_CHANGE_CAUSES = exports.STOCK_CONDITIONS = exports.STOCK_MOVEMENT_SOURCES = exports.STOCK_MOVEMENT_TYPES = exports.LOCATION_TYPES = exports.INVENTORY_ENDPOINTS = void 0;
17
+ /** Die 32 Endpunkte (14 aus 5a, 13 aus 5b, 5 aus 5c), in der Reihenfolge von `endpoints.public`. */
18
18
  exports.INVENTORY_ENDPOINTS = [
19
19
  'getArticle',
20
20
  'listArticles',
@@ -43,6 +43,11 @@ exports.INVENTORY_ENDPOINTS = [
43
43
  'releaseReservation',
44
44
  'getReservation',
45
45
  'listReservations',
46
+ 'createVariantGroup',
47
+ 'updateVariantGroup',
48
+ 'getVariantGroup',
49
+ 'listVariantGroups',
50
+ 'addVariant',
46
51
  ];
47
52
  /** Art eines Standorts (Katalog `STANDORT_TYP`). */
48
53
  exports.LOCATION_TYPES = ['warehouse', 'store', 'vehicle', 'other'];
@@ -116,6 +121,10 @@ exports.WEBHOOK_DELIVERY_STATUSES = ['delivered', 'pending', 'failed', 'dropped'
116
121
  * wie `getReservation`, mit dem Status danach: `reservation.released` und
117
122
  * `reservation.redeemed` kommen bei jeder wirksamen Freigabe bzw. Einloesung,
118
123
  * auch einer teilweisen (dann bleibt der Status `active`).
124
+ * `variant_group.created` und `variant_group.updated` (seit 1.6.0) tragen die
125
+ * Variantengruppe wie `getVariantGroup`; `updated` kommt nur bei einer aussen
126
+ * sichtbaren Aenderung (neuer Wert, neue oder stillgelegte Variante, Name,
127
+ * Vorgaben, Stilllegen der Gruppe).
119
128
  */
120
129
  exports.INVENTORY_WEBHOOK_EVENTS = [
121
130
  'stock.changed',
@@ -126,6 +135,8 @@ exports.INVENTORY_WEBHOOK_EVENTS = [
126
135
  'reservation.expired',
127
136
  'reservation.released',
128
137
  'reservation.redeemed',
138
+ 'variant_group.created',
139
+ 'variant_group.updated',
129
140
  ];
130
141
  /**
131
142
  * Die Felder der Huelle jeder Zustellung, in der Reihenfolge am Draht. Statt
@@ -153,6 +164,19 @@ exports.INVENTORY_LIST_LIMIT_MAX = 200;
153
164
  * [inventoryShortfalls]), `code_taken` und `external_id_taken` (mit `field` und
154
165
  * `articleId` des Artikels, dem der Code gehoert), `stock_kind_locked`,
155
166
  * `reservation_not_found`, `reservation_not_active` …
167
+ *
168
+ * Seit 1.6.0 dahinter die Codes der Variantengruppen: `variant_group_not_found`
169
+ * (unbekannte Kennung), `variant_already_exists` (die Kombination gibt es in der
170
+ * Gruppe schon, dann mit `articleId` der bestehenden Variante, oder sie steht
171
+ * zweimal in `variants[]`; jeweils mit `field`),
172
+ * `invalid_variant_attributes` (ein Merkmal fehlt, ist unbekannt oder sein Wert
173
+ * steht nicht in der Werteliste; `field` und `errors[]`),
174
+ * `variant_group_inactive` (stillgelegte Gruppe: kein `addVariant`, keine
175
+ * Aenderung ausser erneutem Stilllegen) und `variant_limit` (mehr als
176
+ * [VARIANT_GROUP_ACTIVE_MAX] aktive Varianten je Gruppe). Wiederverwendet:
177
+ * `too_many_positions` traegt bei Varianten `field` (`variants`,
178
+ * `createMatrix` bzw. `externalIds` bei `addVariant`): die Anfrage braeuchte
179
+ * mehr Schreibvorgaenge, als in einen Vorgang passen; geschrieben wurde nichts.
156
180
  */
157
181
  exports.INVENTORY_ERROR_CODES = [
158
182
  'validation',
@@ -216,6 +240,11 @@ exports.INVENTORY_ERROR_CODES = [
216
240
  'insufficient_available',
217
241
  'reservation_not_found',
218
242
  'reservation_not_active',
243
+ 'variant_group_not_found',
244
+ 'variant_already_exists',
245
+ 'invalid_variant_attributes',
246
+ 'variant_group_inactive',
247
+ 'variant_limit',
219
248
  ];
220
249
  /**
221
250
  * Codes, die Anmeldung und Rand auf jedem Lager-Aufruf erzeugen koennen,
@@ -289,3 +318,22 @@ exports.INVENTORY_IDEMPOTENCY_KEY_MAX = 120;
289
318
  /** Kuerzeste und laengste Haltedauer einer Reservierung in Minuten (`expiresInMinutes`, 30 Tage). */
290
319
  exports.RESERVATION_MINUTES_MIN = 5;
291
320
  exports.RESERVATION_MINUTES_MAX = 43_200;
321
+ // ---- Varianten (Backend Stufe 5c, seit 1.6.0) -----------------------------------
322
+ /**
323
+ * Grenzen einer Variantengruppe, wie das Backend sie prueft. Das Paket prueft
324
+ * sie **nicht** vor dem Senden: der Server darf sie anheben, ohne dass eine
325
+ * aeltere Paketversion dann faelschlich abweist. Wer darueber liegt, bekommt
326
+ * `validation` (Merkmale, Werte, Matrix, `variants[]`) bzw. `variant_limit`.
327
+ *
328
+ * - [VARIANT_ATTRIBUTES_MAX] Merkmale je Gruppe (Schluessel `^[a-z0-9_]{1,32}$`,
329
+ * eindeutig; `__…__` ist reserviert),
330
+ * - [VARIANT_VALUES_MAX] Werte je Merkmal (je 1–30 Zeichen, eindeutig ohne
331
+ * Gross/Klein),
332
+ * - [VARIANT_MATRIX_MAX] Kombinationen bei `createMatrix: true` und hoechstens
333
+ * so viele Eintraege in `variants[]` je Anfrage,
334
+ * - [VARIANT_GROUP_ACTIVE_MAX] aktive Varianten je Gruppe.
335
+ */
336
+ exports.VARIANT_ATTRIBUTES_MAX = 3;
337
+ exports.VARIANT_VALUES_MAX = 30;
338
+ exports.VARIANT_MATRIX_MAX = 100;
339
+ exports.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
  *
@@ -65,10 +65,13 @@ function kaputt(grund) {
65
65
  * Liest eine Zustellung als typisiertes Ereignis. Vorher die Signatur pruefen
66
66
  * ([verifyInventoryWebhookSignature]).
67
67
  *
68
- * - Ein Ereignis, das diese Paketversion nicht kennt (etwa `variant_group.*`
69
- * einer spaeteren Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
68
+ * - Ein Ereignis, das diese Paketversion nicht kennt (eines einer spaeteren
69
+ * Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
70
70
  * - `reservation.expired|released|redeemed` tragen die Reservierung wie
71
71
  * `getReservation`, mit dem Status nach dem Vorgang (seit 1.5.0).
72
+ * - `variant_group.created|updated` tragen die Gruppe wie `getVariantGroup`
73
+ * (seit 1.6.0). Zwei Zustellungen koennen sich ueberholen: den Stand nur
74
+ * uebernehmen, wenn `data.updatedAt` neuer ist als der gespeicherte.
72
75
  * - Ein Rumpf, der keine Huelle ist, oder eine Bruchzahl in einer Menge wirft
73
76
  * `KasseneckValidationError` (`scope: 'response'`).
74
77
  *
@@ -110,6 +113,9 @@ function parseInventoryWebhookEvent(rawBody) {
110
113
  case 'reservation.released':
111
114
  case 'reservation.redeemed':
112
115
  return { ...huelle, type: huelle.type, data: (0, lesen_js_1.reservierung)(ort, data) };
116
+ case 'variant_group.created':
117
+ case 'variant_group.updated':
118
+ return { ...huelle, type: huelle.type, data: (0, lesen_js_1.variantengruppe)(ort, data) };
113
119
  default:
114
120
  return { ...huelle, type: huelle.type, data: (0, lesen_js_1.artikel)(ort, data) };
115
121
  }
@@ -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 {
@@ -4,7 +4,7 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.KATALOGE = exports.ARTIKEL_FELDER = exports.SCHEMAS = exports.VOKABULAR_QUELLE = void 0;
6
6
  /** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
7
- exports.VOKABULAR_QUELLE = "d351a778c02888291e325068f96156ad1346859f6ff97bae27f91089e9619e8c";
7
+ exports.VOKABULAR_QUELLE = "6e6eae018f1e84116d3942cbfd35bc2d5d6f5c5e5551823c7ed88f15ed407744";
8
8
  /** Schema je Endpunkt (aussen -> innen) und Wertverweise auf die Kataloge. */
9
9
  exports.SCHEMAS = {
10
10
  "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.6.0";
@@ -7,4 +7,4 @@ exports.PACKAGE_VERSION = void 0;
7
7
  * Client-Version, Nachtrag §6). Ein Test haelt sie gleich mit `package.json`;
8
8
  * beim Anheben der Version beide Stellen aendern.
9
9
  */
10
- exports.PACKAGE_VERSION = '1.5.1';
10
+ exports.PACKAGE_VERSION = '1.6.0';
@@ -13,7 +13,7 @@
13
13
  * umhuellt, muss ihn weiterhin absetzen koennen.
14
14
  */
15
15
  import type { TransportBodyFields, TransportCallOptions } from './transport.js';
16
- export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceSetupStatus", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "getReportV2", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listBrands", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyStock", "listMyStockLocations", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook", "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"];
16
+ export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceSetupStatus", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "getReportV2", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listBrands", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyStock", "listMyStockLocations", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook", "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"];
17
17
  export type ApiCall = typeof ALL_CALLS[number];
18
18
  /**
19
19
  * Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
@@ -21,7 +21,7 @@ export type ApiCall = typeof ALL_CALLS[number];
21
21
  * (`fixtures/v3/v3-vokabular.json`, `endpoints.public`, umbenannt nach
22
22
  * `names`). Ein Test haelt beide Listen deckungsgleich.
23
23
  */
24
- export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "cancelReceipt", "sendReceiptEmail", "generateFullReceiptId", "downloadReceipt", "getFirstReceiptDate", "getReportV2", "downloadReport", "downloadDailyReport", "createPaymentLinkStripe", "stripeCaptureIntent", "hobexPayApi", "hobexRefundApi", "hobexGetStatus", "financeWebService", "listMyTipRecipients", "getPartnerInfo", "createPartnerCustomer", "checkPartnerCustomerEmail", "listPartnerCustomers", "getPartnerCustomer", "sendPartnerCustomerFonLink", "createPartnerWebhook", "updatePartnerWebhook", "deletePartnerWebhook", "listPartnerWebhooks", "sendPartnerWebhookTest", "rotatePartnerWebhookSecret", "listPartnerWebhookDeliveries", "requestCustomerSignature", "getCustomerSignatureStatus", "createCustomerCashregister", "activateCashregister", "listCustomerCashregisters", "getCustomerCredentials", "reportCustomerContract", "getPartnerBilling", "getPartnerBillingMonth", "createCustomer", "getCustomer", "updateCustomer", "searchCustomers", "issueInvoice", "cancelInvoice", "createCreditNote", "getInvoice", "listInvoices", "getInvoicePdf", "getInvoiceXml", "getInvoiceSetupStatus", "listBrands", "recordInvoicePayment", "createInvoiceItem", "updateInvoiceItem", "withdrawInvoiceItem", "getInvoiceItem", "listInvoiceItems", "setCustomerMandate", "revokeCustomerMandate", "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"];
24
+ export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "cancelReceipt", "sendReceiptEmail", "generateFullReceiptId", "downloadReceipt", "getFirstReceiptDate", "getReportV2", "downloadReport", "downloadDailyReport", "createPaymentLinkStripe", "stripeCaptureIntent", "hobexPayApi", "hobexRefundApi", "hobexGetStatus", "financeWebService", "listMyTipRecipients", "getPartnerInfo", "createPartnerCustomer", "checkPartnerCustomerEmail", "listPartnerCustomers", "getPartnerCustomer", "sendPartnerCustomerFonLink", "createPartnerWebhook", "updatePartnerWebhook", "deletePartnerWebhook", "listPartnerWebhooks", "sendPartnerWebhookTest", "rotatePartnerWebhookSecret", "listPartnerWebhookDeliveries", "requestCustomerSignature", "getCustomerSignatureStatus", "createCustomerCashregister", "activateCashregister", "listCustomerCashregisters", "getCustomerCredentials", "reportCustomerContract", "getPartnerBilling", "getPartnerBillingMonth", "createCustomer", "getCustomer", "updateCustomer", "searchCustomers", "issueInvoice", "cancelInvoice", "createCreditNote", "getInvoice", "listInvoices", "getInvoicePdf", "getInvoiceXml", "getInvoiceSetupStatus", "listBrands", "recordInvoicePayment", "createInvoiceItem", "updateInvoiceItem", "withdrawInvoiceItem", "getInvoiceItem", "listInvoiceItems", "setCustomerMandate", "revokeCustomerMandate", "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"];
25
25
  /**
26
26
  * Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
27
27
  * Web-Kasse: gleicher Ursprung `/api/v3`), in der Reihenfolge von
@@ -49,7 +49,7 @@ export type PosCall = typeof POS_CALLS[number];
49
49
  * [ALL_CALLS], [PUBLIC_CALLS] und [POS_CALLS] steht entweder hier oder in
50
50
  * [CALLS_WITHOUT_EFFECT] (Waechter `test/ausgang-einordnung.test.ts`).
51
51
  */
52
- export declare const UNKNOWN_OUTCOME_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "changeStockCondition", "createArticle", "createCreditNote", "createCustomer", "createCustomerCashregister", "createInvoiceItem", "createPartnerCustomer", "createPartnerWebhook", "createPrintJob", "createReceipt", "createReservation", "createWebhook", "deactivateArticle", "deletePartnerWebhook", "deleteWebhook", "extendReservation", "financeWebService", "hobexPayApi", "hobexRefundApi", "issueInvoice", "pairRegisterDevice", "receiveGoods", "recordInvoicePayment", "recordStockLoss", "releaseReservation", "reportCustomerContract", "requestCustomerSignature", "reverseStockMovement", "revokeCustomerMandate", "rotatePartnerWebhookSecret", "rotateWebhookSecret", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "sendWebhookTest", "setCustomerMandate", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "transferStock", "unpairRegisterDevice", "updateArticle", "updateCustomer", "updateInvoiceItem", "updatePartnerWebhook", "updateWebhook", "withdrawInvoiceItem"];
52
+ export declare const UNKNOWN_OUTCOME_CALLS: readonly ["activateCashregister", "addVariant", "cancelInvoice", "cancelReceipt", "changeStockCondition", "createArticle", "createCreditNote", "createCustomer", "createCustomerCashregister", "createInvoiceItem", "createPartnerCustomer", "createPartnerWebhook", "createPrintJob", "createReceipt", "createReservation", "createVariantGroup", "createWebhook", "deactivateArticle", "deletePartnerWebhook", "deleteWebhook", "extendReservation", "financeWebService", "hobexPayApi", "hobexRefundApi", "issueInvoice", "pairRegisterDevice", "receiveGoods", "recordInvoicePayment", "recordStockLoss", "releaseReservation", "reportCustomerContract", "requestCustomerSignature", "reverseStockMovement", "revokeCustomerMandate", "rotatePartnerWebhookSecret", "rotateWebhookSecret", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "sendWebhookTest", "setCustomerMandate", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "transferStock", "unpairRegisterDevice", "updateArticle", "updateCustomer", "updateInvoiceItem", "updatePartnerWebhook", "updateVariantGroup", "updateWebhook", "withdrawInvoiceItem"];
53
53
  /** Warum ein Aufruf keine Wirkung hat, die ein Zeitlimit offen lassen koennte. */
54
54
  export type CallWithoutEffectReason = 'read' | 'repeatable';
55
55
  /**
@@ -99,6 +99,12 @@ export const ALL_CALLS = [
99
99
  'releaseReservation',
100
100
  'getReservation',
101
101
  'listReservations',
102
+ // Lager-API Varianten (Stufe 5c, ./inventory)
103
+ 'createVariantGroup',
104
+ 'updateVariantGroup',
105
+ 'getVariantGroup',
106
+ 'listVariantGroups',
107
+ 'addVariant',
102
108
  ];
103
109
  /**
104
110
  * Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
@@ -199,6 +205,12 @@ export const PUBLIC_CALLS = [
199
205
  'releaseReservation',
200
206
  'getReservation',
201
207
  'listReservations',
208
+ // Lager-API Varianten (Backend Stufe 5c), umhuellt in `./inventory`.
209
+ 'createVariantGroup',
210
+ 'updateVariantGroup',
211
+ 'getVariantGroup',
212
+ 'listVariantGroups',
213
+ 'addVariant',
202
214
  ];
203
215
  /**
204
216
  * Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
@@ -257,6 +269,7 @@ export const POS_CALLS = [
257
269
  */
258
270
  export const UNKNOWN_OUTCOME_CALLS = [
259
271
  'activateCashregister',
272
+ 'addVariant',
260
273
  'cancelInvoice',
261
274
  'cancelReceipt',
262
275
  'changeStockCondition',
@@ -270,6 +283,7 @@ export const UNKNOWN_OUTCOME_CALLS = [
270
283
  'createPrintJob',
271
284
  'createReceipt',
272
285
  'createReservation',
286
+ 'createVariantGroup',
273
287
  'createWebhook',
274
288
  'deactivateArticle',
275
289
  'deletePartnerWebhook',
@@ -306,6 +320,7 @@ export const UNKNOWN_OUTCOME_CALLS = [
306
320
  'updateCustomer',
307
321
  'updateInvoiceItem',
308
322
  'updatePartnerWebhook',
323
+ 'updateVariantGroup',
309
324
  'updateWebhook',
310
325
  'withdrawInvoiceItem',
311
326
  ];
@@ -361,6 +376,7 @@ export const CALLS_WITHOUT_EFFECT = Object.freeze({
361
376
  getReportV2: 'read',
362
377
  getReservation: 'read',
363
378
  getStock: 'read',
379
+ getVariantGroup: 'read',
364
380
  hobexGetStatus: 'read',
365
381
  listArticles: 'read',
366
382
  listBrands: 'read',
@@ -384,6 +400,7 @@ export const CALLS_WITHOUT_EFFECT = Object.freeze({
384
400
  listReservations: 'read',
385
401
  listStock: 'read',
386
402
  listStockMovements: 'read',
403
+ listVariantGroups: 'read',
387
404
  listWebhookDeliveries: 'read',
388
405
  listWebhooks: 'read',
389
406
  lookupArticleByCode: 'read',
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Fassade ueber den Aufrufen der Lager-API (lesen, Webhooks, schreiben,
3
- * reservieren): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
3
+ * reservieren, Varianten): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
4
4
  * Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
5
5
  */
6
6
  import { type FetchLike } from '../client/transport.js';
7
- import type { Article, ChangeStockConditionRequest, CreateArticleRequest, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptPreview, GoodsReceiptPreviewRequest, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationRequest, Reservation, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockOperation, TransferStockRequest, UpdateArticleRequest, ArticleListQuery, ArticleLookup, ArticlePage, CreateInventoryWebhookOptions, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestResult, InventoryWebhookWithSecret, Location, StockLevel, StockListQuery, StockMovement, StockMovementPage, StockMovementQuery, StockPage, StockResult } from './typen.js';
7
+ import type { AddVariantRequest, CreateVariantGroupRequest, UpdateVariantGroupRequest, VariantGroup, VariantGroupListQuery, VariantGroupPage, Article, ChangeStockConditionRequest, CreateArticleRequest, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptPreview, GoodsReceiptPreviewRequest, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationRequest, Reservation, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockOperation, TransferStockRequest, UpdateArticleRequest, ArticleListQuery, ArticleLookup, ArticlePage, CreateInventoryWebhookOptions, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestResult, InventoryWebhookWithSecret, Location, StockLevel, StockListQuery, StockMovement, StockMovementPage, StockMovementQuery, StockPage, StockResult } from './typen.js';
8
8
  import type { InventoryWebhookEventType } from './vertrag.js';
9
9
  export interface InventoryClientOptions {
10
10
  /** `api_key` des Kontos (`kr_live_…` / `kr_test_…`). Gehoert auf einen Server. */
@@ -57,5 +57,13 @@ export interface InventoryClient {
57
57
  getReservation(reservationId: string): Promise<Reservation>;
58
58
  listReservations(query?: ReservationListQuery): Promise<ReservationPage>;
59
59
  iterateReservations(query?: ReservationListQuery): AsyncGenerator<Reservation, void, undefined>;
60
+ createVariantGroup(request: CreateVariantGroupRequest): Promise<VariantGroup>;
61
+ /** Name, Vorgaben, neue Werte; oder `active: false` (Gruppe und alle Varianten stilllegen, endgueltig). */
62
+ updateVariantGroup(request: UpdateVariantGroupRequest): Promise<VariantGroup>;
63
+ /** Eine Variante mehr; Antwort: der Artikel wie `createArticle`. */
64
+ addVariant(request: AddVariantRequest): Promise<Article>;
65
+ getVariantGroup(variantGroupId: string): Promise<VariantGroup>;
66
+ listVariantGroups(query?: VariantGroupListQuery): Promise<VariantGroupPage>;
67
+ iterateVariantGroups(query?: VariantGroupListQuery): AsyncGenerator<VariantGroup, void, undefined>;
60
68
  }
61
69
  export declare function createInventoryClient(options: InventoryClientOptions): InventoryClient;
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * Fassade ueber den Aufrufen der Lager-API (lesen, Webhooks, schreiben,
3
- * reservieren): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
3
+ * reservieren, Varianten): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
4
4
  * Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
5
5
  */
6
6
  import { createTransport } from '../client/transport.js';
7
7
  import { inventoryKeyAuth } from './auth.js';
8
8
  import { createWebhook, deleteWebhook, getArticle, getStock, iterateArticles, iterateStock, iterateStockMovements, listArticles, listLocations, listStock, listStockMovements, listWebhookDeliveries, listWebhooks, lookupArticleByCode, rotateWebhookSecret, sendWebhookTest, updateWebhook, } from './endpunkte.js';
9
9
  import { changeStockCondition, createArticle, createReservation, deactivateArticle, extendReservation, getReservation, iterateReservations, listReservations, previewGoodsReceipt, receiveGoods, recordStockLoss, releaseReservation, reverseStockMovement, transferStock, updateArticle, } from './schreiben.js';
10
+ import { addVariant, createVariantGroup, getVariantGroup, iterateVariantGroups, listVariantGroups, updateVariantGroup, } from './varianten.js';
10
11
  export function createInventoryClient(options) {
11
12
  const rufen = createTransport({
12
13
  auth: inventoryKeyAuth({ apiKey: options.apiKey }),
@@ -47,5 +48,11 @@ export function createInventoryClient(options) {
47
48
  getReservation: (id) => getReservation(rufen, id),
48
49
  listReservations: (q) => listReservations(rufen, q),
49
50
  iterateReservations: (q) => iterateReservations(rufen, q),
51
+ createVariantGroup: (r) => createVariantGroup(rufen, r),
52
+ updateVariantGroup: (r) => updateVariantGroup(rufen, r),
53
+ addVariant: (r) => addVariant(rufen, r),
54
+ getVariantGroup: (id) => getVariantGroup(rufen, id),
55
+ listVariantGroups: (q) => listVariantGroups(rufen, q),
56
+ iterateVariantGroups: (q) => iterateVariantGroups(rufen, q),
50
57
  };
51
58
  }
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Die Aufrufe der Lager-API: Artikel, Standorte, Bestand und Bewegungen
3
3
  * lesen, Konto-Webhooks verwalten (Backend Stufe 5a). Die schreibenden
4
- * Aufrufe (Stufe 5b) stehen in `schreiben.ts` und teilen die Helfer hier.
4
+ * Aufrufe (Stufe 5b) stehen in `schreiben.ts`, die Variantengruppen (Stufe 5c)
5
+ * in `varianten.ts`; beide teilen die Helfer hier.
5
6
  *
6
7
  * Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln
7
8
  * importierbar; die Fassade [createInventoryClient] bindet ihn nur einmal.
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Die Aufrufe der Lager-API: Artikel, Standorte, Bestand und Bewegungen
3
3
  * lesen, Konto-Webhooks verwalten (Backend Stufe 5a). Die schreibenden
4
- * Aufrufe (Stufe 5b) stehen in `schreiben.ts` und teilen die Helfer hier.
4
+ * Aufrufe (Stufe 5b) stehen in `schreiben.ts`, die Variantengruppen (Stufe 5c)
5
+ * in `varianten.ts`; beide teilen die Helfer hier.
5
6
  *
6
7
  * Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln
7
8
  * importierbar; die Fassade [createInventoryClient] bindet ihn nur einmal.
@@ -2,7 +2,8 @@
2
2
  * `@kreiseck/kasseneck-api/inventory` – die Lager-API: Artikel, Standorte,
3
3
  * Bestand und Lagerprotokoll lesen, Konto-Webhooks verwalten und eingehende
4
4
  * Zustellungen pruefen (Backend Stufe 5a); Artikel anlegen und aendern,
5
- * Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0).
5
+ * Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0);
6
+ * Variantengruppen (Stufe 5c, seit 1.6.0).
6
7
  *
7
8
  * Ein eigener Unterpfad wie `invoice`: der `api_key` eines Kontos gehoert auf
8
9
  * einen **Server** (etwa das Backend eines Online-Shops) und soll nicht
@@ -16,6 +17,7 @@ export { inventoryKeyAuth, type InventoryKeyAuthOptions } from './auth.js';
16
17
  export { isInventoryError, isInventoryErrorCode, inventoryErrorCode, inventoryFieldErrors, inventoryRetryAfterSec, inventoryShortfalls, isInventoryWarningCode, type InventoryApiErrorCode, type InventoryFieldError, } from './fehler.js';
17
18
  export { createWebhook, deleteWebhook, getArticle, getStock, iterateArticles, iterateStock, iterateStockMovements, listArticles, listLocations, listStock, listStockMovements, listWebhookDeliveries, listWebhooks, lookupArticleByCode, rotateWebhookSecret, sendWebhookTest, updateWebhook, } from './endpunkte.js';
18
19
  export { changeStockCondition, createArticle, createReservation, deactivateArticle, extendReservation, getReservation, iterateReservations, listReservations, previewGoodsReceipt, receiveGoods, recordStockLoss, releaseReservation, reverseStockMovement, transferStock, updateArticle, } from './schreiben.js';
20
+ export { addVariant, createVariantGroup, getVariantGroup, iterateVariantGroups, listVariantGroups, updateVariantGroup, } from './varianten.js';
19
21
  export { verifyInventoryWebhookSignature, parseInventoryWebhookEvent, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, type VerifyInventoryWebhookOptions, } from './webhook.js';
20
- export type { Article, ArticleInput, ArticleListQuery, ArticleLookup, ArticlePage, ChangeStockConditionRequest, CreateArticleRequest, CreateInventoryWebhookOptions, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptItem, GoodsReceiptPreview, GoodsReceiptPreviewLine, GoodsReceiptPreviewRequest, InventoryShortfall, InventoryWarning, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookEnvelope, InventoryWebhookEvent, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestDelivery, InventoryWebhookTestResult, InventoryWebhookWithSecret, LandedCost, Location, LocationAddress, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationItem, ReleaseReservationRequest, Reservation, ReservationItem, ReservationItemInput, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockBelowMinimumEventData, StockChangedEventData, StockItem, StockLevel, StockListQuery, StockMovement, StockMovementLot, StockMovementPage, StockMovementQuery, StockMovementSourceRef, StockOperation, StockPage, StockResult, StockValue, TransferStockRequest, UpdateArticleRequest, } from './typen.js';
21
- export { INVENTORY_ENDPOINTS, INVENTORY_ERROR_CODES, INVENTORY_REQUEST_ERROR_CODES, INVENTORY_WEBHOOK_EVENTS, INVENTORY_WEBHOOK_ENVELOPE_FIELDS, INVENTORY_WEBHOOK_LIMIT, INVENTORY_LIST_LIMIT_MAX, LOCATION_TYPES, STOCK_MOVEMENT_TYPES, STOCK_MOVEMENT_SOURCES, STOCK_CONDITIONS, STOCK_CHANGE_CAUSES, WEBHOOK_DELIVERY_STATUSES, INVENTORY_WARNING_CODES, STOCK_KINDS, STOCK_LOSS_REASONS, WITHDRAWAL_TYPES, LANDED_COST_TYPES, LANDED_COST_ALLOCATIONS, RESERVATION_STATUSES, INVENTORY_IDEMPOTENCY_KEY_MAX, RESERVATION_MINUTES_MIN, RESERVATION_MINUTES_MAX, type InventoryEndpoint, type InventoryErrorCode, type InventoryRequestErrorCode, type InventoryWebhookEventType, type LocationType, type StockMovementType, type StockMovementSource, type StockCondition, type StockChangeCause, type WebhookDeliveryStatus, type InventoryWarningCode, type StockKind, type StockLossReason, type WithdrawalType, type LandedCostType, type LandedCostAllocation, type ReservationStatus, } from './vertrag.js';
22
+ export type { AddVariantRequest, Article, ArticleInput, ArticleListQuery, ArticleLookup, ArticlePage, ChangeStockConditionRequest, CreateArticleRequest, CreateInventoryWebhookOptions, CreateReservationRequest, CreateVariantGroupRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptItem, GoodsReceiptPreview, GoodsReceiptPreviewLine, GoodsReceiptPreviewRequest, InventoryShortfall, InventoryWarning, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookEnvelope, InventoryWebhookEvent, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestDelivery, InventoryWebhookTestResult, InventoryWebhookWithSecret, LandedCost, Location, LocationAddress, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationItem, ReleaseReservationRequest, Reservation, ReservationItem, ReservationItemInput, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockBelowMinimumEventData, StockChangedEventData, StockItem, StockLevel, StockListQuery, StockMovement, StockMovementLot, StockMovementPage, StockMovementQuery, StockMovementSourceRef, StockOperation, StockPage, StockResult, StockValue, TransferStockRequest, UpdateArticleRequest, UpdateVariantGroupRequest, VariantAttribute, VariantGroup, VariantGroupDefaults, VariantGroupDefaultsInput, VariantGroupListQuery, VariantGroupMember, VariantGroupPage, VariantInput, } from './typen.js';
23
+ export { INVENTORY_ENDPOINTS, INVENTORY_ERROR_CODES, INVENTORY_REQUEST_ERROR_CODES, INVENTORY_WEBHOOK_EVENTS, INVENTORY_WEBHOOK_ENVELOPE_FIELDS, INVENTORY_WEBHOOK_LIMIT, INVENTORY_LIST_LIMIT_MAX, LOCATION_TYPES, STOCK_MOVEMENT_TYPES, STOCK_MOVEMENT_SOURCES, STOCK_CONDITIONS, STOCK_CHANGE_CAUSES, WEBHOOK_DELIVERY_STATUSES, INVENTORY_WARNING_CODES, STOCK_KINDS, STOCK_LOSS_REASONS, WITHDRAWAL_TYPES, LANDED_COST_TYPES, LANDED_COST_ALLOCATIONS, RESERVATION_STATUSES, INVENTORY_IDEMPOTENCY_KEY_MAX, RESERVATION_MINUTES_MIN, RESERVATION_MINUTES_MAX, VARIANT_ATTRIBUTES_MAX, VARIANT_VALUES_MAX, VARIANT_MATRIX_MAX, VARIANT_GROUP_ACTIVE_MAX, type InventoryEndpoint, type InventoryErrorCode, type InventoryRequestErrorCode, type InventoryWebhookEventType, type LocationType, type StockMovementType, type StockMovementSource, type StockCondition, type StockChangeCause, type WebhookDeliveryStatus, type InventoryWarningCode, type StockKind, type StockLossReason, type WithdrawalType, type LandedCostType, type LandedCostAllocation, type ReservationStatus, } from './vertrag.js';
@@ -2,7 +2,8 @@
2
2
  * `@kreiseck/kasseneck-api/inventory` – die Lager-API: Artikel, Standorte,
3
3
  * Bestand und Lagerprotokoll lesen, Konto-Webhooks verwalten und eingehende
4
4
  * Zustellungen pruefen (Backend Stufe 5a); Artikel anlegen und aendern,
5
- * Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0).
5
+ * Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0);
6
+ * Variantengruppen (Stufe 5c, seit 1.6.0).
6
7
  *
7
8
  * Ein eigener Unterpfad wie `invoice`: der `api_key` eines Kontos gehoert auf
8
9
  * einen **Server** (etwa das Backend eines Online-Shops) und soll nicht
@@ -16,5 +17,6 @@ export { inventoryKeyAuth } from './auth.js';
16
17
  export { isInventoryError, isInventoryErrorCode, inventoryErrorCode, inventoryFieldErrors, inventoryRetryAfterSec, inventoryShortfalls, isInventoryWarningCode, } from './fehler.js';
17
18
  export { createWebhook, deleteWebhook, getArticle, getStock, iterateArticles, iterateStock, iterateStockMovements, listArticles, listLocations, listStock, listStockMovements, listWebhookDeliveries, listWebhooks, lookupArticleByCode, rotateWebhookSecret, sendWebhookTest, updateWebhook, } from './endpunkte.js';
18
19
  export { changeStockCondition, createArticle, createReservation, deactivateArticle, extendReservation, getReservation, iterateReservations, listReservations, previewGoodsReceipt, receiveGoods, recordStockLoss, releaseReservation, reverseStockMovement, transferStock, updateArticle, } from './schreiben.js';
20
+ export { addVariant, createVariantGroup, getVariantGroup, iterateVariantGroups, listVariantGroups, updateVariantGroup, } from './varianten.js';
19
21
  export { verifyInventoryWebhookSignature, parseInventoryWebhookEvent, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, } from './webhook.js';
20
- export { INVENTORY_ENDPOINTS, INVENTORY_ERROR_CODES, INVENTORY_REQUEST_ERROR_CODES, INVENTORY_WEBHOOK_EVENTS, INVENTORY_WEBHOOK_ENVELOPE_FIELDS, INVENTORY_WEBHOOK_LIMIT, INVENTORY_LIST_LIMIT_MAX, LOCATION_TYPES, STOCK_MOVEMENT_TYPES, STOCK_MOVEMENT_SOURCES, STOCK_CONDITIONS, STOCK_CHANGE_CAUSES, WEBHOOK_DELIVERY_STATUSES, INVENTORY_WARNING_CODES, STOCK_KINDS, STOCK_LOSS_REASONS, WITHDRAWAL_TYPES, LANDED_COST_TYPES, LANDED_COST_ALLOCATIONS, RESERVATION_STATUSES, INVENTORY_IDEMPOTENCY_KEY_MAX, RESERVATION_MINUTES_MIN, RESERVATION_MINUTES_MAX, } from './vertrag.js';
22
+ export { INVENTORY_ENDPOINTS, INVENTORY_ERROR_CODES, INVENTORY_REQUEST_ERROR_CODES, INVENTORY_WEBHOOK_EVENTS, INVENTORY_WEBHOOK_ENVELOPE_FIELDS, INVENTORY_WEBHOOK_LIMIT, INVENTORY_LIST_LIMIT_MAX, LOCATION_TYPES, STOCK_MOVEMENT_TYPES, STOCK_MOVEMENT_SOURCES, STOCK_CONDITIONS, STOCK_CHANGE_CAUSES, WEBHOOK_DELIVERY_STATUSES, INVENTORY_WARNING_CODES, STOCK_KINDS, STOCK_LOSS_REASONS, WITHDRAWAL_TYPES, LANDED_COST_TYPES, LANDED_COST_ALLOCATIONS, RESERVATION_STATUSES, INVENTORY_IDEMPOTENCY_KEY_MAX, RESERVATION_MINUTES_MIN, RESERVATION_MINUTES_MAX, VARIANT_ATTRIBUTES_MAX, VARIANT_VALUES_MAX, VARIANT_MATRIX_MAX, VARIANT_GROUP_ACTIVE_MAX, } from './vertrag.js';
@@ -12,7 +12,7 @@
12
12
  * wenn der Server sie sendet: „fehlt“ heisst dort „kein Recht“, nicht „leer“.
13
13
  */
14
14
  import { KasseneckValidationError } from '../client/errors.js';
15
- import type { Article, GoodsReceiptPreviewLine, InventoryShortfall, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookTestDelivery, Location, Reservation, StockBelowMinimumEventData, StockChangedEventData, StockLevel, StockMovement, StockOperation, StockValue } from './typen.js';
15
+ import type { Article, GoodsReceiptPreviewLine, InventoryShortfall, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookTestDelivery, Location, Reservation, StockBelowMinimumEventData, StockChangedEventData, StockLevel, StockMovement, StockOperation, StockValue, VariantGroup } from './typen.js';
16
16
  type Roh = Record<string, unknown>;
17
17
  /** Ein Leser bekommt den Vorgang (fuer die Meldung) und den Pfad im Rumpf. */
18
18
  export interface Ort {
@@ -38,6 +38,12 @@ export declare function vorschauZeile(ort: Ort, w: unknown): GoodsReceiptPreview
38
38
  export declare function reservierung(ort: Ort, w: unknown): Reservation;
39
39
  /** Die fehlenden Positionen aus `insufficient_available` (`data.details[]`); ein kaputter Eintrag faellt weg. */
40
40
  export declare function fehlmengen(roh: unknown): InventoryShortfall[];
41
+ /**
42
+ * Eine Variantengruppe. `attributes` und `variants` sind zugesagte Listen:
43
+ * fehlen sie, ist die Antwort kaputt (eine leere Liste hiesse „keine Merkmale“
44
+ * bzw. „keine Varianten“).
45
+ */
46
+ export declare function variantengruppe(ort: Ort, w: unknown): VariantGroup;
41
47
  /** Eine zugesagte Liste `data.<feld>`, Eintrag fuer Eintrag gelesen. */
42
48
  export declare function liste<T>(name: string, daten: unknown, feld: string, lesen: (ort: Ort, e: unknown) => T): T[];
43
49
  /** Der Cursor der naechsten Seite; `null` am Ende. Etwas anderes als Text oder `null` ist kaputt. */
@@ -381,6 +381,80 @@ export function fehlmengen(roh) {
381
381
  }
382
382
  return raus;
383
383
  }
384
+ // ---- Varianten (Stufe 5c) ------------------------------------------------------------
385
+ /** Eine Liste von Texten (Werte eines Merkmals); etwas anderes ist kaputt. */
386
+ function textliste(ort, feld, w) {
387
+ if (!Array.isArray(w) || !w.every((x) => typeof x === 'string')) {
388
+ throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.${feld} ist keine Liste von Texten)`);
389
+ }
390
+ return [...w];
391
+ }
392
+ function merkmal(ort, w) {
393
+ const m = eintrag(ort, w);
394
+ return { key: kennung(ort, 'key', m.key), label: typeof m.label === 'string' ? m.label : '', values: textliste(ort, 'values', m.values) };
395
+ }
396
+ /**
397
+ * Vorgaben einer Gruppe: nur die Felder, die der Server sendet. Ein Preis als
398
+ * Bruchzahl ist kaputt (er fuellte sonst jede neue Variante falsch), ein Feld
399
+ * mit fremdem Typ ebenso.
400
+ */
401
+ function vorgaben(ort, w) {
402
+ if (w === undefined || w === null)
403
+ return {};
404
+ const v = objekt(w);
405
+ const vOrt = { name: ort.name, pfad: `${ort.pfad}.defaults` };
406
+ if (!v)
407
+ throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${vOrt.pfad} ist kein Objekt)`);
408
+ const raus = {};
409
+ if (v.unitPriceCents !== undefined && v.unitPriceCents !== null)
410
+ raus.unitPriceCents = ganzzahl(vOrt, 'unitPriceCents', v.unitPriceCents);
411
+ if (v.vatRate !== undefined && v.vatRate !== null) {
412
+ if (typeof v.vatRate !== 'number' || !Number.isFinite(v.vatRate))
413
+ throw antwortfehler(ort.name, `Antwort enthaelt keinen USt-Satz (data.${vOrt.pfad}.vatRate)`);
414
+ raus.vatRate = v.vatRate;
415
+ }
416
+ for (const feld of ['unit', 'groupId']) {
417
+ const t = v[feld];
418
+ if (t === undefined || t === null)
419
+ continue;
420
+ if (typeof t !== 'string')
421
+ throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${vOrt.pfad}.${feld} ist kein Text)`);
422
+ raus[feld] = t;
423
+ }
424
+ if (v.stockTracked !== undefined && v.stockTracked !== null) {
425
+ if (typeof v.stockTracked !== 'boolean')
426
+ throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${vOrt.pfad}.stockTracked ist kein Wahrheitswert)`);
427
+ raus.stockTracked = v.stockTracked;
428
+ }
429
+ return raus;
430
+ }
431
+ function mitglied(ort, w) {
432
+ const x = eintrag(ort, w);
433
+ return { articleId: kennung(ort, 'articleId', x.articleId), variantAttributes: textAbbildung(x.variantAttributes) ?? {} };
434
+ }
435
+ /**
436
+ * Eine Variantengruppe. `attributes` und `variants` sind zugesagte Listen:
437
+ * fehlen sie, ist die Antwort kaputt (eine leere Liste hiesse „keine Merkmale“
438
+ * bzw. „keine Varianten“).
439
+ */
440
+ export function variantengruppe(ort, w) {
441
+ const g = eintrag(ort, w);
442
+ for (const feld of ['attributes', 'variants']) {
443
+ if (!Array.isArray(g[feld]))
444
+ throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.${feld} ist keine Liste)`);
445
+ }
446
+ const unter = (feld, i) => ({ name: ort.name, pfad: `${ort.pfad}.${feld}[${i}]` });
447
+ return {
448
+ id: kennung(ort, 'id', g.id),
449
+ name: text(g.name),
450
+ attributes: g.attributes.map((m, i) => merkmal(unter('attributes', i), m)),
451
+ defaults: vorgaben(ort, g.defaults),
452
+ active: g.active !== false,
453
+ variants: g.variants.map((x, i) => mitglied(unter('variants', i), x)),
454
+ createdAt: text(g.createdAt),
455
+ updatedAt: text(g.updatedAt),
456
+ };
457
+ }
384
458
  // ---- Listen ------------------------------------------------------------------
385
459
  /** Eine zugesagte Liste `data.<feld>`, Eintrag fuer Eintrag gelesen. */
386
460
  export function liste(name, daten, feld, lesen) {
@@ -27,8 +27,29 @@
27
27
  * unlesbare Antwort) `outcome: 'unknown'`, nie `'rejected'`. Lesen und der
28
28
  * Probelauf (`previewGoodsReceipt`) bleiben `'rejected'`.
29
29
  */
30
- import type { InternerTransport } from '../client/aufrufe.js';
30
+ import type { ApiCall, InternerTransport } from '../client/aufrufe.js';
31
31
  import type { Article, ChangeStockConditionRequest, CreateArticleRequest, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptPreview, GoodsReceiptPreviewRequest, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationRequest, Reservation, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockOperation, TransferStockRequest, UpdateArticleRequest } from './typen.js';
32
+ type Params = Record<string, unknown>;
33
+ /** Die Anfrage als flache Kopie ohne `undefined`; der Aufrufer behaelt sein Objekt. Paketintern, auch fuer `varianten.ts`. */
34
+ export declare function anfrage(name: ApiCall, request: unknown): Params;
35
+ /**
36
+ * `idempotencyKey`: Text mit 1–120 Zeichen, nicht nur Leerraum. Er wird nie
37
+ * getrimmt oder gekuerzt: ein veraenderter Schluessel waere ein anderer.
38
+ */
39
+ export declare function schluessel(name: ApiCall, p: Params, { pflicht }: {
40
+ pflicht: boolean;
41
+ }): void;
42
+ /** Eine Ganzzahl (Tausendstel, Cent, Mikro-Euro); fehlt sie, nur wenn sie darf. `null` nur, wo es leert. */
43
+ export declare function ganz(name: ApiCall, feld: string, w: unknown, { pflicht, leerbar }?: {
44
+ pflicht?: boolean | undefined;
45
+ leerbar?: boolean | undefined;
46
+ }): void;
47
+ /**
48
+ * Zahlenfelder eines Artikels; `null` leert sie (bzw. heisst bei der Anlage
49
+ * „nicht angegeben“). `praefix` nennt die Stelle in der Anfrage (`variants[2].`).
50
+ */
51
+ export declare function artikelZahlen(name: ApiCall, p: Params, praefix?: string): void;
52
+ export declare const artikelAus: (name: ApiCall, daten: unknown) => Article;
32
53
  /**
33
54
  * Legt einen Artikel an. Mit `ean` ein Fremdartikel mit diesem Code (gueltige
34
55
  * Pruefziffer, frei im Konto), sonst vergibt der Server den naechsten eigenen
@@ -84,3 +105,4 @@ export declare function getReservation(transport: InternerTransport, reservation
84
105
  export declare function listReservations(transport: InternerTransport, query?: ReservationListQuery): Promise<ReservationPage>;
85
106
  /** Alle Reservierungen der Abfrage, Seite fuer Seite ueber `nextCursor`. */
86
107
  export declare function iterateReservations(transport: InternerTransport, query?: ReservationListQuery): AsyncGenerator<Reservation, void, undefined>;
108
+ export {};