import { useState } from "react"; import { useParams, useNavigate, Link as RouterLink } from "react-router-dom"; import { useQuery } from "@tanstack/react-query"; import Box from "@mui/material/Box"; import Typography from "@mui/material/Typography"; import { useAlert } from "../context/AlertContext"; import { useAuth } from "../context/AuthContext"; import Forbidden from "../components/Forbidden"; import { formatCurrency, formatDate } from "../utils/formatters"; import { warehouseIssueDetailOptions, type WarehouseIssue, type WarehouseIssueItem, } from "../lib/queries/warehouse"; import { useApiMutation } from "../lib/queries/mutations"; import { Button, Card, DataTable, StatusChip, EmptyState, LoadingState, PageHeader, ConfirmDialog, PageEnter, type DataColumn, } from "../ui"; const STATUS_COLOR: Record< string, "default" | "success" | "error" | "warning" | "info" > = { DRAFT: "warning", CONFIRMED: "success", CANCELLED: "error", }; const STATUS_LABEL: Record = { DRAFT: "Návrh", CONFIRMED: "Potvrzeno", CANCELLED: "Zrušeno", }; const BackIcon = ( ); export default function WarehouseIssueDetail() { const { id } = useParams(); const alert = useAlert(); const { hasPermission } = useAuth(); const navigate = useNavigate(); const [cancelConfirm, setCancelConfirm] = useState(false); const { data: issue, isPending, error, } = useQuery(warehouseIssueDetailOptions(id)); if (!hasPermission("warehouse.view")) return ; const canOperate = hasPermission("warehouse.operate"); const confirmMutation = useApiMutation({ url: () => issue ? `/api/admin/warehouse/issues/${issue.id}/confirm` : "/api/admin/warehouse/issues/0/confirm", method: () => "POST", invalidate: ["warehouse"], onSuccess: () => { alert.success("Výdejka byla potvrzena"); }, }); const cancelMutation = useApiMutation({ url: () => issue ? `/api/admin/warehouse/issues/${issue.id}/cancel` : "/api/admin/warehouse/issues/0/cancel", method: () => "POST", invalidate: ["warehouse"], onSuccess: () => { setCancelConfirm(false); alert.success("Výdejka byla zrušena"); }, }); const handleConfirm = async () => { if (!issue) return; try { await confirmMutation.mutateAsync(undefined); } catch (e) { alert.error(e instanceof Error ? e.message : "Chyba připojení"); } }; const handleCancel = async () => { if (!issue) return; try { await cancelMutation.mutateAsync(undefined); } catch (e) { alert.error(e instanceof Error ? e.message : "Chyba připojení"); } }; const confirming = confirmMutation.isPending; const cancelling = cancelMutation.isPending; if (isPending) { return ; } if (error || !issue) { return ( Zpět } /> ); } const iss = issue as WarehouseIssue; const items = iss.items ?? []; const itemColumns: DataColumn[] = [ { key: "item", header: "Položka", width: "20%", bold: true, render: (row) => row.item?.name || `ID: ${row.item_id}`, }, { key: "batch", header: "Šarže", width: "18%", mono: true, render: (row) => row.batch ? `${formatDate(row.batch.received_at)} – ${formatCurrency(Number(row.batch.unit_price), "CZK")}` : "—", }, { key: "quantity", header: "Množství", width: "10%", mono: true, render: (row) => String(Number(row.quantity)), }, { key: "unit_price", header: "Cena/ks", width: "13%", mono: true, render: (row) => row.batch ? formatCurrency(Number(row.batch.unit_price), "CZK") : "—", }, { key: "total", header: "Celkem", width: "13%", mono: true, bold: true, render: (row) => row.batch ? formatCurrency( Number(row.quantity) * Number(row.batch.unit_price), "CZK", ) : "—", }, { key: "location", header: "Lokace", width: "10%", mono: true, render: (row) => row.location?.code || "—", }, { key: "reservation", header: "Rezervace", width: "10%", mono: true, render: (row) => row.reservation ? `ID: ${row.reservation.id} (${Number(row.reservation.remaining_qty)} ks)` : "—", }, { key: "notes", header: "Poznámka", width: "6%", render: (row) => row.notes || "—", }, ]; return ( {/* Header */} {canOperate && iss.status === "DRAFT" && ( <> )} {canOperate && iss.status === "CONFIRMED" && ( )} } /> {/* Basic info */} Základní údaje Číslo dokladu {iss.issue_number || "—"} Projekt {iss.project ? ( {iss.project.project_number} – {iss.project.name} ) : ( )} Vydal {iss.issued_by_user ? `${iss.issued_by_user.first_name} ${iss.issued_by_user.last_name}` : "—"} Vytvořeno {formatDate(iss.created_at)} {iss.notes && ( Poznámky {iss.notes} )} {/* Lines table */} Položky columns={itemColumns} rows={items} rowKey={(row) => row.id} empty={} /> {/* Cancel confirmation dialog */} setCancelConfirm(false)} onConfirm={handleCancel} title="Zrušit výdejku" message={`Opravdu chcete zrušit výdejku „${iss.issue_number || iss.id}"?`} confirmText="Zrušit výdejku" confirmVariant="danger" loading={cancelling} /> ); }