@kreiseck/kasseneck-api 1.4.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 (81) hide show
  1. package/CHANGELOG.md +108 -0
  2. package/README.md +192 -11
  3. package/dist/cjs/client/aufrufe.d.ts +2 -2
  4. package/dist/cjs/client/aufrufe.js +28 -0
  5. package/dist/cjs/inventory/api.d.ts +19 -3
  6. package/dist/cjs/inventory/api.js +18 -2
  7. package/dist/cjs/inventory/endpunkte.d.ts +22 -2
  8. package/dist/cjs/inventory/endpunkte.js +6 -1
  9. package/dist/cjs/inventory/fehler.d.ts +11 -1
  10. package/dist/cjs/inventory/fehler.js +19 -0
  11. package/dist/cjs/inventory/index.d.ts +6 -4
  12. package/dist/cjs/inventory/index.js +32 -2
  13. package/dist/cjs/inventory/lesen.d.ts +8 -1
  14. package/dist/cjs/inventory/lesen.js +131 -1
  15. package/dist/cjs/inventory/schreiben.d.ts +83 -0
  16. package/dist/cjs/inventory/schreiben.js +315 -0
  17. package/dist/cjs/inventory/typen.d.ts +371 -11
  18. package/dist/cjs/inventory/vertrag.d.ts +76 -16
  19. package/dist/cjs/inventory/vertrag.js +138 -13
  20. package/dist/cjs/inventory/webhook.d.ts +3 -1
  21. package/dist/cjs/inventory/webhook.js +7 -1
  22. package/dist/cjs/invoice/index.d.ts +2 -2
  23. package/dist/cjs/invoice/index.js +2 -1
  24. package/dist/cjs/invoice/typen.d.ts +46 -2
  25. package/dist/cjs/invoice/vertrag.d.ts +19 -5
  26. package/dist/cjs/invoice/vertrag.js +37 -5
  27. package/dist/cjs/stored/vokabular.d.ts +1 -1
  28. package/dist/cjs/stored/vokabular.js +5 -3
  29. package/dist/cjs/version.d.ts +1 -1
  30. package/dist/cjs/version.js +1 -1
  31. package/dist/esm/client/aufrufe.d.ts +2 -2
  32. package/dist/esm/client/aufrufe.js +28 -0
  33. package/dist/esm/inventory/api.d.ts +19 -3
  34. package/dist/esm/inventory/api.js +18 -2
  35. package/dist/esm/inventory/endpunkte.d.ts +22 -2
  36. package/dist/esm/inventory/endpunkte.js +6 -5
  37. package/dist/esm/inventory/fehler.d.ts +11 -1
  38. package/dist/esm/inventory/fehler.js +18 -1
  39. package/dist/esm/inventory/index.d.ts +6 -4
  40. package/dist/esm/inventory/index.js +5 -3
  41. package/dist/esm/inventory/lesen.d.ts +8 -1
  42. package/dist/esm/inventory/lesen.js +127 -1
  43. package/dist/esm/inventory/schreiben.d.ts +83 -0
  44. package/dist/esm/inventory/schreiben.js +298 -0
  45. package/dist/esm/inventory/typen.d.ts +371 -11
  46. package/dist/esm/inventory/vertrag.d.ts +76 -16
  47. package/dist/esm/inventory/vertrag.js +137 -12
  48. package/dist/esm/inventory/webhook.d.ts +3 -1
  49. package/dist/esm/inventory/webhook.js +8 -2
  50. package/dist/esm/invoice/index.d.ts +2 -2
  51. package/dist/esm/invoice/index.js +1 -1
  52. package/dist/esm/invoice/typen.d.ts +46 -2
  53. package/dist/esm/invoice/vertrag.d.ts +19 -5
  54. package/dist/esm/invoice/vertrag.js +36 -4
  55. package/dist/esm/stored/vokabular.d.ts +1 -1
  56. package/dist/esm/stored/vokabular.js +5 -3
  57. package/dist/esm/version.d.ts +1 -1
  58. package/dist/esm/version.js +1 -1
  59. package/fixtures/hobex-hps-codes.json +1 -1
  60. package/fixtures/invoice-api-examples/credit-error-reservation.json +26 -0
  61. package/fixtures/invoice-api-examples/issue-error-reservation-article.json +25 -0
  62. package/fixtures/invoice-api-examples/issue-error-vat-id-risk.json +26 -0
  63. package/fixtures/invoice-api-examples/issue-reservation.json +24 -0
  64. package/fixtures/invoice-api-examples/issue-vat-id-risk.json +28 -0
  65. package/fixtures/invoice-api.schema.json +15 -2
  66. package/fixtures/invoice-texts.json +1 -1
  67. package/fixtures/pos-texts.json +1 -1
  68. package/fixtures/surface.json +152 -9
  69. package/fixtures/v3/antworten/belege.json +2 -2
  70. package/fixtures/v3/antworten/belegmail.json +2 -2
  71. package/fixtures/v3/antworten/kasse-belege.json +2 -2
  72. package/fixtures/v3/antworten/kasse.json +3 -3
  73. package/fixtures/v3/antworten/lager.json +2491 -130
  74. package/fixtures/v3/antworten/rechnungen.json +267 -44
  75. package/fixtures/v3/antworten/storno.json +2 -2
  76. package/fixtures/v3/stored/belege.json +2 -2
  77. package/fixtures/v3/stored/kasse.json +3 -3
  78. package/fixtures/v3/stored/rechnungen.json +174 -18
  79. package/fixtures/v3/v3-vokabular.json +593 -23
  80. package/fixtures/v3/zahlbetrag-faelle.json +2 -2
  81. package/package.json +1 -1
@@ -1,17 +1,20 @@
1
1
  "use strict";
2
2
  /**
3
- * Der Vertrag der Lager-API (Backend Stufe 5a) als Daten: Endpunkte,
4
- * Wertkataloge, Ereignisse und Fehlercodes, englisch wie am Draht `/v3`.
3
+ * Der Vertrag der Lager-API (Backend Stufe 5a lesen, 5b schreiben und
4
+ * reservieren) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
5
+ * Hinweiscodes, englisch wie am Draht `/v3`.
5
6
  *
6
7
  * Quelle ist der Vertrags-Export des Backends (`fixtures/v3/v3-vokabular.json`):
7
8
  * `endpoints.public`, die Kataloge `STANDORT_TYP`, `BEWEGUNG_ART`,
8
- * `BEWEGUNG_QUELLE`, `LAGER_ZUSTAND`, `LAGER_URSACHE`, `ZUSTELLUNG` und
9
- * `events`. `test/inventory.test.ts` haelt jede Liste deckungsgleich mit
10
- * dieser Datei; nichts hier wird geraten.
9
+ * `BEWEGUNG_QUELLE`, `LAGER_ZUSTAND`, `LAGER_URSACHE`, `ZUSTELLUNG`,
10
+ * `LAGER_ABGANG_GRUND`, `LAGER_ENTNAHME_ART`, `LAGER_NEBENKOSTEN_ART`,
11
+ * `LAGER_VERTEILUNG`, `RESERVIERUNG_STATUS`, dazu `events`, `errorCodes.inventory`
12
+ * und `warningCodes.inventory`. `test/inventory.test.ts` haelt jede Liste
13
+ * deckungsgleich mit dieser Datei; nichts hier wird geraten.
11
14
  */
12
15
  Object.defineProperty(exports, "__esModule", { value: true });
13
- 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;
14
- /** Die 14 Endpunkte, in der Reihenfolge von `endpoints.public`. */
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`. */
15
18
  exports.INVENTORY_ENDPOINTS = [
16
19
  'getArticle',
17
20
  'listArticles',
@@ -27,6 +30,19 @@ exports.INVENTORY_ENDPOINTS = [
27
30
  'sendWebhookTest',
28
31
  'rotateWebhookSecret',
29
32
  'listWebhookDeliveries',
33
+ 'createArticle',
34
+ 'updateArticle',
35
+ 'deactivateArticle',
36
+ 'receiveGoods',
37
+ 'transferStock',
38
+ 'recordStockLoss',
39
+ 'changeStockCondition',
40
+ 'reverseStockMovement',
41
+ 'createReservation',
42
+ 'extendReservation',
43
+ 'releaseReservation',
44
+ 'getReservation',
45
+ 'listReservations',
30
46
  ];
31
47
  /** Art eines Standorts (Katalog `STANDORT_TYP`). */
32
48
  exports.LOCATION_TYPES = ['warehouse', 'store', 'vehicle', 'other'];
@@ -34,6 +50,8 @@ exports.LOCATION_TYPES = ['warehouse', 'store', 'vehicle', 'other'];
34
50
  * Art einer Lagerbewegung (Katalog `BEWEGUNG_ART`); zugleich der Filter `type`.
35
51
  * `goods_receipt` ist der Wareneingang, `takeover` der uebernommene Anfangsbestand
36
52
  * (auch per Import). `receipt` gibt es hier nicht: das ist der Kassenbeleg (Quelle).
53
+ * `reservation` (seit 1.5.0) aendert nur `reserved`: `quantityDelta` ist 0, die
54
+ * Menge steht in `reservedDelta`.
37
55
  */
38
56
  exports.STOCK_MOVEMENT_TYPES = [
39
57
  'sale',
@@ -50,6 +68,7 @@ exports.STOCK_MOVEMENT_TYPES = [
50
68
  'reversal',
51
69
  'revaluation',
52
70
  'method_change',
71
+ 'reservation',
53
72
  ];
54
73
  /**
55
74
  * Woher eine Bewegung kommt (Katalog `BEWEGUNG_QUELLE`); zugleich der Filter
@@ -92,8 +111,11 @@ exports.STOCK_CHANGE_CAUSES = [
92
111
  /** Stand einer Zustellung (Katalog `ZUSTELLUNG`, derselbe wie bei Partner-Webhooks). */
93
112
  exports.WEBHOOK_DELIVERY_STATUSES = ['delivered', 'pending', 'failed', 'dropped'];
94
113
  /**
95
- * Die Ereignisse, die ein Konto-Webhook abonnieren kann (Stufe 5a). Spaetere
96
- * Stufen ergaenzen `reservation.*` und `variant_group.*`.
114
+ * Die Ereignisse, die ein Konto-Webhook abonnieren kann, in der Reihenfolge von
115
+ * `listWebhooks().events`. `reservation.*` (seit 1.5.0) tragen die Reservierung
116
+ * wie `getReservation`, mit dem Status danach: `reservation.released` und
117
+ * `reservation.redeemed` kommen bei jeder wirksamen Freigabe bzw. Einloesung,
118
+ * auch einer teilweisen (dann bleibt der Status `active`).
97
119
  */
98
120
  exports.INVENTORY_WEBHOOK_EVENTS = [
99
121
  'stock.changed',
@@ -101,6 +123,9 @@ exports.INVENTORY_WEBHOOK_EVENTS = [
101
123
  'article.created',
102
124
  'article.updated',
103
125
  'article.deactivated',
126
+ 'reservation.expired',
127
+ 'reservation.released',
128
+ 'reservation.redeemed',
104
129
  ];
105
130
  /**
106
131
  * Die Felder der Huelle jeder Zustellung, in der Reihenfolge am Draht. Statt
@@ -113,10 +138,21 @@ exports.INVENTORY_WEBHOOK_LIMIT = 5;
113
138
  /** Groesstes `limit` einer Liste; ohne Angabe liefert der Server 50. */
114
139
  exports.INVENTORY_LIST_LIMIT_MAX = 200;
115
140
  /**
116
- * Die Codes, die die Lager-Endpunkte selbst senden. `validation` traegt
117
- * `errors: [{ field, message }]`, `rate_limited` traegt `retryAfterSec`
118
- * (dazu die Kopfzeile `Retry-After`) – auch bei `sendWebhookTest` nach 20
119
- * Probesendungen je Wiener Kalendertag (dann bis Mitternacht in Wien).
141
+ * Die Codes, die die Lager-Endpunkte selbst senden (`errorCodes.inventory`;
142
+ * `register_user_not_allowed` steht bei [INVENTORY_REQUEST_ERROR_CODES]).
143
+ * `validation` traegt `errors: [{ field, message }]`, `rate_limited` traegt
144
+ * `retryAfterSec` (dazu die Kopfzeile `Retry-After`) – auch bei
145
+ * `sendWebhookTest` nach 20 Probesendungen je Wiener Kalendertag (dann bis
146
+ * Mitternacht in Wien).
147
+ *
148
+ * Seit 1.5.0 hinten angehaengt, in der Reihenfolge des Vertrags: die Codes
149
+ * der schreibenden Endpunkte. `idempotency_key_required` (Schluessel fehlt),
150
+ * `idempotency_conflict` (derselbe Schluessel mit anderem Inhalt),
151
+ * `exceeds_stock` (Abgang, Umbuchung und Zustandswechsel ueberziehen nie),
152
+ * `insufficient_available` (Reservierung; `data.details[]`, siehe
153
+ * [inventoryShortfalls]), `code_taken` und `external_id_taken` (mit `field` und
154
+ * `articleId` des Artikels, dem der Code gehoert), `stock_kind_locked`,
155
+ * `reservation_not_found`, `reservation_not_active` …
120
156
  */
121
157
  exports.INVENTORY_ERROR_CODES = [
122
158
  'validation',
@@ -131,6 +167,55 @@ exports.INVENTORY_ERROR_CODES = [
131
167
  'module_inactive',
132
168
  'rate_limited',
133
169
  'server_error',
170
+ 'idempotency_key_required',
171
+ 'idempotency_conflict',
172
+ 'location_not_found',
173
+ 'location_inactive',
174
+ 'invalid_location',
175
+ 'invalid_locations',
176
+ 'invalid_transfer',
177
+ 'operation_not_found',
178
+ 'already_reversed',
179
+ 'reversal_not_possible',
180
+ 'reversal_not_supported',
181
+ 'exceeds_stock',
182
+ 'no_positions',
183
+ 'too_many_positions',
184
+ 'invalid_step',
185
+ 'invalid_quantity',
186
+ 'invalid_amount',
187
+ 'invalid_price',
188
+ 'negative_value',
189
+ 'invalid_reason',
190
+ 'note_required',
191
+ 'withdrawal_type_required',
192
+ 'invalid_method',
193
+ 'invalid_stock_kind',
194
+ 'invalid_minimum',
195
+ 'invalid_dimensions',
196
+ 'weight_missing',
197
+ 'invalid_landed_cost',
198
+ 'invalid_distribution',
199
+ 'landed_costs_mismatch',
200
+ 'return_totals_mismatch',
201
+ 'lot_not_found',
202
+ 'invalid_serial',
203
+ 'serial_required',
204
+ 'serial_not_allowed',
205
+ 'serial_already_exists',
206
+ 'serial_not_in_stock',
207
+ 'code_taken',
208
+ 'external_id_taken',
209
+ 'group_not_found',
210
+ 'revenue_group_not_found',
211
+ 'stock_kind_locked',
212
+ 'article_inactive',
213
+ 'invalid_position',
214
+ 'invalid_condition',
215
+ 'reason_required',
216
+ 'insufficient_available',
217
+ 'reservation_not_found',
218
+ 'reservation_not_active',
134
219
  ];
135
220
  /**
136
221
  * Codes, die Anmeldung und Rand auf jedem Lager-Aufruf erzeugen koennen,
@@ -164,3 +249,43 @@ exports.INVENTORY_REQUEST_ERROR_CODES = [
164
249
  'user_verification_failed',
165
250
  'route_missing',
166
251
  ];
252
+ // ---- Schreiben und Reservierung (Backend Stufe 5b, seit 1.5.0) -----------------
253
+ /**
254
+ * Hinweise einer Buchung (`warnings[].code`, `warningCodes.inventory`). Sie sind
255
+ * keine Fehler: die Buchung hat gewirkt. `insufficient_stock` gibt es nur beim
256
+ * Verkauf (Abgang, Umbuchung und Zustandswechsel weisen mit `exceeds_stock` ab),
257
+ * `below_minimum` misst am verfuegbaren Bestand (`onHand − reserved`) gegen den
258
+ * Mindestbestand des Standorts, `reservation_exceeded` meldet eine Rechnung, die
259
+ * mehr verkauft als reserviert war.
260
+ */
261
+ exports.INVENTORY_WARNING_CODES = [
262
+ 'insufficient_stock',
263
+ 'below_minimum',
264
+ 'return_exceeds_sale',
265
+ 'reservation_exceeded',
266
+ ];
267
+ /**
268
+ * Bestandsart eines Artikels (`stockKind`): `quantity` = Menge, `serial` =
269
+ * Einzelstueck mit Seriennummer. Kein Katalog des Vokabulars, der Server
270
+ * uebersetzt das Feld selbst; nach der ersten Bewegung fest (`stock_kind_locked`).
271
+ */
272
+ exports.STOCK_KINDS = ['quantity', 'serial'];
273
+ /** Grund eines Abgangs (`recordStockLoss.reason`, Katalog `LAGER_ABGANG_GRUND`). `other` braucht `note`. */
274
+ exports.STOCK_LOSS_REASONS = ['breakage', 'shrinkage', 'theft', 'expired', 'withdrawal', 'disposal', 'other'];
275
+ /** Art einer Entnahme (`withdrawalType`, Katalog `LAGER_ENTNAHME_ART`); Pflicht bei `reason: 'withdrawal'`, sonst nicht erlaubt. */
276
+ exports.WITHDRAWAL_TYPES = ['private', 'staff', 'gift', 'sample'];
277
+ /** Art von Nebenkosten eines Wareneingangs (`landedCosts[].type`, Katalog `LAGER_NEBENKOSTEN_ART`). */
278
+ exports.LANDED_COST_TYPES = ['freight', 'customs', 'insurance', 'other', 'discount', 'cash_discount'];
279
+ /** Verteilung der Nebenkosten (`allocation`, Katalog `LAGER_VERTEILUNG`); Vorgabe des Servers `value`. */
280
+ exports.LANDED_COST_ALLOCATIONS = ['value', 'quantity', 'weight', 'manual'];
281
+ /**
282
+ * Stand einer Reservierung (Katalog `RESERVIERUNG_STATUS`). Nur `active` haelt
283
+ * Ware zurueck; die drei anderen sind endgueltig: `redeemed` (ueber eine
284
+ * Rechnung eingeloest), `released` (freigegeben), `expired` (abgelaufen).
285
+ */
286
+ exports.RESERVATION_STATUSES = ['active', 'redeemed', 'released', 'expired'];
287
+ /** Laengster `idempotencyKey` (Zeichen); laenger weist der Server ab, er schneidet nie ab. */
288
+ exports.INVENTORY_IDEMPOTENCY_KEY_MAX = 120;
289
+ /** Kuerzeste und laengste Haltedauer einer Reservierung in Minuten (`expiresInMinutes`, 30 Tage). */
290
+ exports.RESERVATION_MINUTES_MIN = 5;
291
+ exports.RESERVATION_MINUTES_MAX = 43_200;
@@ -39,8 +39,10 @@ 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 `reservation.*`
42
+ * - Ein Ereignis, das diese Paketversion nicht kennt (etwa `variant_group.*`
43
43
  * einer spaeteren Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
44
+ * - `reservation.expired|released|redeemed` tragen die Reservierung wie
45
+ * `getReservation`, mit dem Status nach dem Vorgang (seit 1.5.0).
44
46
  * - Ein Rumpf, der keine Huelle ist, oder eine Bruchzahl in einer Menge wirft
45
47
  * `KasseneckValidationError` (`scope: 'response'`).
46
48
  *
@@ -65,8 +65,10 @@ 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 `reservation.*`
68
+ * - Ein Ereignis, das diese Paketversion nicht kennt (etwa `variant_group.*`
69
69
  * einer spaeteren Stufe), ergibt `null`: mit 2xx antworten und uebergehen.
70
+ * - `reservation.expired|released|redeemed` tragen die Reservierung wie
71
+ * `getReservation`, mit dem Status nach dem Vorgang (seit 1.5.0).
70
72
  * - Ein Rumpf, der keine Huelle ist, oder eine Bruchzahl in einer Menge wirft
71
73
  * `KasseneckValidationError` (`scope: 'response'`).
72
74
  *
@@ -104,6 +106,10 @@ function parseInventoryWebhookEvent(rawBody) {
104
106
  return { ...huelle, type: huelle.type, data: (0, lesen_js_1.bestandGeaendert)(ort, data) };
105
107
  case 'stock.below_minimum':
106
108
  return { ...huelle, type: huelle.type, data: (0, lesen_js_1.unterMindestbestand)(ort, data) };
109
+ case 'reservation.expired':
110
+ case 'reservation.released':
111
+ case 'reservation.redeemed':
112
+ return { ...huelle, type: huelle.type, data: (0, lesen_js_1.reservierung)(ort, data) };
107
113
  default:
108
114
  return { ...huelle, type: huelle.type, data: (0, lesen_js_1.artikel)(ort, data) };
109
115
  }
@@ -14,8 +14,8 @@ export { createInvoiceApi, type InvoiceApi, type InvoiceApiOptions } from './api
14
14
  export { invoiceKeyAuth, type InvoiceKeyAuthOptions } from './auth.js';
15
15
  export { isInvoiceError, isInvoiceErrorCode, invoiceErrorCode, invoiceFieldErrors, type InvoiceApiErrorCode, type InvoiceFieldError, } from './fehler.js';
16
16
  export { cancelInvoice, createCreditNote, createCustomer, getCustomer, getInvoice, getInvoicePdf, getInvoiceSetupStatus, getInvoiceXml, issueInvoice, listBrands, listInvoices, previewInvoice, recordInvoicePayment, searchCustomers, updateCustomer, } from './endpunkte.js';
17
- export type { Brand, CancelInvoiceRequest, CancelResult, CreditNoteItemInput, CreditNoteRequest, CreditNoteResult, Customer, CustomerInput, CustomerPage, CustomerSearch, EInvoiceStatus, Invoice, InvoiceDetail, InvoiceDetailPayment, InvoiceItem, InvoiceItemInput, InvoiceListQuery, InvoicePage, InvoiceRecipient, InvoiceSetupGap, InvoiceSetupStatus, InvoiceTotals, InvoiceXml, InvoiceNotice, InvoicePayment, InvoicePreview, InvoiceRateTotals, IssueInvoiceRequest, IssueResult, PaymentInput, PreviewResult, RecordPaymentRequest, RecordPaymentResult, } from './typen.js';
17
+ export type { Brand, CancelInvoiceRequest, CancelResult, CreditNoteItemInput, CreditNoteRequest, CreditNoteResult, Customer, CustomerInput, CustomerPage, CustomerSearch, EInvoiceStatus, Invoice, InvoiceDetail, InvoiceDetailPayment, InvoiceItem, InvoiceItemInput, IssueInvoiceItemInput, InvoiceListQuery, InvoicePage, InvoiceRecipient, InvoiceSetupGap, InvoiceSetupStatus, InvoiceTotals, InvoiceXml, InvoiceNotice, InvoicePayment, InvoicePreview, InvoiceRateTotals, InvoiceVatIdProof, InvoiceVatIdRisk, IssueInvoiceRequest, IssueResult, PaymentInput, PreviewResult, RecordPaymentRequest, RecordPaymentResult, } from './typen.js';
18
18
  export { INVOICE_TEXTS, invoiceText, type InvoiceTextKey } from './texte.js';
19
19
  export { computeInvoiceTotals, ZERO_RATED_TAX_SCHEMES, type TotalsItem } from './summen.js';
20
20
  export { proratedPriceMicros, MAX_AMOUNT_CENTS, itemFromEuro, formatUnitPrice, CalcError, calculateInvoice, roundDiv, vatRateMapKey, formatVatRate, type CalcResult, type CalcErrorCode, type CalcOptions, type CalcItem, type RateTotal, type ItemConversion, type ConversionReason, type LineAmount, } from './calc.js';
21
- export { INVOICE_CONTRACT_VERSION, INVOICE_ENDPOINTS, INVOICE_ERROR_CODES, INVOICE_REQUEST_ERROR_CODES, CREDIT_NOTE_REASONS, TAX_SCHEMES, PRICE_MODES, VAT_RATES, CUSTOMER_TYPES, INVOICE_LIST_STATUS, DOC_TYPES, EINVOICE_FORMATS, EINVOICE_MISSING_CODES, WRITE_OFF_REASON_CODES, INVOICE_LANGUAGES, INVOICE_PAYMENT_METHODS, ITEM_KINDS, REVERSE_CHARGE_REASONS, INVOICE_NOTICE_CODES, INVOICE_UNITS, INVOICE_UNIT_CODES, INVOICE_SETUP_REQUIREMENTS, CUSTOMER_FIELDS, ITEM_FIELDS, CREDIT_NOTE_ITEM_FIELDS, RETURN_DISPOSITIONS, ITEM_PRICE_EXACTLY_ONE, INVOICE_REQUESTS, INVOICE_EXACTLY_ONE, INVOICE_AT_LEAST_ONE, type InvoiceEndpoint, type InvoiceErrorCode, type InvoiceRequestErrorCode, type CreditNoteReason, type ReturnDisposition, type TaxScheme, type PriceMode, type VatRatePercent, type CustomerType, type InvoiceListStatus, type DocType, type EInvoiceFormat, type EInvoiceMissingCode, type WriteOffReasonCode, type InvoiceLanguage, type InvoicePaymentMethod, type ItemKind, type ReverseChargeReason, type InvoiceNoticeCode, type InvoiceUnit, type InvoiceSetupRequirement, type FieldFormat, type Field, } from './vertrag.js';
21
+ export { INVOICE_CONTRACT_VERSION, INVOICE_ENDPOINTS, INVOICE_ERROR_CODES, INVOICE_REQUEST_ERROR_CODES, CREDIT_NOTE_REASONS, TAX_SCHEMES, PRICE_MODES, VAT_RATES, CUSTOMER_TYPES, INVOICE_LIST_STATUS, DOC_TYPES, EINVOICE_FORMATS, EINVOICE_MISSING_CODES, WRITE_OFF_REASON_CODES, INVOICE_LANGUAGES, INVOICE_PAYMENT_METHODS, ITEM_KINDS, REVERSE_CHARGE_REASONS, INVOICE_NOTICE_CODES, INVOICE_UNITS, INVOICE_UNIT_CODES, INVOICE_SETUP_REQUIREMENTS, CUSTOMER_FIELDS, ITEM_FIELDS, INVOICE_ITEM_FIELDS, CREDIT_NOTE_ITEM_FIELDS, RETURN_DISPOSITIONS, ITEM_PRICE_EXACTLY_ONE, INVOICE_REQUESTS, INVOICE_EXACTLY_ONE, INVOICE_AT_LEAST_ONE, type InvoiceEndpoint, type InvoiceErrorCode, type InvoiceRequestErrorCode, type CreditNoteReason, type ReturnDisposition, type TaxScheme, type PriceMode, type VatRatePercent, type CustomerType, type InvoiceListStatus, type DocType, type EInvoiceFormat, type EInvoiceMissingCode, type WriteOffReasonCode, type InvoiceLanguage, type InvoicePaymentMethod, type ItemKind, type ReverseChargeReason, type InvoiceNoticeCode, type InvoiceUnit, type InvoiceSetupRequirement, type FieldFormat, type Field, } from './vertrag.js';
@@ -13,7 +13,7 @@
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  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.TAX_SCHEMES = exports.CREDIT_NOTE_REASONS = exports.INVOICE_REQUEST_ERROR_CODES = exports.INVOICE_ERROR_CODES = exports.INVOICE_ENDPOINTS = exports.INVOICE_CONTRACT_VERSION = exports.formatVatRate = exports.vatRateMapKey = exports.roundDiv = exports.calculateInvoice = exports.CalcError = exports.formatUnitPrice = exports.itemFromEuro = exports.MAX_AMOUNT_CENTS = exports.proratedPriceMicros = exports.ZERO_RATED_TAX_SCHEMES = exports.computeInvoiceTotals = exports.invoiceText = exports.INVOICE_TEXTS = exports.updateCustomer = exports.searchCustomers = exports.recordInvoicePayment = exports.previewInvoice = exports.listInvoices = exports.listBrands = exports.issueInvoice = exports.getInvoiceXml = exports.getInvoiceSetupStatus = exports.getInvoicePdf = exports.getInvoice = exports.getCustomer = exports.createCustomer = exports.createCreditNote = exports.cancelInvoice = exports.invoiceFieldErrors = exports.invoiceErrorCode = exports.isInvoiceErrorCode = exports.isInvoiceError = exports.invoiceKeyAuth = exports.createInvoiceApi = void 0;
16
- exports.INVOICE_AT_LEAST_ONE = exports.INVOICE_EXACTLY_ONE = exports.INVOICE_REQUESTS = exports.ITEM_PRICE_EXACTLY_ONE = exports.RETURN_DISPOSITIONS = exports.CREDIT_NOTE_ITEM_FIELDS = exports.ITEM_FIELDS = exports.CUSTOMER_FIELDS = exports.INVOICE_SETUP_REQUIREMENTS = exports.INVOICE_UNIT_CODES = exports.INVOICE_UNITS = exports.INVOICE_NOTICE_CODES = exports.REVERSE_CHARGE_REASONS = exports.ITEM_KINDS = void 0;
16
+ exports.INVOICE_AT_LEAST_ONE = exports.INVOICE_EXACTLY_ONE = exports.INVOICE_REQUESTS = exports.ITEM_PRICE_EXACTLY_ONE = exports.RETURN_DISPOSITIONS = exports.CREDIT_NOTE_ITEM_FIELDS = 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.REVERSE_CHARGE_REASONS = exports.ITEM_KINDS = void 0;
17
17
  var api_js_1 = require("./api.js");
18
18
  Object.defineProperty(exports, "createInvoiceApi", { enumerable: true, get: function () { return api_js_1.createInvoiceApi; } });
19
19
  var auth_js_1 = require("./auth.js");
@@ -80,6 +80,7 @@ Object.defineProperty(exports, "INVOICE_UNIT_CODES", { enumerable: true, get: fu
80
80
  Object.defineProperty(exports, "INVOICE_SETUP_REQUIREMENTS", { enumerable: true, get: function () { return vertrag_js_1.INVOICE_SETUP_REQUIREMENTS; } });
81
81
  Object.defineProperty(exports, "CUSTOMER_FIELDS", { enumerable: true, get: function () { return vertrag_js_1.CUSTOMER_FIELDS; } });
82
82
  Object.defineProperty(exports, "ITEM_FIELDS", { enumerable: true, get: function () { return vertrag_js_1.ITEM_FIELDS; } });
83
+ Object.defineProperty(exports, "INVOICE_ITEM_FIELDS", { enumerable: true, get: function () { return vertrag_js_1.INVOICE_ITEM_FIELDS; } });
83
84
  Object.defineProperty(exports, "CREDIT_NOTE_ITEM_FIELDS", { enumerable: true, get: function () { return vertrag_js_1.CREDIT_NOTE_ITEM_FIELDS; } });
84
85
  Object.defineProperty(exports, "RETURN_DISPOSITIONS", { enumerable: true, get: function () { return vertrag_js_1.RETURN_DISPOSITIONS; } });
85
86
  Object.defineProperty(exports, "ITEM_PRICE_EXACTLY_ONE", { enumerable: true, get: function () { return vertrag_js_1.ITEM_PRICE_EXACTLY_ONE; } });
@@ -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 = "79931a40ccaea45777da4713bba475c2f74e1fe7d6264f294cecd321964f9ded";
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 = "79931a40ccaea45777da4713bba475c2f74e1fe7d6264f294cecd321964f9ded";
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.4.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.4.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", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries"];
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", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries"];
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