@kreiseck/kasseneck-api 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +108 -0
- package/README.md +192 -11
- package/dist/cjs/client/aufrufe.d.ts +2 -2
- package/dist/cjs/client/aufrufe.js +28 -0
- package/dist/cjs/inventory/api.d.ts +19 -3
- package/dist/cjs/inventory/api.js +18 -2
- package/dist/cjs/inventory/endpunkte.d.ts +22 -2
- package/dist/cjs/inventory/endpunkte.js +6 -1
- package/dist/cjs/inventory/fehler.d.ts +11 -1
- package/dist/cjs/inventory/fehler.js +19 -0
- package/dist/cjs/inventory/index.d.ts +6 -4
- package/dist/cjs/inventory/index.js +32 -2
- package/dist/cjs/inventory/lesen.d.ts +8 -1
- package/dist/cjs/inventory/lesen.js +131 -1
- package/dist/cjs/inventory/schreiben.d.ts +83 -0
- package/dist/cjs/inventory/schreiben.js +315 -0
- package/dist/cjs/inventory/typen.d.ts +371 -11
- package/dist/cjs/inventory/vertrag.d.ts +76 -16
- package/dist/cjs/inventory/vertrag.js +138 -13
- package/dist/cjs/inventory/webhook.d.ts +3 -1
- package/dist/cjs/inventory/webhook.js +7 -1
- package/dist/cjs/invoice/index.d.ts +2 -2
- package/dist/cjs/invoice/index.js +2 -1
- package/dist/cjs/invoice/typen.d.ts +46 -2
- package/dist/cjs/invoice/vertrag.d.ts +19 -5
- package/dist/cjs/invoice/vertrag.js +37 -5
- package/dist/cjs/stored/vokabular.d.ts +1 -1
- package/dist/cjs/stored/vokabular.js +5 -3
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/aufrufe.d.ts +2 -2
- package/dist/esm/client/aufrufe.js +28 -0
- package/dist/esm/inventory/api.d.ts +19 -3
- package/dist/esm/inventory/api.js +18 -2
- package/dist/esm/inventory/endpunkte.d.ts +22 -2
- package/dist/esm/inventory/endpunkte.js +6 -5
- package/dist/esm/inventory/fehler.d.ts +11 -1
- package/dist/esm/inventory/fehler.js +18 -1
- package/dist/esm/inventory/index.d.ts +6 -4
- package/dist/esm/inventory/index.js +5 -3
- package/dist/esm/inventory/lesen.d.ts +8 -1
- package/dist/esm/inventory/lesen.js +127 -1
- package/dist/esm/inventory/schreiben.d.ts +83 -0
- package/dist/esm/inventory/schreiben.js +298 -0
- package/dist/esm/inventory/typen.d.ts +371 -11
- package/dist/esm/inventory/vertrag.d.ts +76 -16
- package/dist/esm/inventory/vertrag.js +137 -12
- package/dist/esm/inventory/webhook.d.ts +3 -1
- package/dist/esm/inventory/webhook.js +8 -2
- package/dist/esm/invoice/index.d.ts +2 -2
- package/dist/esm/invoice/index.js +1 -1
- package/dist/esm/invoice/typen.d.ts +46 -2
- package/dist/esm/invoice/vertrag.d.ts +19 -5
- package/dist/esm/invoice/vertrag.js +36 -4
- package/dist/esm/stored/vokabular.d.ts +1 -1
- package/dist/esm/stored/vokabular.js +5 -3
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/fixtures/hobex-hps-codes.json +1 -1
- package/fixtures/invoice-api-examples/credit-error-reservation.json +26 -0
- package/fixtures/invoice-api-examples/issue-error-reservation-article.json +25 -0
- package/fixtures/invoice-api-examples/issue-error-vat-id-risk.json +26 -0
- package/fixtures/invoice-api-examples/issue-reservation.json +24 -0
- package/fixtures/invoice-api-examples/issue-vat-id-risk.json +28 -0
- package/fixtures/invoice-api.schema.json +15 -2
- package/fixtures/invoice-texts.json +1 -1
- package/fixtures/pos-texts.json +1 -1
- package/fixtures/surface.json +152 -9
- package/fixtures/v3/antworten/belege.json +2 -2
- package/fixtures/v3/antworten/belegmail.json +2 -2
- package/fixtures/v3/antworten/kasse-belege.json +2 -2
- package/fixtures/v3/antworten/kasse.json +3 -3
- package/fixtures/v3/antworten/lager.json +2491 -130
- package/fixtures/v3/antworten/rechnungen.json +267 -44
- package/fixtures/v3/antworten/storno.json +2 -2
- package/fixtures/v3/stored/belege.json +2 -2
- package/fixtures/v3/stored/kasse.json +3 -3
- package/fixtures/v3/stored/rechnungen.json +174 -18
- package/fixtures/v3/v3-vokabular.json +593 -23
- package/fixtures/v3/zahlbetrag-faelle.json +2 -2
- package/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `@kreiseck/kasseneck-api/inventory` – die Lager-API: Artikel, Standorte,
|
|
3
3
|
* Bestand und Lagerprotokoll lesen, Konto-Webhooks verwalten und eingehende
|
|
4
|
-
* Zustellungen pruefen (Backend Stufe 5a)
|
|
4
|
+
* Zustellungen pruefen (Backend Stufe 5a); Artikel anlegen und aendern,
|
|
5
|
+
* Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.0).
|
|
5
6
|
*
|
|
6
7
|
* Ein eigener Unterpfad wie `invoice`: der `api_key` eines Kontos gehoert auf
|
|
7
8
|
* einen **Server** (etwa das Backend eines Online-Shops) und soll nicht
|
|
@@ -12,8 +13,9 @@
|
|
|
12
13
|
*/
|
|
13
14
|
export { createInventoryClient, type InventoryClient, type InventoryClientOptions } from './api.js';
|
|
14
15
|
export { inventoryKeyAuth, type InventoryKeyAuthOptions } from './auth.js';
|
|
15
|
-
export { isInventoryError, isInventoryErrorCode, inventoryErrorCode, inventoryFieldErrors, inventoryRetryAfterSec, type InventoryApiErrorCode, type InventoryFieldError, } from './fehler.js';
|
|
16
|
+
export { isInventoryError, isInventoryErrorCode, inventoryErrorCode, inventoryFieldErrors, inventoryRetryAfterSec, inventoryShortfalls, isInventoryWarningCode, type InventoryApiErrorCode, type InventoryFieldError, } from './fehler.js';
|
|
16
17
|
export { createWebhook, deleteWebhook, getArticle, getStock, iterateArticles, iterateStock, iterateStockMovements, listArticles, listLocations, listStock, listStockMovements, listWebhookDeliveries, listWebhooks, lookupArticleByCode, rotateWebhookSecret, sendWebhookTest, updateWebhook, } from './endpunkte.js';
|
|
18
|
+
export { changeStockCondition, createArticle, createReservation, deactivateArticle, extendReservation, getReservation, iterateReservations, listReservations, previewGoodsReceipt, receiveGoods, recordStockLoss, releaseReservation, reverseStockMovement, transferStock, updateArticle, } from './schreiben.js';
|
|
17
19
|
export { verifyInventoryWebhookSignature, parseInventoryWebhookEvent, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_EVENT_HEADER, WEBHOOK_DELIVERY_HEADER, WEBHOOK_TOLERANCE_SEC, type VerifyInventoryWebhookOptions, } from './webhook.js';
|
|
18
|
-
export type { Article, ArticleListQuery, ArticleLookup, ArticlePage, CreateInventoryWebhookOptions, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookEnvelope, InventoryWebhookEvent, InventoryWebhookList, InventoryWebhookPatch, InventoryWebhookTestDelivery, InventoryWebhookTestResult, InventoryWebhookWithSecret, Location, LocationAddress, StockBelowMinimumEventData, StockChangedEventData, StockLevel, StockListQuery, StockMovement, StockMovementLot, StockMovementPage, StockMovementQuery, StockMovementSourceRef, StockPage, StockResult, StockValue, } from './typen.js';
|
|
19
|
-
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, type InventoryEndpoint, type InventoryErrorCode, type InventoryRequestErrorCode, type InventoryWebhookEventType, type LocationType, type StockMovementType, type StockMovementSource, type StockCondition, type StockChangeCause, type WebhookDeliveryStatus, } from './vertrag.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';
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* `@kreiseck/kasseneck-api/inventory` – die Lager-API: Artikel, Standorte,
|
|
4
4
|
* Bestand und Lagerprotokoll lesen, Konto-Webhooks verwalten und eingehende
|
|
5
|
-
* Zustellungen pruefen (Backend Stufe 5a)
|
|
5
|
+
* Zustellungen pruefen (Backend Stufe 5a); Artikel anlegen und aendern,
|
|
6
|
+
* Bestand buchen und Ware reservieren (Stufe 5b, seit 1.5.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
|
|
@@ -12,7 +13,8 @@
|
|
|
12
13
|
* Mikro-Euro; alles Ganzzahlen.
|
|
13
14
|
*/
|
|
14
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.
|
|
16
|
+
exports.INVENTORY_REQUEST_ERROR_CODES = exports.INVENTORY_ERROR_CODES = exports.INVENTORY_ENDPOINTS = exports.WEBHOOK_TOLERANCE_SEC = exports.WEBHOOK_DELIVERY_HEADER = exports.WEBHOOK_EVENT_HEADER = exports.WEBHOOK_SIGNATURE_HEADER = exports.parseInventoryWebhookEvent = exports.verifyInventoryWebhookSignature = 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;
|
|
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;
|
|
16
18
|
var api_js_1 = require("./api.js");
|
|
17
19
|
Object.defineProperty(exports, "createInventoryClient", { enumerable: true, get: function () { return api_js_1.createInventoryClient; } });
|
|
18
20
|
var auth_js_1 = require("./auth.js");
|
|
@@ -23,6 +25,8 @@ Object.defineProperty(exports, "isInventoryErrorCode", { enumerable: true, get:
|
|
|
23
25
|
Object.defineProperty(exports, "inventoryErrorCode", { enumerable: true, get: function () { return fehler_js_1.inventoryErrorCode; } });
|
|
24
26
|
Object.defineProperty(exports, "inventoryFieldErrors", { enumerable: true, get: function () { return fehler_js_1.inventoryFieldErrors; } });
|
|
25
27
|
Object.defineProperty(exports, "inventoryRetryAfterSec", { enumerable: true, get: function () { return fehler_js_1.inventoryRetryAfterSec; } });
|
|
28
|
+
Object.defineProperty(exports, "inventoryShortfalls", { enumerable: true, get: function () { return fehler_js_1.inventoryShortfalls; } });
|
|
29
|
+
Object.defineProperty(exports, "isInventoryWarningCode", { enumerable: true, get: function () { return fehler_js_1.isInventoryWarningCode; } });
|
|
26
30
|
var endpunkte_js_1 = require("./endpunkte.js");
|
|
27
31
|
Object.defineProperty(exports, "createWebhook", { enumerable: true, get: function () { return endpunkte_js_1.createWebhook; } });
|
|
28
32
|
Object.defineProperty(exports, "deleteWebhook", { enumerable: true, get: function () { return endpunkte_js_1.deleteWebhook; } });
|
|
@@ -41,6 +45,22 @@ Object.defineProperty(exports, "lookupArticleByCode", { enumerable: true, get: f
|
|
|
41
45
|
Object.defineProperty(exports, "rotateWebhookSecret", { enumerable: true, get: function () { return endpunkte_js_1.rotateWebhookSecret; } });
|
|
42
46
|
Object.defineProperty(exports, "sendWebhookTest", { enumerable: true, get: function () { return endpunkte_js_1.sendWebhookTest; } });
|
|
43
47
|
Object.defineProperty(exports, "updateWebhook", { enumerable: true, get: function () { return endpunkte_js_1.updateWebhook; } });
|
|
48
|
+
var schreiben_js_1 = require("./schreiben.js");
|
|
49
|
+
Object.defineProperty(exports, "changeStockCondition", { enumerable: true, get: function () { return schreiben_js_1.changeStockCondition; } });
|
|
50
|
+
Object.defineProperty(exports, "createArticle", { enumerable: true, get: function () { return schreiben_js_1.createArticle; } });
|
|
51
|
+
Object.defineProperty(exports, "createReservation", { enumerable: true, get: function () { return schreiben_js_1.createReservation; } });
|
|
52
|
+
Object.defineProperty(exports, "deactivateArticle", { enumerable: true, get: function () { return schreiben_js_1.deactivateArticle; } });
|
|
53
|
+
Object.defineProperty(exports, "extendReservation", { enumerable: true, get: function () { return schreiben_js_1.extendReservation; } });
|
|
54
|
+
Object.defineProperty(exports, "getReservation", { enumerable: true, get: function () { return schreiben_js_1.getReservation; } });
|
|
55
|
+
Object.defineProperty(exports, "iterateReservations", { enumerable: true, get: function () { return schreiben_js_1.iterateReservations; } });
|
|
56
|
+
Object.defineProperty(exports, "listReservations", { enumerable: true, get: function () { return schreiben_js_1.listReservations; } });
|
|
57
|
+
Object.defineProperty(exports, "previewGoodsReceipt", { enumerable: true, get: function () { return schreiben_js_1.previewGoodsReceipt; } });
|
|
58
|
+
Object.defineProperty(exports, "receiveGoods", { enumerable: true, get: function () { return schreiben_js_1.receiveGoods; } });
|
|
59
|
+
Object.defineProperty(exports, "recordStockLoss", { enumerable: true, get: function () { return schreiben_js_1.recordStockLoss; } });
|
|
60
|
+
Object.defineProperty(exports, "releaseReservation", { enumerable: true, get: function () { return schreiben_js_1.releaseReservation; } });
|
|
61
|
+
Object.defineProperty(exports, "reverseStockMovement", { enumerable: true, get: function () { return schreiben_js_1.reverseStockMovement; } });
|
|
62
|
+
Object.defineProperty(exports, "transferStock", { enumerable: true, get: function () { return schreiben_js_1.transferStock; } });
|
|
63
|
+
Object.defineProperty(exports, "updateArticle", { enumerable: true, get: function () { return schreiben_js_1.updateArticle; } });
|
|
44
64
|
var webhook_js_1 = require("./webhook.js");
|
|
45
65
|
Object.defineProperty(exports, "verifyInventoryWebhookSignature", { enumerable: true, get: function () { return webhook_js_1.verifyInventoryWebhookSignature; } });
|
|
46
66
|
Object.defineProperty(exports, "parseInventoryWebhookEvent", { enumerable: true, get: function () { return webhook_js_1.parseInventoryWebhookEvent; } });
|
|
@@ -62,3 +82,13 @@ Object.defineProperty(exports, "STOCK_MOVEMENT_SOURCES", { enumerable: true, get
|
|
|
62
82
|
Object.defineProperty(exports, "STOCK_CONDITIONS", { enumerable: true, get: function () { return vertrag_js_1.STOCK_CONDITIONS; } });
|
|
63
83
|
Object.defineProperty(exports, "STOCK_CHANGE_CAUSES", { enumerable: true, get: function () { return vertrag_js_1.STOCK_CHANGE_CAUSES; } });
|
|
64
84
|
Object.defineProperty(exports, "WEBHOOK_DELIVERY_STATUSES", { enumerable: true, get: function () { return vertrag_js_1.WEBHOOK_DELIVERY_STATUSES; } });
|
|
85
|
+
Object.defineProperty(exports, "INVENTORY_WARNING_CODES", { enumerable: true, get: function () { return vertrag_js_1.INVENTORY_WARNING_CODES; } });
|
|
86
|
+
Object.defineProperty(exports, "STOCK_KINDS", { enumerable: true, get: function () { return vertrag_js_1.STOCK_KINDS; } });
|
|
87
|
+
Object.defineProperty(exports, "STOCK_LOSS_REASONS", { enumerable: true, get: function () { return vertrag_js_1.STOCK_LOSS_REASONS; } });
|
|
88
|
+
Object.defineProperty(exports, "WITHDRAWAL_TYPES", { enumerable: true, get: function () { return vertrag_js_1.WITHDRAWAL_TYPES; } });
|
|
89
|
+
Object.defineProperty(exports, "LANDED_COST_TYPES", { enumerable: true, get: function () { return vertrag_js_1.LANDED_COST_TYPES; } });
|
|
90
|
+
Object.defineProperty(exports, "LANDED_COST_ALLOCATIONS", { enumerable: true, get: function () { return vertrag_js_1.LANDED_COST_ALLOCATIONS; } });
|
|
91
|
+
Object.defineProperty(exports, "RESERVATION_STATUSES", { enumerable: true, get: function () { return vertrag_js_1.RESERVATION_STATUSES; } });
|
|
92
|
+
Object.defineProperty(exports, "INVENTORY_IDEMPOTENCY_KEY_MAX", { enumerable: true, get: function () { return vertrag_js_1.INVENTORY_IDEMPOTENCY_KEY_MAX; } });
|
|
93
|
+
Object.defineProperty(exports, "RESERVATION_MINUTES_MIN", { enumerable: true, get: function () { return vertrag_js_1.RESERVATION_MINUTES_MIN; } });
|
|
94
|
+
Object.defineProperty(exports, "RESERVATION_MINUTES_MAX", { enumerable: true, get: function () { return vertrag_js_1.RESERVATION_MINUTES_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, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookTestDelivery, Location, StockBelowMinimumEventData, StockChangedEventData, StockLevel, StockMovement, StockValue } from './typen.js';
|
|
15
|
+
import type { Article, GoodsReceiptPreviewLine, InventoryShortfall, InventoryWebhook, InventoryWebhookDelivery, InventoryWebhookTestDelivery, Location, Reservation, StockBelowMinimumEventData, StockChangedEventData, StockLevel, StockMovement, StockOperation, StockValue } 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 {
|
|
@@ -31,6 +31,13 @@ export declare function zustellung(ort: Ort, w: unknown): InventoryWebhookDelive
|
|
|
31
31
|
export declare function probeZustellung(ort: Ort, w: unknown, webhookId: string): InventoryWebhookTestDelivery;
|
|
32
32
|
export declare function bestandGeaendert(ort: Ort, w: unknown): StockChangedEventData;
|
|
33
33
|
export declare function unterMindestbestand(ort: Ort, w: unknown): StockBelowMinimumEventData;
|
|
34
|
+
/** Antwort einer Buchung; ohne `operationId` ist nicht belegt, dass gebucht wurde. */
|
|
35
|
+
export declare function vorgang(name: string, daten: unknown): StockOperation;
|
|
36
|
+
/** Eine Zeile der Wareneingangs-Vorschau; Werte nur, wenn der Server sie sendet (Recht `costs`). */
|
|
37
|
+
export declare function vorschauZeile(ort: Ort, w: unknown): GoodsReceiptPreviewLine;
|
|
38
|
+
export declare function reservierung(ort: Ort, w: unknown): Reservation;
|
|
39
|
+
/** Die fehlenden Positionen aus `insufficient_available` (`data.details[]`); ein kaputter Eintrag faellt weg. */
|
|
40
|
+
export declare function fehlmengen(roh: unknown): InventoryShortfall[];
|
|
34
41
|
/** Eine zugesagte Liste `data.<feld>`, Eintrag fuer Eintrag gelesen. */
|
|
35
42
|
export declare function liste<T>(name: string, daten: unknown, feld: string, lesen: (ort: Ort, e: unknown) => T): T[];
|
|
36
43
|
/** Der Cursor der naechsten Seite; `null` am Ende. Etwas anderes als Text oder `null` ist kaputt. */
|
|
@@ -25,6 +25,10 @@ exports.zustellung = zustellung;
|
|
|
25
25
|
exports.probeZustellung = probeZustellung;
|
|
26
26
|
exports.bestandGeaendert = bestandGeaendert;
|
|
27
27
|
exports.unterMindestbestand = unterMindestbestand;
|
|
28
|
+
exports.vorgang = vorgang;
|
|
29
|
+
exports.vorschauZeile = vorschauZeile;
|
|
30
|
+
exports.reservierung = reservierung;
|
|
31
|
+
exports.fehlmengen = fehlmengen;
|
|
28
32
|
exports.liste = liste;
|
|
29
33
|
exports.naechsterCursor = naechsterCursor;
|
|
30
34
|
const errors_js_1 = require("../client/errors.js");
|
|
@@ -75,6 +79,30 @@ function textAbbildung(w) {
|
|
|
75
79
|
raus[k] = v;
|
|
76
80
|
return raus;
|
|
77
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Mengen je Standort (`minStockByLocation`): jeder Wert eine Ganzzahl. Fehlt
|
|
84
|
+
* das Feld (Server vor Stufe 5b), gilt „keiner“ (`{}`).
|
|
85
|
+
*/
|
|
86
|
+
function mengenJeStandort(ort, feld, w) {
|
|
87
|
+
if (w === undefined || w === null)
|
|
88
|
+
return {};
|
|
89
|
+
const o = objekt(w);
|
|
90
|
+
if (!o)
|
|
91
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.${feld} ist kein Objekt)`);
|
|
92
|
+
const raus = {};
|
|
93
|
+
for (const [k, v] of Object.entries(o))
|
|
94
|
+
raus[k] = ganzzahl(ort, `${feld}.${k}`, v);
|
|
95
|
+
return raus;
|
|
96
|
+
}
|
|
97
|
+
/** Eine Liste von Kennungen (`movementIds`, `lotIds`); fehlt sie, ist sie leer. */
|
|
98
|
+
function kennungsliste(ort, feld, w) {
|
|
99
|
+
if (w === undefined || w === null)
|
|
100
|
+
return [];
|
|
101
|
+
if (!Array.isArray(w) || !w.every((x) => typeof x === 'string')) {
|
|
102
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}${ort.pfad ? '.' : ''}${feld} ist keine Liste von Kennungen)`);
|
|
103
|
+
}
|
|
104
|
+
return [...w];
|
|
105
|
+
}
|
|
78
106
|
// ---- Artikel ------------------------------------------------------------------
|
|
79
107
|
function artikel(ort, w) {
|
|
80
108
|
const a = eintrag(ort, w);
|
|
@@ -92,6 +120,7 @@ function artikel(ort, w) {
|
|
|
92
120
|
const raus = {
|
|
93
121
|
id: kennung(ort, 'id', a.id),
|
|
94
122
|
name: text(a.name),
|
|
123
|
+
description: text(a.description),
|
|
95
124
|
unitPriceCents: ganzzahlOderNull(ort, 'unitPriceCents', a.unitPriceCents),
|
|
96
125
|
vatRate: typeof vatRate === 'number' ? vatRate : null,
|
|
97
126
|
unit: text(a.unit),
|
|
@@ -101,8 +130,10 @@ function artikel(ort, w) {
|
|
|
101
130
|
groupId: text(a.groupId),
|
|
102
131
|
revenueGroupId: text(a.revenueGroupId),
|
|
103
132
|
stockTracked: a.stockTracked === true,
|
|
133
|
+
stockKind: textOderNull(a.stockKind),
|
|
104
134
|
stockLocationIds: standorte,
|
|
105
135
|
minStock: ganzzahlOderNull(ort, 'minStock', a.minStock),
|
|
136
|
+
minStockByLocation: mengenJeStandort(ort, 'minStockByLocation', a.minStockByLocation),
|
|
106
137
|
active: a.active !== false,
|
|
107
138
|
createdAt: text(a.createdAt),
|
|
108
139
|
updatedAt: text(a.updatedAt),
|
|
@@ -189,8 +220,14 @@ function bewegung(ort, w) {
|
|
|
189
220
|
locationId: text(b.locationId),
|
|
190
221
|
condition: text(b.condition),
|
|
191
222
|
quantityDelta: ganzzahl(ort, 'quantityDelta', b.quantityDelta),
|
|
223
|
+
// Server vor Stufe 5b senden das Feld nicht: dort aenderte keine Bewegung `reserved`.
|
|
224
|
+
reservedDelta: b.reservedDelta === undefined ? 0 : ganzzahl(ort, 'reservedDelta', b.reservedDelta),
|
|
192
225
|
stockAfter: nachher
|
|
193
|
-
? {
|
|
226
|
+
? {
|
|
227
|
+
sellable: ganzzahl(nachherOrt, 'sellable', nachher.sellable),
|
|
228
|
+
defective: ganzzahl(nachherOrt, 'defective', nachher.defective),
|
|
229
|
+
reserved: ganzzahlOderNull(nachherOrt, 'reserved', nachher.reserved),
|
|
230
|
+
}
|
|
194
231
|
: null,
|
|
195
232
|
operationId: text(b.operationId),
|
|
196
233
|
source: quelle
|
|
@@ -271,6 +308,99 @@ function unterMindestbestand(ort, w) {
|
|
|
271
308
|
minStock: ganzzahl(ort, 'minStock', d.minStock),
|
|
272
309
|
};
|
|
273
310
|
}
|
|
311
|
+
// ---- Schreiben (Stufe 5b) ------------------------------------------------------------
|
|
312
|
+
function warnung(ort, w) {
|
|
313
|
+
const h = eintrag(ort, w);
|
|
314
|
+
if (typeof h.code !== 'string' || h.code === '')
|
|
315
|
+
throw antwortfehler(ort.name, `Hinweis ohne Code (data.${ort.pfad}.code)`);
|
|
316
|
+
return {
|
|
317
|
+
code: h.code,
|
|
318
|
+
articleId: textOderNull(h.articleId),
|
|
319
|
+
locationId: textOderNull(h.locationId),
|
|
320
|
+
message: typeof h.message === 'string' ? h.message : '',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/** Antwort einer Buchung; ohne `operationId` ist nicht belegt, dass gebucht wurde. */
|
|
324
|
+
function vorgang(name, daten) {
|
|
325
|
+
const d = objekt(daten);
|
|
326
|
+
if (!d)
|
|
327
|
+
throw antwortfehler(name, 'Antwort ist unbrauchbar (data ist kein Objekt)');
|
|
328
|
+
const ort = { name, pfad: '' };
|
|
329
|
+
if (typeof d.operationId !== 'string' || d.operationId === '') {
|
|
330
|
+
throw antwortfehler(name, 'Antwort enthaelt keine Kennung (data.operationId fehlt)');
|
|
331
|
+
}
|
|
332
|
+
const hinweise = d.warnings === undefined || d.warnings === null ? [] : d.warnings;
|
|
333
|
+
if (!Array.isArray(hinweise))
|
|
334
|
+
throw antwortfehler(name, 'Antwort ist unbrauchbar (data.warnings ist keine Liste)');
|
|
335
|
+
return {
|
|
336
|
+
operationId: d.operationId,
|
|
337
|
+
movementIds: kennungsliste(ort, 'movementIds', d.movementIds),
|
|
338
|
+
lotIds: kennungsliste(ort, 'lotIds', d.lotIds),
|
|
339
|
+
warnings: hinweise.map((h, i) => warnung({ name, pfad: `warnings[${i}]` }, h)),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
/** Eine Zeile der Wareneingangs-Vorschau; Werte nur, wenn der Server sie sendet (Recht `costs`). */
|
|
343
|
+
function vorschauZeile(ort, w) {
|
|
344
|
+
const z = eintrag(ort, w);
|
|
345
|
+
const serien = z.serialNumbers === undefined || z.serialNumbers === null ? [] : z.serialNumbers;
|
|
346
|
+
if (!Array.isArray(serien) || !serien.every((x) => typeof x === 'string')) {
|
|
347
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.serialNumbers ist keine Liste)`);
|
|
348
|
+
}
|
|
349
|
+
const raus = {
|
|
350
|
+
articleId: kennung(ort, 'articleId', z.articleId),
|
|
351
|
+
quantity: ganzzahl(ort, 'quantity', z.quantity),
|
|
352
|
+
expiresOn: textOderNull(z.expiresOn),
|
|
353
|
+
batch: textOderNull(z.batch),
|
|
354
|
+
serialNumbers: [...serien],
|
|
355
|
+
priceFromArticle: z.priceFromArticle === true,
|
|
356
|
+
};
|
|
357
|
+
for (const feld of ['baseCents', 'landedCostCents', 'valueCents', 'unitCostMicros']) {
|
|
358
|
+
if (hat(z, feld))
|
|
359
|
+
raus[feld] = ganzzahlOderNull(ort, feld, z[feld]);
|
|
360
|
+
}
|
|
361
|
+
return raus;
|
|
362
|
+
}
|
|
363
|
+
function reservierungsPosition(ort, w) {
|
|
364
|
+
const p = eintrag(ort, w);
|
|
365
|
+
return {
|
|
366
|
+
articleId: kennung(ort, 'articleId', p.articleId),
|
|
367
|
+
locationId: kennung(ort, 'locationId', p.locationId),
|
|
368
|
+
quantity: ganzzahl(ort, 'quantity', p.quantity),
|
|
369
|
+
redeemed: ganzzahl(ort, 'redeemed', p.redeemed),
|
|
370
|
+
released: ganzzahl(ort, 'released', p.released),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function reservierung(ort, w) {
|
|
374
|
+
const r = eintrag(ort, w);
|
|
375
|
+
if (!Array.isArray(r.items))
|
|
376
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.items ist keine Liste)`);
|
|
377
|
+
return {
|
|
378
|
+
id: kennung(ort, 'id', r.id),
|
|
379
|
+
status: textOderNull(r.status),
|
|
380
|
+
reference: text(r.reference),
|
|
381
|
+
items: r.items.map((p, i) => reservierungsPosition({ name: ort.name, pfad: `${ort.pfad}.items[${i}]` }, p)),
|
|
382
|
+
expiresAt: text(r.expiresAt),
|
|
383
|
+
createdAt: text(r.createdAt),
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
/** Die fehlenden Positionen aus `insufficient_available` (`data.details[]`); ein kaputter Eintrag faellt weg. */
|
|
387
|
+
function fehlmengen(roh) {
|
|
388
|
+
if (!Array.isArray(roh))
|
|
389
|
+
return [];
|
|
390
|
+
const raus = [];
|
|
391
|
+
for (const e of roh) {
|
|
392
|
+
const o = objekt(e);
|
|
393
|
+
if (!o)
|
|
394
|
+
continue;
|
|
395
|
+
const { articleId, locationId, requested, available } = o;
|
|
396
|
+
if (typeof articleId !== 'string' || typeof locationId !== 'string')
|
|
397
|
+
continue;
|
|
398
|
+
if (!Number.isSafeInteger(requested) || !Number.isSafeInteger(available))
|
|
399
|
+
continue;
|
|
400
|
+
raus.push({ articleId, locationId, requested: requested, available: available });
|
|
401
|
+
}
|
|
402
|
+
return raus;
|
|
403
|
+
}
|
|
274
404
|
// ---- Listen ------------------------------------------------------------------
|
|
275
405
|
/** Eine zugesagte Liste `data.<feld>`, Eintrag fuer Eintrag gelesen. */
|
|
276
406
|
function liste(name, daten, feld, lesen) {
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Die schreibenden Aufrufe der Lager-API (Backend Stufe 5b): Artikel anlegen,
|
|
3
|
+
* aendern und stilllegen, Bestand buchen (Wareneingang, Umbuchung, Abgang,
|
|
4
|
+
* Zustand, Gegenbuchung) und reservieren.
|
|
5
|
+
*
|
|
6
|
+
* Wie in `endpunkte.ts` nimmt jede Funktion den Transport als ersten Parameter
|
|
7
|
+
* und ist einzeln importierbar. Die Anfrage geht flach hinaus, genau mit den
|
|
8
|
+
* Feldern, die der Aufrufer nennt (`undefined` faellt weg, `null` bleibt: es
|
|
9
|
+
* leert ein Feld bzw. heisst bei der Anlage „nicht angegeben“).
|
|
10
|
+
*
|
|
11
|
+
* **Vor dem Senden geprueft wird nur, was ohne Netz sicher falsch ist:**
|
|
12
|
+
* - `idempotencyKey` fehlt, ist leer oder laenger als 120 Zeichen. Ohne
|
|
13
|
+
* Schluessel gaebe es keine sichere Wiederholung, und der Server wiese die
|
|
14
|
+
* Anfrage ohnehin ab (`idempotency_key_required` bzw. `validation`);
|
|
15
|
+
* - eine Pflichtkennung fehlt oder ist leer;
|
|
16
|
+
* - eine Menge, ein Betrag oder ein Preis ist keine Ganzzahl (Tausendstel,
|
|
17
|
+
* Cent, Mikro-Euro): `1.5` waere nie „1,5 Stueck“, sondern ein Fehler;
|
|
18
|
+
* - `expiresInMinutes` liegt ausserhalb 5 … 43 200;
|
|
19
|
+
* - eine Aenderung nennt kein Feld, eine Freigabe eine leere Liste.
|
|
20
|
+
* Alles Fachliche (Pruefziffer der EAN, Kataloge, Bestand, Rechte) prueft der
|
|
21
|
+
* Server und meldet es mit seinem Code.
|
|
22
|
+
*
|
|
23
|
+
* **Wiederholen:** nach einem Zeitlimit oder Netzfehler denselben Aufruf mit
|
|
24
|
+
* **demselben** `idempotencyKey` noch einmal senden. Er wirkt genau einmal und
|
|
25
|
+
* liefert die gespeicherte Antwort; ein neuer Schluessel buchte ein zweites Mal.
|
|
26
|
+
*/
|
|
27
|
+
import type { InternerTransport } from '../client/aufrufe.js';
|
|
28
|
+
import type { Article, ChangeStockConditionRequest, CreateArticleRequest, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptPreview, GoodsReceiptPreviewRequest, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationRequest, Reservation, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockOperation, TransferStockRequest, UpdateArticleRequest } from './typen.js';
|
|
29
|
+
/**
|
|
30
|
+
* Legt einen Artikel an. Mit `ean` ein Fremdartikel mit diesem Code (gueltige
|
|
31
|
+
* Pruefziffer, frei im Konto), sonst vergibt der Server den naechsten eigenen
|
|
32
|
+
* Code. Antwort: der Artikel wie `getArticle`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createArticle(transport: InternerTransport, request: CreateArticleRequest): Promise<Article>;
|
|
35
|
+
/** Aendert nur die genannten Felder eines Artikels (siehe [UpdateArticleRequest]). */
|
|
36
|
+
export declare function updateArticle(transport: InternerTransport, request: UpdateArticleRequest): Promise<Article>;
|
|
37
|
+
/** Legt einen Artikel still (`active: false`); Code und eigene Kennungen werden frei. */
|
|
38
|
+
export declare function deactivateArticle(transport: InternerTransport, request: DeactivateArticleRequest): Promise<Article>;
|
|
39
|
+
/**
|
|
40
|
+
* Bucht einen Wareneingang. Ohne `locationId` am Standard-Standort; die
|
|
41
|
+
* Antwort traegt keine Werte, auch mit dem Recht `costs` nicht. Fuer die
|
|
42
|
+
* Vorschau mit Werten: [previewGoodsReceipt].
|
|
43
|
+
*/
|
|
44
|
+
export declare function receiveGoods(transport: InternerTransport, request: ReceiveGoodsRequest): Promise<StockOperation>;
|
|
45
|
+
/**
|
|
46
|
+
* Vorschau eines Wareneingangs (`receiveGoods` mit `dryRun: true`): prueft
|
|
47
|
+
* Positionen, Artikel, Preise und Nebenkosten und rechnet die Verteilung,
|
|
48
|
+
* schreibt aber nichts. Ein `idempotencyKey` ist freigestellt (`null` wie nicht
|
|
49
|
+
* angegeben, geht nicht hinaus) und wird nicht verbraucht; dieselbe Anfrage
|
|
50
|
+
* laesst sich danach mit ihm buchen. Werte
|
|
51
|
+
* (`baseCents` …) nur mit dem Recht `costs`. Den Standort prueft erst die Buchung.
|
|
52
|
+
*/
|
|
53
|
+
export declare function previewGoodsReceipt(transport: InternerTransport, request: GoodsReceiptPreviewRequest): Promise<GoodsReceiptPreview>;
|
|
54
|
+
/** Bucht Ware von einem Standort an einen anderen; ueberzieht nie (`exceeds_stock`). */
|
|
55
|
+
export declare function transferStock(transport: InternerTransport, request: TransferStockRequest): Promise<StockOperation>;
|
|
56
|
+
/** Bucht einen Abgang (Bruch, Schwund, Diebstahl, Entnahme …); ueberzieht nie (`exceeds_stock`). */
|
|
57
|
+
export declare function recordStockLoss(transport: InternerTransport, request: RecordStockLossRequest): Promise<StockOperation>;
|
|
58
|
+
/** Bucht Ware zwischen `sellable` und `defective` um; ueberzieht nie (`exceeds_stock`). */
|
|
59
|
+
export declare function changeStockCondition(transport: InternerTransport, request: ChangeStockConditionRequest): Promise<StockOperation>;
|
|
60
|
+
/** Nimmt einen ganzen Vorgang (`operationId`) mit einer Gegenbuchung zurueck. */
|
|
61
|
+
export declare function reverseStockMovement(transport: InternerTransport, request: ReverseStockMovementRequest): Promise<StockOperation>;
|
|
62
|
+
/**
|
|
63
|
+
* Reserviert Ware (Checkout im Shop): ganz oder gar nicht, gemessen am
|
|
64
|
+
* verfuegbaren Bestand (`onHand − reserved`). Fehlt etwas, entsteht nichts:
|
|
65
|
+
* `insufficient_available`, die fehlenden Positionen in [inventoryShortfalls].
|
|
66
|
+
* Eingeloest wird ueber eine Rechnung (`issueInvoice` mit `items[].reservationId`),
|
|
67
|
+
* sonst laeuft die Reservierung ab und gibt die Ware wieder frei.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createReservation(transport: InternerTransport, request: CreateReservationRequest): Promise<Reservation>;
|
|
70
|
+
/** Verlaengert eine aktive Reservierung: neuer Ablauf = jetzt + `expiresInMinutes`. */
|
|
71
|
+
export declare function extendReservation(transport: InternerTransport, request: ExtendReservationRequest): Promise<Reservation>;
|
|
72
|
+
/**
|
|
73
|
+
* Gibt reservierte Ware frei: ohne `items` alles, sonst je Position (ohne
|
|
74
|
+
* `quantity` der ganze offene Rest). Die Antwort traegt den Stand danach;
|
|
75
|
+
* `released` wird der Status erst, wenn nichts mehr offen ist.
|
|
76
|
+
*/
|
|
77
|
+
export declare function releaseReservation(transport: InternerTransport, request: ReleaseReservationRequest): Promise<Reservation>;
|
|
78
|
+
/** Eine Reservierung mit ihrem aktuellen Stand. */
|
|
79
|
+
export declare function getReservation(transport: InternerTransport, reservationId: string): Promise<Reservation>;
|
|
80
|
+
/** Reservierungen, neueste zuerst; Filter `status` und/oder `reference`. */
|
|
81
|
+
export declare function listReservations(transport: InternerTransport, query?: ReservationListQuery): Promise<ReservationPage>;
|
|
82
|
+
/** Alle Reservierungen der Abfrage, Seite fuer Seite ueber `nextCursor`. */
|
|
83
|
+
export declare function iterateReservations(transport: InternerTransport, query?: ReservationListQuery): AsyncGenerator<Reservation, void, undefined>;
|