@kreiseck/kasseneck-api 1.3.0 → 1.5.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 (88) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/README.md +293 -1
  3. package/dist/cjs/client/aufrufe.d.ts +2 -2
  4. package/dist/cjs/client/aufrufe.js +58 -0
  5. package/dist/cjs/inventory/api.d.ts +61 -0
  6. package/dist/cjs/inventory/api.js +54 -0
  7. package/dist/cjs/inventory/auth.d.ts +17 -0
  8. package/dist/cjs/inventory/auth.js +27 -0
  9. package/dist/cjs/inventory/endpunkte.d.ts +91 -0
  10. package/dist/cjs/inventory/endpunkte.js +290 -0
  11. package/dist/cjs/inventory/fehler.d.ts +43 -0
  12. package/dist/cjs/inventory/fehler.js +66 -0
  13. package/dist/cjs/inventory/index.d.ts +21 -0
  14. package/dist/cjs/inventory/index.js +94 -0
  15. package/dist/cjs/inventory/lesen.d.ts +45 -0
  16. package/dist/cjs/inventory/lesen.js +424 -0
  17. package/dist/cjs/inventory/schreiben.d.ts +83 -0
  18. package/dist/cjs/inventory/schreiben.js +315 -0
  19. package/dist/cjs/inventory/typen.d.ts +679 -0
  20. package/dist/cjs/inventory/typen.js +14 -0
  21. package/dist/cjs/inventory/vertrag.d.ts +136 -0
  22. package/dist/cjs/inventory/vertrag.js +291 -0
  23. package/dist/cjs/inventory/webhook.d.ts +52 -0
  24. package/dist/cjs/inventory/webhook.js +116 -0
  25. package/dist/cjs/invoice/index.d.ts +2 -2
  26. package/dist/cjs/invoice/index.js +2 -1
  27. package/dist/cjs/invoice/typen.d.ts +46 -2
  28. package/dist/cjs/invoice/vertrag.d.ts +19 -5
  29. package/dist/cjs/invoice/vertrag.js +37 -5
  30. package/dist/cjs/stored/vokabular.d.ts +1 -1
  31. package/dist/cjs/stored/vokabular.js +5 -3
  32. package/dist/cjs/version.d.ts +1 -1
  33. package/dist/cjs/version.js +1 -1
  34. package/dist/esm/client/aufrufe.d.ts +2 -2
  35. package/dist/esm/client/aufrufe.js +58 -0
  36. package/dist/esm/inventory/api.d.ts +61 -0
  37. package/dist/esm/inventory/api.js +51 -0
  38. package/dist/esm/inventory/auth.d.ts +17 -0
  39. package/dist/esm/inventory/auth.js +24 -0
  40. package/dist/esm/inventory/endpunkte.d.ts +91 -0
  41. package/dist/esm/inventory/endpunkte.js +267 -0
  42. package/dist/esm/inventory/fehler.d.ts +43 -0
  43. package/dist/esm/inventory/fehler.js +57 -0
  44. package/dist/esm/inventory/index.d.ts +21 -0
  45. package/dist/esm/inventory/index.js +20 -0
  46. package/dist/esm/inventory/lesen.d.ts +45 -0
  47. package/dist/esm/inventory/lesen.js +404 -0
  48. package/dist/esm/inventory/schreiben.d.ts +83 -0
  49. package/dist/esm/inventory/schreiben.js +298 -0
  50. package/dist/esm/inventory/typen.d.ts +679 -0
  51. package/dist/esm/inventory/typen.js +13 -0
  52. package/dist/esm/inventory/vertrag.d.ts +136 -0
  53. package/dist/esm/inventory/vertrag.js +288 -0
  54. package/dist/esm/inventory/webhook.d.ts +52 -0
  55. package/dist/esm/inventory/webhook.js +107 -0
  56. package/dist/esm/invoice/index.d.ts +2 -2
  57. package/dist/esm/invoice/index.js +1 -1
  58. package/dist/esm/invoice/typen.d.ts +46 -2
  59. package/dist/esm/invoice/vertrag.d.ts +19 -5
  60. package/dist/esm/invoice/vertrag.js +36 -4
  61. package/dist/esm/stored/vokabular.d.ts +1 -1
  62. package/dist/esm/stored/vokabular.js +5 -3
  63. package/dist/esm/version.d.ts +1 -1
  64. package/dist/esm/version.js +1 -1
  65. package/fixtures/hobex-hps-codes.json +1 -1
  66. package/fixtures/invoice-api-examples/credit-error-reservation.json +26 -0
  67. package/fixtures/invoice-api-examples/issue-error-reservation-article.json +25 -0
  68. package/fixtures/invoice-api-examples/issue-error-vat-id-risk.json +26 -0
  69. package/fixtures/invoice-api-examples/issue-reservation.json +24 -0
  70. package/fixtures/invoice-api-examples/issue-vat-id-risk.json +28 -0
  71. package/fixtures/invoice-api.schema.json +15 -2
  72. package/fixtures/invoice-texts.json +1 -1
  73. package/fixtures/pos-texts.json +1 -1
  74. package/fixtures/surface.json +306 -5
  75. package/fixtures/v3/README.md +9 -1
  76. package/fixtures/v3/antworten/belege.json +2 -2
  77. package/fixtures/v3/antworten/belegmail.json +2 -2
  78. package/fixtures/v3/antworten/kasse-belege.json +2 -2
  79. package/fixtures/v3/antworten/kasse.json +3 -3
  80. package/fixtures/v3/antworten/lager.json +3881 -0
  81. package/fixtures/v3/antworten/rechnungen.json +267 -44
  82. package/fixtures/v3/antworten/storno.json +2 -2
  83. package/fixtures/v3/stored/belege.json +2 -2
  84. package/fixtures/v3/stored/kasse.json +404 -4
  85. package/fixtures/v3/stored/rechnungen.json +174 -18
  86. package/fixtures/v3/v3-vokabular.json +1007 -20
  87. package/fixtures/v3/zahlbetrag-faelle.json +2 -2
  88. package/package.json +14 -2
@@ -0,0 +1,679 @@
1
+ /**
2
+ * Die Modelle der Lager-API, so wie sie am Draht `/v3` stehen.
3
+ *
4
+ * **Ganzzahlen mit fester Skala:** Mengen in Tausendstel der Basiseinheit
5
+ * (`1000` = 1 Stueck, `250` = 0,250 kg), Geld in Cent, Einkaufspreise in
6
+ * Mikro-Euro (`1_000_000` = 1 €). Nichts davon wird geteilt oder gerundet;
7
+ * eine Bruchzahl in einer Antwort ist ein Antwortfehler
8
+ * (`KasseneckValidationError`, `scope: 'response'`), nie ein Ersatzwert.
9
+ *
10
+ * Zeitpunkte sind ISO 8601 in UTC (`2026-10-06T08:15:00.000Z`), Tage (Wiener
11
+ * Tag) `YYYY-MM-DD`.
12
+ */
13
+ import type { InventoryWarningCode, InventoryWebhookEventType, LandedCostAllocation, LandedCostType, LocationType, ReservationStatus, StockChangeCause, StockCondition, StockKind, StockLossReason, StockMovementSource, StockMovementType, WebhookDeliveryStatus, WithdrawalType } from './vertrag.js';
14
+ /**
15
+ * Ein Artikel, wie `getArticle`, `listArticles`, `lookupArticleByCode` und die
16
+ * Ereignisse `article.*` ihn senden.
17
+ *
18
+ * Optionale Felder fehlen ganz, wenn der Server sie nicht sendet:
19
+ * `purchasePriceMicros` nur mit dem Recht `costs` (Konto-Schalter
20
+ * `lagerApi.kosten`, sonst fehlt das Feld, nicht `null`), `externalIds`,
21
+ * `metadata`, `variantGroupId` und `variantAttributes` nur, wenn der Artikel
22
+ * sie traegt.
23
+ */
24
+ export interface Article {
25
+ id: string;
26
+ name: string | null;
27
+ /** Beschreibung (bis 2000 Zeichen); `null` = keine. Seit 1.5.0. */
28
+ description: string | null;
29
+ unitPriceCents: number | null;
30
+ /** USt-Satz in Prozent, z. B. `20`, `10`, `4.9`. */
31
+ vatRate: number | null;
32
+ unit: string | null;
33
+ number: string | null;
34
+ ean: string | null;
35
+ internalCode: string | null;
36
+ groupId: string | null;
37
+ revenueGroupId: string | null;
38
+ stockTracked: boolean;
39
+ /**
40
+ * `quantity` (Menge) oder `serial` (Einzelstueck); `null`, wenn der Server
41
+ * das Feld nicht sendet (vor Stufe 5b). Ein Wert, den diese Paketversion
42
+ * nicht kennt, bleibt als Text stehen. Seit 1.5.0.
43
+ */
44
+ stockKind: StockKind | (string & {}) | null;
45
+ /** Standorte, an denen der Artikel gefuehrt wird; leer = nur der Standard-Standort. */
46
+ stockLocationIds: string[];
47
+ /**
48
+ * **Altfeld.** Mindestbestand des Artikels in Tausendstel; `null` = keiner.
49
+ * Er loest nichts aus: Warnungen, `belowMinimum` und `stock.below_minimum`
50
+ * richten sich nach [minStockByLocation].
51
+ */
52
+ minStock: number | null;
53
+ /**
54
+ * Mindestbestand je Standort in Tausendstel (`{ haupt: 20000 }`), die
55
+ * Schwelle fuer `below_minimum`, gemessen am verfuegbaren Bestand
56
+ * (`onHand − reserved`). Leer = keiner. Seit 1.5.0.
57
+ */
58
+ minStockByLocation: Record<string, number>;
59
+ active: boolean;
60
+ externalIds?: Record<string, string>;
61
+ metadata?: Record<string, string>;
62
+ variantGroupId?: string;
63
+ variantAttributes?: Record<string, string>;
64
+ createdAt: string | null;
65
+ updatedAt: string | null;
66
+ /**
67
+ * Einkaufspreis je Basiseinheit in Mikro-Euro (Wiederbeschaffungs- vor
68
+ * letztem vor Standard-Einkaufspreis); `null` = keiner hinterlegt. Fehlt
69
+ * ganz ohne das Recht `costs`.
70
+ */
71
+ purchasePriceMicros?: number | null;
72
+ }
73
+ export interface ArticleListQuery {
74
+ /**
75
+ * Nur Artikel, die seitdem geaendert wurden (inklusive). Die Liste ist nach
76
+ * `updatedAt` aufsteigend sortiert: wer sich das `updatedAt` des letzten
77
+ * Treffers merkt und damit wieder fragt, verliert nichts.
78
+ */
79
+ updatedSince?: string | Date;
80
+ groupId?: string;
81
+ variantGroupId?: string;
82
+ active?: boolean;
83
+ stockTracked?: boolean;
84
+ /** 1–200, Vorgabe des Servers 50. */
85
+ limit?: number;
86
+ /** `nextCursor` der vorigen Seite. */
87
+ cursor?: string;
88
+ }
89
+ export interface ArticlePage {
90
+ articles: Article[];
91
+ /** `null` = letzte Seite. */
92
+ nextCursor: string | null;
93
+ }
94
+ /** Ein Artikel per Code (`number`, `ean`, `internalCode`) oder per eigener Kennung. */
95
+ export type ArticleLookup = string | {
96
+ code: string;
97
+ } | {
98
+ externalSystem: string;
99
+ externalId: string;
100
+ };
101
+ export interface LocationAddress {
102
+ street: string | null;
103
+ zip: string | null;
104
+ city: string | null;
105
+ country: string | null;
106
+ }
107
+ export interface Location {
108
+ id: string;
109
+ name: string;
110
+ /** `null`: ein Typ, den diese Paketversion nicht kennt. */
111
+ type: LocationType | null;
112
+ address: LocationAddress | null;
113
+ /** Kennzeichen, nur bei `vehicle`. */
114
+ licensePlate: string | null;
115
+ /** `false` = aufgeloest. */
116
+ active: boolean;
117
+ /** `true` = Hauptstandort, den der Server ohne eigenes Dokument ergaenzt. */
118
+ virtual: boolean;
119
+ }
120
+ /** Bestand eines Artikels an einem Standort, Mengen in Tausendstel. */
121
+ export interface StockLevel {
122
+ articleId: string;
123
+ locationId: string;
124
+ /** Verkaufbare Menge am Standort. */
125
+ onHand: number;
126
+ /** Reserviert (Checkout im Shop). */
127
+ reserved: number;
128
+ /** `onHand - reserved`, vom Server gerechnet; darf negativ sein (die Kasse verkauft trotzdem). */
129
+ available: number;
130
+ defective: number;
131
+ /**
132
+ * Steigt bei jedem Schreiben dieses Bestands um 1. Einen gespeicherten Stand
133
+ * nur ueberschreiben, wenn `sequence` groesser ist: so richten doppelte oder
134
+ * verspaetete Ereignisse nichts an.
135
+ */
136
+ sequence: number;
137
+ updatedAt: string | null;
138
+ }
139
+ /** Lagerwert eines Artikels, nur mit dem Recht `costs`. */
140
+ export interface StockValue {
141
+ articleId: string;
142
+ stockValueCents: number;
143
+ /** Durchschnittlicher Einstandspreis je Basiseinheit in Mikro-Euro; `null` bei Menge 0. */
144
+ averageCostMicros: number | null;
145
+ }
146
+ export interface StockResult {
147
+ stock: StockLevel[];
148
+ /** `null` ohne das Recht `costs` (der Server laesst das Feld weg), sonst die Werte. */
149
+ values: StockValue[] | null;
150
+ }
151
+ export interface StockListQuery {
152
+ locationId?: string;
153
+ articleId?: string;
154
+ /**
155
+ * `true`: nur Zeilen, deren verfuegbarer Bestand (`available = onHand − reserved`)
156
+ * unter dem Mindestbestand ihres Standorts liegt (dieselbe Regel wie
157
+ * `stock.below_minimum`; `minStock` des Artikels zaehlt nicht).
158
+ */
159
+ belowMinimum?: boolean;
160
+ /** Nur Zeilen, die sich seitdem geaendert haben (inklusive), nach `updatedAt` aufsteigend. */
161
+ changedSince?: string | Date;
162
+ limit?: number;
163
+ cursor?: string;
164
+ }
165
+ export interface StockPage extends StockResult {
166
+ nextCursor: string | null;
167
+ }
168
+ export interface StockMovementLot {
169
+ lotId: string | null;
170
+ quantity: number;
171
+ expiresOn: string | null;
172
+ batch: string | null;
173
+ serialNumber: string | null;
174
+ receivedAt: string | null;
175
+ /** Nur mit dem Recht `costs`. */
176
+ valueCents?: number | null;
177
+ }
178
+ export interface StockMovementSourceRef {
179
+ type: StockMovementSource | (string & {}) | null;
180
+ /** Kennung des Belegs, der Rechnung o. Ae. */
181
+ id: string | null;
182
+ /** Kasse, an der verkauft wurde. */
183
+ register: string | null;
184
+ /** Position im Beleg bzw. in der Rechnung. */
185
+ position: number | null;
186
+ }
187
+ /** Eine Zeile des Lagerprotokolls; neueste zuerst. */
188
+ export interface StockMovement {
189
+ id: string;
190
+ type: StockMovementType | (string & {}) | null;
191
+ articleId: string | null;
192
+ locationId: string | null;
193
+ condition: StockCondition | (string & {}) | null;
194
+ /** Mengenaenderung in Tausendstel (Abgang negativ); bei `reservation` immer 0. */
195
+ quantityDelta: number;
196
+ /**
197
+ * Aenderung von `reserved` in Tausendstel: positiv beim Reservieren, negativ
198
+ * bei Freigabe, Ablauf und Einloesen; 0 bei allen anderen Bewegungen. Seit 1.5.0.
199
+ */
200
+ reservedDelta: number;
201
+ /**
202
+ * Bestand am Standort nach der Bewegung. `reserved` steht nur an
203
+ * Reservierungsbewegungen, sonst `null` (nicht erfasst, nicht „0“).
204
+ */
205
+ stockAfter: {
206
+ sellable: number;
207
+ defective: number;
208
+ reserved: number | null;
209
+ } | null;
210
+ operationId: string | null;
211
+ source: StockMovementSourceRef | null;
212
+ /** Wiener Tag `YYYY-MM-DD`. */
213
+ viennaDay: string | null;
214
+ time: string | null;
215
+ lots: StockMovementLot[];
216
+ /** Nur mit dem Recht `costs`. */
217
+ valueDeltaCents?: number | null;
218
+ /** Nur mit dem Recht `costs`. */
219
+ consumedValueCents?: number | null;
220
+ }
221
+ export interface StockMovementQuery {
222
+ /** Nur nach `articleId` **oder** `locationId` filtern, nicht beides. */
223
+ articleId?: string;
224
+ locationId?: string;
225
+ from?: string | Date;
226
+ to?: string | Date;
227
+ type?: StockMovementType;
228
+ source?: StockMovementSource;
229
+ limit?: number;
230
+ cursor?: string;
231
+ }
232
+ export interface StockMovementPage {
233
+ movements: StockMovement[];
234
+ nextCursor: string | null;
235
+ }
236
+ export interface InventoryWebhook {
237
+ id: string;
238
+ url: string;
239
+ events: (InventoryWebhookEventType | (string & {}))[];
240
+ active: boolean;
241
+ description: string | null;
242
+ createdAt: string | null;
243
+ /** Die letzte Zustellung; `null`, solange keine versucht wurde. */
244
+ lastDelivery: {
245
+ at: string | null;
246
+ status: WebhookDeliveryStatus | (string & {}) | null;
247
+ statusCode: number | null;
248
+ } | null;
249
+ /** Fehlversuche in Folge (wie bei Partner-Webhooks); steigt der Wert, stimmt beim Empfaenger etwas nicht. */
250
+ consecutiveFailures: number;
251
+ }
252
+ export interface CreateInventoryWebhookOptions {
253
+ /** Vollstaendige `https://`-Adresse, hoechstens 500 Zeichen. */
254
+ url: string;
255
+ /** Mindestens eines. */
256
+ events: (InventoryWebhookEventType | (string & {}))[];
257
+ /** Hoechstens 120 Zeichen. */
258
+ description?: string;
259
+ }
260
+ export interface InventoryWebhookPatch {
261
+ url?: string;
262
+ events?: (InventoryWebhookEventType | (string & {}))[];
263
+ active?: boolean;
264
+ /** `null` loescht die Beschreibung. */
265
+ description?: string | null;
266
+ }
267
+ export interface InventoryWebhookWithSecret {
268
+ webhook: InventoryWebhook;
269
+ /**
270
+ * Das Secret fuer [verifyInventoryWebhookSignature]. **Es kommt genau einmal**, bei
271
+ * `createWebhook` bzw. `rotateWebhookSecret`; danach gibt der Server es nie
272
+ * wieder aus. Nach einem Wechsel gilt sofort nur das neue.
273
+ */
274
+ secret: string;
275
+ }
276
+ export interface InventoryWebhookList {
277
+ webhooks: InventoryWebhook[];
278
+ /** Die Ereignisse, die dieses Konto abonnieren kann. */
279
+ events: string[];
280
+ }
281
+ export interface InventoryWebhookTestDelivery {
282
+ /** Kennung der Zustellung (Kopfzeile `X-Kasseneck-Delivery`), wie bei Partner-Webhooks. */
283
+ deliveryId: string;
284
+ webhookId: string;
285
+ status: WebhookDeliveryStatus | (string & {}) | null;
286
+ statusCode: number | null;
287
+ }
288
+ export interface InventoryWebhookTestResult {
289
+ eventId: string;
290
+ event: string;
291
+ deliveries: InventoryWebhookTestDelivery[];
292
+ }
293
+ export interface InventoryWebhookDelivery {
294
+ /** Kennung der Zustellung (Kopfzeile `X-Kasseneck-Delivery`), wie bei Partner-Webhooks. */
295
+ deliveryId: string;
296
+ webhookId: string | null;
297
+ event: string | null;
298
+ eventId: string | null;
299
+ /** `dropped`: der Webhook wurde vor der Faelligkeit deaktiviert oder geloescht. */
300
+ status: WebhookDeliveryStatus | (string & {}) | null;
301
+ attempts: number;
302
+ statusCode: number | null;
303
+ /** Auszug der Antwort des Empfaengers, hoechstens 500 Zeichen. */
304
+ response: string | null;
305
+ error: string | null;
306
+ createdAt: string | null;
307
+ lastAttemptAt: string | null;
308
+ nextAttemptAt: string | null;
309
+ test: boolean;
310
+ }
311
+ /** Nutzlast von `stock.changed`: der aktuelle Stand, nicht die Aenderung. */
312
+ export interface StockChangedEventData extends StockLevel {
313
+ cause: StockChangeCause | (string & {});
314
+ /** Die Bewegung, aus der `cause` stammt; `null` bei `other` ohne Bewegung. */
315
+ movementId: string | null;
316
+ }
317
+ /** Nutzlast von `stock.below_minimum`: nur beim Unterschreiten, nicht bei jedem weiteren Sinken. */
318
+ export interface StockBelowMinimumEventData {
319
+ articleId: string;
320
+ locationId: string;
321
+ /** Verfuegbarer Bestand (`onHand − reserved`); eine Reservierung allein kann ausloesen. */
322
+ available: number;
323
+ /**
324
+ * Der Mindestbestand des Standorts in Tausendstel (`minStockByLocation`) –
325
+ * die unterschrittene Schwelle, gemessen an `available`. Der `minStock` des
326
+ * Artikels allein loest nie aus.
327
+ */
328
+ minStock: number;
329
+ }
330
+ export interface InventoryWebhookEnvelope<T extends InventoryWebhookEventType, D> {
331
+ /** `evt_…`: darauf entdoppeln. */
332
+ id: string;
333
+ type: T;
334
+ /** Millisekunden seit 1970 (UTC). */
335
+ createdAt: number;
336
+ /** Das Konto, dessen Lager das Ereignis betrifft. */
337
+ accountId: string;
338
+ /**
339
+ * `true` nur bei einer Probe aus `sendWebhookTest` (erfundene Nutzlast).
340
+ * An den Anfang jedes Handlers: `if (event.test) return;`
341
+ */
342
+ test: boolean;
343
+ data: D;
344
+ }
345
+ export type InventoryWebhookEvent = InventoryWebhookEnvelope<'stock.changed', StockChangedEventData> | InventoryWebhookEnvelope<'stock.below_minimum', StockBelowMinimumEventData> | InventoryWebhookEnvelope<'article.created', Article> | InventoryWebhookEnvelope<'article.updated', Article> | InventoryWebhookEnvelope<'article.deactivated', Article> | InventoryWebhookEnvelope<'reservation.expired', Reservation> | InventoryWebhookEnvelope<'reservation.released', Reservation> | InventoryWebhookEnvelope<'reservation.redeemed', Reservation>;
346
+ /**
347
+ * Die Felder eines Artikels beim Anlegen. Bei der Anlage heisst `null` „nicht
348
+ * angegeben“ (ausser bei `name`, der Pflicht ist).
349
+ */
350
+ export interface ArticleInput {
351
+ /** 1–200 Zeichen, getrimmt gespeichert. */
352
+ name: string;
353
+ /** Bis 2000 Zeichen. */
354
+ description?: string | null;
355
+ unitPriceCents?: number | null;
356
+ /** USt-Satz in Prozent (`20`, `13`, `10`, `4.9`, `0`, `19`). */
357
+ vatRate?: number | null;
358
+ /** 1–20 Zeichen; ohne Angabe die Vorgabe des Kontos. */
359
+ unit?: string | null;
360
+ /** Artikelnummer, 1–64 Zeichen. */
361
+ number?: string | null;
362
+ /**
363
+ * GTIN/EAN mit gueltiger Pruefziffer: der Artikel wird ein Fremdartikel mit
364
+ * diesem Code. Ohne `ean` vergibt der Server einen eigenen Code nach den
365
+ * Einstellungen des Kontos (`internalCode`). Ein Code, der schon einem
366
+ * anderen Artikel gehoert, ergibt `code_taken`.
367
+ */
368
+ ean?: string | null;
369
+ /** Artikelgruppe; unbekannt = `group_not_found`. */
370
+ groupId?: string | null;
371
+ /** Erloesgruppe; unbekannt = `revenue_group_not_found`. */
372
+ revenueGroupId?: string | null;
373
+ stockTracked?: boolean | null;
374
+ /** Hoechstens 50 Standorte; unbekannt = `location_not_found`. */
375
+ stockLocationIds?: string[] | null;
376
+ /** **Altfeld** ohne Wirkung auf Meldungen; Tausendstel in ganzen Einheiten (Vielfaches von 1000). */
377
+ minStock?: number | null;
378
+ /** Mindestbestand je Standort in Tausendstel, hoechstens 50 Standorte. */
379
+ minStockByLocation?: Record<string, number | null> | null;
380
+ stockKind?: StockKind | null;
381
+ /**
382
+ * Standard-Einkaufspreis je Basiseinheit in Mikro-Euro. Nur mit dem
383
+ * Konto-Recht `costs`, sonst `inventory_api_not_enabled` mit
384
+ * `errors: [{ field: 'purchasePriceMicros' }]`.
385
+ */
386
+ purchasePriceMicros?: number | null;
387
+ /**
388
+ * Eigene Kennungen je System (`{ shop: '1001' }`): hoechstens 10 Systeme
389
+ * `^[a-z0-9_]{1,32}$`, Werte 1–128 Zeichen, je System und Wert eindeutig im
390
+ * Konto (`external_id_taken`). Damit findet `lookupArticleByCode` den Artikel.
391
+ */
392
+ externalIds?: Record<string, string> | null;
393
+ /** Freie Merkmale, nie ausgewertet: hoechstens 20 Schluessel `^[a-zA-Z0-9_]{1,40}$`, Werte bis 500 Zeichen, zusammen 4 KB. */
394
+ metadata?: Record<string, string> | null;
395
+ }
396
+ export interface CreateArticleRequest extends ArticleInput {
397
+ idempotencyKey: string;
398
+ }
399
+ /**
400
+ * Eine Aenderung: nur die genannten Felder, mindestens eines. `null` leert ein
401
+ * optionales Feld (`description`, `unitPriceCents`, `vatRate`, `number`,
402
+ * `groupId`, `revenueGroupId`, `minStock`, `stockLocationIds`, `externalIds`,
403
+ * `metadata`, `minStockByLocation`, `purchasePriceMicros`). `name`, `unit`,
404
+ * `ean`, `stockTracked` und `stockKind` lassen sich nicht leeren.
405
+ *
406
+ * `externalIds` und `metadata` werden ganz ersetzt, `minStockByLocation` je
407
+ * Standort zusammengefuehrt (`{ haupt: null }` nimmt nur diesen Standort weg).
408
+ * Die EAN laesst sich nur bei Fremdartikeln wechseln; `stockKind` nach der
409
+ * ersten Bewegung nicht mehr (`stock_kind_locked`). Ein stillgelegter Artikel
410
+ * ergibt `article_inactive`.
411
+ */
412
+ export interface UpdateArticleRequest {
413
+ idempotencyKey: string;
414
+ articleId: string;
415
+ name?: string;
416
+ description?: string | null;
417
+ unitPriceCents?: number | null;
418
+ vatRate?: number | null;
419
+ unit?: string;
420
+ number?: string | null;
421
+ ean?: string;
422
+ groupId?: string | null;
423
+ revenueGroupId?: string | null;
424
+ stockTracked?: boolean;
425
+ stockLocationIds?: string[] | null;
426
+ minStock?: number | null;
427
+ minStockByLocation?: Record<string, number | null> | null;
428
+ stockKind?: StockKind;
429
+ purchasePriceMicros?: number | null;
430
+ externalIds?: Record<string, string> | null;
431
+ metadata?: Record<string, string> | null;
432
+ }
433
+ /**
434
+ * Stilllegen: `active: false`; Code und eigene Kennungen werden frei. Schon
435
+ * stillgelegt = dieselbe Antwort, nichts geschrieben. Den Bestand behaelt der
436
+ * Artikel, gebucht werden darf weiter.
437
+ */
438
+ export interface DeactivateArticleRequest {
439
+ idempotencyKey: string;
440
+ articleId: string;
441
+ }
442
+ /** Ein Hinweis einer Buchung: sie hat gewirkt, es gibt nur etwas zu wissen. */
443
+ export interface InventoryWarning {
444
+ code: InventoryWarningCode | (string & {});
445
+ articleId: string | null;
446
+ locationId: string | null;
447
+ /** Fuer Menschen, deutsch; nie darauf verzweigen. */
448
+ message: string;
449
+ }
450
+ /**
451
+ * Antwort jeder Buchung (`receiveGoods`, `transferStock`, `recordStockLoss`,
452
+ * `changeStockCondition`, `reverseStockMovement`). Werte traegt sie nie. Eine
453
+ * Wiederholung mit demselben `idempotencyKey` liefert genau diese Antwort
454
+ * noch einmal (ohne Kennzeichen, die beiden sind gleich).
455
+ */
456
+ export interface StockOperation {
457
+ /** Kennung des Vorgangs; `reverseStockMovement` nimmt ihn zurueck. */
458
+ operationId: string;
459
+ movementIds: string[];
460
+ lotIds: string[];
461
+ warnings: InventoryWarning[];
462
+ }
463
+ /** Eine Position eines Wareneingangs. */
464
+ export interface GoodsReceiptItem {
465
+ articleId: string;
466
+ /** Tausendstel, groesser als 0. */
467
+ quantity: number;
468
+ /** Gesamtpreis der Position in Cent. Entweder dieser oder `unitPriceMicros`; ohne beide der Einkaufspreis des Artikels. */
469
+ totalCents?: number;
470
+ /** Einzelpreis je Basiseinheit in Mikro-Euro. */
471
+ unitPriceMicros?: number;
472
+ /** Nebenkosten dieser Position in Cent; gilt nur bei `allocation: 'manual'`. */
473
+ landedCostCents?: number;
474
+ /** Ablaufdatum `YYYY-MM-DD`. */
475
+ expiresOn?: string;
476
+ /** Charge, 1–64 Zeichen. */
477
+ batch?: string;
478
+ /** Seriennummern (Einzelstuecke), hoechstens 80, je 1–128 Zeichen. */
479
+ serialNumbers?: string[];
480
+ }
481
+ export interface LandedCost {
482
+ type: LandedCostType;
483
+ /** Betrag in Cent; `discount` und `cash_discount` mindern den Wert. */
484
+ amountCents: number;
485
+ }
486
+ /**
487
+ * Wareneingang. Preise und Nebenkosten darf jeder Schreibende senden (so
488
+ * bekommt der Bestand seinen Wert); zurueck kommen Werte nur mit dem Recht
489
+ * `costs` und nur in der Vorschau ([previewGoodsReceipt]).
490
+ */
491
+ export interface ReceiveGoodsRequest {
492
+ idempotencyKey: string;
493
+ /** Hoechstens 80 Positionen (`too_many_positions`). */
494
+ items: GoodsReceiptItem[];
495
+ /** Ohne Angabe der Standard-Standort des Kontos. */
496
+ locationId?: string;
497
+ /** Hoechstens 20. */
498
+ landedCosts?: LandedCost[];
499
+ allocation?: LandedCostAllocation;
500
+ supplier?: {
501
+ name: string;
502
+ address?: string;
503
+ };
504
+ /** Lieferschein o. Ae., 1–80 Zeichen. */
505
+ reference?: string;
506
+ /** 1–500 Zeichen. */
507
+ note?: string;
508
+ }
509
+ /**
510
+ * Vorschau eines Wareneingangs (`dryRun: true`): schreibt nichts, der
511
+ * Schluessel ist freigestellt (wenn da, wird nur seine Form geprueft), das
512
+ * Schreibrecht braucht sie trotzdem. Den Standort prueft erst die Buchung.
513
+ */
514
+ export type GoodsReceiptPreviewRequest = Omit<ReceiveGoodsRequest, 'idempotencyKey'> & {
515
+ idempotencyKey?: string;
516
+ };
517
+ /**
518
+ * Eine Zeile der Vorschau. Die vier Werte (`baseCents`, `landedCostCents`,
519
+ * `valueCents`, `unitCostMicros`) kommen nur mit dem Recht `costs` und fehlen
520
+ * sonst ganz.
521
+ */
522
+ export interface GoodsReceiptPreviewLine {
523
+ articleId: string;
524
+ quantity: number;
525
+ expiresOn: string | null;
526
+ batch: string | null;
527
+ serialNumbers: string[];
528
+ /** `true`: der Preis kam aus dem Artikel, nicht aus der Anfrage. */
529
+ priceFromArticle: boolean;
530
+ baseCents?: number | null;
531
+ landedCostCents?: number | null;
532
+ valueCents?: number | null;
533
+ unitCostMicros?: number | null;
534
+ }
535
+ export interface GoodsReceiptPreview {
536
+ preview: GoodsReceiptPreviewLine[];
537
+ }
538
+ /** Eine Position von Umbuchung, Abgang oder Zustandswechsel. */
539
+ export interface StockItem {
540
+ articleId: string;
541
+ /** Tausendstel, groesser als 0. */
542
+ quantity: number;
543
+ /** Bei Einzelstuecken das Stueck. */
544
+ serialNumber?: string;
545
+ }
546
+ /** Umbuchung zwischen zwei Standorten. Ueberzieht nie (`exceeds_stock`). */
547
+ export interface TransferStockRequest {
548
+ idempotencyKey: string;
549
+ fromLocationId: string;
550
+ toLocationId: string;
551
+ items: StockItem[];
552
+ note?: string;
553
+ }
554
+ /**
555
+ * Abgang (Bruch, Schwund, Entnahme …). Ueberzieht nie (`exceeds_stock`).
556
+ * `reason: 'other'` braucht `note` (`note_required`), `reason: 'withdrawal'`
557
+ * braucht `withdrawalType` (`withdrawal_type_required`).
558
+ */
559
+ export interface RecordStockLossRequest {
560
+ idempotencyKey: string;
561
+ reason: StockLossReason;
562
+ withdrawalType?: WithdrawalType;
563
+ /** Aus welchem Zustand; Vorgabe `sellable`. */
564
+ condition?: StockCondition;
565
+ locationId?: string;
566
+ items: StockItem[];
567
+ note?: string;
568
+ }
569
+ /** Ware zwischen verkaufbar und defekt umbuchen. Ueberzieht nie (`exceeds_stock`). */
570
+ export interface ChangeStockConditionRequest {
571
+ idempotencyKey: string;
572
+ from: StockCondition;
573
+ to: StockCondition;
574
+ locationId?: string;
575
+ items: StockItem[];
576
+ note?: string;
577
+ }
578
+ /**
579
+ * Gegenbuchung: nimmt einen ganzen Vorgang zurueck. Verkaeufe und
580
+ * Reservierungen gehen so nicht (`reversal_not_supported`), ein zweites Mal
581
+ * auch nicht (`already_reversed`).
582
+ */
583
+ export interface ReverseStockMovementRequest {
584
+ idempotencyKey: string;
585
+ operationId: string;
586
+ /** Pflicht, bis 500 Zeichen; leer = `reason_required`. */
587
+ reason: string;
588
+ }
589
+ /**
590
+ * Eine Position einer Reservierung, Mengen in Tausendstel. Offen ist
591
+ * `quantity − redeemed − released`.
592
+ */
593
+ export interface ReservationItem {
594
+ articleId: string;
595
+ locationId: string;
596
+ quantity: number;
597
+ redeemed: number;
598
+ released: number;
599
+ }
600
+ /**
601
+ * Eine Reservierung, wie `getReservation`, jede schreibende Reservierungs-
602
+ * Antwort und die Ereignisse `reservation.*` sie senden.
603
+ */
604
+ export interface Reservation {
605
+ id: string;
606
+ /** `null`: ein Stand, den diese Paketversion nicht kennt, oder keiner. */
607
+ status: ReservationStatus | (string & {}) | null;
608
+ /** Eigene Referenz (Bestellnummer), `null` = keine. */
609
+ reference: string | null;
610
+ items: ReservationItem[];
611
+ /** Ablauf, ISO 8601 UTC. */
612
+ expiresAt: string | null;
613
+ createdAt: string | null;
614
+ }
615
+ export interface ReservationItemInput {
616
+ articleId: string;
617
+ /** Tausendstel, groesser als 0. */
618
+ quantity: number;
619
+ /** Ohne Angabe der Standard-Standort des Kontos. */
620
+ locationId?: string;
621
+ }
622
+ /**
623
+ * Reservieren (Checkout): ganz oder gar nicht. Fehlt verfuegbarer Bestand an
624
+ * einer Position, entsteht nichts und der Fehler `insufficient_available`
625
+ * nennt die fehlenden Positionen ([inventoryShortfalls]). Nur
626
+ * bestandsgefuehrte Artikel. Gleiche Artikel am gleichen Standort werden
627
+ * zusammengezaehlt.
628
+ */
629
+ export interface CreateReservationRequest {
630
+ idempotencyKey: string;
631
+ /** 1–50 Positionen. */
632
+ items: ReservationItemInput[];
633
+ /** 1–128 Zeichen; `listReservations({ reference })` findet sie damit. */
634
+ reference?: string | null;
635
+ /** 5 … 43 200 Minuten; ohne Angabe die Vorgabe des Kontos (7 Tage). */
636
+ expiresInMinutes?: number | null;
637
+ }
638
+ /** Verlaengern: neuer Ablauf = jetzt + Minuten. Nur eine aktive, noch nicht faellige Reservierung (`reservation_not_active`). */
639
+ export interface ExtendReservationRequest {
640
+ idempotencyKey: string;
641
+ reservationId: string;
642
+ /** 5 … 43 200 Minuten. */
643
+ expiresInMinutes: number;
644
+ }
645
+ export interface ReleaseReservationItem {
646
+ articleId: string;
647
+ locationId?: string;
648
+ /** Ohne Angabe der ganze offene Rest der Position. */
649
+ quantity?: number;
650
+ }
651
+ /** Freigeben: ohne `items` alles, sonst je Position (ganz oder teilweise). */
652
+ export interface ReleaseReservationRequest {
653
+ idempotencyKey: string;
654
+ reservationId: string;
655
+ /** Nicht leer; ganz weglassen, um alles freizugeben. */
656
+ items?: ReleaseReservationItem[];
657
+ }
658
+ export interface ReservationListQuery {
659
+ status?: ReservationStatus;
660
+ /** Genau diese Referenz. */
661
+ reference?: string;
662
+ /** 1–200, Vorgabe des Servers 50. */
663
+ limit?: number;
664
+ cursor?: string;
665
+ }
666
+ /** Neueste zuerst (`createdAt` absteigend). */
667
+ export interface ReservationPage {
668
+ reservations: Reservation[];
669
+ nextCursor: string | null;
670
+ }
671
+ /** Eine Position, fuer die beim Reservieren der verfuegbare Bestand nicht reicht (`insufficient_available`). */
672
+ export interface InventoryShortfall {
673
+ articleId: string;
674
+ locationId: string;
675
+ /** Angefragt, Tausendstel. */
676
+ requested: number;
677
+ /** Verfuegbar (`onHand − reserved`), Tausendstel; darf negativ sein. */
678
+ available: number;
679
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Die Modelle der Lager-API, so wie sie am Draht `/v3` stehen.
4
+ *
5
+ * **Ganzzahlen mit fester Skala:** Mengen in Tausendstel der Basiseinheit
6
+ * (`1000` = 1 Stueck, `250` = 0,250 kg), Geld in Cent, Einkaufspreise in
7
+ * Mikro-Euro (`1_000_000` = 1 €). Nichts davon wird geteilt oder gerundet;
8
+ * eine Bruchzahl in einer Antwort ist ein Antwortfehler
9
+ * (`KasseneckValidationError`, `scope: 'response'`), nie ein Ersatzwert.
10
+ *
11
+ * Zeitpunkte sind ISO 8601 in UTC (`2026-10-06T08:15:00.000Z`), Tage (Wiener
12
+ * Tag) `YYYY-MM-DD`.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });