@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
@@ -89,7 +89,20 @@ export interface InvoiceItemInput {
89
89
  /** Artikel aus dem Artikelstamm; bestandsgefuehrt bucht das Ausstellen ihn vom Lager ab. */
90
90
  articleId?: string;
91
91
  }
92
- /** Eine Gutschriftsposition: wie eine Rechnungsposition, dazu die Rueckgabe-Wahl. */
92
+ /**
93
+ * Eine Position beim Ausstellen (`issueInvoice`): dazu optional die
94
+ * Reservierung aus der Lager-API, die diese Position einloest.
95
+ */
96
+ export interface IssueInvoiceItemInput extends InvoiceItemInput {
97
+ /**
98
+ * Kennung aus `createReservation` (`./inventory`); braucht `articleId`.
99
+ * Geprueft beim Ausstellen (`reservation_not_found`, `reservation_mismatch`,
100
+ * `reservation_not_active`; abgelaufen = Hinweis `reservation_expired`),
101
+ * eingeloest beim Buchen der Rechnung am Lagerstandort der Rechnung.
102
+ */
103
+ reservationId?: string;
104
+ }
105
+ /** Eine Gutschriftsposition: wie eine Rechnungsposition (ohne Reservierung), dazu die Rueckgabe-Wahl. */
93
106
  export interface CreditNoteItemInput extends InvoiceItemInput {
94
107
  /** Wohin die Ware dieser Position geht; fehlt = Vorgabe des Aufrufs bzw. `restock`. */
95
108
  returnDisposition?: ReturnDisposition;
@@ -115,7 +128,7 @@ export interface IssueInvoiceRequest {
115
128
  paymentReference?: string;
116
129
  girocode?: boolean;
117
130
  tracking?: boolean;
118
- items: InvoiceItemInput[];
131
+ items: IssueInvoiceItemInput[];
119
132
  /** Eigene Merkmale (hoechstens 20), nie gedruckt. */
120
133
  metadata?: Record<string, string>;
121
134
  /** Sprache dieser Rechnung; sonst die des Kunden, sonst `de`. Eine Rechnung, eine Nummer, eine Sprache. */
@@ -130,6 +143,15 @@ export interface IssueInvoiceRequest {
130
143
  * Zahlungsinformationen und keinen Giro-QR.
131
144
  */
132
145
  payment?: PaymentInput;
146
+ /**
147
+ * Nur fuer Rechnungen ohne Steuer, die die UID des Kunden verlangen (ig.
148
+ * Lieferung, Reverse Charge): hat die UID-Pruefung noch kein Ergebnis
149
+ * (`vat_id_check_pending`), stellt `true` trotzdem aus. Der Aussteller traegt
150
+ * dann das Risiko, die Rechnung traegt `vatIdRisk`. Eine ungueltige UID
151
+ * (`vat_id_invalid`) sperrt auch damit. Gehoert nicht zur Anfrage im Sinn der
152
+ * Idempotenz: dieselbe Anfrage mit und ohne das Feld ist dieselbe Rechnung.
153
+ */
154
+ acceptVatIdRisk?: boolean;
133
155
  }
134
156
  /** Eine Zahlung, wie das Fremdsystem sie meldet. */
135
157
  export interface PaymentInput {
@@ -168,6 +190,8 @@ export interface InvoicePayment {
168
190
  export interface InvoiceNotice {
169
191
  code: InvoiceNoticeCode;
170
192
  message: string;
193
+ /** Bei `reservation_expired`: die abgelaufene Reservierung. */
194
+ reservationId?: string;
171
195
  }
172
196
  export interface RecordPaymentResult {
173
197
  invoice: Invoice;
@@ -238,6 +262,26 @@ export interface Invoice {
238
262
  paidCents: number;
239
263
  /** Was noch offen ist; `0` heisst bezahlt. */
240
264
  openCents: number;
265
+ /** Beim Festschreiben eingefrorener UID-Nachweis des Kunden; sonst `null`. */
266
+ vatIdProof: InvoiceVatIdProof | null;
267
+ /** Ohne Ergebnis der UID-Pruefung mit `acceptVatIdRisk` ausgestellt; sonst `null`. */
268
+ vatIdRisk: InvoiceVatIdRisk | null;
269
+ }
270
+ /** UID-Nachweis an einer Rechnung: gueltige Pruefung der Kunden-UID, hoechstens 30 Tage vor dem Festschreiben. */
271
+ export interface InvoiceVatIdProof {
272
+ /** Wiener Tag der Pruefung (`YYYY-MM-DD`). */
273
+ checkedOn: string;
274
+ /** Wer geprueft hat: FinanzOnline (Stufe 2 mit Name und Anschrift) oder VIES. */
275
+ source: 'finanzonline' | 'vies';
276
+ /** Stufe der Pruefung: 1 = nur UID, 2 = UID mit Name und Anschrift. */
277
+ level: 1 | 2;
278
+ /** Pruefcode fuer die oeffentliche Pruefseite (auf dem PDF als QR); `null`, wenn keiner vergeben wurde. */
279
+ code: string | null;
280
+ }
281
+ /** Ausgestellt ohne Ergebnis der UID-Pruefung, das Risiko traegt der Aussteller. */
282
+ export interface InvoiceVatIdRisk {
283
+ /** Wiener Tag der Bestaetigung (`YYYY-MM-DD`). */
284
+ acceptedOn: string;
241
285
  }
242
286
  /** Eine Marke des Kontos (Logo, Farbe, Absender) — `id` geht als `brandId` in `issueInvoice`. */
243
287
  export interface Brand {
@@ -27,7 +27,7 @@ export type InvoiceEndpoint = (typeof INVOICE_ENDPOINTS)[number];
27
27
  * Stabile Fehlercodes. Das Fremdsystem verzweigt am Code, der Text darf sich
28
28
  * aendern. `validation` traegt zusaetzlich `errors: [{ field, message }]`.
29
29
  */
30
- export declare const INVOICE_ERROR_CODES: readonly ["validation", "idempotency_conflict", "module_inactive", "customer_not_found", "customer_exists", "short_code_taken", "short_code_immutable", "recipient_required", "invoice_requirements_missing", "invoice_not_found", "invoice_ambiguous", "not_cancellable", "partial_credit_exists", "credit_exceeds_invoice", "einvoice_incomplete", "invoice_api_not_enabled", "invoice_setup_incomplete", "language_not_allowed", "brand_not_found", "not_payable", "payment_exceeds_invoice", "tax_scheme_mismatch", "vat_rate_not_in_country", "reverse_charge_reason_required", "reverse_charge_threshold", "mixed_supply_not_allowed", "oss_not_enabled", "einvoice_unavailable", "amount_too_large"];
30
+ export declare const INVOICE_ERROR_CODES: readonly ["validation", "idempotency_conflict", "module_inactive", "customer_not_found", "customer_exists", "short_code_taken", "short_code_immutable", "recipient_required", "invoice_requirements_missing", "invoice_not_found", "invoice_ambiguous", "not_cancellable", "partial_credit_exists", "credit_exceeds_invoice", "einvoice_incomplete", "invoice_api_not_enabled", "invoice_setup_incomplete", "language_not_allowed", "brand_not_found", "not_payable", "payment_exceeds_invoice", "tax_scheme_mismatch", "vat_rate_not_in_country", "reverse_charge_reason_required", "reverse_charge_threshold", "mixed_supply_not_allowed", "oss_not_enabled", "einvoice_unavailable", "amount_too_large", "vat_id_invalid", "vat_id_check_pending", "reservation_not_found", "reservation_mismatch", "reservation_not_active"];
31
31
  export type InvoiceErrorCode = (typeof INVOICE_ERROR_CODES)[number];
32
32
  /**
33
33
  * Codes, die Anmeldung und Rand auf jedem Rechnungsaufruf erzeugen koennen,
@@ -170,7 +170,7 @@ export type InvoicePaymentMethod = (typeof INVOICE_PAYMENT_METHODS)[number];
170
170
  * Hinweise, die eine erfolgreiche Antwort zusaetzlich tragen kann (`data.notice`).
171
171
  * Sie sind keine Fehler: der Aufruf hat gewirkt, es gibt nur etwas zu wissen.
172
172
  */
173
- export declare const INVOICE_NOTICE_CODES: readonly ["cash_receipt_required", "recapitulative_statement_due", "place_of_supply_check"];
173
+ export declare const INVOICE_NOTICE_CODES: readonly ["cash_receipt_required", "recapitulative_statement_due", "place_of_supply_check", "reservation_expired"];
174
174
  export type InvoiceNoticeCode = (typeof INVOICE_NOTICE_CODES)[number];
175
175
  /**
176
176
  * Einheiten einer Position. Die API nimmt nur diese Schluessel an; gedruckt
@@ -270,12 +270,26 @@ export declare const CUSTOMER_FIELDS: Readonly<Record<string, Field>>;
270
270
  * die bisher gerundet eingereicht werden mussten.
271
271
  */
272
272
  export declare const ITEM_FIELDS: Readonly<Record<string, Field>>;
273
+ /**
274
+ * Eine Rechnungsposition beim Ausstellen: die gemeinsamen Positionsfelder plus
275
+ * `reservationId` (seit 1.5.0). Die Reservierung aus der Lager-API
276
+ * (`createReservation`) wird beim Ausstellen geprueft und beim Buchen der
277
+ * Rechnung eingeloest; die Position braucht dazu `articleId`. Unbekannt =
278
+ * `reservation_not_found`, schon eingeloest oder freigegeben =
279
+ * `reservation_not_active`, kein offener Rest dieses Artikels am Lagerstandort
280
+ * der Rechnung (`stockLocationId`, sonst der Standard-Standort) =
281
+ * `reservation_mismatch`; abgelaufen ist kein Fehler, sondern der Hinweis
282
+ * `reservation_expired`. Weniger verkauft als reserviert gibt den Rest frei.
283
+ * Gutschriften kennen das Feld nicht (`validation`).
284
+ */
285
+ export declare const INVOICE_ITEM_FIELDS: Readonly<Record<string, Field>>;
273
286
  /** Genau einer der beiden Preise je Position (§ 9.1). */
274
287
  export declare const ITEM_PRICE_EXACTLY_ONE: readonly (readonly string[])[];
275
288
  /**
276
- * Eine Gutschriftsposition: die Rechnungsposition plus `returnDisposition`
277
- * (wohin die zurueckgenommene Ware geht). An einer Rechnungsposition weist der
278
- * Server das Feld als unbekannt ab.
289
+ * Eine Gutschriftsposition: die gemeinsamen Positionsfelder plus
290
+ * `returnDisposition` (wohin die zurueckgenommene Ware geht), ohne
291
+ * `reservationId`. An einer Rechnungsposition weist der Server
292
+ * `returnDisposition` als unbekannt ab.
279
293
  */
280
294
  export declare const CREDIT_NOTE_ITEM_FIELDS: Readonly<Record<string, Field>>;
281
295
  /**
@@ -19,7 +19,7 @@
19
19
  * Nummer, Summen — ist bewusst **nicht** setzbar.
20
20
  */
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.INVOICE_AT_LEAST_ONE = exports.INVOICE_EXACTLY_ONE = exports.INVOICE_REQUESTS = exports.PAYMENT_FIELDS = exports.CREDIT_NOTE_ITEM_FIELDS = exports.ITEM_PRICE_EXACTLY_ONE = exports.ITEM_FIELDS = exports.CUSTOMER_FIELDS = exports.INVOICE_SETUP_REQUIREMENTS = exports.INVOICE_UNIT_CODES = exports.INVOICE_UNITS = exports.INVOICE_NOTICE_CODES = exports.INVOICE_PAYMENT_METHODS = exports.INVOICE_LANGUAGES = exports.WRITE_OFF_REASON_CODES = exports.EINVOICE_MISSING_CODES = exports.EINVOICE_FORMATS = exports.DOC_TYPES = exports.INVOICE_LIST_STATUS = exports.CUSTOMER_TYPES = exports.VAT_RATES = exports.PRICE_MODES = exports.ITEM_KINDS = exports.REVERSE_CHARGE_REASONS = exports.TAX_SCHEMES = exports.CREDIT_NOTE_REASONS = exports.INVOICE_REQUEST_ERROR_CODES = exports.INVOICE_ERROR_CODES = exports.INVOICE_ENDPOINTS = exports.INVOICE_CONTRACT_VERSION = exports.RETURN_DISPOSITIONS = void 0;
22
+ exports.INVOICE_AT_LEAST_ONE = exports.INVOICE_EXACTLY_ONE = exports.INVOICE_REQUESTS = exports.PAYMENT_FIELDS = exports.CREDIT_NOTE_ITEM_FIELDS = exports.ITEM_PRICE_EXACTLY_ONE = exports.INVOICE_ITEM_FIELDS = exports.ITEM_FIELDS = exports.CUSTOMER_FIELDS = exports.INVOICE_SETUP_REQUIREMENTS = exports.INVOICE_UNIT_CODES = exports.INVOICE_UNITS = exports.INVOICE_NOTICE_CODES = exports.INVOICE_PAYMENT_METHODS = exports.INVOICE_LANGUAGES = exports.WRITE_OFF_REASON_CODES = exports.EINVOICE_MISSING_CODES = exports.EINVOICE_FORMATS = exports.DOC_TYPES = exports.INVOICE_LIST_STATUS = exports.CUSTOMER_TYPES = exports.VAT_RATES = exports.PRICE_MODES = exports.ITEM_KINDS = exports.REVERSE_CHARGE_REASONS = exports.TAX_SCHEMES = exports.CREDIT_NOTE_REASONS = exports.INVOICE_REQUEST_ERROR_CODES = exports.INVOICE_ERROR_CODES = exports.INVOICE_ENDPOINTS = exports.INVOICE_CONTRACT_VERSION = exports.RETURN_DISPOSITIONS = void 0;
23
23
  const cancellation_js_1 = require("../models/cancellation.js");
24
24
  Object.defineProperty(exports, "RETURN_DISPOSITIONS", { enumerable: true, get: function () { return cancellation_js_1.RETURN_DISPOSITIONS; } });
25
25
  exports.INVOICE_CONTRACT_VERSION = 2;
@@ -73,6 +73,13 @@ exports.INVOICE_ERROR_CODES = [
73
73
  'oss_not_enabled',
74
74
  'einvoice_unavailable', // zu dieser Rechnung entsteht keine E-Rechnung, Grund in `reason`
75
75
  'amount_too_large', // Betrag ueber der Grenze des Ganzzahlkerns; erst ab dessen Umstieg gesendet
76
+ // Seit 1.5.0 (0.x: 0.33.0): UID-Pruefung beim Ausstellen ohne Steuer.
77
+ 'vat_id_invalid', // UID des Kunden laut FinanzOnline/VIES ungueltig, sperrt auch mit acceptVatIdRisk
78
+ 'vat_id_check_pending', // noch kein Ergebnis der UID-Pruefung; `retryAfter` in Sekunden, oder acceptVatIdRisk
79
+ // Seit 1.5.0: Position mit `reservationId` (nur `issueInvoice`), geprueft beim Ausstellen.
80
+ 'reservation_not_found', // unbekannt oder einem anderen Konto
81
+ 'reservation_mismatch', // keine offene Position mit gleichem Artikel am Lagerstandort der Rechnung
82
+ 'reservation_not_active', // schon eingeloest oder freigegeben
76
83
  ];
77
84
  /**
78
85
  * Codes, die Anmeldung und Rand auf jedem Rechnungsaufruf erzeugen koennen,
@@ -230,6 +237,10 @@ exports.INVOICE_NOTICE_CODES = [
230
237
  /** Leistung an eine Privatperson im Drittland: der Leistungsort haengt von der
231
238
  * Art der Leistung ab — wir nehmen den oesterreichischen Fall an. */
232
239
  'place_of_supply_check',
240
+ /** Die Reservierung einer Position war beim Ausstellen schon abgelaufen: die
241
+ * Rechnung entsteht trotzdem, verkauft wird ohne Reservierung (seit 1.5.0).
242
+ * Der Hinweis nennt `reservationId`, je Reservierung einmal. */
243
+ 'reservation_expired',
233
244
  ];
234
245
  /**
235
246
  * Einheiten einer Position. Die API nimmt nur diese Schluessel an; gedruckt
@@ -432,6 +443,19 @@ exports.ITEM_FIELDS = Object.freeze({
432
443
  */
433
444
  articleId: id,
434
445
  });
446
+ /**
447
+ * Eine Rechnungsposition beim Ausstellen: die gemeinsamen Positionsfelder plus
448
+ * `reservationId` (seit 1.5.0). Die Reservierung aus der Lager-API
449
+ * (`createReservation`) wird beim Ausstellen geprueft und beim Buchen der
450
+ * Rechnung eingeloest; die Position braucht dazu `articleId`. Unbekannt =
451
+ * `reservation_not_found`, schon eingeloest oder freigegeben =
452
+ * `reservation_not_active`, kein offener Rest dieses Artikels am Lagerstandort
453
+ * der Rechnung (`stockLocationId`, sonst der Standard-Standort) =
454
+ * `reservation_mismatch`; abgelaufen ist kein Fehler, sondern der Hinweis
455
+ * `reservation_expired`. Weniger verkauft als reserviert gibt den Rest frei.
456
+ * Gutschriften kennen das Feld nicht (`validation`).
457
+ */
458
+ exports.INVOICE_ITEM_FIELDS = Object.freeze({ ...exports.ITEM_FIELDS, reservationId: id });
435
459
  /** Genau einer der beiden Preise je Position (§ 9.1). */
436
460
  exports.ITEM_PRICE_EXACTLY_ONE = Object.freeze([
437
461
  Object.freeze(['unitPriceCents']),
@@ -443,15 +467,16 @@ const positionen = {
443
467
  min: 1,
444
468
  max: 500,
445
469
  item: {
446
- type: 'object', required: true, fields: exports.ITEM_FIELDS, exactlyOne: exports.ITEM_PRICE_EXACTLY_ONE,
470
+ type: 'object', required: true, fields: exports.INVOICE_ITEM_FIELDS, exactlyOne: exports.ITEM_PRICE_EXACTLY_ONE,
447
471
  },
448
472
  };
449
473
  /** Rueckgabe-Wahl einer Gutschrift: Vorgabe des Aufrufs oder je Position. */
450
474
  const returnDisposition = { type: 'enum', required: false, values: cancellation_js_1.RETURN_DISPOSITIONS };
451
475
  /**
452
- * Eine Gutschriftsposition: die Rechnungsposition plus `returnDisposition`
453
- * (wohin die zurueckgenommene Ware geht). An einer Rechnungsposition weist der
454
- * Server das Feld als unbekannt ab.
476
+ * Eine Gutschriftsposition: die gemeinsamen Positionsfelder plus
477
+ * `returnDisposition` (wohin die zurueckgenommene Ware geht), ohne
478
+ * `reservationId`. An einer Rechnungsposition weist der Server
479
+ * `returnDisposition` als unbekannt ab.
455
480
  */
456
481
  exports.CREDIT_NOTE_ITEM_FIELDS = Object.freeze({ ...exports.ITEM_FIELDS, returnDisposition });
457
482
  const gutschriftPositionen = {
@@ -548,6 +573,13 @@ exports.INVOICE_REQUESTS = Object.freeze({
548
573
  * Idempotenz-Eintrag. Die Antwort traegt `preview` statt `invoice`.
549
574
  */
550
575
  dryRun: { type: 'boolean', required: false },
576
+ /**
577
+ * Rechnung ohne Steuer, deren UID-Pruefung (FinanzOnline, sonst VIES) noch
578
+ * kein Ergebnis hat: `true` stellt trotzdem aus. Der Aussteller traegt das
579
+ * Risiko, die Rechnung steht dann mit `vatIdRisk`. Eine ungueltige UID
580
+ * (`vat_id_invalid`) sperrt auch damit.
581
+ */
582
+ acceptVatIdRisk: { type: 'boolean', required: false },
551
583
  },
552
584
  cancelInvoice: {
553
585
  idempotencyKey: idempotencyKey(true),
@@ -1,5 +1,5 @@
1
1
  /** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
2
- export declare const VOKABULAR_QUELLE = "b1049e2f65e9261cf8f729481d9ce1e5afda2cf620333f38ae6bf1afb36c8712";
2
+ export declare const VOKABULAR_QUELLE = "d351a778c02888291e325068f96156ad1346859f6ff97bae27f91089e9619e8c";
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 = "b1049e2f65e9261cf8f729481d9ce1e5afda2cf620333f38ae6bf1afb36c8712";
7
+ exports.VOKABULAR_QUELLE = "d351a778c02888291e325068f96156ad1346859f6ff97bae27f91089e9619e8c";
8
8
  /** Schema je Endpunkt (aussen -> innen) und Wertverweise auf die Kataloge. */
9
9
  exports.SCHEMAS = {
10
10
  "getReceipt": {
@@ -223,7 +223,8 @@ exports.SCHEMAS = {
223
223
  "visible": "sichtbar",
224
224
  "sort": "sort"
225
225
  },
226
- "stockLocationIds": "standorte"
226
+ "stockLocationIds": "standorte",
227
+ "minStockByLocation": "mindestJeStandort"
227
228
  }
228
229
  ]
229
230
  },
@@ -261,7 +262,8 @@ exports.ARTIKEL_FELDER = [
261
262
  "active",
262
263
  "groupId",
263
264
  "tile",
264
- "stockLocationIds"
265
+ "stockLocationIds",
266
+ "minStockByLocation"
265
267
  ];
266
268
  /** Wertkataloge innen (deutsch) -> aussen (englisch). */
267
269
  exports.KATALOGE = {
@@ -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.3.0";
7
+ export declare const PACKAGE_VERSION = "1.5.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.3.0';
10
+ exports.PACKAGE_VERSION = '1.5.0';
@@ -13,7 +13,7 @@
13
13
  * umhuellt, muss ihn weiterhin absetzen koennen.
14
14
  */
15
15
  import type { TransportBodyFields } 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"];
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"];
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"];
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"];
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
@@ -70,6 +70,35 @@ export const ALL_CALLS = [
70
70
  'rotatePartnerWebhookSecret',
71
71
  'updateCustomer',
72
72
  'updatePartnerWebhook',
73
+ // Lager-API (Stufe 5a, ./inventory)
74
+ 'getArticle',
75
+ 'listArticles',
76
+ 'lookupArticleByCode',
77
+ 'listLocations',
78
+ 'getStock',
79
+ 'listStock',
80
+ 'listStockMovements',
81
+ 'createWebhook',
82
+ 'updateWebhook',
83
+ 'deleteWebhook',
84
+ 'listWebhooks',
85
+ 'sendWebhookTest',
86
+ 'rotateWebhookSecret',
87
+ 'listWebhookDeliveries',
88
+ // Lager-API schreiben und Reservierung (Stufe 5b, ./inventory)
89
+ 'createArticle',
90
+ 'updateArticle',
91
+ 'deactivateArticle',
92
+ 'receiveGoods',
93
+ 'transferStock',
94
+ 'recordStockLoss',
95
+ 'changeStockCondition',
96
+ 'reverseStockMovement',
97
+ 'createReservation',
98
+ 'extendReservation',
99
+ 'releaseReservation',
100
+ 'getReservation',
101
+ 'listReservations',
73
102
  ];
74
103
  /**
75
104
  * Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
@@ -141,6 +170,35 @@ export const PUBLIC_CALLS = [
141
170
  'listInvoiceItems',
142
171
  'setCustomerMandate',
143
172
  'revokeCustomerMandate',
173
+ // Lager-API lesen und Konto-Webhooks (Backend Stufe 5a), umhuellt in `./inventory`.
174
+ 'getArticle',
175
+ 'listArticles',
176
+ 'lookupArticleByCode',
177
+ 'listLocations',
178
+ 'getStock',
179
+ 'listStock',
180
+ 'listStockMovements',
181
+ 'createWebhook',
182
+ 'updateWebhook',
183
+ 'deleteWebhook',
184
+ 'listWebhooks',
185
+ 'sendWebhookTest',
186
+ 'rotateWebhookSecret',
187
+ 'listWebhookDeliveries',
188
+ // Lager-API schreiben und Reservierung (Backend Stufe 5b), umhuellt in `./inventory`.
189
+ 'createArticle',
190
+ 'updateArticle',
191
+ 'deactivateArticle',
192
+ 'receiveGoods',
193
+ 'transferStock',
194
+ 'recordStockLoss',
195
+ 'changeStockCondition',
196
+ 'reverseStockMovement',
197
+ 'createReservation',
198
+ 'extendReservation',
199
+ 'releaseReservation',
200
+ 'getReservation',
201
+ 'listReservations',
144
202
  ];
145
203
  /**
146
204
  * Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
@@ -0,0 +1,61 @@
1
+ /**
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
4
+ * Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
5
+ */
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';
8
+ import type { InventoryWebhookEventType } from './vertrag.js';
9
+ export interface InventoryClientOptions {
10
+ /** `api_key` des Kontos (`kr_live_…` / `kr_test_…`). Gehoert auf einen Server. */
11
+ apiKey: string;
12
+ /** Abweichende Basis-URL (eigener Proxy); muss auf `/v3` enden. Vorgabe `https://api.kasseneck.at/v3`. */
13
+ baseUrl?: string;
14
+ /** Zeitlimit je Aufruf in Millisekunden. */
15
+ timeoutMs?: number;
16
+ /** Eigene `fetch`-Umsetzung (Tests, Proxys). */
17
+ fetch?: FetchLike;
18
+ }
19
+ export interface InventoryClient {
20
+ getArticle(articleId: string): Promise<Article>;
21
+ listArticles(query?: ArticleListQuery): Promise<ArticlePage>;
22
+ /** Alle Artikel der Abfrage ueber `nextCursor`: `for await (const a of client.iterateArticles())`. */
23
+ iterateArticles(query?: ArticleListQuery): AsyncGenerator<Article, void, undefined>;
24
+ lookupArticleByCode(lookup: ArticleLookup): Promise<Article>;
25
+ listLocations(): Promise<Location[]>;
26
+ getStock(articleId: string): Promise<StockResult>;
27
+ listStock(query?: StockListQuery): Promise<StockPage>;
28
+ iterateStock(query?: StockListQuery): AsyncGenerator<StockLevel, void, undefined>;
29
+ listStockMovements(query?: StockMovementQuery): Promise<StockMovementPage>;
30
+ iterateStockMovements(query?: StockMovementQuery): AsyncGenerator<StockMovement, void, undefined>;
31
+ createWebhook(options: CreateInventoryWebhookOptions): Promise<InventoryWebhookWithSecret>;
32
+ updateWebhook(webhookId: string, patch: InventoryWebhookPatch): Promise<InventoryWebhook>;
33
+ deleteWebhook(webhookId: string): Promise<{
34
+ webhookId: string;
35
+ deleted: boolean;
36
+ }>;
37
+ listWebhooks(): Promise<InventoryWebhookList>;
38
+ sendWebhookTest(webhookId: string, event: InventoryWebhookEventType | (string & {})): Promise<InventoryWebhookTestResult>;
39
+ rotateWebhookSecret(webhookId: string): Promise<InventoryWebhookWithSecret>;
40
+ listWebhookDeliveries(options?: {
41
+ webhookId?: string;
42
+ limit?: number;
43
+ }): Promise<InventoryWebhookDelivery[]>;
44
+ createArticle(request: CreateArticleRequest): Promise<Article>;
45
+ updateArticle(request: UpdateArticleRequest): Promise<Article>;
46
+ deactivateArticle(request: DeactivateArticleRequest): Promise<Article>;
47
+ receiveGoods(request: ReceiveGoodsRequest): Promise<StockOperation>;
48
+ /** `receiveGoods` mit `dryRun: true`: rechnet, schreibt nichts, Schluessel freigestellt. */
49
+ previewGoodsReceipt(request: GoodsReceiptPreviewRequest): Promise<GoodsReceiptPreview>;
50
+ transferStock(request: TransferStockRequest): Promise<StockOperation>;
51
+ recordStockLoss(request: RecordStockLossRequest): Promise<StockOperation>;
52
+ changeStockCondition(request: ChangeStockConditionRequest): Promise<StockOperation>;
53
+ reverseStockMovement(request: ReverseStockMovementRequest): Promise<StockOperation>;
54
+ createReservation(request: CreateReservationRequest): Promise<Reservation>;
55
+ extendReservation(request: ExtendReservationRequest): Promise<Reservation>;
56
+ releaseReservation(request: ReleaseReservationRequest): Promise<Reservation>;
57
+ getReservation(reservationId: string): Promise<Reservation>;
58
+ listReservations(query?: ReservationListQuery): Promise<ReservationPage>;
59
+ iterateReservations(query?: ReservationListQuery): AsyncGenerator<Reservation, void, undefined>;
60
+ }
61
+ export declare function createInventoryClient(options: InventoryClientOptions): InventoryClient;
@@ -0,0 +1,51 @@
1
+ /**
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
4
+ * Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
5
+ */
6
+ import { createTransport } from '../client/transport.js';
7
+ import { inventoryKeyAuth } from './auth.js';
8
+ import { createWebhook, deleteWebhook, getArticle, getStock, iterateArticles, iterateStock, iterateStockMovements, listArticles, listLocations, listStock, listStockMovements, listWebhookDeliveries, listWebhooks, lookupArticleByCode, rotateWebhookSecret, sendWebhookTest, updateWebhook, } from './endpunkte.js';
9
+ import { changeStockCondition, createArticle, createReservation, deactivateArticle, extendReservation, getReservation, iterateReservations, listReservations, previewGoodsReceipt, receiveGoods, recordStockLoss, releaseReservation, reverseStockMovement, transferStock, updateArticle, } from './schreiben.js';
10
+ export function createInventoryClient(options) {
11
+ const rufen = createTransport({
12
+ auth: inventoryKeyAuth({ apiKey: options.apiKey }),
13
+ baseUrl: options.baseUrl,
14
+ timeoutMs: options.timeoutMs,
15
+ fetch: options.fetch,
16
+ });
17
+ return {
18
+ getArticle: (id) => getArticle(rufen, id),
19
+ listArticles: (q) => listArticles(rufen, q),
20
+ iterateArticles: (q) => iterateArticles(rufen, q),
21
+ lookupArticleByCode: (l) => lookupArticleByCode(rufen, l),
22
+ listLocations: () => listLocations(rufen),
23
+ getStock: (id) => getStock(rufen, id),
24
+ listStock: (q) => listStock(rufen, q),
25
+ iterateStock: (q) => iterateStock(rufen, q),
26
+ listStockMovements: (q) => listStockMovements(rufen, q),
27
+ iterateStockMovements: (q) => iterateStockMovements(rufen, q),
28
+ createWebhook: (o) => createWebhook(rufen, o),
29
+ updateWebhook: (id, patch) => updateWebhook(rufen, id, patch),
30
+ deleteWebhook: (id) => deleteWebhook(rufen, id),
31
+ listWebhooks: () => listWebhooks(rufen),
32
+ sendWebhookTest: (id, event) => sendWebhookTest(rufen, id, event),
33
+ rotateWebhookSecret: (id) => rotateWebhookSecret(rufen, id),
34
+ listWebhookDeliveries: (o) => listWebhookDeliveries(rufen, o),
35
+ createArticle: (r) => createArticle(rufen, r),
36
+ updateArticle: (r) => updateArticle(rufen, r),
37
+ deactivateArticle: (r) => deactivateArticle(rufen, r),
38
+ receiveGoods: (r) => receiveGoods(rufen, r),
39
+ previewGoodsReceipt: (r) => previewGoodsReceipt(rufen, r),
40
+ transferStock: (r) => transferStock(rufen, r),
41
+ recordStockLoss: (r) => recordStockLoss(rufen, r),
42
+ changeStockCondition: (r) => changeStockCondition(rufen, r),
43
+ reverseStockMovement: (r) => reverseStockMovement(rufen, r),
44
+ createReservation: (r) => createReservation(rufen, r),
45
+ extendReservation: (r) => extendReservation(rufen, r),
46
+ releaseReservation: (r) => releaseReservation(rufen, r),
47
+ getReservation: (id) => getReservation(rufen, id),
48
+ listReservations: (q) => listReservations(rufen, q),
49
+ iterateReservations: (q) => iterateReservations(rufen, q),
50
+ };
51
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Anmeldung fuer die Lager-API: der `api_key` des Kontos als Bearer, ohne
3
+ * `cashregister-token` (gelesen wird am Konto, nicht an einer Kasse).
4
+ *
5
+ * **Der Schluessel gehoert auf einen Server**, etwa in das Backend eines
6
+ * Online-Shops, nie in ein Browser-Buendel.
7
+ *
8
+ * Geprueft wird nur, was ohne Netz sicher falsch ist: ein leerer Wert, ein
9
+ * Partner-Schluessel (`pk_…`) oder ein Kassen-Token (`cb_…`). Die Meldung
10
+ * nennt nie den Wert, nur seine Art.
11
+ */
12
+ import type { KasseneckAuth } from '../client/auth.js';
13
+ export interface InventoryKeyAuthOptions {
14
+ /** `api_key` des Kontos, z. B. `kr_live_…` oder `kr_test_…`. */
15
+ apiKey: string;
16
+ }
17
+ export declare function inventoryKeyAuth(options: InventoryKeyAuthOptions): KasseneckAuth;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Anmeldung fuer die Lager-API: der `api_key` des Kontos als Bearer, ohne
3
+ * `cashregister-token` (gelesen wird am Konto, nicht an einer Kasse).
4
+ *
5
+ * **Der Schluessel gehoert auf einen Server**, etwa in das Backend eines
6
+ * Online-Shops, nie in ein Browser-Buendel.
7
+ *
8
+ * Geprueft wird nur, was ohne Netz sicher falsch ist: ein leerer Wert, ein
9
+ * Partner-Schluessel (`pk_…`) oder ein Kassen-Token (`cb_…`). Die Meldung
10
+ * nennt nie den Wert, nur seine Art.
11
+ */
12
+ import { KasseneckAuthError } from '../client/errors.js';
13
+ export function inventoryKeyAuth(options) {
14
+ const schluessel = typeof options?.apiKey === 'string' ? options.apiKey.trim() : '';
15
+ if (!schluessel)
16
+ throw new KasseneckAuthError('inventoryKeyAuth: apiKey fehlt');
17
+ if (/^pk_(live|test)_/i.test(schluessel)) {
18
+ throw new KasseneckAuthError('inventoryKeyAuth: das ist ein Partner-Schluessel (pk_…); die Lager-API nimmt den api_key des Kontos (kr_…)');
19
+ }
20
+ if (/^cb_(live|test)_/i.test(schluessel)) {
21
+ throw new KasseneckAuthError('inventoryKeyAuth: das ist ein Kassen-Token (cb_…); die Lager-API nimmt den api_key des Kontos (kr_…)');
22
+ }
23
+ return () => ({ headers: { Authorization: `Bearer ${schluessel}` }, params: {} });
24
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Die Aufrufe der Lager-API: Artikel, Standorte, Bestand und Bewegungen
3
+ * lesen, Konto-Webhooks verwalten (Backend Stufe 5a). Die schreibenden
4
+ * Aufrufe (Stufe 5b) stehen in `schreiben.ts` und teilen die Helfer hier.
5
+ *
6
+ * Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln
7
+ * importierbar; die Fassade [createInventoryClient] bindet ihn nur einmal.
8
+ *
9
+ * **Geprueft wird hier nur, was ohne Netz sicher falsch ist** (leere Kennung,
10
+ * `limit` ausserhalb 1–200, eine Aenderung ohne Feld). Alles Fachliche prueft
11
+ * der Server und meldet es als `validation` mit `errors[]`; zwei Pruefungen
12
+ * hiessen zwei Wahrheiten.
13
+ *
14
+ * Lesen hat keine Wirkung: nach einem Zeitlimit darf derselbe Aufruf
15
+ * wiederholt werden. Bei `rate_limited` vorher `retryAfterSec` warten
16
+ * ([inventoryRetryAfterSec]).
17
+ */
18
+ import type { ApiCall, InternerTransport } from '../client/aufrufe.js';
19
+ import { KasseneckValidationError } from '../client/errors.js';
20
+ import type { Article, ArticleListQuery, ArticleLookup, ArticlePage, CreateInventoryWebhookOptions, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestResult, InventoryWebhookWithSecret, Location, StockLevel, StockListQuery, StockMovement, StockMovementPage, StockMovementQuery, StockPage, StockResult } from './typen.js';
21
+ type Params = Record<string, unknown>;
22
+ export declare function anfragefehler(name: ApiCall, grund: string): KasseneckValidationError;
23
+ /** Eine Kennung, die gesendet werden muss: Text mit mindestens einem Zeichen ausser Leerraum. */
24
+ export declare function kennung(name: ApiCall, feld: string, wert: unknown): string;
25
+ /**
26
+ * Die Abfrage einer Liste als Parameter. Unbekannte Felder gehen unveraendert
27
+ * hinaus (der Server weist sie mit `validation` ab), `undefined` faellt weg.
28
+ */
29
+ export declare function abfrage(name: ApiCall, query: object | undefined): Params;
30
+ /**
31
+ * Blaettert ueber alle Seiten, Eintrag fuer Eintrag. Derselbe Cursor zweimal
32
+ * waere eine Endlosschleife: dann endet die Schleife mit einem Antwortfehler.
33
+ */
34
+ export declare function seitenweise<T>(name: ApiCall, start: string | undefined, seite: (cursor: string | undefined) => Promise<{
35
+ eintraege: T[];
36
+ nextCursor: string | null;
37
+ }>): AsyncGenerator<T, void, undefined>;
38
+ export declare function getArticle(transport: InternerTransport, articleId: string): Promise<Article>;
39
+ export declare function listArticles(transport: InternerTransport, query?: ArticleListQuery): Promise<ArticlePage>;
40
+ /** Alle Artikel der Abfrage, Seite fuer Seite ueber `nextCursor`. */
41
+ export declare function iterateArticles(transport: InternerTransport, query?: ArticleListQuery): AsyncGenerator<Article, void, undefined>;
42
+ /**
43
+ * Ein aktiver Artikel per Code (`number`, `ean` oder `internalCode`) oder per
44
+ * eigener Kennung aus `externalIds` (`{ externalSystem: 'shop', externalId: '4711' }`).
45
+ * Ein stillgelegter Artikel gilt als nicht gefunden (`article_not_found`).
46
+ */
47
+ export declare function lookupArticleByCode(transport: InternerTransport, lookup: ArticleLookup): Promise<Article>;
48
+ /** Alle Standorte des Kontos, samt aufgeloesten (`active: false`) und dem Hauptstandort. */
49
+ export declare function listLocations(transport: InternerTransport): Promise<Location[]>;
50
+ /** Bestand eines Artikels je Standort. */
51
+ export declare function getStock(transport: InternerTransport, articleId: string): Promise<StockResult>;
52
+ export declare function listStock(transport: InternerTransport, query?: StockListQuery): Promise<StockPage>;
53
+ /**
54
+ * Alle Bestandszeilen der Abfrage, Seite fuer Seite. Die Werte (`values`)
55
+ * stehen je Seite in [listStock]; der Iterator liefert nur die Zeilen.
56
+ */
57
+ export declare function iterateStock(transport: InternerTransport, query?: StockListQuery): AsyncGenerator<StockLevel, void, undefined>;
58
+ /** Das Lagerprotokoll, neueste zuerst. */
59
+ export declare function listStockMovements(transport: InternerTransport, query?: StockMovementQuery): Promise<StockMovementPage>;
60
+ export declare function iterateStockMovements(transport: InternerTransport, query?: StockMovementQuery): AsyncGenerator<StockMovement, void, undefined>;
61
+ /**
62
+ * Legt einen Webhook an (hoechstens 5 je Konto, `webhook_limit`).
63
+ * **Das Secret in der Antwort kommt nur dieses eine Mal**; sofort dorthin
64
+ * schreiben, wo der Empfaenger es liest, nicht in ein Protokoll.
65
+ */
66
+ export declare function createWebhook(transport: InternerTransport, options: CreateInventoryWebhookOptions): Promise<InventoryWebhookWithSecret>;
67
+ /** Aendert nur die genannten Felder; `description: null` loescht die Beschreibung. */
68
+ export declare function updateWebhook(transport: InternerTransport, webhookId: string, patch: InventoryWebhookPatch): Promise<InventoryWebhook>;
69
+ export declare function deleteWebhook(transport: InternerTransport, webhookId: string): Promise<{
70
+ webhookId: string;
71
+ deleted: boolean;
72
+ }>;
73
+ /** Die Webhooks des Kontos und die Ereignisse, die es abonnieren kann. */
74
+ export declare function listWebhooks(transport: InternerTransport): Promise<InventoryWebhookList>;
75
+ /**
76
+ * Ein neues Secret fuer denselben Webhook. Ab der Antwort gilt nur noch das
77
+ * neue (keine Uebergangsfrist): erst speichern, dann weiterarbeiten.
78
+ */
79
+ export declare function rotateWebhookSecret(transport: InternerTransport, webhookId: string): Promise<InventoryWebhookWithSecret>;
80
+ /**
81
+ * Eine Probe genau dieses Ereignisses an genau diesen Webhook, mit erfundener
82
+ * Nutzlast und `test: true` in der Huelle. Der Webhook muss das Ereignis
83
+ * abonnieren (`event_not_subscribed`) und aktiv sein (`webhook_inactive`).
84
+ */
85
+ export declare function sendWebhookTest(transport: InternerTransport, webhookId: string, event: string): Promise<InventoryWebhookTestResult>;
86
+ /** Die letzten Zustellungen, neueste zuerst; mit `webhookId` nur die eines Webhooks. */
87
+ export declare function listWebhookDeliveries(transport: InternerTransport, options?: {
88
+ webhookId?: string;
89
+ limit?: number;
90
+ }): Promise<InventoryWebhookDelivery[]>;
91
+ export {};