Lagerort-IDs sind jetzt ein zufaelliger 10-Zeichen-Code (wie die Einzelstueck-UIDs) statt einer fortlaufenden Zahl - so kollidiert die Stammdaten-Sicherung zwischen zwei Instanzen praktisch nie mehr, und der Code ist zugleich der Inhalt des QR /l/<code>. Alle Fremdschluessel (lots, movements, items, Mindestbestaende, parent_id) ziehen mit; die Umstellung laeuft einmalig und transaktional beim Serverstart (_migrate_locations_to_code) und rollt bei Fehlern komplett zurueck. Vor dem Deploy ein DB-Backup machen. iOS-Einlagern oeffnet nicht mehr sofort die Kamera, sondern ein Formular mit Artikelsuche; die Kamera kommt erst per Button. Im Formular laesst sich der Lagerort zusaetzlich per /l/-QR scannen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
39 lines
1.1 KiB
JavaScript
39 lines
1.1 KiB
JavaScript
import { useEffect, useState } from "react";
|
|
import { useParams } from "react-router-dom";
|
|
import { api } from "../api";
|
|
import Icon from "../components/Icon";
|
|
|
|
/**
|
|
* Ziel eines gescannten Lagerort-QR (/l/<id>). Im Browser zeigt es nur den
|
|
* Namen; das eigentliche Zuordnen (Stück → Ort) läuft über die App.
|
|
*/
|
|
export default function LocationResolve() {
|
|
const { id } = useParams();
|
|
const [name, setName] = useState(null);
|
|
const [error, setError] = useState(null);
|
|
|
|
useEffect(() => {
|
|
api.listLocations()
|
|
.then((ls) => {
|
|
const l = ls.find((x) => String(x.id) === String(id));
|
|
if (l) setName(l.name);
|
|
else setError("Lagerort nicht gefunden.");
|
|
})
|
|
.catch((e) => setError(e.message));
|
|
}, [id]);
|
|
|
|
return (
|
|
<div>
|
|
<div className="page-head">
|
|
<div>
|
|
<h1>Lagerort {name || id}</h1>
|
|
<div className="sub">
|
|
{error || "Diesen QR-Code in der App scannen (Ort zuordnen), um Einzelstücke hier einzuordnen."}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{error && <div className="alert error"><Icon name="alert" size={16} />{error}</div>}
|
|
</div>
|
|
);
|
|
}
|