import { useState } from "react"; import { useParams, Link } from "react-router-dom"; import { useQuery } from "@tanstack/react-query"; import { useAlert } from "../context/AlertContext"; import { useAuth } from "../context/AuthContext"; import Forbidden from "../components/Forbidden"; import { motion } from "framer-motion"; import ConfirmModal from "../components/ConfirmModal"; import FormField from "../components/FormField"; import { formatDate } from "../utils/formatters"; import { warehouseInventoryDetailOptions, type WarehouseInventorySession, } from "../lib/queries/warehouse"; import { useApiMutation } from "../lib/queries/mutations"; const STATUS_BADGE: Record = { DRAFT: "admin-badge-warning", CONFIRMED: "admin-badge-active", }; const STATUS_LABEL: Record = { DRAFT: "Návrh", CONFIRMED: "Potvrzeno", }; export default function WarehouseInventoryDetail() { const { id } = useParams(); const alert = useAlert(); const { hasPermission } = useAuth(); const [showConfirmModal, setShowConfirmModal] = useState(false); const { data: session, isPending, error, } = useQuery(warehouseInventoryDetailOptions(id)); if (!hasPermission("warehouse.inventory")) return ; const confirmMutation = useApiMutation({ url: () => session ? `/api/admin/warehouse/inventory-sessions/${session.id}/confirm` : "/api/admin/warehouse/inventory-sessions/0/confirm", method: () => "POST", invalidate: ["warehouse"], onSuccess: () => { setShowConfirmModal(false); alert.success("Inventura byla potvrzena"); }, }); const handleConfirm = async () => { if (!session) return; try { await confirmMutation.mutateAsync(undefined); } catch (e) { alert.error(e instanceof Error ? e.message : "Chyba připojení"); } }; const confirming = confirmMutation.isPending; if (isPending) { return (
); } if (error || !session) { return (

Inventura nebyla nalezena.

); } const s = session as WarehouseInventorySession; const items = s.items ?? []; return (
{/* Header */}

{s.session_number || "Inventura"}

{STATUS_LABEL[s.status] ?? s.status}
{s.status === "DRAFT" && ( )}
{/* Header info */}

Základní údaje

{s.session_number || "—"}
{formatDate(s.created_at)}
{s.notes && (
{s.notes}
)}
{/* Lines table */}

Položky

{items.length === 0 ? (
Žádné řádky
) : (
{items.map((item) => { const diff = Number(item.difference); const diffColor = diff > 0 ? "var(--success)" : diff < 0 ? "var(--danger)" : "var(--text-secondary)"; return ( ); })}
Položka Lokace Systémové množství Skutečné množství Rozdíl Poznámka
{item.item?.name || `ID: ${item.item_id}`} {item.location?.code || "—"} {Number(item.system_qty)} {Number(item.actual_qty)} {diff > 0 ? `+${diff}` : diff} {item.notes || "—"}
)}
{/* Confirm modal */} setShowConfirmModal(false)} onConfirm={handleConfirm} title="Potvrdit inventuru" message={`Opravdu chcete potvrdit inventuru „${s.session_number || s.id}"? Potvrzením se aktualizují skladové zásoby.`} confirmText="Potvrdit inventuru" type="warning" loading={confirming} />
); }