fix: Produkt-Formular ueberschreibt keinen zwischenzeitlich gebuchten Bestand
Das Speichern schrieb den Formularwert immer fest in den Lagerbestand. Wurde zwischen Oeffnen und Speichern ein Glas verkauft, kam es dadurch wieder in den Bestand, ohne dass es je zurueckkam. - Das Formular schickt den Bestand beim Oeffnen mit (quantityLoaded) - Feld unveraendert: Bestand wird nicht angefasst - Feld geaendert: Schreiben nur, wenn der Bestand noch dem geladenen Stand entspricht (Bedingung atomar im UPDATE); sonst wird nichts gespeichert und der aktuelle Wert angezeigt - Fehlt quantityLoaded (alter Tab), muss neu geladen werden Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
5848eb6ad5
commit
d52a762e8a
4 files changed
+133
-26
No files matched your search
@@ -10,6 +10,34 @@ import type { Prisma, ReturnStatus } from "@/generated/prisma/client";
|
||||
* passiert (Retoure erstattet, danach "STORNIERT" gesetzt: +1 Glas zu viel).
|
||||
* Gegenstueck zu needsRestockOnDelete in order-delete.ts.
|
||||
*/
|
||||
export type InventoryEditPlan =
|
||||
| { kind: "keep" }
|
||||
| { kind: "set"; expected: number; quantity: number }
|
||||
| { kind: "reload" };
|
||||
|
||||
/**
|
||||
* Was soll das Speichern des Produkt-Formulars mit dem Lagerbestand tun?
|
||||
*
|
||||
* Das Formular schickt neben dem eingegebenen Bestand ("submitted") den
|
||||
* Bestand mit, der beim Oeffnen angezeigt wurde ("loaded", verstecktes Feld).
|
||||
* Frueher wurde der Formularwert immer fest geschrieben: wurde zwischen
|
||||
* Oeffnen und Speichern ein Glas verkauft, kam es durch das Speichern
|
||||
* wieder in den Bestand, ohne dass es je zurueckkam.
|
||||
*
|
||||
* - Feld unveraendert: Bestand nicht anfassen ("keep").
|
||||
* - Feld geaendert: nur schreiben, solange der Bestand noch "loaded" ist
|
||||
* ("set"; die Bedingung prueft updateProductAction atomar im UPDATE).
|
||||
* - "loaded" fehlt oder ist ungueltig: neu laden lassen ("reload"), statt
|
||||
* zu raten, welchen Stand die Imkerei vor Augen hatte.
|
||||
*/
|
||||
export function planInventoryEdit(input: { loaded: string; submitted: number }): InventoryEditPlan {
|
||||
if (!/^\d+$/.test(input.loaded)) return { kind: "reload" };
|
||||
const loaded = Number(input.loaded);
|
||||
if (!Number.isSafeInteger(loaded)) return { kind: "reload" };
|
||||
if (loaded === input.submitted) return { kind: "keep" };
|
||||
return { kind: "set", expected: loaded, quantity: input.submitted };
|
||||
}
|
||||
|
||||
export function needsRestockOnCancel(returnStatus: ReturnStatus | null): boolean {
|
||||
return returnStatus !== "ERSTATTET";
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user