/** * Die schreibenden Aufrufe der Lager-API (Backend Stufe 5b): Artikel anlegen, * aendern und stilllegen, Bestand buchen (Wareneingang, Umbuchung, Abgang, * Zustand, Gegenbuchung) und reservieren. * * Wie in `endpunkte.ts` nimmt jede Funktion den Transport als ersten Parameter * und ist einzeln importierbar. Die Anfrage geht flach hinaus, genau mit den * Feldern, die der Aufrufer nennt (`undefined` faellt weg, `null` bleibt: es * leert ein Feld bzw. heisst bei der Anlage „nicht angegeben“). * * **Vor dem Senden geprueft wird nur, was ohne Netz sicher falsch ist:** * - `idempotencyKey` fehlt, ist leer oder laenger als 120 Zeichen. Ohne * Schluessel gaebe es keine sichere Wiederholung, und der Server wiese die * Anfrage ohnehin ab (`idempotency_key_required` bzw. `validation`); * - eine Pflichtkennung fehlt oder ist leer; * - eine Menge, ein Betrag oder ein Preis ist keine Ganzzahl (Tausendstel, * Cent, Mikro-Euro): `1.5` waere nie „1,5 Stueck“, sondern ein Fehler; * - `expiresInMinutes` liegt ausserhalb 5 … 43 200; * - eine Aenderung nennt kein Feld, eine Freigabe eine leere Liste. * Alles Fachliche (Pruefziffer der EAN, Kataloge, Bestand, Rechte) prueft der * Server und meldet es mit seinem Code. * * **Wiederholen:** nach einem Zeitlimit oder Netzfehler denselben Aufruf mit * **demselben** `idempotencyKey` noch einmal senden. Er wirkt genau einmal und * liefert die gespeicherte Antwort; ein neuer Schluessel buchte ein zweites Mal. * Darum meldet jeder schreibende Aufruf in diesen Faellen (auch HTTP 5xx und * unlesbare Antwort) `outcome: 'unknown'`, nie `'rejected'`. Lesen und der * Probelauf (`previewGoodsReceipt`) bleiben `'rejected'`. */ import type { ApiCall, InternerTransport } from '../client/aufrufe.js'; import type { Article, ChangeStockConditionRequest, CreateArticleRequest, CreateReservationRequest, DeactivateArticleRequest, ExtendReservationRequest, GoodsReceiptPreview, GoodsReceiptPreviewRequest, ReceiveGoodsRequest, RecordStockLossRequest, ReleaseReservationRequest, Reservation, ReservationListQuery, ReservationPage, ReverseStockMovementRequest, StockOperation, TransferStockRequest, UpdateArticleRequest } from './typen.js'; type Params = Record; /** Die Anfrage als flache Kopie ohne `undefined`; der Aufrufer behaelt sein Objekt. Paketintern, auch fuer `varianten.ts`. */ export declare function anfrage(name: ApiCall, request: unknown): Params; /** * `idempotencyKey`: Text mit 1–120 Zeichen, nicht nur Leerraum. Er wird nie * getrimmt oder gekuerzt: ein veraenderter Schluessel waere ein anderer. */ export declare function schluessel(name: ApiCall, p: Params, { pflicht }: { pflicht: boolean; }): void; /** Eine Ganzzahl (Tausendstel, Cent, Mikro-Euro); fehlt sie, nur wenn sie darf. `null` nur, wo es leert. */ export declare function ganz(name: ApiCall, feld: string, w: unknown, { pflicht, leerbar }?: { pflicht?: boolean | undefined; leerbar?: boolean | undefined; }): void; /** * Zahlenfelder eines Artikels; `null` leert sie (bzw. heisst bei der Anlage * „nicht angegeben“). `praefix` nennt die Stelle in der Anfrage (`variants[2].`). */ export declare function artikelZahlen(name: ApiCall, p: Params, praefix?: string): void; export declare const artikelAus: (name: ApiCall, daten: unknown) => Article; /** * Legt einen Artikel an. Mit `ean` ein Fremdartikel mit diesem Code (gueltige * Pruefziffer, frei im Konto), sonst vergibt der Server den naechsten eigenen * Code. Antwort: der Artikel wie `getArticle`. */ export declare function createArticle(transport: InternerTransport, request: CreateArticleRequest): Promise
; /** Aendert nur die genannten Felder eines Artikels (siehe [UpdateArticleRequest]). */ export declare function updateArticle(transport: InternerTransport, request: UpdateArticleRequest): Promise
; /** Legt einen Artikel still (`active: false`); Code und eigene Kennungen werden frei. */ export declare function deactivateArticle(transport: InternerTransport, request: DeactivateArticleRequest): Promise
; /** * Bucht einen Wareneingang. Ohne `locationId` am Standard-Standort; die * Antwort traegt keine Werte, auch mit dem Recht `costs` nicht. Fuer die * Vorschau mit Werten: [previewGoodsReceipt]. */ export declare function receiveGoods(transport: InternerTransport, request: ReceiveGoodsRequest): Promise; /** * Vorschau eines Wareneingangs (`receiveGoods` mit `dryRun: true`): prueft * Positionen, Artikel, Preise und Nebenkosten und rechnet die Verteilung, * schreibt aber nichts. Ein `idempotencyKey` ist freigestellt (`null` wie nicht * angegeben, geht nicht hinaus) und wird nicht verbraucht; dieselbe Anfrage * laesst sich danach mit ihm buchen. Werte * (`baseCents` …) nur mit dem Recht `costs`. Den Standort prueft erst die Buchung. */ export declare function previewGoodsReceipt(transport: InternerTransport, request: GoodsReceiptPreviewRequest): Promise; /** Bucht Ware von einem Standort an einen anderen; ueberzieht nie (`exceeds_stock`). */ export declare function transferStock(transport: InternerTransport, request: TransferStockRequest): Promise; /** Bucht einen Abgang (Bruch, Schwund, Diebstahl, Entnahme …); ueberzieht nie (`exceeds_stock`). */ export declare function recordStockLoss(transport: InternerTransport, request: RecordStockLossRequest): Promise; /** Bucht Ware zwischen `sellable` und `defective` um; ueberzieht nie (`exceeds_stock`). */ export declare function changeStockCondition(transport: InternerTransport, request: ChangeStockConditionRequest): Promise; /** Nimmt einen ganzen Vorgang (`operationId`) mit einer Gegenbuchung zurueck. */ export declare function reverseStockMovement(transport: InternerTransport, request: ReverseStockMovementRequest): Promise; /** * Reserviert Ware (Checkout im Shop): ganz oder gar nicht, gemessen am * verfuegbaren Bestand (`onHand − reserved`). Fehlt etwas, entsteht nichts: * `insufficient_available`, die fehlenden Positionen in [inventoryShortfalls]. * Eingeloest wird ueber eine Rechnung (`issueInvoice` mit `items[].reservationId`), * sonst laeuft die Reservierung ab und gibt die Ware wieder frei. */ export declare function createReservation(transport: InternerTransport, request: CreateReservationRequest): Promise; /** Verlaengert eine aktive Reservierung: neuer Ablauf = jetzt + `expiresInMinutes`. */ export declare function extendReservation(transport: InternerTransport, request: ExtendReservationRequest): Promise; /** * Gibt reservierte Ware frei: ohne `items` alles, sonst je Position (ohne * `quantity` der ganze offene Rest). Die Antwort traegt den Stand danach; * `released` wird der Status erst, wenn nichts mehr offen ist. */ export declare function releaseReservation(transport: InternerTransport, request: ReleaseReservationRequest): Promise; /** Eine Reservierung mit ihrem aktuellen Stand. */ export declare function getReservation(transport: InternerTransport, reservationId: string): Promise; /** Reservierungen, neueste zuerst; Filter `status` und/oder `reference`. */ export declare function listReservations(transport: InternerTransport, query?: ReservationListQuery): Promise; /** Alle Reservierungen der Abfrage, Seite fuer Seite ueber `nextCursor`. */ export declare function iterateReservations(transport: InternerTransport, query?: ReservationListQuery): AsyncGenerator; export {};