Web: Zweiteinheit erfassen und anzeigen
Im Artikel-Formular eine Zeile "3 [Stk] ≙ 250 [Gramm]" mit ausgerechneter
Kontrolle darunter ("1 Stk ≈ 83,33 g"). Links steht die Basiseinheit des
Artikels fest, rechts stehen nur die anderen Arten zur Wahl - eine Bruecke auf
die eigene Art haette nichts umzurechnen. Nur vollstaendig ausgefuellt wird sie
gespeichert; Gegenstaende ohne Charge tragen keine.
buildUnitOptions laesst bei hinterlegter Bruecke auch die Einheiten der Gegenart
zu - damit erben Ein- und Auslagern die Faehigkeit ohne eigene Logik. Beim
Auslagern steht der Bestand jetzt in beiden Lesarten ("6 Stueck · 500 g").
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -54,6 +54,37 @@ export function kindShort(kind) {
|
||||
return KIND_SHORT[kind] || "";
|
||||
}
|
||||
|
||||
// Einheiten-ART je Basiseinheit – Spiegelbild von conversion.py::KIND_OF_BASE.
|
||||
export const KIND_OF_BASE = { piece: "count", gram: "weight", milliliter: "volume" };
|
||||
|
||||
// ---- Zweiteinheit: die Brücke zwischen den Einheiten-Arten ----
|
||||
// Ein Artikel darf zusätzlich zu seiner Basiseinheit eine Äquivalenz tragen:
|
||||
// „3 Stück ≙ 250 g". Der Server liefert den ausgerechneten Faktor als
|
||||
// `secondary_factor` mit; das Paar dahinter bleibt zur Anzeige erhalten.
|
||||
|
||||
/** Zweit-Basiseinheiten je EINER Basiseinheit. 0 = keine Brücke hinterlegt. */
|
||||
export function zweitFaktor(p) {
|
||||
if (!p?.secondary_base) return 0;
|
||||
const f = Number(p.secondary_factor);
|
||||
if (f > 0) return f;
|
||||
// Rückfall, falls das abgeleitete Feld fehlt (ältere Antwort).
|
||||
const n = Number(p.secondary_count);
|
||||
const m = Number(p.secondary_amount);
|
||||
return n > 0 && m > 0 ? m / n : 0;
|
||||
}
|
||||
|
||||
/** Eine Menge (Basiseinheiten) in der Zweiteinheit lesen: „500 g". */
|
||||
export function zweitText(mengeBase, p) {
|
||||
const f = zweitFaktor(p);
|
||||
return f ? `${fmt(mengeBase * f)} ${unitShort(p.secondary_base)}` : "";
|
||||
}
|
||||
|
||||
/** Bestand mit beiden Lesarten: „6 Stück · 500 g". */
|
||||
export function stockLabelMitZweit(p) {
|
||||
const zweit = zweitText(p.stock || 0, p);
|
||||
return zweit ? `${stockLabel(p)} · ${zweit}` : stockLabel(p);
|
||||
}
|
||||
|
||||
// Auswahlmöglichkeiten für Menge beim Ein-/Auslagern eines Produkts.
|
||||
export function unitOptions(product) {
|
||||
const opts = [{ value: baseUnitToInput(product.base_unit), label: unitShort(product.base_unit) }];
|
||||
@@ -194,8 +225,13 @@ export function amountText(qty, packageSize, baseUnit) {
|
||||
|
||||
// Einheiten-Optionen fürs Ein-/Auslagern: verwaltete Einheiten der Produkt-Art + Packung.
|
||||
export function buildUnitOptions(product, units) {
|
||||
// Ohne Zweiteinheit nur die eigene Art. Mit Brücke kommen die Einheiten der
|
||||
// Gegenart dazu – das Backend rechnet sie über die am Artikel hinterlegte
|
||||
// Äquivalenz um (services/conversion.py::to_base).
|
||||
const erlaubt = new Set([product.kind]);
|
||||
if (zweitFaktor(product)) erlaubt.add(KIND_OF_BASE[product.secondary_base]);
|
||||
const opts = (units || [])
|
||||
.filter((u) => u.kind === product.kind)
|
||||
.filter((u) => erlaubt.has(u.kind))
|
||||
.map((u) => ({ value: u.name, label: u.name }));
|
||||
if (product.package_size) {
|
||||
// Bezeichnung des Gebindes je Artikel (Glas, Tüte, …); Wert bleibt "package".
|
||||
|
||||
Reference in New Issue
Block a user