"use client"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import type { InventoryCategory, InventoryItem, InventoryItemPayload, InventoryLocation, InventorySupplier, } from "@/types/inventory"; import { centsToEuroInput, emptyItemPayload, euroToCents } from "./inventory-utils"; type Props = { open: boolean; item: InventoryItem | null; categories: InventoryCategory[]; locations: InventoryLocation[]; suppliers: InventorySupplier[]; pending: boolean; serverError: string; onOpenChange: (open: boolean) => void; onSubmit: (payload: InventoryItemPayload) => void; }; function payloadFromItem(item: InventoryItem | null): InventoryItemPayload { if (!item) { return emptyItemPayload; } return { sku: item.sku, name: item.name, description: item.description, category_id: item.category_id, manufacturer: item.manufacturer, manufacturer_part_number: item.manufacturer_part_number, supplier_id: item.supplier_id, supplier_part_number: item.supplier_part_number, compatible_devices: item.compatible_devices, location_id: item.location_id, quantity_on_hand: item.quantity_on_hand, quantity_reserved: item.quantity_reserved, reorder_level: item.reorder_level, unit: item.unit, purchase_price_cents: item.purchase_price_cents, selling_price_cents: item.selling_price_cents, currency: item.currency, tax_rate_percent: item.tax_rate_percent, notes: item.notes, is_active: item.is_active, }; } export default function InventoryItemDialog({ open, item, categories, locations, suppliers, pending, serverError, onOpenChange, onSubmit, }: Props) { const initialPayload = payloadFromItem(item); const [payload, setPayload] = useState(initialPayload); const [purchasePrice, setPurchasePrice] = useState(centsToEuroInput(initialPayload.purchase_price_cents)); const [sellingPrice, setSellingPrice] = useState(centsToEuroInput(initialPayload.selling_price_cents)); const [clientError, setClientError] = useState(""); function update(key: K, value: InventoryItemPayload[K]) { setPayload((current) => ({ ...current, [key]: value })); } function submit() { const purchaseCents = euroToCents(purchasePrice); const sellingCents = euroToCents(sellingPrice); if (!payload.name.trim()) { setClientError("Bitte einen Artikelnamen angeben."); return; } if (payload.quantity_reserved > payload.quantity_on_hand) { setClientError("Reservierter Bestand darf den Lagerbestand nicht überschreiten."); return; } if ((purchasePrice.trim() && purchaseCents === null) || (sellingPrice.trim() && sellingCents === null)) { setClientError("Bitte Preise als Eurobetrag eingeben, z. B. 1,50."); return; } setClientError(""); onSubmit({ ...payload, sku: payload.sku?.trim() || null, name: payload.name.trim(), purchase_price_cents: purchaseCents, selling_price_cents: sellingCents, description: payload.description?.trim() || null, manufacturer: payload.manufacturer?.trim() || null, manufacturer_part_number: payload.manufacturer_part_number?.trim() || null, supplier_part_number: payload.supplier_part_number?.trim() || null, compatible_devices: payload.compatible_devices?.trim() || null, notes: payload.notes?.trim() || null, }); } return ( {item ? "Artikel bearbeiten" : "Artikel anlegen"} Pflege Stammdaten, Lagerbestand, Preise und Bezugsdaten.

Stammdaten