@kreiseck/kasseneck-api 1.5.0 → 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 +124 -0
- package/README.md +181 -27
- package/dist/cjs/client/aufrufe.d.ts +58 -4
- package/dist/cjs/client/aufrufe.js +185 -1
- package/dist/cjs/client/errors.d.ts +32 -19
- package/dist/cjs/client/errors.js +28 -17
- package/dist/cjs/client/index.d.ts +2 -2
- package/dist/cjs/client/index.js +2 -1
- package/dist/cjs/client/transport.d.ts +27 -1
- package/dist/cjs/client/transport.js +25 -27
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/inventory/api.d.ts +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 +26 -1
- package/dist/cjs/inventory/schreiben.js +24 -10
- 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/invoice/endpunkte.d.ts +6 -0
- package/dist/cjs/invoice/endpunkte.js +13 -2
- package/dist/cjs/pos/texte.d.ts +11 -6
- package/dist/cjs/pos/texte.js +11 -6
- package/dist/cjs/stored/vokabular.d.ts +1 -1
- package/dist/cjs/stored/vokabular.js +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/aufrufe.d.ts +58 -4
- package/dist/esm/client/aufrufe.js +183 -0
- package/dist/esm/client/errors.d.ts +32 -19
- package/dist/esm/client/errors.js +28 -17
- package/dist/esm/client/index.d.ts +2 -2
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/client/transport.d.ts +27 -1
- package/dist/esm/client/transport.js +26 -28
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/inventory/api.d.ts +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 +26 -1
- package/dist/esm/inventory/schreiben.js +19 -11
- 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/invoice/endpunkte.d.ts +6 -0
- package/dist/esm/invoice/endpunkte.js +13 -2
- package/dist/esm/pos/texte.d.ts +11 -6
- package/dist/esm/pos/texte.js +11 -6
- package/dist/esm/stored/vokabular.d.ts +1 -1
- package/dist/esm/stored/vokabular.js +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 +85 -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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
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
|
|
3
|
+
* reservieren, Varianten): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
|
|
4
4
|
* Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
|
|
5
5
|
*/
|
|
6
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';
|
|
7
|
+
import type { AddVariantRequest, CreateVariantGroupRequest, UpdateVariantGroupRequest, VariantGroup, VariantGroupListQuery, VariantGroupPage, 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
8
|
import type { InventoryWebhookEventType } from './vertrag.js';
|
|
9
9
|
export interface InventoryClientOptions {
|
|
10
10
|
/** `api_key` des Kontos (`kr_live_…` / `kr_test_…`). Gehoert auf einen Server. */
|
|
@@ -57,5 +57,13 @@ export interface InventoryClient {
|
|
|
57
57
|
getReservation(reservationId: string): Promise<Reservation>;
|
|
58
58
|
listReservations(query?: ReservationListQuery): Promise<ReservationPage>;
|
|
59
59
|
iterateReservations(query?: ReservationListQuery): AsyncGenerator<Reservation, void, undefined>;
|
|
60
|
+
createVariantGroup(request: CreateVariantGroupRequest): Promise<VariantGroup>;
|
|
61
|
+
/** Name, Vorgaben, neue Werte; oder `active: false` (Gruppe und alle Varianten stilllegen, endgueltig). */
|
|
62
|
+
updateVariantGroup(request: UpdateVariantGroupRequest): Promise<VariantGroup>;
|
|
63
|
+
/** Eine Variante mehr; Antwort: der Artikel wie `createArticle`. */
|
|
64
|
+
addVariant(request: AddVariantRequest): Promise<Article>;
|
|
65
|
+
getVariantGroup(variantGroupId: string): Promise<VariantGroup>;
|
|
66
|
+
listVariantGroups(query?: VariantGroupListQuery): Promise<VariantGroupPage>;
|
|
67
|
+
iterateVariantGroups(query?: VariantGroupListQuery): AsyncGenerator<VariantGroup, void, undefined>;
|
|
60
68
|
}
|
|
61
69
|
export declare function createInventoryClient(options: InventoryClientOptions): InventoryClient;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Fassade ueber den Aufrufen der Lager-API (lesen, Webhooks, schreiben,
|
|
4
|
-
* reservieren): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
|
|
4
|
+
* reservieren, Varianten): Schluessel einmal binden, dann rufen. Wie [createInvoiceApi] bewusst keine Klasse; die Aufrufe sind freie
|
|
5
5
|
* Funktionen (endpunkte.ts) und bleiben einzeln importierbar.
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -10,6 +10,7 @@ const transport_js_1 = require("../client/transport.js");
|
|
|
10
10
|
const auth_js_1 = require("./auth.js");
|
|
11
11
|
const endpunkte_js_1 = require("./endpunkte.js");
|
|
12
12
|
const schreiben_js_1 = require("./schreiben.js");
|
|
13
|
+
const varianten_js_1 = require("./varianten.js");
|
|
13
14
|
function createInventoryClient(options) {
|
|
14
15
|
const rufen = (0, transport_js_1.createTransport)({
|
|
15
16
|
auth: (0, auth_js_1.inventoryKeyAuth)({ apiKey: options.apiKey }),
|
|
@@ -50,5 +51,11 @@ function createInventoryClient(options) {
|
|
|
50
51
|
getReservation: (id) => (0, schreiben_js_1.getReservation)(rufen, id),
|
|
51
52
|
listReservations: (q) => (0, schreiben_js_1.listReservations)(rufen, q),
|
|
52
53
|
iterateReservations: (q) => (0, schreiben_js_1.iterateReservations)(rufen, q),
|
|
54
|
+
createVariantGroup: (r) => (0, varianten_js_1.createVariantGroup)(rufen, r),
|
|
55
|
+
updateVariantGroup: (r) => (0, varianten_js_1.updateVariantGroup)(rufen, r),
|
|
56
|
+
addVariant: (r) => (0, varianten_js_1.addVariant)(rufen, r),
|
|
57
|
+
getVariantGroup: (id) => (0, varianten_js_1.getVariantGroup)(rufen, id),
|
|
58
|
+
listVariantGroups: (q) => (0, varianten_js_1.listVariantGroups)(rufen, q),
|
|
59
|
+
iterateVariantGroups: (q) => (0, varianten_js_1.iterateVariantGroups)(rufen, q),
|
|
53
60
|
};
|
|
54
61
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Die Aufrufe der Lager-API: Artikel, Standorte, Bestand und Bewegungen
|
|
3
3
|
* lesen, Konto-Webhooks verwalten (Backend Stufe 5a). Die schreibenden
|
|
4
|
-
* Aufrufe (Stufe 5b) stehen in `schreiben.ts
|
|
4
|
+
* Aufrufe (Stufe 5b) stehen in `schreiben.ts`, die Variantengruppen (Stufe 5c)
|
|
5
|
+
* in `varianten.ts`; beide teilen die Helfer hier.
|
|
5
6
|
*
|
|
6
7
|
* Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln
|
|
7
8
|
* importierbar; die Fassade [createInventoryClient] bindet ihn nur einmal.
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Die Aufrufe der Lager-API: Artikel, Standorte, Bestand und Bewegungen
|
|
4
4
|
* lesen, Konto-Webhooks verwalten (Backend Stufe 5a). Die schreibenden
|
|
5
|
-
* Aufrufe (Stufe 5b) stehen in `schreiben.ts
|
|
5
|
+
* Aufrufe (Stufe 5b) stehen in `schreiben.ts`, die Variantengruppen (Stufe 5c)
|
|
6
|
+
* in `varianten.ts`; beide teilen die Helfer hier.
|
|
6
7
|
*
|
|
7
8
|
* Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln
|
|
8
9
|
* importierbar; die Fassade [createInventoryClient] bindet ihn nur einmal.
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* `@kreiseck/kasseneck-api/inventory` – die Lager-API: Artikel, Standorte,
|
|
3
3
|
* Bestand und Lagerprotokoll lesen, Konto-Webhooks verwalten und eingehende
|
|
4
4
|
* Zustellungen pruefen (Backend Stufe 5a); Artikel anlegen und aendern,
|
|
5
|
-
* Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0)
|
|
5
|
+
* Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0);
|
|
6
|
+
* Variantengruppen (Stufe 5c, seit 1.6.0).
|
|
6
7
|
*
|
|
7
8
|
* Ein eigener Unterpfad wie `invoice`: der `api_key` eines Kontos gehoert auf
|
|
8
9
|
* einen **Server** (etwa das Backend eines Online-Shops) und soll nicht
|
|
@@ -16,6 +17,7 @@ export { inventoryKeyAuth, type InventoryKeyAuthOptions } from './auth.js';
|
|
|
16
17
|
export { isInventoryError, isInventoryErrorCode, inventoryErrorCode, inventoryFieldErrors, inventoryRetryAfterSec, inventoryShortfalls, isInventoryWarningCode, type InventoryApiErrorCode, type InventoryFieldError, } from './fehler.js';
|
|
17
18
|
export { createWebhook, deleteWebhook, getArticle, getStock, iterateArticles, iterateStock, iterateStockMovements, listArticles, listLocations, listStock, listStockMovements, listWebhookDeliveries, listWebhooks, lookupArticleByCode, rotateWebhookSecret, sendWebhookTest, updateWebhook, } from './endpunkte.js';
|
|
18
19
|
export { changeStockCondition, createArticle, createReservation, deactivateArticle, extendReservation, getReservation, iterateReservations, listReservations, previewGoodsReceipt, receiveGoods, recordStockLoss, releaseReservation, reverseStockMovement, transferStock, updateArticle, } from './schreiben.js';
|
|
20
|
+
export { addVariant, createVariantGroup, getVariantGroup, iterateVariantGroups, listVariantGroups, updateVariantGroup, } from './varianten.js';
|
|
19
21
|
export { verifyInventoryWebhookSignature, parseInventoryWebhookEvent, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, type VerifyInventoryWebhookOptions, } from './webhook.js';
|
|
20
|
-
export type { Article, ArticleInput, ArticleListQuery, ArticleLookup, ArticlePage, ChangeStockConditionRequest, CreateArticleRequest, CreateInventoryWebhookOptions, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptItem, GoodsReceiptPreview, GoodsReceiptPreviewLine, GoodsReceiptPreviewRequest, InventoryShortfall, InventoryWarning, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookEnvelope, InventoryWebhookEvent, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestDelivery, InventoryWebhookTestResult, InventoryWebhookWithSecret, LandedCost, Location, LocationAddress, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationItem, ReleaseReservationRequest, Reservation, ReservationItem, ReservationItemInput, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockBelowMinimumEventData, StockChangedEventData, StockItem, StockLevel, StockListQuery, StockMovement, StockMovementLot, StockMovementPage, StockMovementQuery, StockMovementSourceRef, StockOperation, StockPage, StockResult, StockValue, TransferStockRequest, UpdateArticleRequest, } from './typen.js';
|
|
21
|
-
export { INVENTORY_ENDPOINTS, INVENTORY_ERROR_CODES, INVENTORY_REQUEST_ERROR_CODES, INVENTORY_WEBHOOK_EVENTS, INVENTORY_WEBHOOK_ENVELOPE_FIELDS, INVENTORY_WEBHOOK_LIMIT, INVENTORY_LIST_LIMIT_MAX, LOCATION_TYPES, STOCK_MOVEMENT_TYPES, STOCK_MOVEMENT_SOURCES, STOCK_CONDITIONS, STOCK_CHANGE_CAUSES, WEBHOOK_DELIVERY_STATUSES, INVENTORY_WARNING_CODES, STOCK_KINDS, STOCK_LOSS_REASONS, WITHDRAWAL_TYPES, LANDED_COST_TYPES, LANDED_COST_ALLOCATIONS, RESERVATION_STATUSES, INVENTORY_IDEMPOTENCY_KEY_MAX, RESERVATION_MINUTES_MIN, RESERVATION_MINUTES_MAX, type InventoryEndpoint, type InventoryErrorCode, type InventoryRequestErrorCode, type InventoryWebhookEventType, type LocationType, type StockMovementType, type StockMovementSource, type StockCondition, type StockChangeCause, type WebhookDeliveryStatus, type InventoryWarningCode, type StockKind, type StockLossReason, type WithdrawalType, type LandedCostType, type LandedCostAllocation, type ReservationStatus, } from './vertrag.js';
|
|
22
|
+
export type { AddVariantRequest, Article, ArticleInput, ArticleListQuery, ArticleLookup, ArticlePage, ChangeStockConditionRequest, CreateArticleRequest, CreateInventoryWebhookOptions, CreateReservationRequest, CreateVariantGroupRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptItem, GoodsReceiptPreview, GoodsReceiptPreviewLine, GoodsReceiptPreviewRequest, InventoryShortfall, InventoryWarning, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookEnvelope, InventoryWebhookEvent, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestDelivery, InventoryWebhookTestResult, InventoryWebhookWithSecret, LandedCost, Location, LocationAddress, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationItem, ReleaseReservationRequest, Reservation, ReservationItem, ReservationItemInput, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockBelowMinimumEventData, StockChangedEventData, StockItem, StockLevel, StockListQuery, StockMovement, StockMovementLot, StockMovementPage, StockMovementQuery, StockMovementSourceRef, StockOperation, StockPage, StockResult, StockValue, TransferStockRequest, UpdateArticleRequest, UpdateVariantGroupRequest, VariantAttribute, VariantGroup, VariantGroupDefaults, VariantGroupDefaultsInput, VariantGroupListQuery, VariantGroupMember, VariantGroupPage, VariantInput, } from './typen.js';
|
|
23
|
+
export { INVENTORY_ENDPOINTS, INVENTORY_ERROR_CODES, INVENTORY_REQUEST_ERROR_CODES, INVENTORY_WEBHOOK_EVENTS, INVENTORY_WEBHOOK_ENVELOPE_FIELDS, INVENTORY_WEBHOOK_LIMIT, INVENTORY_LIST_LIMIT_MAX, LOCATION_TYPES, STOCK_MOVEMENT_TYPES, STOCK_MOVEMENT_SOURCES, STOCK_CONDITIONS, STOCK_CHANGE_CAUSES, WEBHOOK_DELIVERY_STATUSES, INVENTORY_WARNING_CODES, STOCK_KINDS, STOCK_LOSS_REASONS, WITHDRAWAL_TYPES, LANDED_COST_TYPES, LANDED_COST_ALLOCATIONS, RESERVATION_STATUSES, INVENTORY_IDEMPOTENCY_KEY_MAX, RESERVATION_MINUTES_MIN, RESERVATION_MINUTES_MAX, VARIANT_ATTRIBUTES_MAX, VARIANT_VALUES_MAX, VARIANT_MATRIX_MAX, VARIANT_GROUP_ACTIVE_MAX, type InventoryEndpoint, type InventoryErrorCode, type InventoryRequestErrorCode, type InventoryWebhookEventType, type LocationType, type StockMovementType, type StockMovementSource, type StockCondition, type StockChangeCause, type WebhookDeliveryStatus, type InventoryWarningCode, type StockKind, type StockLossReason, type WithdrawalType, type LandedCostType, type LandedCostAllocation, type ReservationStatus, } from './vertrag.js';
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* `@kreiseck/kasseneck-api/inventory` – die Lager-API: Artikel, Standorte,
|
|
4
4
|
* Bestand und Lagerprotokoll lesen, Konto-Webhooks verwalten und eingehende
|
|
5
5
|
* Zustellungen pruefen (Backend Stufe 5a); Artikel anlegen und aendern,
|
|
6
|
-
* Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0)
|
|
6
|
+
* Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0);
|
|
7
|
+
* Variantengruppen (Stufe 5c, seit 1.6.0).
|
|
7
8
|
*
|
|
8
9
|
* Ein eigener Unterpfad wie `invoice`: der `api_key` eines Kontos gehoert auf
|
|
9
10
|
* einen **Server** (etwa das Backend eines Online-Shops) und soll nicht
|
|
@@ -13,8 +14,8 @@
|
|
|
13
14
|
* Mikro-Euro; alles Ganzzahlen.
|
|
14
15
|
*/
|
|
15
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.
|
|
17
|
-
exports.RESERVATION_MINUTES_MAX = exports.RESERVATION_MINUTES_MIN = exports.INVENTORY_IDEMPOTENCY_KEY_MAX = exports.RESERVATION_STATUSES = exports.LANDED_COST_ALLOCATIONS = exports.LANDED_COST_TYPES = exports.WITHDRAWAL_TYPES = exports.STOCK_LOSS_REASONS = exports.STOCK_KINDS = exports.INVENTORY_WARNING_CODES = exports.WEBHOOK_DELIVERY_STATUSES = exports.STOCK_CHANGE_CAUSES = exports.STOCK_CONDITIONS = exports.STOCK_MOVEMENT_SOURCES = exports.STOCK_MOVEMENT_TYPES = exports.LOCATION_TYPES = exports.INVENTORY_LIST_LIMIT_MAX = exports.INVENTORY_WEBHOOK_LIMIT = exports.INVENTORY_WEBHOOK_ENVELOPE_FIELDS = exports.INVENTORY_WEBHOOK_EVENTS = void 0;
|
|
17
|
+
exports.WEBHOOK_SIGNATURE_HEADER = exports.parseInventoryWebhookEvent = exports.verifyInventoryWebhookSignature = exports.updateVariantGroup = exports.listVariantGroups = exports.iterateVariantGroups = exports.getVariantGroup = exports.createVariantGroup = exports.addVariant = exports.updateArticle = exports.transferStock = exports.reverseStockMovement = exports.releaseReservation = exports.recordStockLoss = exports.receiveGoods = exports.previewGoodsReceipt = exports.listReservations = exports.iterateReservations = exports.getReservation = exports.extendReservation = exports.deactivateArticle = exports.createReservation = exports.createArticle = exports.changeStockCondition = exports.updateWebhook = exports.sendWebhookTest = exports.rotateWebhookSecret = exports.lookupArticleByCode = exports.listWebhooks = exports.listWebhookDeliveries = exports.listStockMovements = exports.listStock = exports.listLocations = exports.listArticles = exports.iterateStockMovements = exports.iterateStock = exports.iterateArticles = exports.getStock = exports.getArticle = exports.deleteWebhook = exports.createWebhook = exports.isInventoryWarningCode = exports.inventoryShortfalls = exports.inventoryRetryAfterSec = exports.inventoryFieldErrors = exports.inventoryErrorCode = exports.isInventoryErrorCode = exports.isInventoryError = exports.inventoryKeyAuth = exports.createInventoryClient = void 0;
|
|
18
|
+
exports.VARIANT_GROUP_ACTIVE_MAX = exports.VARIANT_MATRIX_MAX = exports.VARIANT_VALUES_MAX = exports.VARIANT_ATTRIBUTES_MAX = exports.RESERVATION_MINUTES_MAX = exports.RESERVATION_MINUTES_MIN = exports.INVENTORY_IDEMPOTENCY_KEY_MAX = exports.RESERVATION_STATUSES = exports.LANDED_COST_ALLOCATIONS = exports.LANDED_COST_TYPES = exports.WITHDRAWAL_TYPES = exports.STOCK_LOSS_REASONS = exports.STOCK_KINDS = exports.INVENTORY_WARNING_CODES = exports.WEBHOOK_DELIVERY_STATUSES = exports.STOCK_CHANGE_CAUSES = exports.STOCK_CONDITIONS = exports.STOCK_MOVEMENT_SOURCES = exports.STOCK_MOVEMENT_TYPES = exports.LOCATION_TYPES = exports.INVENTORY_LIST_LIMIT_MAX = exports.INVENTORY_WEBHOOK_LIMIT = exports.INVENTORY_WEBHOOK_ENVELOPE_FIELDS = exports.INVENTORY_WEBHOOK_EVENTS = exports.INVENTORY_REQUEST_ERROR_CODES = exports.INVENTORY_ERROR_CODES = exports.INVENTORY_ENDPOINTS = exports.WEBHOOK_TOLERANCE_SEC = exports.WEBHOOK_DELIVERY_HEADER = exports.WEBHOOK_EVENT_HEADER = void 0;
|
|
18
19
|
var api_js_1 = require("./api.js");
|
|
19
20
|
Object.defineProperty(exports, "createInventoryClient", { enumerable: true, get: function () { return api_js_1.createInventoryClient; } });
|
|
20
21
|
var auth_js_1 = require("./auth.js");
|
|
@@ -61,6 +62,13 @@ Object.defineProperty(exports, "releaseReservation", { enumerable: true, get: fu
|
|
|
61
62
|
Object.defineProperty(exports, "reverseStockMovement", { enumerable: true, get: function () { return schreiben_js_1.reverseStockMovement; } });
|
|
62
63
|
Object.defineProperty(exports, "transferStock", { enumerable: true, get: function () { return schreiben_js_1.transferStock; } });
|
|
63
64
|
Object.defineProperty(exports, "updateArticle", { enumerable: true, get: function () { return schreiben_js_1.updateArticle; } });
|
|
65
|
+
var varianten_js_1 = require("./varianten.js");
|
|
66
|
+
Object.defineProperty(exports, "addVariant", { enumerable: true, get: function () { return varianten_js_1.addVariant; } });
|
|
67
|
+
Object.defineProperty(exports, "createVariantGroup", { enumerable: true, get: function () { return varianten_js_1.createVariantGroup; } });
|
|
68
|
+
Object.defineProperty(exports, "getVariantGroup", { enumerable: true, get: function () { return varianten_js_1.getVariantGroup; } });
|
|
69
|
+
Object.defineProperty(exports, "iterateVariantGroups", { enumerable: true, get: function () { return varianten_js_1.iterateVariantGroups; } });
|
|
70
|
+
Object.defineProperty(exports, "listVariantGroups", { enumerable: true, get: function () { return varianten_js_1.listVariantGroups; } });
|
|
71
|
+
Object.defineProperty(exports, "updateVariantGroup", { enumerable: true, get: function () { return varianten_js_1.updateVariantGroup; } });
|
|
64
72
|
var webhook_js_1 = require("./webhook.js");
|
|
65
73
|
Object.defineProperty(exports, "verifyInventoryWebhookSignature", { enumerable: true, get: function () { return webhook_js_1.verifyInventoryWebhookSignature; } });
|
|
66
74
|
Object.defineProperty(exports, "parseInventoryWebhookEvent", { enumerable: true, get: function () { return webhook_js_1.parseInventoryWebhookEvent; } });
|
|
@@ -92,3 +100,7 @@ Object.defineProperty(exports, "RESERVATION_STATUSES", { enumerable: true, get:
|
|
|
92
100
|
Object.defineProperty(exports, "INVENTORY_IDEMPOTENCY_KEY_MAX", { enumerable: true, get: function () { return vertrag_js_1.INVENTORY_IDEMPOTENCY_KEY_MAX; } });
|
|
93
101
|
Object.defineProperty(exports, "RESERVATION_MINUTES_MIN", { enumerable: true, get: function () { return vertrag_js_1.RESERVATION_MINUTES_MIN; } });
|
|
94
102
|
Object.defineProperty(exports, "RESERVATION_MINUTES_MAX", { enumerable: true, get: function () { return vertrag_js_1.RESERVATION_MINUTES_MAX; } });
|
|
103
|
+
Object.defineProperty(exports, "VARIANT_ATTRIBUTES_MAX", { enumerable: true, get: function () { return vertrag_js_1.VARIANT_ATTRIBUTES_MAX; } });
|
|
104
|
+
Object.defineProperty(exports, "VARIANT_VALUES_MAX", { enumerable: true, get: function () { return vertrag_js_1.VARIANT_VALUES_MAX; } });
|
|
105
|
+
Object.defineProperty(exports, "VARIANT_MATRIX_MAX", { enumerable: true, get: function () { return vertrag_js_1.VARIANT_MATRIX_MAX; } });
|
|
106
|
+
Object.defineProperty(exports, "VARIANT_GROUP_ACTIVE_MAX", { enumerable: true, get: function () { return vertrag_js_1.VARIANT_GROUP_ACTIVE_MAX; } });
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* wenn der Server sie sendet: „fehlt“ heisst dort „kein Recht“, nicht „leer“.
|
|
13
13
|
*/
|
|
14
14
|
import { KasseneckValidationError } from '../client/errors.js';
|
|
15
|
-
import type { Article, GoodsReceiptPreviewLine, InventoryShortfall, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookTestDelivery, Location, Reservation, StockBelowMinimumEventData, StockChangedEventData, StockLevel, StockMovement, StockOperation, StockValue } from './typen.js';
|
|
15
|
+
import type { Article, GoodsReceiptPreviewLine, InventoryShortfall, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookTestDelivery, Location, Reservation, StockBelowMinimumEventData, StockChangedEventData, StockLevel, StockMovement, StockOperation, StockValue, VariantGroup } from './typen.js';
|
|
16
16
|
type Roh = Record<string, unknown>;
|
|
17
17
|
/** Ein Leser bekommt den Vorgang (fuer die Meldung) und den Pfad im Rumpf. */
|
|
18
18
|
export interface Ort {
|
|
@@ -38,6 +38,12 @@ export declare function vorschauZeile(ort: Ort, w: unknown): GoodsReceiptPreview
|
|
|
38
38
|
export declare function reservierung(ort: Ort, w: unknown): Reservation;
|
|
39
39
|
/** Die fehlenden Positionen aus `insufficient_available` (`data.details[]`); ein kaputter Eintrag faellt weg. */
|
|
40
40
|
export declare function fehlmengen(roh: unknown): InventoryShortfall[];
|
|
41
|
+
/**
|
|
42
|
+
* Eine Variantengruppe. `attributes` und `variants` sind zugesagte Listen:
|
|
43
|
+
* fehlen sie, ist die Antwort kaputt (eine leere Liste hiesse „keine Merkmale“
|
|
44
|
+
* bzw. „keine Varianten“).
|
|
45
|
+
*/
|
|
46
|
+
export declare function variantengruppe(ort: Ort, w: unknown): VariantGroup;
|
|
41
47
|
/** Eine zugesagte Liste `data.<feld>`, Eintrag fuer Eintrag gelesen. */
|
|
42
48
|
export declare function liste<T>(name: string, daten: unknown, feld: string, lesen: (ort: Ort, e: unknown) => T): T[];
|
|
43
49
|
/** Der Cursor der naechsten Seite; `null` am Ende. Etwas anderes als Text oder `null` ist kaputt. */
|
|
@@ -29,6 +29,7 @@ exports.vorgang = vorgang;
|
|
|
29
29
|
exports.vorschauZeile = vorschauZeile;
|
|
30
30
|
exports.reservierung = reservierung;
|
|
31
31
|
exports.fehlmengen = fehlmengen;
|
|
32
|
+
exports.variantengruppe = variantengruppe;
|
|
32
33
|
exports.liste = liste;
|
|
33
34
|
exports.naechsterCursor = naechsterCursor;
|
|
34
35
|
const errors_js_1 = require("../client/errors.js");
|
|
@@ -401,6 +402,80 @@ function fehlmengen(roh) {
|
|
|
401
402
|
}
|
|
402
403
|
return raus;
|
|
403
404
|
}
|
|
405
|
+
// ---- Varianten (Stufe 5c) ------------------------------------------------------------
|
|
406
|
+
/** Eine Liste von Texten (Werte eines Merkmals); etwas anderes ist kaputt. */
|
|
407
|
+
function textliste(ort, feld, w) {
|
|
408
|
+
if (!Array.isArray(w) || !w.every((x) => typeof x === 'string')) {
|
|
409
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.${feld} ist keine Liste von Texten)`);
|
|
410
|
+
}
|
|
411
|
+
return [...w];
|
|
412
|
+
}
|
|
413
|
+
function merkmal(ort, w) {
|
|
414
|
+
const m = eintrag(ort, w);
|
|
415
|
+
return { key: kennung(ort, 'key', m.key), label: typeof m.label === 'string' ? m.label : '', values: textliste(ort, 'values', m.values) };
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Vorgaben einer Gruppe: nur die Felder, die der Server sendet. Ein Preis als
|
|
419
|
+
* Bruchzahl ist kaputt (er fuellte sonst jede neue Variante falsch), ein Feld
|
|
420
|
+
* mit fremdem Typ ebenso.
|
|
421
|
+
*/
|
|
422
|
+
function vorgaben(ort, w) {
|
|
423
|
+
if (w === undefined || w === null)
|
|
424
|
+
return {};
|
|
425
|
+
const v = objekt(w);
|
|
426
|
+
const vOrt = { name: ort.name, pfad: `${ort.pfad}.defaults` };
|
|
427
|
+
if (!v)
|
|
428
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${vOrt.pfad} ist kein Objekt)`);
|
|
429
|
+
const raus = {};
|
|
430
|
+
if (v.unitPriceCents !== undefined && v.unitPriceCents !== null)
|
|
431
|
+
raus.unitPriceCents = ganzzahl(vOrt, 'unitPriceCents', v.unitPriceCents);
|
|
432
|
+
if (v.vatRate !== undefined && v.vatRate !== null) {
|
|
433
|
+
if (typeof v.vatRate !== 'number' || !Number.isFinite(v.vatRate))
|
|
434
|
+
throw antwortfehler(ort.name, `Antwort enthaelt keinen USt-Satz (data.${vOrt.pfad}.vatRate)`);
|
|
435
|
+
raus.vatRate = v.vatRate;
|
|
436
|
+
}
|
|
437
|
+
for (const feld of ['unit', 'groupId']) {
|
|
438
|
+
const t = v[feld];
|
|
439
|
+
if (t === undefined || t === null)
|
|
440
|
+
continue;
|
|
441
|
+
if (typeof t !== 'string')
|
|
442
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${vOrt.pfad}.${feld} ist kein Text)`);
|
|
443
|
+
raus[feld] = t;
|
|
444
|
+
}
|
|
445
|
+
if (v.stockTracked !== undefined && v.stockTracked !== null) {
|
|
446
|
+
if (typeof v.stockTracked !== 'boolean')
|
|
447
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${vOrt.pfad}.stockTracked ist kein Wahrheitswert)`);
|
|
448
|
+
raus.stockTracked = v.stockTracked;
|
|
449
|
+
}
|
|
450
|
+
return raus;
|
|
451
|
+
}
|
|
452
|
+
function mitglied(ort, w) {
|
|
453
|
+
const x = eintrag(ort, w);
|
|
454
|
+
return { articleId: kennung(ort, 'articleId', x.articleId), variantAttributes: textAbbildung(x.variantAttributes) ?? {} };
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Eine Variantengruppe. `attributes` und `variants` sind zugesagte Listen:
|
|
458
|
+
* fehlen sie, ist die Antwort kaputt (eine leere Liste hiesse „keine Merkmale“
|
|
459
|
+
* bzw. „keine Varianten“).
|
|
460
|
+
*/
|
|
461
|
+
function variantengruppe(ort, w) {
|
|
462
|
+
const g = eintrag(ort, w);
|
|
463
|
+
for (const feld of ['attributes', 'variants']) {
|
|
464
|
+
if (!Array.isArray(g[feld]))
|
|
465
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.${feld} ist keine Liste)`);
|
|
466
|
+
}
|
|
467
|
+
const unter = (feld, i) => ({ name: ort.name, pfad: `${ort.pfad}.${feld}[${i}]` });
|
|
468
|
+
return {
|
|
469
|
+
id: kennung(ort, 'id', g.id),
|
|
470
|
+
name: text(g.name),
|
|
471
|
+
attributes: g.attributes.map((m, i) => merkmal(unter('attributes', i), m)),
|
|
472
|
+
defaults: vorgaben(ort, g.defaults),
|
|
473
|
+
active: g.active !== false,
|
|
474
|
+
variants: g.variants.map((x, i) => mitglied(unter('variants', i), x)),
|
|
475
|
+
createdAt: text(g.createdAt),
|
|
476
|
+
updatedAt: text(g.updatedAt),
|
|
477
|
+
};
|
|
478
|
+
}
|
|
404
479
|
// ---- Listen ------------------------------------------------------------------
|
|
405
480
|
/** Eine zugesagte Liste `data.<feld>`, Eintrag fuer Eintrag gelesen. */
|
|
406
481
|
function liste(name, daten, feld, lesen) {
|
|
@@ -23,9 +23,33 @@
|
|
|
23
23
|
* **Wiederholen:** nach einem Zeitlimit oder Netzfehler denselben Aufruf mit
|
|
24
24
|
* **demselben** `idempotencyKey` noch einmal senden. Er wirkt genau einmal und
|
|
25
25
|
* liefert die gespeicherte Antwort; ein neuer Schluessel buchte ein zweites Mal.
|
|
26
|
+
* Darum meldet jeder schreibende Aufruf in diesen Faellen (auch HTTP 5xx und
|
|
27
|
+
* unlesbare Antwort) `outcome: 'unknown'`, nie `'rejected'`. Lesen und der
|
|
28
|
+
* Probelauf (`previewGoodsReceipt`) bleiben `'rejected'`.
|
|
26
29
|
*/
|
|
27
|
-
import type { InternerTransport } from '../client/aufrufe.js';
|
|
30
|
+
import type { ApiCall, InternerTransport } from '../client/aufrufe.js';
|
|
28
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;
|
|
29
53
|
/**
|
|
30
54
|
* Legt einen Artikel an. Mit `ean` ein Fremdartikel mit diesem Code (gueltige
|
|
31
55
|
* Pruefziffer, frei im Konto), sonst vergibt der Server den naechsten eigenen
|
|
@@ -81,3 +105,4 @@ export declare function getReservation(transport: InternerTransport, reservation
|
|
|
81
105
|
export declare function listReservations(transport: InternerTransport, query?: ReservationListQuery): Promise<ReservationPage>;
|
|
82
106
|
/** Alle Reservierungen der Abfrage, Seite fuer Seite ueber `nextCursor`. */
|
|
83
107
|
export declare function iterateReservations(transport: InternerTransport, query?: ReservationListQuery): AsyncGenerator<Reservation, void, undefined>;
|
|
108
|
+
export {};
|
|
@@ -24,8 +24,16 @@
|
|
|
24
24
|
* **Wiederholen:** nach einem Zeitlimit oder Netzfehler denselben Aufruf mit
|
|
25
25
|
* **demselben** `idempotencyKey` noch einmal senden. Er wirkt genau einmal und
|
|
26
26
|
* liefert die gespeicherte Antwort; ein neuer Schluessel buchte ein zweites Mal.
|
|
27
|
+
* Darum meldet jeder schreibende Aufruf in diesen Faellen (auch HTTP 5xx und
|
|
28
|
+
* unlesbare Antwort) `outcome: 'unknown'`, nie `'rejected'`. Lesen und der
|
|
29
|
+
* Probelauf (`previewGoodsReceipt`) bleiben `'rejected'`.
|
|
27
30
|
*/
|
|
28
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;
|
|
29
37
|
exports.createArticle = createArticle;
|
|
30
38
|
exports.updateArticle = updateArticle;
|
|
31
39
|
exports.deactivateArticle = deactivateArticle;
|
|
@@ -45,7 +53,7 @@ const endpunkte_js_1 = require("./endpunkte.js");
|
|
|
45
53
|
const lesen_js_1 = require("./lesen.js");
|
|
46
54
|
const vertrag_js_1 = require("./vertrag.js");
|
|
47
55
|
// ---- Pruefung vor dem Senden ------------------------------------------------------
|
|
48
|
-
/** 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`. */
|
|
49
57
|
function anfrage(name, request) {
|
|
50
58
|
if (request === null || typeof request !== 'object' || Array.isArray(request)) {
|
|
51
59
|
throw (0, endpunkte_js_1.anfragefehler)(name, 'Anfrage muss ein Objekt sein');
|
|
@@ -121,19 +129,23 @@ function positionen(name, w, { pflicht, menge }, weiter = () => { }) {
|
|
|
121
129
|
});
|
|
122
130
|
}
|
|
123
131
|
// ---- Artikel ------------------------------------------------------------------
|
|
124
|
-
/**
|
|
125
|
-
|
|
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 = '') {
|
|
126
137
|
for (const feld of ['unitPriceCents', 'minStock', 'purchasePriceMicros'])
|
|
127
|
-
ganz(name, feld
|
|
138
|
+
ganz(name, `${praefix}${feld}`, p[feld], { leerbar: true });
|
|
128
139
|
const jeStandort = p.minStockByLocation;
|
|
129
140
|
if (jeStandort === undefined || jeStandort === null)
|
|
130
141
|
return;
|
|
131
142
|
if (typeof jeStandort !== 'object' || Array.isArray(jeStandort))
|
|
132
|
-
throw (0, endpunkte_js_1.anfragefehler)(name,
|
|
143
|
+
throw (0, endpunkte_js_1.anfragefehler)(name, `${praefix}minStockByLocation muss ein Objekt { standort: Tausendstel } sein`);
|
|
133
144
|
for (const [standort, w] of Object.entries(jeStandort))
|
|
134
|
-
ganz(name,
|
|
145
|
+
ganz(name, `${praefix}minStockByLocation.${standort}`, w, { leerbar: true });
|
|
135
146
|
}
|
|
136
147
|
const artikelAus = (name, daten) => (0, lesen_js_1.artikel)({ name, pfad: 'article' }, (0, lesen_js_1.objekt)(daten)?.article);
|
|
148
|
+
exports.artikelAus = artikelAus;
|
|
137
149
|
/**
|
|
138
150
|
* Legt einen Artikel an. Mit `ean` ein Fremdartikel mit diesem Code (gueltige
|
|
139
151
|
* Pruefziffer, frei im Konto), sonst vergibt der Server den naechsten eigenen
|
|
@@ -144,7 +156,7 @@ async function createArticle(transport, request) {
|
|
|
144
156
|
const p = anfrage(name, request);
|
|
145
157
|
schluessel(name, p, { pflicht: true });
|
|
146
158
|
artikelZahlen(name, p);
|
|
147
|
-
return artikelAus(name, await transport(name, p));
|
|
159
|
+
return (0, exports.artikelAus)(name, await transport(name, p));
|
|
148
160
|
}
|
|
149
161
|
/** Aendert nur die genannten Felder eines Artikels (siehe [UpdateArticleRequest]). */
|
|
150
162
|
async function updateArticle(transport, request) {
|
|
@@ -156,7 +168,7 @@ async function updateArticle(transport, request) {
|
|
|
156
168
|
throw (0, endpunkte_js_1.anfragefehler)(name, 'die Aenderung nennt kein Feld');
|
|
157
169
|
}
|
|
158
170
|
artikelZahlen(name, p);
|
|
159
|
-
return artikelAus(name, await transport(name, p));
|
|
171
|
+
return (0, exports.artikelAus)(name, await transport(name, p));
|
|
160
172
|
}
|
|
161
173
|
/** Legt einen Artikel still (`active: false`); Code und eigene Kennungen werden frei. */
|
|
162
174
|
async function deactivateArticle(transport, request) {
|
|
@@ -164,7 +176,7 @@ async function deactivateArticle(transport, request) {
|
|
|
164
176
|
const p = anfrage(name, request);
|
|
165
177
|
schluessel(name, p, { pflicht: true });
|
|
166
178
|
(0, endpunkte_js_1.kennung)(name, 'articleId', p.articleId);
|
|
167
|
-
return artikelAus(name, await transport(name, p));
|
|
179
|
+
return (0, exports.artikelAus)(name, await transport(name, p));
|
|
168
180
|
}
|
|
169
181
|
// ---- Buchen ------------------------------------------------------------------
|
|
170
182
|
function eingangZahlen(name, p) {
|
|
@@ -214,7 +226,9 @@ async function previewGoodsReceipt(transport, request) {
|
|
|
214
226
|
delete p.idempotencyKey;
|
|
215
227
|
schluessel(name, p, { pflicht: false });
|
|
216
228
|
eingangZahlen(name, p);
|
|
217
|
-
|
|
229
|
+
// Ein Probelauf schreibt nichts: nach einem Zeitlimit bleibt er `rejected`,
|
|
230
|
+
// obwohl `receiveGoods` sonst Wirkung hat.
|
|
231
|
+
const daten = await transport(name, { ...p, dryRun: true }, undefined, undefined, { hasEffect: false });
|
|
218
232
|
return { preview: (0, lesen_js_1.liste)(name, daten, 'preview', lesen_js_1.vorschauZeile) };
|
|
219
233
|
}
|
|
220
234
|
const stueckPositionen = (name, p) => positionen(name, p.items, { pflicht: true, menge: 'pflicht' });
|
|
@@ -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
|
+
}
|