catalog search/sort, edit-page characteristics, preferred vendor per article

This commit is contained in:
Matthias Hochmeister
2026-03-27 13:17:05 +01:00
parent eb82fe29b7
commit 35b3718e38
8 changed files with 277 additions and 29 deletions

View File

@@ -72,6 +72,12 @@ export default function AusruestungsanfrageZuBestellung() {
queryFn: () => bestellungApi.getVendors(),
});
const { data: catalogItems = [] } = useQuery({
queryKey: ['ausruestungsanfrage', 'items-for-edit'],
queryFn: () => ausruestungsanfrageApi.getItems({ aktiv: true }),
staleTime: 5 * 60 * 1000,
});
const anfrage = detail?.anfrage;
const positionen: AusruestungAnfragePosition[] = detail?.positionen ?? [];
@@ -88,6 +94,27 @@ export default function AusruestungsanfrageZuBestellung() {
// Track which position triggered the new-vendor dialog
const [newVendorTargetPosId, setNewVendorTargetPosId] = useState<number | null>(null);
// ── Pre-populate vendor assignments from catalog items' preferred vendor ──
useEffect(() => {
if (positionen.length === 0 || catalogItems.length === 0 || vendors.length === 0) return;
setAssignments(prev => {
const next = { ...prev };
let changed = false;
positionen.forEach(pos => {
// Don't overwrite existing manual assignments
if (next[pos.id] != null) return;
if (!pos.artikel_id) return;
const artikel = catalogItems.find(a => a.id === pos.artikel_id);
if (!artikel?.bevorzugter_lieferant_id) return;
const vendor = vendors.find(v => v.id === artikel.bevorzugter_lieferant_id);
if (!vendor) return;
next[pos.id] = { lieferantId: vendor.id, lieferantName: vendor.name };
changed = true;
});
return changed ? next : prev;
});
}, [positionen, catalogItems, vendors]);
// ── Derived: vendor groups ──
const vendorGroups: VendorGroup[] = useMemo(() => {
const map = new Map<number, VendorGroup>();