@kreiseck/kasseneck-api 1.5.1 → 1.6.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 +66 -0
- package/README.md +119 -3
- package/dist/cjs/client/aufrufe.d.ts +3 -3
- package/dist/cjs/client/aufrufe.js +17 -0
- package/dist/cjs/inventory/api.d.ts +10 -2
- package/dist/cjs/inventory/api.js +8 -1
- package/dist/cjs/inventory/endpunkte.d.ts +2 -1
- package/dist/cjs/inventory/endpunkte.js +2 -1
- package/dist/cjs/inventory/index.d.ts +5 -3
- package/dist/cjs/inventory/index.js +15 -3
- package/dist/cjs/inventory/lesen.d.ts +7 -1
- package/dist/cjs/inventory/lesen.js +75 -0
- package/dist/cjs/inventory/schreiben.d.ts +23 -1
- package/dist/cjs/inventory/schreiben.js +18 -9
- package/dist/cjs/inventory/typen.d.ts +156 -2
- package/dist/cjs/inventory/varianten.d.ts +67 -0
- package/dist/cjs/inventory/varianten.js +150 -0
- package/dist/cjs/inventory/vertrag.d.ts +40 -5
- package/dist/cjs/inventory/vertrag.js +51 -3
- package/dist/cjs/inventory/webhook.d.ts +5 -2
- package/dist/cjs/inventory/webhook.js +8 -2
- package/dist/cjs/stored/vokabular.d.ts +1 -1
- package/dist/cjs/stored/vokabular.js +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/aufrufe.d.ts +3 -3
- package/dist/esm/client/aufrufe.js +17 -0
- package/dist/esm/inventory/api.d.ts +10 -2
- package/dist/esm/inventory/api.js +8 -1
- package/dist/esm/inventory/endpunkte.d.ts +2 -1
- package/dist/esm/inventory/endpunkte.js +2 -1
- package/dist/esm/inventory/index.d.ts +5 -3
- package/dist/esm/inventory/index.js +4 -2
- package/dist/esm/inventory/lesen.d.ts +7 -1
- package/dist/esm/inventory/lesen.js +74 -0
- package/dist/esm/inventory/schreiben.d.ts +23 -1
- package/dist/esm/inventory/schreiben.js +13 -10
- package/dist/esm/inventory/typen.d.ts +156 -2
- package/dist/esm/inventory/varianten.d.ts +67 -0
- package/dist/esm/inventory/varianten.js +142 -0
- package/dist/esm/inventory/vertrag.d.ts +40 -5
- package/dist/esm/inventory/vertrag.js +50 -2
- package/dist/esm/inventory/webhook.d.ts +5 -2
- package/dist/esm/inventory/webhook.js +9 -3
- package/dist/esm/stored/vokabular.d.ts +1 -1
- package/dist/esm/stored/vokabular.js +1 -1
- 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.schema.json +1 -1
- package/fixtures/invoice-texts.json +1 -1
- package/fixtures/pos-texts.json +1 -1
- package/fixtures/surface.json +31 -6
- package/fixtures/v3/antworten/belege.json +1 -1
- package/fixtures/v3/antworten/belegmail.json +1 -1
- package/fixtures/v3/antworten/kasse-belege.json +1 -1
- package/fixtures/v3/antworten/kasse.json +2 -2
- package/fixtures/v3/antworten/lager.json +2396 -4
- package/fixtures/v3/antworten/rechnungen.json +1 -1
- package/fixtures/v3/antworten/storno.json +1 -1
- package/fixtures/v3/stored/belege.json +1 -1
- package/fixtures/v3/stored/kasse.json +2 -2
- package/fixtures/v3/stored/rechnungen.json +1 -1
- package/fixtures/v3/v3-vokabular.json +151 -6
- package/fixtures/v3/zahlbetrag-faelle.json +1 -1
- package/package.json +1 -1
|
@@ -27,8 +27,29 @@
|
|
|
27
27
|
* unlesbare Antwort) `outcome: 'unknown'`, nie `'rejected'`. Lesen und der
|
|
28
28
|
* Probelauf (`previewGoodsReceipt`) bleiben `'rejected'`.
|
|
29
29
|
*/
|
|
30
|
-
import type { InternerTransport } from '../client/aufrufe.js';
|
|
30
|
+
import type { ApiCall, InternerTransport } from '../client/aufrufe.js';
|
|
31
31
|
import type { Article, ChangeStockConditionRequest, CreateArticleRequest, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptPreview, GoodsReceiptPreviewRequest, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationRequest, Reservation, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockOperation, TransferStockRequest, UpdateArticleRequest } from './typen.js';
|
|
32
|
+
type Params = Record<string, unknown>;
|
|
33
|
+
/** Die Anfrage als flache Kopie ohne `undefined`; der Aufrufer behaelt sein Objekt. Paketintern, auch fuer `varianten.ts`. */
|
|
34
|
+
export declare function anfrage(name: ApiCall, request: unknown): Params;
|
|
35
|
+
/**
|
|
36
|
+
* `idempotencyKey`: Text mit 1–120 Zeichen, nicht nur Leerraum. Er wird nie
|
|
37
|
+
* getrimmt oder gekuerzt: ein veraenderter Schluessel waere ein anderer.
|
|
38
|
+
*/
|
|
39
|
+
export declare function schluessel(name: ApiCall, p: Params, { pflicht }: {
|
|
40
|
+
pflicht: boolean;
|
|
41
|
+
}): void;
|
|
42
|
+
/** Eine Ganzzahl (Tausendstel, Cent, Mikro-Euro); fehlt sie, nur wenn sie darf. `null` nur, wo es leert. */
|
|
43
|
+
export declare function ganz(name: ApiCall, feld: string, w: unknown, { pflicht, leerbar }?: {
|
|
44
|
+
pflicht?: boolean | undefined;
|
|
45
|
+
leerbar?: boolean | undefined;
|
|
46
|
+
}): void;
|
|
47
|
+
/**
|
|
48
|
+
* Zahlenfelder eines Artikels; `null` leert sie (bzw. heisst bei der Anlage
|
|
49
|
+
* „nicht angegeben“). `praefix` nennt die Stelle in der Anfrage (`variants[2].`).
|
|
50
|
+
*/
|
|
51
|
+
export declare function artikelZahlen(name: ApiCall, p: Params, praefix?: string): void;
|
|
52
|
+
export declare const artikelAus: (name: ApiCall, daten: unknown) => Article;
|
|
32
53
|
/**
|
|
33
54
|
* Legt einen Artikel an. Mit `ean` ein Fremdartikel mit diesem Code (gueltige
|
|
34
55
|
* Pruefziffer, frei im Konto), sonst vergibt der Server den naechsten eigenen
|
|
@@ -84,3 +105,4 @@ export declare function getReservation(transport: InternerTransport, reservation
|
|
|
84
105
|
export declare function listReservations(transport: InternerTransport, query?: ReservationListQuery): Promise<ReservationPage>;
|
|
85
106
|
/** Alle Reservierungen der Abfrage, Seite fuer Seite ueber `nextCursor`. */
|
|
86
107
|
export declare function iterateReservations(transport: InternerTransport, query?: ReservationListQuery): AsyncGenerator<Reservation, void, undefined>;
|
|
108
|
+
export {};
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
* Probelauf (`previewGoodsReceipt`) bleiben `'rejected'`.
|
|
30
30
|
*/
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.artikelAus = void 0;
|
|
33
|
+
exports.anfrage = anfrage;
|
|
34
|
+
exports.schluessel = schluessel;
|
|
35
|
+
exports.ganz = ganz;
|
|
36
|
+
exports.artikelZahlen = artikelZahlen;
|
|
32
37
|
exports.createArticle = createArticle;
|
|
33
38
|
exports.updateArticle = updateArticle;
|
|
34
39
|
exports.deactivateArticle = deactivateArticle;
|
|
@@ -48,7 +53,7 @@ const endpunkte_js_1 = require("./endpunkte.js");
|
|
|
48
53
|
const lesen_js_1 = require("./lesen.js");
|
|
49
54
|
const vertrag_js_1 = require("./vertrag.js");
|
|
50
55
|
// ---- Pruefung vor dem Senden ------------------------------------------------------
|
|
51
|
-
/** Die Anfrage als flache Kopie ohne `undefined`; der Aufrufer behaelt sein Objekt. */
|
|
56
|
+
/** Die Anfrage als flache Kopie ohne `undefined`; der Aufrufer behaelt sein Objekt. Paketintern, auch fuer `varianten.ts`. */
|
|
52
57
|
function anfrage(name, request) {
|
|
53
58
|
if (request === null || typeof request !== 'object' || Array.isArray(request)) {
|
|
54
59
|
throw (0, endpunkte_js_1.anfragefehler)(name, 'Anfrage muss ein Objekt sein');
|
|
@@ -124,19 +129,23 @@ function positionen(name, w, { pflicht, menge }, weiter = () => { }) {
|
|
|
124
129
|
});
|
|
125
130
|
}
|
|
126
131
|
// ---- Artikel ------------------------------------------------------------------
|
|
127
|
-
/**
|
|
128
|
-
|
|
132
|
+
/**
|
|
133
|
+
* Zahlenfelder eines Artikels; `null` leert sie (bzw. heisst bei der Anlage
|
|
134
|
+
* „nicht angegeben“). `praefix` nennt die Stelle in der Anfrage (`variants[2].`).
|
|
135
|
+
*/
|
|
136
|
+
function artikelZahlen(name, p, praefix = '') {
|
|
129
137
|
for (const feld of ['unitPriceCents', 'minStock', 'purchasePriceMicros'])
|
|
130
|
-
ganz(name, feld
|
|
138
|
+
ganz(name, `${praefix}${feld}`, p[feld], { leerbar: true });
|
|
131
139
|
const jeStandort = p.minStockByLocation;
|
|
132
140
|
if (jeStandort === undefined || jeStandort === null)
|
|
133
141
|
return;
|
|
134
142
|
if (typeof jeStandort !== 'object' || Array.isArray(jeStandort))
|
|
135
|
-
throw (0, endpunkte_js_1.anfragefehler)(name,
|
|
143
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, `${praefix}minStockByLocation muss ein Objekt { standort: Tausendstel } sein`);
|
|
136
144
|
for (const [standort, w] of Object.entries(jeStandort))
|
|
137
|
-
ganz(name,
|
|
145
|
+
ganz(name, `${praefix}minStockByLocation.${standort}`, w, { leerbar: true });
|
|
138
146
|
}
|
|
139
147
|
const artikelAus = (name, daten) => (0, lesen_js_1.artikel)({ name, pfad: 'article' }, (0, lesen_js_1.objekt)(daten)?.article);
|
|
148
|
+
exports.artikelAus = artikelAus;
|
|
140
149
|
/**
|
|
141
150
|
* Legt einen Artikel an. Mit `ean` ein Fremdartikel mit diesem Code (gueltige
|
|
142
151
|
* Pruefziffer, frei im Konto), sonst vergibt der Server den naechsten eigenen
|
|
@@ -147,7 +156,7 @@ async function createArticle(transport, request) {
|
|
|
147
156
|
const p = anfrage(name, request);
|
|
148
157
|
schluessel(name, p, { pflicht: true });
|
|
149
158
|
artikelZahlen(name, p);
|
|
150
|
-
return artikelAus(name, await transport(name, p));
|
|
159
|
+
return (0, exports.artikelAus)(name, await transport(name, p));
|
|
151
160
|
}
|
|
152
161
|
/** Aendert nur die genannten Felder eines Artikels (siehe [UpdateArticleRequest]). */
|
|
153
162
|
async function updateArticle(transport, request) {
|
|
@@ -159,7 +168,7 @@ async function updateArticle(transport, request) {
|
|
|
159
168
|
throw (0, endpunkte_js_1.anfragefehler)(name, 'die Aenderung nennt kein Feld');
|
|
160
169
|
}
|
|
161
170
|
artikelZahlen(name, p);
|
|
162
|
-
return artikelAus(name, await transport(name, p));
|
|
171
|
+
return (0, exports.artikelAus)(name, await transport(name, p));
|
|
163
172
|
}
|
|
164
173
|
/** Legt einen Artikel still (`active: false`); Code und eigene Kennungen werden frei. */
|
|
165
174
|
async function deactivateArticle(transport, request) {
|
|
@@ -167,7 +176,7 @@ async function deactivateArticle(transport, request) {
|
|
|
167
176
|
const p = anfrage(name, request);
|
|
168
177
|
schluessel(name, p, { pflicht: true });
|
|
169
178
|
(0, endpunkte_js_1.kennung)(name, 'articleId', p.articleId);
|
|
170
|
-
return artikelAus(name, await transport(name, p));
|
|
179
|
+
return (0, exports.artikelAus)(name, await transport(name, p));
|
|
171
180
|
}
|
|
172
181
|
// ---- Buchen ------------------------------------------------------------------
|
|
173
182
|
function eingangZahlen(name, p) {
|
|
@@ -19,7 +19,7 @@ import type { InventoryWarningCode, InventoryWebhookEventType, LandedCostAllocat
|
|
|
19
19
|
* `purchasePriceMicros` nur mit dem Recht `costs` (Konto-Schalter
|
|
20
20
|
* `lagerApi.kosten`, sonst fehlt das Feld, nicht `null`), `externalIds`,
|
|
21
21
|
* `metadata`, `variantGroupId` und `variantAttributes` nur, wenn der Artikel
|
|
22
|
-
* sie traegt.
|
|
22
|
+
* sie traegt (eine Variante, siehe [VariantGroup]).
|
|
23
23
|
*/
|
|
24
24
|
export interface Article {
|
|
25
25
|
id: string;
|
|
@@ -59,7 +59,14 @@ export interface Article {
|
|
|
59
59
|
active: boolean;
|
|
60
60
|
externalIds?: Record<string, string>;
|
|
61
61
|
metadata?: Record<string, string>;
|
|
62
|
+
/** Nur an einer Variante: die Variantengruppe. Gesetzt nur ueber `createVariantGroup`/`addVariant`, nie umgehaengt. */
|
|
62
63
|
variantGroupId?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Nur an einer Variante: je Merkmal der Gruppe genau ein Wert
|
|
66
|
+
* (`{ farbe: 'rot', groesse: 'S' }`). Die Schluessel kommen nach Codepunkt
|
|
67
|
+
* sortiert, nicht in der Merkmalsreihenfolge der Gruppe; die steht in
|
|
68
|
+
* [VariantGroup.attributes].
|
|
69
|
+
*/
|
|
63
70
|
variantAttributes?: Record<string, string>;
|
|
64
71
|
createdAt: string | null;
|
|
65
72
|
updatedAt: string | null;
|
|
@@ -78,6 +85,12 @@ export interface ArticleListQuery {
|
|
|
78
85
|
*/
|
|
79
86
|
updatedSince?: string | Date;
|
|
80
87
|
groupId?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Nur die Varianten dieser Gruppe (Backend ab Stufe 5c), wie ohne Filter
|
|
90
|
+
* nach `updatedAt` aufsteigend; mit `updatedSince` der Abgleich
|
|
91
|
+
* einer Gruppe. Die Artikel einer neuen Gruppe liest man so, die Antwort von
|
|
92
|
+
* `createVariantGroup` traegt nur ihre Kennungen.
|
|
93
|
+
*/
|
|
81
94
|
variantGroupId?: string;
|
|
82
95
|
active?: boolean;
|
|
83
96
|
stockTracked?: boolean;
|
|
@@ -342,7 +355,7 @@ export interface InventoryWebhookEnvelope<T extends InventoryWebhookEventType, D
|
|
|
342
355
|
test: boolean;
|
|
343
356
|
data: D;
|
|
344
357
|
}
|
|
345
|
-
export type InventoryWebhookEvent = InventoryWebhookEnvelope<'stock.changed', StockChangedEventData> | InventoryWebhookEnvelope<'stock.below_minimum', StockBelowMinimumEventData> | InventoryWebhookEnvelope<'article.created', Article> | InventoryWebhookEnvelope<'article.updated', Article> | InventoryWebhookEnvelope<'article.deactivated', Article> | InventoryWebhookEnvelope<'reservation.expired', Reservation> | InventoryWebhookEnvelope<'reservation.released', Reservation> | InventoryWebhookEnvelope<'reservation.redeemed', Reservation>;
|
|
358
|
+
export type InventoryWebhookEvent = InventoryWebhookEnvelope<'stock.changed', StockChangedEventData> | InventoryWebhookEnvelope<'stock.below_minimum', StockBelowMinimumEventData> | InventoryWebhookEnvelope<'article.created', Article> | InventoryWebhookEnvelope<'article.updated', Article> | InventoryWebhookEnvelope<'article.deactivated', Article> | InventoryWebhookEnvelope<'reservation.expired', Reservation> | InventoryWebhookEnvelope<'reservation.released', Reservation> | InventoryWebhookEnvelope<'reservation.redeemed', Reservation> | InventoryWebhookEnvelope<'variant_group.created', VariantGroup> | InventoryWebhookEnvelope<'variant_group.updated', VariantGroup>;
|
|
346
359
|
/**
|
|
347
360
|
* Die Felder eines Artikels beim Anlegen. Bei der Anlage heisst `null` „nicht
|
|
348
361
|
* angegeben“ (ausser bei `name`, der Pflicht ist).
|
|
@@ -677,3 +690,144 @@ export interface InventoryShortfall {
|
|
|
677
690
|
/** Verfuegbar (`onHand − reserved`), Tausendstel; darf negativ sein. */
|
|
678
691
|
available: number;
|
|
679
692
|
}
|
|
693
|
+
/** Ein Merkmal einer Variantengruppe mit seinen Werten, in der Reihenfolge der Gruppe. */
|
|
694
|
+
export interface VariantAttribute {
|
|
695
|
+
/** `^[a-z0-9_]{1,32}$`, eindeutig in der Gruppe; Schluessel in `variantAttributes`. */
|
|
696
|
+
key: string;
|
|
697
|
+
/** Beschriftung, 1–40 Zeichen, z. B. „Größe“. */
|
|
698
|
+
label: string;
|
|
699
|
+
/**
|
|
700
|
+
* 1–30 Werte zu je 1–30 Zeichen, eindeutig ohne Gross/Klein, getrimmt und in
|
|
701
|
+
* Unicode-NFC gespeichert. Werte kommen nur dazu (`addAttributeValues`), nie weg.
|
|
702
|
+
*/
|
|
703
|
+
values: string[];
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* Vorgaben einer Gruppe: sie fuellen bei der **Anlage** einer Variante die
|
|
707
|
+
* Felder, die die Variante nicht selbst nennt. Ein spaeteres Aendern der
|
|
708
|
+
* Vorgaben aendert keine bestehende Variante (dafuer `updateArticle`).
|
|
709
|
+
* Ein Feld ohne Vorgabe fehlt.
|
|
710
|
+
*/
|
|
711
|
+
export interface VariantGroupDefaults {
|
|
712
|
+
unitPriceCents?: number;
|
|
713
|
+
vatRate?: number;
|
|
714
|
+
unit?: string;
|
|
715
|
+
groupId?: string;
|
|
716
|
+
/** Ohne Vorgabe gilt wie bei `createArticle` `false` (dann nicht reservierbar). */
|
|
717
|
+
stockTracked?: boolean;
|
|
718
|
+
}
|
|
719
|
+
/** Eine Variante in der Liste ihrer Gruppe. */
|
|
720
|
+
export interface VariantGroupMember {
|
|
721
|
+
articleId: string;
|
|
722
|
+
/** Je Merkmal ein Wert, Schluessel nach Codepunkt sortiert. */
|
|
723
|
+
variantAttributes: Record<string, string>;
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Eine Variantengruppe, wie `getVariantGroup`, `listVariantGroups`, die
|
|
727
|
+
* schreibenden Gruppenaufrufe und die Ereignisse `variant_group.*` sie senden.
|
|
728
|
+
*/
|
|
729
|
+
export interface VariantGroup {
|
|
730
|
+
id: string;
|
|
731
|
+
/** 1–100 Zeichen; Standardname einer Variante: „<Gruppe> <Wert1> <Wert2>“. */
|
|
732
|
+
name: string | null;
|
|
733
|
+
/** 1–3 Merkmale in der Reihenfolge der Gruppe (sie bestimmt den Standardnamen). */
|
|
734
|
+
attributes: VariantAttribute[];
|
|
735
|
+
defaults: VariantGroupDefaults;
|
|
736
|
+
/** `false` = stillgelegt: alle Varianten stillgelegt, kein `addVariant`, endgueltig. */
|
|
737
|
+
active: boolean;
|
|
738
|
+
/**
|
|
739
|
+
* Die aktiven Varianten einer aktiven Gruppe; eine einzeln stillgelegte
|
|
740
|
+
* Variante faellt heraus (ihre Kombination ist dann wieder frei). Beim
|
|
741
|
+
* Stilllegen der Gruppe wird die Liste eingefroren. Die Artikel selbst
|
|
742
|
+
* liest `listArticles({ variantGroupId })`.
|
|
743
|
+
*/
|
|
744
|
+
variants: VariantGroupMember[];
|
|
745
|
+
createdAt: string | null;
|
|
746
|
+
updatedAt: string | null;
|
|
747
|
+
}
|
|
748
|
+
/** Vorgaben in einer Anfrage. Bei der Anlage heisst `null` „nicht angegeben“, bei einer Aenderung „leeren“. */
|
|
749
|
+
export interface VariantGroupDefaultsInput {
|
|
750
|
+
unitPriceCents?: number | null;
|
|
751
|
+
vatRate?: number | null;
|
|
752
|
+
unit?: string | null;
|
|
753
|
+
/** Artikelgruppe; unbekannt = `group_not_found` (bei einer Variante mit `field: 'defaults.groupId'`). */
|
|
754
|
+
groupId?: string | null;
|
|
755
|
+
stockTracked?: boolean | null;
|
|
756
|
+
}
|
|
757
|
+
/**
|
|
758
|
+
* Eine neue Variante: ihre Merkmalswerte und die Felder eines Artikels wie bei
|
|
759
|
+
* `createArticle`. Was fehlt (oder `null` ist), fuellen die Vorgaben der
|
|
760
|
+
* Gruppe; ohne `name` heisst sie „<Gruppe> <Wert1> <Wert2>“ in
|
|
761
|
+
* Merkmalsreihenfolge. Mit `ean` wird sie ein Fremdartikel, sonst vergibt der
|
|
762
|
+
* Server den naechsten eigenen Code.
|
|
763
|
+
*/
|
|
764
|
+
export interface VariantInput extends Omit<ArticleInput, 'name'> {
|
|
765
|
+
/**
|
|
766
|
+
* Jedes Merkmal der Gruppe genau einmal, Wert exakt aus der Werteliste
|
|
767
|
+
* (Gross/Klein und Leerraum werden nicht angeglichen), sonst
|
|
768
|
+
* `invalid_variant_attributes` mit `field`.
|
|
769
|
+
*/
|
|
770
|
+
variantAttributes: Record<string, string>;
|
|
771
|
+
/** 1–200 Zeichen; ohne Angabe der Standardname. */
|
|
772
|
+
name?: string | null;
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* Legt eine Variantengruppe an, mit `createMatrix: true` samt allen
|
|
776
|
+
* Kombinationen (hoechstens 100) oder mit den genannten `variants[]`
|
|
777
|
+
* (hoechstens 100), nie beides. Ohne beides entsteht die Gruppe ohne Variante.
|
|
778
|
+
* Die Antwort traegt die Gruppe mit `variants[]` (Kennungen und Merkmale),
|
|
779
|
+
* nicht die Artikel.
|
|
780
|
+
*/
|
|
781
|
+
export interface CreateVariantGroupRequest {
|
|
782
|
+
idempotencyKey: string;
|
|
783
|
+
/** 1–100 Zeichen. */
|
|
784
|
+
name: string;
|
|
785
|
+
/** 1–3 Merkmale; ihre Reihenfolge bestimmt Standardnamen und Matrix (das erste laeuft aussen). */
|
|
786
|
+
attributes: VariantAttribute[];
|
|
787
|
+
defaults?: VariantGroupDefaultsInput | null;
|
|
788
|
+
/** `true`: alle Kombinationen der Werte als Varianten. Schliesst `variants` aus. */
|
|
789
|
+
createMatrix?: boolean;
|
|
790
|
+
variants?: VariantInput[];
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* Aendert eine aktive Gruppe: nur die genannten Felder, mindestens eines.
|
|
794
|
+
* `defaults` ist ein Teil-Update (`null` je Feld leert es, `defaults: null`
|
|
795
|
+
* alle). `addAttributeValues` haengt Werte an bestehende Merkmale an und
|
|
796
|
+
* uebergeht still, was es schon gibt (auch in anderer Gross-/Kleinschreibung):
|
|
797
|
+
* der Shop darf immer alle seine Werte senden. Werte entfernen und Merkmale
|
|
798
|
+
* ergaenzen gibt es nicht.
|
|
799
|
+
*
|
|
800
|
+
* `active: false` legt die Gruppe und alle ihre Varianten still, steht allein
|
|
801
|
+
* und ist endgueltig (`true` gibt es nicht). Eine stillgelegte Gruppe ergibt
|
|
802
|
+
* bei jeder anderen Aenderung `variant_group_inactive`.
|
|
803
|
+
*/
|
|
804
|
+
export interface UpdateVariantGroupRequest {
|
|
805
|
+
idempotencyKey: string;
|
|
806
|
+
variantGroupId: string;
|
|
807
|
+
name?: string;
|
|
808
|
+
defaults?: VariantGroupDefaultsInput | null;
|
|
809
|
+
/** `{ groesse: ['XL'] }`: hoechstens 30 Werte je Merkmal danach. */
|
|
810
|
+
addAttributeValues?: Record<string, string[]>;
|
|
811
|
+
active?: false;
|
|
812
|
+
}
|
|
813
|
+
/** Legt eine Variante in einer aktiven Gruppe an. Antwort: der Artikel wie `createArticle`. */
|
|
814
|
+
export interface AddVariantRequest extends VariantInput {
|
|
815
|
+
idempotencyKey: string;
|
|
816
|
+
variantGroupId: string;
|
|
817
|
+
}
|
|
818
|
+
export interface VariantGroupListQuery {
|
|
819
|
+
active?: boolean;
|
|
820
|
+
/**
|
|
821
|
+
* Nur Gruppen, die seitdem geaendert wurden (inklusive). Die Liste ist nach
|
|
822
|
+
* `updatedAt` aufsteigend sortiert, gleiche Zeit nach Kennung.
|
|
823
|
+
*/
|
|
824
|
+
updatedSince?: string | Date;
|
|
825
|
+
/** 1–200, Vorgabe des Servers 50. */
|
|
826
|
+
limit?: number;
|
|
827
|
+
cursor?: string;
|
|
828
|
+
}
|
|
829
|
+
export interface VariantGroupPage {
|
|
830
|
+
variantGroups: VariantGroup[];
|
|
831
|
+
/** `null` = letzte Seite. */
|
|
832
|
+
nextCursor: string | null;
|
|
833
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Variantengruppen der Lager-API (Backend Stufe 5c): Gruppe anlegen (mit
|
|
3
|
+
* Matrix oder genannten Varianten), aendern oder stilllegen, eine Variante
|
|
4
|
+
* ergaenzen, Gruppen lesen.
|
|
5
|
+
*
|
|
6
|
+
* Eine Variante ist ein gewoehnlicher Artikel mit `variantGroupId` und
|
|
7
|
+
* `variantAttributes`; gelesen, gebucht und reserviert wird sie wie jeder
|
|
8
|
+
* Artikel. Die Gruppenantworten tragen nur die Kennungen der Varianten, die
|
|
9
|
+
* Artikel selbst liefert `listArticles({ variantGroupId })`.
|
|
10
|
+
*
|
|
11
|
+
* Wie in `schreiben.ts` geht die Anfrage flach hinaus, genau mit den Feldern,
|
|
12
|
+
* die der Aufrufer nennt (`undefined` faellt weg, `null` bleibt).
|
|
13
|
+
*
|
|
14
|
+
* **Vor dem Senden geprueft wird nur, was ohne Netz sicher falsch ist:**
|
|
15
|
+
* - `idempotencyKey` fehlt, ist leer oder laenger als 120 Zeichen (die drei
|
|
16
|
+
* schreibenden Aufrufe);
|
|
17
|
+
* - `variantGroupId` fehlt oder ist leer;
|
|
18
|
+
* - `createMatrix: true` zusammen mit `variants` (schliessen sich aus);
|
|
19
|
+
* - `variants` ist keine Liste, ein Eintrag kein Objekt, `variantAttributes`
|
|
20
|
+
* einer Variante fehlt oder ist kein Objekt;
|
|
21
|
+
* - ein Preis, eine Menge oder ein Einkaufspreis (auch in `defaults`) ist
|
|
22
|
+
* keine Ganzzahl;
|
|
23
|
+
* - eine Aenderung nennt kein Feld, `active` ist nicht `false` oder steht
|
|
24
|
+
* nicht allein, `addAttributeValues` ist kein Objekt.
|
|
25
|
+
* Die Grenzen (Merkmale, Werte, Matrix, aktive Varianten) prueft der Server:
|
|
26
|
+
* er darf sie anheben, ohne dass diese Paketversion dann falsch abweist.
|
|
27
|
+
*
|
|
28
|
+
* **Wiederholen** wie bei jedem Schreiben: nach `outcome: 'unknown'` denselben
|
|
29
|
+
* Aufruf mit **demselben** `idempotencyKey`; er wirkt genau einmal und liefert
|
|
30
|
+
* die gespeicherte Antwort. Ein neuer Schluessel legte die Gruppe ein zweites
|
|
31
|
+
* Mal an. Ein abgebrochenes Stilllegen vollendet jede Wiederholung von
|
|
32
|
+
* `updateVariantGroup({ active: false })`, auch mit neuem Schluessel.
|
|
33
|
+
*/
|
|
34
|
+
import type { InternerTransport } from '../client/aufrufe.js';
|
|
35
|
+
import type { AddVariantRequest, Article, CreateVariantGroupRequest, UpdateVariantGroupRequest, VariantGroup, VariantGroupListQuery, VariantGroupPage } from './typen.js';
|
|
36
|
+
/**
|
|
37
|
+
* Legt eine Variantengruppe an: mit `createMatrix: true` alle Kombinationen der
|
|
38
|
+
* Werte (hoechstens 100), sonst die genannten `variants[]` (hoechstens 100),
|
|
39
|
+
* ohne beides nur die Gruppe. Jede Variante entsteht als Artikel mit den
|
|
40
|
+
* Feldern wie bei `createArticle`; was sie nicht nennt, fuellen die Vorgaben.
|
|
41
|
+
* Antwort: die Gruppe mit `variants[]` (Kennung und Merkmale je Variante).
|
|
42
|
+
*
|
|
43
|
+
* Braucht die Anlage mehr Schreibvorgaenge, als in einen Vorgang passen,
|
|
44
|
+
* kommt `too_many_positions` mit `field` (`variants` bzw. `createMatrix`) und
|
|
45
|
+
* nichts ist geschrieben: weniger Varianten senden, den Rest per [addVariant].
|
|
46
|
+
*/
|
|
47
|
+
export declare function createVariantGroup(transport: InternerTransport, request: CreateVariantGroupRequest): Promise<VariantGroup>;
|
|
48
|
+
/**
|
|
49
|
+
* Aendert eine aktive Gruppe (Name, Vorgaben, neue Werte) oder legt sie mit
|
|
50
|
+
* `active: false` still: die Gruppe und alle ihre Varianten, endgueltig. Die
|
|
51
|
+
* Antwort kommt erst, wenn alle Varianten stillgelegt sind. Bestehende
|
|
52
|
+
* Varianten aendern Name und Vorgaben nicht (dafuer `updateArticle`).
|
|
53
|
+
*/
|
|
54
|
+
export declare function updateVariantGroup(transport: InternerTransport, request: UpdateVariantGroupRequest): Promise<VariantGroup>;
|
|
55
|
+
/**
|
|
56
|
+
* Legt eine Variante in einer aktiven Gruppe an. Antwort: der Artikel wie
|
|
57
|
+
* `createArticle`. Gibt es die Kombination schon, kommt
|
|
58
|
+
* `variant_already_exists` mit `articleId` der bestehenden Variante; nach dem
|
|
59
|
+
* Stilllegen einer Variante ist ihre Kombination wieder frei.
|
|
60
|
+
*/
|
|
61
|
+
export declare function addVariant(transport: InternerTransport, request: AddVariantRequest): Promise<Article>;
|
|
62
|
+
/** Eine Variantengruppe mit ihren aktiven Varianten (eingefroren, wenn stillgelegt). */
|
|
63
|
+
export declare function getVariantGroup(transport: InternerTransport, variantGroupId: string): Promise<VariantGroup>;
|
|
64
|
+
/** Variantengruppen nach `updatedAt` aufsteigend; Filter `active` und `updatedSince` (inklusive). */
|
|
65
|
+
export declare function listVariantGroups(transport: InternerTransport, query?: VariantGroupListQuery): Promise<VariantGroupPage>;
|
|
66
|
+
/** Alle Variantengruppen der Abfrage, Seite fuer Seite ueber `nextCursor`. */
|
|
67
|
+
export declare function iterateVariantGroups(transport: InternerTransport, query?: VariantGroupListQuery): AsyncGenerator<VariantGroup, void, undefined>;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Variantengruppen der Lager-API (Backend Stufe 5c): Gruppe anlegen (mit
|
|
4
|
+
* Matrix oder genannten Varianten), aendern oder stilllegen, eine Variante
|
|
5
|
+
* ergaenzen, Gruppen lesen.
|
|
6
|
+
*
|
|
7
|
+
* Eine Variante ist ein gewoehnlicher Artikel mit `variantGroupId` und
|
|
8
|
+
* `variantAttributes`; gelesen, gebucht und reserviert wird sie wie jeder
|
|
9
|
+
* Artikel. Die Gruppenantworten tragen nur die Kennungen der Varianten, die
|
|
10
|
+
* Artikel selbst liefert `listArticles({ variantGroupId })`.
|
|
11
|
+
*
|
|
12
|
+
* Wie in `schreiben.ts` geht die Anfrage flach hinaus, genau mit den Feldern,
|
|
13
|
+
* die der Aufrufer nennt (`undefined` faellt weg, `null` bleibt).
|
|
14
|
+
*
|
|
15
|
+
* **Vor dem Senden geprueft wird nur, was ohne Netz sicher falsch ist:**
|
|
16
|
+
* - `idempotencyKey` fehlt, ist leer oder laenger als 120 Zeichen (die drei
|
|
17
|
+
* schreibenden Aufrufe);
|
|
18
|
+
* - `variantGroupId` fehlt oder ist leer;
|
|
19
|
+
* - `createMatrix: true` zusammen mit `variants` (schliessen sich aus);
|
|
20
|
+
* - `variants` ist keine Liste, ein Eintrag kein Objekt, `variantAttributes`
|
|
21
|
+
* einer Variante fehlt oder ist kein Objekt;
|
|
22
|
+
* - ein Preis, eine Menge oder ein Einkaufspreis (auch in `defaults`) ist
|
|
23
|
+
* keine Ganzzahl;
|
|
24
|
+
* - eine Aenderung nennt kein Feld, `active` ist nicht `false` oder steht
|
|
25
|
+
* nicht allein, `addAttributeValues` ist kein Objekt.
|
|
26
|
+
* Die Grenzen (Merkmale, Werte, Matrix, aktive Varianten) prueft der Server:
|
|
27
|
+
* er darf sie anheben, ohne dass diese Paketversion dann falsch abweist.
|
|
28
|
+
*
|
|
29
|
+
* **Wiederholen** wie bei jedem Schreiben: nach `outcome: 'unknown'` denselben
|
|
30
|
+
* Aufruf mit **demselben** `idempotencyKey`; er wirkt genau einmal und liefert
|
|
31
|
+
* die gespeicherte Antwort. Ein neuer Schluessel legte die Gruppe ein zweites
|
|
32
|
+
* Mal an. Ein abgebrochenes Stilllegen vollendet jede Wiederholung von
|
|
33
|
+
* `updateVariantGroup({ active: false })`, auch mit neuem Schluessel.
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createVariantGroup = createVariantGroup;
|
|
37
|
+
exports.updateVariantGroup = updateVariantGroup;
|
|
38
|
+
exports.addVariant = addVariant;
|
|
39
|
+
exports.getVariantGroup = getVariantGroup;
|
|
40
|
+
exports.listVariantGroups = listVariantGroups;
|
|
41
|
+
exports.iterateVariantGroups = iterateVariantGroups;
|
|
42
|
+
const endpunkte_js_1 = require("./endpunkte.js");
|
|
43
|
+
const lesen_js_1 = require("./lesen.js");
|
|
44
|
+
const schreiben_js_1 = require("./schreiben.js");
|
|
45
|
+
const istObjekt = (w) => w !== null && typeof w === 'object' && !Array.isArray(w);
|
|
46
|
+
/** Vorgaben: nur der Preis ist eine Zahl mit Skala (Cent); `null` leert bzw. heisst „nicht angegeben“. */
|
|
47
|
+
function vorgabenZahlen(name, w) {
|
|
48
|
+
if (w === undefined || w === null)
|
|
49
|
+
return;
|
|
50
|
+
if (!istObjekt(w))
|
|
51
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, 'defaults muss ein Objekt oder null sein');
|
|
52
|
+
(0, schreiben_js_1.ganz)(name, 'defaults.unitPriceCents', w.unitPriceCents, { leerbar: true });
|
|
53
|
+
}
|
|
54
|
+
/** Eine Variante der Anfrage: Merkmale als Objekt, Zahlen ganzzahlig. */
|
|
55
|
+
function variante(name, w, praefix) {
|
|
56
|
+
const stelle = praefix ? praefix.slice(0, -1) : 'Anfrage';
|
|
57
|
+
if (!istObjekt(w))
|
|
58
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, `${stelle} muss ein Objekt sein`);
|
|
59
|
+
if (!istObjekt(w.variantAttributes)) {
|
|
60
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, `${praefix}variantAttributes fehlt oder ist kein Objekt { merkmal: wert }`);
|
|
61
|
+
}
|
|
62
|
+
(0, schreiben_js_1.artikelZahlen)(name, w, praefix);
|
|
63
|
+
}
|
|
64
|
+
const gruppeAus = (name, daten) => (0, lesen_js_1.variantengruppe)({ name, pfad: 'variantGroup' }, (0, lesen_js_1.objekt)(daten)?.variantGroup);
|
|
65
|
+
/**
|
|
66
|
+
* Legt eine Variantengruppe an: mit `createMatrix: true` alle Kombinationen der
|
|
67
|
+
* Werte (hoechstens 100), sonst die genannten `variants[]` (hoechstens 100),
|
|
68
|
+
* ohne beides nur die Gruppe. Jede Variante entsteht als Artikel mit den
|
|
69
|
+
* Feldern wie bei `createArticle`; was sie nicht nennt, fuellen die Vorgaben.
|
|
70
|
+
* Antwort: die Gruppe mit `variants[]` (Kennung und Merkmale je Variante).
|
|
71
|
+
*
|
|
72
|
+
* Braucht die Anlage mehr Schreibvorgaenge, als in einen Vorgang passen,
|
|
73
|
+
* kommt `too_many_positions` mit `field` (`variants` bzw. `createMatrix`) und
|
|
74
|
+
* nichts ist geschrieben: weniger Varianten senden, den Rest per [addVariant].
|
|
75
|
+
*/
|
|
76
|
+
async function createVariantGroup(transport, request) {
|
|
77
|
+
const name = 'createVariantGroup';
|
|
78
|
+
const p = (0, schreiben_js_1.anfrage)(name, request);
|
|
79
|
+
(0, schreiben_js_1.schluessel)(name, p, { pflicht: true });
|
|
80
|
+
if (p.createMatrix === true && p.variants !== null && p.variants !== undefined) {
|
|
81
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, 'createMatrix und variants schliessen sich aus: entweder alle Kombinationen oder die genannten Varianten');
|
|
82
|
+
}
|
|
83
|
+
vorgabenZahlen(name, p.defaults);
|
|
84
|
+
if (p.variants !== null && p.variants !== undefined) {
|
|
85
|
+
if (!Array.isArray(p.variants))
|
|
86
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, 'variants muss eine Liste sein');
|
|
87
|
+
p.variants.forEach((x, i) => variante(name, x, `variants[${i}].`));
|
|
88
|
+
}
|
|
89
|
+
return gruppeAus(name, await transport(name, p));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Aendert eine aktive Gruppe (Name, Vorgaben, neue Werte) oder legt sie mit
|
|
93
|
+
* `active: false` still: die Gruppe und alle ihre Varianten, endgueltig. Die
|
|
94
|
+
* Antwort kommt erst, wenn alle Varianten stillgelegt sind. Bestehende
|
|
95
|
+
* Varianten aendern Name und Vorgaben nicht (dafuer `updateArticle`).
|
|
96
|
+
*/
|
|
97
|
+
async function updateVariantGroup(transport, request) {
|
|
98
|
+
const name = 'updateVariantGroup';
|
|
99
|
+
const p = (0, schreiben_js_1.anfrage)(name, request);
|
|
100
|
+
(0, schreiben_js_1.schluessel)(name, p, { pflicht: true });
|
|
101
|
+
(0, endpunkte_js_1.kennung)(name, 'variantGroupId', p.variantGroupId);
|
|
102
|
+
const aenderungen = ['name', 'defaults', 'addAttributeValues'].filter((k) => p[k] !== undefined);
|
|
103
|
+
if (p.active !== undefined) {
|
|
104
|
+
if (p.active !== false)
|
|
105
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, 'active kennt nur false (stilllegen); eine stillgelegte Gruppe bleibt stillgelegt');
|
|
106
|
+
if (aenderungen.length)
|
|
107
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, 'active: false steht allein, ohne weitere Aenderung');
|
|
108
|
+
}
|
|
109
|
+
else if (!aenderungen.length) {
|
|
110
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, 'die Aenderung nennt kein Feld');
|
|
111
|
+
}
|
|
112
|
+
vorgabenZahlen(name, p.defaults);
|
|
113
|
+
if (p.addAttributeValues !== undefined && !istObjekt(p.addAttributeValues)) {
|
|
114
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, 'addAttributeValues muss ein Objekt { merkmal: [werte] } sein');
|
|
115
|
+
}
|
|
116
|
+
return gruppeAus(name, await transport(name, p));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Legt eine Variante in einer aktiven Gruppe an. Antwort: der Artikel wie
|
|
120
|
+
* `createArticle`. Gibt es die Kombination schon, kommt
|
|
121
|
+
* `variant_already_exists` mit `articleId` der bestehenden Variante; nach dem
|
|
122
|
+
* Stilllegen einer Variante ist ihre Kombination wieder frei.
|
|
123
|
+
*/
|
|
124
|
+
async function addVariant(transport, request) {
|
|
125
|
+
const name = 'addVariant';
|
|
126
|
+
const p = (0, schreiben_js_1.anfrage)(name, request);
|
|
127
|
+
(0, schreiben_js_1.schluessel)(name, p, { pflicht: true });
|
|
128
|
+
(0, endpunkte_js_1.kennung)(name, 'variantGroupId', p.variantGroupId);
|
|
129
|
+
variante(name, p, '');
|
|
130
|
+
return (0, schreiben_js_1.artikelAus)(name, await transport(name, p));
|
|
131
|
+
}
|
|
132
|
+
/** Eine Variantengruppe mit ihren aktiven Varianten (eingefroren, wenn stillgelegt). */
|
|
133
|
+
async function getVariantGroup(transport, variantGroupId) {
|
|
134
|
+
const name = 'getVariantGroup';
|
|
135
|
+
return gruppeAus(name, await transport(name, { variantGroupId: (0, endpunkte_js_1.kennung)(name, 'variantGroupId', variantGroupId) }));
|
|
136
|
+
}
|
|
137
|
+
/** Variantengruppen nach `updatedAt` aufsteigend; Filter `active` und `updatedSince` (inklusive). */
|
|
138
|
+
async function listVariantGroups(transport, query) {
|
|
139
|
+
const name = 'listVariantGroups';
|
|
140
|
+
const daten = await transport(name, (0, endpunkte_js_1.abfrage)(name, query));
|
|
141
|
+
return { variantGroups: (0, lesen_js_1.liste)(name, daten, 'variantGroups', lesen_js_1.variantengruppe), nextCursor: (0, lesen_js_1.naechsterCursor)(name, daten) };
|
|
142
|
+
}
|
|
143
|
+
/** Alle Variantengruppen der Abfrage, Seite fuer Seite ueber `nextCursor`. */
|
|
144
|
+
function iterateVariantGroups(transport, query) {
|
|
145
|
+
const { cursor, ...rest } = query ?? {};
|
|
146
|
+
return (0, endpunkte_js_1.seitenweise)('listVariantGroups', cursor, async (c) => {
|
|
147
|
+
const s = await listVariantGroups(transport, { ...rest, cursor: c });
|
|
148
|
+
return { eintraege: s.variantGroups, nextCursor: s.nextCursor };
|
|
149
|
+
});
|
|
150
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Der Vertrag der Lager-API (Backend Stufe 5a lesen, 5b schreiben und
|
|
3
|
-
* reservieren) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
|
|
3
|
+
* reservieren, 5c Varianten) als Daten: Endpunkte, Wertkataloge, Ereignisse, Fehler- und
|
|
4
4
|
* Hinweiscodes, englisch wie am Draht `/v3`.
|
|
5
5
|
*
|
|
6
6
|
* Quelle ist der Vertrags-Export des Backends (`fixtures/v3/v3-vokabular.json`):
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* und `warningCodes.inventory`. `test/inventory.test.ts` haelt jede Liste
|
|
12
12
|
* deckungsgleich mit dieser Datei; nichts hier wird geraten.
|
|
13
13
|
*/
|
|
14
|
-
/** Die
|
|
15
|
-
export declare const INVENTORY_ENDPOINTS: readonly ["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"];
|
|
14
|
+
/** Die 32 Endpunkte (14 aus 5a, 13 aus 5b, 5 aus 5c), in der Reihenfolge von `endpoints.public`. */
|
|
15
|
+
export declare const INVENTORY_ENDPOINTS: readonly ["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", "createVariantGroup", "updateVariantGroup", "getVariantGroup", "listVariantGroups", "addVariant"];
|
|
16
16
|
export type InventoryEndpoint = (typeof INVENTORY_ENDPOINTS)[number];
|
|
17
17
|
/** Art eines Standorts (Katalog `STANDORT_TYP`). */
|
|
18
18
|
export declare const LOCATION_TYPES: readonly ["warehouse", "store", "vehicle", "other"];
|
|
@@ -52,8 +52,12 @@ export type WebhookDeliveryStatus = (typeof WEBHOOK_DELIVERY_STATUSES)[number];
|
|
|
52
52
|
* wie `getReservation`, mit dem Status danach: `reservation.released` und
|
|
53
53
|
* `reservation.redeemed` kommen bei jeder wirksamen Freigabe bzw. Einloesung,
|
|
54
54
|
* auch einer teilweisen (dann bleibt der Status `active`).
|
|
55
|
+
* `variant_group.created` und `variant_group.updated` (seit 1.6.0) tragen die
|
|
56
|
+
* Variantengruppe wie `getVariantGroup`; `updated` kommt nur bei einer aussen
|
|
57
|
+
* sichtbaren Aenderung (neuer Wert, neue oder stillgelegte Variante, Name,
|
|
58
|
+
* Vorgaben, Stilllegen der Gruppe).
|
|
55
59
|
*/
|
|
56
|
-
export declare const INVENTORY_WEBHOOK_EVENTS: readonly ["stock.changed", "stock.below_minimum", "article.created", "article.updated", "article.deactivated", "reservation.expired", "reservation.released", "reservation.redeemed"];
|
|
60
|
+
export declare const INVENTORY_WEBHOOK_EVENTS: readonly ["stock.changed", "stock.below_minimum", "article.created", "article.updated", "article.deactivated", "reservation.expired", "reservation.released", "reservation.redeemed", "variant_group.created", "variant_group.updated"];
|
|
57
61
|
export type InventoryWebhookEventType = (typeof INVENTORY_WEBHOOK_EVENTS)[number];
|
|
58
62
|
/**
|
|
59
63
|
* Die Felder der Huelle jeder Zustellung, in der Reihenfolge am Draht. Statt
|
|
@@ -81,8 +85,21 @@ export declare const INVENTORY_LIST_LIMIT_MAX = 200;
|
|
|
81
85
|
* [inventoryShortfalls]), `code_taken` und `external_id_taken` (mit `field` und
|
|
82
86
|
* `articleId` des Artikels, dem der Code gehoert), `stock_kind_locked`,
|
|
83
87
|
* `reservation_not_found`, `reservation_not_active` …
|
|
88
|
+
*
|
|
89
|
+
* Seit 1.6.0 dahinter die Codes der Variantengruppen: `variant_group_not_found`
|
|
90
|
+
* (unbekannte Kennung), `variant_already_exists` (die Kombination gibt es in der
|
|
91
|
+
* Gruppe schon, dann mit `articleId` der bestehenden Variante, oder sie steht
|
|
92
|
+
* zweimal in `variants[]`; jeweils mit `field`),
|
|
93
|
+
* `invalid_variant_attributes` (ein Merkmal fehlt, ist unbekannt oder sein Wert
|
|
94
|
+
* steht nicht in der Werteliste; `field` und `errors[]`),
|
|
95
|
+
* `variant_group_inactive` (stillgelegte Gruppe: kein `addVariant`, keine
|
|
96
|
+
* Aenderung ausser erneutem Stilllegen) und `variant_limit` (mehr als
|
|
97
|
+
* [VARIANT_GROUP_ACTIVE_MAX] aktive Varianten je Gruppe). Wiederverwendet:
|
|
98
|
+
* `too_many_positions` traegt bei Varianten `field` (`variants`,
|
|
99
|
+
* `createMatrix` bzw. `externalIds` bei `addVariant`): die Anfrage braeuchte
|
|
100
|
+
* mehr Schreibvorgaenge, als in einen Vorgang passen; geschrieben wurde nichts.
|
|
84
101
|
*/
|
|
85
|
-
export declare const INVENTORY_ERROR_CODES: readonly ["validation", "invalid_cursor", "article_not_found", "webhook_not_found", "webhook_limit", "invalid_webhook_url", "event_not_subscribed", "webhook_inactive", "inventory_api_not_enabled", "module_inactive", "rate_limited", "server_error", "idempotency_key_required", "idempotency_conflict", "location_not_found", "location_inactive", "invalid_location", "invalid_locations", "invalid_transfer", "operation_not_found", "already_reversed", "reversal_not_possible", "reversal_not_supported", "exceeds_stock", "no_positions", "too_many_positions", "invalid_step", "invalid_quantity", "invalid_amount", "invalid_price", "negative_value", "invalid_reason", "note_required", "withdrawal_type_required", "invalid_method", "invalid_stock_kind", "invalid_minimum", "invalid_dimensions", "weight_missing", "invalid_landed_cost", "invalid_distribution", "landed_costs_mismatch", "return_totals_mismatch", "lot_not_found", "invalid_serial", "serial_required", "serial_not_allowed", "serial_already_exists", "serial_not_in_stock", "code_taken", "external_id_taken", "group_not_found", "revenue_group_not_found", "stock_kind_locked", "article_inactive", "invalid_position", "invalid_condition", "reason_required", "insufficient_available", "reservation_not_found", "reservation_not_active"];
|
|
102
|
+
export declare const INVENTORY_ERROR_CODES: readonly ["validation", "invalid_cursor", "article_not_found", "webhook_not_found", "webhook_limit", "invalid_webhook_url", "event_not_subscribed", "webhook_inactive", "inventory_api_not_enabled", "module_inactive", "rate_limited", "server_error", "idempotency_key_required", "idempotency_conflict", "location_not_found", "location_inactive", "invalid_location", "invalid_locations", "invalid_transfer", "operation_not_found", "already_reversed", "reversal_not_possible", "reversal_not_supported", "exceeds_stock", "no_positions", "too_many_positions", "invalid_step", "invalid_quantity", "invalid_amount", "invalid_price", "negative_value", "invalid_reason", "note_required", "withdrawal_type_required", "invalid_method", "invalid_stock_kind", "invalid_minimum", "invalid_dimensions", "weight_missing", "invalid_landed_cost", "invalid_distribution", "landed_costs_mismatch", "return_totals_mismatch", "lot_not_found", "invalid_serial", "serial_required", "serial_not_allowed", "serial_already_exists", "serial_not_in_stock", "code_taken", "external_id_taken", "group_not_found", "revenue_group_not_found", "stock_kind_locked", "article_inactive", "invalid_position", "invalid_condition", "reason_required", "insufficient_available", "reservation_not_found", "reservation_not_active", "variant_group_not_found", "variant_already_exists", "invalid_variant_attributes", "variant_group_inactive", "variant_limit"];
|
|
86
103
|
export type InventoryErrorCode = (typeof INVENTORY_ERROR_CODES)[number];
|
|
87
104
|
/**
|
|
88
105
|
* Codes, die Anmeldung und Rand auf jedem Lager-Aufruf erzeugen koennen,
|
|
@@ -134,3 +151,21 @@ export declare const INVENTORY_IDEMPOTENCY_KEY_MAX = 120;
|
|
|
134
151
|
/** Kuerzeste und laengste Haltedauer einer Reservierung in Minuten (`expiresInMinutes`, 30 Tage). */
|
|
135
152
|
export declare const RESERVATION_MINUTES_MIN = 5;
|
|
136
153
|
export declare const RESERVATION_MINUTES_MAX = 43200;
|
|
154
|
+
/**
|
|
155
|
+
* Grenzen einer Variantengruppe, wie das Backend sie prueft. Das Paket prueft
|
|
156
|
+
* sie **nicht** vor dem Senden: der Server darf sie anheben, ohne dass eine
|
|
157
|
+
* aeltere Paketversion dann faelschlich abweist. Wer darueber liegt, bekommt
|
|
158
|
+
* `validation` (Merkmale, Werte, Matrix, `variants[]`) bzw. `variant_limit`.
|
|
159
|
+
*
|
|
160
|
+
* - [VARIANT_ATTRIBUTES_MAX] Merkmale je Gruppe (Schluessel `^[a-z0-9_]{1,32}$`,
|
|
161
|
+
* eindeutig; `__…__` ist reserviert),
|
|
162
|
+
* - [VARIANT_VALUES_MAX] Werte je Merkmal (je 1–30 Zeichen, eindeutig ohne
|
|
163
|
+
* Gross/Klein),
|
|
164
|
+
* - [VARIANT_MATRIX_MAX] Kombinationen bei `createMatrix: true` und hoechstens
|
|
165
|
+
* so viele Eintraege in `variants[]` je Anfrage,
|
|
166
|
+
* - [VARIANT_GROUP_ACTIVE_MAX] aktive Varianten je Gruppe.
|
|
167
|
+
*/
|
|
168
|
+
export declare const VARIANT_ATTRIBUTES_MAX = 3;
|
|
169
|
+
export declare const VARIANT_VALUES_MAX = 30;
|
|
170
|
+
export declare const VARIANT_MATRIX_MAX = 100;
|
|
171
|
+
export declare const VARIANT_GROUP_ACTIVE_MAX = 250;
|