Gebinde verwalten - mit Einzahl und Mehrzahl
Bisher war die Auswahl eine fest im Frontend verdrahtete Liste und es gab nur eine Form: ueberall stand "3 Glas". Neu unter Verwaltung > Gebinde: anlegen, umbenennen, loeschen, jeweils mit Einzahl und Mehrzahl. Die eingebauten Gebinde lassen sich in der Schreibweise aendern, aber nicht loeschen; ein Gebinde, das ein Artikel verwendet, ebenfalls nicht. Der Artikel speichert weiterhin nur die Einzahl als Text - so bleiben vorhandene Artikel, Sicherungen und CSV-Dateien gueltig, und eine unbekannte Bezeichnung faellt schlicht auf die Einzahl zurueck. Deshalb zieht ein Umbenennen die Artikel mit; sonst zeigten sie auf eine Bezeichnung, die es nicht mehr gibt. Die Mehrzahl greift jetzt in Artikelliste, Artikelseite (Chargen und Gebinde- Auswahl), Auslagern und in allen Ablauf- und Einkaufslisten samt Startseite. Einheiten wie Gramm oder Liter bleiben unveraendert - die haben im Deutschen keine Mehrzahl. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,35 @@
|
||||
// Anzeige-Helfer für Einheiten (müssen zu backend/app/models.py::BaseUnit passen).
|
||||
|
||||
// ---- Gebinde: Einzahl und Mehrzahl ----
|
||||
// Der Artikel speichert nur die Einzahl ("Glas"); die Mehrzahl steht in der
|
||||
// Verwaltung (Tabelle package_types) und wird nach dem Login einmal geladen.
|
||||
//
|
||||
// Bewusst eine Modulvariable und kein React-Kontext: Die Formatierer hier sind
|
||||
// gewöhnliche Funktionen, die auch außerhalb von Komponenten aufgerufen werden.
|
||||
// Sie alle in Hooks zu verwandeln, hieße jede Aufrufstelle umzubauen, um eine
|
||||
// Liste durchzureichen, die sich praktisch nie ändert.
|
||||
let GEBINDE_MEHRZAHL = {};
|
||||
|
||||
export function setGebindeFormen(liste) {
|
||||
GEBINDE_MEHRZAHL = Object.fromEntries(
|
||||
(liste || []).map((t) => [t.singular, t.plural || t.singular]),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gebinde-Bezeichnung passend zur Menge: "1 Glas", "3 Gläser".
|
||||
*
|
||||
* Unbekannte Bezeichnungen bleiben unverändert – lieber eine fehlende Mehrzahl
|
||||
* als ein erfundenes "Glass". Nicht ganze Mengen zählen als Mehrzahl
|
||||
* ("0,5 Gläser"), so wie im Deutschen alles außer der Eins.
|
||||
*/
|
||||
export function gebinde(menge, einzahl) {
|
||||
const wort = einzahl || "Packung";
|
||||
if (Math.abs(Number(menge)) === 1) return wort;
|
||||
return GEBINDE_MEHRZAHL[wort] || wort;
|
||||
}
|
||||
|
||||
|
||||
export const BASE_UNITS = [
|
||||
{ value: "piece", label: "Stück" },
|
||||
{ value: "gram", label: "Gramm (g)" },
|
||||
@@ -173,7 +203,8 @@ export function buildUnitOptions(product, units) {
|
||||
// Erwartet ein Objekt mit quantity, package_size, package_label, unit_name, unit_factor, base_unit.
|
||||
export function articlePrimary(item) {
|
||||
if (item.package_size > 0) {
|
||||
return `${fmt(item.quantity / item.package_size)} ${item.package_label || "Packung"}`;
|
||||
const anzahl = item.quantity / item.package_size;
|
||||
return `${fmt(anzahl)} ${gebinde(anzahl, item.package_label)}`;
|
||||
}
|
||||
return `${fmt(item.quantity / (item.unit_factor || 1))} ${item.unit_name || unitShort(item.base_unit)}`;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user