@kreiseck/kasseneck-api 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +176 -0
- package/README.md +293 -1
- package/dist/cjs/client/aufrufe.d.ts +2 -2
- package/dist/cjs/client/aufrufe.js +58 -0
- package/dist/cjs/inventory/api.d.ts +61 -0
- package/dist/cjs/inventory/api.js +54 -0
- package/dist/cjs/inventory/auth.d.ts +17 -0
- package/dist/cjs/inventory/auth.js +27 -0
- package/dist/cjs/inventory/endpunkte.d.ts +91 -0
- package/dist/cjs/inventory/endpunkte.js +290 -0
- package/dist/cjs/inventory/fehler.d.ts +43 -0
- package/dist/cjs/inventory/fehler.js +66 -0
- package/dist/cjs/inventory/index.d.ts +21 -0
- package/dist/cjs/inventory/index.js +94 -0
- package/dist/cjs/inventory/lesen.d.ts +45 -0
- package/dist/cjs/inventory/lesen.js +424 -0
- package/dist/cjs/inventory/schreiben.d.ts +83 -0
- package/dist/cjs/inventory/schreiben.js +315 -0
- package/dist/cjs/inventory/typen.d.ts +679 -0
- package/dist/cjs/inventory/typen.js +14 -0
- package/dist/cjs/inventory/vertrag.d.ts +136 -0
- package/dist/cjs/inventory/vertrag.js +291 -0
- package/dist/cjs/inventory/webhook.d.ts +52 -0
- package/dist/cjs/inventory/webhook.js +116 -0
- 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/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 +2 -2
- package/dist/esm/client/aufrufe.js +58 -0
- package/dist/esm/inventory/api.d.ts +61 -0
- package/dist/esm/inventory/api.js +51 -0
- package/dist/esm/inventory/auth.d.ts +17 -0
- package/dist/esm/inventory/auth.js +24 -0
- package/dist/esm/inventory/endpunkte.d.ts +91 -0
- package/dist/esm/inventory/endpunkte.js +267 -0
- package/dist/esm/inventory/fehler.d.ts +43 -0
- package/dist/esm/inventory/fehler.js +57 -0
- package/dist/esm/inventory/index.d.ts +21 -0
- package/dist/esm/inventory/index.js +20 -0
- package/dist/esm/inventory/lesen.d.ts +45 -0
- package/dist/esm/inventory/lesen.js +404 -0
- package/dist/esm/inventory/schreiben.d.ts +83 -0
- package/dist/esm/inventory/schreiben.js +298 -0
- package/dist/esm/inventory/typen.d.ts +679 -0
- package/dist/esm/inventory/typen.js +13 -0
- package/dist/esm/inventory/vertrag.d.ts +136 -0
- package/dist/esm/inventory/vertrag.js +288 -0
- package/dist/esm/inventory/webhook.d.ts +52 -0
- package/dist/esm/inventory/webhook.js +107 -0
- 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/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 +306 -5
- package/fixtures/v3/README.md +9 -1
- 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 +3881 -0
- 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 +404 -4
- package/fixtures/v3/stored/rechnungen.json +174 -18
- package/fixtures/v3/v3-vokabular.json +1007 -20
- package/fixtures/v3/zahlbetrag-faelle.json +2 -2
- package/package.json +14 -2
|
@@ -89,7 +89,20 @@ export interface InvoiceItemInput {
|
|
|
89
89
|
/** Artikel aus dem Artikelstamm; bestandsgefuehrt bucht das Ausstellen ihn vom Lager ab. */
|
|
90
90
|
articleId?: string;
|
|
91
91
|
}
|
|
92
|
-
/**
|
|
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),
|
|
@@ -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 {
|
|
@@ -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 = "
|
|
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 = {
|
package/dist/cjs/version.d.ts
CHANGED
package/dist/cjs/version.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* umhuellt, muss ihn weiterhin absetzen koennen.
|
|
14
14
|
*/
|
|
15
15
|
import type { TransportBodyFields } from './transport.js';
|
|
16
|
-
export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceSetupStatus", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "getReportV2", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listBrands", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyStock", "listMyStockLocations", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook"];
|
|
16
|
+
export declare const ALL_CALLS: readonly ["activateCashregister", "cancelInvoice", "cancelReceipt", "createCreditNote", "createCustomer", "createCustomerCashregister", "createPartnerCustomer", "checkPartnerCustomerEmail", "createPartnerWebhook", "createPaymentLinkStripe", "createPrintJob", "createReceipt", "deletePartnerWebhook", "downloadDailyReport", "downloadReport", "endRegisterSession", "financeWebService", "generateFullReceiptId", "getCustomer", "getCustomerCredentials", "getCustomerSignatureStatus", "getFirstReceiptDate", "getInvoice", "getInvoicePdf", "getInvoiceSetupStatus", "getInvoiceXml", "getKasseSettings", "getPartnerCustomer", "getPartnerInfo", "getPrintJob", "getReceipt", "getReportV2", "hobexPayApi", "hobexRefundApi", "issueInvoice", "listCustomerCashregisters", "listInvoices", "listBrands", "listMyArticleGroups", "listMyArticles", "listMyCashregisters", "listMyPrinters", "listMyReceipts", "listMyStock", "listMyStockLocations", "listMyTipRecipients", "listPartnerCustomers", "listPartnerWebhookDeliveries", "listPartnerWebhooks", "listRegisterUsersForDevice", "listRegisterSessionsForDevice", "pairRegisterDevice", "recordInvoicePayment", "registerPinLogin", "registerUserLogin", "renewRegisterSession", "reportCustomerContract", "requestCustomerSignature", "searchCustomers", "sendPartnerCustomerFonLink", "sendPartnerWebhookTest", "sendReceiptEmail", "setMyCashregisterStockLocation", "setMyKasseLogo", "setMyKasseSettings", "setMyRegisterDeviceSettings", "stripeCaptureIntent", "unpairRegisterDevice", "rotatePartnerWebhookSecret", "updateCustomer", "updatePartnerWebhook", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations"];
|
|
17
17
|
export type ApiCall = typeof ALL_CALLS[number];
|
|
18
18
|
/**
|
|
19
19
|
* Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
|
|
@@ -21,7 +21,7 @@ export type ApiCall = typeof ALL_CALLS[number];
|
|
|
21
21
|
* (`fixtures/v3/v3-vokabular.json`, `endpoints.public`, umbenannt nach
|
|
22
22
|
* `names`). Ein Test haelt beide Listen deckungsgleich.
|
|
23
23
|
*/
|
|
24
|
-
export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "cancelReceipt", "sendReceiptEmail", "generateFullReceiptId", "downloadReceipt", "getFirstReceiptDate", "getReportV2", "downloadReport", "downloadDailyReport", "createPaymentLinkStripe", "stripeCaptureIntent", "hobexPayApi", "hobexRefundApi", "hobexGetStatus", "financeWebService", "listMyTipRecipients", "getPartnerInfo", "createPartnerCustomer", "checkPartnerCustomerEmail", "listPartnerCustomers", "getPartnerCustomer", "sendPartnerCustomerFonLink", "createPartnerWebhook", "updatePartnerWebhook", "deletePartnerWebhook", "listPartnerWebhooks", "sendPartnerWebhookTest", "rotatePartnerWebhookSecret", "listPartnerWebhookDeliveries", "requestCustomerSignature", "getCustomerSignatureStatus", "createCustomerCashregister", "activateCashregister", "listCustomerCashregisters", "getCustomerCredentials", "reportCustomerContract", "getPartnerBilling", "getPartnerBillingMonth", "createCustomer", "getCustomer", "updateCustomer", "searchCustomers", "issueInvoice", "cancelInvoice", "createCreditNote", "getInvoice", "listInvoices", "getInvoicePdf", "getInvoiceXml", "getInvoiceSetupStatus", "listBrands", "recordInvoicePayment", "createInvoiceItem", "updateInvoiceItem", "withdrawInvoiceItem", "getInvoiceItem", "listInvoiceItems", "setCustomerMandate", "revokeCustomerMandate"];
|
|
24
|
+
export declare const PUBLIC_CALLS: readonly ["createReceipt", "getReceipt", "cancelReceipt", "sendReceiptEmail", "generateFullReceiptId", "downloadReceipt", "getFirstReceiptDate", "getReportV2", "downloadReport", "downloadDailyReport", "createPaymentLinkStripe", "stripeCaptureIntent", "hobexPayApi", "hobexRefundApi", "hobexGetStatus", "financeWebService", "listMyTipRecipients", "getPartnerInfo", "createPartnerCustomer", "checkPartnerCustomerEmail", "listPartnerCustomers", "getPartnerCustomer", "sendPartnerCustomerFonLink", "createPartnerWebhook", "updatePartnerWebhook", "deletePartnerWebhook", "listPartnerWebhooks", "sendPartnerWebhookTest", "rotatePartnerWebhookSecret", "listPartnerWebhookDeliveries", "requestCustomerSignature", "getCustomerSignatureStatus", "createCustomerCashregister", "activateCashregister", "listCustomerCashregisters", "getCustomerCredentials", "reportCustomerContract", "getPartnerBilling", "getPartnerBillingMonth", "createCustomer", "getCustomer", "updateCustomer", "searchCustomers", "issueInvoice", "cancelInvoice", "createCreditNote", "getInvoice", "listInvoices", "getInvoicePdf", "getInvoiceXml", "getInvoiceSetupStatus", "listBrands", "recordInvoicePayment", "createInvoiceItem", "updateInvoiceItem", "withdrawInvoiceItem", "getInvoiceItem", "listInvoiceItems", "setCustomerMandate", "revokeCustomerMandate", "getArticle", "listArticles", "lookupArticleByCode", "listLocations", "getStock", "listStock", "listStockMovements", "createWebhook", "updateWebhook", "deleteWebhook", "listWebhooks", "sendWebhookTest", "rotateWebhookSecret", "listWebhookDeliveries", "createArticle", "updateArticle", "deactivateArticle", "receiveGoods", "transferStock", "recordStockLoss", "changeStockCondition", "reverseStockMovement", "createReservation", "extendReservation", "releaseReservation", "getReservation", "listReservations"];
|
|
25
25
|
/**
|
|
26
26
|
* Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
|
|
27
27
|
* Web-Kasse: gleicher Ursprung `/api/v3`), in der Reihenfolge von
|
|
@@ -70,6 +70,35 @@ export const ALL_CALLS = [
|
|
|
70
70
|
'rotatePartnerWebhookSecret',
|
|
71
71
|
'updateCustomer',
|
|
72
72
|
'updatePartnerWebhook',
|
|
73
|
+
// Lager-API (Stufe 5a, ./inventory)
|
|
74
|
+
'getArticle',
|
|
75
|
+
'listArticles',
|
|
76
|
+
'lookupArticleByCode',
|
|
77
|
+
'listLocations',
|
|
78
|
+
'getStock',
|
|
79
|
+
'listStock',
|
|
80
|
+
'listStockMovements',
|
|
81
|
+
'createWebhook',
|
|
82
|
+
'updateWebhook',
|
|
83
|
+
'deleteWebhook',
|
|
84
|
+
'listWebhooks',
|
|
85
|
+
'sendWebhookTest',
|
|
86
|
+
'rotateWebhookSecret',
|
|
87
|
+
'listWebhookDeliveries',
|
|
88
|
+
// Lager-API schreiben und Reservierung (Stufe 5b, ./inventory)
|
|
89
|
+
'createArticle',
|
|
90
|
+
'updateArticle',
|
|
91
|
+
'deactivateArticle',
|
|
92
|
+
'receiveGoods',
|
|
93
|
+
'transferStock',
|
|
94
|
+
'recordStockLoss',
|
|
95
|
+
'changeStockCondition',
|
|
96
|
+
'reverseStockMovement',
|
|
97
|
+
'createReservation',
|
|
98
|
+
'extendReservation',
|
|
99
|
+
'releaseReservation',
|
|
100
|
+
'getReservation',
|
|
101
|
+
'listReservations',
|
|
73
102
|
];
|
|
74
103
|
/**
|
|
75
104
|
* Die oeffentlichen Endpunkte unter `/v3` (`https://api.kasseneck.at/v3/<name>`),
|
|
@@ -141,6 +170,35 @@ export const PUBLIC_CALLS = [
|
|
|
141
170
|
'listInvoiceItems',
|
|
142
171
|
'setCustomerMandate',
|
|
143
172
|
'revokeCustomerMandate',
|
|
173
|
+
// Lager-API lesen und Konto-Webhooks (Backend Stufe 5a), umhuellt in `./inventory`.
|
|
174
|
+
'getArticle',
|
|
175
|
+
'listArticles',
|
|
176
|
+
'lookupArticleByCode',
|
|
177
|
+
'listLocations',
|
|
178
|
+
'getStock',
|
|
179
|
+
'listStock',
|
|
180
|
+
'listStockMovements',
|
|
181
|
+
'createWebhook',
|
|
182
|
+
'updateWebhook',
|
|
183
|
+
'deleteWebhook',
|
|
184
|
+
'listWebhooks',
|
|
185
|
+
'sendWebhookTest',
|
|
186
|
+
'rotateWebhookSecret',
|
|
187
|
+
'listWebhookDeliveries',
|
|
188
|
+
// Lager-API schreiben und Reservierung (Backend Stufe 5b), umhuellt in `./inventory`.
|
|
189
|
+
'createArticle',
|
|
190
|
+
'updateArticle',
|
|
191
|
+
'deactivateArticle',
|
|
192
|
+
'receiveGoods',
|
|
193
|
+
'transferStock',
|
|
194
|
+
'recordStockLoss',
|
|
195
|
+
'changeStockCondition',
|
|
196
|
+
'reverseStockMovement',
|
|
197
|
+
'createReservation',
|
|
198
|
+
'extendReservation',
|
|
199
|
+
'releaseReservation',
|
|
200
|
+
'getReservation',
|
|
201
|
+
'listReservations',
|
|
144
202
|
];
|
|
145
203
|
/**
|
|
146
204
|
* Die Endpunkte des Kassenwegs (`https://kasse.kasseneck.at/api/v3/<name>`,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fassade ueber den Aufrufen der Lager-API (lesen, Webhooks, schreiben,
|
|
3
|
+
* reservieren): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
|
|
4
|
+
* Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
|
|
5
|
+
*/
|
|
6
|
+
import { type FetchLike } from '../client/transport.js';
|
|
7
|
+
import type { Article, ChangeStockConditionRequest, CreateArticleRequest, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptPreview, GoodsReceiptPreviewRequest, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationRequest, Reservation, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockOperation, TransferStockRequest, UpdateArticleRequest, ArticleListQuery, ArticleLookup, ArticlePage, CreateInventoryWebhookOptions, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestResult, InventoryWebhookWithSecret, Location, StockLevel, StockListQuery, StockMovement, StockMovementPage, StockMovementQuery, StockPage, StockResult } from './typen.js';
|
|
8
|
+
import type { InventoryWebhookEventType } from './vertrag.js';
|
|
9
|
+
export interface InventoryClientOptions {
|
|
10
|
+
/** `api_key` des Kontos (`kr_live_…` / `kr_test_…`). Gehoert auf einen Server. */
|
|
11
|
+
apiKey: string;
|
|
12
|
+
/** Abweichende Basis-URL (eigener Proxy); muss auf `/v3` enden. Vorgabe `https://api.kasseneck.at/v3`. */
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
/** Zeitlimit je Aufruf in Millisekunden. */
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
/** Eigene `fetch`-Umsetzung (Tests, Proxys). */
|
|
17
|
+
fetch?: FetchLike;
|
|
18
|
+
}
|
|
19
|
+
export interface InventoryClient {
|
|
20
|
+
getArticle(articleId: string): Promise<Article>;
|
|
21
|
+
listArticles(query?: ArticleListQuery): Promise<ArticlePage>;
|
|
22
|
+
/** Alle Artikel der Abfrage ueber `nextCursor`: `for await (const a of client.iterateArticles())`. */
|
|
23
|
+
iterateArticles(query?: ArticleListQuery): AsyncGenerator<Article, void, undefined>;
|
|
24
|
+
lookupArticleByCode(lookup: ArticleLookup): Promise<Article>;
|
|
25
|
+
listLocations(): Promise<Location[]>;
|
|
26
|
+
getStock(articleId: string): Promise<StockResult>;
|
|
27
|
+
listStock(query?: StockListQuery): Promise<StockPage>;
|
|
28
|
+
iterateStock(query?: StockListQuery): AsyncGenerator<StockLevel, void, undefined>;
|
|
29
|
+
listStockMovements(query?: StockMovementQuery): Promise<StockMovementPage>;
|
|
30
|
+
iterateStockMovements(query?: StockMovementQuery): AsyncGenerator<StockMovement, void, undefined>;
|
|
31
|
+
createWebhook(options: CreateInventoryWebhookOptions): Promise<InventoryWebhookWithSecret>;
|
|
32
|
+
updateWebhook(webhookId: string, patch: InventoryWebhookPatch): Promise<InventoryWebhook>;
|
|
33
|
+
deleteWebhook(webhookId: string): Promise<{
|
|
34
|
+
webhookId: string;
|
|
35
|
+
deleted: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
listWebhooks(): Promise<InventoryWebhookList>;
|
|
38
|
+
sendWebhookTest(webhookId: string, event: InventoryWebhookEventType | (string & {})): Promise<InventoryWebhookTestResult>;
|
|
39
|
+
rotateWebhookSecret(webhookId: string): Promise<InventoryWebhookWithSecret>;
|
|
40
|
+
listWebhookDeliveries(options?: {
|
|
41
|
+
webhookId?: string;
|
|
42
|
+
limit?: number;
|
|
43
|
+
}): Promise<InventoryWebhookDelivery[]>;
|
|
44
|
+
createArticle(request: CreateArticleRequest): Promise<Article>;
|
|
45
|
+
updateArticle(request: UpdateArticleRequest): Promise<Article>;
|
|
46
|
+
deactivateArticle(request: DeactivateArticleRequest): Promise<Article>;
|
|
47
|
+
receiveGoods(request: ReceiveGoodsRequest): Promise<StockOperation>;
|
|
48
|
+
/** `receiveGoods` mit `dryRun: true`: rechnet, schreibt nichts, Schluessel freigestellt. */
|
|
49
|
+
previewGoodsReceipt(request: GoodsReceiptPreviewRequest): Promise<GoodsReceiptPreview>;
|
|
50
|
+
transferStock(request: TransferStockRequest): Promise<StockOperation>;
|
|
51
|
+
recordStockLoss(request: RecordStockLossRequest): Promise<StockOperation>;
|
|
52
|
+
changeStockCondition(request: ChangeStockConditionRequest): Promise<StockOperation>;
|
|
53
|
+
reverseStockMovement(request: ReverseStockMovementRequest): Promise<StockOperation>;
|
|
54
|
+
createReservation(request: CreateReservationRequest): Promise<Reservation>;
|
|
55
|
+
extendReservation(request: ExtendReservationRequest): Promise<Reservation>;
|
|
56
|
+
releaseReservation(request: ReleaseReservationRequest): Promise<Reservation>;
|
|
57
|
+
getReservation(reservationId: string): Promise<Reservation>;
|
|
58
|
+
listReservations(query?: ReservationListQuery): Promise<ReservationPage>;
|
|
59
|
+
iterateReservations(query?: ReservationListQuery): AsyncGenerator<Reservation, void, undefined>;
|
|
60
|
+
}
|
|
61
|
+
export declare function createInventoryClient(options: InventoryClientOptions): InventoryClient;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fassade ueber den Aufrufen der Lager-API (lesen, Webhooks, schreiben,
|
|
3
|
+
* reservieren): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
|
|
4
|
+
* Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
|
|
5
|
+
*/
|
|
6
|
+
import { createTransport } from '../client/transport.js';
|
|
7
|
+
import { inventoryKeyAuth } from './auth.js';
|
|
8
|
+
import { createWebhook, deleteWebhook, getArticle, getStock, iterateArticles, iterateStock, iterateStockMovements, listArticles, listLocations, listStock, listStockMovements, listWebhookDeliveries, listWebhooks, lookupArticleByCode, rotateWebhookSecret, sendWebhookTest, updateWebhook, } from './endpunkte.js';
|
|
9
|
+
import { changeStockCondition, createArticle, createReservation, deactivateArticle, extendReservation, getReservation, iterateReservations, listReservations, previewGoodsReceipt, receiveGoods, recordStockLoss, releaseReservation, reverseStockMovement, transferStock, updateArticle, } from './schreiben.js';
|
|
10
|
+
export function createInventoryClient(options) {
|
|
11
|
+
const rufen = createTransport({
|
|
12
|
+
auth: inventoryKeyAuth({ apiKey: options.apiKey }),
|
|
13
|
+
baseUrl: options.baseUrl,
|
|
14
|
+
timeoutMs: options.timeoutMs,
|
|
15
|
+
fetch: options.fetch,
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
getArticle: (id) => getArticle(rufen, id),
|
|
19
|
+
listArticles: (q) => listArticles(rufen, q),
|
|
20
|
+
iterateArticles: (q) => iterateArticles(rufen, q),
|
|
21
|
+
lookupArticleByCode: (l) => lookupArticleByCode(rufen, l),
|
|
22
|
+
listLocations: () => listLocations(rufen),
|
|
23
|
+
getStock: (id) => getStock(rufen, id),
|
|
24
|
+
listStock: (q) => listStock(rufen, q),
|
|
25
|
+
iterateStock: (q) => iterateStock(rufen, q),
|
|
26
|
+
listStockMovements: (q) => listStockMovements(rufen, q),
|
|
27
|
+
iterateStockMovements: (q) => iterateStockMovements(rufen, q),
|
|
28
|
+
createWebhook: (o) => createWebhook(rufen, o),
|
|
29
|
+
updateWebhook: (id, patch) => updateWebhook(rufen, id, patch),
|
|
30
|
+
deleteWebhook: (id) => deleteWebhook(rufen, id),
|
|
31
|
+
listWebhooks: () => listWebhooks(rufen),
|
|
32
|
+
sendWebhookTest: (id, event) => sendWebhookTest(rufen, id, event),
|
|
33
|
+
rotateWebhookSecret: (id) => rotateWebhookSecret(rufen, id),
|
|
34
|
+
listWebhookDeliveries: (o) => listWebhookDeliveries(rufen, o),
|
|
35
|
+
createArticle: (r) => createArticle(rufen, r),
|
|
36
|
+
updateArticle: (r) => updateArticle(rufen, r),
|
|
37
|
+
deactivateArticle: (r) => deactivateArticle(rufen, r),
|
|
38
|
+
receiveGoods: (r) => receiveGoods(rufen, r),
|
|
39
|
+
previewGoodsReceipt: (r) => previewGoodsReceipt(rufen, r),
|
|
40
|
+
transferStock: (r) => transferStock(rufen, r),
|
|
41
|
+
recordStockLoss: (r) => recordStockLoss(rufen, r),
|
|
42
|
+
changeStockCondition: (r) => changeStockCondition(rufen, r),
|
|
43
|
+
reverseStockMovement: (r) => reverseStockMovement(rufen, r),
|
|
44
|
+
createReservation: (r) => createReservation(rufen, r),
|
|
45
|
+
extendReservation: (r) => extendReservation(rufen, r),
|
|
46
|
+
releaseReservation: (r) => releaseReservation(rufen, r),
|
|
47
|
+
getReservation: (id) => getReservation(rufen, id),
|
|
48
|
+
listReservations: (q) => listReservations(rufen, q),
|
|
49
|
+
iterateReservations: (q) => iterateReservations(rufen, q),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anmeldung fuer die Lager-API: der `api_key` des Kontos als Bearer, ohne
|
|
3
|
+
* `cashregister-token` (gelesen wird am Konto, nicht an einer Kasse).
|
|
4
|
+
*
|
|
5
|
+
* **Der Schluessel gehoert auf einen Server**, etwa in das Backend eines
|
|
6
|
+
* Online-Shops, nie in ein Browser-Buendel.
|
|
7
|
+
*
|
|
8
|
+
* Geprueft wird nur, was ohne Netz sicher falsch ist: ein leerer Wert, ein
|
|
9
|
+
* Partner-Schluessel (`pk_…`) oder ein Kassen-Token (`cb_…`). Die Meldung
|
|
10
|
+
* nennt nie den Wert, nur seine Art.
|
|
11
|
+
*/
|
|
12
|
+
import type { KasseneckAuth } from '../client/auth.js';
|
|
13
|
+
export interface InventoryKeyAuthOptions {
|
|
14
|
+
/** `api_key` des Kontos, z. B. `kr_live_…` oder `kr_test_…`. */
|
|
15
|
+
apiKey: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function inventoryKeyAuth(options: InventoryKeyAuthOptions): KasseneckAuth;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anmeldung fuer die Lager-API: der `api_key` des Kontos als Bearer, ohne
|
|
3
|
+
* `cashregister-token` (gelesen wird am Konto, nicht an einer Kasse).
|
|
4
|
+
*
|
|
5
|
+
* **Der Schluessel gehoert auf einen Server**, etwa in das Backend eines
|
|
6
|
+
* Online-Shops, nie in ein Browser-Buendel.
|
|
7
|
+
*
|
|
8
|
+
* Geprueft wird nur, was ohne Netz sicher falsch ist: ein leerer Wert, ein
|
|
9
|
+
* Partner-Schluessel (`pk_…`) oder ein Kassen-Token (`cb_…`). Die Meldung
|
|
10
|
+
* nennt nie den Wert, nur seine Art.
|
|
11
|
+
*/
|
|
12
|
+
import { KasseneckAuthError } from '../client/errors.js';
|
|
13
|
+
export function inventoryKeyAuth(options) {
|
|
14
|
+
const schluessel = typeof options?.apiKey === 'string' ? options.apiKey.trim() : '';
|
|
15
|
+
if (!schluessel)
|
|
16
|
+
throw new KasseneckAuthError('inventoryKeyAuth: apiKey fehlt');
|
|
17
|
+
if (/^pk_(live|test)_/i.test(schluessel)) {
|
|
18
|
+
throw new KasseneckAuthError('inventoryKeyAuth: das ist ein Partner-Schluessel (pk_…); die Lager-API nimmt den api_key des Kontos (kr_…)');
|
|
19
|
+
}
|
|
20
|
+
if (/^cb_(live|test)_/i.test(schluessel)) {
|
|
21
|
+
throw new KasseneckAuthError('inventoryKeyAuth: das ist ein Kassen-Token (cb_…); die Lager-API nimmt den api_key des Kontos (kr_…)');
|
|
22
|
+
}
|
|
23
|
+
return () => ({ headers: { Authorization: `Bearer ${schluessel}` }, params: {} });
|
|
24
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Die Aufrufe der Lager-API: Artikel, Standorte, Bestand und Bewegungen
|
|
3
|
+
* lesen, Konto-Webhooks verwalten (Backend Stufe 5a). Die schreibenden
|
|
4
|
+
* Aufrufe (Stufe 5b) stehen in `schreiben.ts` und teilen die Helfer hier.
|
|
5
|
+
*
|
|
6
|
+
* Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln
|
|
7
|
+
* importierbar; die Fassade [createInventoryClient] bindet ihn nur einmal.
|
|
8
|
+
*
|
|
9
|
+
* **Geprueft wird hier nur, was ohne Netz sicher falsch ist** (leere Kennung,
|
|
10
|
+
* `limit` ausserhalb 1–200, eine Aenderung ohne Feld). Alles Fachliche prueft
|
|
11
|
+
* der Server und meldet es als `validation` mit `errors[]`; zwei Pruefungen
|
|
12
|
+
* hiessen zwei Wahrheiten.
|
|
13
|
+
*
|
|
14
|
+
* Lesen hat keine Wirkung: nach einem Zeitlimit darf derselbe Aufruf
|
|
15
|
+
* wiederholt werden. Bei `rate_limited` vorher `retryAfterSec` warten
|
|
16
|
+
* ([inventoryRetryAfterSec]).
|
|
17
|
+
*/
|
|
18
|
+
import type { ApiCall, InternerTransport } from '../client/aufrufe.js';
|
|
19
|
+
import { KasseneckValidationError } from '../client/errors.js';
|
|
20
|
+
import type { Article, ArticleListQuery, ArticleLookup, ArticlePage, CreateInventoryWebhookOptions, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestResult, InventoryWebhookWithSecret, Location, StockLevel, StockListQuery, StockMovement, StockMovementPage, StockMovementQuery, StockPage, StockResult } from './typen.js';
|
|
21
|
+
type Params = Record<string, unknown>;
|
|
22
|
+
export declare function anfragefehler(name: ApiCall, grund: string): KasseneckValidationError;
|
|
23
|
+
/** Eine Kennung, die gesendet werden muss: Text mit mindestens einem Zeichen ausser Leerraum. */
|
|
24
|
+
export declare function kennung(name: ApiCall, feld: string, wert: unknown): string;
|
|
25
|
+
/**
|
|
26
|
+
* Die Abfrage einer Liste als Parameter. Unbekannte Felder gehen unveraendert
|
|
27
|
+
* hinaus (der Server weist sie mit `validation` ab), `undefined` faellt weg.
|
|
28
|
+
*/
|
|
29
|
+
export declare function abfrage(name: ApiCall, query: object | undefined): Params;
|
|
30
|
+
/**
|
|
31
|
+
* Blaettert ueber alle Seiten, Eintrag fuer Eintrag. Derselbe Cursor zweimal
|
|
32
|
+
* waere eine Endlosschleife: dann endet die Schleife mit einem Antwortfehler.
|
|
33
|
+
*/
|
|
34
|
+
export declare function seitenweise<T>(name: ApiCall, start: string | undefined, seite: (cursor: string | undefined) => Promise<{
|
|
35
|
+
eintraege: T[];
|
|
36
|
+
nextCursor: string | null;
|
|
37
|
+
}>): AsyncGenerator<T, void, undefined>;
|
|
38
|
+
export declare function getArticle(transport: InternerTransport, articleId: string): Promise<Article>;
|
|
39
|
+
export declare function listArticles(transport: InternerTransport, query?: ArticleListQuery): Promise<ArticlePage>;
|
|
40
|
+
/** Alle Artikel der Abfrage, Seite fuer Seite ueber `nextCursor`. */
|
|
41
|
+
export declare function iterateArticles(transport: InternerTransport, query?: ArticleListQuery): AsyncGenerator<Article, void, undefined>;
|
|
42
|
+
/**
|
|
43
|
+
* Ein aktiver Artikel per Code (`number`, `ean` oder `internalCode`) oder per
|
|
44
|
+
* eigener Kennung aus `externalIds` (`{ externalSystem: 'shop', externalId: '4711' }`).
|
|
45
|
+
* Ein stillgelegter Artikel gilt als nicht gefunden (`article_not_found`).
|
|
46
|
+
*/
|
|
47
|
+
export declare function lookupArticleByCode(transport: InternerTransport, lookup: ArticleLookup): Promise<Article>;
|
|
48
|
+
/** Alle Standorte des Kontos, samt aufgeloesten (`active: false`) und dem Hauptstandort. */
|
|
49
|
+
export declare function listLocations(transport: InternerTransport): Promise<Location[]>;
|
|
50
|
+
/** Bestand eines Artikels je Standort. */
|
|
51
|
+
export declare function getStock(transport: InternerTransport, articleId: string): Promise<StockResult>;
|
|
52
|
+
export declare function listStock(transport: InternerTransport, query?: StockListQuery): Promise<StockPage>;
|
|
53
|
+
/**
|
|
54
|
+
* Alle Bestandszeilen der Abfrage, Seite fuer Seite. Die Werte (`values`)
|
|
55
|
+
* stehen je Seite in [listStock]; der Iterator liefert nur die Zeilen.
|
|
56
|
+
*/
|
|
57
|
+
export declare function iterateStock(transport: InternerTransport, query?: StockListQuery): AsyncGenerator<StockLevel, void, undefined>;
|
|
58
|
+
/** Das Lagerprotokoll, neueste zuerst. */
|
|
59
|
+
export declare function listStockMovements(transport: InternerTransport, query?: StockMovementQuery): Promise<StockMovementPage>;
|
|
60
|
+
export declare function iterateStockMovements(transport: InternerTransport, query?: StockMovementQuery): AsyncGenerator<StockMovement, void, undefined>;
|
|
61
|
+
/**
|
|
62
|
+
* Legt einen Webhook an (hoechstens 5 je Konto, `webhook_limit`).
|
|
63
|
+
* **Das Secret in der Antwort kommt nur dieses eine Mal**; sofort dorthin
|
|
64
|
+
* schreiben, wo der Empfaenger es liest, nicht in ein Protokoll.
|
|
65
|
+
*/
|
|
66
|
+
export declare function createWebhook(transport: InternerTransport, options: CreateInventoryWebhookOptions): Promise<InventoryWebhookWithSecret>;
|
|
67
|
+
/** Aendert nur die genannten Felder; `description: null` loescht die Beschreibung. */
|
|
68
|
+
export declare function updateWebhook(transport: InternerTransport, webhookId: string, patch: InventoryWebhookPatch): Promise<InventoryWebhook>;
|
|
69
|
+
export declare function deleteWebhook(transport: InternerTransport, webhookId: string): Promise<{
|
|
70
|
+
webhookId: string;
|
|
71
|
+
deleted: boolean;
|
|
72
|
+
}>;
|
|
73
|
+
/** Die Webhooks des Kontos und die Ereignisse, die es abonnieren kann. */
|
|
74
|
+
export declare function listWebhooks(transport: InternerTransport): Promise<InventoryWebhookList>;
|
|
75
|
+
/**
|
|
76
|
+
* Ein neues Secret fuer denselben Webhook. Ab der Antwort gilt nur noch das
|
|
77
|
+
* neue (keine Uebergangsfrist): erst speichern, dann weiterarbeiten.
|
|
78
|
+
*/
|
|
79
|
+
export declare function rotateWebhookSecret(transport: InternerTransport, webhookId: string): Promise<InventoryWebhookWithSecret>;
|
|
80
|
+
/**
|
|
81
|
+
* Eine Probe genau dieses Ereignisses an genau diesen Webhook, mit erfundener
|
|
82
|
+
* Nutzlast und `test: true` in der Huelle. Der Webhook muss das Ereignis
|
|
83
|
+
* abonnieren (`event_not_subscribed`) und aktiv sein (`webhook_inactive`).
|
|
84
|
+
*/
|
|
85
|
+
export declare function sendWebhookTest(transport: InternerTransport, webhookId: string, event: string): Promise<InventoryWebhookTestResult>;
|
|
86
|
+
/** Die letzten Zustellungen, neueste zuerst; mit `webhookId` nur die eines Webhooks. */
|
|
87
|
+
export declare function listWebhookDeliveries(transport: InternerTransport, options?: {
|
|
88
|
+
webhookId?: string;
|
|
89
|
+
limit?: number;
|
|
90
|
+
}): Promise<InventoryWebhookDelivery[]>;
|
|
91
|
+
export {};
|