@kreiseck/kasseneck-api 1.4.0 → 1.5.1
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.
- package/CHANGELOG.md +166 -0
- package/README.md +255 -36
- package/dist/cjs/client/aufrufe.d.ts +58 -4
- package/dist/cjs/client/aufrufe.js +196 -1
- package/dist/cjs/client/errors.d.ts +32 -19
- package/dist/cjs/client/errors.js +28 -17
- package/dist/cjs/client/index.d.ts +2 -2
- package/dist/cjs/client/index.js +2 -1
- package/dist/cjs/client/transport.d.ts +27 -1
- package/dist/cjs/client/transport.js +25 -27
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/inventory/api.d.ts +19 -3
- package/dist/cjs/inventory/api.js +18 -2
- package/dist/cjs/inventory/endpunkte.d.ts +22 -2
- package/dist/cjs/inventory/endpunkte.js +6 -1
- package/dist/cjs/inventory/fehler.d.ts +11 -1
- package/dist/cjs/inventory/fehler.js +19 -0
- package/dist/cjs/inventory/index.d.ts +6 -4
- package/dist/cjs/inventory/index.js +32 -2
- package/dist/cjs/inventory/lesen.d.ts +8 -1
- package/dist/cjs/inventory/lesen.js +131 -1
- package/dist/cjs/inventory/schreiben.d.ts +86 -0
- package/dist/cjs/inventory/schreiben.js +320 -0
- package/dist/cjs/inventory/typen.d.ts +371 -11
- package/dist/cjs/inventory/vertrag.d.ts +76 -16
- package/dist/cjs/inventory/vertrag.js +138 -13
- package/dist/cjs/inventory/webhook.d.ts +3 -1
- package/dist/cjs/inventory/webhook.js +7 -1
- package/dist/cjs/invoice/endpunkte.d.ts +6 -0
- package/dist/cjs/invoice/endpunkte.js +13 -2
- package/dist/cjs/invoice/index.d.ts +2 -2
- package/dist/cjs/invoice/index.js +2 -1
- package/dist/cjs/invoice/typen.d.ts +46 -2
- package/dist/cjs/invoice/vertrag.d.ts +19 -5
- package/dist/cjs/invoice/vertrag.js +37 -5
- package/dist/cjs/pos/texte.d.ts +11 -6
- package/dist/cjs/pos/texte.js +11 -6
- package/dist/cjs/stored/vokabular.d.ts +1 -1
- package/dist/cjs/stored/vokabular.js +5 -3
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/aufrufe.d.ts +58 -4
- package/dist/esm/client/aufrufe.js +194 -0
- package/dist/esm/client/errors.d.ts +32 -19
- package/dist/esm/client/errors.js +28 -17
- package/dist/esm/client/index.d.ts +2 -2
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/client/transport.d.ts +27 -1
- package/dist/esm/client/transport.js +26 -28
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/inventory/api.d.ts +19 -3
- package/dist/esm/inventory/api.js +18 -2
- package/dist/esm/inventory/endpunkte.d.ts +22 -2
- package/dist/esm/inventory/endpunkte.js +6 -5
- package/dist/esm/inventory/fehler.d.ts +11 -1
- package/dist/esm/inventory/fehler.js +18 -1
- package/dist/esm/inventory/index.d.ts +6 -4
- package/dist/esm/inventory/index.js +5 -3
- package/dist/esm/inventory/lesen.d.ts +8 -1
- package/dist/esm/inventory/lesen.js +127 -1
- package/dist/esm/inventory/schreiben.d.ts +86 -0
- package/dist/esm/inventory/schreiben.js +303 -0
- package/dist/esm/inventory/typen.d.ts +371 -11
- package/dist/esm/inventory/vertrag.d.ts +76 -16
- package/dist/esm/inventory/vertrag.js +137 -12
- package/dist/esm/inventory/webhook.d.ts +3 -1
- package/dist/esm/inventory/webhook.js +8 -2
- package/dist/esm/invoice/endpunkte.d.ts +6 -0
- package/dist/esm/invoice/endpunkte.js +13 -2
- package/dist/esm/invoice/index.d.ts +2 -2
- package/dist/esm/invoice/index.js +1 -1
- package/dist/esm/invoice/typen.d.ts +46 -2
- package/dist/esm/invoice/vertrag.d.ts +19 -5
- package/dist/esm/invoice/vertrag.js +36 -4
- package/dist/esm/pos/texte.d.ts +11 -6
- package/dist/esm/pos/texte.js +11 -6
- package/dist/esm/stored/vokabular.d.ts +1 -1
- package/dist/esm/stored/vokabular.js +5 -3
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/fixtures/hobex-hps-codes.json +1 -1
- package/fixtures/invoice-api-examples/credit-error-reservation.json +26 -0
- package/fixtures/invoice-api-examples/issue-error-reservation-article.json +25 -0
- package/fixtures/invoice-api-examples/issue-error-vat-id-risk.json +26 -0
- package/fixtures/invoice-api-examples/issue-reservation.json +24 -0
- package/fixtures/invoice-api-examples/issue-vat-id-risk.json +28 -0
- package/fixtures/invoice-api.schema.json +15 -2
- package/fixtures/invoice-texts.json +1 -1
- package/fixtures/pos-texts.json +1 -1
- package/fixtures/surface.json +206 -9
- package/fixtures/v3/antworten/belege.json +2 -2
- package/fixtures/v3/antworten/belegmail.json +2 -2
- package/fixtures/v3/antworten/kasse-belege.json +2 -2
- package/fixtures/v3/antworten/kasse.json +3 -3
- package/fixtures/v3/antworten/lager.json +2491 -130
- package/fixtures/v3/antworten/rechnungen.json +267 -44
- package/fixtures/v3/antworten/storno.json +2 -2
- package/fixtures/v3/stored/belege.json +2 -2
- package/fixtures/v3/stored/kasse.json +3 -3
- package/fixtures/v3/stored/rechnungen.json +174 -18
- package/fixtures/v3/v3-vokabular.json +593 -23
- package/fixtures/v3/zahlbetrag-faelle.json +2 -2
- package/package.json +1 -1
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Der Vertrag der Lager-API (Backend Stufe 5a
|
|
4
|
-
*
|
|
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
|
|
9
|
-
* `
|
|
10
|
-
*
|
|
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
|
|
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
|
|
96
|
-
*
|
|
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
|
|
117
|
-
* `
|
|
118
|
-
*
|
|
119
|
-
*
|
|
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 `
|
|
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 `
|
|
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
|
}
|
|
@@ -12,6 +12,12 @@
|
|
|
12
12
|
* **Nicht automatisch wiederholen.** Wer nach einem Zeitlimit erneut
|
|
13
13
|
* ausstellt, tut das mit **demselben** `idempotencyKey`: dann kommt die schon
|
|
14
14
|
* ausgestellte Rechnung zurueck (`replayed: true`) statt einer zweiten.
|
|
15
|
+
* Jeder Aufruf mit Wirkung (ausstellen, stornieren, gutschreiben, Zahlung
|
|
16
|
+
* nachtragen, Kunde anlegen oder aendern) meldet nach Zeitlimit, Netzfehler,
|
|
17
|
+
* HTTP 5xx oder unlesbarer Antwort `outcome: 'unknown'`: er kann gewirkt
|
|
18
|
+
* haben. Mit Schluessel denselben Schluessel erneut senden, ohne Schluessel
|
|
19
|
+
* (`updateCustomer`, `createCustomer` ohne) erst nachlesen. Lesen und der
|
|
20
|
+
* Probelauf (`previewInvoice`) bleiben `'rejected'`.
|
|
15
21
|
*
|
|
16
22
|
* Nach dem Senden wird nichts hart gecastet: fehlt ein zugesagtes Feld, wirft
|
|
17
23
|
* der Aufruf `KasseneckValidationError` mit `scope:'response'`.
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
* **Nicht automatisch wiederholen.** Wer nach einem Zeitlimit erneut
|
|
14
14
|
* ausstellt, tut das mit **demselben** `idempotencyKey`: dann kommt die schon
|
|
15
15
|
* ausgestellte Rechnung zurueck (`replayed: true`) statt einer zweiten.
|
|
16
|
+
* Jeder Aufruf mit Wirkung (ausstellen, stornieren, gutschreiben, Zahlung
|
|
17
|
+
* nachtragen, Kunde anlegen oder aendern) meldet nach Zeitlimit, Netzfehler,
|
|
18
|
+
* HTTP 5xx oder unlesbarer Antwort `outcome: 'unknown'`: er kann gewirkt
|
|
19
|
+
* haben. Mit Schluessel denselben Schluessel erneut senden, ohne Schluessel
|
|
20
|
+
* (`updateCustomer`, `createCustomer` ohne) erst nachlesen. Lesen und der
|
|
21
|
+
* Probelauf (`previewInvoice`) bleiben `'rejected'`.
|
|
16
22
|
*
|
|
17
23
|
* Nach dem Senden wird nichts hart gecastet: fehlt ein zugesagtes Feld, wirft
|
|
18
24
|
* der Aufruf `KasseneckValidationError` mit `scope:'response'`.
|
|
@@ -110,7 +116,10 @@ async function searchCustomers(transport, search) {
|
|
|
110
116
|
}
|
|
111
117
|
// ---- Rechnungen -------------------------------------------------------------
|
|
112
118
|
async function issueInvoice(transport, request) {
|
|
113
|
-
const
|
|
119
|
+
const params = nutzlast(request);
|
|
120
|
+
// Ohne Typen kann `dryRun: true` hier ankommen: dann ist es ein Probelauf
|
|
121
|
+
// ohne Wirkung (sonst: `previewInvoice`).
|
|
122
|
+
const daten = await transport('issueInvoice', params, undefined, undefined, { hasEffect: params['dryRun'] !== true });
|
|
114
123
|
const ergebnis = {
|
|
115
124
|
invoice: pflichtObjekt('issueInvoice', daten, 'invoice'),
|
|
116
125
|
replayed: objekt(daten)['replayed'] === true,
|
|
@@ -131,7 +140,9 @@ async function issueInvoice(transport, request) {
|
|
|
131
140
|
* Probelauf und Ausstellen kann sich der Kunde oder das Konto aendern.
|
|
132
141
|
*/
|
|
133
142
|
async function previewInvoice(transport, request) {
|
|
134
|
-
|
|
143
|
+
// Ein Probelauf schreibt nichts: nach einem Zeitlimit bleibt er `rejected`,
|
|
144
|
+
// obwohl `issueInvoice` sonst Wirkung hat.
|
|
145
|
+
const daten = await transport('issueInvoice', { ...nutzlast(request), dryRun: true }, undefined, undefined, { hasEffect: false });
|
|
135
146
|
const ergebnis = { preview: pflichtObjekt('issueInvoice', daten, 'preview') };
|
|
136
147
|
const notice = hinweise(daten);
|
|
137
148
|
if (notice)
|
|
@@ -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
|
-
/**
|
|
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:
|
|
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
|
|
277
|
-
* (wohin die zurueckgenommene Ware geht)
|
|
278
|
-
*
|
|
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.
|
|
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
|
|
453
|
-
* (wohin die zurueckgenommene Ware geht)
|
|
454
|
-
*
|
|
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),
|
package/dist/cjs/pos/texte.d.ts
CHANGED
|
@@ -661,12 +661,17 @@ export interface ErrorRuleDetail {
|
|
|
661
661
|
export declare function findErrorRule(kind: ErrorKind, detail?: ErrorRuleDetail): ErrorRule;
|
|
662
662
|
/**
|
|
663
663
|
* Kassen-Aufrufe mit Wirkung, die sich nach einem Netzfehler nicht gefahrlos
|
|
664
|
-
* wiederholen lassen:
|
|
665
|
-
*
|
|
666
|
-
*
|
|
667
|
-
*
|
|
668
|
-
*
|
|
669
|
-
*
|
|
664
|
+
* wiederholen lassen: Beleg (auch Null- und Startbeleg ueber
|
|
665
|
+
* `createReceipt`), Storno, FinanzOnline, die drei Geldwege, der Druckjob
|
|
666
|
+
* (zweiter Bon) und die Belegmail (zweite Mail). Ob die Anfrage vor dem
|
|
667
|
+
* Abriss schon draussen war, sieht das Paket nicht (fetch wirft in beiden
|
|
668
|
+
* Faellen gleich); darum gilt hier immer der vorsichtige Satz, auch fuer
|
|
669
|
+
* einen Fehler, der vor dem Senden entstand.
|
|
670
|
+
*
|
|
671
|
+
* Seit 1.5.1 fuehrt der Transport jeden Aufruf mit Wirkung als unklar
|
|
672
|
+
* (`UNKNOWN_OUTCOME_CALLS`, eine Obermenge dieser Liste), und
|
|
673
|
+
* [messageOutcome] folgt zuerst ihm. Die Liste bleibt als Vertrag der
|
|
674
|
+
* Kassentexte (`callsWithEffect` in `fixtures/pos-texts.json`) unveraendert.
|
|
670
675
|
*/
|
|
671
676
|
export declare const CALLS_WITH_EFFECT: readonly ["createReceipt", "cancelReceipt", "financeWebService", "hobexPayApi", "hobexRefundApi", "stripeCaptureIntent", "createPrintJob", "sendReceiptEmail"];
|
|
672
677
|
/**
|
package/dist/cjs/pos/texte.js
CHANGED
|
@@ -378,12 +378,17 @@ function findErrorRule(kind, detail = {}) {
|
|
|
378
378
|
}
|
|
379
379
|
/**
|
|
380
380
|
* Kassen-Aufrufe mit Wirkung, die sich nach einem Netzfehler nicht gefahrlos
|
|
381
|
-
* wiederholen lassen:
|
|
382
|
-
*
|
|
383
|
-
*
|
|
384
|
-
*
|
|
385
|
-
*
|
|
386
|
-
*
|
|
381
|
+
* wiederholen lassen: Beleg (auch Null- und Startbeleg ueber
|
|
382
|
+
* `createReceipt`), Storno, FinanzOnline, die drei Geldwege, der Druckjob
|
|
383
|
+
* (zweiter Bon) und die Belegmail (zweite Mail). Ob die Anfrage vor dem
|
|
384
|
+
* Abriss schon draussen war, sieht das Paket nicht (fetch wirft in beiden
|
|
385
|
+
* Faellen gleich); darum gilt hier immer der vorsichtige Satz, auch fuer
|
|
386
|
+
* einen Fehler, der vor dem Senden entstand.
|
|
387
|
+
*
|
|
388
|
+
* Seit 1.5.1 fuehrt der Transport jeden Aufruf mit Wirkung als unklar
|
|
389
|
+
* (`UNKNOWN_OUTCOME_CALLS`, eine Obermenge dieser Liste), und
|
|
390
|
+
* [messageOutcome] folgt zuerst ihm. Die Liste bleibt als Vertrag der
|
|
391
|
+
* Kassentexte (`callsWithEffect` in `fixtures/pos-texts.json`) unveraendert.
|
|
387
392
|
*/
|
|
388
393
|
exports.CALLS_WITH_EFFECT = Object.freeze([
|
|
389
394
|
'createReceipt',
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Fingerabdruck des Vertrags-Exports, aus dem diese Datei stammt (`_quelle.sha256`). */
|
|
2
|
-
export declare const VOKABULAR_QUELLE = "
|
|
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 {
|